@flanksource/clicky-ui 0.3.24 → 0.3.26

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 (491) hide show
  1. package/NOTICE.md +1 -0
  2. package/dist/ai.cjs +4 -0
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +6 -2
  5. package/dist/ai.js.map +1 -1
  6. package/dist/chat.cjs +8 -0
  7. package/dist/chat.cjs.map +1 -1
  8. package/dist/chat.js +9 -1
  9. package/dist/chat.js.map +1 -1
  10. package/dist/comments/CommentCard.cjs +89 -14
  11. package/dist/comments/CommentCard.cjs.map +1 -1
  12. package/dist/comments/CommentCard.d.ts.map +1 -1
  13. package/dist/comments/CommentCard.js +90 -15
  14. package/dist/comments/CommentCard.js.map +1 -1
  15. package/dist/comments/CommentComposer.cjs +25 -2
  16. package/dist/comments/CommentComposer.cjs.map +1 -1
  17. package/dist/comments/CommentComposer.d.ts.map +1 -1
  18. package/dist/comments/CommentComposer.js +25 -2
  19. package/dist/comments/CommentComposer.js.map +1 -1
  20. package/dist/comments/CommentProvider.cjs +21 -14
  21. package/dist/comments/CommentProvider.cjs.map +1 -1
  22. package/dist/comments/CommentProvider.d.ts +1 -1
  23. package/dist/comments/CommentProvider.d.ts.map +1 -1
  24. package/dist/comments/CommentProvider.js +21 -14
  25. package/dist/comments/CommentProvider.js.map +1 -1
  26. package/dist/comments/CommentSidePanel.cjs +1 -1
  27. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  28. package/dist/comments/CommentSidePanel.js +1 -1
  29. package/dist/comments/CommentSidePanel.js.map +1 -1
  30. package/dist/comments/comment-types.cjs.map +1 -1
  31. package/dist/comments/comment-types.d.ts +6 -0
  32. package/dist/comments/comment-types.d.ts.map +1 -1
  33. package/dist/comments/comment-types.js.map +1 -1
  34. package/dist/components/DimensionField.cjs +56 -0
  35. package/dist/components/DimensionField.cjs.map +1 -0
  36. package/dist/components/DimensionField.d.ts +17 -0
  37. package/dist/components/DimensionField.d.ts.map +1 -0
  38. package/dist/components/DimensionField.js +56 -0
  39. package/dist/components/DimensionField.js.map +1 -0
  40. package/dist/components.cjs +4 -0
  41. package/dist/components.cjs.map +1 -1
  42. package/dist/components.d.ts +2 -0
  43. package/dist/components.d.ts.map +1 -1
  44. package/dist/components.js +4 -0
  45. package/dist/components.js.map +1 -1
  46. package/dist/data/Clicky.cjs +4 -5
  47. package/dist/data/Clicky.cjs.map +1 -1
  48. package/dist/data/Clicky.d.ts.map +1 -1
  49. package/dist/data/Clicky.js +4 -5
  50. package/dist/data/Clicky.js.map +1 -1
  51. package/dist/data/TaskExecDetails.cjs +8 -3
  52. package/dist/data/TaskExecDetails.cjs.map +1 -1
  53. package/dist/data/TaskExecDetails.d.ts +4 -0
  54. package/dist/data/TaskExecDetails.d.ts.map +1 -1
  55. package/dist/data/TaskExecDetails.js +9 -4
  56. package/dist/data/TaskExecDetails.js.map +1 -1
  57. package/dist/data/TaskManagerButton.cjs +101 -7
  58. package/dist/data/TaskManagerButton.cjs.map +1 -1
  59. package/dist/data/TaskManagerButton.d.ts +6 -1
  60. package/dist/data/TaskManagerButton.d.ts.map +1 -1
  61. package/dist/data/TaskManagerButton.js +103 -9
  62. package/dist/data/TaskManagerButton.js.map +1 -1
  63. package/dist/data/TaskProcessDetails.cjs +2 -0
  64. package/dist/data/TaskProcessDetails.cjs.map +1 -1
  65. package/dist/data/TaskProcessDetails.d.ts.map +1 -1
  66. package/dist/data/TaskProcessDetails.js +2 -0
  67. package/dist/data/TaskProcessDetails.js.map +1 -1
  68. package/dist/data/TaskProgress.cjs +14 -4
  69. package/dist/data/TaskProgress.cjs.map +1 -1
  70. package/dist/data/TaskProgress.js +14 -4
  71. package/dist/data/TaskProgress.js.map +1 -1
  72. package/dist/data/TaskSnapshot.cjs.map +1 -1
  73. package/dist/data/TaskSnapshot.d.ts +1 -0
  74. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  75. package/dist/data/TaskSnapshot.js.map +1 -1
  76. package/dist/data/ai/ChatWindow.cjs +18 -23
  77. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  78. package/dist/data/ai/ChatWindow.d.ts +1 -1
  79. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  80. package/dist/data/ai/ChatWindow.js +19 -24
  81. package/dist/data/ai/ChatWindow.js.map +1 -1
  82. package/dist/data/ai/ChatWindow.preferences.cjs +12 -21
  83. package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
  84. package/dist/data/ai/ChatWindow.preferences.d.ts +3 -2
  85. package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
  86. package/dist/data/ai/ChatWindow.preferences.js +12 -21
  87. package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
  88. package/dist/data/ai/ChatWindow.tool-catalog.cjs +21 -38
  89. package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
  90. package/dist/data/ai/ChatWindow.tool-catalog.d.ts +5 -5
  91. package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
  92. package/dist/data/ai/ChatWindow.tool-catalog.js +21 -38
  93. package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
  94. package/dist/data/ai/ChatWindow.types.d.ts +2 -2
  95. package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
  96. package/dist/data/ai/ChatWindowManager.cjs +2 -2
  97. package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
  98. package/dist/data/ai/ChatWindowManager.js +2 -2
  99. package/dist/data/ai/ChatWindowManager.js.map +1 -1
  100. package/dist/data/ai/ChatWindowRequestBody.cjs +4 -2
  101. package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -1
  102. package/dist/data/ai/ChatWindowRequestBody.d.ts +15 -3
  103. package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -1
  104. package/dist/data/ai/ChatWindowRequestBody.js +4 -2
  105. package/dist/data/ai/ChatWindowRequestBody.js.map +1 -1
  106. package/dist/data/ai/ToolPreferences.cjs +5 -5
  107. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  108. package/dist/data/ai/ToolPreferences.d.ts +6 -5
  109. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  110. package/dist/data/ai/ToolPreferences.js +5 -5
  111. package/dist/data/ai/ToolPreferences.js.map +1 -1
  112. package/dist/data/ai/ToolPreferences.model.cjs +61 -37
  113. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  114. package/dist/data/ai/ToolPreferences.model.d.ts +32 -13
  115. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  116. package/dist/data/ai/ToolPreferences.model.js +62 -38
  117. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  118. package/dist/data/ai/ToolPreferencesList.cjs +17 -20
  119. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  120. package/dist/data/ai/ToolPreferencesList.d.ts +16 -7
  121. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  122. package/dist/data/ai/ToolPreferencesList.js +18 -21
  123. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  124. package/dist/data/ai/chat-window-context.cjs +1 -1
  125. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  126. package/dist/data/ai/chat-window-context.d.ts +7 -7
  127. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  128. package/dist/data/ai/chat-window-context.js +1 -1
  129. package/dist/data/ai/chat-window-context.js.map +1 -1
  130. package/dist/data/ai/index.d.ts +3 -1
  131. package/dist/data/ai/index.d.ts.map +1 -1
  132. package/dist/data/chat/Chat.cjs +8 -4
  133. package/dist/data/chat/Chat.cjs.map +1 -1
  134. package/dist/data/chat/Chat.d.ts.map +1 -1
  135. package/dist/data/chat/Chat.js +8 -4
  136. package/dist/data/chat/Chat.js.map +1 -1
  137. package/dist/data/chat/ChatRuntimeToolbar.cjs +11 -7
  138. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  139. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  140. package/dist/data/chat/ChatRuntimeToolbar.js +11 -7
  141. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  142. package/dist/data/chat/ContextMeter.cjs +64 -27
  143. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  144. package/dist/data/chat/ContextMeter.d.ts +11 -4
  145. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  146. package/dist/data/chat/ContextMeter.js +64 -27
  147. package/dist/data/chat/ContextMeter.js.map +1 -1
  148. package/dist/data/chat/clickyOperationsToTools.cjs +2 -1
  149. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  150. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  151. package/dist/data/chat/clickyOperationsToTools.js +2 -1
  152. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  153. package/dist/data/chat/index.d.ts +2 -1
  154. package/dist/data/chat/index.d.ts.map +1 -1
  155. package/dist/data/chat/tool-policy.cjs +132 -0
  156. package/dist/data/chat/tool-policy.cjs.map +1 -0
  157. package/dist/data/chat/tool-policy.d.ts +81 -0
  158. package/dist/data/chat/tool-policy.d.ts.map +1 -0
  159. package/dist/data/chat/tool-policy.js +132 -0
  160. package/dist/data/chat/tool-policy.js.map +1 -0
  161. package/dist/data/chat/types.cjs +20 -0
  162. package/dist/data/chat/types.cjs.map +1 -1
  163. package/dist/data/chat/types.d.ts +41 -2
  164. package/dist/data/chat/types.d.ts.map +1 -1
  165. package/dist/data/chat/types.js +20 -0
  166. package/dist/data/chat/types.js.map +1 -1
  167. package/dist/data/chat/usage-snapshot.cjs +10 -1
  168. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  169. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  170. package/dist/data/chat/usage-snapshot.js +10 -1
  171. package/dist/data/chat/usage-snapshot.js.map +1 -1
  172. package/dist/data/debugConsoleSignal.cjs +64 -0
  173. package/dist/data/debugConsoleSignal.cjs.map +1 -0
  174. package/dist/data/debugConsoleSignal.d.ts +83 -0
  175. package/dist/data/debugConsoleSignal.d.ts.map +1 -0
  176. package/dist/data/debugConsoleSignal.js +64 -0
  177. package/dist/data/debugConsoleSignal.js.map +1 -0
  178. package/dist/data/har/HarPanel.cjs +20 -14
  179. package/dist/data/har/HarPanel.cjs.map +1 -1
  180. package/dist/data/har/HarPanel.d.ts.map +1 -1
  181. package/dist/data/har/HarPanel.js +20 -14
  182. package/dist/data/har/HarPanel.js.map +1 -1
  183. package/dist/data/har/types.d.ts +18 -0
  184. package/dist/data/har/types.d.ts.map +1 -1
  185. package/dist/data/query-browser/QueryBrowser.cjs +4 -42
  186. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  187. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  188. package/dist/data/query-browser/QueryBrowser.js +5 -43
  189. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  190. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
  191. package/dist/data/query-browser/QueryBrowser.types.d.ts +0 -1
  192. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
  193. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
  194. package/dist/data/useDebugAction.cjs +29 -0
  195. package/dist/data/useDebugAction.cjs.map +1 -0
  196. package/dist/data/useDebugAction.d.ts +16 -0
  197. package/dist/data/useDebugAction.d.ts.map +1 -0
  198. package/dist/data/useDebugAction.js +29 -0
  199. package/dist/data/useDebugAction.js.map +1 -0
  200. package/dist/data/version-info.cjs +3 -3
  201. package/dist/data/version-info.js +3 -3
  202. package/dist/data.cjs +16 -8
  203. package/dist/data.cjs.map +1 -1
  204. package/dist/data.d.ts +3 -2
  205. package/dist/data.d.ts.map +1 -1
  206. package/dist/data.js +16 -8
  207. package/dist/devtools/DebugConsole.cjs +138 -0
  208. package/dist/devtools/DebugConsole.cjs.map +1 -0
  209. package/dist/devtools/DebugConsole.d.ts +23 -0
  210. package/dist/devtools/DebugConsole.d.ts.map +1 -0
  211. package/dist/devtools/DebugConsole.js +138 -0
  212. package/dist/devtools/DebugConsole.js.map +1 -0
  213. package/dist/devtools/DebugConsoleButton.cjs +59 -0
  214. package/dist/devtools/DebugConsoleButton.cjs.map +1 -0
  215. package/dist/devtools/DebugConsoleButton.d.ts +20 -0
  216. package/dist/devtools/DebugConsoleButton.d.ts.map +1 -0
  217. package/dist/devtools/DebugConsoleButton.js +59 -0
  218. package/dist/devtools/DebugConsoleButton.js.map +1 -0
  219. package/dist/devtools/DebugConsoleDock.cjs +112 -0
  220. package/dist/devtools/DebugConsoleDock.cjs.map +1 -0
  221. package/dist/devtools/DebugConsoleDock.d.ts +26 -0
  222. package/dist/devtools/DebugConsoleDock.d.ts.map +1 -0
  223. package/dist/devtools/DebugConsoleDock.js +112 -0
  224. package/dist/devtools/DebugConsoleDock.js.map +1 -0
  225. package/dist/devtools/ExecutionDetail.cjs +135 -0
  226. package/dist/devtools/ExecutionDetail.cjs.map +1 -0
  227. package/dist/devtools/ExecutionDetail.d.ts +19 -0
  228. package/dist/devtools/ExecutionDetail.d.ts.map +1 -0
  229. package/dist/devtools/ExecutionDetail.js +135 -0
  230. package/dist/devtools/ExecutionDetail.js.map +1 -0
  231. package/dist/devtools/debugClient.cjs +172 -0
  232. package/dist/devtools/debugClient.cjs.map +1 -0
  233. package/dist/devtools/debugClient.d.ts +98 -0
  234. package/dist/devtools/debugClient.d.ts.map +1 -0
  235. package/dist/devtools/debugClient.js +172 -0
  236. package/dist/devtools/debugClient.js.map +1 -0
  237. package/dist/devtools/debugStore.cjs +115 -0
  238. package/dist/devtools/debugStore.cjs.map +1 -0
  239. package/dist/devtools/debugStore.d.ts +83 -0
  240. package/dist/devtools/debugStore.d.ts.map +1 -0
  241. package/dist/devtools/debugStore.js +115 -0
  242. package/dist/devtools/debugStore.js.map +1 -0
  243. package/dist/devtools/dockState.cjs +51 -0
  244. package/dist/devtools/dockState.cjs.map +1 -0
  245. package/dist/devtools/dockState.d.ts +31 -0
  246. package/dist/devtools/dockState.d.ts.map +1 -0
  247. package/dist/devtools/dockState.js +51 -0
  248. package/dist/devtools/dockState.js.map +1 -0
  249. package/dist/devtools/tabs/ConsoleTab.cjs +36 -0
  250. package/dist/devtools/tabs/ConsoleTab.cjs.map +1 -0
  251. package/dist/devtools/tabs/ConsoleTab.d.ts +19 -0
  252. package/dist/devtools/tabs/ConsoleTab.d.ts.map +1 -0
  253. package/dist/devtools/tabs/ConsoleTab.js +36 -0
  254. package/dist/devtools/tabs/ConsoleTab.js.map +1 -0
  255. package/dist/devtools/tabs/InspectionCaches.cjs +150 -0
  256. package/dist/devtools/tabs/InspectionCaches.cjs.map +1 -0
  257. package/dist/devtools/tabs/InspectionCaches.d.ts +23 -0
  258. package/dist/devtools/tabs/InspectionCaches.d.ts.map +1 -0
  259. package/dist/devtools/tabs/InspectionCaches.js +150 -0
  260. package/dist/devtools/tabs/InspectionCaches.js.map +1 -0
  261. package/dist/devtools/tabs/InspectionTab.cjs +316 -0
  262. package/dist/devtools/tabs/InspectionTab.cjs.map +1 -0
  263. package/dist/devtools/tabs/InspectionTab.d.ts +27 -0
  264. package/dist/devtools/tabs/InspectionTab.d.ts.map +1 -0
  265. package/dist/devtools/tabs/InspectionTab.js +316 -0
  266. package/dist/devtools/tabs/InspectionTab.js.map +1 -0
  267. package/dist/devtools/tabs/NetworkTab.cjs +91 -0
  268. package/dist/devtools/tabs/NetworkTab.cjs.map +1 -0
  269. package/dist/devtools/tabs/NetworkTab.d.ts +20 -0
  270. package/dist/devtools/tabs/NetworkTab.d.ts.map +1 -0
  271. package/dist/devtools/tabs/NetworkTab.js +91 -0
  272. package/dist/devtools/tabs/NetworkTab.js.map +1 -0
  273. package/dist/devtools/tabs/QueriesTab.cjs +85 -0
  274. package/dist/devtools/tabs/QueriesTab.cjs.map +1 -0
  275. package/dist/devtools/tabs/QueriesTab.d.ts +24 -0
  276. package/dist/devtools/tabs/QueriesTab.d.ts.map +1 -0
  277. package/dist/devtools/tabs/QueriesTab.js +85 -0
  278. package/dist/devtools/tabs/QueriesTab.js.map +1 -0
  279. package/dist/devtools/types.cjs +26 -0
  280. package/dist/devtools/types.cjs.map +1 -0
  281. package/dist/devtools/types.d.ts +235 -0
  282. package/dist/devtools/types.d.ts.map +1 -0
  283. package/dist/devtools/types.js +26 -0
  284. package/dist/devtools/types.js.map +1 -0
  285. package/dist/devtools/useDebugStream.cjs +46 -0
  286. package/dist/devtools/useDebugStream.cjs.map +1 -0
  287. package/dist/devtools/useDebugStream.d.ts +23 -0
  288. package/dist/devtools/useDebugStream.d.ts.map +1 -0
  289. package/dist/devtools/useDebugStream.js +46 -0
  290. package/dist/devtools/useDebugStream.js.map +1 -0
  291. package/dist/devtools.cjs +51 -0
  292. package/dist/devtools.cjs.map +1 -0
  293. package/dist/devtools.d.ts +37 -0
  294. package/dist/devtools.d.ts.map +1 -0
  295. package/dist/devtools.js +51 -0
  296. package/dist/devtools.js.map +1 -0
  297. package/dist/icons/components/UiOpenScad.cjs +10 -0
  298. package/dist/icons/components/UiOpenScad.cjs.map +1 -0
  299. package/dist/icons/components/UiOpenScad.d.ts +9 -0
  300. package/dist/icons/components/UiOpenScad.d.ts.map +1 -0
  301. package/dist/icons/components/UiOpenScad.js +10 -0
  302. package/dist/icons/components/UiOpenScad.js.map +1 -0
  303. package/dist/icons/index.d.ts +1 -0
  304. package/dist/icons/index.d.ts.map +1 -1
  305. package/dist/icons/registry.cjs +2 -0
  306. package/dist/icons/registry.cjs.map +1 -1
  307. package/dist/icons/registry.d.ts.map +1 -1
  308. package/dist/icons/registry.js +2 -0
  309. package/dist/icons/registry.js.map +1 -1
  310. package/dist/icons.cjs +2 -0
  311. package/dist/icons.cjs.map +1 -1
  312. package/dist/icons.js +2 -0
  313. package/dist/icons.js.map +1 -1
  314. package/dist/index.cjs +20 -8
  315. package/dist/index.cjs.map +1 -1
  316. package/dist/index.js +20 -8
  317. package/dist/index.js.map +1 -1
  318. package/dist/layout/AppShell.cjs +15 -10
  319. package/dist/layout/AppShell.cjs.map +1 -1
  320. package/dist/layout/AppShell.d.ts +11 -0
  321. package/dist/layout/AppShell.d.ts.map +1 -1
  322. package/dist/layout/AppShell.js +15 -10
  323. package/dist/layout/AppShell.js.map +1 -1
  324. package/dist/layout/AppShell.nav.cjs +170 -49
  325. package/dist/layout/AppShell.nav.cjs.map +1 -1
  326. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  327. package/dist/layout/AppShell.nav.js +170 -49
  328. package/dist/layout/AppShell.nav.js.map +1 -1
  329. package/dist/overlay/CellActions.cjs +18 -124
  330. package/dist/overlay/CellActions.cjs.map +1 -1
  331. package/dist/overlay/CellActions.d.ts +1 -1
  332. package/dist/overlay/CellActions.d.ts.map +1 -1
  333. package/dist/overlay/CellActions.js +18 -124
  334. package/dist/overlay/CellActions.js.map +1 -1
  335. package/dist/overlay/ContextMenu.cjs +144 -0
  336. package/dist/overlay/ContextMenu.cjs.map +1 -0
  337. package/dist/overlay/ContextMenu.d.ts +8 -0
  338. package/dist/overlay/ContextMenu.d.ts.map +1 -0
  339. package/dist/overlay/ContextMenu.js +144 -0
  340. package/dist/overlay/ContextMenu.js.map +1 -0
  341. package/dist/profiles/connections/connectionBrowserModel.cjs +14 -65
  342. package/dist/profiles/connections/connectionBrowserModel.cjs.map +1 -1
  343. package/dist/profiles/connections/connectionBrowserModel.d.ts +35 -35
  344. package/dist/profiles/connections/connectionBrowserModel.d.ts.map +1 -1
  345. package/dist/profiles/connections/connectionBrowserModel.js +14 -65
  346. package/dist/profiles/connections/connectionBrowserModel.js.map +1 -1
  347. package/dist/profiles/connections/connectionQueryWorkspace.cjs +29 -9
  348. package/dist/profiles/connections/connectionQueryWorkspace.cjs.map +1 -1
  349. package/dist/profiles/connections/connectionQueryWorkspace.d.ts +3 -2
  350. package/dist/profiles/connections/connectionQueryWorkspace.d.ts.map +1 -1
  351. package/dist/profiles/connections/connectionQueryWorkspace.js +30 -10
  352. package/dist/profiles/connections/connectionQueryWorkspace.js.map +1 -1
  353. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs +15 -0
  354. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs.map +1 -1
  355. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts +22 -1
  356. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts.map +1 -1
  357. package/dist/profiles/connections/connectionQueryWorkspaceModel.js +15 -0
  358. package/dist/profiles/connections/connectionQueryWorkspaceModel.js.map +1 -1
  359. package/dist/profiles/connections/index.d.ts +1 -0
  360. package/dist/profiles/connections/index.d.ts.map +1 -1
  361. package/dist/profiles/connections/inspectionStatus.cjs +44 -0
  362. package/dist/profiles/connections/inspectionStatus.cjs.map +1 -0
  363. package/dist/profiles/connections/inspectionStatus.d.ts +5 -0
  364. package/dist/profiles/connections/inspectionStatus.d.ts.map +1 -0
  365. package/dist/profiles/connections/inspectionStatus.js +44 -0
  366. package/dist/profiles/connections/inspectionStatus.js.map +1 -0
  367. package/dist/profiles/connections/useInspection.cjs +123 -0
  368. package/dist/profiles/connections/useInspection.cjs.map +1 -0
  369. package/dist/profiles/connections/useInspection.d.ts +35 -0
  370. package/dist/profiles/connections/useInspection.d.ts.map +1 -0
  371. package/dist/profiles/connections/useInspection.js +123 -0
  372. package/dist/profiles/connections/useInspection.js.map +1 -0
  373. package/dist/profiles/editor/profileBuilderWorkspace.cjs +55 -23
  374. package/dist/profiles/editor/profileBuilderWorkspace.cjs.map +1 -1
  375. package/dist/profiles/editor/profileBuilderWorkspace.d.ts.map +1 -1
  376. package/dist/profiles/editor/profileBuilderWorkspace.js +56 -24
  377. package/dist/profiles/editor/profileBuilderWorkspace.js.map +1 -1
  378. package/dist/profiles/elasticsearch/esQueryBuilder.cjs +12 -3
  379. package/dist/profiles/elasticsearch/esQueryBuilder.cjs.map +1 -1
  380. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts +2 -2
  381. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts.map +1 -1
  382. package/dist/profiles/elasticsearch/esQueryBuilder.js +12 -3
  383. package/dist/profiles/elasticsearch/esQueryBuilder.js.map +1 -1
  384. package/dist/profiles/fields/profileFieldEditor.cjs +137 -22
  385. package/dist/profiles/fields/profileFieldEditor.cjs.map +1 -1
  386. package/dist/profiles/fields/profileFieldEditor.d.ts.map +1 -1
  387. package/dist/profiles/fields/profileFieldEditor.js +137 -22
  388. package/dist/profiles/fields/profileFieldEditor.js.map +1 -1
  389. package/dist/profiles/fields/profileFieldFilterEditor.cjs +171 -82
  390. package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
  391. package/dist/profiles/fields/profileFieldFilterEditor.d.ts +0 -9
  392. package/dist/profiles/fields/profileFieldFilterEditor.d.ts.map +1 -1
  393. package/dist/profiles/fields/profileFieldFilterEditor.js +174 -85
  394. package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
  395. package/dist/profiles/fields/profileFieldIcons.cjs +6 -3
  396. package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
  397. package/dist/profiles/fields/profileFieldIcons.js +6 -3
  398. package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
  399. package/dist/profiles/query/profileSampleFilterLookup.cjs +34 -0
  400. package/dist/profiles/query/profileSampleFilterLookup.cjs.map +1 -0
  401. package/dist/profiles/query/profileSampleFilterLookup.d.ts +12 -0
  402. package/dist/profiles/query/profileSampleFilterLookup.d.ts.map +1 -0
  403. package/dist/profiles/query/profileSampleFilterLookup.js +34 -0
  404. package/dist/profiles/query/profileSampleFilterLookup.js.map +1 -0
  405. package/dist/profiles/query/profileSamplePayload.cjs +6 -4
  406. package/dist/profiles/query/profileSamplePayload.cjs.map +1 -1
  407. package/dist/profiles/query/profileSamplePayload.d.ts +11 -4
  408. package/dist/profiles/query/profileSamplePayload.d.ts.map +1 -1
  409. package/dist/profiles/query/profileSamplePayload.js +6 -4
  410. package/dist/profiles/query/profileSamplePayload.js.map +1 -1
  411. package/dist/profiles/query/profileSampleResult.cjs +26 -0
  412. package/dist/profiles/query/profileSampleResult.cjs.map +1 -0
  413. package/dist/profiles/query/profileSampleResult.d.ts +11 -0
  414. package/dist/profiles/query/profileSampleResult.d.ts.map +1 -0
  415. package/dist/profiles/query/profileSampleResult.js +26 -0
  416. package/dist/profiles/query/profileSampleResult.js.map +1 -0
  417. package/dist/profiles/query/queryTargetPicker.cjs +5 -3
  418. package/dist/profiles/query/queryTargetPicker.cjs.map +1 -1
  419. package/dist/profiles/query/queryTargetPicker.d.ts +3 -2
  420. package/dist/profiles/query/queryTargetPicker.d.ts.map +1 -1
  421. package/dist/profiles/query/queryTargetPicker.js +5 -3
  422. package/dist/profiles/query/queryTargetPicker.js.map +1 -1
  423. package/dist/profiles/wizard/profileWizard.cjs +14 -5
  424. package/dist/profiles/wizard/profileWizard.cjs.map +1 -1
  425. package/dist/profiles/wizard/profileWizard.d.ts.map +1 -1
  426. package/dist/profiles/wizard/profileWizard.js +15 -6
  427. package/dist/profiles/wizard/profileWizard.js.map +1 -1
  428. package/dist/profiles/wizard/profileWizardModel.cjs +35 -6
  429. package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
  430. package/dist/profiles/wizard/profileWizardModel.d.ts +29 -4
  431. package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
  432. package/dist/profiles/wizard/profileWizardModel.js +35 -6
  433. package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
  434. package/dist/profiles/wizard/profileWizardQueryStep.cjs +44 -11
  435. package/dist/profiles/wizard/profileWizardQueryStep.cjs.map +1 -1
  436. package/dist/profiles/wizard/profileWizardQueryStep.d.ts.map +1 -1
  437. package/dist/profiles/wizard/profileWizardQueryStep.js +46 -13
  438. package/dist/profiles/wizard/profileWizardQueryStep.js.map +1 -1
  439. package/dist/profiles/wizard/profileWizardSteps.cjs +33 -2
  440. package/dist/profiles/wizard/profileWizardSteps.cjs.map +1 -1
  441. package/dist/profiles/wizard/profileWizardSteps.d.ts +11 -2
  442. package/dist/profiles/wizard/profileWizardSteps.d.ts.map +1 -1
  443. package/dist/profiles/wizard/profileWizardSteps.js +33 -2
  444. package/dist/profiles/wizard/profileWizardSteps.js.map +1 -1
  445. package/dist/profiles.cjs +8 -2
  446. package/dist/profiles.cjs.map +1 -1
  447. package/dist/profiles.js +10 -4
  448. package/dist/profiles.js.map +1 -1
  449. package/dist/rpc/FilterForm.cjs +21 -237
  450. package/dist/rpc/FilterForm.cjs.map +1 -1
  451. package/dist/rpc/FilterForm.d.ts +3 -1
  452. package/dist/rpc/FilterForm.d.ts.map +1 -1
  453. package/dist/rpc/FilterForm.js +21 -237
  454. package/dist/rpc/FilterForm.js.map +1 -1
  455. package/dist/rpc/FilterFormFields.cjs +240 -0
  456. package/dist/rpc/FilterFormFields.cjs.map +1 -0
  457. package/dist/rpc/FilterFormFields.d.ts +12 -0
  458. package/dist/rpc/FilterFormFields.d.ts.map +1 -0
  459. package/dist/rpc/FilterFormFields.js +240 -0
  460. package/dist/rpc/FilterFormFields.js.map +1 -0
  461. package/dist/rpc/router.cjs +3 -2
  462. package/dist/rpc/router.cjs.map +1 -1
  463. package/dist/rpc/router.d.ts.map +1 -1
  464. package/dist/rpc/router.js +3 -2
  465. package/dist/rpc/router.js.map +1 -1
  466. package/dist/rpc/types.cjs.map +1 -1
  467. package/dist/rpc/types.d.ts +3 -1
  468. package/dist/rpc/types.d.ts.map +1 -1
  469. package/dist/rpc/types.js.map +1 -1
  470. package/dist/styles.css +1 -1
  471. package/package.json +6 -1
  472. package/dist/data/query-info/QueryInfoDialog.cjs +0 -106
  473. package/dist/data/query-info/QueryInfoDialog.cjs.map +0 -1
  474. package/dist/data/query-info/QueryInfoDialog.d.ts +0 -16
  475. package/dist/data/query-info/QueryInfoDialog.d.ts.map +0 -1
  476. package/dist/data/query-info/QueryInfoDialog.js +0 -106
  477. package/dist/data/query-info/QueryInfoDialog.js.map +0 -1
  478. package/dist/data/query-info/index.d.ts +0 -4
  479. package/dist/data/query-info/index.d.ts.map +0 -1
  480. package/dist/data/query-info/queryInfo.cjs +0 -42
  481. package/dist/data/query-info/queryInfo.cjs.map +0 -1
  482. package/dist/data/query-info/queryInfo.d.ts +0 -45
  483. package/dist/data/query-info/queryInfo.d.ts.map +0 -1
  484. package/dist/data/query-info/queryInfo.js +0 -42
  485. package/dist/data/query-info/queryInfo.js.map +0 -1
  486. package/dist/data/query-info/useQueryInfo.cjs +0 -48
  487. package/dist/data/query-info/useQueryInfo.cjs.map +0 -1
  488. package/dist/data/query-info/useQueryInfo.d.ts +0 -26
  489. package/dist/data/query-info/useQueryInfo.d.ts.map +0 -1
  490. package/dist/data/query-info/useQueryInfo.js +0 -48
  491. package/dist/data/query-info/useQueryInfo.js.map +0 -1
