@flanksource/clicky-ui 0.3.41 → 0.3.43

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 (487) hide show
  1. package/dist/ai.cjs +4 -0
  2. package/dist/ai.cjs.map +1 -1
  3. package/dist/ai.js +4 -0
  4. package/dist/ai.js.map +1 -1
  5. package/dist/comments/CommentCard.cjs +3 -1
  6. package/dist/comments/CommentCard.cjs.map +1 -1
  7. package/dist/comments/CommentCard.d.ts.map +1 -1
  8. package/dist/comments/CommentCard.js +4 -2
  9. package/dist/comments/CommentCard.js.map +1 -1
  10. package/dist/comments/CommentCardParts.cjs +16 -0
  11. package/dist/comments/CommentCardParts.cjs.map +1 -1
  12. package/dist/comments/CommentCardParts.d.ts +4 -1
  13. package/dist/comments/CommentCardParts.d.ts.map +1 -1
  14. package/dist/comments/CommentCardParts.js +16 -0
  15. package/dist/comments/CommentCardParts.js.map +1 -1
  16. package/dist/comments/comment-types.cjs.map +1 -1
  17. package/dist/comments/comment-types.d.ts +4 -0
  18. package/dist/comments/comment-types.d.ts.map +1 -1
  19. package/dist/comments/comment-types.js.map +1 -1
  20. package/dist/components/Combobox.cjs +54 -8
  21. package/dist/components/Combobox.cjs.map +1 -1
  22. package/dist/components/Combobox.d.ts.map +1 -1
  23. package/dist/components/Combobox.js +56 -10
  24. package/dist/components/Combobox.js.map +1 -1
  25. package/dist/components/ComboboxMenu.cjs +139 -113
  26. package/dist/components/ComboboxMenu.cjs.map +1 -1
  27. package/dist/components/ComboboxMenu.d.ts +3 -1
  28. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  29. package/dist/components/ComboboxMenu.js +139 -113
  30. package/dist/components/ComboboxMenu.js.map +1 -1
  31. package/dist/components/ComboboxMenuTrigger.cjs +87 -0
  32. package/dist/components/ComboboxMenuTrigger.cjs.map +1 -0
  33. package/dist/components/ComboboxMenuTrigger.d.ts +23 -0
  34. package/dist/components/ComboboxMenuTrigger.d.ts.map +1 -0
  35. package/dist/components/ComboboxMenuTrigger.js +87 -0
  36. package/dist/components/ComboboxMenuTrigger.js.map +1 -0
  37. package/dist/components/JsonSchemaForm.cjs +30 -7
  38. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  39. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  40. package/dist/components/JsonSchemaForm.js +30 -7
  41. package/dist/components/JsonSchemaForm.js.map +1 -1
  42. package/dist/components/SegmentedControl.cjs +20 -3
  43. package/dist/components/SegmentedControl.cjs.map +1 -1
  44. package/dist/components/SegmentedControl.d.ts +11 -0
  45. package/dist/components/SegmentedControl.d.ts.map +1 -1
  46. package/dist/components/SegmentedControl.js +21 -4
  47. package/dist/components/SegmentedControl.js.map +1 -1
  48. package/dist/components/combobox-types.d.ts +8 -0
  49. package/dist/components/combobox-types.d.ts.map +1 -1
  50. package/dist/components/json-schema-form-debug-badge.cjs +108 -0
  51. package/dist/components/json-schema-form-debug-badge.cjs.map +1 -0
  52. package/dist/components/json-schema-form-debug-badge.d.ts +10 -0
  53. package/dist/components/json-schema-form-debug-badge.d.ts.map +1 -0
  54. package/dist/components/json-schema-form-debug-badge.js +108 -0
  55. package/dist/components/json-schema-form-debug-badge.js.map +1 -0
  56. package/dist/components/json-schema-form-debug-glyph-map.cjs +129 -0
  57. package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -0
  58. package/dist/components/json-schema-form-debug-glyph-map.d.ts +20 -0
  59. package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -0
  60. package/dist/components/json-schema-form-debug-glyph-map.js +129 -0
  61. package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -0
  62. package/dist/components/json-schema-form-debug-glyph.cjs +13 -0
  63. package/dist/components/json-schema-form-debug-glyph.cjs.map +1 -0
  64. package/dist/components/json-schema-form-debug-glyph.d.ts +6 -0
  65. package/dist/components/json-schema-form-debug-glyph.d.ts.map +1 -0
  66. package/dist/components/json-schema-form-debug-glyph.js +13 -0
  67. package/dist/components/json-schema-form-debug-glyph.js.map +1 -0
  68. package/dist/components/json-schema-form-debug-groups.cjs +56 -0
  69. package/dist/components/json-schema-form-debug-groups.cjs.map +1 -0
  70. package/dist/components/json-schema-form-debug-groups.d.ts +8 -0
  71. package/dist/components/json-schema-form-debug-groups.d.ts.map +1 -0
  72. package/dist/components/json-schema-form-debug-groups.js +56 -0
  73. package/dist/components/json-schema-form-debug-groups.js.map +1 -0
  74. package/dist/components/json-schema-form-debug-keywords.cjs +159 -0
  75. package/dist/components/json-schema-form-debug-keywords.cjs.map +1 -0
  76. package/dist/components/json-schema-form-debug-keywords.d.ts +6 -0
  77. package/dist/components/json-schema-form-debug-keywords.d.ts.map +1 -0
  78. package/dist/components/json-schema-form-debug-keywords.js +159 -0
  79. package/dist/components/json-schema-form-debug-keywords.js.map +1 -0
  80. package/dist/components/json-schema-form-debug-listeners.cjs +102 -0
  81. package/dist/components/json-schema-form-debug-listeners.cjs.map +1 -0
  82. package/dist/components/json-schema-form-debug-listeners.d.ts +6 -0
  83. package/dist/components/json-schema-form-debug-listeners.d.ts.map +1 -0
  84. package/dist/components/json-schema-form-debug-listeners.js +102 -0
  85. package/dist/components/json-schema-form-debug-listeners.js.map +1 -0
  86. package/dist/components/json-schema-form-debug.cjs +31 -0
  87. package/dist/components/json-schema-form-debug.cjs.map +1 -0
  88. package/dist/components/json-schema-form-debug.d.ts +11 -0
  89. package/dist/components/json-schema-form-debug.d.ts.map +1 -0
  90. package/dist/components/json-schema-form-debug.js +31 -0
  91. package/dist/components/json-schema-form-debug.js.map +1 -0
  92. package/dist/components/json-schema-form-enum-choice.cjs +114 -0
  93. package/dist/components/json-schema-form-enum-choice.cjs.map +1 -0
  94. package/dist/components/json-schema-form-enum-choice.d.ts +14 -0
  95. package/dist/components/json-schema-form-enum-choice.d.ts.map +1 -0
  96. package/dist/components/json-schema-form-enum-choice.js +114 -0
  97. package/dist/components/json-schema-form-enum-choice.js.map +1 -0
  98. package/dist/components/json-schema-form-fields.cjs +3 -93
  99. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  100. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  101. package/dist/components/json-schema-form-fields.js +1 -91
  102. package/dist/components/json-schema-form-fields.js.map +1 -1
  103. package/dist/components/json-schema-form-listeners.cjs +7 -1
  104. package/dist/components/json-schema-form-listeners.cjs.map +1 -1
  105. package/dist/components/json-schema-form-listeners.d.ts.map +1 -1
  106. package/dist/components/json-schema-form-listeners.js +7 -1
  107. package/dist/components/json-schema-form-listeners.js.map +1 -1
  108. package/dist/components/json-schema-form-preferences.cjs +1 -0
  109. package/dist/components/json-schema-form-preferences.cjs.map +1 -1
  110. package/dist/components/json-schema-form-preferences.d.ts +1 -0
  111. package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
  112. package/dist/components/json-schema-form-preferences.js +1 -0
  113. package/dist/components/json-schema-form-preferences.js.map +1 -1
  114. package/dist/components/json-schema-form-render.cjs +21 -5
  115. package/dist/components/json-schema-form-render.cjs.map +1 -1
  116. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  117. package/dist/components/json-schema-form-render.js +21 -5
  118. package/dist/components/json-schema-form-render.js.map +1 -1
  119. package/dist/components/json-schema-form-runtime-types.d.ts +1 -0
  120. package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
  121. package/dist/components/json-schema-form-tone.cjs +12 -0
  122. package/dist/components/json-schema-form-tone.cjs.map +1 -1
  123. package/dist/components/json-schema-form-tone.js +12 -0
  124. package/dist/components/json-schema-form-tone.js.map +1 -1
  125. package/dist/components/json-schema-form-types.d.ts +1 -0
  126. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  127. package/dist/data/GraphDiagram.cjs +125 -138
  128. package/dist/data/GraphDiagram.cjs.map +1 -1
  129. package/dist/data/GraphDiagram.d.ts +30 -23
  130. package/dist/data/GraphDiagram.d.ts.map +1 -1
  131. package/dist/data/GraphDiagram.js +128 -141
  132. package/dist/data/GraphDiagram.js.map +1 -1
  133. package/dist/data/GraphDiagramEdges.cjs +208 -0
  134. package/dist/data/GraphDiagramEdges.cjs.map +1 -0
  135. package/dist/data/GraphDiagramEdges.d.ts +40 -0
  136. package/dist/data/GraphDiagramEdges.d.ts.map +1 -0
  137. package/dist/data/GraphDiagramEdges.js +208 -0
  138. package/dist/data/GraphDiagramEdges.js.map +1 -0
  139. package/dist/data/GraphDiagramNodes.cjs +142 -0
  140. package/dist/data/GraphDiagramNodes.cjs.map +1 -0
  141. package/dist/data/GraphDiagramNodes.d.ts +22 -0
  142. package/dist/data/GraphDiagramNodes.d.ts.map +1 -0
  143. package/dist/data/GraphDiagramNodes.js +142 -0
  144. package/dist/data/GraphDiagramNodes.js.map +1 -0
  145. package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs +8 -3
  146. package/dist/data/ai/PromptRunEditor/RuntimeRows.cjs.map +1 -1
  147. package/dist/data/ai/PromptRunEditor/RuntimeRows.d.ts.map +1 -1
  148. package/dist/data/ai/PromptRunEditor/RuntimeRows.js +8 -3
  149. package/dist/data/ai/PromptRunEditor/RuntimeRows.js.map +1 -1
  150. package/dist/data/ai/PromptRunEditor/index.cjs +37 -43
  151. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  152. package/dist/data/ai/PromptRunEditor/index.d.ts +3 -1
  153. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  154. package/dist/data/ai/PromptRunEditor/index.js +38 -44
  155. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  156. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +16 -5
  157. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  158. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts +4 -1
  159. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  160. package/dist/data/ai/PromptRunEditor/runtimeActions.js +17 -6
  161. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  162. package/dist/data/ai/SessionInspector.approvals-model.cjs +12 -0
  163. package/dist/data/ai/SessionInspector.approvals-model.cjs.map +1 -1
  164. package/dist/data/ai/SessionInspector.approvals-model.d.ts +11 -2
  165. package/dist/data/ai/SessionInspector.approvals-model.d.ts.map +1 -1
  166. package/dist/data/ai/SessionInspector.approvals-model.js +12 -0
  167. package/dist/data/ai/SessionInspector.approvals-model.js.map +1 -1
  168. package/dist/data/ai/SessionInspector.approvals.cjs +25 -1
  169. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  170. package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -1
  171. package/dist/data/ai/SessionInspector.approvals.js +26 -2
  172. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  173. package/dist/data/ai/SessionInspector.summary.cjs +9 -3
  174. package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
  175. package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
  176. package/dist/data/ai/SessionInspector.summary.js +9 -3
  177. package/dist/data/ai/SessionInspector.summary.js.map +1 -1
  178. package/dist/data/ai/SessionInspector.transcript.cjs +4 -0
  179. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
  180. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
  181. package/dist/data/ai/SessionInspector.transcript.js +4 -0
  182. package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
  183. package/dist/data/ai/SessionViewer.approval-body.cjs +146 -0
  184. package/dist/data/ai/SessionViewer.approval-body.cjs.map +1 -0
  185. package/dist/data/ai/SessionViewer.approval-body.d.ts +11 -0
  186. package/dist/data/ai/SessionViewer.approval-body.d.ts.map +1 -0
  187. package/dist/data/ai/SessionViewer.approval-body.js +146 -0
  188. package/dist/data/ai/SessionViewer.approval-body.js.map +1 -0
  189. package/dist/data/ai/SessionViewer.approval-forms.cjs +150 -0
  190. package/dist/data/ai/SessionViewer.approval-forms.cjs.map +1 -0
  191. package/dist/data/ai/SessionViewer.approval-forms.d.ts +23 -0
  192. package/dist/data/ai/SessionViewer.approval-forms.d.ts.map +1 -0
  193. package/dist/data/ai/SessionViewer.approval-forms.js +150 -0
  194. package/dist/data/ai/SessionViewer.approval-forms.js.map +1 -0
  195. package/dist/data/ai/SessionViewer.cjs +57 -20
  196. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  197. package/dist/data/ai/SessionViewer.d.ts +13 -3
  198. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  199. package/dist/data/ai/SessionViewer.decision-controls.cjs +313 -0
  200. package/dist/data/ai/SessionViewer.decision-controls.cjs.map +1 -0
  201. package/dist/data/ai/SessionViewer.decision-controls.d.ts +43 -0
  202. package/dist/data/ai/SessionViewer.decision-controls.d.ts.map +1 -0
  203. package/dist/data/ai/SessionViewer.decision-controls.js +313 -0
  204. package/dist/data/ai/SessionViewer.decision-controls.js.map +1 -0
  205. package/dist/data/ai/SessionViewer.decision.cjs +21 -0
  206. package/dist/data/ai/SessionViewer.decision.cjs.map +1 -0
  207. package/dist/data/ai/SessionViewer.decision.d.ts +12 -0
  208. package/dist/data/ai/SessionViewer.decision.d.ts.map +1 -0
  209. package/dist/data/ai/SessionViewer.decision.js +21 -0
  210. package/dist/data/ai/SessionViewer.decision.js.map +1 -0
  211. package/dist/data/ai/SessionViewer.input.cjs +14 -0
  212. package/dist/data/ai/SessionViewer.input.cjs.map +1 -1
  213. package/dist/data/ai/SessionViewer.input.d.ts +5 -0
  214. package/dist/data/ai/SessionViewer.input.d.ts.map +1 -1
  215. package/dist/data/ai/SessionViewer.input.js +14 -0
  216. package/dist/data/ai/SessionViewer.input.js.map +1 -1
  217. package/dist/data/ai/SessionViewer.js +58 -21
  218. package/dist/data/ai/SessionViewer.js.map +1 -1
  219. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  220. package/dist/data/ai/SessionViewer.model.d.ts +4 -0
  221. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  222. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  223. package/dist/data/ai/SessionViewer.rows.cjs +6 -3
  224. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  225. package/dist/data/ai/SessionViewer.rows.d.ts +2 -1
  226. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  227. package/dist/data/ai/SessionViewer.rows.js +6 -3
  228. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  229. package/dist/data/ai/SessionViewer.tool-row.cjs +29 -237
  230. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  231. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  232. package/dist/data/ai/SessionViewer.tool-row.js +27 -235
  233. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  234. package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
  235. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  236. package/dist/data/ai/SessionViewerMenu.cjs +8 -2
  237. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  238. package/dist/data/ai/SessionViewerMenu.d.ts +4 -1
  239. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  240. package/dist/data/ai/SessionViewerMenu.js +8 -2
  241. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  242. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +28 -17
  243. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
  244. package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts +10 -2
  245. package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
  246. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +29 -18
  247. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
  248. package/dist/data/ai/SpecRuntimeEditor/index.cjs +9 -1
  249. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  250. package/dist/data/ai/SpecRuntimeEditor/index.d.ts +9 -2
  251. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  252. package/dist/data/ai/SpecRuntimeEditor/index.js +9 -1
  253. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  254. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs +1 -1
  255. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js +1 -1
  256. package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
  257. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts +8 -2
  258. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
  259. package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
  260. package/dist/data/ai/SpecRuntimeEditor/update.cjs +14 -6
  261. package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
  262. package/dist/data/ai/SpecRuntimeEditor/update.d.ts +1 -0
  263. package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
  264. package/dist/data/ai/SpecRuntimeEditor/update.js +14 -6
  265. package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
  266. package/dist/data/ai/approval-request.cjs +75 -0
  267. package/dist/data/ai/approval-request.cjs.map +1 -0
  268. package/dist/data/ai/approval-request.d.ts +155 -0
  269. package/dist/data/ai/approval-request.d.ts.map +1 -0
  270. package/dist/data/ai/approval-request.js +75 -0
  271. package/dist/data/ai/approval-request.js.map +1 -0
  272. package/dist/data/ai/index.d.ts +3 -0
  273. package/dist/data/ai/index.d.ts.map +1 -1
  274. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs +125 -0
  275. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.cjs.map +1 -0
  276. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts +11 -0
  277. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.d.ts.map +1 -0
  278. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js +125 -0
  279. package/dist/data/ai/runtime-preset-menu/SavePresetDialog.js.map +1 -0
  280. package/dist/data/ai/runtime-preset-menu/index.d.ts +3 -0
  281. package/dist/data/ai/runtime-preset-menu/index.d.ts.map +1 -0
  282. package/dist/data/ai/runtime-preset-menu/model.cjs +73 -0
  283. package/dist/data/ai/runtime-preset-menu/model.cjs.map +1 -0
  284. package/dist/data/ai/runtime-preset-menu/model.d.ts +13 -0
  285. package/dist/data/ai/runtime-preset-menu/model.d.ts.map +1 -0
  286. package/dist/data/ai/runtime-preset-menu/model.js +73 -0
  287. package/dist/data/ai/runtime-preset-menu/model.js.map +1 -0
  288. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs +149 -0
  289. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.cjs.map +1 -0
  290. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts +15 -0
  291. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.d.ts.map +1 -0
  292. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js +149 -0
  293. package/dist/data/ai/runtime-preset-menu/use-runtime-preset-menu.js.map +1 -0
  294. package/dist/data/ai/runtime-spec-fields.cjs +166 -0
  295. package/dist/data/ai/runtime-spec-fields.cjs.map +1 -0
  296. package/dist/data/ai/runtime-spec-fields.d.ts +13 -0
  297. package/dist/data/ai/runtime-spec-fields.d.ts.map +1 -0
  298. package/dist/data/ai/runtime-spec-fields.js +166 -0
  299. package/dist/data/ai/runtime-spec-fields.js.map +1 -0
  300. package/dist/data/ai/session-categories.cjs +4 -0
  301. package/dist/data/ai/session-categories.cjs.map +1 -1
  302. package/dist/data/ai/session-categories.d.ts +1 -0
  303. package/dist/data/ai/session-categories.d.ts.map +1 -1
  304. package/dist/data/ai/session-categories.js +4 -0
  305. package/dist/data/ai/session-categories.js.map +1 -1
  306. package/dist/data/ai/use-session-scroll.cjs +49 -21
  307. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  308. package/dist/data/ai/use-session-scroll.d.ts +2 -0
  309. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  310. package/dist/data/ai/use-session-scroll.js +49 -21
  311. package/dist/data/ai/use-session-scroll.js.map +1 -1
  312. package/dist/data/chat/Chat.runtime.cjs +1 -1
  313. package/dist/data/chat/Chat.runtime.cjs.map +1 -1
  314. package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
  315. package/dist/data/chat/Chat.runtime.js +1 -1
  316. package/dist/data/chat/Chat.runtime.js.map +1 -1
  317. package/dist/data/graph-columns-layout.cjs +216 -0
  318. package/dist/data/graph-columns-layout.cjs.map +1 -0
  319. package/dist/data/graph-columns-layout.d.ts +56 -0
  320. package/dist/data/graph-columns-layout.d.ts.map +1 -0
  321. package/dist/data/graph-columns-layout.js +216 -0
  322. package/dist/data/graph-columns-layout.js.map +1 -0
  323. package/dist/data/graph-diagram-model.cjs +73 -0
  324. package/dist/data/graph-diagram-model.cjs.map +1 -0
  325. package/dist/data/graph-diagram-model.d.ts +90 -0
  326. package/dist/data/graph-diagram-model.d.ts.map +1 -0
  327. package/dist/data/graph-diagram-model.js +73 -0
  328. package/dist/data/graph-diagram-model.js.map +1 -0
  329. package/dist/data/graph-edge-routing.cjs +235 -0
  330. package/dist/data/graph-edge-routing.cjs.map +1 -0
  331. package/dist/data/graph-edge-routing.d.ts +73 -0
  332. package/dist/data/graph-edge-routing.d.ts.map +1 -0
  333. package/dist/data/graph-edge-routing.js +235 -0
  334. package/dist/data/graph-edge-routing.js.map +1 -0
  335. package/dist/data/graph-layout.cjs +0 -82
  336. package/dist/data/graph-layout.cjs.map +1 -1
  337. package/dist/data/graph-layout.d.ts +1 -28
  338. package/dist/data/graph-layout.d.ts.map +1 -1
  339. package/dist/data/graph-layout.js +1 -83
  340. package/dist/data/graph-layout.js.map +1 -1
  341. package/dist/data/har/HarPanel.cjs +129 -33
  342. package/dist/data/har/HarPanel.cjs.map +1 -1
  343. package/dist/data/har/HarPanel.d.ts +13 -1
  344. package/dist/data/har/HarPanel.d.ts.map +1 -1
  345. package/dist/data/har/HarPanel.js +130 -34
  346. package/dist/data/har/HarPanel.js.map +1 -1
  347. package/dist/data/har/fixtures.d.ts +12 -0
  348. package/dist/data/har/fixtures.d.ts.map +1 -1
  349. package/dist/data/har/types.d.ts +12 -0
  350. package/dist/data/har/types.d.ts.map +1 -1
  351. package/dist/data/runtime/RuntimeBar.cjs +67 -84
  352. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  353. package/dist/data/runtime/RuntimeBar.d.ts +4 -5
  354. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  355. package/dist/data/runtime/RuntimeBar.fields.cjs +170 -0
  356. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -0
  357. package/dist/data/runtime/RuntimeBar.fields.d.ts +16 -0
  358. package/dist/data/runtime/RuntimeBar.fields.d.ts.map +1 -0
  359. package/dist/data/runtime/RuntimeBar.fields.js +170 -0
  360. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -0
  361. package/dist/data/runtime/RuntimeBar.js +70 -87
  362. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  363. package/dist/data/runtime/RuntimeBar.selection.cjs +56 -0
  364. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -0
  365. package/dist/data/runtime/RuntimeBar.selection.d.ts +20 -0
  366. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -0
  367. package/dist/data/runtime/RuntimeBar.selection.js +56 -0
  368. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -0
  369. package/dist/data/runtime/RuntimeBarActions.cjs +10 -6
  370. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  371. package/dist/data/runtime/RuntimeBarActions.d.ts +8 -1
  372. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  373. package/dist/data/runtime/RuntimeBarActions.js +10 -6
  374. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  375. package/dist/data/runtime/RuntimeBarIdentity.cjs +166 -0
  376. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -0
  377. package/dist/data/runtime/RuntimeBarIdentity.d.ts +25 -0
  378. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -0
  379. package/dist/data/runtime/RuntimeBarIdentity.js +166 -0
  380. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -0
  381. package/dist/data/runtime/RuntimeBarLayout.cjs +95 -0
  382. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -0
  383. package/dist/data/runtime/RuntimeBarLayout.d.ts +9 -0
  384. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -0
  385. package/dist/data/runtime/RuntimeBarLayout.js +95 -0
  386. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -0
  387. package/dist/data/runtime/RuntimeBarSegment.cjs +25 -14
  388. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  389. package/dist/data/runtime/RuntimeBarSegment.d.ts +4 -0
  390. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  391. package/dist/data/runtime/RuntimeBarSegment.js +25 -14
  392. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  393. package/dist/data/runtime/RuntimeLimitInput.cjs +41 -0
  394. package/dist/data/runtime/RuntimeLimitInput.cjs.map +1 -0
  395. package/dist/data/runtime/RuntimeLimitInput.d.ts +9 -0
  396. package/dist/data/runtime/RuntimeLimitInput.d.ts.map +1 -0
  397. package/dist/data/runtime/RuntimeLimitInput.js +41 -0
  398. package/dist/data/runtime/RuntimeLimitInput.js.map +1 -0
  399. package/dist/data/runtime/use-runtime-bar-overflow.cjs +70 -0
  400. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -0
  401. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +13 -0
  402. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -0
  403. package/dist/data/runtime/use-runtime-bar-overflow.js +70 -0
  404. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -0
  405. package/dist/data/use-edge-focus.cjs +20 -0
  406. package/dist/data/use-edge-focus.cjs.map +1 -0
  407. package/dist/data/use-edge-focus.d.ts +23 -0
  408. package/dist/data/use-edge-focus.d.ts.map +1 -0
  409. package/dist/data/use-edge-focus.js +20 -0
  410. package/dist/data/use-edge-focus.js.map +1 -0
  411. package/dist/data/use-pan-zoom.cjs +159 -0
  412. package/dist/data/use-pan-zoom.cjs.map +1 -0
  413. package/dist/data/use-pan-zoom.d.ts +79 -0
  414. package/dist/data/use-pan-zoom.d.ts.map +1 -0
  415. package/dist/data/use-pan-zoom.js +159 -0
  416. package/dist/data/use-pan-zoom.js.map +1 -0
  417. package/dist/data/version-info.cjs +3 -3
  418. package/dist/data/version-info.js +3 -3
  419. package/dist/data.cjs +5 -1
  420. package/dist/data.cjs.map +1 -1
  421. package/dist/data.d.ts +4 -3
  422. package/dist/data.d.ts.map +1 -1
  423. package/dist/data.js +6 -2
  424. package/dist/data.js.map +1 -1
  425. package/dist/index.cjs +5 -1
  426. package/dist/index.cjs.map +1 -1
  427. package/dist/index.js +6 -2
  428. package/dist/index.js.map +1 -1
  429. package/dist/overlay/DropdownMenu.cjs +1 -0
  430. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  431. package/dist/overlay/DropdownMenu.d.ts +4 -0
  432. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  433. package/dist/overlay/DropdownMenu.js +1 -0
  434. package/dist/overlay/DropdownMenu.js.map +1 -1
  435. package/dist/overlay/DropdownMenuSubmenu.cjs +31 -15
  436. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  437. package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
  438. package/dist/overlay/DropdownMenuSubmenu.js +31 -15
  439. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  440. package/dist/profiles/fields/profileFieldFilterEditor.cjs +5 -2
  441. package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
  442. package/dist/profiles/fields/profileFieldFilterEditor.js +5 -2
  443. package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
  444. package/dist/profiles/fields/profileFieldIcons.cjs +2 -0
  445. package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
  446. package/dist/profiles/fields/profileFieldIcons.d.ts.map +1 -1
  447. package/dist/profiles/fields/profileFieldIcons.js +2 -0
  448. package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
  449. package/dist/profiles/wizard/profileWizardModel.cjs +1 -0
  450. package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
  451. package/dist/profiles/wizard/profileWizardModel.d.ts +3 -0
  452. package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
  453. package/dist/profiles/wizard/profileWizardModel.js +1 -0
  454. package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
  455. package/dist/rpc/OperationCatalog.cjs +3 -1
  456. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  457. package/dist/rpc/OperationCatalog.d.ts +3 -1
  458. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  459. package/dist/rpc/OperationCatalog.js +3 -1
  460. package/dist/rpc/OperationCatalog.js.map +1 -1
  461. package/dist/rpc/useOperationPages.cjs +6 -1
  462. package/dist/rpc/useOperationPages.cjs.map +1 -1
  463. package/dist/rpc/useOperationPages.d.ts +3 -1
  464. package/dist/rpc/useOperationPages.d.ts.map +1 -1
  465. package/dist/rpc/useOperationPages.js +6 -1
  466. package/dist/rpc/useOperationPages.js.map +1 -1
  467. package/dist/styles.css +1 -1
  468. package/package.json +1 -1
  469. package/schemas/json-schema-form.schema.json +5 -0
  470. package/dist/data/runtime/RuntimeBarCombo.cjs +0 -423
  471. package/dist/data/runtime/RuntimeBarCombo.cjs.map +0 -1
  472. package/dist/data/runtime/RuntimeBarCombo.d.ts +0 -33
  473. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +0 -1
  474. package/dist/data/runtime/RuntimeBarCombo.js +0 -423
  475. package/dist/data/runtime/RuntimeBarCombo.js.map +0 -1
  476. package/dist/data/runtime/RuntimeBarLimits.cjs +0 -262
  477. package/dist/data/runtime/RuntimeBarLimits.cjs.map +0 -1
  478. package/dist/data/runtime/RuntimeBarLimits.d.ts +0 -17
  479. package/dist/data/runtime/RuntimeBarLimits.d.ts.map +0 -1
  480. package/dist/data/runtime/RuntimeBarLimits.js +0 -262
  481. package/dist/data/runtime/RuntimeBarLimits.js.map +0 -1
  482. package/dist/data/runtime/RuntimeBarSegments.cjs +0 -346
  483. package/dist/data/runtime/RuntimeBarSegments.cjs.map +0 -1
  484. package/dist/data/runtime/RuntimeBarSegments.d.ts +0 -37
  485. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +0 -1
  486. package/dist/data/runtime/RuntimeBarSegments.js +0 -346
  487. package/dist/data/runtime/RuntimeBarSegments.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"profileWizardModel.cjs","sources":["../../../src/profiles/wizard/profileWizardModel.ts"],"sourcesContent":["import type { JsonSchemaObject } from \"../../components/json-schema-form-types\";\nimport { profileSchema } from \"../profileApi\";\nimport type { ProfileRowLimits } from \"../connections/connectionBrowserModel\";\n\n/** How a column is filtered at the backend; every field overrides an inference\n * the server would otherwise make from the column itself. */\nexport type ProfileColumnFilter = {\n /** Backend field the selection applies to; blank infers it from the column. */\n field?: string;\n /** Nested mapping containing the backend field. */\n nested?: string;\n /** Constants that pin the matching nested entry. */\n where?: Record<string, string>;\n /** terms, range, time, boolean, text or none; blank infers it from the type. */\n kind?: string;\n /** Enumerated values, replacing the backend lookup. */\n options?: string[];\n /** Ask the backend for this field's distinct values. */\n lookup?: boolean;\n /** How many of those values the control offers before the rest are typed for. */\n limit?: number;\n /** Allow several values at once. */\n multi?: boolean;\n /** Offer no filter while keeping the column rendered. */\n disabled?: boolean;\n};\n\n/**\n * A patch of T: every key optional, and explicitly settable to `undefined` to\n * clear it.\n *\n * Not Partial<T>. Under `exactOptionalPropertyTypes` an optional key may be\n * absent but not present-and-undefined, and \"clear this field\" — which is what\n * every editor control sends when its input goes empty — is precisely a present\n * `undefined`. The patch appliers drop those keys; the type has to permit them.\n */\nexport type Patch<T> = { [K in keyof T]?: T[K] | undefined };\n\n/**\n * Applies a patch, removing the keys it clears instead of leaving them present\n * and undefined.\n *\n * Spreading a patch would keep them, and these objects are serialized to the\n * server, where a present `field: undefined` is a key to interpret rather than\n * an absent one.\n */\nexport function applyPatch<T extends object>(value: T, patch: Patch<T>): T {\n const next = { ...value };\n for (const [key, entry] of Object.entries(patch)) {\n if (entry === undefined) delete next[key as keyof T];\n else next[key as keyof T] = entry as T[keyof T];\n }\n return next;\n}\n\nexport type ProfileColumn = {\n name: string;\n source?: string;\n label?: string;\n type?: string;\n kind?: string;\n format?: string;\n unit?: string;\n width?: number;\n cel?: string;\n /** Path computing the value, rooted at the row or at `source` when set. */\n jsonpath?: string;\n hidden?: boolean;\n filter?: ProfileColumnFilter;\n [key: string]: unknown;\n};\n\nexport type ProfileProvider = {\n type?: string;\n connection?: string;\n options?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\n/** The parameter types the profile schema accepts. */\nexport type ParamDraftType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"datetime\"\n | \"duration\"\n | \"enum\"\n | \"list\";\n\n/** filter, limit, offset, time-from or time-to; empty behaves as filter. */\nexport type ParamDraftRole =\n | \"filter\"\n | \"limit\"\n | \"offset\"\n | \"time-from\"\n | \"time-to\";\n\nexport type ParamDraft = {\n name?: string | undefined;\n label?: string | undefined;\n type?: ParamDraftType | undefined;\n role?: ParamDraftRole | undefined;\n default?: unknown | undefined;\n options?: string[] | undefined;\n required?: boolean | undefined;\n description?: string | undefined;\n /** Value rewrite; {value} is the supplied value. */\n template?: string | undefined;\n /** Backend field a list parameter filters on. Setting it lets a value be\n * excluded as well as included; it requires an OpenSearch-backed provider. */\n field?: string | undefined;\n};\n\n/** PARAM_TYPES_WITH_OPTIONS are the types whose values come from a fixed set, so\n * the editor offers an options picker for them. */\nexport const PARAM_TYPES_WITH_OPTIONS: ParamDraftType[] = [\"enum\", \"list\"];\n\nexport function paramHasOptions(param: ParamDraft): boolean {\n return (\n param.type !== undefined && PARAM_TYPES_WITH_OPTIONS.includes(param.type)\n );\n}\n\nexport type ProfileWizardDraft = Record<string, unknown> & {\n namespace?: string | undefined;\n profile?: string | undefined;\n /** Overrides the sidebar/picker glyph the provider type would otherwise give. */\n icon?: string | undefined;\n provider?: ProfileProvider | undefined;\n query?: string | undefined;\n columns?: ProfileColumn[] | undefined;\n /** The inputs a run binds — by name in the query, the provider options or the\n * connection. The query workspace previews against their defaults. */\n params?: ParamDraft[] | undefined;\n /** The row caps this profile sets for itself; unset ones take their default. */\n limits?: ProfileRowLimits | undefined;\n};\n\n/**\n * A profile that caps nothing carries no block at all, so the defaults are what\n * it inherits rather than what it froze at the moment it was edited. Both draft\n * hosts write the caps through this, so neither can leave an empty map behind.\n */\nexport function withProfileLimits<T extends ProfileWizardDraft>(\n draft: T,\n limits: ProfileRowLimits | undefined,\n): T {\n const next = { ...draft };\n if (limits) next.limits = limits;\n else delete next.limits;\n return next;\n}\n\nexport type ProfileFieldFilter = {\n query: string;\n type: string;\n selection: \"all\" | \"selected\" | \"unselected\";\n};\n\nexport const PROFILE_COLUMN_FORMAT_OPTIONS = [\n { value: \"date\", label: \"Date/time\" },\n { value: \"float\", label: \"Number\" },\n { value: \"duration\", label: \"Duration\" },\n { value: \"bytes\", label: \"Bytes\" },\n { value: \"currency\", label: \"Currency\" },\n] as const;\n\nexport const PROFILE_COLUMN_UNIT_OPTIONS = [\n { value: \"none\", label: \"Compact count\" },\n { value: \"short\", label: \"Short number\" },\n { value: \"percent\", label: \"Percent (0-100)\" },\n { value: \"percentunit\", label: \"Percent (0-1)\" },\n { value: \"bytes\", label: \"Bytes (IEC)\" },\n { value: \"decbytes\", label: \"Bytes (SI)\" },\n { value: \"Bps\", label: \"Bytes/sec\" },\n { value: \"binBps\", label: \"Binary bytes/sec\" },\n { value: \"ms\", label: \"Milliseconds\" },\n { value: \"s\", label: \"Seconds\" },\n] as const;\n\nexport const profileWizardSteps = [\n { id: \"source\", label: \"Choose source\", description: \"Connection\" },\n { id: \"query\", label: \"Explore & sample\", description: \"Query\" },\n { id: \"fields\", label: \"Name & shape\", description: \"Fields\" },\n { id: \"review\", label: \"Review\", description: \"Save\" },\n] as const;\n\nexport function filterProfileFields(\n fields: ProfileColumn[],\n selectedNames: Set<string>,\n filter: ProfileFieldFilter,\n): ProfileColumn[] {\n const query = filter.query.trim().toLowerCase();\n return fields.filter((field) => {\n const selected = selectedNames.has(field.name);\n if (filter.selection === \"selected\" && !selected) return false;\n if (filter.selection === \"unselected\" && selected) return false;\n if (filter.type && field.type !== filter.type) return false;\n if (!query) return true;\n return `${field.name} ${field.label ?? \"\"}`.toLowerCase().includes(query);\n });\n}\n\n/**\n * Every field the editors can show, each in its configured form. A discovered\n * field is a snapshot of what the source reported — the configured one carries\n * the user's edits, so it is the only version safe to render into a control or\n * to patch on top of.\n *\n * The configuration owns the order, because it is the order the profile renders\n * its columns in and the one the user drags rows into. A discovered field that\n * was never configured (not selected, or dropped from the profile) has no place\n * of its own, so it keeps the one it had: it is anchored just after whichever\n * configured field preceded it in the sample.\n */\nexport function availableProfileFields(\n discovered: ProfileColumn[],\n configured: ProfileColumn[],\n): ProfileColumn[] {\n const configuredByName = new Map(\n configured.map((field) => [field.name, field]),\n );\n const configuredBySource = new Map(\n configured\n .filter((field) => field.source)\n .map((field) => [field.source as string, field]),\n );\n const ordered = [...configured];\n let anchor = 0;\n for (const field of discovered) {\n const match =\n configuredByName.get(field.name) ?? configuredBySource.get(field.name);\n if (match) {\n anchor = ordered.indexOf(match) + 1;\n continue;\n }\n ordered.splice(anchor, 0, field);\n anchor += 1;\n }\n return ordered;\n}\n\n/**\n * Moves the named column onto the target's position, shifting the columns\n * between them — the drop semantics the field grid's row drag needs. Columns\n * are addressed by name because a drag only ever carries the row's identity.\n * A name that is not configured has no position, so the order is returned\n * unchanged rather than guessed at.\n */\nexport function reorderProfileColumns(\n columns: ProfileColumn[],\n sourceName: string,\n targetName: string,\n): ProfileColumn[] {\n const from = columns.findIndex((column) => column.name === sourceName);\n const to = columns.findIndex((column) => column.name === targetName);\n if (from < 0 || to < 0 || from === to) return columns;\n const next = [...columns];\n next.splice(to, 0, ...next.splice(from, 1));\n return next;\n}\n\n/**\n * Selects or deselects the named fields, keeping the configured order intact —\n * a re-selected field returns to where the grid already showed it rather than\n * to the back of the list or to its position in the sample.\n */\nexport function applyVisibleFieldSelection(\n discovered: ProfileColumn[],\n configured: ProfileColumn[],\n visibleNames: Set<string>,\n selected: boolean,\n): ProfileColumn[] {\n const selectedNames = new Set(configured.map((field) => field.name));\n for (const name of visibleNames) {\n if (selected) selectedNames.add(name);\n else selectedNames.delete(name);\n }\n return availableProfileFields(discovered, configured).filter((field) =>\n selectedNames.has(field.name),\n );\n}\n\n/** The control kinds a column filter can render as, with the server's own\n * wording. Mirrors query.ColumnFilterKindValues() and the x-enum-labels the\n * profile schema carries for them. */\nexport const PROFILE_FILTER_KIND_OPTIONS = [\n { value: \"terms\", label: \"Value list\" },\n { value: \"exact\", label: \"Exact match\" },\n { value: \"text\", label: \"Text search\" },\n { value: \"range\", label: \"Numeric range\" },\n { value: \"duration\", label: \"Duration range\" },\n { value: \"date\", label: \"Date range\" },\n { value: \"time\", label: \"Date & time range\" },\n { value: \"boolean\", label: \"Boolean\" },\n { value: \"none\", label: \"Not filterable\" },\n] as const;\n\n/** The server's own default, so an unset limit can be shown for what it does.\n * Mirrors query.DefaultFilterLookupLimit. */\nexport const PROFILE_FILTER_DEFAULT_LIMIT = 50;\n\n/** Mirrors query.MaxFilterLookupLimit — the largest head a lookup will serve. */\nexport const PROFILE_FILTER_MAX_LIMIT = 200;\n\n/**\n * Merges one filter knob into a column's filter block, dropping the block once\n * nothing is left in it.\n *\n * The distinction matters on save: `filter: {}` is a declaration that declares\n * nothing, and the server reads a present-but-empty block differently from an\n * absent one — unchecking the last box has to mean \"infer this again\", not\n * \"override it with silence\".\n */\nexport function patchColumnFilter(\n filter: ProfileColumnFilter | undefined,\n patch: Patch<ProfileColumnFilter>,\n): ProfileColumnFilter | undefined {\n const merged = Object.fromEntries(\n Object.entries({ ...filter, ...patch }).filter(\n ([, value]) => value !== undefined,\n ),\n ) as ProfileColumnFilter;\n return Object.keys(merged).length ? merged : undefined;\n}\n\n/** What the server picks for a column that declares no filter kind. Mirrors\n * columnFilterKindFor; text and date are absent there on purpose, so they are\n * here too. Bytes stays a plain range: a size literal has two bases, so \"5MB\"\n * would mean two different numbers. */\nexport function inferredFilterKind(column: ProfileColumn): string {\n switch (column.type) {\n case \"number\":\n case \"bytes\":\n return \"range\";\n case \"duration\":\n return \"duration\";\n case \"datetime\":\n return \"time\";\n case \"boolean\":\n return \"boolean\";\n case \"uuid\":\n return \"exact\";\n case \"key_value\":\n case \"key_values\":\n case \"json\":\n return \"none\";\n default:\n return \"terms\";\n }\n}\n\nexport function patchProfileField(\n field: ProfileColumn,\n patch: Patch<ProfileColumn>,\n): ProfileColumn {\n return Object.fromEntries(\n Object.entries({ ...field, ...patch }).filter(\n ([, value]) => value !== undefined,\n ),\n ) as ProfileColumn;\n}\n\nexport function renameProfileField(\n field: ProfileColumn,\n name: string,\n): ProfileColumn {\n const source = field.source ?? (field.cel ? undefined : field.name);\n return patchProfileField(field, {\n name,\n source: source === name ? undefined : source,\n });\n}\n\n/**\n * The connection type carried in a lookup option's label.\n *\n * The server renders each option as `\"<name> (<type>)\"`, so the parenthesised\n * suffix is the **connection** type — not the query provider that reads it. The\n * two coincide often enough (`opensearch`, `loki`, `postgres`) that using one as\n * the other looks correct, and they diverge for exactly the cloud and cluster\n * log backends: an `aws` connection is read by `cloudwatch`, `kubernetes` by\n * `k8s`, `azure` by `azureloganalytics`. Resolving one to the other is\n * providerTypesForConnectionType's job, and it uses the schema rather than a\n * second copy of that mapping.\n */\nexport function connectionTypeFromLabel(label: string): string | null {\n const match = label.match(/\\(([^()]+)\\)\\s*$/);\n return match?.[1]?.trim() || null;\n}\n\n/**\n * The query providers the profile schema says can read this connection type,\n * most specific first, or empty when nothing can read it.\n *\n * The authority is the schema the server already ships: the connection field's\n * lookup scope carries provider → connection types, so inverting it here keeps\n * one mapping rather than a client-side duplicate that can drift.\n */\nexport function providerTypesForConnectionType(\n connectionType: string,\n): string[] {\n const scope = providerConnectionScope();\n const candidates = Object.keys(scope)\n .filter((provider) => scope[provider]?.includes(connectionType))\n .sort();\n if (candidates.length <= 1) return candidates;\n // A provider keyed exactly as the connection type is the one named for it.\n const exact = candidates.find((provider) => provider === connectionType);\n if (exact) return [exact];\n // Otherwise drop the dialect-agnostic umbrella, so `sql_server` resolves to\n // `sqlserver` instead of tying with the generic `sql`. A genuine tie —\n // `google_cloud`, read by both `gcpcloudlogging` and `bigquery` — survives as\n // a list for the caller to disambiguate.\n const specific = candidates.filter((provider) => provider !== \"sql\");\n return specific.length === 1 ? specific : candidates;\n}\n\nfunction providerConnectionScope(): Record<string, string[]> {\n const provider = profileSchema().properties?.provider as\n | JsonSchemaObject\n | undefined;\n const connection = provider?.properties?.connection as\n | JsonSchemaObject\n | undefined;\n const lookup = connection?.[\"x-clicky-lookup\"] as\n | { scope?: { map?: unknown } }\n | undefined;\n const map = lookup?.scope?.map;\n if (!map || typeof map !== \"object\") {\n throw new Error(\n \"profile schema is missing provider.connection x-clicky-lookup.scope.map — the wizard cannot resolve a provider for a connection without it\",\n );\n }\n return map as Record<string, string[]>;\n}\n\nexport function profileConnectionID(value: string): string | null {\n const prefix = \"connection://\";\n if (!value.startsWith(prefix)) return null;\n return value.slice(prefix.length).trim() || null;\n}\n\nexport function profileWizardErrorMessage(\n error: unknown,\n fallback: string,\n): string {\n return error instanceof Error && error.message.trim()\n ? error.message.trim()\n : fallback;\n}\n\n/**\n * A profile says what to fetch either as a raw query or as a structured search\n * specification — never both, which is why this is an either/or rather than a\n * check on `query` alone.\n */\nexport function profileWizardHasQuery(draft: ProfileWizardDraft): boolean {\n return Boolean(\n draft.query?.trim() || draft.provider?.options?.search !== undefined,\n );\n}\n\nexport function profileWizardStepReady(\n step: (typeof profileWizardSteps)[number][\"id\"],\n draft: ProfileWizardDraft,\n discovered: ProfileColumn[],\n): boolean {\n if (step === \"source\") {\n return Boolean(draft.provider?.connection && draft.provider.type);\n }\n if (step === \"query\") {\n return Boolean(profileWizardHasQuery(draft) && discovered.length > 0);\n }\n if (step === \"fields\") {\n return Boolean(draft.profile?.trim() && draft.columns?.length);\n }\n return (\n Boolean(draft.profile?.trim() && draft.provider?.connection) &&\n discovered.length > 0\n );\n}\n"],"names":["profileSchema"],"mappings":"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"}
