@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
@@ -0,0 +1,227 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const Icon = require("../Icon.cjs");
6
+ const GoroutineCard = require("./GoroutineCard.cjs");
7
+ const stateStyles = require("./state-styles.cjs");
8
+ const stacktrace = require("./stacktrace.cjs");
9
+ const ThreadCard = require("./ThreadCard.cjs");
10
+ const UiSearch = require("../../icons/components/UiSearch.cjs");
11
+ const STACK_MIN_LINES = 10;
12
+ const STACK_LINE_HEIGHT_REM = 1;
13
+ const STACK_MIN_HEIGHT = `${STACK_MIN_LINES * STACK_LINE_HEIGHT_REM}rem`;
14
+ const NO_ITEMS = { format: "unknown", goroutines: [], threads: [] };
15
+ function resolveRecords(records) {
16
+ const failed = records.filter((record) => record.error);
17
+ const live = records.filter((record) => !record.error);
18
+ const go = live.filter((record) => record.format === "go");
19
+ const native = live.filter((record) => record.format === "native");
20
+ if (go.length + native.length !== live.length) {
21
+ const odd = live.find((record) => record.format !== "go" && record.format !== "native");
22
+ throw new Error(`stack record ${odd == null ? void 0 : odd.checkpointId} has unknown format "${odd == null ? void 0 : odd.format}"; expected "go" or "native"`);
23
+ }
24
+ if (go.length > 0 && native.length > 0) {
25
+ throw new Error("a stack dump cannot mix Go and native records; pass the records of one checkpoint and one process");
26
+ }
27
+ const first = records[0];
28
+ return {
29
+ parsed: go.length > 0 ? { format: "go", goroutines: stacktrace.goroutinesFromRecords(go) } : NO_ITEMS,
30
+ text: native.map((record) => record.raw).join("\n"),
31
+ ...failed.length > 0 ? { error: failed.map((record) => record.error).join("\n") } : {},
32
+ ...first ? { collectedAt: first.takenAt, reason: first.reason } : {}
33
+ };
34
+ }
35
+ function resolveDump(text, records) {
36
+ if (records) return resolveRecords(records);
37
+ if (text === void 0) throw new Error("StackDumpView needs either text or records");
38
+ return { parsed: stacktrace.parseStackDump(text), text };
39
+ }
40
+ function stackItems(parsed) {
41
+ if (parsed.format === "jvm") return parsed.threads;
42
+ if (parsed.format === "go") return parsed.goroutines;
43
+ return [];
44
+ }
45
+ function stackItemLabel(parsed) {
46
+ if (parsed.format === "jvm") return "threads";
47
+ if (parsed.format === "go") return "goroutines";
48
+ return "frames";
49
+ }
50
+ function stackStateDot(parsed, state) {
51
+ return parsed.format === "jvm" ? stateStyles.threadStateDot(state) : stateStyles.goroutineStateDot(state);
52
+ }
53
+ function StackStatusBadge({ status }) {
54
+ 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";
55
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: `rounded-full px-2 py-0.5 ${cls}`, children: status });
56
+ }
57
+ function StackDumpView({
58
+ text,
59
+ records,
60
+ error: errorProp,
61
+ status,
62
+ collectedAt: collectedAtProp,
63
+ reason: reasonProp,
64
+ singleItem = false,
65
+ frameActions,
66
+ resolveSource,
67
+ headerActions
68
+ }) {
69
+ var _a;
70
+ const [search, setSearch] = react.useState("");
71
+ const [selectedStates, setSelectedStates] = react.useState(/* @__PURE__ */ new Set());
72
+ const [hideRuntimeOnly, setHideRuntimeOnly] = react.useState(true);
73
+ const resolved = react.useMemo(() => resolveDump(text, records), [text, records]);
74
+ const { parsed, text: dumpText } = resolved;
75
+ const error = errorProp ?? resolved.error;
76
+ const collectedAt = collectedAtProp ?? resolved.collectedAt;
77
+ const reason = reasonProp ?? resolved.reason;
78
+ const resetKey = records ? `${(_a = records[0]) == null ? void 0 : _a.checkpointId}|${records.length}` : text;
79
+ const stateCounts = react.useMemo(() => stacktrace.countStackByState(parsed), [parsed]);
80
+ const items = react.useMemo(() => stackItems(parsed), [parsed]);
81
+ const filtered = react.useMemo(() => {
82
+ if (singleItem) return items;
83
+ const needle = search.trim().toLowerCase();
84
+ return items.filter((item) => {
85
+ if (selectedStates.size > 0 && !selectedStates.has(item.state)) return false;
86
+ if (hideRuntimeOnly && item.userFrameCount === 0) return false;
87
+ if (needle && !item.searchText.includes(needle)) return false;
88
+ return true;
89
+ });
90
+ }, [items, search, selectedStates, hideRuntimeOnly, singleItem]);
91
+ react.useEffect(() => {
92
+ setSearch("");
93
+ setSelectedStates(/* @__PURE__ */ new Set());
94
+ setHideRuntimeOnly(true);
95
+ }, [resetKey]);
96
+ const itemCount = items.length;
97
+ const label = stackItemLabel(parsed);
98
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-h-0 flex-col", "data-stack-format": parsed.format, children: [
99
+ !singleItem && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-density-2 px-1 py-1.5", children: [
100
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-between gap-density-2 text-[11px] text-muted-foreground", children: [
101
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-density-2", children: [
102
+ status ? /* @__PURE__ */ jsxRuntime.jsx(StackStatusBadge, { status }) : null,
103
+ collectedAt ? /* @__PURE__ */ jsxRuntime.jsx("span", { children: new Date(collectedAt).toLocaleString() }) : null,
104
+ reason ? /* @__PURE__ */ jsxRuntime.jsx("span", { "data-stack-reason": "", children: reason }) : null,
105
+ itemCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
106
+ filtered.length,
107
+ " / ",
108
+ itemCount,
109
+ " ",
110
+ label
111
+ ] })
112
+ ] }),
113
+ headerActions
114
+ ] }),
115
+ itemCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
116
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
117
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-w-[14rem] flex-1", children: [
118
+ /* @__PURE__ */ jsxRuntime.jsx(
119
+ Icon.Icon,
120
+ {
121
+ icon: UiSearch.UiSearch,
122
+ className: "absolute left-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground"
123
+ }
124
+ ),
125
+ /* @__PURE__ */ jsxRuntime.jsx(
126
+ "input",
127
+ {
128
+ 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",
129
+ "aria-label": `Filter ${label}`,
130
+ placeholder: parsed.format === "jvm" ? "Filter by thread name, function, or file" : "Filter by goroutine id, function, or file",
131
+ value: search,
132
+ onChange: (e) => setSearch(e.target.value)
133
+ }
134
+ )
135
+ ] }),
136
+ /* @__PURE__ */ jsxRuntime.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: [
137
+ /* @__PURE__ */ jsxRuntime.jsx(
138
+ "input",
139
+ {
140
+ type: "checkbox",
141
+ checked: hideRuntimeOnly,
142
+ onChange: (e) => setHideRuntimeOnly(e.target.checked)
143
+ }
144
+ ),
145
+ "Hide runtime-only"
146
+ ] }),
147
+ (search || selectedStates.size > 0 || !hideRuntimeOnly) && /* @__PURE__ */ jsxRuntime.jsx(
148
+ "button",
149
+ {
150
+ type: "button",
151
+ className: "text-[11px] text-muted-foreground hover:text-foreground",
152
+ onClick: () => {
153
+ setSearch("");
154
+ setSelectedStates(/* @__PURE__ */ new Set());
155
+ setHideRuntimeOnly(true);
156
+ },
157
+ children: "Clear"
158
+ }
159
+ )
160
+ ] }),
161
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-1", children: Array.from(stateCounts.entries()).sort((a, b) => b[1] - a[1]).map(([state, count]) => {
162
+ const active = selectedStates.has(state);
163
+ return /* @__PURE__ */ jsxRuntime.jsxs(
164
+ "button",
165
+ {
166
+ type: "button",
167
+ "aria-pressed": active,
168
+ 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"}`,
169
+ onClick: () => {
170
+ setSelectedStates((prev) => {
171
+ const next = new Set(prev);
172
+ if (next.has(state)) next.delete(state);
173
+ else next.add(state);
174
+ return next;
175
+ });
176
+ },
177
+ children: [
178
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: `h-2 w-2 rounded-full ${stackStateDot(parsed, state)}` }),
179
+ state,
180
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] opacity-70", children: count })
181
+ ]
182
+ },
183
+ state
184
+ );
185
+ }) })
186
+ ] })
187
+ ] }),
188
+ singleItem && headerActions ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex justify-end px-1 py-1.5", children: headerActions }) : null,
189
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-density-2 whitespace-pre-wrap text-xs text-red-600", children: error }),
190
+ itemCount === 0 ? dumpText ? /* @__PURE__ */ jsxRuntime.jsx(
191
+ "pre",
192
+ {
193
+ className: "min-h-0 flex-1 overflow-auto whitespace-pre-wrap py-1 font-mono text-[11px] leading-4 text-foreground",
194
+ style: { minHeight: STACK_MIN_HEIGHT },
195
+ children: dumpText
196
+ }
197
+ ) : null : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-h-0 flex-1 space-y-1 overflow-auto py-1", style: { minHeight: STACK_MIN_HEIGHT }, children: [
198
+ filtered.length === 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "py-density-3 text-center text-xs text-muted-foreground", children: [
199
+ "No ",
200
+ label,
201
+ " match the current filters."
202
+ ] }),
203
+ parsed.format === "jvm" && parsed.threads.filter((t) => filtered.includes(t)).map((t) => /* @__PURE__ */ jsxRuntime.jsx(
204
+ ThreadCard.ThreadCard,
205
+ {
206
+ thread: t,
207
+ search,
208
+ hideRuntimeOnly,
209
+ ...resolveSource ? { resolveSource } : {},
210
+ ...frameActions ? { frameActions } : {}
211
+ },
212
+ t.id
213
+ )),
214
+ parsed.format === "go" && parsed.goroutines.filter((g) => filtered.includes(g)).map((goroutine) => /* @__PURE__ */ jsxRuntime.jsx(
215
+ GoroutineCard.GoroutineCard,
216
+ {
217
+ goroutine,
218
+ search,
219
+ hideRuntimeOnly
220
+ },
221
+ goroutine.id
222
+ ))
223
+ ] })
224
+ ] });
225
+ }
226
+ exports.StackDumpView = StackDumpView;
227
+ //# sourceMappingURL=StackDumpView.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StackDumpView.cjs","sources":["../../../src/data/diagnostics/StackDumpView.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { UiSearch } from \"../../icons\";\nimport { Icon } from \"../Icon\";\nimport type { StackRecord } from \"../traces/types\";\nimport { GoroutineCard } from \"./GoroutineCard\";\nimport type { JvmFrameSourceResolver } from \"./JvmStackTrace\";\nimport type { StackFrameActions } from \"./StackFrameRow\";\nimport { goroutineStateDot, threadStateDot } from \"./state-styles\";\nimport { countStackByState, goroutinesFromRecords, parseStackDump, type ParsedStack } from \"./stacktrace\";\nimport { ThreadCard } from \"./ThreadCard\";\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\n/**\n * What the view shows: a raw dump as text (Go goroutines, a JVM thread dump, or\n * any text, shown as is), or the `stacks` records of one dump, which are rendered\n * as they are without parsing any text. Pass exactly one.\n */\ntype StackDumpSource =\n | { text: string; records?: never }\n | {\n /**\n * The records of one checkpoint of one process: Go goroutine records, a native\n * dump record (its raw text is shown), or a failed dump's record (its error is\n * shown). Keep the array referentially stable while the checkpoint is shown.\n */\n records: StackRecord[];\n text?: never;\n };\n\nexport type StackDumpViewProps = StackDumpSource & {\n /** Capture error, shown above the dump. Overrides the error of a failed record. */\n error?: string;\n /** Capture status, drawn as a badge in the meta row. */\n status?: \"ready\" | \"unsupported\" | \"error\" | (string & {});\n /** When the dump was collected (ISO timestamp), shown in the meta row. Defaults to the records' `takenAt`. */\n collectedAt?: string;\n /** Why it was collected (for example a watchdog checkpoint), shown beside the time. Defaults to the records' `reason`. */\n reason?: string;\n /**\n * The dump holds one, already-selected item. Suppresses the per-item filter\n * UI (search, state chips, hide-runtime, count) and the meta row.\n */\n singleItem?: boolean;\n /** Trailing actions on each JVM stack frame, revealed on hover. */\n frameActions?: StackFrameActions;\n /** Supplies inline source under each JVM frame; a missing class must resolve to undefined. */\n resolveSource?: JvmFrameSourceResolver;\n /** Right-aligned actions in the meta row (for example a Collect / Refresh button). */\n headerActions?: ReactNode;\n};\n\ntype ResolvedDump = { parsed: ParsedStack; text: string; error?: string; collectedAt?: string; reason?: string };\n\nconst NO_ITEMS: ParsedStack = { format: \"unknown\", goroutines: [], threads: [] };\n\nfunction resolveRecords(records: StackRecord[]): ResolvedDump {\n const failed = records.filter((record) => record.error);\n const live = records.filter((record) => !record.error);\n const go = live.filter((record) => record.format === \"go\");\n const native = live.filter((record) => record.format === \"native\");\n if (go.length + native.length !== live.length) {\n const odd = live.find((record) => record.format !== \"go\" && record.format !== \"native\");\n throw new Error(`stack record ${odd?.checkpointId} has unknown format \"${odd?.format}\"; expected \"go\" or \"native\"`);\n }\n if (go.length > 0 && native.length > 0) {\n throw new Error(\"a stack dump cannot mix Go and native records; pass the records of one checkpoint and one process\");\n }\n const first = records[0];\n return {\n parsed: go.length > 0 ? { format: \"go\", goroutines: goroutinesFromRecords(go) } : NO_ITEMS,\n text: native.map((record) => record.raw).join(\"\\n\"),\n ...(failed.length > 0 ? { error: failed.map((record) => record.error).join(\"\\n\") } : {}),\n ...(first ? { collectedAt: first.takenAt, reason: first.reason } : {}),\n };\n}\n\nfunction resolveDump(text: string | undefined, records: StackRecord[] | undefined): ResolvedDump {\n if (records) return resolveRecords(records);\n if (text === undefined) throw new Error(\"StackDumpView needs either text or records\");\n return { parsed: parseStackDump(text), text };\n}\n\ntype StackFilterItem = {\n state: string;\n userFrameCount: number;\n searchText: string;\n};\n\nfunction stackItems(parsed: ParsedStack): StackFilterItem[] {\n if (parsed.format === \"jvm\") return parsed.threads;\n if (parsed.format === \"go\") return parsed.goroutines;\n return [];\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 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={`rounded-full px-2 py-0.5 ${cls}`}>{status}</span>;\n}\n\n/**\n * A captured stack dump: Go goroutines or JVM threads as searchable cards with\n * state chips and a hide-runtime-only toggle, or the raw text when the format\n * is not recognised. Takes either the raw `text` of a dump, which it parses, or\n * the `stacks` `records` of one dump, which it renders directly (Go goroutine\n * records as cards, a native dump's raw text, a failed dump's error). Filter\n * state resets whenever the text or the records' checkpoint changes.\n */\nexport function StackDumpView({\n text,\n records,\n error: errorProp,\n status,\n collectedAt: collectedAtProp,\n reason: reasonProp,\n singleItem = false,\n frameActions,\n resolveSource,\n headerActions,\n}: StackDumpViewProps) {\n const [search, setSearch] = useState(\"\");\n const [selectedStates, setSelectedStates] = useState<Set<string>>(new Set());\n const [hideRuntimeOnly, setHideRuntimeOnly] = useState(true);\n const resolved = useMemo(() => resolveDump(text, records), [text, records]);\n const { parsed, text: dumpText } = resolved;\n const error = errorProp ?? resolved.error;\n const collectedAt = collectedAtProp ?? resolved.collectedAt;\n const reason = reasonProp ?? resolved.reason;\n const resetKey = records ? `${records[0]?.checkpointId}|${records.length}` : text;\n const stateCounts = useMemo(() => countStackByState(parsed), [parsed]);\n const items = useMemo(() => stackItems(parsed), [parsed]);\n const filtered = useMemo(() => {\n if (singleItem) return items;\n const needle = search.trim().toLowerCase();\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 }, [items, search, selectedStates, hideRuntimeOnly, singleItem]);\n\n useEffect(() => {\n setSearch(\"\");\n setSelectedStates(new Set());\n setHideRuntimeOnly(true);\n }, [resetKey]);\n\n const itemCount = items.length;\n const label = stackItemLabel(parsed);\n\n return (\n <div className=\"flex h-full min-h-0 flex-col\" data-stack-format={parsed.format}>\n {!singleItem && (\n <div className=\"space-y-density-2 px-1 py-1.5\">\n <div className=\"flex flex-wrap items-center justify-between gap-density-2 text-[11px] text-muted-foreground\">\n <div className=\"flex flex-wrap items-center gap-density-2\">\n {status ? <StackStatusBadge status={status} /> : null}\n {collectedAt ? <span>{new Date(collectedAt).toLocaleString()}</span> : null}\n {reason ? <span data-stack-reason=\"\">{reason}</span> : null}\n {itemCount > 0 && (\n <span>\n {filtered.length} / {itemCount} {label}\n </span>\n )}\n </div>\n {headerActions}\n </div>\n {itemCount > 0 && (\n <>\n <div className=\"flex flex-wrap items-center gap-1.5\">\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-xs text-muted-foreground\"\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 aria-label={`Filter ${label}`}\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 type=\"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 flex-wrap items-center gap-1\">\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 type=\"button\"\n key={state}\n aria-pressed={active}\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 {singleItem && headerActions ? (\n <div className=\"flex justify-end px-1 py-1.5\">{headerActions}</div>\n ) : null}\n {error && <div className=\"mt-density-2 whitespace-pre-wrap text-xs text-red-600\">{error}</div>}\n {itemCount === 0 ? (\n dumpText ? (\n <pre\n className=\"min-h-0 flex-1 overflow-auto whitespace-pre-wrap py-1 font-mono text-[11px] leading-4 text-foreground\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {dumpText}\n </pre>\n ) : null\n ) : (\n <div className=\"min-h-0 flex-1 space-y-1 overflow-auto py-1\" style={{ minHeight: STACK_MIN_HEIGHT }}>\n {filtered.length === 0 && (\n <div className=\"py-density-3 text-center text-xs text-muted-foreground\">\n No {label} 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"],"names":["goroutinesFromRecords","parseStackDump","threadStateDot","goroutineStateDot","useState","useMemo","countStackByState","useEffect","jsxs","jsx","Fragment","Icon","UiSearch","ThreadCard","GoroutineCard"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { ReactNode } from 'react';
2
+ import { StackRecord } from '../traces/types.js';
3
+ import { JvmFrameSourceResolver } from './JvmStackTrace.js';
4
+ import { StackFrameActions } from './StackFrameRow.js';
5
+ /**
6
+ * What the view shows: a raw dump as text (Go goroutines, a JVM thread dump, or
7
+ * any text, shown as is), or the `stacks` records of one dump, which are rendered
8
+ * as they are without parsing any text. Pass exactly one.
9
+ */
10
+ type StackDumpSource = {
11
+ text: string;
12
+ records?: never;
13
+ } | {
14
+ /**
15
+ * The records of one checkpoint of one process: Go goroutine records, a native
16
+ * dump record (its raw text is shown), or a failed dump's record (its error is
17
+ * shown). Keep the array referentially stable while the checkpoint is shown.
18
+ */
19
+ records: StackRecord[];
20
+ text?: never;
21
+ };
22
+ export type StackDumpViewProps = StackDumpSource & {
23
+ /** Capture error, shown above the dump. Overrides the error of a failed record. */
24
+ error?: string;
25
+ /** Capture status, drawn as a badge in the meta row. */
26
+ status?: "ready" | "unsupported" | "error" | (string & {});
27
+ /** When the dump was collected (ISO timestamp), shown in the meta row. Defaults to the records' `takenAt`. */
28
+ collectedAt?: string;
29
+ /** Why it was collected (for example a watchdog checkpoint), shown beside the time. Defaults to the records' `reason`. */
30
+ reason?: string;
31
+ /**
32
+ * The dump holds one, already-selected item. Suppresses the per-item filter
33
+ * UI (search, state chips, hide-runtime, count) and the meta row.
34
+ */
35
+ singleItem?: boolean;
36
+ /** Trailing actions on each JVM stack frame, revealed on hover. */
37
+ frameActions?: StackFrameActions;
38
+ /** Supplies inline source under each JVM frame; a missing class must resolve to undefined. */
39
+ resolveSource?: JvmFrameSourceResolver;
40
+ /** Right-aligned actions in the meta row (for example a Collect / Refresh button). */
41
+ headerActions?: ReactNode;
42
+ };
43
+ /**
44
+ * A captured stack dump: Go goroutines or JVM threads as searchable cards with
45
+ * state chips and a hide-runtime-only toggle, or the raw text when the format
46
+ * is not recognised. Takes either the raw `text` of a dump, which it parses, or
47
+ * the `stacks` `records` of one dump, which it renders directly (Go goroutine
48
+ * records as cards, a native dump's raw text, a failed dump's error). Filter
49
+ * state resets whenever the text or the records' checkpoint changes.
50
+ */
51
+ export declare function StackDumpView({ text, records, error: errorProp, status, collectedAt: collectedAtProp, reason: reasonProp, singleItem, frameActions, resolveSource, headerActions, }: StackDumpViewProps): import("react").JSX.Element;
52
+ export {};
53
+ //# sourceMappingURL=StackDumpView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StackDumpView.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/StackDumpView.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AASzD;;;;GAIG;AACH,KAAK,eAAe,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,KAAK,CAAA;CAAE,GACjC;IACE;;;;OAIG;IACH,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC;CACd,CAAC;AAEN,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG;IACjD,mFAAmF;IACnF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,MAAM,CAAC,EAAE,OAAO,GAAG,aAAa,GAAG,OAAO,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC3D,8GAA8G;IAC9G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0HAA0H;IAC1H,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mEAAmE;IACnE,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,8FAA8F;IAC9F,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,sFAAsF;IACtF,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B,CAAC;AAiEF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAC5B,IAAI,EACJ,OAAO,EACP,KAAK,EAAE,SAAS,EAChB,MAAM,EACN,WAAW,EAAE,eAAe,EAC5B,MAAM,EAAE,UAAU,EAClB,UAAkB,EAClB,YAAY,EACZ,aAAa,EACb,aAAa,GACd,EAAE,kBAAkB,+BA8KpB"}
@@ -0,0 +1,227 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { useState, useMemo, useEffect } from "react";
3
+ import { Icon } from "../Icon.js";
4
+ import { GoroutineCard } from "./GoroutineCard.js";
5
+ import { threadStateDot, goroutineStateDot } from "./state-styles.js";
6
+ import { countStackByState, parseStackDump, goroutinesFromRecords } from "./stacktrace.js";
7
+ import { ThreadCard } from "./ThreadCard.js";
8
+ import { UiSearch } from "../../icons/components/UiSearch.js";
9
+ const STACK_MIN_LINES = 10;
10
+ const STACK_LINE_HEIGHT_REM = 1;
11
+ const STACK_MIN_HEIGHT = `${STACK_MIN_LINES * STACK_LINE_HEIGHT_REM}rem`;
12
+ const NO_ITEMS = { format: "unknown", goroutines: [], threads: [] };
13
+ function resolveRecords(records) {
14
+ const failed = records.filter((record) => record.error);
15
+ const live = records.filter((record) => !record.error);
16
+ const go = live.filter((record) => record.format === "go");
17
+ const native = live.filter((record) => record.format === "native");
18
+ if (go.length + native.length !== live.length) {
19
+ const odd = live.find((record) => record.format !== "go" && record.format !== "native");
20
+ throw new Error(`stack record ${odd == null ? void 0 : odd.checkpointId} has unknown format "${odd == null ? void 0 : odd.format}"; expected "go" or "native"`);
21
+ }
22
+ if (go.length > 0 && native.length > 0) {
23
+ throw new Error("a stack dump cannot mix Go and native records; pass the records of one checkpoint and one process");
24
+ }
25
+ const first = records[0];
26
+ return {
27
+ parsed: go.length > 0 ? { format: "go", goroutines: goroutinesFromRecords(go) } : NO_ITEMS,
28
+ text: native.map((record) => record.raw).join("\n"),
29
+ ...failed.length > 0 ? { error: failed.map((record) => record.error).join("\n") } : {},
30
+ ...first ? { collectedAt: first.takenAt, reason: first.reason } : {}
31
+ };
32
+ }
33
+ function resolveDump(text, records) {
34
+ if (records) return resolveRecords(records);
35
+ if (text === void 0) throw new Error("StackDumpView needs either text or records");
36
+ return { parsed: parseStackDump(text), text };
37
+ }
38
+ function stackItems(parsed) {
39
+ if (parsed.format === "jvm") return parsed.threads;
40
+ if (parsed.format === "go") return parsed.goroutines;
41
+ return [];
42
+ }
43
+ function stackItemLabel(parsed) {
44
+ if (parsed.format === "jvm") return "threads";
45
+ if (parsed.format === "go") return "goroutines";
46
+ return "frames";
47
+ }
48
+ function stackStateDot(parsed, state) {
49
+ return parsed.format === "jvm" ? threadStateDot(state) : goroutineStateDot(state);
50
+ }
51
+ function StackStatusBadge({ status }) {
52
+ 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";
53
+ return /* @__PURE__ */ jsx("span", { className: `rounded-full px-2 py-0.5 ${cls}`, children: status });
54
+ }
55
+ function StackDumpView({
56
+ text,
57
+ records,
58
+ error: errorProp,
59
+ status,
60
+ collectedAt: collectedAtProp,
61
+ reason: reasonProp,
62
+ singleItem = false,
63
+ frameActions,
64
+ resolveSource,
65
+ headerActions
66
+ }) {
67
+ var _a;
68
+ const [search, setSearch] = useState("");
69
+ const [selectedStates, setSelectedStates] = useState(/* @__PURE__ */ new Set());
70
+ const [hideRuntimeOnly, setHideRuntimeOnly] = useState(true);
71
+ const resolved = useMemo(() => resolveDump(text, records), [text, records]);
72
+ const { parsed, text: dumpText } = resolved;
73
+ const error = errorProp ?? resolved.error;
74
+ const collectedAt = collectedAtProp ?? resolved.collectedAt;
75
+ const reason = reasonProp ?? resolved.reason;
76
+ const resetKey = records ? `${(_a = records[0]) == null ? void 0 : _a.checkpointId}|${records.length}` : text;
77
+ const stateCounts = useMemo(() => countStackByState(parsed), [parsed]);
78
+ const items = useMemo(() => stackItems(parsed), [parsed]);
79
+ const filtered = useMemo(() => {
80
+ if (singleItem) return items;
81
+ const needle = search.trim().toLowerCase();
82
+ return items.filter((item) => {
83
+ if (selectedStates.size > 0 && !selectedStates.has(item.state)) return false;
84
+ if (hideRuntimeOnly && item.userFrameCount === 0) return false;
85
+ if (needle && !item.searchText.includes(needle)) return false;
86
+ return true;
87
+ });
88
+ }, [items, search, selectedStates, hideRuntimeOnly, singleItem]);
89
+ useEffect(() => {
90
+ setSearch("");
91
+ setSelectedStates(/* @__PURE__ */ new Set());
92
+ setHideRuntimeOnly(true);
93
+ }, [resetKey]);
94
+ const itemCount = items.length;
95
+ const label = stackItemLabel(parsed);
96
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-full min-h-0 flex-col", "data-stack-format": parsed.format, children: [
97
+ !singleItem && /* @__PURE__ */ jsxs("div", { className: "space-y-density-2 px-1 py-1.5", children: [
98
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-density-2 text-[11px] text-muted-foreground", children: [
99
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-density-2", children: [
100
+ status ? /* @__PURE__ */ jsx(StackStatusBadge, { status }) : null,
101
+ collectedAt ? /* @__PURE__ */ jsx("span", { children: new Date(collectedAt).toLocaleString() }) : null,
102
+ reason ? /* @__PURE__ */ jsx("span", { "data-stack-reason": "", children: reason }) : null,
103
+ itemCount > 0 && /* @__PURE__ */ jsxs("span", { children: [
104
+ filtered.length,
105
+ " / ",
106
+ itemCount,
107
+ " ",
108
+ label
109
+ ] })
110
+ ] }),
111
+ headerActions
112
+ ] }),
113
+ itemCount > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
114
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
115
+ /* @__PURE__ */ jsxs("div", { className: "relative min-w-[14rem] flex-1", children: [
116
+ /* @__PURE__ */ jsx(
117
+ Icon,
118
+ {
119
+ icon: UiSearch,
120
+ className: "absolute left-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground"
121
+ }
122
+ ),
123
+ /* @__PURE__ */ jsx(
124
+ "input",
125
+ {
126
+ 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",
127
+ "aria-label": `Filter ${label}`,
128
+ placeholder: parsed.format === "jvm" ? "Filter by thread name, function, or file" : "Filter by goroutine id, function, or file",
129
+ value: search,
130
+ onChange: (e) => setSearch(e.target.value)
131
+ }
132
+ )
133
+ ] }),
134
+ /* @__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: [
135
+ /* @__PURE__ */ jsx(
136
+ "input",
137
+ {
138
+ type: "checkbox",
139
+ checked: hideRuntimeOnly,
140
+ onChange: (e) => setHideRuntimeOnly(e.target.checked)
141
+ }
142
+ ),
143
+ "Hide runtime-only"
144
+ ] }),
145
+ (search || selectedStates.size > 0 || !hideRuntimeOnly) && /* @__PURE__ */ jsx(
146
+ "button",
147
+ {
148
+ type: "button",
149
+ className: "text-[11px] text-muted-foreground hover:text-foreground",
150
+ onClick: () => {
151
+ setSearch("");
152
+ setSelectedStates(/* @__PURE__ */ new Set());
153
+ setHideRuntimeOnly(true);
154
+ },
155
+ children: "Clear"
156
+ }
157
+ )
158
+ ] }),
159
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-1", children: Array.from(stateCounts.entries()).sort((a, b) => b[1] - a[1]).map(([state, count]) => {
160
+ const active = selectedStates.has(state);
161
+ return /* @__PURE__ */ jsxs(
162
+ "button",
163
+ {
164
+ type: "button",
165
+ "aria-pressed": active,
166
+ 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"}`,
167
+ onClick: () => {
168
+ setSelectedStates((prev) => {
169
+ const next = new Set(prev);
170
+ if (next.has(state)) next.delete(state);
171
+ else next.add(state);
172
+ return next;
173
+ });
174
+ },
175
+ children: [
176
+ /* @__PURE__ */ jsx("span", { className: `h-2 w-2 rounded-full ${stackStateDot(parsed, state)}` }),
177
+ state,
178
+ /* @__PURE__ */ jsx("span", { className: "text-[10px] opacity-70", children: count })
179
+ ]
180
+ },
181
+ state
182
+ );
183
+ }) })
184
+ ] })
185
+ ] }),
186
+ singleItem && headerActions ? /* @__PURE__ */ jsx("div", { className: "flex justify-end px-1 py-1.5", children: headerActions }) : null,
187
+ error && /* @__PURE__ */ jsx("div", { className: "mt-density-2 whitespace-pre-wrap text-xs text-red-600", children: error }),
188
+ itemCount === 0 ? dumpText ? /* @__PURE__ */ jsx(
189
+ "pre",
190
+ {
191
+ className: "min-h-0 flex-1 overflow-auto whitespace-pre-wrap py-1 font-mono text-[11px] leading-4 text-foreground",
192
+ style: { minHeight: STACK_MIN_HEIGHT },
193
+ children: dumpText
194
+ }
195
+ ) : null : /* @__PURE__ */ jsxs("div", { className: "min-h-0 flex-1 space-y-1 overflow-auto py-1", style: { minHeight: STACK_MIN_HEIGHT }, children: [
196
+ filtered.length === 0 && /* @__PURE__ */ jsxs("div", { className: "py-density-3 text-center text-xs text-muted-foreground", children: [
197
+ "No ",
198
+ label,
199
+ " match the current filters."
200
+ ] }),
201
+ parsed.format === "jvm" && parsed.threads.filter((t) => filtered.includes(t)).map((t) => /* @__PURE__ */ jsx(
202
+ ThreadCard,
203
+ {
204
+ thread: t,
205
+ search,
206
+ hideRuntimeOnly,
207
+ ...resolveSource ? { resolveSource } : {},
208
+ ...frameActions ? { frameActions } : {}
209
+ },
210
+ t.id
211
+ )),
212
+ parsed.format === "go" && parsed.goroutines.filter((g) => filtered.includes(g)).map((goroutine) => /* @__PURE__ */ jsx(
213
+ GoroutineCard,
214
+ {
215
+ goroutine,
216
+ search,
217
+ hideRuntimeOnly
218
+ },
219
+ goroutine.id
220
+ ))
221
+ ] })
222
+ ] });
223
+ }
224
+ export {
225
+ StackDumpView
226
+ };
227
+ //# sourceMappingURL=StackDumpView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StackDumpView.js","sources":["../../../src/data/diagnostics/StackDumpView.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { UiSearch } from \"../../icons\";\nimport { Icon } from \"../Icon\";\nimport type { StackRecord } from \"../traces/types\";\nimport { GoroutineCard } from \"./GoroutineCard\";\nimport type { JvmFrameSourceResolver } from \"./JvmStackTrace\";\nimport type { StackFrameActions } from \"./StackFrameRow\";\nimport { goroutineStateDot, threadStateDot } from \"./state-styles\";\nimport { countStackByState, goroutinesFromRecords, parseStackDump, type ParsedStack } from \"./stacktrace\";\nimport { ThreadCard } from \"./ThreadCard\";\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\n/**\n * What the view shows: a raw dump as text (Go goroutines, a JVM thread dump, or\n * any text, shown as is), or the `stacks` records of one dump, which are rendered\n * as they are without parsing any text. Pass exactly one.\n */\ntype StackDumpSource =\n | { text: string; records?: never }\n | {\n /**\n * The records of one checkpoint of one process: Go goroutine records, a native\n * dump record (its raw text is shown), or a failed dump's record (its error is\n * shown). Keep the array referentially stable while the checkpoint is shown.\n */\n records: StackRecord[];\n text?: never;\n };\n\nexport type StackDumpViewProps = StackDumpSource & {\n /** Capture error, shown above the dump. Overrides the error of a failed record. */\n error?: string;\n /** Capture status, drawn as a badge in the meta row. */\n status?: \"ready\" | \"unsupported\" | \"error\" | (string & {});\n /** When the dump was collected (ISO timestamp), shown in the meta row. Defaults to the records' `takenAt`. */\n collectedAt?: string;\n /** Why it was collected (for example a watchdog checkpoint), shown beside the time. Defaults to the records' `reason`. */\n reason?: string;\n /**\n * The dump holds one, already-selected item. Suppresses the per-item filter\n * UI (search, state chips, hide-runtime, count) and the meta row.\n */\n singleItem?: boolean;\n /** Trailing actions on each JVM stack frame, revealed on hover. */\n frameActions?: StackFrameActions;\n /** Supplies inline source under each JVM frame; a missing class must resolve to undefined. */\n resolveSource?: JvmFrameSourceResolver;\n /** Right-aligned actions in the meta row (for example a Collect / Refresh button). */\n headerActions?: ReactNode;\n};\n\ntype ResolvedDump = { parsed: ParsedStack; text: string; error?: string; collectedAt?: string; reason?: string };\n\nconst NO_ITEMS: ParsedStack = { format: \"unknown\", goroutines: [], threads: [] };\n\nfunction resolveRecords(records: StackRecord[]): ResolvedDump {\n const failed = records.filter((record) => record.error);\n const live = records.filter((record) => !record.error);\n const go = live.filter((record) => record.format === \"go\");\n const native = live.filter((record) => record.format === \"native\");\n if (go.length + native.length !== live.length) {\n const odd = live.find((record) => record.format !== \"go\" && record.format !== \"native\");\n throw new Error(`stack record ${odd?.checkpointId} has unknown format \"${odd?.format}\"; expected \"go\" or \"native\"`);\n }\n if (go.length > 0 && native.length > 0) {\n throw new Error(\"a stack dump cannot mix Go and native records; pass the records of one checkpoint and one process\");\n }\n const first = records[0];\n return {\n parsed: go.length > 0 ? { format: \"go\", goroutines: goroutinesFromRecords(go) } : NO_ITEMS,\n text: native.map((record) => record.raw).join(\"\\n\"),\n ...(failed.length > 0 ? { error: failed.map((record) => record.error).join(\"\\n\") } : {}),\n ...(first ? { collectedAt: first.takenAt, reason: first.reason } : {}),\n };\n}\n\nfunction resolveDump(text: string | undefined, records: StackRecord[] | undefined): ResolvedDump {\n if (records) return resolveRecords(records);\n if (text === undefined) throw new Error(\"StackDumpView needs either text or records\");\n return { parsed: parseStackDump(text), text };\n}\n\ntype StackFilterItem = {\n state: string;\n userFrameCount: number;\n searchText: string;\n};\n\nfunction stackItems(parsed: ParsedStack): StackFilterItem[] {\n if (parsed.format === \"jvm\") return parsed.threads;\n if (parsed.format === \"go\") return parsed.goroutines;\n return [];\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 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={`rounded-full px-2 py-0.5 ${cls}`}>{status}</span>;\n}\n\n/**\n * A captured stack dump: Go goroutines or JVM threads as searchable cards with\n * state chips and a hide-runtime-only toggle, or the raw text when the format\n * is not recognised. Takes either the raw `text` of a dump, which it parses, or\n * the `stacks` `records` of one dump, which it renders directly (Go goroutine\n * records as cards, a native dump's raw text, a failed dump's error). Filter\n * state resets whenever the text or the records' checkpoint changes.\n */\nexport function StackDumpView({\n text,\n records,\n error: errorProp,\n status,\n collectedAt: collectedAtProp,\n reason: reasonProp,\n singleItem = false,\n frameActions,\n resolveSource,\n headerActions,\n}: StackDumpViewProps) {\n const [search, setSearch] = useState(\"\");\n const [selectedStates, setSelectedStates] = useState<Set<string>>(new Set());\n const [hideRuntimeOnly, setHideRuntimeOnly] = useState(true);\n const resolved = useMemo(() => resolveDump(text, records), [text, records]);\n const { parsed, text: dumpText } = resolved;\n const error = errorProp ?? resolved.error;\n const collectedAt = collectedAtProp ?? resolved.collectedAt;\n const reason = reasonProp ?? resolved.reason;\n const resetKey = records ? `${records[0]?.checkpointId}|${records.length}` : text;\n const stateCounts = useMemo(() => countStackByState(parsed), [parsed]);\n const items = useMemo(() => stackItems(parsed), [parsed]);\n const filtered = useMemo(() => {\n if (singleItem) return items;\n const needle = search.trim().toLowerCase();\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 }, [items, search, selectedStates, hideRuntimeOnly, singleItem]);\n\n useEffect(() => {\n setSearch(\"\");\n setSelectedStates(new Set());\n setHideRuntimeOnly(true);\n }, [resetKey]);\n\n const itemCount = items.length;\n const label = stackItemLabel(parsed);\n\n return (\n <div className=\"flex h-full min-h-0 flex-col\" data-stack-format={parsed.format}>\n {!singleItem && (\n <div className=\"space-y-density-2 px-1 py-1.5\">\n <div className=\"flex flex-wrap items-center justify-between gap-density-2 text-[11px] text-muted-foreground\">\n <div className=\"flex flex-wrap items-center gap-density-2\">\n {status ? <StackStatusBadge status={status} /> : null}\n {collectedAt ? <span>{new Date(collectedAt).toLocaleString()}</span> : null}\n {reason ? <span data-stack-reason=\"\">{reason}</span> : null}\n {itemCount > 0 && (\n <span>\n {filtered.length} / {itemCount} {label}\n </span>\n )}\n </div>\n {headerActions}\n </div>\n {itemCount > 0 && (\n <>\n <div className=\"flex flex-wrap items-center gap-1.5\">\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-xs text-muted-foreground\"\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 aria-label={`Filter ${label}`}\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 type=\"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 flex-wrap items-center gap-1\">\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 type=\"button\"\n key={state}\n aria-pressed={active}\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 {singleItem && headerActions ? (\n <div className=\"flex justify-end px-1 py-1.5\">{headerActions}</div>\n ) : null}\n {error && <div className=\"mt-density-2 whitespace-pre-wrap text-xs text-red-600\">{error}</div>}\n {itemCount === 0 ? (\n dumpText ? (\n <pre\n className=\"min-h-0 flex-1 overflow-auto whitespace-pre-wrap py-1 font-mono text-[11px] leading-4 text-foreground\"\n style={{ minHeight: STACK_MIN_HEIGHT }}\n >\n {dumpText}\n </pre>\n ) : null\n ) : (\n <div className=\"min-h-0 flex-1 space-y-1 overflow-auto py-1\" style={{ minHeight: STACK_MIN_HEIGHT }}>\n {filtered.length === 0 && (\n <div className=\"py-density-3 text-center text-xs text-muted-foreground\">\n No {label} 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"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  import { ProcessNode } from './types.js';
2
+ export declare const sampleStack = "goroutine 1 [running]:\nmain.main()\n\t/home/user/go/src/app/main.go:42 +0x1a2\nruntime.main()\n\truntime/proc.go:250 +0x204\n\ngoroutine 17 [chan receive, 2 minutes]:\napp/server.(*Server).serve(0xc0001b2000)\n\t/home/user/go/src/app/server/server.go:118 +0xa5\ncreated by app/server.New\n\t/home/user/go/src/app/server/server.go:58 +0xe0\n\ngoroutine 22 [select]:\ndatabase/sql.(*DB).connectionOpener(0xc000110000, {0xabcd, 0xc0000aa0c0})\n\tdatabase/sql/sql.go:1196 +0x88\ncreated by database/sql.OpenDB\n\tdatabase/sql/sql.go:791 +0x158\n\ngoroutine 100 [syscall]:\nsyscall.Syscall(0x7, 0x0, 0x0, 0x0)\n\tsyscall/asm_linux_amd64.s:20 +0x4\n";
2
3
  export declare const sampleProcessTree: ProcessNode;
3
4
  //# sourceMappingURL=fixtures.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAyB3C,eAAO,MAAM,iBAAiB,EAAE,WA+C/B,CAAC"}
1
+ {"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,eAAO,MAAM,WAAW,yoBAqBvB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,WA+C/B,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function cpuTone(pct) {
4
+ if (pct >= 90) return "danger";
5
+ if (pct >= 60) return "warning";
6
+ if (pct > 0) return "success";
7
+ return "neutral";
8
+ }
9
+ function memoryTone(rss, vms) {
10
+ if (!rss || !vms) return "neutral";
11
+ const ratio = rss / vms;
12
+ if (ratio >= 0.9) return "danger";
13
+ if (ratio >= 0.6) return "warning";
14
+ return "info";
15
+ }
16
+ exports.cpuTone = cpuTone;
17
+ exports.memoryTone = memoryTone;
18
+ //# sourceMappingURL=metric-tone.cjs.map