@@ -11,12 +11,16 @@ function formatExecDuration(nanoseconds) {
11
11
  const minutes = Math.floor(seconds / 60);
12
12
  return `${minutes}m ${Number((seconds % 60).toFixed(1))}s`;
13
13
  }
14
+ function TaskCommandLine({ command, args }) {
15
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
16
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[11px] font-semibold uppercase tracking-wide text-muted-foreground", children: "Command and arguments" }),
17
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "block overflow-x-auto whitespace-pre rounded border bg-background p-2 text-xs", children: JSON.stringify([command, ...args ?? []]) })
18
+ ] });
19
+ }
14
20
  function TaskExecDetailsView({ details }) {
15
- const argv = [details.command, ...details.args ?? []];
16
21
  const extra = Object.fromEntries(Object.entries(details).filter(([key]) => !EXEC_KEYS.has(key)));
17
22
  return /* @__PURE__ */ jsxRuntime.jsxs("section", { "aria-label": "Execution details", className: "mb-3 space-y-2 rounded-md border bg-muted/20 p-3", children: [
18
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-[11px] font-semibold uppercase tracking-wide text-muted-foreground", children: "Command and arguments" }),
19
- /* @__PURE__ */ jsxRuntime.jsx("code", { className: "block overflow-x-auto whitespace-pre rounded border bg-background p-2 text-xs", children: JSON.stringify(argv) }),
23
+ /* @__PURE__ */ jsxRuntime.jsx(TaskCommandLine, { command: details.command, ...details.args ? { args: details.args } : {} }),
20
24
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground", children: [
21
25
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: details.status }),
22
26
  details.pid !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-mono text-foreground", children: [
@@ -36,5 +40,6 @@ function TaskExecDetailsView({ details }) {
36
40
  Object.keys(extra).length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded border bg-background p-2", children: /* @__PURE__ */ jsxRuntime.jsx(JsonView.JsonView, { data: extra, defaultOpenDepth: 3 }) })
37
41
  ] });
