@flanksource/clicky-ui 0.3.24 → 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 (491) 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/Chat.cjs +8 -4
  133. package/dist/data/chat/Chat.cjs.map +1 -1
  134. package/dist/data/chat/Chat.d.ts.map +1 -1
  135. package/dist/data/chat/Chat.js +8 -4
  136. package/dist/data/chat/Chat.js.map +1 -1
  137. package/dist/data/chat/ChatRuntimeToolbar.cjs +11 -7
  138. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  139. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  140. package/dist/data/chat/ChatRuntimeToolbar.js +11 -7
  141. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  142. package/dist/data/chat/ContextMeter.cjs +64 -27
  143. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  144. package/dist/data/chat/ContextMeter.d.ts +11 -4
  145. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  146. package/dist/data/chat/ContextMeter.js +64 -27
  147. package/dist/data/chat/ContextMeter.js.map +1 -1
  148. package/dist/data/chat/clickyOperationsToTools.cjs +2 -1
  149. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  150. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  151. package/dist/data/chat/clickyOperationsToTools.js +2 -1
  152. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  153. package/dist/data/chat/index.d.ts +2 -1
  154. package/dist/data/chat/index.d.ts.map +1 -1
  155. package/dist/data/chat/tool-policy.cjs +132 -0
  156. package/dist/data/chat/tool-policy.cjs.map +1 -0
  157. package/dist/data/chat/tool-policy.d.ts +81 -0
  158. package/dist/data/chat/tool-policy.d.ts.map +1 -0
  159. package/dist/data/chat/tool-policy.js +132 -0
  160. package/dist/data/chat/tool-policy.js.map +1 -0
  161. package/dist/data/chat/types.cjs +20 -0
  162. package/dist/data/chat/types.cjs.map +1 -1
  163. package/dist/data/chat/types.d.ts +41 -2
  164. package/dist/data/chat/types.d.ts.map +1 -1
  165. package/dist/data/chat/types.js +20 -0
  166. package/dist/data/chat/types.js.map +1 -1
  167. package/dist/data/chat/usage-snapshot.cjs +10 -1
  168. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  169. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  170. package/dist/data/chat/usage-snapshot.js +10 -1
  171. package/dist/data/chat/usage-snapshot.js.map +1 -1
  172. package/dist/data/debugConsoleSignal.cjs +64 -0
  173. package/dist/data/debugConsoleSignal.cjs.map +1 -0
  174. package/dist/data/debugConsoleSignal.d.ts +83 -0
  175. package/dist/data/debugConsoleSignal.d.ts.map +1 -0
  176. package/dist/data/debugConsoleSignal.js +64 -0
  177. package/dist/data/debugConsoleSignal.js.map +1 -0
  178. package/dist/data/har/HarPanel.cjs +20 -14
  179. package/dist/data/har/HarPanel.cjs.map +1 -1
  180. package/dist/data/har/HarPanel.d.ts.map +1 -1
  181. package/dist/data/har/HarPanel.js +20 -14
  182. package/dist/data/har/HarPanel.js.map +1 -1
  183. package/dist/data/har/types.d.ts +18 -0
  184. package/dist/data/har/types.d.ts.map +1 -1
  185. package/dist/data/query-browser/QueryBrowser.cjs +4 -42
  186. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  187. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  188. package/dist/data/query-browser/QueryBrowser.js +5 -43
  189. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  190. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
  191. package/dist/data/query-browser/QueryBrowser.types.d.ts +0 -1
  192. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
  193. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
  194. package/dist/data/useDebugAction.cjs +29 -0
  195. package/dist/data/useDebugAction.cjs.map +1 -0
  196. package/dist/data/useDebugAction.d.ts +16 -0
  197. package/dist/data/useDebugAction.d.ts.map +1 -0
  198. package/dist/data/useDebugAction.js +29 -0
  199. package/dist/data/useDebugAction.js.map +1 -0
  200. package/dist/data/version-info.cjs +3 -3
  201. package/dist/data/version-info.js +3 -3
  202. package/dist/data.cjs +16 -8
  203. package/dist/data.cjs.map +1 -1
  204. package/dist/data.d.ts +3 -2
  205. package/dist/data.d.ts.map +1 -1
  206. package/dist/data.js +16 -8
  207. package/dist/devtools/DebugConsole.cjs +138 -0
  208. package/dist/devtools/DebugConsole.cjs.map +1 -0
  209. package/dist/devtools/DebugConsole.d.ts +23 -0
  210. package/dist/devtools/DebugConsole.d.ts.map +1 -0
  211. package/dist/devtools/DebugConsole.js +138 -0
  212. package/dist/devtools/DebugConsole.js.map +1 -0
  213. package/dist/devtools/DebugConsoleButton.cjs +59 -0
  214. package/dist/devtools/DebugConsoleButton.cjs.map +1 -0
  215. package/dist/devtools/DebugConsoleButton.d.ts +20 -0
  216. package/dist/devtools/DebugConsoleButton.d.ts.map +1 -0
  217. package/dist/devtools/DebugConsoleButton.js +59 -0
  218. package/dist/devtools/DebugConsoleButton.js.map +1 -0
  219. package/dist/devtools/DebugConsoleDock.cjs +112 -0
  220. package/dist/devtools/DebugConsoleDock.cjs.map +1 -0
  221. package/dist/devtools/DebugConsoleDock.d.ts +26 -0
  222. package/dist/devtools/DebugConsoleDock.d.ts.map +1 -0
  223. package/dist/devtools/DebugConsoleDock.js +112 -0
  224. package/dist/devtools/DebugConsoleDock.js.map +1 -0
  225. package/dist/devtools/ExecutionDetail.cjs +135 -0
  226. package/dist/devtools/ExecutionDetail.cjs.map +1 -0
  227. package/dist/devtools/ExecutionDetail.d.ts +19 -0
  228. package/dist/devtools/ExecutionDetail.d.ts.map +1 -0
  229. package/dist/devtools/ExecutionDetail.js +135 -0
  230. package/dist/devtools/ExecutionDetail.js.map +1 -0
  231. package/dist/devtools/debugClient.cjs +172 -0
  232. package/dist/devtools/debugClient.cjs.map +1 -0
  233. package/dist/devtools/debugClient.d.ts +98 -0
  234. package/dist/devtools/debugClient.d.ts.map +1 -0
  235. package/dist/devtools/debugClient.js +172 -0
  236. package/dist/devtools/debugClient.js.map +1 -0
  237. package/dist/devtools/debugStore.cjs +115 -0
  238. package/dist/devtools/debugStore.cjs.map +1 -0
  239. package/dist/devtools/debugStore.d.ts +83 -0
  240. package/dist/devtools/debugStore.d.ts.map +1 -0
  241. package/dist/devtools/debugStore.js +115 -0
  242. package/dist/devtools/debugStore.js.map +1 -0
  243. package/dist/devtools/dockState.cjs +51 -0
  244. package/dist/devtools/dockState.cjs.map +1 -0
  245. package/dist/devtools/dockState.d.ts +31 -0
  246. package/dist/devtools/dockState.d.ts.map +1 -0
  247. package/dist/devtools/dockState.js +51 -0
  248. package/dist/devtools/dockState.js.map +1 -0
  249. package/dist/devtools/tabs/ConsoleTab.cjs +36 -0
  250. package/dist/devtools/tabs/ConsoleTab.cjs.map +1 -0
  251. package/dist/devtools/tabs/ConsoleTab.d.ts +19 -0
  252. package/dist/devtools/tabs/ConsoleTab.d.ts.map +1 -0
  253. package/dist/devtools/tabs/ConsoleTab.js +36 -0
  254. package/dist/devtools/tabs/ConsoleTab.js.map +1 -0
  255. package/dist/devtools/tabs/InspectionCaches.cjs +150 -0
  256. package/dist/devtools/tabs/InspectionCaches.cjs.map +1 -0
  257. package/dist/devtools/tabs/InspectionCaches.d.ts +23 -0
  258. package/dist/devtools/tabs/InspectionCaches.d.ts.map +1 -0
  259. package/dist/devtools/tabs/InspectionCaches.js +150 -0
  260. package/dist/devtools/tabs/InspectionCaches.js.map +1 -0
  261. package/dist/devtools/tabs/InspectionTab.cjs +316 -0
  262. package/dist/devtools/tabs/InspectionTab.cjs.map +1 -0
  263. package/dist/devtools/tabs/InspectionTab.d.ts +27 -0
  264. package/dist/devtools/tabs/InspectionTab.d.ts.map +1 -0
  265. package/dist/devtools/tabs/InspectionTab.js +316 -0
  266. package/dist/devtools/tabs/InspectionTab.js.map +1 -0
  267. package/dist/devtools/tabs/NetworkTab.cjs +91 -0
  268. package/dist/devtools/tabs/NetworkTab.cjs.map +1 -0
  269. package/dist/devtools/tabs/NetworkTab.d.ts +20 -0
  270. package/dist/devtools/tabs/NetworkTab.d.ts.map +1 -0
  271. package/dist/devtools/tabs/NetworkTab.js +91 -0
  272. package/dist/devtools/tabs/NetworkTab.js.map +1 -0
  273. package/dist/devtools/tabs/QueriesTab.cjs +85 -0
  274. package/dist/devtools/tabs/QueriesTab.cjs.map +1 -0
  275. package/dist/devtools/tabs/QueriesTab.d.ts +24 -0
  276. package/dist/devtools/tabs/QueriesTab.d.ts.map +1 -0
  277. package/dist/devtools/tabs/QueriesTab.js +85 -0
  278. package/dist/devtools/tabs/QueriesTab.js.map +1 -0
  279. package/dist/devtools/types.cjs +26 -0
  280. package/dist/devtools/types.cjs.map +1 -0
  281. package/dist/devtools/types.d.ts +235 -0
  282. package/dist/devtools/types.d.ts.map +1 -0
  283. package/dist/devtools/types.js +26 -0
  284. package/dist/devtools/types.js.map +1 -0
  285. package/dist/devtools/useDebugStream.cjs +46 -0
  286. package/dist/devtools/useDebugStream.cjs.map +1 -0
  287. package/dist/devtools/useDebugStream.d.ts +23 -0
  288. package/dist/devtools/useDebugStream.d.ts.map +1 -0
  289. package/dist/devtools/useDebugStream.js +46 -0
  290. package/dist/devtools/useDebugStream.js.map +1 -0
  291. package/dist/devtools.cjs +51 -0
  292. package/dist/devtools.cjs.map +1 -0
  293. package/dist/devtools.d.ts +37 -0
  294. package/dist/devtools.d.ts.map +1 -0
  295. package/dist/devtools.js +51 -0
  296. package/dist/devtools.js.map +1 -0
  297. package/dist/icons/components/UiOpenScad.cjs +10 -0
  298. package/dist/icons/components/UiOpenScad.cjs.map +1 -0
  299. package/dist/icons/components/UiOpenScad.d.ts +9 -0
  300. package/dist/icons/components/UiOpenScad.d.ts.map +1 -0
  301. package/dist/icons/components/UiOpenScad.js +10 -0
  302. package/dist/icons/components/UiOpenScad.js.map +1 -0
  303. package/dist/icons/index.d.ts +1 -0
  304. package/dist/icons/index.d.ts.map +1 -1
  305. package/dist/icons/registry.cjs +2 -0
  306. package/dist/icons/registry.cjs.map +1 -1
  307. package/dist/icons/registry.d.ts.map +1 -1
  308. package/dist/icons/registry.js +2 -0
  309. package/dist/icons/registry.js.map +1 -1
  310. package/dist/icons.cjs +2 -0
  311. package/dist/icons.cjs.map +1 -1
  312. package/dist/icons.js +2 -0
  313. package/dist/icons.js.map +1 -1
  314. package/dist/index.cjs +20 -8
  315. package/dist/index.cjs.map +1 -1
  316. package/dist/index.js +20 -8
  317. package/dist/index.js.map +1 -1
  318. package/dist/layout/AppShell.cjs +15 -10
  319. package/dist/layout/AppShell.cjs.map +1 -1
  320. package/dist/layout/AppShell.d.ts +11 -0
  321. package/dist/layout/AppShell.d.ts.map +1 -1
  322. package/dist/layout/AppShell.js +15 -10
  323. package/dist/layout/AppShell.js.map +1 -1
  324. package/dist/layout/AppShell.nav.cjs +170 -49
  325. package/dist/layout/AppShell.nav.cjs.map +1 -1
  326. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  327. package/dist/layout/AppShell.nav.js +170 -49
  328. package/dist/layout/AppShell.nav.js.map +1 -1
  329. package/dist/overlay/CellActions.cjs +18 -124
  330. package/dist/overlay/CellActions.cjs.map +1 -1
  331. package/dist/overlay/CellActions.d.ts +1 -1
  332. package/dist/overlay/CellActions.d.ts.map +1 -1
  333. package/dist/overlay/CellActions.js +18 -124
  334. package/dist/overlay/CellActions.js.map +1 -1
  335. package/dist/overlay/ContextMenu.cjs +144 -0
  336. package/dist/overlay/ContextMenu.cjs.map +1 -0
  337. package/dist/overlay/ContextMenu.d.ts +8 -0
  338. package/dist/overlay/ContextMenu.d.ts.map +1 -0
  339. package/dist/overlay/ContextMenu.js +144 -0
  340. package/dist/overlay/ContextMenu.js.map +1 -0
  341. package/dist/profiles/connections/connectionBrowserModel.cjs +14 -65
  342. package/dist/profiles/connections/connectionBrowserModel.cjs.map +1 -1
  343. package/dist/profiles/connections/connectionBrowserModel.d.ts +35 -35
  344. package/dist/profiles/connections/connectionBrowserModel.d.ts.map +1 -1
  345. package/dist/profiles/connections/connectionBrowserModel.js +14 -65
  346. package/dist/profiles/connections/connectionBrowserModel.js.map +1 -1
  347. package/dist/profiles/connections/connectionQueryWorkspace.cjs +29 -9
  348. package/dist/profiles/connections/connectionQueryWorkspace.cjs.map +1 -1
  349. package/dist/profiles/connections/connectionQueryWorkspace.d.ts +3 -2
  350. package/dist/profiles/connections/connectionQueryWorkspace.d.ts.map +1 -1
  351. package/dist/profiles/connections/connectionQueryWorkspace.js +30 -10
  352. package/dist/profiles/connections/connectionQueryWorkspace.js.map +1 -1
  353. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs +15 -0
  354. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs.map +1 -1
  355. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts +22 -1
  356. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts.map +1 -1
  357. package/dist/profiles/connections/connectionQueryWorkspaceModel.js +15 -0
  358. package/dist/profiles/connections/connectionQueryWorkspaceModel.js.map +1 -1
  359. package/dist/profiles/connections/index.d.ts +1 -0
  360. package/dist/profiles/connections/index.d.ts.map +1 -1
  361. package/dist/profiles/connections/inspectionStatus.cjs +44 -0
  362. package/dist/profiles/connections/inspectionStatus.cjs.map +1 -0
  363. package/dist/profiles/connections/inspectionStatus.d.ts +5 -0
  364. package/dist/profiles/connections/inspectionStatus.d.ts.map +1 -0
  365. package/dist/profiles/connections/inspectionStatus.js +44 -0
  366. package/dist/profiles/connections/inspectionStatus.js.map +1 -0
  367. package/dist/profiles/connections/useInspection.cjs +123 -0
  368. package/dist/profiles/connections/useInspection.cjs.map +1 -0
  369. package/dist/profiles/connections/useInspection.d.ts +35 -0
  370. package/dist/profiles/connections/useInspection.d.ts.map +1 -0
  371. package/dist/profiles/connections/useInspection.js +123 -0
  372. package/dist/profiles/connections/useInspection.js.map +1 -0
  373. package/dist/profiles/editor/profileBuilderWorkspace.cjs +55 -23
  374. package/dist/profiles/editor/profileBuilderWorkspace.cjs.map +1 -1
  375. package/dist/profiles/editor/profileBuilderWorkspace.d.ts.map +1 -1
  376. package/dist/profiles/editor/profileBuilderWorkspace.js +56 -24
  377. package/dist/profiles/editor/profileBuilderWorkspace.js.map +1 -1
  378. package/dist/profiles/elasticsearch/esQueryBuilder.cjs +12 -3
  379. package/dist/profiles/elasticsearch/esQueryBuilder.cjs.map +1 -1
  380. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts +2 -2
  381. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts.map +1 -1
  382. package/dist/profiles/elasticsearch/esQueryBuilder.js +12 -3
  383. package/dist/profiles/elasticsearch/esQueryBuilder.js.map +1 -1
  384. package/dist/profiles/fields/profileFieldEditor.cjs +137 -22
  385. package/dist/profiles/fields/profileFieldEditor.cjs.map +1 -1
  386. package/dist/profiles/fields/profileFieldEditor.d.ts.map +1 -1
  387. package/dist/profiles/fields/profileFieldEditor.js +137 -22
  388. package/dist/profiles/fields/profileFieldEditor.js.map +1 -1
  389. package/dist/profiles/fields/profileFieldFilterEditor.cjs +171 -82
  390. package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
  391. package/dist/profiles/fields/profileFieldFilterEditor.d.ts +0 -9
  392. package/dist/profiles/fields/profileFieldFilterEditor.d.ts.map +1 -1
  393. package/dist/profiles/fields/profileFieldFilterEditor.js +174 -85
  394. package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
  395. package/dist/profiles/fields/profileFieldIcons.cjs +6 -3
  396. package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
  397. package/dist/profiles/fields/profileFieldIcons.js +6 -3
  398. package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
  399. package/dist/profiles/query/profileSampleFilterLookup.cjs +34 -0
  400. package/dist/profiles/query/profileSampleFilterLookup.cjs.map +1 -0
  401. package/dist/profiles/query/profileSampleFilterLookup.d.ts +12 -0
  402. package/dist/profiles/query/profileSampleFilterLookup.d.ts.map +1 -0
  403. package/dist/profiles/query/profileSampleFilterLookup.js +34 -0
  404. package/dist/profiles/query/profileSampleFilterLookup.js.map +1 -0
  405. package/dist/profiles/query/profileSamplePayload.cjs +6 -4
  406. package/dist/profiles/query/profileSamplePayload.cjs.map +1 -1
  407. package/dist/profiles/query/profileSamplePayload.d.ts +11 -4
  408. package/dist/profiles/query/profileSamplePayload.d.ts.map +1 -1
  409. package/dist/profiles/query/profileSamplePayload.js +6 -4
  410. package/dist/profiles/query/profileSamplePayload.js.map +1 -1
  411. package/dist/profiles/query/profileSampleResult.cjs +26 -0
  412. package/dist/profiles/query/profileSampleResult.cjs.map +1 -0
  413. package/dist/profiles/query/profileSampleResult.d.ts +11 -0
  414. package/dist/profiles/query/profileSampleResult.d.ts.map +1 -0
  415. package/dist/profiles/query/profileSampleResult.js +26 -0
  416. package/dist/profiles/query/profileSampleResult.js.map +1 -0
  417. package/dist/profiles/query/queryTargetPicker.cjs +5 -3
  418. package/dist/profiles/query/queryTargetPicker.cjs.map +1 -1
  419. package/dist/profiles/query/queryTargetPicker.d.ts +3 -2
  420. package/dist/profiles/query/queryTargetPicker.d.ts.map +1 -1
  421. package/dist/profiles/query/queryTargetPicker.js +5 -3
  422. package/dist/profiles/query/queryTargetPicker.js.map +1 -1
  423. package/dist/profiles/wizard/profileWizard.cjs +14 -5
  424. package/dist/profiles/wizard/profileWizard.cjs.map +1 -1
  425. package/dist/profiles/wizard/profileWizard.d.ts.map +1 -1
  426. package/dist/profiles/wizard/profileWizard.js +15 -6
  427. package/dist/profiles/wizard/profileWizard.js.map +1 -1
  428. package/dist/profiles/wizard/profileWizardModel.cjs +35 -6
  429. package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
  430. package/dist/profiles/wizard/profileWizardModel.d.ts +29 -4
  431. package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
  432. package/dist/profiles/wizard/profileWizardModel.js +35 -6
  433. package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
  434. package/dist/profiles/wizard/profileWizardQueryStep.cjs +44 -11
  435. package/dist/profiles/wizard/profileWizardQueryStep.cjs.map +1 -1
  436. package/dist/profiles/wizard/profileWizardQueryStep.d.ts.map +1 -1
  437. package/dist/profiles/wizard/profileWizardQueryStep.js +46 -13
  438. package/dist/profiles/wizard/profileWizardQueryStep.js.map +1 -1
  439. package/dist/profiles/wizard/profileWizardSteps.cjs +33 -2
  440. package/dist/profiles/wizard/profileWizardSteps.cjs.map +1 -1
  441. package/dist/profiles/wizard/profileWizardSteps.d.ts +11 -2
  442. package/dist/profiles/wizard/profileWizardSteps.d.ts.map +1 -1
  443. package/dist/profiles/wizard/profileWizardSteps.js +33 -2
  444. package/dist/profiles/wizard/profileWizardSteps.js.map +1 -1
  445. package/dist/profiles.cjs +8 -2
  446. package/dist/profiles.cjs.map +1 -1
  447. package/dist/profiles.js +10 -4
  448. package/dist/profiles.js.map +1 -1
  449. package/dist/rpc/FilterForm.cjs +21 -237
  450. package/dist/rpc/FilterForm.cjs.map +1 -1
  451. package/dist/rpc/FilterForm.d.ts +3 -1
  452. package/dist/rpc/FilterForm.d.ts.map +1 -1
  453. package/dist/rpc/FilterForm.js +21 -237
  454. package/dist/rpc/FilterForm.js.map +1 -1
  455. package/dist/rpc/FilterFormFields.cjs +240 -0
  456. package/dist/rpc/FilterFormFields.cjs.map +1 -0
  457. package/dist/rpc/FilterFormFields.d.ts +12 -0
  458. package/dist/rpc/FilterFormFields.d.ts.map +1 -0
  459. package/dist/rpc/FilterFormFields.js +240 -0
  460. package/dist/rpc/FilterFormFields.js.map +1 -0
  461. package/dist/rpc/router.cjs +3 -2
  462. package/dist/rpc/router.cjs.map +1 -1
  463. package/dist/rpc/router.d.ts.map +1 -1
  464. package/dist/rpc/router.js +3 -2
  465. package/dist/rpc/router.js.map +1 -1
  466. package/dist/rpc/types.cjs.map +1 -1
  467. package/dist/rpc/types.d.ts +3 -1
  468. package/dist/rpc/types.d.ts.map +1 -1
  469. package/dist/rpc/types.js.map +1 -1
  470. package/dist/styles.css +1 -1
  471. package/package.json +6 -1
  472. package/dist/data/query-info/QueryInfoDialog.cjs +0 -106
  473. package/dist/data/query-info/QueryInfoDialog.cjs.map +0 -1
  474. package/dist/data/query-info/QueryInfoDialog.d.ts +0 -16
  475. package/dist/data/query-info/QueryInfoDialog.d.ts.map +0 -1
  476. package/dist/data/query-info/QueryInfoDialog.js +0 -106
  477. package/dist/data/query-info/QueryInfoDialog.js.map +0 -1
  478. package/dist/data/query-info/index.d.ts +0 -4
  479. package/dist/data/query-info/index.d.ts.map +0 -1
  480. package/dist/data/query-info/queryInfo.cjs +0 -42
  481. package/dist/data/query-info/queryInfo.cjs.map +0 -1
  482. package/dist/data/query-info/queryInfo.d.ts +0 -45
  483. package/dist/data/query-info/queryInfo.d.ts.map +0 -1
  484. package/dist/data/query-info/queryInfo.js +0 -42
  485. package/dist/data/query-info/queryInfo.js.map +0 -1
  486. package/dist/data/query-info/useQueryInfo.cjs +0 -48
  487. package/dist/data/query-info/useQueryInfo.cjs.map +0 -1
  488. package/dist/data/query-info/useQueryInfo.d.ts +0 -26
  489. package/dist/data/query-info/useQueryInfo.d.ts.map +0 -1
  490. package/dist/data/query-info/useQueryInfo.js +0 -48
  491. package/dist/data/query-info/useQueryInfo.js.map +0 -1
