@flanksource/clicky-ui 0.1.0 → 0.2.1

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 (378) hide show
  1. package/README.md +29 -2
  2. package/dist/api-explorer.d.ts +5 -0
  3. package/dist/api-explorer.d.ts.map +1 -0
  4. package/dist/api-explorer.js +25 -0
  5. package/dist/api-explorer.js.map +1 -0
  6. package/dist/clicky.d.ts +2 -0
  7. package/dist/clicky.d.ts.map +1 -0
  8. package/dist/clicky.js +5 -0
  9. package/dist/clicky.js.map +1 -0
  10. package/dist/components/DatePicker.d.ts +18 -0
  11. package/dist/components/DatePicker.d.ts.map +1 -0
  12. package/dist/components/DatePicker.js +63 -0
  13. package/dist/components/DatePicker.js.map +1 -0
  14. package/dist/components/DateTimePicker.d.ts +18 -0
  15. package/dist/components/DateTimePicker.d.ts.map +1 -0
  16. package/dist/components/DateTimePicker.js +84 -0
  17. package/dist/components/DateTimePicker.js.map +1 -0
  18. package/dist/components/FilterBar.d.ts +180 -0
  19. package/dist/components/FilterBar.d.ts.map +1 -0
  20. package/dist/components/FilterBar.js +1685 -0
  21. package/dist/components/FilterBar.js.map +1 -0
  22. package/dist/components/MultiSelect.d.ts +19 -0
  23. package/dist/components/MultiSelect.d.ts.map +1 -0
  24. package/dist/components/MultiSelect.js +143 -0
  25. package/dist/components/MultiSelect.js.map +1 -0
  26. package/dist/components/RangeSlider.d.ts +16 -0
  27. package/dist/components/RangeSlider.d.ts.map +1 -0
  28. package/dist/components/RangeSlider.js +92 -0
  29. package/dist/components/RangeSlider.js.map +1 -0
  30. package/dist/components/button.d.ts +21 -0
  31. package/dist/components/button.d.ts.map +1 -0
  32. package/dist/components/button.js +126 -0
  33. package/dist/components/button.js.map +1 -0
  34. package/dist/components/density-switcher.d.ts +7 -0
  35. package/dist/components/density-switcher.d.ts.map +1 -0
  36. package/dist/components/density-switcher.js +32 -0
  37. package/dist/components/density-switcher.js.map +1 -0
  38. package/dist/components/icon-menu-picker.d.ts +22 -0
  39. package/dist/components/icon-menu-picker.d.ts.map +1 -0
  40. package/dist/components/icon-menu-picker.js +181 -0
  41. package/dist/components/icon-menu-picker.js.map +1 -0
  42. package/dist/components/select.d.ts +15 -0
  43. package/dist/components/select.d.ts.map +1 -0
  44. package/dist/components/select.js +39 -0
  45. package/dist/components/select.js.map +1 -0
  46. package/dist/components/theme-switcher.d.ts +7 -0
  47. package/dist/components/theme-switcher.d.ts.map +1 -0
  48. package/dist/components/theme-switcher.js +42 -0
  49. package/dist/components/theme-switcher.js.map +1 -0
  50. package/dist/components.d.ts +14 -0
  51. package/dist/components.d.ts.map +1 -0
  52. package/dist/components.js +31 -0
  53. package/dist/components.js.map +1 -0
  54. package/dist/data/AnsiHtml.d.ts +7 -0
  55. package/dist/data/AnsiHtml.d.ts.map +1 -0
  56. package/dist/data/AnsiHtml.js +71 -0
  57. package/dist/data/AnsiHtml.js.map +1 -0
  58. package/dist/data/Avatar.d.ts +32 -0
  59. package/dist/data/Avatar.d.ts.map +1 -0
  60. package/dist/data/Avatar.js +201 -0
  61. package/dist/data/Avatar.js.map +1 -0
  62. package/dist/data/AvatarBadge.d.ts +26 -0
  63. package/dist/data/AvatarBadge.d.ts.map +1 -0
  64. package/dist/data/AvatarBadge.js +104 -0
  65. package/dist/data/AvatarBadge.js.map +1 -0
  66. package/dist/data/Badge.d.ts +44 -0
  67. package/dist/data/Badge.d.ts.map +1 -0
  68. package/dist/data/Badge.js +667 -0
  69. package/dist/data/Badge.js.map +1 -0
  70. package/dist/data/Clicky.d.ts +147 -0
  71. package/dist/data/Clicky.d.ts.map +1 -0
  72. package/dist/data/Clicky.fixtures.d.ts +3 -0
  73. package/dist/data/Clicky.fixtures.d.ts.map +1 -0
  74. package/dist/data/Clicky.js +1960 -0
  75. package/dist/data/Clicky.js.map +1 -0
  76. package/dist/data/DataTable.d.ts +95 -0
  77. package/dist/data/DataTable.d.ts.map +1 -0
  78. package/dist/data/DataTable.js +1464 -0
  79. package/dist/data/DataTable.js.map +1 -0
  80. package/dist/data/FilterPill.d.ts +29 -0
  81. package/dist/data/FilterPill.d.ts.map +1 -0
  82. package/dist/data/FilterPill.js +153 -0
  83. package/dist/data/FilterPill.js.map +1 -0
  84. package/dist/data/Gauge.d.ts +15 -0
  85. package/dist/data/Gauge.d.ts.map +1 -0
  86. package/dist/data/Gauge.js +63 -0
  87. package/dist/data/Gauge.js.map +1 -0
  88. package/dist/data/Icon.d.ts +53 -0
  89. package/dist/data/Icon.d.ts.map +1 -0
  90. package/dist/data/Icon.js +115 -0
  91. package/dist/data/Icon.js.map +1 -0
  92. package/dist/data/JsonView.d.ts +8 -0
  93. package/dist/data/JsonView.d.ts.map +1 -0
  94. package/dist/data/JsonView.js +74 -0
  95. package/dist/data/JsonView.js.map +1 -0
  96. package/dist/data/KeyValueList.d.ts +17 -0
  97. package/dist/data/KeyValueList.d.ts.map +1 -0
  98. package/dist/data/KeyValueList.js +33 -0
  99. package/dist/data/KeyValueList.js.map +1 -0
  100. package/dist/data/LogViewer.d.ts +10 -0
  101. package/dist/data/LogViewer.d.ts.map +1 -0
  102. package/dist/data/LogViewer.js +46 -0
  103. package/dist/data/LogViewer.js.map +1 -0
  104. package/dist/data/LogsTable.d.ts +27 -0
  105. package/dist/data/LogsTable.d.ts.map +1 -0
  106. package/dist/data/LogsTable.js +580 -0
  107. package/dist/data/LogsTable.js.map +1 -0
  108. package/dist/data/Markdown.d.ts +6 -0
  109. package/dist/data/Markdown.d.ts.map +1 -0
  110. package/dist/data/Markdown.js +59 -0
  111. package/dist/data/Markdown.js.map +1 -0
  112. package/dist/data/MatrixTable.d.ts +22 -0
  113. package/dist/data/MatrixTable.d.ts.map +1 -0
  114. package/dist/data/MatrixTable.js +164 -0
  115. package/dist/data/MatrixTable.js.map +1 -0
  116. package/dist/data/MethodBadge.d.ts +6 -0
  117. package/dist/data/MethodBadge.d.ts.map +1 -0
  118. package/dist/data/MethodBadge.js +18 -0
  119. package/dist/data/MethodBadge.js.map +1 -0
  120. package/dist/data/ProgressBar.d.ts +13 -0
  121. package/dist/data/ProgressBar.d.ts.map +1 -0
  122. package/dist/data/ProgressBar.js +34 -0
  123. package/dist/data/ProgressBar.js.map +1 -0
  124. package/dist/data/SortableHeader.d.ts +12 -0
  125. package/dist/data/SortableHeader.d.ts.map +1 -0
  126. package/dist/data/SortableHeader.js +33 -0
  127. package/dist/data/SortableHeader.js.map +1 -0
  128. package/dist/data/TabButton.d.ts +12 -0
  129. package/dist/data/TabButton.d.ts.map +1 -0
  130. package/dist/data/TabButton.js +45 -0
  131. package/dist/data/TabButton.js.map +1 -0
  132. package/dist/data/Tree.d.ts +35 -0
  133. package/dist/data/Tree.d.ts.map +1 -0
  134. package/dist/data/Tree.js +236 -0
  135. package/dist/data/Tree.js.map +1 -0
  136. package/dist/data/TreeGroupHeader.d.ts +11 -0
  137. package/dist/data/TreeGroupHeader.d.ts.map +1 -0
  138. package/dist/data/TreeGroupHeader.js +41 -0
  139. package/dist/data/TreeGroupHeader.js.map +1 -0
  140. package/dist/data/TreeNode.d.ts +43 -0
  141. package/dist/data/TreeNode.d.ts.map +1 -0
  142. package/dist/data/TreeNode.js +100 -0
  143. package/dist/data/TreeNode.js.map +1 -0
  144. package/dist/data/cells/StatusDot.d.ts +11 -0
  145. package/dist/data/cells/StatusDot.d.ts.map +1 -0
  146. package/dist/data/cells/StatusDot.js +38 -0
  147. package/dist/data/cells/StatusDot.js.map +1 -0
  148. package/dist/data/cells/TagList.d.ts +59 -0
  149. package/dist/data/cells/TagList.d.ts.map +1 -0
  150. package/dist/data/cells/TagList.js +257 -0
  151. package/dist/data/cells/TagList.js.map +1 -0
  152. package/dist/data/cells/Timestamp.d.ts +46 -0
  153. package/dist/data/cells/Timestamp.d.ts.map +1 -0
  154. package/dist/data/cells/Timestamp.js +146 -0
  155. package/dist/data/cells/Timestamp.js.map +1 -0
  156. package/dist/data/cells/status-mapping.d.ts +8 -0
  157. package/dist/data/cells/status-mapping.d.ts.map +1 -0
  158. package/dist/data/cells/status-mapping.js +44 -0
  159. package/dist/data/cells/status-mapping.js.map +1 -0
  160. package/dist/data/code-highlight.d.ts +12 -0
  161. package/dist/data/code-highlight.d.ts.map +1 -0
  162. package/dist/data/code-highlight.js +28 -0
  163. package/dist/data/code-highlight.js.map +1 -0
  164. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +9 -0
  165. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -0
  166. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +445 -0
  167. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -0
  168. package/dist/data/diagnostics/DiagnosticsTree.d.ts +9 -0
  169. package/dist/data/diagnostics/DiagnosticsTree.d.ts.map +1 -0
  170. package/dist/data/diagnostics/DiagnosticsTree.js +78 -0
  171. package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -0
  172. package/dist/data/diagnostics/ErrorDetails.d.ts +20 -0
  173. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -0
  174. package/dist/data/diagnostics/ErrorDetails.js +157 -0
  175. package/dist/data/diagnostics/ErrorDetails.js.map +1 -0
  176. package/dist/data/diagnostics/GoroutineCard.d.ts +10 -0
  177. package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -0
  178. package/dist/data/diagnostics/GoroutineCard.js +75 -0
  179. package/dist/data/diagnostics/GoroutineCard.js.map +1 -0
  180. package/dist/data/diagnostics/JvmStackTrace.d.ts +11 -0
  181. package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -0
  182. package/dist/data/diagnostics/JvmStackTrace.js +26 -0
  183. package/dist/data/diagnostics/JvmStackTrace.js.map +1 -0
  184. package/dist/data/diagnostics/RenderedStackTrace.d.ts +18 -0
  185. package/dist/data/diagnostics/RenderedStackTrace.d.ts.map +1 -0
  186. package/dist/data/diagnostics/RenderedStackTrace.js +235 -0
  187. package/dist/data/diagnostics/RenderedStackTrace.js.map +1 -0
  188. package/dist/data/diagnostics/ThreadCard.d.ts +10 -0
  189. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -0
  190. package/dist/data/diagnostics/ThreadCard.js +78 -0
  191. package/dist/data/diagnostics/ThreadCard.js.map +1 -0
  192. package/dist/data/diagnostics/error-diagnostics.d.ts +26 -0
  193. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -0
  194. package/dist/data/diagnostics/error-diagnostics.js +108 -0
  195. package/dist/data/diagnostics/error-diagnostics.js.map +1 -0
  196. package/dist/data/diagnostics/fixtures.d.ts +3 -0
  197. package/dist/data/diagnostics/fixtures.d.ts.map +1 -0
  198. package/dist/data/diagnostics/jvm-stacktrace.d.ts +34 -0
  199. package/dist/data/diagnostics/jvm-stacktrace.d.ts.map +1 -0
  200. package/dist/data/diagnostics/jvm-stacktrace.js +190 -0
  201. package/dist/data/diagnostics/jvm-stacktrace.js.map +1 -0
  202. package/dist/data/diagnostics/stacktrace-parse.d.ts +11 -0
  203. package/dist/data/diagnostics/stacktrace-parse.d.ts.map +1 -0
  204. package/dist/data/diagnostics/stacktrace-parse.js +87 -0
  205. package/dist/data/diagnostics/stacktrace-parse.js.map +1 -0
  206. package/dist/data/diagnostics/stacktrace.d.ts +38 -0
  207. package/dist/data/diagnostics/stacktrace.d.ts.map +1 -0
  208. package/dist/data/diagnostics/stacktrace.js +119 -0
  209. package/dist/data/diagnostics/stacktrace.js.map +1 -0
  210. package/dist/data/diagnostics/types.d.ts +30 -0
  211. package/dist/data/diagnostics/types.d.ts.map +1 -0
  212. package/dist/data/diagnostics/utils.d.ts +8 -0
  213. package/dist/data/diagnostics/utils.d.ts.map +1 -0
  214. package/dist/data/diagnostics/utils.js +59 -0
  215. package/dist/data/diagnostics/utils.js.map +1 -0
  216. package/dist/data/har/HarPanel.d.ts +9 -0
  217. package/dist/data/har/HarPanel.d.ts.map +1 -0
  218. package/dist/data/har/HarPanel.js +175 -0
  219. package/dist/data/har/HarPanel.js.map +1 -0
  220. package/dist/data/har/fixtures.d.ts +3 -0
  221. package/dist/data/har/fixtures.d.ts.map +1 -0
  222. package/dist/data/har/types.d.ts +47 -0
  223. package/dist/data/har/types.d.ts.map +1 -0
  224. package/dist/data.d.ts +39 -0
  225. package/dist/data.d.ts.map +1 -0
  226. package/dist/data.js +109 -0
  227. package/dist/data.js.map +1 -0
  228. package/dist/hooks/use-density.d.ts +22 -0
  229. package/dist/hooks/use-density.d.ts.map +1 -0
  230. package/dist/hooks/use-density.js +54 -0
  231. package/dist/hooks/use-density.js.map +1 -0
  232. package/dist/hooks/use-history-route.d.ts +6 -0
  233. package/dist/hooks/use-history-route.d.ts.map +1 -0
  234. package/dist/hooks/use-history-route.js +31 -0
  235. package/dist/hooks/use-history-route.js.map +1 -0
  236. package/dist/hooks/use-sort.d.ts +17 -0
  237. package/dist/hooks/use-sort.d.ts.map +1 -0
  238. package/dist/hooks/use-sort.js +42 -0
  239. package/dist/hooks/use-sort.js.map +1 -0
  240. package/dist/hooks/use-theme.d.ts +17 -0
  241. package/dist/hooks/use-theme.d.ts.map +1 -0
  242. package/dist/hooks/use-theme.js +68 -0
  243. package/dist/hooks/use-theme.js.map +1 -0
  244. package/dist/hooks.d.ts +5 -0
  245. package/dist/hooks.d.ts.map +1 -0
  246. package/dist/hooks.js +14 -0
  247. package/dist/hooks.js.map +1 -0
  248. package/dist/index.d.ts +7 -0
  249. package/dist/index.d.ts.map +1 -0
  250. package/dist/index.js +193 -0
  251. package/dist/index.js.map +1 -0
  252. package/dist/layout/Section.d.ts +23 -0
  253. package/dist/layout/Section.d.ts.map +1 -0
  254. package/dist/layout/Section.js +73 -0
  255. package/dist/layout/Section.js.map +1 -0
  256. package/dist/layout/SplitPane.d.ts +13 -0
  257. package/dist/layout/SplitPane.d.ts.map +1 -0
  258. package/dist/layout/SplitPane.js +72 -0
  259. package/dist/layout/SplitPane.js.map +1 -0
  260. package/dist/lib/palette.d.ts +4 -0
  261. package/dist/lib/palette.d.ts.map +1 -0
  262. package/dist/lib/palette.js +35 -0
  263. package/dist/lib/palette.js.map +1 -0
  264. package/dist/lib/size.d.ts +6 -0
  265. package/dist/lib/size.d.ts.map +1 -0
  266. package/dist/lib/size.js +14 -0
  267. package/dist/lib/size.js.map +1 -0
  268. package/dist/lib/utils.d.ts +3 -0
  269. package/dist/lib/utils.d.ts.map +1 -0
  270. package/dist/lib/utils.js +9 -0
  271. package/dist/lib/utils.js.map +1 -0
  272. package/dist/overlay/HoverCard.d.ts +13 -0
  273. package/dist/overlay/HoverCard.d.ts.map +1 -0
  274. package/dist/overlay/HoverCard.js +170 -0
  275. package/dist/overlay/HoverCard.js.map +1 -0
  276. package/dist/overlay/Modal.d.ts +17 -0
  277. package/dist/overlay/Modal.d.ts.map +1 -0
  278. package/dist/overlay/Modal.js +91 -0
  279. package/dist/overlay/Modal.js.map +1 -0
  280. package/dist/rpc/AcceptPicker.d.ts +52 -0
  281. package/dist/rpc/AcceptPicker.d.ts.map +1 -0
  282. package/dist/rpc/AcceptPicker.js +126 -0
  283. package/dist/rpc/AcceptPicker.js.map +1 -0
  284. package/dist/rpc/ApiExplorer.d.ts +11 -0
  285. package/dist/rpc/ApiExplorer.d.ts.map +1 -0
  286. package/dist/rpc/ApiExplorer.js +37 -0
  287. package/dist/rpc/ApiExplorer.js.map +1 -0
  288. package/dist/rpc/CommandForm.d.ts +15 -0
  289. package/dist/rpc/CommandForm.d.ts.map +1 -0
  290. package/dist/rpc/CommandForm.js +356 -0
  291. package/dist/rpc/CommandForm.js.map +1 -0
  292. package/dist/rpc/CommandOutput.d.ts +11 -0
  293. package/dist/rpc/CommandOutput.d.ts.map +1 -0
  294. package/dist/rpc/CommandOutput.js +195 -0
  295. package/dist/rpc/CommandOutput.js.map +1 -0
  296. package/dist/rpc/EndpointList.d.ts +18 -0
  297. package/dist/rpc/EndpointList.d.ts.map +1 -0
  298. package/dist/rpc/EndpointList.js +56 -0
  299. package/dist/rpc/EndpointList.js.map +1 -0
  300. package/dist/rpc/EntityExplorerApp.d.ts +15 -0
  301. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -0
  302. package/dist/rpc/EntityExplorerApp.js +282 -0
  303. package/dist/rpc/EntityExplorerApp.js.map +1 -0
  304. package/dist/rpc/ExecutionResult.d.ts +14 -0
  305. package/dist/rpc/ExecutionResult.d.ts.map +1 -0
  306. package/dist/rpc/ExecutionResult.js +51 -0
  307. package/dist/rpc/ExecutionResult.js.map +1 -0
  308. package/dist/rpc/FilterForm.d.ts +22 -0
  309. package/dist/rpc/FilterForm.d.ts.map +1 -0
  310. package/dist/rpc/FilterForm.js +392 -0
  311. package/dist/rpc/FilterForm.js.map +1 -0
  312. package/dist/rpc/InlineError.d.ts +7 -0
  313. package/dist/rpc/InlineError.d.ts.map +1 -0
  314. package/dist/rpc/InlineError.js +54 -0
  315. package/dist/rpc/InlineError.js.map +1 -0
  316. package/dist/rpc/OperationActionDialog.d.ts +12 -0
  317. package/dist/rpc/OperationActionDialog.d.ts.map +1 -0
  318. package/dist/rpc/OperationActionDialog.js +105 -0
  319. package/dist/rpc/OperationActionDialog.js.map +1 -0
  320. package/dist/rpc/OperationCatalog.d.ts +21 -0
  321. package/dist/rpc/OperationCatalog.d.ts.map +1 -0
  322. package/dist/rpc/OperationCatalog.js +339 -0
  323. package/dist/rpc/OperationCatalog.js.map +1 -0
  324. package/dist/rpc/OperationCommandPage.d.ts +22 -0
  325. package/dist/rpc/OperationCommandPage.d.ts.map +1 -0
  326. package/dist/rpc/OperationCommandPage.js +484 -0
  327. package/dist/rpc/OperationCommandPage.js.map +1 -0
  328. package/dist/rpc/OperationEntityPage.d.ts +23 -0
  329. package/dist/rpc/OperationEntityPage.d.ts.map +1 -0
  330. package/dist/rpc/OperationEntityPage.js +218 -0
  331. package/dist/rpc/OperationEntityPage.js.map +1 -0
  332. package/dist/rpc/classify.d.ts +8 -0
  333. package/dist/rpc/classify.d.ts.map +1 -0
  334. package/dist/rpc/classify.js +76 -0
  335. package/dist/rpc/classify.js.map +1 -0
  336. package/dist/rpc/clickyMetadata.d.ts +12 -0
  337. package/dist/rpc/clickyMetadata.d.ts.map +1 -0
  338. package/dist/rpc/clickyMetadata.js +71 -0
  339. package/dist/rpc/clickyMetadata.js.map +1 -0
  340. package/dist/rpc/formMetadata.d.ts +27 -0
  341. package/dist/rpc/formMetadata.d.ts.map +1 -0
  342. package/dist/rpc/formMetadata.js +250 -0
  343. package/dist/rpc/formMetadata.js.map +1 -0
  344. package/dist/rpc/types.d.ts +109 -0
  345. package/dist/rpc/types.d.ts.map +1 -0
  346. package/dist/rpc/types.js +8 -0
  347. package/dist/rpc/types.js.map +1 -0
  348. package/dist/rpc/useOperations.d.ts +346 -0
  349. package/dist/rpc/useOperations.d.ts.map +1 -0
  350. package/dist/rpc/useOperations.js +31 -0
  351. package/dist/rpc/useOperations.js.map +1 -0
  352. package/dist/rpc.d.ts +14 -0
  353. package/dist/rpc.d.ts.map +1 -0
  354. package/dist/rpc.js +37 -0
  355. package/dist/rpc.js.map +1 -0
  356. package/dist/styles.css +2 -0
  357. package/dist/styles.d.ts +1 -0
  358. package/dist/styles.d.ts.map +1 -0
  359. package/dist/styles.js +2 -0
  360. package/dist/styles.js.map +1 -0
  361. package/dist/tailwind-preset.d.ts +4 -0
  362. package/dist/tailwind-preset.d.ts.map +1 -0
  363. package/dist/tailwind-preset.js +69 -0
  364. package/dist/tailwind-preset.js.map +1 -0
  365. package/dist/utils.d.ts +4 -0
  366. package/dist/utils.d.ts.map +1 -0
  367. package/dist/utils.js +12 -0
  368. package/dist/utils.js.map +1 -0
  369. package/package.json +83 -40
  370. package/dist/index.d.mts +0 -834
  371. package/dist/index.d.mts.map +0 -1
  372. package/dist/index.mjs +0 -2918
  373. package/dist/index.mjs.map +0 -1
  374. package/dist/tailwind-preset.d.mts +0 -7
  375. package/dist/tailwind-preset.d.mts.map +0 -1
  376. package/dist/tailwind-preset.mjs +0 -64
  377. package/dist/tailwind-preset.mjs.map +0 -1
  378. package/src/styles/tokens.css +0 -78