38
42
  }
43
+ exports.TaskCommandLine = TaskCommandLine;
39
44
  exports.TaskExecDetailsView = TaskExecDetailsView;
40
45
  //# sourceMappingURL=TaskExecDetails.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskExecDetails.cjs","sources":["../../src/data/TaskExecDetails.tsx"],"sourcesContent":["import { JsonView } from \"./JsonView\";\nimport type { TaskExecDetails } from \"./TaskSnapshot\";\n\nconst EXEC_KEYS = new Set([\"command\", \"args\", \"pid\", \"status\", \"exitCode\", \"started\", \"duration\"]);\n\nfunction formatExecDuration(nanoseconds: number): string {\n const milliseconds = nanoseconds / 1_000_000;\n if (milliseconds < 1000) return `${Number(milliseconds.toFixed(1))}ms`;\n const seconds = milliseconds / 1000;\n if (seconds < 60) return `${Number(seconds.toFixed(1))}s`;\n const minutes = Math.floor(seconds / 60);\n return `${minutes}m ${Number((seconds % 60).toFixed(1))}s`;\n}\n\nexport function TaskExecDetailsView({ details }: { details: TaskExecDetails }) {\n const argv = [details.command, ...(details.args ?? [])];\n const extra = Object.fromEntries(Object.entries(details).filter(([key]) => !EXEC_KEYS.has(key)));\n\n return (\n <section aria-label=\"Execution details\" className=\"mb-3 space-y-2 rounded-md border bg-muted/20 p-3\">\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Command and arguments\n </div>\n <code className=\"block overflow-x-auto whitespace-pre rounded border bg-background p-2 text-xs\">\n {JSON.stringify(argv)}\n </code>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span>{details.status}</span>\n {details.pid !== undefined && <span className=\"font-mono text-foreground\">pid {details.pid}</span>}\n <span className=\"font-mono text-foreground\">exit {details.exitCode}</span>\n {details.duration !== undefined && <span>{formatExecDuration(details.duration)}</span>}\n {details.started && <span>started {details.started}</span>}\n </div>\n {Object.keys(extra).length > 0 && (\n <div className=\"rounded border bg-background p-2\">\n <JsonView data={extra} defaultOpenDepth={3} />\n </div>\n )}\n </section>\n );\n}\n"],"names":["jsxs","jsx","JsonView"],"mappings":";;;;AAGA,MAAM,YAAY,oBAAI,IAAI,CAAC,WAAW,QAAQ,OAAO,UAAU,YAAY,WAAW,UAAU,CAAC;AAEjG,SAAS,mBAAmB,aAA6B;AACvD,QAAM,eAAe,cAAc;AACnC,MAAI,eAAe,IAAM,QAAO,GAAG,OAAO,aAAa,QAAQ,CAAC,CAAC,CAAC;AAClE,QAAM,UAAU,eAAe;AAC/B,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAAC;AACtD,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,SAAO,GAAG,OAAO,KAAK,QAAQ,UAAU,IAAI,QAAQ,CAAC,CAAC,CAAC;AACzD;AAEO,SAAS,oBAAoB,EAAE,WAAyC;AAC7E,QAAM,OAAO,CAAC,QAAQ,SAAS,GAAI,QAAQ,QAAQ,EAAG;AACtD,QAAM,QAAQ,OAAO,YAAY,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;AAE/F,SACEA,2BAAAA,KAAC,WAAA,EAAQ,cAAW,qBAAoB,WAAU,oDAChD,UAAA;AAAA,IAAAC,2BAAAA,IAAC,OAAA,EAAI,WAAU,2EAA0E,UAAA,yBAEzF;AAAA,mCACC,QAAA,EAAK,WAAU,iFACb,UAAA,KAAK,UAAU,IAAI,GACtB;AAAA,IACAD,2BAAAA,KAAC,OAAA,EAAI,WAAU,6EACb,UAAA;AAAA,MAAAC,2BAAAA,IAAC,QAAA,EAAM,kBAAQ,OAAA,CAAO;AAAA,MACrB,QAAQ,QAAQ,UAAaD,2BAAAA,KAAC,QAAA,EAAK,WAAU,6BAA4B,UAAA;AAAA,QAAA;AAAA,QAAK,QAAQ;AAAA,MAAA,GAAI;AAAA,MAC3FA,2BAAAA,KAAC,QAAA,EAAK,WAAU,6BAA4B,UAAA;AAAA,QAAA;AAAA,QAAM,QAAQ;AAAA,MAAA,GAAS;AAAA,MAClE,QAAQ,aAAa,UAAaC,2BAAAA,IAAC,UAAM,UAAA,mBAAmB,QAAQ,QAAQ,GAAE;AAAA,MAC9E,QAAQ,WAAWD,2BAAAA,KAAC,QAAA,EAAK,UAAA;AAAA,QAAA;AAAA,QAAS,QAAQ;AAAA,MAAA,EAAA,CAAQ;AAAA,IAAA,GACrD;AAAA,IACC,OAAO,KAAK,KAAK,EAAE,SAAS,KAC3BC,2BAAAA,IAAC,OAAA,EAAI,WAAU,oCACb,yCAACC,SAAAA,UAAA,EAAS,MAAM,OAAO,kBAAkB,GAAG,EAAA,CAC9C;AAAA,EAAA,GAEJ;AAEJ;;"}