package/dist/data.js CHANGED
@@ -71,6 +71,8 @@ import { ExecutionTree } from "./data/ExecutionTree.js";
71
71
  import { TreeNode } from "./data/TreeNode.js";
72
72
  import { TreeGroupHeader } from "./data/TreeGroupHeader.js";
73
73
  import { Timeline } from "./data/Timeline.js";
74
+ import { DEBUG_CAPTURE_HEADER, DEBUG_REFRESH_INSPECTION_HEADER, debugCaptureHeaders, debugConsoleAvailable, debugConsoleOpen, registerDebugConsole, revealDebugConsole, setDebugCaptureLevel, setDebugConsoleOpen, setDebugRefreshInspection, subscribeToDebugConsole } from "./data/debugConsoleSignal.js";
75
+ import { useDebugAction } from "./data/useDebugAction.js";
74
76
  import { allGroupsTerminal, isTerminalStatus } from "./data/TaskSnapshot.js";
75
77
  import { bucketTasks, logLevelColor, taskSegments, taskStatusBg, taskStatusColor, taskStatusIcon } from "./data/task-status.js";
76
78
  import { TaskProgress } from "./data/TaskProgress.js";
@@ -104,10 +106,8 @@ import { CacheValue } from "./data/cache-browser/CacheValue.js";
104
106
  import { ClickyExportDialog } from "./data/clicky-export/ClickyExportDialog.js";
