@flanksource/clicky-ui 0.3.48 → 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 (444) 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/DataTable.cjs +18 -8
  116. package/dist/data/DataTable.cjs.map +1 -1
  117. package/dist/data/DataTable.d.ts +4 -0
  118. package/dist/data/DataTable.d.ts.map +1 -1
  119. package/dist/data/DataTable.js +18 -8
  120. package/dist/data/DataTable.js.map +1 -1
  121. package/dist/data/TaskManager.cjs +183 -159
  122. package/dist/data/TaskManager.cjs.map +1 -1
  123. package/dist/data/TaskManager.d.ts +3 -1
  124. package/dist/data/TaskManager.d.ts.map +1 -1
  125. package/dist/data/TaskManager.js +185 -161
  126. package/dist/data/TaskManager.js.map +1 -1
  127. package/dist/data/TaskManagerButton.cjs +1 -0
  128. package/dist/data/TaskManagerButton.cjs.map +1 -1
  129. package/dist/data/TaskManagerButton.js +1 -0
  130. package/dist/data/TaskManagerButton.js.map +1 -1
  131. package/dist/data/TaskProgress.cjs +13 -7
  132. package/dist/data/TaskProgress.cjs.map +1 -1
  133. package/dist/data/TaskProgress.d.ts +3 -1
  134. package/dist/data/TaskProgress.d.ts.map +1 -1
  135. package/dist/data/TaskProgress.js +13 -7
  136. package/dist/data/TaskProgress.js.map +1 -1
  137. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +52 -295
  138. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  139. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  140. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +47 -290
  141. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  142. package/dist/data/diagnostics/MetricTile.cjs +44 -0
  143. package/dist/data/diagnostics/MetricTile.cjs.map +1 -0
  144. package/dist/data/diagnostics/MetricTile.d.ts +13 -0
  145. package/dist/data/diagnostics/MetricTile.d.ts.map +1 -0
  146. package/dist/data/diagnostics/MetricTile.js +44 -0
  147. package/dist/data/diagnostics/MetricTile.js.map +1 -0
  148. package/dist/data/diagnostics/StackDumpView.cjs +227 -0
  149. package/dist/data/diagnostics/StackDumpView.cjs.map +1 -0
  150. package/dist/data/diagnostics/StackDumpView.d.ts +53 -0
  151. package/dist/data/diagnostics/StackDumpView.d.ts.map +1 -0
  152. package/dist/data/diagnostics/StackDumpView.js +227 -0
  153. package/dist/data/diagnostics/StackDumpView.js.map +1 -0
  154. package/dist/data/diagnostics/fixtures.d.ts +1 -0
  155. package/dist/data/diagnostics/fixtures.d.ts.map +1 -1
  156. package/dist/data/diagnostics/metric-tone.cjs +18 -0
  157. package/dist/data/diagnostics/metric-tone.cjs.map +1 -0
  158. package/dist/data/diagnostics/metric-tone.d.ts +6 -0
  159. package/dist/data/diagnostics/metric-tone.d.ts.map +1 -0
  160. package/dist/data/diagnostics/metric-tone.js +18 -0
  161. package/dist/data/diagnostics/metric-tone.js.map +1 -0
  162. package/dist/data/diagnostics/stacktrace.cjs +44 -0
  163. package/dist/data/diagnostics/stacktrace.cjs.map +1 -1
  164. package/dist/data/diagnostics/stacktrace.d.ts +7 -0
  165. package/dist/data/diagnostics/stacktrace.d.ts.map +1 -1
  166. package/dist/data/diagnostics/stacktrace.js +44 -0
  167. package/dist/data/diagnostics/stacktrace.js.map +1 -1
  168. package/dist/data/diagnostics/types.d.ts +2 -8
  169. package/dist/data/diagnostics/types.d.ts.map +1 -1
  170. package/dist/data/lint/LintDetail.cjs +339 -0
  171. package/dist/data/lint/LintDetail.cjs.map +1 -0
  172. package/dist/data/lint/LintDetail.d.ts +17 -0
  173. package/dist/data/lint/LintDetail.d.ts.map +1 -0
  174. package/dist/data/lint/LintDetail.js +339 -0
  175. package/dist/data/lint/LintDetail.js.map +1 -0
  176. package/dist/data/lint/LintFilterBar.cjs +103 -0
  177. package/dist/data/lint/LintFilterBar.cjs.map +1 -0
  178. package/dist/data/lint/LintFilterBar.d.ts +16 -0
  179. package/dist/data/lint/LintFilterBar.d.ts.map +1 -0
  180. package/dist/data/lint/LintFilterBar.js +103 -0
  181. package/dist/data/lint/LintFilterBar.js.map +1 -0
  182. package/dist/data/lint/LintResults.cjs +144 -0
  183. package/dist/data/lint/LintResults.cjs.map +1 -0
  184. package/dist/data/lint/LintResults.d.ts +39 -0
  185. package/dist/data/lint/LintResults.d.ts.map +1 -0
  186. package/dist/data/lint/LintResults.fixtures.d.ts +10 -0
  187. package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -0
  188. package/dist/data/lint/LintResults.js +144 -0
  189. package/dist/data/lint/LintResults.js.map +1 -0
  190. package/dist/data/lint/LintTreeNode.cjs +66 -0
  191. package/dist/data/lint/LintTreeNode.cjs.map +1 -0
  192. package/dist/data/lint/LintTreeNode.d.ts +7 -0
  193. package/dist/data/lint/LintTreeNode.d.ts.map +1 -0
  194. package/dist/data/lint/LintTreeNode.js +66 -0
  195. package/dist/data/lint/LintTreeNode.js.map +1 -0
  196. package/dist/data/lint/actions.cjs +195 -0
  197. package/dist/data/lint/actions.cjs.map +1 -0
  198. package/dist/data/lint/actions.d.ts +29 -0
  199. package/dist/data/lint/actions.d.ts.map +1 -0
  200. package/dist/data/lint/actions.js +195 -0
  201. package/dist/data/lint/actions.js.map +1 -0
  202. package/dist/data/lint/grouping-options.cjs +14 -0
  203. package/dist/data/lint/grouping-options.cjs.map +1 -0
  204. package/dist/data/lint/grouping-options.d.ts +9 -0
  205. package/dist/data/lint/grouping-options.d.ts.map +1 -0
  206. package/dist/data/lint/grouping-options.js +14 -0
  207. package/dist/data/lint/grouping-options.js.map +1 -0
  208. package/dist/data/lint/grouping.cjs +450 -0
  209. package/dist/data/lint/grouping.cjs.map +1 -0
  210. package/dist/data/lint/grouping.d.ts +10 -0
  211. package/dist/data/lint/grouping.d.ts.map +1 -0
  212. package/dist/data/lint/grouping.js +450 -0
  213. package/dist/data/lint/grouping.js.map +1 -0
  214. package/dist/data/lint/index.d.ts +10 -0
  215. package/dist/data/lint/index.d.ts.map +1 -0
  216. package/dist/data/lint/paths.cjs +35 -0
  217. package/dist/data/lint/paths.cjs.map +1 -0
  218. package/dist/data/lint/paths.d.ts +13 -0
  219. package/dist/data/lint/paths.d.ts.map +1 -0
  220. package/dist/data/lint/paths.js +35 -0
  221. package/dist/data/lint/paths.js.map +1 -0
  222. package/dist/data/lint/stats.cjs +76 -0
  223. package/dist/data/lint/stats.cjs.map +1 -0
  224. package/dist/data/lint/stats.d.ts +19 -0
  225. package/dist/data/lint/stats.d.ts.map +1 -0
  226. package/dist/data/lint/stats.js +76 -0
  227. package/dist/data/lint/stats.js.map +1 -0
  228. package/dist/data/lint/types.cjs +16 -0
  229. package/dist/data/lint/types.cjs.map +1 -0
  230. package/dist/data/lint/types.d.ts +93 -0
  231. package/dist/data/lint/types.d.ts.map +1 -0
  232. package/dist/data/lint/types.js +16 -0
  233. package/dist/data/lint/types.js.map +1 -0
  234. package/dist/data/test-runner/TestAttemptDetail.cjs +113 -0
  235. package/dist/data/test-runner/TestAttemptDetail.cjs.map +1 -0
  236. package/dist/data/test-runner/TestAttemptDetail.d.ts +19 -0
  237. package/dist/data/test-runner/TestAttemptDetail.d.ts.map +1 -0
  238. package/dist/data/test-runner/TestAttemptDetail.js +113 -0
  239. package/dist/data/test-runner/TestAttemptDetail.js.map +1 -0
  240. package/dist/data/test-runner/TestAttempts.cjs +36 -0
  241. package/dist/data/test-runner/TestAttempts.cjs.map +1 -0
  242. package/dist/data/test-runner/TestAttempts.d.ts +5 -0
  243. package/dist/data/test-runner/TestAttempts.d.ts.map +1 -0
  244. package/dist/data/test-runner/TestAttempts.js +36 -0
  245. package/dist/data/test-runner/TestAttempts.js.map +1 -0
  246. package/dist/data/test-runner/TestDetailPanel.cjs +13 -3
  247. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  248. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  249. package/dist/data/test-runner/TestDetailPanel.js +14 -4
  250. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  251. package/dist/data/test-runner/TestFailureDetail.cjs +9 -29
  252. package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
  253. package/dist/data/test-runner/TestFailureDetail.d.ts +6 -6
  254. package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
  255. package/dist/data/test-runner/TestFailureDetail.js +9 -29
  256. package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
  257. package/dist/data/test-runner/TestRunSummary.cjs +33 -0
  258. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  259. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  260. package/dist/data/test-runner/TestRunSummary.js +34 -1
  261. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  262. package/dist/data/test-runner/TestRunner.cjs +3 -0
  263. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  264. package/dist/data/test-runner/TestRunner.d.ts +8 -1
  265. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  266. package/dist/data/test-runner/TestRunner.js +3 -0
  267. package/dist/data/test-runner/TestRunner.js.map +1 -1
  268. package/dist/data/test-runner/TestTreeNode.cjs +3 -1
  269. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  270. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  271. package/dist/data/test-runner/TestTreeNode.js +3 -1
  272. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  273. package/dist/data/test-runner/adapter.cjs +9 -1
  274. package/dist/data/test-runner/adapter.cjs.map +1 -1
  275. package/dist/data/test-runner/adapter.d.ts +5 -0
  276. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  277. package/dist/data/test-runner/adapter.js +9 -1
  278. package/dist/data/test-runner/adapter.js.map +1 -1
  279. package/dist/data/test-runner/attempts.cjs +62 -0
  280. package/dist/data/test-runner/attempts.cjs.map +1 -0
  281. package/dist/data/test-runner/attempts.d.ts +13 -0
  282. package/dist/data/test-runner/attempts.d.ts.map +1 -0
  283. package/dist/data/test-runner/attempts.js +62 -0
  284. package/dist/data/test-runner/attempts.js.map +1 -0
  285. package/dist/data/test-runner/context.cjs.map +1 -1
  286. package/dist/data/test-runner/context.d.ts +6 -0
  287. package/dist/data/test-runner/context.d.ts.map +1 -1
  288. package/dist/data/test-runner/context.js.map +1 -1
  289. package/dist/data/test-runner/index.d.ts +5 -1
  290. package/dist/data/test-runner/index.d.ts.map +1 -1
  291. package/dist/data/test-runner/marks.cjs +2 -0
  292. package/dist/data/test-runner/marks.cjs.map +1 -1
  293. package/dist/data/test-runner/marks.d.ts.map +1 -1
  294. package/dist/data/test-runner/marks.js +2 -0
  295. package/dist/data/test-runner/marks.js.map +1 -1
  296. package/dist/data/test-runner/process-metrics.cjs +15 -0
  297. package/dist/data/test-runner/process-metrics.cjs.map +1 -0
  298. package/dist/data/test-runner/process-metrics.d.ts +22 -0
  299. package/dist/data/test-runner/process-metrics.d.ts.map +1 -0
  300. package/dist/data/test-runner/process-metrics.js +15 -0
  301. package/dist/data/test-runner/process-metrics.js.map +1 -0
  302. package/dist/data/test-runner/status.cjs +11 -3
  303. package/dist/data/test-runner/status.cjs.map +1 -1
  304. package/dist/data/test-runner/status.d.ts +3 -1
  305. package/dist/data/test-runner/status.d.ts.map +1 -1
  306. package/dist/data/test-runner/status.js +11 -3
  307. package/dist/data/test-runner/status.js.map +1 -1
  308. package/dist/data/test-runner/types.d.ts +14 -0
  309. package/dist/data/test-runner/types.d.ts.map +1 -1
  310. package/dist/data/traces/GoProfileView.cjs +176 -0
  311. package/dist/data/traces/GoProfileView.cjs.map +1 -0
  312. package/dist/data/traces/GoProfileView.d.ts +30 -0
  313. package/dist/data/traces/GoProfileView.d.ts.map +1 -0
  314. package/dist/data/traces/GoProfileView.js +176 -0
  315. package/dist/data/traces/GoProfileView.js.map +1 -0
  316. package/dist/data/traces/ProcessFacetTable.cjs +79 -0
  317. package/dist/data/traces/ProcessFacetTable.cjs.map +1 -0
  318. package/dist/data/traces/ProcessFacetTable.d.ts +21 -0
  319. package/dist/data/traces/ProcessFacetTable.d.ts.map +1 -0
  320. package/dist/data/traces/ProcessFacetTable.js +79 -0
  321. package/dist/data/traces/ProcessFacetTable.js.map +1 -0
  322. package/dist/data/traces/ProcessRecordViews.cjs +41 -0
  323. package/dist/data/traces/ProcessRecordViews.cjs.map +1 -0
  324. package/dist/data/traces/ProcessRecordViews.d.ts +16 -0
  325. package/dist/data/traces/ProcessRecordViews.d.ts.map +1 -0
  326. package/dist/data/traces/ProcessRecordViews.js +41 -0
  327. package/dist/data/traces/ProcessRecordViews.js.map +1 -0
  328. package/dist/data/traces/ProcessTraceDetail.cjs +316 -0
  329. package/dist/data/traces/ProcessTraceDetail.cjs.map +1 -0
  330. package/dist/data/traces/ProcessTraceDetail.d.ts +39 -0
  331. package/dist/data/traces/ProcessTraceDetail.d.ts.map +1 -0
  332. package/dist/data/traces/ProcessTraceDetail.js +316 -0
  333. package/dist/data/traces/ProcessTraceDetail.js.map +1 -0
  334. package/dist/data/traces/ProcessTraceTree.cjs +135 -0
  335. package/dist/data/traces/ProcessTraceTree.cjs.map +1 -0
  336. package/dist/data/traces/ProcessTraceTree.d.ts +41 -0
  337. package/dist/data/traces/ProcessTraceTree.d.ts.map +1 -0
  338. package/dist/data/traces/ProcessTraceTree.js +135 -0
  339. package/dist/data/traces/ProcessTraceTree.js.map +1 -0
  340. package/dist/data/traces/Sparkline.cjs +45 -0
  341. package/dist/data/traces/Sparkline.cjs.map +1 -0
  342. package/dist/data/traces/Sparkline.d.ts +29 -0
  343. package/dist/data/traces/Sparkline.d.ts.map +1 -0
  344. package/dist/data/traces/Sparkline.js +45 -0
  345. package/dist/data/traces/Sparkline.js.map +1 -0
  346. package/dist/data/traces/SqlTraceTable.cjs +104 -0
  347. package/dist/data/traces/SqlTraceTable.cjs.map +1 -0
  348. package/dist/data/traces/SqlTraceTable.d.ts +19 -0
  349. package/dist/data/traces/SqlTraceTable.d.ts.map +1 -0
  350. package/dist/data/traces/SqlTraceTable.js +104 -0
  351. package/dist/data/traces/SqlTraceTable.js.map +1 -0
  352. package/dist/data/traces/TerminalCastPlayer.cjs +162 -0
  353. package/dist/data/traces/TerminalCastPlayer.cjs.map +1 -0
  354. package/dist/data/traces/TerminalCastPlayer.js +162 -0
  355. package/dist/data/traces/TerminalCastPlayer.js.map +1 -0
  356. package/dist/data/traces/TraceHarView.cjs +15 -0
  357. package/dist/data/traces/TraceHarView.cjs.map +1 -0
  358. package/dist/data/traces/TraceHarView.js +15 -0
  359. package/dist/data/traces/TraceHarView.js.map +1 -0
  360. package/dist/data/traces/TraceView.cjs +63 -0
  361. package/dist/data/traces/TraceView.cjs.map +1 -0
  362. package/dist/data/traces/TraceView.d.ts +20 -0
  363. package/dist/data/traces/TraceView.d.ts.map +1 -0
  364. package/dist/data/traces/TraceView.js +63 -0
  365. package/dist/data/traces/TraceView.js.map +1 -0
  366. package/dist/data/traces/TraceWindowList.cjs +117 -0
  367. package/dist/data/traces/TraceWindowList.cjs.map +1 -0
  368. package/dist/data/traces/TraceWindowList.d.ts +48 -0
  369. package/dist/data/traces/TraceWindowList.d.ts.map +1 -0
  370. package/dist/data/traces/TraceWindowList.js +117 -0
  371. package/dist/data/traces/TraceWindowList.js.map +1 -0
  372. package/dist/data/traces/cast.cjs +81 -0
  373. package/dist/data/traces/cast.cjs.map +1 -0
  374. package/dist/data/traces/cast.js +81 -0
  375. package/dist/data/traces/cast.js.map +1 -0
  376. package/dist/data/traces/fixtures.d.ts +25 -1
  377. package/dist/data/traces/fixtures.d.ts.map +1 -1
  378. package/dist/data/traces/har-adapter.cjs +83 -0
  379. package/dist/data/traces/har-adapter.cjs.map +1 -0
  380. package/dist/data/traces/har-adapter.js +83 -0
  381. package/dist/data/traces/har-adapter.js.map +1 -0
  382. package/dist/data/traces/index.d.ts +19 -0
  383. package/dist/data/traces/index.d.ts.map +1 -0
  384. package/dist/data/traces/process-facets.cjs +48 -0
  385. package/dist/data/traces/process-facets.cjs.map +1 -0
  386. package/dist/data/traces/process-facets.d.ts +38 -0
  387. package/dist/data/traces/process-facets.d.ts.map +1 -0
  388. package/dist/data/traces/process-facets.js +48 -0
  389. package/dist/data/traces/process-facets.js.map +1 -0
  390. package/dist/data/traces/process-tree.cjs +85 -0
  391. package/dist/data/traces/process-tree.cjs.map +1 -0
  392. package/dist/data/traces/process-tree.d.ts +40 -0
  393. package/dist/data/traces/process-tree.d.ts.map +1 -0
  394. package/dist/data/traces/process-tree.js +85 -0
  395. package/dist/data/traces/process-tree.js.map +1 -0
  396. package/dist/data/traces/profile-aggregate.cjs +78 -0
  397. package/dist/data/traces/profile-aggregate.cjs.map +1 -0
  398. package/dist/data/traces/profile-aggregate.d.ts +41 -0
  399. package/dist/data/traces/profile-aggregate.d.ts.map +1 -0
  400. package/dist/data/traces/profile-aggregate.js +78 -0
  401. package/dist/data/traces/profile-aggregate.js.map +1 -0
  402. package/dist/data/traces/sql-trace.cjs +39 -0
  403. package/dist/data/traces/sql-trace.cjs.map +1 -0
  404. package/dist/data/traces/sql-trace.d.ts +31 -0
  405. package/dist/data/traces/sql-trace.d.ts.map +1 -0
  406. package/dist/data/traces/sql-trace.js +39 -0
  407. package/dist/data/traces/sql-trace.js.map +1 -0
  408. package/dist/data/traces/stack-checkpoints.cjs +22 -0
  409. package/dist/data/traces/stack-checkpoints.cjs.map +1 -0
  410. package/dist/data/traces/stack-checkpoints.d.ts +18 -0
  411. package/dist/data/traces/stack-checkpoints.d.ts.map +1 -0
  412. package/dist/data/traces/stack-checkpoints.js +22 -0
  413. package/dist/data/traces/stack-checkpoints.js.map +1 -0
  414. package/dist/data/traces/terminal-screen.cjs +270 -0
  415. package/dist/data/traces/terminal-screen.cjs.map +1 -0
  416. package/dist/data/traces/terminal-screen.js +270 -0
  417. package/dist/data/traces/terminal-screen.js.map +1 -0
  418. package/dist/data/traces/terminal-timeline.cjs +48 -0
  419. package/dist/data/traces/terminal-timeline.cjs.map +1 -0
  420. package/dist/data/traces/terminal-timeline.js +48 -0
  421. package/dist/data/traces/terminal-timeline.js.map +1 -0
  422. package/dist/data/traces/types.d.ts +121 -8
  423. package/dist/data/traces/types.d.ts.map +1 -1
  424. package/dist/data/verification/adapters.cjs +1 -0
  425. package/dist/data/verification/adapters.cjs.map +1 -1
  426. package/dist/data/verification/adapters.d.ts.map +1 -1
  427. package/dist/data/verification/adapters.js +1 -0
  428. package/dist/data/verification/adapters.js.map +1 -1
  429. package/dist/data/version-info.cjs +3 -3
  430. package/dist/data/version-info.cjs.map +1 -1
  431. package/dist/data/version-info.js +3 -3
  432. package/dist/data/version-info.js.map +1 -1
  433. package/dist/data.cjs +105 -5
  434. package/dist/data.cjs.map +1 -1
  435. package/dist/data.d.ts +5 -0
  436. package/dist/data.d.ts.map +1 -1
  437. package/dist/data.js +101 -1
  438. package/dist/data.js.map +1 -1
  439. package/dist/index.cjs +107 -7
  440. package/dist/index.cjs.map +1 -1
  441. package/dist/index.js +101 -1
  442. package/dist/index.js.map +1 -1
  443. package/dist/styles.css +1 -1
  444. package/package.json +6 -1
