@flanksource/clicky-ui 0.3.25 → 0.3.26

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 (470) hide show
  1. package/NOTICE.md +1 -0
  2. package/dist/ai.cjs +4 -0
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +6 -2
  5. package/dist/ai.js.map +1 -1
  6. package/dist/chat.cjs +8 -0
  7. package/dist/chat.cjs.map +1 -1
  8. package/dist/chat.js +9 -1
  9. package/dist/chat.js.map +1 -1
  10. package/dist/comments/CommentCard.cjs +89 -14
  11. package/dist/comments/CommentCard.cjs.map +1 -1
  12. package/dist/comments/CommentCard.d.ts.map +1 -1
  13. package/dist/comments/CommentCard.js +90 -15
  14. package/dist/comments/CommentCard.js.map +1 -1
  15. package/dist/comments/CommentComposer.cjs +25 -2
  16. package/dist/comments/CommentComposer.cjs.map +1 -1
  17. package/dist/comments/CommentComposer.d.ts.map +1 -1
  18. package/dist/comments/CommentComposer.js +25 -2
  19. package/dist/comments/CommentComposer.js.map +1 -1
  20. package/dist/comments/CommentProvider.cjs +21 -14
  21. package/dist/comments/CommentProvider.cjs.map +1 -1
  22. package/dist/comments/CommentProvider.d.ts +1 -1
  23. package/dist/comments/CommentProvider.d.ts.map +1 -1
  24. package/dist/comments/CommentProvider.js +21 -14
  25. package/dist/comments/CommentProvider.js.map +1 -1
  26. package/dist/comments/CommentSidePanel.cjs +1 -1
  27. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  28. package/dist/comments/CommentSidePanel.js +1 -1
  29. package/dist/comments/CommentSidePanel.js.map +1 -1
  30. package/dist/comments/comment-types.cjs.map +1 -1
  31. package/dist/comments/comment-types.d.ts +6 -0
  32. package/dist/comments/comment-types.d.ts.map +1 -1
  33. package/dist/comments/comment-types.js.map +1 -1
  34. package/dist/components/DimensionField.cjs +56 -0
  35. package/dist/components/DimensionField.cjs.map +1 -0
  36. package/dist/components/DimensionField.d.ts +17 -0
  37. package/dist/components/DimensionField.d.ts.map +1 -0
  38. package/dist/components/DimensionField.js +56 -0
  39. package/dist/components/DimensionField.js.map +1 -0
  40. package/dist/components.cjs +4 -0
  41. package/dist/components.cjs.map +1 -1
  42. package/dist/components.d.ts +2 -0
  43. package/dist/components.d.ts.map +1 -1
  44. package/dist/components.js +4 -0
  45. package/dist/components.js.map +1 -1
  46. package/dist/data/Clicky.cjs +4 -5
  47. package/dist/data/Clicky.cjs.map +1 -1
  48. package/dist/data/Clicky.d.ts.map +1 -1
  49. package/dist/data/Clicky.js +4 -5
  50. package/dist/data/Clicky.js.map +1 -1
  51. package/dist/data/TaskExecDetails.cjs +8 -3
  52. package/dist/data/TaskExecDetails.cjs.map +1 -1
  53. package/dist/data/TaskExecDetails.d.ts +4 -0
  54. package/dist/data/TaskExecDetails.d.ts.map +1 -1
  55. package/dist/data/TaskExecDetails.js +9 -4
  56. package/dist/data/TaskExecDetails.js.map +1 -1
  57. package/dist/data/TaskManagerButton.cjs +101 -7
  58. package/dist/data/TaskManagerButton.cjs.map +1 -1
  59. package/dist/data/TaskManagerButton.d.ts +6 -1
  60. package/dist/data/TaskManagerButton.d.ts.map +1 -1
  61. package/dist/data/TaskManagerButton.js +103 -9
  62. package/dist/data/TaskManagerButton.js.map +1 -1
  63. package/dist/data/TaskProcessDetails.cjs +2 -0
  64. package/dist/data/TaskProcessDetails.cjs.map +1 -1
  65. package/dist/data/TaskProcessDetails.d.ts.map +1 -1
  66. package/dist/data/TaskProcessDetails.js +2 -0
  67. package/dist/data/TaskProcessDetails.js.map +1 -1
  68. package/dist/data/TaskProgress.cjs +14 -4
  69. package/dist/data/TaskProgress.cjs.map +1 -1
  70. package/dist/data/TaskProgress.js +14 -4
  71. package/dist/data/TaskProgress.js.map +1 -1
  72. package/dist/data/TaskSnapshot.cjs.map +1 -1
  73. package/dist/data/TaskSnapshot.d.ts +1 -0
  74. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  75. package/dist/data/TaskSnapshot.js.map +1 -1
  76. package/dist/data/ai/ChatWindow.cjs +18 -23
  77. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  78. package/dist/data/ai/ChatWindow.d.ts +1 -1
  79. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  80. package/dist/data/ai/ChatWindow.js +19 -24
  81. package/dist/data/ai/ChatWindow.js.map +1 -1
  82. package/dist/data/ai/ChatWindow.preferences.cjs +12 -21
  83. package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
  84. package/dist/data/ai/ChatWindow.preferences.d.ts +3 -2
  85. package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
  86. package/dist/data/ai/ChatWindow.preferences.js +12 -21
  87. package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
  88. package/dist/data/ai/ChatWindow.tool-catalog.cjs +21 -38
  89. package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
  90. package/dist/data/ai/ChatWindow.tool-catalog.d.ts +5 -5
  91. package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
  92. package/dist/data/ai/ChatWindow.tool-catalog.js +21 -38
  93. package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
  94. package/dist/data/ai/ChatWindow.types.d.ts +2 -2
  95. package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
  96. package/dist/data/ai/ChatWindowManager.cjs +2 -2
  97. package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
  98. package/dist/data/ai/ChatWindowManager.js +2 -2
  99. package/dist/data/ai/ChatWindowManager.js.map +1 -1
  100. package/dist/data/ai/ChatWindowRequestBody.cjs +4 -2
  101. package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -1
  102. package/dist/data/ai/ChatWindowRequestBody.d.ts +15 -3
  103. package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -1
  104. package/dist/data/ai/ChatWindowRequestBody.js +4 -2
  105. package/dist/data/ai/ChatWindowRequestBody.js.map +1 -1
  106. package/dist/data/ai/ToolPreferences.cjs +5 -5
  107. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  108. package/dist/data/ai/ToolPreferences.d.ts +6 -5
  109. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  110. package/dist/data/ai/ToolPreferences.js +5 -5
  111. package/dist/data/ai/ToolPreferences.js.map +1 -1
  112. package/dist/data/ai/ToolPreferences.model.cjs +61 -37
  113. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  114. package/dist/data/ai/ToolPreferences.model.d.ts +32 -13
  115. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  116. package/dist/data/ai/ToolPreferences.model.js +62 -38
  117. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  118. package/dist/data/ai/ToolPreferencesList.cjs +17 -20
  119. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  120. package/dist/data/ai/ToolPreferencesList.d.ts +16 -7
  121. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  122. package/dist/data/ai/ToolPreferencesList.js +18 -21
  123. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  124. package/dist/data/ai/chat-window-context.cjs +1 -1
  125. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  126. package/dist/data/ai/chat-window-context.d.ts +7 -7
  127. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  128. package/dist/data/ai/chat-window-context.js +1 -1
  129. package/dist/data/ai/chat-window-context.js.map +1 -1
  130. package/dist/data/ai/index.d.ts +3 -1
  131. package/dist/data/ai/index.d.ts.map +1 -1
  132. package/dist/data/chat/clickyOperationsToTools.cjs +2 -1
  133. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  134. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  135. package/dist/data/chat/clickyOperationsToTools.js +2 -1
  136. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  137. package/dist/data/chat/index.d.ts +2 -1
  138. package/dist/data/chat/index.d.ts.map +1 -1
  139. package/dist/data/chat/tool-policy.cjs +132 -0
  140. package/dist/data/chat/tool-policy.cjs.map +1 -0
  141. package/dist/data/chat/tool-policy.d.ts +81 -0
  142. package/dist/data/chat/tool-policy.d.ts.map +1 -0
  143. package/dist/data/chat/tool-policy.js +132 -0
  144. package/dist/data/chat/tool-policy.js.map +1 -0
  145. package/dist/data/chat/types.cjs +20 -0
  146. package/dist/data/chat/types.cjs.map +1 -1
  147. package/dist/data/chat/types.d.ts +22 -2
  148. package/dist/data/chat/types.d.ts.map +1 -1
  149. package/dist/data/chat/types.js +20 -0
  150. package/dist/data/chat/types.js.map +1 -1
  151. package/dist/data/debugConsoleSignal.cjs +64 -0
  152. package/dist/data/debugConsoleSignal.cjs.map +1 -0
  153. package/dist/data/debugConsoleSignal.d.ts +83 -0
  154. package/dist/data/debugConsoleSignal.d.ts.map +1 -0
  155. package/dist/data/debugConsoleSignal.js +64 -0
  156. package/dist/data/debugConsoleSignal.js.map +1 -0
  157. package/dist/data/har/HarPanel.cjs +20 -14
  158. package/dist/data/har/HarPanel.cjs.map +1 -1
  159. package/dist/data/har/HarPanel.d.ts.map +1 -1
  160. package/dist/data/har/HarPanel.js +20 -14
  161. package/dist/data/har/HarPanel.js.map +1 -1
  162. package/dist/data/har/types.d.ts +18 -0
  163. package/dist/data/har/types.d.ts.map +1 -1
  164. package/dist/data/query-browser/QueryBrowser.cjs +4 -42
  165. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  166. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  167. package/dist/data/query-browser/QueryBrowser.js +5 -43
  168. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  169. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
  170. package/dist/data/query-browser/QueryBrowser.types.d.ts +0 -1
  171. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
  172. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
  173. package/dist/data/useDebugAction.cjs +29 -0
  174. package/dist/data/useDebugAction.cjs.map +1 -0
  175. package/dist/data/useDebugAction.d.ts +16 -0
  176. package/dist/data/useDebugAction.d.ts.map +1 -0
  177. package/dist/data/useDebugAction.js +29 -0
  178. package/dist/data/useDebugAction.js.map +1 -0
  179. package/dist/data/version-info.cjs +3 -3
  180. package/dist/data/version-info.js +3 -3
  181. package/dist/data.cjs +16 -8
  182. package/dist/data.cjs.map +1 -1
  183. package/dist/data.d.ts +3 -2
  184. package/dist/data.d.ts.map +1 -1
  185. package/dist/data.js +16 -8
  186. package/dist/devtools/DebugConsole.cjs +138 -0
  187. package/dist/devtools/DebugConsole.cjs.map +1 -0
  188. package/dist/devtools/DebugConsole.d.ts +23 -0
  189. package/dist/devtools/DebugConsole.d.ts.map +1 -0
  190. package/dist/devtools/DebugConsole.js +138 -0
  191. package/dist/devtools/DebugConsole.js.map +1 -0
  192. package/dist/devtools/DebugConsoleButton.cjs +59 -0
  193. package/dist/devtools/DebugConsoleButton.cjs.map +1 -0
  194. package/dist/devtools/DebugConsoleButton.d.ts +20 -0
  195. package/dist/devtools/DebugConsoleButton.d.ts.map +1 -0
  196. package/dist/devtools/DebugConsoleButton.js +59 -0
  197. package/dist/devtools/DebugConsoleButton.js.map +1 -0
  198. package/dist/devtools/DebugConsoleDock.cjs +112 -0
  199. package/dist/devtools/DebugConsoleDock.cjs.map +1 -0
  200. package/dist/devtools/DebugConsoleDock.d.ts +26 -0
  201. package/dist/devtools/DebugConsoleDock.d.ts.map +1 -0
  202. package/dist/devtools/DebugConsoleDock.js +112 -0
  203. package/dist/devtools/DebugConsoleDock.js.map +1 -0
  204. package/dist/devtools/ExecutionDetail.cjs +135 -0
  205. package/dist/devtools/ExecutionDetail.cjs.map +1 -0
  206. package/dist/devtools/ExecutionDetail.d.ts +19 -0
  207. package/dist/devtools/ExecutionDetail.d.ts.map +1 -0
  208. package/dist/devtools/ExecutionDetail.js +135 -0
  209. package/dist/devtools/ExecutionDetail.js.map +1 -0
  210. package/dist/devtools/debugClient.cjs +172 -0
  211. package/dist/devtools/debugClient.cjs.map +1 -0
  212. package/dist/devtools/debugClient.d.ts +98 -0
  213. package/dist/devtools/debugClient.d.ts.map +1 -0
  214. package/dist/devtools/debugClient.js +172 -0
  215. package/dist/devtools/debugClient.js.map +1 -0
  216. package/dist/devtools/debugStore.cjs +115 -0
  217. package/dist/devtools/debugStore.cjs.map +1 -0
  218. package/dist/devtools/debugStore.d.ts +83 -0
  219. package/dist/devtools/debugStore.d.ts.map +1 -0
  220. package/dist/devtools/debugStore.js +115 -0
  221. package/dist/devtools/debugStore.js.map +1 -0
  222. package/dist/devtools/dockState.cjs +51 -0
  223. package/dist/devtools/dockState.cjs.map +1 -0
  224. package/dist/devtools/dockState.d.ts +31 -0
  225. package/dist/devtools/dockState.d.ts.map +1 -0
  226. package/dist/devtools/dockState.js +51 -0
  227. package/dist/devtools/dockState.js.map +1 -0
  228. package/dist/devtools/tabs/ConsoleTab.cjs +36 -0
  229. package/dist/devtools/tabs/ConsoleTab.cjs.map +1 -0
  230. package/dist/devtools/tabs/ConsoleTab.d.ts +19 -0
  231. package/dist/devtools/tabs/ConsoleTab.d.ts.map +1 -0
  232. package/dist/devtools/tabs/ConsoleTab.js +36 -0
  233. package/dist/devtools/tabs/ConsoleTab.js.map +1 -0
  234. package/dist/devtools/tabs/InspectionCaches.cjs +150 -0
  235. package/dist/devtools/tabs/InspectionCaches.cjs.map +1 -0
  236. package/dist/devtools/tabs/InspectionCaches.d.ts +23 -0
  237. package/dist/devtools/tabs/InspectionCaches.d.ts.map +1 -0
  238. package/dist/devtools/tabs/InspectionCaches.js +150 -0
  239. package/dist/devtools/tabs/InspectionCaches.js.map +1 -0
  240. package/dist/devtools/tabs/InspectionTab.cjs +316 -0
  241. package/dist/devtools/tabs/InspectionTab.cjs.map +1 -0
  242. package/dist/devtools/tabs/InspectionTab.d.ts +27 -0
  243. package/dist/devtools/tabs/InspectionTab.d.ts.map +1 -0
  244. package/dist/devtools/tabs/InspectionTab.js +316 -0
  245. package/dist/devtools/tabs/InspectionTab.js.map +1 -0
  246. package/dist/devtools/tabs/NetworkTab.cjs +91 -0
  247. package/dist/devtools/tabs/NetworkTab.cjs.map +1 -0
  248. package/dist/devtools/tabs/NetworkTab.d.ts +20 -0
  249. package/dist/devtools/tabs/NetworkTab.d.ts.map +1 -0
  250. package/dist/devtools/tabs/NetworkTab.js +91 -0
  251. package/dist/devtools/tabs/NetworkTab.js.map +1 -0
  252. package/dist/devtools/tabs/QueriesTab.cjs +85 -0
  253. package/dist/devtools/tabs/QueriesTab.cjs.map +1 -0
  254. package/dist/devtools/tabs/QueriesTab.d.ts +24 -0
  255. package/dist/devtools/tabs/QueriesTab.d.ts.map +1 -0
  256. package/dist/devtools/tabs/QueriesTab.js +85 -0
  257. package/dist/devtools/tabs/QueriesTab.js.map +1 -0
  258. package/dist/devtools/types.cjs +26 -0
  259. package/dist/devtools/types.cjs.map +1 -0
  260. package/dist/devtools/types.d.ts +235 -0
  261. package/dist/devtools/types.d.ts.map +1 -0
  262. package/dist/devtools/types.js +26 -0
  263. package/dist/devtools/types.js.map +1 -0
  264. package/dist/devtools/useDebugStream.cjs +46 -0
  265. package/dist/devtools/useDebugStream.cjs.map +1 -0
  266. package/dist/devtools/useDebugStream.d.ts +23 -0
  267. package/dist/devtools/useDebugStream.d.ts.map +1 -0
  268. package/dist/devtools/useDebugStream.js +46 -0
  269. package/dist/devtools/useDebugStream.js.map +1 -0
  270. package/dist/devtools.cjs +51 -0
  271. package/dist/devtools.cjs.map +1 -0
  272. package/dist/devtools.d.ts +37 -0
  273. package/dist/devtools.d.ts.map +1 -0
  274. package/dist/devtools.js +51 -0
  275. package/dist/devtools.js.map +1 -0
  276. package/dist/icons/components/UiOpenScad.cjs +10 -0
  277. package/dist/icons/components/UiOpenScad.cjs.map +1 -0
  278. package/dist/icons/components/UiOpenScad.d.ts +9 -0
  279. package/dist/icons/components/UiOpenScad.d.ts.map +1 -0
  280. package/dist/icons/components/UiOpenScad.js +10 -0
  281. package/dist/icons/components/UiOpenScad.js.map +1 -0
  282. package/dist/icons/index.d.ts +1 -0
  283. package/dist/icons/index.d.ts.map +1 -1
  284. package/dist/icons/registry.cjs +2 -0
  285. package/dist/icons/registry.cjs.map +1 -1
  286. package/dist/icons/registry.d.ts.map +1 -1
  287. package/dist/icons/registry.js +2 -0
  288. package/dist/icons/registry.js.map +1 -1
  289. package/dist/icons.cjs +2 -0
  290. package/dist/icons.cjs.map +1 -1
  291. package/dist/icons.js +2 -0
  292. package/dist/icons.js.map +1 -1
  293. package/dist/index.cjs +20 -8
  294. package/dist/index.cjs.map +1 -1
  295. package/dist/index.js +20 -8
  296. package/dist/index.js.map +1 -1
  297. package/dist/layout/AppShell.cjs +15 -10
  298. package/dist/layout/AppShell.cjs.map +1 -1
  299. package/dist/layout/AppShell.d.ts +11 -0
  300. package/dist/layout/AppShell.d.ts.map +1 -1
  301. package/dist/layout/AppShell.js +15 -10
  302. package/dist/layout/AppShell.js.map +1 -1
  303. package/dist/layout/AppShell.nav.cjs +170 -49
  304. package/dist/layout/AppShell.nav.cjs.map +1 -1
  305. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  306. package/dist/layout/AppShell.nav.js +170 -49
  307. package/dist/layout/AppShell.nav.js.map +1 -1
  308. package/dist/overlay/CellActions.cjs +18 -124
  309. package/dist/overlay/CellActions.cjs.map +1 -1
  310. package/dist/overlay/CellActions.d.ts +1 -1
  311. package/dist/overlay/CellActions.d.ts.map +1 -1
  312. package/dist/overlay/CellActions.js +18 -124
  313. package/dist/overlay/CellActions.js.map +1 -1
  314. package/dist/overlay/ContextMenu.cjs +144 -0
  315. package/dist/overlay/ContextMenu.cjs.map +1 -0
  316. package/dist/overlay/ContextMenu.d.ts +8 -0
  317. package/dist/overlay/ContextMenu.d.ts.map +1 -0
  318. package/dist/overlay/ContextMenu.js +144 -0
  319. package/dist/overlay/ContextMenu.js.map +1 -0
  320. package/dist/profiles/connections/connectionBrowserModel.cjs +14 -65
  321. package/dist/profiles/connections/connectionBrowserModel.cjs.map +1 -1
  322. package/dist/profiles/connections/connectionBrowserModel.d.ts +35 -35
  323. package/dist/profiles/connections/connectionBrowserModel.d.ts.map +1 -1
  324. package/dist/profiles/connections/connectionBrowserModel.js +14 -65
  325. package/dist/profiles/connections/connectionBrowserModel.js.map +1 -1
  326. package/dist/profiles/connections/connectionQueryWorkspace.cjs +29 -9
  327. package/dist/profiles/connections/connectionQueryWorkspace.cjs.map +1 -1
  328. package/dist/profiles/connections/connectionQueryWorkspace.d.ts +3 -2
  329. package/dist/profiles/connections/connectionQueryWorkspace.d.ts.map +1 -1
  330. package/dist/profiles/connections/connectionQueryWorkspace.js +30 -10
  331. package/dist/profiles/connections/connectionQueryWorkspace.js.map +1 -1
  332. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs +15 -0
  333. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs.map +1 -1
  334. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts +22 -1
  335. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts.map +1 -1
  336. package/dist/profiles/connections/connectionQueryWorkspaceModel.js +15 -0
  337. package/dist/profiles/connections/connectionQueryWorkspaceModel.js.map +1 -1
  338. package/dist/profiles/connections/index.d.ts +1 -0
  339. package/dist/profiles/connections/index.d.ts.map +1 -1
  340. package/dist/profiles/connections/inspectionStatus.cjs +44 -0
  341. package/dist/profiles/connections/inspectionStatus.cjs.map +1 -0
  342. package/dist/profiles/connections/inspectionStatus.d.ts +5 -0
  343. package/dist/profiles/connections/inspectionStatus.d.ts.map +1 -0
  344. package/dist/profiles/connections/inspectionStatus.js +44 -0
  345. package/dist/profiles/connections/inspectionStatus.js.map +1 -0
  346. package/dist/profiles/connections/useInspection.cjs +123 -0
  347. package/dist/profiles/connections/useInspection.cjs.map +1 -0
  348. package/dist/profiles/connections/useInspection.d.ts +35 -0
  349. package/dist/profiles/connections/useInspection.d.ts.map +1 -0
  350. package/dist/profiles/connections/useInspection.js +123 -0
  351. package/dist/profiles/connections/useInspection.js.map +1 -0
  352. package/dist/profiles/editor/profileBuilderWorkspace.cjs +55 -23
  353. package/dist/profiles/editor/profileBuilderWorkspace.cjs.map +1 -1
  354. package/dist/profiles/editor/profileBuilderWorkspace.d.ts.map +1 -1
  355. package/dist/profiles/editor/profileBuilderWorkspace.js +56 -24
  356. package/dist/profiles/editor/profileBuilderWorkspace.js.map +1 -1
  357. package/dist/profiles/elasticsearch/esQueryBuilder.cjs +12 -3
  358. package/dist/profiles/elasticsearch/esQueryBuilder.cjs.map +1 -1
  359. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts +2 -2
  360. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts.map +1 -1
  361. package/dist/profiles/elasticsearch/esQueryBuilder.js +12 -3
  362. package/dist/profiles/elasticsearch/esQueryBuilder.js.map +1 -1
  363. package/dist/profiles/fields/profileFieldEditor.cjs +137 -22
  364. package/dist/profiles/fields/profileFieldEditor.cjs.map +1 -1
  365. package/dist/profiles/fields/profileFieldEditor.d.ts.map +1 -1
  366. package/dist/profiles/fields/profileFieldEditor.js +137 -22
  367. package/dist/profiles/fields/profileFieldEditor.js.map +1 -1
  368. package/dist/profiles/fields/profileFieldFilterEditor.cjs +171 -82
  369. package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
  370. package/dist/profiles/fields/profileFieldFilterEditor.d.ts +0 -9
  371. package/dist/profiles/fields/profileFieldFilterEditor.d.ts.map +1 -1
  372. package/dist/profiles/fields/profileFieldFilterEditor.js +174 -85
  373. package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
  374. package/dist/profiles/fields/profileFieldIcons.cjs +6 -3
  375. package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
  376. package/dist/profiles/fields/profileFieldIcons.js +6 -3
  377. package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
  378. package/dist/profiles/query/profileSampleFilterLookup.cjs +34 -0
  379. package/dist/profiles/query/profileSampleFilterLookup.cjs.map +1 -0
  380. package/dist/profiles/query/profileSampleFilterLookup.d.ts +12 -0
  381. package/dist/profiles/query/profileSampleFilterLookup.d.ts.map +1 -0
  382. package/dist/profiles/query/profileSampleFilterLookup.js +34 -0
  383. package/dist/profiles/query/profileSampleFilterLookup.js.map +1 -0
  384. package/dist/profiles/query/profileSamplePayload.cjs +6 -4
  385. package/dist/profiles/query/profileSamplePayload.cjs.map +1 -1
  386. package/dist/profiles/query/profileSamplePayload.d.ts +11 -4
  387. package/dist/profiles/query/profileSamplePayload.d.ts.map +1 -1
  388. package/dist/profiles/query/profileSamplePayload.js +6 -4
  389. package/dist/profiles/query/profileSamplePayload.js.map +1 -1
  390. package/dist/profiles/query/profileSampleResult.cjs +26 -0
  391. package/dist/profiles/query/profileSampleResult.cjs.map +1 -0
  392. package/dist/profiles/query/profileSampleResult.d.ts +11 -0
  393. package/dist/profiles/query/profileSampleResult.d.ts.map +1 -0
  394. package/dist/profiles/query/profileSampleResult.js +26 -0
  395. package/dist/profiles/query/profileSampleResult.js.map +1 -0
  396. package/dist/profiles/query/queryTargetPicker.cjs +5 -3
  397. package/dist/profiles/query/queryTargetPicker.cjs.map +1 -1
  398. package/dist/profiles/query/queryTargetPicker.d.ts +3 -2
  399. package/dist/profiles/query/queryTargetPicker.d.ts.map +1 -1
  400. package/dist/profiles/query/queryTargetPicker.js +5 -3
  401. package/dist/profiles/query/queryTargetPicker.js.map +1 -1
  402. package/dist/profiles/wizard/profileWizard.cjs +14 -5
  403. package/dist/profiles/wizard/profileWizard.cjs.map +1 -1
  404. package/dist/profiles/wizard/profileWizard.d.ts.map +1 -1
  405. package/dist/profiles/wizard/profileWizard.js +15 -6
  406. package/dist/profiles/wizard/profileWizard.js.map +1 -1
  407. package/dist/profiles/wizard/profileWizardModel.cjs +35 -6
  408. package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
  409. package/dist/profiles/wizard/profileWizardModel.d.ts +29 -4
  410. package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
  411. package/dist/profiles/wizard/profileWizardModel.js +35 -6
  412. package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
  413. package/dist/profiles/wizard/profileWizardQueryStep.cjs +44 -11
  414. package/dist/profiles/wizard/profileWizardQueryStep.cjs.map +1 -1
  415. package/dist/profiles/wizard/profileWizardQueryStep.d.ts.map +1 -1
  416. package/dist/profiles/wizard/profileWizardQueryStep.js +46 -13
  417. package/dist/profiles/wizard/profileWizardQueryStep.js.map +1 -1
  418. package/dist/profiles/wizard/profileWizardSteps.cjs +33 -2
  419. package/dist/profiles/wizard/profileWizardSteps.cjs.map +1 -1
  420. package/dist/profiles/wizard/profileWizardSteps.d.ts +11 -2
  421. package/dist/profiles/wizard/profileWizardSteps.d.ts.map +1 -1
  422. package/dist/profiles/wizard/profileWizardSteps.js +33 -2
  423. package/dist/profiles/wizard/profileWizardSteps.js.map +1 -1
  424. package/dist/profiles.cjs +8 -2
  425. package/dist/profiles.cjs.map +1 -1
  426. package/dist/profiles.js +10 -4
  427. package/dist/profiles.js.map +1 -1
  428. package/dist/rpc/FilterForm.cjs +21 -237
  429. package/dist/rpc/FilterForm.cjs.map +1 -1
  430. package/dist/rpc/FilterForm.d.ts +3 -1
  431. package/dist/rpc/FilterForm.d.ts.map +1 -1
  432. package/dist/rpc/FilterForm.js +21 -237
  433. package/dist/rpc/FilterForm.js.map +1 -1
  434. package/dist/rpc/FilterFormFields.cjs +240 -0
  435. package/dist/rpc/FilterFormFields.cjs.map +1 -0
  436. package/dist/rpc/FilterFormFields.d.ts +12 -0
  437. package/dist/rpc/FilterFormFields.d.ts.map +1 -0
  438. package/dist/rpc/FilterFormFields.js +240 -0
  439. package/dist/rpc/FilterFormFields.js.map +1 -0
  440. package/dist/rpc/router.cjs +3 -2
  441. package/dist/rpc/router.cjs.map +1 -1
  442. package/dist/rpc/router.d.ts.map +1 -1
  443. package/dist/rpc/router.js +3 -2
  444. package/dist/rpc/router.js.map +1 -1
  445. package/dist/rpc/types.cjs.map +1 -1
  446. package/dist/rpc/types.d.ts +3 -1
  447. package/dist/rpc/types.d.ts.map +1 -1
  448. package/dist/rpc/types.js.map +1 -1
  449. package/dist/styles.css +1 -1
  450. package/package.json +6 -1
  451. package/dist/data/query-info/QueryInfoDialog.cjs +0 -106
  452. package/dist/data/query-info/QueryInfoDialog.cjs.map +0 -1
  453. package/dist/data/query-info/QueryInfoDialog.d.ts +0 -16
  454. package/dist/data/query-info/QueryInfoDialog.d.ts.map +0 -1
  455. package/dist/data/query-info/QueryInfoDialog.js +0 -106
  456. package/dist/data/query-info/QueryInfoDialog.js.map +0 -1
  457. package/dist/data/query-info/index.d.ts +0 -4
  458. package/dist/data/query-info/index.d.ts.map +0 -1
  459. package/dist/data/query-info/queryInfo.cjs +0 -42
  460. package/dist/data/query-info/queryInfo.cjs.map +0 -1
  461. package/dist/data/query-info/queryInfo.d.ts +0 -45
  462. package/dist/data/query-info/queryInfo.d.ts.map +0 -1
  463. package/dist/data/query-info/queryInfo.js +0 -42
  464. package/dist/data/query-info/queryInfo.js.map +0 -1
  465. package/dist/data/query-info/useQueryInfo.cjs +0 -48
  466. package/dist/data/query-info/useQueryInfo.cjs.map +0 -1
  467. package/dist/data/query-info/useQueryInfo.d.ts +0 -26
  468. package/dist/data/query-info/useQueryInfo.d.ts.map +0 -1
  469. package/dist/data/query-info/useQueryInfo.js +0 -48
  470. package/dist/data/query-info/useQueryInfo.js.map +0 -1