1
+ {"version":3,"file":"TaskExecDetails.cjs","sources":["../../src/data/TaskExecDetails.tsx"],"sourcesContent":["import { JsonView } from \"./JsonView\";\nimport type { TaskExecDetails } from \"./TaskSnapshot\";\n\nconst EXEC_KEYS = new Set([\"command\", \"args\", \"pid\", \"status\", \"exitCode\", \"started\", \"duration\"]);\n\nfunction formatExecDuration(nanoseconds: number): string {\n const milliseconds = nanoseconds / 1_000_000;\n if (milliseconds < 1000) return `${Number(milliseconds.toFixed(1))}ms`;\n const seconds = milliseconds / 1000;\n if (seconds < 60) return `${Number(seconds.toFixed(1))}s`;\n const minutes = Math.floor(seconds / 60);\n return `${minutes}m ${Number((seconds % 60).toFixed(1))}s`;\n}\n\nexport function TaskCommandLine({ command, args }: { command: string; args?: string[] }) {\n return (\n <>\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Command and arguments\n </div>\n <code className=\"block overflow-x-auto whitespace-pre rounded border bg-background p-2 text-xs\">\n {JSON.stringify([command, ...(args ?? [])])}\n </code>\n </>\n );\n}\n\nexport function TaskExecDetailsView({ details }: { details: TaskExecDetails }) {\n const extra = Object.fromEntries(Object.entries(details).filter(([key]) => !EXEC_KEYS.has(key)));\n\n return (\n <section aria-label=\"Execution details\" className=\"mb-3 space-y-2 rounded-md border bg-muted/20 p-3\">\n <TaskCommandLine command={details.command} {...(details.args ? { args: details.args } : {})} />\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span>{details.status}</span>\n {details.pid !== undefined && <span className=\"font-mono text-foreground\">pid {details.pid}</span>}\n <span className=\"font-mono text-foreground\">exit {details.exitCode}</span>\n {details.duration !== undefined && <span>{formatExecDuration(details.duration)}</span>}\n {details.started && <span>started {details.started}</span>}\n </div>\n {Object.keys(extra).length > 0 && (\n <div className=\"rounded border bg-background p-2\">\n <JsonView data={extra} defaultOpenDepth={3} />\n </div>\n )}\n </section>\n );\n}\n"],"names":["jsxs","Fragment","jsx","JsonView"],"mappings":";;;;AAGA,MAAM,YAAY,oBAAI,IAAI,CAAC,WAAW,QAAQ,OAAO,UAAU,YAAY,WAAW,UAAU,CAAC;AAEjG,SAAS,mBAAmB,aAA6B;AACvD,QAAM,eAAe,cAAc;AACnC,MAAI,eAAe,IAAM,QAAO,GAAG,OAAO,aAAa,QAAQ,CAAC,CAAC,CAAC;AAClE,QAAM,UAAU,eAAe;AAC/B,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAAC;AACtD,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,SAAO,GAAG,OAAO,KAAK,QAAQ,UAAU,IAAI,QAAQ,CAAC,CAAC,CAAC;AACzD;AAEO,SAAS,gBAAgB,EAAE,SAAS,QAA8C;AACvF,SACEA,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,IAAAC,2BAAAA,IAAC,OAAA,EAAI,WAAU,2EAA0E,UAAA,yBAEzF;AAAA,IACAA,2BAAAA,IAAC,QAAA,EAAK,WAAU,iFACb,UAAA,KAAK,UAAU,CAAC,SAAS,GAAI,QAAQ,CAAA,CAAG,CAAC,EAAA,CAC5C;AAAA,EAAA,GACF;AAEJ;AAEO,SAAS,oBAAoB,EAAE,WAAyC;AAC7E,QAAM,QAAQ,OAAO,YAAY,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;AAE/F,SACEF,2BAAAA,KAAC,WAAA,EAAQ,cAAW,qBAAoB,WAAU,oDAChD,UAAA;AAAA,IAAAE,2BAAAA,IAAC,iBAAA,EAAgB,SAAS,QAAQ,SAAU,GAAI,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAA,IAAS,CAAA,EAAC,CAAI;AAAA,IAC7FF,2BAAAA,KAAC,OAAA,EAAI,WAAU,6EACb,UAAA;AAAA,MAAAE,2BAAAA,IAAC,QAAA,EAAM,kBAAQ,OAAA,CAAO;AAAA,MACrB,QAAQ,QAAQ,UAAaF,2BAAAA,KAAC,QAAA,EAAK,WAAU,6BAA4B,UAAA;AAAA,QAAA;AAAA,QAAK,QAAQ;AAAA,MAAA,GAAI;AAAA,MAC3FA,2BAAAA,KAAC,QAAA,EAAK,WAAU,6BAA4B,UAAA;AAAA,QAAA;AAAA,QAAM,QAAQ;AAAA,MAAA,GAAS;AAAA,MAClE,QAAQ,aAAa,UAAaE,2BAAAA,IAAC,UAAM,UAAA,mBAAmB,QAAQ,QAAQ,GAAE;AAAA,MAC9E,QAAQ,WAAWF,2BAAAA,KAAC,QAAA,EAAK,UAAA;AAAA,QAAA;AAAA,QAAS,QAAQ;AAAA,MAAA,EAAA,CAAQ;AAAA,IAAA,GACrD;AAAA,IACC,OAAO,KAAK,KAAK,EAAE,SAAS,KAC3BE,2BAAAA,IAAC,OAAA,EAAI,WAAU,oCACb,yCAACC,SAAAA,UAAA,EAAS,MAAM,OAAO,kBAAkB,GAAG,EAAA,CAC9C;AAAA,EAAA,GAEJ;AAEJ;;;"}
@@ -1,4 +1,8 @@
1
1
  import { TaskExecDetails } from './TaskSnapshot';
2
+ export declare function TaskCommandLine({ command, args }: {
3
+ command: string;
4
+ args?: string[];
5
+ }): import("react/jsx-runtime").JSX.Element;
2
6
  export declare function TaskExecDetailsView({ details }: {
3
7
  details: TaskExecDetails;
4
8
  }): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"TaskExecDetails.d.ts","sourceRoot":"","sources":["../../src/data/TaskExecDetails.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAatD,wBAAgB,mBAAmB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,eAAe,CAAA;CAAE,2CA0B5E"}