105
107
  import { FixtureEditor } from "./data/FixtureEditor/FixtureEditor.js";
106
108
  import { GitChangedFilesSummary, GitCommitList, GitDiffPanel, GitFileList } from "./data/git/GitChangeList.js";
107
- import { QUERY_INFO_CONTENT_TYPE, buildQueryInfoUrl, fetchQueryInfo } from "./data/query-info/queryInfo.js";
108
109
  import { QueryBrowser } from "./data/query-browser/QueryBrowser.js";
109
110
  import { QueryBrowserExecutionError } from "./data/query-browser/QueryBrowser.types.js";
110
- import { QueryInfoDialog } from "./data/query-info/QueryInfoDialog.js";
111
111
  import { STATUS_LABELS, aggregateStatusCounts, collapseSingleChildChains, collectFrameworks, filterTests, formatCount, formatTestDuration, hasFailed, hasPending, humanizeName, statusIconFor, statusToneFor, sum, sumNonTaskTests, testStatus, totalDuration } from "./data/test-runner/status.js";
112
112
  import { TestAttempts, TestFailureDetail, TestOutput } from "./data/test-runner/TestFailureDetail.js";
113
113
  import { TestDetailPanel } from "./data/test-runner/TestDetailPanel.js";
@@ -317,6 +317,7 @@ import { UiNetwork, UiNetworkFilled } from "./icons/components/UiNetwork.js";
317
317
  import { UiNull } from "./icons/components/UiNull.js";
318
318
  import { UiNumeric } from "./icons/components/UiNumeric.js";
319
319
  import { UiObject } from "./icons/components/UiObject.js";
320
+ import { UiOpenScad } from "./icons/components/UiOpenScad.js";
320
321
  import { UiOperator } from "./icons/components/UiOperator.js";
321
322
  import { UiOrganization, UiOrganizationCheck, UiOrganizationCheckFilled, UiOrganizationCross, UiOrganizationCrossFilled, UiOrganizationFilled, UiOrganizationMinus, UiOrganizationMinusFilled, UiOrganizationPlus, UiOrganizationPlusFilled } from "./icons/components/UiOrganization.js";
322
323
  import { UiPackage, UiPackageFilled } from "./icons/components/UiPackage.js";
@@ -452,7 +453,6 @@ import { formatGitCommitDateHeader } from "./data/git/git-dates.js";
452
453
  import { frameworkIcon } from "./data/test-runner/frameworkIcon.js";
453
454
  import { isLeaf } from "./data/cache-browser/types.js";
454
455
  import { useClickyExport } from "./data/clicky-export/useClickyExport.js";
