@flanksource/clicky-ui 0.2.13 → 0.2.15

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 (466) hide show
  1. package/dist/chat.cjs +20 -0
  2. package/dist/chat.cjs.map +1 -0
  3. package/dist/chat.d.ts +2 -0
  4. package/dist/chat.d.ts.map +1 -0
  5. package/dist/chat.js +20 -0
  6. package/dist/chat.js.map +1 -0
  7. package/dist/components/Combobox.cjs +5 -3
  8. package/dist/components/Combobox.cjs.map +1 -1
  9. package/dist/components/Combobox.d.ts +2 -0
  10. package/dist/components/Combobox.d.ts.map +1 -1
  11. package/dist/components/Combobox.js +5 -3
  12. package/dist/components/Combobox.js.map +1 -1
  13. package/dist/components/DateTimePicker.cjs +3 -1
  14. package/dist/components/DateTimePicker.cjs.map +1 -1
  15. package/dist/components/DateTimePicker.d.ts +5 -1
  16. package/dist/components/DateTimePicker.d.ts.map +1 -1
  17. package/dist/components/DateTimePicker.js +3 -1
  18. package/dist/components/DateTimePicker.js.map +1 -1
  19. package/dist/components/FilterBar.cjs +8 -41
  20. package/dist/components/FilterBar.cjs.map +1 -1
  21. package/dist/components/FilterBar.d.ts +0 -2
  22. package/dist/components/FilterBar.d.ts.map +1 -1
  23. package/dist/components/FilterBar.js +3 -36
  24. package/dist/components/FilterBar.js.map +1 -1
  25. package/dist/components/FormatOptionsDropdown.cjs +2 -18
  26. package/dist/components/FormatOptionsDropdown.cjs.map +1 -1
  27. package/dist/components/FormatOptionsDropdown.d.ts +1 -17
  28. package/dist/components/FormatOptionsDropdown.d.ts.map +1 -1
  29. package/dist/components/FormatOptionsDropdown.js +1 -17
  30. package/dist/components/FormatOptionsDropdown.js.map +1 -1
  31. package/dist/components/JsonSchemaForm.cjs +128 -12
  32. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  33. package/dist/components/JsonSchemaForm.d.ts +1 -1
  34. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  35. package/dist/components/JsonSchemaForm.js +131 -15
  36. package/dist/components/JsonSchemaForm.js.map +1 -1
  37. package/dist/components/SecretKeySelector.cjs +1 -2
  38. package/dist/components/SecretKeySelector.cjs.map +1 -1
  39. package/dist/components/SecretKeySelector.d.ts +5 -3
  40. package/dist/components/SecretKeySelector.d.ts.map +1 -1
  41. package/dist/components/SecretKeySelector.js +2 -3
  42. package/dist/components/SecretKeySelector.js.map +1 -1
  43. package/dist/components/TreePickerField.cjs +137 -0
  44. package/dist/components/TreePickerField.cjs.map +1 -0
  45. package/dist/components/TreePickerField.d.ts +30 -0
  46. package/dist/components/TreePickerField.d.ts.map +1 -0
  47. package/dist/components/TreePickerField.js +137 -0
  48. package/dist/components/TreePickerField.js.map +1 -0
  49. package/dist/components/WorkloadPicker.cjs +6 -81
  50. package/dist/components/WorkloadPicker.cjs.map +1 -1
  51. package/dist/components/WorkloadPicker.d.ts +1 -20
  52. package/dist/components/WorkloadPicker.d.ts.map +1 -1
  53. package/dist/components/WorkloadPicker.js +3 -78
  54. package/dist/components/WorkloadPicker.js.map +1 -1
  55. package/dist/components/button-variants.cjs +30 -0
  56. package/dist/components/button-variants.cjs.map +1 -0
  57. package/dist/components/button-variants.d.ts +5 -0
  58. package/dist/components/button-variants.d.ts.map +1 -0
  59. package/dist/components/button-variants.js +30 -0
  60. package/dist/components/button-variants.js.map +1 -0
  61. package/dist/components/button.cjs +11 -82
  62. package/dist/components/button.cjs.map +1 -1
  63. package/dist/components/button.d.ts +1 -5
  64. package/dist/components/button.d.ts.map +1 -1
  65. package/dist/components/button.js +5 -76
  66. package/dist/components/button.js.map +1 -1
  67. package/dist/components/filter-bar-utils.cjs +37 -0
  68. package/dist/components/filter-bar-utils.cjs.map +1 -0
  69. package/dist/components/filter-bar-utils.d.ts +4 -0
  70. package/dist/components/filter-bar-utils.d.ts.map +1 -0
  71. package/dist/components/filter-bar-utils.js +37 -0
  72. package/dist/components/filter-bar-utils.js.map +1 -0
  73. package/dist/components/format-options.cjs +20 -0
  74. package/dist/components/format-options.cjs.map +1 -0
  75. package/dist/components/format-options.d.ts +18 -0
  76. package/dist/components/format-options.d.ts.map +1 -0
  77. package/dist/components/format-options.js +20 -0
  78. package/dist/components/format-options.js.map +1 -0
  79. package/dist/components/json-schema-form-array.cjs +13 -17
  80. package/dist/components/json-schema-form-array.cjs.map +1 -1
  81. package/dist/components/json-schema-form-array.d.ts +1 -2
  82. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  83. package/dist/components/json-schema-form-array.js +3 -7
  84. package/dist/components/json-schema-form-array.js.map +1 -1
  85. package/dist/components/json-schema-form-fields.cjs +90 -232
  86. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  87. package/dist/components/json-schema-form-fields.d.ts +51 -6
  88. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  89. package/dist/components/json-schema-form-fields.js +82 -224
  90. package/dist/components/json-schema-form-fields.js.map +1 -1
  91. package/dist/components/json-schema-form-object.cjs +149 -0
  92. package/dist/components/json-schema-form-object.cjs.map +1 -0
  93. package/dist/components/json-schema-form-object.d.ts +10 -0
  94. package/dist/components/json-schema-form-object.d.ts.map +1 -0
  95. package/dist/components/json-schema-form-object.js +149 -0
  96. package/dist/components/json-schema-form-object.js.map +1 -0
  97. package/dist/components/json-schema-form-preferences.cjs +41 -0
  98. package/dist/components/json-schema-form-preferences.cjs.map +1 -0
  99. package/dist/components/json-schema-form-preferences.d.ts +10 -0
  100. package/dist/components/json-schema-form-preferences.d.ts.map +1 -0
  101. package/dist/components/json-schema-form-preferences.js +41 -0
  102. package/dist/components/json-schema-form-preferences.js.map +1 -0
  103. package/dist/components/json-schema-form-render.cjs +43 -72
  104. package/dist/components/json-schema-form-render.cjs.map +1 -1
  105. package/dist/components/json-schema-form-render.d.ts +5 -33
  106. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  107. package/dist/components/json-schema-form-render.js +41 -70
  108. package/dist/components/json-schema-form-render.js.map +1 -1
  109. package/dist/components/json-schema-form-resolve.cjs +9 -1
  110. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  111. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  112. package/dist/components/json-schema-form-resolve.js +9 -1
  113. package/dist/components/json-schema-form-resolve.js.map +1 -1
  114. package/dist/components/json-schema-form-types.d.ts +58 -1
  115. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  116. package/dist/components/json-schema-form-utils.cjs +96 -0
  117. package/dist/components/json-schema-form-utils.cjs.map +1 -0
  118. package/dist/components/json-schema-form-utils.d.ts +17 -0
  119. package/dist/components/json-schema-form-utils.d.ts.map +1 -0
  120. package/dist/components/json-schema-form-utils.js +96 -0
  121. package/dist/components/json-schema-form-utils.js.map +1 -0
  122. package/dist/components/loading.cjs +109 -0
  123. package/dist/components/loading.cjs.map +1 -0
  124. package/dist/components/loading.d.ts +27 -0
  125. package/dist/components/loading.d.ts.map +1 -0
  126. package/dist/components/loading.js +109 -0
  127. package/dist/components/loading.js.map +1 -0
  128. package/dist/components/workload-picker-utils.cjs +88 -0
  129. package/dist/components/workload-picker-utils.cjs.map +1 -0
  130. package/dist/components/workload-picker-utils.d.ts +34 -0
  131. package/dist/components/workload-picker-utils.d.ts.map +1 -0
  132. package/dist/components/workload-picker-utils.js +88 -0
  133. package/dist/components/workload-picker-utils.js.map +1 -0
  134. package/dist/components.cjs +18 -6
  135. package/dist/components.cjs.map +1 -1
  136. package/dist/components.d.ts +10 -3
  137. package/dist/components.d.ts.map +1 -1
  138. package/dist/components.js +16 -4
  139. package/dist/components.js.map +1 -1
  140. package/dist/data/Badge.cjs +11 -91
  141. package/dist/data/Badge.cjs.map +1 -1
  142. package/dist/data/Badge.d.ts +1 -5
  143. package/dist/data/Badge.d.ts.map +1 -1
  144. package/dist/data/Badge.js +11 -91
  145. package/dist/data/Badge.js.map +1 -1
  146. package/dist/data/Clicky.cjs +4 -3
  147. package/dist/data/Clicky.cjs.map +1 -1
  148. package/dist/data/Clicky.d.ts.map +1 -1
  149. package/dist/data/Clicky.js +4 -3
  150. package/dist/data/Clicky.js.map +1 -1
  151. package/dist/data/DataTable.cjs +161 -156
  152. package/dist/data/DataTable.cjs.map +1 -1
  153. package/dist/data/DataTable.d.ts +25 -4
  154. package/dist/data/DataTable.d.ts.map +1 -1
  155. package/dist/data/DataTable.js +140 -135
  156. package/dist/data/DataTable.js.map +1 -1
  157. package/dist/data/FilterPill.cjs +3 -0
  158. package/dist/data/FilterPill.cjs.map +1 -1
  159. package/dist/data/FilterPill.d.ts.map +1 -1
  160. package/dist/data/FilterPill.js +3 -0
  161. package/dist/data/FilterPill.js.map +1 -1
  162. package/dist/data/Icon.cjs +7 -7
  163. package/dist/data/Icon.cjs.map +1 -1
  164. package/dist/data/Icon.js +7 -7
  165. package/dist/data/Icon.js.map +1 -1
  166. package/dist/data/LogDetails.cjs +5 -14
  167. package/dist/data/LogDetails.cjs.map +1 -1
  168. package/dist/data/LogDetails.d.ts +8 -4
  169. package/dist/data/LogDetails.d.ts.map +1 -1
  170. package/dist/data/LogDetails.js +4 -13
  171. package/dist/data/LogDetails.js.map +1 -1
  172. package/dist/data/LogsTable.cjs +6 -165
  173. package/dist/data/LogsTable.cjs.map +1 -1
  174. package/dist/data/LogsTable.d.ts +2 -15
  175. package/dist/data/LogsTable.d.ts.map +1 -1
  176. package/dist/data/LogsTable.js +6 -165
  177. package/dist/data/LogsTable.js.map +1 -1
  178. package/dist/data/TimeseriesCoreBars.cjs +8 -1
  179. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  180. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  181. package/dist/data/TimeseriesCoreBars.js +8 -1
  182. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  183. package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
  184. package/dist/data/TimeseriesPanel.axes.js.map +1 -1
  185. package/dist/data/TreeNode.cjs +13 -7
  186. package/dist/data/TreeNode.cjs.map +1 -1
  187. package/dist/data/TreeNode.d.ts.map +1 -1
  188. package/dist/data/TreeNode.js +13 -7
  189. package/dist/data/TreeNode.js.map +1 -1
  190. package/dist/data/badge-variants.cjs +85 -0
  191. package/dist/data/badge-variants.cjs.map +1 -0
  192. package/dist/data/badge-variants.d.ts +6 -0
  193. package/dist/data/badge-variants.d.ts.map +1 -0
  194. package/dist/data/badge-variants.js +85 -0
  195. package/dist/data/badge-variants.js.map +1 -0
  196. package/dist/data/cache-browser/CacheBrowser.cjs +59 -0
  197. package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -0
  198. package/dist/data/cache-browser/CacheBrowser.d.ts +26 -0
  199. package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -0
  200. package/dist/data/cache-browser/CacheBrowser.js +59 -0
  201. package/dist/data/cache-browser/CacheBrowser.js.map +1 -0
  202. package/dist/data/cache-browser/CacheDetailPanel.cjs +193 -0
  203. package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -0
  204. package/dist/data/cache-browser/CacheDetailPanel.d.ts +20 -0
  205. package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -0
  206. package/dist/data/cache-browser/CacheDetailPanel.js +193 -0
  207. package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -0
  208. package/dist/data/cache-browser/CacheStatsOverview.cjs +126 -0
  209. package/dist/data/cache-browser/CacheStatsOverview.cjs.map +1 -0
  210. package/dist/data/cache-browser/CacheStatsOverview.d.ts +17 -0
  211. package/dist/data/cache-browser/CacheStatsOverview.d.ts.map +1 -0
  212. package/dist/data/cache-browser/CacheStatsOverview.js +126 -0
  213. package/dist/data/cache-browser/CacheStatsOverview.js.map +1 -0
  214. package/dist/data/cache-browser/CacheTree.cjs +189 -0
  215. package/dist/data/cache-browser/CacheTree.cjs.map +1 -0
  216. package/dist/data/cache-browser/CacheTree.d.ts +27 -0
  217. package/dist/data/cache-browser/CacheTree.d.ts.map +1 -0
  218. package/dist/data/cache-browser/CacheTree.js +189 -0
  219. package/dist/data/cache-browser/CacheTree.js.map +1 -0
  220. package/dist/data/cache-browser/CacheValue.cjs +86 -0
  221. package/dist/data/cache-browser/CacheValue.cjs.map +1 -0
  222. package/dist/data/cache-browser/CacheValue.d.ts +11 -0
  223. package/dist/data/cache-browser/CacheValue.d.ts.map +1 -0
  224. package/dist/data/cache-browser/CacheValue.js +86 -0
  225. package/dist/data/cache-browser/CacheValue.js.map +1 -0
  226. package/dist/data/cache-browser/adapter.cjs +52 -0
  227. package/dist/data/cache-browser/adapter.cjs.map +1 -0
  228. package/dist/data/cache-browser/adapter.d.ts +48 -0
  229. package/dist/data/cache-browser/adapter.d.ts.map +1 -0
  230. package/dist/data/cache-browser/adapter.js +52 -0
  231. package/dist/data/cache-browser/adapter.js.map +1 -0
  232. package/dist/data/cache-browser/api.cjs +42 -0
  233. package/dist/data/cache-browser/api.cjs.map +1 -0
  234. package/dist/data/cache-browser/api.d.ts +33 -0
  235. package/dist/data/cache-browser/api.d.ts.map +1 -0
  236. package/dist/data/cache-browser/api.js +42 -0
  237. package/dist/data/cache-browser/api.js.map +1 -0
  238. package/dist/data/cache-browser/index.d.ts +9 -0
  239. package/dist/data/cache-browser/index.d.ts.map +1 -0
  240. package/dist/data/cache-browser/types.cjs +7 -0
  241. package/dist/data/cache-browser/types.cjs.map +1 -0
  242. package/dist/data/cache-browser/types.d.ts +78 -0
  243. package/dist/data/cache-browser/types.d.ts.map +1 -0
  244. package/dist/data/cache-browser/types.js +7 -0
  245. package/dist/data/cache-browser/types.js.map +1 -0
  246. package/dist/data/cells/TagList.cjs +4 -101
  247. package/dist/data/cells/TagList.cjs.map +1 -1
  248. package/dist/data/cells/TagList.d.ts +1 -49
  249. package/dist/data/cells/TagList.d.ts.map +1 -1
  250. package/dist/data/cells/TagList.js +3 -100
  251. package/dist/data/cells/TagList.js.map +1 -1
  252. package/dist/data/cells/Timestamp.cjs +3 -192
  253. package/dist/data/cells/Timestamp.cjs.map +1 -1
  254. package/dist/data/cells/Timestamp.d.ts +1 -50
  255. package/dist/data/cells/Timestamp.d.ts.map +1 -1
  256. package/dist/data/cells/Timestamp.js +2 -191
  257. package/dist/data/cells/Timestamp.js.map +1 -1
  258. package/dist/data/cells/tag-utils.cjs +103 -0
  259. package/dist/data/cells/tag-utils.cjs.map +1 -0
  260. package/dist/data/cells/tag-utils.d.ts +51 -0
  261. package/dist/data/cells/tag-utils.d.ts.map +1 -0
  262. package/dist/data/cells/tag-utils.js +103 -0
  263. package/dist/data/cells/tag-utils.js.map +1 -0
  264. package/dist/data/cells/timestamp-format.cjs +193 -0
  265. package/dist/data/cells/timestamp-format.cjs.map +1 -0
  266. package/dist/data/cells/timestamp-format.d.ts +51 -0
  267. package/dist/data/cells/timestamp-format.d.ts.map +1 -0
  268. package/dist/data/cells/timestamp-format.js +193 -0
  269. package/dist/data/cells/timestamp-format.js.map +1 -0
  270. package/dist/data/chat/Chat.cjs +48 -0
  271. package/dist/data/chat/Chat.cjs.map +1 -0
  272. package/dist/data/chat/Chat.d.ts +26 -0
  273. package/dist/data/chat/Chat.d.ts.map +1 -0
  274. package/dist/data/chat/Chat.fixtures.d.ts +6 -0
  275. package/dist/data/chat/Chat.fixtures.d.ts.map +1 -0
  276. package/dist/data/chat/Chat.js +48 -0
  277. package/dist/data/chat/Chat.js.map +1 -0
  278. package/dist/data/chat/Conversation.cjs +34 -0
  279. package/dist/data/chat/Conversation.cjs.map +1 -0
  280. package/dist/data/chat/Conversation.d.ts +11 -0
  281. package/dist/data/chat/Conversation.d.ts.map +1 -0
  282. package/dist/data/chat/Conversation.js +34 -0
  283. package/dist/data/chat/Conversation.js.map +1 -0
  284. package/dist/data/chat/Message.cjs +44 -0
  285. package/dist/data/chat/Message.cjs.map +1 -0
  286. package/dist/data/chat/Message.d.ts +10 -0
  287. package/dist/data/chat/Message.d.ts.map +1 -0
  288. package/dist/data/chat/Message.js +44 -0
  289. package/dist/data/chat/Message.js.map +1 -0
  290. package/dist/data/chat/PromptInput.cjs +61 -0
  291. package/dist/data/chat/PromptInput.cjs.map +1 -0
  292. package/dist/data/chat/PromptInput.d.ts +16 -0
  293. package/dist/data/chat/PromptInput.d.ts.map +1 -0
  294. package/dist/data/chat/PromptInput.js +61 -0
  295. package/dist/data/chat/PromptInput.js.map +1 -0
  296. package/dist/data/chat/ToolCall.cjs +92 -0
  297. package/dist/data/chat/ToolCall.cjs.map +1 -0
  298. package/dist/data/chat/ToolCall.d.ts +14 -0
  299. package/dist/data/chat/ToolCall.d.ts.map +1 -0
  300. package/dist/data/chat/ToolCall.js +92 -0
  301. package/dist/data/chat/ToolCall.js.map +1 -0
  302. package/dist/data/chat/clickyOperationsToTools.cjs +73 -0
  303. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -0
  304. package/dist/data/chat/clickyOperationsToTools.d.ts +10 -0
  305. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -0
  306. package/dist/data/chat/clickyOperationsToTools.js +73 -0
  307. package/dist/data/chat/clickyOperationsToTools.js.map +1 -0
  308. package/dist/data/chat/index.d.ts +8 -0
  309. package/dist/data/chat/index.d.ts.map +1 -0
  310. package/dist/data/chat/types.cjs +18 -0
  311. package/dist/data/chat/types.cjs.map +1 -0
  312. package/dist/data/chat/types.d.ts +41 -0
  313. package/dist/data/chat/types.d.ts.map +1 -0
  314. package/dist/data/chat/types.js +18 -0
  315. package/dist/data/chat/types.js.map +1 -0
  316. package/dist/data/data-table-utils.cjs +55 -0
  317. package/dist/data/data-table-utils.cjs.map +1 -0
  318. package/dist/data/data-table-utils.d.ts +24 -0
  319. package/dist/data/data-table-utils.d.ts.map +1 -0
  320. package/dist/data/data-table-utils.js +55 -0
  321. package/dist/data/data-table-utils.js.map +1 -0
  322. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +2 -1
  323. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  324. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  325. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +3 -2
  326. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  327. package/dist/data/diagnostics/GoroutineCard.cjs +3 -22
  328. package/dist/data/diagnostics/GoroutineCard.cjs.map +1 -1
  329. package/dist/data/diagnostics/GoroutineCard.d.ts +0 -2
  330. package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -1
  331. package/dist/data/diagnostics/GoroutineCard.js +2 -21
  332. package/dist/data/diagnostics/GoroutineCard.js.map +1 -1
  333. package/dist/data/diagnostics/ThreadCard.cjs +3 -38
  334. package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
  335. package/dist/data/diagnostics/ThreadCard.d.ts +0 -2
  336. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
  337. package/dist/data/diagnostics/ThreadCard.js +2 -37
  338. package/dist/data/diagnostics/ThreadCard.js.map +1 -1
  339. package/dist/data/diagnostics/state-styles.cjs +59 -0
  340. package/dist/data/diagnostics/state-styles.cjs.map +1 -0
  341. package/dist/data/diagnostics/state-styles.d.ts +5 -0
  342. package/dist/data/diagnostics/state-styles.d.ts.map +1 -0
  343. package/dist/data/diagnostics/state-styles.js +59 -0
  344. package/dist/data/diagnostics/state-styles.js.map +1 -0
  345. package/dist/data/logs-normalize.cjs +166 -0
  346. package/dist/data/logs-normalize.cjs.map +1 -0
  347. package/dist/data/logs-normalize.d.ts +16 -0
  348. package/dist/data/logs-normalize.d.ts.map +1 -0
  349. package/dist/data/logs-normalize.js +166 -0
  350. package/dist/data/logs-normalize.js.map +1 -0
  351. package/dist/data/task-status.cjs +19 -19
  352. package/dist/data/task-status.cjs.map +1 -1
  353. package/dist/data/task-status.js +19 -19
  354. package/dist/data/task-status.js.map +1 -1
  355. package/dist/data/version-info.cjs +3 -3
  356. package/dist/data/version-info.js +3 -3
  357. package/dist/data.cjs +43 -18
  358. package/dist/data.cjs.map +1 -1
  359. package/dist/data.d.ts +11 -5
  360. package/dist/data.d.ts.map +1 -1
  361. package/dist/data.js +30 -5
  362. package/dist/data.js.map +1 -1
  363. package/dist/hooks/density-provider.cjs +38 -0
  364. package/dist/hooks/density-provider.cjs.map +1 -0
  365. package/dist/hooks/density-provider.d.ts +20 -0
  366. package/dist/hooks/density-provider.d.ts.map +1 -0
  367. package/dist/hooks/density-provider.js +38 -0
  368. package/dist/hooks/density-provider.js.map +1 -0
  369. package/dist/hooks/theme-provider.cjs +43 -0
  370. package/dist/hooks/theme-provider.cjs.map +1 -0
  371. package/dist/hooks/theme-provider.d.ts +9 -0
  372. package/dist/hooks/theme-provider.d.ts.map +1 -0
  373. package/dist/hooks/theme-provider.js +43 -0
  374. package/dist/hooks/theme-provider.js.map +1 -0
  375. package/dist/hooks/use-density.cjs +8 -37
  376. package/dist/hooks/use-density.cjs.map +1 -1
  377. package/dist/hooks/use-density.d.ts +5 -20
  378. package/dist/hooks/use-density.d.ts.map +1 -1
  379. package/dist/hooks/use-density.js +9 -38
  380. package/dist/hooks/use-density.js.map +1 -1
  381. package/dist/hooks/use-theme.cjs +10 -43
  382. package/dist/hooks/use-theme.cjs.map +1 -1
  383. package/dist/hooks/use-theme.d.ts +6 -9
  384. package/dist/hooks/use-theme.d.ts.map +1 -1
  385. package/dist/hooks/use-theme.js +11 -44
  386. package/dist/hooks/use-theme.js.map +1 -1
  387. package/dist/hooks.cjs +5 -2
  388. package/dist/hooks.cjs.map +1 -1
  389. package/dist/hooks.d.ts +4 -2
  390. package/dist/hooks.d.ts.map +1 -1
  391. package/dist/hooks.js +5 -2
  392. package/dist/hooks.js.map +1 -1
  393. package/dist/icons/changeIconAliases.cjs +13 -13
  394. package/dist/icons/changeIconAliases.cjs.map +1 -1
  395. package/dist/icons/changeIconAliases.d.ts.map +1 -1
  396. package/dist/icons/changeIconAliases.js +13 -13
  397. package/dist/icons/changeIconAliases.js.map +1 -1
  398. package/dist/index.cjs +71 -30
  399. package/dist/index.cjs.map +1 -1
  400. package/dist/index.js +53 -12
  401. package/dist/index.js.map +1 -1
  402. package/dist/overlay/DropdownMenu.cjs +2 -0
  403. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  404. package/dist/overlay/DropdownMenu.d.ts +3 -1
  405. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  406. package/dist/overlay/DropdownMenu.js +2 -0
  407. package/dist/overlay/DropdownMenu.js.map +1 -1
  408. package/dist/overlay/Modal.cjs +11 -4
  409. package/dist/overlay/Modal.cjs.map +1 -1
  410. package/dist/overlay/Modal.d.ts +1 -1
  411. package/dist/overlay/Modal.d.ts.map +1 -1
  412. package/dist/overlay/Modal.js +11 -4
  413. package/dist/overlay/Modal.js.map +1 -1
  414. package/dist/overlay/modalStack.cjs +35 -0
  415. package/dist/overlay/modalStack.cjs.map +1 -0
  416. package/dist/overlay/modalStack.d.ts +13 -0
  417. package/dist/overlay/modalStack.d.ts.map +1 -0
  418. package/dist/overlay/modalStack.js +35 -0
  419. package/dist/overlay/modalStack.js.map +1 -0
  420. package/dist/rpc/AcceptPicker.cjs +2 -18
  421. package/dist/rpc/AcceptPicker.cjs.map +1 -1
  422. package/dist/rpc/AcceptPicker.d.ts +1 -41
  423. package/dist/rpc/AcceptPicker.d.ts.map +1 -1
  424. package/dist/rpc/AcceptPicker.js +2 -18
  425. package/dist/rpc/AcceptPicker.js.map +1 -1
  426. package/dist/rpc/CommandOutput.cjs +1 -1
  427. package/dist/rpc/CommandOutput.cjs.map +1 -1
  428. package/dist/rpc/CommandOutput.js +1 -1
  429. package/dist/rpc/CommandOutput.js.map +1 -1
  430. package/dist/rpc/EndpointList.cjs +1 -1
  431. package/dist/rpc/EndpointList.cjs.map +1 -1
  432. package/dist/rpc/EndpointList.js +1 -1
  433. package/dist/rpc/EndpointList.js.map +1 -1
  434. package/dist/rpc/OperationCatalog.cjs +23 -41
  435. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  436. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  437. package/dist/rpc/OperationCatalog.js +24 -42
  438. package/dist/rpc/OperationCatalog.js.map +1 -1
  439. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  440. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  441. package/dist/rpc/OperationCommandPage.js.map +1 -1
  442. package/dist/rpc/accept-options.cjs +20 -0
  443. package/dist/rpc/accept-options.cjs.map +1 -0
  444. package/dist/rpc/accept-options.d.ts +42 -0
  445. package/dist/rpc/accept-options.d.ts.map +1 -0
  446. package/dist/rpc/accept-options.js +20 -0
  447. package/dist/rpc/accept-options.js.map +1 -0
  448. package/dist/rpc/classify.cjs +15 -4
  449. package/dist/rpc/classify.cjs.map +1 -1
  450. package/dist/rpc/classify.d.ts.map +1 -1
  451. package/dist/rpc/classify.js +15 -4
  452. package/dist/rpc/classify.js.map +1 -1
  453. package/dist/rpc/clickyMetadata.cjs +13 -3
  454. package/dist/rpc/clickyMetadata.cjs.map +1 -1
  455. package/dist/rpc/clickyMetadata.d.ts +2 -0
  456. package/dist/rpc/clickyMetadata.d.ts.map +1 -1
  457. package/dist/rpc/clickyMetadata.js +14 -4
  458. package/dist/rpc/clickyMetadata.js.map +1 -1
  459. package/dist/rpc.cjs +3 -2
  460. package/dist/rpc.cjs.map +1 -1
  461. package/dist/rpc.d.ts +2 -1
  462. package/dist/rpc.d.ts.map +1 -1
  463. package/dist/rpc.js +2 -1
  464. package/dist/rpc.js.map +1 -1
  465. package/dist/styles.css +1 -1
  466. package/package.json +16 -1