1
+ {"version":3,"file":"TaskExecDetails.d.ts","sourceRoot":"","sources":["../../src/data/TaskExecDetails.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAatD,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,2CAWtF;AAED,wBAAgB,mBAAmB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,eAAe,CAAA;CAAE,2CAoB5E"}
@@ -1,4 +1,4 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { JsonView } from "./JsonView.js";
3
3
  const EXEC_KEYS = /* @__PURE__ */ new Set(["command", "args", "pid", "status", "exitCode", "started", "duration"]);
4
4
  function formatExecDuration(nanoseconds) {
@@ -9,12 +9,16 @@ function formatExecDuration(nanoseconds) {
9
9
  const minutes = Math.floor(seconds / 60);
10
10
  return `${minutes}m ${Number((seconds % 60).toFixed(1))}s`;
11
11
  }
12
+ function TaskCommandLine({ command, args }) {
13
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
14
+ /* @__PURE__ */ jsx("div", { className: "text-[11px] font-semibold uppercase tracking-wide text-muted-foreground", children: "Command and arguments" }),
15
+ /* @__PURE__ */ jsx("code", { className: "block overflow-x-auto whitespace-pre rounded border bg-background p-2 text-xs", children: JSON.stringify([command, ...args ?? []]) })
16
+ ] });
17
+ }
12
18
  function TaskExecDetailsView({ details }) {
13
- const argv = [details.command, ...details.args ?? []];
14
19
  const extra = Object.fromEntries(Object.entries(details).filter(([key]) => !EXEC_KEYS.has(key)));
15
20
  return /* @__PURE__ */ jsxs("section", { "aria-label": "Execution details", className: "mb-3 space-y-2 rounded-md border bg-muted/20 p-3", children: [
16
- /* @__PURE__ */ jsx("div", { className: "text-[11px] font-semibold uppercase tracking-wide text-muted-foreground", children: "Command and arguments" }),
17
- /* @__PURE__ */ jsx("code", { className: "block overflow-x-auto whitespace-pre rounded border bg-background p-2 text-xs", children: JSON.stringify(argv) }),
21
+ /* @__PURE__ */ jsx(TaskCommandLine, { command: details.command, ...details.args ? { args: details.args } : {} }),
18
22
  /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground", children: [
19
23
  /* @__PURE__ */ jsx("span", { children: details.status }),
20
24
  details.pid !== void 0 && /* @__PURE__ */ jsxs("span", { className: "font-mono text-foreground", children: [
@@ -35,6 +39,7 @@ function TaskExecDetailsView({ details }) {
35
39
  ] });
36
40
  }
37
41
  export {
42
+ TaskCommandLine,
38
43
  TaskExecDetailsView
39
44
  };
40
45
  //# sourceMappingURL=TaskExecDetails.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskExecDetails.js","sources":["../../src/data/TaskExecDetails.tsx"],"sourcesContent":["import { JsonView } from \"./JsonView\";\nimport type { TaskExecDetails } from \"./TaskSnapshot\";\n\nconst EXEC_KEYS = new Set([\"command\", \"args\", \"pid\", \"status\", \"exitCode\", \"started\", \"duration\"]);\n\nfunction formatExecDuration(nanoseconds: number): string {\n const milliseconds = nanoseconds / 1_000_000;\n if (milliseconds < 1000) return `${Number(milliseconds.toFixed(1))}ms`;\n const seconds = milliseconds / 1000;\n if (seconds < 60) return `${Number(seconds.toFixed(1))}s`;\n const minutes = Math.floor(seconds / 60);\n return `${minutes}m ${Number((seconds % 60).toFixed(1))}s`;\n}\n\nexport function TaskExecDetailsView({ details }: { details: TaskExecDetails }) {\n const argv = [details.command, ...(details.args ?? [])];\n const extra = Object.fromEntries(Object.entries(details).filter(([key]) => !EXEC_KEYS.has(key)));\n\n return (\n <section aria-label=\"Execution details\" className=\"mb-3 space-y-2 rounded-md border bg-muted/20 p-3\">\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Command and arguments\n </div>\n <code className=\"block overflow-x-auto whitespace-pre rounded border bg-background p-2 text-xs\">\n {JSON.stringify(argv)}\n </code>\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span>{details.status}</span>\n {details.pid !== undefined && <span className=\"font-mono text-foreground\">pid {details.pid}</span>}\n <span className=\"font-mono text-foreground\">exit {details.exitCode}</span>\n {details.duration !== undefined && <span>{formatExecDuration(details.duration)}</span>}\n {details.started && <span>started {details.started}</span>}\n </div>\n {Object.keys(extra).length > 0 && (\n <div className=\"rounded border bg-background p-2\">\n <JsonView data={extra} defaultOpenDepth={3} />\n </div>\n )}\n </section>\n );\n}\n"],"names":[],"mappings":";;AAGA,MAAM,YAAY,oBAAI,IAAI,CAAC,WAAW,QAAQ,OAAO,UAAU,YAAY,WAAW,UAAU,CAAC;AAEjG,SAAS,mBAAmB,aAA6B;AACvD,QAAM,eAAe,cAAc;AACnC,MAAI,eAAe,IAAM,QAAO,GAAG,OAAO,aAAa,QAAQ,CAAC,CAAC,CAAC;AAClE,QAAM,UAAU,eAAe;AAC/B,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAAC;AACtD,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,SAAO,GAAG,OAAO,KAAK,QAAQ,UAAU,IAAI,QAAQ,CAAC,CAAC,CAAC;AACzD;AAEO,SAAS,oBAAoB,EAAE,WAAyC;AAC7E,QAAM,OAAO,CAAC,QAAQ,SAAS,GAAI,QAAQ,QAAQ,EAAG;AACtD,QAAM,QAAQ,OAAO,YAAY,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;AAE/F,SACE,qBAAC,WAAA,EAAQ,cAAW,qBAAoB,WAAU,oDAChD,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,WAAU,2EAA0E,UAAA,yBAEzF;AAAA,wBACC,QAAA,EAAK,WAAU,iFACb,UAAA,KAAK,UAAU,IAAI,GACtB;AAAA,IACA,qBAAC,OAAA,EAAI,WAAU,6EACb,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAM,kBAAQ,OAAA,CAAO;AAAA,MACrB,QAAQ,QAAQ,UAAa,qBAAC,QAAA,EAAK,WAAU,6BAA4B,UAAA;AAAA,QAAA;AAAA,QAAK,QAAQ;AAAA,MAAA,GAAI;AAAA,MAC3F,qBAAC,QAAA,EAAK,WAAU,6BAA4B,UAAA;AAAA,QAAA;AAAA,QAAM,QAAQ;AAAA,MAAA,GAAS;AAAA,MAClE,QAAQ,aAAa,UAAa,oBAAC,UAAM,UAAA,mBAAmB,QAAQ,QAAQ,GAAE;AAAA,MAC9E,QAAQ,WAAW,qBAAC,QAAA,EAAK,UAAA;AAAA,QAAA;AAAA,QAAS,QAAQ;AAAA,MAAA,EAAA,CAAQ;AAAA,IAAA,GACrD;AAAA,IACC,OAAO,KAAK,KAAK,EAAE,SAAS,KAC3B,oBAAC,OAAA,EAAI,WAAU,oCACb,8BAAC,UAAA,EAAS,MAAM,OAAO,kBAAkB,GAAG,EAAA,CAC9C;AAAA,EAAA,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"TaskExecDetails.js","sources":["../../src/data/TaskExecDetails.tsx"],"sourcesContent":["import { JsonView } from \"./JsonView\";\nimport type { TaskExecDetails } from \"./TaskSnapshot\";\n\nconst EXEC_KEYS = new Set([\"command\", \"args\", \"pid\", \"status\", \"exitCode\", \"started\", \"duration\"]);\n\nfunction formatExecDuration(nanoseconds: number): string {\n const milliseconds = nanoseconds / 1_000_000;\n if (milliseconds < 1000) return `${Number(milliseconds.toFixed(1))}ms`;\n const seconds = milliseconds / 1000;\n if (seconds < 60) return `${Number(seconds.toFixed(1))}s`;\n const minutes = Math.floor(seconds / 60);\n return `${minutes}m ${Number((seconds % 60).toFixed(1))}s`;\n}\n\nexport function TaskCommandLine({ command, args }: { command: string; args?: string[] }) {\n return (\n <>\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Command and arguments\n </div>\n <code className=\"block overflow-x-auto whitespace-pre rounded border bg-background p-2 text-xs\">\n {JSON.stringify([command, ...(args ?? [])])}\n </code>\n </>\n );\n}\n\nexport function TaskExecDetailsView({ details }: { details: TaskExecDetails }) {\n const extra = Object.fromEntries(Object.entries(details).filter(([key]) => !EXEC_KEYS.has(key)));\n\n return (\n <section aria-label=\"Execution details\" className=\"mb-3 space-y-2 rounded-md border bg-muted/20 p-3\">\n <TaskCommandLine command={details.command} {...(details.args ? { args: details.args } : {})} />\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span>{details.status}</span>\n {details.pid !== undefined && <span className=\"font-mono text-foreground\">pid {details.pid}</span>}\n <span className=\"font-mono text-foreground\">exit {details.exitCode}</span>\n {details.duration !== undefined && <span>{formatExecDuration(details.duration)}</span>}\n {details.started && <span>started {details.started}</span>}\n </div>\n {Object.keys(extra).length > 0 && (\n <div className=\"rounded border bg-background p-2\">\n <JsonView data={extra} defaultOpenDepth={3} />\n </div>\n )}\n </section>\n );\n}\n"],"names":[],"mappings":";;AAGA,MAAM,YAAY,oBAAI,IAAI,CAAC,WAAW,QAAQ,OAAO,UAAU,YAAY,WAAW,UAAU,CAAC;AAEjG,SAAS,mBAAmB,aAA6B;AACvD,QAAM,eAAe,cAAc;AACnC,MAAI,eAAe,IAAM,QAAO,GAAG,OAAO,aAAa,QAAQ,CAAC,CAAC,CAAC;AAClE,QAAM,UAAU,eAAe;AAC/B,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO,QAAQ,QAAQ,CAAC,CAAC,CAAC;AACtD,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,SAAO,GAAG,OAAO,KAAK,QAAQ,UAAU,IAAI,QAAQ,CAAC,CAAC,CAAC;AACzD;AAEO,SAAS,gBAAgB,EAAE,SAAS,QAA8C;AACvF,SACE,qBAAA,UAAA,EACE,UAAA;AAAA,IAAA,oBAAC,OAAA,EAAI,WAAU,2EAA0E,UAAA,yBAEzF;AAAA,IACA,oBAAC,QAAA,EAAK,WAAU,iFACb,UAAA,KAAK,UAAU,CAAC,SAAS,GAAI,QAAQ,CAAA,CAAG,CAAC,EAAA,CAC5C;AAAA,EAAA,GACF;AAEJ;AAEO,SAAS,oBAAoB,EAAE,WAAyC;AAC7E,QAAM,QAAQ,OAAO,YAAY,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;AAE/F,SACE,qBAAC,WAAA,EAAQ,cAAW,qBAAoB,WAAU,oDAChD,UAAA;AAAA,IAAA,oBAAC,iBAAA,EAAgB,SAAS,QAAQ,SAAU,GAAI,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAA,IAAS,CAAA,EAAC,CAAI;AAAA,IAC7F,qBAAC,OAAA,EAAI,WAAU,6EACb,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAM,kBAAQ,OAAA,CAAO;AAAA,MACrB,QAAQ,QAAQ,UAAa,qBAAC,QAAA,EAAK,WAAU,6BAA4B,UAAA;AAAA,QAAA;AAAA,QAAK,QAAQ;AAAA,MAAA,GAAI;AAAA,MAC3F,qBAAC,QAAA,EAAK,WAAU,6BAA4B,UAAA;AAAA,QAAA;AAAA,QAAM,QAAQ;AAAA,MAAA,GAAS;AAAA,MAClE,QAAQ,aAAa,UAAa,oBAAC,UAAM,UAAA,mBAAmB,QAAQ,QAAQ,GAAE;AAAA,MAC9E,QAAQ,WAAW,qBAAC,QAAA,EAAK,UAAA;AAAA,QAAA;AAAA,QAAS,QAAQ;AAAA,MAAA,EAAA,CAAQ;AAAA,IAAA,GACrD;AAAA,IACC,OAAO,KAAK,KAAK,EAAE,SAAS,KAC3B,oBAAC,OAAA,EAAI,WAAU,oCACb,8BAAC,UAAA,EAAS,MAAM,OAAO,kBAAkB,GAAG,EAAA,CAC9C;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -4,16 +4,84 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const button = require("../components/button.cjs");
5
5
  const useTaskRun = require("../hooks/use-task-run.cjs");
6
6
  const DropdownMenu = require("../overlay/DropdownMenu.cjs");
7
+ const format = require("../lib/format.cjs");
8
+ const TaskManager = require("./TaskManager.cjs");
9
+ const taskProcessDetails = require("./task-process-details.cjs");
7
10
  const taskStatus = require("./task-status.cjs");
8
11
  const UiListChecks = require("../icons/components/UiListChecks.cjs");
12
+ const UiActivity = require("../icons/components/UiActivity.cjs");
13
+ const UiMemoryStick = require("../icons/components/UiMemoryStick.cjs");
9
14
  function TaskManagerButton({
10
15
  basePath,
11
16
  tasksHref = "/tasks",
12
17
  latest = 5,
13
- onNavigate
18
+ onNavigate,
19
+ panel,
20
+ kind,
21
+ labels,
22
+ selectedId,
23
+ onSelectRun
14
24
  }) {
15
- const { runs } = useTaskRun.useTaskRuns({ basePath });
25
+ const { runs } = useTaskRun.useTaskRuns({ basePath, kind, labels });
16
26
  const active = runs.filter((run) => run.status === "running" || run.status === "pending").length;
27
+ const activeRun = runs.find((run) => run.status === "running") ?? runs.find((run) => run.status === "pending");
28
+ const { snapshots } = useTaskRun.useTaskRun({
29
+ ...basePath ? { basePath } : {},
30
+ ...activeRun ? { id: activeRun.id } : {},
31
+ enabled: Boolean(activeRun)
32
+ });
33
+ const resources = resourceSummary(snapshots);
34
+ const trigger = /* @__PURE__ */ jsxRuntime.jsx(TaskTrigger, { active, ...resources ? { resources } : {} });
35
+ return panel ? /* @__PURE__ */ jsxRuntime.jsx(
36
+ TaskPanelDropdown,
37
+ {
38
+ ...basePath ? { basePath } : {},
39
+ ...kind ? { kind } : {},
40
+ ...labels ? { labels } : {},
41
+ ...onSelectRun ? { onSelectRun } : {},
42
+ ...selectedId ? { selectedId } : {},
43
+ trigger
44
+ }
45
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
46
+ RecentTasksDropdown,
47
+ {
48
+ latest,
49
+ ...onNavigate ? { onNavigate } : {},
50
+ runs,
51
+ tasksHref,
52
+ trigger
53
+ }
54
+ );
55
+ }
56
+ function TaskPanelDropdown({ basePath, kind, labels, onSelectRun, selectedId, trigger }) {
57
+ return /* @__PURE__ */ jsxRuntime.jsx(
58
+ DropdownMenu.DropdownMenu,
59
+ {
60
+ align: "right",
61
+ header: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold", children: "Activity" }),
62
+ menuClassName: "w-[min(42rem,calc(100vw-1rem))] max-w-none p-0",
63
+ menuLabel: "Task activity",
64
+ trigger,
65
+ children: () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-[min(42rem,calc(100vh-5rem))] overflow-auto p-3", children: /* @__PURE__ */ jsxRuntime.jsx(
66
+ TaskManager.TaskManager,
67
+ {
68
+ ...basePath ? { basePath } : {},
69
+ ...kind ? { kind } : {},
70
+ ...labels ? { labels } : {},
71
+ ...onSelectRun ? { onSelectRun } : {},
72
+ ...selectedId ? { selectedId } : {}
73
+ }
74
+ ) })
75
+ }
76
+ );
77
+ }
78
+ function RecentTasksDropdown({
79
+ latest,
80
+ onNavigate,
81
+ runs,
82
+ tasksHref,
83
+ trigger
84
+ }) {
17
85
  const navigate = (href) => {
18
86
  if (onNavigate) onNavigate(href);
19
87
  else window.location.assign(href);
@@ -30,20 +98,46 @@ function TaskManagerButton({
30
98
  items.push({ label: "No tasks yet", disabled: true, onSelect: () => {
31
99
  } });
32
100
  }
33
- const label = `Tasks (${active} active)`;
34
101
  return /* @__PURE__ */ jsxRuntime.jsx(
35
102
  DropdownMenu.DropdownMenu,
36
103
  {
37
104
  items,
38
105
  align: "right",
39
106
  menuLabel: "Recent tasks",
40
- trigger: /* @__PURE__ */ jsxRuntime.jsxs(button.Button, { type: "button", variant: "ghost", size: "icon", "aria-label": label, title: label, className: "relative", children: [
41
- /* @__PURE__ */ jsxRuntime.jsx(UiListChecks.UiListChecks, {}),
42
- active > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -right-0.5 -top-0.5 min-w-4 rounded-full bg-primary px-1 text-[9px] leading-4 text-primary-foreground", children: active })
43
- ] }),
107
+ trigger,
44
108
  footer: /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "ghost", size: "sm", className: "w-full justify-start", onClick: () => navigate(tasksHref), children: "View all tasks" })
45
109
  }
46
110
  );
47
111
  }
112
+ function TaskTrigger({ active, resources }) {
113
+ const label = `Tasks (${active} active)`;
114
+ return /* @__PURE__ */ jsxRuntime.jsxs(button.Button, { type: "button", variant: "ghost", size: resources ? "sm" : "icon", "aria-label": label, title: label, className: "relative gap-1.5", children: [
115
+ /* @__PURE__ */ jsxRuntime.jsx(UiListChecks.UiListChecks, { className: active > 0 ? "animate-pulse" : void 0 }),
116
+ resources ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
117
+ /* @__PURE__ */ jsxRuntime.jsx(ResourceGauge, { icon: /* @__PURE__ */ jsxRuntime.jsx(UiActivity.UiActivity, {}), label: "CPU", percent: resources.cpu, value: `${resources.cpu.toFixed(1)}%` }),
118
+ /* @__PURE__ */ jsxRuntime.jsx(ResourceGauge, { icon: /* @__PURE__ */ jsxRuntime.jsx(UiMemoryStick.UiMemoryStick, {}), label: "Memory", percent: resources.peakRss ? resources.rss / resources.peakRss * 100 : 0, value: format.formatBytes(resources.rss) })
119
+ ] }) : active > 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute -right-0.5 -top-0.5 min-w-4 rounded-full bg-primary px-1 text-[9px] leading-4 text-primary-foreground", children: active }) : null
120
+ ] });
121
+ }
122
+ function ResourceGauge({ icon, label, percent, value }) {
123
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { "aria-label": `${label} ${value}`, className: "flex items-center gap-1 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium", title: `${label} ${value}`, children: [
124
+ icon,
125
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "h-1 w-5 overflow-hidden rounded bg-border", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "block h-full rounded bg-primary", style: { width: `${Math.max(0, Math.min(100, percent))}%` } }) }),
126
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: value })
127
+ ] });
128
+ }
129
+ function resourceSummary(snapshots) {
130
+ const tasks = snapshots.filter((snapshot) => snapshot.type === "task" && taskProcessDetails.isTaskProcessDetails(snapshot.details));
131
+ const processes = tasks.length ? tasks : snapshots.filter((snapshot) => taskProcessDetails.isTaskProcessDetails(snapshot.details));
132
+ if (!processes.length) return void 0;
133
+ return processes.reduce((total, snapshot) => {
134
+ if (!taskProcessDetails.isTaskProcessDetails(snapshot.details)) return total;
135
+ return {
136
+ cpu: total.cpu + snapshot.details.latest.cpuPercent,
137
+ rss: total.rss + snapshot.details.latest.rssBytes,
138
+ peakRss: total.peakRss + snapshot.details.peak.rssBytes
139
+ };
140
+ }, { cpu: 0, rss: 0, peakRss: 0 });
141
+ }
48
142
  exports.TaskManagerButton = TaskManagerButton;
49
143
  //# sourceMappingURL=TaskManagerButton.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskManagerButton.cjs","sources":["../../src/data/TaskManagerButton.tsx"],"sourcesContent":["import { Button } from \"../components/button\";\nimport { UiListChecks } from \"../icons\";\nimport { useTaskRuns } from \"../hooks/use-task-run\";\nimport { DropdownMenu, type DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { taskStatusIcon } from \"./task-status\";\n\nexport interface TaskManagerButtonProps {\n basePath?: string;\n tasksHref?: string;\n latest?: number;\n onNavigate?: (href: string) => void;\n}\n\nexport function TaskManagerButton({\n basePath,\n tasksHref = \"/tasks\",\n latest = 5,\n onNavigate,\n}: TaskManagerButtonProps) {\n const { runs } = useTaskRuns({ basePath });\n const active = runs.filter((run) => run.status === \"running\" || run.status === \"pending\").length;\n const navigate = (href: string) => {\n if (onNavigate) onNavigate(href);\n else window.location.assign(href);\n };\n const items: DropdownMenuItem[] = runs.slice(0, latest).map((run) => ({\n label: (\n <span className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"truncate\">{run.name}</span>\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">{run.status}</span>\n </span>\n ),\n icon: taskStatusIcon(run.status),\n onSelect: () => navigate(run.href ?? `${tasksHref}/${encodeURIComponent(run.id)}`),\n }));\n if (items.length === 0) {\n items.push({ label: \"No tasks yet\", disabled: true, onSelect: () => {} });\n }\n const label = `Tasks (${active} active)`;\n\n return (\n <DropdownMenu\n items={items}\n align=\"right\"\n menuLabel=\"Recent tasks\"\n trigger={(\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" aria-label={label} title={label} className=\"relative\">\n <UiListChecks />\n {active > 0 && (\n <span className=\"absolute -right-0.5 -top-0.5 min-w-4 rounded-full bg-primary px-1 text-[9px] leading-4 text-primary-foreground\">\n {active}\n </span>\n )}\n </Button>\n )}\n footer={(\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"w-full justify-start\" onClick={() => navigate(tasksHref)}>\n View all tasks\n </Button>\n )}\n />\n );\n}\n"],"names":["useTaskRuns","jsxs","jsx","taskStatusIcon","DropdownMenu","Button","UiListChecks"],"mappings":";;;;;;;;AAaO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,YAAY;AAAA,EACZ,SAAS;AAAA,EACT;AACF,GAA2B;AACzB,QAAM,EAAE,KAAA,IAASA,uBAAY,EAAE,UAAU;AACzC,QAAM,SAAS,KAAK,OAAO,CAAC,QAAQ,IAAI,WAAW,aAAa,IAAI,WAAW,SAAS,EAAE;AAC1F,QAAM,WAAW,CAAC,SAAiB;AACjC,QAAI,uBAAuB,IAAI;AAAA,QAC1B,QAAO,SAAS,OAAO,IAAI;AAAA,EAClC;AACA,QAAM,QAA4B,KAAK,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,SAAS;AAAA,IACpE,OACEC,2BAAAA,KAAC,QAAA,EAAK,WAAU,mDACd,UAAA;AAAA,MAAAC,2BAAAA,IAAC,QAAA,EAAK,WAAU,YAAY,UAAA,IAAI,MAAK;AAAA,MACrCA,2BAAAA,IAAC,QAAA,EAAK,WAAU,8CAA8C,cAAI,OAAA,CAAO;AAAA,IAAA,GAC3E;AAAA,IAEF,MAAMC,WAAAA,eAAe,IAAI,MAAM;AAAA,IAC/B,UAAU,MAAM,SAAS,IAAI,QAAQ,GAAG,SAAS,IAAI,mBAAmB,IAAI,EAAE,CAAC,EAAE;AAAA,EAAA,EACjF;AACF,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,KAAK,EAAE,OAAO,gBAAgB,UAAU,MAAM,UAAU,MAAM;AAAA,IAAC,GAAG;AAAA,EAC1E;AACA,QAAM,QAAQ,UAAU,MAAM;AAE9B,SACED,2BAAAA;AAAAA,IAACE,aAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAM;AAAA,MACN,WAAU;AAAA,MACV,SACEH,2BAAAA,KAACI,eAAA,EAAO,MAAK,UAAS,SAAQ,SAAQ,MAAK,QAAO,cAAY,OAAO,OAAO,OAAO,WAAU,YAC3F,UAAA;AAAA,QAAAH,2BAAAA,IAACI,aAAAA,cAAA,EAAa;AAAA,QACb,SAAS,KACRJ,2BAAAA,IAAC,QAAA,EAAK,WAAU,kHACb,UAAA,OAAA,CACH;AAAA,MAAA,GAEJ;AAAA,MAEF,QACEA,2BAAAA,IAACG,eAAA,EAAO,MAAK,UAAS,SAAQ,SAAQ,MAAK,MAAK,WAAU,wBAAuB,SAAS,MAAM,SAAS,SAAS,GAAG,UAAA,iBAAA,CAErH;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
