@shipfox/client-workflows 12.0.2 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (325) hide show
  1. package/.storybook/main.ts +16 -1
  2. package/.storybook/preview.tsx +3 -3
  3. package/.storybook/workspace-source.ts +31 -0
  4. package/.turbo/turbo-build.log +1 -1
  5. package/CHANGELOG.md +79 -0
  6. package/dist/components/job-graph/job-duration-format.d.ts +2 -2
  7. package/dist/components/job-graph/job-duration-format.d.ts.map +1 -1
  8. package/dist/components/job-graph/job-duration-format.js +4 -2
  9. package/dist/components/job-graph/job-duration-format.js.map +1 -1
  10. package/dist/components/job-graph/job-duration-label.js +1 -1
  11. package/dist/components/job-graph/job-duration-label.js.map +1 -1
  12. package/dist/components/job-graph/job-graph-content.d.ts +2 -1
  13. package/dist/components/job-graph/job-graph-content.d.ts.map +1 -1
  14. package/dist/components/job-graph/job-graph-content.js +3 -3
  15. package/dist/components/job-graph/job-graph-content.js.map +1 -1
  16. package/dist/components/job-graph/job-graph-view.d.ts +2 -1
  17. package/dist/components/job-graph/job-graph-view.d.ts.map +1 -1
  18. package/dist/components/job-graph/job-graph-view.js +2 -2
  19. package/dist/components/job-graph/job-graph-view.js.map +1 -1
  20. package/dist/components/job-graph/job-node.d.ts +1 -1
  21. package/dist/components/job-graph/job-node.d.ts.map +1 -1
  22. package/dist/components/job-graph/job-node.js +10 -9
  23. package/dist/components/job-graph/job-node.js.map +1 -1
  24. package/dist/components/job-graph/types.d.ts +2 -1
  25. package/dist/components/job-graph/types.d.ts.map +1 -1
  26. package/dist/components/job-graph/types.js.map +1 -1
  27. package/dist/components/step-list/step-list.d.ts +2 -2
  28. package/dist/components/step-list/step-list.d.ts.map +1 -1
  29. package/dist/components/step-list/step-list.js.map +1 -1
  30. package/dist/components/workflow-run-duration-label.js +1 -1
  31. package/dist/components/workflow-run-duration-label.js.map +1 -1
  32. package/dist/components/workflow-run-list/job-status-strip.d.ts +21 -0
  33. package/dist/components/workflow-run-list/job-status-strip.d.ts.map +1 -0
  34. package/dist/components/workflow-run-list/job-status-strip.js +185 -0
  35. package/dist/components/workflow-run-list/job-status-strip.js.map +1 -0
  36. package/dist/components/workflow-run-list/run-display.d.ts +27 -3
  37. package/dist/components/workflow-run-list/run-display.d.ts.map +1 -1
  38. package/dist/components/workflow-run-list/run-display.js +78 -7
  39. package/dist/components/workflow-run-list/run-display.js.map +1 -1
  40. package/dist/components/workflow-run-list/types.d.ts +23 -24
  41. package/dist/components/workflow-run-list/types.d.ts.map +1 -1
  42. package/dist/components/workflow-run-list/types.js.map +1 -1
  43. package/dist/components/workflow-run-list/workflow-run-filter-menu.d.ts +22 -0
  44. package/dist/components/workflow-run-list/workflow-run-filter-menu.d.ts.map +1 -0
  45. package/dist/components/workflow-run-list/workflow-run-filter-menu.js +68 -0
  46. package/dist/components/workflow-run-list/workflow-run-filter-menu.js.map +1 -0
  47. package/dist/components/workflow-run-list/workflow-run-filters.d.ts +18 -0
  48. package/dist/components/workflow-run-list/workflow-run-filters.d.ts.map +1 -0
  49. package/dist/components/workflow-run-list/workflow-run-filters.js +236 -0
  50. package/dist/components/workflow-run-list/workflow-run-filters.js.map +1 -0
  51. package/dist/components/workflow-run-list/workflow-run-list-content.d.ts +8 -4
  52. package/dist/components/workflow-run-list/workflow-run-list-content.d.ts.map +1 -1
  53. package/dist/components/workflow-run-list/workflow-run-list-content.js +40 -12
  54. package/dist/components/workflow-run-list/workflow-run-list-content.js.map +1 -1
  55. package/dist/components/workflow-run-list/workflow-run-list-states.d.ts +29 -2
  56. package/dist/components/workflow-run-list/workflow-run-list-states.d.ts.map +1 -1
  57. package/dist/components/workflow-run-list/workflow-run-list-states.js +103 -44
  58. package/dist/components/workflow-run-list/workflow-run-list-states.js.map +1 -1
  59. package/dist/components/workflow-run-list/workflow-run-list-view.d.ts +1 -1
  60. package/dist/components/workflow-run-list/workflow-run-list-view.d.ts.map +1 -1
  61. package/dist/components/workflow-run-list/workflow-run-list-view.js +60 -43
  62. package/dist/components/workflow-run-list/workflow-run-list-view.js.map +1 -1
  63. package/dist/components/workflow-run-list/workflow-run-list.d.ts +1 -1
  64. package/dist/components/workflow-run-list/workflow-run-list.d.ts.map +1 -1
  65. package/dist/components/workflow-run-list/workflow-run-list.js +20 -8
  66. package/dist/components/workflow-run-list/workflow-run-list.js.map +1 -1
  67. package/dist/components/workflow-run-list/workflow-run-row.d.ts +19 -9
  68. package/dist/components/workflow-run-list/workflow-run-row.d.ts.map +1 -1
  69. package/dist/components/workflow-run-list/workflow-run-row.js +179 -112
  70. package/dist/components/workflow-run-list/workflow-run-row.js.map +1 -1
  71. package/dist/components/workflow-run-number-label.d.ts +15 -0
  72. package/dist/components/workflow-run-number-label.d.ts.map +1 -0
  73. package/dist/components/workflow-run-number-label.js +41 -0
  74. package/dist/components/workflow-run-number-label.js.map +1 -0
  75. package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.d.ts +3 -3
  76. package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.d.ts.map +1 -1
  77. package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.js +10 -9
  78. package/dist/components/workflow-run-summary/workflow-run-attempt-switcher.js.map +1 -1
  79. package/dist/components/workflow-run-summary/workflow-run-summary.d.ts +4 -9
  80. package/dist/components/workflow-run-summary/workflow-run-summary.d.ts.map +1 -1
  81. package/dist/components/workflow-run-summary/workflow-run-summary.js +107 -74
  82. package/dist/components/workflow-run-summary/workflow-run-summary.js.map +1 -1
  83. package/dist/components/workflow-run-tabs/index.d.ts +6 -0
  84. package/dist/components/workflow-run-tabs/index.d.ts.map +1 -0
  85. package/dist/components/workflow-run-tabs/index.js +7 -0
  86. package/dist/components/workflow-run-tabs/index.js.map +1 -0
  87. package/dist/components/workflow-run-tabs/run-annotation-summary-line.d.ts +11 -0
  88. package/dist/components/workflow-run-tabs/run-annotation-summary-line.d.ts.map +1 -0
  89. package/dist/components/workflow-run-tabs/run-annotation-summary-line.js +71 -0
  90. package/dist/components/workflow-run-tabs/run-annotation-summary-line.js.map +1 -0
  91. package/dist/components/workflow-run-tabs/run-annotations-empty.d.ts +2 -0
  92. package/dist/components/workflow-run-tabs/run-annotations-empty.d.ts.map +1 -0
  93. package/dist/components/workflow-run-tabs/run-annotations-empty.js +11 -0
  94. package/dist/components/workflow-run-tabs/run-annotations-empty.js.map +1 -0
  95. package/dist/components/workflow-run-tabs/run-jobs-list.d.ts +18 -0
  96. package/dist/components/workflow-run-tabs/run-jobs-list.d.ts.map +1 -0
  97. package/dist/components/workflow-run-tabs/run-jobs-list.js +107 -0
  98. package/dist/components/workflow-run-tabs/run-jobs-list.js.map +1 -0
  99. package/dist/components/workflow-run-tabs/run-tab-count.d.ts +6 -0
  100. package/dist/components/workflow-run-tabs/run-tab-count.d.ts.map +1 -0
  101. package/dist/components/workflow-run-tabs/run-tab-count.js +27 -0
  102. package/dist/components/workflow-run-tabs/run-tab-count.js.map +1 -0
  103. package/dist/components/workflow-run-tabs/run-tab-strip.d.ts +8 -0
  104. package/dist/components/workflow-run-tabs/run-tab-strip.d.ts.map +1 -0
  105. package/dist/components/workflow-run-tabs/run-tab-strip.js +82 -0
  106. package/dist/components/workflow-run-tabs/run-tab-strip.js.map +1 -0
  107. package/dist/components/workflow-run-view/agent-config-failure-callout.d.ts +2 -2
  108. package/dist/components/workflow-run-view/agent-config-failure-callout.d.ts.map +1 -1
  109. package/dist/components/workflow-run-view/agent-config-failure-callout.js +4 -4
  110. package/dist/components/workflow-run-view/agent-config-failure-callout.js.map +1 -1
  111. package/dist/components/workflow-run-view/job-card.d.ts +2 -2
  112. package/dist/components/workflow-run-view/job-card.d.ts.map +1 -1
  113. package/dist/components/workflow-run-view/job-card.js +51 -32
  114. package/dist/components/workflow-run-view/job-card.js.map +1 -1
  115. package/dist/components/workflow-run-view/job-execution-switcher.d.ts +1 -1
  116. package/dist/components/workflow-run-view/job-execution-switcher.d.ts.map +1 -1
  117. package/dist/components/workflow-run-view/job-execution-switcher.js +20 -8
  118. package/dist/components/workflow-run-view/job-execution-switcher.js.map +1 -1
  119. package/dist/components/workflow-run-view/workflow-run-selection.d.ts.map +1 -1
  120. package/dist/components/workflow-run-view/workflow-run-selection.js +40 -1
  121. package/dist/components/workflow-run-view/workflow-run-selection.js.map +1 -1
  122. package/dist/components/workflow-run-view/workflow-run-states.d.ts +1 -0
  123. package/dist/components/workflow-run-view/workflow-run-states.d.ts.map +1 -1
  124. package/dist/components/workflow-run-view/workflow-run-states.js +10 -1
  125. package/dist/components/workflow-run-view/workflow-run-states.js.map +1 -1
  126. package/dist/components/workflow-run-view/workflow-run-view.d.ts +10 -5
  127. package/dist/components/workflow-run-view/workflow-run-view.d.ts.map +1 -1
  128. package/dist/components/workflow-run-view/workflow-run-view.js +136 -85
  129. package/dist/components/workflow-run-view/workflow-run-view.js.map +1 -1
  130. package/dist/components/workflow-source-panel/index.d.ts +1 -0
  131. package/dist/components/workflow-source-panel/index.d.ts.map +1 -1
  132. package/dist/components/workflow-source-panel/index.js +1 -0
  133. package/dist/components/workflow-source-panel/index.js.map +1 -1
  134. package/dist/components/workflow-source-panel/workflow-source-content.d.ts +12 -0
  135. package/dist/components/workflow-source-panel/workflow-source-content.d.ts.map +1 -0
  136. package/dist/components/workflow-source-panel/workflow-source-content.js +53 -0
  137. package/dist/components/workflow-source-panel/workflow-source-content.js.map +1 -0
  138. package/dist/components/workflow-source-panel/workflow-source-panel.d.ts +1 -1
  139. package/dist/components/workflow-source-panel/workflow-source-panel.d.ts.map +1 -1
  140. package/dist/components/workflow-source-panel/workflow-source-panel.js +7 -54
  141. package/dist/components/workflow-source-panel/workflow-source-panel.js.map +1 -1
  142. package/dist/components/workflow-status/status-visuals.d.ts +4 -4
  143. package/dist/components/workflow-status/status-visuals.d.ts.map +1 -1
  144. package/dist/components/workflow-status/status-visuals.js +7 -0
  145. package/dist/components/workflow-status/status-visuals.js.map +1 -1
  146. package/dist/components/workflow-status/workflow-status-icon.d.ts +3 -4
  147. package/dist/components/workflow-status/workflow-status-icon.d.ts.map +1 -1
  148. package/dist/components/workflow-status/workflow-status-icon.js +6 -4
  149. package/dist/components/workflow-status/workflow-status-icon.js.map +1 -1
  150. package/dist/core/entities/job-execution.d.ts +10 -0
  151. package/dist/core/entities/job-execution.d.ts.map +1 -1
  152. package/dist/core/entities/job-execution.js +11 -0
  153. package/dist/core/entities/job-execution.js.map +1 -1
  154. package/dist/core/entities/job.d.ts +4 -2
  155. package/dist/core/entities/job.d.ts.map +1 -1
  156. package/dist/core/entities/job.js +8 -1
  157. package/dist/core/entities/job.js.map +1 -1
  158. package/dist/core/entities/step.d.ts +1 -1
  159. package/dist/core/entities/step.d.ts.map +1 -1
  160. package/dist/core/entities/step.js +2 -0
  161. package/dist/core/entities/step.js.map +1 -1
  162. package/dist/core/entities/workflow-run.d.ts +52 -4
  163. package/dist/core/entities/workflow-run.d.ts.map +1 -1
  164. package/dist/core/entities/workflow-run.js +22 -3
  165. package/dist/core/entities/workflow-run.js.map +1 -1
  166. package/dist/core/workflow-run-tabs.d.ts +9 -0
  167. package/dist/core/workflow-run-tabs.d.ts.map +1 -0
  168. package/dist/core/workflow-run-tabs.js +3 -0
  169. package/dist/core/workflow-run-tabs.js.map +1 -0
  170. package/dist/core/workflow-run.d.ts +6 -6
  171. package/dist/core/workflow-run.d.ts.map +1 -1
  172. package/dist/core/workflow-run.js +3 -3
  173. package/dist/core/workflow-run.js.map +1 -1
  174. package/dist/feature.d.ts +7 -7
  175. package/dist/feature.js +5 -5
  176. package/dist/feature.js.map +1 -1
  177. package/dist/hooks/api/workflow-run-mapper.d.ts +4 -3
  178. package/dist/hooks/api/workflow-run-mapper.d.ts.map +1 -1
  179. package/dist/hooks/api/workflow-run-mapper.js +31 -3
  180. package/dist/hooks/api/workflow-run-mapper.js.map +1 -1
  181. package/dist/hooks/api/workflow-runs.d.ts +4 -4
  182. package/dist/hooks/api/workflow-runs.d.ts.map +1 -1
  183. package/dist/hooks/api/workflow-runs.js +12 -4
  184. package/dist/hooks/api/workflow-runs.js.map +1 -1
  185. package/dist/index.d.ts +4 -3
  186. package/dist/index.d.ts.map +1 -1
  187. package/dist/index.js +3 -2
  188. package/dist/index.js.map +1 -1
  189. package/dist/pages/project-workflows-page.js +46 -1
  190. package/dist/pages/project-workflows-page.js.map +1 -1
  191. package/dist/pages/workflow-run-detail-page.d.ts +11 -0
  192. package/dist/pages/workflow-run-detail-page.d.ts.map +1 -0
  193. package/dist/pages/workflow-run-detail-page.js +52 -0
  194. package/dist/pages/workflow-run-detail-page.js.map +1 -0
  195. package/dist/pages/workflow-run-list-page.d.ts +10 -0
  196. package/dist/pages/workflow-run-list-page.d.ts.map +1 -0
  197. package/dist/pages/workflow-run-list-page.js +43 -0
  198. package/dist/pages/workflow-run-list-page.js.map +1 -0
  199. package/dist/routes/inputs.d.ts +94 -5
  200. package/dist/routes/inputs.d.ts.map +1 -1
  201. package/dist/routes/inputs.js +199 -13
  202. package/dist/routes/inputs.js.map +1 -1
  203. package/dist/routes/project-route.d.ts +6 -0
  204. package/dist/routes/project-route.d.ts.map +1 -0
  205. package/dist/routes/project-route.js +25 -0
  206. package/dist/routes/project-route.js.map +1 -0
  207. package/dist/routes/run-detail.d.ts.map +1 -1
  208. package/dist/routes/run-detail.js +12 -7
  209. package/dist/routes/run-detail.js.map +1 -1
  210. package/dist/routes/runs.d.ts.map +1 -1
  211. package/dist/routes/runs.js +11 -6
  212. package/dist/routes/runs.js.map +1 -1
  213. package/dist/routes/workflows.d.ts.map +1 -1
  214. package/dist/routes/workflows.js +6 -5
  215. package/dist/routes/workflows.js.map +1 -1
  216. package/dist/tsconfig.test.tsbuildinfo +1 -1
  217. package/package.json +9 -9
  218. package/src/components/job-graph/job-duration-format.ts +11 -2
  219. package/src/components/job-graph/job-duration-label.tsx +5 -1
  220. package/src/components/job-graph/job-graph-content.tsx +7 -4
  221. package/src/components/job-graph/job-graph-view.test.tsx +19 -8
  222. package/src/components/job-graph/job-graph-view.tsx +6 -3
  223. package/src/components/job-graph/job-graph.stories.tsx +24 -20
  224. package/src/components/job-graph/job-node.stories.tsx +11 -6
  225. package/src/components/job-graph/job-node.test.tsx +82 -12
  226. package/src/components/job-graph/job-node.tsx +22 -15
  227. package/src/components/job-graph/types.ts +5 -1
  228. package/src/components/step-list/step-list.stories.tsx +2 -3
  229. package/src/components/step-list/step-list.tsx +3 -2
  230. package/src/components/workflow-run-duration-label.tsx +1 -1
  231. package/src/components/workflow-run-list/job-status-strip.tsx +189 -0
  232. package/src/components/workflow-run-list/run-display.test.ts +169 -30
  233. package/src/components/workflow-run-list/run-display.ts +116 -9
  234. package/src/components/workflow-run-list/types.ts +21 -17
  235. package/src/components/workflow-run-list/workflow-run-filter-menu.tsx +100 -0
  236. package/src/components/workflow-run-list/workflow-run-filters.tsx +243 -0
  237. package/src/components/workflow-run-list/workflow-run-list-content.tsx +44 -16
  238. package/src/components/workflow-run-list/workflow-run-list-states.tsx +128 -27
  239. package/src/components/workflow-run-list/workflow-run-list-view.test.tsx +441 -104
  240. package/src/components/workflow-run-list/workflow-run-list-view.tsx +73 -43
  241. package/src/components/workflow-run-list/workflow-run-list.stories.tsx +140 -20
  242. package/src/components/workflow-run-list/workflow-run-list.tsx +20 -10
  243. package/src/components/workflow-run-list/workflow-run-row.tsx +173 -106
  244. package/src/components/workflow-run-number-label.test.tsx +45 -0
  245. package/src/components/workflow-run-number-label.tsx +47 -0
  246. package/src/components/workflow-run-summary/workflow-run-attempt-switcher.test.tsx +7 -8
  247. package/src/components/workflow-run-summary/workflow-run-attempt-switcher.tsx +15 -14
  248. package/src/components/workflow-run-summary/workflow-run-summary.stories.tsx +29 -38
  249. package/src/components/workflow-run-summary/workflow-run-summary.test.tsx +30 -24
  250. package/src/components/workflow-run-summary/workflow-run-summary.tsx +102 -77
  251. package/src/components/workflow-run-tabs/index.ts +5 -0
  252. package/src/components/workflow-run-tabs/run-annotation-summary-line.test.tsx +69 -0
  253. package/src/components/workflow-run-tabs/run-annotation-summary-line.tsx +97 -0
  254. package/src/components/workflow-run-tabs/run-annotations-empty.tsx +11 -0
  255. package/src/components/workflow-run-tabs/run-jobs-list.tsx +151 -0
  256. package/src/components/workflow-run-tabs/run-tab-count.tsx +28 -0
  257. package/src/components/workflow-run-tabs/run-tab-strip.stories.tsx +52 -0
  258. package/src/components/workflow-run-tabs/run-tab-strip.test.tsx +117 -0
  259. package/src/components/workflow-run-tabs/run-tab-strip.tsx +97 -0
  260. package/src/components/workflow-run-view/agent-config-failure-callout.stories.tsx +2 -3
  261. package/src/components/workflow-run-view/agent-config-failure-callout.tsx +4 -4
  262. package/src/components/workflow-run-view/job-card.stories.tsx +11 -10
  263. package/src/components/workflow-run-view/job-card.test.tsx +115 -0
  264. package/src/components/workflow-run-view/job-card.tsx +74 -35
  265. package/src/components/workflow-run-view/job-execution-switcher.tsx +31 -9
  266. package/src/components/workflow-run-view/workflow-run-selection.test.ts +48 -0
  267. package/src/components/workflow-run-view/workflow-run-selection.ts +48 -1
  268. package/src/components/workflow-run-view/workflow-run-states.tsx +12 -1
  269. package/src/components/workflow-run-view/workflow-run-view.test.tsx +152 -94
  270. package/src/components/workflow-run-view/workflow-run-view.tsx +219 -95
  271. package/src/components/workflow-source-panel/index.ts +1 -0
  272. package/src/components/workflow-source-panel/workflow-source-content.tsx +84 -0
  273. package/src/components/workflow-source-panel/workflow-source-panel.tsx +14 -81
  274. package/src/components/workflow-status/status-visuals.test.ts +9 -0
  275. package/src/components/workflow-status/status-visuals.ts +6 -4
  276. package/src/components/workflow-status/workflow-status-icon.stories.tsx +10 -2
  277. package/src/components/workflow-status/workflow-status-icon.test.tsx +18 -0
  278. package/src/components/workflow-status/workflow-status-icon.tsx +17 -24
  279. package/src/core/entities/job-execution.ts +22 -0
  280. package/src/core/entities/job-status.test.ts +104 -0
  281. package/src/core/entities/job.ts +18 -3
  282. package/src/core/entities/step.ts +4 -0
  283. package/src/core/entities/workflow-run.ts +76 -7
  284. package/src/core/workflow-run-tabs.ts +8 -0
  285. package/src/core/workflow-run.test.ts +24 -9
  286. package/src/core/workflow-run.ts +17 -2
  287. package/src/feature.ts +5 -5
  288. package/src/hooks/api/workflow-run-mapper.ts +30 -3
  289. package/src/hooks/api/workflow-runs.test.tsx +2 -0
  290. package/src/hooks/api/workflow-runs.ts +12 -7
  291. package/src/index.ts +7 -2
  292. package/src/page-harness-budget.test.ts +1 -1
  293. package/src/pages/project-workflows-page.test.tsx +59 -5
  294. package/src/pages/project-workflows-page.tsx +34 -1
  295. package/src/pages/workflow-run-detail-page.tsx +72 -0
  296. package/src/pages/workflow-run-list-page.tsx +65 -0
  297. package/src/pages/workflow-run-pages.test.tsx +823 -0
  298. package/src/routes/inputs.test.ts +240 -12
  299. package/src/routes/inputs.ts +215 -11
  300. package/src/routes/project-route.tsx +25 -0
  301. package/src/routes/run-detail.tsx +15 -8
  302. package/src/routes/runs.tsx +14 -7
  303. package/src/routes/workflows.tsx +5 -4
  304. package/src/storybook-config.test.ts +27 -0
  305. package/test/fixtures/workflow-run.ts +76 -7
  306. package/test/pages.tsx +18 -8
  307. package/test/render.tsx +8 -2
  308. package/tsconfig.build.tsbuildinfo +1 -1
  309. package/tsconfig.test.json +7 -1
  310. package/dist/components/workflow-run-list/workflow-run-list-header.d.ts +0 -10
  311. package/dist/components/workflow-run-list/workflow-run-list-header.d.ts.map +0 -1
  312. package/dist/components/workflow-run-list/workflow-run-list-header.js +0 -55
  313. package/dist/components/workflow-run-list/workflow-run-list-header.js.map +0 -1
  314. package/dist/pages/workflow-run-first-time-use.d.ts +0 -6
  315. package/dist/pages/workflow-run-first-time-use.d.ts.map +0 -1
  316. package/dist/pages/workflow-run-first-time-use.js +0 -17
  317. package/dist/pages/workflow-run-first-time-use.js.map +0 -1
  318. package/dist/pages/workflow-run-page.d.ts +0 -10
  319. package/dist/pages/workflow-run-page.d.ts.map +0 -1
  320. package/dist/pages/workflow-run-page.js +0 -90
  321. package/dist/pages/workflow-run-page.js.map +0 -1
  322. package/src/components/workflow-run-list/workflow-run-list-header.tsx +0 -53
  323. package/src/pages/workflow-run-first-time-use.tsx +0 -17
  324. package/src/pages/workflow-run-page.test.tsx +0 -519
  325. package/src/pages/workflow-run-page.tsx +0 -94
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-runs.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/workflow-runs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-runs.d.ts","sourceRoot":"","sources":["../../../src/hooks/api/workflow-runs.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import { workflowRunAttemptsResponseSchema, workflowRunDetailResponseSchema, wor
2
2
  import { checkedApiRequest } from '@shipfox/client-api';
3
3
  import { infiniteQueryOptions, keepPreviousData, queryOptions, useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
4
4
  import { isWorkflowRunTerminal, WorkflowRunAttemptSummary } from '#core/workflow-run.js';
5
- import { toWorkflowRunAttempt, toWorkflowRunDetail, toWorkflowRunListItem, toWorkflowRunListPage } from './workflow-run-mapper.js';
5
+ import { toWorkflowRunAttempt, toWorkflowRunDetail, toWorkflowRunListPage, toWorkflowRunRecord } from './workflow-run-mapper.js';
6
6
  export const workflowRunsQueryKeys = {
7
7
  all: [
8
8
  'workflow-runs'
@@ -132,12 +132,12 @@ async function getWorkflowRunAttempts({ workflowRunId, signal }) {
132
132
  return response.attempts.map(toWorkflowRunAttempt);
133
133
  }
134
134
  async function cancelWorkflowRun({ workflowRunId }) {
135
- return toWorkflowRunListItem(await checkedApiRequest(workflowRunDtoSchema, `/workflows/runs/${workflowRunId}/cancel`, {
135
+ return toWorkflowRunRecord(await checkedApiRequest(workflowRunDtoSchema, `/workflows/runs/${workflowRunId}/cancel`, {
136
136
  method: 'POST'
137
137
  }));
138
138
  }
139
139
  export async function rerunWorkflowRun({ workflowRunId, mode }) {
140
- return toWorkflowRunListItem(await checkedApiRequest(workflowRunResponseSchema, `/workflows/runs/${workflowRunId}/rerun`, {
140
+ return toWorkflowRunRecord(await checkedApiRequest(workflowRunResponseSchema, `/workflows/runs/${workflowRunId}/rerun`, {
141
141
  method: 'POST',
142
142
  body: {
143
143
  mode
@@ -197,7 +197,9 @@ function buildTempRun({ projectId, definitionId, name, createdAt }) {
197
197
  id,
198
198
  projectId,
199
199
  definitionId,
200
+ number: null,
200
201
  name,
202
+ workflowName: name,
201
203
  status: 'pending',
202
204
  currentAttempt: 1,
203
205
  latestAttempt: 1,
@@ -210,12 +212,18 @@ function buildTempRun({ projectId, definitionId, name, createdAt }) {
210
212
  },
211
213
  triggerDisplayLabel: 'fire',
212
214
  triggerLabel: 'manual · fire',
215
+ triggerReference: null,
213
216
  inputs: null,
214
217
  sourceSnapshot: null,
215
218
  createdAt,
216
219
  updatedAt: createdAt,
217
- shortId: id.slice(0, 8),
218
220
  isTemporary: true,
221
+ // The optimistic row genuinely has no jobs yet: the server has not planned the graph.
222
+ jobs: {
223
+ preview: [],
224
+ statusCounts: [],
225
+ total: 0
226
+ },
219
227
  runAttempt: new WorkflowRunAttemptSummary({
220
228
  workflowRunId: id,
221
229
  attempt: 1,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/api/workflow-runs.ts"],"sourcesContent":["import {\n type RerunWorkflowRunBodyDto,\n type WorkflowRunRerunModeDto,\n workflowRunAttemptsResponseSchema,\n workflowRunDetailResponseSchema,\n workflowRunDtoSchema,\n workflowRunListResponseSchema,\n workflowRunResponseSchema,\n} from '@shipfox/api-workflows-dto';\nimport {checkedApiRequest, type StandardSchema} from '@shipfox/client-api';\nimport {\n type InfiniteData,\n infiniteQueryOptions,\n keepPreviousData,\n queryOptions,\n type UseInfiniteQueryOptions,\n type UseQueryOptions,\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query';\nimport {\n isWorkflowRunTerminal,\n type ManualWorkflowLaunch,\n type WorkflowRun,\n type WorkflowRunAttempt,\n WorkflowRunAttemptSummary,\n type WorkflowRunDetail,\n type WorkflowRunListItem,\n type WorkflowRunListPage,\n type WorkflowRunStatus,\n} from '#core/workflow-run.js';\nimport {\n toWorkflowRunAttempt,\n toWorkflowRunDetail,\n toWorkflowRunListItem,\n toWorkflowRunListPage,\n} from './workflow-run-mapper.js';\n\nexport interface WorkflowRunFilters {\n status?: WorkflowRunStatus | undefined;\n definitionId?: string | undefined;\n triggerSource?: string | undefined;\n createdFrom?: string | undefined;\n createdTo?: string | undefined;\n}\n\nexport const workflowRunsQueryKeys = {\n all: ['workflow-runs'] as const,\n lists: (projectId: string) => [...workflowRunsQueryKeys.all, 'list', projectId] as const,\n list: (projectId: string, filters: WorkflowRunFilters) =>\n [...workflowRunsQueryKeys.lists(projectId), normalizeFilters(filters)] as const,\n detail: (workflowRunId: string, runAttempt?: number | undefined) =>\n [...workflowRunsQueryKeys.all, 'detail', workflowRunId, runAttempt ?? null] as const,\n attempts: (workflowRunId: string) =>\n [...workflowRunsQueryKeys.all, 'attempts', workflowRunId] as const,\n};\n\ntype WorkflowRunsListQueryKey =\n | ReturnType<typeof workflowRunsQueryKeys.list>\n | readonly ['workflow-runs', 'list'];\ntype WorkflowRunDetailQueryKey =\n | ReturnType<typeof workflowRunsQueryKeys.detail>\n | readonly ['workflow-runs', 'detail'];\ntype WorkflowRunAttemptsQueryKey =\n | ReturnType<typeof workflowRunsQueryKeys.attempts>\n | readonly ['workflow-runs', 'attempts'];\ntype WorkflowRunsInfiniteQueryOptions = UseInfiniteQueryOptions<\n WorkflowRunListPage,\n Error,\n InfiniteData<WorkflowRunListPage, string | undefined>,\n WorkflowRunsListQueryKey,\n string | undefined\n>;\ntype WorkflowRunDetailQueryOptions = UseQueryOptions<\n WorkflowRunDetail,\n Error,\n WorkflowRunDetail,\n WorkflowRunDetailQueryKey\n>;\ntype WorkflowRunAttemptsQueryOptions = UseQueryOptions<\n WorkflowRunAttempt[],\n Error,\n WorkflowRunAttempt[],\n WorkflowRunAttemptsQueryKey\n>;\n\nfunction normalizeFilters(filters: WorkflowRunFilters) {\n return {\n status: filters.status ?? null,\n definitionId: filters.definitionId ?? null,\n triggerSource: filters.triggerSource ?? null,\n createdFrom: filters.createdFrom ?? null,\n createdTo: filters.createdTo ?? null,\n };\n}\n\nfunction appendFilters(params: URLSearchParams, filters: WorkflowRunFilters) {\n if (filters.status) params.set('status', filters.status);\n if (filters.definitionId) params.set('definition_id', filters.definitionId);\n if (filters.triggerSource) params.set('trigger_source', filters.triggerSource);\n if (filters.createdFrom) params.set('created_from', filters.createdFrom);\n if (filters.createdTo) params.set('created_to', filters.createdTo);\n}\n\nasync function listWorkflowRuns({\n projectId,\n filters,\n limit = 50,\n cursor,\n signal,\n}: {\n projectId: string;\n filters: WorkflowRunFilters;\n limit?: number;\n cursor?: string | undefined;\n signal?: AbortSignal;\n}): Promise<WorkflowRunListPage> {\n const params = new URLSearchParams({project_id: projectId, limit: String(limit)});\n if (cursor) params.set('cursor', cursor);\n appendFilters(params, filters);\n const response = await checkedApiRequest(\n workflowRunListResponseSchema,\n `/workflows/runs?${params.toString()}`,\n {signal},\n );\n return toWorkflowRunListPage(response);\n}\n\n/**\n * Fire the manual trigger of a workflow definition.\n *\n * The server resolves the manual subscription by definition id (workflows\n * may declare at most one manual trigger). `inputs` are forwarded to the\n * run when provided.\n */\nexport async function fireManualWorkflow({\n definitionId,\n inputs,\n}: {\n definitionId: string;\n inputs?: Record<string, unknown>;\n}): Promise<ManualWorkflowLaunch> {\n const response = await checkedApiRequest(\n manualWorkflowResponseSchema,\n `/workflow-definitions/${definitionId}/fire-manual`,\n {\n method: 'POST',\n body: inputs ? {inputs} : {},\n },\n );\n return {workflowRunId: response.workflow_run_id};\n}\n\nconst ACTIVE_POLL_MS = 4_000;\nconst IDLE_POLL_MS = 30_000;\n\ntype RunListInfinite = InfiniteData<WorkflowRunListPage, string | undefined>;\n\nexport function useWorkflowRunsInfiniteQuery(\n projectId: string | undefined,\n filters: WorkflowRunFilters,\n limit = 50,\n) {\n return useInfiniteQuery(workflowRunsInfiniteQueryOptions(projectId, filters, limit));\n}\n\nexport function workflowRunsInfiniteQueryOptions(\n projectId: string | undefined,\n filters: WorkflowRunFilters,\n limit = 50,\n): WorkflowRunsInfiniteQueryOptions {\n // Polling is owned by react-query, not the page. Polling fast (4s) while\n // any non-terminal run is visible covers state transitions; polling slow\n // (30s) when idle covers brand-new external runs (webhook/schedule\n // triggers) without leaving the list stale.\n //\n // We disable polling once the user has loaded more than one page. With\n // cursor pagination the cursor that bounds page 1 was computed from\n // page 0's last row; if a refetch shifts that boundary, a small range\n // of rows can drop into a between-pages gap. Users who scrolled into\n // history opted into \"reading mode\": pause until they refocus, filter,\n // or scroll back.\n return infiniteQueryOptions({\n queryKey: projectId\n ? workflowRunsQueryKeys.list(projectId, filters)\n : ([...workflowRunsQueryKeys.all, 'list'] as const),\n enabled: Boolean(projectId),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}) =>\n listWorkflowRuns({projectId: projectId ?? '', filters, limit, cursor: pageParam, signal}),\n getNextPageParam: (lastPage) => lastPage.nextCursor ?? undefined,\n placeholderData: keepPreviousData,\n staleTime: 2_000,\n refetchOnWindowFocus: true,\n refetchInterval: (query) => {\n const data = query.state.data;\n if (!data || data.pages.length > 1) return false;\n const hasActive = data.pages.some((page) =>\n page.runs.some((run) => !isWorkflowRunTerminal(run.status)),\n );\n return hasActive ? ACTIVE_POLL_MS : IDLE_POLL_MS;\n },\n refetchIntervalInBackground: false,\n });\n}\n\nasync function getWorkflowRun({\n workflowRunId,\n runAttempt,\n signal,\n}: {\n workflowRunId: string;\n runAttempt?: number | undefined;\n signal?: AbortSignal;\n}): Promise<WorkflowRunDetail> {\n const params = new URLSearchParams();\n if (runAttempt) params.set('attempt', String(runAttempt));\n const query = params.size > 0 ? `?${params.toString()}` : '';\n return toWorkflowRunDetail(\n await checkedApiRequest(\n workflowRunDetailResponseSchema,\n `/workflows/runs/${workflowRunId}${query}`,\n {\n signal,\n },\n ),\n );\n}\n\nasync function getWorkflowRunAttempts({\n workflowRunId,\n signal,\n}: {\n workflowRunId: string;\n signal?: AbortSignal;\n}): Promise<WorkflowRunAttempt[]> {\n const response = await checkedApiRequest(\n workflowRunAttemptsResponseSchema,\n `/workflows/runs/${workflowRunId}/attempts`,\n {\n signal,\n },\n );\n return response.attempts.map(toWorkflowRunAttempt);\n}\n\nasync function cancelWorkflowRun({\n workflowRunId,\n}: {\n workflowRunId: string;\n}): Promise<WorkflowRunListItem> {\n return toWorkflowRunListItem(\n await checkedApiRequest(workflowRunDtoSchema, `/workflows/runs/${workflowRunId}/cancel`, {\n method: 'POST',\n }),\n );\n}\n\nexport async function rerunWorkflowRun({\n workflowRunId,\n mode,\n}: {\n workflowRunId: string;\n mode: WorkflowRunRerunModeDto;\n}): Promise<WorkflowRunListItem> {\n return toWorkflowRunListItem(\n await checkedApiRequest(workflowRunResponseSchema, `/workflows/runs/${workflowRunId}/rerun`, {\n method: 'POST',\n body: {mode} satisfies RerunWorkflowRunBodyDto,\n }),\n );\n}\n\nconst manualWorkflowResponseSchema: StandardSchema<unknown, {workflow_run_id: string}> = {\n '~standard': {\n version: 1,\n vendor: 'client-workflows',\n validate: (value) => {\n if (\n typeof value === 'object' &&\n value !== null &&\n 'workflow_run_id' in value &&\n typeof value.workflow_run_id === 'string'\n )\n return {value: {workflow_run_id: value.workflow_run_id}};\n return {issues: [{message: 'Expected workflow_run_id.'}]};\n },\n },\n};\n\nexport function useRerunWorkflowRunMutation(projectId: string) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: rerunWorkflowRun,\n onSuccess: async (_run, variables) => {\n await Promise.all([\n queryClient.invalidateQueries({queryKey: workflowRunsQueryKeys.lists(projectId)}),\n queryClient.invalidateQueries({\n queryKey: workflowRunsQueryKeys.detail(variables.workflowRunId),\n }),\n queryClient.invalidateQueries({\n queryKey: workflowRunsQueryKeys.attempts(variables.workflowRunId),\n }),\n ]);\n },\n });\n}\n\nfunction filtersAcceptManualPendingRun(\n filters: WorkflowRunFilters,\n definitionId: string,\n now: Date,\n): boolean {\n if (filters.status && filters.status !== 'pending') return false;\n if (filters.definitionId && filters.definitionId !== definitionId) return false;\n if (filters.triggerSource && filters.triggerSource !== 'manual') return false;\n if (filters.createdFrom && Date.parse(filters.createdFrom) > now.getTime()) return false;\n if (filters.createdTo && Date.parse(filters.createdTo) < now.getTime()) return false;\n return true;\n}\n\nfunction buildTempRun({\n projectId,\n definitionId,\n name,\n createdAt,\n}: {\n projectId: string;\n definitionId: string;\n name: string;\n createdAt: string;\n}): WorkflowRunListItem {\n const id = `temp-${cryptoRandomId()}`;\n return {\n id,\n projectId,\n definitionId,\n name,\n status: 'pending',\n currentAttempt: 1,\n latestAttempt: 1,\n triggerProvider: null,\n triggerSource: 'manual',\n triggerEvent: 'fire',\n triggerPayload: {source: 'manual', event: 'fire'},\n triggerDisplayLabel: 'fire',\n triggerLabel: 'manual · fire',\n inputs: null,\n sourceSnapshot: null,\n createdAt,\n updatedAt: createdAt,\n shortId: id.slice(0, 8),\n isTemporary: true,\n runAttempt: new WorkflowRunAttemptSummary({\n workflowRunId: id,\n attempt: 1,\n status: 'pending',\n createdAt,\n startedAt: null,\n finishedAt: null,\n }),\n };\n}\n\nfunction cryptoRandomId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport interface FireManualWorkflowVariables {\n projectId: string;\n definitionId: string;\n inputs?: Record<string, unknown>;\n}\n\nexport function useFireManualWorkflowMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (variables: FireManualWorkflowVariables) =>\n fireManualWorkflow(\n variables.inputs\n ? {definitionId: variables.definitionId, inputs: variables.inputs}\n : {definitionId: variables.definitionId},\n ),\n onMutate: (variables) => {\n const definitionName = lookupDefinitionName(\n queryClient,\n variables.projectId,\n variables.definitionId,\n );\n const createdAt = new Date().toISOString();\n const tempRun = buildTempRun({\n projectId: variables.projectId,\n definitionId: variables.definitionId,\n name: definitionName ?? 'New run',\n createdAt,\n });\n\n const listsKey = workflowRunsQueryKeys.lists(variables.projectId);\n const touchedQueryKeys: Array<readonly unknown[]> = [];\n\n const entries = queryClient.getQueriesData<RunListInfinite>({queryKey: listsKey});\n const now = new Date(createdAt);\n for (const [queryKey] of entries) {\n const filters = readFiltersFromKey(queryKey);\n if (!filters) continue;\n if (!filtersAcceptManualPendingRun(filters, variables.definitionId, now)) continue;\n\n touchedQueryKeys.push(queryKey);\n queryClient.setQueryData<RunListInfinite>(queryKey, (current) => {\n if (!current || current.pages.length === 0) return current;\n const firstPage = current.pages[0];\n if (!firstPage) return current;\n const nextFirstPage: WorkflowRunListPage = {\n ...firstPage,\n runs: [tempRun, ...firstPage.runs],\n filteredTotalCount:\n firstPage.filteredTotalCount != null ? firstPage.filteredTotalCount + 1 : null,\n };\n return {...current, pages: [nextFirstPage, ...current.pages.slice(1)]};\n });\n }\n\n return {tempWorkflowRunId: tempRun.id, touchedQueryKeys};\n },\n onError: (_error, _variables, context) => {\n if (!context) return;\n for (const queryKey of context.touchedQueryKeys) {\n queryClient.setQueryData<RunListInfinite>(queryKey, (current) => {\n if (!current) return current;\n let removedCount = 0;\n const pages = current.pages.map((page) => {\n const runs = page.runs.filter((run) => {\n if (run.id !== context.tempWorkflowRunId) return true;\n removedCount += 1;\n return false;\n });\n if (runs.length === page.runs.length) return page;\n return {\n ...page,\n runs,\n filteredTotalCount:\n page.filteredTotalCount != null\n ? Math.max(0, page.filteredTotalCount - removedCount)\n : null,\n };\n });\n if (removedCount === 0) return current;\n return {...current, pages};\n });\n }\n },\n onSuccess: (_data, variables) => {\n void queryClient.invalidateQueries({\n queryKey: workflowRunsQueryKeys.lists(variables.projectId),\n });\n },\n });\n}\n\nfunction readFiltersFromKey(queryKey: readonly unknown[]): WorkflowRunFilters | null {\n if (queryKey.length < 4) return null;\n const normalized = queryKey[3];\n if (!normalized || typeof normalized !== 'object') return null;\n const obj = normalized as Record<string, unknown>;\n return {\n status: (obj.status as WorkflowRunStatus | null) ?? undefined,\n definitionId: (obj.definitionId as string | null) ?? undefined,\n triggerSource: (obj.triggerSource as string | null) ?? undefined,\n createdFrom: (obj.createdFrom as string | null) ?? undefined,\n createdTo: (obj.createdTo as string | null) ?? undefined,\n };\n}\n\nfunction lookupDefinitionName(\n queryClient: ReturnType<typeof useQueryClient>,\n projectId: string,\n definitionId: string,\n): string | undefined {\n const entries = queryClient.getQueriesData<\n InfiniteData<{definitions: Array<{id: string; name: string}>}>\n >({queryKey: ['definitions', 'list', projectId]});\n for (const [, data] of entries) {\n if (!data) continue;\n for (const page of data.pages) {\n const match = page.definitions.find((d) => d.id === definitionId);\n if (match) return match.name;\n }\n }\n return undefined;\n}\n\nexport function useWorkflowRunQuery(workflowRunId: string | undefined) {\n return useWorkflowRunAttemptQuery({workflowRunId, runAttempt: undefined});\n}\n\nexport function useWorkflowRunAttemptQuery({\n workflowRunId,\n runAttempt,\n}: {\n workflowRunId: string | undefined;\n runAttempt?: number | undefined;\n}) {\n return useQuery(workflowRunQueryOptions({workflowRunId, runAttempt}));\n}\n\nexport function workflowRunQueryOptions({\n workflowRunId,\n runAttempt,\n}: {\n workflowRunId: string | undefined;\n runAttempt?: number | undefined;\n}): WorkflowRunDetailQueryOptions {\n // Poll a non-terminal run so the open run detail stays live (same cadence as the run\n // list); stop once the run is terminal.\n return queryOptions({\n queryKey: workflowRunId\n ? workflowRunsQueryKeys.detail(workflowRunId, runAttempt)\n : ([...workflowRunsQueryKeys.all, 'detail'] as const),\n enabled: Boolean(workflowRunId),\n queryFn: ({signal}) => getWorkflowRun({workflowRunId: workflowRunId ?? '', runAttempt, signal}),\n staleTime: 2_000,\n refetchOnWindowFocus: true,\n refetchInterval: (query) => {\n const status: WorkflowRunDetail['runAttempt']['status'] | undefined =\n query.state.data?.runAttempt.status;\n if (!status) return false;\n return isWorkflowRunTerminal(status) ? false : ACTIVE_POLL_MS;\n },\n refetchIntervalInBackground: false,\n });\n}\n\nexport function useWorkflowRunAttemptsQuery({\n workflowRunId,\n enabled,\n}: {\n workflowRunId: string | undefined;\n enabled: boolean;\n}) {\n return useQuery(workflowRunAttemptsQueryOptions({workflowRunId, enabled}));\n}\n\nexport function workflowRunAttemptsQueryOptions({\n workflowRunId,\n enabled,\n}: {\n workflowRunId: string | undefined;\n enabled: boolean;\n}): WorkflowRunAttemptsQueryOptions {\n return queryOptions({\n queryKey: workflowRunId\n ? workflowRunsQueryKeys.attempts(workflowRunId)\n : ([...workflowRunsQueryKeys.all, 'attempts'] as const),\n enabled: Boolean(workflowRunId) && enabled,\n queryFn: ({signal}) => getWorkflowRunAttempts({workflowRunId: workflowRunId ?? '', signal}),\n staleTime: 0,\n refetchOnMount: true,\n refetchOnWindowFocus: false,\n });\n}\n\nexport function useCancelWorkflowRunMutation(run: WorkflowRun | undefined) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (): Promise<WorkflowRunListItem> => {\n if (!run) throw new Error('Workflow run is not loaded');\n return await cancelWorkflowRun({workflowRunId: run.id});\n },\n onSuccess: async () => {\n if (!run) return;\n await Promise.all([\n queryClient.invalidateQueries({queryKey: workflowRunsQueryKeys.detail(run.id)}),\n queryClient.invalidateQueries({queryKey: workflowRunsQueryKeys.lists(run.projectId)}),\n queryClient.invalidateQueries({queryKey: workflowRunsQueryKeys.attempts(run.id)}),\n ]);\n },\n });\n}\n"],"names":["workflowRunAttemptsResponseSchema","workflowRunDetailResponseSchema","workflowRunDtoSchema","workflowRunListResponseSchema","workflowRunResponseSchema","checkedApiRequest","infiniteQueryOptions","keepPreviousData","queryOptions","useInfiniteQuery","useMutation","useQuery","useQueryClient","isWorkflowRunTerminal","WorkflowRunAttemptSummary","toWorkflowRunAttempt","toWorkflowRunDetail","toWorkflowRunListItem","toWorkflowRunListPage","workflowRunsQueryKeys","all","lists","projectId","list","filters","normalizeFilters","detail","workflowRunId","runAttempt","attempts","status","definitionId","triggerSource","createdFrom","createdTo","appendFilters","params","set","listWorkflowRuns","limit","cursor","signal","URLSearchParams","project_id","String","response","toString","fireManualWorkflow","inputs","manualWorkflowResponseSchema","method","body","workflow_run_id","ACTIVE_POLL_MS","IDLE_POLL_MS","useWorkflowRunsInfiniteQuery","workflowRunsInfiniteQueryOptions","queryKey","enabled","Boolean","initialPageParam","undefined","queryFn","pageParam","getNextPageParam","lastPage","nextCursor","placeholderData","staleTime","refetchOnWindowFocus","refetchInterval","query","data","state","pages","length","hasActive","some","page","runs","run","refetchIntervalInBackground","getWorkflowRun","size","getWorkflowRunAttempts","map","cancelWorkflowRun","rerunWorkflowRun","mode","version","vendor","validate","value","issues","message","useRerunWorkflowRunMutation","queryClient","mutationFn","onSuccess","_run","variables","Promise","invalidateQueries","filtersAcceptManualPendingRun","now","Date","parse","getTime","buildTempRun","name","createdAt","id","cryptoRandomId","currentAttempt","latestAttempt","triggerProvider","triggerEvent","triggerPayload","source","event","triggerDisplayLabel","triggerLabel","sourceSnapshot","updatedAt","shortId","slice","isTemporary","attempt","startedAt","finishedAt","crypto","randomUUID","Math","random","useFireManualWorkflowMutation","onMutate","definitionName","lookupDefinitionName","toISOString","tempRun","listsKey","touchedQueryKeys","entries","getQueriesData","readFiltersFromKey","push","setQueryData","current","firstPage","nextFirstPage","filteredTotalCount","tempWorkflowRunId","onError","_error","_variables","context","removedCount","filter","max","_data","normalized","obj","match","definitions","find","d","useWorkflowRunQuery","useWorkflowRunAttemptQuery","workflowRunQueryOptions","useWorkflowRunAttemptsQuery","workflowRunAttemptsQueryOptions","refetchOnMount","useCancelWorkflowRunMutation","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/hooks/api/workflow-runs.ts"],"sourcesContent":["import {\n type RerunWorkflowRunBodyDto,\n type WorkflowRunRerunModeDto,\n workflowRunAttemptsResponseSchema,\n workflowRunDetailResponseSchema,\n workflowRunDtoSchema,\n workflowRunListResponseSchema,\n workflowRunResponseSchema,\n} from '@shipfox/api-workflows-dto';\nimport {checkedApiRequest, type StandardSchema} from '@shipfox/client-api';\nimport {\n type InfiniteData,\n infiniteQueryOptions,\n keepPreviousData,\n queryOptions,\n type UseInfiniteQueryOptions,\n type UseQueryOptions,\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n} from '@tanstack/react-query';\nimport {\n isWorkflowRunTerminal,\n type ManualWorkflowLaunch,\n type WorkflowRun,\n type WorkflowRunAttempt,\n WorkflowRunAttemptSummary,\n type WorkflowRunDetail,\n type WorkflowRunListItem,\n type WorkflowRunListPage,\n type WorkflowRunRecord,\n type WorkflowRunStatus,\n} from '#core/workflow-run.js';\nimport {\n toWorkflowRunAttempt,\n toWorkflowRunDetail,\n toWorkflowRunListPage,\n toWorkflowRunRecord,\n} from './workflow-run-mapper.js';\n\nexport interface WorkflowRunFilters {\n status?: WorkflowRunStatus | undefined;\n definitionId?: string | undefined;\n triggerSource?: string | undefined;\n createdFrom?: string | undefined;\n createdTo?: string | undefined;\n}\n\nexport const workflowRunsQueryKeys = {\n all: ['workflow-runs'] as const,\n lists: (projectId: string) => [...workflowRunsQueryKeys.all, 'list', projectId] as const,\n list: (projectId: string, filters: WorkflowRunFilters) =>\n [...workflowRunsQueryKeys.lists(projectId), normalizeFilters(filters)] as const,\n detail: (workflowRunId: string, runAttempt?: number | undefined) =>\n [...workflowRunsQueryKeys.all, 'detail', workflowRunId, runAttempt ?? null] as const,\n attempts: (workflowRunId: string) =>\n [...workflowRunsQueryKeys.all, 'attempts', workflowRunId] as const,\n};\n\ntype WorkflowRunsListQueryKey =\n | ReturnType<typeof workflowRunsQueryKeys.list>\n | readonly ['workflow-runs', 'list'];\ntype WorkflowRunDetailQueryKey =\n | ReturnType<typeof workflowRunsQueryKeys.detail>\n | readonly ['workflow-runs', 'detail'];\ntype WorkflowRunAttemptsQueryKey =\n | ReturnType<typeof workflowRunsQueryKeys.attempts>\n | readonly ['workflow-runs', 'attempts'];\ntype WorkflowRunsInfiniteQueryOptions = UseInfiniteQueryOptions<\n WorkflowRunListPage,\n Error,\n InfiniteData<WorkflowRunListPage, string | undefined>,\n WorkflowRunsListQueryKey,\n string | undefined\n>;\ntype WorkflowRunDetailQueryOptions = UseQueryOptions<\n WorkflowRunDetail,\n Error,\n WorkflowRunDetail,\n WorkflowRunDetailQueryKey\n>;\ntype WorkflowRunAttemptsQueryOptions = UseQueryOptions<\n WorkflowRunAttempt[],\n Error,\n WorkflowRunAttempt[],\n WorkflowRunAttemptsQueryKey\n>;\n\nfunction normalizeFilters(filters: WorkflowRunFilters) {\n return {\n status: filters.status ?? null,\n definitionId: filters.definitionId ?? null,\n triggerSource: filters.triggerSource ?? null,\n createdFrom: filters.createdFrom ?? null,\n createdTo: filters.createdTo ?? null,\n };\n}\n\nfunction appendFilters(params: URLSearchParams, filters: WorkflowRunFilters) {\n if (filters.status) params.set('status', filters.status);\n if (filters.definitionId) params.set('definition_id', filters.definitionId);\n if (filters.triggerSource) params.set('trigger_source', filters.triggerSource);\n if (filters.createdFrom) params.set('created_from', filters.createdFrom);\n if (filters.createdTo) params.set('created_to', filters.createdTo);\n}\n\nasync function listWorkflowRuns({\n projectId,\n filters,\n limit = 50,\n cursor,\n signal,\n}: {\n projectId: string;\n filters: WorkflowRunFilters;\n limit?: number;\n cursor?: string | undefined;\n signal?: AbortSignal;\n}): Promise<WorkflowRunListPage> {\n const params = new URLSearchParams({project_id: projectId, limit: String(limit)});\n if (cursor) params.set('cursor', cursor);\n appendFilters(params, filters);\n const response = await checkedApiRequest(\n workflowRunListResponseSchema,\n `/workflows/runs?${params.toString()}`,\n {signal},\n );\n return toWorkflowRunListPage(response);\n}\n\n/**\n * Fire the manual trigger of a workflow definition.\n *\n * The server resolves the manual subscription by definition id (workflows\n * may declare at most one manual trigger). `inputs` are forwarded to the\n * run when provided.\n */\nexport async function fireManualWorkflow({\n definitionId,\n inputs,\n}: {\n definitionId: string;\n inputs?: Record<string, unknown>;\n}): Promise<ManualWorkflowLaunch> {\n const response = await checkedApiRequest(\n manualWorkflowResponseSchema,\n `/workflow-definitions/${definitionId}/fire-manual`,\n {\n method: 'POST',\n body: inputs ? {inputs} : {},\n },\n );\n return {workflowRunId: response.workflow_run_id};\n}\n\nconst ACTIVE_POLL_MS = 4_000;\nconst IDLE_POLL_MS = 30_000;\n\ntype RunListInfinite = InfiniteData<WorkflowRunListPage, string | undefined>;\n\nexport function useWorkflowRunsInfiniteQuery(\n projectId: string | undefined,\n filters: WorkflowRunFilters,\n limit = 50,\n) {\n return useInfiniteQuery(workflowRunsInfiniteQueryOptions(projectId, filters, limit));\n}\n\nexport function workflowRunsInfiniteQueryOptions(\n projectId: string | undefined,\n filters: WorkflowRunFilters,\n limit = 50,\n): WorkflowRunsInfiniteQueryOptions {\n // Polling is owned by react-query, not the page. Polling fast (4s) while\n // any non-terminal run is visible covers state transitions; polling slow\n // (30s) when idle covers brand-new external runs (webhook/schedule\n // triggers) without leaving the list stale.\n //\n // We disable polling once the user has loaded more than one page. With\n // cursor pagination the cursor that bounds page 1 was computed from\n // page 0's last row; if a refetch shifts that boundary, a small range\n // of rows can drop into a between-pages gap. Users who scrolled into\n // history opted into \"reading mode\": pause until they refocus, filter,\n // or scroll back.\n return infiniteQueryOptions({\n queryKey: projectId\n ? workflowRunsQueryKeys.list(projectId, filters)\n : ([...workflowRunsQueryKeys.all, 'list'] as const),\n enabled: Boolean(projectId),\n initialPageParam: undefined as string | undefined,\n queryFn: ({pageParam, signal}) =>\n listWorkflowRuns({projectId: projectId ?? '', filters, limit, cursor: pageParam, signal}),\n getNextPageParam: (lastPage) => lastPage.nextCursor ?? undefined,\n placeholderData: keepPreviousData,\n staleTime: 2_000,\n refetchOnWindowFocus: true,\n refetchInterval: (query) => {\n const data = query.state.data;\n if (!data || data.pages.length > 1) return false;\n const hasActive = data.pages.some((page) =>\n page.runs.some((run) => !isWorkflowRunTerminal(run.status)),\n );\n return hasActive ? ACTIVE_POLL_MS : IDLE_POLL_MS;\n },\n refetchIntervalInBackground: false,\n });\n}\n\nasync function getWorkflowRun({\n workflowRunId,\n runAttempt,\n signal,\n}: {\n workflowRunId: string;\n runAttempt?: number | undefined;\n signal?: AbortSignal;\n}): Promise<WorkflowRunDetail> {\n const params = new URLSearchParams();\n if (runAttempt) params.set('attempt', String(runAttempt));\n const query = params.size > 0 ? `?${params.toString()}` : '';\n return toWorkflowRunDetail(\n await checkedApiRequest(\n workflowRunDetailResponseSchema,\n `/workflows/runs/${workflowRunId}${query}`,\n {\n signal,\n },\n ),\n );\n}\n\nasync function getWorkflowRunAttempts({\n workflowRunId,\n signal,\n}: {\n workflowRunId: string;\n signal?: AbortSignal;\n}): Promise<WorkflowRunAttempt[]> {\n const response = await checkedApiRequest(\n workflowRunAttemptsResponseSchema,\n `/workflows/runs/${workflowRunId}/attempts`,\n {\n signal,\n },\n );\n return response.attempts.map(toWorkflowRunAttempt);\n}\n\nasync function cancelWorkflowRun({\n workflowRunId,\n}: {\n workflowRunId: string;\n}): Promise<WorkflowRunRecord> {\n return toWorkflowRunRecord(\n await checkedApiRequest(workflowRunDtoSchema, `/workflows/runs/${workflowRunId}/cancel`, {\n method: 'POST',\n }),\n );\n}\n\nexport async function rerunWorkflowRun({\n workflowRunId,\n mode,\n}: {\n workflowRunId: string;\n mode: WorkflowRunRerunModeDto;\n}): Promise<WorkflowRunRecord> {\n return toWorkflowRunRecord(\n await checkedApiRequest(workflowRunResponseSchema, `/workflows/runs/${workflowRunId}/rerun`, {\n method: 'POST',\n body: {mode} satisfies RerunWorkflowRunBodyDto,\n }),\n );\n}\n\nconst manualWorkflowResponseSchema: StandardSchema<unknown, {workflow_run_id: string}> = {\n '~standard': {\n version: 1,\n vendor: 'client-workflows',\n validate: (value) => {\n if (\n typeof value === 'object' &&\n value !== null &&\n 'workflow_run_id' in value &&\n typeof value.workflow_run_id === 'string'\n )\n return {value: {workflow_run_id: value.workflow_run_id}};\n return {issues: [{message: 'Expected workflow_run_id.'}]};\n },\n },\n};\n\nexport function useRerunWorkflowRunMutation(projectId: string) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: rerunWorkflowRun,\n onSuccess: async (_run, variables) => {\n await Promise.all([\n queryClient.invalidateQueries({queryKey: workflowRunsQueryKeys.lists(projectId)}),\n queryClient.invalidateQueries({\n queryKey: workflowRunsQueryKeys.detail(variables.workflowRunId),\n }),\n queryClient.invalidateQueries({\n queryKey: workflowRunsQueryKeys.attempts(variables.workflowRunId),\n }),\n ]);\n },\n });\n}\n\nfunction filtersAcceptManualPendingRun(\n filters: WorkflowRunFilters,\n definitionId: string,\n now: Date,\n): boolean {\n if (filters.status && filters.status !== 'pending') return false;\n if (filters.definitionId && filters.definitionId !== definitionId) return false;\n if (filters.triggerSource && filters.triggerSource !== 'manual') return false;\n if (filters.createdFrom && Date.parse(filters.createdFrom) > now.getTime()) return false;\n if (filters.createdTo && Date.parse(filters.createdTo) < now.getTime()) return false;\n return true;\n}\n\nfunction buildTempRun({\n projectId,\n definitionId,\n name,\n createdAt,\n}: {\n projectId: string;\n definitionId: string;\n name: string;\n createdAt: string;\n}): WorkflowRunListItem {\n const id = `temp-${cryptoRandomId()}`;\n return {\n id,\n projectId,\n definitionId,\n number: null,\n name,\n workflowName: name,\n status: 'pending',\n currentAttempt: 1,\n latestAttempt: 1,\n triggerProvider: null,\n triggerSource: 'manual',\n triggerEvent: 'fire',\n triggerPayload: {source: 'manual', event: 'fire'},\n triggerDisplayLabel: 'fire',\n triggerLabel: 'manual · fire',\n triggerReference: null,\n inputs: null,\n sourceSnapshot: null,\n createdAt,\n updatedAt: createdAt,\n isTemporary: true,\n // The optimistic row genuinely has no jobs yet: the server has not planned the graph.\n jobs: {preview: [], statusCounts: [], total: 0},\n runAttempt: new WorkflowRunAttemptSummary({\n workflowRunId: id,\n attempt: 1,\n status: 'pending',\n createdAt,\n startedAt: null,\n finishedAt: null,\n }),\n };\n}\n\nfunction cryptoRandomId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport interface FireManualWorkflowVariables {\n projectId: string;\n definitionId: string;\n inputs?: Record<string, unknown>;\n}\n\nexport function useFireManualWorkflowMutation() {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (variables: FireManualWorkflowVariables) =>\n fireManualWorkflow(\n variables.inputs\n ? {definitionId: variables.definitionId, inputs: variables.inputs}\n : {definitionId: variables.definitionId},\n ),\n onMutate: (variables) => {\n const definitionName = lookupDefinitionName(\n queryClient,\n variables.projectId,\n variables.definitionId,\n );\n const createdAt = new Date().toISOString();\n const tempRun = buildTempRun({\n projectId: variables.projectId,\n definitionId: variables.definitionId,\n name: definitionName ?? 'New run',\n createdAt,\n });\n\n const listsKey = workflowRunsQueryKeys.lists(variables.projectId);\n const touchedQueryKeys: Array<readonly unknown[]> = [];\n\n const entries = queryClient.getQueriesData<RunListInfinite>({queryKey: listsKey});\n const now = new Date(createdAt);\n for (const [queryKey] of entries) {\n const filters = readFiltersFromKey(queryKey);\n if (!filters) continue;\n if (!filtersAcceptManualPendingRun(filters, variables.definitionId, now)) continue;\n\n touchedQueryKeys.push(queryKey);\n queryClient.setQueryData<RunListInfinite>(queryKey, (current) => {\n if (!current || current.pages.length === 0) return current;\n const firstPage = current.pages[0];\n if (!firstPage) return current;\n const nextFirstPage: WorkflowRunListPage = {\n ...firstPage,\n runs: [tempRun, ...firstPage.runs],\n filteredTotalCount:\n firstPage.filteredTotalCount != null ? firstPage.filteredTotalCount + 1 : null,\n };\n return {...current, pages: [nextFirstPage, ...current.pages.slice(1)]};\n });\n }\n\n return {tempWorkflowRunId: tempRun.id, touchedQueryKeys};\n },\n onError: (_error, _variables, context) => {\n if (!context) return;\n for (const queryKey of context.touchedQueryKeys) {\n queryClient.setQueryData<RunListInfinite>(queryKey, (current) => {\n if (!current) return current;\n let removedCount = 0;\n const pages = current.pages.map((page) => {\n const runs = page.runs.filter((run) => {\n if (run.id !== context.tempWorkflowRunId) return true;\n removedCount += 1;\n return false;\n });\n if (runs.length === page.runs.length) return page;\n return {\n ...page,\n runs,\n filteredTotalCount:\n page.filteredTotalCount != null\n ? Math.max(0, page.filteredTotalCount - removedCount)\n : null,\n };\n });\n if (removedCount === 0) return current;\n return {...current, pages};\n });\n }\n },\n onSuccess: (_data, variables) => {\n void queryClient.invalidateQueries({\n queryKey: workflowRunsQueryKeys.lists(variables.projectId),\n });\n },\n });\n}\n\nfunction readFiltersFromKey(queryKey: readonly unknown[]): WorkflowRunFilters | null {\n if (queryKey.length < 4) return null;\n const normalized = queryKey[3];\n if (!normalized || typeof normalized !== 'object') return null;\n const obj = normalized as Record<string, unknown>;\n return {\n status: (obj.status as WorkflowRunStatus | null) ?? undefined,\n definitionId: (obj.definitionId as string | null) ?? undefined,\n triggerSource: (obj.triggerSource as string | null) ?? undefined,\n createdFrom: (obj.createdFrom as string | null) ?? undefined,\n createdTo: (obj.createdTo as string | null) ?? undefined,\n };\n}\n\nfunction lookupDefinitionName(\n queryClient: ReturnType<typeof useQueryClient>,\n projectId: string,\n definitionId: string,\n): string | undefined {\n const entries = queryClient.getQueriesData<\n InfiniteData<{definitions: Array<{id: string; name: string}>}>\n >({queryKey: ['definitions', 'list', projectId]});\n for (const [, data] of entries) {\n if (!data) continue;\n for (const page of data.pages) {\n const match = page.definitions.find((d) => d.id === definitionId);\n if (match) return match.name;\n }\n }\n return undefined;\n}\n\nexport function useWorkflowRunQuery(workflowRunId: string | undefined) {\n return useWorkflowRunAttemptQuery({workflowRunId, runAttempt: undefined});\n}\n\nexport function useWorkflowRunAttemptQuery({\n workflowRunId,\n runAttempt,\n}: {\n workflowRunId: string | undefined;\n runAttempt?: number | undefined;\n}) {\n return useQuery(workflowRunQueryOptions({workflowRunId, runAttempt}));\n}\n\nexport function workflowRunQueryOptions({\n workflowRunId,\n runAttempt,\n}: {\n workflowRunId: string | undefined;\n runAttempt?: number | undefined;\n}): WorkflowRunDetailQueryOptions {\n // Poll a non-terminal run so the open run detail stays live (same cadence as the run\n // list); stop once the run is terminal.\n return queryOptions({\n queryKey: workflowRunId\n ? workflowRunsQueryKeys.detail(workflowRunId, runAttempt)\n : ([...workflowRunsQueryKeys.all, 'detail'] as const),\n enabled: Boolean(workflowRunId),\n queryFn: ({signal}) => getWorkflowRun({workflowRunId: workflowRunId ?? '', runAttempt, signal}),\n staleTime: 2_000,\n refetchOnWindowFocus: true,\n refetchInterval: (query) => {\n const status: WorkflowRunDetail['runAttempt']['status'] | undefined =\n query.state.data?.runAttempt.status;\n if (!status) return false;\n return isWorkflowRunTerminal(status) ? false : ACTIVE_POLL_MS;\n },\n refetchIntervalInBackground: false,\n });\n}\n\nexport function useWorkflowRunAttemptsQuery({\n workflowRunId,\n enabled,\n}: {\n workflowRunId: string | undefined;\n enabled: boolean;\n}) {\n return useQuery(workflowRunAttemptsQueryOptions({workflowRunId, enabled}));\n}\n\nexport function workflowRunAttemptsQueryOptions({\n workflowRunId,\n enabled,\n}: {\n workflowRunId: string | undefined;\n enabled: boolean;\n}): WorkflowRunAttemptsQueryOptions {\n return queryOptions({\n queryKey: workflowRunId\n ? workflowRunsQueryKeys.attempts(workflowRunId)\n : ([...workflowRunsQueryKeys.all, 'attempts'] as const),\n enabled: Boolean(workflowRunId) && enabled,\n queryFn: ({signal}) => getWorkflowRunAttempts({workflowRunId: workflowRunId ?? '', signal}),\n staleTime: 0,\n refetchOnMount: true,\n refetchOnWindowFocus: false,\n });\n}\n\nexport function useCancelWorkflowRunMutation(run: WorkflowRun | undefined) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: async (): Promise<WorkflowRunRecord> => {\n if (!run) throw new Error('Workflow run is not loaded');\n return await cancelWorkflowRun({workflowRunId: run.id});\n },\n onSuccess: async () => {\n if (!run) return;\n await Promise.all([\n queryClient.invalidateQueries({queryKey: workflowRunsQueryKeys.detail(run.id)}),\n queryClient.invalidateQueries({queryKey: workflowRunsQueryKeys.lists(run.projectId)}),\n queryClient.invalidateQueries({queryKey: workflowRunsQueryKeys.attempts(run.id)}),\n ]);\n },\n });\n}\n"],"names":["workflowRunAttemptsResponseSchema","workflowRunDetailResponseSchema","workflowRunDtoSchema","workflowRunListResponseSchema","workflowRunResponseSchema","checkedApiRequest","infiniteQueryOptions","keepPreviousData","queryOptions","useInfiniteQuery","useMutation","useQuery","useQueryClient","isWorkflowRunTerminal","WorkflowRunAttemptSummary","toWorkflowRunAttempt","toWorkflowRunDetail","toWorkflowRunListPage","toWorkflowRunRecord","workflowRunsQueryKeys","all","lists","projectId","list","filters","normalizeFilters","detail","workflowRunId","runAttempt","attempts","status","definitionId","triggerSource","createdFrom","createdTo","appendFilters","params","set","listWorkflowRuns","limit","cursor","signal","URLSearchParams","project_id","String","response","toString","fireManualWorkflow","inputs","manualWorkflowResponseSchema","method","body","workflow_run_id","ACTIVE_POLL_MS","IDLE_POLL_MS","useWorkflowRunsInfiniteQuery","workflowRunsInfiniteQueryOptions","queryKey","enabled","Boolean","initialPageParam","undefined","queryFn","pageParam","getNextPageParam","lastPage","nextCursor","placeholderData","staleTime","refetchOnWindowFocus","refetchInterval","query","data","state","pages","length","hasActive","some","page","runs","run","refetchIntervalInBackground","getWorkflowRun","size","getWorkflowRunAttempts","map","cancelWorkflowRun","rerunWorkflowRun","mode","version","vendor","validate","value","issues","message","useRerunWorkflowRunMutation","queryClient","mutationFn","onSuccess","_run","variables","Promise","invalidateQueries","filtersAcceptManualPendingRun","now","Date","parse","getTime","buildTempRun","name","createdAt","id","cryptoRandomId","number","workflowName","currentAttempt","latestAttempt","triggerProvider","triggerEvent","triggerPayload","source","event","triggerDisplayLabel","triggerLabel","triggerReference","sourceSnapshot","updatedAt","isTemporary","jobs","preview","statusCounts","total","attempt","startedAt","finishedAt","crypto","randomUUID","Math","random","slice","useFireManualWorkflowMutation","onMutate","definitionName","lookupDefinitionName","toISOString","tempRun","listsKey","touchedQueryKeys","entries","getQueriesData","readFiltersFromKey","push","setQueryData","current","firstPage","nextFirstPage","filteredTotalCount","tempWorkflowRunId","onError","_error","_variables","context","removedCount","filter","max","_data","normalized","obj","match","definitions","find","d","useWorkflowRunQuery","useWorkflowRunAttemptQuery","workflowRunQueryOptions","useWorkflowRunAttemptsQuery","workflowRunAttemptsQueryOptions","refetchOnMount","useCancelWorkflowRunMutation","Error"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- export type { AgentConfigIssue, JobDisplayDuration, JobExecutionDisplayDuration, JobExecutionStatus, JobExecutionTime, JobStatus, ManualWorkflowLaunch, Step, StepAttempt, StepAttemptDisplayDuration, StepError, StepErrorCategory, StepErrorReason, StepGateResult, StepSourceLocation, WorkflowRun, WorkflowRunAttempt, WorkflowRunDetail, WorkflowRunListPage, WorkflowRunStatus, WorkflowSourceSnapshot, WorkflowStatus, } from '#core/workflow-run.js';
2
- export { isWorkflowRunTerminal, isWorkflowStatus, Job, JobExecution, TERMINAL_WORKFLOW_RUN_STATUSES, WORKFLOW_RUN_STATUSES, workflowRunShortId, workflowRunTriggerLabel, } from '#core/workflow-run.js';
1
+ export type { AgentConfigIssue, JobDisplayDuration, JobDisplayStatus, JobExecutionDisplayDuration, JobExecutionDisplayStatus, JobExecutionStatus, JobExecutionTime, JobStatus, ManualWorkflowLaunch, Step, StepAttempt, StepAttemptDisplayDuration, StepError, StepErrorCategory, StepErrorReason, StepGateResult, StepSourceLocation, WorkflowDisplayStatus, WorkflowRun, WorkflowRunAttempt, WorkflowRunDetail, WorkflowRunListPage, WorkflowRunStatus, WorkflowSourceSnapshot, WorkflowStatus, } from '#core/workflow-run.js';
2
+ export { deriveJobDisplayStatus, deriveJobExecutionDisplayStatus, isWorkflowRunTerminal, isWorkflowStatus, Job, JobExecution, TERMINAL_WORKFLOW_RUN_STATUSES, WORKFLOW_RUN_STATUSES, workflowRunTriggerLabel, } from '#core/workflow-run.js';
3
3
  export { type FireManualWorkflowVariables, fireManualWorkflow, useCancelWorkflowRunMutation, useFireManualWorkflowMutation, useWorkflowRunAttemptsQuery, useWorkflowRunQuery, useWorkflowRunsInfiniteQuery, type WorkflowRunFilters, workflowRunAttemptsQueryOptions, workflowRunQueryOptions, workflowRunsInfiniteQueryOptions, workflowRunsQueryKeys, } from './hooks/api/workflow-runs.js';
4
4
  export { ProjectWorkflowsPage } from './pages/project-workflows-page.js';
5
- export { WorkflowRunPage } from './pages/workflow-run-page.js';
5
+ export { WorkflowRunDetailPage } from './pages/workflow-run-detail-page.js';
6
+ export { WorkflowRunsPage } from './pages/workflow-run-list-page.js';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,2BAA2B,EAC3B,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACT,oBAAoB,EACpB,IAAI,EACJ,WAAW,EACX,0BAA0B,EAC1B,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,GAAG,EACH,YAAY,EACZ,8BAA8B,EAC9B,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,2BAA2B,EAChC,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC7B,2BAA2B,EAC3B,mBAAmB,EACnB,4BAA4B,EAC5B,KAAK,kBAAkB,EACvB,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,2BAA2B,EAC3B,yBAAyB,EACzB,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACT,oBAAoB,EACpB,IAAI,EACJ,WAAW,EACX,0BAA0B,EAC1B,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,sBAAsB,EACtB,+BAA+B,EAC/B,qBAAqB,EACrB,gBAAgB,EAChB,GAAG,EACH,YAAY,EACZ,8BAA8B,EAC9B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,2BAA2B,EAChC,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC7B,2BAA2B,EAC3B,mBAAmB,EACnB,4BAA4B,EAC5B,KAAK,kBAAkB,EACvB,+BAA+B,EAC/B,uBAAuB,EACvB,gCAAgC,EAChC,qBAAqB,GACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAC,qBAAqB,EAAC,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAC,gBAAgB,EAAC,MAAM,mCAAmC,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
- export { isWorkflowRunTerminal, isWorkflowStatus, Job, JobExecution, TERMINAL_WORKFLOW_RUN_STATUSES, WORKFLOW_RUN_STATUSES, workflowRunShortId, workflowRunTriggerLabel } from '#core/workflow-run.js';
1
+ export { deriveJobDisplayStatus, deriveJobExecutionDisplayStatus, isWorkflowRunTerminal, isWorkflowStatus, Job, JobExecution, TERMINAL_WORKFLOW_RUN_STATUSES, WORKFLOW_RUN_STATUSES, workflowRunTriggerLabel } from '#core/workflow-run.js';
2
2
  export { fireManualWorkflow, useCancelWorkflowRunMutation, useFireManualWorkflowMutation, useWorkflowRunAttemptsQuery, useWorkflowRunQuery, useWorkflowRunsInfiniteQuery, workflowRunAttemptsQueryOptions, workflowRunQueryOptions, workflowRunsInfiniteQueryOptions, workflowRunsQueryKeys } from './hooks/api/workflow-runs.js';
3
3
  export { ProjectWorkflowsPage } from './pages/project-workflows-page.js';
4
- export { WorkflowRunPage } from './pages/workflow-run-page.js';
4
+ export { WorkflowRunDetailPage } from './pages/workflow-run-detail-page.js';
5
+ export { WorkflowRunsPage } from './pages/workflow-run-list-page.js';
5
6
 
6
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type {\n AgentConfigIssue,\n JobDisplayDuration,\n JobExecutionDisplayDuration,\n JobExecutionStatus,\n JobExecutionTime,\n JobStatus,\n ManualWorkflowLaunch,\n Step,\n StepAttempt,\n StepAttemptDisplayDuration,\n StepError,\n StepErrorCategory,\n StepErrorReason,\n StepGateResult,\n StepSourceLocation,\n WorkflowRun,\n WorkflowRunAttempt,\n WorkflowRunDetail,\n WorkflowRunListPage,\n WorkflowRunStatus,\n WorkflowSourceSnapshot,\n WorkflowStatus,\n} from '#core/workflow-run.js';\nexport {\n isWorkflowRunTerminal,\n isWorkflowStatus,\n Job,\n JobExecution,\n TERMINAL_WORKFLOW_RUN_STATUSES,\n WORKFLOW_RUN_STATUSES,\n workflowRunShortId,\n workflowRunTriggerLabel,\n} from '#core/workflow-run.js';\nexport {\n type FireManualWorkflowVariables,\n fireManualWorkflow,\n useCancelWorkflowRunMutation,\n useFireManualWorkflowMutation,\n useWorkflowRunAttemptsQuery,\n useWorkflowRunQuery,\n useWorkflowRunsInfiniteQuery,\n type WorkflowRunFilters,\n workflowRunAttemptsQueryOptions,\n workflowRunQueryOptions,\n workflowRunsInfiniteQueryOptions,\n workflowRunsQueryKeys,\n} from './hooks/api/workflow-runs.js';\nexport {ProjectWorkflowsPage} from './pages/project-workflows-page.js';\nexport {WorkflowRunPage} from './pages/workflow-run-page.js';\n"],"names":["isWorkflowRunTerminal","isWorkflowStatus","Job","JobExecution","TERMINAL_WORKFLOW_RUN_STATUSES","WORKFLOW_RUN_STATUSES","workflowRunShortId","workflowRunTriggerLabel","fireManualWorkflow","useCancelWorkflowRunMutation","useFireManualWorkflowMutation","useWorkflowRunAttemptsQuery","useWorkflowRunQuery","useWorkflowRunsInfiniteQuery","workflowRunAttemptsQueryOptions","workflowRunQueryOptions","workflowRunsInfiniteQueryOptions","workflowRunsQueryKeys","ProjectWorkflowsPage","WorkflowRunPage"],"mappings":"AAwBA,SACEA,qBAAqB,EACrBC,gBAAgB,EAChBC,GAAG,EACHC,YAAY,EACZC,8BAA8B,EAC9BC,qBAAqB,EACrBC,kBAAkB,EAClBC,uBAAuB,QAClB,wBAAwB;AAC/B,SAEEC,kBAAkB,EAClBC,4BAA4B,EAC5BC,6BAA6B,EAC7BC,2BAA2B,EAC3BC,mBAAmB,EACnBC,4BAA4B,EAE5BC,+BAA+B,EAC/BC,uBAAuB,EACvBC,gCAAgC,EAChCC,qBAAqB,QAChB,+BAA+B;AACtC,SAAQC,oBAAoB,QAAO,oCAAoC;AACvE,SAAQC,eAAe,QAAO,+BAA+B"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type {\n AgentConfigIssue,\n JobDisplayDuration,\n JobDisplayStatus,\n JobExecutionDisplayDuration,\n JobExecutionDisplayStatus,\n JobExecutionStatus,\n JobExecutionTime,\n JobStatus,\n ManualWorkflowLaunch,\n Step,\n StepAttempt,\n StepAttemptDisplayDuration,\n StepError,\n StepErrorCategory,\n StepErrorReason,\n StepGateResult,\n StepSourceLocation,\n WorkflowDisplayStatus,\n WorkflowRun,\n WorkflowRunAttempt,\n WorkflowRunDetail,\n WorkflowRunListPage,\n WorkflowRunStatus,\n WorkflowSourceSnapshot,\n WorkflowStatus,\n} from '#core/workflow-run.js';\nexport {\n deriveJobDisplayStatus,\n deriveJobExecutionDisplayStatus,\n isWorkflowRunTerminal,\n isWorkflowStatus,\n Job,\n JobExecution,\n TERMINAL_WORKFLOW_RUN_STATUSES,\n WORKFLOW_RUN_STATUSES,\n workflowRunTriggerLabel,\n} from '#core/workflow-run.js';\nexport {\n type FireManualWorkflowVariables,\n fireManualWorkflow,\n useCancelWorkflowRunMutation,\n useFireManualWorkflowMutation,\n useWorkflowRunAttemptsQuery,\n useWorkflowRunQuery,\n useWorkflowRunsInfiniteQuery,\n type WorkflowRunFilters,\n workflowRunAttemptsQueryOptions,\n workflowRunQueryOptions,\n workflowRunsInfiniteQueryOptions,\n workflowRunsQueryKeys,\n} from './hooks/api/workflow-runs.js';\nexport {ProjectWorkflowsPage} from './pages/project-workflows-page.js';\nexport {WorkflowRunDetailPage} from './pages/workflow-run-detail-page.js';\nexport {WorkflowRunsPage} from './pages/workflow-run-list-page.js';\n"],"names":["deriveJobDisplayStatus","deriveJobExecutionDisplayStatus","isWorkflowRunTerminal","isWorkflowStatus","Job","JobExecution","TERMINAL_WORKFLOW_RUN_STATUSES","WORKFLOW_RUN_STATUSES","workflowRunTriggerLabel","fireManualWorkflow","useCancelWorkflowRunMutation","useFireManualWorkflowMutation","useWorkflowRunAttemptsQuery","useWorkflowRunQuery","useWorkflowRunsInfiniteQuery","workflowRunAttemptsQueryOptions","workflowRunQueryOptions","workflowRunsInfiniteQueryOptions","workflowRunsQueryKeys","ProjectWorkflowsPage","WorkflowRunDetailPage","WorkflowRunsPage"],"mappings":"AA2BA,SACEA,sBAAsB,EACtBC,+BAA+B,EAC/BC,qBAAqB,EACrBC,gBAAgB,EAChBC,GAAG,EACHC,YAAY,EACZC,8BAA8B,EAC9BC,qBAAqB,EACrBC,uBAAuB,QAClB,wBAAwB;AAC/B,SAEEC,kBAAkB,EAClBC,4BAA4B,EAC5BC,6BAA6B,EAC7BC,2BAA2B,EAC3BC,mBAAmB,EACnBC,4BAA4B,EAE5BC,+BAA+B,EAC/BC,uBAAuB,EACvBC,gCAAgC,EAChCC,qBAAqB,QAChB,+BAA+B;AACtC,SAAQC,oBAAoB,QAAO,oCAAoC;AACvE,SAAQC,qBAAqB,QAAO,sCAAsC;AAC1E,SAAQC,gBAAgB,QAAO,oCAAoC"}
@@ -95,6 +95,9 @@ function ProjectWorkflowsPageInner({ projectId }) {
95
95
  /*#__PURE__*/ _jsx(WorkflowSyncAlert, {
96
96
  sync: sync
97
97
  }),
98
+ /*#__PURE__*/ _jsx(WorkflowSyncWarnings, {
99
+ sync: sync
100
+ }),
98
101
  /*#__PURE__*/ _jsx(WorkflowDefinitionsList, {
99
102
  definitions: definitions,
100
103
  isPending: definitionsQuery.isPending,
@@ -185,7 +188,7 @@ function WorkflowDefinitionsList({ definitions, isPending, isError, sync, runErr
185
188
  return(// The workflow-name cell holds a `<button>` so the row is
186
189
  // keyboard-reachable (Tab focuses, Enter/Space activates
187
190
  // via native button semantics). The TableRow itself is no
188
- // longer clickable a row-level onClick would be invisible
191
+ // longer clickable: a row-level onClick would be invisible
189
192
  // to keyboard users and require custom keydown handling.
190
193
  // The `group` class on the row still drives the Run button
191
194
  // reveal on hover or focus-within.
@@ -382,6 +385,48 @@ function WorkflowSyncAlert({ sync }) {
382
385
  })
383
386
  });
384
387
  }
388
+ function WorkflowSyncWarnings({ sync }) {
389
+ if (sync?.status !== 'succeeded' || sync.warnings.length === 0) return null;
390
+ const seenKeys = new Map();
391
+ const warningItems = sync.warnings.map((warning)=>{
392
+ const baseKey = `${warning.code}-${warning.path ?? 'workflow'}-${warning.message}`;
393
+ const occurrence = seenKeys.get(baseKey) ?? 0;
394
+ seenKeys.set(baseKey, occurrence + 1);
395
+ return {
396
+ key: `${baseKey}-${occurrence}`,
397
+ warning
398
+ };
399
+ });
400
+ return /*#__PURE__*/ _jsx(Callout, {
401
+ role: "status",
402
+ type: "warning",
403
+ children: /*#__PURE__*/ _jsxs("div", {
404
+ className: "flex flex-col gap-6",
405
+ children: [
406
+ /*#__PURE__*/ _jsx(Text, {
407
+ size: "sm",
408
+ bold: true,
409
+ children: "Workflow definition warnings"
410
+ }),
411
+ /*#__PURE__*/ _jsx("ul", {
412
+ className: "flex flex-col gap-4",
413
+ children: warningItems.map(({ key, warning })=>/*#__PURE__*/ _jsxs("li", {
414
+ children: [
415
+ /*#__PURE__*/ _jsx(Text, {
416
+ size: "sm",
417
+ children: warning.message
418
+ }),
419
+ warning.path ? /*#__PURE__*/ _jsx(Code, {
420
+ className: "text-foreground-neutral-muted",
421
+ children: warning.path
422
+ }) : null
423
+ ]
424
+ }, key))
425
+ })
426
+ ]
427
+ })
428
+ });
429
+ }
385
430
  function DefinitionSheet({ definition, onOpenChange }) {
386
431
  const normalizedJson = definition ? JSON.stringify({
387
432
  workflow_document: definition.workflowDocument,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/pages/project-workflows-page.tsx"],"sourcesContent":["import {ApiError} from '@shipfox/client-api';\nimport {\n type Definition,\n type DefinitionSyncSummary,\n SourceStrip,\n useDefinitionsInfiniteQuery,\n useProjectQuery,\n} from '@shipfox/client-projects';\nimport {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon, type IconName} from '@shipfox/react-ui/icon';\nimport {LoadErrorState} from '@shipfox/react-ui/load-error-state';\nimport {RelativeTime, RelativeTimeProvider} from '@shipfox/react-ui/relative-time';\nimport {\n Sheet,\n SheetBody,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from '@shipfox/react-ui/sheet';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@shipfox/react-ui/table';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Code, Header, Text} from '@shipfox/react-ui/typography';\nimport {useState} from 'react';\nimport {useFireManualWorkflowMutation} from '#hooks/api/workflow-runs.js';\n\nexport function ProjectWorkflowsPage({projectId}: {projectId: string}) {\n return (\n <RelativeTimeProvider>\n <ProjectWorkflowsPageInner projectId={projectId} />\n </RelativeTimeProvider>\n );\n}\n\nfunction ProjectWorkflowsPageInner({projectId}: {projectId: string}) {\n const projectQuery = useProjectQuery(projectId);\n const definitionsQuery = useDefinitionsInfiniteQuery(projectId);\n const fireManual = useFireManualWorkflowMutation();\n const [selectedDefinition, setSelectedDefinition] = useState<Definition | null>(null);\n const [runError, setRunError] = useState<{definitionId: string; message: string} | null>(null);\n const definitions = definitionsQuery.data?.pages.flatMap((page) => page.definitions) ?? [];\n const sync = definitionsQuery.data?.pages[0]?.sync;\n\n async function handleRun(definition: Definition) {\n setRunError(null);\n if (!definition.manualTrigger) return;\n try {\n await fireManual.mutateAsync({projectId, definitionId: definition.id});\n toast.success('Run queued');\n } catch (error) {\n const message = errorMessage(error, 'Could not queue run.');\n setRunError({definitionId: definition.id, message});\n toast.error(message);\n }\n }\n\n return (\n <div className=\"flex w-full flex-col gap-24\">\n {projectQuery.isPending ? (\n <div className=\"flex flex-col gap-12\">\n <Skeleton className=\"h-28 w-1/3\" />\n <Skeleton className=\"h-18 w-1/2\" />\n </div>\n ) : null}\n\n {projectQuery.isError && projectQuery.data === undefined ? (\n projectQuery.error instanceof ApiError && projectQuery.error.status === 404 ? (\n <EmptyState\n icon=\"errorWarningLine\"\n title=\"Project not found\"\n description=\"This project doesn't exist, or you don't have access to it.\"\n />\n ) : (\n <QueryLoadError query={projectQuery} subject=\"project\" />\n )\n ) : null}\n\n {projectQuery.data ? (\n <>\n <header className=\"flex flex-col gap-4\">\n <Header variant=\"h2\">Workflows</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Synced workflow definitions for this project source.\n </Text>\n </header>\n\n <SourceStrip\n connectionId={projectQuery.data.source.connectionId}\n externalRepositoryId={projectQuery.data.source.externalRepositoryId}\n sync={sync}\n isPending={definitionsQuery.isPending}\n />\n\n <WorkflowSyncAlert sync={sync} />\n\n <WorkflowDefinitionsList\n definitions={definitions}\n isPending={definitionsQuery.isPending}\n isError={definitionsQuery.isError}\n sync={sync ?? null}\n runError={runError}\n runningDefinitionId={\n fireManual.isPending && fireManual.variables\n ? fireManual.variables.definitionId\n : null\n }\n hasNextPage={definitionsQuery.hasNextPage}\n isFetchingNextPage={definitionsQuery.isFetchingNextPage}\n isFetchNextPageError={definitionsQuery.isFetchNextPageError}\n onRetry={() => definitionsQuery.refetch()}\n onLoadMore={() => definitionsQuery.fetchNextPage()}\n onOpenDefinition={setSelectedDefinition}\n onRun={(definition) => {\n void handleRun(definition);\n }}\n />\n </>\n ) : null}\n\n <DefinitionSheet\n definition={selectedDefinition}\n onOpenChange={(open) => {\n if (!open) setSelectedDefinition(null);\n }}\n />\n </div>\n );\n}\n\nfunction WorkflowDefinitionsList({\n definitions,\n isPending,\n isError,\n sync,\n runError,\n runningDefinitionId,\n hasNextPage,\n isFetchingNextPage,\n isFetchNextPageError,\n onRetry,\n onLoadMore,\n onOpenDefinition,\n onRun,\n}: {\n definitions: Definition[];\n isPending: boolean;\n isError: boolean;\n sync: DefinitionSyncSummary | null;\n runError: {definitionId: string; message: string} | null;\n runningDefinitionId: string | null;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n isFetchNextPageError: boolean;\n onRetry: () => void;\n onLoadMore: () => void;\n onOpenDefinition: (definition: Definition) => void;\n onRun: (definition: Definition) => void;\n}) {\n if (isPending) {\n return (\n <div className=\"flex flex-col gap-8\">\n <Skeleton className=\"h-40 w-full\" />\n <Skeleton className=\"h-40 w-full\" />\n <Skeleton className=\"h-40 w-full\" />\n </div>\n );\n }\n\n if (isError && definitions.length === 0) {\n return (\n <LoadErrorState\n title=\"Couldn't load workflows\"\n description=\"Definitions could not be loaded. Source metadata remains visible.\"\n onRetry={onRetry}\n retryLabel=\"Retry loading workflows\"\n />\n );\n }\n\n if (definitions.length === 0) {\n return <WorkflowEmptyState sync={sync} />;\n }\n\n return (\n <>\n <div className=\"hidden rounded-8 border border-border-neutral-base md:block\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-40\"></TableHead>\n <TableHead>Workflow</TableHead>\n <TableHead className=\"w-180\">Updated</TableHead>\n <TableHead className=\"w-80 text-right\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {definitions.map((definition) => {\n const runErrorMessage =\n runError?.definitionId === definition.id ? runError.message : null;\n const isRunning = runningDefinitionId === definition.id;\n\n return (\n // The workflow-name cell holds a `<button>` so the row is\n // keyboard-reachable (Tab focuses, Enter/Space activates\n // via native button semantics). The TableRow itself is no\n // longer clickable — a row-level onClick would be invisible\n // to keyboard users and require custom keydown handling.\n // The `group` class on the row still drives the Run button\n // reveal on hover or focus-within.\n <TableRow key={definition.id} className=\"group\">\n <TableCell>\n <Icon\n name={sourceIcon(definition.source)}\n className=\"size-16 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n </TableCell>\n <TableCell className=\"max-w-260\">\n <div className=\"flex min-w-0 flex-col gap-2\">\n <button\n type=\"button\"\n onClick={() => onOpenDefinition(definition)}\n className=\"flex min-w-0 flex-col gap-2 text-left outline-none focus-visible:shadow-border-interactive-with-active rounded-4\"\n >\n <Text size=\"sm\" bold className=\"truncate\">\n {definition.name}\n </Text>\n <Code className=\"truncate text-foreground-neutral-muted\">\n {definition.configPath ?? 'Manual definition'}\n </Code>\n </button>\n {runErrorMessage ? (\n <Text size=\"xs\" className=\"text-tag-error-text\">\n {runErrorMessage}\n </Text>\n ) : null}\n </div>\n </TableCell>\n <TableCell className=\"text-foreground-neutral-muted\">\n <RelativeTime value={definition.updatedAt} />\n </TableCell>\n <TableCell>\n {definition.manualTrigger ? (\n <div className=\"flex justify-end opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100\">\n <Button size=\"xs\" isLoading={isRunning} onClick={() => onRun(definition)}>\n Run\n </Button>\n </div>\n ) : null}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n\n <div className=\"flex flex-col rounded-8 border border-border-neutral-base md:hidden\">\n {definitions.map((definition) => {\n const runErrorMessage =\n runError?.definitionId === definition.id ? runError.message : null;\n const isRunning = runningDefinitionId === definition.id;\n\n return (\n <div\n key={definition.id}\n className=\"flex flex-col gap-10 border-b border-border-neutral-base p-12 last:border-b-0\"\n >\n <button\n type=\"button\"\n className=\"flex min-w-0 items-start gap-10 text-left\"\n onClick={() => onOpenDefinition(definition)}\n >\n <Icon\n name={sourceIcon(definition.source)}\n className=\"size-16 shrink-0 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Text size=\"sm\" bold className=\"break-words\">\n {definition.name}\n </Text>\n <Code className=\"break-words text-foreground-neutral-muted\">\n {definition.configPath ?? 'Manual definition'}\n </Code>\n </div>\n </button>\n <div className=\"flex items-center justify-between gap-8\">\n <Text size=\"xs\" className=\"text-foreground-neutral-muted\">\n Updated <RelativeTime value={definition.updatedAt} />\n </Text>\n {definition.manualTrigger ? (\n <Button size=\"sm\" isLoading={isRunning} onClick={() => onRun(definition)}>\n Run\n </Button>\n ) : null}\n </div>\n {runErrorMessage ? (\n <Text size=\"xs\" className=\"text-tag-error-text\">\n {runErrorMessage}\n </Text>\n ) : null}\n </div>\n );\n })}\n </div>\n\n {isFetchNextPageError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-12\">\n <Text size=\"sm\">Could not load more workflows.</Text>\n <Button size=\"sm\" variant=\"secondary\" onClick={onLoadMore}>\n Retry\n </Button>\n </div>\n </Callout>\n ) : null}\n\n {hasNextPage ? (\n <div className=\"flex justify-center\">\n <Button size=\"sm\" variant=\"secondary\" isLoading={isFetchingNextPage} onClick={onLoadMore}>\n Load more\n </Button>\n </div>\n ) : null}\n </>\n );\n}\n\nfunction sourceIcon(source: 'manual' | 'vcs'): IconName {\n return source === 'vcs' ? ('gitBranchLine' as IconName) : ('terminalLine' as IconName);\n}\n\nfunction WorkflowEmptyState({sync}: {sync: DefinitionSyncSummary | null}) {\n const message =\n sync?.status === 'failed' && sync.lastErrorCode === 'no-workflow-files'\n ? 'No workflow files found under .shipfox/workflows/.'\n : sync?.status === 'failed'\n ? (sync.lastErrorMessage ?? 'Workflow definitions could not be synced.')\n : sync?.status === 'syncing'\n ? 'Workflow definitions are being discovered.'\n : sync?.status === 'succeeded'\n ? 'No workflow definitions found.'\n : 'Workflow sync has not reported yet.';\n\n return <EmptyState icon=\"flowChart\" title=\"No workflows\" description={message} />;\n}\n\nfunction WorkflowSyncAlert({sync}: {sync: DefinitionSyncSummary | null | undefined}) {\n if (sync?.status !== 'failed') return null;\n\n return (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-4\">\n <Text size=\"sm\" bold>\n Workflow sync failed\n </Text>\n <Text size=\"sm\">\n {sync.lastErrorMessage ?? 'The latest workflow sync failed before definitions updated.'}\n </Text>\n </div>\n </Callout>\n );\n}\n\nfunction DefinitionSheet({\n definition,\n onOpenChange,\n}: {\n definition: Definition | null;\n onOpenChange: (open: boolean) => void;\n}) {\n const normalizedJson = definition\n ? JSON.stringify(\n {\n workflow_document: definition.workflowDocument,\n workflow_model: definition.workflowModel,\n },\n null,\n 2,\n )\n : '';\n\n return (\n <Sheet open={Boolean(definition)} onOpenChange={onOpenChange}>\n <SheetContent className=\"w-full sm:max-w-[560px]\">\n {definition ? (\n <>\n <SheetHeader>\n <SheetTitle>{definition.name}</SheetTitle>\n <SheetDescription>\n {definition.configPath ?? 'Manual workflow definition'}\n </SheetDescription>\n </SheetHeader>\n <SheetBody className=\"gap-18\">\n <div className=\"grid w-full gap-10\">\n <Metadata label=\"Definition id\" value={definition.id} />\n <Metadata label=\"Source\" value={definition.source} />\n <Metadata label=\"Ref\" value={definition.ref ?? 'Not set'} />\n <Metadata label=\"SHA\" value={definition.sha ?? 'Not set'} />\n </div>\n <div className=\"flex w-full flex-col gap-8\">\n <Text size=\"sm\" bold>\n Normalized definition\n </Text>\n <pre className=\"max-h-[52vh] w-full overflow-auto rounded-8 border border-border-neutral-base bg-background-neutral-subtle p-12 scrollbar\">\n <Code as=\"code\" className=\"whitespace-pre text-foreground-neutral-base\">\n {normalizedJson}\n </Code>\n </pre>\n </div>\n </SheetBody>\n </>\n ) : null}\n </SheetContent>\n </Sheet>\n );\n}\n\nfunction Metadata({label, value}: {label: string; value: string}) {\n return (\n <div className=\"min-w-0 py-12 first:pt-0 last:pb-0\">\n <Text size=\"xs\" className=\"text-foreground-neutral-muted\">\n {label}\n </Text>\n <Text size=\"sm\" className=\"break-words\">\n {value}\n </Text>\n </div>\n );\n}\n\nfunction errorMessage(error: unknown, fallback: string) {\n if (error instanceof ApiError && error.message) return error.message;\n if (error instanceof Error && error.message) return error.message;\n return fallback;\n}\n"],"names":["ApiError","SourceStrip","useDefinitionsInfiniteQuery","useProjectQuery","QueryLoadError","Button","Callout","EmptyState","Icon","LoadErrorState","RelativeTime","RelativeTimeProvider","Sheet","SheetBody","SheetContent","SheetDescription","SheetHeader","SheetTitle","Skeleton","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","toast","Code","Header","Text","useState","useFireManualWorkflowMutation","ProjectWorkflowsPage","projectId","ProjectWorkflowsPageInner","projectQuery","definitionsQuery","fireManual","selectedDefinition","setSelectedDefinition","runError","setRunError","definitions","data","pages","flatMap","page","sync","handleRun","definition","manualTrigger","mutateAsync","definitionId","id","success","error","message","errorMessage","div","className","isPending","isError","undefined","status","icon","title","description","query","subject","header","variant","size","connectionId","source","externalRepositoryId","WorkflowSyncAlert","WorkflowDefinitionsList","runningDefinitionId","variables","hasNextPage","isFetchingNextPage","isFetchNextPageError","onRetry","refetch","onLoadMore","fetchNextPage","onOpenDefinition","onRun","DefinitionSheet","onOpenChange","open","length","retryLabel","WorkflowEmptyState","map","runErrorMessage","isRunning","name","sourceIcon","aria-hidden","button","type","onClick","bold","configPath","value","updatedAt","isLoading","role","lastErrorCode","lastErrorMessage","normalizedJson","JSON","stringify","workflow_document","workflowDocument","workflow_model","workflowModel","Boolean","Metadata","label","ref","sha","pre","as","fallback","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/pages/project-workflows-page.tsx"],"sourcesContent":["import {ApiError} from '@shipfox/client-api';\nimport {\n type Definition,\n type DefinitionSyncSummary,\n SourceStrip,\n useDefinitionsInfiniteQuery,\n useProjectQuery,\n} from '@shipfox/client-projects';\nimport {QueryLoadError} from '@shipfox/client-ui';\nimport {Button} from '@shipfox/react-ui/button';\nimport {Callout} from '@shipfox/react-ui/callout';\nimport {EmptyState} from '@shipfox/react-ui/empty-state';\nimport {Icon, type IconName} from '@shipfox/react-ui/icon';\nimport {LoadErrorState} from '@shipfox/react-ui/load-error-state';\nimport {RelativeTime, RelativeTimeProvider} from '@shipfox/react-ui/relative-time';\nimport {\n Sheet,\n SheetBody,\n SheetContent,\n SheetDescription,\n SheetHeader,\n SheetTitle,\n} from '@shipfox/react-ui/sheet';\nimport {Skeleton} from '@shipfox/react-ui/skeleton';\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '@shipfox/react-ui/table';\nimport {toast} from '@shipfox/react-ui/toast';\nimport {Code, Header, Text} from '@shipfox/react-ui/typography';\nimport {useState} from 'react';\nimport {useFireManualWorkflowMutation} from '#hooks/api/workflow-runs.js';\n\nexport function ProjectWorkflowsPage({projectId}: {projectId: string}) {\n return (\n <RelativeTimeProvider>\n <ProjectWorkflowsPageInner projectId={projectId} />\n </RelativeTimeProvider>\n );\n}\n\nfunction ProjectWorkflowsPageInner({projectId}: {projectId: string}) {\n const projectQuery = useProjectQuery(projectId);\n const definitionsQuery = useDefinitionsInfiniteQuery(projectId);\n const fireManual = useFireManualWorkflowMutation();\n const [selectedDefinition, setSelectedDefinition] = useState<Definition | null>(null);\n const [runError, setRunError] = useState<{definitionId: string; message: string} | null>(null);\n const definitions = definitionsQuery.data?.pages.flatMap((page) => page.definitions) ?? [];\n const sync = definitionsQuery.data?.pages[0]?.sync;\n\n async function handleRun(definition: Definition) {\n setRunError(null);\n if (!definition.manualTrigger) return;\n try {\n await fireManual.mutateAsync({projectId, definitionId: definition.id});\n toast.success('Run queued');\n } catch (error) {\n const message = errorMessage(error, 'Could not queue run.');\n setRunError({definitionId: definition.id, message});\n toast.error(message);\n }\n }\n\n return (\n <div className=\"flex w-full flex-col gap-24\">\n {projectQuery.isPending ? (\n <div className=\"flex flex-col gap-12\">\n <Skeleton className=\"h-28 w-1/3\" />\n <Skeleton className=\"h-18 w-1/2\" />\n </div>\n ) : null}\n\n {projectQuery.isError && projectQuery.data === undefined ? (\n projectQuery.error instanceof ApiError && projectQuery.error.status === 404 ? (\n <EmptyState\n icon=\"errorWarningLine\"\n title=\"Project not found\"\n description=\"This project doesn't exist, or you don't have access to it.\"\n />\n ) : (\n <QueryLoadError query={projectQuery} subject=\"project\" />\n )\n ) : null}\n\n {projectQuery.data ? (\n <>\n <header className=\"flex flex-col gap-4\">\n <Header variant=\"h2\">Workflows</Header>\n <Text size=\"sm\" className=\"text-foreground-neutral-muted\">\n Synced workflow definitions for this project source.\n </Text>\n </header>\n\n <SourceStrip\n connectionId={projectQuery.data.source.connectionId}\n externalRepositoryId={projectQuery.data.source.externalRepositoryId}\n sync={sync}\n isPending={definitionsQuery.isPending}\n />\n\n <WorkflowSyncAlert sync={sync} />\n <WorkflowSyncWarnings sync={sync} />\n\n <WorkflowDefinitionsList\n definitions={definitions}\n isPending={definitionsQuery.isPending}\n isError={definitionsQuery.isError}\n sync={sync ?? null}\n runError={runError}\n runningDefinitionId={\n fireManual.isPending && fireManual.variables\n ? fireManual.variables.definitionId\n : null\n }\n hasNextPage={definitionsQuery.hasNextPage}\n isFetchingNextPage={definitionsQuery.isFetchingNextPage}\n isFetchNextPageError={definitionsQuery.isFetchNextPageError}\n onRetry={() => definitionsQuery.refetch()}\n onLoadMore={() => definitionsQuery.fetchNextPage()}\n onOpenDefinition={setSelectedDefinition}\n onRun={(definition) => {\n void handleRun(definition);\n }}\n />\n </>\n ) : null}\n\n <DefinitionSheet\n definition={selectedDefinition}\n onOpenChange={(open) => {\n if (!open) setSelectedDefinition(null);\n }}\n />\n </div>\n );\n}\n\nfunction WorkflowDefinitionsList({\n definitions,\n isPending,\n isError,\n sync,\n runError,\n runningDefinitionId,\n hasNextPage,\n isFetchingNextPage,\n isFetchNextPageError,\n onRetry,\n onLoadMore,\n onOpenDefinition,\n onRun,\n}: {\n definitions: Definition[];\n isPending: boolean;\n isError: boolean;\n sync: DefinitionSyncSummary | null;\n runError: {definitionId: string; message: string} | null;\n runningDefinitionId: string | null;\n hasNextPage: boolean;\n isFetchingNextPage: boolean;\n isFetchNextPageError: boolean;\n onRetry: () => void;\n onLoadMore: () => void;\n onOpenDefinition: (definition: Definition) => void;\n onRun: (definition: Definition) => void;\n}) {\n if (isPending) {\n return (\n <div className=\"flex flex-col gap-8\">\n <Skeleton className=\"h-40 w-full\" />\n <Skeleton className=\"h-40 w-full\" />\n <Skeleton className=\"h-40 w-full\" />\n </div>\n );\n }\n\n if (isError && definitions.length === 0) {\n return (\n <LoadErrorState\n title=\"Couldn't load workflows\"\n description=\"Definitions could not be loaded. Source metadata remains visible.\"\n onRetry={onRetry}\n retryLabel=\"Retry loading workflows\"\n />\n );\n }\n\n if (definitions.length === 0) {\n return <WorkflowEmptyState sync={sync} />;\n }\n\n return (\n <>\n <div className=\"hidden rounded-8 border border-border-neutral-base md:block\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-40\"></TableHead>\n <TableHead>Workflow</TableHead>\n <TableHead className=\"w-180\">Updated</TableHead>\n <TableHead className=\"w-80 text-right\"></TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {definitions.map((definition) => {\n const runErrorMessage =\n runError?.definitionId === definition.id ? runError.message : null;\n const isRunning = runningDefinitionId === definition.id;\n\n return (\n // The workflow-name cell holds a `<button>` so the row is\n // keyboard-reachable (Tab focuses, Enter/Space activates\n // via native button semantics). The TableRow itself is no\n // longer clickable: a row-level onClick would be invisible\n // to keyboard users and require custom keydown handling.\n // The `group` class on the row still drives the Run button\n // reveal on hover or focus-within.\n <TableRow key={definition.id} className=\"group\">\n <TableCell>\n <Icon\n name={sourceIcon(definition.source)}\n className=\"size-16 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n </TableCell>\n <TableCell className=\"max-w-260\">\n <div className=\"flex min-w-0 flex-col gap-2\">\n <button\n type=\"button\"\n onClick={() => onOpenDefinition(definition)}\n className=\"flex min-w-0 flex-col gap-2 text-left outline-none focus-visible:shadow-border-interactive-with-active rounded-4\"\n >\n <Text size=\"sm\" bold className=\"truncate\">\n {definition.name}\n </Text>\n <Code className=\"truncate text-foreground-neutral-muted\">\n {definition.configPath ?? 'Manual definition'}\n </Code>\n </button>\n {runErrorMessage ? (\n <Text size=\"xs\" className=\"text-tag-error-text\">\n {runErrorMessage}\n </Text>\n ) : null}\n </div>\n </TableCell>\n <TableCell className=\"text-foreground-neutral-muted\">\n <RelativeTime value={definition.updatedAt} />\n </TableCell>\n <TableCell>\n {definition.manualTrigger ? (\n <div className=\"flex justify-end opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100\">\n <Button size=\"xs\" isLoading={isRunning} onClick={() => onRun(definition)}>\n Run\n </Button>\n </div>\n ) : null}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </div>\n\n <div className=\"flex flex-col rounded-8 border border-border-neutral-base md:hidden\">\n {definitions.map((definition) => {\n const runErrorMessage =\n runError?.definitionId === definition.id ? runError.message : null;\n const isRunning = runningDefinitionId === definition.id;\n\n return (\n <div\n key={definition.id}\n className=\"flex flex-col gap-10 border-b border-border-neutral-base p-12 last:border-b-0\"\n >\n <button\n type=\"button\"\n className=\"flex min-w-0 items-start gap-10 text-left\"\n onClick={() => onOpenDefinition(definition)}\n >\n <Icon\n name={sourceIcon(definition.source)}\n className=\"size-16 shrink-0 text-foreground-neutral-muted\"\n aria-hidden=\"true\"\n />\n <div className=\"flex min-w-0 flex-col gap-4\">\n <Text size=\"sm\" bold className=\"break-words\">\n {definition.name}\n </Text>\n <Code className=\"break-words text-foreground-neutral-muted\">\n {definition.configPath ?? 'Manual definition'}\n </Code>\n </div>\n </button>\n <div className=\"flex items-center justify-between gap-8\">\n <Text size=\"xs\" className=\"text-foreground-neutral-muted\">\n Updated <RelativeTime value={definition.updatedAt} />\n </Text>\n {definition.manualTrigger ? (\n <Button size=\"sm\" isLoading={isRunning} onClick={() => onRun(definition)}>\n Run\n </Button>\n ) : null}\n </div>\n {runErrorMessage ? (\n <Text size=\"xs\" className=\"text-tag-error-text\">\n {runErrorMessage}\n </Text>\n ) : null}\n </div>\n );\n })}\n </div>\n\n {isFetchNextPageError ? (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex items-center justify-between gap-12\">\n <Text size=\"sm\">Could not load more workflows.</Text>\n <Button size=\"sm\" variant=\"secondary\" onClick={onLoadMore}>\n Retry\n </Button>\n </div>\n </Callout>\n ) : null}\n\n {hasNextPage ? (\n <div className=\"flex justify-center\">\n <Button size=\"sm\" variant=\"secondary\" isLoading={isFetchingNextPage} onClick={onLoadMore}>\n Load more\n </Button>\n </div>\n ) : null}\n </>\n );\n}\n\nfunction sourceIcon(source: 'manual' | 'vcs'): IconName {\n return source === 'vcs' ? ('gitBranchLine' as IconName) : ('terminalLine' as IconName);\n}\n\nfunction WorkflowEmptyState({sync}: {sync: DefinitionSyncSummary | null}) {\n const message =\n sync?.status === 'failed' && sync.lastErrorCode === 'no-workflow-files'\n ? 'No workflow files found under .shipfox/workflows/.'\n : sync?.status === 'failed'\n ? (sync.lastErrorMessage ?? 'Workflow definitions could not be synced.')\n : sync?.status === 'syncing'\n ? 'Workflow definitions are being discovered.'\n : sync?.status === 'succeeded'\n ? 'No workflow definitions found.'\n : 'Workflow sync has not reported yet.';\n\n return <EmptyState icon=\"flowChart\" title=\"No workflows\" description={message} />;\n}\n\nfunction WorkflowSyncAlert({sync}: {sync: DefinitionSyncSummary | null | undefined}) {\n if (sync?.status !== 'failed') return null;\n\n return (\n <Callout role=\"alert\" type=\"error\">\n <div className=\"flex flex-col gap-4\">\n <Text size=\"sm\" bold>\n Workflow sync failed\n </Text>\n <Text size=\"sm\">\n {sync.lastErrorMessage ?? 'The latest workflow sync failed before definitions updated.'}\n </Text>\n </div>\n </Callout>\n );\n}\n\nfunction WorkflowSyncWarnings({sync}: {sync: DefinitionSyncSummary | null | undefined}) {\n if (sync?.status !== 'succeeded' || sync.warnings.length === 0) return null;\n\n const seenKeys = new Map<string, number>();\n const warningItems = sync.warnings.map((warning) => {\n const baseKey = `${warning.code}-${warning.path ?? 'workflow'}-${warning.message}`;\n const occurrence = seenKeys.get(baseKey) ?? 0;\n seenKeys.set(baseKey, occurrence + 1);\n return {key: `${baseKey}-${occurrence}`, warning};\n });\n\n return (\n <Callout role=\"status\" type=\"warning\">\n <div className=\"flex flex-col gap-6\">\n <Text size=\"sm\" bold>\n Workflow definition warnings\n </Text>\n <ul className=\"flex flex-col gap-4\">\n {warningItems.map(({key, warning}) => (\n <li key={key}>\n <Text size=\"sm\">{warning.message}</Text>\n {warning.path ? (\n <Code className=\"text-foreground-neutral-muted\">{warning.path}</Code>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n </Callout>\n );\n}\n\nfunction DefinitionSheet({\n definition,\n onOpenChange,\n}: {\n definition: Definition | null;\n onOpenChange: (open: boolean) => void;\n}) {\n const normalizedJson = definition\n ? JSON.stringify(\n {\n workflow_document: definition.workflowDocument,\n workflow_model: definition.workflowModel,\n },\n null,\n 2,\n )\n : '';\n\n return (\n <Sheet open={Boolean(definition)} onOpenChange={onOpenChange}>\n <SheetContent className=\"w-full sm:max-w-[560px]\">\n {definition ? (\n <>\n <SheetHeader>\n <SheetTitle>{definition.name}</SheetTitle>\n <SheetDescription>\n {definition.configPath ?? 'Manual workflow definition'}\n </SheetDescription>\n </SheetHeader>\n <SheetBody className=\"gap-18\">\n <div className=\"grid w-full gap-10\">\n <Metadata label=\"Definition id\" value={definition.id} />\n <Metadata label=\"Source\" value={definition.source} />\n <Metadata label=\"Ref\" value={definition.ref ?? 'Not set'} />\n <Metadata label=\"SHA\" value={definition.sha ?? 'Not set'} />\n </div>\n <div className=\"flex w-full flex-col gap-8\">\n <Text size=\"sm\" bold>\n Normalized definition\n </Text>\n <pre className=\"max-h-[52vh] w-full overflow-auto rounded-8 border border-border-neutral-base bg-background-neutral-subtle p-12 scrollbar\">\n <Code as=\"code\" className=\"whitespace-pre text-foreground-neutral-base\">\n {normalizedJson}\n </Code>\n </pre>\n </div>\n </SheetBody>\n </>\n ) : null}\n </SheetContent>\n </Sheet>\n );\n}\n\nfunction Metadata({label, value}: {label: string; value: string}) {\n return (\n <div className=\"min-w-0 py-12 first:pt-0 last:pb-0\">\n <Text size=\"xs\" className=\"text-foreground-neutral-muted\">\n {label}\n </Text>\n <Text size=\"sm\" className=\"break-words\">\n {value}\n </Text>\n </div>\n );\n}\n\nfunction errorMessage(error: unknown, fallback: string) {\n if (error instanceof ApiError && error.message) return error.message;\n if (error instanceof Error && error.message) return error.message;\n return fallback;\n}\n"],"names":["ApiError","SourceStrip","useDefinitionsInfiniteQuery","useProjectQuery","QueryLoadError","Button","Callout","EmptyState","Icon","LoadErrorState","RelativeTime","RelativeTimeProvider","Sheet","SheetBody","SheetContent","SheetDescription","SheetHeader","SheetTitle","Skeleton","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","toast","Code","Header","Text","useState","useFireManualWorkflowMutation","ProjectWorkflowsPage","projectId","ProjectWorkflowsPageInner","projectQuery","definitionsQuery","fireManual","selectedDefinition","setSelectedDefinition","runError","setRunError","definitions","data","pages","flatMap","page","sync","handleRun","definition","manualTrigger","mutateAsync","definitionId","id","success","error","message","errorMessage","div","className","isPending","isError","undefined","status","icon","title","description","query","subject","header","variant","size","connectionId","source","externalRepositoryId","WorkflowSyncAlert","WorkflowSyncWarnings","WorkflowDefinitionsList","runningDefinitionId","variables","hasNextPage","isFetchingNextPage","isFetchNextPageError","onRetry","refetch","onLoadMore","fetchNextPage","onOpenDefinition","onRun","DefinitionSheet","onOpenChange","open","length","retryLabel","WorkflowEmptyState","map","runErrorMessage","isRunning","name","sourceIcon","aria-hidden","button","type","onClick","bold","configPath","value","updatedAt","isLoading","role","lastErrorCode","lastErrorMessage","warnings","seenKeys","Map","warningItems","warning","baseKey","code","path","occurrence","get","set","key","ul","li","normalizedJson","JSON","stringify","workflow_document","workflowDocument","workflow_model","workflowModel","Boolean","Metadata","label","ref","sha","pre","as","fallback","Error"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type WorkflowRunsSearch } from '#routes/inputs.js';
2
+ interface WorkflowRunDetailPageProps {
3
+ projectId: string;
4
+ workspaceSlug: string;
5
+ projectSlug: string;
6
+ workflowRunId?: string | undefined;
7
+ search?: WorkflowRunsSearch;
8
+ }
9
+ export declare function WorkflowRunDetailPage({ projectId, workspaceSlug, projectSlug, workflowRunId, search, }: WorkflowRunDetailPageProps): import("react").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=workflow-run-detail-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-run-detail-page.d.ts","sourceRoot":"","sources":["../../src/pages/workflow-run-detail-page.tsx"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,kBAAkB,EAIxB,MAAM,mBAAmB,CAAC;AAE3B,UAAU,0BAA0B;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,aAAa,EACb,WAAW,EACX,aAAa,EACb,MAAW,GACZ,EAAE,0BAA0B,+BA6C5B"}
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useNavigate } from '@tanstack/react-router';
3
+ import { useCallback } from 'react';
4
+ import { WorkflowRunView } from '#components/workflow-run-view/index.js';
5
+ import { validateWorkflowRunsSearch, workflowRunSearchParams, workflowRunTab } from '#routes/inputs.js';
6
+ export function WorkflowRunDetailPage({ projectId, workspaceSlug, projectSlug, workflowRunId, search = {} }) {
7
+ const navigate = useNavigate();
8
+ const selection = search;
9
+ const onSelectionChange = useCallback((nextSelection)=>{
10
+ navigate({
11
+ search: (previous)=>{
12
+ const current = validateWorkflowRunsSearch(previous);
13
+ return workflowRunSearchParams(current, nextSelection);
14
+ },
15
+ replace: true
16
+ });
17
+ }, [
18
+ navigate
19
+ ]);
20
+ const onTabChange = useCallback((nextTab)=>{
21
+ navigate({
22
+ search: (previous)=>{
23
+ const current = validateWorkflowRunsSearch(previous);
24
+ const nextSearch = workflowRunSearchParams({
25
+ ...current,
26
+ tab: nextTab
27
+ }, current);
28
+ return nextTab === 'summary' && (current.jobId || current.jobExecutionId || current.stepId || current.stepAttemptId) ? {
29
+ ...nextSearch,
30
+ tab: nextTab
31
+ } : nextSearch;
32
+ }
33
+ });
34
+ }, [
35
+ navigate
36
+ ]);
37
+ return /*#__PURE__*/ _jsx("div", {
38
+ className: "flex min-h-0 flex-1 overflow-hidden bg-background-neutral-background",
39
+ children: /*#__PURE__*/ _jsx(WorkflowRunView, {
40
+ projectId: projectId,
41
+ workspaceSlug: workspaceSlug,
42
+ projectSlug: projectSlug,
43
+ workflowRunId: workflowRunId,
44
+ selection: selection,
45
+ onSelectionChange: onSelectionChange,
46
+ tab: workflowRunTab(search),
47
+ onTabChange: onTabChange
48
+ })
49
+ });
50
+ }
51
+
52
+ //# sourceMappingURL=workflow-run-detail-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/pages/workflow-run-detail-page.tsx"],"sourcesContent":["import {useNavigate} from '@tanstack/react-router';\nimport {useCallback} from 'react';\nimport {WorkflowRunView} from '#components/workflow-run-view/index.js';\nimport type {WorkflowRunSelectionInput} from '#core/workflow-run-url-state.js';\nimport {\n validateWorkflowRunsSearch,\n type WorkflowRunsSearch,\n type WorkflowRunTab,\n workflowRunSearchParams,\n workflowRunTab,\n} from '#routes/inputs.js';\n\ninterface WorkflowRunDetailPageProps {\n projectId: string;\n workspaceSlug: string;\n projectSlug: string;\n workflowRunId?: string | undefined;\n search?: WorkflowRunsSearch;\n}\n\nexport function WorkflowRunDetailPage({\n projectId,\n workspaceSlug,\n projectSlug,\n workflowRunId,\n search = {},\n}: WorkflowRunDetailPageProps) {\n const navigate = useNavigate();\n const selection: WorkflowRunSelectionInput = search;\n const onSelectionChange = useCallback(\n (nextSelection: WorkflowRunSelectionInput) => {\n navigate({\n search: ((previous: Record<string, unknown>) => {\n const current = validateWorkflowRunsSearch(previous);\n return workflowRunSearchParams(current, nextSelection);\n }) as never,\n replace: true,\n });\n },\n [navigate],\n );\n const onTabChange = useCallback(\n (nextTab: WorkflowRunTab) => {\n navigate({\n search: ((previous: Record<string, unknown>) => {\n const current = validateWorkflowRunsSearch(previous);\n const nextSearch = workflowRunSearchParams({...current, tab: nextTab}, current);\n return nextTab === 'summary' &&\n (current.jobId || current.jobExecutionId || current.stepId || current.stepAttemptId)\n ? {...nextSearch, tab: nextTab}\n : nextSearch;\n }) as never,\n });\n },\n [navigate],\n );\n\n return (\n <div className=\"flex min-h-0 flex-1 overflow-hidden bg-background-neutral-background\">\n <WorkflowRunView\n projectId={projectId}\n workspaceSlug={workspaceSlug}\n projectSlug={projectSlug}\n workflowRunId={workflowRunId}\n selection={selection}\n onSelectionChange={onSelectionChange}\n tab={workflowRunTab(search)}\n onTabChange={onTabChange}\n />\n </div>\n );\n}\n"],"names":["useNavigate","useCallback","WorkflowRunView","validateWorkflowRunsSearch","workflowRunSearchParams","workflowRunTab","WorkflowRunDetailPage","projectId","workspaceSlug","projectSlug","workflowRunId","search","navigate","selection","onSelectionChange","nextSelection","previous","current","replace","onTabChange","nextTab","nextSearch","tab","jobId","jobExecutionId","stepId","stepAttemptId","div","className"],"mappings":";AAAA,SAAQA,WAAW,QAAO,yBAAyB;AACnD,SAAQC,WAAW,QAAO,QAAQ;AAClC,SAAQC,eAAe,QAAO,yCAAyC;AAEvE,SACEC,0BAA0B,EAG1BC,uBAAuB,EACvBC,cAAc,QACT,oBAAoB;AAU3B,OAAO,SAASC,sBAAsB,EACpCC,SAAS,EACTC,aAAa,EACbC,WAAW,EACXC,aAAa,EACbC,SAAS,CAAC,CAAC,EACgB;IAC3B,MAAMC,WAAWZ;IACjB,MAAMa,YAAuCF;IAC7C,MAAMG,oBAAoBb,YACxB,CAACc;QACCH,SAAS;YACPD,QAAS,CAACK;gBACR,MAAMC,UAAUd,2BAA2Ba;gBAC3C,OAAOZ,wBAAwBa,SAASF;YAC1C;YACAG,SAAS;QACX;IACF,GACA;QAACN;KAAS;IAEZ,MAAMO,cAAclB,YAClB,CAACmB;QACCR,SAAS;YACPD,QAAS,CAACK;gBACR,MAAMC,UAAUd,2BAA2Ba;gBAC3C,MAAMK,aAAajB,wBAAwB;oBAAC,GAAGa,OAAO;oBAAEK,KAAKF;gBAAO,GAAGH;gBACvE,OAAOG,YAAY,aAChBH,CAAAA,QAAQM,KAAK,IAAIN,QAAQO,cAAc,IAAIP,QAAQQ,MAAM,IAAIR,QAAQS,aAAa,AAAD,IAChF;oBAAC,GAAGL,UAAU;oBAAEC,KAAKF;gBAAO,IAC5BC;YACN;QACF;IACF,GACA;QAACT;KAAS;IAGZ,qBACE,KAACe;QAAIC,WAAU;kBACb,cAAA,KAAC1B;YACCK,WAAWA;YACXC,eAAeA;YACfC,aAAaA;YACbC,eAAeA;YACfG,WAAWA;YACXC,mBAAmBA;YACnBQ,KAAKjB,eAAeM;YACpBQ,aAAaA;;;AAIrB"}
@@ -0,0 +1,10 @@
1
+ import { type WorkflowRunsSearch } from '#routes/inputs.js';
2
+ interface WorkflowRunsPageProps {
3
+ projectId: string;
4
+ workspaceSlug: string;
5
+ projectSlug: string;
6
+ search?: WorkflowRunsSearch;
7
+ }
8
+ export declare function WorkflowRunsPage({ projectId, workspaceSlug, projectSlug, search, }: WorkflowRunsPageProps): import("react").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=workflow-run-list-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-run-list-page.d.ts","sourceRoot":"","sources":["../../src/pages/workflow-run-list-page.tsx"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,kBAAkB,EAExB,MAAM,mBAAmB,CAAC;AAE3B,UAAU,qBAAqB;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAID,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,aAAa,EACb,WAAW,EACX,MAAqB,GACtB,EAAE,qBAAqB,+BAuCvB"}