@@ -1 +1 @@
1
- {"version":3,"file":"LogDetails.js","sources":["../../src/data/LogDetails.tsx"],"sourcesContent":["import { useMemo, useState, type ReactNode } from \"react\";\nimport {\n getFilterTokens,\n type DataTableColumn,\n type DataTableRowDetailContext,\n} from \"./DataTable\";\nimport { Properties, type PropertiesAction, type PropertiesItem } from \"./Properties\";\nimport {\n TagActionsProvider,\n TagPropertiesList,\n type TagActionsContextValue,\n normalizeTags,\n} from \"./cells/TagList\";\nimport { formatPropertyLabel } from \"./properties-utils\";\nimport type { LogsTableRow } from \"./LogsTable\";\nimport { asRecord } from \"./log-utils\";\nimport { UiChevronDown, UiChevronRight, UiCopy, UiZoomIn, UiZoomOut } from \"../icons\";\n\nconst TAGS_PATH = \"details.tags\";\n\n// Key column shrinks to its content (no min/fixed width), never wider than 30ch.\nconst DETAIL_ROW_CLASS = \"grid-cols-[fit-content(30ch)_minmax(0,1fr)]\";\n\nexport function renderLogDetails(\n row: LogsTableRow,\n context: DataTableRowDetailContext<LogsTableRow>,\n): ReactNode {\n return (\n <LogDetails\n row={row}\n filterActions={context.filterActionsByColumn}\n columns={context.columns}\n />\n );\n}\n\n/**\n * Maps a top-level detail field path (`details.<columnKey>`) to its column key.\n * Returns undefined for nested paths and the tags array, which have their own\n * filter affordances.\n */\nfunction fieldColumnKey(path: string): string | undefined {\n if (!path.startsWith(\"details.\") || path === TAGS_PATH) return undefined;\n const rest = path.slice(\"details.\".length);\n return rest && !rest.includes(\".\") ? rest : undefined;\n}\n\nfunction LogDetails({\n row,\n filterActions,\n columns,\n}: {\n row: LogsTableRow;\n filterActions: Record<string, TagActionsContextValue>;\n columns: DataTableColumn<LogsTableRow>[];\n}) {\n const [openPaths, setOpenPaths] = useState<Record<string, boolean>>({});\n const setPathOpen = (path: string, open: boolean) => {\n setOpenPaths((current) => ({ ...current, [path]: open }));\n };\n const details = useMemo(() => buildProcessedLogDetails(row), [row]);\n\n const labelForPath = (path: string) => formatPropertyLabel(path.split(\".\").pop() ?? path);\n\n const columnByKey = useMemo(\n () => new Map(columns.map((column) => [column.key, column])),\n [columns],\n );\n\n // Include/exclude is wired only for fields whose column is a multi/nested-multi\n // (tristate) filter; other columns (high-cardinality text, number, timestamp)\n // don't honor multiFilters, so they get no filter actions. The toggle token\n // must match the column's filter token (e.g. a status column maps \"INFO\" to a\n // normalized status), so it is derived via getFilterTokens rather than the\n // displayed value.\n const fieldFilter = (\n path: string,\n ): { actions: TagActionsContextValue; token: string } | undefined => {\n const key = fieldColumnKey(path);\n if (!key) return undefined;\n const actions = filterActions[key];\n const column = columnByKey.get(key);\n if (!actions || !column) return undefined;\n const token = getFilterTokens(row, column)[0];\n return token ? { actions, token } : undefined;\n };\n\n const prefixActions: PropertiesAction<unknown>[] = [\n {\n id: \"expand\",\n icon: UiChevronRight,\n label: (key) => `Expand ${labelForPath(key)}`,\n visible: (_k, _v, item) => !!item.expandable,\n disabled: (_k, _v, item) => !!item.expanded,\n onClick: (_k, _v, item) => item.onToggle?.(true),\n },\n {\n id: \"collapse\",\n icon: UiChevronDown,\n label: (key) => `Collapse ${labelForPath(key)}`,\n visible: (_k, _v, item) => !!item.expandable,\n disabled: (_k, _v, item) => !item.expanded,\n onClick: (_k, _v, item) => item.onToggle?.(false),\n },\n {\n id: \"include\",\n icon: UiZoomIn,\n label: (key) => `Include ${labelForPath(key)}`,\n visible: (key) => !!fieldFilter(key),\n onClick: (key) => {\n const filter = fieldFilter(key);\n filter?.actions.toggleInclude(filter.token);\n },\n },\n {\n id: \"exclude\",\n icon: UiZoomOut,\n label: (key) => `Exclude ${labelForPath(key)}`,\n visible: (key) => !!fieldFilter(key),\n onClick: (key) => {\n const filter = fieldFilter(key);\n filter?.actions.toggleExclude(filter.token);\n },\n },\n ];\n\n // Copy sits immediately after the value (suffix), separate from the leading\n // expand/collapse/include/exclude controls.\n const suffixActions: PropertiesAction<unknown>[] = [\n {\n id: \"copy\",\n icon: UiCopy,\n label: (key) => `Copy ${labelForPath(key)}`,\n visible: (key) => key !== TAGS_PATH,\n onClick: (_k, value) => copyLogDetailsValue(value),\n },\n ];\n\n const renderLabel = (key: string) => labelForPath(key);\n const renderValue = (key: string, value: unknown, item: PropertiesItem<unknown>) => {\n if (key === TAGS_PATH) {\n const count = Array.isArray(value) ? value.length : 0;\n return <span className=\"font-mono text-muted-foreground\">[{count} tags]</span>;\n }\n return item.expandable ? <LogValueSummary value={value} /> : <LogScalarValue value={value} />;\n };\n\n const toItems = (value: unknown, path: string, depth: number): PropertiesItem<unknown>[] =>\n getValueEntries(value).map(([key, entryValue]) => {\n const entryPath = `${path}.${String(key)}`;\n const isTags = entryPath === TAGS_PATH;\n const expandable = isTags || isExpandableValue(entryValue);\n const open = openPaths[entryPath] ?? depth < 1;\n return {\n key: entryPath,\n value: entryValue,\n expandable,\n expanded: open,\n onToggle: (next) => setPathOpen(entryPath, next),\n renderChildren: () =>\n isTags ? (\n <TagPropertiesList\n tags={normalizeTags(entryValue as string[])}\n rowClassName={DETAIL_ROW_CLASS}\n />\n ) : (\n <Properties\n density=\"compact\"\n items={toItems(entryValue, entryPath, depth + 1)}\n renderLabel={renderLabel}\n renderValue={renderValue}\n prefixActions={prefixActions}\n suffixActions={suffixActions}\n rowClassName={DETAIL_ROW_CLASS}\n className=\"mt-density-1\"\n />\n ),\n };\n });\n\n const properties = (\n <Properties\n density=\"compact\"\n items={toItems(details, \"details\", 0)}\n renderLabel={renderLabel}\n renderValue={renderValue}\n prefixActions={prefixActions}\n suffixActions={suffixActions}\n rowClassName={DETAIL_ROW_CLASS}\n />\n );\n\n const tagActions = filterActions[\"tags\"];\n return (\n <div className=\"space-y-density-3 text-xs\">\n {tagActions ? (\n <TagActionsProvider value={tagActions}>{properties}</TagActionsProvider>\n ) : (\n properties\n )}\n </div>\n );\n}\n\nfunction LogValueSummary({ value }: { value: unknown }) {\n if (Array.isArray(value)) {\n return <span className=\"font-mono text-muted-foreground\">[{value.length} items]</span>;\n }\n const record = asRecord(value);\n if (record) {\n const count = Object.keys(record).length;\n return (\n <span className=\"font-mono text-muted-foreground\">\n {\"{ \"}\n {count} properties{\" }\"}\n </span>\n );\n }\n return <LogScalarValue value={value} />;\n}\n\nfunction LogScalarValue({ value }: { value: unknown }) {\n if (value === null || value === undefined) {\n return <span className=\"font-mono italic text-muted-foreground\">null</span>;\n }\n\n if (typeof value === \"string\") {\n return (\n <pre className=\"max-h-48 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed text-foreground\">\n {value}\n </pre>\n );\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return <span className=\"font-mono text-blue-700 dark:text-blue-400\">{String(value)}</span>;\n }\n\n return (\n <pre className=\"max-h-48 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed text-foreground\">\n {stablePrettyString(value)}\n </pre>\n );\n}\n\nfunction getValueEntries(value: unknown): Array<[string | number, unknown]> {\n if (Array.isArray(value)) {\n return value.map((entry, index) => [index, entry]);\n }\n return Object.entries(asRecord(value) ?? {});\n}\n\nfunction isExpandableValue(value: unknown) {\n return getValueEntries(value).length > 0;\n}\n\nfunction stablePrettyString(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction copyLogDetailsValue(value: unknown) {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n Promise.resolve(navigator.clipboard.writeText(stablePrettyString(value))).catch(\n () => undefined,\n );\n }\n}\n\nfunction buildProcessedLogDetails(row: LogsTableRow): Record<string, unknown> {\n const attributes = buildProcessedLogAttributes(row);\n return stripEmptyProperties({\n timestamp: row.timestamp,\n level: row.level,\n pod: row.pod,\n logger: row.logger,\n thread: row.thread,\n message: row.message,\n tags: row.tags,\n ...(Object.keys(attributes).length > 0 ? { attributes } : {}),\n });\n}\n\nfunction buildProcessedLogAttributes(row: LogsTableRow): Record<string, unknown> {\n const attributes = {\n ...asRecord(row.raw),\n ...asRecord(row.parsedLine),\n };\n const hiddenKeys = new Set([\n \"@timestamp\",\n \"container\",\n \"event.dataset\",\n \"labels\",\n \"level\",\n \"line\",\n \"log.level\",\n \"log.logger\",\n \"logger\",\n \"message\",\n \"msg\",\n \"pod\",\n \"process.thread.name\",\n \"service\",\n \"service.name\",\n \"severity\",\n \"thread\",\n \"time\",\n \"timestamp\",\n ]);\n\n return stripEmptyProperties(\n Object.fromEntries(Object.entries(attributes).filter(([key]) => !hiddenKeys.has(key))),\n );\n}\n\nfunction stripEmptyProperties(record: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(record).filter(([, value]) => {\n if (value == null) return false;\n if (typeof value === \"string\") return value.trim().length > 0;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n }),\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LogDetails.js","sources":["../../src/data/LogDetails.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport type { DataTableColumn } from \"./DataTable\";\nimport { getFilterTokens } from \"./data-table-utils\";\nimport { Properties, type PropertiesAction, type PropertiesItem } from \"./Properties\";\nimport { TagActionsProvider, TagPropertiesList } from \"./cells/TagList\";\nimport { normalizeTags, type TagActionsContextValue } from \"./cells/tag-utils\";\nimport { formatPropertyLabel } from \"./properties-utils\";\nimport type { LogsTableRow } from \"./logs-normalize\";\nimport { asRecord } from \"./log-utils\";\nimport { UiChevronDown, UiChevronRight, UiCopy, UiZoomIn, UiZoomOut } from \"../icons\";\n\nconst TAGS_PATH = \"details.tags\";\n\n// Key column shrinks to its content (no min/fixed width), never wider than 30ch.\nconst DETAIL_ROW_CLASS = \"grid-cols-[fit-content(30ch)_minmax(0,1fr)]\";\n\n/**\n * Maps a top-level detail field path (`details.<columnKey>`) to its column key.\n * Returns undefined for nested paths and the tags array, which have their own\n * filter affordances.\n */\nfunction fieldColumnKey(path: string): string | undefined {\n if (!path.startsWith(\"details.\") || path === TAGS_PATH) return undefined;\n const rest = path.slice(\"details.\".length);\n return rest && !rest.includes(\".\") ? rest : undefined;\n}\n\nexport function LogDetails({\n row,\n filterActions,\n columns,\n}: {\n row: LogsTableRow;\n filterActions: Record<string, TagActionsContextValue>;\n columns: DataTableColumn<LogsTableRow>[];\n}) {\n const [openPaths, setOpenPaths] = useState<Record<string, boolean>>({});\n const setPathOpen = (path: string, open: boolean) => {\n setOpenPaths((current) => ({ ...current, [path]: open }));\n };\n const details = useMemo(() => buildProcessedLogDetails(row), [row]);\n\n const labelForPath = (path: string) => formatPropertyLabel(path.split(\".\").pop() ?? path);\n\n const columnByKey = useMemo(\n () => new Map(columns.map((column) => [column.key, column])),\n [columns],\n );\n\n // Include/exclude is wired only for fields whose column is a multi/nested-multi\n // (tristate) filter; other columns (high-cardinality text, number, timestamp)\n // don't honor multiFilters, so they get no filter actions. The toggle token\n // must match the column's filter token (e.g. a status column maps \"INFO\" to a\n // normalized status), so it is derived via getFilterTokens rather than the\n // displayed value.\n const fieldFilter = (\n path: string,\n ): { actions: TagActionsContextValue; token: string } | undefined => {\n const key = fieldColumnKey(path);\n if (!key) return undefined;\n const actions = filterActions[key];\n const column = columnByKey.get(key);\n if (!actions || !column) return undefined;\n const token = getFilterTokens(row, column)[0];\n return token ? { actions, token } : undefined;\n };\n\n const prefixActions: PropertiesAction<unknown>[] = [\n {\n id: \"expand\",\n icon: UiChevronRight,\n label: (key) => `Expand ${labelForPath(key)}`,\n visible: (_k, _v, item) => !!item.expandable,\n disabled: (_k, _v, item) => !!item.expanded,\n onClick: (_k, _v, item) => item.onToggle?.(true),\n },\n {\n id: \"collapse\",\n icon: UiChevronDown,\n label: (key) => `Collapse ${labelForPath(key)}`,\n visible: (_k, _v, item) => !!item.expandable,\n disabled: (_k, _v, item) => !item.expanded,\n onClick: (_k, _v, item) => item.onToggle?.(false),\n },\n {\n id: \"include\",\n icon: UiZoomIn,\n label: (key) => `Include ${labelForPath(key)}`,\n visible: (key) => !!fieldFilter(key),\n onClick: (key) => {\n const filter = fieldFilter(key);\n filter?.actions.toggleInclude(filter.token);\n },\n },\n {\n id: \"exclude\",\n icon: UiZoomOut,\n label: (key) => `Exclude ${labelForPath(key)}`,\n visible: (key) => !!fieldFilter(key),\n onClick: (key) => {\n const filter = fieldFilter(key);\n filter?.actions.toggleExclude(filter.token);\n },\n },\n ];\n\n // Copy sits immediately after the value (suffix), separate from the leading\n // expand/collapse/include/exclude controls.\n const suffixActions: PropertiesAction<unknown>[] = [\n {\n id: \"copy\",\n icon: UiCopy,\n label: (key) => `Copy ${labelForPath(key)}`,\n visible: (key) => key !== TAGS_PATH,\n onClick: (_k, value) => copyLogDetailsValue(value),\n },\n ];\n\n const renderLabel = (key: string) => labelForPath(key);\n const renderValue = (key: string, value: unknown, item: PropertiesItem<unknown>) => {\n if (key === TAGS_PATH) {\n const count = Array.isArray(value) ? value.length : 0;\n return <span className=\"font-mono text-muted-foreground\">[{count} tags]</span>;\n }\n return item.expandable ? <LogValueSummary value={value} /> : <LogScalarValue value={value} />;\n };\n\n const toItems = (value: unknown, path: string, depth: number): PropertiesItem<unknown>[] =>\n getValueEntries(value).map(([key, entryValue]) => {\n const entryPath = `${path}.${String(key)}`;\n const isTags = entryPath === TAGS_PATH;\n const expandable = isTags || isExpandableValue(entryValue);\n const open = openPaths[entryPath] ?? depth < 1;\n return {\n key: entryPath,\n value: entryValue,\n expandable,\n expanded: open,\n onToggle: (next) => setPathOpen(entryPath, next),\n renderChildren: () =>\n isTags ? (\n <TagPropertiesList\n tags={normalizeTags(entryValue as string[])}\n rowClassName={DETAIL_ROW_CLASS}\n />\n ) : (\n <Properties\n density=\"compact\"\n items={toItems(entryValue, entryPath, depth + 1)}\n renderLabel={renderLabel}\n renderValue={renderValue}\n prefixActions={prefixActions}\n suffixActions={suffixActions}\n rowClassName={DETAIL_ROW_CLASS}\n className=\"mt-density-1\"\n />\n ),\n };\n });\n\n const properties = (\n <Properties\n density=\"compact\"\n items={toItems(details, \"details\", 0)}\n renderLabel={renderLabel}\n renderValue={renderValue}\n prefixActions={prefixActions}\n suffixActions={suffixActions}\n rowClassName={DETAIL_ROW_CLASS}\n />\n );\n\n const tagActions = filterActions[\"tags\"];\n return (\n <div className=\"space-y-density-3 text-xs\">\n {tagActions ? (\n <TagActionsProvider value={tagActions}>{properties}</TagActionsProvider>\n ) : (\n properties\n )}\n </div>\n );\n}\n\nfunction LogValueSummary({ value }: { value: unknown }) {\n if (Array.isArray(value)) {\n return <span className=\"font-mono text-muted-foreground\">[{value.length} items]</span>;\n }\n const record = asRecord(value);\n if (record) {\n const count = Object.keys(record).length;\n return (\n <span className=\"font-mono text-muted-foreground\">\n {\"{ \"}\n {count} properties{\" }\"}\n </span>\n );\n }\n return <LogScalarValue value={value} />;\n}\n\nfunction LogScalarValue({ value }: { value: unknown }) {\n if (value === null || value === undefined) {\n return <span className=\"font-mono italic text-muted-foreground\">null</span>;\n }\n\n if (typeof value === \"string\") {\n return (\n <pre className=\"max-h-48 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed text-foreground\">\n {value}\n </pre>\n );\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return <span className=\"font-mono text-blue-700 dark:text-blue-400\">{String(value)}</span>;\n }\n\n return (\n <pre className=\"max-h-48 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed text-foreground\">\n {stablePrettyString(value)}\n </pre>\n );\n}\n\nfunction getValueEntries(value: unknown): Array<[string | number, unknown]> {\n if (Array.isArray(value)) {\n return value.map((entry, index) => [index, entry]);\n }\n return Object.entries(asRecord(value) ?? {});\n}\n\nfunction isExpandableValue(value: unknown) {\n return getValueEntries(value).length > 0;\n}\n\nfunction stablePrettyString(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction copyLogDetailsValue(value: unknown) {\n if (typeof navigator !== \"undefined\" && navigator.clipboard?.writeText) {\n Promise.resolve(navigator.clipboard.writeText(stablePrettyString(value))).catch(\n () => undefined,\n );\n }\n}\n\nfunction buildProcessedLogDetails(row: LogsTableRow): Record<string, unknown> {\n const attributes = buildProcessedLogAttributes(row);\n return stripEmptyProperties({\n timestamp: row.timestamp,\n level: row.level,\n pod: row.pod,\n logger: row.logger,\n thread: row.thread,\n message: row.message,\n tags: row.tags,\n ...(Object.keys(attributes).length > 0 ? { attributes } : {}),\n });\n}\n\nfunction buildProcessedLogAttributes(row: LogsTableRow): Record<string, unknown> {\n const attributes = {\n ...asRecord(row.raw),\n ...asRecord(row.parsedLine),\n };\n const hiddenKeys = new Set([\n \"@timestamp\",\n \"container\",\n \"event.dataset\",\n \"labels\",\n \"level\",\n \"line\",\n \"log.level\",\n \"log.logger\",\n \"logger\",\n \"message\",\n \"msg\",\n \"pod\",\n \"process.thread.name\",\n \"service\",\n \"service.name\",\n \"severity\",\n \"thread\",\n \"time\",\n \"timestamp\",\n ]);\n\n return stripEmptyProperties(\n Object.fromEntries(Object.entries(attributes).filter(([key]) => !hiddenKeys.has(key))),\n );\n}\n\nfunction stripEmptyProperties(record: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(record).filter(([, value]) => {\n if (value == null) return false;\n if (typeof value === \"string\") return value.trim().length > 0;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n }),\n );\n}\n"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@ const utils = require("../lib/utils.cjs");
6
6
  const AnsiHtml = require("./AnsiHtml.cjs");
7
7
  const DataTable = require("./DataTable.cjs");
8
8
  const LogDetails = require("./LogDetails.cjs");
9
- const logUtils = require("./log-utils.cjs");
9
+ const logsNormalize = require("./logs-normalize.cjs");
10
10
  const ANSI_PATTERN = new RegExp(`${String.fromCharCode(27)}\\[[0-9;?]*[ -/]*[@-~]`);
11
11
  const DEFAULT_LOG_COLUMNS = [
12
12
  {
@@ -51,7 +51,9 @@ const DEFAULT_SORT = {
51
51
  key: "timestamp",
52
52
  dir: "desc"
53
53
  };
54
- const JSON_PARSE_FAILED = Symbol("json-parse-failed");
54
+ function renderLogDetails(row, context) {
55
+ return /* @__PURE__ */ jsxRuntime.jsx(LogDetails.LogDetails, { row, filterActions: context.filterActionsByColumn, columns: context.columns });
56
+ }
55
57
  function LogsTable({
56
58
  logs,
57
59
  columns,
@@ -69,8 +71,8 @@ function LogsTable({
69
71
  defaultDensity = "compact",
70
72
  ...tableProps
71
73
  }) {
72
- const rows = react.useMemo(() => normalizeLogsTableRows(logs), [logs]);
73
- const resolvedRenderExpandedRow = renderExpandedRow ?? (showRawDetails ? LogDetails.renderLogDetails : void 0);
74
+ const rows = react.useMemo(() => logsNormalize.normalizeLogsTableRows(logs), [logs]);
75
+ const resolvedRenderExpandedRow = renderExpandedRow ?? (showRawDetails ? renderLogDetails : void 0);
74
76
  return /* @__PURE__ */ jsxRuntime.jsx(
75
77
  DataTable.DataTable,
76
78
  {
@@ -91,166 +93,5 @@ function LogsTable({
91
93
  }
92
94
  );
93
95
  }
94
- function normalizeLogsTableRows(logs) {
95
- const entries = typeof logs === "string" ? splitLogLines(logs) : logs;
96
- return entries.map((entry, index) => normalizeLogEntry(entry, index));
97
- }
98
- function splitLogLines(logs) {
99
- return logs.split(/\r?\n/).filter((line) => line.length > 0);
100
- }
101
- function normalizeLogEntry(entry, index) {
102
- const parsedOuterValue = typeof entry === "string" ? tryParseJson(entry) : entry;
103
- const parsedOuter = parsedOuterValue === JSON_PARSE_FAILED ? entry : parsedOuterValue;
104
- const outer = logUtils.asRecord(parsedOuter);
105
- const outerLine = stringValue(outer == null ? void 0 : outer.line);
106
- const parsedLineValue = outerLine ? tryParseJson(outerLine) : JSON_PARSE_FAILED;
107
- const parsedLine = parsedLineValue === JSON_PARSE_FAILED ? void 0 : parsedLineValue;
108
- const inner = logUtils.asRecord(parsedLine) ?? (outerLine ? void 0 : outer);
109
- const labels = logUtils.asRecord(outer == null ? void 0 : outer.labels);
110
- const timestamp = firstString(
111
- pick(outer, "timestamp"),
112
- pick(inner, "@timestamp"),
113
- pick(outer, "ts"),
114
- pick(inner, "timestamp"),
115
- pick(outer, "time"),
116
- pick(inner, "time")
117
- );
118
- const level = firstString(
119
- pick(inner, "log.level"),
120
- pick(inner, "level"),
121
- pick(outer, "level"),
122
- pick(outer, "severity"),
123
- pick(inner, "severity")
124
- );
125
- const pod = firstString(
126
- pick(outer, "pod"),
127
- pick(labels, "pod"),
128
- pick(inner, "kubernetes.pod.name")
129
- );
130
- const namespace = firstString(
131
- pick(outer, "namespace"),
132
- pick(labels, "namespace"),
133
- pick(inner, "kubernetes.namespace")
134
- );
135
- const container = firstString(
136
- pick(outer, "container"),
137
- pick(labels, "container"),
138
- pick(inner, "container.name")
139
- );
140
- const service = firstString(
141
- pick(inner, "service.name"),
142
- pick(inner, "service"),
143
- pick(outer, "service"),
144
- pick(labels, "service")
145
- );
146
- const dataset = firstString(pick(inner, "event.dataset"), pick(inner, "dataset"));
147
- const logger = firstString(
148
- pick(inner, "log.logger"),
149
- pick(inner, "logger"),
150
- pick(outer, "logger")
151
- );
152
- const thread = firstString(
153
- pick(inner, "process.thread.name"),
154
- pick(inner, "thread"),
155
- pick(outer, "thread")
156
- );
157
- const message = firstString(
158
- pick(inner, "message"),
159
- pick(inner, "msg"),
160
- pick(outer, "message"),
161
- outerLine,
162
- typeof entry === "string" ? entry : void 0
163
- );
164
- const tags = buildTags({
165
- namespace,
166
- container,
167
- service,
168
- dataset,
169
- ecsVersion: firstString(pick(inner, "ecs.version")),
170
- labels
171
- });
172
- return {
173
- id: `${index}:${timestamp || pod || message || stableString(entry)}`,
174
- timestamp,
175
- level,
176
- pod,
177
- logger,
178
- thread,
179
- message,
180
- tags,
181
- line: outerLine ?? (typeof entry === "string" ? entry : stableString(entry)),
182
- raw: parsedOuter,
183
- ...parsedLine !== void 0 ? { parsedLine } : {}
184
- };
185
- }
186
- function buildTags({
187
- namespace,
188
- container,
189
- service,
190
- dataset,
191
- ecsVersion,
192
- labels
193
- }) {
194
- const tags = [];
195
- const seen = /* @__PURE__ */ new Set();
196
- const addTag = (key, value) => {
197
- const valueString = stringValue(value);
198
- if (!valueString) return;
199
- const tag = `${key}=${valueString}`;
200
- if (seen.has(tag)) return;
201
- seen.add(tag);
202
- tags.push(tag);
203
- };
204
- addTag("namespace", namespace);
205
- addTag("container", container);
206
- addTag("service", service);
207
- addTag("dataset", dataset);
208
- addTag("ecs.version", ecsVersion);
209
- if (labels) {
210
- for (const [key, value] of Object.entries(labels)) {
211
- addTag(key, value);
212
- }
213
- }
214
- return tags;
215
- }
216
- function tryParseJson(value) {
217
- try {
218
- return JSON.parse(value);
219
- } catch {
220
- return JSON_PARSE_FAILED;
221
- }
222
- }
223
- function pick(record, path) {
224
- if (!record) return void 0;
225
- if (Object.prototype.hasOwnProperty.call(record, path)) return record[path];
226
- return path.split(".").reduce((current, key) => {
227
- if (current && typeof current === "object") {
228
- return current[key];
229
- }
230
- return void 0;
231
- }, record);
232
- }
233
- function firstString(...values) {
234
- for (const value of values) {
235
- const string = stringValue(value);
236
- if (string) return string;
237
- }
238
- return "";
239
- }
240
- function stringValue(value) {
241
- if (value == null) return "";
242
- if (typeof value === "string") return value.trim();
243
- if (typeof value === "number" || typeof value === "boolean") return String(value);
244
- return "";
245
- }
246
- function stableString(value) {
247
- if (typeof value === "string") return value;
248
- try {
249
- return JSON.stringify(value);
250
- } catch {
251
- return String(value);
252
- }
253
- }
254
96
  exports.LogsTable = LogsTable;
255
- exports.normalizeLogsTableRows = normalizeLogsTableRows;
256
97
  //# sourceMappingURL=LogsTable.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"LogsTable.cjs","sources":["../../src/data/LogsTable.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { AnsiHtml } from \"./AnsiHtml\";\nimport { DataTable, type DataTableColumn, type DataTableProps } from \"./DataTable\";\nimport { renderLogDetails } from \"./LogDetails\";\nimport { asRecord } from \"./log-utils\";\n\nexport type LogsTableInput = string | Record<string, unknown>;\n\nexport type LogsTableRow = {\n id: string;\n timestamp: string;\n level: string;\n pod: string;\n logger: string;\n thread: string;\n message: string;\n tags: string[];\n line: string;\n parsedLine?: unknown;\n raw: unknown;\n};\n\nexport type LogsTableProps = Omit<DataTableProps<LogsTableRow>, \"data\" | \"columns\"> & {\n /** Raw newline-delimited log text or pre-parsed log records. */\n logs: string | LogsTableInput[];\n /** Optional custom columns; defaults to timestamp, level, pod, logger, thread, message, and tags. */\n columns?: DataTableColumn<LogsTableRow>[];\n /** Render parsed/raw log details when a row is expanded. */\n showRawDetails?: boolean;\n};\n\n// Matches CSI / SGR escape sequences (e.g. \"\\x1b[31m\"). Used to skip the\n// AnsiHtml render for plain messages so the cell stays a fast text node.\nconst ANSI_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-9;?]*[ -/]*[@-~]`);\n\nconst DEFAULT_LOG_COLUMNS: DataTableColumn<LogsTableRow>[] = [\n {\n key: \"timestamp\",\n label: \"Timestamp\",\n kind: \"timestamp\",\n shrink: true,\n minWidth: 180,\n },\n {\n key: \"level\",\n label: \"Level\",\n kind: \"status\",\n shrink: true,\n minWidth: 96,\n status: { showLabel: true },\n },\n { key: \"pod\", label: \"Pod\", shrink: true, minWidth: 180 },\n { key: \"logger\", label: \"Logger\", shrink: true, minWidth: 220 },\n { key: \"thread\", label: \"Thread\", shrink: true, minWidth: 180 },\n {\n key: \"message\",\n label: \"Message\",\n grow: true,\n minWidth: 360,\n cellClassName: \"font-mono text-xs\",\n render: (value) => {\n const text = typeof value === \"string\" ? value : value == null ? \"\" : String(value);\n if (!ANSI_PATTERN.test(text)) return text;\n return <AnsiHtml as=\"span\" text={text} className=\"whitespace-pre-wrap break-words\" />;\n },\n },\n {\n key: \"tags\",\n label: \"Tags\",\n kind: \"tags\",\n grow: true,\n tags: { maxVisible: 4 },\n },\n];\n\nconst DEFAULT_SORT = {\n key: \"timestamp\",\n dir: \"desc\",\n} satisfies NonNullable<DataTableProps<LogsTableRow>[\"defaultSort\"]>;\nconst JSON_PARSE_FAILED = Symbol(\"json-parse-failed\");\n\nexport function LogsTable({\n logs,\n columns,\n showRawDetails = true,\n className,\n autoFilter = true,\n defaultSort,\n getRowId,\n renderExpandedRow,\n showDensityControl = true,\n showThemeControl = true,\n showFullscreenControl = true,\n fullscreenTitle = \"Logs\",\n fullscreenButtonLabel = \"Open logs full screen\",\n defaultDensity = \"compact\",\n ...tableProps\n}: LogsTableProps) {\n const rows = useMemo(() => normalizeLogsTableRows(logs), [logs]);\n const resolvedRenderExpandedRow =\n renderExpandedRow ?? (showRawDetails ? renderLogDetails : undefined);\n return (\n <DataTable\n {...tableProps}\n data={rows}\n columns={columns ?? DEFAULT_LOG_COLUMNS}\n className={cn(\"rounded-md bg-background p-2\", className)}\n autoFilter={autoFilter}\n defaultDensity={defaultDensity}\n defaultSort={defaultSort ?? DEFAULT_SORT}\n getRowId={getRowId ?? ((row) => row.id)}\n showDensityControl={showDensityControl}\n showThemeControl={showThemeControl}\n showFullscreenControl={showFullscreenControl}\n fullscreenTitle={fullscreenTitle}\n fullscreenButtonLabel={fullscreenButtonLabel}\n {...(resolvedRenderExpandedRow ? { renderExpandedRow: resolvedRenderExpandedRow } : {})}\n />\n );\n}\n\nexport function normalizeLogsTableRows(logs: string | LogsTableInput[]): LogsTableRow[] {\n const entries = typeof logs === \"string\" ? splitLogLines(logs) : logs;\n return entries.map((entry, index) => normalizeLogEntry(entry, index));\n}\n\nfunction splitLogLines(logs: string): string[] {\n return logs.split(/\\r?\\n/).filter((line) => line.length > 0);\n}\n\nfunction normalizeLogEntry(entry: LogsTableInput, index: number): LogsTableRow {\n const parsedOuterValue = typeof entry === \"string\" ? tryParseJson(entry) : entry;\n const parsedOuter = parsedOuterValue === JSON_PARSE_FAILED ? entry : parsedOuterValue;\n const outer = asRecord(parsedOuter);\n const outerLine = stringValue(outer?.line);\n const parsedLineValue = outerLine ? tryParseJson(outerLine) : JSON_PARSE_FAILED;\n const parsedLine = parsedLineValue === JSON_PARSE_FAILED ? undefined : parsedLineValue;\n const inner = asRecord(parsedLine) ?? (outerLine ? undefined : outer);\n const labels = asRecord(outer?.labels);\n\n const timestamp = firstString(\n pick(outer, \"timestamp\"),\n pick(inner, \"@timestamp\"),\n pick(outer, \"ts\"),\n pick(inner, \"timestamp\"),\n pick(outer, \"time\"),\n pick(inner, \"time\"),\n );\n const level = firstString(\n pick(inner, \"log.level\"),\n pick(inner, \"level\"),\n pick(outer, \"level\"),\n pick(outer, \"severity\"),\n pick(inner, \"severity\"),\n );\n const pod = firstString(\n pick(outer, \"pod\"),\n pick(labels, \"pod\"),\n pick(inner, \"kubernetes.pod.name\"),\n );\n const namespace = firstString(\n pick(outer, \"namespace\"),\n pick(labels, \"namespace\"),\n pick(inner, \"kubernetes.namespace\"),\n );\n const container = firstString(\n pick(outer, \"container\"),\n pick(labels, \"container\"),\n pick(inner, \"container.name\"),\n );\n const service = firstString(\n pick(inner, \"service.name\"),\n pick(inner, \"service\"),\n pick(outer, \"service\"),\n pick(labels, \"service\"),\n );\n const dataset = firstString(pick(inner, \"event.dataset\"), pick(inner, \"dataset\"));\n const logger = firstString(\n pick(inner, \"log.logger\"),\n pick(inner, \"logger\"),\n pick(outer, \"logger\"),\n );\n const thread = firstString(\n pick(inner, \"process.thread.name\"),\n pick(inner, \"thread\"),\n pick(outer, \"thread\"),\n );\n const message = firstString(\n pick(inner, \"message\"),\n pick(inner, \"msg\"),\n pick(outer, \"message\"),\n outerLine,\n typeof entry === \"string\" ? entry : undefined,\n );\n\n const tags = buildTags({\n namespace,\n container,\n service,\n dataset,\n ecsVersion: firstString(pick(inner, \"ecs.version\")),\n labels,\n });\n\n return {\n id: `${index}:${timestamp || pod || message || stableString(entry)}`,\n timestamp,\n level,\n pod,\n logger,\n thread,\n message,\n tags,\n line: outerLine ?? (typeof entry === \"string\" ? entry : stableString(entry)),\n raw: parsedOuter,\n ...(parsedLine !== undefined ? { parsedLine } : {}),\n };\n}\n\nfunction buildTags({\n namespace,\n container,\n service,\n dataset,\n ecsVersion,\n labels,\n}: {\n namespace: string;\n container: string;\n service: string;\n dataset: string;\n ecsVersion: string;\n labels: Record<string, unknown> | undefined;\n}) {\n const tags: string[] = [];\n const seen = new Set<string>();\n const addTag = (key: string, value: unknown) => {\n const valueString = stringValue(value);\n if (!valueString) return;\n const tag = `${key}=${valueString}`;\n if (seen.has(tag)) return;\n seen.add(tag);\n tags.push(tag);\n };\n\n addTag(\"namespace\", namespace);\n addTag(\"container\", container);\n addTag(\"service\", service);\n addTag(\"dataset\", dataset);\n addTag(\"ecs.version\", ecsVersion);\n\n if (labels) {\n for (const [key, value] of Object.entries(labels)) {\n addTag(key, value);\n }\n }\n\n return tags;\n}\n\nfunction tryParseJson(value: string): unknown | typeof JSON_PARSE_FAILED {\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return JSON_PARSE_FAILED;\n }\n}\n\nfunction pick(record: Record<string, unknown> | undefined, path: string): unknown {\n if (!record) return undefined;\n if (Object.prototype.hasOwnProperty.call(record, path)) return record[path];\n return path.split(\".\").reduce<unknown>((current, key) => {\n if (current && typeof current === \"object\") {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, record);\n}\n\nfunction firstString(...values: unknown[]): string {\n for (const value of values) {\n const string = stringValue(value);\n if (string) return string;\n }\n return \"\";\n}\n\nfunction stringValue(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"string\") return value.trim();\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return \"\";\n}\n\nfunction stableString(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n"],"names":["AnsiHtml","useMemo","renderLogDetails","jsx","DataTable","cn","asRecord"],"mappings":"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"}
1
+ {"version":3,"file":"LogsTable.cjs","sources":["../../src/data/LogsTable.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { AnsiHtml } from \"./AnsiHtml\";\nimport {\n DataTable,\n type DataTableColumn,\n type DataTableProps,\n type DataTableRowDetailContext,\n} from \"./DataTable\";\nimport { LogDetails } from \"./LogDetails\";\nimport { normalizeLogsTableRows, type LogsTableInput, type LogsTableRow } from \"./logs-normalize\";\n\nexport type { LogsTableInput, LogsTableRow } from \"./logs-normalize\";\n\nexport type LogsTableProps = Omit<DataTableProps<LogsTableRow>, \"data\" | \"columns\"> & {\n /** Raw newline-delimited log text or pre-parsed log records. */\n logs: string | LogsTableInput[];\n /** Optional custom columns; defaults to timestamp, level, pod, logger, thread, message, and tags. */\n columns?: DataTableColumn<LogsTableRow>[];\n /** Render parsed/raw log details when a row is expanded. */\n showRawDetails?: boolean;\n};\n\n// Matches CSI / SGR escape sequences (e.g. \"\\x1b[31m\"). Used to skip the\n// AnsiHtml render for plain messages so the cell stays a fast text node.\nconst ANSI_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-9;?]*[ -/]*[@-~]`);\n\nconst DEFAULT_LOG_COLUMNS: DataTableColumn<LogsTableRow>[] = [\n {\n key: \"timestamp\",\n label: \"Timestamp\",\n kind: \"timestamp\",\n shrink: true,\n minWidth: 180,\n },\n {\n key: \"level\",\n label: \"Level\",\n kind: \"status\",\n shrink: true,\n minWidth: 96,\n status: { showLabel: true },\n },\n { key: \"pod\", label: \"Pod\", shrink: true, minWidth: 180 },\n { key: \"logger\", label: \"Logger\", shrink: true, minWidth: 220 },\n { key: \"thread\", label: \"Thread\", shrink: true, minWidth: 180 },\n {\n key: \"message\",\n label: \"Message\",\n grow: true,\n minWidth: 360,\n cellClassName: \"font-mono text-xs\",\n render: (value) => {\n const text = typeof value === \"string\" ? value : value == null ? \"\" : String(value);\n if (!ANSI_PATTERN.test(text)) return text;\n return <AnsiHtml as=\"span\" text={text} className=\"whitespace-pre-wrap break-words\" />;\n },\n },\n {\n key: \"tags\",\n label: \"Tags\",\n kind: \"tags\",\n grow: true,\n tags: { maxVisible: 4 },\n },\n];\n\nconst DEFAULT_SORT = {\n key: \"timestamp\",\n dir: \"desc\",\n} satisfies NonNullable<DataTableProps<LogsTableRow>[\"defaultSort\"]>;\n\nfunction renderLogDetails(row: LogsTableRow, context: DataTableRowDetailContext<LogsTableRow>) {\n return (\n <LogDetails row={row} filterActions={context.filterActionsByColumn} columns={context.columns} />\n );\n}\n\nexport function LogsTable({\n logs,\n columns,\n showRawDetails = true,\n className,\n autoFilter = true,\n defaultSort,\n getRowId,\n renderExpandedRow,\n showDensityControl = true,\n showThemeControl = true,\n showFullscreenControl = true,\n fullscreenTitle = \"Logs\",\n fullscreenButtonLabel = \"Open logs full screen\",\n defaultDensity = \"compact\",\n ...tableProps\n}: LogsTableProps) {\n const rows = useMemo(() => normalizeLogsTableRows(logs), [logs]);\n const resolvedRenderExpandedRow =\n renderExpandedRow ?? (showRawDetails ? renderLogDetails : undefined);\n return (\n <DataTable\n {...tableProps}\n data={rows}\n columns={columns ?? DEFAULT_LOG_COLUMNS}\n className={cn(\"rounded-md bg-background p-2\", className)}\n autoFilter={autoFilter}\n defaultDensity={defaultDensity}\n defaultSort={defaultSort ?? DEFAULT_SORT}\n getRowId={getRowId ?? ((row) => row.id)}\n showDensityControl={showDensityControl}\n showThemeControl={showThemeControl}\n showFullscreenControl={showFullscreenControl}\n fullscreenTitle={fullscreenTitle}\n fullscreenButtonLabel={fullscreenButtonLabel}\n {...(resolvedRenderExpandedRow ? { renderExpandedRow: resolvedRenderExpandedRow } : {})}\n />\n );\n}\n"],"names":["AnsiHtml","jsx","LogDetails","useMemo","normalizeLogsTableRows","DataTable","cn"],"mappings":";;;;;;;;;AAyBA,MAAM,eAAe,IAAI,OAAO,GAAG,OAAO,aAAa,EAAE,CAAC,wBAAwB;AAElF,MAAM,sBAAuD;AAAA,EAC3D;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ,EAAE,WAAW,KAAA;AAAA,EAAK;AAAA,EAE5B,EAAE,KAAK,OAAO,OAAO,OAAO,QAAQ,MAAM,UAAU,IAAA;AAAA,EACpD,EAAE,KAAK,UAAU,OAAO,UAAU,QAAQ,MAAM,UAAU,IAAA;AAAA,EAC1D,EAAE,KAAK,UAAU,OAAO,UAAU,QAAQ,MAAM,UAAU,IAAA;AAAA,EAC1D;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,QAAQ,CAAC,UAAU;AACjB,YAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,SAAS,OAAO,KAAK,OAAO,KAAK;AAClF,UAAI,CAAC,aAAa,KAAK,IAAI,EAAG,QAAO;AACrC,4CAAQA,SAAAA,UAAA,EAAS,IAAG,QAAO,MAAY,WAAU,mCAAkC;AAAA,IACrF;AAAA,EAAA;AAAA,EAEF;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,EAAE,YAAY,EAAA;AAAA,EAAE;AAE1B;AAEA,MAAM,eAAe;AAAA,EACnB,KAAK;AAAA,EACL,KAAK;AACP;AAEA,SAAS,iBAAiB,KAAmB,SAAkD;AAC7F,SACEC,+BAACC,WAAAA,cAAW,KAAU,eAAe,QAAQ,uBAAuB,SAAS,QAAQ,SAAS;AAElG;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB,GAAG;AACL,GAAmB;AACjB,QAAM,OAAOC,MAAAA,QAAQ,MAAMC,cAAAA,uBAAuB,IAAI,GAAG,CAAC,IAAI,CAAC;AAC/D,QAAM,4BACJ,sBAAsB,iBAAiB,mBAAmB;AAC5D,SACEH,2BAAAA;AAAAA,IAACI,UAAAA;AAAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,WAAW;AAAA,MACpB,WAAWC,MAAAA,GAAG,gCAAgC,SAAS;AAAA,MACvD;AAAA,MACA;AAAA,MACA,aAAa,eAAe;AAAA,MAC5B,UAAU,aAAa,CAAC,QAAQ,IAAI;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAI,4BAA4B,EAAE,mBAAmB,8BAA8B,CAAA;AAAA,IAAC;AAAA,EAAA;AAG3F;;"}
@@ -1,18 +1,6 @@
1
1
  import { DataTableColumn, DataTableProps } from './DataTable';
2
- export type LogsTableInput = string | Record<string, unknown>;
3
- export type LogsTableRow = {
4
- id: string;
5
- timestamp: string;
6
- level: string;
7
- pod: string;
8
- logger: string;
9
- thread: string;
10
- message: string;
11
- tags: string[];
12
- line: string;
13
- parsedLine?: unknown;
14
- raw: unknown;
15
- };
2
+ import { LogsTableInput, LogsTableRow } from './logs-normalize';
3
+ export type { LogsTableInput, LogsTableRow } from './logs-normalize';
16
4
  export type LogsTableProps = Omit<DataTableProps<LogsTableRow>, "data" | "columns"> & {
17
5
  /** Raw newline-delimited log text or pre-parsed log records. */
18
6
  logs: string | LogsTableInput[];
@@ -22,5 +10,4 @@ export type LogsTableProps = Omit<DataTableProps<LogsTableRow>, "data" | "column
22
10
  showRawDetails?: boolean;
23
11
  };
24
12
  export declare function LogsTable({ logs, columns, showRawDetails, className, autoFilter, defaultSort, getRowId, renderExpandedRow, showDensityControl, showThemeControl, showFullscreenControl, fullscreenTitle, fullscreenButtonLabel, defaultDensity, ...tableProps }: LogsTableProps): import("react/jsx-runtime").JSX.Element;
25
- export declare function normalizeLogsTableRows(logs: string | LogsTableInput[]): LogsTableRow[];
26
13
  //# sourceMappingURL=LogsTable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LogsTable.d.ts","sourceRoot":"","sources":["../../src/data/LogsTable.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAa,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAInF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,EAAE,OAAO,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IACpF,gEAAgE;IAChE,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,qGAAqG;IACrG,OAAO,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;IAC1C,4DAA4D;IAC5D,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAoDF,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,OAAO,EACP,cAAqB,EACrB,SAAS,EACT,UAAiB,EACjB,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,kBAAyB,EACzB,gBAAuB,EACvB,qBAA4B,EAC5B,eAAwB,EACxB,qBAA+C,EAC/C,cAA0B,EAC1B,GAAG,UAAU,EACd,EAAE,cAAc,2CAsBhB;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,GAAG,YAAY,EAAE,CAGtF"}
1
+ {"version":3,"file":"LogsTable.d.ts","sourceRoot":"","sources":["../../src/data/LogsTable.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,cAAc,EAEpB,MAAM,aAAa,CAAC;AAErB,OAAO,EAA0B,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAElG,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErE,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG;IACpF,gEAAgE;IAChE,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,qGAAqG;IACrG,OAAO,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;IAC1C,4DAA4D;IAC5D,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAyDF,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,OAAO,EACP,cAAqB,EACrB,SAAS,EACT,UAAiB,EACjB,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,kBAAyB,EACzB,gBAAuB,EACvB,qBAA4B,EAC5B,eAAwB,EACxB,qBAA+C,EAC/C,cAA0B,EAC1B,GAAG,UAAU,EACd,EAAE,cAAc,2CAsBhB"}
@@ -3,8 +3,8 @@ import { useMemo } from "react";
3
3
  import { cn } from "../lib/utils.js";
4
4
  import { AnsiHtml } from "./AnsiHtml.js";
5
5
  import { DataTable } from "./DataTable.js";
6
- import { renderLogDetails } from "./LogDetails.js";
7
- import { asRecord } from "./log-utils.js";
6
+ import { LogDetails } from "./LogDetails.js";
7
+ import { normalizeLogsTableRows } from "./logs-normalize.js";
8
8
  const ANSI_PATTERN = new RegExp(`${String.fromCharCode(27)}\\[[0-9;?]*[ -/]*[@-~]`);
9
9
  const DEFAULT_LOG_COLUMNS = [
10
10
  {
@@ -49,7 +49,9 @@ const DEFAULT_SORT = {
49
49
  key: "timestamp",
50
50
  dir: "desc"
51
51
  };
52
- const JSON_PARSE_FAILED = Symbol("json-parse-failed");
52
+ function renderLogDetails(row, context) {
53
+ return /* @__PURE__ */ jsx(LogDetails, { row, filterActions: context.filterActionsByColumn, columns: context.columns });
54
+ }
53
55
  function LogsTable({
54
56
  logs,
55
57
  columns,
@@ -89,168 +91,7 @@ function LogsTable({
89
91
  }
90
92
  );
91
93
  }
92
- function normalizeLogsTableRows(logs) {
93
- const entries = typeof logs === "string" ? splitLogLines(logs) : logs;
94
- return entries.map((entry, index) => normalizeLogEntry(entry, index));
95
- }
96
- function splitLogLines(logs) {
97
- return logs.split(/\r?\n/).filter((line) => line.length > 0);
98
- }
99
- function normalizeLogEntry(entry, index) {
100
- const parsedOuterValue = typeof entry === "string" ? tryParseJson(entry) : entry;
101
- const parsedOuter = parsedOuterValue === JSON_PARSE_FAILED ? entry : parsedOuterValue;
102
- const outer = asRecord(parsedOuter);
103
- const outerLine = stringValue(outer == null ? void 0 : outer.line);
104
- const parsedLineValue = outerLine ? tryParseJson(outerLine) : JSON_PARSE_FAILED;
105
- const parsedLine = parsedLineValue === JSON_PARSE_FAILED ? void 0 : parsedLineValue;
106
- const inner = asRecord(parsedLine) ?? (outerLine ? void 0 : outer);
107
- const labels = asRecord(outer == null ? void 0 : outer.labels);
108
- const timestamp = firstString(
109
- pick(outer, "timestamp"),
110
- pick(inner, "@timestamp"),
111
- pick(outer, "ts"),
112
- pick(inner, "timestamp"),
113
- pick(outer, "time"),
114
- pick(inner, "time")
115
- );
116
- const level = firstString(
117
- pick(inner, "log.level"),
118
- pick(inner, "level"),
119
- pick(outer, "level"),
120
- pick(outer, "severity"),
121
- pick(inner, "severity")
122
- );
123
- const pod = firstString(
124
- pick(outer, "pod"),
125
- pick(labels, "pod"),
126
- pick(inner, "kubernetes.pod.name")
127
- );
128
- const namespace = firstString(
129
- pick(outer, "namespace"),
130
- pick(labels, "namespace"),
131
- pick(inner, "kubernetes.namespace")
132
- );
133
- const container = firstString(
134
- pick(outer, "container"),
135
- pick(labels, "container"),
136
- pick(inner, "container.name")
137
- );
138
- const service = firstString(
139
- pick(inner, "service.name"),
140
- pick(inner, "service"),
141
- pick(outer, "service"),
142
- pick(labels, "service")
143
- );
144
- const dataset = firstString(pick(inner, "event.dataset"), pick(inner, "dataset"));
145
- const logger = firstString(
146
- pick(inner, "log.logger"),
147
- pick(inner, "logger"),
148
- pick(outer, "logger")
149
- );
150
- const thread = firstString(
151
- pick(inner, "process.thread.name"),
152
- pick(inner, "thread"),
153
- pick(outer, "thread")
154
- );
155
- const message = firstString(
156
- pick(inner, "message"),
157
- pick(inner, "msg"),
158
- pick(outer, "message"),
159
- outerLine,
160
- typeof entry === "string" ? entry : void 0
161
- );
162
- const tags = buildTags({
163
- namespace,
164
- container,
165
- service,
166
- dataset,
167
- ecsVersion: firstString(pick(inner, "ecs.version")),
168
- labels
169
- });
170
- return {
171
- id: `${index}:${timestamp || pod || message || stableString(entry)}`,
172
- timestamp,
173
- level,
174
- pod,
175
- logger,
176
- thread,
177
- message,
178
- tags,
179
- line: outerLine ?? (typeof entry === "string" ? entry : stableString(entry)),
180
- raw: parsedOuter,
181
- ...parsedLine !== void 0 ? { parsedLine } : {}
182
- };
183
- }
184
- function buildTags({
185
- namespace,
186
- container,
187
- service,
188
- dataset,
189
- ecsVersion,
190
- labels
191
- }) {
192
- const tags = [];
193
- const seen = /* @__PURE__ */ new Set();
194
- const addTag = (key, value) => {
195
- const valueString = stringValue(value);
196
- if (!valueString) return;
197
- const tag = `${key}=${valueString}`;
198
- if (seen.has(tag)) return;
199
- seen.add(tag);
200
- tags.push(tag);
201
- };
202
- addTag("namespace", namespace);
203
- addTag("container", container);
204
- addTag("service", service);
205
- addTag("dataset", dataset);
206
- addTag("ecs.version", ecsVersion);
207
- if (labels) {
208
- for (const [key, value] of Object.entries(labels)) {
209
- addTag(key, value);
210
- }
211
- }
212
- return tags;
213
- }
214
- function tryParseJson(value) {
215
- try {
216
- return JSON.parse(value);
217
- } catch {
218
- return JSON_PARSE_FAILED;
219
- }
220
- }
221
- function pick(record, path) {
222
- if (!record) return void 0;
223
- if (Object.prototype.hasOwnProperty.call(record, path)) return record[path];
224
- return path.split(".").reduce((current, key) => {
225
- if (current && typeof current === "object") {
226
- return current[key];
227
- }
228
- return void 0;
229
- }, record);
230
- }
231
- function firstString(...values) {
232
- for (const value of values) {
233
- const string = stringValue(value);
234
- if (string) return string;
235
- }
236
- return "";
237
- }
238
- function stringValue(value) {
239
- if (value == null) return "";
240
- if (typeof value === "string") return value.trim();
241
- if (typeof value === "number" || typeof value === "boolean") return String(value);
242
- return "";
243
- }
244
- function stableString(value) {
245
- if (typeof value === "string") return value;
246
- try {
247
- return JSON.stringify(value);
248
- } catch {
249
- return String(value);
250
- }
251
- }
252
94
  export {
253
- LogsTable,
254
- normalizeLogsTableRows
95
+ LogsTable
255
96
  };
256
97
  //# sourceMappingURL=LogsTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LogsTable.js","sources":["../../src/data/LogsTable.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { AnsiHtml } from \"./AnsiHtml\";\nimport { DataTable, type DataTableColumn, type DataTableProps } from \"./DataTable\";\nimport { renderLogDetails } from \"./LogDetails\";\nimport { asRecord } from \"./log-utils\";\n\nexport type LogsTableInput = string | Record<string, unknown>;\n\nexport type LogsTableRow = {\n id: string;\n timestamp: string;\n level: string;\n pod: string;\n logger: string;\n thread: string;\n message: string;\n tags: string[];\n line: string;\n parsedLine?: unknown;\n raw: unknown;\n};\n\nexport type LogsTableProps = Omit<DataTableProps<LogsTableRow>, \"data\" | \"columns\"> & {\n /** Raw newline-delimited log text or pre-parsed log records. */\n logs: string | LogsTableInput[];\n /** Optional custom columns; defaults to timestamp, level, pod, logger, thread, message, and tags. */\n columns?: DataTableColumn<LogsTableRow>[];\n /** Render parsed/raw log details when a row is expanded. */\n showRawDetails?: boolean;\n};\n\n// Matches CSI / SGR escape sequences (e.g. \"\\x1b[31m\"). Used to skip the\n// AnsiHtml render for plain messages so the cell stays a fast text node.\nconst ANSI_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-9;?]*[ -/]*[@-~]`);\n\nconst DEFAULT_LOG_COLUMNS: DataTableColumn<LogsTableRow>[] = [\n {\n key: \"timestamp\",\n label: \"Timestamp\",\n kind: \"timestamp\",\n shrink: true,\n minWidth: 180,\n },\n {\n key: \"level\",\n label: \"Level\",\n kind: \"status\",\n shrink: true,\n minWidth: 96,\n status: { showLabel: true },\n },\n { key: \"pod\", label: \"Pod\", shrink: true, minWidth: 180 },\n { key: \"logger\", label: \"Logger\", shrink: true, minWidth: 220 },\n { key: \"thread\", label: \"Thread\", shrink: true, minWidth: 180 },\n {\n key: \"message\",\n label: \"Message\",\n grow: true,\n minWidth: 360,\n cellClassName: \"font-mono text-xs\",\n render: (value) => {\n const text = typeof value === \"string\" ? value : value == null ? \"\" : String(value);\n if (!ANSI_PATTERN.test(text)) return text;\n return <AnsiHtml as=\"span\" text={text} className=\"whitespace-pre-wrap break-words\" />;\n },\n },\n {\n key: \"tags\",\n label: \"Tags\",\n kind: \"tags\",\n grow: true,\n tags: { maxVisible: 4 },\n },\n];\n\nconst DEFAULT_SORT = {\n key: \"timestamp\",\n dir: \"desc\",\n} satisfies NonNullable<DataTableProps<LogsTableRow>[\"defaultSort\"]>;\nconst JSON_PARSE_FAILED = Symbol(\"json-parse-failed\");\n\nexport function LogsTable({\n logs,\n columns,\n showRawDetails = true,\n className,\n autoFilter = true,\n defaultSort,\n getRowId,\n renderExpandedRow,\n showDensityControl = true,\n showThemeControl = true,\n showFullscreenControl = true,\n fullscreenTitle = \"Logs\",\n fullscreenButtonLabel = \"Open logs full screen\",\n defaultDensity = \"compact\",\n ...tableProps\n}: LogsTableProps) {\n const rows = useMemo(() => normalizeLogsTableRows(logs), [logs]);\n const resolvedRenderExpandedRow =\n renderExpandedRow ?? (showRawDetails ? renderLogDetails : undefined);\n return (\n <DataTable\n {...tableProps}\n data={rows}\n columns={columns ?? DEFAULT_LOG_COLUMNS}\n className={cn(\"rounded-md bg-background p-2\", className)}\n autoFilter={autoFilter}\n defaultDensity={defaultDensity}\n defaultSort={defaultSort ?? DEFAULT_SORT}\n getRowId={getRowId ?? ((row) => row.id)}\n showDensityControl={showDensityControl}\n showThemeControl={showThemeControl}\n showFullscreenControl={showFullscreenControl}\n fullscreenTitle={fullscreenTitle}\n fullscreenButtonLabel={fullscreenButtonLabel}\n {...(resolvedRenderExpandedRow ? { renderExpandedRow: resolvedRenderExpandedRow } : {})}\n />\n );\n}\n\nexport function normalizeLogsTableRows(logs: string | LogsTableInput[]): LogsTableRow[] {\n const entries = typeof logs === \"string\" ? splitLogLines(logs) : logs;\n return entries.map((entry, index) => normalizeLogEntry(entry, index));\n}\n\nfunction splitLogLines(logs: string): string[] {\n return logs.split(/\\r?\\n/).filter((line) => line.length > 0);\n}\n\nfunction normalizeLogEntry(entry: LogsTableInput, index: number): LogsTableRow {\n const parsedOuterValue = typeof entry === \"string\" ? tryParseJson(entry) : entry;\n const parsedOuter = parsedOuterValue === JSON_PARSE_FAILED ? entry : parsedOuterValue;\n const outer = asRecord(parsedOuter);\n const outerLine = stringValue(outer?.line);\n const parsedLineValue = outerLine ? tryParseJson(outerLine) : JSON_PARSE_FAILED;\n const parsedLine = parsedLineValue === JSON_PARSE_FAILED ? undefined : parsedLineValue;\n const inner = asRecord(parsedLine) ?? (outerLine ? undefined : outer);\n const labels = asRecord(outer?.labels);\n\n const timestamp = firstString(\n pick(outer, \"timestamp\"),\n pick(inner, \"@timestamp\"),\n pick(outer, \"ts\"),\n pick(inner, \"timestamp\"),\n pick(outer, \"time\"),\n pick(inner, \"time\"),\n );\n const level = firstString(\n pick(inner, \"log.level\"),\n pick(inner, \"level\"),\n pick(outer, \"level\"),\n pick(outer, \"severity\"),\n pick(inner, \"severity\"),\n );\n const pod = firstString(\n pick(outer, \"pod\"),\n pick(labels, \"pod\"),\n pick(inner, \"kubernetes.pod.name\"),\n );\n const namespace = firstString(\n pick(outer, \"namespace\"),\n pick(labels, \"namespace\"),\n pick(inner, \"kubernetes.namespace\"),\n );\n const container = firstString(\n pick(outer, \"container\"),\n pick(labels, \"container\"),\n pick(inner, \"container.name\"),\n );\n const service = firstString(\n pick(inner, \"service.name\"),\n pick(inner, \"service\"),\n pick(outer, \"service\"),\n pick(labels, \"service\"),\n );\n const dataset = firstString(pick(inner, \"event.dataset\"), pick(inner, \"dataset\"));\n const logger = firstString(\n pick(inner, \"log.logger\"),\n pick(inner, \"logger\"),\n pick(outer, \"logger\"),\n );\n const thread = firstString(\n pick(inner, \"process.thread.name\"),\n pick(inner, \"thread\"),\n pick(outer, \"thread\"),\n );\n const message = firstString(\n pick(inner, \"message\"),\n pick(inner, \"msg\"),\n pick(outer, \"message\"),\n outerLine,\n typeof entry === \"string\" ? entry : undefined,\n );\n\n const tags = buildTags({\n namespace,\n container,\n service,\n dataset,\n ecsVersion: firstString(pick(inner, \"ecs.version\")),\n labels,\n });\n\n return {\n id: `${index}:${timestamp || pod || message || stableString(entry)}`,\n timestamp,\n level,\n pod,\n logger,\n thread,\n message,\n tags,\n line: outerLine ?? (typeof entry === \"string\" ? entry : stableString(entry)),\n raw: parsedOuter,\n ...(parsedLine !== undefined ? { parsedLine } : {}),\n };\n}\n\nfunction buildTags({\n namespace,\n container,\n service,\n dataset,\n ecsVersion,\n labels,\n}: {\n namespace: string;\n container: string;\n service: string;\n dataset: string;\n ecsVersion: string;\n labels: Record<string, unknown> | undefined;\n}) {\n const tags: string[] = [];\n const seen = new Set<string>();\n const addTag = (key: string, value: unknown) => {\n const valueString = stringValue(value);\n if (!valueString) return;\n const tag = `${key}=${valueString}`;\n if (seen.has(tag)) return;\n seen.add(tag);\n tags.push(tag);\n };\n\n addTag(\"namespace\", namespace);\n addTag(\"container\", container);\n addTag(\"service\", service);\n addTag(\"dataset\", dataset);\n addTag(\"ecs.version\", ecsVersion);\n\n if (labels) {\n for (const [key, value] of Object.entries(labels)) {\n addTag(key, value);\n }\n }\n\n return tags;\n}\n\nfunction tryParseJson(value: string): unknown | typeof JSON_PARSE_FAILED {\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return JSON_PARSE_FAILED;\n }\n}\n\nfunction pick(record: Record<string, unknown> | undefined, path: string): unknown {\n if (!record) return undefined;\n if (Object.prototype.hasOwnProperty.call(record, path)) return record[path];\n return path.split(\".\").reduce<unknown>((current, key) => {\n if (current && typeof current === \"object\") {\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, record);\n}\n\nfunction firstString(...values: unknown[]): string {\n for (const value of values) {\n const string = stringValue(value);\n if (string) return string;\n }\n return \"\";\n}\n\nfunction stringValue(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"string\") return value.trim();\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n return \"\";\n}\n\nfunction stableString(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LogsTable.js","sources":["../../src/data/LogsTable.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { AnsiHtml } from \"./AnsiHtml\";\nimport {\n DataTable,\n type DataTableColumn,\n type DataTableProps,\n type DataTableRowDetailContext,\n} from \"./DataTable\";\nimport { LogDetails } from \"./LogDetails\";\nimport { normalizeLogsTableRows, type LogsTableInput, type LogsTableRow } from \"./logs-normalize\";\n\nexport type { LogsTableInput, LogsTableRow } from \"./logs-normalize\";\n\nexport type LogsTableProps = Omit<DataTableProps<LogsTableRow>, \"data\" | \"columns\"> & {\n /** Raw newline-delimited log text or pre-parsed log records. */\n logs: string | LogsTableInput[];\n /** Optional custom columns; defaults to timestamp, level, pod, logger, thread, message, and tags. */\n columns?: DataTableColumn<LogsTableRow>[];\n /** Render parsed/raw log details when a row is expanded. */\n showRawDetails?: boolean;\n};\n\n// Matches CSI / SGR escape sequences (e.g. \"\\x1b[31m\"). Used to skip the\n// AnsiHtml render for plain messages so the cell stays a fast text node.\nconst ANSI_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-9;?]*[ -/]*[@-~]`);\n\nconst DEFAULT_LOG_COLUMNS: DataTableColumn<LogsTableRow>[] = [\n {\n key: \"timestamp\",\n label: \"Timestamp\",\n kind: \"timestamp\",\n shrink: true,\n minWidth: 180,\n },\n {\n key: \"level\",\n label: \"Level\",\n kind: \"status\",\n shrink: true,\n minWidth: 96,\n status: { showLabel: true },\n },\n { key: \"pod\", label: \"Pod\", shrink: true, minWidth: 180 },\n { key: \"logger\", label: \"Logger\", shrink: true, minWidth: 220 },\n { key: \"thread\", label: \"Thread\", shrink: true, minWidth: 180 },\n {\n key: \"message\",\n label: \"Message\",\n grow: true,\n minWidth: 360,\n cellClassName: \"font-mono text-xs\",\n render: (value) => {\n const text = typeof value === \"string\" ? value : value == null ? \"\" : String(value);\n if (!ANSI_PATTERN.test(text)) return text;\n return <AnsiHtml as=\"span\" text={text} className=\"whitespace-pre-wrap break-words\" />;\n },\n },\n {\n key: \"tags\",\n label: \"Tags\",\n kind: \"tags\",\n grow: true,\n tags: { maxVisible: 4 },\n },\n];\n\nconst DEFAULT_SORT = {\n key: \"timestamp\",\n dir: \"desc\",\n} satisfies NonNullable<DataTableProps<LogsTableRow>[\"defaultSort\"]>;\n\nfunction renderLogDetails(row: LogsTableRow, context: DataTableRowDetailContext<LogsTableRow>) {\n return (\n <LogDetails row={row} filterActions={context.filterActionsByColumn} columns={context.columns} />\n );\n}\n\nexport function LogsTable({\n logs,\n columns,\n showRawDetails = true,\n className,\n autoFilter = true,\n defaultSort,\n getRowId,\n renderExpandedRow,\n showDensityControl = true,\n showThemeControl = true,\n showFullscreenControl = true,\n fullscreenTitle = \"Logs\",\n fullscreenButtonLabel = \"Open logs full screen\",\n defaultDensity = \"compact\",\n ...tableProps\n}: LogsTableProps) {\n const rows = useMemo(() => normalizeLogsTableRows(logs), [logs]);\n const resolvedRenderExpandedRow =\n renderExpandedRow ?? (showRawDetails ? renderLogDetails : undefined);\n return (\n <DataTable\n {...tableProps}\n data={rows}\n columns={columns ?? DEFAULT_LOG_COLUMNS}\n className={cn(\"rounded-md bg-background p-2\", className)}\n autoFilter={autoFilter}\n defaultDensity={defaultDensity}\n defaultSort={defaultSort ?? DEFAULT_SORT}\n getRowId={getRowId ?? ((row) => row.id)}\n showDensityControl={showDensityControl}\n showThemeControl={showThemeControl}\n showFullscreenControl={showFullscreenControl}\n fullscreenTitle={fullscreenTitle}\n fullscreenButtonLabel={fullscreenButtonLabel}\n {...(resolvedRenderExpandedRow ? { renderExpandedRow: resolvedRenderExpandedRow } : {})}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;AAyBA,MAAM,eAAe,IAAI,OAAO,GAAG,OAAO,aAAa,EAAE,CAAC,wBAAwB;AAElF,MAAM,sBAAuD;AAAA,EAC3D;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ,EAAE,WAAW,KAAA;AAAA,EAAK;AAAA,EAE5B,EAAE,KAAK,OAAO,OAAO,OAAO,QAAQ,MAAM,UAAU,IAAA;AAAA,EACpD,EAAE,KAAK,UAAU,OAAO,UAAU,QAAQ,MAAM,UAAU,IAAA;AAAA,EAC1D,EAAE,KAAK,UAAU,OAAO,UAAU,QAAQ,MAAM,UAAU,IAAA;AAAA,EAC1D;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,eAAe;AAAA,IACf,QAAQ,CAAC,UAAU;AACjB,YAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,SAAS,OAAO,KAAK,OAAO,KAAK;AAClF,UAAI,CAAC,aAAa,KAAK,IAAI,EAAG,QAAO;AACrC,iCAAQ,UAAA,EAAS,IAAG,QAAO,MAAY,WAAU,mCAAkC;AAAA,IACrF;AAAA,EAAA;AAAA,EAEF;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM,EAAE,YAAY,EAAA;AAAA,EAAE;AAE1B;AAEA,MAAM,eAAe;AAAA,EACnB,KAAK;AAAA,EACL,KAAK;AACP;AAEA,SAAS,iBAAiB,KAAmB,SAAkD;AAC7F,SACE,oBAAC,cAAW,KAAU,eAAe,QAAQ,uBAAuB,SAAS,QAAQ,SAAS;AAElG;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,iBAAiB;AAAA,EACjB,GAAG;AACL,GAAmB;AACjB,QAAM,OAAO,QAAQ,MAAM,uBAAuB,IAAI,GAAG,CAAC,IAAI,CAAC;AAC/D,QAAM,4BACJ,sBAAsB,iBAAiB,mBAAmB;AAC5D,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,WAAW;AAAA,MACpB,WAAW,GAAG,gCAAgC,SAAS;AAAA,MACvD;AAAA,MACA;AAAA,MACA,aAAa,eAAe;AAAA,MAC5B,UAAU,aAAa,CAAC,QAAQ,IAAI;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAI,4BAA4B,EAAE,mBAAmB,8BAA8B,CAAA;AAAA,IAAC;AAAA,EAAA;AAG3F;"}
@@ -35,7 +35,14 @@ function deriveCoreBars(usageMilli, limitMilli) {
35
35
  const bars = Array.from({ length: coreCount }, (_, i) => ({
36
36
  fill: clamp01(usageCores - i)
37
37
  }));
38
- return { hasUsage, usageCores, limitCores, coreCount, pct, bars };
38
+ return {
39
+ hasUsage,
40
+ usageCores,
41
+ coreCount,
42
+ pct,
43
+ bars,
44
+ ...limitCores !== void 0 && { limitCores }
45
+ };
39
46
  }
40
47
  function CoreBarsIcon({ icon }) {
41
48
  if (typeof icon === "string") {