@@ -0,0 +1,316 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { Button } from "../../components/button.js";
4
+ import { DataTable } from "../../data/DataTable.js";
5
+ import { DebugClient } from "../debugClient.js";
6
+ import { InspectionCaches } from "./InspectionCaches.js";
7
+ const CACHE_COLUMNS = [
8
+ { key: "policy", label: "Cache", shrink: true, minWidth: 180, filterable: true },
9
+ {
10
+ key: "cached",
11
+ label: "Result",
12
+ shrink: true,
13
+ minWidth: 90,
14
+ filterable: true,
15
+ render: (value) => value === true ? "hit" : "miss"
16
+ },
17
+ {
18
+ key: "elapsedMs",
19
+ label: "Waited",
20
+ align: "right",
21
+ shrink: true,
22
+ render: (value) => `${Number(value ?? 0).toFixed(1)}ms`,
23
+ sortValue: (value) => Number(value ?? 0)
24
+ },
25
+ {
26
+ key: "ageMs",
27
+ label: "Age",
28
+ align: "right",
29
+ shrink: true,
30
+ render: (value) => formatAge(Number(value ?? 0)),
31
+ sortValue: (value) => Number(value ?? 0)
32
+ },
33
+ { key: "state", label: "State", shrink: true, minWidth: 80 },
34
+ {
35
+ key: "refreshError",
36
+ label: "Note",
37
+ grow: true,
38
+ render: (value, row) => row.error || String(value ?? "")
39
+ }
40
+ ];
41
+ const PROBE_COLUMNS = [
42
+ { key: "column", label: "Column", shrink: true, minWidth: 160 },
43
+ { key: "field", label: "Field", shrink: true, minWidth: 160 },
44
+ { key: "distinct", label: "Distinct", align: "right", shrink: true },
45
+ { key: "limit", label: "Limit", align: "right", shrink: true },
46
+ {
47
+ key: "kind",
48
+ label: "Chose",
49
+ shrink: true,
50
+ minWidth: 110,
51
+ // An empty kind means the count came back under the limit and nothing had
52
+ // to change — which is an answer, so it is spelled out rather than blank.
53
+ render: (value) => String(value ?? "") === "" ? "left as-is" : String(value)
54
+ },
55
+ {
56
+ key: "cached",
57
+ label: "Counted",
58
+ shrink: true,
59
+ minWidth: 90,
60
+ render: (value) => value === true ? "from cache" : "this run"
61
+ }
62
+ ];
63
+ function InspectionTab({
64
+ record,
65
+ client,
66
+ inspections,
67
+ probes,
68
+ refreshInspection = false,
69
+ onRefreshInspectionChange,
70
+ caches
71
+ }) {
72
+ const loaded = useInspection(record, client, inspections, probes);
73
+ const [manualDetail, setManualDetail] = useState();
74
+ useEffect(() => setManualDetail(void 0), [record == null ? void 0 : record.id]);
75
+ const displayedInspections = (manualDetail == null ? void 0 : manualDetail.inspections) ?? loaded.inspections;
76
+ const displayedProbes = (manualDetail == null ? void 0 : manualDetail.probes) ?? loaded.probes;
77
+ return (
78
+ // Three sections stacked, so this scrolls as one region rather than
79
+ // bounding each table separately — a five-row list with its own scrollbar
80
+ // reads as truncated when it is complete.
81
+ /* @__PURE__ */ jsxs("div", { className: "flex h-full min-h-0 flex-col gap-density-4 overflow-auto p-density-3", children: [
82
+ /* @__PURE__ */ jsx(
83
+ InspectionCaches,
84
+ {
85
+ ...client ? { client } : {},
86
+ refreshInspection,
87
+ onRefreshInspectionChange: onRefreshInspectionChange ?? (() => void 0),
88
+ ...caches !== void 0 ? { caches } : {}
89
+ }
90
+ ),
91
+ /* @__PURE__ */ jsx(
92
+ ManualInspection,
93
+ {
94
+ record,
95
+ operations: loaded.operations,
96
+ client,
97
+ onComplete: setManualDetail
98
+ }
99
+ ),
100
+ loaded.error ? /* @__PURE__ */ jsx(Empty, { className: "text-destructive", children: loaded.error }) : null,
101
+ !loaded.error && displayedInspections.length === 0 && displayedProbes.length === 0 ? /* @__PURE__ */ jsx(Empty, { children: record ? "This capture looked nothing up — every column it needed was already described." : "Select a capture in Queries to see the metadata it looked up." }) : null,
102
+ displayedInspections.length > 0 ? /* @__PURE__ */ jsxs("section", { children: [
103
+ /* @__PURE__ */ jsx(Heading, { children: "Metadata cache" }),
104
+ /* @__PURE__ */ jsx(
105
+ DataTable,
106
+ {
107
+ data: displayedInspections.map((row, index) => ({
108
+ ...row,
109
+ id: `${row.key}-${index}`
110
+ })),
111
+ columns: CACHE_COLUMNS,
112
+ emptyMessage: "No cache lookups"
113
+ }
114
+ )
115
+ ] }) : null,
116
+ displayedProbes.length > 0 ? /* @__PURE__ */ jsxs("section", { children: [
117
+ /* @__PURE__ */ jsx(Heading, { children: "Column cardinality" }),
118
+ /* @__PURE__ */ jsx(
119
+ DataTable,
120
+ {
121
+ data: displayedProbes.map((row, index) => ({
122
+ ...row,
123
+ id: `${row.column}-${index}`
124
+ })),
125
+ columns: PROBE_COLUMNS,
126
+ emptyMessage: "No cardinality probes"
127
+ }
128
+ )
129
+ ] }) : null
130
+ ] })
131
+ );
132
+ }
133
+ function ManualInspection({
134
+ record,
135
+ operations,
136
+ client,
137
+ onComplete
138
+ }) {
139
+ const [selected, setSelected] = useState(0);
140
+ const [columns, setColumns] = useState("");
141
+ const [refresh, setRefresh] = useState(true);
142
+ const [running, setRunning] = useState(false);
143
+ const [outcome, setOutcome] = useState();
144
+ useEffect(() => {
145
+ setSelected(0);
146
+ setColumns("");
147
+ setOutcome(void 0);
148
+ }, [record == null ? void 0 : record.id]);
149
+ const operation = operations[selected];
150
+ if (!record) {
151
+ return /* @__PURE__ */ jsxs("section", { children: [
152
+ /* @__PURE__ */ jsx(Heading, { children: "Run inspection" }),
153
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: "Select a capture first; its provider request supplies the connection and query." })
154
+ ] });
155
+ }
156
+ if (!operation) {
157
+ return /* @__PURE__ */ jsxs("section", { children: [
158
+ /* @__PURE__ */ jsx(Heading, { children: "Run inspection" }),
159
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: "This capture has no provider operation that can be inspected." })
160
+ ] });
161
+ }
162
+ const query = operation.request.rendered || operation.request.query || "";
163
+ const connection = operation.request.connection;
164
+ const request = {
165
+ provider: operation.provider,
166
+ ...connection ? { connection } : {},
167
+ query,
168
+ ...operation.request.options ? { options: operation.request.options } : {},
169
+ columns: parseColumns(columns),
170
+ refresh
171
+ };
172
+ const run = async () => {
173
+ var _a, _b;
174
+ setRunning(true);
175
+ setOutcome(void 0);
176
+ try {
177
+ const detail = await (client ?? new DebugClient()).runInspection(request);
178
+ onComplete(detail);
179
+ const failure = detail.summary.error ?? ((_b = (_a = detail.operations) == null ? void 0 : _a.find((item) => item.error)) == null ? void 0 : _b.error);
180
+ setOutcome(
181
+ failure ? `Inspection completed with an error: ${failure}` : `Inspection ${detail.summary.id} completed.`
182
+ );
183
+ } catch (failure) {
184
+ setOutcome(failure instanceof Error ? failure.message : String(failure));
185
+ } finally {
186
+ setRunning(false);
187
+ }
188
+ };
189
+ return /* @__PURE__ */ jsxs("section", { className: "flex flex-col gap-density-2 rounded border border-border p-density-3", children: [
190
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-density-2", children: [
191
+ /* @__PURE__ */ jsx(Heading, { children: "Run inspection" }),
192
+ /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground text-xs", children: [
193
+ operation.provider,
194
+ " · ",
195
+ connection || "inline connection"
196
+ ] })
197
+ ] }),
198
+ operations.length > 1 ? /* @__PURE__ */ jsxs("label", { className: "grid gap-density-1 text-xs", children: [
199
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Provider operation" }),
200
+ /* @__PURE__ */ jsx(
201
+ "select",
202
+ {
203
+ className: "rounded border border-border bg-background px-density-2 py-density-1",
204
+ value: selected,
205
+ onChange: (event) => setSelected(Number(event.target.value)),
206
+ children: operations.map((item, index) => /* @__PURE__ */ jsxs("option", { value: index, children: [
207
+ index + 1,
208
+ ". ",
209
+ item.provider,
210
+ " · ",
211
+ item.request.connection || "inline connection"
212
+ ] }, `${item.provider}-${index}`))
213
+ }
214
+ )
215
+ ] }) : null,
216
+ /* @__PURE__ */ jsxs("label", { className: "grid gap-density-1 text-xs", children: [
217
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Columns to inspect" }),
218
+ /* @__PURE__ */ jsx(
219
+ "input",
220
+ {
221
+ "aria-label": "Columns to inspect",
222
+ className: "rounded border border-border bg-background px-density-2 py-density-1 font-mono",
223
+ value: columns,
224
+ placeholder: "Auto-detect, or enter comma-separated names",
225
+ onChange: (event) => setColumns(event.target.value)
226
+ }
227
+ )
228
+ ] }),
229
+ /* @__PURE__ */ jsx("code", { className: "max-h-20 overflow-auto whitespace-pre-wrap rounded bg-muted/40 p-density-2 text-xs", children: query }),
230
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-between gap-density-2", children: [
231
+ /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-density-1 text-xs", children: [
232
+ /* @__PURE__ */ jsx(
233
+ "input",
234
+ {
235
+ type: "checkbox",
236
+ checked: refresh,
237
+ onChange: (event) => setRefresh(event.target.checked)
238
+ }
239
+ ),
240
+ "Refresh cached metadata"
241
+ ] }),
242
+ /* @__PURE__ */ jsx(Button, { size: "sm", disabled: running || query === "", onClick: () => void run(), children: running ? "Running inspection…" : "Run inspection" })
243
+ ] }),
244
+ outcome ? /* @__PURE__ */ jsx("p", { className: outcome.includes("error") ? "text-destructive text-xs" : "text-muted-foreground text-xs", children: outcome }) : null
245
+ ] });
246
+ }
247
+ function parseColumns(value) {
248
+ return [...new Set(value.split(",").map((column) => column.trim()).filter(Boolean))];
249
+ }
250
+ function Heading({ children }) {
251
+ return /* @__PURE__ */ jsx("h3", { className: "mb-density-2 font-medium text-muted-foreground text-xs uppercase tracking-wide", children });
252
+ }
253
+ function Empty({ children, className }) {
254
+ return /* @__PURE__ */ jsx("div", { className: `p-density-6 text-center text-muted-foreground text-sm ${className ?? ""}`, children });
255
+ }
256
+ function useInspection(record, client, providedInspections, providedProbes) {
257
+ const [inspections, setInspections] = useState(providedInspections ?? []);
258
+ const [probes, setProbes] = useState(providedProbes ?? []);
259
+ const [operations, setOperations] = useState(
260
+ summaryOperations(record)
261
+ );
262
+ const [error, setError] = useState();
263
+ useEffect(() => {
264
+ if (providedInspections !== void 0 || providedProbes !== void 0) {
265
+ setInspections(providedInspections ?? []);
266
+ setProbes(providedProbes ?? []);
267
+ setOperations(summaryOperations(record));
268
+ return;
269
+ }
270
+ if (!record) {
271
+ setInspections([]);
272
+ setProbes([]);
273
+ setOperations([]);
274
+ return;
275
+ }
276
+ let cancelled = false;
277
+ setError(void 0);
278
+ setInspections([]);
279
+ setProbes([]);
280
+ setOperations(summaryOperations(record));
281
+ (client ?? new DebugClient()).detail(record.id).then((detail) => {
282
+ if (cancelled) return;
283
+ setInspections(detail.inspections ?? []);
284
+ setProbes(detail.probes ?? []);
285
+ setOperations(detail.operations ?? summaryOperations(record));
286
+ }).catch((failure) => {
287
+ if (!cancelled) setError(failure instanceof Error ? failure.message : String(failure));
288
+ });
289
+ return () => {
290
+ cancelled = true;
291
+ };
292
+ }, [record, client, providedInspections, providedProbes]);
293
+ return { inspections, probes, operations, error };
294
+ }
295
+ function summaryOperations(record) {
296
+ return ((record == null ? void 0 : record.operations) ?? []).map((operation) => ({
297
+ provider: operation.provider,
298
+ request: {
299
+ ...operation.query ? { query: operation.query, rendered: operation.query } : {},
300
+ ...operation.connection ? { connection: operation.connection } : {},
301
+ ...operation.method ? { method: operation.method } : {},
302
+ ...operation.url ? { url: operation.url } : {}
303
+ },
304
+ ...operation.error ? { error: operation.error } : {}
305
+ }));
306
+ }
307
+ function formatAge(ageMs) {
308
+ if (ageMs < 1e3) return `${ageMs}ms`;
309
+ if (ageMs < 6e4) return `${(ageMs / 1e3).toFixed(0)}s`;
310
+ if (ageMs < 36e5) return `${(ageMs / 6e4).toFixed(0)}m`;
311
+ return `${(ageMs / 36e5).toFixed(1)}h`;
312
+ }
313
+ export {
314
+ InspectionTab
315
+ };
316
+ //# sourceMappingURL=InspectionTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InspectionTab.js","sources":["../../../src/devtools/tabs/InspectionTab.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { DataTable, type DataTableColumn } from \"../../data/DataTable\";\nimport {\n DebugClient,\n type ManualInspectionRequest,\n} from \"../debugClient\";\nimport type { QueryBrowserDiagnostics } from \"../../data/query-browser/QueryBrowser.types\";\nimport type {\n CardinalityProbe,\n ExecutionDetail,\n ExecutionSummary,\n InspectionCacheStats,\n InspectionRecord,\n} from \"../types\";\nimport { InspectionCaches } from \"./InspectionCaches\";\n\n/**\n * What the request paid to describe its own columns.\n *\n * Two questions live here, and both are otherwise unanswerable from outside the\n * server. \"Why did opening this profile take four seconds once and 200ms\n * after?\" is the cache table: a miss pays the whole fill, a hit pays nothing,\n * and the elapsed column is the difference. \"Why is this column a free-text box\n * instead of a dropdown?\" is the probe table: a distinct count above the lookup\n * limit is the entire reason, and reading the provider's source was previously\n * the only way to learn it.\n */\n\nexport type InspectionTabProps = {\n record?: ExecutionSummary | undefined;\n client?: DebugClient | undefined;\n /** Pre-loaded rows, for a story or a test that has no server. */\n inspections?: InspectionRecord[] | undefined;\n probes?: CardinalityProbe[] | undefined;\n /** Rebuild every metadata lookup on subsequent requests. */\n refreshInspection?: boolean | undefined;\n onRefreshInspectionChange?: ((refresh: boolean) => void) | undefined;\n /** Pre-loaded cache stats, for a story or a test that has no server. */\n caches?: InspectionCacheStats[] | undefined;\n};\n\ntype CacheRow = Record<string, unknown> & InspectionRecord & { id: string };\ntype ProbeRow = Record<string, unknown> & CardinalityProbe & { id: string };\n\nconst CACHE_COLUMNS: DataTableColumn<CacheRow>[] = [\n { key: \"policy\", label: \"Cache\", shrink: true, minWidth: 180, filterable: true },\n {\n key: \"cached\",\n label: \"Result\",\n shrink: true,\n minWidth: 90,\n filterable: true,\n render: (value) => (value === true ? \"hit\" : \"miss\"),\n },\n {\n key: \"elapsedMs\",\n label: \"Waited\",\n align: \"right\",\n shrink: true,\n render: (value) => `${Number(value ?? 0).toFixed(1)}ms`,\n sortValue: (value) => Number(value ?? 0),\n },\n {\n key: \"ageMs\",\n label: \"Age\",\n align: \"right\",\n shrink: true,\n render: (value) => formatAge(Number(value ?? 0)),\n sortValue: (value) => Number(value ?? 0),\n },\n { key: \"state\", label: \"State\", shrink: true, minWidth: 80 },\n {\n key: \"refreshError\",\n label: \"Note\",\n grow: true,\n render: (value, row) => row.error || String(value ?? \"\"),\n },\n];\n\nconst PROBE_COLUMNS: DataTableColumn<ProbeRow>[] = [\n { key: \"column\", label: \"Column\", shrink: true, minWidth: 160 },\n { key: \"field\", label: \"Field\", shrink: true, minWidth: 160 },\n { key: \"distinct\", label: \"Distinct\", align: \"right\", shrink: true },\n { key: \"limit\", label: \"Limit\", align: \"right\", shrink: true },\n {\n key: \"kind\",\n label: \"Chose\",\n shrink: true,\n minWidth: 110,\n // An empty kind means the count came back under the limit and nothing had\n // to change — which is an answer, so it is spelled out rather than blank.\n render: (value) => (String(value ?? \"\") === \"\" ? \"left as-is\" : String(value)),\n },\n {\n key: \"cached\",\n label: \"Counted\",\n shrink: true,\n minWidth: 90,\n render: (value) => (value === true ? \"from cache\" : \"this run\"),\n },\n];\n\nexport function InspectionTab({\n record,\n client,\n inspections,\n probes,\n refreshInspection = false,\n onRefreshInspectionChange,\n caches,\n}: InspectionTabProps) {\n const loaded = useInspection(record, client, inspections, probes);\n const [manualDetail, setManualDetail] = useState<ExecutionDetail | undefined>();\n\n useEffect(() => setManualDetail(undefined), [record?.id]);\n\n const displayedInspections = manualDetail?.inspections ?? loaded.inspections;\n const displayedProbes = manualDetail?.probes ?? loaded.probes;\n\n return (\n // Three sections stacked, so this scrolls as one region rather than\n // bounding each table separately — a five-row list with its own scrollbar\n // reads as truncated when it is complete.\n <div className=\"flex h-full min-h-0 flex-col gap-density-4 overflow-auto p-density-3\">\n {/* Always first, and always present: the caches are the server's state,\n not the selected capture's, so they are worth reading — and flushable —\n even before anything has run. */}\n <InspectionCaches\n {...(client ? { client } : {})}\n refreshInspection={refreshInspection}\n onRefreshInspectionChange={onRefreshInspectionChange ?? (() => undefined)}\n {...(caches !== undefined ? { caches } : {})}\n />\n\n <ManualInspection\n record={record}\n operations={loaded.operations}\n client={client}\n onComplete={setManualDetail}\n />\n\n {loaded.error ? <Empty className=\"text-destructive\">{loaded.error}</Empty> : null}\n {!loaded.error && displayedInspections.length === 0 && displayedProbes.length === 0 ? (\n <Empty>\n {record\n ? \"This capture looked nothing up — every column it needed was already described.\"\n : \"Select a capture in Queries to see the metadata it looked up.\"}\n </Empty>\n ) : null}\n\n {displayedInspections.length > 0 ? (\n <section>\n <Heading>Metadata cache</Heading>\n <DataTable<CacheRow>\n data={displayedInspections.map((row, index) => ({\n ...row,\n id: `${row.key}-${index}`,\n }))}\n columns={CACHE_COLUMNS}\n emptyMessage=\"No cache lookups\"\n />\n </section>\n ) : null}\n\n {displayedProbes.length > 0 ? (\n <section>\n <Heading>Column cardinality</Heading>\n <DataTable<ProbeRow>\n data={displayedProbes.map((row, index) => ({\n ...row,\n id: `${row.column}-${index}`,\n }))}\n columns={PROBE_COLUMNS}\n emptyMessage=\"No cardinality probes\"\n />\n </section>\n ) : null}\n </div>\n );\n}\n\nfunction ManualInspection({\n record,\n operations,\n client,\n onComplete,\n}: {\n record: ExecutionSummary | undefined;\n operations: QueryBrowserDiagnostics[];\n client: DebugClient | undefined;\n onComplete: (detail: ExecutionDetail) => void;\n}) {\n const [selected, setSelected] = useState(0);\n const [columns, setColumns] = useState(\"\");\n const [refresh, setRefresh] = useState(true);\n const [running, setRunning] = useState(false);\n const [outcome, setOutcome] = useState<string | undefined>();\n\n useEffect(() => {\n setSelected(0);\n setColumns(\"\");\n setOutcome(undefined);\n }, [record?.id]);\n\n const operation = operations[selected];\n if (!record) {\n return (\n <section>\n <Heading>Run inspection</Heading>\n <p className=\"text-muted-foreground text-sm\">\n Select a capture first; its provider request supplies the connection and query.\n </p>\n </section>\n );\n }\n if (!operation) {\n return (\n <section>\n <Heading>Run inspection</Heading>\n <p className=\"text-muted-foreground text-sm\">\n This capture has no provider operation that can be inspected.\n </p>\n </section>\n );\n }\n\n const query = operation.request.rendered || operation.request.query || \"\";\n const connection = operation.request.connection;\n const request: ManualInspectionRequest = {\n provider: operation.provider,\n ...(connection ? { connection } : {}),\n query,\n ...(operation.request.options ? { options: operation.request.options } : {}),\n columns: parseColumns(columns),\n refresh,\n };\n\n const run = async () => {\n setRunning(true);\n setOutcome(undefined);\n try {\n const detail = await (client ?? new DebugClient()).runInspection(request);\n onComplete(detail);\n const failure = detail.summary.error ?? detail.operations?.find((item) => item.error)?.error;\n setOutcome(\n failure\n ? `Inspection completed with an error: ${failure}`\n : `Inspection ${detail.summary.id} completed.`,\n );\n } catch (failure: unknown) {\n setOutcome(failure instanceof Error ? failure.message : String(failure));\n } finally {\n setRunning(false);\n }\n };\n\n return (\n <section className=\"flex flex-col gap-density-2 rounded border border-border p-density-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-density-2\">\n <Heading>Run inspection</Heading>\n <span className=\"text-muted-foreground text-xs\">\n {operation.provider} · {connection || \"inline connection\"}\n </span>\n </div>\n {operations.length > 1 ? (\n <label className=\"grid gap-density-1 text-xs\">\n <span className=\"text-muted-foreground\">Provider operation</span>\n <select\n className=\"rounded border border-border bg-background px-density-2 py-density-1\"\n value={selected}\n onChange={(event) => setSelected(Number(event.target.value))}\n >\n {operations.map((item, index) => (\n <option key={`${item.provider}-${index}`} value={index}>\n {index + 1}. {item.provider} · {item.request.connection || \"inline connection\"}\n </option>\n ))}\n </select>\n </label>\n ) : null}\n <label className=\"grid gap-density-1 text-xs\">\n <span className=\"text-muted-foreground\">Columns to inspect</span>\n <input\n aria-label=\"Columns to inspect\"\n className=\"rounded border border-border bg-background px-density-2 py-density-1 font-mono\"\n value={columns}\n placeholder=\"Auto-detect, or enter comma-separated names\"\n onChange={(event) => setColumns(event.target.value)}\n />\n </label>\n <code className=\"max-h-20 overflow-auto whitespace-pre-wrap rounded bg-muted/40 p-density-2 text-xs\">\n {query}\n </code>\n <div className=\"flex flex-wrap items-center justify-between gap-density-2\">\n <label className=\"flex items-center gap-density-1 text-xs\">\n <input\n type=\"checkbox\"\n checked={refresh}\n onChange={(event) => setRefresh(event.target.checked)}\n />\n Refresh cached metadata\n </label>\n <Button size=\"sm\" disabled={running || query === \"\"} onClick={() => void run()}>\n {running ? \"Running inspection…\" : \"Run inspection\"}\n </Button>\n </div>\n {outcome ? (\n <p className={outcome.includes(\"error\") ? \"text-destructive text-xs\" : \"text-muted-foreground text-xs\"}>\n {outcome}\n </p>\n ) : null}\n </section>\n );\n}\n\nfunction parseColumns(value: string): string[] {\n return [...new Set(value.split(\",\").map((column) => column.trim()).filter(Boolean))];\n}\n\nfunction Heading({ children }: { children: React.ReactNode }) {\n return (\n <h3 className=\"mb-density-2 font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n {children}\n </h3>\n );\n}\n\nfunction Empty({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <div className={`p-density-6 text-center text-muted-foreground text-sm ${className ?? \"\"}`}>\n {children}\n </div>\n );\n}\n\nfunction useInspection(\n record: ExecutionSummary | undefined,\n client: DebugClient | undefined,\n providedInspections: InspectionRecord[] | undefined,\n providedProbes: CardinalityProbe[] | undefined,\n) {\n const [inspections, setInspections] = useState<InspectionRecord[]>(providedInspections ?? []);\n const [probes, setProbes] = useState<CardinalityProbe[]>(providedProbes ?? []);\n const [operations, setOperations] = useState<QueryBrowserDiagnostics[]>(\n summaryOperations(record),\n );\n const [error, setError] = useState<string | undefined>();\n\n useEffect(() => {\n if (providedInspections !== undefined || providedProbes !== undefined) {\n setInspections(providedInspections ?? []);\n setProbes(providedProbes ?? []);\n setOperations(summaryOperations(record));\n return;\n }\n if (!record) {\n setInspections([]);\n setProbes([]);\n setOperations([]);\n return;\n }\n let cancelled = false;\n setError(undefined);\n setInspections([]);\n setProbes([]);\n setOperations(summaryOperations(record));\n (client ?? new DebugClient())\n .detail(record.id)\n .then((detail) => {\n if (cancelled) return;\n setInspections(detail.inspections ?? []);\n setProbes(detail.probes ?? []);\n setOperations(detail.operations ?? summaryOperations(record));\n })\n .catch((failure: unknown) => {\n if (!cancelled) setError(failure instanceof Error ? failure.message : String(failure));\n });\n return () => {\n cancelled = true;\n };\n }, [record, client, providedInspections, providedProbes]);\n\n return { inspections, probes, operations, error };\n}\n\nfunction summaryOperations(record: ExecutionSummary | undefined): QueryBrowserDiagnostics[] {\n return (record?.operations ?? []).map((operation) => ({\n provider: operation.provider,\n request: {\n ...(operation.query ? { query: operation.query, rendered: operation.query } : {}),\n ...(operation.connection ? { connection: operation.connection } : {}),\n ...(operation.method ? { method: operation.method } : {}),\n ...(operation.url ? { url: operation.url } : {}),\n },\n ...(operation.error ? { error: operation.error } : {}),\n }));\n}\n\nfunction formatAge(ageMs: number): string {\n if (ageMs < 1000) return `${ageMs}ms`;\n if (ageMs < 60_000) return `${(ageMs / 1000).toFixed(0)}s`;\n if (ageMs < 3_600_000) return `${(ageMs / 60_000).toFixed(0)}m`;\n return `${(ageMs / 3_600_000).toFixed(1)}h`;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const button = require("../../components/button.cjs");
6
+ const HarPanel = require("../../data/har/HarPanel.cjs");
7
+ const debugClient = require("../debugClient.cjs");
8
+ function NetworkTab({ record, client, entries: provided, search }) {
9
+ const { entries, error, sensitive, loading } = useHarEntries(record, client, provided);
10
+ if (!record && !provided) {
11
+ return /* @__PURE__ */ jsxRuntime.jsx(Empty, { children: "Select a capture in Queries to see the HTTP calls it made." });
12
+ }
13
+ if (loading) return /* @__PURE__ */ jsxRuntime.jsx(Empty, { children: "Loading HTTP traffic…" });
14
+ if (error) return /* @__PURE__ */ jsxRuntime.jsx(Empty, { className: "text-destructive", children: error });
15
+ if (entries.length === 0) {
16
+ return /* @__PURE__ */ jsxRuntime.jsx(Empty, { children: "This capture made no HTTP calls — its provider does not speak HTTP." });
17
+ }
18
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full flex-col", children: [
19
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-density-2 border-border border-b px-density-3 py-density-2", children: [
20
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-muted-foreground text-xs", children: [
21
+ entries.length,
22
+ " request",
23
+ entries.length === 1 ? "" : "s",
24
+ sensitive ? " · contains credentials — do not share this export" : ""
25
+ ] }),
26
+ record ? /* @__PURE__ */ jsxRuntime.jsx(
27
+ button.Button,
28
+ {
29
+ size: "sm",
30
+ variant: "outline",
31
+ onClick: () => downloadHar(record.id, client),
32
+ children: "Export HAR"
33
+ }
34
+ ) : null
35
+ ] }),
36
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: /* @__PURE__ */ jsxRuntime.jsx(HarPanel.HarPanel, { entries, ...search !== void 0 ? { search } : {} }) })
37
+ ] });
38
+ }
39
+ function Empty({ children, className }) {
40
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `p-density-6 text-center text-muted-foreground text-sm ${className ?? ""}`, children });
41
+ }
42
+ function useHarEntries(record, client, provided) {
43
+ const [entries, setEntries] = react.useState(provided ?? []);
44
+ const [sensitive, setSensitive] = react.useState(false);
45
+ const [error, setError] = react.useState();
46
+ const [loading, setLoading] = react.useState(false);
47
+ react.useEffect(() => {
48
+ if (provided !== void 0) {
49
+ setEntries(provided);
50
+ return;
51
+ }
52
+ if (!record) {
53
+ setEntries([]);
54
+ return;
55
+ }
56
+ if (record.counts.harEntries === 0) {
57
+ setEntries([]);
58
+ setSensitive(false);
59
+ return;
60
+ }
61
+ let cancelled = false;
62
+ setLoading(true);
63
+ setError(void 0);
64
+ (client ?? new debugClient.DebugClient()).detail(record.id).then((detail) => {
65
+ var _a;
66
+ if (cancelled) return;
67
+ setEntries(((_a = detail.har) == null ? void 0 : _a.log.entries) ?? []);
68
+ setSensitive(detail.harSensitive === true);
69
+ }).catch((failure) => {
70
+ if (!cancelled) setError(failure instanceof Error ? failure.message : String(failure));
71
+ }).finally(() => {
72
+ if (!cancelled) setLoading(false);
73
+ });
74
+ return () => {
75
+ cancelled = true;
76
+ };
77
+ }, [record, client, provided]);
78
+ return { entries, error, sensitive, loading };
79
+ }
80
+ async function downloadHar(id, client) {
81
+ const file = await (client ?? new debugClient.DebugClient()).har(id);
82
+ const blob = new Blob([JSON.stringify(file, null, 2)], { type: "application/json" });
83
+ const url = URL.createObjectURL(blob);
84
+ const anchor = document.createElement("a");
85
+ anchor.href = url;
86
+ anchor.download = `${id}.har`;
87
+ anchor.click();
88
+ URL.revokeObjectURL(url);
89
+ }
90
+ exports.NetworkTab = NetworkTab;
91
+ //# sourceMappingURL=NetworkTab.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkTab.cjs","sources":["../../../src/devtools/tabs/NetworkTab.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { HarPanel } from \"../../data/har/HarPanel\";\nimport { DebugClient } from \"../debugClient\";\nimport type { ExecutionSummary, HAREntry } from \"../types\";\n\n/**\n * The HTTP traffic a capture rode on, given the producer it never had.\n *\n * HarPanel has shipped in this library with no data source on either side of\n * the wire. The entries here are real HAR 1.2 built by the server's own\n * collector, which is why \"Export HAR\" produces a file Chrome devtools opens\n * directly rather than a lookalike.\n */\n\nexport type NetworkTabProps = {\n /** The record whose traffic to show; the most recent one with entries by default. */\n record?: ExecutionSummary | undefined;\n client?: DebugClient | undefined;\n /** Pre-loaded entries, for a story or a test that has no server. */\n entries?: HAREntry[] | undefined;\n search?: string | undefined;\n};\n\nexport function NetworkTab({ record, client, entries: provided, search }: NetworkTabProps) {\n const { entries, error, sensitive, loading } = useHarEntries(record, client, provided);\n\n if (!record && !provided) {\n return (\n <Empty>Select a capture in Queries to see the HTTP calls it made.</Empty>\n );\n }\n if (loading) return <Empty>Loading HTTP traffic…</Empty>;\n if (error) return <Empty className=\"text-destructive\">{error}</Empty>;\n if (entries.length === 0) {\n return <Empty>This capture made no HTTP calls — its provider does not speak HTTP.</Empty>;\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex items-center justify-between gap-density-2 border-border border-b px-density-3 py-density-2\">\n <span className=\"text-muted-foreground text-xs\">\n {entries.length} request{entries.length === 1 ? \"\" : \"s\"}\n {/* Never softened: a capture taken with credential logging on is a\n different kind of file, and whoever shares it has to know. */}\n {sensitive ? \" · contains credentials — do not share this export\" : \"\"}\n </span>\n {record ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => downloadHar(record.id, client)}\n >\n Export HAR\n </Button>\n ) : null}\n </div>\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <HarPanel entries={entries} {...(search !== undefined ? { search } : {})} />\n </div>\n </div>\n );\n}\n\nfunction Empty({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <div className={`p-density-6 text-center text-muted-foreground text-sm ${className ?? \"\"}`}>\n {children}\n </div>\n );\n}\n\nfunction useHarEntries(\n record: ExecutionSummary | undefined,\n client: DebugClient | undefined,\n provided: HAREntry[] | undefined,\n) {\n const [entries, setEntries] = useState<HAREntry[]>(provided ?? []);\n const [sensitive, setSensitive] = useState(false);\n const [error, setError] = useState<string | undefined>();\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (provided !== undefined) {\n setEntries(provided);\n return;\n }\n if (!record) {\n setEntries([]);\n return;\n }\n // Nothing to fetch when the summary already says there was no traffic —\n // the counts exist so a badge, and this, can skip the round trip.\n if (record.counts.harEntries === 0) {\n setEntries([]);\n setSensitive(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n setError(undefined);\n (client ?? new DebugClient())\n .detail(record.id)\n .then((detail) => {\n if (cancelled) return;\n setEntries(detail.har?.log.entries ?? []);\n setSensitive(detail.harSensitive === true);\n })\n .catch((failure: unknown) => {\n if (!cancelled) setError(failure instanceof Error ? failure.message : String(failure));\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [record, client, provided]);\n\n return { entries, error, sensitive, loading };\n}\n\nasync function downloadHar(id: string, client?: DebugClient): Promise<void> {\n const file = await (client ?? new DebugClient()).har(id);\n const blob = new Blob([JSON.stringify(file, null, 2)], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = `${id}.har`;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n"],"names":["jsx","jsxs","Button","HarPanel","useState","useEffect","DebugClient"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { DebugClient } from '../debugClient';
2
+ import { ExecutionSummary, HAREntry } from '../types';
3
+ /**
4
+ * The HTTP traffic a capture rode on, given the producer it never had.
5
+ *
6
+ * HarPanel has shipped in this library with no data source on either side of
7
+ * the wire. The entries here are real HAR 1.2 built by the server's own
8
+ * collector, which is why "Export HAR" produces a file Chrome devtools opens
9
+ * directly rather than a lookalike.
10
+ */
11
+ export type NetworkTabProps = {
12
+ /** The record whose traffic to show; the most recent one with entries by default. */
13
+ record?: ExecutionSummary | undefined;
14
+ client?: DebugClient | undefined;
15
+ /** Pre-loaded entries, for a story or a test that has no server. */
16
+ entries?: HAREntry[] | undefined;
17
+ search?: string | undefined;
18
+ };
19
+ export declare function NetworkTab({ record, client, entries: provided, search }: NetworkTabProps): import("react/jsx-runtime").JSX.Element;
20
+ //# sourceMappingURL=NetworkTab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkTab.d.ts","sourceRoot":"","sources":["../../../src/devtools/tabs/NetworkTab.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE3D;;;;;;;GAOG;AAEH,MAAM,MAAM,eAAe,GAAG;IAC5B,qFAAqF;IACrF,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACtC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,oEAAoE;IACpE,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,eAAe,2CAsCxF"}
@@ -0,0 +1,91 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { Button } from "../../components/button.js";
4
+ import { HarPanel } from "../../data/har/HarPanel.js";
5
+ import { DebugClient } from "../debugClient.js";
6
+ function NetworkTab({ record, client, entries: provided, search }) {
7
+ const { entries, error, sensitive, loading } = useHarEntries(record, client, provided);
8
+ if (!record && !provided) {
9
+ return /* @__PURE__ */ jsx(Empty, { children: "Select a capture in Queries to see the HTTP calls it made." });
10
+ }
11
+ if (loading) return /* @__PURE__ */ jsx(Empty, { children: "Loading HTTP traffic…" });
12
+ if (error) return /* @__PURE__ */ jsx(Empty, { className: "text-destructive", children: error });
13
+ if (entries.length === 0) {
14
+ return /* @__PURE__ */ jsx(Empty, { children: "This capture made no HTTP calls — its provider does not speak HTTP." });
15
+ }
16
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col", children: [
17
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-density-2 border-border border-b px-density-3 py-density-2", children: [
18
+ /* @__PURE__ */ jsxs("span", { className: "text-muted-foreground text-xs", children: [
19
+ entries.length,
20
+ " request",
21
+ entries.length === 1 ? "" : "s",
22
+ sensitive ? " · contains credentials — do not share this export" : ""
23
+ ] }),
24
+ record ? /* @__PURE__ */ jsx(
25
+ Button,
26
+ {
27
+ size: "sm",
28
+ variant: "outline",
29
+ onClick: () => downloadHar(record.id, client),
30
+ children: "Export HAR"
31
+ }
32
+ ) : null
33
+ ] }),
34
+ /* @__PURE__ */ jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: /* @__PURE__ */ jsx(HarPanel, { entries, ...search !== void 0 ? { search } : {} }) })
35
+ ] });
36
+ }
37
+ function Empty({ children, className }) {
38
+ return /* @__PURE__ */ jsx("div", { className: `p-density-6 text-center text-muted-foreground text-sm ${className ?? ""}`, children });
39
+ }
40
+ function useHarEntries(record, client, provided) {
41
+ const [entries, setEntries] = useState(provided ?? []);
42
+ const [sensitive, setSensitive] = useState(false);
43
+ const [error, setError] = useState();
44
+ const [loading, setLoading] = useState(false);
45
+ useEffect(() => {
46
+ if (provided !== void 0) {
47
+ setEntries(provided);
48
+ return;
49
+ }
50
+ if (!record) {
51
+ setEntries([]);
52
+ return;
53
+ }
54
+ if (record.counts.harEntries === 0) {
55
+ setEntries([]);
56
+ setSensitive(false);
57
+ return;
58
+ }
59
+ let cancelled = false;
60
+ setLoading(true);
61
+ setError(void 0);
62
+ (client ?? new DebugClient()).detail(record.id).then((detail) => {
63
+ var _a;
64
+ if (cancelled) return;
65
+ setEntries(((_a = detail.har) == null ? void 0 : _a.log.entries) ?? []);
66
+ setSensitive(detail.harSensitive === true);
67
+ }).catch((failure) => {
68
+ if (!cancelled) setError(failure instanceof Error ? failure.message : String(failure));
69
+ }).finally(() => {
70
+ if (!cancelled) setLoading(false);
71
+ });
72
+ return () => {
73
+ cancelled = true;
74
+ };
75
+ }, [record, client, provided]);
76
+ return { entries, error, sensitive, loading };
77
+ }
78
+ async function downloadHar(id, client) {
79
+ const file = await (client ?? new DebugClient()).har(id);
80
+ const blob = new Blob([JSON.stringify(file, null, 2)], { type: "application/json" });
81
+ const url = URL.createObjectURL(blob);
82
+ const anchor = document.createElement("a");
83
+ anchor.href = url;
84
+ anchor.download = `${id}.har`;
85
+ anchor.click();
86
+ URL.revokeObjectURL(url);
87
+ }
88
+ export {
89
+ NetworkTab
90
+ };
91
+ //# sourceMappingURL=NetworkTab.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkTab.js","sources":["../../../src/devtools/tabs/NetworkTab.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { HarPanel } from \"../../data/har/HarPanel\";\nimport { DebugClient } from \"../debugClient\";\nimport type { ExecutionSummary, HAREntry } from \"../types\";\n\n/**\n * The HTTP traffic a capture rode on, given the producer it never had.\n *\n * HarPanel has shipped in this library with no data source on either side of\n * the wire. The entries here are real HAR 1.2 built by the server's own\n * collector, which is why \"Export HAR\" produces a file Chrome devtools opens\n * directly rather than a lookalike.\n */\n\nexport type NetworkTabProps = {\n /** The record whose traffic to show; the most recent one with entries by default. */\n record?: ExecutionSummary | undefined;\n client?: DebugClient | undefined;\n /** Pre-loaded entries, for a story or a test that has no server. */\n entries?: HAREntry[] | undefined;\n search?: string | undefined;\n};\n\nexport function NetworkTab({ record, client, entries: provided, search }: NetworkTabProps) {\n const { entries, error, sensitive, loading } = useHarEntries(record, client, provided);\n\n if (!record && !provided) {\n return (\n <Empty>Select a capture in Queries to see the HTTP calls it made.</Empty>\n );\n }\n if (loading) return <Empty>Loading HTTP traffic…</Empty>;\n if (error) return <Empty className=\"text-destructive\">{error}</Empty>;\n if (entries.length === 0) {\n return <Empty>This capture made no HTTP calls — its provider does not speak HTTP.</Empty>;\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n <div className=\"flex items-center justify-between gap-density-2 border-border border-b px-density-3 py-density-2\">\n <span className=\"text-muted-foreground text-xs\">\n {entries.length} request{entries.length === 1 ? \"\" : \"s\"}\n {/* Never softened: a capture taken with credential logging on is a\n different kind of file, and whoever shares it has to know. */}\n {sensitive ? \" · contains credentials — do not share this export\" : \"\"}\n </span>\n {record ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => downloadHar(record.id, client)}\n >\n Export HAR\n </Button>\n ) : null}\n </div>\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <HarPanel entries={entries} {...(search !== undefined ? { search } : {})} />\n </div>\n </div>\n );\n}\n\nfunction Empty({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <div className={`p-density-6 text-center text-muted-foreground text-sm ${className ?? \"\"}`}>\n {children}\n </div>\n );\n}\n\nfunction useHarEntries(\n record: ExecutionSummary | undefined,\n client: DebugClient | undefined,\n provided: HAREntry[] | undefined,\n) {\n const [entries, setEntries] = useState<HAREntry[]>(provided ?? []);\n const [sensitive, setSensitive] = useState(false);\n const [error, setError] = useState<string | undefined>();\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (provided !== undefined) {\n setEntries(provided);\n return;\n }\n if (!record) {\n setEntries([]);\n return;\n }\n // Nothing to fetch when the summary already says there was no traffic —\n // the counts exist so a badge, and this, can skip the round trip.\n if (record.counts.harEntries === 0) {\n setEntries([]);\n setSensitive(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n setError(undefined);\n (client ?? new DebugClient())\n .detail(record.id)\n .then((detail) => {\n if (cancelled) return;\n setEntries(detail.har?.log.entries ?? []);\n setSensitive(detail.harSensitive === true);\n })\n .catch((failure: unknown) => {\n if (!cancelled) setError(failure instanceof Error ? failure.message : String(failure));\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [record, client, provided]);\n\n return { entries, error, sensitive, loading };\n}\n\nasync function downloadHar(id: string, client?: DebugClient): Promise<void> {\n const file = await (client ?? new DebugClient()).har(id);\n const blob = new Blob([JSON.stringify(file, null, 2)], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = `${id}.har`;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n"],"names":[],"mappings":"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"}