1
+ {"version":3,"file":"TaskManagerButton.cjs","sources":["../../src/data/TaskManagerButton.tsx"],"sourcesContent":["import { Button } from \"../components/button\";\nimport { UiActivity, UiListChecks, UiMemoryStick } from \"../icons\";\nimport { useTaskRun, useTaskRuns } from \"../hooks/use-task-run\";\nimport { DropdownMenu, type DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { formatBytes } from \"../lib/format\";\nimport { TaskManager } from \"./TaskManager\";\nimport { isTaskProcessDetails } from \"./task-process-details\";\nimport type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { taskStatusIcon } from \"./task-status\";\n\nexport interface TaskManagerButtonProps {\n basePath?: string;\n tasksHref?: string;\n latest?: number;\n onNavigate?: (href: string) => void;\n panel?: boolean;\n kind?: string;\n labels?: Record<string, string>;\n selectedId?: string;\n onSelectRun?: (id: string | null) => void;\n}\n\nexport function TaskManagerButton({\n basePath,\n tasksHref = \"/tasks\",\n latest = 5,\n onNavigate,\n panel,\n kind,\n labels,\n selectedId,\n onSelectRun,\n}: TaskManagerButtonProps) {\n const { runs } = useTaskRuns({ basePath, kind, labels });\n const active = runs.filter((run) => run.status === \"running\" || run.status === \"pending\").length;\n const activeRun = runs.find((run) => run.status === \"running\") ?? runs.find((run) => run.status === \"pending\");\n const { snapshots } = useTaskRun({\n ...(basePath ? { basePath } : {}),\n ...(activeRun ? { id: activeRun.id } : {}),\n enabled: Boolean(activeRun),\n });\n const resources = resourceSummary(snapshots);\n const trigger = <TaskTrigger active={active} {...(resources ? { resources } : {})} />;\n\n return panel ? (\n <TaskPanelDropdown\n {...(basePath ? { basePath } : {})}\n {...(kind ? { kind } : {})}\n {...(labels ? { labels } : {})}\n {...(onSelectRun ? { onSelectRun } : {})}\n {...(selectedId ? { selectedId } : {})}\n trigger={trigger}\n />\n ) : (\n <RecentTasksDropdown\n latest={latest}\n {...(onNavigate ? { onNavigate } : {})}\n runs={runs}\n tasksHref={tasksHref}\n trigger={trigger}\n />\n );\n}\n\nfunction TaskPanelDropdown({ basePath, kind, labels, onSelectRun, selectedId, trigger }: TaskManagerButtonProps & { trigger: React.ReactNode }) {\n return (\n <DropdownMenu\n align=\"right\"\n header={<span className=\"text-xs font-semibold\">Activity</span>}\n menuClassName=\"w-[min(42rem,calc(100vw-1rem))] max-w-none p-0\"\n menuLabel=\"Task activity\"\n trigger={trigger}\n >\n {() => (\n <div className=\"max-h-[min(42rem,calc(100vh-5rem))] overflow-auto p-3\">\n <TaskManager\n {...(basePath ? { basePath } : {})}\n {...(kind ? { kind } : {})}\n {...(labels ? { labels } : {})}\n {...(onSelectRun ? { onSelectRun } : {})}\n {...(selectedId ? { selectedId } : {})}\n />\n </div>\n )}\n </DropdownMenu>\n );\n}\n\ntype TaskRuns = ReturnType<typeof useTaskRuns>[\"runs\"];\n\nfunction RecentTasksDropdown({\n latest,\n onNavigate,\n runs,\n tasksHref,\n trigger,\n}: {\n latest: number;\n onNavigate?: (href: string) => void;\n runs: TaskRuns;\n tasksHref: string;\n trigger: React.ReactNode;\n}) {\n const navigate = (href: string) => {\n if (onNavigate) onNavigate(href);\n else window.location.assign(href);\n };\n const items: DropdownMenuItem[] = runs.slice(0, latest).map((run) => ({\n label: (\n <span className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"truncate\">{run.name}</span>\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">{run.status}</span>\n </span>\n ),\n icon: taskStatusIcon(run.status),\n onSelect: () => navigate(run.href ?? `${tasksHref}/${encodeURIComponent(run.id)}`),\n }));\n if (items.length === 0) {\n items.push({ label: \"No tasks yet\", disabled: true, onSelect: () => {} });\n }\n\n return (\n <DropdownMenu\n items={items}\n align=\"right\"\n menuLabel=\"Recent tasks\"\n trigger={trigger}\n footer={(\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"w-full justify-start\" onClick={() => navigate(tasksHref)}>\n View all tasks\n </Button>\n )}\n />\n );\n}\n\ntype ResourceSummary = { cpu: number; rss: number; peakRss: number };\n\nfunction TaskTrigger({ active, resources }: { active: number; resources?: ResourceSummary }) {\n const label = `Tasks (${active} active)`;\n return (\n <Button type=\"button\" variant=\"ghost\" size={resources ? \"sm\" : \"icon\"} aria-label={label} title={label} className=\"relative gap-1.5\">\n <UiListChecks className={active > 0 ? \"animate-pulse\" : undefined} />\n {resources ? (\n <>\n <ResourceGauge icon={<UiActivity />} label=\"CPU\" percent={resources.cpu} value={`${resources.cpu.toFixed(1)}%`} />\n <ResourceGauge icon={<UiMemoryStick />} label=\"Memory\" percent={resources.peakRss ? resources.rss / resources.peakRss * 100 : 0} value={formatBytes(resources.rss)} />\n </>\n ) : active > 0 ? (\n <span className=\"absolute -right-0.5 -top-0.5 min-w-4 rounded-full bg-primary px-1 text-[9px] leading-4 text-primary-foreground\">{active}</span>\n ) : null}\n </Button>\n );\n}\n\nfunction ResourceGauge({ icon, label, percent, value }: { icon: React.ReactNode; label: string; percent: number; value: string }) {\n return (\n <span aria-label={`${label} ${value}`} className=\"flex items-center gap-1 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium\" title={`${label} ${value}`}>\n {icon}\n <span aria-hidden className=\"h-1 w-5 overflow-hidden rounded bg-border\">\n <span className=\"block h-full rounded bg-primary\" style={{ width: `${Math.max(0, Math.min(100, percent))}%` }} />\n </span>\n <span>{value}</span>\n </span>\n );\n}\n\nfunction resourceSummary(snapshots: TaskSnapshot[]): ResourceSummary | undefined {\n const tasks = snapshots.filter((snapshot) => snapshot.type === \"task\" && isTaskProcessDetails(snapshot.details));\n const processes = tasks.length ? tasks : snapshots.filter((snapshot) => isTaskProcessDetails(snapshot.details));\n if (!processes.length) return undefined;\n return processes.reduce<ResourceSummary>((total, snapshot) => {\n if (!isTaskProcessDetails(snapshot.details)) return total;\n return {\n cpu: total.cpu + snapshot.details.latest.cpuPercent,\n rss: total.rss + snapshot.details.latest.rssBytes,\n peakRss: total.peakRss + snapshot.details.peak.rssBytes,\n };\n }, { cpu: 0, rss: 0, peakRss: 0 });\n}\n"],"names":["useTaskRuns","useTaskRun","jsx","DropdownMenu","TaskManager","jsxs","taskStatusIcon","Button","UiListChecks","Fragment","UiActivity","UiMemoryStick","formatBytes","isTaskProcessDetails"],"mappings":"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"}
@@ -3,6 +3,11 @@ export interface TaskManagerButtonProps {
3
3
  tasksHref?: string;
4
4
  latest?: number;
5
5
  onNavigate?: (href: string) => void;
6
+ panel?: boolean;
7
+ kind?: string;
8
+ labels?: Record<string, string>;
9
+ selectedId?: string;
10
+ onSelectRun?: (id: string | null) => void;
6
11
  }
7
- export declare function TaskManagerButton({ basePath, tasksHref, latest, onNavigate, }: TaskManagerButtonProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function TaskManagerButton({ basePath, tasksHref, latest, onNavigate, panel, kind, labels, selectedId, onSelectRun, }: TaskManagerButtonProps): import("react/jsx-runtime").JSX.Element;
8
13
  //# sourceMappingURL=TaskManagerButton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TaskManagerButton.d.ts","sourceRoot":"","sources":["../../src/data/TaskManagerButton.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,SAAoB,EACpB,MAAU,EACV,UAAU,GACX,EAAE,sBAAsB,2CA4CxB"}
1
+ {"version":3,"file":"TaskManagerButton.d.ts","sourceRoot":"","sources":["../../src/data/TaskManagerButton.tsx"],"names":[],"mappings":"AAUA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,SAAoB,EACpB,MAAU,EACV,UAAU,EACV,KAAK,EACL,IAAI,EACJ,MAAM,EACN,UAAU,EACV,WAAW,GACZ,EAAE,sBAAsB,2CA8BxB"}
@@ -1,17 +1,85 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { Button } from "../components/button.js";
3
- import { useTaskRuns } from "../hooks/use-task-run.js";
3
+ import { useTaskRuns, useTaskRun } from "../hooks/use-task-run.js";
4
4
  import { DropdownMenu } from "../overlay/DropdownMenu.js";
5
+ import { formatBytes } from "../lib/format.js";
6
+ import { TaskManager } from "./TaskManager.js";
7
+ import { isTaskProcessDetails } from "./task-process-details.js";
5
8
  import { taskStatusIcon } from "./task-status.js";
6
9
  import { UiListChecks } from "../icons/components/UiListChecks.js";
10
+ import { UiActivity } from "../icons/components/UiActivity.js";
11
+ import { UiMemoryStick } from "../icons/components/UiMemoryStick.js";
7
12
  function TaskManagerButton({
8
13
  basePath,
9
14
  tasksHref = "/tasks",
10
15
  latest = 5,
11
- onNavigate
16
+ onNavigate,
17
+ panel,
18
+ kind,
19
+ labels,
20
+ selectedId,
21
+ onSelectRun
12
22
  }) {
13
- const { runs } = useTaskRuns({ basePath });
23
+ const { runs } = useTaskRuns({ basePath, kind, labels });
14
24
  const active = runs.filter((run) => run.status === "running" || run.status === "pending").length;
25
+ const activeRun = runs.find((run) => run.status === "running") ?? runs.find((run) => run.status === "pending");
26
+ const { snapshots } = useTaskRun({
27
+ ...basePath ? { basePath } : {},
28
+ ...activeRun ? { id: activeRun.id } : {},
29
+ enabled: Boolean(activeRun)
30
+ });
31
+ const resources = resourceSummary(snapshots);
32
+ const trigger = /* @__PURE__ */ jsx(TaskTrigger, { active, ...resources ? { resources } : {} });
33
+ return panel ? /* @__PURE__ */ jsx(
34
+ TaskPanelDropdown,
35
+ {
36
+ ...basePath ? { basePath } : {},
37
+ ...kind ? { kind } : {},
38
+ ...labels ? { labels } : {},
39
+ ...onSelectRun ? { onSelectRun } : {},
40
+ ...selectedId ? { selectedId } : {},
41
+ trigger
42
+ }
43
+ ) : /* @__PURE__ */ jsx(
44
+ RecentTasksDropdown,
45
+ {
46
+ latest,
47
+ ...onNavigate ? { onNavigate } : {},
48
+ runs,
49
+ tasksHref,
50
+ trigger
51
+ }
52
+ );
53
+ }
54
+ function TaskPanelDropdown({ basePath, kind, labels, onSelectRun, selectedId, trigger }) {
55
+ return /* @__PURE__ */ jsx(
56
+ DropdownMenu,
57
+ {
58
+ align: "right",
59
+ header: /* @__PURE__ */ jsx("span", { className: "text-xs font-semibold", children: "Activity" }),
60
+ menuClassName: "w-[min(42rem,calc(100vw-1rem))] max-w-none p-0",
61
+ menuLabel: "Task activity",
62
+ trigger,
63
+ children: () => /* @__PURE__ */ jsx("div", { className: "max-h-[min(42rem,calc(100vh-5rem))] overflow-auto p-3", children: /* @__PURE__ */ jsx(
64
+ TaskManager,
65
+ {
66
+ ...basePath ? { basePath } : {},
67
+ ...kind ? { kind } : {},
68
+ ...labels ? { labels } : {},
69
+ ...onSelectRun ? { onSelectRun } : {},
70
+ ...selectedId ? { selectedId } : {}
71
+ }
72
+ ) })
73
+ }
74
+ );
75
+ }
76
+ function RecentTasksDropdown({
77
+ latest,
78
+ onNavigate,
79
+ runs,
80
+ tasksHref,
81
+ trigger
82
+ }) {
15
83
  const navigate = (href) => {
16
84
  if (onNavigate) onNavigate(href);
17
85
  else window.location.assign(href);
@@ -28,21 +96,47 @@ function TaskManagerButton({
28
96
  items.push({ label: "No tasks yet", disabled: true, onSelect: () => {
29
97
  } });
30
98
  }
31
- const label = `Tasks (${active} active)`;
32
99
  return /* @__PURE__ */ jsx(
33
100
  DropdownMenu,
34
101
  {
35
102
  items,
36
103
  align: "right",
37
104
  menuLabel: "Recent tasks",
38
- trigger: /* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", size: "icon", "aria-label": label, title: label, className: "relative", children: [
39
- /* @__PURE__ */ jsx(UiListChecks, {}),
40
- active > 0 && /* @__PURE__ */ jsx("span", { className: "absolute -right-0.5 -top-0.5 min-w-4 rounded-full bg-primary px-1 text-[9px] leading-4 text-primary-foreground", children: active })
41
- ] }),
105
+ trigger,
42
106
  footer: /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "w-full justify-start", onClick: () => navigate(tasksHref), children: "View all tasks" })
43
107
  }
44
108
  );