@@ -0,0 +1,445 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { useState, useMemo, useEffect } from "react";
3
+ import { Icon } from "../Icon.js";
4
+ import { processLabel, processStateIcon, processStateColor, formatBytes } from "./utils.js";
5
+ import { parseStackDump, countStackByState } from "./stacktrace.js";
6
+ import { GoroutineCard, goroutineStateDot } from "./GoroutineCard.js";
7
+ import { ThreadCard, threadStateDot } from "./ThreadCard.js";
8
+ const STACK_MIN_LINES = 10;
9
+ const STACK_LINE_HEIGHT_REM = 1;
10
+ const STACK_MIN_HEIGHT = `${STACK_MIN_LINES * STACK_LINE_HEIGHT_REM}rem`;
11
+ function cpuTone(pct) {
12
+ if (pct >= 90) return "danger";
13
+ if (pct >= 60) return "warning";
14
+ if (pct > 0) return "success";
15
+ return "neutral";
16
+ }
17
+ function memoryTone(rss, vms) {
18
+ if (!rss || !vms) return "neutral";
19
+ const ratio = rss / vms;
20
+ if (ratio >= 0.9) return "danger";
21
+ if (ratio >= 0.6) return "warning";
22
+ return "info";
23
+ }
24
+ function DiagnosticsDetailPanel({
25
+ process,
26
+ collectBusy,
27
+ onCollectStack,
28
+ runMeta
29
+ }) {
30
+ const [search, setSearch] = useState("");
31
+ const [selectedStates, setSelectedStates] = useState(/* @__PURE__ */ new Set());
32
+ const [hideRuntimeOnly, setHideRuntimeOnly] = useState(true);
33
+ const stack = process == null ? void 0 : process.stack_capture;
34
+ const parsed = useMemo(() => parseStackDump((stack == null ? void 0 : stack.text) || ""), [stack == null ? void 0 : stack.text]);
35
+ const stateCounts = useMemo(() => countStackByState(parsed), [parsed]);
36
+ const filtered = useMemo(() => {
37
+ const needle = search.trim().toLowerCase();
38
+ const items = parsed.format === "jvm" ? parsed.threads : parsed.format === "go" ? parsed.goroutines : [];
39
+ return items.filter((item) => {
40
+ if (selectedStates.size > 0 && !selectedStates.has(item.state)) return false;
41
+ if (hideRuntimeOnly && item.userFrameCount === 0) return false;
42
+ if (needle && !item.searchText.includes(needle)) return false;
43
+ return true;
44
+ });
45
+ }, [parsed, search, selectedStates, hideRuntimeOnly]);
46
+ useEffect(() => {
47
+ setSearch("");
48
+ setSelectedStates(/* @__PURE__ */ new Set());
49
+ setHideRuntimeOnly(true);
50
+ }, [stack == null ? void 0 : stack.text, process == null ? void 0 : process.pid]);
51
+ if (!process) {
52
+ 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: [
53
+ /* @__PURE__ */ jsx(Icon, { name: "codicon:server-process", className: "text-4xl mb-density-2" }),
54
+ /* @__PURE__ */ jsx("div", { children: "Select a process to view diagnostics" })
55
+ ] }) });
56
+ }
57
+ return /* @__PURE__ */ jsxs("div", { className: "h-full min-h-0 flex flex-col gap-density-3 p-density-4", children: [
58
+ /* @__PURE__ */ jsx(Header, { process }),
59
+ runMeta && /* @__PURE__ */ jsx(RunSection, { runMeta }),
60
+ 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 }) }),
61
+ /* @__PURE__ */ jsx(PanelSection, { title: "Metrics", children: /* @__PURE__ */ jsx(ProcessMetrics, { process }) }),
62
+ /* @__PURE__ */ jsx(PanelSection, { title: "Stack", grow: true, children: /* @__PURE__ */ jsx(
63
+ StackBlock,
64
+ {
65
+ process,
66
+ parsed,
67
+ stateCounts,
68
+ filtered,
69
+ search,
70
+ setSearch,
71
+ selectedStates,
72
+ setSelectedStates,
73
+ hideRuntimeOnly,
74
+ setHideRuntimeOnly,
75
+ collectBusy: collectBusy ?? false,
76
+ ...onCollectStack ? { onCollectStack } : {}
77
+ }
78
+ ) })
79
+ ] });
80
+ }
81
+ function Header({ process }) {
82
+ return /* @__PURE__ */ jsx("div", { className: "flex items-start justify-between gap-density-3", children: /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
83
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-density-2", children: [
84
+ /* @__PURE__ */ jsx(
85
+ Icon,
86
+ {
87
+ name: process.is_root ? "codicon:server-process" : "codicon:debug-alt",
88
+ className: "text-2xl text-blue-600"
89
+ }
90
+ ),
91
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-bold text-foreground break-words", children: processLabel(process) })
92
+ ] }),
93
+ /* @__PURE__ */ jsxs("div", { className: "mt-1 flex items-center gap-density-2 flex-wrap text-xs text-muted-foreground", children: [
94
+ /* @__PURE__ */ jsxs("span", { className: "font-mono", children: [
95
+ "pid ",
96
+ process.pid
97
+ ] }),
98
+ process.ppid ? /* @__PURE__ */ jsxs("span", { className: "font-mono", children: [
99
+ "ppid ",
100
+ process.ppid
101
+ ] }) : null,
102
+ process.status ? /* @__PURE__ */ jsxs(
103
+ "span",
104
+ {
105
+ className: `inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 ${processStateColor(
106
+ process.status
107
+ )}`,
108
+ children: [
109
+ /* @__PURE__ */ jsx(Icon, { name: processStateIcon(process.status) }),
110
+ process.status
111
+ ]
112
+ }
113
+ ) : null
114
+ ] })
115
+ ] }) });
116
+ }
117
+ function RunSection({ runMeta }) {
118
+ return /* @__PURE__ */ jsx(PanelSection, { title: "Run", children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-density-2 text-sm", children: [
119
+ /* @__PURE__ */ jsx(
120
+ InfoTile,
121
+ {
122
+ label: runMeta.kind === "rerun" ? `Rerun #${runMeta.sequence}` : "Initial run",
123
+ value: runMeta.started ? new Date(runMeta.started).toLocaleString() : "Unavailable"
124
+ }
125
+ ),
126
+ /* @__PURE__ */ jsx(
127
+ InfoTile,
128
+ {
129
+ label: "Finished",
130
+ value: runMeta.ended ? new Date(runMeta.ended).toLocaleString() : "In progress"
131
+ }
132
+ )
133
+ ] }) });
134
+ }
135
+ function stackItemCount(parsed) {
136
+ if (parsed.format === "jvm") return parsed.threads.length;
137
+ if (parsed.format === "go") return parsed.goroutines.length;
138
+ return 0;
139
+ }
140
+ function stackItemLabel(parsed) {
141
+ if (parsed.format === "jvm") return "threads";
142
+ if (parsed.format === "go") return "goroutines";
143
+ return "frames";
144
+ }
145
+ function stackStateDot(parsed, state) {
146
+ return parsed.format === "jvm" ? threadStateDot(state) : goroutineStateDot(state);
147
+ }
148
+ function StackBlock(props) {
149
+ const {
150
+ process,
151
+ parsed,
152
+ stateCounts,
153
+ filtered,
154
+ search,
155
+ setSearch,
156
+ selectedStates,
157
+ setSelectedStates,
158
+ hideRuntimeOnly,
159
+ setHideRuntimeOnly,
160
+ collectBusy,
161
+ onCollectStack
162
+ } = props;
163
+ const stack = process.stack_capture;
164
+ if (!(stack == null ? void 0 : stack.text)) {
165
+ return /* @__PURE__ */ jsxs("div", { className: "h-full min-h-[14rem] flex flex-col justify-center gap-density-3 p-density-3", children: [
166
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
167
+ /* @__PURE__ */ jsx(
168
+ "div",
169
+ {
170
+ className: `h-3 w-40 rounded ${collectBusy ? "animate-pulse bg-muted" : "bg-muted/70"}`
171
+ }
172
+ ),
173
+ /* @__PURE__ */ jsx(
174
+ "div",
175
+ {
176
+ className: `h-3 w-full rounded ${collectBusy ? "animate-pulse bg-muted" : "bg-muted/70"}`
177
+ }
178
+ ),
179
+ /* @__PURE__ */ jsx(
180
+ "div",
181
+ {
182
+ className: `h-3 w-5/6 rounded ${collectBusy ? "animate-pulse bg-muted" : "bg-muted/70"}`
183
+ }
184
+ )
185
+ ] }),
186
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-density-3", children: [
187
+ /* @__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." }),
188
+ onCollectStack && /* @__PURE__ */ jsx(
189
+ CollectButton,
190
+ {
191
+ pid: process.pid,
192
+ busy: collectBusy ?? false,
193
+ onClick: onCollectStack,
194
+ primary: true
195
+ }
196
+ )
197
+ ] })
198
+ ] });
199
+ }
200
+ return /* @__PURE__ */ jsxs("div", { className: "h-full min-h-0 flex flex-col", children: [
201
+ /* @__PURE__ */ jsxs("div", { className: "px-1 py-1.5 space-y-density-2", children: [
202
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-density-2 text-[11px] text-muted-foreground flex-wrap", children: [
203
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-density-2 flex-wrap", children: [
204
+ /* @__PURE__ */ jsx(StackStatusBadge, { status: stack.status }),
205
+ stack.collected_at && /* @__PURE__ */ jsx("span", { children: new Date(stack.collected_at).toLocaleString() }),
206
+ stackItemCount(parsed) > 0 && /* @__PURE__ */ jsxs("span", { children: [
207
+ filtered.length,
208
+ " / ",
209
+ stackItemCount(parsed),
210
+ " ",
211
+ stackItemLabel(parsed)
212
+ ] })
213
+ ] }),
214
+ onCollectStack && /* @__PURE__ */ jsx(CollectButton, { pid: process.pid, busy: collectBusy ?? false, onClick: onCollectStack })
215
+ ] }),
216
+ stackItemCount(parsed) > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
217
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5 flex-wrap", children: [
218
+ /* @__PURE__ */ jsxs("div", { className: "relative min-w-[14rem] flex-1", children: [
219
+ /* @__PURE__ */ jsx(
220
+ Icon,
221
+ {
222
+ name: "codicon:search",
223
+ className: "absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground text-xs"
224
+ }
225
+ ),
226
+ /* @__PURE__ */ jsx(
227
+ "input",
228
+ {
229
+ 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",
230
+ placeholder: parsed.format === "jvm" ? "Filter by thread name, function, or file" : "Filter by goroutine id, function, or file",
231
+ value: search,
232
+ onChange: (e) => setSearch(e.target.value)
233
+ }
234
+ )
235
+ ] }),
236
+ /* @__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: [
237
+ /* @__PURE__ */ jsx(
238
+ "input",
239
+ {
240
+ type: "checkbox",
241
+ checked: hideRuntimeOnly,
242
+ onChange: (e) => setHideRuntimeOnly(e.target.checked)
243
+ }
244
+ ),
245
+ "Hide runtime-only"
246
+ ] }),
247
+ (search || selectedStates.size > 0 || !hideRuntimeOnly) && /* @__PURE__ */ jsx(
248
+ "button",
249
+ {
250
+ className: "text-[11px] text-muted-foreground hover:text-foreground",
251
+ onClick: () => {
252
+ setSearch("");
253
+ setSelectedStates(() => /* @__PURE__ */ new Set());
254
+ setHideRuntimeOnly(true);
255
+ },
256
+ children: "Clear"
257
+ }
258
+ )
259
+ ] }),
260
+ /* @__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]) => {
261
+ const active = selectedStates.has(state);
262
+ return /* @__PURE__ */ jsxs(
263
+ "button",
264
+ {
265
+ 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"}`,
266
+ onClick: () => {
267
+ setSelectedStates((prev) => {
268
+ const next = new Set(prev);
269
+ if (next.has(state)) next.delete(state);
270
+ else next.add(state);
271
+ return next;
272
+ });
273
+ },
274
+ children: [
275
+ /* @__PURE__ */ jsx("span", { className: `h-2 w-2 rounded-full ${stackStateDot(parsed, state)}` }),
276
+ state,
277
+ /* @__PURE__ */ jsx("span", { className: "text-[10px] opacity-70", children: count })
278
+ ]
279
+ },
280
+ state
281
+ );
282
+ }) })
283
+ ] })
284
+ ] }),
285
+ stack.error && /* @__PURE__ */ jsx("div", { className: "mt-density-2 text-xs text-red-600 whitespace-pre-wrap", children: stack.error }),
286
+ stackItemCount(parsed) === 0 ? /* @__PURE__ */ jsx(
287
+ "pre",
288
+ {
289
+ className: "flex-1 min-h-0 overflow-auto py-1 text-[11px] text-foreground whitespace-pre-wrap font-mono leading-4",
290
+ style: { minHeight: STACK_MIN_HEIGHT },
291
+ children: stack.text
292
+ }
293
+ ) : /* @__PURE__ */ jsxs(
294
+ "div",
295
+ {
296
+ className: "flex-1 min-h-0 overflow-auto py-1 space-y-1",
297
+ style: { minHeight: STACK_MIN_HEIGHT },
298
+ children: [
299
+ filtered.length === 0 && /* @__PURE__ */ jsxs("div", { className: "py-density-3 text-center text-xs text-muted-foreground", children: [
300
+ "No ",
301
+ stackItemLabel(parsed),
302
+ " match the current filters."
303
+ ] }),
304
+ parsed.format === "jvm" && parsed.threads.filter((t) => filtered.includes(t)).map((t) => /* @__PURE__ */ jsx(
305
+ ThreadCard,
306
+ {
307
+ thread: t,
308
+ search,
309
+ hideRuntimeOnly
310
+ },
311
+ t.id
312
+ )),
313
+ parsed.format === "go" && parsed.goroutines.filter((g) => filtered.includes(g)).map((goroutine) => /* @__PURE__ */ jsx(
314
+ GoroutineCard,
315
+ {
316
+ goroutine,
317
+ search,
318
+ hideRuntimeOnly
319
+ },
320
+ goroutine.id
321
+ ))
322
+ ]
323
+ }
324
+ )
325
+ ] });
326
+ }
327
+ function StackStatusBadge({ status }) {
328
+ 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";
329
+ return /* @__PURE__ */ jsx("span", { className: `px-2 py-0.5 rounded-full ${cls}`, children: status });
330
+ }
331
+ function CollectButton({
332
+ pid,
333
+ busy,
334
+ onClick,
335
+ primary
336
+ }) {
337
+ const base = "shrink-0 text-[11px] px-2 py-1 rounded disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-1";
338
+ const style = primary ? "bg-primary text-primary-foreground hover:bg-primary/90" : "border border-border text-muted-foreground hover:bg-accent";
339
+ return /* @__PURE__ */ jsxs(
340
+ "button",
341
+ {
342
+ className: `${base} ${style}`,
343
+ onClick: () => onClick(pid),
344
+ disabled: busy,
345
+ title: primary ? "Collect the latest stack trace" : "Refresh stack trace",
346
+ children: [
347
+ /* @__PURE__ */ jsx(
348
+ Icon,
349
+ {
350
+ name: busy ? "svg-spinners:ring-resize" : primary ? "codicon:debug-alt-small" : "codicon:refresh"
351
+ }
352
+ ),
353
+ busy ? "Collecting..." : primary ? "Collect stack trace" : "Refresh"
354
+ ]
355
+ }
356
+ );
357
+ }
358
+ function PanelSection({
359
+ title,
360
+ grow,
361
+ children
362
+ }) {
363
+ return /* @__PURE__ */ jsxs("section", { className: grow ? "flex min-h-0 flex-1 flex-col" : "", children: [
364
+ /* @__PURE__ */ jsx("div", { className: "text-[11px] font-semibold uppercase tracking-wide text-muted-foreground mb-1.5", children: title }),
365
+ grow ? /* @__PURE__ */ jsx("div", { className: "flex-1 min-h-0 overflow-hidden", children }) : children
366
+ ] });
367
+ }
368
+ function InfoTile({ label, value }) {
369
+ return /* @__PURE__ */ jsxs("div", { className: "border border-border rounded-lg bg-muted/50 px-2.5 py-density-2", children: [
370
+ /* @__PURE__ */ jsx("div", { className: "text-[10px] uppercase tracking-wide text-muted-foreground", children: label }),
371
+ /* @__PURE__ */ jsx("div", { className: "text-xs font-medium text-foreground mt-0.5", children: value })
372
+ ] });
373
+ }
374
+ function ProcessMetrics({ process }) {
375
+ const cpu = process.cpu_percent || 0;
376
+ const rss = process.rss;
377
+ const vms = process.vms;
378
+ const memRatioPct = rss && vms && vms > 0 ? Math.min(100, Math.round(rss / vms * 100)) : 0;
379
+ return /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-4 gap-density-1", children: [
380
+ /* @__PURE__ */ jsx(
381
+ MetricTile,
382
+ {
383
+ label: "CPU",
384
+ value: `${cpu.toFixed(1)}%`,
385
+ barPct: Math.min(100, cpu),
386
+ tone: cpuTone(cpu)
387
+ }
388
+ ),
389
+ /* @__PURE__ */ jsx(
390
+ MetricTile,
391
+ {
392
+ label: "RSS",
393
+ value: rss !== void 0 ? formatBytes(rss) : "n/a",
394
+ barPct: memRatioPct,
395
+ tone: memoryTone(rss, vms)
396
+ }
397
+ ),
398
+ /* @__PURE__ */ jsx(MetricTile, { label: "VMS", value: vms !== void 0 ? formatBytes(vms) : "n/a", tone: "neutral" }),
399
+ /* @__PURE__ */ jsx(
400
+ MetricTile,
401
+ {
402
+ label: "Files",
403
+ value: process.open_files !== void 0 ? String(process.open_files) : "n/a",
404
+ barPct: process.open_files ? Math.min(100, process.open_files / 1024 * 100) : 0,
405
+ tone: "info"
406
+ }
407
+ )
408
+ ] });
409
+ }
410
+ function MetricTile({
411
+ label,
412
+ value,
413
+ barPct,
414
+ tone = "neutral"
415
+ }) {
416
+ const toneBar = {
417
+ neutral: "bg-muted-foreground/40",
418
+ success: "bg-green-500",
419
+ warning: "bg-yellow-500",
420
+ danger: "bg-red-500",
421
+ info: "bg-blue-500"
422
+ };
423
+ const toneText = {
424
+ neutral: "text-foreground",
425
+ success: "text-green-600 dark:text-green-400",
426
+ warning: "text-yellow-600 dark:text-yellow-400",
427
+ danger: "text-red-600 dark:text-red-400",
428
+ info: "text-blue-600 dark:text-blue-400"
429
+ };
430
+ 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: [
431
+ /* @__PURE__ */ jsx("span", { className: "text-[9px] uppercase tracking-wide text-muted-foreground leading-none", children: label }),
432
+ /* @__PURE__ */ jsx("span", { className: `text-xs font-semibold tabular-nums truncate ${toneText[tone]}`, children: value }),
433
+ barPct !== void 0 && /* @__PURE__ */ jsx("div", { className: "h-0.5 w-full rounded-full bg-muted overflow-hidden", children: /* @__PURE__ */ jsx(
434
+ "div",
435
+ {
436
+ className: `h-full ${toneBar[tone]} transition-all duration-300`,
437
+ style: { width: `${barPct}%` }
438
+ }
439
+ ) })
440
+ ] });
441
+ }
442
+ export {
443
+ DiagnosticsDetailPanel
444
+ };
445
+ //# sourceMappingURL=DiagnosticsDetailPanel.js.map
@@ -0,0 +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 type { ProcessNode, RunMeta } from \"./types\";\nimport { formatBytes, processLabel, processStateColor, processStateIcon } from \"./utils\";\nimport { countStackByState, parseStackDump, type ParsedStack } from \"./stacktrace\";\nimport { GoroutineCard, goroutineStateDot } from \"./GoroutineCard\";\nimport { ThreadCard, threadStateDot } 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\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 process: ProcessNode | null;\n collectBusy?: boolean;\n onCollectStack?: (pid: number) => void | Promise<void>;\n runMeta?: RunMeta;\n};\n\nexport function DiagnosticsDetailPanel({\n process,\n collectBusy,\n onCollectStack,\n runMeta,\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 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]);\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 name=\"codicon:server-process\" 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 process={process} />\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 {...(onCollectStack ? { onCollectStack } : {})}\n />\n </PanelSection>\n </div>\n );\n}\n\nfunction Header({ process }: { process: ProcessNode }) {\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\">\n <Icon\n name={process.is_root ? \"codicon:server-process\" : \"codicon:debug-alt\"}\n className=\"text-2xl text-blue-600\"\n />\n <h2 className=\"text-lg font-bold text-foreground break-words\">{processLabel(process)}</h2>\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 {process.status ? (\n <span\n className={`inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 ${processStateColor(\n process.status,\n )}`}\n >\n <Icon name={processStateIcon(process.status)} />\n {process.status}\n </span>\n ) : null}\n </div>\n </div>\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 = { state: string; userFrameCount: number; searchText: string };\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};\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 } = 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 <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 name=\"codicon:search\"\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 {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 />\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\n name={\n busy\n ? \"svg-spinners:ring-resize\"\n : primary\n ? \"codicon:debug-alt-small\"\n : \"codicon:refresh\"\n }\n />\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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"}
@@ -0,0 +1,9 @@
1
+ import { ProcessNode } from './types';
2
+ export type DiagnosticsTreeProps = {
3
+ root?: ProcessNode;
4
+ selectedPid?: number | null;
5
+ expandAll?: boolean | null;
6
+ onSelect: (pid: number) => void;
7
+ };
8
+ export declare function DiagnosticsTree({ root, selectedPid, expandAll, onSelect, }: DiagnosticsTreeProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=DiagnosticsTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticsTree.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/DiagnosticsTree.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAS3C,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,WAAW,EACX,SAAgB,EAChB,QAAQ,GACT,EAAE,oBAAoB,2CAsEtB"}
@@ -0,0 +1,78 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { Tree } from "../Tree.js";
3
+ import { Icon } from "../Icon.js";
4
+ import { countProcesses, processLabel, processStateIcon, processStateColor, formatBytes } from "./utils.js";
5
+ function DiagnosticsTree({
6
+ root,
7
+ selectedPid,
8
+ expandAll = null,
9
+ onSelect
10
+ }) {
11
+ if (!root) {
12
+ return /* @__PURE__ */ jsxs("div", { className: "p-density-6 text-center text-muted-foreground", children: [
13
+ /* @__PURE__ */ jsx(Icon, { name: "svg-spinners:ring-resize", className: "text-3xl text-blue-500" }),
14
+ /* @__PURE__ */ jsx("p", { className: "mt-density-2", children: "Waiting for process diagnostics..." })
15
+ ] });
16
+ }
17
+ if (countProcesses(root) === 0) {
18
+ return /* @__PURE__ */ jsx("div", { className: "p-density-6 text-center text-muted-foreground text-sm", children: "No processes available" });
19
+ }
20
+ return /* @__PURE__ */ jsx(
21
+ Tree,
22
+ {
23
+ roots: [root],
24
+ getChildren: (n) => n.children,
25
+ getKey: (n) => n.pid,
26
+ expandAll,
27
+ defaultOpen: (n, depth) => !!n.is_root || depth < 1,
28
+ onSelect: (n) => onSelect(n.pid),
29
+ renderRow: ({ node }) => {
30
+ const selected = node.pid === selectedPid;
31
+ const cpu = node.cpu_percent || 0;
32
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
33
+ /* @__PURE__ */ jsx(
34
+ Icon,
35
+ {
36
+ name: node.is_root ? "codicon:server-process" : "codicon:debug-alt",
37
+ className: node.is_root ? "text-base text-blue-600" : "text-base text-muted-foreground"
38
+ }
39
+ ),
40
+ /* @__PURE__ */ jsx(
41
+ "span",
42
+ {
43
+ className: `truncate ${selected ? "font-semibold text-primary" : "font-medium text-foreground"}`,
44
+ children: processLabel(node)
45
+ }
46
+ ),
47
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground shrink-0", children: [
48
+ "pid ",
49
+ node.pid
50
+ ] }),
51
+ /* @__PURE__ */ jsx("span", { className: "flex-1" }),
52
+ node.status && /* @__PURE__ */ jsxs(
53
+ "span",
54
+ {
55
+ className: `inline-flex items-center gap-1 text-xs shrink-0 ${processStateColor(
56
+ node.status
57
+ )}`,
58
+ children: [
59
+ /* @__PURE__ */ jsx(Icon, { name: processStateIcon(node.status) }),
60
+ node.status
61
+ ]
62
+ }
63
+ ),
64
+ /* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground shrink-0 tabular-nums", children: [
65
+ cpu.toFixed(1),
66
+ "%"
67
+ ] }),
68
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground shrink-0 tabular-nums", children: formatBytes(node.rss) })
69
+ ] });
70
+ },
71
+ rowClass: (node) => node.pid === selectedPid ? "bg-primary/10 border-l-2 border-primary" : "hover:bg-accent"
72
+ }
73
+ );
74
+ }
75
+ export {
76
+ DiagnosticsTree
77
+ };
78
+ //# sourceMappingURL=DiagnosticsTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiagnosticsTree.js","sources":["../../../src/data/diagnostics/DiagnosticsTree.tsx"],"sourcesContent":["import { Tree } from \"../Tree\";\nimport { Icon } from \"../Icon\";\nimport type { ProcessNode } from \"./types\";\nimport {\n countProcesses,\n formatBytes,\n processLabel,\n processStateColor,\n processStateIcon,\n} from \"./utils\";\n\nexport type DiagnosticsTreeProps = {\n root?: ProcessNode;\n selectedPid?: number | null;\n expandAll?: boolean | null;\n onSelect: (pid: number) => void;\n};\n\nexport function DiagnosticsTree({\n root,\n selectedPid,\n expandAll = null,\n onSelect,\n}: DiagnosticsTreeProps) {\n if (!root) {\n return (\n <div className=\"p-density-6 text-center text-muted-foreground\">\n <Icon name=\"svg-spinners:ring-resize\" className=\"text-3xl text-blue-500\" />\n <p className=\"mt-density-2\">Waiting for process diagnostics...</p>\n </div>\n );\n }\n\n if (countProcesses(root) === 0) {\n return (\n <div className=\"p-density-6 text-center text-muted-foreground text-sm\">\n No processes available\n </div>\n );\n }\n\n return (\n <Tree<ProcessNode>\n roots={[root]}\n getChildren={(n) => n.children}\n getKey={(n) => n.pid}\n expandAll={expandAll}\n defaultOpen={(n, depth) => !!n.is_root || depth < 1}\n onSelect={(n) => onSelect(n.pid)}\n renderRow={({ node }) => {\n const selected = node.pid === selectedPid;\n const cpu = node.cpu_percent || 0;\n return (\n <>\n <Icon\n name={node.is_root ? \"codicon:server-process\" : \"codicon:debug-alt\"}\n className={\n node.is_root ? \"text-base text-blue-600\" : \"text-base text-muted-foreground\"\n }\n />\n <span\n className={`truncate ${\n selected ? \"font-semibold text-primary\" : \"font-medium text-foreground\"\n }`}\n >\n {processLabel(node)}\n </span>\n <span className=\"text-xs text-muted-foreground shrink-0\">pid {node.pid}</span>\n <span className=\"flex-1\" />\n {node.status && (\n <span\n className={`inline-flex items-center gap-1 text-xs shrink-0 ${processStateColor(\n node.status,\n )}`}\n >\n <Icon name={processStateIcon(node.status)} />\n {node.status}\n </span>\n )}\n <span className=\"text-xs text-muted-foreground shrink-0 tabular-nums\">\n {cpu.toFixed(1)}%\n </span>\n <span className=\"text-xs text-muted-foreground shrink-0 tabular-nums\">\n {formatBytes(node.rss)}\n </span>\n </>\n );\n }}\n rowClass={(node) =>\n node.pid === selectedPid ? \"bg-primary/10 border-l-2 border-primary\" : \"hover:bg-accent\"\n }\n />\n );\n}\n"],"names":[],"mappings":";;;;AAkBO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAAyB;AACvB,MAAI,CAAC,MAAM;AACT,WACE,qBAAC,OAAA,EAAI,WAAU,iDACb,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAK,MAAK,4BAA2B,WAAU,0BAAyB;AAAA,MACzE,oBAAC,KAAA,EAAE,WAAU,gBAAe,UAAA,qCAAA,CAAkC;AAAA,IAAA,GAChE;AAAA,EAEJ;AAEA,MAAI,eAAe,IAAI,MAAM,GAAG;AAC9B,WACE,oBAAC,OAAA,EAAI,WAAU,yDAAwD,UAAA,0BAEvE;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO,CAAC,IAAI;AAAA,MACZ,aAAa,CAAC,MAAM,EAAE;AAAA,MACtB,QAAQ,CAAC,MAAM,EAAE;AAAA,MACjB;AAAA,MACA,aAAa,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,WAAW,QAAQ;AAAA,MAClD,UAAU,CAAC,MAAM,SAAS,EAAE,GAAG;AAAA,MAC/B,WAAW,CAAC,EAAE,WAAW;AACvB,cAAM,WAAW,KAAK,QAAQ;AAC9B,cAAM,MAAM,KAAK,eAAe;AAChC,eACE,qBAAA,UAAA,EACE,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM,KAAK,UAAU,2BAA2B;AAAA,cAChD,WACE,KAAK,UAAU,4BAA4B;AAAA,YAAA;AAAA,UAAA;AAAA,UAG/C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,YACT,WAAW,+BAA+B,6BAC5C;AAAA,cAEC,uBAAa,IAAI;AAAA,YAAA;AAAA,UAAA;AAAA,UAEpB,qBAAC,QAAA,EAAK,WAAU,0CAAyC,UAAA;AAAA,YAAA;AAAA,YAAK,KAAK;AAAA,UAAA,GAAI;AAAA,UACvE,oBAAC,QAAA,EAAK,WAAU,SAAA,CAAS;AAAA,UACxB,KAAK,UACJ;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW,mDAAmD;AAAA,gBAC5D,KAAK;AAAA,cAAA,CACN;AAAA,cAED,UAAA;AAAA,gBAAA,oBAAC,MAAA,EAAK,MAAM,iBAAiB,KAAK,MAAM,GAAG;AAAA,gBAC1C,KAAK;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGV,qBAAC,QAAA,EAAK,WAAU,uDACb,UAAA;AAAA,YAAA,IAAI,QAAQ,CAAC;AAAA,YAAE;AAAA,UAAA,GAClB;AAAA,8BACC,QAAA,EAAK,WAAU,uDACb,UAAA,YAAY,KAAK,GAAG,EAAA,CACvB;AAAA,QAAA,GACF;AAAA,MAEJ;AAAA,MACA,UAAU,CAAC,SACT,KAAK,QAAQ,cAAc,4CAA4C;AAAA,IAAA;AAAA,EAAA;AAI/E;"}
@@ -0,0 +1,20 @@
1
+ import { ReactNode } from 'react';
2
+ import { ErrorDiagnostics } from './error-diagnostics';
3
+ export type ErrorDetailsProps = {
4
+ diagnostics: ErrorDiagnostics;
5
+ renderJsonContext?: (entry: {
6
+ label: string;
7
+ value: string;
8
+ data: unknown;
9
+ }) => ReactNode;
10
+ };
11
+ export declare function ErrorDetails({ diagnostics, renderJsonContext }: ErrorDetailsProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function PrettyStackTrace({ stacktrace }: {
13
+ stacktrace: string;
14
+ }): import("react/jsx-runtime").JSX.Element;
15
+ export declare function CopyBadge({ label, value, className, }: {
16
+ label: string;
17
+ value: string;
18
+ className?: string;
19
+ }): import("react/jsx-runtime").JSX.Element;
20
+ //# sourceMappingURL=ErrorDetails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorDetails.d.ts","sourceRoot":"","sources":["../../../src/data/diagnostics/ErrorDetails.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAKL,KAAK,gBAAgB,EAEtB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,gBAAgB,CAAC;IAI9B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,SAAS,CAAC;CAC3F,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,WAAW,EAAE,iBAAiB,EAAE,EAAE,iBAAiB,2CA4FjF;AAED,wBAAgB,gBAAgB,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,2CAmCtE;AAiCD,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,KAAK,EACL,SAAc,GACf,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAkBA"}