455
- import { useQueryInfo } from "./data/query-info/useQueryInfo.js";
456
456
  export {
457
457
  AnsiHtml,
458
458
  Avatar,
@@ -475,6 +475,8 @@ export {
475
475
  CodeDiff,
476
476
  CopyBadge,
477
477
  DATA_TABLE_FILTER_LOOKUP_LIMIT,
478
+ DEBUG_CAPTURE_HEADER,
479
+ DEBUG_REFRESH_INSPECTION_HEADER,
478
480
  DataTable,
479
481
  DiagnosticsDetailPanel,
480
482
  DiagnosticsTree,
@@ -514,10 +516,8 @@ export {
514
516
  PromptBanner,
515
517
  PromptDialog,
516
518
  Properties,
517
- QUERY_INFO_CONTENT_TYPE,
518
519
  QueryBrowser,
519
520
  QueryBrowserExecutionError,
520
- QueryInfoDialog,
521
521
  RUNTIME_PREFIXES,
522
522
  RadialGauge,
523
523
  STATUS_LABELS,
@@ -913,6 +913,7 @@ export {
913
913
  UiNull,
914
914
  UiNumeric,
915
915
  UiObject,
916
+ UiOpenScad,
916
917
  UiOperator,
917
918
  UiOrganization,
918
919
  UiOrganizationCheck,
@@ -1174,7 +1175,6 @@ export {
1174
1175
  badgeVariants,
1175
1176
  bucketTasks,
1176
1177
  buildMarkdownPreviewUrl,
1177
- buildQueryInfoUrl,
1178
1178
  buildSchemaTree,
1179
1179
  buildSchemaViewerTree,
1180
1180
  buildStepBranchTree,
@@ -1199,12 +1199,14 @@ export {
1199
1199
  createFenceMarkdown,
1200
1200
  createTestRunnerRegistry,
1201
1201
  cycleFilterState,
1202
+ debugCaptureHeaders,
1203
+ debugConsoleAvailable,
1204
+ debugConsoleOpen,
1202
1205
  decodeFilterState,
1203
1206
  deriveProgressBars,
1204
1207
  detectDumpFormat,
1205
1208
  emptyTestFilters,
1206
1209
  encodeFilterState,
1207
- fetchQueryInfo,
1208
1210
  filterStateToRecord,
1209
1211
  filterTests,
1210
1212
  findNodeByRoutePath,
@@ -1268,9 +1270,11 @@ export {
1268
1270
  processStateIcon,
1269
1271
  pruneNullNodes,
1270
1272
  recordToFilterState,
1273
+ registerDebugConsole,
1271
1274
  resolveBreakdown,
1272
1275
  resolveFixtureFenceSchema,
1273
1276
  resolveSeries,
1277
+ revealDebugConsole,
1274
1278
  schemaKeys,
1275
1279
  segment,
1276
1280
  serializeMultiFilterValue,
@@ -1279,6 +1283,9 @@ export {
1279
1283
  serverFiltersToFilterBar,
1280
1284
  serverTimingCounterSummary,
1281
1285
  serverTimingMetricLabel,
1286
+ setDebugCaptureLevel,
1287
+ setDebugConsoleOpen,
1288
+ setDebugRefreshInspection,
1282
1289
  setFallbackIconProvider,
1283
1290
  shortFrameName,
1284
1291
  slugify,
@@ -1287,6 +1294,7 @@ export {
1287
1294
  statusIconFor,
1288
1295
  statusToneFor,
1289
1296
  stringifyFixtureYaml,
1297
+ subscribeToDebugConsole,
1290
1298
  sum,
1291
1299
  sumNonTaskTests,
1292
1300
  tagActionsFromRecord,
@@ -1300,8 +1308,8 @@ export {
1300
1308
  totalDuration,
1301
1309
  updateFilterSelection,
1302
1310
  useClickyExport,
1311
+ useDebugAction,
1303
1312
  usePrompts,
1304
- useQueryInfo,
1305
1313
  useTagActions,
1306
1314
  useTagActionsValue,
1307
1315
  useTestRunner,
@@ -0,0 +1,138 @@
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 IconButton = require("../components/IconButton.cjs");
6
+ const Tabs = require("../layout/Tabs.cjs");
7
+ const debugClient = require("./debugClient.cjs");
8
+ const debugStore = require("./debugStore.cjs");
9
+ const ConsoleTab = require("./tabs/ConsoleTab.cjs");
10
+ const InspectionTab = require("./tabs/InspectionTab.cjs");
11
+ const NetworkTab = require("./tabs/NetworkTab.cjs");
12
+ const QueriesTab = require("./tabs/QueriesTab.cjs");
13
+ const types = require("./types.cjs");
14
+ const UiTrash = require("../icons/components/UiTrash.cjs");
15
+ const UiClose = require("../icons/components/UiClose.cjs");
16
+ function DebugConsole({
17
+ state,
18
+ store = debugStore.debugStore,
19
+ client,
20
+ onClose,
21
+ tab: controlledTab,
22
+ onTabChange
23
+ }) {
24
+ const [uncontrolledTab, setUncontrolledTab] = react.useState("queries");
25
+ const tab = controlledTab ?? uncontrolledTab;
26
+ const selectTab = (next) => {
27
+ setUncontrolledTab(next);
28
+ onTabChange == null ? void 0 : onTabChange(next);
29
+ };
30
+ const [selectedId, setSelectedId] = react.useState();
31
+ const selected = useSelectedRecord(state.records, selectedId);
32
+ const tabs = react.useMemo(
33
+ () => [
34
+ { id: "queries", label: "Queries", count: state.records.length },
35
+ { id: "network", label: "Network", count: (selected == null ? void 0 : selected.counts.harEntries) ?? 0 },
36
+ { id: "console", label: "Console", count: state.logs.length },
37
+ {
38
+ id: "inspection",
39
+ label: "Inspection",
40
+ count: ((selected == null ? void 0 : selected.counts.inspections) ?? 0) + ((selected == null ? void 0 : selected.counts.probes) ?? 0)
41
+ }
42
+ ],
43
+ [state.records.length, state.logs.length, selected]
44
+ );
45
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full min-h-0 flex-col bg-background", children: [
46
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-center gap-density-3 border-border border-b px-density-3", children: [
47
+ /* @__PURE__ */ jsxRuntime.jsx(Tabs.Tabs, { tabs, value: tab, onChange: (id) => selectTab(id), className: "flex-1" }),
48
+ /* @__PURE__ */ jsxRuntime.jsx(LevelPicker, { level: state.level, onChange: (level) => store.setLevel(level) }),
49
+ /* @__PURE__ */ jsxRuntime.jsx(ConnectionDot, { connected: state.connected, error: state.streamError }),
50
+ /* @__PURE__ */ jsxRuntime.jsx(
51
+ IconButton.IconButton,
52
+ {
53
+ icon: UiTrash.UiTrash,
54
+ label: "Clear captures",
55
+ iconClassName: "size-4",
56
+ onClick: () => {
57
+ store.clear();
58
+ void (client ?? new debugClient.DebugClient()).clear().catch(() => {
59
+ });
60
+ }
61
+ }
62
+ ),
63
+ onClose ? /* @__PURE__ */ jsxRuntime.jsx(IconButton.IconButton, { icon: UiClose.UiClose, label: "Close console", iconClassName: "size-4", onClick: onClose }) : null
64
+ ] }),
65
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: [
66
+ tab === "queries" ? /* @__PURE__ */ jsxRuntime.jsx(
67
+ QueriesTab.QueriesTab,
68
+ {
69
+ records: state.records,
70
+ client,
71
+ onSelect: (record) => setSelectedId(record.id)
72
+ }
73
+ ) : null,
74
+ tab === "network" ? /* @__PURE__ */ jsxRuntime.jsx(NetworkTab.NetworkTab, { record: selected, client }) : null,
75
+ tab === "console" ? /* @__PURE__ */ jsxRuntime.jsx(ConsoleTab.ConsoleTab, { lines: state.logs }) : null,
76
+ tab === "inspection" ? /* @__PURE__ */ jsxRuntime.jsx(
77
+ InspectionTab.InspectionTab,
78
+ {
79
+ record: selected,
80
+ client,
81
+ refreshInspection: state.refreshInspection,
82
+ onRefreshInspectionChange: (refresh) => store.setRefreshInspection(refresh)
83
+ }
84
+ ) : null
85
+ ] })
86
+ ] });
87
+ }
88
+ function useSelectedRecord(records, selectedId) {
89
+ return react.useMemo(() => {
90
+ if (selectedId) {
91
+ const found = records.find((record) => record.id === selectedId);
92
+ if (found) return found;
93
+ }
94
+ return records[records.length - 1];
95
+ }, [records, selectedId]);
96
+ }
97
+ function LevelPicker({
98
+ level,
99
+ onChange
100
+ }) {
101
+ return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "flex items-center gap-density-1 text-xs", children: [
102
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "Capture" }),
103
+ /* @__PURE__ */ jsxRuntime.jsx(
104
+ "select",
105
+ {
106
+ className: "rounded border border-border bg-background px-density-1 py-0.5 font-mono text-xs",
107
+ value: level,
108
+ title: types.LEVEL_HELP[level],
109
+ onChange: (event) => onChange(event.target.value),
110
+ children: types.SELECTABLE_LEVELS.map((option) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: option, title: types.LEVEL_HELP[option], children: option }, option))
111
+ }
112
+ )
113
+ ] });
114
+ }
115
+ function ConnectionDot({
116
+ connected,
117
+ error
118
+ }) {
119
+ return /* @__PURE__ */ jsxRuntime.jsxs(
120
+ "span",
121
+ {
122
+ className: "flex items-center gap-density-1 text-muted-foreground text-xs",
123
+ title: error ?? (connected ? "Streaming" : "Not connected"),
124
+ children: [
125
+ /* @__PURE__ */ jsxRuntime.jsx(
126
+ "span",
127
+ {
128
+ "aria-hidden": true,
129
+ className: `inline-block size-2 rounded-full ${connected ? "bg-green-500" : "bg-muted-foreground/40"}`
130
+ }
131
+ ),
132
+ connected ? "live" : "offline"
133
+ ]
134
+ }
135
+ );
136
+ }
137
+ exports.DebugConsole = DebugConsole;
138
+ //# sourceMappingURL=DebugConsole.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugConsole.cjs","sources":["../../src/devtools/DebugConsole.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { IconButton } from \"../components/IconButton\";\nimport { UiClose, UiTrash } from \"../icons\";\nimport { Tabs, type TabItem } from \"../layout/Tabs\";\nimport { DebugClient } from \"./debugClient\";\nimport { debugStore, type DebugStore, type DebugStoreState } from \"./debugStore\";\nimport { ConsoleTab } from \"./tabs/ConsoleTab\";\nimport { InspectionTab } from \"./tabs/InspectionTab\";\nimport { NetworkTab } from \"./tabs/NetworkTab\";\nimport { QueriesTab } from \"./tabs/QueriesTab\";\nimport {\n LEVEL_HELP,\n SELECTABLE_LEVELS,\n type DebugLevel,\n type DebugTab,\n type ExecutionSummary,\n} from \"./types\";\n\nexport type { DebugTab };\n\n/**\n * The console itself: a header that says what is being captured and at what\n * cost, and one of four tabs below it.\n *\n * Three tabs are scoped to a selected capture and one is not. Queries is the\n * list; Network and Inspection explain the row you picked from it; Console is\n * the process tail, which belongs to the server rather than to any one request.\n */\n\nexport type DebugConsoleProps = {\n state: DebugStoreState;\n store?: DebugStore | undefined;\n client?: DebugClient | undefined;\n onClose?: (() => void) | undefined;\n /** Controlled tab, so the host can deep-link into one. */\n tab?: DebugTab | undefined;\n onTabChange?: ((tab: DebugTab) => void) | undefined;\n};\n\nexport function DebugConsole({\n state,\n store = debugStore,\n client,\n onClose,\n tab: controlledTab,\n onTabChange,\n}: DebugConsoleProps) {\n const [uncontrolledTab, setUncontrolledTab] = useState<DebugTab>(\"queries\");\n const tab = controlledTab ?? uncontrolledTab;\n const selectTab = (next: DebugTab) => {\n setUncontrolledTab(next);\n onTabChange?.(next);\n };\n\n const [selectedId, setSelectedId] = useState<string | undefined>();\n const selected = useSelectedRecord(state.records, selectedId);\n\n const tabs: TabItem[] = useMemo(\n () => [\n { id: \"queries\", label: \"Queries\", count: state.records.length },\n { id: \"network\", label: \"Network\", count: selected?.counts.harEntries ?? 0 },\n { id: \"console\", label: \"Console\", count: state.logs.length },\n {\n id: \"inspection\",\n label: \"Inspection\",\n count: (selected?.counts.inspections ?? 0) + (selected?.counts.probes ?? 0),\n },\n ],\n [state.records.length, state.logs.length, selected],\n );\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\">\n <div className=\"flex shrink-0 items-center gap-density-3 border-border border-b px-density-3\">\n <Tabs tabs={tabs} value={tab} onChange={(id) => selectTab(id as DebugTab)} className=\"flex-1\" />\n\n <LevelPicker level={state.level} onChange={(level) => store.setLevel(level)} />\n\n <ConnectionDot connected={state.connected} error={state.streamError} />\n\n <IconButton\n icon={UiTrash}\n label=\"Clear captures\"\n iconClassName=\"size-4\"\n onClick={() => {\n store.clear();\n void (client ?? new DebugClient()).clear().catch(() => {\n // The server's buffer outliving the client's view is a cosmetic\n // mismatch, not a reason to fail the click the user just made.\n });\n }}\n />\n {onClose ? (\n <IconButton icon={UiClose} label=\"Close console\" iconClassName=\"size-4\" onClick={onClose} />\n ) : null}\n </div>\n\n {/* A bounded flex column. Every tab below hands its height to a component\n that scrolls internally (DataTable, LogsTable, HarPanel), and each of\n those sizes itself as `flex-1 min-h-0` — which needs a flex parent with\n a definite height, or it resolves to content height and the console\n body grows instead of scrolling. */}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n {tab === \"queries\" ? (\n <QueriesTab\n records={state.records}\n client={client}\n onSelect={(record) => setSelectedId(record.id)}\n />\n ) : null}\n {tab === \"network\" ? <NetworkTab record={selected} client={client} /> : null}\n {tab === \"console\" ? <ConsoleTab lines={state.logs} /> : null}\n {tab === \"inspection\" ? (\n <InspectionTab\n record={selected}\n client={client}\n refreshInspection={state.refreshInspection}\n onRefreshInspectionChange={(refresh) => store.setRefreshInspection(refresh)}\n />\n ) : null}\n </div>\n </div>\n );\n}\n\n/**\n * The selected capture, falling back to the most recent one.\n *\n * Without the fallback, Network and Inspection open empty on a console that is\n * plainly full of rows, which reads as a broken tab rather than as \"pick one\".\n */\nfunction useSelectedRecord(\n records: ExecutionSummary[],\n selectedId: string | undefined,\n): ExecutionSummary | undefined {\n return useMemo(() => {\n if (selectedId) {\n const found = records.find((record) => record.id === selectedId);\n if (found) return found;\n }\n return records[records.length - 1];\n }, [records, selectedId]);\n}\n\nfunction LevelPicker({\n level,\n onChange,\n}: {\n level: DebugLevel;\n onChange: (level: DebugLevel) => void;\n}) {\n return (\n <label className=\"flex items-center gap-density-1 text-xs\">\n <span className=\"text-muted-foreground\">Capture</span>\n <select\n className=\"rounded border border-border bg-background px-density-1 py-0.5 font-mono text-xs\"\n value={level}\n title={LEVEL_HELP[level]}\n onChange={(event) => onChange(event.target.value as DebugLevel)}\n >\n {SELECTABLE_LEVELS.map((option) => (\n <option key={option} value={option} title={LEVEL_HELP[option]}>\n {option}\n </option>\n ))}\n </select>\n </label>\n );\n}\n\nfunction ConnectionDot({\n connected,\n error,\n}: {\n connected: boolean;\n error?: string | undefined;\n}) {\n return (\n <span\n className=\"flex items-center gap-density-1 text-muted-foreground text-xs\"\n title={error ?? (connected ? \"Streaming\" : \"Not connected\")}\n >\n <span\n aria-hidden\n className={`inline-block size-2 rounded-full ${connected ? \"bg-green-500\" : \"bg-muted-foreground/40\"}`}\n />\n {connected ? \"live\" : \"offline\"}\n </span>\n );\n}\n"],"names":["debugStore","useState","useMemo","jsxs","jsx","Tabs","IconButton","UiTrash","DebugClient","UiClose","QueriesTab","NetworkTab","ConsoleTab","InspectionTab","LEVEL_HELP","SELECTABLE_LEVELS"],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { DebugClient } from './debugClient';
2
+ import { DebugStore, DebugStoreState } from './debugStore';
3
+ import { DebugTab } from './types';
4
+ export type { DebugTab };
5
+ /**
6
+ * The console itself: a header that says what is being captured and at what
7
+ * cost, and one of four tabs below it.
8
+ *
9
+ * Three tabs are scoped to a selected capture and one is not. Queries is the
10
+ * list; Network and Inspection explain the row you picked from it; Console is
11
+ * the process tail, which belongs to the server rather than to any one request.
12
+ */
13
+ export type DebugConsoleProps = {
14
+ state: DebugStoreState;
15
+ store?: DebugStore | undefined;
16
+ client?: DebugClient | undefined;
17
+ onClose?: (() => void) | undefined;
18
+ /** Controlled tab, so the host can deep-link into one. */
19
+ tab?: DebugTab | undefined;
20
+ onTabChange?: ((tab: DebugTab) => void) | undefined;
21
+ };
22
+ export declare function DebugConsole({ state, store, client, onClose, tab: controlledTab, onTabChange, }: DebugConsoleProps): import("react/jsx-runtime").JSX.Element;
23
+ //# sourceMappingURL=DebugConsole.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugConsole.d.ts","sourceRoot":"","sources":["../../src/devtools/DebugConsole.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAc,KAAK,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAKjF,OAAO,EAIL,KAAK,QAAQ,EAEd,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB;;;;;;;GAOG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACnC,0DAA0D;IAC1D,GAAG,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACrD,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,KAAkB,EAClB,MAAM,EACN,OAAO,EACP,GAAG,EAAE,aAAa,EAClB,WAAW,GACZ,EAAE,iBAAiB,2CA6EnB"}
@@ -0,0 +1,138 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState, useMemo } from "react";
3
+ import { IconButton } from "../components/IconButton.js";
4
+ import { Tabs } from "../layout/Tabs.js";
5
+ import { DebugClient } from "./debugClient.js";
6
+ import { debugStore } from "./debugStore.js";
7
+ import { ConsoleTab } from "./tabs/ConsoleTab.js";
8
+ import { InspectionTab } from "./tabs/InspectionTab.js";
9
+ import { NetworkTab } from "./tabs/NetworkTab.js";
10
+ import { QueriesTab } from "./tabs/QueriesTab.js";
11
+ import { LEVEL_HELP, SELECTABLE_LEVELS } from "./types.js";
12
+ import { UiTrash } from "../icons/components/UiTrash.js";
13
+ import { UiClose } from "../icons/components/UiClose.js";
14
+ function DebugConsole({
15
+ state,
16
+ store = debugStore,
17
+ client,
18
+ onClose,
19
+ tab: controlledTab,
20
+ onTabChange
21
+ }) {
22
+ const [uncontrolledTab, setUncontrolledTab] = useState("queries");
23
+ const tab = controlledTab ?? uncontrolledTab;
24
+ const selectTab = (next) => {
25
+ setUncontrolledTab(next);
26
+ onTabChange == null ? void 0 : onTabChange(next);
27
+ };
28
+ const [selectedId, setSelectedId] = useState();
29
+ const selected = useSelectedRecord(state.records, selectedId);
30
+ const tabs = useMemo(
31
+ () => [
32
+ { id: "queries", label: "Queries", count: state.records.length },
33
+ { id: "network", label: "Network", count: (selected == null ? void 0 : selected.counts.harEntries) ?? 0 },
34
+ { id: "console", label: "Console", count: state.logs.length },
35
+ {
36
+ id: "inspection",
37
+ label: "Inspection",
38
+ count: ((selected == null ? void 0 : selected.counts.inspections) ?? 0) + ((selected == null ? void 0 : selected.counts.probes) ?? 0)
39
+ }
40
+ ],
41
+ [state.records.length, state.logs.length, selected]
42
+ );
43
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-full min-h-0 flex-col bg-background", children: [
44
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-density-3 border-border border-b px-density-3", children: [
45
+ /* @__PURE__ */ jsx(Tabs, { tabs, value: tab, onChange: (id) => selectTab(id), className: "flex-1" }),
46
+ /* @__PURE__ */ jsx(LevelPicker, { level: state.level, onChange: (level) => store.setLevel(level) }),
47
+ /* @__PURE__ */ jsx(ConnectionDot, { connected: state.connected, error: state.streamError }),
48
+ /* @__PURE__ */ jsx(
49
+ IconButton,
50
+ {
51
+ icon: UiTrash,
52
+ label: "Clear captures",
53
+ iconClassName: "size-4",
54
+ onClick: () => {
55
+ store.clear();
56
+ void (client ?? new DebugClient()).clear().catch(() => {
57
+ });
58
+ }
59
+ }
60
+ ),
61
+ onClose ? /* @__PURE__ */ jsx(IconButton, { icon: UiClose, label: "Close console", iconClassName: "size-4", onClick: onClose }) : null
62
+ ] }),
63
+ /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: [
64
+ tab === "queries" ? /* @__PURE__ */ jsx(
65
+ QueriesTab,
66
+ {
67
+ records: state.records,
68
+ client,
69
+ onSelect: (record) => setSelectedId(record.id)
70
+ }
71
+ ) : null,
72
+ tab === "network" ? /* @__PURE__ */ jsx(NetworkTab, { record: selected, client }) : null,
73
+ tab === "console" ? /* @__PURE__ */ jsx(ConsoleTab, { lines: state.logs }) : null,
74
+ tab === "inspection" ? /* @__PURE__ */ jsx(
75
+ InspectionTab,
76
+ {
77
+ record: selected,
78
+ client,
79
+ refreshInspection: state.refreshInspection,
80
+ onRefreshInspectionChange: (refresh) => store.setRefreshInspection(refresh)
81
+ }
82
+ ) : null
83
+ ] })
84
+ ] });
85
+ }
86
+ function useSelectedRecord(records, selectedId) {
87
+ return useMemo(() => {
88
+ if (selectedId) {
89
+ const found = records.find((record) => record.id === selectedId);
90
+ if (found) return found;
91
+ }
92
+ return records[records.length - 1];
93
+ }, [records, selectedId]);
94
+ }
95
+ function LevelPicker({
96
+ level,
97
+ onChange
98
+ }) {
99
+ return /* @__PURE__ */ jsxs("label", { className: "flex items-center gap-density-1 text-xs", children: [
100
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Capture" }),
101
+ /* @__PURE__ */ jsx(
102
+ "select",
103
+ {
104
+ className: "rounded border border-border bg-background px-density-1 py-0.5 font-mono text-xs",
105
+ value: level,
106
+ title: LEVEL_HELP[level],
107
+ onChange: (event) => onChange(event.target.value),
108
+ children: SELECTABLE_LEVELS.map((option) => /* @__PURE__ */ jsx("option", { value: option, title: LEVEL_HELP[option], children: option }, option))
109
+ }
110
+ )
111
+ ] });
112
+ }
113
+ function ConnectionDot({
114
+ connected,
115
+ error
116
+ }) {
117
+ return /* @__PURE__ */ jsxs(
118
+ "span",
119
+ {
120
+ className: "flex items-center gap-density-1 text-muted-foreground text-xs",
121
+ title: error ?? (connected ? "Streaming" : "Not connected"),
122
+ children: [
123
+ /* @__PURE__ */ jsx(
124
+ "span",
125
+ {
126
+ "aria-hidden": true,
127
+ className: `inline-block size-2 rounded-full ${connected ? "bg-green-500" : "bg-muted-foreground/40"}`
128
+ }
129
+ ),
130
+ connected ? "live" : "offline"
131
+ ]
132
+ }
133
+ );
134
+ }
135
+ export {
136
+ DebugConsole
137
+ };
138
+ //# sourceMappingURL=DebugConsole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugConsole.js","sources":["../../src/devtools/DebugConsole.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { IconButton } from \"../components/IconButton\";\nimport { UiClose, UiTrash } from \"../icons\";\nimport { Tabs, type TabItem } from \"../layout/Tabs\";\nimport { DebugClient } from \"./debugClient\";\nimport { debugStore, type DebugStore, type DebugStoreState } from \"./debugStore\";\nimport { ConsoleTab } from \"./tabs/ConsoleTab\";\nimport { InspectionTab } from \"./tabs/InspectionTab\";\nimport { NetworkTab } from \"./tabs/NetworkTab\";\nimport { QueriesTab } from \"./tabs/QueriesTab\";\nimport {\n LEVEL_HELP,\n SELECTABLE_LEVELS,\n type DebugLevel,\n type DebugTab,\n type ExecutionSummary,\n} from \"./types\";\n\nexport type { DebugTab };\n\n/**\n * The console itself: a header that says what is being captured and at what\n * cost, and one of four tabs below it.\n *\n * Three tabs are scoped to a selected capture and one is not. Queries is the\n * list; Network and Inspection explain the row you picked from it; Console is\n * the process tail, which belongs to the server rather than to any one request.\n */\n\nexport type DebugConsoleProps = {\n state: DebugStoreState;\n store?: DebugStore | undefined;\n client?: DebugClient | undefined;\n onClose?: (() => void) | undefined;\n /** Controlled tab, so the host can deep-link into one. */\n tab?: DebugTab | undefined;\n onTabChange?: ((tab: DebugTab) => void) | undefined;\n};\n\nexport function DebugConsole({\n state,\n store = debugStore,\n client,\n onClose,\n tab: controlledTab,\n onTabChange,\n}: DebugConsoleProps) {\n const [uncontrolledTab, setUncontrolledTab] = useState<DebugTab>(\"queries\");\n const tab = controlledTab ?? uncontrolledTab;\n const selectTab = (next: DebugTab) => {\n setUncontrolledTab(next);\n onTabChange?.(next);\n };\n\n const [selectedId, setSelectedId] = useState<string | undefined>();\n const selected = useSelectedRecord(state.records, selectedId);\n\n const tabs: TabItem[] = useMemo(\n () => [\n { id: \"queries\", label: \"Queries\", count: state.records.length },\n { id: \"network\", label: \"Network\", count: selected?.counts.harEntries ?? 0 },\n { id: \"console\", label: \"Console\", count: state.logs.length },\n {\n id: \"inspection\",\n label: \"Inspection\",\n count: (selected?.counts.inspections ?? 0) + (selected?.counts.probes ?? 0),\n },\n ],\n [state.records.length, state.logs.length, selected],\n );\n\n return (\n <div className=\"flex h-full min-h-0 flex-col bg-background\">\n <div className=\"flex shrink-0 items-center gap-density-3 border-border border-b px-density-3\">\n <Tabs tabs={tabs} value={tab} onChange={(id) => selectTab(id as DebugTab)} className=\"flex-1\" />\n\n <LevelPicker level={state.level} onChange={(level) => store.setLevel(level)} />\n\n <ConnectionDot connected={state.connected} error={state.streamError} />\n\n <IconButton\n icon={UiTrash}\n label=\"Clear captures\"\n iconClassName=\"size-4\"\n onClick={() => {\n store.clear();\n void (client ?? new DebugClient()).clear().catch(() => {\n // The server's buffer outliving the client's view is a cosmetic\n // mismatch, not a reason to fail the click the user just made.\n });\n }}\n />\n {onClose ? (\n <IconButton icon={UiClose} label=\"Close console\" iconClassName=\"size-4\" onClick={onClose} />\n ) : null}\n </div>\n\n {/* A bounded flex column. Every tab below hands its height to a component\n that scrolls internally (DataTable, LogsTable, HarPanel), and each of\n those sizes itself as `flex-1 min-h-0` — which needs a flex parent with\n a definite height, or it resolves to content height and the console\n body grows instead of scrolling. */}\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden\">\n {tab === \"queries\" ? (\n <QueriesTab\n records={state.records}\n client={client}\n onSelect={(record) => setSelectedId(record.id)}\n />\n ) : null}\n {tab === \"network\" ? <NetworkTab record={selected} client={client} /> : null}\n {tab === \"console\" ? <ConsoleTab lines={state.logs} /> : null}\n {tab === \"inspection\" ? (\n <InspectionTab\n record={selected}\n client={client}\n refreshInspection={state.refreshInspection}\n onRefreshInspectionChange={(refresh) => store.setRefreshInspection(refresh)}\n />\n ) : null}\n </div>\n </div>\n );\n}\n\n/**\n * The selected capture, falling back to the most recent one.\n *\n * Without the fallback, Network and Inspection open empty on a console that is\n * plainly full of rows, which reads as a broken tab rather than as \"pick one\".\n */\nfunction useSelectedRecord(\n records: ExecutionSummary[],\n selectedId: string | undefined,\n): ExecutionSummary | undefined {\n return useMemo(() => {\n if (selectedId) {\n const found = records.find((record) => record.id === selectedId);\n if (found) return found;\n }\n return records[records.length - 1];\n }, [records, selectedId]);\n}\n\nfunction LevelPicker({\n level,\n onChange,\n}: {\n level: DebugLevel;\n onChange: (level: DebugLevel) => void;\n}) {\n return (\n <label className=\"flex items-center gap-density-1 text-xs\">\n <span className=\"text-muted-foreground\">Capture</span>\n <select\n className=\"rounded border border-border bg-background px-density-1 py-0.5 font-mono text-xs\"\n value={level}\n title={LEVEL_HELP[level]}\n onChange={(event) => onChange(event.target.value as DebugLevel)}\n >\n {SELECTABLE_LEVELS.map((option) => (\n <option key={option} value={option} title={LEVEL_HELP[option]}>\n {option}\n </option>\n ))}\n </select>\n </label>\n );\n}\n\nfunction ConnectionDot({\n connected,\n error,\n}: {\n connected: boolean;\n error?: string | undefined;\n}) {\n return (\n <span\n className=\"flex items-center gap-density-1 text-muted-foreground text-xs\"\n title={error ?? (connected ? \"Streaming\" : \"Not connected\")}\n >\n <span\n aria-hidden\n className={`inline-block size-2 rounded-full ${connected ? \"bg-green-500\" : \"bg-muted-foreground/40\"}`}\n />\n {connected ? \"live\" : \"offline\"}\n </span>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
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 debugConsoleSignal = require("../data/debugConsoleSignal.cjs");
6
+ const utils = require("../lib/utils.cjs");
7
+ const debugStore = require("./debugStore.cjs");
8
+ const UiDebug = require("../icons/components/UiDebug.cjs");
9
+ function DebugConsoleButton({
10
+ label = "Debug console",
11
+ className,
12
+ store = debugStore.debugStore
13
+ }) {
14
+ const open = react.useSyncExternalStore(debugConsoleSignal.subscribeToDebugConsole, debugConsoleSignal.debugConsoleOpen, () => false);
15
+ const state = react.useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
16
+ const failures = state.records.filter(hasFailed).length;
17
+ const badge = failures > 0 ? failures : state.records.length;
18
+ return /* @__PURE__ */ jsxRuntime.jsxs(
19
+ "button",
20
+ {
21
+ type: "button",
22
+ "aria-label": label,
23
+ "aria-pressed": open,
24
+ title: triggerTitle(state.records.length, failures, open),
25
+ onClick: () => debugConsoleSignal.revealDebugConsole({ toggle: true }),
26
+ className: utils.cn(
27
+ "relative inline-flex size-9 shrink-0 items-center justify-center rounded-md bg-transparent text-foreground transition-colors hover:bg-accent",
28
+ open && "bg-accent",
29
+ className
30
+ ),
31
+ children: [
32
+ /* @__PURE__ */ jsxRuntime.jsx(UiDebug.UiDebug, { className: "size-5", "aria-hidden": true }),
33
+ badge > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
34
+ "span",
35
+ {
36
+ "aria-hidden": true,
37
+ className: utils.cn(
38
+ "-right-0.5 -top-0.5 absolute min-w-4 rounded-full px-1 text-[10px] leading-4 tabular-nums",
39
+ failures > 0 ? "bg-destructive text-destructive-foreground" : "bg-muted text-muted-foreground"
40
+ ),
41
+ children: badge > 99 ? "99+" : badge
42
+ }
43
+ ) : null
44
+ ]
45
+ }
46
+ );
47
+ }
48
+ function hasFailed(record) {
49
+ return Boolean(record.error) || record.status !== void 0 && record.status >= 400;
50
+ }
51
+ function triggerTitle(records, failures, open) {
52
+ const action = open ? "Hide" : "Show";
53
+ if (records === 0) return `${action} the debug console`;
54
+ const captures = `${records} capture${records === 1 ? "" : "s"}`;
55
+ if (failures === 0) return `${action} the debug console — ${captures}`;
56
+ return `${action} the debug console — ${captures}, ${failures} failed`;
57
+ }
58
+ exports.DebugConsoleButton = DebugConsoleButton;
59
+ //# sourceMappingURL=DebugConsoleButton.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugConsoleButton.cjs","sources":["../../src/devtools/DebugConsoleButton.tsx"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport {\n debugConsoleOpen,\n revealDebugConsole,\n subscribeToDebugConsole,\n} from \"../data/debugConsoleSignal\";\nimport { UiDebug } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport { debugStore, type DebugStore } from \"./debugStore\";\n\n/**\n * The console's trigger, styled as navbar chrome for AppShell's actions slot.\n *\n * It replaced a collapsed status bar pinned under the page. The bar cost a\n * strip of every screen to say something only a developer wants, and it sat\n * where a page's own footer belongs; the navbar is where an app's other global\n * affordances already are, beside the chat trigger.\n *\n * The badge is what the bar was actually for. A trigger that says nothing gives\n * no reason to press it — \"3 errors\" does.\n */\n\nexport type DebugConsoleButtonProps = {\n label?: string | undefined;\n className?: string | undefined;\n /** The capture store to count. Defaults to the shared one the dock streams into. */\n store?: DebugStore | undefined;\n};\n\nexport function DebugConsoleButton({\n label = \"Debug console\",\n className,\n store = debugStore,\n}: DebugConsoleButtonProps) {\n const open = useSyncExternalStore(subscribeToDebugConsole, debugConsoleOpen, () => false);\n const state = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);\n const failures = state.records.filter(hasFailed).length;\n const badge = failures > 0 ? failures : state.records.length;\n\n return (\n <button\n type=\"button\"\n aria-label={label}\n aria-pressed={open}\n title={triggerTitle(state.records.length, failures, open)}\n onClick={() => revealDebugConsole({ toggle: true })}\n className={cn(\n \"relative inline-flex size-9 shrink-0 items-center justify-center rounded-md bg-transparent text-foreground transition-colors hover:bg-accent\",\n open && \"bg-accent\",\n className,\n )}\n >\n <UiDebug className=\"size-5\" aria-hidden />\n {badge > 0 ? (\n <span\n aria-hidden\n className={cn(\n \"-right-0.5 -top-0.5 absolute min-w-4 rounded-full px-1 text-[10px] leading-4 tabular-nums\",\n failures > 0\n ? \"bg-destructive text-destructive-foreground\"\n : \"bg-muted text-muted-foreground\",\n )}\n >\n {badge > 99 ? \"99+\" : badge}\n </span>\n ) : null}\n </button>\n );\n}\n\n/**\n * A failed capture is either one the transport reported an error for or one\n * whose status came back 4xx/5xx — a record can carry the second without the\n * first when the handler wrote the status itself.\n */\nfunction hasFailed(record: { error?: string | undefined; status?: number | undefined }): boolean {\n return Boolean(record.error) || (record.status !== undefined && record.status >= 400);\n}\n\nfunction triggerTitle(records: number, failures: number, open: boolean): string {\n const action = open ? \"Hide\" : \"Show\";\n if (records === 0) return `${action} the debug console`;\n const captures = `${records} capture${records === 1 ? \"\" : \"s\"}`;\n if (failures === 0) return `${action} the debug console — ${captures}`;\n return `${action} the debug console — ${captures}, ${failures} failed`;\n}\n"],"names":["debugStore","useSyncExternalStore","subscribeToDebugConsole","debugConsoleOpen","jsxs","revealDebugConsole","cn","jsx","UiDebug"],"mappings":";;;;;;;;AA6BO,SAAS,mBAAmB;AAAA,EACjC,QAAQ;AAAA,EACR;AAAA,EACA,QAAQA,WAAAA;AACV,GAA4B;AAC1B,QAAM,OAAOC,MAAAA,qBAAqBC,mBAAAA,yBAAyBC,mBAAAA,kBAAkB,MAAM,KAAK;AACxF,QAAM,QAAQF,MAAAA,qBAAqB,MAAM,WAAW,MAAM,aAAa,MAAM,WAAW;AACxF,QAAM,WAAW,MAAM,QAAQ,OAAO,SAAS,EAAE;AACjD,QAAM,QAAQ,WAAW,IAAI,WAAW,MAAM,QAAQ;AAEtD,SACEG,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,gBAAc;AAAA,MACd,OAAO,aAAa,MAAM,QAAQ,QAAQ,UAAU,IAAI;AAAA,MACxD,SAAS,MAAMC,mBAAAA,mBAAmB,EAAE,QAAQ,MAAM;AAAA,MAClD,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAAC,2BAAAA,IAACC,QAAAA,SAAA,EAAQ,WAAU,UAAS,eAAW,MAAC;AAAA,QACvC,QAAQ,IACPD,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAWD,MAAAA;AAAAA,cACT;AAAA,cACA,WAAW,IACP,+CACA;AAAA,YAAA;AAAA,YAGL,UAAA,QAAQ,KAAK,QAAQ;AAAA,UAAA;AAAA,QAAA,IAEtB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;AAOA,SAAS,UAAU,QAA8E;AAC/F,SAAO,QAAQ,OAAO,KAAK,KAAM,OAAO,WAAW,UAAa,OAAO,UAAU;AACnF;AAEA,SAAS,aAAa,SAAiB,UAAkB,MAAuB;AAC9E,QAAM,SAAS,OAAO,SAAS;AAC/B,MAAI,YAAY,EAAG,QAAO,GAAG,MAAM;AACnC,QAAM,WAAW,GAAG,OAAO,WAAW,YAAY,IAAI,KAAK,GAAG;AAC9D,MAAI,aAAa,EAAG,QAAO,GAAG,MAAM,wBAAwB,QAAQ;AACpE,SAAO,GAAG,MAAM,wBAAwB,QAAQ,KAAK,QAAQ;AAC/D;;"}
@@ -0,0 +1,20 @@
1
+ import { DebugStore } from './debugStore';
2
+ /**
3
+ * The console's trigger, styled as navbar chrome for AppShell's actions slot.
4
+ *
5
+ * It replaced a collapsed status bar pinned under the page. The bar cost a
6
+ * strip of every screen to say something only a developer wants, and it sat
7
+ * where a page's own footer belongs; the navbar is where an app's other global
8
+ * affordances already are, beside the chat trigger.
9
+ *
10
+ * The badge is what the bar was actually for. A trigger that says nothing gives
11
+ * no reason to press it — "3 errors" does.
12
+ */
13
+ export type DebugConsoleButtonProps = {
14
+ label?: string | undefined;
15
+ className?: string | undefined;
16
+ /** The capture store to count. Defaults to the shared one the dock streams into. */
17
+ store?: DebugStore | undefined;
18
+ };
19
+ export declare function DebugConsoleButton({ label, className, store, }: DebugConsoleButtonProps): import("react/jsx-runtime").JSX.Element;
20
+ //# sourceMappingURL=DebugConsoleButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugConsoleButton.d.ts","sourceRoot":"","sources":["../../src/devtools/DebugConsoleButton.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3D;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,oFAAoF;IACpF,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAChC,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EACjC,KAAuB,EACvB,SAAS,EACT,KAAkB,GACnB,EAAE,uBAAuB,2CAmCzB"}
@@ -0,0 +1,59 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useSyncExternalStore } from "react";
3
+ import { subscribeToDebugConsole, debugConsoleOpen, revealDebugConsole } from "../data/debugConsoleSignal.js";
4
+ import { cn } from "../lib/utils.js";
5
+ import { debugStore } from "./debugStore.js";
6
+ import { UiDebug } from "../icons/components/UiDebug.js";
7
+ function DebugConsoleButton({
8
+ label = "Debug console",
9
+ className,
10
+ store = debugStore
11
+ }) {
12
+ const open = useSyncExternalStore(subscribeToDebugConsole, debugConsoleOpen, () => false);
13
+ const state = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
14
+ const failures = state.records.filter(hasFailed).length;
15
+ const badge = failures > 0 ? failures : state.records.length;
16
+ return /* @__PURE__ */ jsxs(
17
+ "button",
18
+ {
19
+ type: "button",
20
+ "aria-label": label,
21
+ "aria-pressed": open,
22
+ title: triggerTitle(state.records.length, failures, open),
23
+ onClick: () => revealDebugConsole({ toggle: true }),
24
+ className: cn(
25
+ "relative inline-flex size-9 shrink-0 items-center justify-center rounded-md bg-transparent text-foreground transition-colors hover:bg-accent",
26
+ open && "bg-accent",
27
+ className
28
+ ),
29
+ children: [
30
+ /* @__PURE__ */ jsx(UiDebug, { className: "size-5", "aria-hidden": true }),
31
+ badge > 0 ? /* @__PURE__ */ jsx(
32
+ "span",
33
+ {
34
+ "aria-hidden": true,
35
+ className: cn(
36
+ "-right-0.5 -top-0.5 absolute min-w-4 rounded-full px-1 text-[10px] leading-4 tabular-nums",
37
+ failures > 0 ? "bg-destructive text-destructive-foreground" : "bg-muted text-muted-foreground"
38
+ ),
39
+ children: badge > 99 ? "99+" : badge
40
+ }
41
+ ) : null
42
+ ]
43
+ }
44
+ );
45
+ }
46
+ function hasFailed(record) {
47
+ return Boolean(record.error) || record.status !== void 0 && record.status >= 400;
48
+ }
49
+ function triggerTitle(records, failures, open) {
50
+ const action = open ? "Hide" : "Show";
51
+ if (records === 0) return `${action} the debug console`;
52
+ const captures = `${records} capture${records === 1 ? "" : "s"}`;
53
+ if (failures === 0) return `${action} the debug console — ${captures}`;
54
+ return `${action} the debug console — ${captures}, ${failures} failed`;
55
+ }
56
+ export {
57
+ DebugConsoleButton
58
+ };
59
+ //# sourceMappingURL=DebugConsoleButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugConsoleButton.js","sources":["../../src/devtools/DebugConsoleButton.tsx"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport {\n debugConsoleOpen,\n revealDebugConsole,\n subscribeToDebugConsole,\n} from \"../data/debugConsoleSignal\";\nimport { UiDebug } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport { debugStore, type DebugStore } from \"./debugStore\";\n\n/**\n * The console's trigger, styled as navbar chrome for AppShell's actions slot.\n *\n * It replaced a collapsed status bar pinned under the page. The bar cost a\n * strip of every screen to say something only a developer wants, and it sat\n * where a page's own footer belongs; the navbar is where an app's other global\n * affordances already are, beside the chat trigger.\n *\n * The badge is what the bar was actually for. A trigger that says nothing gives\n * no reason to press it — \"3 errors\" does.\n */\n\nexport type DebugConsoleButtonProps = {\n label?: string | undefined;\n className?: string | undefined;\n /** The capture store to count. Defaults to the shared one the dock streams into. */\n store?: DebugStore | undefined;\n};\n\nexport function DebugConsoleButton({\n label = \"Debug console\",\n className,\n store = debugStore,\n}: DebugConsoleButtonProps) {\n const open = useSyncExternalStore(subscribeToDebugConsole, debugConsoleOpen, () => false);\n const state = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);\n const failures = state.records.filter(hasFailed).length;\n const badge = failures > 0 ? failures : state.records.length;\n\n return (\n <button\n type=\"button\"\n aria-label={label}\n aria-pressed={open}\n title={triggerTitle(state.records.length, failures, open)}\n onClick={() => revealDebugConsole({ toggle: true })}\n className={cn(\n \"relative inline-flex size-9 shrink-0 items-center justify-center rounded-md bg-transparent text-foreground transition-colors hover:bg-accent\",\n open && \"bg-accent\",\n className,\n )}\n >\n <UiDebug className=\"size-5\" aria-hidden />\n {badge > 0 ? (\n <span\n aria-hidden\n className={cn(\n \"-right-0.5 -top-0.5 absolute min-w-4 rounded-full px-1 text-[10px] leading-4 tabular-nums\",\n failures > 0\n ? \"bg-destructive text-destructive-foreground\"\n : \"bg-muted text-muted-foreground\",\n )}\n >\n {badge > 99 ? \"99+\" : badge}\n </span>\n ) : null}\n </button>\n );\n}\n\n/**\n * A failed capture is either one the transport reported an error for or one\n * whose status came back 4xx/5xx — a record can carry the second without the\n * first when the handler wrote the status itself.\n */\nfunction hasFailed(record: { error?: string | undefined; status?: number | undefined }): boolean {\n return Boolean(record.error) || (record.status !== undefined && record.status >= 400);\n}\n\nfunction triggerTitle(records: number, failures: number, open: boolean): string {\n const action = open ? \"Hide\" : \"Show\";\n if (records === 0) return `${action} the debug console`;\n const captures = `${records} capture${records === 1 ? \"\" : \"s\"}`;\n if (failures === 0) return `${action} the debug console — ${captures}`;\n return `${action} the debug console — ${captures}, ${failures} failed`;\n}\n"],"names":[],"mappings":";;;;;;AA6BO,SAAS,mBAAmB;AAAA,EACjC,QAAQ;AAAA,EACR;AAAA,EACA,QAAQ;AACV,GAA4B;AAC1B,QAAM,OAAO,qBAAqB,yBAAyB,kBAAkB,MAAM,KAAK;AACxF,QAAM,QAAQ,qBAAqB,MAAM,WAAW,MAAM,aAAa,MAAM,WAAW;AACxF,QAAM,WAAW,MAAM,QAAQ,OAAO,SAAS,EAAE;AACjD,QAAM,QAAQ,WAAW,IAAI,WAAW,MAAM,QAAQ;AAEtD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,gBAAc;AAAA,MACd,OAAO,aAAa,MAAM,QAAQ,QAAQ,UAAU,IAAI;AAAA,MACxD,SAAS,MAAM,mBAAmB,EAAE,QAAQ,MAAM;AAAA,MAClD,WAAW;AAAA,QACT;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,oBAAC,SAAA,EAAQ,WAAU,UAAS,eAAW,MAAC;AAAA,QACvC,QAAQ,IACP;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,WAAW;AAAA,cACT;AAAA,cACA,WAAW,IACP,+CACA;AAAA,YAAA;AAAA,YAGL,UAAA,QAAQ,KAAK,QAAQ;AAAA,UAAA;AAAA,QAAA,IAEtB;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;AAOA,SAAS,UAAU,QAA8E;AAC/F,SAAO,QAAQ,OAAO,KAAK,KAAM,OAAO,WAAW,UAAa,OAAO,UAAU;AACnF;AAEA,SAAS,aAAa,SAAiB,UAAkB,MAAuB;AAC9E,QAAM,SAAS,OAAO,SAAS;AAC/B,MAAI,YAAY,EAAG,QAAO,GAAG,MAAM;AACnC,QAAM,WAAW,GAAG,OAAO,WAAW,YAAY,IAAI,KAAK,GAAG;AAC9D,MAAI,aAAa,EAAG,QAAO,GAAG,MAAM,wBAAwB,QAAQ;AACpE,SAAO,GAAG,MAAM,wBAAwB,QAAQ,KAAK,QAAQ;AAC/D;"}