45
109
  }
110
+ function TaskTrigger({ active, resources }) {
111
+ const label = `Tasks (${active} active)`;
112
+ return /* @__PURE__ */ jsxs(Button, { type: "button", variant: "ghost", size: resources ? "sm" : "icon", "aria-label": label, title: label, className: "relative gap-1.5", children: [
113
+ /* @__PURE__ */ jsx(UiListChecks, { className: active > 0 ? "animate-pulse" : void 0 }),
114
+ resources ? /* @__PURE__ */ jsxs(Fragment, { children: [
115
+ /* @__PURE__ */ jsx(ResourceGauge, { icon: /* @__PURE__ */ jsx(UiActivity, {}), label: "CPU", percent: resources.cpu, value: `${resources.cpu.toFixed(1)}%` }),
116
+ /* @__PURE__ */ jsx(ResourceGauge, { icon: /* @__PURE__ */ jsx(UiMemoryStick, {}), label: "Memory", percent: resources.peakRss ? resources.rss / resources.peakRss * 100 : 0, value: formatBytes(resources.rss) })
117
+ ] }) : active > 0 ? /* @__PURE__ */ jsx("span", { className: "absolute -right-0.5 -top-0.5 min-w-4 rounded-full bg-primary px-1 text-[9px] leading-4 text-primary-foreground", children: active }) : null
118
+ ] });
119
+ }
120
+ function ResourceGauge({ icon, label, percent, value }) {
121
+ return /* @__PURE__ */ jsxs("span", { "aria-label": `${label} ${value}`, className: "flex items-center gap-1 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium", title: `${label} ${value}`, children: [
122
+ icon,
123
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "h-1 w-5 overflow-hidden rounded bg-border", children: /* @__PURE__ */ jsx("span", { className: "block h-full rounded bg-primary", style: { width: `${Math.max(0, Math.min(100, percent))}%` } }) }),
124
+ /* @__PURE__ */ jsx("span", { children: value })
125
+ ] });
126
+ }
127
+ function resourceSummary(snapshots) {
128
+ const tasks = snapshots.filter((snapshot) => snapshot.type === "task" && isTaskProcessDetails(snapshot.details));
129
+ const processes = tasks.length ? tasks : snapshots.filter((snapshot) => isTaskProcessDetails(snapshot.details));
130
+ if (!processes.length) return void 0;
131
+ return processes.reduce((total, snapshot) => {
132
+ if (!isTaskProcessDetails(snapshot.details)) return total;
133
+ return {
134
+ cpu: total.cpu + snapshot.details.latest.cpuPercent,
135
+ rss: total.rss + snapshot.details.latest.rssBytes,
136
+ peakRss: total.peakRss + snapshot.details.peak.rssBytes
137
+ };
138
+ }, { cpu: 0, rss: 0, peakRss: 0 });
139
+ }
46
140
  export {
47
141
  TaskManagerButton
48
142
  };
