@flanksource/clicky-ui 0.3.49 → 0.3.50

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 (384) hide show
  1. package/dist/connections/ConnectionsPage.cjs +219 -0
  2. package/dist/connections/ConnectionsPage.cjs.map +1 -0
  3. package/dist/connections/ConnectionsPage.d.ts +23 -0
  4. package/dist/connections/ConnectionsPage.d.ts.map +1 -0
  5. package/dist/connections/ConnectionsPage.js +219 -0
  6. package/dist/connections/ConnectionsPage.js.map +1 -0
  7. package/dist/connections/connectionActionStatus.cjs +43 -0
  8. package/dist/connections/connectionActionStatus.cjs.map +1 -0
  9. package/dist/connections/connectionActionStatus.d.ts +5 -0
  10. package/dist/connections/connectionActionStatus.d.ts.map +1 -0
  11. package/dist/connections/connectionActionStatus.js +43 -0
  12. package/dist/connections/connectionActionStatus.js.map +1 -0
  13. package/dist/connections/connectionActionTypes.cjs +24 -0
  14. package/dist/connections/connectionActionTypes.cjs.map +1 -0
  15. package/dist/connections/connectionActionTypes.d.ts +36 -0
  16. package/dist/connections/connectionActionTypes.d.ts.map +1 -0
  17. package/dist/connections/connectionActionTypes.js +24 -0
  18. package/dist/connections/connectionActionTypes.js.map +1 -0
  19. package/dist/connections/connectionActions.cjs +11 -0
  20. package/dist/connections/connectionActions.cjs.map +1 -0
  21. package/dist/connections/connectionActions.d.ts +15 -0
  22. package/dist/connections/connectionActions.d.ts.map +1 -0
  23. package/dist/connections/connectionActions.js +11 -0
  24. package/dist/connections/connectionActions.js.map +1 -0
  25. package/dist/connections/connectionDashboard.cjs +185 -0
  26. package/dist/connections/connectionDashboard.cjs.map +1 -0
  27. package/dist/connections/connectionDashboard.d.ts +25 -0
  28. package/dist/connections/connectionDashboard.d.ts.map +1 -0
  29. package/dist/connections/connectionDashboard.js +185 -0
  30. package/dist/connections/connectionDashboard.js.map +1 -0
  31. package/dist/connections/connectionDashboardModel.cjs +43 -0
  32. package/dist/connections/connectionDashboardModel.cjs.map +1 -0
  33. package/dist/connections/connectionDashboardModel.d.ts +75 -0
  34. package/dist/connections/connectionDashboardModel.d.ts.map +1 -0
  35. package/dist/connections/connectionDashboardModel.js +43 -0
  36. package/dist/connections/connectionDashboardModel.js.map +1 -0
  37. package/dist/connections/connectionDashboardRenderer.cjs +21 -0
  38. package/dist/connections/connectionDashboardRenderer.cjs.map +1 -0
  39. package/dist/connections/connectionDashboardRenderer.d.ts +15 -0
  40. package/dist/connections/connectionDashboardRenderer.d.ts.map +1 -0
  41. package/dist/connections/connectionDashboardRenderer.js +21 -0
  42. package/dist/connections/connectionDashboardRenderer.js.map +1 -0
  43. package/dist/connections/connectionDashboardRow.cjs +169 -0
  44. package/dist/connections/connectionDashboardRow.cjs.map +1 -0
  45. package/dist/connections/connectionDashboardRow.d.ts +12 -0
  46. package/dist/connections/connectionDashboardRow.d.ts.map +1 -0
  47. package/dist/connections/connectionDashboardRow.js +169 -0
  48. package/dist/connections/connectionDashboardRow.js.map +1 -0
  49. package/dist/connections/connectionErrorView.cjs +8 -0
  50. package/dist/connections/connectionErrorView.cjs.map +1 -0
  51. package/dist/connections/connectionErrorView.d.ts +4 -0
  52. package/dist/connections/connectionErrorView.d.ts.map +1 -0
  53. package/dist/connections/connectionErrorView.js +8 -0
  54. package/dist/connections/connectionErrorView.js.map +1 -0
  55. package/dist/connections/connectionHealth.cjs +82 -0
  56. package/dist/connections/connectionHealth.cjs.map +1 -0
  57. package/dist/connections/connectionHealth.d.ts +33 -0
  58. package/dist/connections/connectionHealth.d.ts.map +1 -0
  59. package/dist/connections/connectionHealth.js +82 -0
  60. package/dist/connections/connectionHealth.js.map +1 -0
  61. package/dist/connections/connectionLogging.cjs +29 -0
  62. package/dist/connections/connectionLogging.cjs.map +1 -0
  63. package/dist/connections/connectionLogging.d.ts +11 -0
  64. package/dist/connections/connectionLogging.d.ts.map +1 -0
  65. package/dist/connections/connectionLogging.js +29 -0
  66. package/dist/connections/connectionLogging.js.map +1 -0
  67. package/dist/connections/connectionLoggingField.cjs +37 -0
  68. package/dist/connections/connectionLoggingField.cjs.map +1 -0
  69. package/dist/connections/connectionLoggingField.d.ts +12 -0
  70. package/dist/connections/connectionLoggingField.d.ts.map +1 -0
  71. package/dist/connections/connectionLoggingField.js +37 -0
  72. package/dist/connections/connectionLoggingField.js.map +1 -0
  73. package/dist/connections/connectionLoggingModel.cjs +16 -0
  74. package/dist/connections/connectionLoggingModel.cjs.map +1 -0
  75. package/dist/connections/connectionLoggingModel.d.ts +6 -0
  76. package/dist/connections/connectionLoggingModel.d.ts.map +1 -0
  77. package/dist/connections/connectionLoggingModel.js +16 -0
  78. package/dist/connections/connectionLoggingModel.js.map +1 -0
  79. package/dist/connections/connectionResolveView.cjs +24 -0
  80. package/dist/connections/connectionResolveView.cjs.map +1 -0
  81. package/dist/connections/connectionResolveView.d.ts +5 -0
  82. package/dist/connections/connectionResolveView.d.ts.map +1 -0
  83. package/dist/connections/connectionResolveView.js +24 -0
  84. package/dist/connections/connectionResolveView.js.map +1 -0
  85. package/dist/connections/connectionTestButton.cjs +58 -0
  86. package/dist/connections/connectionTestButton.cjs.map +1 -0
  87. package/dist/connections/connectionTestButton.d.ts +6 -0
  88. package/dist/connections/connectionTestButton.d.ts.map +1 -0
  89. package/dist/connections/connectionTestButton.js +58 -0
  90. package/dist/connections/connectionTestButton.js.map +1 -0
  91. package/dist/connections/connectionTestView.cjs +12 -0
  92. package/dist/connections/connectionTestView.cjs.map +1 -0
  93. package/dist/connections/connectionTestView.d.ts +5 -0
  94. package/dist/connections/connectionTestView.d.ts.map +1 -0
  95. package/dist/connections/connectionTestView.js +12 -0
  96. package/dist/connections/connectionTestView.js.map +1 -0
  97. package/dist/connections/connectionsPageModel.cjs +33 -0
  98. package/dist/connections/connectionsPageModel.cjs.map +1 -0
  99. package/dist/connections/connectionsPageModel.d.ts +24 -0
  100. package/dist/connections/connectionsPageModel.d.ts.map +1 -0
  101. package/dist/connections/connectionsPageModel.js +33 -0
  102. package/dist/connections/connectionsPageModel.js.map +1 -0
  103. package/dist/connections/iconProvider.cjs +20 -0
  104. package/dist/connections/iconProvider.cjs.map +1 -0
  105. package/dist/connections/iconProvider.d.ts +7 -0
  106. package/dist/connections/iconProvider.d.ts.map +1 -0
  107. package/dist/connections/iconProvider.js +20 -0
  108. package/dist/connections/iconProvider.js.map +1 -0
  109. package/dist/connections.cjs +45 -0
  110. package/dist/connections.cjs.map +1 -0
  111. package/dist/connections.d.ts +34 -0
  112. package/dist/connections.d.ts.map +1 -0
  113. package/dist/connections.js +45 -0
  114. package/dist/connections.js.map +1 -0
  115. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +52 -295
  116. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  117. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  118. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +47 -290
  119. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  120. package/dist/data/diagnostics/MetricTile.cjs +44 -0
  121. package/dist/data/diagnostics/MetricTile.cjs.map +1 -0
  122. package/dist/data/diagnostics/MetricTile.d.ts +13 -0
  123. package/dist/data/diagnostics/MetricTile.d.ts.map +1 -0
  124. package/dist/data/diagnostics/MetricTile.js +44 -0
  125. package/dist/data/diagnostics/MetricTile.js.map +1 -0
  126. package/dist/data/diagnostics/StackDumpView.cjs +227 -0
  127. package/dist/data/diagnostics/StackDumpView.cjs.map +1 -0
  128. package/dist/data/diagnostics/StackDumpView.d.ts +53 -0
  129. package/dist/data/diagnostics/StackDumpView.d.ts.map +1 -0
  130. package/dist/data/diagnostics/StackDumpView.js +227 -0
  131. package/dist/data/diagnostics/StackDumpView.js.map +1 -0
  132. package/dist/data/diagnostics/fixtures.d.ts +1 -0
  133. package/dist/data/diagnostics/fixtures.d.ts.map +1 -1
  134. package/dist/data/diagnostics/metric-tone.cjs +18 -0
  135. package/dist/data/diagnostics/metric-tone.cjs.map +1 -0
  136. package/dist/data/diagnostics/metric-tone.d.ts +6 -0
  137. package/dist/data/diagnostics/metric-tone.d.ts.map +1 -0
  138. package/dist/data/diagnostics/metric-tone.js +18 -0
  139. package/dist/data/diagnostics/metric-tone.js.map +1 -0
  140. package/dist/data/diagnostics/stacktrace.cjs +44 -0
  141. package/dist/data/diagnostics/stacktrace.cjs.map +1 -1
  142. package/dist/data/diagnostics/stacktrace.d.ts +7 -0
  143. package/dist/data/diagnostics/stacktrace.d.ts.map +1 -1
  144. package/dist/data/diagnostics/stacktrace.js +44 -0
  145. package/dist/data/diagnostics/stacktrace.js.map +1 -1
  146. package/dist/data/diagnostics/types.d.ts +2 -8
  147. package/dist/data/diagnostics/types.d.ts.map +1 -1
  148. package/dist/data/lint/LintDetail.cjs +339 -0
  149. package/dist/data/lint/LintDetail.cjs.map +1 -0
  150. package/dist/data/lint/LintDetail.d.ts +17 -0
  151. package/dist/data/lint/LintDetail.d.ts.map +1 -0
  152. package/dist/data/lint/LintDetail.js +339 -0
  153. package/dist/data/lint/LintDetail.js.map +1 -0
  154. package/dist/data/lint/LintFilterBar.cjs +103 -0
  155. package/dist/data/lint/LintFilterBar.cjs.map +1 -0
  156. package/dist/data/lint/LintFilterBar.d.ts +16 -0
  157. package/dist/data/lint/LintFilterBar.d.ts.map +1 -0
  158. package/dist/data/lint/LintFilterBar.js +103 -0
  159. package/dist/data/lint/LintFilterBar.js.map +1 -0
  160. package/dist/data/lint/LintResults.cjs +144 -0
  161. package/dist/data/lint/LintResults.cjs.map +1 -0
  162. package/dist/data/lint/LintResults.d.ts +39 -0
  163. package/dist/data/lint/LintResults.d.ts.map +1 -0
  164. package/dist/data/lint/LintResults.fixtures.d.ts +10 -0
  165. package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -0
  166. package/dist/data/lint/LintResults.js +144 -0
  167. package/dist/data/lint/LintResults.js.map +1 -0
  168. package/dist/data/lint/LintTreeNode.cjs +66 -0
  169. package/dist/data/lint/LintTreeNode.cjs.map +1 -0
  170. package/dist/data/lint/LintTreeNode.d.ts +7 -0
  171. package/dist/data/lint/LintTreeNode.d.ts.map +1 -0
  172. package/dist/data/lint/LintTreeNode.js +66 -0
  173. package/dist/data/lint/LintTreeNode.js.map +1 -0
  174. package/dist/data/lint/actions.cjs +195 -0
  175. package/dist/data/lint/actions.cjs.map +1 -0
  176. package/dist/data/lint/actions.d.ts +29 -0
  177. package/dist/data/lint/actions.d.ts.map +1 -0
  178. package/dist/data/lint/actions.js +195 -0
  179. package/dist/data/lint/actions.js.map +1 -0
  180. package/dist/data/lint/grouping-options.cjs +14 -0
  181. package/dist/data/lint/grouping-options.cjs.map +1 -0
  182. package/dist/data/lint/grouping-options.d.ts +9 -0
  183. package/dist/data/lint/grouping-options.d.ts.map +1 -0
  184. package/dist/data/lint/grouping-options.js +14 -0
  185. package/dist/data/lint/grouping-options.js.map +1 -0
  186. package/dist/data/lint/grouping.cjs +450 -0
  187. package/dist/data/lint/grouping.cjs.map +1 -0
  188. package/dist/data/lint/grouping.d.ts +10 -0
  189. package/dist/data/lint/grouping.d.ts.map +1 -0
  190. package/dist/data/lint/grouping.js +450 -0
  191. package/dist/data/lint/grouping.js.map +1 -0
  192. package/dist/data/lint/index.d.ts +10 -0
  193. package/dist/data/lint/index.d.ts.map +1 -0
  194. package/dist/data/lint/paths.cjs +35 -0
  195. package/dist/data/lint/paths.cjs.map +1 -0
  196. package/dist/data/lint/paths.d.ts +13 -0
  197. package/dist/data/lint/paths.d.ts.map +1 -0
  198. package/dist/data/lint/paths.js +35 -0
  199. package/dist/data/lint/paths.js.map +1 -0
  200. package/dist/data/lint/stats.cjs +76 -0
  201. package/dist/data/lint/stats.cjs.map +1 -0
  202. package/dist/data/lint/stats.d.ts +19 -0
  203. package/dist/data/lint/stats.d.ts.map +1 -0
  204. package/dist/data/lint/stats.js +76 -0
  205. package/dist/data/lint/stats.js.map +1 -0
  206. package/dist/data/lint/types.cjs +16 -0
  207. package/dist/data/lint/types.cjs.map +1 -0
  208. package/dist/data/lint/types.d.ts +93 -0
  209. package/dist/data/lint/types.d.ts.map +1 -0
  210. package/dist/data/lint/types.js +16 -0
  211. package/dist/data/lint/types.js.map +1 -0
  212. package/dist/data/test-runner/TestAttemptDetail.cjs +113 -0
  213. package/dist/data/test-runner/TestAttemptDetail.cjs.map +1 -0
  214. package/dist/data/test-runner/TestAttemptDetail.d.ts +19 -0
  215. package/dist/data/test-runner/TestAttemptDetail.d.ts.map +1 -0
  216. package/dist/data/test-runner/TestAttemptDetail.js +113 -0
  217. package/dist/data/test-runner/TestAttemptDetail.js.map +1 -0
  218. package/dist/data/test-runner/TestAttempts.cjs +36 -0
  219. package/dist/data/test-runner/TestAttempts.cjs.map +1 -0
  220. package/dist/data/test-runner/TestAttempts.d.ts +5 -0
  221. package/dist/data/test-runner/TestAttempts.d.ts.map +1 -0
  222. package/dist/data/test-runner/TestAttempts.js +36 -0
  223. package/dist/data/test-runner/TestAttempts.js.map +1 -0
  224. package/dist/data/test-runner/TestDetailPanel.cjs +13 -3
  225. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  226. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  227. package/dist/data/test-runner/TestDetailPanel.js +14 -4
  228. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  229. package/dist/data/test-runner/TestFailureDetail.cjs +9 -29
  230. package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
  231. package/dist/data/test-runner/TestFailureDetail.d.ts +6 -6
  232. package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
  233. package/dist/data/test-runner/TestFailureDetail.js +9 -29
  234. package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
  235. package/dist/data/test-runner/TestRunSummary.cjs +33 -0
  236. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  237. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  238. package/dist/data/test-runner/TestRunSummary.js +34 -1
  239. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  240. package/dist/data/test-runner/TestRunner.cjs +3 -0
  241. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  242. package/dist/data/test-runner/TestRunner.d.ts +8 -1
  243. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  244. package/dist/data/test-runner/TestRunner.js +3 -0
  245. package/dist/data/test-runner/TestRunner.js.map +1 -1
  246. package/dist/data/test-runner/TestTreeNode.cjs +3 -1
  247. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  248. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  249. package/dist/data/test-runner/TestTreeNode.js +3 -1
  250. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  251. package/dist/data/test-runner/adapter.cjs +9 -1
  252. package/dist/data/test-runner/adapter.cjs.map +1 -1
  253. package/dist/data/test-runner/adapter.d.ts +5 -0
  254. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  255. package/dist/data/test-runner/adapter.js +9 -1
  256. package/dist/data/test-runner/adapter.js.map +1 -1
  257. package/dist/data/test-runner/attempts.cjs +62 -0
  258. package/dist/data/test-runner/attempts.cjs.map +1 -0
  259. package/dist/data/test-runner/attempts.d.ts +13 -0
  260. package/dist/data/test-runner/attempts.d.ts.map +1 -0
  261. package/dist/data/test-runner/attempts.js +62 -0
  262. package/dist/data/test-runner/attempts.js.map +1 -0
  263. package/dist/data/test-runner/context.cjs.map +1 -1
  264. package/dist/data/test-runner/context.d.ts +6 -0
  265. package/dist/data/test-runner/context.d.ts.map +1 -1
  266. package/dist/data/test-runner/context.js.map +1 -1
  267. package/dist/data/test-runner/index.d.ts +5 -1
  268. package/dist/data/test-runner/index.d.ts.map +1 -1
  269. package/dist/data/test-runner/marks.cjs +2 -0
  270. package/dist/data/test-runner/marks.cjs.map +1 -1
  271. package/dist/data/test-runner/marks.d.ts.map +1 -1
  272. package/dist/data/test-runner/marks.js +2 -0
  273. package/dist/data/test-runner/marks.js.map +1 -1
  274. package/dist/data/test-runner/process-metrics.cjs +15 -0
  275. package/dist/data/test-runner/process-metrics.cjs.map +1 -0
  276. package/dist/data/test-runner/process-metrics.d.ts +22 -0
  277. package/dist/data/test-runner/process-metrics.d.ts.map +1 -0
  278. package/dist/data/test-runner/process-metrics.js +15 -0
  279. package/dist/data/test-runner/process-metrics.js.map +1 -0
  280. package/dist/data/test-runner/status.cjs +11 -3
  281. package/dist/data/test-runner/status.cjs.map +1 -1
  282. package/dist/data/test-runner/status.d.ts +3 -1
  283. package/dist/data/test-runner/status.d.ts.map +1 -1
  284. package/dist/data/test-runner/status.js +11 -3
  285. package/dist/data/test-runner/status.js.map +1 -1
  286. package/dist/data/test-runner/types.d.ts +14 -0
  287. package/dist/data/test-runner/types.d.ts.map +1 -1
  288. package/dist/data/traces/GoProfileView.cjs +176 -0
  289. package/dist/data/traces/GoProfileView.cjs.map +1 -0
  290. package/dist/data/traces/GoProfileView.d.ts +30 -0
  291. package/dist/data/traces/GoProfileView.d.ts.map +1 -0
  292. package/dist/data/traces/GoProfileView.js +176 -0
  293. package/dist/data/traces/GoProfileView.js.map +1 -0
  294. package/dist/data/traces/ProcessFacetTable.cjs +79 -0
  295. package/dist/data/traces/ProcessFacetTable.cjs.map +1 -0
  296. package/dist/data/traces/ProcessFacetTable.d.ts +21 -0
  297. package/dist/data/traces/ProcessFacetTable.d.ts.map +1 -0
  298. package/dist/data/traces/ProcessFacetTable.js +79 -0
  299. package/dist/data/traces/ProcessFacetTable.js.map +1 -0
  300. package/dist/data/traces/ProcessRecordViews.cjs +41 -0
  301. package/dist/data/traces/ProcessRecordViews.cjs.map +1 -0
  302. package/dist/data/traces/ProcessRecordViews.d.ts +16 -0
  303. package/dist/data/traces/ProcessRecordViews.d.ts.map +1 -0
  304. package/dist/data/traces/ProcessRecordViews.js +41 -0
  305. package/dist/data/traces/ProcessRecordViews.js.map +1 -0
  306. package/dist/data/traces/ProcessTraceDetail.cjs +316 -0
  307. package/dist/data/traces/ProcessTraceDetail.cjs.map +1 -0
  308. package/dist/data/traces/ProcessTraceDetail.d.ts +39 -0
  309. package/dist/data/traces/ProcessTraceDetail.d.ts.map +1 -0
  310. package/dist/data/traces/ProcessTraceDetail.js +316 -0
  311. package/dist/data/traces/ProcessTraceDetail.js.map +1 -0
  312. package/dist/data/traces/ProcessTraceTree.cjs +76 -34
  313. package/dist/data/traces/ProcessTraceTree.cjs.map +1 -1
  314. package/dist/data/traces/ProcessTraceTree.d.ts +21 -4
  315. package/dist/data/traces/ProcessTraceTree.d.ts.map +1 -1
  316. package/dist/data/traces/ProcessTraceTree.js +72 -30
  317. package/dist/data/traces/ProcessTraceTree.js.map +1 -1
  318. package/dist/data/traces/Sparkline.cjs +27 -5
  319. package/dist/data/traces/Sparkline.cjs.map +1 -1
  320. package/dist/data/traces/Sparkline.d.ts +17 -1
  321. package/dist/data/traces/Sparkline.d.ts.map +1 -1
  322. package/dist/data/traces/Sparkline.js +28 -6
  323. package/dist/data/traces/Sparkline.js.map +1 -1
  324. package/dist/data/traces/TraceView.cjs +9 -0
  325. package/dist/data/traces/TraceView.cjs.map +1 -1
  326. package/dist/data/traces/TraceView.d.ts +4 -2
  327. package/dist/data/traces/TraceView.d.ts.map +1 -1
  328. package/dist/data/traces/TraceView.js +9 -0
  329. package/dist/data/traces/TraceView.js.map +1 -1
  330. package/dist/data/traces/TraceWindowList.cjs +117 -0
  331. package/dist/data/traces/TraceWindowList.cjs.map +1 -0
  332. package/dist/data/traces/TraceWindowList.d.ts +48 -0
  333. package/dist/data/traces/TraceWindowList.d.ts.map +1 -0
  334. package/dist/data/traces/TraceWindowList.js +117 -0
  335. package/dist/data/traces/TraceWindowList.js.map +1 -0
  336. package/dist/data/traces/fixtures.d.ts +25 -1
  337. package/dist/data/traces/fixtures.d.ts.map +1 -1
  338. package/dist/data/traces/index.d.ts +10 -3
  339. package/dist/data/traces/index.d.ts.map +1 -1
  340. package/dist/data/traces/process-facets.cjs +48 -0
  341. package/dist/data/traces/process-facets.cjs.map +1 -0
  342. package/dist/data/traces/process-facets.d.ts +38 -0
  343. package/dist/data/traces/process-facets.d.ts.map +1 -0
  344. package/dist/data/traces/process-facets.js +48 -0
  345. package/dist/data/traces/process-facets.js.map +1 -0
  346. package/dist/data/traces/process-tree.cjs +36 -4
  347. package/dist/data/traces/process-tree.cjs.map +1 -1
  348. package/dist/data/traces/process-tree.d.ts +20 -1
  349. package/dist/data/traces/process-tree.d.ts.map +1 -1
  350. package/dist/data/traces/process-tree.js +36 -4
  351. package/dist/data/traces/process-tree.js.map +1 -1
  352. package/dist/data/traces/profile-aggregate.cjs +78 -0
  353. package/dist/data/traces/profile-aggregate.cjs.map +1 -0
  354. package/dist/data/traces/profile-aggregate.d.ts +41 -0
  355. package/dist/data/traces/profile-aggregate.d.ts.map +1 -0
  356. package/dist/data/traces/profile-aggregate.js +78 -0
  357. package/dist/data/traces/profile-aggregate.js.map +1 -0
  358. package/dist/data/traces/stack-checkpoints.cjs +22 -0
  359. package/dist/data/traces/stack-checkpoints.cjs.map +1 -0
  360. package/dist/data/traces/stack-checkpoints.d.ts +18 -0
  361. package/dist/data/traces/stack-checkpoints.d.ts.map +1 -0
  362. package/dist/data/traces/stack-checkpoints.js +22 -0
  363. package/dist/data/traces/stack-checkpoints.js.map +1 -0
  364. package/dist/data/traces/types.d.ts +120 -5
  365. package/dist/data/traces/types.d.ts.map +1 -1
  366. package/dist/data/verification/adapters.cjs +1 -0
  367. package/dist/data/verification/adapters.cjs.map +1 -1
  368. package/dist/data/verification/adapters.d.ts.map +1 -1
  369. package/dist/data/verification/adapters.js +1 -0
  370. package/dist/data/verification/adapters.js.map +1 -1
  371. package/dist/data/version-info.cjs +3 -3
  372. package/dist/data/version-info.js +3 -3
  373. package/dist/data.cjs +85 -7
  374. package/dist/data.cjs.map +1 -1
  375. package/dist/data.d.ts +4 -0
  376. package/dist/data.d.ts.map +1 -1
  377. package/dist/data.js +81 -3
  378. package/dist/data.js.map +1 -1
  379. package/dist/index.cjs +87 -9
  380. package/dist/index.cjs.map +1 -1
  381. package/dist/index.js +81 -3
  382. package/dist/index.js.map +1 -1
  383. package/dist/styles.css +1 -1
  384. package/package.json +6 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProcessTraceDetail.cjs","sources":["../../../src/data/traces/ProcessTraceDetail.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { Select } from \"../../components/select\";\nimport { UiDebug, UiDebugSmall, UiLoader, UiServerProcess } from \"../../icons\";\nimport { Tabs, type TabItem } from \"../../layout/Tabs\";\nimport { formatBytes, formatDuration } from \"../../lib/format\";\nimport { cn } from \"../../lib/utils\";\nimport { ConfirmDialog } from \"../../overlay/ConfirmDialog\";\nimport { MetricTile } from \"../diagnostics/MetricTile\";\nimport { cpuTone } from \"../diagnostics/metric-tone\";\nimport { StackDumpView } from \"../diagnostics/StackDumpView\";\nimport { processLabel, processStateColor, processStateIcon } from \"../diagnostics/utils\";\nimport { Icon } from \"../Icon\";\nimport {\n SAMPLE_FACETS,\n armedFacets,\n diskSeries,\n facetCountSeries,\n latestFacetReading,\n} from \"./process-facets\";\nimport {\n formatCpuPercent,\n formatProcessTimestamp,\n isProcessExited,\n processLifetimeMs,\n processSeries,\n} from \"./process-tree\";\nimport { ProcessFacetTable } from \"./ProcessFacetTable\";\nimport { stackCheckpoints } from \"./stack-checkpoints\";\nimport { LabeledSparkline } from \"./Sparkline\";\nimport type { ProcessNodeRow, ProcessSampleFacet, ProcessSampleRow, ProcessStackTransport, StackRecord } from \"./types\";\n\ntype TransportSpec = {\n label: (hasStack: boolean) => string;\n title: string;\n /** Shown when a destructive collection asks for confirmation. */\n warning?: (pid: number) => string;\n};\n\n/** How each stack transport a node offers in `stackTransports` is presented. */\nconst STACK_TRANSPORTS: Record<string, TransportSpec> = {\n inprocess: {\n label: (hasStack) => (hasStack ? \"Refresh stack trace\" : \"Collect stack trace\"),\n title: \"Take a fresh observation and dump the goroutine stacks\",\n },\n native: {\n label: () => \"Native sample\",\n title: \"Sample the process's native threads without interrupting it\",\n },\n pprof: {\n label: () => \"Collect via pprof\",\n title: \"Read the goroutine profile from the process's pprof endpoint\",\n },\n gops: {\n label: () => \"Collect via gops\",\n title: \"Read the goroutine stacks from the process's gops agent\",\n },\n sigquit: {\n label: () => \"Dump goroutines & kill\",\n title: \"Send SIGQUIT: the process prints every goroutine's stack and exits\",\n warning: (pid) => `This sends SIGQUIT to pid ${pid}. The process prints every goroutine's stack and exits.`,\n },\n};\n\nfunction transportSpec(transport: string): TransportSpec {\n const spec = STACK_TRANSPORTS[transport];\n if (!spec) {\n throw new Error(`unknown stack transport \"${transport}\"; expected one of ${Object.keys(STACK_TRANSPORTS).join(\", \")}`);\n }\n return spec;\n}\n\ntype DetailTab = \"overview\" | \"env\" | ProcessSampleFacet;\n\nconst NO_STACKS: StackRecord[] = [];\n\nexport type ProcessTraceDetailProps = {\n /** The selected `process_tree` record; null renders the empty selection state. */\n node: ProcessNodeRow | null;\n /**\n * `process_samples` records; those of other processes are ignored. They carry\n * the resource series, and the facet counts and lists: a facet tab is shown\n * only when the samples carry that facet's count, that is when the session\n * armed it.\n */\n samples: ProcessSampleRow[];\n /** `stacks` records; those of other processes are ignored. */\n stacks?: StackRecord[];\n /** Host content at the top of Overview, for example a link to the fixture step that started the process. */\n links?: ReactNode;\n /**\n * Collects a stack for a process over one of its `stackTransports`. Without it\n * no collect buttons are shown. A destructive transport (sigquit) kills the\n * process, so it asks for confirmation first.\n */\n onCollectStack?: (key: string, transport: string) => void | Promise<void>;\n /** A collection is in flight: collect buttons are disabled. */\n collecting?: boolean;\n /** Why the last collection failed. */\n collectError?: string;\n className?: string;\n};\n\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section>\n <div className=\"mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">{title}</div>\n {children}\n </section>\n );\n}\n\nfunction InfoTile({ label, value, wide }: { label: string; value: string; wide?: boolean }) {\n return (\n <div className={`rounded-lg border border-border bg-muted/50 px-2.5 py-density-2 ${wide ? \"col-span-2\" : \"\"}`}>\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{label}</div>\n <div className=\"mt-0.5 break-all text-xs font-medium text-foreground\">{value}</div>\n </div>\n );\n}\n\nfunction Header({ node }: { node: ProcessNodeRow }) {\n return (\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-density-2\">\n <Icon icon={node.isRoot ? UiServerProcess : UiDebug} className=\"shrink-0 text-2xl text-blue-600\" />\n <h2 className=\"break-words text-lg font-bold text-foreground\">{processLabel(node)}</h2>\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-density-2 text-xs text-muted-foreground\">\n <span className=\"font-mono\">pid {node.pid}</span>\n {node.ppid ? <span className=\"font-mono\">ppid {node.ppid}</span> : null}\n <span className={`inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 ${processStateColor(node.status)}`}>\n <Icon icon={processStateIcon(node.status)} />\n {node.status}\n </span>\n </div>\n </div>\n );\n}\n\nfunction CollectButtons({\n transports,\n hasStack,\n collecting,\n onCollect,\n}: {\n transports: ProcessStackTransport[];\n hasStack: boolean;\n collecting: boolean;\n onCollect: (transport: ProcessStackTransport) => void;\n}) {\n return (\n <div className=\"flex items-center gap-density-1\" data-stack-actions=\"\">\n {transports.map((transport) => {\n const spec = transportSpec(transport.transport);\n return (\n <Button\n key={transport.transport}\n size=\"sm\"\n variant={transport.destructive ? \"destructive\" : hasStack ? \"outline\" : \"default\"}\n disabled={collecting}\n title={spec.title}\n onClick={() => onCollect(transport)}\n >\n <Icon icon={collecting ? UiLoader : UiDebugSmall} className={collecting ? \"mr-1 animate-spin\" : \"mr-1\"} />\n {spec.label(hasStack)}\n </Button>\n );\n })}\n </div>\n );\n}\n\nfunction StackSection({\n node,\n stacks,\n onCollectStack,\n collecting,\n collectError,\n}: Pick<ProcessTraceDetailProps, \"onCollectStack\" | \"collecting\" | \"collectError\"> & {\n node: ProcessNodeRow;\n stacks: StackRecord[];\n}) {\n const [confirming, setConfirming] = useState<ProcessStackTransport | null>(null);\n const [picked, setPicked] = useState<string | null>(null);\n const checkpoints = useMemo(() => stackCheckpoints(stacks, node.key), [stacks, node.key]);\n const transports = node.stackTransports ?? [];\n const canCollect = Boolean(onCollectStack) && transports.length > 0;\n if (checkpoints.length === 0 && !canCollect) return null;\n\n const selected = checkpoints.find((checkpoint) => checkpoint.checkpointId === picked) ?? checkpoints[checkpoints.length - 1];\n const buttons = canCollect ? (\n <CollectButtons\n transports={transports}\n hasStack={Boolean(selected)}\n collecting={Boolean(collecting)}\n onCollect={(transport) => (transport.destructive ? setConfirming(transport) : void onCollectStack?.(node.key, transport.transport))}\n />\n ) : null;\n const confirmingSpec = confirming ? transportSpec(confirming.transport) : null;\n\n return (\n <Section title=\"Stack\">\n {collectError && (\n <div className=\"mb-2 whitespace-pre-wrap text-xs text-red-700 dark:text-red-400\" role=\"alert\">\n {collectError}\n </div>\n )}\n {selected ? (\n <div className=\"space-y-density-1\">\n {checkpoints.length > 1 && (\n <div className=\"max-w-md\">\n <Select\n aria-label=\"Stack checkpoint\"\n value={selected.checkpointId}\n onChange={(event) => setPicked(event.target.value)}\n options={[...checkpoints].reverse().map((checkpoint) => ({\n value: checkpoint.checkpointId,\n label: [\n formatProcessTimestamp(checkpoint.takenAt),\n checkpoint.reason,\n checkpoint.transport,\n checkpoint.failed ? \"failed\" : \"\",\n ]\n .filter(Boolean)\n .join(\" · \"),\n }))}\n />\n </div>\n )}\n <StackDumpView\n key={`${node.key}:${selected.checkpointId}`}\n records={selected.records}\n {...(buttons ? { headerActions: buttons } : {})}\n />\n </div>\n ) : (\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-xs text-muted-foreground\">\n {collecting ? \"Collecting stack trace...\" : \"No stack trace collected yet.\"}\n </div>\n {buttons}\n </div>\n )}\n <ConfirmDialog\n open={confirming !== null}\n title={`${confirmingSpec?.label(false) ?? \"\"}?`}\n warning={\n confirmingSpec?.warning?.(node.pid) ??\n `Collecting this stack over ${confirming?.transport ?? \"\"} terminates pid ${node.pid}.`\n }\n message=\"The stack is shown here once the dump arrives. Use a non-destructive transport to look without killing.\"\n confirmLabel={confirmingSpec?.label(false) ?? \"Collect\"}\n variant=\"destructive\"\n onCancel={() => setConfirming(null)}\n onConfirm={() => {\n const transport = confirming;\n setConfirming(null);\n if (transport) void onCollectStack?.(node.key, transport.transport);\n }}\n />\n </Section>\n );\n}\n\nfunction Overview({\n node,\n samples,\n links,\n ...stack\n}: Pick<ProcessTraceDetailProps, \"samples\" | \"links\" | \"onCollectStack\" | \"collecting\" | \"collectError\"> & {\n node: ProcessNodeRow;\n stacks: StackRecord[];\n}) {\n const exited = isProcessExited(node);\n const series = processSeries(samples, node.key);\n const disk = diskSeries(samples, node.key);\n const lastDisk = { read: disk.read[disk.read.length - 1], write: disk.write[disk.write.length - 1] };\n return (\n <div className=\"space-y-density-3\">\n {links}\n\n <Section title=\"Command\">\n <pre className=\"whitespace-pre-wrap break-all rounded bg-blue-50 p-2 font-mono text-xs text-foreground dark:bg-blue-500/10\">\n {node.command}\n </pre>\n </Section>\n\n <Section title=\"Process\">\n <div className=\"grid grid-cols-2 gap-density-2 text-sm\">\n <InfoTile label=\"Cwd\" value={node.cwd || \"Unavailable\"} wide />\n <InfoTile label=\"Started\" value={formatProcessTimestamp(node.startedAt)} />\n <InfoTile\n label=\"Exited\"\n value={exited ? formatProcessTimestamp(node.exitedAt ?? node.lastSeenAt) : \"running\"}\n />\n <InfoTile\n label=\"Lifetime\"\n value={`${formatDuration(processLifetimeMs(node))}${exited ? \"\" : \" so far\"}`}\n />\n </div>\n </Section>\n\n <Section title=\"Resources\">\n <div className=\"grid grid-cols-2 gap-density-1 sm:grid-cols-4\">\n <MetricTile\n label=\"CPU\"\n value={formatCpuPercent(node.cpuPercent)}\n barPct={Math.min(100, node.cpuPercent ?? 0)}\n tone={cpuTone(node.cpuPercent ?? 0)}\n />\n <MetricTile label=\"RSS\" value={formatBytes(node.rssBytes)} />\n <MetricTile\n label=\"Peak CPU\"\n value={formatCpuPercent(node.peakCpuPercent)}\n tone={cpuTone(node.peakCpuPercent ?? 0)}\n />\n <MetricTile label=\"Peak RSS\" value={formatBytes(node.peakRssBytes)} />\n {lastDisk.read !== undefined && <MetricTile label=\"Disk read\" value={formatBytes(lastDisk.read)} />}\n {lastDisk.write !== undefined && <MetricTile label=\"Disk write\" value={formatBytes(lastDisk.write)} />}\n </div>\n <div className=\"mt-2 grid grid-cols-2 gap-density-2\">\n <LabeledSparkline label=\"CPU %\" values={series.cpu} format={(value) => `${value.toFixed(1)}%`} />\n <LabeledSparkline label=\"RSS\" values={series.rss} format={formatBytes} />\n {disk.read.length > 0 && <LabeledSparkline label=\"Disk read\" values={disk.read} format={formatBytes} />}\n {disk.write.length > 0 && <LabeledSparkline label=\"Disk write\" values={disk.write} format={formatBytes} />}\n </div>\n </Section>\n\n <StackSection key={node.key} node={node} {...stack} />\n </div>\n );\n}\n\nfunction FacetTab({\n node,\n samples,\n facet,\n}: {\n node: ProcessNodeRow;\n samples: ProcessSampleRow[];\n facet: ProcessSampleFacet;\n}) {\n const { label } = SAMPLE_FACETS[facet];\n return (\n <div className=\"space-y-density-3\">\n <LabeledSparkline label={label} values={facetCountSeries(samples, node.key, facet)} format={String} />\n <ProcessFacetTable facet={facet} reading={latestFacetReading(samples, node.key, facet)} />\n </div>\n );\n}\n\n/**\n * Everything the trace knows about one process: its command and lifetime,\n * resource usage (CPU, RSS, disk IO) and sparklines, and its stack with a\n * chooser across the checkpoints that dumped it and collect buttons for the\n * transports it offers. Tabs for open files, sockets, ports and connections\n * appear when the samples carry that facet, showing the latest stored list and\n * a count sparkline, and one for the environment when the node recorded it.\n * Props-only: the host supplies the selected row and the trace records.\n */\nexport function ProcessTraceDetail({\n node,\n samples,\n stacks = NO_STACKS,\n links,\n onCollectStack,\n collecting,\n collectError,\n className,\n}: ProcessTraceDetailProps) {\n const [tab, setTab] = useState<DetailTab>(\"overview\");\n\n if (!node) {\n return (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n <div className=\"text-center\">\n <Icon icon={UiServerProcess} className=\"mb-2 block text-4xl\" />\n Select a process to view its trace\n </div>\n </div>\n );\n }\n\n const hasEnvironment = Boolean(node.environment || node.environmentError);\n const tabs: Array<TabItem & { id: DetailTab }> = [\n { id: \"overview\", label: \"Overview\" },\n ...(hasEnvironment ? [{ id: \"env\" as const, label: \"Environment\" }] : []),\n ...armedFacets(samples).map((facet) => ({ id: facet, label: SAMPLE_FACETS[facet].label })),\n ];\n const active = tabs.some((item) => item.id === tab) ? tab : \"overview\";\n\n return (\n <div className={cn(\"h-full space-y-density-3 overflow-y-auto p-density-4\", className)} data-process-detail={node.key}>\n <Header node={node} />\n {tabs.length > 1 && <Tabs tabs={tabs} value={active} onChange={(id) => setTab(id as DetailTab)} />}\n {active === \"overview\" ? (\n <Overview\n node={node}\n samples={samples}\n stacks={stacks}\n links={links}\n {...(onCollectStack ? { onCollectStack } : {})}\n {...(collecting !== undefined ? { collecting } : {})}\n {...(collectError ? { collectError } : {})}\n />\n ) : active === \"env\" ? (\n <ProcessFacetTable\n facet=\"env\"\n {...(node.environment ? { environment: node.environment } : {})}\n {...(node.environmentError ? { error: node.environmentError } : {})}\n />\n ) : (\n <FacetTab key={`${node.key}:${active}`} node={node} samples={samples} facet={active} />\n )}\n </div>\n );\n}\n"],"names":["jsx","jsxs","Icon","UiServerProcess","UiDebug","processLabel","processStateColor","processStateIcon","Button","UiLoader","UiDebugSmall","useState","useMemo","stackCheckpoints","Select","formatProcessTimestamp","StackDumpView","ConfirmDialog","isProcessExited","processSeries","diskSeries","formatDuration","processLifetimeMs","MetricTile","formatCpuPercent","cpuTone","formatBytes","LabeledSparkline","SAMPLE_FACETS","facetCountSeries","ProcessFacetTable","latestFacetReading","armedFacets","cn","Tabs"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { ReactNode } from 'react';
2
+ import { ProcessNodeRow, ProcessSampleRow, StackRecord } from './types.js';
3
+ export type ProcessTraceDetailProps = {
4
+ /** The selected `process_tree` record; null renders the empty selection state. */
5
+ node: ProcessNodeRow | null;
6
+ /**
7
+ * `process_samples` records; those of other processes are ignored. They carry
8
+ * the resource series, and the facet counts and lists: a facet tab is shown
9
+ * only when the samples carry that facet's count, that is when the session
10
+ * armed it.
11
+ */
12
+ samples: ProcessSampleRow[];
13
+ /** `stacks` records; those of other processes are ignored. */
14
+ stacks?: StackRecord[];
15
+ /** Host content at the top of Overview, for example a link to the fixture step that started the process. */
16
+ links?: ReactNode;
17
+ /**
18
+ * Collects a stack for a process over one of its `stackTransports`. Without it
19
+ * no collect buttons are shown. A destructive transport (sigquit) kills the
20
+ * process, so it asks for confirmation first.
21
+ */
22
+ onCollectStack?: (key: string, transport: string) => void | Promise<void>;
23
+ /** A collection is in flight: collect buttons are disabled. */
24
+ collecting?: boolean;
25
+ /** Why the last collection failed. */
26
+ collectError?: string;
27
+ className?: string;
28
+ };
29
+ /**
30
+ * Everything the trace knows about one process: its command and lifetime,
31
+ * resource usage (CPU, RSS, disk IO) and sparklines, and its stack with a
32
+ * chooser across the checkpoints that dumped it and collect buttons for the
33
+ * transports it offers. Tabs for open files, sockets, ports and connections
34
+ * appear when the samples carry that facet, showing the latest stored list and
35
+ * a count sparkline, and one for the environment when the node recorded it.
36
+ * Props-only: the host supplies the selected row and the trace records.
37
+ */
38
+ export declare function ProcessTraceDetail({ node, samples, stacks, links, onCollectStack, collecting, collectError, className, }: ProcessTraceDetailProps): import("react").JSX.Element;
39
+ //# sourceMappingURL=ProcessTraceDetail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProcessTraceDetail.d.ts","sourceRoot":"","sources":["../../../src/data/traces/ProcessTraceDetail.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AA8B1D,OAAO,KAAK,EAAE,cAAc,EAAsB,gBAAgB,EAAyB,WAAW,EAAE,MAAM,SAAS,CAAC;AA8CxH,MAAM,MAAM,uBAAuB,GAAG;IACpC,kFAAkF;IAClF,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5B;;;;;OAKG;IACH,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,4GAA4G;IAC5G,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,+DAA+D;IAC/D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA2PF;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,OAAO,EACP,MAAkB,EAClB,KAAK,EACL,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,GACV,EAAE,uBAAuB,+BA+CzB"}
@@ -0,0 +1,316 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState, useMemo } from "react";
3
+ import { Button } from "../../components/button.js";
4
+ import { Select } from "../../components/select.js";
5
+ import { Tabs } from "../../layout/Tabs.js";
6
+ import { formatDuration, formatBytes } from "../../lib/format.js";
7
+ import { cn } from "../../lib/utils.js";
8
+ import { ConfirmDialog } from "../../overlay/ConfirmDialog.js";
9
+ import { MetricTile } from "../diagnostics/MetricTile.js";
10
+ import { cpuTone } from "../diagnostics/metric-tone.js";
11
+ import { StackDumpView } from "../diagnostics/StackDumpView.js";
12
+ import { processLabel, processStateIcon, processStateColor } from "../diagnostics/utils.js";
13
+ import { Icon } from "../Icon.js";
14
+ import { armedFacets, SAMPLE_FACETS, diskSeries, facetCountSeries, latestFacetReading } from "./process-facets.js";
15
+ import { isProcessExited, processSeries, formatProcessTimestamp, processLifetimeMs, formatCpuPercent } from "./process-tree.js";
16
+ import { ProcessFacetTable } from "./ProcessFacetTable.js";
17
+ import { stackCheckpoints } from "./stack-checkpoints.js";
18
+ import { LabeledSparkline } from "./Sparkline.js";
19
+ import { UiServerProcess } from "../../icons/components/UiServerProcess.js";
20
+ import { UiDebug } from "../../icons/components/UiDebug.js";
21
+ import { UiLoader } from "../../icons/components/UiLoader.js";
22
+ import { UiDebugSmall } from "../../icons/components/UiDebugSmall.js";
23
+ const STACK_TRANSPORTS = {
24
+ inprocess: {
25
+ label: (hasStack) => hasStack ? "Refresh stack trace" : "Collect stack trace",
26
+ title: "Take a fresh observation and dump the goroutine stacks"
27
+ },
28
+ native: {
29
+ label: () => "Native sample",
30
+ title: "Sample the process's native threads without interrupting it"
31
+ },
32
+ pprof: {
33
+ label: () => "Collect via pprof",
34
+ title: "Read the goroutine profile from the process's pprof endpoint"
35
+ },
36
+ gops: {
37
+ label: () => "Collect via gops",
38
+ title: "Read the goroutine stacks from the process's gops agent"
39
+ },
40
+ sigquit: {
41
+ label: () => "Dump goroutines & kill",
42
+ title: "Send SIGQUIT: the process prints every goroutine's stack and exits",
43
+ warning: (pid) => `This sends SIGQUIT to pid ${pid}. The process prints every goroutine's stack and exits.`
44
+ }
45
+ };
46
+ function transportSpec(transport) {
47
+ const spec = STACK_TRANSPORTS[transport];
48
+ if (!spec) {
49
+ throw new Error(`unknown stack transport "${transport}"; expected one of ${Object.keys(STACK_TRANSPORTS).join(", ")}`);
50
+ }
51
+ return spec;
52
+ }
53
+ const NO_STACKS = [];
54
+ function Section({ title, children }) {
55
+ return /* @__PURE__ */ jsxs("section", { children: [
56
+ /* @__PURE__ */ jsx("div", { className: "mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground", children: title }),
57
+ children
58
+ ] });
59
+ }
60
+ function InfoTile({ label, value, wide }) {
61
+ return /* @__PURE__ */ jsxs("div", { className: `rounded-lg border border-border bg-muted/50 px-2.5 py-density-2 ${wide ? "col-span-2" : ""}`, children: [
62
+ /* @__PURE__ */ jsx("div", { className: "text-[10px] uppercase tracking-wide text-muted-foreground", children: label }),
63
+ /* @__PURE__ */ jsx("div", { className: "mt-0.5 break-all text-xs font-medium text-foreground", children: value })
64
+ ] });
65
+ }
66
+ function Header({ node }) {
67
+ return /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
68
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-density-2", children: [
69
+ /* @__PURE__ */ jsx(Icon, { icon: node.isRoot ? UiServerProcess : UiDebug, className: "shrink-0 text-2xl text-blue-600" }),
70
+ /* @__PURE__ */ jsx("h2", { className: "break-words text-lg font-bold text-foreground", children: processLabel(node) })
71
+ ] }),
72
+ /* @__PURE__ */ jsxs("div", { className: "mt-1 flex flex-wrap items-center gap-density-2 text-xs text-muted-foreground", children: [
73
+ /* @__PURE__ */ jsxs("span", { className: "font-mono", children: [
74
+ "pid ",
75
+ node.pid
76
+ ] }),
77
+ node.ppid ? /* @__PURE__ */ jsxs("span", { className: "font-mono", children: [
78
+ "ppid ",
79
+ node.ppid
80
+ ] }) : null,
81
+ /* @__PURE__ */ jsxs("span", { className: `inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 ${processStateColor(node.status)}`, children: [
82
+ /* @__PURE__ */ jsx(Icon, { icon: processStateIcon(node.status) }),
83
+ node.status
84
+ ] })
85
+ ] })
86
+ ] });
87
+ }
88
+ function CollectButtons({
89
+ transports,
90
+ hasStack,
91
+ collecting,
92
+ onCollect
93
+ }) {
94
+ return /* @__PURE__ */ jsx("div", { className: "flex items-center gap-density-1", "data-stack-actions": "", children: transports.map((transport) => {
95
+ const spec = transportSpec(transport.transport);
96
+ return /* @__PURE__ */ jsxs(
97
+ Button,
98
+ {
99
+ size: "sm",
100
+ variant: transport.destructive ? "destructive" : hasStack ? "outline" : "default",
101
+ disabled: collecting,
102
+ title: spec.title,
103
+ onClick: () => onCollect(transport),
104
+ children: [
105
+ /* @__PURE__ */ jsx(Icon, { icon: collecting ? UiLoader : UiDebugSmall, className: collecting ? "mr-1 animate-spin" : "mr-1" }),
106
+ spec.label(hasStack)
107
+ ]
108
+ },
109
+ transport.transport
110
+ );
111
+ }) });
112
+ }
113
+ function StackSection({
114
+ node,
115
+ stacks,
116
+ onCollectStack,
117
+ collecting,
118
+ collectError
119
+ }) {
120
+ var _a;
121
+ const [confirming, setConfirming] = useState(null);
122
+ const [picked, setPicked] = useState(null);
123
+ const checkpoints = useMemo(() => stackCheckpoints(stacks, node.key), [stacks, node.key]);
124
+ const transports = node.stackTransports ?? [];
125
+ const canCollect = Boolean(onCollectStack) && transports.length > 0;
126
+ if (checkpoints.length === 0 && !canCollect) return null;
127
+ const selected = checkpoints.find((checkpoint) => checkpoint.checkpointId === picked) ?? checkpoints[checkpoints.length - 1];
128
+ const buttons = canCollect ? /* @__PURE__ */ jsx(
129
+ CollectButtons,
130
+ {
131
+ transports,
132
+ hasStack: Boolean(selected),
133
+ collecting: Boolean(collecting),
134
+ onCollect: (transport) => transport.destructive ? setConfirming(transport) : void (onCollectStack == null ? void 0 : onCollectStack(node.key, transport.transport))
135
+ }
136
+ ) : null;
137
+ const confirmingSpec = confirming ? transportSpec(confirming.transport) : null;
138
+ return /* @__PURE__ */ jsxs(Section, { title: "Stack", children: [
139
+ collectError && /* @__PURE__ */ jsx("div", { className: "mb-2 whitespace-pre-wrap text-xs text-red-700 dark:text-red-400", role: "alert", children: collectError }),
140
+ selected ? /* @__PURE__ */ jsxs("div", { className: "space-y-density-1", children: [
141
+ checkpoints.length > 1 && /* @__PURE__ */ jsx("div", { className: "max-w-md", children: /* @__PURE__ */ jsx(
142
+ Select,
143
+ {
144
+ "aria-label": "Stack checkpoint",
145
+ value: selected.checkpointId,
146
+ onChange: (event) => setPicked(event.target.value),
147
+ options: [...checkpoints].reverse().map((checkpoint) => ({
148
+ value: checkpoint.checkpointId,
149
+ label: [
150
+ formatProcessTimestamp(checkpoint.takenAt),
151
+ checkpoint.reason,
152
+ checkpoint.transport,
153
+ checkpoint.failed ? "failed" : ""
154
+ ].filter(Boolean).join(" · ")
155
+ }))
156
+ }
157
+ ) }),
158
+ /* @__PURE__ */ jsx(
159
+ StackDumpView,
160
+ {
161
+ records: selected.records,
162
+ ...buttons ? { headerActions: buttons } : {}
163
+ },
164
+ `${node.key}:${selected.checkpointId}`
165
+ )
166
+ ] }) : /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3", children: [
167
+ /* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: collecting ? "Collecting stack trace..." : "No stack trace collected yet." }),
168
+ buttons
169
+ ] }),
170
+ /* @__PURE__ */ jsx(
171
+ ConfirmDialog,
172
+ {
173
+ open: confirming !== null,
174
+ title: `${(confirmingSpec == null ? void 0 : confirmingSpec.label(false)) ?? ""}?`,
175
+ warning: ((_a = confirmingSpec == null ? void 0 : confirmingSpec.warning) == null ? void 0 : _a.call(confirmingSpec, node.pid)) ?? `Collecting this stack over ${(confirming == null ? void 0 : confirming.transport) ?? ""} terminates pid ${node.pid}.`,
176
+ message: "The stack is shown here once the dump arrives. Use a non-destructive transport to look without killing.",
177
+ confirmLabel: (confirmingSpec == null ? void 0 : confirmingSpec.label(false)) ?? "Collect",
178
+ variant: "destructive",
179
+ onCancel: () => setConfirming(null),
180
+ onConfirm: () => {
181
+ const transport = confirming;
182
+ setConfirming(null);
183
+ if (transport) void (onCollectStack == null ? void 0 : onCollectStack(node.key, transport.transport));
184
+ }
185
+ }
186
+ )
187
+ ] });
188
+ }
189
+ function Overview({
190
+ node,
191
+ samples,
192
+ links,
193
+ ...stack
194
+ }) {
195
+ const exited = isProcessExited(node);
196
+ const series = processSeries(samples, node.key);
197
+ const disk = diskSeries(samples, node.key);
198
+ const lastDisk = { read: disk.read[disk.read.length - 1], write: disk.write[disk.write.length - 1] };
199
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-density-3", children: [
200
+ links,
201
+ /* @__PURE__ */ jsx(Section, { title: "Command", children: /* @__PURE__ */ jsx("pre", { className: "whitespace-pre-wrap break-all rounded bg-blue-50 p-2 font-mono text-xs text-foreground dark:bg-blue-500/10", children: node.command }) }),
202
+ /* @__PURE__ */ jsx(Section, { title: "Process", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-density-2 text-sm", children: [
203
+ /* @__PURE__ */ jsx(InfoTile, { label: "Cwd", value: node.cwd || "Unavailable", wide: true }),
204
+ /* @__PURE__ */ jsx(InfoTile, { label: "Started", value: formatProcessTimestamp(node.startedAt) }),
205
+ /* @__PURE__ */ jsx(
206
+ InfoTile,
207
+ {
208
+ label: "Exited",
209
+ value: exited ? formatProcessTimestamp(node.exitedAt ?? node.lastSeenAt) : "running"
210
+ }
211
+ ),
212
+ /* @__PURE__ */ jsx(
213
+ InfoTile,
214
+ {
215
+ label: "Lifetime",
216
+ value: `${formatDuration(processLifetimeMs(node))}${exited ? "" : " so far"}`
217
+ }
218
+ )
219
+ ] }) }),
220
+ /* @__PURE__ */ jsxs(Section, { title: "Resources", children: [
221
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-density-1 sm:grid-cols-4", children: [
222
+ /* @__PURE__ */ jsx(
223
+ MetricTile,
224
+ {
225
+ label: "CPU",
226
+ value: formatCpuPercent(node.cpuPercent),
227
+ barPct: Math.min(100, node.cpuPercent ?? 0),
228
+ tone: cpuTone(node.cpuPercent ?? 0)
229
+ }
230
+ ),
231
+ /* @__PURE__ */ jsx(MetricTile, { label: "RSS", value: formatBytes(node.rssBytes) }),
232
+ /* @__PURE__ */ jsx(
233
+ MetricTile,
234
+ {
235
+ label: "Peak CPU",
236
+ value: formatCpuPercent(node.peakCpuPercent),
237
+ tone: cpuTone(node.peakCpuPercent ?? 0)
238
+ }
239
+ ),
240
+ /* @__PURE__ */ jsx(MetricTile, { label: "Peak RSS", value: formatBytes(node.peakRssBytes) }),
241
+ lastDisk.read !== void 0 && /* @__PURE__ */ jsx(MetricTile, { label: "Disk read", value: formatBytes(lastDisk.read) }),
242
+ lastDisk.write !== void 0 && /* @__PURE__ */ jsx(MetricTile, { label: "Disk write", value: formatBytes(lastDisk.write) })
243
+ ] }),
244
+ /* @__PURE__ */ jsxs("div", { className: "mt-2 grid grid-cols-2 gap-density-2", children: [
245
+ /* @__PURE__ */ jsx(LabeledSparkline, { label: "CPU %", values: series.cpu, format: (value) => `${value.toFixed(1)}%` }),
246
+ /* @__PURE__ */ jsx(LabeledSparkline, { label: "RSS", values: series.rss, format: formatBytes }),
247
+ disk.read.length > 0 && /* @__PURE__ */ jsx(LabeledSparkline, { label: "Disk read", values: disk.read, format: formatBytes }),
248
+ disk.write.length > 0 && /* @__PURE__ */ jsx(LabeledSparkline, { label: "Disk write", values: disk.write, format: formatBytes })
249
+ ] })
250
+ ] }),
251
+ /* @__PURE__ */ jsx(StackSection, { node, ...stack }, node.key)
252
+ ] });
253
+ }
254
+ function FacetTab({
255
+ node,
256
+ samples,
257
+ facet
258
+ }) {
259
+ const { label } = SAMPLE_FACETS[facet];
260
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-density-3", children: [
261
+ /* @__PURE__ */ jsx(LabeledSparkline, { label, values: facetCountSeries(samples, node.key, facet), format: String }),
262
+ /* @__PURE__ */ jsx(ProcessFacetTable, { facet, reading: latestFacetReading(samples, node.key, facet) })
263
+ ] });
264
+ }
265
+ function ProcessTraceDetail({
266
+ node,
267
+ samples,
268
+ stacks = NO_STACKS,
269
+ links,
270
+ onCollectStack,
271
+ collecting,
272
+ collectError,
273
+ className
274
+ }) {
275
+ const [tab, setTab] = useState("overview");
276
+ if (!node) {
277
+ return /* @__PURE__ */ jsx("div", { className: "flex h-full items-center justify-center text-sm text-muted-foreground", children: /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
278
+ /* @__PURE__ */ jsx(Icon, { icon: UiServerProcess, className: "mb-2 block text-4xl" }),
279
+ "Select a process to view its trace"
280
+ ] }) });
281
+ }
282
+ const hasEnvironment = Boolean(node.environment || node.environmentError);
283
+ const tabs = [
284
+ { id: "overview", label: "Overview" },
285
+ ...hasEnvironment ? [{ id: "env", label: "Environment" }] : [],
286
+ ...armedFacets(samples).map((facet) => ({ id: facet, label: SAMPLE_FACETS[facet].label }))
287
+ ];
288
+ const active = tabs.some((item) => item.id === tab) ? tab : "overview";
289
+ return /* @__PURE__ */ jsxs("div", { className: cn("h-full space-y-density-3 overflow-y-auto p-density-4", className), "data-process-detail": node.key, children: [
290
+ /* @__PURE__ */ jsx(Header, { node }),
291
+ tabs.length > 1 && /* @__PURE__ */ jsx(Tabs, { tabs, value: active, onChange: (id) => setTab(id) }),
292
+ active === "overview" ? /* @__PURE__ */ jsx(
293
+ Overview,
294
+ {
295
+ node,
296
+ samples,
297
+ stacks,
298
+ links,
299
+ ...onCollectStack ? { onCollectStack } : {},
300
+ ...collecting !== void 0 ? { collecting } : {},
301
+ ...collectError ? { collectError } : {}
302
+ }
303
+ ) : active === "env" ? /* @__PURE__ */ jsx(
304
+ ProcessFacetTable,
305
+ {
306
+ facet: "env",
307
+ ...node.environment ? { environment: node.environment } : {},
308
+ ...node.environmentError ? { error: node.environmentError } : {}
309
+ }
310
+ ) : /* @__PURE__ */ jsx(FacetTab, { node, samples, facet: active }, `${node.key}:${active}`)
311
+ ] });
312
+ }
313
+ export {
314
+ ProcessTraceDetail
315
+ };
316
+ //# sourceMappingURL=ProcessTraceDetail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProcessTraceDetail.js","sources":["../../../src/data/traces/ProcessTraceDetail.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { Select } from \"../../components/select\";\nimport { UiDebug, UiDebugSmall, UiLoader, UiServerProcess } from \"../../icons\";\nimport { Tabs, type TabItem } from \"../../layout/Tabs\";\nimport { formatBytes, formatDuration } from \"../../lib/format\";\nimport { cn } from \"../../lib/utils\";\nimport { ConfirmDialog } from \"../../overlay/ConfirmDialog\";\nimport { MetricTile } from \"../diagnostics/MetricTile\";\nimport { cpuTone } from \"../diagnostics/metric-tone\";\nimport { StackDumpView } from \"../diagnostics/StackDumpView\";\nimport { processLabel, processStateColor, processStateIcon } from \"../diagnostics/utils\";\nimport { Icon } from \"../Icon\";\nimport {\n SAMPLE_FACETS,\n armedFacets,\n diskSeries,\n facetCountSeries,\n latestFacetReading,\n} from \"./process-facets\";\nimport {\n formatCpuPercent,\n formatProcessTimestamp,\n isProcessExited,\n processLifetimeMs,\n processSeries,\n} from \"./process-tree\";\nimport { ProcessFacetTable } from \"./ProcessFacetTable\";\nimport { stackCheckpoints } from \"./stack-checkpoints\";\nimport { LabeledSparkline } from \"./Sparkline\";\nimport type { ProcessNodeRow, ProcessSampleFacet, ProcessSampleRow, ProcessStackTransport, StackRecord } from \"./types\";\n\ntype TransportSpec = {\n label: (hasStack: boolean) => string;\n title: string;\n /** Shown when a destructive collection asks for confirmation. */\n warning?: (pid: number) => string;\n};\n\n/** How each stack transport a node offers in `stackTransports` is presented. */\nconst STACK_TRANSPORTS: Record<string, TransportSpec> = {\n inprocess: {\n label: (hasStack) => (hasStack ? \"Refresh stack trace\" : \"Collect stack trace\"),\n title: \"Take a fresh observation and dump the goroutine stacks\",\n },\n native: {\n label: () => \"Native sample\",\n title: \"Sample the process's native threads without interrupting it\",\n },\n pprof: {\n label: () => \"Collect via pprof\",\n title: \"Read the goroutine profile from the process's pprof endpoint\",\n },\n gops: {\n label: () => \"Collect via gops\",\n title: \"Read the goroutine stacks from the process's gops agent\",\n },\n sigquit: {\n label: () => \"Dump goroutines & kill\",\n title: \"Send SIGQUIT: the process prints every goroutine's stack and exits\",\n warning: (pid) => `This sends SIGQUIT to pid ${pid}. The process prints every goroutine's stack and exits.`,\n },\n};\n\nfunction transportSpec(transport: string): TransportSpec {\n const spec = STACK_TRANSPORTS[transport];\n if (!spec) {\n throw new Error(`unknown stack transport \"${transport}\"; expected one of ${Object.keys(STACK_TRANSPORTS).join(\", \")}`);\n }\n return spec;\n}\n\ntype DetailTab = \"overview\" | \"env\" | ProcessSampleFacet;\n\nconst NO_STACKS: StackRecord[] = [];\n\nexport type ProcessTraceDetailProps = {\n /** The selected `process_tree` record; null renders the empty selection state. */\n node: ProcessNodeRow | null;\n /**\n * `process_samples` records; those of other processes are ignored. They carry\n * the resource series, and the facet counts and lists: a facet tab is shown\n * only when the samples carry that facet's count, that is when the session\n * armed it.\n */\n samples: ProcessSampleRow[];\n /** `stacks` records; those of other processes are ignored. */\n stacks?: StackRecord[];\n /** Host content at the top of Overview, for example a link to the fixture step that started the process. */\n links?: ReactNode;\n /**\n * Collects a stack for a process over one of its `stackTransports`. Without it\n * no collect buttons are shown. A destructive transport (sigquit) kills the\n * process, so it asks for confirmation first.\n */\n onCollectStack?: (key: string, transport: string) => void | Promise<void>;\n /** A collection is in flight: collect buttons are disabled. */\n collecting?: boolean;\n /** Why the last collection failed. */\n collectError?: string;\n className?: string;\n};\n\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\n return (\n <section>\n <div className=\"mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted-foreground\">{title}</div>\n {children}\n </section>\n );\n}\n\nfunction InfoTile({ label, value, wide }: { label: string; value: string; wide?: boolean }) {\n return (\n <div className={`rounded-lg border border-border bg-muted/50 px-2.5 py-density-2 ${wide ? \"col-span-2\" : \"\"}`}>\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{label}</div>\n <div className=\"mt-0.5 break-all text-xs font-medium text-foreground\">{value}</div>\n </div>\n );\n}\n\nfunction Header({ node }: { node: ProcessNodeRow }) {\n return (\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-density-2\">\n <Icon icon={node.isRoot ? UiServerProcess : UiDebug} className=\"shrink-0 text-2xl text-blue-600\" />\n <h2 className=\"break-words text-lg font-bold text-foreground\">{processLabel(node)}</h2>\n </div>\n <div className=\"mt-1 flex flex-wrap items-center gap-density-2 text-xs text-muted-foreground\">\n <span className=\"font-mono\">pid {node.pid}</span>\n {node.ppid ? <span className=\"font-mono\">ppid {node.ppid}</span> : null}\n <span className={`inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 ${processStateColor(node.status)}`}>\n <Icon icon={processStateIcon(node.status)} />\n {node.status}\n </span>\n </div>\n </div>\n );\n}\n\nfunction CollectButtons({\n transports,\n hasStack,\n collecting,\n onCollect,\n}: {\n transports: ProcessStackTransport[];\n hasStack: boolean;\n collecting: boolean;\n onCollect: (transport: ProcessStackTransport) => void;\n}) {\n return (\n <div className=\"flex items-center gap-density-1\" data-stack-actions=\"\">\n {transports.map((transport) => {\n const spec = transportSpec(transport.transport);\n return (\n <Button\n key={transport.transport}\n size=\"sm\"\n variant={transport.destructive ? \"destructive\" : hasStack ? \"outline\" : \"default\"}\n disabled={collecting}\n title={spec.title}\n onClick={() => onCollect(transport)}\n >\n <Icon icon={collecting ? UiLoader : UiDebugSmall} className={collecting ? \"mr-1 animate-spin\" : \"mr-1\"} />\n {spec.label(hasStack)}\n </Button>\n );\n })}\n </div>\n );\n}\n\nfunction StackSection({\n node,\n stacks,\n onCollectStack,\n collecting,\n collectError,\n}: Pick<ProcessTraceDetailProps, \"onCollectStack\" | \"collecting\" | \"collectError\"> & {\n node: ProcessNodeRow;\n stacks: StackRecord[];\n}) {\n const [confirming, setConfirming] = useState<ProcessStackTransport | null>(null);\n const [picked, setPicked] = useState<string | null>(null);\n const checkpoints = useMemo(() => stackCheckpoints(stacks, node.key), [stacks, node.key]);\n const transports = node.stackTransports ?? [];\n const canCollect = Boolean(onCollectStack) && transports.length > 0;\n if (checkpoints.length === 0 && !canCollect) return null;\n\n const selected = checkpoints.find((checkpoint) => checkpoint.checkpointId === picked) ?? checkpoints[checkpoints.length - 1];\n const buttons = canCollect ? (\n <CollectButtons\n transports={transports}\n hasStack={Boolean(selected)}\n collecting={Boolean(collecting)}\n onCollect={(transport) => (transport.destructive ? setConfirming(transport) : void onCollectStack?.(node.key, transport.transport))}\n />\n ) : null;\n const confirmingSpec = confirming ? transportSpec(confirming.transport) : null;\n\n return (\n <Section title=\"Stack\">\n {collectError && (\n <div className=\"mb-2 whitespace-pre-wrap text-xs text-red-700 dark:text-red-400\" role=\"alert\">\n {collectError}\n </div>\n )}\n {selected ? (\n <div className=\"space-y-density-1\">\n {checkpoints.length > 1 && (\n <div className=\"max-w-md\">\n <Select\n aria-label=\"Stack checkpoint\"\n value={selected.checkpointId}\n onChange={(event) => setPicked(event.target.value)}\n options={[...checkpoints].reverse().map((checkpoint) => ({\n value: checkpoint.checkpointId,\n label: [\n formatProcessTimestamp(checkpoint.takenAt),\n checkpoint.reason,\n checkpoint.transport,\n checkpoint.failed ? \"failed\" : \"\",\n ]\n .filter(Boolean)\n .join(\" · \"),\n }))}\n />\n </div>\n )}\n <StackDumpView\n key={`${node.key}:${selected.checkpointId}`}\n records={selected.records}\n {...(buttons ? { headerActions: buttons } : {})}\n />\n </div>\n ) : (\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-xs text-muted-foreground\">\n {collecting ? \"Collecting stack trace...\" : \"No stack trace collected yet.\"}\n </div>\n {buttons}\n </div>\n )}\n <ConfirmDialog\n open={confirming !== null}\n title={`${confirmingSpec?.label(false) ?? \"\"}?`}\n warning={\n confirmingSpec?.warning?.(node.pid) ??\n `Collecting this stack over ${confirming?.transport ?? \"\"} terminates pid ${node.pid}.`\n }\n message=\"The stack is shown here once the dump arrives. Use a non-destructive transport to look without killing.\"\n confirmLabel={confirmingSpec?.label(false) ?? \"Collect\"}\n variant=\"destructive\"\n onCancel={() => setConfirming(null)}\n onConfirm={() => {\n const transport = confirming;\n setConfirming(null);\n if (transport) void onCollectStack?.(node.key, transport.transport);\n }}\n />\n </Section>\n );\n}\n\nfunction Overview({\n node,\n samples,\n links,\n ...stack\n}: Pick<ProcessTraceDetailProps, \"samples\" | \"links\" | \"onCollectStack\" | \"collecting\" | \"collectError\"> & {\n node: ProcessNodeRow;\n stacks: StackRecord[];\n}) {\n const exited = isProcessExited(node);\n const series = processSeries(samples, node.key);\n const disk = diskSeries(samples, node.key);\n const lastDisk = { read: disk.read[disk.read.length - 1], write: disk.write[disk.write.length - 1] };\n return (\n <div className=\"space-y-density-3\">\n {links}\n\n <Section title=\"Command\">\n <pre className=\"whitespace-pre-wrap break-all rounded bg-blue-50 p-2 font-mono text-xs text-foreground dark:bg-blue-500/10\">\n {node.command}\n </pre>\n </Section>\n\n <Section title=\"Process\">\n <div className=\"grid grid-cols-2 gap-density-2 text-sm\">\n <InfoTile label=\"Cwd\" value={node.cwd || \"Unavailable\"} wide />\n <InfoTile label=\"Started\" value={formatProcessTimestamp(node.startedAt)} />\n <InfoTile\n label=\"Exited\"\n value={exited ? formatProcessTimestamp(node.exitedAt ?? node.lastSeenAt) : \"running\"}\n />\n <InfoTile\n label=\"Lifetime\"\n value={`${formatDuration(processLifetimeMs(node))}${exited ? \"\" : \" so far\"}`}\n />\n </div>\n </Section>\n\n <Section title=\"Resources\">\n <div className=\"grid grid-cols-2 gap-density-1 sm:grid-cols-4\">\n <MetricTile\n label=\"CPU\"\n value={formatCpuPercent(node.cpuPercent)}\n barPct={Math.min(100, node.cpuPercent ?? 0)}\n tone={cpuTone(node.cpuPercent ?? 0)}\n />\n <MetricTile label=\"RSS\" value={formatBytes(node.rssBytes)} />\n <MetricTile\n label=\"Peak CPU\"\n value={formatCpuPercent(node.peakCpuPercent)}\n tone={cpuTone(node.peakCpuPercent ?? 0)}\n />\n <MetricTile label=\"Peak RSS\" value={formatBytes(node.peakRssBytes)} />\n {lastDisk.read !== undefined && <MetricTile label=\"Disk read\" value={formatBytes(lastDisk.read)} />}\n {lastDisk.write !== undefined && <MetricTile label=\"Disk write\" value={formatBytes(lastDisk.write)} />}\n </div>\n <div className=\"mt-2 grid grid-cols-2 gap-density-2\">\n <LabeledSparkline label=\"CPU %\" values={series.cpu} format={(value) => `${value.toFixed(1)}%`} />\n <LabeledSparkline label=\"RSS\" values={series.rss} format={formatBytes} />\n {disk.read.length > 0 && <LabeledSparkline label=\"Disk read\" values={disk.read} format={formatBytes} />}\n {disk.write.length > 0 && <LabeledSparkline label=\"Disk write\" values={disk.write} format={formatBytes} />}\n </div>\n </Section>\n\n <StackSection key={node.key} node={node} {...stack} />\n </div>\n );\n}\n\nfunction FacetTab({\n node,\n samples,\n facet,\n}: {\n node: ProcessNodeRow;\n samples: ProcessSampleRow[];\n facet: ProcessSampleFacet;\n}) {\n const { label } = SAMPLE_FACETS[facet];\n return (\n <div className=\"space-y-density-3\">\n <LabeledSparkline label={label} values={facetCountSeries(samples, node.key, facet)} format={String} />\n <ProcessFacetTable facet={facet} reading={latestFacetReading(samples, node.key, facet)} />\n </div>\n );\n}\n\n/**\n * Everything the trace knows about one process: its command and lifetime,\n * resource usage (CPU, RSS, disk IO) and sparklines, and its stack with a\n * chooser across the checkpoints that dumped it and collect buttons for the\n * transports it offers. Tabs for open files, sockets, ports and connections\n * appear when the samples carry that facet, showing the latest stored list and\n * a count sparkline, and one for the environment when the node recorded it.\n * Props-only: the host supplies the selected row and the trace records.\n */\nexport function ProcessTraceDetail({\n node,\n samples,\n stacks = NO_STACKS,\n links,\n onCollectStack,\n collecting,\n collectError,\n className,\n}: ProcessTraceDetailProps) {\n const [tab, setTab] = useState<DetailTab>(\"overview\");\n\n if (!node) {\n return (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n <div className=\"text-center\">\n <Icon icon={UiServerProcess} className=\"mb-2 block text-4xl\" />\n Select a process to view its trace\n </div>\n </div>\n );\n }\n\n const hasEnvironment = Boolean(node.environment || node.environmentError);\n const tabs: Array<TabItem & { id: DetailTab }> = [\n { id: \"overview\", label: \"Overview\" },\n ...(hasEnvironment ? [{ id: \"env\" as const, label: \"Environment\" }] : []),\n ...armedFacets(samples).map((facet) => ({ id: facet, label: SAMPLE_FACETS[facet].label })),\n ];\n const active = tabs.some((item) => item.id === tab) ? tab : \"overview\";\n\n return (\n <div className={cn(\"h-full space-y-density-3 overflow-y-auto p-density-4\", className)} data-process-detail={node.key}>\n <Header node={node} />\n {tabs.length > 1 && <Tabs tabs={tabs} value={active} onChange={(id) => setTab(id as DetailTab)} />}\n {active === \"overview\" ? (\n <Overview\n node={node}\n samples={samples}\n stacks={stacks}\n links={links}\n {...(onCollectStack ? { onCollectStack } : {})}\n {...(collecting !== undefined ? { collecting } : {})}\n {...(collectError ? { collectError } : {})}\n />\n ) : active === \"env\" ? (\n <ProcessFacetTable\n facet=\"env\"\n {...(node.environment ? { environment: node.environment } : {})}\n {...(node.environmentError ? { error: node.environmentError } : {})}\n />\n ) : (\n <FacetTab key={`${node.key}:${active}`} node={node} samples={samples} facet={active} />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}