@@ -1,34 +1,15 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { useState, useMemo, useEffect } from "react";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
3
2
  import { Icon } from "../Icon.js";
4
3
  import { processLabel, processStateIcon, processStateColor } from "./utils.js";
5
- import { parseStackDump, countStackByState } from "./stacktrace.js";
6
- import { GoroutineCard } from "./GoroutineCard.js";
7
- import { ThreadCard } from "./ThreadCard.js";
8
- import { threadStateDot, goroutineStateDot } from "./state-styles.js";
4
+ import { MetricTile } from "./MetricTile.js";
5
+ import { cpuTone, memoryTone } from "./metric-tone.js";
6
+ import { StackDumpView } from "./StackDumpView.js";
9
7
  import { UiServerProcess } from "../../icons/components/UiServerProcess.js";
10
8
  import { UiDebug } from "../../icons/components/UiDebug.js";
11
9
  import { UiLoader } from "../../icons/components/UiLoader.js";
12
10
  import { UiDebugSmall } from "../../icons/components/UiDebugSmall.js";
13
11
  import { UiRefresh } from "../../icons/components/UiRefresh.js";
14
12
  import { formatBytes } from "../../lib/format.js";
15
- import { UiSearch } from "../../icons/components/UiSearch.js";
16
- const STACK_MIN_LINES = 10;
17
- const STACK_LINE_HEIGHT_REM = 1;
18
- const STACK_MIN_HEIGHT = `${STACK_MIN_LINES * STACK_LINE_HEIGHT_REM}rem`;
19
- function cpuTone(pct) {
20
- if (pct >= 90) return "danger";
21
- if (pct >= 60) return "warning";
22
- if (pct > 0) return "success";
23
- return "neutral";
24
- }
25
- function memoryTone(rss, vms) {
26
- if (!rss || !vms) return "neutral";
27
- const ratio = rss / vms;
28
- if (ratio >= 0.9) return "danger";
29
- if (ratio >= 0.6) return "warning";
30
- return "info";
31
- }
32
13
  function DiagnosticsDetailPanel({
33
14
  process,
34
15
  collectBusy,
@@ -39,34 +20,13 @@ function DiagnosticsDetailPanel({
39
20
  headerActions,
40
21
  singleItem
41
22
  }) {
42
- const [search, setSearch] = useState("");
43
- const [selectedStates, setSelectedStates] = useState(/* @__PURE__ */ new Set());
44
- const [hideRuntimeOnly, setHideRuntimeOnly] = useState(true);
45
- const stack = process == null ? void 0 : process.stack_capture;
46
- const parsed = useMemo(() => parseStackDump((stack == null ? void 0 : stack.text) || ""), [stack == null ? void 0 : stack.text]);
47
- const stateCounts = useMemo(() => countStackByState(parsed), [parsed]);
48
- const filtered = useMemo(() => {
49
- const needle = search.trim().toLowerCase();
50
- const items = parsed.format === "jvm" ? parsed.threads : parsed.format === "go" ? parsed.goroutines : [];
51
- if (singleItem) return items;
52
- return items.filter((item) => {
53
- if (selectedStates.size > 0 && !selectedStates.has(item.state)) return false;
54
- if (hideRuntimeOnly && item.userFrameCount === 0) return false;
55
- if (needle && !item.searchText.includes(needle)) return false;
56
- return true;
57
- });
58
- }, [parsed, search, selectedStates, hideRuntimeOnly, singleItem]);
59
- useEffect(() => {
60
- setSearch("");
61
- setSelectedStates(/* @__PURE__ */ new Set());
62
- setHideRuntimeOnly(true);
63
- }, [stack == null ? void 0 : stack.text, process == null ? void 0 : process.pid]);
64
23
  if (!process) {
65
24
  return /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center h-full text-muted-foreground text-sm", children: /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
66
25
  /* @__PURE__ */ jsx(Icon, { icon: UiServerProcess, className: "text-4xl mb-density-2" }),
67
26
  /* @__PURE__ */ jsx("div", { children: "Select a process to view diagnostics" })
68
27
  ] }) });
