@flanksource/clicky-ui 0.3.25 → 0.3.27

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 (535) 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/FixtureEditor/fixture-frontmatter.cjs +4 -0
  52. package/dist/data/FixtureEditor/fixture-frontmatter.cjs.map +1 -1
  53. package/dist/data/FixtureEditor/fixture-frontmatter.d.ts.map +1 -1
  54. package/dist/data/FixtureEditor/fixture-frontmatter.js +4 -0
  55. package/dist/data/FixtureEditor/fixture-frontmatter.js.map +1 -1
  56. package/dist/data/TaskExecDetails.cjs +8 -3
  57. package/dist/data/TaskExecDetails.cjs.map +1 -1
  58. package/dist/data/TaskExecDetails.d.ts +4 -0
  59. package/dist/data/TaskExecDetails.d.ts.map +1 -1
  60. package/dist/data/TaskExecDetails.js +9 -4
  61. package/dist/data/TaskExecDetails.js.map +1 -1
  62. package/dist/data/TaskManagerButton.cjs +101 -7
  63. package/dist/data/TaskManagerButton.cjs.map +1 -1
  64. package/dist/data/TaskManagerButton.d.ts +6 -1
  65. package/dist/data/TaskManagerButton.d.ts.map +1 -1
  66. package/dist/data/TaskManagerButton.js +103 -9
  67. package/dist/data/TaskManagerButton.js.map +1 -1
  68. package/dist/data/TaskProcessDetails.cjs +2 -0
  69. package/dist/data/TaskProcessDetails.cjs.map +1 -1
  70. package/dist/data/TaskProcessDetails.d.ts.map +1 -1
  71. package/dist/data/TaskProcessDetails.js +2 -0
  72. package/dist/data/TaskProcessDetails.js.map +1 -1
  73. package/dist/data/TaskProgress.cjs +14 -4
  74. package/dist/data/TaskProgress.cjs.map +1 -1
  75. package/dist/data/TaskProgress.js +14 -4
  76. package/dist/data/TaskProgress.js.map +1 -1
  77. package/dist/data/TaskSnapshot.cjs.map +1 -1
  78. package/dist/data/TaskSnapshot.d.ts +1 -0
  79. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  80. package/dist/data/TaskSnapshot.js.map +1 -1
  81. package/dist/data/ai/ChatWindow.cjs +18 -23
  82. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  83. package/dist/data/ai/ChatWindow.d.ts +1 -1
  84. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  85. package/dist/data/ai/ChatWindow.js +19 -24
  86. package/dist/data/ai/ChatWindow.js.map +1 -1
  87. package/dist/data/ai/ChatWindow.preferences.cjs +12 -21
  88. package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
  89. package/dist/data/ai/ChatWindow.preferences.d.ts +3 -2
  90. package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
  91. package/dist/data/ai/ChatWindow.preferences.js +12 -21
  92. package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
  93. package/dist/data/ai/ChatWindow.tool-catalog.cjs +21 -38
  94. package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
  95. package/dist/data/ai/ChatWindow.tool-catalog.d.ts +5 -5
  96. package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
  97. package/dist/data/ai/ChatWindow.tool-catalog.js +21 -38
  98. package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
  99. package/dist/data/ai/ChatWindow.types.d.ts +2 -2
  100. package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
  101. package/dist/data/ai/ChatWindowManager.cjs +2 -2
  102. package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
  103. package/dist/data/ai/ChatWindowManager.js +2 -2
  104. package/dist/data/ai/ChatWindowManager.js.map +1 -1
  105. package/dist/data/ai/ChatWindowRequestBody.cjs +4 -2
  106. package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -1
  107. package/dist/data/ai/ChatWindowRequestBody.d.ts +15 -3
  108. package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -1
  109. package/dist/data/ai/ChatWindowRequestBody.js +4 -2
  110. package/dist/data/ai/ChatWindowRequestBody.js.map +1 -1
  111. package/dist/data/ai/PromptRunEditor/index.cjs +2 -3
  112. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  113. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  114. package/dist/data/ai/PromptRunEditor/index.js +2 -3
  115. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  116. package/dist/data/ai/PromptRunEditor/model.cjs +1 -0
  117. package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -1
  118. package/dist/data/ai/PromptRunEditor/model.d.ts +1 -1
  119. package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -1
  120. package/dist/data/ai/PromptRunEditor/model.js +1 -0
  121. package/dist/data/ai/PromptRunEditor/model.js.map +1 -1
  122. package/dist/data/ai/RuntimeModePicker.cjs +11 -9
  123. package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
  124. package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
  125. package/dist/data/ai/RuntimeModePicker.js +12 -10
  126. package/dist/data/ai/RuntimeModePicker.js.map +1 -1
  127. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +5 -0
  128. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  129. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  130. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +5 -0
  131. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  132. package/dist/data/ai/SpecRuntimeEditor.model.cjs +4 -0
  133. package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
  134. package/dist/data/ai/SpecRuntimeEditor.model.d.ts +2 -0
  135. package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
  136. package/dist/data/ai/SpecRuntimeEditor.model.js +4 -0
  137. package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
  138. package/dist/data/ai/ToolPreferences.cjs +5 -5
  139. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  140. package/dist/data/ai/ToolPreferences.d.ts +6 -5
  141. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  142. package/dist/data/ai/ToolPreferences.js +5 -5
  143. package/dist/data/ai/ToolPreferences.js.map +1 -1
  144. package/dist/data/ai/ToolPreferences.model.cjs +61 -37
  145. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  146. package/dist/data/ai/ToolPreferences.model.d.ts +32 -13
  147. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  148. package/dist/data/ai/ToolPreferences.model.js +62 -38
  149. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  150. package/dist/data/ai/ToolPreferencesList.cjs +17 -20
  151. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  152. package/dist/data/ai/ToolPreferencesList.d.ts +16 -7
  153. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  154. package/dist/data/ai/ToolPreferencesList.js +18 -21
  155. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  156. package/dist/data/ai/chat-window-context.cjs +1 -1
  157. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  158. package/dist/data/ai/chat-window-context.d.ts +7 -7
  159. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  160. package/dist/data/ai/chat-window-context.js +1 -1
  161. package/dist/data/ai/chat-window-context.js.map +1 -1
  162. package/dist/data/ai/index.d.ts +3 -1
  163. package/dist/data/ai/index.d.ts.map +1 -1
  164. package/dist/data/chat/Chat.cjs +4 -2
  165. package/dist/data/chat/Chat.cjs.map +1 -1
  166. package/dist/data/chat/Chat.d.ts.map +1 -1
  167. package/dist/data/chat/Chat.js +4 -2
  168. package/dist/data/chat/Chat.js.map +1 -1
  169. package/dist/data/chat/Chat.runtime.cjs +14 -3
  170. package/dist/data/chat/Chat.runtime.cjs.map +1 -1
  171. package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
  172. package/dist/data/chat/Chat.runtime.js +15 -4
  173. package/dist/data/chat/Chat.runtime.js.map +1 -1
  174. package/dist/data/chat/clickyOperationsToTools.cjs +2 -1
  175. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  176. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  177. package/dist/data/chat/clickyOperationsToTools.js +2 -1
  178. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  179. package/dist/data/chat/index.d.ts +2 -1
  180. package/dist/data/chat/index.d.ts.map +1 -1
  181. package/dist/data/chat/tool-policy.cjs +132 -0
  182. package/dist/data/chat/tool-policy.cjs.map +1 -0
  183. package/dist/data/chat/tool-policy.d.ts +81 -0
  184. package/dist/data/chat/tool-policy.d.ts.map +1 -0
  185. package/dist/data/chat/tool-policy.js +132 -0
  186. package/dist/data/chat/tool-policy.js.map +1 -0
  187. package/dist/data/chat/types.cjs +20 -0
  188. package/dist/data/chat/types.cjs.map +1 -1
  189. package/dist/data/chat/types.d.ts +22 -2
  190. package/dist/data/chat/types.d.ts.map +1 -1
  191. package/dist/data/chat/types.js +20 -0
  192. package/dist/data/chat/types.js.map +1 -1
  193. package/dist/data/debugConsoleSignal.cjs +64 -0
  194. package/dist/data/debugConsoleSignal.cjs.map +1 -0
  195. package/dist/data/debugConsoleSignal.d.ts +83 -0
  196. package/dist/data/debugConsoleSignal.d.ts.map +1 -0
  197. package/dist/data/debugConsoleSignal.js +64 -0
  198. package/dist/data/debugConsoleSignal.js.map +1 -0
  199. package/dist/data/har/HarPanel.cjs +20 -14
  200. package/dist/data/har/HarPanel.cjs.map +1 -1
  201. package/dist/data/har/HarPanel.d.ts.map +1 -1
  202. package/dist/data/har/HarPanel.js +20 -14
  203. package/dist/data/har/HarPanel.js.map +1 -1
  204. package/dist/data/har/types.d.ts +18 -0
  205. package/dist/data/har/types.d.ts.map +1 -1
  206. package/dist/data/query-browser/QueryBrowser.cjs +4 -42
  207. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  208. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  209. package/dist/data/query-browser/QueryBrowser.js +5 -43
  210. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  211. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
  212. package/dist/data/query-browser/QueryBrowser.types.d.ts +0 -1
  213. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
  214. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
  215. package/dist/data/runtime/RuntimeBar.cjs +26 -41
  216. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  217. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  218. package/dist/data/runtime/RuntimeBar.js +28 -43
  219. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  220. package/dist/data/runtime/RuntimeBar.model.cjs +65 -0
  221. package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -1
  222. package/dist/data/runtime/RuntimeBar.model.d.ts +11 -3
  223. package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -1
  224. package/dist/data/runtime/RuntimeBar.model.js +65 -0
  225. package/dist/data/runtime/RuntimeBar.model.js.map +1 -1
  226. package/dist/data/runtime/model-capabilities.cjs +8 -5
  227. package/dist/data/runtime/model-capabilities.cjs.map +1 -1
  228. package/dist/data/runtime/model-capabilities.d.ts +6 -1
  229. package/dist/data/runtime/model-capabilities.d.ts.map +1 -1
  230. package/dist/data/runtime/model-capabilities.js +8 -5
  231. package/dist/data/runtime/model-capabilities.js.map +1 -1
  232. package/dist/data/runtime/runtime-mode.cjs +17 -0
  233. package/dist/data/runtime/runtime-mode.cjs.map +1 -1
  234. package/dist/data/runtime/runtime-mode.d.ts +6 -0
  235. package/dist/data/runtime/runtime-mode.d.ts.map +1 -1
  236. package/dist/data/runtime/runtime-mode.js +17 -0
  237. package/dist/data/runtime/runtime-mode.js.map +1 -1
  238. package/dist/data/useDebugAction.cjs +29 -0
  239. package/dist/data/useDebugAction.cjs.map +1 -0
  240. package/dist/data/useDebugAction.d.ts +16 -0
  241. package/dist/data/useDebugAction.d.ts.map +1 -0
  242. package/dist/data/useDebugAction.js +29 -0
  243. package/dist/data/useDebugAction.js.map +1 -0
  244. package/dist/data/version-info.cjs +3 -3
  245. package/dist/data/version-info.js +3 -3
  246. package/dist/data.cjs +16 -8
  247. package/dist/data.cjs.map +1 -1
  248. package/dist/data.d.ts +3 -2
  249. package/dist/data.d.ts.map +1 -1
  250. package/dist/data.js +16 -8
  251. package/dist/devtools/DebugConsole.cjs +138 -0
  252. package/dist/devtools/DebugConsole.cjs.map +1 -0
  253. package/dist/devtools/DebugConsole.d.ts +23 -0
  254. package/dist/devtools/DebugConsole.d.ts.map +1 -0
  255. package/dist/devtools/DebugConsole.js +138 -0
  256. package/dist/devtools/DebugConsole.js.map +1 -0
  257. package/dist/devtools/DebugConsoleButton.cjs +59 -0
  258. package/dist/devtools/DebugConsoleButton.cjs.map +1 -0
  259. package/dist/devtools/DebugConsoleButton.d.ts +20 -0
  260. package/dist/devtools/DebugConsoleButton.d.ts.map +1 -0
  261. package/dist/devtools/DebugConsoleButton.js +59 -0
  262. package/dist/devtools/DebugConsoleButton.js.map +1 -0
  263. package/dist/devtools/DebugConsoleDock.cjs +112 -0
  264. package/dist/devtools/DebugConsoleDock.cjs.map +1 -0
  265. package/dist/devtools/DebugConsoleDock.d.ts +26 -0
  266. package/dist/devtools/DebugConsoleDock.d.ts.map +1 -0
  267. package/dist/devtools/DebugConsoleDock.js +112 -0
  268. package/dist/devtools/DebugConsoleDock.js.map +1 -0
  269. package/dist/devtools/ExecutionDetail.cjs +135 -0
  270. package/dist/devtools/ExecutionDetail.cjs.map +1 -0
  271. package/dist/devtools/ExecutionDetail.d.ts +19 -0
  272. package/dist/devtools/ExecutionDetail.d.ts.map +1 -0
  273. package/dist/devtools/ExecutionDetail.js +135 -0
  274. package/dist/devtools/ExecutionDetail.js.map +1 -0
  275. package/dist/devtools/debugClient.cjs +172 -0
  276. package/dist/devtools/debugClient.cjs.map +1 -0
  277. package/dist/devtools/debugClient.d.ts +98 -0
  278. package/dist/devtools/debugClient.d.ts.map +1 -0
  279. package/dist/devtools/debugClient.js +172 -0
  280. package/dist/devtools/debugClient.js.map +1 -0
  281. package/dist/devtools/debugStore.cjs +115 -0
  282. package/dist/devtools/debugStore.cjs.map +1 -0
  283. package/dist/devtools/debugStore.d.ts +83 -0
  284. package/dist/devtools/debugStore.d.ts.map +1 -0
  285. package/dist/devtools/debugStore.js +115 -0
  286. package/dist/devtools/debugStore.js.map +1 -0
  287. package/dist/devtools/dockState.cjs +51 -0
  288. package/dist/devtools/dockState.cjs.map +1 -0
  289. package/dist/devtools/dockState.d.ts +31 -0
  290. package/dist/devtools/dockState.d.ts.map +1 -0
  291. package/dist/devtools/dockState.js +51 -0
  292. package/dist/devtools/dockState.js.map +1 -0
  293. package/dist/devtools/tabs/ConsoleTab.cjs +36 -0
  294. package/dist/devtools/tabs/ConsoleTab.cjs.map +1 -0
  295. package/dist/devtools/tabs/ConsoleTab.d.ts +19 -0
  296. package/dist/devtools/tabs/ConsoleTab.d.ts.map +1 -0
  297. package/dist/devtools/tabs/ConsoleTab.js +36 -0
  298. package/dist/devtools/tabs/ConsoleTab.js.map +1 -0
  299. package/dist/devtools/tabs/InspectionCaches.cjs +150 -0
  300. package/dist/devtools/tabs/InspectionCaches.cjs.map +1 -0
  301. package/dist/devtools/tabs/InspectionCaches.d.ts +23 -0
  302. package/dist/devtools/tabs/InspectionCaches.d.ts.map +1 -0
  303. package/dist/devtools/tabs/InspectionCaches.js +150 -0
  304. package/dist/devtools/tabs/InspectionCaches.js.map +1 -0
  305. package/dist/devtools/tabs/InspectionTab.cjs +316 -0
  306. package/dist/devtools/tabs/InspectionTab.cjs.map +1 -0
  307. package/dist/devtools/tabs/InspectionTab.d.ts +27 -0
  308. package/dist/devtools/tabs/InspectionTab.d.ts.map +1 -0
  309. package/dist/devtools/tabs/InspectionTab.js +316 -0
  310. package/dist/devtools/tabs/InspectionTab.js.map +1 -0
  311. package/dist/devtools/tabs/NetworkTab.cjs +91 -0
  312. package/dist/devtools/tabs/NetworkTab.cjs.map +1 -0
  313. package/dist/devtools/tabs/NetworkTab.d.ts +20 -0
  314. package/dist/devtools/tabs/NetworkTab.d.ts.map +1 -0
  315. package/dist/devtools/tabs/NetworkTab.js +91 -0
  316. package/dist/devtools/tabs/NetworkTab.js.map +1 -0
  317. package/dist/devtools/tabs/QueriesTab.cjs +85 -0
  318. package/dist/devtools/tabs/QueriesTab.cjs.map +1 -0
  319. package/dist/devtools/tabs/QueriesTab.d.ts +24 -0
  320. package/dist/devtools/tabs/QueriesTab.d.ts.map +1 -0
  321. package/dist/devtools/tabs/QueriesTab.js +85 -0
  322. package/dist/devtools/tabs/QueriesTab.js.map +1 -0
  323. package/dist/devtools/types.cjs +26 -0
  324. package/dist/devtools/types.cjs.map +1 -0
  325. package/dist/devtools/types.d.ts +235 -0
  326. package/dist/devtools/types.d.ts.map +1 -0
  327. package/dist/devtools/types.js +26 -0
  328. package/dist/devtools/types.js.map +1 -0
  329. package/dist/devtools/useDebugStream.cjs +46 -0
  330. package/dist/devtools/useDebugStream.cjs.map +1 -0
  331. package/dist/devtools/useDebugStream.d.ts +23 -0
  332. package/dist/devtools/useDebugStream.d.ts.map +1 -0
  333. package/dist/devtools/useDebugStream.js +46 -0
  334. package/dist/devtools/useDebugStream.js.map +1 -0
  335. package/dist/devtools.cjs +51 -0
  336. package/dist/devtools.cjs.map +1 -0
  337. package/dist/devtools.d.ts +37 -0
  338. package/dist/devtools.d.ts.map +1 -0
  339. package/dist/devtools.js +51 -0
  340. package/dist/devtools.js.map +1 -0
  341. package/dist/icons/components/UiOpenScad.cjs +10 -0
  342. package/dist/icons/components/UiOpenScad.cjs.map +1 -0
  343. package/dist/icons/components/UiOpenScad.d.ts +9 -0
  344. package/dist/icons/components/UiOpenScad.d.ts.map +1 -0
  345. package/dist/icons/components/UiOpenScad.js +10 -0
  346. package/dist/icons/components/UiOpenScad.js.map +1 -0
  347. package/dist/icons/index.d.ts +1 -0
  348. package/dist/icons/index.d.ts.map +1 -1
  349. package/dist/icons/registry.cjs +2 -0
  350. package/dist/icons/registry.cjs.map +1 -1
  351. package/dist/icons/registry.d.ts.map +1 -1
  352. package/dist/icons/registry.js +2 -0
  353. package/dist/icons/registry.js.map +1 -1
  354. package/dist/icons.cjs +2 -0
  355. package/dist/icons.cjs.map +1 -1
  356. package/dist/icons.js +2 -0
  357. package/dist/icons.js.map +1 -1
  358. package/dist/index.cjs +20 -8
  359. package/dist/index.cjs.map +1 -1
  360. package/dist/index.js +20 -8
  361. package/dist/index.js.map +1 -1
  362. package/dist/layout/AppShell.cjs +15 -10
  363. package/dist/layout/AppShell.cjs.map +1 -1
  364. package/dist/layout/AppShell.d.ts +11 -0
  365. package/dist/layout/AppShell.d.ts.map +1 -1
  366. package/dist/layout/AppShell.js +15 -10
  367. package/dist/layout/AppShell.js.map +1 -1
  368. package/dist/layout/AppShell.nav.cjs +170 -49
  369. package/dist/layout/AppShell.nav.cjs.map +1 -1
  370. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  371. package/dist/layout/AppShell.nav.js +170 -49
  372. package/dist/layout/AppShell.nav.js.map +1 -1
  373. package/dist/overlay/CellActions.cjs +18 -124
  374. package/dist/overlay/CellActions.cjs.map +1 -1
  375. package/dist/overlay/CellActions.d.ts +1 -1
  376. package/dist/overlay/CellActions.d.ts.map +1 -1
  377. package/dist/overlay/CellActions.js +18 -124
  378. package/dist/overlay/CellActions.js.map +1 -1
  379. package/dist/overlay/ContextMenu.cjs +144 -0
  380. package/dist/overlay/ContextMenu.cjs.map +1 -0
  381. package/dist/overlay/ContextMenu.d.ts +8 -0
  382. package/dist/overlay/ContextMenu.d.ts.map +1 -0
  383. package/dist/overlay/ContextMenu.js +144 -0
  384. package/dist/overlay/ContextMenu.js.map +1 -0
  385. package/dist/profiles/connections/connectionBrowserModel.cjs +14 -65
  386. package/dist/profiles/connections/connectionBrowserModel.cjs.map +1 -1
  387. package/dist/profiles/connections/connectionBrowserModel.d.ts +35 -35
  388. package/dist/profiles/connections/connectionBrowserModel.d.ts.map +1 -1
  389. package/dist/profiles/connections/connectionBrowserModel.js +14 -65
  390. package/dist/profiles/connections/connectionBrowserModel.js.map +1 -1
  391. package/dist/profiles/connections/connectionQueryWorkspace.cjs +29 -9
  392. package/dist/profiles/connections/connectionQueryWorkspace.cjs.map +1 -1
  393. package/dist/profiles/connections/connectionQueryWorkspace.d.ts +3 -2
  394. package/dist/profiles/connections/connectionQueryWorkspace.d.ts.map +1 -1
  395. package/dist/profiles/connections/connectionQueryWorkspace.js +30 -10
  396. package/dist/profiles/connections/connectionQueryWorkspace.js.map +1 -1
  397. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs +15 -0
  398. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs.map +1 -1
  399. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts +22 -1
  400. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts.map +1 -1
  401. package/dist/profiles/connections/connectionQueryWorkspaceModel.js +15 -0
  402. package/dist/profiles/connections/connectionQueryWorkspaceModel.js.map +1 -1
  403. package/dist/profiles/connections/index.d.ts +1 -0
  404. package/dist/profiles/connections/index.d.ts.map +1 -1
  405. package/dist/profiles/connections/inspectionStatus.cjs +44 -0
  406. package/dist/profiles/connections/inspectionStatus.cjs.map +1 -0
  407. package/dist/profiles/connections/inspectionStatus.d.ts +5 -0
  408. package/dist/profiles/connections/inspectionStatus.d.ts.map +1 -0
  409. package/dist/profiles/connections/inspectionStatus.js +44 -0
  410. package/dist/profiles/connections/inspectionStatus.js.map +1 -0
  411. package/dist/profiles/connections/useInspection.cjs +123 -0
  412. package/dist/profiles/connections/useInspection.cjs.map +1 -0
  413. package/dist/profiles/connections/useInspection.d.ts +35 -0
  414. package/dist/profiles/connections/useInspection.d.ts.map +1 -0
  415. package/dist/profiles/connections/useInspection.js +123 -0
  416. package/dist/profiles/connections/useInspection.js.map +1 -0
  417. package/dist/profiles/editor/profileBuilderWorkspace.cjs +55 -23
  418. package/dist/profiles/editor/profileBuilderWorkspace.cjs.map +1 -1
  419. package/dist/profiles/editor/profileBuilderWorkspace.d.ts.map +1 -1
  420. package/dist/profiles/editor/profileBuilderWorkspace.js +56 -24
  421. package/dist/profiles/editor/profileBuilderWorkspace.js.map +1 -1
  422. package/dist/profiles/elasticsearch/esQueryBuilder.cjs +12 -3
  423. package/dist/profiles/elasticsearch/esQueryBuilder.cjs.map +1 -1
  424. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts +2 -2
  425. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts.map +1 -1
  426. package/dist/profiles/elasticsearch/esQueryBuilder.js +12 -3
  427. package/dist/profiles/elasticsearch/esQueryBuilder.js.map +1 -1
  428. package/dist/profiles/fields/profileFieldEditor.cjs +137 -22
  429. package/dist/profiles/fields/profileFieldEditor.cjs.map +1 -1
  430. package/dist/profiles/fields/profileFieldEditor.d.ts.map +1 -1
  431. package/dist/profiles/fields/profileFieldEditor.js +137 -22
  432. package/dist/profiles/fields/profileFieldEditor.js.map +1 -1
  433. package/dist/profiles/fields/profileFieldFilterEditor.cjs +171 -82
  434. package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
  435. package/dist/profiles/fields/profileFieldFilterEditor.d.ts +0 -9
  436. package/dist/profiles/fields/profileFieldFilterEditor.d.ts.map +1 -1
  437. package/dist/profiles/fields/profileFieldFilterEditor.js +174 -85
  438. package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
  439. package/dist/profiles/fields/profileFieldIcons.cjs +6 -3
  440. package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
  441. package/dist/profiles/fields/profileFieldIcons.js +6 -3
  442. package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
  443. package/dist/profiles/query/profileSampleFilterLookup.cjs +34 -0
  444. package/dist/profiles/query/profileSampleFilterLookup.cjs.map +1 -0
  445. package/dist/profiles/query/profileSampleFilterLookup.d.ts +12 -0
  446. package/dist/profiles/query/profileSampleFilterLookup.d.ts.map +1 -0
  447. package/dist/profiles/query/profileSampleFilterLookup.js +34 -0
  448. package/dist/profiles/query/profileSampleFilterLookup.js.map +1 -0
  449. package/dist/profiles/query/profileSamplePayload.cjs +6 -4
  450. package/dist/profiles/query/profileSamplePayload.cjs.map +1 -1
  451. package/dist/profiles/query/profileSamplePayload.d.ts +11 -4
  452. package/dist/profiles/query/profileSamplePayload.d.ts.map +1 -1
  453. package/dist/profiles/query/profileSamplePayload.js +6 -4
  454. package/dist/profiles/query/profileSamplePayload.js.map +1 -1
  455. package/dist/profiles/query/profileSampleResult.cjs +26 -0
  456. package/dist/profiles/query/profileSampleResult.cjs.map +1 -0
  457. package/dist/profiles/query/profileSampleResult.d.ts +11 -0
  458. package/dist/profiles/query/profileSampleResult.d.ts.map +1 -0
  459. package/dist/profiles/query/profileSampleResult.js +26 -0
  460. package/dist/profiles/query/profileSampleResult.js.map +1 -0
  461. package/dist/profiles/query/queryTargetPicker.cjs +5 -3
  462. package/dist/profiles/query/queryTargetPicker.cjs.map +1 -1
  463. package/dist/profiles/query/queryTargetPicker.d.ts +3 -2
  464. package/dist/profiles/query/queryTargetPicker.d.ts.map +1 -1
  465. package/dist/profiles/query/queryTargetPicker.js +5 -3
  466. package/dist/profiles/query/queryTargetPicker.js.map +1 -1
  467. package/dist/profiles/wizard/profileWizard.cjs +14 -5
  468. package/dist/profiles/wizard/profileWizard.cjs.map +1 -1
  469. package/dist/profiles/wizard/profileWizard.d.ts.map +1 -1
  470. package/dist/profiles/wizard/profileWizard.js +15 -6
  471. package/dist/profiles/wizard/profileWizard.js.map +1 -1
  472. package/dist/profiles/wizard/profileWizardModel.cjs +35 -6
  473. package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
  474. package/dist/profiles/wizard/profileWizardModel.d.ts +29 -4
  475. package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
  476. package/dist/profiles/wizard/profileWizardModel.js +35 -6
  477. package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
  478. package/dist/profiles/wizard/profileWizardQueryStep.cjs +44 -11
  479. package/dist/profiles/wizard/profileWizardQueryStep.cjs.map +1 -1
  480. package/dist/profiles/wizard/profileWizardQueryStep.d.ts.map +1 -1
  481. package/dist/profiles/wizard/profileWizardQueryStep.js +46 -13
  482. package/dist/profiles/wizard/profileWizardQueryStep.js.map +1 -1
  483. package/dist/profiles/wizard/profileWizardSteps.cjs +33 -2
  484. package/dist/profiles/wizard/profileWizardSteps.cjs.map +1 -1
  485. package/dist/profiles/wizard/profileWizardSteps.d.ts +11 -2
  486. package/dist/profiles/wizard/profileWizardSteps.d.ts.map +1 -1
  487. package/dist/profiles/wizard/profileWizardSteps.js +33 -2
  488. package/dist/profiles/wizard/profileWizardSteps.js.map +1 -1
  489. package/dist/profiles.cjs +8 -2
  490. package/dist/profiles.cjs.map +1 -1
  491. package/dist/profiles.js +10 -4
  492. package/dist/profiles.js.map +1 -1
  493. package/dist/rpc/FilterForm.cjs +21 -237
  494. package/dist/rpc/FilterForm.cjs.map +1 -1
  495. package/dist/rpc/FilterForm.d.ts +3 -1
  496. package/dist/rpc/FilterForm.d.ts.map +1 -1
  497. package/dist/rpc/FilterForm.js +21 -237
  498. package/dist/rpc/FilterForm.js.map +1 -1
  499. package/dist/rpc/FilterFormFields.cjs +240 -0
  500. package/dist/rpc/FilterFormFields.cjs.map +1 -0
  501. package/dist/rpc/FilterFormFields.d.ts +12 -0
  502. package/dist/rpc/FilterFormFields.d.ts.map +1 -0
  503. package/dist/rpc/FilterFormFields.js +240 -0
  504. package/dist/rpc/FilterFormFields.js.map +1 -0
  505. package/dist/rpc/router.cjs +3 -2
  506. package/dist/rpc/router.cjs.map +1 -1
  507. package/dist/rpc/router.d.ts.map +1 -1
  508. package/dist/rpc/router.js +3 -2
  509. package/dist/rpc/router.js.map +1 -1
  510. package/dist/rpc/types.cjs.map +1 -1
  511. package/dist/rpc/types.d.ts +3 -1
  512. package/dist/rpc/types.d.ts.map +1 -1
  513. package/dist/rpc/types.js.map +1 -1
  514. package/dist/styles.css +1 -1
  515. package/package.json +6 -1
  516. package/dist/data/query-info/QueryInfoDialog.cjs +0 -106
  517. package/dist/data/query-info/QueryInfoDialog.cjs.map +0 -1
  518. package/dist/data/query-info/QueryInfoDialog.d.ts +0 -16
  519. package/dist/data/query-info/QueryInfoDialog.d.ts.map +0 -1
  520. package/dist/data/query-info/QueryInfoDialog.js +0 -106
  521. package/dist/data/query-info/QueryInfoDialog.js.map +0 -1
  522. package/dist/data/query-info/index.d.ts +0 -4
  523. package/dist/data/query-info/index.d.ts.map +0 -1
  524. package/dist/data/query-info/queryInfo.cjs +0 -42
  525. package/dist/data/query-info/queryInfo.cjs.map +0 -1
  526. package/dist/data/query-info/queryInfo.d.ts +0 -45
  527. package/dist/data/query-info/queryInfo.d.ts.map +0 -1
  528. package/dist/data/query-info/queryInfo.js +0 -42
  529. package/dist/data/query-info/queryInfo.js.map +0 -1
  530. package/dist/data/query-info/useQueryInfo.cjs +0 -48
  531. package/dist/data/query-info/useQueryInfo.cjs.map +0 -1
  532. package/dist/data/query-info/useQueryInfo.d.ts +0 -26
  533. package/dist/data/query-info/useQueryInfo.d.ts.map +0 -1
  534. package/dist/data/query-info/useQueryInfo.js +0 -48
  535. package/dist/data/query-info/useQueryInfo.js.map +0 -1