1
+ {"version":3,"file":"profileWizardModel.cjs","sources":["../../../src/profiles/wizard/profileWizardModel.ts"],"sourcesContent":["import type { JsonSchemaObject } from \"../../components/json-schema-form-types\";\nimport { profileSchema } from \"../profileApi\";\nimport type { ProfileRowLimits } from \"../connections/connectionBrowserModel\";\n\n/** How a column is filtered at the backend; every field overrides an inference\n * the server would otherwise make from the column itself. */\nexport type ProfileColumnFilter = {\n /** Backend field the selection applies to; blank infers it from the column. */\n field?: string;\n /** Nested mapping containing the backend field. */\n nested?: string;\n /** Constants that pin the matching nested entry. */\n where?: Record<string, string>;\n /** terms, range, time, boolean, text or none; blank infers it from the type. */\n kind?: string;\n /** Enumerated values, replacing the backend lookup. */\n options?: string[];\n /** Ask the backend for this field's distinct values. */\n lookup?: boolean;\n /** How many of those values the control offers before the rest are typed for. */\n limit?: number;\n /** Allow several values at once. */\n multi?: boolean;\n /** Offer no filter while keeping the column rendered. */\n disabled?: boolean;\n};\n\n/**\n * A patch of T: every key optional, and explicitly settable to `undefined` to\n * clear it.\n *\n * Not Partial<T>. Under `exactOptionalPropertyTypes` an optional key may be\n * absent but not present-and-undefined, and \"clear this field\" — which is what\n * every editor control sends when its input goes empty — is precisely a present\n * `undefined`. The patch appliers drop those keys; the type has to permit them.\n */\nexport type Patch<T> = { [K in keyof T]?: T[K] | undefined };\n\n/**\n * Applies a patch, removing the keys it clears instead of leaving them present\n * and undefined.\n *\n * Spreading a patch would keep them, and these objects are serialized to the\n * server, where a present `field: undefined` is a key to interpret rather than\n * an absent one.\n */\nexport function applyPatch<T extends object>(value: T, patch: Patch<T>): T {\n const next = { ...value };\n for (const [key, entry] of Object.entries(patch)) {\n if (entry === undefined) delete next[key as keyof T];\n else next[key as keyof T] = entry as T[keyof T];\n }\n return next;\n}\n\nexport type ProfileColumn = {\n name: string;\n source?: string;\n label?: string;\n type?: string;\n kind?: string;\n format?: string;\n unit?: string;\n width?: number;\n cel?: string;\n /** Path computing the value, rooted at the row or at `source` when set. */\n jsonpath?: string;\n hidden?: boolean;\n filter?: ProfileColumnFilter;\n [key: string]: unknown;\n};\n\nexport type ProfileProvider = {\n type?: string;\n connection?: string;\n options?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\n/** The parameter types the profile schema accepts. */\nexport type ParamDraftType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"datetime\"\n | \"duration\"\n | \"enum\"\n | \"list\";\n\n/** filter, limit, offset, time-from or time-to; empty behaves as filter. */\nexport type ParamDraftRole =\n | \"filter\"\n | \"limit\"\n | \"offset\"\n | \"time-from\"\n | \"time-to\";\n\nexport type ParamDraft = {\n name?: string | undefined;\n label?: string | undefined;\n type?: ParamDraftType | undefined;\n role?: ParamDraftRole | undefined;\n default?: unknown | undefined;\n options?: string[] | undefined;\n required?: boolean | undefined;\n description?: string | undefined;\n /** Value rewrite; {value} is the supplied value. */\n template?: string | undefined;\n /** Backend field a list parameter filters on. Setting it lets a value be\n * excluded as well as included; it requires an OpenSearch-backed provider. */\n field?: string | undefined;\n};\n\n/** PARAM_TYPES_WITH_OPTIONS are the types whose values come from a fixed set, so\n * the editor offers an options picker for them. */\nexport const PARAM_TYPES_WITH_OPTIONS: ParamDraftType[] = [\"enum\", \"list\"];\n\nexport function paramHasOptions(param: ParamDraft): boolean {\n return (\n param.type !== undefined && PARAM_TYPES_WITH_OPTIONS.includes(param.type)\n );\n}\n\nexport type ProfileWizardDraft = Record<string, unknown> & {\n namespace?: string | undefined;\n profile?: string | undefined;\n /** Overrides the sidebar/picker glyph the provider type would otherwise give. */\n icon?: string | undefined;\n provider?: ProfileProvider | undefined;\n query?: string | undefined;\n columns?: ProfileColumn[] | undefined;\n /** The inputs a run binds — by name in the query, the provider options or the\n * connection. The query workspace previews against their defaults. */\n params?: ParamDraft[] | undefined;\n /** The row caps this profile sets for itself; unset ones take their default. */\n limits?: ProfileRowLimits | undefined;\n};\n\n/**\n * A profile that caps nothing carries no block at all, so the defaults are what\n * it inherits rather than what it froze at the moment it was edited. Both draft\n * hosts write the caps through this, so neither can leave an empty map behind.\n */\nexport function withProfileLimits<T extends ProfileWizardDraft>(\n draft: T,\n limits: ProfileRowLimits | undefined,\n): T {\n const next = { ...draft };\n if (limits) next.limits = limits;\n else delete next.limits;\n return next;\n}\n\nexport type ProfileFieldFilter = {\n query: string;\n type: string;\n selection: \"all\" | \"selected\" | \"unselected\";\n};\n\nexport const PROFILE_COLUMN_FORMAT_OPTIONS = [\n { value: \"date\", label: \"Date/time\" },\n { value: \"float\", label: \"Number\" },\n { value: \"duration\", label: \"Duration\" },\n { value: \"bytes\", label: \"Bytes\" },\n { value: \"currency\", label: \"Currency\" },\n] as const;\n\nexport const PROFILE_COLUMN_UNIT_OPTIONS = [\n { value: \"none\", label: \"Compact count\" },\n { value: \"short\", label: \"Short number\" },\n { value: \"percent\", label: \"Percent (0-100)\" },\n { value: \"percentunit\", label: \"Percent (0-1)\" },\n { value: \"bytes\", label: \"Bytes (IEC)\" },\n { value: \"decbytes\", label: \"Bytes (SI)\" },\n { value: \"Bps\", label: \"Bytes/sec\" },\n { value: \"binBps\", label: \"Binary bytes/sec\" },\n { value: \"ms\", label: \"Milliseconds\" },\n { value: \"s\", label: \"Seconds\" },\n] as const;\n\nexport const profileWizardSteps = [\n { id: \"source\", label: \"Choose source\", description: \"Connection\" },\n { id: \"query\", label: \"Explore & sample\", description: \"Query\" },\n { id: \"fields\", label: \"Name & shape\", description: \"Fields\" },\n { id: \"review\", label: \"Review\", description: \"Save\" },\n] as const;\n\nexport function filterProfileFields(\n fields: ProfileColumn[],\n selectedNames: Set<string>,\n filter: ProfileFieldFilter,\n): ProfileColumn[] {\n const query = filter.query.trim().toLowerCase();\n return fields.filter((field) => {\n const selected = selectedNames.has(field.name);\n if (filter.selection === \"selected\" && !selected) return false;\n if (filter.selection === \"unselected\" && selected) return false;\n if (filter.type && field.type !== filter.type) return false;\n if (!query) return true;\n return `${field.name} ${field.label ?? \"\"}`.toLowerCase().includes(query);\n });\n}\n\n/**\n * Every field the editors can show, each in its configured form. A discovered\n * field is a snapshot of what the source reported — the configured one carries\n * the user's edits, so it is the only version safe to render into a control or\n * to patch on top of.\n *\n * The configuration owns the order, because it is the order the profile renders\n * its columns in and the one the user drags rows into. A discovered field that\n * was never configured (not selected, or dropped from the profile) has no place\n * of its own, so it keeps the one it had: it is anchored just after whichever\n * configured field preceded it in the sample.\n */\nexport function availableProfileFields(\n discovered: ProfileColumn[],\n configured: ProfileColumn[],\n): ProfileColumn[] {\n const configuredByName = new Map(\n configured.map((field) => [field.name, field]),\n );\n const configuredBySource = new Map(\n configured\n .filter((field) => field.source)\n .map((field) => [field.source as string, field]),\n );\n const ordered = [...configured];\n let anchor = 0;\n for (const field of discovered) {\n const match =\n configuredByName.get(field.name) ?? configuredBySource.get(field.name);\n if (match) {\n anchor = ordered.indexOf(match) + 1;\n continue;\n }\n ordered.splice(anchor, 0, field);\n anchor += 1;\n }\n return ordered;\n}\n\n/**\n * Moves the named column onto the target's position, shifting the columns\n * between them — the drop semantics the field grid's row drag needs. Columns\n * are addressed by name because a drag only ever carries the row's identity.\n * A name that is not configured has no position, so the order is returned\n * unchanged rather than guessed at.\n */\nexport function reorderProfileColumns(\n columns: ProfileColumn[],\n sourceName: string,\n targetName: string,\n): ProfileColumn[] {\n const from = columns.findIndex((column) => column.name === sourceName);\n const to = columns.findIndex((column) => column.name === targetName);\n if (from < 0 || to < 0 || from === to) return columns;\n const next = [...columns];\n next.splice(to, 0, ...next.splice(from, 1));\n return next;\n}\n\n/**\n * Selects or deselects the named fields, keeping the configured order intact —\n * a re-selected field returns to where the grid already showed it rather than\n * to the back of the list or to its position in the sample.\n */\nexport function applyVisibleFieldSelection(\n discovered: ProfileColumn[],\n configured: ProfileColumn[],\n visibleNames: Set<string>,\n selected: boolean,\n): ProfileColumn[] {\n const selectedNames = new Set(configured.map((field) => field.name));\n for (const name of visibleNames) {\n if (selected) selectedNames.add(name);\n else selectedNames.delete(name);\n }\n return availableProfileFields(discovered, configured).filter((field) =>\n selectedNames.has(field.name),\n );\n}\n\n/** The control kinds a column filter can render as, with the server's own\n * wording. Mirrors query.ColumnFilterKindValues() and the x-enum-labels the\n * profile schema carries for them. */\nexport const PROFILE_FILTER_KIND_OPTIONS = [\n { value: \"terms\", label: \"Value list\" },\n { value: \"match\", label: \"Pattern list\" },\n { value: \"exact\", label: \"Exact match\" },\n { value: \"text\", label: \"Text search\" },\n { value: \"range\", label: \"Numeric range\" },\n { value: \"duration\", label: \"Duration range\" },\n { value: \"date\", label: \"Date range\" },\n { value: \"time\", label: \"Date & time range\" },\n { value: \"boolean\", label: \"Boolean\" },\n { value: \"none\", label: \"Not filterable\" },\n] as const;\n\n/** The server's own default, so an unset limit can be shown for what it does.\n * Mirrors query.DefaultFilterLookupLimit. */\nexport const PROFILE_FILTER_DEFAULT_LIMIT = 50;\n\n/** Mirrors query.MaxFilterLookupLimit — the largest head a lookup will serve. */\nexport const PROFILE_FILTER_MAX_LIMIT = 200;\n\n/**\n * Merges one filter knob into a column's filter block, dropping the block once\n * nothing is left in it.\n *\n * The distinction matters on save: `filter: {}` is a declaration that declares\n * nothing, and the server reads a present-but-empty block differently from an\n * absent one — unchecking the last box has to mean \"infer this again\", not\n * \"override it with silence\".\n */\nexport function patchColumnFilter(\n filter: ProfileColumnFilter | undefined,\n patch: Patch<ProfileColumnFilter>,\n): ProfileColumnFilter | undefined {\n const merged = Object.fromEntries(\n Object.entries({ ...filter, ...patch }).filter(\n ([, value]) => value !== undefined,\n ),\n ) as ProfileColumnFilter;\n return Object.keys(merged).length ? merged : undefined;\n}\n\n/** What the server picks for a column that declares no filter kind. Mirrors\n * columnFilterKindFor; text and date are absent there on purpose, so they are\n * here too. Bytes stays a plain range: a size literal has two bases, so \"5MB\"\n * would mean two different numbers. */\nexport function inferredFilterKind(column: ProfileColumn): string {\n switch (column.type) {\n case \"number\":\n case \"bytes\":\n return \"range\";\n case \"duration\":\n return \"duration\";\n case \"datetime\":\n return \"time\";\n case \"boolean\":\n return \"boolean\";\n case \"uuid\":\n return \"exact\";\n case \"key_value\":\n case \"key_values\":\n case \"json\":\n return \"none\";\n default:\n return \"terms\";\n }\n}\n\nexport function patchProfileField(\n field: ProfileColumn,\n patch: Patch<ProfileColumn>,\n): ProfileColumn {\n return Object.fromEntries(\n Object.entries({ ...field, ...patch }).filter(\n ([, value]) => value !== undefined,\n ),\n ) as ProfileColumn;\n}\n\nexport function renameProfileField(\n field: ProfileColumn,\n name: string,\n): ProfileColumn {\n const source = field.source ?? (field.cel ? undefined : field.name);\n return patchProfileField(field, {\n name,\n source: source === name ? undefined : source,\n });\n}\n\n/**\n * The connection type carried in a lookup option's label.\n *\n * The server renders each option as `\"<name> (<type>)\"`, so the parenthesised\n * suffix is the **connection** type — not the query provider that reads it. The\n * two coincide often enough (`opensearch`, `loki`, `postgres`) that using one as\n * the other looks correct, and they diverge for exactly the cloud and cluster\n * log backends: an `aws` connection is read by `cloudwatch`, `kubernetes` by\n * `k8s`, `azure` by `azureloganalytics`. Resolving one to the other is\n * providerTypesForConnectionType's job, and it uses the schema rather than a\n * second copy of that mapping.\n */\nexport function connectionTypeFromLabel(label: string): string | null {\n const match = label.match(/\\(([^()]+)\\)\\s*$/);\n return match?.[1]?.trim() || null;\n}\n\n/**\n * The query providers the profile schema says can read this connection type,\n * most specific first, or empty when nothing can read it.\n *\n * The authority is the schema the server already ships: the connection field's\n * lookup scope carries provider → connection types, so inverting it here keeps\n * one mapping rather than a client-side duplicate that can drift.\n */\nexport function providerTypesForConnectionType(\n connectionType: string,\n): string[] {\n const scope = providerConnectionScope();\n const candidates = Object.keys(scope)\n .filter((provider) => scope[provider]?.includes(connectionType))\n .sort();\n if (candidates.length <= 1) return candidates;\n // A provider keyed exactly as the connection type is the one named for it.\n const exact = candidates.find((provider) => provider === connectionType);\n if (exact) return [exact];\n // Otherwise drop the dialect-agnostic umbrella, so `sql_server` resolves to\n // `sqlserver` instead of tying with the generic `sql`. A genuine tie —\n // `google_cloud`, read by both `gcpcloudlogging` and `bigquery` — survives as\n // a list for the caller to disambiguate.\n const specific = candidates.filter((provider) => provider !== \"sql\");\n return specific.length === 1 ? specific : candidates;\n}\n\nfunction providerConnectionScope(): Record<string, string[]> {\n const provider = profileSchema().properties?.provider as\n | JsonSchemaObject\n | undefined;\n const connection = provider?.properties?.connection as\n | JsonSchemaObject\n | undefined;\n const lookup = connection?.[\"x-clicky-lookup\"] as\n | { scope?: { map?: unknown } }\n | undefined;\n const map = lookup?.scope?.map;\n if (!map || typeof map !== \"object\") {\n throw new Error(\n \"profile schema is missing provider.connection x-clicky-lookup.scope.map — the wizard cannot resolve a provider for a connection without it\",\n );\n }\n return map as Record<string, string[]>;\n}\n\nexport function profileConnectionID(value: string): string | null {\n const prefix = \"connection://\";\n if (!value.startsWith(prefix)) return null;\n return value.slice(prefix.length).trim() || null;\n}\n\nexport function profileWizardErrorMessage(\n error: unknown,\n fallback: string,\n): string {\n return error instanceof Error && error.message.trim()\n ? error.message.trim()\n : fallback;\n}\n\n/**\n * A profile says what to fetch either as a raw query or as a structured search\n * specification — never both, which is why this is an either/or rather than a\n * check on `query` alone.\n */\nexport function profileWizardHasQuery(draft: ProfileWizardDraft): boolean {\n return Boolean(\n draft.query?.trim() || draft.provider?.options?.search !== undefined,\n );\n}\n\nexport function profileWizardStepReady(\n step: (typeof profileWizardSteps)[number][\"id\"],\n draft: ProfileWizardDraft,\n discovered: ProfileColumn[],\n): boolean {\n if (step === \"source\") {\n return Boolean(draft.provider?.connection && draft.provider.type);\n }\n if (step === \"query\") {\n return Boolean(profileWizardHasQuery(draft) && discovered.length > 0);\n }\n if (step === \"fields\") {\n return Boolean(draft.profile?.trim() && draft.columns?.length);\n }\n return (\n Boolean(draft.profile?.trim() && draft.provider?.connection) &&\n discovered.length > 0\n );\n}\n"],"names":["profileSchema"],"mappings":"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"}
@@ -210,6 +210,9 @@ export declare function applyVisibleFieldSelection(discovered: ProfileColumn[],
210
210
  export declare const PROFILE_FILTER_KIND_OPTIONS: readonly [{
211
211
  readonly value: "terms";
212
212
  readonly label: "Value list";
213
+ }, {
214
+ readonly value: "match";
215
+ readonly label: "Pattern list";
213
216
  }, {
214
217
  readonly value: "exact";
215
218
  readonly label: "Exact match";
@@ -1 +1 @@
1
- {"version":3,"file":"profileWizardModel.d.ts","sourceRoot":"","sources":["../../../src/profiles/wizard/profileWizardModel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"profileWizardModel.d.ts","sourceRoot":"","sources":["../../../src/profiles/wizard/profileWizardModel.ts"],"names":[],"mappings":"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"}
@@ -93,6 +93,7 @@ function applyVisibleFieldSelection(discovered, configured, visibleNames, select
93
93
  }
94
94
  const PROFILE_FILTER_KIND_OPTIONS = [
95
95
  { value: "terms", label: "Value list" },
96
+ { value: "match", label: "Pattern list" },
96
97
  { value: "exact", label: "Exact match" },
97
98
  { value: "text", label: "Text search" },
98
99
  { value: "range", label: "Numeric range" },
@@ -1 +1 @@
1
- {"version":3,"file":"profileWizardModel.js","sources":["../../../src/profiles/wizard/profileWizardModel.ts"],"sourcesContent":["import type { JsonSchemaObject } from \"../../components/json-schema-form-types\";\nimport { profileSchema } from \"../profileApi\";\nimport type { ProfileRowLimits } from \"../connections/connectionBrowserModel\";\n\n/** How a column is filtered at the backend; every field overrides an inference\n * the server would otherwise make from the column itself. */\nexport type ProfileColumnFilter = {\n /** Backend field the selection applies to; blank infers it from the column. */\n field?: string;\n /** Nested mapping containing the backend field. */\n nested?: string;\n /** Constants that pin the matching nested entry. */\n where?: Record<string, string>;\n /** terms, range, time, boolean, text or none; blank infers it from the type. */\n kind?: string;\n /** Enumerated values, replacing the backend lookup. */\n options?: string[];\n /** Ask the backend for this field's distinct values. */\n lookup?: boolean;\n /** How many of those values the control offers before the rest are typed for. */\n limit?: number;\n /** Allow several values at once. */\n multi?: boolean;\n /** Offer no filter while keeping the column rendered. */\n disabled?: boolean;\n};\n\n/**\n * A patch of T: every key optional, and explicitly settable to `undefined` to\n * clear it.\n *\n * Not Partial<T>. Under `exactOptionalPropertyTypes` an optional key may be\n * absent but not present-and-undefined, and \"clear this field\" — which is what\n * every editor control sends when its input goes empty — is precisely a present\n * `undefined`. The patch appliers drop those keys; the type has to permit them.\n */\nexport type Patch<T> = { [K in keyof T]?: T[K] | undefined };\n\n/**\n * Applies a patch, removing the keys it clears instead of leaving them present\n * and undefined.\n *\n * Spreading a patch would keep them, and these objects are serialized to the\n * server, where a present `field: undefined` is a key to interpret rather than\n * an absent one.\n */\nexport function applyPatch<T extends object>(value: T, patch: Patch<T>): T {\n const next = { ...value };\n for (const [key, entry] of Object.entries(patch)) {\n if (entry === undefined) delete next[key as keyof T];\n else next[key as keyof T] = entry as T[keyof T];\n }\n return next;\n}\n\nexport type ProfileColumn = {\n name: string;\n source?: string;\n label?: string;\n type?: string;\n kind?: string;\n format?: string;\n unit?: string;\n width?: number;\n cel?: string;\n /** Path computing the value, rooted at the row or at `source` when set. */\n jsonpath?: string;\n hidden?: boolean;\n filter?: ProfileColumnFilter;\n [key: string]: unknown;\n};\n\nexport type ProfileProvider = {\n type?: string;\n connection?: string;\n options?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\n/** The parameter types the profile schema accepts. */\nexport type ParamDraftType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"datetime\"\n | \"duration\"\n | \"enum\"\n | \"list\";\n\n/** filter, limit, offset, time-from or time-to; empty behaves as filter. */\nexport type ParamDraftRole =\n | \"filter\"\n | \"limit\"\n | \"offset\"\n | \"time-from\"\n | \"time-to\";\n\nexport type ParamDraft = {\n name?: string | undefined;\n label?: string | undefined;\n type?: ParamDraftType | undefined;\n role?: ParamDraftRole | undefined;\n default?: unknown | undefined;\n options?: string[] | undefined;\n required?: boolean | undefined;\n description?: string | undefined;\n /** Value rewrite; {value} is the supplied value. */\n template?: string | undefined;\n /** Backend field a list parameter filters on. Setting it lets a value be\n * excluded as well as included; it requires an OpenSearch-backed provider. */\n field?: string | undefined;\n};\n\n/** PARAM_TYPES_WITH_OPTIONS are the types whose values come from a fixed set, so\n * the editor offers an options picker for them. */\nexport const PARAM_TYPES_WITH_OPTIONS: ParamDraftType[] = [\"enum\", \"list\"];\n\nexport function paramHasOptions(param: ParamDraft): boolean {\n return (\n param.type !== undefined && PARAM_TYPES_WITH_OPTIONS.includes(param.type)\n );\n}\n\nexport type ProfileWizardDraft = Record<string, unknown> & {\n namespace?: string | undefined;\n profile?: string | undefined;\n /** Overrides the sidebar/picker glyph the provider type would otherwise give. */\n icon?: string | undefined;\n provider?: ProfileProvider | undefined;\n query?: string | undefined;\n columns?: ProfileColumn[] | undefined;\n /** The inputs a run binds — by name in the query, the provider options or the\n * connection. The query workspace previews against their defaults. */\n params?: ParamDraft[] | undefined;\n /** The row caps this profile sets for itself; unset ones take their default. */\n limits?: ProfileRowLimits | undefined;\n};\n\n/**\n * A profile that caps nothing carries no block at all, so the defaults are what\n * it inherits rather than what it froze at the moment it was edited. Both draft\n * hosts write the caps through this, so neither can leave an empty map behind.\n */\nexport function withProfileLimits<T extends ProfileWizardDraft>(\n draft: T,\n limits: ProfileRowLimits | undefined,\n): T {\n const next = { ...draft };\n if (limits) next.limits = limits;\n else delete next.limits;\n return next;\n}\n\nexport type ProfileFieldFilter = {\n query: string;\n type: string;\n selection: \"all\" | \"selected\" | \"unselected\";\n};\n\nexport const PROFILE_COLUMN_FORMAT_OPTIONS = [\n { value: \"date\", label: \"Date/time\" },\n { value: \"float\", label: \"Number\" },\n { value: \"duration\", label: \"Duration\" },\n { value: \"bytes\", label: \"Bytes\" },\n { value: \"currency\", label: \"Currency\" },\n] as const;\n\nexport const PROFILE_COLUMN_UNIT_OPTIONS = [\n { value: \"none\", label: \"Compact count\" },\n { value: \"short\", label: \"Short number\" },\n { value: \"percent\", label: \"Percent (0-100)\" },\n { value: \"percentunit\", label: \"Percent (0-1)\" },\n { value: \"bytes\", label: \"Bytes (IEC)\" },\n { value: \"decbytes\", label: \"Bytes (SI)\" },\n { value: \"Bps\", label: \"Bytes/sec\" },\n { value: \"binBps\", label: \"Binary bytes/sec\" },\n { value: \"ms\", label: \"Milliseconds\" },\n { value: \"s\", label: \"Seconds\" },\n] as const;\n\nexport const profileWizardSteps = [\n { id: \"source\", label: \"Choose source\", description: \"Connection\" },\n { id: \"query\", label: \"Explore & sample\", description: \"Query\" },\n { id: \"fields\", label: \"Name & shape\", description: \"Fields\" },\n { id: \"review\", label: \"Review\", description: \"Save\" },\n] as const;\n\nexport function filterProfileFields(\n fields: ProfileColumn[],\n selectedNames: Set<string>,\n filter: ProfileFieldFilter,\n): ProfileColumn[] {\n const query = filter.query.trim().toLowerCase();\n return fields.filter((field) => {\n const selected = selectedNames.has(field.name);\n if (filter.selection === \"selected\" && !selected) return false;\n if (filter.selection === \"unselected\" && selected) return false;\n if (filter.type && field.type !== filter.type) return false;\n if (!query) return true;\n return `${field.name} ${field.label ?? \"\"}`.toLowerCase().includes(query);\n });\n}\n\n/**\n * Every field the editors can show, each in its configured form. A discovered\n * field is a snapshot of what the source reported — the configured one carries\n * the user's edits, so it is the only version safe to render into a control or\n * to patch on top of.\n *\n * The configuration owns the order, because it is the order the profile renders\n * its columns in and the one the user drags rows into. A discovered field that\n * was never configured (not selected, or dropped from the profile) has no place\n * of its own, so it keeps the one it had: it is anchored just after whichever\n * configured field preceded it in the sample.\n */\nexport function availableProfileFields(\n discovered: ProfileColumn[],\n configured: ProfileColumn[],\n): ProfileColumn[] {\n const configuredByName = new Map(\n configured.map((field) => [field.name, field]),\n );\n const configuredBySource = new Map(\n configured\n .filter((field) => field.source)\n .map((field) => [field.source as string, field]),\n );\n const ordered = [...configured];\n let anchor = 0;\n for (const field of discovered) {\n const match =\n configuredByName.get(field.name) ?? configuredBySource.get(field.name);\n if (match) {\n anchor = ordered.indexOf(match) + 1;\n continue;\n }\n ordered.splice(anchor, 0, field);\n anchor += 1;\n }\n return ordered;\n}\n\n/**\n * Moves the named column onto the target's position, shifting the columns\n * between them — the drop semantics the field grid's row drag needs. Columns\n * are addressed by name because a drag only ever carries the row's identity.\n * A name that is not configured has no position, so the order is returned\n * unchanged rather than guessed at.\n */\nexport function reorderProfileColumns(\n columns: ProfileColumn[],\n sourceName: string,\n targetName: string,\n): ProfileColumn[] {\n const from = columns.findIndex((column) => column.name === sourceName);\n const to = columns.findIndex((column) => column.name === targetName);\n if (from < 0 || to < 0 || from === to) return columns;\n const next = [...columns];\n next.splice(to, 0, ...next.splice(from, 1));\n return next;\n}\n\n/**\n * Selects or deselects the named fields, keeping the configured order intact —\n * a re-selected field returns to where the grid already showed it rather than\n * to the back of the list or to its position in the sample.\n */\nexport function applyVisibleFieldSelection(\n discovered: ProfileColumn[],\n configured: ProfileColumn[],\n visibleNames: Set<string>,\n selected: boolean,\n): ProfileColumn[] {\n const selectedNames = new Set(configured.map((field) => field.name));\n for (const name of visibleNames) {\n if (selected) selectedNames.add(name);\n else selectedNames.delete(name);\n }\n return availableProfileFields(discovered, configured).filter((field) =>\n selectedNames.has(field.name),\n );\n}\n\n/** The control kinds a column filter can render as, with the server's own\n * wording. Mirrors query.ColumnFilterKindValues() and the x-enum-labels the\n * profile schema carries for them. */\nexport const PROFILE_FILTER_KIND_OPTIONS = [\n { value: \"terms\", label: \"Value list\" },\n { value: \"exact\", label: \"Exact match\" },\n { value: \"text\", label: \"Text search\" },\n { value: \"range\", label: \"Numeric range\" },\n { value: \"duration\", label: \"Duration range\" },\n { value: \"date\", label: \"Date range\" },\n { value: \"time\", label: \"Date & time range\" },\n { value: \"boolean\", label: \"Boolean\" },\n { value: \"none\", label: \"Not filterable\" },\n] as const;\n\n/** The server's own default, so an unset limit can be shown for what it does.\n * Mirrors query.DefaultFilterLookupLimit. */\nexport const PROFILE_FILTER_DEFAULT_LIMIT = 50;\n\n/** Mirrors query.MaxFilterLookupLimit — the largest head a lookup will serve. */\nexport const PROFILE_FILTER_MAX_LIMIT = 200;\n\n/**\n * Merges one filter knob into a column's filter block, dropping the block once\n * nothing is left in it.\n *\n * The distinction matters on save: `filter: {}` is a declaration that declares\n * nothing, and the server reads a present-but-empty block differently from an\n * absent one — unchecking the last box has to mean \"infer this again\", not\n * \"override it with silence\".\n */\nexport function patchColumnFilter(\n filter: ProfileColumnFilter | undefined,\n patch: Patch<ProfileColumnFilter>,\n): ProfileColumnFilter | undefined {\n const merged = Object.fromEntries(\n Object.entries({ ...filter, ...patch }).filter(\n ([, value]) => value !== undefined,\n ),\n ) as ProfileColumnFilter;\n return Object.keys(merged).length ? merged : undefined;\n}\n\n/** What the server picks for a column that declares no filter kind. Mirrors\n * columnFilterKindFor; text and date are absent there on purpose, so they are\n * here too. Bytes stays a plain range: a size literal has two bases, so \"5MB\"\n * would mean two different numbers. */\nexport function inferredFilterKind(column: ProfileColumn): string {\n switch (column.type) {\n case \"number\":\n case \"bytes\":\n return \"range\";\n case \"duration\":\n return \"duration\";\n case \"datetime\":\n return \"time\";\n case \"boolean\":\n return \"boolean\";\n case \"uuid\":\n return \"exact\";\n case \"key_value\":\n case \"key_values\":\n case \"json\":\n return \"none\";\n default:\n return \"terms\";\n }\n}\n\nexport function patchProfileField(\n field: ProfileColumn,\n patch: Patch<ProfileColumn>,\n): ProfileColumn {\n return Object.fromEntries(\n Object.entries({ ...field, ...patch }).filter(\n ([, value]) => value !== undefined,\n ),\n ) as ProfileColumn;\n}\n\nexport function renameProfileField(\n field: ProfileColumn,\n name: string,\n): ProfileColumn {\n const source = field.source ?? (field.cel ? undefined : field.name);\n return patchProfileField(field, {\n name,\n source: source === name ? undefined : source,\n });\n}\n\n/**\n * The connection type carried in a lookup option's label.\n *\n * The server renders each option as `\"<name> (<type>)\"`, so the parenthesised\n * suffix is the **connection** type — not the query provider that reads it. The\n * two coincide often enough (`opensearch`, `loki`, `postgres`) that using one as\n * the other looks correct, and they diverge for exactly the cloud and cluster\n * log backends: an `aws` connection is read by `cloudwatch`, `kubernetes` by\n * `k8s`, `azure` by `azureloganalytics`. Resolving one to the other is\n * providerTypesForConnectionType's job, and it uses the schema rather than a\n * second copy of that mapping.\n */\nexport function connectionTypeFromLabel(label: string): string | null {\n const match = label.match(/\\(([^()]+)\\)\\s*$/);\n return match?.[1]?.trim() || null;\n}\n\n/**\n * The query providers the profile schema says can read this connection type,\n * most specific first, or empty when nothing can read it.\n *\n * The authority is the schema the server already ships: the connection field's\n * lookup scope carries provider → connection types, so inverting it here keeps\n * one mapping rather than a client-side duplicate that can drift.\n */\nexport function providerTypesForConnectionType(\n connectionType: string,\n): string[] {\n const scope = providerConnectionScope();\n const candidates = Object.keys(scope)\n .filter((provider) => scope[provider]?.includes(connectionType))\n .sort();\n if (candidates.length <= 1) return candidates;\n // A provider keyed exactly as the connection type is the one named for it.\n const exact = candidates.find((provider) => provider === connectionType);\n if (exact) return [exact];\n // Otherwise drop the dialect-agnostic umbrella, so `sql_server` resolves to\n // `sqlserver` instead of tying with the generic `sql`. A genuine tie —\n // `google_cloud`, read by both `gcpcloudlogging` and `bigquery` — survives as\n // a list for the caller to disambiguate.\n const specific = candidates.filter((provider) => provider !== \"sql\");\n return specific.length === 1 ? specific : candidates;\n}\n\nfunction providerConnectionScope(): Record<string, string[]> {\n const provider = profileSchema().properties?.provider as\n | JsonSchemaObject\n | undefined;\n const connection = provider?.properties?.connection as\n | JsonSchemaObject\n | undefined;\n const lookup = connection?.[\"x-clicky-lookup\"] as\n | { scope?: { map?: unknown } }\n | undefined;\n const map = lookup?.scope?.map;\n if (!map || typeof map !== \"object\") {\n throw new Error(\n \"profile schema is missing provider.connection x-clicky-lookup.scope.map — the wizard cannot resolve a provider for a connection without it\",\n );\n }\n return map as Record<string, string[]>;\n}\n\nexport function profileConnectionID(value: string): string | null {\n const prefix = \"connection://\";\n if (!value.startsWith(prefix)) return null;\n return value.slice(prefix.length).trim() || null;\n}\n\nexport function profileWizardErrorMessage(\n error: unknown,\n fallback: string,\n): string {\n return error instanceof Error && error.message.trim()\n ? error.message.trim()\n : fallback;\n}\n\n/**\n * A profile says what to fetch either as a raw query or as a structured search\n * specification — never both, which is why this is an either/or rather than a\n * check on `query` alone.\n */\nexport function profileWizardHasQuery(draft: ProfileWizardDraft): boolean {\n return Boolean(\n draft.query?.trim() || draft.provider?.options?.search !== undefined,\n );\n}\n\nexport function profileWizardStepReady(\n step: (typeof profileWizardSteps)[number][\"id\"],\n draft: ProfileWizardDraft,\n discovered: ProfileColumn[],\n): boolean {\n if (step === \"source\") {\n return Boolean(draft.provider?.connection && draft.provider.type);\n }\n if (step === \"query\") {\n return Boolean(profileWizardHasQuery(draft) && discovered.length > 0);\n }\n if (step === \"fields\") {\n return Boolean(draft.profile?.trim() && draft.columns?.length);\n }\n return (\n Boolean(draft.profile?.trim() && draft.provider?.connection) &&\n discovered.length > 0\n );\n}\n"],"names":[],"mappings":";AA8CO,SAAS,WAA6B,OAAU,OAAoB;AACzE,QAAM,OAAO,EAAE,GAAG,MAAA;AAClB,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,UAAU,OAAW,QAAO,KAAK,GAAc;AAAA,QAC9C,MAAK,GAAc,IAAI;AAAA,EAC9B;AACA,SAAO;AACT;AA+DO,MAAM,2BAA6C,CAAC,QAAQ,MAAM;AAElE,SAAS,gBAAgB,OAA4B;AAC1D,SACE,MAAM,SAAS,UAAa,yBAAyB,SAAS,MAAM,IAAI;AAE5E;AAsBO,SAAS,kBACd,OACA,QACG;AACH,QAAM,OAAO,EAAE,GAAG,MAAA;AAClB,MAAI,aAAa,SAAS;AAAA,cACd,KAAK;AACjB,SAAO;AACT;AAQO,MAAM,gCAAgC;AAAA,EAC3C,EAAE,OAAO,QAAQ,OAAO,YAAA;AAAA,EACxB,EAAE,OAAO,SAAS,OAAO,SAAA;AAAA,EACzB,EAAE,OAAO,YAAY,OAAO,WAAA;AAAA,EAC5B,EAAE,OAAO,SAAS,OAAO,QAAA;AAAA,EACzB,EAAE,OAAO,YAAY,OAAO,WAAA;AAC9B;AAEO,MAAM,8BAA8B;AAAA,EACzC,EAAE,OAAO,QAAQ,OAAO,gBAAA;AAAA,EACxB,EAAE,OAAO,SAAS,OAAO,eAAA;AAAA,EACzB,EAAE,OAAO,WAAW,OAAO,kBAAA;AAAA,EAC3B,EAAE,OAAO,eAAe,OAAO,gBAAA;AAAA,EAC/B,EAAE,OAAO,SAAS,OAAO,cAAA;AAAA,EACzB,EAAE,OAAO,YAAY,OAAO,aAAA;AAAA,EAC5B,EAAE,OAAO,OAAO,OAAO,YAAA;AAAA,EACvB,EAAE,OAAO,UAAU,OAAO,mBAAA;AAAA,EAC1B,EAAE,OAAO,MAAM,OAAO,eAAA;AAAA,EACtB,EAAE,OAAO,KAAK,OAAO,UAAA;AACvB;AAEO,MAAM,qBAAqB;AAAA,EAChC,EAAE,IAAI,UAAU,OAAO,iBAAiB,aAAa,aAAA;AAAA,EACrD,EAAE,IAAI,SAAS,OAAO,oBAAoB,aAAa,QAAA;AAAA,EACvD,EAAE,IAAI,UAAU,OAAO,gBAAgB,aAAa,SAAA;AAAA,EACpD,EAAE,IAAI,UAAU,OAAO,UAAU,aAAa,OAAA;AAChD;AAEO,SAAS,oBACd,QACA,eACA,QACiB;AACjB,QAAM,QAAQ,OAAO,MAAM,KAAA,EAAO,YAAA;AAClC,SAAO,OAAO,OAAO,CAAC,UAAU;AAC9B,UAAM,WAAW,cAAc,IAAI,MAAM,IAAI;AAC7C,QAAI,OAAO,cAAc,cAAc,CAAC,SAAU,QAAO;AACzD,QAAI,OAAO,cAAc,gBAAgB,SAAU,QAAO;AAC1D,QAAI,OAAO,QAAQ,MAAM,SAAS,OAAO,KAAM,QAAO;AACtD,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,GAAG,MAAM,IAAI,IAAI,MAAM,SAAS,EAAE,GAAG,cAAc,SAAS,KAAK;AAAA,EAC1E,CAAC;AACH;AAcO,SAAS,uBACd,YACA,YACiB;AACjB,QAAM,mBAAmB,IAAI;AAAA,IAC3B,WAAW,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC;AAAA,EAAA;AAE/C,QAAM,qBAAqB,IAAI;AAAA,IAC7B,WACG,OAAO,CAAC,UAAU,MAAM,MAAM,EAC9B,IAAI,CAAC,UAAU,CAAC,MAAM,QAAkB,KAAK,CAAC;AAAA,EAAA;AAEnD,QAAM,UAAU,CAAC,GAAG,UAAU;AAC9B,MAAI,SAAS;AACb,aAAW,SAAS,YAAY;AAC9B,UAAM,QACJ,iBAAiB,IAAI,MAAM,IAAI,KAAK,mBAAmB,IAAI,MAAM,IAAI;AACvE,QAAI,OAAO;AACT,eAAS,QAAQ,QAAQ,KAAK,IAAI;AAClC;AAAA,IACF;AACA,YAAQ,OAAO,QAAQ,GAAG,KAAK;AAC/B,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AASO,SAAS,sBACd,SACA,YACA,YACiB;AACjB,QAAM,OAAO,QAAQ,UAAU,CAAC,WAAW,OAAO,SAAS,UAAU;AACrE,QAAM,KAAK,QAAQ,UAAU,CAAC,WAAW,OAAO,SAAS,UAAU;AACnE,MAAI,OAAO,KAAK,KAAK,KAAK,SAAS,GAAI,QAAO;AAC9C,QAAM,OAAO,CAAC,GAAG,OAAO;AACxB,OAAK,OAAO,IAAI,GAAG,GAAG,KAAK,OAAO,MAAM,CAAC,CAAC;AAC1C,SAAO;AACT;AAOO,SAAS,2BACd,YACA,YACA,cACA,UACiB;AACjB,QAAM,gBAAgB,IAAI,IAAI,WAAW,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AACnE,aAAW,QAAQ,cAAc;AAC/B,QAAI,SAAU,eAAc,IAAI,IAAI;AAAA,QAC/B,eAAc,OAAO,IAAI;AAAA,EAChC;AACA,SAAO,uBAAuB,YAAY,UAAU,EAAE;AAAA,IAAO,CAAC,UAC5D,cAAc,IAAI,MAAM,IAAI;AAAA,EAAA;AAEhC;AAKO,MAAM,8BAA8B;AAAA,EACzC,EAAE,OAAO,SAAS,OAAO,aAAA;AAAA,EACzB,EAAE,OAAO,SAAS,OAAO,cAAA;AAAA,EACzB,EAAE,OAAO,QAAQ,OAAO,cAAA;AAAA,EACxB,EAAE,OAAO,SAAS,OAAO,gBAAA;AAAA,EACzB,EAAE,OAAO,YAAY,OAAO,iBAAA;AAAA,EAC5B,EAAE,OAAO,QAAQ,OAAO,aAAA;AAAA,EACxB,EAAE,OAAO,QAAQ,OAAO,oBAAA;AAAA,EACxB,EAAE,OAAO,WAAW,OAAO,UAAA;AAAA,EAC3B,EAAE,OAAO,QAAQ,OAAO,iBAAA;AAC1B;AAIO,MAAM,+BAA+B;AAGrC,MAAM,2BAA2B;AAWjC,SAAS,kBACd,QACA,OACiC;AACjC,QAAM,SAAS,OAAO;AAAA,IACpB,OAAO,QAAQ,EAAE,GAAG,QAAQ,GAAG,MAAA,CAAO,EAAE;AAAA,MACtC,CAAC,CAAA,EAAG,KAAK,MAAM,UAAU;AAAA,IAAA;AAAA,EAC3B;AAEF,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,SAAS;AAC/C;AAMO,SAAS,mBAAmB,QAA+B;AAChE,UAAQ,OAAO,MAAA;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAEO,SAAS,kBACd,OACA,OACe;AACf,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,EAAE,GAAG,OAAO,GAAG,MAAA,CAAO,EAAE;AAAA,MACrC,CAAC,CAAA,EAAG,KAAK,MAAM,UAAU;AAAA,IAAA;AAAA,EAC3B;AAEJ;AAEO,SAAS,mBACd,OACA,MACe;AACf,QAAM,SAAS,MAAM,WAAW,MAAM,MAAM,SAAY,MAAM;AAC9D,SAAO,kBAAkB,OAAO;AAAA,IAC9B;AAAA,IACA,QAAQ,WAAW,OAAO,SAAY;AAAA,EAAA,CACvC;AACH;AAcO,SAAS,wBAAwB,OAA8B;;AACpE,QAAM,QAAQ,MAAM,MAAM,kBAAkB;AAC5C,WAAO,oCAAQ,OAAR,mBAAY,WAAU;AAC/B;AAUO,SAAS,+BACd,gBACU;AACV,QAAM,QAAQ,wBAAA;AACd,QAAM,aAAa,OAAO,KAAK,KAAK,EACjC,OAAO,CAAC,aAAA;;AAAa,uBAAM,QAAQ,MAAd,mBAAiB,SAAS;AAAA,GAAe,EAC9D,KAAA;AACH,MAAI,WAAW,UAAU,EAAG,QAAO;AAEnC,QAAM,QAAQ,WAAW,KAAK,CAAC,aAAa,aAAa,cAAc;AACvE,MAAI,MAAO,QAAO,CAAC,KAAK;AAKxB,QAAM,WAAW,WAAW,OAAO,CAAC,aAAa,aAAa,KAAK;AACnE,SAAO,SAAS,WAAW,IAAI,WAAW;AAC5C;AAEA,SAAS,0BAAoD;;AAC3D,QAAM,YAAW,qBAAgB,eAAhB,mBAA4B;AAG7C,QAAM,cAAa,0CAAU,eAAV,mBAAsB;AAGzC,QAAM,SAAS,yCAAa;AAG5B,QAAM,OAAM,sCAAQ,UAAR,mBAAe;AAC3B,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAAA,EAEJ;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,OAA8B;AAChE,QAAM,SAAS;AACf,MAAI,CAAC,MAAM,WAAW,MAAM,EAAG,QAAO;AACtC,SAAO,MAAM,MAAM,OAAO,MAAM,EAAE,UAAU;AAC9C;AAEO,SAAS,0BACd,OACA,UACQ;AACR,SAAO,iBAAiB,SAAS,MAAM,QAAQ,SAC3C,MAAM,QAAQ,KAAA,IACd;AACN;AAOO,SAAS,sBAAsB,OAAoC;;AACxE,SAAO;AAAA,MACL,WAAM,UAAN,mBAAa,aAAU,iBAAM,aAAN,mBAAgB,YAAhB,mBAAyB,YAAW;AAAA,EAAA;AAE/D;AAEO,SAAS,uBACd,MACA,OACA,YACS;;AACT,MAAI,SAAS,UAAU;AACrB,WAAO,UAAQ,WAAM,aAAN,mBAAgB,eAAc,MAAM,SAAS,IAAI;AAAA,EAClE;AACA,MAAI,SAAS,SAAS;AACpB,WAAO,QAAQ,sBAAsB,KAAK,KAAK,WAAW,SAAS,CAAC;AAAA,EACtE;AACA,MAAI,SAAS,UAAU;AACrB,WAAO,UAAQ,WAAM,YAAN,mBAAe,aAAU,WAAM,YAAN,mBAAe,OAAM;AAAA,EAC/D;AACA,SACE,UAAQ,WAAM,YAAN,mBAAe,aAAU,WAAM,aAAN,mBAAgB,WAAU,KAC3D,WAAW,SAAS;AAExB;"}
1
+ {"version":3,"file":"profileWizardModel.js","sources":["../../../src/profiles/wizard/profileWizardModel.ts"],"sourcesContent":["import type { JsonSchemaObject } from \"../../components/json-schema-form-types\";\nimport { profileSchema } from \"../profileApi\";\nimport type { ProfileRowLimits } from \"../connections/connectionBrowserModel\";\n\n/** How a column is filtered at the backend; every field overrides an inference\n * the server would otherwise make from the column itself. */\nexport type ProfileColumnFilter = {\n /** Backend field the selection applies to; blank infers it from the column. */\n field?: string;\n /** Nested mapping containing the backend field. */\n nested?: string;\n /** Constants that pin the matching nested entry. */\n where?: Record<string, string>;\n /** terms, range, time, boolean, text or none; blank infers it from the type. */\n kind?: string;\n /** Enumerated values, replacing the backend lookup. */\n options?: string[];\n /** Ask the backend for this field's distinct values. */\n lookup?: boolean;\n /** How many of those values the control offers before the rest are typed for. */\n limit?: number;\n /** Allow several values at once. */\n multi?: boolean;\n /** Offer no filter while keeping the column rendered. */\n disabled?: boolean;\n};\n\n/**\n * A patch of T: every key optional, and explicitly settable to `undefined` to\n * clear it.\n *\n * Not Partial<T>. Under `exactOptionalPropertyTypes` an optional key may be\n * absent but not present-and-undefined, and \"clear this field\" — which is what\n * every editor control sends when its input goes empty — is precisely a present\n * `undefined`. The patch appliers drop those keys; the type has to permit them.\n */\nexport type Patch<T> = { [K in keyof T]?: T[K] | undefined };\n\n/**\n * Applies a patch, removing the keys it clears instead of leaving them present\n * and undefined.\n *\n * Spreading a patch would keep them, and these objects are serialized to the\n * server, where a present `field: undefined` is a key to interpret rather than\n * an absent one.\n */\nexport function applyPatch<T extends object>(value: T, patch: Patch<T>): T {\n const next = { ...value };\n for (const [key, entry] of Object.entries(patch)) {\n if (entry === undefined) delete next[key as keyof T];\n else next[key as keyof T] = entry as T[keyof T];\n }\n return next;\n}\n\nexport type ProfileColumn = {\n name: string;\n source?: string;\n label?: string;\n type?: string;\n kind?: string;\n format?: string;\n unit?: string;\n width?: number;\n cel?: string;\n /** Path computing the value, rooted at the row or at `source` when set. */\n jsonpath?: string;\n hidden?: boolean;\n filter?: ProfileColumnFilter;\n [key: string]: unknown;\n};\n\nexport type ProfileProvider = {\n type?: string;\n connection?: string;\n options?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\n/** The parameter types the profile schema accepts. */\nexport type ParamDraftType =\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"datetime\"\n | \"duration\"\n | \"enum\"\n | \"list\";\n\n/** filter, limit, offset, time-from or time-to; empty behaves as filter. */\nexport type ParamDraftRole =\n | \"filter\"\n | \"limit\"\n | \"offset\"\n | \"time-from\"\n | \"time-to\";\n\nexport type ParamDraft = {\n name?: string | undefined;\n label?: string | undefined;\n type?: ParamDraftType | undefined;\n role?: ParamDraftRole | undefined;\n default?: unknown | undefined;\n options?: string[] | undefined;\n required?: boolean | undefined;\n description?: string | undefined;\n /** Value rewrite; {value} is the supplied value. */\n template?: string | undefined;\n /** Backend field a list parameter filters on. Setting it lets a value be\n * excluded as well as included; it requires an OpenSearch-backed provider. */\n field?: string | undefined;\n};\n\n/** PARAM_TYPES_WITH_OPTIONS are the types whose values come from a fixed set, so\n * the editor offers an options picker for them. */\nexport const PARAM_TYPES_WITH_OPTIONS: ParamDraftType[] = [\"enum\", \"list\"];\n\nexport function paramHasOptions(param: ParamDraft): boolean {\n return (\n param.type !== undefined && PARAM_TYPES_WITH_OPTIONS.includes(param.type)\n );\n}\n\nexport type ProfileWizardDraft = Record<string, unknown> & {\n namespace?: string | undefined;\n profile?: string | undefined;\n /** Overrides the sidebar/picker glyph the provider type would otherwise give. */\n icon?: string | undefined;\n provider?: ProfileProvider | undefined;\n query?: string | undefined;\n columns?: ProfileColumn[] | undefined;\n /** The inputs a run binds — by name in the query, the provider options or the\n * connection. The query workspace previews against their defaults. */\n params?: ParamDraft[] | undefined;\n /** The row caps this profile sets for itself; unset ones take their default. */\n limits?: ProfileRowLimits | undefined;\n};\n\n/**\n * A profile that caps nothing carries no block at all, so the defaults are what\n * it inherits rather than what it froze at the moment it was edited. Both draft\n * hosts write the caps through this, so neither can leave an empty map behind.\n */\nexport function withProfileLimits<T extends ProfileWizardDraft>(\n draft: T,\n limits: ProfileRowLimits | undefined,\n): T {\n const next = { ...draft };\n if (limits) next.limits = limits;\n else delete next.limits;\n return next;\n}\n\nexport type ProfileFieldFilter = {\n query: string;\n type: string;\n selection: \"all\" | \"selected\" | \"unselected\";\n};\n\nexport const PROFILE_COLUMN_FORMAT_OPTIONS = [\n { value: \"date\", label: \"Date/time\" },\n { value: \"float\", label: \"Number\" },\n { value: \"duration\", label: \"Duration\" },\n { value: \"bytes\", label: \"Bytes\" },\n { value: \"currency\", label: \"Currency\" },\n] as const;\n\nexport const PROFILE_COLUMN_UNIT_OPTIONS = [\n { value: \"none\", label: \"Compact count\" },\n { value: \"short\", label: \"Short number\" },\n { value: \"percent\", label: \"Percent (0-100)\" },\n { value: \"percentunit\", label: \"Percent (0-1)\" },\n { value: \"bytes\", label: \"Bytes (IEC)\" },\n { value: \"decbytes\", label: \"Bytes (SI)\" },\n { value: \"Bps\", label: \"Bytes/sec\" },\n { value: \"binBps\", label: \"Binary bytes/sec\" },\n { value: \"ms\", label: \"Milliseconds\" },\n { value: \"s\", label: \"Seconds\" },\n] as const;\n\nexport const profileWizardSteps = [\n { id: \"source\", label: \"Choose source\", description: \"Connection\" },\n { id: \"query\", label: \"Explore & sample\", description: \"Query\" },\n { id: \"fields\", label: \"Name & shape\", description: \"Fields\" },\n { id: \"review\", label: \"Review\", description: \"Save\" },\n] as const;\n\nexport function filterProfileFields(\n fields: ProfileColumn[],\n selectedNames: Set<string>,\n filter: ProfileFieldFilter,\n): ProfileColumn[] {\n const query = filter.query.trim().toLowerCase();\n return fields.filter((field) => {\n const selected = selectedNames.has(field.name);\n if (filter.selection === \"selected\" && !selected) return false;\n if (filter.selection === \"unselected\" && selected) return false;\n if (filter.type && field.type !== filter.type) return false;\n if (!query) return true;\n return `${field.name} ${field.label ?? \"\"}`.toLowerCase().includes(query);\n });\n}\n\n/**\n * Every field the editors can show, each in its configured form. A discovered\n * field is a snapshot of what the source reported — the configured one carries\n * the user's edits, so it is the only version safe to render into a control or\n * to patch on top of.\n *\n * The configuration owns the order, because it is the order the profile renders\n * its columns in and the one the user drags rows into. A discovered field that\n * was never configured (not selected, or dropped from the profile) has no place\n * of its own, so it keeps the one it had: it is anchored just after whichever\n * configured field preceded it in the sample.\n */\nexport function availableProfileFields(\n discovered: ProfileColumn[],\n configured: ProfileColumn[],\n): ProfileColumn[] {\n const configuredByName = new Map(\n configured.map((field) => [field.name, field]),\n );\n const configuredBySource = new Map(\n configured\n .filter((field) => field.source)\n .map((field) => [field.source as string, field]),\n );\n const ordered = [...configured];\n let anchor = 0;\n for (const field of discovered) {\n const match =\n configuredByName.get(field.name) ?? configuredBySource.get(field.name);\n if (match) {\n anchor = ordered.indexOf(match) + 1;\n continue;\n }\n ordered.splice(anchor, 0, field);\n anchor += 1;\n }\n return ordered;\n}\n\n/**\n * Moves the named column onto the target's position, shifting the columns\n * between them — the drop semantics the field grid's row drag needs. Columns\n * are addressed by name because a drag only ever carries the row's identity.\n * A name that is not configured has no position, so the order is returned\n * unchanged rather than guessed at.\n */\nexport function reorderProfileColumns(\n columns: ProfileColumn[],\n sourceName: string,\n targetName: string,\n): ProfileColumn[] {\n const from = columns.findIndex((column) => column.name === sourceName);\n const to = columns.findIndex((column) => column.name === targetName);\n if (from < 0 || to < 0 || from === to) return columns;\n const next = [...columns];\n next.splice(to, 0, ...next.splice(from, 1));\n return next;\n}\n\n/**\n * Selects or deselects the named fields, keeping the configured order intact —\n * a re-selected field returns to where the grid already showed it rather than\n * to the back of the list or to its position in the sample.\n */\nexport function applyVisibleFieldSelection(\n discovered: ProfileColumn[],\n configured: ProfileColumn[],\n visibleNames: Set<string>,\n selected: boolean,\n): ProfileColumn[] {\n const selectedNames = new Set(configured.map((field) => field.name));\n for (const name of visibleNames) {\n if (selected) selectedNames.add(name);\n else selectedNames.delete(name);\n }\n return availableProfileFields(discovered, configured).filter((field) =>\n selectedNames.has(field.name),\n );\n}\n\n/** The control kinds a column filter can render as, with the server's own\n * wording. Mirrors query.ColumnFilterKindValues() and the x-enum-labels the\n * profile schema carries for them. */\nexport const PROFILE_FILTER_KIND_OPTIONS = [\n { value: \"terms\", label: \"Value list\" },\n { value: \"match\", label: \"Pattern list\" },\n { value: \"exact\", label: \"Exact match\" },\n { value: \"text\", label: \"Text search\" },\n { value: \"range\", label: \"Numeric range\" },\n { value: \"duration\", label: \"Duration range\" },\n { value: \"date\", label: \"Date range\" },\n { value: \"time\", label: \"Date & time range\" },\n { value: \"boolean\", label: \"Boolean\" },\n { value: \"none\", label: \"Not filterable\" },\n] as const;\n\n/** The server's own default, so an unset limit can be shown for what it does.\n * Mirrors query.DefaultFilterLookupLimit. */\nexport const PROFILE_FILTER_DEFAULT_LIMIT = 50;\n\n/** Mirrors query.MaxFilterLookupLimit — the largest head a lookup will serve. */\nexport const PROFILE_FILTER_MAX_LIMIT = 200;\n\n/**\n * Merges one filter knob into a column's filter block, dropping the block once\n * nothing is left in it.\n *\n * The distinction matters on save: `filter: {}` is a declaration that declares\n * nothing, and the server reads a present-but-empty block differently from an\n * absent one — unchecking the last box has to mean \"infer this again\", not\n * \"override it with silence\".\n */\nexport function patchColumnFilter(\n filter: ProfileColumnFilter | undefined,\n patch: Patch<ProfileColumnFilter>,\n): ProfileColumnFilter | undefined {\n const merged = Object.fromEntries(\n Object.entries({ ...filter, ...patch }).filter(\n ([, value]) => value !== undefined,\n ),\n ) as ProfileColumnFilter;\n return Object.keys(merged).length ? merged : undefined;\n}\n\n/** What the server picks for a column that declares no filter kind. Mirrors\n * columnFilterKindFor; text and date are absent there on purpose, so they are\n * here too. Bytes stays a plain range: a size literal has two bases, so \"5MB\"\n * would mean two different numbers. */\nexport function inferredFilterKind(column: ProfileColumn): string {\n switch (column.type) {\n case \"number\":\n case \"bytes\":\n return \"range\";\n case \"duration\":\n return \"duration\";\n case \"datetime\":\n return \"time\";\n case \"boolean\":\n return \"boolean\";\n case \"uuid\":\n return \"exact\";\n case \"key_value\":\n case \"key_values\":\n case \"json\":\n return \"none\";\n default:\n return \"terms\";\n }\n}\n\nexport function patchProfileField(\n field: ProfileColumn,\n patch: Patch<ProfileColumn>,\n): ProfileColumn {\n return Object.fromEntries(\n Object.entries({ ...field, ...patch }).filter(\n ([, value]) => value !== undefined,\n ),\n ) as ProfileColumn;\n}\n\nexport function renameProfileField(\n field: ProfileColumn,\n name: string,\n): ProfileColumn {\n const source = field.source ?? (field.cel ? undefined : field.name);\n return patchProfileField(field, {\n name,\n source: source === name ? undefined : source,\n });\n}\n\n/**\n * The connection type carried in a lookup option's label.\n *\n * The server renders each option as `\"<name> (<type>)\"`, so the parenthesised\n * suffix is the **connection** type — not the query provider that reads it. The\n * two coincide often enough (`opensearch`, `loki`, `postgres`) that using one as\n * the other looks correct, and they diverge for exactly the cloud and cluster\n * log backends: an `aws` connection is read by `cloudwatch`, `kubernetes` by\n * `k8s`, `azure` by `azureloganalytics`. Resolving one to the other is\n * providerTypesForConnectionType's job, and it uses the schema rather than a\n * second copy of that mapping.\n */\nexport function connectionTypeFromLabel(label: string): string | null {\n const match = label.match(/\\(([^()]+)\\)\\s*$/);\n return match?.[1]?.trim() || null;\n}\n\n/**\n * The query providers the profile schema says can read this connection type,\n * most specific first, or empty when nothing can read it.\n *\n * The authority is the schema the server already ships: the connection field's\n * lookup scope carries provider → connection types, so inverting it here keeps\n * one mapping rather than a client-side duplicate that can drift.\n */\nexport function providerTypesForConnectionType(\n connectionType: string,\n): string[] {\n const scope = providerConnectionScope();\n const candidates = Object.keys(scope)\n .filter((provider) => scope[provider]?.includes(connectionType))\n .sort();\n if (candidates.length <= 1) return candidates;\n // A provider keyed exactly as the connection type is the one named for it.\n const exact = candidates.find((provider) => provider === connectionType);\n if (exact) return [exact];\n // Otherwise drop the dialect-agnostic umbrella, so `sql_server` resolves to\n // `sqlserver` instead of tying with the generic `sql`. A genuine tie —\n // `google_cloud`, read by both `gcpcloudlogging` and `bigquery` — survives as\n // a list for the caller to disambiguate.\n const specific = candidates.filter((provider) => provider !== \"sql\");\n return specific.length === 1 ? specific : candidates;\n}\n\nfunction providerConnectionScope(): Record<string, string[]> {\n const provider = profileSchema().properties?.provider as\n | JsonSchemaObject\n | undefined;\n const connection = provider?.properties?.connection as\n | JsonSchemaObject\n | undefined;\n const lookup = connection?.[\"x-clicky-lookup\"] as\n | { scope?: { map?: unknown } }\n | undefined;\n const map = lookup?.scope?.map;\n if (!map || typeof map !== \"object\") {\n throw new Error(\n \"profile schema is missing provider.connection x-clicky-lookup.scope.map — the wizard cannot resolve a provider for a connection without it\",\n );\n }\n return map as Record<string, string[]>;\n}\n\nexport function profileConnectionID(value: string): string | null {\n const prefix = \"connection://\";\n if (!value.startsWith(prefix)) return null;\n return value.slice(prefix.length).trim() || null;\n}\n\nexport function profileWizardErrorMessage(\n error: unknown,\n fallback: string,\n): string {\n return error instanceof Error && error.message.trim()\n ? error.message.trim()\n : fallback;\n}\n\n/**\n * A profile says what to fetch either as a raw query or as a structured search\n * specification — never both, which is why this is an either/or rather than a\n * check on `query` alone.\n */\nexport function profileWizardHasQuery(draft: ProfileWizardDraft): boolean {\n return Boolean(\n draft.query?.trim() || draft.provider?.options?.search !== undefined,\n );\n}\n\nexport function profileWizardStepReady(\n step: (typeof profileWizardSteps)[number][\"id\"],\n draft: ProfileWizardDraft,\n discovered: ProfileColumn[],\n): boolean {\n if (step === \"source\") {\n return Boolean(draft.provider?.connection && draft.provider.type);\n }\n if (step === \"query\") {\n return Boolean(profileWizardHasQuery(draft) && discovered.length > 0);\n }\n if (step === \"fields\") {\n return Boolean(draft.profile?.trim() && draft.columns?.length);\n }\n return (\n Boolean(draft.profile?.trim() && draft.provider?.connection) &&\n discovered.length > 0\n );\n}\n"],"names":[],"mappings":"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"}
@@ -51,6 +51,7 @@ function OperationCatalog({
51
51
  initialValues = EMPTY_INITIAL_VALUES,
52
52
  urlState,
53
53
  paginationMode,
54
+ refreshIntervalMs,
54
55
  hiddenColumns,
55
56
  rowDetail,
56
57
  cellRenderers,
@@ -144,7 +145,8 @@ function OperationCatalog({
144
145
  endpoint: listEndpoint,
145
146
  parameters: listParameters,
146
147
  filters: effectiveFilters,
147
- ...paginationMode ? { paginationMode } : {}
148
+ ...paginationMode ? { paginationMode } : {},
149
+ ...refreshIntervalMs !== void 0 ? { refreshIntervalMs } : {}
148
150
  });
149
151
  const { followEnabled, sessionOperation, followMissing, tail } = useOperationCatalogFollow.useOperationCatalogFollow({
150
152
  follow,
@@ -1 +1 @@
1
- {"version":3,"file":"OperationCatalog.cjs","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { useOperationPages } from \"./useOperationPages\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceCollectionActions,\n findSurfaceDetailOperation,\n findSurfaceListOperation,\n getOperationClickyMeta,\n} from \"./clickyMetadata\";\nimport type {\n ClickyCommandRuntime,\n ClickyDownloadOptions,\n ClickyRemoteFormat,\n ClickyRow,\n ClickyRowDetailRenderer,\n ClickyCellRenderers,\n ClickyRowCardRenderer,\n ClickyRowDetailTitle,\n} from \"../data/Clicky\";\nimport type { ModalSize } from \"../overlay/Modal\";\nimport type { CellFilterChange } from \"../data/cells/CellFilterActions\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { OperationCatalogActions } from \"./OperationCatalogActions\";\nimport { OperationsApiClientError } from \"./apiClient\";\nimport { renderOperationError } from \"./operationErrorDiagnostics\";\nimport {\n OperationResultView,\n type OperationResultFilterConfig,\n type ResultRenderer,\n} from \"./OperationResultView\";\nimport { type FormActionsRenderer } from \"./SchemaActionForm\";\nimport {\n applyFilterExtensions,\n type FilterExtension,\n} from \"../components/filter-bar-utils\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\n dataTablePaginationFromForm,\n packLookupParameterValues,\n parametersToFormConfig,\n type ParameterFormOptions,\n} from \"./formMetadata\";\nimport { cursorParameterName, useCursorStaleRecovery } from \"./cursorStale\";\nimport { useOperationFilterSearch } from \"./operationFilterSearch\";\nimport {\n parseMultiFilterValue,\n serializeMultiFilterValue,\n} from \"../data/data-table-filter-values\";\nimport { Loading } from \"../components/loading\";\nimport { getClickyRowId } from \"./rowNavigation\";\nimport { useOperationCatalogFilterState } from \"./operationCatalogFilterState\";\nimport {\n followRowOrder,\n mergeFollowRowsIntoResponse,\n partitionFollowRows,\n} from \"./operationCatalogFollow\";\nimport { OperationCatalogFollowStatus } from \"./OperationCatalogFollowStatus\";\nimport { useOperationCatalogFollow, type OperationCatalogFollowOption } from \"./useOperationCatalogFollow\";\nimport type { LogTailError } from \"../hooks/use-log-tail\";\nimport {\n markUnavailableRows,\n operationLookupQuery,\n pickerTableRowSelection,\n type OperationCatalogRowSelection,\n} from \"./operationCatalogRowSelection\";\n\nexport type OperationCatalogProps = {\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink: RenderLink;\n // Override to return all operations (e.g. for an \"API explorer\" domain\n // that shouldn't be filtered by entity tags).\n allOperations?: boolean;\n surfaceKey?: string;\n // Domain-specific filter decorators (e.g. stamp an entity icon by filter\n // name). Composed in array order; mirrors JsonSchemaForm's `pre`.\n filterPre?: FilterExtension[];\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n commandRuntime?: ClickyCommandRuntime;\n // Custom JsonSchemaForm field extensions forwarded to the create/edit form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions for the create/edit form (e.g. a connection\n // \"Test\" button).\n formActions?: FormActionsRenderer;\n actionLabels?: Record<string, string>;\n // Optional host override for the result surface, keyed off the current surface.\n // Receives the default OperationResultView so non-overridden surfaces render\n // unchanged.\n resultRenderer?: ResultRenderer;\n /**\n * Portal target for the collection action bar (Create, bulk actions). When\n * set, the bar renders into this element — typically an app shell's\n * `bodyActions` slot — instead of inline under the catalog header.\n *\n * A portal rather than a render-prop because the bar owns its own dialog\n * state and closes over the catalog's live filters and list query; moving the\n * element would sever both. Falls back to inline rendering when null, so\n * existing consumers are unaffected.\n */\n actionsContainer?: Element | null;\n getRowDetailHref?: (id: string) => string | undefined;\n actionInitialValues?: Record<string, Record<string, string>>;\n /** Plural noun used by the cross-page selection notice. */\n selectionNoun?: string;\n /**\n * Parameter values pinned by the host — sent on every list request, every\n * filter lookup (both `client.lookupFilters` and per-filter type-ahead), and\n * every export/download URL. Never rendered as an editable filter chip or\n * form field, and never round-tripped through the URL: the host, not the\n * reader, owns them (e.g. the `stream` a trace-results panel is scoped to).\n */\n lockedValues?: Record<string, string>;\n /**\n * Editable seed values for filters the URL has no value for yet — e.g. a\n * database filter that should start at the host's current environment but\n * stay changeable. Applied per-key only when the URL is silent on that key\n * (a URL value always wins), still rendered as an ordinary editable filter\n * field, and never sent as a locked value or written back to the URL as\n * anything other than the resulting filter edit. Unlike `lockedValues`,\n * these seed the FilterBar's own state, not an overlay on top of it.\n */\n initialValues?: Record<string, string>;\n /**\n * Controls whether list filters/pagination/sort read and write the URL.\n * Omit for today's behaviour: unprefixed query params. `false` neither\n * reads nor writes the URL — for a catalog embedded where the host owns the\n * whole URL. `{ prefix }` reads and writes only `<prefix>.<name>` keys, so\n * the catalog can live inside a host route with its own `?step=`/`?tab=`\n * params without colliding.\n */\n urlState?: false | { prefix: string };\n /** Omit to infer cursor walking automatically; set when a host requires a specific paging presentation. */\n paginationMode?: \"paged\" | \"infinite\";\n /** Column names retained in raw rows for detail rendering but omitted from the table. */\n hiddenColumns?: string[];\n /**\n * Host row-detail configuration for the result table. `render` receives raw\n * row values keyed by column name, including columns hidden from `columns`\n * — see `ClickyRowDetailRenderer`. Never disturbs server paging, filters,\n * sort or export.\n */\n rowDetail?: {\n render: ClickyRowDetailRenderer;\n /** How the detail is surfaced when a row is clicked. Defaults to \"row\". */\n style?: \"row\" | \"dialog\";\n /** Dialog size when `style` is \"dialog\". Defaults to DataTable's \"lg\". */\n dialogSize?: ModalSize;\n /** Dialog title when `style` is \"dialog\", given the same raw row values as `render`. */\n title?: ClickyRowDetailTitle;\n };\n /** Override selected result table cells using raw server values. */\n cellRenderers?: ClickyCellRenderers;\n /** Render each list result as a card from its raw row values. */\n rowCard?: ClickyRowCardRenderer;\n /**\n * Follows the surface's list results live over the commons-db sessions SSE\n * API instead of polling: rows the server has appended since the last\n * fetch appear in the table without a refetch. Requires the list\n * operation to advertise a session-start operation (`POST\n * <listPath>/sessions`) in the loaded OpenAPI document — when it does not,\n * the catalog fails loudly with an explicit error naming the surface\n * rather than silently rendering as if `follow` had never been set.\n *\n * The session opens with the same locked values and active filters the\n * list request itself sends, and restarts whenever either changes.\n * Pass `{ maxRows }` to size the in-memory live buffer (default 5,000 —\n * see `useLogTail`); older rows are evicted and counted as `dropped`.\n */\n follow?: OperationCatalogFollowOption;\n /**\n * Turns the catalog into a picker: every row gets a checkbox, a row click\n * toggles it instead of opening the detail page, and the surface's action\n * bar (create and bulk actions) is not rendered — the host owns the\n * selection and what happens to it. Requires a list operation.\n */\n rowSelection?: OperationCatalogRowSelection;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\nconst EMPTY_LOCKED_VALUES: Record<string, string> = {};\nconst EMPTY_INITIAL_VALUES: Record<string, string> = {};\n\nexport function OperationCatalog({\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n surfaceKey,\n filterPre,\n getCommandHref = defaultCommandHref,\n renderError = renderOperationError,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n actionLabels,\n resultRenderer,\n actionsContainer,\n getRowDetailHref,\n actionInitialValues,\n selectionNoun,\n lockedValues = EMPTY_LOCKED_VALUES,\n initialValues = EMPTY_INITIAL_VALUES,\n urlState,\n paginationMode,\n hiddenColumns,\n rowDetail,\n cellRenderers,\n rowCard,\n follow,\n rowSelection,\n}: OperationCatalogProps) {\n const renderRowDetail = rowDetail?.render;\n const rowDetailStyle = rowDetail?.style;\n const rowDetailDialogSize = rowDetail?.dialogSize;\n const rowDetailTitle = rowDetail?.title;\n const { operations, spec, isLoading } = useOperations(client);\n const filterShapes = spec?.components?.[\"x-clicky-filters\"];\n\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey]\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) return surfaceOps;\n return allOperations\n ? operations\n : filterOperationsByDomain(operations, entities);\n }, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);\n\n const listEndpoint = useMemo(() => {\n if (!useSurfaceMetadata) return undefined;\n return findSurfaceListOperation(domainOps, surfaceKey);\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\n const detailOperation = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceDetailOperation(domainOps, surfaceKey)\n : undefined,\n [domainOps, surfaceKey, useSurfaceMetadata]\n );\n const listParameters = listEndpoint?.operation.parameters ?? [];\n const { filters, setFilters, effectiveFilters } =\n useOperationCatalogFilterState({\n listParameters,\n lockedValues,\n urlState,\n initialValues,\n });\n const [selectedRowIds, setSelectedRowIds] = useState<string[]>([]);\n const [selectedRows, setSelectedRows] = useState<ClickyRow[]>([]);\n const [selectedScopeId, setSelectedScopeId] = useState<string>();\n const membershipFilterParameterNames = useMemo(\n () =>\n listParameters\n .filter(\n (parameter) =>\n ![\"limit\", \"offset\", \"cursor\", \"sort\", \"order\"].includes(\n parameter[\"x-clicky\"]?.role ?? \"\"\n )\n )\n .map((parameter) => parameter.name),\n [listParameters]\n );\n const membershipFilterKey = useMemo(\n () =>\n JSON.stringify(\n membershipFilterParameterNames.map((name) => [\n name,\n filters[name] ?? \"\",\n ])\n ),\n [filters, membershipFilterParameterNames]\n );\n const previousMembershipFilterKey = useRef(membershipFilterKey);\n useEffect(() => {\n if (previousMembershipFilterKey.current !== membershipFilterKey) {\n setSelectedRowIds([]);\n setSelectedRows([]);\n setSelectedScopeId(undefined);\n previousMembershipFilterKey.current = membershipFilterKey;\n }\n }, [membershipFilterKey]);\n const lookupParameters = useMemo(\n () => packLookupParameterValues(effectiveFilters, listParameters),\n [effectiveFilters, listParameters]\n );\n const download = useMemo<ClickyDownloadOptions | undefined>(() => {\n const meta = listEndpoint?.operation[\"x-clicky\"]?.export;\n if (!meta) return undefined;\n return {\n label: definition.title,\n ...(meta.formats\n ? { formats: meta.formats as ClickyRemoteFormat[] }\n : {}),\n ...(meta.scopes ? { scopes: meta.scopes } : {}),\n ...(meta.allRowsMode ? { allRowsMode: meta.allRowsMode } : {}),\n ...(meta.formatMaxRows\n ? {\n formatMaxRows: meta.formatMaxRows as Partial<\n Record<ClickyRemoteFormat, number>\n >,\n }\n : {}),\n };\n }, [definition.title, listEndpoint]);\n\n const list = useOperationPages({\n client,\n endpoint: listEndpoint,\n parameters: listParameters,\n filters: effectiveFilters,\n ...(paginationMode ? { paginationMode } : {}),\n });\n\n const { followEnabled, sessionOperation, followMissing, tail } =\n useOperationCatalogFollow({\n follow,\n operations,\n listEndpoint,\n listParameters,\n effectiveFilters,\n showTable: !!listEndpoint,\n });\n const reconcileFollow = typeof follow === \"object\" && follow?.mode === \"reconcile\";\n const refetchList = useRef(list.refetch);\n refetchList.current = list.refetch;\n const onReconcile = useRef(reconcileFollow ? follow.onReconcile : undefined);\n onReconcile.current = reconcileFollow ? follow.onReconcile : undefined;\n useEffect(() => {\n if (!reconcileFollow || tail.lastSequence === null) return;\n const sequence = tail.lastSequence;\n const timer = setTimeout(() => {\n refetchList.current();\n onReconcile.current?.(sequence);\n }, 250);\n return () => clearTimeout(timer);\n }, [reconcileFollow, tail.lastSequence]);\n\n useCursorStaleRecovery({\n error: list.error,\n parameters: listParameters,\n values: filters,\n setValues: setFilters,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n ...operationLookupQuery(client, listEndpoint, lookupParameters),\n enabled: !!listEndpoint && !!client.lookupFilters,\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const actionOps = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceCollectionActions(domainOps, surfaceKey)\n : [],\n [domainOps, surfaceKey, useSurfaceMetadata]\n );\n const selectionActionOps = useMemo(\n () =>\n actionOps.filter(\n (operation) => getOperationClickyMeta(operation)?.supportsFilterMode\n ),\n [actionOps]\n );\n const collectionActionOps = useMemo(\n () =>\n actionOps.filter(\n (operation) => !getOperationClickyMeta(operation)?.supportsFilterMode\n ),\n [actionOps]\n );\n\n const lookupSearch = useOperationFilterSearch(\n client,\n listEndpoint,\n effectiveFilters,\n listParameters\n );\n\n const filterBarConfig = useMemo(() => {\n const options: ParameterFormOptions = {\n includeLocations: [\"query\"],\n lookupSearch,\n components: filterShapes,\n lockedValues,\n hideLocked: true,\n };\n if (lookupQuery.data != null) {\n options.lookup = lookupQuery.data;\n }\n return parametersToFormConfig(listParameters, filters, setFilters, options);\n }, [\n filters,\n filterShapes,\n listParameters,\n lockedValues,\n lookupQuery.data,\n lookupSearch,\n ]);\n const dataTablePagination = useMemo(\n () =>\n dataTablePaginationFromForm(filterBarConfig.pagination, list.response),\n [filterBarConfig.pagination, list.response]\n );\n const followOrder = followRowOrder(filterBarConfig.sort?.value?.dir);\n const decoratedTimeRange = useMemo(\n () =>\n filterBarConfig.timeRange\n ? applyFilterExtensions(\n {\n key: \"timeRange\",\n kind: \"date-range\",\n label:\n filterBarConfig.timeRange.timeEnabled === false\n ? \"Date range\"\n : \"Time range\",\n ...filterBarConfig.timeRange,\n },\n filterPre\n )\n : undefined,\n [filterBarConfig.timeRange, filterPre]\n );\n const decoratedFilters = useMemo(() => {\n const next = filterBarConfig.filters.map((filter) =>\n applyFilterExtensions(filter, filterPre)\n );\n if (decoratedTimeRange?.placement === \"overflow\") {\n next.push(decoratedTimeRange);\n }\n return next;\n }, [decoratedTimeRange, filterBarConfig.filters, filterPre]);\n const cellFilters = useMemo(\n () =>\n Object.fromEntries(\n listParameters\n .filter((parameter) => parameter[\"x-clicky\"]?.role === \"filter\")\n .map((parameter) => [\n parameter.name,\n parseMultiFilterValue(filters[parameter.name] ?? \"\"),\n ])\n ),\n [filters, listParameters]\n );\n const onCellFilterChange = useCallback(\n ({ key, value, mode }: CellFilterChange) => {\n if (\n !listParameters.some(\n (parameter) =>\n parameter.name === key && parameter[\"x-clicky\"]?.role === \"filter\"\n )\n ) {\n throw new Error(\n `Clicky table column references unknown filter parameter ${key}`\n );\n }\n\n setFilters((current) => {\n const selected = parseMultiFilterValue(current[key] ?? \"\");\n if (mode === undefined) {\n delete selected[value];\n } else {\n selected[value] = mode;\n }\n\n const next = { ...current };\n const serialized = serializeMultiFilterValue(selected);\n if (serialized) {\n next[key] = serialized;\n } else {\n delete next[key];\n }\n\n const offset = listParameters.find(\n (parameter) => parameter[\"x-clicky\"]?.role === \"offset\"\n );\n if (offset) next[offset.name] = \"0\";\n const cursor = cursorParameterName(listParameters);\n if (cursor) next[cursor] = \"\";\n return next;\n });\n },\n [listParameters]\n );\n const resultFilterConfig = useMemo<OperationResultFilterConfig>(\n () => ({\n filters: decoratedFilters,\n cellFilters,\n onCellFilterChange,\n ...(filterBarConfig.search ? { search: filterBarConfig.search } : {}),\n ...(filterBarConfig.timeRange &&\n decoratedTimeRange?.placement !== \"overflow\"\n ? { timeRange: filterBarConfig.timeRange }\n : {}),\n }),\n [\n cellFilters,\n decoratedFilters,\n filterBarConfig.search,\n filterBarConfig.timeRange,\n decoratedTimeRange?.placement,\n onCellFilterChange,\n ]\n );\n\n const pickerSelection = useMemo(\n () =>\n rowSelection\n ? pickerTableRowSelection(rowSelection, effectiveFilters)\n : undefined,\n [effectiveFilters, rowSelection]\n );\n\n const showTable = !!listEndpoint;\n if (rowSelection && !isLoading && !showTable) {\n throw new Error(\n `OperationCatalog rowSelection needs a list operation, but surface \"${surfaceKey ?? definition.title}\" has none`\n );\n }\n let listError: unknown;\n if (!list.isFetching) {\n if (list.isError) {\n listError = list.error;\n } else if (list.response?.success === false) {\n listError = new OperationsApiClientError(\n list.response.error ||\n list.response.message ||\n list.response.stderr ||\n `Command failed with exit code ${list.response.exit_code}`,\n {\n method: listEndpoint?.method,\n url: list.response.requestUrl,\n responseBody: list.response.stdout,\n responseData: list.response.parsed,\n responseHeaders: list.response.responseHeaders,\n }\n );\n }\n }\n const tableError =\n listError !== undefined\n ? renderError(listError, `Failed to load ${listEndpoint?.path ?? \"\"}`)\n : undefined;\n const tableResponse = list.response?.success === false ? null : list.response;\n // The presented ClickyRow rides next to each raw follow row (see\n // LogTailEvent.clickyRow); a row-shaped event without one is a stream\n // contract violation for a tabular follow surface, never guessed at as\n // plain text, so it is surfaced as an error rather than merged.\n const followPartition = partitionFollowRows(tail.rows, tail.clickyRows);\n const followStreamError: LogTailError | null =\n tail.error ??\n (!reconcileFollow && followPartition.missingClickyRow\n ? {\n scope: \"stream\",\n message:\n \"a follow event arrived without its presented row (clickyRow) — the profile stopped sending it\",\n }\n : null);\n const followMerge =\n followEnabled && sessionOperation && !reconcileFollow\n ? mergeFollowRowsIntoResponse(\n tableResponse,\n followPartition.rows,\n followOrder\n )\n : undefined;\n const unavailableRows = rowSelection?.unavailableRows;\n const markRows = (response: ExecutionResponse | null) =>\n response && unavailableRows\n ? markUnavailableRows(response, unavailableRows)\n : response;\n const mergedTableResponse = markRows(\n followMerge ? followMerge.response : tableResponse\n );\n // The last fetch's total undercounts once live rows have been folded in\n // that it never saw — reported as a lower bound (\"gte\"), never restated as\n // an exact count nobody promised.\n const resultsPagination =\n followMerge && followMerge.addedCount > 0 && dataTablePagination\n ? {\n ...dataTablePagination,\n total: (dataTablePagination.total ?? 0) + followMerge.addedCount,\n totalRelation: \"gte\" as const,\n }\n : dataTablePagination;\n const walkProps = list.infinite\n ? {\n pages: unavailableRows\n ? list.pages.map((page) => markUnavailableRows(page, unavailableRows))\n : list.pages,\n infinite: list.infinite,\n }\n : {};\n if (isLoading || (showTable && list.isPending && list.response == null)) {\n return (\n <Loading variant=\"centered\" label={`Loading ${definition.title}…`} />\n );\n }\n\n return (\n <div\n className=\"flex h-full min-h-0 flex-1 flex-col gap-2\"\n data-slot=\"operation-catalog\"\n >\n {/* No title/description here by design: page headers and breadcrumbs are\n the host's to define (e.g. an app shell's bodyHeader), so the catalog\n never invents chrome the consumer would have to fight or duplicate. */}\n {!rowSelection && <OperationCatalogActions\n actions={collectionActionOps}\n selectionActions={selectionActionOps}\n filters={filters}\n filterParameterNames={listParameters.map((parameter) => parameter.name)}\n membershipFilterParameterNames={membershipFilterParameterNames}\n selectedRowIds={selectedRowIds}\n selectedRows={selectedRows}\n {...(selectedScopeId && dataTablePagination?.total != null\n ? {\n selectedScope: {\n id: selectedScopeId,\n total: dataTablePagination.total,\n },\n }\n : {})}\n clearSelection={() => {\n setSelectedRowIds([]);\n setSelectedRows([]);\n setSelectedScopeId(undefined);\n }}\n onExecuted={() => list.refetch()}\n {...(actionsContainer ? { actionsContainer } : {})}\n {...(actionInitialValues\n ? { initialValuesByAction: actionInitialValues }\n : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n {...(actionLabels ? { actionLabels } : {})}\n client={client}\n />}\n\n {showTable ? (\n <div className=\"flex min-h-0 flex-1 flex-col\" data-slot=\"operation-catalog-results\">\n {followMissing ? (\n renderError(\n new Error(\n `Surface \"${surfaceKey ?? definition.title}\" set follow, but ${listEndpoint?.path} advertises no session to follow (expected POST ${listEndpoint?.path}/sessions)`\n ),\n \"Live follow is not available\"\n )\n ) : (\n <>\n {followEnabled && sessionOperation && (\n <OperationCatalogFollowStatus\n status={tail.status}\n error={followStreamError}\n droppedRows={reconcileFollow ? 0 : tail.droppedRows}\n addedCount={followMerge?.addedCount ?? 0}\n className=\"mb-2\"\n />\n )}\n {(() => {\n const defaultView = (\n <OperationResultView\n response={mergedTableResponse}\n loading={list.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0 h-full min-h-0 flex-1\"\n detailOperation={pickerSelection ? undefined : detailOperation}\n {...(hiddenColumns ? { hiddenColumns } : {})}\n {...(getRowDetailHref && !pickerSelection\n ? { getRowDetailHref }\n : {})}\n {...(pickerSelection\n ? { rowSelection: pickerSelection }\n : selectionActionOps.length > 0\n ? {\n rowSelection: {\n selectedRowIds,\n onSelectionChange: (\n ids: string[],\n rows: ClickyRow[]\n ) => {\n setSelectedRowIds(ids);\n setSelectedRows(rows);\n setSelectedScopeId(undefined);\n },\n ...(dataTablePagination?.total != null &&\n dataTablePagination.totalRelation === \"eq\"\n ? {\n selectAllPages: {\n ...(selectedScopeId\n ? { selectedScopeId }\n : {}),\n noun:\n selectionNoun ??\n definition.title.toLocaleLowerCase(),\n scopes: [\n {\n id: \"all-matching\",\n total: dataTablePagination.total,\n onSelectAll: () =>\n setSelectedScopeId(\"all-matching\"),\n },\n ],\n },\n }\n : {}),\n getRowId: (row: ClickyRow) => {\n const id = getClickyRowId(row);\n if (!id) {\n throw new Error(\n \"Clicky bulk action row is missing an _id or id cell\"\n );\n }\n return id;\n },\n isRowSelectable: (row: ClickyRow) =>\n getClickyRowId(row) != null,\n },\n }\n : {})}\n filterConfig={resultFilterConfig}\n {...(tableError ? { error: tableError } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(resultsPagination\n ? { pagination: resultsPagination }\n : {})}\n {...(filterBarConfig.sort\n ? { sort: filterBarConfig.sort }\n : {})}\n {...(download ? { download } : {})}\n {...(renderRowDetail ? { renderRowDetail } : {})}\n {...(cellRenderers ? { cellRenderers } : {})}\n {...(rowCard ? { renderRowCard: rowCard } : {})}\n {...(rowDetailStyle ? { detailStyle: rowDetailStyle } : {})}\n {...(rowDetailDialogSize\n ? { detailDialogSize: rowDetailDialogSize }\n : {})}\n {...(rowDetailTitle\n ? { detailDialogTitle: rowDetailTitle }\n : {})}\n {...walkProps}\n />\n );\n return resultRenderer\n ? resultRenderer({\n response: list.response,\n loading: list.isFetching,\n defaultView,\n filterConfig: resultFilterConfig,\n // A renderer that replaces the table owns the whole surface,\n // pager and download menu included. Without these it can only\n // drop them, which is how a replaced view silently loses the\n // ability to reach page two — or, under a walk, page one's\n // rows the moment page two arrives.\n ...(dataTablePagination\n ? { pagination: dataTablePagination }\n : {}),\n ...(filterBarConfig.sort\n ? { sort: filterBarConfig.sort }\n : {}),\n ...(download ? { download } : {}),\n ...(surfaceKey ? { surfaceKey } : {}),\n ...(renderRowDetail ? { renderRowDetail } : {}),\n ...(rowCard ? { renderRowCard: rowCard } : {}),\n ...(rowDetailStyle ? { detailStyle: rowDetailStyle } : {}),\n ...(rowDetailDialogSize\n ? { detailDialogSize: rowDetailDialogSize }\n : {}),\n ...(rowDetailTitle\n ? { detailDialogTitle: rowDetailTitle }\n : {}),\n ...walkProps,\n })\n : defaultView;\n })()}\n </>\n )}\n </div>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n </div>\n );\n}\n"],"names":["renderOperationError","useOperations","useMemo","filterOperationsBySurface","filterOperationsByDomain","findSurfaceListOperation","findSurfaceDetailOperation","useOperationCatalogFilterState","useState","_a","useRef","useEffect","packLookupParameterValues","useOperationPages","useOperationCatalogFollow","useCursorStaleRecovery","useQuery","operationLookupQuery","keepPreviousData","findSurfaceCollectionActions","getOperationClickyMeta","useOperationFilterSearch","parametersToFormConfig","dataTablePaginationFromForm","followRowOrder","applyFilterExtensions","parseMultiFilterValue","useCallback","serializeMultiFilterValue","cursorParameterName","pickerTableRowSelection","OperationsApiClientError","partitionFollowRows","mergeFollowRowsIntoResponse","markUnavailableRows","jsx","Loading","jsxs","OperationCatalogActions","Fragment","OperationCatalogFollowStatus","OperationResultView","getClickyRowId","EndpointList"],"mappings":"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"}
1
+ {"version":3,"file":"OperationCatalog.cjs","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { useOperationPages } from \"./useOperationPages\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceCollectionActions,\n findSurfaceDetailOperation,\n findSurfaceListOperation,\n getOperationClickyMeta,\n} from \"./clickyMetadata\";\nimport type {\n ClickyCommandRuntime,\n ClickyDownloadOptions,\n ClickyRemoteFormat,\n ClickyRow,\n ClickyRowDetailRenderer,\n ClickyCellRenderers,\n ClickyRowCardRenderer,\n ClickyRowDetailTitle,\n} from \"../data/Clicky\";\nimport type { ModalSize } from \"../overlay/Modal\";\nimport type { CellFilterChange } from \"../data/cells/CellFilterActions\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { OperationCatalogActions } from \"./OperationCatalogActions\";\nimport { OperationsApiClientError } from \"./apiClient\";\nimport { renderOperationError } from \"./operationErrorDiagnostics\";\nimport {\n OperationResultView,\n type OperationResultFilterConfig,\n type ResultRenderer,\n} from \"./OperationResultView\";\nimport { type FormActionsRenderer } from \"./SchemaActionForm\";\nimport {\n applyFilterExtensions,\n type FilterExtension,\n} from \"../components/filter-bar-utils\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\n dataTablePaginationFromForm,\n packLookupParameterValues,\n parametersToFormConfig,\n type ParameterFormOptions,\n} from \"./formMetadata\";\nimport { cursorParameterName, useCursorStaleRecovery } from \"./cursorStale\";\nimport { useOperationFilterSearch } from \"./operationFilterSearch\";\nimport {\n parseMultiFilterValue,\n serializeMultiFilterValue,\n} from \"../data/data-table-filter-values\";\nimport { Loading } from \"../components/loading\";\nimport { getClickyRowId } from \"./rowNavigation\";\nimport { useOperationCatalogFilterState } from \"./operationCatalogFilterState\";\nimport {\n followRowOrder,\n mergeFollowRowsIntoResponse,\n partitionFollowRows,\n} from \"./operationCatalogFollow\";\nimport { OperationCatalogFollowStatus } from \"./OperationCatalogFollowStatus\";\nimport { useOperationCatalogFollow, type OperationCatalogFollowOption } from \"./useOperationCatalogFollow\";\nimport type { LogTailError } from \"../hooks/use-log-tail\";\nimport {\n markUnavailableRows,\n operationLookupQuery,\n pickerTableRowSelection,\n type OperationCatalogRowSelection,\n} from \"./operationCatalogRowSelection\";\n\nexport type OperationCatalogProps = {\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink: RenderLink;\n // Override to return all operations (e.g. for an \"API explorer\" domain\n // that shouldn't be filtered by entity tags).\n allOperations?: boolean;\n surfaceKey?: string;\n // Domain-specific filter decorators (e.g. stamp an entity icon by filter\n // name). Composed in array order; mirrors JsonSchemaForm's `pre`.\n filterPre?: FilterExtension[];\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n commandRuntime?: ClickyCommandRuntime;\n // Custom JsonSchemaForm field extensions forwarded to the create/edit form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions for the create/edit form (e.g. a connection\n // \"Test\" button).\n formActions?: FormActionsRenderer;\n actionLabels?: Record<string, string>;\n // Optional host override for the result surface, keyed off the current surface.\n // Receives the default OperationResultView so non-overridden surfaces render\n // unchanged.\n resultRenderer?: ResultRenderer;\n /**\n * Portal target for the collection action bar (Create, bulk actions). When\n * set, the bar renders into this element — typically an app shell's\n * `bodyActions` slot — instead of inline under the catalog header.\n *\n * A portal rather than a render-prop because the bar owns its own dialog\n * state and closes over the catalog's live filters and list query; moving the\n * element would sever both. Falls back to inline rendering when null, so\n * existing consumers are unaffected.\n */\n actionsContainer?: Element | null;\n getRowDetailHref?: (id: string) => string | undefined;\n actionInitialValues?: Record<string, Record<string, string>>;\n /** Plural noun used by the cross-page selection notice. */\n selectionNoun?: string;\n /**\n * Parameter values pinned by the host — sent on every list request, every\n * filter lookup (both `client.lookupFilters` and per-filter type-ahead), and\n * every export/download URL. Never rendered as an editable filter chip or\n * form field, and never round-tripped through the URL: the host, not the\n * reader, owns them (e.g. the `stream` a trace-results panel is scoped to).\n */\n lockedValues?: Record<string, string>;\n /**\n * Editable seed values for filters the URL has no value for yet — e.g. a\n * database filter that should start at the host's current environment but\n * stay changeable. Applied per-key only when the URL is silent on that key\n * (a URL value always wins), still rendered as an ordinary editable filter\n * field, and never sent as a locked value or written back to the URL as\n * anything other than the resulting filter edit. Unlike `lockedValues`,\n * these seed the FilterBar's own state, not an overlay on top of it.\n */\n initialValues?: Record<string, string>;\n /**\n * Controls whether list filters/pagination/sort read and write the URL.\n * Omit for today's behaviour: unprefixed query params. `false` neither\n * reads nor writes the URL — for a catalog embedded where the host owns the\n * whole URL. `{ prefix }` reads and writes only `<prefix>.<name>` keys, so\n * the catalog can live inside a host route with its own `?step=`/`?tab=`\n * params without colliding.\n */\n urlState?: false | { prefix: string };\n /** Omit to infer cursor walking automatically; set when a host requires a specific paging presentation. */\n paginationMode?: \"paged\" | \"infinite\";\n /** Poll the current server page while it can change, in milliseconds. */\n refreshIntervalMs?: number;\n /** Column names retained in raw rows for detail rendering but omitted from the table. */\n hiddenColumns?: string[];\n /**\n * Host row-detail configuration for the result table. `render` receives raw\n * row values keyed by column name, including columns hidden from `columns`\n * — see `ClickyRowDetailRenderer`. Never disturbs server paging, filters,\n * sort or export.\n */\n rowDetail?: {\n render: ClickyRowDetailRenderer;\n /** How the detail is surfaced when a row is clicked. Defaults to \"row\". */\n style?: \"row\" | \"dialog\";\n /** Dialog size when `style` is \"dialog\". Defaults to DataTable's \"lg\". */\n dialogSize?: ModalSize;\n /** Dialog title when `style` is \"dialog\", given the same raw row values as `render`. */\n title?: ClickyRowDetailTitle;\n };\n /** Override selected result table cells using raw server values. */\n cellRenderers?: ClickyCellRenderers;\n /** Render each list result as a card from its raw row values. */\n rowCard?: ClickyRowCardRenderer;\n /**\n * Follows the surface's list results live over the commons-db sessions SSE\n * API instead of polling: rows the server has appended since the last\n * fetch appear in the table without a refetch. Requires the list\n * operation to advertise a session-start operation (`POST\n * <listPath>/sessions`) in the loaded OpenAPI document — when it does not,\n * the catalog fails loudly with an explicit error naming the surface\n * rather than silently rendering as if `follow` had never been set.\n *\n * The session opens with the same locked values and active filters the\n * list request itself sends, and restarts whenever either changes.\n * Pass `{ maxRows }` to size the in-memory live buffer (default 5,000 —\n * see `useLogTail`); older rows are evicted and counted as `dropped`.\n */\n follow?: OperationCatalogFollowOption;\n /**\n * Turns the catalog into a picker: every row gets a checkbox, a row click\n * toggles it instead of opening the detail page, and the surface's action\n * bar (create and bulk actions) is not rendered — the host owns the\n * selection and what happens to it. Requires a list operation.\n */\n rowSelection?: OperationCatalogRowSelection;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\nconst EMPTY_LOCKED_VALUES: Record<string, string> = {};\nconst EMPTY_INITIAL_VALUES: Record<string, string> = {};\n\nexport function OperationCatalog({\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n surfaceKey,\n filterPre,\n getCommandHref = defaultCommandHref,\n renderError = renderOperationError,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n actionLabels,\n resultRenderer,\n actionsContainer,\n getRowDetailHref,\n actionInitialValues,\n selectionNoun,\n lockedValues = EMPTY_LOCKED_VALUES,\n initialValues = EMPTY_INITIAL_VALUES,\n urlState,\n paginationMode,\n refreshIntervalMs,\n hiddenColumns,\n rowDetail,\n cellRenderers,\n rowCard,\n follow,\n rowSelection,\n}: OperationCatalogProps) {\n const renderRowDetail = rowDetail?.render;\n const rowDetailStyle = rowDetail?.style;\n const rowDetailDialogSize = rowDetail?.dialogSize;\n const rowDetailTitle = rowDetail?.title;\n const { operations, spec, isLoading } = useOperations(client);\n const filterShapes = spec?.components?.[\"x-clicky-filters\"];\n\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey]\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) return surfaceOps;\n return allOperations\n ? operations\n : filterOperationsByDomain(operations, entities);\n }, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);\n\n const listEndpoint = useMemo(() => {\n if (!useSurfaceMetadata) return undefined;\n return findSurfaceListOperation(domainOps, surfaceKey);\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\n const detailOperation = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceDetailOperation(domainOps, surfaceKey)\n : undefined,\n [domainOps, surfaceKey, useSurfaceMetadata]\n );\n const listParameters = listEndpoint?.operation.parameters ?? [];\n const { filters, setFilters, effectiveFilters } =\n useOperationCatalogFilterState({\n listParameters,\n lockedValues,\n urlState,\n initialValues,\n });\n const [selectedRowIds, setSelectedRowIds] = useState<string[]>([]);\n const [selectedRows, setSelectedRows] = useState<ClickyRow[]>([]);\n const [selectedScopeId, setSelectedScopeId] = useState<string>();\n const membershipFilterParameterNames = useMemo(\n () =>\n listParameters\n .filter(\n (parameter) =>\n ![\"limit\", \"offset\", \"cursor\", \"sort\", \"order\"].includes(\n parameter[\"x-clicky\"]?.role ?? \"\"\n )\n )\n .map((parameter) => parameter.name),\n [listParameters]\n );\n const membershipFilterKey = useMemo(\n () =>\n JSON.stringify(\n membershipFilterParameterNames.map((name) => [\n name,\n filters[name] ?? \"\",\n ])\n ),\n [filters, membershipFilterParameterNames]\n );\n const previousMembershipFilterKey = useRef(membershipFilterKey);\n useEffect(() => {\n if (previousMembershipFilterKey.current !== membershipFilterKey) {\n setSelectedRowIds([]);\n setSelectedRows([]);\n setSelectedScopeId(undefined);\n previousMembershipFilterKey.current = membershipFilterKey;\n }\n }, [membershipFilterKey]);\n const lookupParameters = useMemo(\n () => packLookupParameterValues(effectiveFilters, listParameters),\n [effectiveFilters, listParameters]\n );\n const download = useMemo<ClickyDownloadOptions | undefined>(() => {\n const meta = listEndpoint?.operation[\"x-clicky\"]?.export;\n if (!meta) return undefined;\n return {\n label: definition.title,\n ...(meta.formats\n ? { formats: meta.formats as ClickyRemoteFormat[] }\n : {}),\n ...(meta.scopes ? { scopes: meta.scopes } : {}),\n ...(meta.allRowsMode ? { allRowsMode: meta.allRowsMode } : {}),\n ...(meta.formatMaxRows\n ? {\n formatMaxRows: meta.formatMaxRows as Partial<\n Record<ClickyRemoteFormat, number>\n >,\n }\n : {}),\n };\n }, [definition.title, listEndpoint]);\n\n const list = useOperationPages({\n client,\n endpoint: listEndpoint,\n parameters: listParameters,\n filters: effectiveFilters,\n ...(paginationMode ? { paginationMode } : {}),\n ...(refreshIntervalMs !== undefined ? { refreshIntervalMs } : {}),\n });\n\n const { followEnabled, sessionOperation, followMissing, tail } =\n useOperationCatalogFollow({\n follow,\n operations,\n listEndpoint,\n listParameters,\n effectiveFilters,\n showTable: !!listEndpoint,\n });\n const reconcileFollow = typeof follow === \"object\" && follow?.mode === \"reconcile\";\n const refetchList = useRef(list.refetch);\n refetchList.current = list.refetch;\n const onReconcile = useRef(reconcileFollow ? follow.onReconcile : undefined);\n onReconcile.current = reconcileFollow ? follow.onReconcile : undefined;\n useEffect(() => {\n if (!reconcileFollow || tail.lastSequence === null) return;\n const sequence = tail.lastSequence;\n const timer = setTimeout(() => {\n refetchList.current();\n onReconcile.current?.(sequence);\n }, 250);\n return () => clearTimeout(timer);\n }, [reconcileFollow, tail.lastSequence]);\n\n useCursorStaleRecovery({\n error: list.error,\n parameters: listParameters,\n values: filters,\n setValues: setFilters,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n ...operationLookupQuery(client, listEndpoint, lookupParameters),\n enabled: !!listEndpoint && !!client.lookupFilters,\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const actionOps = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceCollectionActions(domainOps, surfaceKey)\n : [],\n [domainOps, surfaceKey, useSurfaceMetadata]\n );\n const selectionActionOps = useMemo(\n () =>\n actionOps.filter(\n (operation) => getOperationClickyMeta(operation)?.supportsFilterMode\n ),\n [actionOps]\n );\n const collectionActionOps = useMemo(\n () =>\n actionOps.filter(\n (operation) => !getOperationClickyMeta(operation)?.supportsFilterMode\n ),\n [actionOps]\n );\n\n const lookupSearch = useOperationFilterSearch(\n client,\n listEndpoint,\n effectiveFilters,\n listParameters\n );\n\n const filterBarConfig = useMemo(() => {\n const options: ParameterFormOptions = {\n includeLocations: [\"query\"],\n lookupSearch,\n components: filterShapes,\n lockedValues,\n hideLocked: true,\n };\n if (lookupQuery.data != null) {\n options.lookup = lookupQuery.data;\n }\n return parametersToFormConfig(listParameters, filters, setFilters, options);\n }, [\n filters,\n filterShapes,\n listParameters,\n lockedValues,\n lookupQuery.data,\n lookupSearch,\n ]);\n const dataTablePagination = useMemo(\n () =>\n dataTablePaginationFromForm(filterBarConfig.pagination, list.response),\n [filterBarConfig.pagination, list.response]\n );\n const followOrder = followRowOrder(filterBarConfig.sort?.value?.dir);\n const decoratedTimeRange = useMemo(\n () =>\n filterBarConfig.timeRange\n ? applyFilterExtensions(\n {\n key: \"timeRange\",\n kind: \"date-range\",\n label:\n filterBarConfig.timeRange.timeEnabled === false\n ? \"Date range\"\n : \"Time range\",\n ...filterBarConfig.timeRange,\n },\n filterPre\n )\n : undefined,\n [filterBarConfig.timeRange, filterPre]\n );\n const decoratedFilters = useMemo(() => {\n const next = filterBarConfig.filters.map((filter) =>\n applyFilterExtensions(filter, filterPre)\n );\n if (decoratedTimeRange?.placement === \"overflow\") {\n next.push(decoratedTimeRange);\n }\n return next;\n }, [decoratedTimeRange, filterBarConfig.filters, filterPre]);\n const cellFilters = useMemo(\n () =>\n Object.fromEntries(\n listParameters\n .filter((parameter) => parameter[\"x-clicky\"]?.role === \"filter\")\n .map((parameter) => [\n parameter.name,\n parseMultiFilterValue(filters[parameter.name] ?? \"\"),\n ])\n ),\n [filters, listParameters]\n );\n const onCellFilterChange = useCallback(\n ({ key, value, mode }: CellFilterChange) => {\n if (\n !listParameters.some(\n (parameter) =>\n parameter.name === key && parameter[\"x-clicky\"]?.role === \"filter\"\n )\n ) {\n throw new Error(\n `Clicky table column references unknown filter parameter ${key}`\n );\n }\n\n setFilters((current) => {\n const selected = parseMultiFilterValue(current[key] ?? \"\");\n if (mode === undefined) {\n delete selected[value];\n } else {\n selected[value] = mode;\n }\n\n const next = { ...current };\n const serialized = serializeMultiFilterValue(selected);\n if (serialized) {\n next[key] = serialized;\n } else {\n delete next[key];\n }\n\n const offset = listParameters.find(\n (parameter) => parameter[\"x-clicky\"]?.role === \"offset\"\n );\n if (offset) next[offset.name] = \"0\";\n const cursor = cursorParameterName(listParameters);\n if (cursor) next[cursor] = \"\";\n return next;\n });\n },\n [listParameters]\n );\n const resultFilterConfig = useMemo<OperationResultFilterConfig>(\n () => ({\n filters: decoratedFilters,\n cellFilters,\n onCellFilterChange,\n ...(filterBarConfig.search ? { search: filterBarConfig.search } : {}),\n ...(filterBarConfig.timeRange &&\n decoratedTimeRange?.placement !== \"overflow\"\n ? { timeRange: filterBarConfig.timeRange }\n : {}),\n }),\n [\n cellFilters,\n decoratedFilters,\n filterBarConfig.search,\n filterBarConfig.timeRange,\n decoratedTimeRange?.placement,\n onCellFilterChange,\n ]\n );\n\n const pickerSelection = useMemo(\n () =>\n rowSelection\n ? pickerTableRowSelection(rowSelection, effectiveFilters)\n : undefined,\n [effectiveFilters, rowSelection]\n );\n\n const showTable = !!listEndpoint;\n if (rowSelection && !isLoading && !showTable) {\n throw new Error(\n `OperationCatalog rowSelection needs a list operation, but surface \"${surfaceKey ?? definition.title}\" has none`\n );\n }\n let listError: unknown;\n if (!list.isFetching) {\n if (list.isError) {\n listError = list.error;\n } else if (list.response?.success === false) {\n listError = new OperationsApiClientError(\n list.response.error ||\n list.response.message ||\n list.response.stderr ||\n `Command failed with exit code ${list.response.exit_code}`,\n {\n method: listEndpoint?.method,\n url: list.response.requestUrl,\n responseBody: list.response.stdout,\n responseData: list.response.parsed,\n responseHeaders: list.response.responseHeaders,\n }\n );\n }\n }\n const tableError =\n listError !== undefined\n ? renderError(listError, `Failed to load ${listEndpoint?.path ?? \"\"}`)\n : undefined;\n const tableResponse = list.response?.success === false ? null : list.response;\n // The presented ClickyRow rides next to each raw follow row (see\n // LogTailEvent.clickyRow); a row-shaped event without one is a stream\n // contract violation for a tabular follow surface, never guessed at as\n // plain text, so it is surfaced as an error rather than merged.\n const followPartition = partitionFollowRows(tail.rows, tail.clickyRows);\n const followStreamError: LogTailError | null =\n tail.error ??\n (!reconcileFollow && followPartition.missingClickyRow\n ? {\n scope: \"stream\",\n message:\n \"a follow event arrived without its presented row (clickyRow) — the profile stopped sending it\",\n }\n : null);\n const followMerge =\n followEnabled && sessionOperation && !reconcileFollow\n ? mergeFollowRowsIntoResponse(\n tableResponse,\n followPartition.rows,\n followOrder\n )\n : undefined;\n const unavailableRows = rowSelection?.unavailableRows;\n const markRows = (response: ExecutionResponse | null) =>\n response && unavailableRows\n ? markUnavailableRows(response, unavailableRows)\n : response;\n const mergedTableResponse = markRows(\n followMerge ? followMerge.response : tableResponse\n );\n // The last fetch's total undercounts once live rows have been folded in\n // that it never saw — reported as a lower bound (\"gte\"), never restated as\n // an exact count nobody promised.\n const resultsPagination =\n followMerge && followMerge.addedCount > 0 && dataTablePagination\n ? {\n ...dataTablePagination,\n total: (dataTablePagination.total ?? 0) + followMerge.addedCount,\n totalRelation: \"gte\" as const,\n }\n : dataTablePagination;\n const walkProps = list.infinite\n ? {\n pages: unavailableRows\n ? list.pages.map((page) => markUnavailableRows(page, unavailableRows))\n : list.pages,\n infinite: list.infinite,\n }\n : {};\n if (isLoading || (showTable && list.isPending && list.response == null)) {\n return (\n <Loading variant=\"centered\" label={`Loading ${definition.title}…`} />\n );\n }\n\n return (\n <div\n className=\"flex h-full min-h-0 flex-1 flex-col gap-2\"\n data-slot=\"operation-catalog\"\n >\n {/* No title/description here by design: page headers and breadcrumbs are\n the host's to define (e.g. an app shell's bodyHeader), so the catalog\n never invents chrome the consumer would have to fight or duplicate. */}\n {!rowSelection && <OperationCatalogActions\n actions={collectionActionOps}\n selectionActions={selectionActionOps}\n filters={filters}\n filterParameterNames={listParameters.map((parameter) => parameter.name)}\n membershipFilterParameterNames={membershipFilterParameterNames}\n selectedRowIds={selectedRowIds}\n selectedRows={selectedRows}\n {...(selectedScopeId && dataTablePagination?.total != null\n ? {\n selectedScope: {\n id: selectedScopeId,\n total: dataTablePagination.total,\n },\n }\n : {})}\n clearSelection={() => {\n setSelectedRowIds([]);\n setSelectedRows([]);\n setSelectedScopeId(undefined);\n }}\n onExecuted={() => list.refetch()}\n {...(actionsContainer ? { actionsContainer } : {})}\n {...(actionInitialValues\n ? { initialValuesByAction: actionInitialValues }\n : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n {...(actionLabels ? { actionLabels } : {})}\n client={client}\n />}\n\n {showTable ? (\n <div className=\"flex min-h-0 flex-1 flex-col\" data-slot=\"operation-catalog-results\">\n {followMissing ? (\n renderError(\n new Error(\n `Surface \"${surfaceKey ?? definition.title}\" set follow, but ${listEndpoint?.path} advertises no session to follow (expected POST ${listEndpoint?.path}/sessions)`\n ),\n \"Live follow is not available\"\n )\n ) : (\n <>\n {followEnabled && sessionOperation && (\n <OperationCatalogFollowStatus\n status={tail.status}\n error={followStreamError}\n droppedRows={reconcileFollow ? 0 : tail.droppedRows}\n addedCount={followMerge?.addedCount ?? 0}\n className=\"mb-2\"\n />\n )}\n {(() => {\n const defaultView = (\n <OperationResultView\n response={mergedTableResponse}\n loading={list.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0 h-full min-h-0 flex-1\"\n detailOperation={pickerSelection ? undefined : detailOperation}\n {...(hiddenColumns ? { hiddenColumns } : {})}\n {...(getRowDetailHref && !pickerSelection\n ? { getRowDetailHref }\n : {})}\n {...(pickerSelection\n ? { rowSelection: pickerSelection }\n : selectionActionOps.length > 0\n ? {\n rowSelection: {\n selectedRowIds,\n onSelectionChange: (\n ids: string[],\n rows: ClickyRow[]\n ) => {\n setSelectedRowIds(ids);\n setSelectedRows(rows);\n setSelectedScopeId(undefined);\n },\n ...(dataTablePagination?.total != null &&\n dataTablePagination.totalRelation === \"eq\"\n ? {\n selectAllPages: {\n ...(selectedScopeId\n ? { selectedScopeId }\n : {}),\n noun:\n selectionNoun ??\n definition.title.toLocaleLowerCase(),\n scopes: [\n {\n id: \"all-matching\",\n total: dataTablePagination.total,\n onSelectAll: () =>\n setSelectedScopeId(\"all-matching\"),\n },\n ],\n },\n }\n : {}),\n getRowId: (row: ClickyRow) => {\n const id = getClickyRowId(row);\n if (!id) {\n throw new Error(\n \"Clicky bulk action row is missing an _id or id cell\"\n );\n }\n return id;\n },\n isRowSelectable: (row: ClickyRow) =>\n getClickyRowId(row) != null,\n },\n }\n : {})}\n filterConfig={resultFilterConfig}\n {...(tableError ? { error: tableError } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(resultsPagination\n ? { pagination: resultsPagination }\n : {})}\n {...(filterBarConfig.sort\n ? { sort: filterBarConfig.sort }\n : {})}\n {...(download ? { download } : {})}\n {...(renderRowDetail ? { renderRowDetail } : {})}\n {...(cellRenderers ? { cellRenderers } : {})}\n {...(rowCard ? { renderRowCard: rowCard } : {})}\n {...(rowDetailStyle ? { detailStyle: rowDetailStyle } : {})}\n {...(rowDetailDialogSize\n ? { detailDialogSize: rowDetailDialogSize }\n : {})}\n {...(rowDetailTitle\n ? { detailDialogTitle: rowDetailTitle }\n : {})}\n {...walkProps}\n />\n );\n return resultRenderer\n ? resultRenderer({\n response: list.response,\n loading: list.isFetching,\n defaultView,\n filterConfig: resultFilterConfig,\n // A renderer that replaces the table owns the whole surface,\n // pager and download menu included. Without these it can only\n // drop them, which is how a replaced view silently loses the\n // ability to reach page two — or, under a walk, page one's\n // rows the moment page two arrives.\n ...(dataTablePagination\n ? { pagination: dataTablePagination }\n : {}),\n ...(filterBarConfig.sort\n ? { sort: filterBarConfig.sort }\n : {}),\n ...(download ? { download } : {}),\n ...(surfaceKey ? { surfaceKey } : {}),\n ...(renderRowDetail ? { renderRowDetail } : {}),\n ...(rowCard ? { renderRowCard: rowCard } : {}),\n ...(rowDetailStyle ? { detailStyle: rowDetailStyle } : {}),\n ...(rowDetailDialogSize\n ? { detailDialogSize: rowDetailDialogSize }\n : {}),\n ...(rowDetailTitle\n ? { detailDialogTitle: rowDetailTitle }\n : {}),\n ...walkProps,\n })\n : defaultView;\n })()}\n </>\n )}\n </div>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n </div>\n );\n}\n"],"names":["renderOperationError","useOperations","useMemo","filterOperationsBySurface","filterOperationsByDomain","findSurfaceListOperation","findSurfaceDetailOperation","useOperationCatalogFilterState","useState","_a","useRef","useEffect","packLookupParameterValues","useOperationPages","useOperationCatalogFollow","useCursorStaleRecovery","useQuery","operationLookupQuery","keepPreviousData","findSurfaceCollectionActions","getOperationClickyMeta","useOperationFilterSearch","parametersToFormConfig","dataTablePaginationFromForm","followRowOrder","applyFilterExtensions","parseMultiFilterValue","useCallback","serializeMultiFilterValue","cursorParameterName","pickerTableRowSelection","OperationsApiClientError","partitionFollowRows","mergeFollowRowsIntoResponse","markUnavailableRows","jsx","Loading","jsxs","OperationCatalogActions","Fragment","OperationCatalogFollowStatus","OperationResultView","getClickyRowId","EndpointList"],"mappings":"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"}
@@ -72,6 +72,8 @@ export type OperationCatalogProps = {
72
72
  };
73
73
  /** Omit to infer cursor walking automatically; set when a host requires a specific paging presentation. */
74
74
  paginationMode?: "paged" | "infinite";
75
+ /** Poll the current server page while it can change, in milliseconds. */
76
+ refreshIntervalMs?: number;
75
77
  /** Column names retained in raw rows for detail rendering but omitted from the table. */
76
78
  hiddenColumns?: string[];
77
79
  /**
@@ -116,5 +118,5 @@ export type OperationCatalogProps = {
116
118
  */
117
119
  rowSelection?: OperationCatalogRowSelection;
118
120
  };
119
- export declare function OperationCatalog({ definition, entities, client, renderLink, allOperations, surfaceKey, filterPre, getCommandHref, renderError, commandRuntime, formPre, formPost, formActions, actionLabels, resultRenderer, actionsContainer, getRowDetailHref, actionInitialValues, selectionNoun, lockedValues, initialValues, urlState, paginationMode, hiddenColumns, rowDetail, cellRenderers, rowCard, follow, rowSelection, }: OperationCatalogProps): import("react").JSX.Element;
121
+ export declare function OperationCatalog({ definition, entities, client, renderLink, allOperations, surfaceKey, filterPre, getCommandHref, renderError, commandRuntime, formPre, formPost, formActions, actionLabels, resultRenderer, actionsContainer, getRowDetailHref, actionInitialValues, selectionNoun, lockedValues, initialValues, urlState, paginationMode, refreshIntervalMs, hiddenColumns, rowDetail, cellRenderers, rowCard, follow, rowSelection, }: OperationCatalogProps): import("react").JSX.Element;
120
122
  //# sourceMappingURL=OperationCatalog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"OperationCatalog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCatalog.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OperationCatalog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCatalog.tsx"],"names":[],"mappings":"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"}
@@ -49,6 +49,7 @@ function OperationCatalog({
49
49
  initialValues = EMPTY_INITIAL_VALUES,
50
50
  urlState,
51
51
  paginationMode,
52
+ refreshIntervalMs,
52
53
  hiddenColumns,
53
54
  rowDetail,
54
55
  cellRenderers,
@@ -142,7 +143,8 @@ function OperationCatalog({
142
143
  endpoint: listEndpoint,
143
144
  parameters: listParameters,
144
145
  filters: effectiveFilters,
145
- ...paginationMode ? { paginationMode } : {}
146
+ ...paginationMode ? { paginationMode } : {},
147
+ ...refreshIntervalMs !== void 0 ? { refreshIntervalMs } : {}
146
148
  });
147
149
  const { followEnabled, sessionOperation, followMissing, tail } = useOperationCatalogFollow({
148
150
  follow,