69
28
  }
29
+ const stack = process.stack_capture;
70
30
  return /* @__PURE__ */ jsxs("div", { className: "h-full min-h-0 flex flex-col gap-density-3 p-density-4", children: [
71
31
  /* @__PURE__ */ jsx(
72
32
  Header,
@@ -81,24 +41,35 @@ function DiagnosticsDetailPanel({
81
41
  runMeta && /* @__PURE__ */ jsx(RunSection, { runMeta }),
82
42
  process.command && /* @__PURE__ */ jsx(PanelSection, { title: "Command", children: /* @__PURE__ */ jsx("pre", { className: "text-xs text-foreground whitespace-pre-wrap font-mono bg-blue-50 dark:bg-blue-500/10 rounded p-2 break-all", children: process.command }) }),
83
43
  /* @__PURE__ */ jsx(PanelSection, { title: "Metrics", children: /* @__PURE__ */ jsx(ProcessMetrics, { process }) }),
84
- /* @__PURE__ */ jsx(PanelSection, { title: "Stack", grow: true, children: /* @__PURE__ */ jsx(
85
- StackBlock,
44
+ /* @__PURE__ */ jsx(PanelSection, { title: "Stack", grow: true, children: (stack == null ? void 0 : stack.text) ? /* @__PURE__ */ jsx(
45
+ StackDumpView,
86
46
  {
87
- process,
88
- parsed,
89
- stateCounts,
90
- filtered,
91
- search,
92
- setSearch,
93
- selectedStates,
94
- setSelectedStates,
95
- hideRuntimeOnly,
96
- setHideRuntimeOnly,
97
- collectBusy: collectBusy ?? false,
47
+ text: stack.text,
48
+ status: stack.status,
98
49
  singleItem: singleItem ?? false,
99
- ...onCollectStack ? { onCollectStack } : {},
50
+ ...stack.error ? { error: stack.error } : {},
51
+ ...stack.collected_at ? { collectedAt: stack.collected_at } : {},
100
52
  ...resolveSource ? { resolveSource } : {},
101
- ...frameActions ? { frameActions } : {}
53
+ ...frameActions ? { frameActions } : {},
54
+ ...onCollectStack && !singleItem ? {
55
+ headerActions: /* @__PURE__ */ jsx(
56
+ CollectButton,
57
+ {
58
+ pid: process.pid,
59
+ busy: collectBusy ?? false,
60
+ onClick: onCollectStack
61
+ }
62
+ )
63
+ } : {}
64
+ },
65
+ process.pid
66
+ ) : /* @__PURE__ */ jsx(
67
+ StackPlaceholder,
68
+ {
69
+ error: stack == null ? void 0 : stack.error,
70
+ busy: collectBusy ?? false,
71
+ pid: process.pid,
72
+ ...onCollectStack ? { onCollectStack } : {}
102
73
  }
103
74
  ) })
104
75
  ] });
@@ -160,207 +131,25 @@ function RunSection({ runMeta }) {
160
131
  )
161
132
  ] }) });
162
133
  }