@@ -0,0 +1,135 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { CodeBlock } from "../data/CodeBlock.js";
4
+ import { JsonView } from "../data/JsonView.js";
5
+ import { DebugClient, DetailEvictedError } from "./debugClient.js";
6
+ function ExecutionDetail({ record, client, detail: provided }) {
7
+ const { detail, error, loading } = useExecutionDetail(record.id, client, provided);
8
+ if (provided === void 0 && loading) {
9
+ return /* @__PURE__ */ jsx("div", { className: "p-density-4 text-muted-foreground text-sm", children: "Loading capture…" });
10
+ }
11
+ if (error) {
12
+ return /* @__PURE__ */ jsxs("div", { className: "p-density-4 text-sm", children: [
13
+ /* @__PURE__ */ jsx("p", { className: "text-destructive", children: error }),
14
+ /* @__PURE__ */ jsx(RerunHint, { record })
15
+ ] });
16
+ }
17
+ if (!detail) return null;
18
+ const operations = detail.operations ?? [];
19
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-density-4 p-density-4", children: [
20
+ record.error ? /* @__PURE__ */ jsxs("section", { children: [
21
+ /* @__PURE__ */ jsx(SectionLabel, { children: "Error" }),
22
+ /* @__PURE__ */ jsx("p", { className: "whitespace-pre-wrap font-mono text-destructive text-xs", children: record.error })
23
+ ] }) : null,
24
+ operations.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm", children: "This request reached no provider — nothing ran that could be explained." }) : operations.map((diagnostics, index) => /* @__PURE__ */ jsx(
25
+ OperationDetail,
26
+ {
27
+ index: index + 1,
28
+ total: operations.length,
29
+ diagnostics
30
+ },
31
+ `${diagnostics.provider}-${index}`
32
+ )),
33
+ detail.logs && detail.logs.length > 0 ? /* @__PURE__ */ jsxs("section", { children: [
34
+ /* @__PURE__ */ jsxs(SectionLabel, { children: [
35
+ "Log lines (",
36
+ detail.logs.length,
37
+ ")"
38
+ ] }),
39
+ /* @__PURE__ */ jsx("div", { className: "max-h-64 overflow-auto rounded border border-border bg-muted/30 p-density-2 font-mono text-xs", children: detail.logs.map((line) => /* @__PURE__ */ jsxs("div", { className: "whitespace-pre-wrap", children: [
40
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: line.level }),
41
+ " ",
42
+ line.message
43
+ ] }, `${line.source}-${line.sequence}`)) })
44
+ ] }) : null,
45
+ /* @__PURE__ */ jsx(RerunHint, { record })
46
+ ] });
47
+ }
48
+ function OperationDetail({
49
+ index,
50
+ total,
51
+ diagnostics
52
+ }) {
53
+ const request = diagnostics.request ?? {};
54
+ const response = diagnostics.response ?? {};
55
+ return /* @__PURE__ */ jsxs("section", { className: "flex flex-col gap-density-3", children: [
56
+ /* @__PURE__ */ jsxs(SectionLabel, { children: [
57
+ total > 1 ? `Operation ${index} of ${total} — ` : "",
58
+ diagnostics.provider,
59
+ request.connection ? ` · ${request.connection}` : ""
60
+ ] }),
61
+ request.query ? /* @__PURE__ */ jsx(CodeBlock, { source: request.query, language: "sql" }) : null,
62
+ request.rendered && request.rendered !== request.query ? /* @__PURE__ */ jsxs("div", { children: [
63
+ /* @__PURE__ */ jsx(SectionLabel, { children: "Rendered from the profile" }),
64
+ /* @__PURE__ */ jsx(CodeBlock, { source: request.rendered, language: "sql" })
65
+ ] }) : null,
66
+ request.arguments && request.arguments.length > 0 ? /* @__PURE__ */ jsxs("div", { children: [
67
+ /* @__PURE__ */ jsx(SectionLabel, { children: "Bound arguments" }),
68
+ /* @__PURE__ */ jsx(JsonView, { data: request.arguments })
69
+ ] }) : null,
70
+ request.method || request.url ? /* @__PURE__ */ jsxs("p", { className: "font-mono text-xs", children: [
71
+ request.method,
72
+ " ",
73
+ request.url,
74
+ typeof response.status === "number" ? ` → ${response.status}` : ""
75
+ ] }) : null,
76
+ request.options && Object.keys(request.options).length > 0 ? /* @__PURE__ */ jsxs("div", { children: [
77
+ /* @__PURE__ */ jsx(SectionLabel, { children: "Options" }),
78
+ /* @__PURE__ */ jsx(JsonView, { data: request.options })
79
+ ] }) : null,
80
+ response.preview ? /* @__PURE__ */ jsxs("div", { children: [
81
+ /* @__PURE__ */ jsxs(SectionLabel, { children: [
82
+ "Response preview",
83
+ response.truncated ? " (truncated)" : ""
84
+ ] }),
85
+ /* @__PURE__ */ jsx(CodeBlock, { source: response.preview, language: "json" })
86
+ ] }) : null,
87
+ diagnostics.error ? /* @__PURE__ */ jsx("p", { className: "whitespace-pre-wrap font-mono text-destructive text-xs", children: diagnostics.error }) : null
88
+ ] });
89
+ }
90
+ function RerunHint({ record }) {
91
+ if (record.level === "trace2" || record.level === "trace3" || record.level === "trace4") return null;
92
+ return /* @__PURE__ */ jsxs("p", { className: "text-muted-foreground text-xs", children: [
93
+ "Captured at ",
94
+ /* @__PURE__ */ jsx("span", { className: "font-mono", children: record.level }),
95
+ ". Response bodies are only buffered at ",
96
+ /* @__PURE__ */ jsx("span", { className: "font-mono", children: "trace2" }),
97
+ " — raise the level and run it again to see them."
98
+ ] });
99
+ }
100
+ function SectionLabel({ children }) {
101
+ return /* @__PURE__ */ jsx("p", { className: "mb-density-1 font-medium text-muted-foreground text-xs uppercase tracking-wide", children });
102
+ }
103
+ function useExecutionDetail(id, client, provided) {
104
+ const [detail, setDetail] = useState(provided);
105
+ const [error, setError] = useState();
106
+ const [loading, setLoading] = useState(provided === void 0);
107
+ useEffect(() => {
108
+ if (provided !== void 0) {
109
+ setDetail(provided);
110
+ setLoading(false);
111
+ return;
112
+ }
113
+ let cancelled = false;
114
+ setLoading(true);
115
+ setError(void 0);
116
+ (client ?? new DebugClient()).detail(id).then((payload) => {
117
+ if (!cancelled) setDetail(payload);
118
+ }).catch((failure) => {
119
+ if (cancelled) return;
120
+ setError(
121
+ failure instanceof DetailEvictedError ? `${failure.message}. The summary above is all that survives.` : failure instanceof Error ? failure.message : String(failure)
122
+ );
123
+ }).finally(() => {
124
+ if (!cancelled) setLoading(false);
125
+ });
126
+ return () => {
127
+ cancelled = true;
128
+ };
129
+ }, [id, client, provided]);
130
+ return { detail, error, loading };
131
+ }
132
+ export {
133
+ ExecutionDetail
134
+ };
135
+ //# sourceMappingURL=ExecutionDetail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionDetail.js","sources":["../../src/devtools/ExecutionDetail.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { CodeBlock } from \"../data/CodeBlock\";\nimport { JsonView } from \"../data/JsonView\";\nimport type { QueryBrowserDiagnostics } from \"../data/query-browser/QueryBrowser.types\";\nimport { DebugClient, DetailEvictedError } from \"./debugClient\";\nimport type { ExecutionDetail as ExecutionDetailPayload, ExecutionSummary } from \"./types\";\n\n/**\n * The pane behind one row: what the execution actually sent, what came back,\n * and the lines it wrote on the way.\n *\n * Everything here is fetched by record id — it is the run that already\n * happened, not a re-run of it. That is the whole point of the console: the old\n * \"Debug\" dialog answered \"what does this URL run\" by running it a second time,\n * so what you inspected was never the execution that misbehaved.\n */\n\nexport type ExecutionDetailProps = {\n record: ExecutionSummary;\n client?: DebugClient | undefined;\n /** Pre-loaded detail, for a story or a test that has no server. */\n detail?: ExecutionDetailPayload | undefined;\n};\n\nexport function ExecutionDetail({ record, client, detail: provided }: ExecutionDetailProps) {\n const { detail, error, loading } = useExecutionDetail(record.id, client, provided);\n\n if (provided === undefined && loading) {\n return <div className=\"p-density-4 text-muted-foreground text-sm\">Loading capture…</div>;\n }\n if (error) {\n return (\n <div className=\"p-density-4 text-sm\">\n <p className=\"text-destructive\">{error}</p>\n <RerunHint record={record} />\n </div>\n );\n }\n if (!detail) return null;\n\n const operations = detail.operations ?? [];\n return (\n <div className=\"flex flex-col gap-density-4 p-density-4\">\n {record.error ? (\n <section>\n <SectionLabel>Error</SectionLabel>\n <p className=\"whitespace-pre-wrap font-mono text-destructive text-xs\">{record.error}</p>\n </section>\n ) : null}\n\n {operations.length === 0 ? (\n <p className=\"text-muted-foreground text-sm\">\n This request reached no provider — nothing ran that could be explained.\n </p>\n ) : (\n operations.map((diagnostics, index) => (\n <OperationDetail\n key={`${diagnostics.provider}-${index}`}\n index={index + 1}\n total={operations.length}\n diagnostics={diagnostics}\n />\n ))\n )}\n\n {detail.logs && detail.logs.length > 0 ? (\n <section>\n <SectionLabel>Log lines ({detail.logs.length})</SectionLabel>\n <div className=\"max-h-64 overflow-auto rounded border border-border bg-muted/30 p-density-2 font-mono text-xs\">\n {detail.logs.map((line) => (\n <div key={`${line.source}-${line.sequence}`} className=\"whitespace-pre-wrap\">\n <span className=\"text-muted-foreground\">{line.level}</span> {line.message}\n </div>\n ))}\n </div>\n </section>\n ) : null}\n\n <RerunHint record={record} />\n </div>\n );\n}\n\nfunction OperationDetail({\n index,\n total,\n diagnostics,\n}: {\n index: number;\n total: number;\n diagnostics: QueryBrowserDiagnostics;\n}) {\n const request = diagnostics.request ?? {};\n const response = diagnostics.response ?? {};\n return (\n <section className=\"flex flex-col gap-density-3\">\n <SectionLabel>\n {total > 1 ? `Operation ${index} of ${total} — ` : \"\"}\n {diagnostics.provider}\n {request.connection ? ` · ${request.connection}` : \"\"}\n </SectionLabel>\n\n {request.query ? <CodeBlock source={request.query} language=\"sql\" /> : null}\n {/* Shown only when it differs: for most providers the two are equal, and a\n second identical block reads as a second query. */}\n {request.rendered && request.rendered !== request.query ? (\n <div>\n <SectionLabel>Rendered from the profile</SectionLabel>\n <CodeBlock source={request.rendered} language=\"sql\" />\n </div>\n ) : null}\n\n {request.arguments && request.arguments.length > 0 ? (\n <div>\n <SectionLabel>Bound arguments</SectionLabel>\n <JsonView data={request.arguments} />\n </div>\n ) : null}\n\n {request.method || request.url ? (\n <p className=\"font-mono text-xs\">\n {request.method} {request.url}\n {typeof response.status === \"number\" ? ` → ${response.status}` : \"\"}\n </p>\n ) : null}\n\n {request.options && Object.keys(request.options).length > 0 ? (\n <div>\n <SectionLabel>Options</SectionLabel>\n <JsonView data={request.options} />\n </div>\n ) : null}\n\n {response.preview ? (\n <div>\n <SectionLabel>\n Response preview\n {response.truncated ? \" (truncated)\" : \"\"}\n </SectionLabel>\n <CodeBlock source={response.preview} language=\"json\" />\n </div>\n ) : null}\n\n {diagnostics.error ? (\n <p className=\"whitespace-pre-wrap font-mono text-destructive text-xs\">{diagnostics.error}</p>\n ) : null}\n </section>\n );\n}\n\n/**\n * A run captured below the level needed for what you are looking for cannot be\n * enriched retroactively — the bodies were never buffered. Saying so, and\n * naming the level that would have them, is the honest answer.\n */\nfunction RerunHint({ record }: { record: ExecutionSummary }) {\n if (record.level === \"trace2\" || record.level === \"trace3\" || record.level === \"trace4\") return null;\n return (\n <p className=\"text-muted-foreground text-xs\">\n Captured at <span className=\"font-mono\">{record.level}</span>. Response bodies are only\n buffered at <span className=\"font-mono\">trace2</span> — raise the level and run it again to\n see them.\n </p>\n );\n}\n\nfunction SectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"mb-density-1 font-medium text-muted-foreground text-xs uppercase tracking-wide\">\n {children}\n </p>\n );\n}\n\nfunction useExecutionDetail(\n id: string,\n client: DebugClient | undefined,\n provided: ExecutionDetailPayload | undefined,\n) {\n const [detail, setDetail] = useState<ExecutionDetailPayload | undefined>(provided);\n const [error, setError] = useState<string | undefined>();\n const [loading, setLoading] = useState(provided === undefined);\n\n useEffect(() => {\n if (provided !== undefined) {\n setDetail(provided);\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n setError(undefined);\n (client ?? new DebugClient())\n .detail(id)\n .then((payload) => {\n if (!cancelled) setDetail(payload);\n })\n .catch((failure: unknown) => {\n if (cancelled) return;\n setError(\n failure instanceof DetailEvictedError\n ? `${failure.message}. The summary above is all that survives.`\n : failure instanceof Error\n ? failure.message\n : String(failure),\n );\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [id, client, provided]);\n\n return { detail, error, loading };\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
6
+ const debugStore = require("./debugStore.cjs");
7
+ const types = require("./types.cjs");
8
+ const DEFAULT_PREFIX = "/api/v1";
9
+ class DebugClient {
10
+ constructor(options = {}) {
11
+ __publicField(this, "prefix");
12
+ __publicField(this, "request");
13
+ this.prefix = (options.prefix ?? DEFAULT_PREFIX).replace(/\/$/, "");
14
+ this.request = options.fetch ?? globalThis.fetch.bind(globalThis);
15
+ }
16
+ get root() {
17
+ return `${this.prefix}/devtools`;
18
+ }
19
+ /** The stream URL, resumed from the last sequence the caller already holds. */
20
+ streamUrl(after) {
21
+ return after > 0 ? `${this.root}/stream?after=${after}` : `${this.root}/stream`;
22
+ }
23
+ async capabilities() {
24
+ return this.json(this.root);
25
+ }
26
+ async records(after = 0) {
27
+ return this.json(after > 0 ? `${this.root}/records?after=${after}` : `${this.root}/records`);
28
+ }
29
+ /**
30
+ * Fetches one record's detail.
31
+ *
32
+ * A 410 is not an error the caller should treat as a failure — it is the
33
+ * server saying the bodies aged out while the summary survived, which is a
34
+ * different thing from "no such record" and has to stay distinguishable.
35
+ */
36
+ async detail(id) {
37
+ const response = await this.request(`${this.root}/records/${encodeURIComponent(id)}`);
38
+ if (response.status === 410) {
39
+ const body = await response.json().catch(() => null);
40
+ throw new DetailEvictedError(id, (body == null ? void 0 : body.reason) ?? "the server no longer holds it");
41
+ }
42
+ if (!response.ok) {
43
+ throw new Error(`devtools record ${id}: ${response.status} ${response.statusText}`);
44
+ }
45
+ return await response.json();
46
+ }
47
+ async har(id) {
48
+ return this.json(`${this.root}/records/${encodeURIComponent(id)}/har`);
49
+ }
50
+ async clear() {
51
+ const response = await this.request(`${this.root}/records`, { method: "DELETE" });
52
+ if (!response.ok) {
53
+ throw new Error(`clear devtools records: ${response.status} ${response.statusText}`);
54
+ }
55
+ }
56
+ /** What the server's metadata caches are holding right now. */
57
+ async inspection() {
58
+ return this.json(`${this.root}/inspection`);
59
+ }
60
+ /**
61
+ * Runs one captured provider request through the existing read-only sample
62
+ * boundary, where column inspection and cardinality probing already live.
63
+ */
64
+ async runInspection(options) {
65
+ const level = debugStore.debugStore.getSnapshot().level;
66
+ const headers = new Headers({ "Content-Type": "application/json" });
67
+ headers.set(types.DEBUG_LEVEL_HEADER, level === "off" ? "debug" : level);
68
+ if (options.refresh) headers.set(types.DEBUG_REFRESH_HEADER, "true");
69
+ const provider = { type: options.provider };
70
+ if (options.connection) provider.connection = options.connection;
71
+ if (options.options && Object.keys(options.options).length > 0) {
72
+ provider.options = options.options;
73
+ }
74
+ const profile = {
75
+ profile: "manual-inspection",
76
+ provider,
77
+ query: options.query
78
+ };
79
+ if (options.columns && options.columns.length > 0) {
80
+ profile.columns = options.columns.map((name) => ({ name, type: "string" }));
81
+ }
82
+ const response = await this.request(`${this.prefix}/profile/sample`, {
83
+ method: "POST",
84
+ headers,
85
+ body: JSON.stringify({
86
+ profile,
87
+ pagination: { limit: 1 },
88
+ refreshInspection: options.refresh
89
+ })
90
+ });
91
+ const body = await response.text();
92
+ const recordID = response.headers.get(types.DEBUG_ID_HEADER);
93
+ if (!recordID) {
94
+ let message = "";
95
+ try {
96
+ message = String(JSON.parse(body).error ?? "");
97
+ } catch {
98
+ message = body.trim();
99
+ }
100
+ throw new Error(message || `manual inspection: ${response.status} ${response.statusText}`);
101
+ }
102
+ return this.detail(recordID);
103
+ }
104
+ /**
105
+ * Drops cached metadata so the next lookup rebuilds it, and returns what
106
+ * actually went.
107
+ *
108
+ * The count matters: an empty flush and a broken one look identical without
109
+ * it, and this affects every request that follows, not just this browser's.
110
+ */
111
+ async flushInspection(options = {}) {
112
+ const params = new URLSearchParams();
113
+ if (options.policy) params.set("policy", options.policy);
114
+ if (options.key) params.set("key", options.key);
115
+ const query = params.toString();
116
+ const response = await this.request(`${this.root}/inspection${query ? `?${query}` : ""}`, {
117
+ method: "DELETE"
118
+ });
119
+ if (!response.ok) {
120
+ throw new Error((await response.text()).trim() || `${response.status} ${response.statusText}`);
121
+ }
122
+ return await response.json();
123
+ }
124
+ async json(url) {
125
+ const response = await this.request(url);
126
+ if (!response.ok) {
127
+ throw new Error(`${url}: ${response.status} ${response.statusText}`);
128
+ }
129
+ return await response.json();
130
+ }
131
+ }
132
+ class DetailEvictedError extends Error {
133
+ constructor(id, reason) {
134
+ super(`the detail for ${id} is no longer held: ${reason}`);
135
+ this.id = id;
136
+ this.reason = reason;
137
+ this.name = "DetailEvictedError";
138
+ }
139
+ }
140
+ function withDebugFetch(inner = globalThis.fetch.bind(globalThis), options = {}) {
141
+ const readLevel = options.level ?? (() => debugStore.debugStore.getSnapshot().level);
142
+ const readRefresh = options.refreshInspection ?? (() => debugStore.debugStore.getSnapshot().refreshInspection);
143
+ return async (input, init) => {
144
+ const level = readLevel();
145
+ if (level === "off") return inner(input, init);
146
+ const headers = new Headers((init == null ? void 0 : init.headers) ?? (input instanceof Request ? input.headers : void 0));
147
+ headers.set(types.DEBUG_LEVEL_HEADER, level);
148
+ if (readRefresh()) headers.set(types.DEBUG_REFRESH_HEADER, "true");
149
+ const response = await inner(input, { ...init, headers });
150
+ const id = response.headers.get(types.DEBUG_ID_HEADER);
151
+ if (id && options.onRecordId) {
152
+ options.onRecordId(id, {
153
+ method: (init == null ? void 0 : init.method) ?? (input instanceof Request ? input.method : "GET"),
154
+ url: typeof input === "string" ? input : input instanceof URL ? input.href : input.url
155
+ });
156
+ }
157
+ return response;
158
+ };
159
+ }
160
+ function armUrl(url, level) {
161
+ if (level === "off") return url;
162
+ const hashAt = url.indexOf("#");
163
+ const base = hashAt === -1 ? url : url.slice(0, hashAt);
164
+ const hash = hashAt === -1 ? "" : url.slice(hashAt);
165
+ const separator = base.includes("?") ? "&" : "?";
166
+ return `${base}${separator}${types.DEBUG_LEVEL_PARAM}=${encodeURIComponent(level)}${hash}`;
167
+ }
168
+ exports.DebugClient = DebugClient;
169
+ exports.DetailEvictedError = DetailEvictedError;
170
+ exports.armUrl = armUrl;
171
+ exports.withDebugFetch = withDebugFetch;
172
+ //# sourceMappingURL=debugClient.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugClient.cjs","sources":["../../src/devtools/debugClient.ts"],"sourcesContent":["import { debugStore } from \"./debugStore\";\nimport {\n DEBUG_ID_HEADER,\n DEBUG_LEVEL_HEADER,\n DEBUG_LEVEL_PARAM,\n DEBUG_REFRESH_HEADER,\n type DebugCapabilities,\n type DebugLevel,\n type DebugRecordsPage,\n type ExecutionDetail,\n type FlushResult,\n type HARFile,\n type InspectionCaches,\n} from \"./types\";\n\n/**\n * Talking to the devtools endpoints, and arming the app's own requests.\n *\n * Arming rides on a request header rather than a server-side mode so that one\n * browser tab cannot change what another tab's requests cost, and so nothing\n * has to be switched off again when that tab is closed.\n */\n\nexport type DebugClientOptions = {\n /** API root, e.g. \"/api/v1\". */\n prefix?: string | undefined;\n /** Injected so a test can drive the client without a network. */\n fetch?: typeof fetch | undefined;\n};\n\nexport type ManualInspectionRequest = {\n provider: string;\n connection?: string | undefined;\n query: string;\n options?: Record<string, unknown> | undefined;\n columns?: string[] | undefined;\n refresh: boolean;\n};\n\nconst DEFAULT_PREFIX = \"/api/v1\";\n\nexport class DebugClient {\n private readonly prefix: string;\n private readonly request: typeof fetch;\n\n constructor(options: DebugClientOptions = {}) {\n this.prefix = (options.prefix ?? DEFAULT_PREFIX).replace(/\\/$/, \"\");\n this.request = options.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n get root(): string {\n return `${this.prefix}/devtools`;\n }\n\n /** The stream URL, resumed from the last sequence the caller already holds. */\n streamUrl(after: number): string {\n return after > 0 ? `${this.root}/stream?after=${after}` : `${this.root}/stream`;\n }\n\n async capabilities(): Promise<DebugCapabilities> {\n return this.json<DebugCapabilities>(this.root);\n }\n\n async records(after = 0): Promise<DebugRecordsPage> {\n return this.json<DebugRecordsPage>(after > 0 ? `${this.root}/records?after=${after}` : `${this.root}/records`);\n }\n\n /**\n * Fetches one record's detail.\n *\n * A 410 is not an error the caller should treat as a failure — it is the\n * server saying the bodies aged out while the summary survived, which is a\n * different thing from \"no such record\" and has to stay distinguishable.\n */\n async detail(id: string): Promise<ExecutionDetail> {\n const response = await this.request(`${this.root}/records/${encodeURIComponent(id)}`);\n if (response.status === 410) {\n const body = (await response.json().catch(() => null)) as { reason?: string } | null;\n throw new DetailEvictedError(id, body?.reason ?? \"the server no longer holds it\");\n }\n if (!response.ok) {\n throw new Error(`devtools record ${id}: ${response.status} ${response.statusText}`);\n }\n return (await response.json()) as ExecutionDetail;\n }\n\n async har(id: string): Promise<HARFile> {\n return this.json<HARFile>(`${this.root}/records/${encodeURIComponent(id)}/har`);\n }\n\n async clear(): Promise<void> {\n const response = await this.request(`${this.root}/records`, { method: \"DELETE\" });\n if (!response.ok) {\n throw new Error(`clear devtools records: ${response.status} ${response.statusText}`);\n }\n }\n\n /** What the server's metadata caches are holding right now. */\n async inspection(): Promise<InspectionCaches> {\n return this.json<InspectionCaches>(`${this.root}/inspection`);\n }\n\n /**\n * Runs one captured provider request through the existing read-only sample\n * boundary, where column inspection and cardinality probing already live.\n */\n async runInspection(options: ManualInspectionRequest): Promise<ExecutionDetail> {\n const level = debugStore.getSnapshot().level;\n const headers = new Headers({ \"Content-Type\": \"application/json\" });\n headers.set(DEBUG_LEVEL_HEADER, level === \"off\" ? \"debug\" : level);\n if (options.refresh) headers.set(DEBUG_REFRESH_HEADER, \"true\");\n\n const provider: Record<string, unknown> = { type: options.provider };\n if (options.connection) provider.connection = options.connection;\n if (options.options && Object.keys(options.options).length > 0) {\n provider.options = options.options;\n }\n const profile: Record<string, unknown> = {\n profile: \"manual-inspection\",\n provider,\n query: options.query,\n };\n if (options.columns && options.columns.length > 0) {\n profile.columns = options.columns.map((name) => ({ name, type: \"string\" }));\n }\n\n const response = await this.request(`${this.prefix}/profile/sample`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n profile,\n pagination: { limit: 1 },\n refreshInspection: options.refresh,\n }),\n });\n const body = await response.text();\n const recordID = response.headers.get(DEBUG_ID_HEADER);\n if (!recordID) {\n let message = \"\";\n try {\n message = String((JSON.parse(body) as { error?: string }).error ?? \"\");\n } catch {\n message = body.trim();\n }\n throw new Error(message || `manual inspection: ${response.status} ${response.statusText}`);\n }\n return this.detail(recordID);\n }\n\n /**\n * Drops cached metadata so the next lookup rebuilds it, and returns what\n * actually went.\n *\n * The count matters: an empty flush and a broken one look identical without\n * it, and this affects every request that follows, not just this browser's.\n */\n async flushInspection(options: { policy?: string; key?: string } = {}): Promise<FlushResult> {\n const params = new URLSearchParams();\n if (options.policy) params.set(\"policy\", options.policy);\n if (options.key) params.set(\"key\", options.key);\n const query = params.toString();\n const response = await this.request(`${this.root}/inspection${query ? `?${query}` : \"\"}`, {\n method: \"DELETE\",\n });\n if (!response.ok) {\n throw new Error((await response.text()).trim() || `${response.status} ${response.statusText}`);\n }\n return (await response.json()) as FlushResult;\n }\n\n private async json<T>(url: string): Promise<T> {\n const response = await this.request(url);\n if (!response.ok) {\n throw new Error(`${url}: ${response.status} ${response.statusText}`);\n }\n return (await response.json()) as T;\n }\n}\n\n/** The server held the record but let its expensive half go. */\nexport class DetailEvictedError extends Error {\n constructor(\n readonly id: string,\n readonly reason: string,\n ) {\n super(`the detail for ${id} is no longer held: ${reason}`);\n this.name = \"DetailEvictedError\";\n }\n}\n\nexport type DebugFetchOptions = {\n /** Reads the level to arm at. Defaults to the shared store's current level. */\n level?: (() => DebugLevel) | undefined;\n /**\n * Reads whether to also rebuild every metadata lookup. Defaults to the shared\n * store's current setting.\n */\n refreshInspection?: (() => boolean) | undefined;\n /** Called with the record id the server stamped on each armed response. */\n onRecordId?: (id: string, request: { method: string; url: string }) => void;\n};\n\n/**\n * Wraps a `fetch` so every call through it arms the server at the console's\n * current level.\n *\n * It wraps the client's fetch rather than patching `window.fetch`: a patch\n * would capture Vite HMR, chat SSE and every other unrelated request, and\n * shipping that behaviour in a published library is hostile. The cost is that\n * bare `fetch()` call sites are not timed client-side — their server-side work\n * still arrives on the stream, which is what the tabs actually render.\n */\nexport function withDebugFetch(\n inner: typeof fetch = globalThis.fetch.bind(globalThis),\n options: DebugFetchOptions = {},\n): typeof fetch {\n const readLevel = options.level ?? (() => debugStore.getSnapshot().level);\n const readRefresh =\n options.refreshInspection ?? (() => debugStore.getSnapshot().refreshInspection);\n return async (input, init) => {\n const level = readLevel();\n if (level === \"off\") return inner(input, init);\n\n const headers = new Headers(init?.headers ?? (input instanceof Request ? input.headers : undefined));\n headers.set(DEBUG_LEVEL_HEADER, level);\n // Only sent when it is on. An always-present header carrying \"false\" would\n // make every request look like it had opted out of something.\n if (readRefresh()) headers.set(DEBUG_REFRESH_HEADER, \"true\");\n const response = await inner(input, { ...init, headers });\n\n const id = response.headers.get(DEBUG_ID_HEADER);\n if (id && options.onRecordId) {\n options.onRecordId(id, {\n method: init?.method ?? (input instanceof Request ? input.method : \"GET\"),\n url: typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url,\n });\n }\n return response;\n };\n}\n\n/**\n * Marks a URL a browser will follow on its own — a download link, which builds\n * its own request and cannot carry a header.\n */\nexport function armUrl(url: string, level: DebugLevel): string {\n if (level === \"off\") return url;\n const hashAt = url.indexOf(\"#\");\n const base = hashAt === -1 ? url : url.slice(0, hashAt);\n const hash = hashAt === -1 ? \"\" : url.slice(hashAt);\n const separator = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${separator}${DEBUG_LEVEL_PARAM}=${encodeURIComponent(level)}${hash}`;\n}\n"],"names":["debugStore","DEBUG_LEVEL_HEADER","DEBUG_REFRESH_HEADER","DEBUG_ID_HEADER","DEBUG_LEVEL_PARAM"],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { DebugCapabilities, DebugLevel, DebugRecordsPage, ExecutionDetail, FlushResult, HARFile, InspectionCaches } from './types';
2
+ /**
3
+ * Talking to the devtools endpoints, and arming the app's own requests.
4
+ *
5
+ * Arming rides on a request header rather than a server-side mode so that one
6
+ * browser tab cannot change what another tab's requests cost, and so nothing
7
+ * has to be switched off again when that tab is closed.
8
+ */
9
+ export type DebugClientOptions = {
10
+ /** API root, e.g. "/api/v1". */
11
+ prefix?: string | undefined;
12
+ /** Injected so a test can drive the client without a network. */
13
+ fetch?: typeof fetch | undefined;
14
+ };
15
+ export type ManualInspectionRequest = {
16
+ provider: string;
17
+ connection?: string | undefined;
18
+ query: string;
19
+ options?: Record<string, unknown> | undefined;
20
+ columns?: string[] | undefined;
21
+ refresh: boolean;
22
+ };
23
+ export declare class DebugClient {
24
+ private readonly prefix;
25
+ private readonly request;
26
+ constructor(options?: DebugClientOptions);
27
+ get root(): string;
28
+ /** The stream URL, resumed from the last sequence the caller already holds. */
29
+ streamUrl(after: number): string;
30
+ capabilities(): Promise<DebugCapabilities>;
31
+ records(after?: number): Promise<DebugRecordsPage>;
32
+ /**
33
+ * Fetches one record's detail.
34
+ *
35
+ * A 410 is not an error the caller should treat as a failure — it is the
36
+ * server saying the bodies aged out while the summary survived, which is a
37
+ * different thing from "no such record" and has to stay distinguishable.
38
+ */
39
+ detail(id: string): Promise<ExecutionDetail>;
40
+ har(id: string): Promise<HARFile>;
41
+ clear(): Promise<void>;
42
+ /** What the server's metadata caches are holding right now. */
43
+ inspection(): Promise<InspectionCaches>;
44
+ /**
45
+ * Runs one captured provider request through the existing read-only sample
46
+ * boundary, where column inspection and cardinality probing already live.
47
+ */
48
+ runInspection(options: ManualInspectionRequest): Promise<ExecutionDetail>;
49
+ /**
50
+ * Drops cached metadata so the next lookup rebuilds it, and returns what
51
+ * actually went.
52
+ *
53
+ * The count matters: an empty flush and a broken one look identical without
54
+ * it, and this affects every request that follows, not just this browser's.
55
+ */
56
+ flushInspection(options?: {
57
+ policy?: string;
58
+ key?: string;
59
+ }): Promise<FlushResult>;
60
+ private json;
61
+ }
62
+ /** The server held the record but let its expensive half go. */
63
+ export declare class DetailEvictedError extends Error {
64
+ readonly id: string;
65
+ readonly reason: string;
66
+ constructor(id: string, reason: string);
67
+ }
68
+ export type DebugFetchOptions = {
69
+ /** Reads the level to arm at. Defaults to the shared store's current level. */
70
+ level?: (() => DebugLevel) | undefined;
71
+ /**
72
+ * Reads whether to also rebuild every metadata lookup. Defaults to the shared
73
+ * store's current setting.
74
+ */
75
+ refreshInspection?: (() => boolean) | undefined;
76
+ /** Called with the record id the server stamped on each armed response. */
77
+ onRecordId?: (id: string, request: {
78
+ method: string;
79
+ url: string;
80
+ }) => void;
81
+ };
82
+ /**
83
+ * Wraps a `fetch` so every call through it arms the server at the console's
84
+ * current level.
85
+ *
86
+ * It wraps the client's fetch rather than patching `window.fetch`: a patch
87
+ * would capture Vite HMR, chat SSE and every other unrelated request, and
88
+ * shipping that behaviour in a published library is hostile. The cost is that
89
+ * bare `fetch()` call sites are not timed client-side — their server-side work
90
+ * still arrives on the stream, which is what the tabs actually render.
91
+ */
92
+ export declare function withDebugFetch(inner?: typeof fetch, options?: DebugFetchOptions): typeof fetch;
93
+ /**
94
+ * Marks a URL a browser will follow on its own — a download link, which builds
95
+ * its own request and cannot carry a header.
96
+ */
97
+ export declare function armUrl(url: string, level: DebugLevel): string;
98
+ //# sourceMappingURL=debugClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugClient.d.ts","sourceRoot":"","sources":["../../src/devtools/debugClient.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACtB,MAAM,SAAS,CAAC;AAEjB;;;;;;GAMG;AAEH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,KAAK,GAAG,SAAS,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAIF,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAE3B,OAAO,GAAE,kBAAuB;IAK5C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,+EAA+E;IAC/E,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI1B,YAAY,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAI1C,OAAO,CAAC,KAAK,SAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAInD;;;;;;OAMG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAY5C,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,+DAA+D;IACzD,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAI7C;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC;IA2C/E;;;;;;OAMG;IACG,eAAe,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,WAAW,CAAC;YAc9E,IAAI;CAOnB;AAED,gEAAgE;AAChE,qBAAa,kBAAmB,SAAQ,KAAK;IAEzC,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM;CAK1B;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,GAAG,SAAS,CAAC;IACvC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,SAAS,CAAC;IAChD,2EAA2E;IAC3E,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CAC7E,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,KAAK,GAAE,OAAO,KAAyC,EACvD,OAAO,GAAE,iBAAsB,GAC9B,OAAO,KAAK,CAwBd;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAO7D"}
@@ -0,0 +1,172 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+ import { debugStore } from "./debugStore.js";
5
+ import { DEBUG_LEVEL_HEADER, DEBUG_REFRESH_HEADER, DEBUG_ID_HEADER, DEBUG_LEVEL_PARAM } from "./types.js";
6
+ const DEFAULT_PREFIX = "/api/v1";
7
+ class DebugClient {
8
+ constructor(options = {}) {
9
+ __publicField(this, "prefix");
10
+ __publicField(this, "request");
11
+ this.prefix = (options.prefix ?? DEFAULT_PREFIX).replace(/\/$/, "");
12
+ this.request = options.fetch ?? globalThis.fetch.bind(globalThis);
13
+ }
14
+ get root() {
15
+ return `${this.prefix}/devtools`;
16
+ }
17
+ /** The stream URL, resumed from the last sequence the caller already holds. */
18
+ streamUrl(after) {
19
+ return after > 0 ? `${this.root}/stream?after=${after}` : `${this.root}/stream`;
20
+ }
21
+ async capabilities() {
22
+ return this.json(this.root);
23
+ }
24
+ async records(after = 0) {
25
+ return this.json(after > 0 ? `${this.root}/records?after=${after}` : `${this.root}/records`);
26
+ }
27
+ /**
28
+ * Fetches one record's detail.
29
+ *
30
+ * A 410 is not an error the caller should treat as a failure — it is the
31
+ * server saying the bodies aged out while the summary survived, which is a
32
+ * different thing from "no such record" and has to stay distinguishable.
33
+ */
34
+ async detail(id) {
35
+ const response = await this.request(`${this.root}/records/${encodeURIComponent(id)}`);
36
+ if (response.status === 410) {
37
+ const body = await response.json().catch(() => null);
38
+ throw new DetailEvictedError(id, (body == null ? void 0 : body.reason) ?? "the server no longer holds it");
39
+ }
40
+ if (!response.ok) {
41
+ throw new Error(`devtools record ${id}: ${response.status} ${response.statusText}`);
42
+ }
43
+ return await response.json();
44
+ }
45
+ async har(id) {
46
+ return this.json(`${this.root}/records/${encodeURIComponent(id)}/har`);
47
+ }
48
+ async clear() {
49
+ const response = await this.request(`${this.root}/records`, { method: "DELETE" });
50
+ if (!response.ok) {
51
+ throw new Error(`clear devtools records: ${response.status} ${response.statusText}`);
52
+ }
53
+ }
54
+ /** What the server's metadata caches are holding right now. */
55
+ async inspection() {
56
+ return this.json(`${this.root}/inspection`);
57
+ }
58
+ /**
59
+ * Runs one captured provider request through the existing read-only sample
60
+ * boundary, where column inspection and cardinality probing already live.
61
+ */
62
+ async runInspection(options) {
63
+ const level = debugStore.getSnapshot().level;
64
+ const headers = new Headers({ "Content-Type": "application/json" });
65
+ headers.set(DEBUG_LEVEL_HEADER, level === "off" ? "debug" : level);
66
+ if (options.refresh) headers.set(DEBUG_REFRESH_HEADER, "true");
67
+ const provider = { type: options.provider };
68
+ if (options.connection) provider.connection = options.connection;
69
+ if (options.options && Object.keys(options.options).length > 0) {
70
+ provider.options = options.options;
71
+ }
72
+ const profile = {
73
+ profile: "manual-inspection",
74
+ provider,
75
+ query: options.query
76
+ };
77
+ if (options.columns && options.columns.length > 0) {
78
+ profile.columns = options.columns.map((name) => ({ name, type: "string" }));
79
+ }
80
+ const response = await this.request(`${this.prefix}/profile/sample`, {
81
+ method: "POST",
82
+ headers,
83
+ body: JSON.stringify({
84
+ profile,
85
+ pagination: { limit: 1 },
86
+ refreshInspection: options.refresh
87
+ })
88
+ });
89
+ const body = await response.text();
90
+ const recordID = response.headers.get(DEBUG_ID_HEADER);
91
+ if (!recordID) {
92
+ let message = "";
93
+ try {
94
+ message = String(JSON.parse(body).error ?? "");
95
+ } catch {
96
+ message = body.trim();
97
+ }
98
+ throw new Error(message || `manual inspection: ${response.status} ${response.statusText}`);
99
+ }
100
+ return this.detail(recordID);
101
+ }
102
+ /**
103
+ * Drops cached metadata so the next lookup rebuilds it, and returns what
104
+ * actually went.
105
+ *
106
+ * The count matters: an empty flush and a broken one look identical without
107
+ * it, and this affects every request that follows, not just this browser's.
108
+ */
109
+ async flushInspection(options = {}) {
110
+ const params = new URLSearchParams();
111
+ if (options.policy) params.set("policy", options.policy);
112
+ if (options.key) params.set("key", options.key);
113
+ const query = params.toString();
114
+ const response = await this.request(`${this.root}/inspection${query ? `?${query}` : ""}`, {
115
+ method: "DELETE"
116
+ });
117
+ if (!response.ok) {
118
+ throw new Error((await response.text()).trim() || `${response.status} ${response.statusText}`);
119
+ }
120
+ return await response.json();
121
+ }
122
+ async json(url) {
123
+ const response = await this.request(url);
124
+ if (!response.ok) {
125
+ throw new Error(`${url}: ${response.status} ${response.statusText}`);
126
+ }
127
+ return await response.json();
128
+ }
129
+ }
130
+ class DetailEvictedError extends Error {
131
+ constructor(id, reason) {
132
+ super(`the detail for ${id} is no longer held: ${reason}`);
133
+ this.id = id;
134
+ this.reason = reason;
135
+ this.name = "DetailEvictedError";
136
+ }
137
+ }
138
+ function withDebugFetch(inner = globalThis.fetch.bind(globalThis), options = {}) {
139
+ const readLevel = options.level ?? (() => debugStore.getSnapshot().level);
140
+ const readRefresh = options.refreshInspection ?? (() => debugStore.getSnapshot().refreshInspection);
141
+ return async (input, init) => {
142
+ const level = readLevel();
143
+ if (level === "off") return inner(input, init);
144
+ const headers = new Headers((init == null ? void 0 : init.headers) ?? (input instanceof Request ? input.headers : void 0));
145
+ headers.set(DEBUG_LEVEL_HEADER, level);
146
+ if (readRefresh()) headers.set(DEBUG_REFRESH_HEADER, "true");
147
+ const response = await inner(input, { ...init, headers });
148
+ const id = response.headers.get(DEBUG_ID_HEADER);
149
+ if (id && options.onRecordId) {
150
+ options.onRecordId(id, {
151
+ method: (init == null ? void 0 : init.method) ?? (input instanceof Request ? input.method : "GET"),
152
+ url: typeof input === "string" ? input : input instanceof URL ? input.href : input.url
153
+ });
154
+ }
155
+ return response;
156
+ };
157
+ }
158
+ function armUrl(url, level) {
159
+ if (level === "off") return url;
160
+ const hashAt = url.indexOf("#");
161
+ const base = hashAt === -1 ? url : url.slice(0, hashAt);
162
+ const hash = hashAt === -1 ? "" : url.slice(hashAt);
163
+ const separator = base.includes("?") ? "&" : "?";
164
+ return `${base}${separator}${DEBUG_LEVEL_PARAM}=${encodeURIComponent(level)}${hash}`;
165
+ }
166
+ export {
167
+ DebugClient,
168
+ DetailEvictedError,
169
+ armUrl,
170
+ withDebugFetch
171
+ };
172
+ //# sourceMappingURL=debugClient.js.map