@@ -1 +1 @@
1
- {"version":3,"file":"TaskManagerButton.js","sources":["../../src/data/TaskManagerButton.tsx"],"sourcesContent":["import { Button } from \"../components/button\";\nimport { UiListChecks } from \"../icons\";\nimport { useTaskRuns } from \"../hooks/use-task-run\";\nimport { DropdownMenu, type DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { taskStatusIcon } from \"./task-status\";\n\nexport interface TaskManagerButtonProps {\n basePath?: string;\n tasksHref?: string;\n latest?: number;\n onNavigate?: (href: string) => void;\n}\n\nexport function TaskManagerButton({\n basePath,\n tasksHref = \"/tasks\",\n latest = 5,\n onNavigate,\n}: TaskManagerButtonProps) {\n const { runs } = useTaskRuns({ basePath });\n const active = runs.filter((run) => run.status === \"running\" || run.status === \"pending\").length;\n const navigate = (href: string) => {\n if (onNavigate) onNavigate(href);\n else window.location.assign(href);\n };\n const items: DropdownMenuItem[] = runs.slice(0, latest).map((run) => ({\n label: (\n <span className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"truncate\">{run.name}</span>\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">{run.status}</span>\n </span>\n ),\n icon: taskStatusIcon(run.status),\n onSelect: () => navigate(run.href ?? `${tasksHref}/${encodeURIComponent(run.id)}`),\n }));\n if (items.length === 0) {\n items.push({ label: \"No tasks yet\", disabled: true, onSelect: () => {} });\n }\n const label = `Tasks (${active} active)`;\n\n return (\n <DropdownMenu\n items={items}\n align=\"right\"\n menuLabel=\"Recent tasks\"\n trigger={(\n <Button type=\"button\" variant=\"ghost\" size=\"icon\" aria-label={label} title={label} className=\"relative\">\n <UiListChecks />\n {active > 0 && (\n <span className=\"absolute -right-0.5 -top-0.5 min-w-4 rounded-full bg-primary px-1 text-[9px] leading-4 text-primary-foreground\">\n {active}\n </span>\n )}\n </Button>\n )}\n footer={(\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"w-full justify-start\" onClick={() => navigate(tasksHref)}>\n View all tasks\n </Button>\n )}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;AAaO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA,YAAY;AAAA,EACZ,SAAS;AAAA,EACT;AACF,GAA2B;AACzB,QAAM,EAAE,KAAA,IAAS,YAAY,EAAE,UAAU;AACzC,QAAM,SAAS,KAAK,OAAO,CAAC,QAAQ,IAAI,WAAW,aAAa,IAAI,WAAW,SAAS,EAAE;AAC1F,QAAM,WAAW,CAAC,SAAiB;AACjC,QAAI,uBAAuB,IAAI;AAAA,QAC1B,QAAO,SAAS,OAAO,IAAI;AAAA,EAClC;AACA,QAAM,QAA4B,KAAK,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,SAAS;AAAA,IACpE,OACE,qBAAC,QAAA,EAAK,WAAU,mDACd,UAAA;AAAA,MAAA,oBAAC,QAAA,EAAK,WAAU,YAAY,UAAA,IAAI,MAAK;AAAA,MACrC,oBAAC,QAAA,EAAK,WAAU,8CAA8C,cAAI,OAAA,CAAO;AAAA,IAAA,GAC3E;AAAA,IAEF,MAAM,eAAe,IAAI,MAAM;AAAA,IAC/B,UAAU,MAAM,SAAS,IAAI,QAAQ,GAAG,SAAS,IAAI,mBAAmB,IAAI,EAAE,CAAC,EAAE;AAAA,EAAA,EACjF;AACF,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,KAAK,EAAE,OAAO,gBAAgB,UAAU,MAAM,UAAU,MAAM;AAAA,IAAC,GAAG;AAAA,EAC1E;AACA,QAAM,QAAQ,UAAU,MAAM;AAE9B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAM;AAAA,MACN,WAAU;AAAA,MACV,SACE,qBAAC,QAAA,EAAO,MAAK,UAAS,SAAQ,SAAQ,MAAK,QAAO,cAAY,OAAO,OAAO,OAAO,WAAU,YAC3F,UAAA;AAAA,QAAA,oBAAC,cAAA,EAAa;AAAA,QACb,SAAS,KACR,oBAAC,QAAA,EAAK,WAAU,kHACb,UAAA,OAAA,CACH;AAAA,MAAA,GAEJ;AAAA,MAEF,QACE,oBAAC,QAAA,EAAO,MAAK,UAAS,SAAQ,SAAQ,MAAK,MAAK,WAAU,wBAAuB,SAAS,MAAM,SAAS,SAAS,GAAG,UAAA,iBAAA,CAErH;AAAA,IAAA;AAAA,EAAA;AAIR;"}
1
+ {"version":3,"file":"TaskManagerButton.js","sources":["../../src/data/TaskManagerButton.tsx"],"sourcesContent":["import { Button } from \"../components/button\";\nimport { UiActivity, UiListChecks, UiMemoryStick } from \"../icons\";\nimport { useTaskRun, useTaskRuns } from \"../hooks/use-task-run\";\nimport { DropdownMenu, type DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { formatBytes } from \"../lib/format\";\nimport { TaskManager } from \"./TaskManager\";\nimport { isTaskProcessDetails } from \"./task-process-details\";\nimport type { TaskSnapshot } from \"./TaskSnapshot\";\nimport { taskStatusIcon } from \"./task-status\";\n\nexport interface TaskManagerButtonProps {\n basePath?: string;\n tasksHref?: string;\n latest?: number;\n onNavigate?: (href: string) => void;\n panel?: boolean;\n kind?: string;\n labels?: Record<string, string>;\n selectedId?: string;\n onSelectRun?: (id: string | null) => void;\n}\n\nexport function TaskManagerButton({\n basePath,\n tasksHref = \"/tasks\",\n latest = 5,\n onNavigate,\n panel,\n kind,\n labels,\n selectedId,\n onSelectRun,\n}: TaskManagerButtonProps) {\n const { runs } = useTaskRuns({ basePath, kind, labels });\n const active = runs.filter((run) => run.status === \"running\" || run.status === \"pending\").length;\n const activeRun = runs.find((run) => run.status === \"running\") ?? runs.find((run) => run.status === \"pending\");\n const { snapshots } = useTaskRun({\n ...(basePath ? { basePath } : {}),\n ...(activeRun ? { id: activeRun.id } : {}),\n enabled: Boolean(activeRun),\n });\n const resources = resourceSummary(snapshots);\n const trigger = <TaskTrigger active={active} {...(resources ? { resources } : {})} />;\n\n return panel ? (\n <TaskPanelDropdown\n {...(basePath ? { basePath } : {})}\n {...(kind ? { kind } : {})}\n {...(labels ? { labels } : {})}\n {...(onSelectRun ? { onSelectRun } : {})}\n {...(selectedId ? { selectedId } : {})}\n trigger={trigger}\n />\n ) : (\n <RecentTasksDropdown\n latest={latest}\n {...(onNavigate ? { onNavigate } : {})}\n runs={runs}\n tasksHref={tasksHref}\n trigger={trigger}\n />\n );\n}\n\nfunction TaskPanelDropdown({ basePath, kind, labels, onSelectRun, selectedId, trigger }: TaskManagerButtonProps & { trigger: React.ReactNode }) {\n return (\n <DropdownMenu\n align=\"right\"\n header={<span className=\"text-xs font-semibold\">Activity</span>}\n menuClassName=\"w-[min(42rem,calc(100vw-1rem))] max-w-none p-0\"\n menuLabel=\"Task activity\"\n trigger={trigger}\n >\n {() => (\n <div className=\"max-h-[min(42rem,calc(100vh-5rem))] overflow-auto p-3\">\n <TaskManager\n {...(basePath ? { basePath } : {})}\n {...(kind ? { kind } : {})}\n {...(labels ? { labels } : {})}\n {...(onSelectRun ? { onSelectRun } : {})}\n {...(selectedId ? { selectedId } : {})}\n />\n </div>\n )}\n </DropdownMenu>\n );\n}\n\ntype TaskRuns = ReturnType<typeof useTaskRuns>[\"runs\"];\n\nfunction RecentTasksDropdown({\n latest,\n onNavigate,\n runs,\n tasksHref,\n trigger,\n}: {\n latest: number;\n onNavigate?: (href: string) => void;\n runs: TaskRuns;\n tasksHref: string;\n trigger: React.ReactNode;\n}) {\n const navigate = (href: string) => {\n if (onNavigate) onNavigate(href);\n else window.location.assign(href);\n };\n const items: DropdownMenuItem[] = runs.slice(0, latest).map((run) => ({\n label: (\n <span className=\"flex min-w-0 items-center justify-between gap-3\">\n <span className=\"truncate\">{run.name}</span>\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">{run.status}</span>\n </span>\n ),\n icon: taskStatusIcon(run.status),\n onSelect: () => navigate(run.href ?? `${tasksHref}/${encodeURIComponent(run.id)}`),\n }));\n if (items.length === 0) {\n items.push({ label: \"No tasks yet\", disabled: true, onSelect: () => {} });\n }\n\n return (\n <DropdownMenu\n items={items}\n align=\"right\"\n menuLabel=\"Recent tasks\"\n trigger={trigger}\n footer={(\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"w-full justify-start\" onClick={() => navigate(tasksHref)}>\n View all tasks\n </Button>\n )}\n />\n );\n}\n\ntype ResourceSummary = { cpu: number; rss: number; peakRss: number };\n\nfunction TaskTrigger({ active, resources }: { active: number; resources?: ResourceSummary }) {\n const label = `Tasks (${active} active)`;\n return (\n <Button type=\"button\" variant=\"ghost\" size={resources ? \"sm\" : \"icon\"} aria-label={label} title={label} className=\"relative gap-1.5\">\n <UiListChecks className={active > 0 ? \"animate-pulse\" : undefined} />\n {resources ? (\n <>\n <ResourceGauge icon={<UiActivity />} label=\"CPU\" percent={resources.cpu} value={`${resources.cpu.toFixed(1)}%`} />\n <ResourceGauge icon={<UiMemoryStick />} label=\"Memory\" percent={resources.peakRss ? resources.rss / resources.peakRss * 100 : 0} value={formatBytes(resources.rss)} />\n </>\n ) : active > 0 ? (\n <span className=\"absolute -right-0.5 -top-0.5 min-w-4 rounded-full bg-primary px-1 text-[9px] leading-4 text-primary-foreground\">{active}</span>\n ) : null}\n </Button>\n );\n}\n\nfunction ResourceGauge({ icon, label, percent, value }: { icon: React.ReactNode; label: string; percent: number; value: string }) {\n return (\n <span aria-label={`${label} ${value}`} className=\"flex items-center gap-1 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium\" title={`${label} ${value}`}>\n {icon}\n <span aria-hidden className=\"h-1 w-5 overflow-hidden rounded bg-border\">\n <span className=\"block h-full rounded bg-primary\" style={{ width: `${Math.max(0, Math.min(100, percent))}%` }} />\n </span>\n <span>{value}</span>\n </span>\n );\n}\n\nfunction resourceSummary(snapshots: TaskSnapshot[]): ResourceSummary | undefined {\n const tasks = snapshots.filter((snapshot) => snapshot.type === \"task\" && isTaskProcessDetails(snapshot.details));\n const processes = tasks.length ? tasks : snapshots.filter((snapshot) => isTaskProcessDetails(snapshot.details));\n if (!processes.length) return undefined;\n return processes.reduce<ResourceSummary>((total, snapshot) => {\n if (!isTaskProcessDetails(snapshot.details)) return total;\n return {\n cpu: total.cpu + snapshot.details.latest.cpuPercent,\n rss: total.rss + snapshot.details.latest.rssBytes,\n peakRss: total.peakRss + snapshot.details.peak.rssBytes,\n };\n }, { cpu: 0, rss: 0, peakRss: 0 });\n}\n"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const TimeseriesGauge = require("./TimeseriesGauge.cjs");
5
5
  const DiagnosticsTree = require("./diagnostics/DiagnosticsTree.cjs");
6
6
  const taskProcessDetails = require("./task-process-details.cjs");
7
+ const TaskExecDetails = require("./TaskExecDetails.cjs");
7
8
  const format = require("../lib/format.cjs");
8
9
  const UiActivity = require("../icons/components/UiActivity.cjs");
9
10
  const UiDatabase = require("../icons/components/UiDatabase.cjs");
@@ -16,6 +17,7 @@ function TaskProcessDetailsView({
16
17
  const metricBase = metricsBaseUrl ?? "/api/v1/tasks/metrics/";
17
18
  const restartLabel = `${details.restarts} ${details.restarts === 1 ? "restart" : "restarts"}`;
18
19
  return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "mb-3 space-y-3 rounded-md border bg-muted/20 p-3", children: [
20
+ /* @__PURE__ */ jsxRuntime.jsx(TaskExecDetails.TaskCommandLine, { command: details.command, ...details.args ? { args: details.args } : {} }),
19
21
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground", children: [
20
22
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-mono text-foreground", children: [
21
23
  "pid ",
@@ -1 +1 @@
1
- {"version":3,"file":"TaskProcessDetails.cjs","sources":["../../src/data/TaskProcessDetails.tsx"],"sourcesContent":["import { UiActivity, UiDatabase, UiFile } from \"../icons\";\nimport { TimeseriesGauge } from \"./TimeseriesGauge\";\nimport { DiagnosticsTree } from \"./diagnostics/DiagnosticsTree\";\nimport { formatBytes } from \"./diagnostics/utils\";\nimport { buildTaskProcessForest } from \"./task-process-details\";\nimport type { TaskProcessDetails } from \"./TaskSnapshot\";\n\nexport function TaskProcessDetailsView({\n details,\n metricsBaseUrl,\n}: {\n details: TaskProcessDetails;\n metricsBaseUrl?: string;\n}) {\n const forest = buildTaskProcessForest(details.tree ?? []);\n const metricBase = metricsBaseUrl ?? \"/api/v1/tasks/metrics/\";\n const restartLabel = `${details.restarts} ${details.restarts === 1 ? \"restart\" : \"restarts\"}`;\n\n return (\n <section className=\"mb-3 space-y-3 rounded-md border bg-muted/20 p-3\">\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span className=\"font-mono text-foreground\">pid {details.pid ?? \"—\"}</span>\n <span>{details.status}</span>\n <span>{details.latest.cpuPercent.toFixed(1)}% CPU</span>\n <span>{formatBytes(details.latest.rssBytes)} RSS</span>\n <span>{formatBytes(details.latest.vmsBytes)} VMS</span>\n <span>{details.latest.openFiles >= 0 ? `${details.latest.openFiles} files` : \"files unavailable\"}</span>\n <span>{restartLabel}</span>\n <span>{details.restartPolicy}</span>\n <span>\n Peak {details.peak.cpuPercent.toFixed(1)}% CPU · {formatBytes(details.peak.rssBytes)} RSS · {formatBytes(details.peak.vmsBytes)} VMS · {details.peak.openFiles >= 0 ? `${details.peak.openFiles} files` : \"files unavailable\"}\n </span>\n </div>\n\n {Object.keys(details.metrics).length > 0 && (\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-2 xl:grid-cols-4\">\n {details.metrics.cpu && (\n <TimeseriesGauge\n baseUrl={metricBase}\n value={{ id: encodeURIComponent(details.metrics.cpu) }}\n title=\"CPU\"\n icon={UiActivity}\n unit=\"percent\"\n variant=\"cell\"\n range=\"15m\"\n refreshMs={2000}\n />\n )}\n {details.metrics.rss && (\n <TimeseriesGauge\n baseUrl={metricBase}\n value={{ id: encodeURIComponent(details.metrics.rss) }}\n title=\"RSS\"\n icon={UiDatabase}\n unit=\"bytes\"\n variant=\"cell\"\n range=\"15m\"\n refreshMs={2000}\n />\n )}\n {details.metrics.vms && (\n <TimeseriesGauge\n baseUrl={metricBase}\n value={{ id: encodeURIComponent(details.metrics.vms) }}\n title=\"VMS\"\n icon={UiDatabase}\n unit=\"bytes\"\n variant=\"cell\"\n range=\"15m\"\n refreshMs={2000}\n />\n )}\n {details.metrics.openFiles && (\n <TimeseriesGauge\n baseUrl={metricBase}\n value={{ id: encodeURIComponent(details.metrics.openFiles) }}\n title=\"Open files\"\n icon={UiFile}\n unit=\"short\"\n variant=\"cell\"\n range=\"15m\"\n refreshMs={2000}\n />\n )}\n </div>\n )}\n\n {forest.length > 0 && (\n <div className=\"space-y-1\">\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Process tree\n </div>\n <div className=\"overflow-hidden rounded-md border bg-background\">\n {forest.map((root) => (\n <DiagnosticsTree key={root.pid} root={root} expandAll onSelect={() => {}} />\n ))}\n </div>\n </div>\n )}\n </section>\n );\n}\n"],"names":["buildTaskProcessForest","jsxs","jsx","formatBytes","TimeseriesGauge","UiActivity","UiDatabase","UiFile","DiagnosticsTree"],"mappings":"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"}
1
+ {"version":3,"file":"TaskProcessDetails.cjs","sources":["../../src/data/TaskProcessDetails.tsx"],"sourcesContent":["import { UiActivity, UiDatabase, UiFile } from \"../icons\";\nimport { TimeseriesGauge } from \"./TimeseriesGauge\";\nimport { DiagnosticsTree } from \"./diagnostics/DiagnosticsTree\";\nimport { formatBytes } from \"./diagnostics/utils\";\nimport { buildTaskProcessForest } from \"./task-process-details\";\nimport { TaskCommandLine } from \"./TaskExecDetails\";\nimport type { TaskProcessDetails } from \"./TaskSnapshot\";\n\nexport function TaskProcessDetailsView({\n details,\n metricsBaseUrl,\n}: {\n details: TaskProcessDetails;\n metricsBaseUrl?: string;\n}) {\n const forest = buildTaskProcessForest(details.tree ?? []);\n const metricBase = metricsBaseUrl ?? \"/api/v1/tasks/metrics/\";\n const restartLabel = `${details.restarts} ${details.restarts === 1 ? \"restart\" : \"restarts\"}`;\n\n return (\n <section className=\"mb-3 space-y-3 rounded-md border bg-muted/20 p-3\">\n <TaskCommandLine command={details.command} {...(details.args ? { args: details.args } : {})} />\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\">\n <span className=\"font-mono text-foreground\">pid {details.pid ?? \"—\"}</span>\n <span>{details.status}</span>\n <span>{details.latest.cpuPercent.toFixed(1)}% CPU</span>\n <span>{formatBytes(details.latest.rssBytes)} RSS</span>\n <span>{formatBytes(details.latest.vmsBytes)} VMS</span>\n <span>{details.latest.openFiles >= 0 ? `${details.latest.openFiles} files` : \"files unavailable\"}</span>\n <span>{restartLabel}</span>\n <span>{details.restartPolicy}</span>\n <span>\n Peak {details.peak.cpuPercent.toFixed(1)}% CPU · {formatBytes(details.peak.rssBytes)} RSS · {formatBytes(details.peak.vmsBytes)} VMS · {details.peak.openFiles >= 0 ? `${details.peak.openFiles} files` : \"files unavailable\"}\n </span>\n </div>\n\n {Object.keys(details.metrics).length > 0 && (\n <div className=\"grid grid-cols-1 gap-2 sm:grid-cols-2 xl:grid-cols-4\">\n {details.metrics.cpu && (\n <TimeseriesGauge\n baseUrl={metricBase}\n value={{ id: encodeURIComponent(details.metrics.cpu) }}\n title=\"CPU\"\n icon={UiActivity}\n unit=\"percent\"\n variant=\"cell\"\n range=\"15m\"\n refreshMs={2000}\n />\n )}\n {details.metrics.rss && (\n <TimeseriesGauge\n baseUrl={metricBase}\n value={{ id: encodeURIComponent(details.metrics.rss) }}\n title=\"RSS\"\n icon={UiDatabase}\n unit=\"bytes\"\n variant=\"cell\"\n range=\"15m\"\n refreshMs={2000}\n />\n )}\n {details.metrics.vms && (\n <TimeseriesGauge\n baseUrl={metricBase}\n value={{ id: encodeURIComponent(details.metrics.vms) }}\n title=\"VMS\"\n icon={UiDatabase}\n unit=\"bytes\"\n variant=\"cell\"\n range=\"15m\"\n refreshMs={2000}\n />\n )}\n {details.metrics.openFiles && (\n <TimeseriesGauge\n baseUrl={metricBase}\n value={{ id: encodeURIComponent(details.metrics.openFiles) }}\n title=\"Open files\"\n icon={UiFile}\n unit=\"short\"\n variant=\"cell\"\n range=\"15m\"\n refreshMs={2000}\n />\n )}\n </div>\n )}\n\n {forest.length > 0 && (\n <div className=\"space-y-1\">\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">\n Process tree\n </div>\n <div className=\"overflow-hidden rounded-md border bg-background\">\n {forest.map((root) => (\n <DiagnosticsTree key={root.pid} root={root} expandAll onSelect={() => {}} />\n ))}\n </div>\n </div>\n )}\n </section>\n );\n}\n"],"names":["buildTaskProcessForest","jsxs","jsx","TaskCommandLine","formatBytes","TimeseriesGauge","UiActivity","UiDatabase","UiFile","DiagnosticsTree"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TaskProcessDetails.d.ts","sourceRoot":"","sources":["../../src/data/TaskProcessDetails.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,cAAc,GACf,EAAE;IACD,OAAO,EAAE,kBAAkB,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,2CAwFA"}
1
+ {"version":3,"file":"TaskProcessDetails.d.ts","sourceRoot":"","sources":["../../src/data/TaskProcessDetails.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,cAAc,GACf,EAAE;IACD,OAAO,EAAE,kBAAkB,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,2CAyFA"}
@@ -2,6 +2,7 @@ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { TimeseriesGauge } from "./TimeseriesGauge.js";
3
3
  import { DiagnosticsTree } from "./diagnostics/DiagnosticsTree.js";
4
4
  import { buildTaskProcessForest } from "./task-process-details.js";
5
+ import { TaskCommandLine } from "./TaskExecDetails.js";
5
6
  import { formatBytes } from "../lib/format.js";
6
7
  import { UiActivity } from "../icons/components/UiActivity.js";
7
8
  import { UiDatabase } from "../icons/components/UiDatabase.js";
@@ -14,6 +15,7 @@ function TaskProcessDetailsView({
14
15
  const metricBase = metricsBaseUrl ?? "/api/v1/tasks/metrics/";
15
16
  const restartLabel = `${details.restarts} ${details.restarts === 1 ? "restart" : "restarts"}`;
16
17
  return /* @__PURE__ */ jsxs("section", { className: "mb-3 space-y-3 rounded-md border bg-muted/20 p-3", children: [
18
+ /* @__PURE__ */ jsx(TaskCommandLine, { command: details.command, ...details.args ? { args: details.args } : {} }),
17
19
  /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground", children: [
18
20
  /* @__PURE__ */ jsxs("span", { className: "font-mono text-foreground", children: [
19
21
  "pid ",