163
- function stackItemCount(parsed) {
164
- if (parsed.format === "jvm") return parsed.threads.length;
165
- if (parsed.format === "go") return parsed.goroutines.length;
166
- return 0;
167
- }
168
- function stackItemLabel(parsed) {
169
- if (parsed.format === "jvm") return "threads";
170
- if (parsed.format === "go") return "goroutines";
171
- return "frames";
172
- }
173
- function stackStateDot(parsed, state) {
174
- return parsed.format === "jvm" ? threadStateDot(state) : goroutineStateDot(state);
175
- }
176
- function StackBlock(props) {
177
- const {
178
- process,
179
- parsed,
180
- stateCounts,
181
- filtered,
182
- search,
183
- setSearch,
184
- selectedStates,
185
- setSelectedStates,
186
- hideRuntimeOnly,
187
- setHideRuntimeOnly,
188
- collectBusy,
189
- onCollectStack,
190
- resolveSource,
191
- frameActions,
192
- singleItem
193
- } = props;
194
- const stack = process.stack_capture;
195
- if (!(stack == null ? void 0 : stack.text)) {
196
- return /* @__PURE__ */ jsxs("div", { className: "h-full min-h-[14rem] flex flex-col justify-center gap-density-3 p-density-3", children: [
197
- /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
198
- /* @__PURE__ */ jsx(
199
- "div",
200
- {
201
- className: `h-3 w-40 rounded ${collectBusy ? "animate-pulse bg-muted" : "bg-muted/70"}`
202
- }
203
- ),
204
- /* @__PURE__ */ jsx(
205
- "div",
206
- {
207
- className: `h-3 w-full rounded ${collectBusy ? "animate-pulse bg-muted" : "bg-muted/70"}`
208
- }
209
- ),
210
- /* @__PURE__ */ jsx(
211
- "div",
212
- {
213
- className: `h-3 w-5/6 rounded ${collectBusy ? "animate-pulse bg-muted" : "bg-muted/70"}`
214
- }
215
- )
216
- ] }),
217
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-density-3", children: [
218
- /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: (stack == null ? void 0 : stack.error) ? stack.error : collectBusy ? "Collecting stack trace..." : "No stack trace collected yet." }),
219
- onCollectStack && /* @__PURE__ */ jsx(
220
- CollectButton,
221
- {
222
- pid: process.pid,
223
- busy: collectBusy ?? false,
224
- onClick: onCollectStack,
225
- primary: true
226
- }
227
- )
228
- ] })
229
- ] });
230
- }
231
- return /* @__PURE__ */ jsxs("div", { className: "h-full min-h-0 flex flex-col", children: [
232
- !singleItem && /* @__PURE__ */ jsxs("div", { className: "px-1 py-1.5 space-y-density-2", children: [
233
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-density-2 text-[11px] text-muted-foreground flex-wrap", children: [
234
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-density-2 flex-wrap", children: [
235
- /* @__PURE__ */ jsx(StackStatusBadge, { status: stack.status }),
236
- stack.collected_at && /* @__PURE__ */ jsx("span", { children: new Date(stack.collected_at).toLocaleString() }),
237
- stackItemCount(parsed) > 0 && /* @__PURE__ */ jsxs("span", { children: [
238
- filtered.length,
239
- " / ",
240
- stackItemCount(parsed),
241
- " ",
242
- stackItemLabel(parsed)
243
- ] })
244
- ] }),
245
- onCollectStack && /* @__PURE__ */ jsx(CollectButton, { pid: process.pid, busy: collectBusy ?? false, onClick: onCollectStack })
246
- ] }),
247
- stackItemCount(parsed) > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
248
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 flex-wrap", children: [
249
- /* @__PURE__ */ jsxs("div", { className: "relative min-w-[14rem] flex-1", children: [
250
- /* @__PURE__ */ jsx(
251
- Icon,
252
- {
253
- icon: UiSearch,
254
- className: "absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground text-xs"
255
- }
256
- ),
257
- /* @__PURE__ */ jsx(
258
- "input",
259
- {
260
- className: "w-full rounded-md border border-border bg-muted/50 py-1 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background",
261
- placeholder: parsed.format === "jvm" ? "Filter by thread name, function, or file" : "Filter by goroutine id, function, or file",
262
- value: search,
263
- onChange: (e) => setSearch(e.target.value)
264
- }
265
- )
266
- ] }),
267
- /* @__PURE__ */ jsxs("label", { className: "inline-flex items-center gap-1.5 rounded-md border border-border bg-muted/50 px-2 py-1 text-[11px] text-muted-foreground", children: [
268
- /* @__PURE__ */ jsx(
269
- "input",
270
- {
271
- type: "checkbox",
272
- checked: hideRuntimeOnly,
273
- onChange: (e) => setHideRuntimeOnly(e.target.checked)
274
- }
275
- ),
276
- "Hide runtime-only"
277
- ] }),
278
- (search || selectedStates.size > 0 || !hideRuntimeOnly) && /* @__PURE__ */ jsx(
279
- "button",
280
- {
281
- className: "text-[11px] text-muted-foreground hover:text-foreground",
282
- onClick: () => {
283
- setSearch("");
284
- setSelectedStates(() => /* @__PURE__ */ new Set());
285
- setHideRuntimeOnly(true);
286
- },
287
- children: "Clear"
288
- }
289
- )
290
- ] }),
291
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1 flex-wrap", children: Array.from(stateCounts.entries()).sort((a, b) => b[1] - a[1]).map(([state, count]) => {
292
- const active = selectedStates.has(state);
293
- return /* @__PURE__ */ jsxs(
294
- "button",
295
- {
296
- className: `inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] transition-colors ${active ? "border-primary bg-primary/10 text-primary" : "border-border bg-muted/50 text-muted-foreground hover:bg-background"}`,
297
- onClick: () => {
298
- setSelectedStates((prev) => {
299
- const next = new Set(prev);
300
- if (next.has(state)) next.delete(state);
301
- else next.add(state);
302
- return next;
303
- });
304
- },
305
- children: [
306
- /* @__PURE__ */ jsx("span", { className: `h-2 w-2 rounded-full ${stackStateDot(parsed, state)}` }),
307
- state,
308
- /* @__PURE__ */ jsx("span", { className: "text-[10px] opacity-70", children: count })
309
- ]
310
- },
311
- state
312
- );
313
- }) })
314
- ] })
134
+ function StackPlaceholder({
135
+ error,
136
+ busy,
137
+ pid,
138
+ onCollectStack
139
+ }) {
140
+ const bar = busy ? "animate-pulse bg-muted" : "bg-muted/70";
141
+ return /* @__PURE__ */ jsxs("div", { className: "h-full min-h-[14rem] flex flex-col justify-center gap-density-3 p-density-3", children: [
142
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
143
+ /* @__PURE__ */ jsx("div", { className: `h-3 w-40 rounded ${bar}` }),
144
+ /* @__PURE__ */ jsx("div", { className: `h-3 w-full rounded ${bar}` }),
145
+ /* @__PURE__ */ jsx("div", { className: `h-3 w-5/6 rounded ${bar}` })
315
146
  ] }),
316
- stack.error && /* @__PURE__ */ jsx("div", { className: "mt-density-2 text-xs text-red-600 whitespace-pre-wrap", children: stack.error }),
317
- stackItemCount(parsed) === 0 ? /* @__PURE__ */ jsx(
318
- "pre",
319
- {
320
- className: "flex-1 min-h-0 overflow-auto py-1 text-[11px] text-foreground whitespace-pre-wrap font-mono leading-4",
321
- style: { minHeight: STACK_MIN_HEIGHT },
322
- children: stack.text
323
- }
324
- ) : /* @__PURE__ */ jsxs(
325
- "div",
326
- {
327
- className: "flex-1 min-h-0 overflow-auto py-1 space-y-1",
328
- style: { minHeight: STACK_MIN_HEIGHT },
329
- children: [
330
- filtered.length === 0 && /* @__PURE__ */ jsxs("div", { className: "py-density-3 text-center text-xs text-muted-foreground", children: [
331
- "No ",
332
- stackItemLabel(parsed),
333
- " match the current filters."
334
- ] }),
335
- parsed.format === "jvm" && parsed.threads.filter((t) => filtered.includes(t)).map((t) => /* @__PURE__ */ jsx(
336
- ThreadCard,
337
- {
338
- thread: t,
339
- search,
340
- hideRuntimeOnly,
341
- ...resolveSource ? { resolveSource } : {},
342
- ...frameActions ? { frameActions } : {}
343
- },
344
- t.id
345
- )),
346
- parsed.format === "go" && parsed.goroutines.filter((g) => filtered.includes(g)).map((goroutine) => /* @__PURE__ */ jsx(
347
- GoroutineCard,
348
- {
349
- goroutine,
350
- search,
351
- hideRuntimeOnly
352
- },
353
- goroutine.id
354
- ))
355
- ]
356
- }
357
- )
147
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-density-3", children: [
148
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-muted-foreground", children: error ? error : busy ? "Collecting stack trace..." : "No stack trace collected yet." }),
149
+ onCollectStack && /* @__PURE__ */ jsx(CollectButton, { pid, busy, onClick: onCollectStack, primary: true })
150
+ ] })
358
151
  ] });
359
152
  }
360
- function StackStatusBadge({ status }) {
361
- const cls = status === "ready" ? "bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300" : status === "unsupported" ? "bg-yellow-100 text-yellow-700 dark:bg-yellow-500/20 dark:text-yellow-300" : "bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300";
362
- return /* @__PURE__ */ jsx("span", { className: `px-2 py-0.5 rounded-full ${cls}`, children: status });
363
- }
364
153
  function CollectButton({
365
154
  pid,
366
155
  busy,
@@ -435,38 +224,6 @@ function ProcessMetrics({ process }) {
435
224
  )
436
225
  ] });
437
226
  }
438
- function MetricTile({
439
- label,
440
- value,
441
- barPct,
442
- tone = "neutral"
443
- }) {
444
- const toneBar = {
445
- neutral: "bg-muted-foreground/40",
446
- success: "bg-green-500",
447
- warning: "bg-yellow-500",
448
- danger: "bg-red-500",
449
- info: "bg-blue-500"
450
- };
451
- const toneText = {
452
- neutral: "text-foreground",
453
- success: "text-green-600 dark:text-green-400",
454
- warning: "text-yellow-600 dark:text-yellow-400",
455
- danger: "text-red-600 dark:text-red-400",
456
- info: "text-blue-600 dark:text-blue-400"
457
- };
458
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5 rounded-md border border-border bg-background px-density-2 py-1 min-w-0", children: [
459
- /* @__PURE__ */ jsx("span", { className: "text-[9px] uppercase tracking-wide text-muted-foreground leading-none", children: label }),
460
- /* @__PURE__ */ jsx("span", { className: `text-xs font-semibold tabular-nums truncate ${toneText[tone]}`, children: value }),
461
- barPct !== void 0 && /* @__PURE__ */ jsx("div", { className: "h-0.5 w-full rounded-full bg-muted overflow-hidden", children: /* @__PURE__ */ jsx(
462
- "div",
463
- {
464
- className: `h-full ${toneBar[tone]} transition-all duration-300`,
465
- style: { width: `${barPct}%` }
466
- }
467
- ) })
468
- ] });
469
- }
470
227
  export {
471
228
  DiagnosticsDetailPanel
472
229
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DiagnosticsDetailPanel.js","sources":["../../../src/data/diagnostics/DiagnosticsDetailPanel.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport type { GaugeTone } from \"../Gauge\";\nimport { UiDebug, UiDebugSmall, UiRefresh, UiSearch, UiServerProcess, UiLoader } from \"../../icons\";\nimport type { ProcessNode, RunMeta } from \"./types\";\nimport { formatBytes, processLabel, processStateColor, processStateIcon } from \"./utils\";\nimport { countStackByState, parseStackDump, type ParsedStack } from \"./stacktrace\";\nimport { GoroutineCard } from \"./GoroutineCard\";\nimport { ThreadCard } from \"./ThreadCard\";\nimport type { StackFrameActions } from \"./StackFrameRow\";\nimport { goroutineStateDot, threadStateDot } from \"./state-styles\";\nimport type { JvmFrameSourceResolver } from \"./JvmStackTrace\";\n\nconst STACK_MIN_LINES = 10;\nconst STACK_LINE_HEIGHT_REM = 1;\nconst STACK_MIN_HEIGHT = `${STACK_MIN_LINES * STACK_LINE_HEIGHT_REM}rem`;\n\nfunction cpuTone(pct: number): GaugeTone {\n if (pct >= 90) return \"danger\";\n if (pct >= 60) return \"warning\";\n if (pct > 0) return \"success\";\n return \"neutral\";\n}\n\nfunction memoryTone(rss: number | undefined, vms: number | undefined): GaugeTone {\n if (!rss || !vms) return \"neutral\";\n const ratio = rss / vms;\n if (ratio >= 0.9) return \"danger\";\n if (ratio >= 0.6) return \"warning\";\n return \"info\";\n}\n\nexport type DiagnosticsDetailPanelProps = {\n /** Selected process; null renders the empty selection state. */\n process: ProcessNode | null;\n /** Shows loading state while stack capture is being collected. */\n collectBusy?: boolean;\n /** Called when the user requests a fresh stack capture. */\n onCollectStack?: (pid: number) => void | Promise<void>;\n /** Optional run metadata rendered above diagnostics. */\n runMeta?: RunMeta;\n /**\n * Optional resolver that supplies inline source under each JVM stack frame,\n * so the rendered thread dump can be augmented in place (e.g. with decompiled\n * source). A missing class must resolve to undefined, never throw.\n */\n resolveSource?: JvmFrameSourceResolver;\n /**\n * Optional trailing actions rendered on each stack frame, revealed on hover.\n * Lets a host app hang per-frame affordances (trace/watch/decompile) off the\n * rendered thread dump.\n */\n frameActions?: StackFrameActions;\n /**\n * Caller-supplied action buttons rendered right-aligned in the header row,\n * next to the title and Refresh. Use for download/decompile-style actions.\n */\n headerActions?: ReactNode;\n /**\n * The capture holds a single, already-selected item (e.g. one thread the\n * caller picked from its own list). Suppresses the redundant per-item filter\n * UI (search box, state chips, hide-runtime, count) and lifts Refresh into\n * the header row so the detail view shows just that item's frames.\n */\n singleItem?: boolean;\n};\n\nexport function DiagnosticsDetailPanel({\n process,\n collectBusy,\n onCollectStack,\n runMeta,\n resolveSource,\n frameActions,\n headerActions,\n singleItem,\n}: DiagnosticsDetailPanelProps) {\n const [search, setSearch] = useState(\"\");\n const [selectedStates, setSelectedStates] = useState<Set<string>>(new Set());\n const [hideRuntimeOnly, setHideRuntimeOnly] = useState(true);\n const stack = process?.stack_capture;\n const parsed = useMemo<ParsedStack>(() => parseStackDump(stack?.text || \"\"), [stack?.text]);\n const stateCounts = useMemo(() => countStackByState(parsed), [parsed]);\n const filtered = useMemo(() => {\n const needle = search.trim().toLowerCase();\n const items: Array<{\n state: string;\n userFrameCount: number;\n searchText: string;\n }> = parsed.format === \"jvm\" ? parsed.threads : parsed.format === \"go\" ? parsed.goroutines : [];\n if (singleItem) return items;\n return items.filter((item) => {\n if (selectedStates.size > 0 && !selectedStates.has(item.state)) return false;\n if (hideRuntimeOnly && item.userFrameCount === 0) return false;\n if (needle && !item.searchText.includes(needle)) return false;\n return true;\n });\n }, [parsed, search, selectedStates, hideRuntimeOnly, singleItem]);\n\n useEffect(() => {\n setSearch(\"\");\n setSelectedStates(new Set());\n setHideRuntimeOnly(true);\n }, [stack?.text, process?.pid]);\n\n if (!process) {\n return (\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n <div className=\"text-center\">\n <Icon icon={UiServerProcess} className=\"text-4xl mb-density-2\" />\n <div>Select a process to view diagnostics</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col gap-density-3 p-density-4\">\n <Header\n process={process}\n actions={\n <div className=\"flex items-center gap-density-2\">\n {singleItem && onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy ?? false} onClick={onCollectStack} />\n )}\n {headerActions}\n </div>\n }\n />\n {runMeta && <RunSection runMeta={runMeta} />}\n {process.command && (\n <PanelSection title=\"Command\">\n <pre className=\"text-xs text-foreground whitespace-pre-wrap font-mono bg-blue-50 dark:bg-blue-500/10 rounded p-2 break-all\">\n {process.command}\n </pre>\n </PanelSection>\n )}\n\n <PanelSection title=\"Metrics\">\n <ProcessMetrics process={process} />\n </PanelSection>\n\n <PanelSection title=\"Stack\" grow>\n <StackBlock\n process={process}\n parsed={parsed}\n stateCounts={stateCounts}\n filtered={filtered}\n search={search}\n setSearch={setSearch}\n selectedStates={selectedStates}\n setSelectedStates={setSelectedStates}\n hideRuntimeOnly={hideRuntimeOnly}\n setHideRuntimeOnly={setHideRuntimeOnly}\n collectBusy={collectBusy ?? false}\n singleItem={singleItem ?? false}\n {...(onCollectStack ? { onCollectStack } : {})}\n {...(resolveSource ? { resolveSource } : {})}\n {...(frameActions ? { frameActions } : {})}\n />\n </PanelSection>\n </div>\n );\n}\n\nfunction Header({ process, actions }: { process: ProcessNode; actions?: ReactNode }) {\n return (\n <div className=\"flex items-start justify-between gap-density-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <Icon\n icon={process.is_root ? UiServerProcess : UiDebug}\n className=\"text-2xl text-blue-600\"\n />\n <h2 className=\"text-lg font-bold text-foreground break-words\">{processLabel(process)}</h2>\n {process.status ? (\n <span\n className={`inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs ${processStateColor(\n process.status,\n )}`}\n >\n <Icon icon={processStateIcon(process.status)} />\n {process.status}\n </span>\n ) : null}\n </div>\n <div className=\"mt-1 flex items-center gap-density-2 flex-wrap text-xs text-muted-foreground\">\n <span className=\"font-mono\">pid {process.pid}</span>\n {process.ppid ? <span className=\"font-mono\">ppid {process.ppid}</span> : null}\n </div>\n </div>\n {actions ? <div className=\"shrink-0\">{actions}</div> : null}\n </div>\n );\n}\n\nfunction RunSection({ runMeta }: { runMeta: RunMeta }) {\n return (\n <PanelSection title=\"Run\">\n <div className=\"grid grid-cols-2 gap-density-2 text-sm\">\n <InfoTile\n label={runMeta.kind === \"rerun\" ? `Rerun #${runMeta.sequence}` : \"Initial run\"}\n value={runMeta.started ? new Date(runMeta.started).toLocaleString() : \"Unavailable\"}\n />\n <InfoTile\n label=\"Finished\"\n value={runMeta.ended ? new Date(runMeta.ended).toLocaleString() : \"In progress\"}\n />\n </div>\n </PanelSection>\n );\n}\n\ntype StackFilterItem = {\n state: string;\n userFrameCount: number;\n searchText: string;\n};\n\ntype StackBlockProps = {\n process: ProcessNode;\n parsed: ParsedStack;\n stateCounts: Map<string, number>;\n filtered: StackFilterItem[];\n search: string;\n setSearch: (v: string) => void;\n selectedStates: Set<string>;\n setSelectedStates: (updater: (prev: Set<string>) => Set<string>) => void;\n hideRuntimeOnly: boolean;\n setHideRuntimeOnly: (v: boolean) => void;\n collectBusy?: boolean;\n onCollectStack?: (pid: number) => void | Promise<void>;\n resolveSource?: JvmFrameSourceResolver;\n frameActions?: StackFrameActions;\n singleItem?: boolean;\n};\n\nfunction stackItemCount(parsed: ParsedStack): number {\n if (parsed.format === \"jvm\") return parsed.threads.length;\n if (parsed.format === \"go\") return parsed.goroutines.length;\n return 0;\n}\n\nfunction stackItemLabel(parsed: ParsedStack): string {\n if (parsed.format === \"jvm\") return \"threads\";\n if (parsed.format === \"go\") return \"goroutines\";\n return \"frames\";\n}\n\nfunction stackStateDot(parsed: ParsedStack, state: string): string {\n return parsed.format === \"jvm\" ? threadStateDot(state) : goroutineStateDot(state);\n}\n\nfunction StackBlock(props: StackBlockProps) {\n const {\n process,\n parsed,\n stateCounts,\n filtered,\n search,\n setSearch,\n selectedStates,\n setSelectedStates,\n hideRuntimeOnly,\n setHideRuntimeOnly,\n collectBusy,\n onCollectStack,\n resolveSource,\n frameActions,\n singleItem,\n } = props;\n const stack = process.stack_capture;\n\n if (!stack?.text) {\n return (\n <div className=\"h-full min-h-[14rem] flex flex-col justify-center gap-density-3 p-density-3\">\n <div className=\"space-y-1.5\">\n <div\n className={`h-3 w-40 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-full rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n <div\n className={`h-3 w-5/6 rounded ${collectBusy ? \"animate-pulse bg-muted\" : \"bg-muted/70\"}`}\n />\n </div>\n <div className=\"flex items-center justify-between gap-density-3\">\n <div className=\"text-sm text-muted-foreground\">\n {stack?.error\n ? stack.error\n : collectBusy\n ? \"Collecting stack trace...\"\n : \"No stack trace collected yet.\"}\n </div>\n {onCollectStack && (\n <CollectButton\n pid={process.pid}\n busy={collectBusy ?? false}\n onClick={onCollectStack}\n primary\n />\n )}\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full min-h-0 flex flex-col\">\n {!singleItem && (\n <div className=\"px-1 py-1.5 space-y-density-2\">\n <div className=\"flex items-center justify-between gap-density-2 text-[11px] text-muted-foreground flex-wrap\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <StackStatusBadge status={stack.status} />\n {stack.collected_at && <span>{new Date(stack.collected_at).toLocaleString()}</span>}\n {stackItemCount(parsed) > 0 && (\n <span>\n {filtered.length} / {stackItemCount(parsed)} {stackItemLabel(parsed)}\n </span>\n )}\n </div>\n {onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy ?? false} onClick={onCollectStack} />\n )}\n </div>\n {stackItemCount(parsed) > 0 && (\n <>\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <div className=\"relative min-w-[14rem] flex-1\">\n <Icon\n icon={UiSearch}\n className=\"absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground text-xs\"\n />\n <input\n className=\"w-full rounded-md border border-border bg-muted/50 py-1 pl-7 pr-2 text-xs outline-none focus:border-primary focus:bg-background\"\n placeholder={\n parsed.format === \"jvm\"\n ? \"Filter by thread name, function, or file\"\n : \"Filter by goroutine id, function, or file\"\n }\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <label className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-muted/50 px-2 py-1 text-[11px] text-muted-foreground\">\n <input\n type=\"checkbox\"\n checked={hideRuntimeOnly}\n onChange={(e) => setHideRuntimeOnly(e.target.checked)}\n />\n Hide runtime-only\n </label>\n {(search || selectedStates.size > 0 || !hideRuntimeOnly) && (\n <button\n className=\"text-[11px] text-muted-foreground hover:text-foreground\"\n onClick={() => {\n setSearch(\"\");\n setSelectedStates(() => new Set());\n setHideRuntimeOnly(true);\n }}\n >\n Clear\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1 flex-wrap\">\n {Array.from(stateCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([state, count]) => {\n const active = selectedStates.has(state);\n return (\n <button\n key={state}\n className={`inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[11px] transition-colors ${\n active\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border bg-muted/50 text-muted-foreground hover:bg-background\"\n }`}\n onClick={() => {\n setSelectedStates((prev) => {\n const next = new Set(prev);\n if (next.has(state)) next.delete(state);\n else next.add(state);\n return next;\n });\n }}\n >\n <span className={`h-2 w-2 rounded-full ${stackStateDot(parsed, state)}`} />\n {state}\n <span className=\"text-[10px] opacity-70\">{count}</span>\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n )}\n {stack.error && (\n <div className=\"mt-density-2 text-xs text-red-600 whitespace-pre-wrap\">{stack.error}</div>\n )}\n {stackItemCount(parsed) === 0 ? (\n <pre\n className=\"flex-1 min-h-0 overflow-auto py-1 text-[11px] text-foreground whitespace-pre-wrap font-mono leading-4\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {stack.text}\n </pre>\n ) : (\n <div\n className=\"flex-1 min-h-0 overflow-auto py-1 space-y-1\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {filtered.length === 0 && (\n <div className=\"py-density-3 text-center text-xs text-muted-foreground\">\n No {stackItemLabel(parsed)} match the current filters.\n </div>\n )}\n {parsed.format === \"jvm\" &&\n parsed.threads\n .filter((t) => filtered.includes(t))\n .map((t) => (\n <ThreadCard\n key={t.id}\n thread={t}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n {...(resolveSource ? { resolveSource } : {})}\n {...(frameActions ? { frameActions } : {})}\n />\n ))}\n {parsed.format === \"go\" &&\n parsed.goroutines\n .filter((g) => filtered.includes(g))\n .map((goroutine) => (\n <GoroutineCard\n key={goroutine.id}\n goroutine={goroutine}\n search={search}\n hideRuntimeOnly={hideRuntimeOnly}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction StackStatusBadge({ status }: { status: string }) {\n const cls =\n status === \"ready\"\n ? \"bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300\"\n : status === \"unsupported\"\n ? \"bg-yellow-100 text-yellow-700 dark:bg-yellow-500/20 dark:text-yellow-300\"\n : \"bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300\";\n return <span className={`px-2 py-0.5 rounded-full ${cls}`}>{status}</span>;\n}\n\nfunction CollectButton({\n pid,\n busy,\n onClick,\n primary,\n}: {\n pid: number;\n busy?: boolean;\n onClick: (pid: number) => void | Promise<void>;\n primary?: boolean;\n}) {\n const base =\n \"shrink-0 text-[11px] px-2 py-1 rounded disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1\";\n const style = primary\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border border-border text-muted-foreground hover:bg-accent\";\n return (\n <button\n className={`${base} ${style}`}\n onClick={() => onClick(pid)}\n disabled={busy}\n title={primary ? \"Collect the latest stack trace\" : \"Refresh stack trace\"}\n >\n <Icon icon={busy ? UiLoader : primary ? UiDebugSmall : UiRefresh} />\n {busy ? \"Collecting...\" : primary ? \"Collect stack trace\" : \"Refresh\"}\n </button>\n );\n}\n\nfunction PanelSection({\n title,\n grow,\n children,\n}: {\n title: string;\n grow?: boolean;\n children: ReactNode;\n}) {\n return (\n <section className={grow ? \"flex min-h-0 flex-1 flex-col\" : \"\"}>\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground mb-1.5\">\n {title}\n </div>\n {grow ? <div className=\"flex-1 min-h-0 overflow-hidden\">{children}</div> : children}\n </section>\n );\n}\n\nfunction InfoTile({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"border border-border rounded-lg bg-muted/50 px-2.5 py-density-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{label}</div>\n <div className=\"text-xs font-medium text-foreground mt-0.5\">{value}</div>\n </div>\n );\n}\n\nfunction ProcessMetrics({ process }: { process: ProcessNode }) {\n const cpu = process.cpu_percent || 0;\n const rss = process.rss;\n const vms = process.vms;\n const memRatioPct = rss && vms && vms > 0 ? Math.min(100, Math.round((rss / vms) * 100)) : 0;\n return (\n <div className=\"grid grid-cols-4 gap-density-1\">\n <MetricTile\n label=\"CPU\"\n value={`${cpu.toFixed(1)}%`}\n barPct={Math.min(100, cpu)}\n tone={cpuTone(cpu)}\n />\n <MetricTile\n label=\"RSS\"\n value={rss !== undefined ? formatBytes(rss) : \"n/a\"}\n barPct={memRatioPct}\n tone={memoryTone(rss, vms)}\n />\n <MetricTile label=\"VMS\" value={vms !== undefined ? formatBytes(vms) : \"n/a\"} tone=\"neutral\" />\n <MetricTile\n label=\"Files\"\n value={process.open_files !== undefined ? String(process.open_files) : \"n/a\"}\n barPct={process.open_files ? Math.min(100, (process.open_files / 1024) * 100) : 0}\n tone=\"info\"\n />\n </div>\n );\n}\n\nfunction MetricTile({\n label,\n value,\n barPct,\n tone = \"neutral\",\n}: {\n label: string;\n value: string;\n barPct?: number;\n tone?: GaugeTone;\n}) {\n const toneBar: Record<GaugeTone, string> = {\n neutral: \"bg-muted-foreground/40\",\n success: \"bg-green-500\",\n warning: \"bg-yellow-500\",\n danger: \"bg-red-500\",\n info: \"bg-blue-500\",\n };\n const toneText: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n };\n return (\n <div className=\"flex flex-col gap-0.5 rounded-md border border-border bg-background px-density-2 py-1 min-w-0\">\n <span className=\"text-[9px] uppercase tracking-wide text-muted-foreground leading-none\">\n {label}\n </span>\n <span className={`text-xs font-semibold tabular-nums truncate ${toneText[tone]}`}>\n {value}\n </span>\n {barPct !== undefined && (\n <div className=\"h-0.5 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full ${toneBar[tone]} transition-all duration-300`}\n style={{ width: `${barPct}%` }}\n />\n </div>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DiagnosticsDetailPanel.js","sources":["../../../src/data/diagnostics/DiagnosticsDetailPanel.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Icon } from \"../Icon\";\nimport { UiDebug, UiDebugSmall, UiRefresh, UiServerProcess, UiLoader } from \"../../icons\";\nimport type { ProcessNode, RunMeta } from \"./types\";\nimport { formatBytes, processLabel, processStateColor, processStateIcon } from \"./utils\";\nimport type { StackFrameActions } from \"./StackFrameRow\";\nimport type { JvmFrameSourceResolver } from \"./JvmStackTrace\";\nimport { MetricTile } from \"./MetricTile\";\nimport { cpuTone, memoryTone } from \"./metric-tone\";\nimport { StackDumpView } from \"./StackDumpView\";\n\nexport type DiagnosticsDetailPanelProps = {\n /** Selected process; null renders the empty selection state. */\n process: ProcessNode | null;\n /** Shows loading state while stack capture is being collected. */\n collectBusy?: boolean;\n /** Called when the user requests a fresh stack capture. */\n onCollectStack?: (pid: number) => void | Promise<void>;\n /** Optional run metadata rendered above diagnostics. */\n runMeta?: RunMeta;\n /**\n * Optional resolver that supplies inline source under each JVM stack frame,\n * so the rendered thread dump can be augmented in place (e.g. with decompiled\n * source). A missing class must resolve to undefined, never throw.\n */\n resolveSource?: JvmFrameSourceResolver;\n /**\n * Optional trailing actions rendered on each stack frame, revealed on hover.\n * Lets a host app hang per-frame affordances (trace/watch/decompile) off the\n * rendered thread dump.\n */\n frameActions?: StackFrameActions;\n /**\n * Caller-supplied action buttons rendered right-aligned in the header row,\n * next to the title and Refresh. Use for download/decompile-style actions.\n */\n headerActions?: ReactNode;\n /**\n * The capture holds a single, already-selected item (e.g. one thread the\n * caller picked from its own list). Suppresses the redundant per-item filter\n * UI (search box, state chips, hide-runtime, count) and lifts Refresh into\n * the header row so the detail view shows just that item's frames.\n */\n singleItem?: boolean;\n};\n\nexport function DiagnosticsDetailPanel({\n process,\n collectBusy,\n onCollectStack,\n runMeta,\n resolveSource,\n frameActions,\n headerActions,\n singleItem,\n}: DiagnosticsDetailPanelProps) {\n if (!process) {\n return (\n <div className=\"flex items-center justify-center h-full text-muted-foreground text-sm\">\n <div className=\"text-center\">\n <Icon icon={UiServerProcess} className=\"text-4xl mb-density-2\" />\n <div>Select a process to view diagnostics</div>\n </div>\n </div>\n );\n }\n\n const stack = process.stack_capture;\n\n return (\n <div className=\"h-full min-h-0 flex flex-col gap-density-3 p-density-4\">\n <Header\n process={process}\n actions={\n <div className=\"flex items-center gap-density-2\">\n {singleItem && onCollectStack && (\n <CollectButton pid={process.pid} busy={collectBusy ?? false} onClick={onCollectStack} />\n )}\n {headerActions}\n </div>\n }\n />\n {runMeta && <RunSection runMeta={runMeta} />}\n {process.command && (\n <PanelSection title=\"Command\">\n <pre className=\"text-xs text-foreground whitespace-pre-wrap font-mono bg-blue-50 dark:bg-blue-500/10 rounded p-2 break-all\">\n {process.command}\n </pre>\n </PanelSection>\n )}\n\n <PanelSection title=\"Metrics\">\n <ProcessMetrics process={process} />\n </PanelSection>\n\n <PanelSection title=\"Stack\" grow>\n {stack?.text ? (\n <StackDumpView\n key={process.pid}\n text={stack.text}\n status={stack.status}\n singleItem={singleItem ?? false}\n {...(stack.error ? { error: stack.error } : {})}\n {...(stack.collected_at ? { collectedAt: stack.collected_at } : {})}\n {...(resolveSource ? { resolveSource } : {})}\n {...(frameActions ? { frameActions } : {})}\n {...(onCollectStack && !singleItem\n ? {\n headerActions: (\n <CollectButton\n pid={process.pid}\n busy={collectBusy ?? false}\n onClick={onCollectStack}\n />\n ),\n }\n : {})}\n />\n ) : (\n <StackPlaceholder\n error={stack?.error}\n busy={collectBusy ?? false}\n pid={process.pid}\n {...(onCollectStack ? { onCollectStack } : {})}\n />\n )}\n </PanelSection>\n </div>\n );\n}\n\nfunction Header({ process, actions }: { process: ProcessNode; actions?: ReactNode }) {\n return (\n <div className=\"flex items-start justify-between gap-density-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-density-2 flex-wrap\">\n <Icon\n icon={process.is_root ? UiServerProcess : UiDebug}\n className=\"text-2xl text-blue-600\"\n />\n <h2 className=\"text-lg font-bold text-foreground break-words\">{processLabel(process)}</h2>\n {process.status ? (\n <span\n className={`inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs ${processStateColor(\n process.status,\n )}`}\n >\n <Icon icon={processStateIcon(process.status)} />\n {process.status}\n </span>\n ) : null}\n </div>\n <div className=\"mt-1 flex items-center gap-density-2 flex-wrap text-xs text-muted-foreground\">\n <span className=\"font-mono\">pid {process.pid}</span>\n {process.ppid ? <span className=\"font-mono\">ppid {process.ppid}</span> : null}\n </div>\n </div>\n {actions ? <div className=\"shrink-0\">{actions}</div> : null}\n </div>\n );\n}\n\nfunction RunSection({ runMeta }: { runMeta: RunMeta }) {\n return (\n <PanelSection title=\"Run\">\n <div className=\"grid grid-cols-2 gap-density-2 text-sm\">\n <InfoTile\n label={runMeta.kind === \"rerun\" ? `Rerun #${runMeta.sequence}` : \"Initial run\"}\n value={runMeta.started ? new Date(runMeta.started).toLocaleString() : \"Unavailable\"}\n />\n <InfoTile\n label=\"Finished\"\n value={runMeta.ended ? new Date(runMeta.ended).toLocaleString() : \"In progress\"}\n />\n </div>\n </PanelSection>\n );\n}\n\nfunction StackPlaceholder({\n error,\n busy,\n pid,\n onCollectStack,\n}: {\n error: string | undefined;\n busy: boolean;\n pid: number;\n onCollectStack?: (pid: number) => void | Promise<void>;\n}) {\n const bar = busy ? \"animate-pulse bg-muted\" : \"bg-muted/70\";\n return (\n <div className=\"h-full min-h-[14rem] flex flex-col justify-center gap-density-3 p-density-3\">\n <div className=\"space-y-1.5\">\n <div className={`h-3 w-40 rounded ${bar}`} />\n <div className={`h-3 w-full rounded ${bar}`} />\n <div className={`h-3 w-5/6 rounded ${bar}`} />\n </div>\n <div className=\"flex items-center justify-between gap-density-3\">\n <div className=\"text-sm text-muted-foreground\">\n {error ? error : busy ? \"Collecting stack trace...\" : \"No stack trace collected yet.\"}\n </div>\n {onCollectStack && <CollectButton pid={pid} busy={busy} onClick={onCollectStack} primary />}\n </div>\n </div>\n );\n}\n\nfunction CollectButton({\n pid,\n busy,\n onClick,\n primary,\n}: {\n pid: number;\n busy?: boolean;\n onClick: (pid: number) => void | Promise<void>;\n primary?: boolean;\n}) {\n const base =\n \"shrink-0 text-[11px] px-2 py-1 rounded disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1\";\n const style = primary\n ? \"bg-primary text-primary-foreground hover:bg-primary/90\"\n : \"border border-border text-muted-foreground hover:bg-accent\";\n return (\n <button\n className={`${base} ${style}`}\n onClick={() => onClick(pid)}\n disabled={busy}\n title={primary ? \"Collect the latest stack trace\" : \"Refresh stack trace\"}\n >\n <Icon icon={busy ? UiLoader : primary ? UiDebugSmall : UiRefresh} />\n {busy ? \"Collecting...\" : primary ? \"Collect stack trace\" : \"Refresh\"}\n </button>\n );\n}\n\nfunction PanelSection({\n title,\n grow,\n children,\n}: {\n title: string;\n grow?: boolean;\n children: ReactNode;\n}) {\n return (\n <section className={grow ? \"flex min-h-0 flex-1 flex-col\" : \"\"}>\n <div className=\"text-[11px] font-semibold uppercase tracking-wide text-muted-foreground mb-1.5\">\n {title}\n </div>\n {grow ? <div className=\"flex-1 min-h-0 overflow-hidden\">{children}</div> : children}\n </section>\n );\n}\n\nfunction InfoTile({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"border border-border rounded-lg bg-muted/50 px-2.5 py-density-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{label}</div>\n <div className=\"text-xs font-medium text-foreground mt-0.5\">{value}</div>\n </div>\n );\n}\n\nfunction ProcessMetrics({ process }: { process: ProcessNode }) {\n const cpu = process.cpu_percent || 0;\n const rss = process.rss;\n const vms = process.vms;\n const memRatioPct = rss && vms && vms > 0 ? Math.min(100, Math.round((rss / vms) * 100)) : 0;\n return (\n <div className=\"grid grid-cols-4 gap-density-1\">\n <MetricTile\n label=\"CPU\"\n value={`${cpu.toFixed(1)}%`}\n barPct={Math.min(100, cpu)}\n tone={cpuTone(cpu)}\n />\n <MetricTile\n label=\"RSS\"\n value={rss !== undefined ? formatBytes(rss) : \"n/a\"}\n barPct={memRatioPct}\n tone={memoryTone(rss, vms)}\n />\n <MetricTile label=\"VMS\" value={vms !== undefined ? formatBytes(vms) : \"n/a\"} tone=\"neutral\" />\n <MetricTile\n label=\"Files\"\n value={process.open_files !== undefined ? String(process.open_files) : \"n/a\"}\n barPct={process.open_files ? Math.min(100, (process.open_files / 1024) * 100) : 0}\n tone=\"info\"\n />\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const utils = require("../../lib/utils.cjs");
5
+ const toneBar = {
6
+ neutral: "bg-muted-foreground/40",
7
+ success: "bg-green-500",
8
+ warning: "bg-yellow-500",
9
+ danger: "bg-red-500",
10
+ info: "bg-blue-500"
11
+ };
12
+ const toneText = {
13
+ neutral: "text-foreground",
14
+ success: "text-green-600 dark:text-green-400",
15
+ warning: "text-yellow-600 dark:text-yellow-400",
16
+ danger: "text-red-600 dark:text-red-400",
17
+ info: "text-blue-600 dark:text-blue-400"
18
+ };
19
+ function MetricTile({ label, value, barPct, tone = "neutral", className }) {
20
+ return /* @__PURE__ */ jsxRuntime.jsxs(
21
+ "div",
22
+ {
23
+ className: utils.cn(
24
+ "flex min-w-0 flex-col gap-0.5 rounded-md border border-border bg-background px-density-2 py-1",
25
+ className
26
+ ),
27
+ "data-metric": label,
28
+ children: [
29
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[9px] uppercase leading-none tracking-wide text-muted-foreground", children: label }),
30
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: utils.cn("truncate text-xs font-semibold tabular-nums", toneText[tone]), children: value }),
31
+ barPct !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-0.5 w-full overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsxRuntime.jsx(
32
+ "div",
33
+ {
34
+ className: utils.cn("h-full transition-all duration-300", toneBar[tone]),
35
+ style: { width: `${barPct}%` },
36
+ "data-metric-bar": ""
37
+ }
38
+ ) })
39
+ ]
40
+ }
41
+ );
42
+ }
43
+ exports.MetricTile = MetricTile;
44
+ //# sourceMappingURL=MetricTile.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricTile.cjs","sources":["../../../src/data/diagnostics/MetricTile.tsx"],"sourcesContent":["import type { GaugeTone } from \"../Gauge\";\nimport { cn } from \"../../lib/utils\";\n\nexport type MetricTileProps = {\n label: string;\n value: string;\n /** Fill of the bar under the value, 0-100; omit for no bar. */\n barPct?: number;\n /** Colours the value and the bar. Defaults to neutral. */\n tone?: GaugeTone;\n className?: string;\n};\n\nconst toneBar: Record<GaugeTone, string> = {\n neutral: \"bg-muted-foreground/40\",\n success: \"bg-green-500\",\n warning: \"bg-yellow-500\",\n danger: \"bg-red-500\",\n info: \"bg-blue-500\",\n};\n\nconst toneText: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n};\n\n/** A compact labelled value with an optional tone bar, for process and attempt metrics. */\nexport function MetricTile({ label, value, barPct, tone = \"neutral\", className }: MetricTileProps) {\n return (\n <div\n className={cn(\n \"flex min-w-0 flex-col gap-0.5 rounded-md border border-border bg-background px-density-2 py-1\",\n className,\n )}\n data-metric={label}\n >\n <span className=\"text-[9px] uppercase leading-none tracking-wide text-muted-foreground\">{label}</span>\n <span className={cn(\"truncate text-xs font-semibold tabular-nums\", toneText[tone])}>{value}</span>\n {barPct !== undefined && (\n <div className=\"h-0.5 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\"h-full transition-all duration-300\", toneBar[tone])}\n style={{ width: `${barPct}%` }}\n data-metric-bar=\"\"\n />\n </div>\n )}\n </div>\n );\n}\n"],"names":["jsxs","cn","jsx"],"mappings":";;;;AAaA,MAAM,UAAqC;AAAA,EACzC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AACR;AAEA,MAAM,WAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AACR;AAGO,SAAS,WAAW,EAAE,OAAO,OAAO,QAAQ,OAAO,WAAW,aAA8B;AACjG,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,eAAa;AAAA,MAEb,UAAA;AAAA,QAAAC,2BAAAA,IAAC,QAAA,EAAK,WAAU,yEAAyE,UAAA,OAAM;AAAA,QAC/FA,2BAAAA,IAAC,UAAK,WAAWD,SAAG,+CAA+C,SAAS,IAAI,CAAC,GAAI,UAAA,MAAA,CAAM;AAAA,QAC1F,WAAW,UACVC,+BAAC,OAAA,EAAI,WAAU,sDACb,UAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,MAAAA,GAAG,sCAAsC,QAAQ,IAAI,CAAC;AAAA,YACjE,OAAO,EAAE,OAAO,GAAG,MAAM,IAAA;AAAA,YACzB,mBAAgB;AAAA,UAAA;AAAA,QAAA,EAClB,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
@@ -0,0 +1,13 @@
1
+ import { GaugeTone } from '../Gauge.js';
2
+ export type MetricTileProps = {
3
+ label: string;
4
+ value: string;
5
+ /** Fill of the bar under the value, 0-100; omit for no bar. */
6
+ barPct?: number;
7
+ /** Colours the value and the bar. Defaults to neutral. */
8
+ tone?: GaugeTone;
9
+ className?: string;
10
+ };
11
+ /** A compact labelled value with an optional tone bar, for process and attempt metrics. */
12
+ export declare function MetricTile({ label, value, barPct, tone, className }: MetricTileProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=MetricTile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricTile.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/MetricTile.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAkBF,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAgB,EAAE,SAAS,EAAE,EAAE,eAAe,+BAsBhG"}
@@ -0,0 +1,44 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils.js";
3
+ const toneBar = {
4
+ neutral: "bg-muted-foreground/40",
5
+ success: "bg-green-500",
6
+ warning: "bg-yellow-500",
7
+ danger: "bg-red-500",
8
+ info: "bg-blue-500"
9
+ };
10
+ const toneText = {
11
+ neutral: "text-foreground",
12
+ success: "text-green-600 dark:text-green-400",
13
+ warning: "text-yellow-600 dark:text-yellow-400",
14
+ danger: "text-red-600 dark:text-red-400",
15
+ info: "text-blue-600 dark:text-blue-400"
16
+ };
17
+ function MetricTile({ label, value, barPct, tone = "neutral", className }) {
18
+ return /* @__PURE__ */ jsxs(
19
+ "div",
20
+ {
21
+ className: cn(
22
+ "flex min-w-0 flex-col gap-0.5 rounded-md border border-border bg-background px-density-2 py-1",
23
+ className
24
+ ),
25
+ "data-metric": label,
26
+ children: [
27
+ /* @__PURE__ */ jsx("span", { className: "text-[9px] uppercase leading-none tracking-wide text-muted-foreground", children: label }),
28
+ /* @__PURE__ */ jsx("span", { className: cn("truncate text-xs font-semibold tabular-nums", toneText[tone]), children: value }),
29
+ barPct !== void 0 && /* @__PURE__ */ jsx("div", { className: "h-0.5 w-full overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsx(
30
+ "div",
31
+ {
32
+ className: cn("h-full transition-all duration-300", toneBar[tone]),
33
+ style: { width: `${barPct}%` },
34
+ "data-metric-bar": ""
35
+ }
36
+ ) })
37
+ ]
38
+ }
39
+ );
40
+ }
41
+ export {
42
+ MetricTile
43
+ };
44
+ //# sourceMappingURL=MetricTile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricTile.js","sources":["../../../src/data/diagnostics/MetricTile.tsx"],"sourcesContent":["import type { GaugeTone } from \"../Gauge\";\nimport { cn } from \"../../lib/utils\";\n\nexport type MetricTileProps = {\n label: string;\n value: string;\n /** Fill of the bar under the value, 0-100; omit for no bar. */\n barPct?: number;\n /** Colours the value and the bar. Defaults to neutral. */\n tone?: GaugeTone;\n className?: string;\n};\n\nconst toneBar: Record<GaugeTone, string> = {\n neutral: \"bg-muted-foreground/40\",\n success: \"bg-green-500\",\n warning: \"bg-yellow-500\",\n danger: \"bg-red-500\",\n info: \"bg-blue-500\",\n};\n\nconst toneText: Record<GaugeTone, string> = {\n neutral: \"text-foreground\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-yellow-600 dark:text-yellow-400\",\n danger: \"text-red-600 dark:text-red-400\",\n info: \"text-blue-600 dark:text-blue-400\",\n};\n\n/** A compact labelled value with an optional tone bar, for process and attempt metrics. */\nexport function MetricTile({ label, value, barPct, tone = \"neutral\", className }: MetricTileProps) {\n return (\n <div\n className={cn(\n \"flex min-w-0 flex-col gap-0.5 rounded-md border border-border bg-background px-density-2 py-1\",\n className,\n )}\n data-metric={label}\n >\n <span className=\"text-[9px] uppercase leading-none tracking-wide text-muted-foreground\">{label}</span>\n <span className={cn(\"truncate text-xs font-semibold tabular-nums\", toneText[tone])}>{value}</span>\n {barPct !== undefined && (\n <div className=\"h-0.5 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className={cn(\"h-full transition-all duration-300\", toneBar[tone])}\n style={{ width: `${barPct}%` }}\n data-metric-bar=\"\"\n />\n </div>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;AAaA,MAAM,UAAqC;AAAA,EACzC,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AACR;AAEA,MAAM,WAAsC;AAAA,EAC1C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AACR;AAGO,SAAS,WAAW,EAAE,OAAO,OAAO,QAAQ,OAAO,WAAW,aAA8B;AACjG,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,eAAa;AAAA,MAEb,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,yEAAyE,UAAA,OAAM;AAAA,QAC/F,oBAAC,UAAK,WAAW,GAAG,+CAA+C,SAAS,IAAI,CAAC,GAAI,UAAA,MAAA,CAAM;AAAA,QAC1F,WAAW,UACV,oBAAC,OAAA,EAAI,WAAU,sDACb,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW,GAAG,sCAAsC,QAAQ,IAAI,CAAC;AAAA,YACjE,OAAO,EAAE,OAAO,GAAG,MAAM,IAAA;AAAA,YACzB,mBAAgB;AAAA,UAAA;AAAA,QAAA,EAClB,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;"}