@flanksource/clicky-ui 0.3.41 → 0.3.42

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 (472) 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/rpc/OperationCatalog.cjs +3 -1
  441. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  442. package/dist/rpc/OperationCatalog.d.ts +3 -1
  443. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  444. package/dist/rpc/OperationCatalog.js +3 -1
  445. package/dist/rpc/OperationCatalog.js.map +1 -1
  446. package/dist/rpc/useOperationPages.cjs +6 -1
  447. package/dist/rpc/useOperationPages.cjs.map +1 -1
  448. package/dist/rpc/useOperationPages.d.ts +3 -1
  449. package/dist/rpc/useOperationPages.d.ts.map +1 -1
  450. package/dist/rpc/useOperationPages.js +6 -1
  451. package/dist/rpc/useOperationPages.js.map +1 -1
  452. package/dist/styles.css +1 -1
  453. package/package.json +1 -1
  454. package/schemas/json-schema-form.schema.json +5 -0
  455. package/dist/data/runtime/RuntimeBarCombo.cjs +0 -423
  456. package/dist/data/runtime/RuntimeBarCombo.cjs.map +0 -1
  457. package/dist/data/runtime/RuntimeBarCombo.d.ts +0 -33
  458. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +0 -1
  459. package/dist/data/runtime/RuntimeBarCombo.js +0 -423
  460. package/dist/data/runtime/RuntimeBarCombo.js.map +0 -1
  461. package/dist/data/runtime/RuntimeBarLimits.cjs +0 -262
  462. package/dist/data/runtime/RuntimeBarLimits.cjs.map +0 -1
  463. package/dist/data/runtime/RuntimeBarLimits.d.ts +0 -17
  464. package/dist/data/runtime/RuntimeBarLimits.d.ts.map +0 -1
  465. package/dist/data/runtime/RuntimeBarLimits.js +0 -262
  466. package/dist/data/runtime/RuntimeBarLimits.js.map +0 -1
  467. package/dist/data/runtime/RuntimeBarSegments.cjs +0 -346
  468. package/dist/data/runtime/RuntimeBarSegments.cjs.map +0 -1
  469. package/dist/data/runtime/RuntimeBarSegments.d.ts +0 -37
  470. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +0 -1
  471. package/dist/data/runtime/RuntimeBarSegments.js +0 -346
  472. package/dist/data/runtime/RuntimeBarSegments.js.map +0 -1
@@ -4,12 +4,14 @@ import { useFloatingTree, useFloatingNodeId, useFloatingParentNodeId, useListIte
4
4
  import { Icon } from "../data/Icon.js";
5
5
  import { MenuContext, MENU_POPOVER_CLASS } from "./dropdownMenuContext.js";
6
6
  import { useFloatingZIndex, useEscapeLayer } from "./modalStack.js";
7
+ import { cn } from "../lib/utils.js";
7
8
  import { UiChevronRight } from "../icons/components/UiChevronRight.js";
8
9
  const MENU_ITEM_CLASS = "flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50";
9
10
  const MENU_HEADER_CLASS = "select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground";
10
11
  function MenuItemIcon({
11
12
  icon,
12
- iconColor
13
+ iconColor,
14
+ iconClassName
13
15
  }) {
14
16
  if (!icon) return null;
15
17
  return (
@@ -20,7 +22,7 @@ function MenuItemIcon({
20
22
  /* @__PURE__ */ jsx(
21
23
  "span",
22
24
  {
23
- className: "inline-flex shrink-0 text-base",
25
+ className: cn("inline-flex shrink-0 text-base", iconClassName),
24
26
  style: iconColor ? { color: iconColor } : void 0,
25
27
  children: /* @__PURE__ */ jsx(Icon, { ...typeof icon === "string" ? { name: icon } : { icon } })
26
28
  }
@@ -58,7 +60,14 @@ function MenuLeaf({ item }) {
58
60
  }
59
61
  }),
60
62
  children: [
61
- /* @__PURE__ */ jsx(MenuItemIcon, { icon: item.icon, iconColor: item.iconColor }),
63
+ /* @__PURE__ */ jsx(
64
+ MenuItemIcon,
65
+ {
66
+ icon: item.icon,
67
+ iconColor: item.iconColor,
68
+ iconClassName: item.iconClassName
69
+ }
70
+ ),
62
71
  item.label
63
72
  ]
64
73
  }
@@ -84,7 +93,7 @@ function MenuSubmenu({ item }) {
84
93
  middleware: [
85
94
  offset({ mainAxis: 0, alignmentAxis: -4 }),
86
95
  flip({ padding: 8 }),
87
- shift({ padding: 8 })
96
+ shift({ padding: 8, crossAxis: true })
88
97
  ],
89
98
  whileElementsMounted: autoUpdate
90
99
  });
@@ -102,13 +111,9 @@ function MenuSubmenu({ item }) {
102
111
  onNavigate: setActiveIndex,
103
112
  loop: true
104
113
  });
105
- const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([
106
- hover,
107
- click,
108
- role,
109
- dismiss,
110
- listNav
111
- ]);
114
+ const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(
115
+ [hover, click, role, dismiss, listNav]
116
+ );
112
117
  useEscapeLayer(isOpen, () => setIsOpen(false));
113
118
  useEffect(() => {
114
119
  if (!tree) return;
@@ -158,7 +163,14 @@ function MenuSubmenu({ item }) {
158
163
  })
159
164
  ),
160
165
  children: [
161
- /* @__PURE__ */ jsx(MenuItemIcon, { icon: item.icon, iconColor: item.iconColor }),
166
+ /* @__PURE__ */ jsx(
167
+ MenuItemIcon,
168
+ {
169
+ icon: item.icon,
170
+ iconColor: item.iconColor,
171
+ iconClassName: item.iconClassName
172
+ }
173
+ ),
162
174
  /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate", children: item.label }),
163
175
  /* @__PURE__ */ jsx(Icon, { icon: UiChevronRight, className: "ml-auto shrink-0 opacity-60" })
164
176
  ]
@@ -181,16 +193,20 @@ function MenuSubmenu({ item }) {
181
193
  modal: false,
182
194
  initialFocus: -1,
183
195
  returnFocus: false,
184
- children: /* @__PURE__ */ jsx(
196
+ children: /* @__PURE__ */ jsxs(
185
197
  "div",
186
198
  {
187
199
  ref: refs.setFloating,
188
200
  role: "menu",
189
- "aria-label": ariaLabel,
190
201
  style: { ...floatingStyles, zIndex: floatingZ },
191
202
  className: MENU_POPOVER_CLASS,
192
203
  ...getFloatingProps(),
193
- children: /* @__PURE__ */ jsx(MenuItemList, { items: item.children ?? [] })
204
+ "aria-label": ariaLabel,
205
+ ...ariaLabel ? { "aria-labelledby": void 0 } : {},
206
+ children: [
207
+ item.header != null && /* @__PURE__ */ jsx("div", { className: "border-b border-border px-3 py-1.5", children: item.header }),
208
+ /* @__PURE__ */ jsx(MenuItemList, { items: item.children ?? [] })
209
+ ]
194
210
  }
195
211
  )
196
212
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownMenuSubmenu.js","sources":["../../src/overlay/DropdownMenuSubmenu.tsx"],"sourcesContent":["import { Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n type UseInteractionsReturn,\n} from \"@floating-ui/react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronRight } from \"../icons\";\nimport { MENU_POPOVER_CLASS, MenuContext } from \"./dropdownMenuContext\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\n\n// Shared item surfaces so a leaf renders identically in the root menu or a\n// flyout submenu.\nconst MENU_ITEM_CLASS =\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\";\nconst MENU_HEADER_CLASS =\n \"select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\";\n\nfunction MenuItemIcon({\n icon,\n iconColor,\n}: {\n icon: string | StaticIconComponent | undefined;\n iconColor: string | undefined;\n}) {\n if (!icon) return null;\n return (\n // `text-base` rather than inheriting the row: `Icon` sizes at 1em, so on a\n // `text-xs` row the glyph came out at 12px — smaller than anything a caller\n // puts in the label beside it, and too small to identify at a glance. The\n // row's content box is already 16px tall, so this does not change its height.\n <span\n className=\"inline-flex shrink-0 text-base\"\n style={iconColor ? { color: iconColor } : undefined}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} />\n </span>\n );\n}\n\nfunction MenuLeaf({ item }: { item: DropdownMenuItem }) {\n const menu = useContext(MenuContext);\n const tree = useFloatingTree();\n const listItem = useListItem();\n const isActive = listItem.index === menu.activeIndex;\n\n const activate = () => {\n if (item.disabled) return;\n item.onSelect();\n // A selection closes every open level; each menu subscribes to \"click\".\n tree?.events.emit(\"click\");\n };\n\n return (\n <button\n ref={listItem.ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n className={MENU_ITEM_CLASS}\n {...menu.getItemProps({\n onClick: activate,\n onFocus: () => menu.setHasFocusInside(true),\n onKeyDown: (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n activate();\n }\n },\n })}\n >\n <MenuItemIcon icon={item.icon} iconColor={item.iconColor} />\n {item.label}\n </button>\n );\n}\n\nfunction MenuSubmenu({ item }: { item: DropdownMenuItem }) {\n const parent = useContext(MenuContext);\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const listItem = useListItem();\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const floatingZ = useFloatingZIndex();\n\n const { refs, floatingStyles, context } = useFloating<HTMLButtonElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: \"right-start\",\n middleware: [\n offset({ mainAxis: 0, alignmentAxis: -4 }),\n flip({ padding: 8 }),\n shift({ padding: 8 }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context, {\n delay: { open: 75 },\n handleClose: safePolygon(),\n });\n // Hover opens the flyout for mouse users; click/tap also opens it (touch and\n // keyboard) but never toggles it shut — leaving via safePolygon or selecting a\n // leaf is what closes it.\n const click = useClick(context, { toggle: false });\n const role = useRole(context, { role: \"menu\" });\n // Escape is owned by useEscapeLayer (below) so it dismisses one menu level at\n // a time and cooperates with modals; useDismiss keeps outside-press dismissal.\n const dismiss = useDismiss(context, { escapeKey: false, bubbles: true });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: true,\n onNavigate: setActiveIndex,\n loop: true,\n });\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([\n hover,\n click,\n role,\n dismiss,\n listNav,\n ]);\n\n useEscapeLayer(isOpen, () => setIsOpen(false));\n\n useEffect(() => {\n if (!tree) return;\n const closeAll = () => setIsOpen(false);\n const closeSiblings = (event: {\n nodeId: string;\n parentId: string | null;\n }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n setIsOpen(false);\n }\n };\n tree.events.on(\"click\", closeAll);\n tree.events.on(\"menuopen\", closeSiblings);\n return () => {\n tree.events.off(\"click\", closeAll);\n tree.events.off(\"menuopen\", closeSiblings);\n };\n }, [tree, nodeId, parentId]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [isOpen, tree, nodeId, parentId]);\n\n const isActive = listItem.index === parent.activeIndex;\n const referenceRef = useMergeRefs([refs.setReference, listItem.ref]);\n const ariaLabel = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <FloatingNode id={nodeId}>\n <button\n ref={referenceRef}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n className={MENU_ITEM_CLASS}\n {...parent.getItemProps(\n // Merge the parent's roving-tabindex props with this trigger's own\n // reference props (open on hover/click/ArrowRight). Both prop-getters\n // return an opaque prop bag; the cast bridges the two getter\n // signatures (getReferenceProps -> getItemProps parameter).\n getReferenceProps({\n onFocus: () => {\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n }) as unknown as Parameters<UseInteractionsReturn[\"getItemProps\"]>[0],\n )}\n >\n <MenuItemIcon icon={item.icon} iconColor={item.iconColor} />\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <Icon icon={UiChevronRight} className=\"ml-auto shrink-0 opacity-60\" />\n </button>\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside,\n isOpen,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n returnFocus={false}\n >\n <div\n ref={refs.setFloating}\n role=\"menu\"\n aria-label={ariaLabel}\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={MENU_POPOVER_CLASS}\n {...getFloatingProps()}\n >\n <MenuItemList items={item.children ?? []} />\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n}\n\n/**\n * Renders one menu level: a leaf `menuitem` button, or a submenu trigger when\n * the item has `children`. A group header renders above the first item of each\n * contiguous group (headers are not focusable, so keyboard navigation stays\n * dense over the interactive items). Must be rendered inside a `FloatingList`\n * whose `elementsRef` backs the enclosing menu's list navigation.\n */\nexport function MenuItemList({ items }: { items: DropdownMenuItem[] }) {\n return (\n <>\n {items.map((item, index) => {\n const showHeader =\n item.group != null && item.group !== items[index - 1]?.group;\n const hasChildren = !!item.children && item.children.length > 0;\n return (\n <Fragment key={index}>\n {showHeader && (\n <div role=\"presentation\" className={MENU_HEADER_CLASS}>\n {item.group}\n </div>\n )}\n {hasChildren ? (\n <MenuSubmenu item={item} />\n ) : (\n <MenuLeaf item={item} />\n )}\n </Fragment>\n );\n })}\n </>\n );\n}\n"],"names":["Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"DropdownMenuSubmenu.js","sources":["../../src/overlay/DropdownMenuSubmenu.tsx"],"sourcesContent":["import { Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n type UseInteractionsReturn,\n} from \"@floating-ui/react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronRight } from \"../icons\";\nimport { MENU_POPOVER_CLASS, MenuContext } from \"./dropdownMenuContext\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\nimport { cn } from \"../lib/utils\";\n\n// Shared item surfaces so a leaf renders identically in the root menu or a\n// flyout submenu.\nconst MENU_ITEM_CLASS =\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\";\nconst MENU_HEADER_CLASS =\n \"select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\";\n\nfunction MenuItemIcon({\n icon,\n iconColor,\n iconClassName,\n}: {\n icon: string | StaticIconComponent | undefined;\n iconColor: string | undefined;\n iconClassName: string | undefined;\n}) {\n if (!icon) return null;\n return (\n // `text-base` rather than inheriting the row: `Icon` sizes at 1em, so on a\n // `text-xs` row the glyph came out at 12px — smaller than anything a caller\n // puts in the label beside it, and too small to identify at a glance. The\n // row's content box is already 16px tall, so this does not change its height.\n <span\n className={cn(\"inline-flex shrink-0 text-base\", iconClassName)}\n style={iconColor ? { color: iconColor } : undefined}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} />\n </span>\n );\n}\n\nfunction MenuLeaf({ item }: { item: DropdownMenuItem }) {\n const menu = useContext(MenuContext);\n const tree = useFloatingTree();\n const listItem = useListItem();\n const isActive = listItem.index === menu.activeIndex;\n\n const activate = () => {\n if (item.disabled) return;\n item.onSelect();\n // A selection closes every open level; each menu subscribes to \"click\".\n tree?.events.emit(\"click\");\n };\n\n return (\n <button\n ref={listItem.ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n className={MENU_ITEM_CLASS}\n {...menu.getItemProps({\n onClick: activate,\n onFocus: () => menu.setHasFocusInside(true),\n onKeyDown: (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n activate();\n }\n },\n })}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n {item.label}\n </button>\n );\n}\n\nfunction MenuSubmenu({ item }: { item: DropdownMenuItem }) {\n const parent = useContext(MenuContext);\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const listItem = useListItem();\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const floatingZ = useFloatingZIndex();\n\n const { refs, floatingStyles, context } = useFloating<HTMLButtonElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: \"right-start\",\n middleware: [\n offset({ mainAxis: 0, alignmentAxis: -4 }),\n flip({ padding: 8 }),\n shift({ padding: 8, crossAxis: true }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context, {\n delay: { open: 75 },\n handleClose: safePolygon(),\n });\n // Hover opens the flyout for mouse users; click/tap also opens it (touch and\n // keyboard) but never toggles it shut — leaving via safePolygon or selecting a\n // leaf is what closes it.\n const click = useClick(context, { toggle: false });\n const role = useRole(context, { role: \"menu\" });\n // Escape is owned by useEscapeLayer (below) so it dismisses one menu level at\n // a time and cooperates with modals; useDismiss keeps outside-press dismissal.\n const dismiss = useDismiss(context, { escapeKey: false, bubbles: true });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: true,\n onNavigate: setActiveIndex,\n loop: true,\n });\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNav],\n );\n\n useEscapeLayer(isOpen, () => setIsOpen(false));\n\n useEffect(() => {\n if (!tree) return;\n const closeAll = () => setIsOpen(false);\n const closeSiblings = (event: {\n nodeId: string;\n parentId: string | null;\n }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n setIsOpen(false);\n }\n };\n tree.events.on(\"click\", closeAll);\n tree.events.on(\"menuopen\", closeSiblings);\n return () => {\n tree.events.off(\"click\", closeAll);\n tree.events.off(\"menuopen\", closeSiblings);\n };\n }, [tree, nodeId, parentId]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [isOpen, tree, nodeId, parentId]);\n\n const isActive = listItem.index === parent.activeIndex;\n const referenceRef = useMergeRefs([refs.setReference, listItem.ref]);\n const ariaLabel = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <FloatingNode id={nodeId}>\n <button\n ref={referenceRef}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n className={MENU_ITEM_CLASS}\n {...parent.getItemProps(\n // Merge the parent's roving-tabindex props with this trigger's own\n // reference props (open on hover/click/ArrowRight). Both prop-getters\n // return an opaque prop bag; the cast bridges the two getter\n // signatures (getReferenceProps -> getItemProps parameter).\n getReferenceProps({\n onFocus: () => {\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n }) as unknown as Parameters<UseInteractionsReturn[\"getItemProps\"]>[0],\n )}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <Icon icon={UiChevronRight} className=\"ml-auto shrink-0 opacity-60\" />\n </button>\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside,\n isOpen,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n returnFocus={false}\n >\n <div\n ref={refs.setFloating}\n role=\"menu\"\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={MENU_POPOVER_CLASS}\n {...getFloatingProps()}\n aria-label={ariaLabel}\n {...(ariaLabel ? { \"aria-labelledby\": undefined } : {})}\n >\n {item.header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {item.header}\n </div>\n )}\n <MenuItemList items={item.children ?? []} />\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n}\n\n/**\n * Renders one menu level: a leaf `menuitem` button, or a submenu trigger when\n * the item has `children`. A group header renders above the first item of each\n * contiguous group (headers are not focusable, so keyboard navigation stays\n * dense over the interactive items). Must be rendered inside a `FloatingList`\n * whose `elementsRef` backs the enclosing menu's list navigation.\n */\nexport function MenuItemList({ items }: { items: DropdownMenuItem[] }) {\n return (\n <>\n {items.map((item, index) => {\n const showHeader =\n item.group != null && item.group !== items[index - 1]?.group;\n const hasChildren = !!item.children && item.children.length > 0;\n return (\n <Fragment key={index}>\n {showHeader && (\n <div role=\"presentation\" className={MENU_HEADER_CLASS}>\n {item.group}\n </div>\n )}\n {hasChildren ? (\n <MenuSubmenu item={item} />\n ) : (\n <MenuLeaf item={item} />\n )}\n </Fragment>\n );\n })}\n </>\n );\n}\n"],"names":["Fragment"],"mappings":";;;;;;;;AAkCA,MAAM,kBACJ;AACF,MAAM,oBACJ;AAEF,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,MAAI,CAAC,KAAM,QAAO;AAClB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAG,kCAAkC,aAAa;AAAA,QAC7D,OAAO,YAAY,EAAE,OAAO,cAAc;AAAA,QAE1C,UAAA,oBAAC,MAAA,EAAM,GAAI,OAAO,SAAS,WAAW,EAAE,MAAM,SAAS,EAAE,KAAA,EAAK,CAAI;AAAA,MAAA;AAAA,IAAA;AAAA;AAGxE;AAEA,SAAS,SAAS,EAAE,QAAoC;AACtD,QAAM,OAAO,WAAW,WAAW;AACnC,QAAM,OAAO,gBAAA;AACb,QAAM,WAAW,YAAA;AACjB,QAAM,WAAW,SAAS,UAAU,KAAK;AAEzC,QAAM,WAAW,MAAM;AACrB,QAAI,KAAK,SAAU;AACnB,SAAK,SAAA;AAEL,iCAAM,OAAO,KAAK;AAAA,EACpB;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK,SAAS;AAAA,MACd,MAAK;AAAA,MACL,MAAK;AAAA,MACL,UAAU,WAAW,IAAI;AAAA,MACzB,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,WAAW;AAAA,MACV,GAAG,KAAK,aAAa;AAAA,QACpB,SAAS;AAAA,QACT,SAAS,MAAM,KAAK,kBAAkB,IAAI;AAAA,QAC1C,WAAW,CAAC,UAAU;AACpB,cAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,kBAAM,eAAA;AACN,qBAAA;AAAA,UACF;AAAA,QACF;AAAA,MAAA,CACD;AAAA,MAED,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,WAAW,KAAK;AAAA,YAChB,eAAe,KAAK;AAAA,UAAA;AAAA,QAAA;AAAA,QAErB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGZ;AAEA,SAAS,YAAY,EAAE,QAAoC;AACzD,QAAM,SAAS,WAAW,WAAW;AACrC,QAAM,OAAO,gBAAA;AACb,QAAM,SAAS,kBAAA;AACf,QAAM,WAAW,wBAAA;AACjB,QAAM,WAAW,YAAA;AAEjB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAwB,IAAI;AAClE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAC1D,QAAM,cAAc,OAAkC,EAAE;AACxD,QAAM,YAAY,kBAAA;AAElB,QAAM,EAAE,MAAM,gBAAgB,QAAA,IAAY,YAA+B;AAAA;AAAA,IAEvE,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,IAC1B,MAAM;AAAA,IACN,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,MACV,OAAO,EAAE,UAAU,GAAG,eAAe,IAAI;AAAA,MACzC,KAAK,EAAE,SAAS,GAAG;AAAA,MACnB,MAAM,EAAE,SAAS,GAAG,WAAW,MAAM;AAAA,IAAA;AAAA,IAEvC,sBAAsB;AAAA,EAAA,CACvB;AAED,QAAM,QAAQ,SAAS,SAAS;AAAA,IAC9B,OAAO,EAAE,MAAM,GAAA;AAAA,IACf,aAAa,YAAA;AAAA,EAAY,CAC1B;AAID,QAAM,QAAQ,SAAS,SAAS,EAAE,QAAQ,OAAO;AACjD,QAAM,OAAO,QAAQ,SAAS,EAAE,MAAM,QAAQ;AAG9C,QAAM,UAAU,WAAW,SAAS,EAAE,WAAW,OAAO,SAAS,MAAM;AACvE,QAAM,UAAU,kBAAkB,SAAS;AAAA,IACzC,SAAS;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,MAAM;AAAA,EAAA,CACP;AACD,QAAM,EAAE,mBAAmB,kBAAkB,aAAA,IAAiB;AAAA,IAC5D,CAAC,OAAO,OAAO,MAAM,SAAS,OAAO;AAAA,EAAA;AAGvC,iBAAe,QAAQ,MAAM,UAAU,KAAK,CAAC;AAE7C,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,WAAW,MAAM,UAAU,KAAK;AACtC,UAAM,gBAAgB,CAAC,UAGjB;AACJ,UAAI,MAAM,WAAW,UAAU,MAAM,aAAa,UAAU;AAC1D,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AACA,SAAK,OAAO,GAAG,SAAS,QAAQ;AAChC,SAAK,OAAO,GAAG,YAAY,aAAa;AACxC,WAAO,MAAM;AACX,WAAK,OAAO,IAAI,SAAS,QAAQ;AACjC,WAAK,OAAO,IAAI,YAAY,aAAa;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,QAAQ,CAAC;AAE3B,YAAU,MAAM;AACd,QAAI,UAAU,KAAM,MAAK,OAAO,KAAK,YAAY,EAAE,UAAU,QAAQ;AAAA,EACvE,GAAG,CAAC,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAEnC,QAAM,WAAW,SAAS,UAAU,OAAO;AAC3C,QAAM,eAAe,aAAa,CAAC,KAAK,cAAc,SAAS,GAAG,CAAC;AACnE,QAAM,YAAY,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAEhE,SACE,qBAAC,cAAA,EAAa,IAAI,QAChB,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAU,WAAW,IAAI;AAAA,QACzB,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,qBAAmB,iBAAiB,KAAK;AAAA,QACzC,WAAW;AAAA,QACV,GAAG,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,UAKT,kBAAkB;AAAA,YAChB,SAAS,MAAM;AACb,gCAAkB,KAAK;AACvB,qBAAO,kBAAkB,IAAI;AAAA,YAC/B;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAGH,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM,KAAK;AAAA,cACX,WAAW,KAAK;AAAA,cAChB,eAAe,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAEtB,oBAAC,QAAA,EAAK,WAAU,2BAA2B,eAAK,OAAM;AAAA,UACtD,oBAAC,MAAA,EAAK,MAAM,gBAAgB,WAAU,8BAAA,CAA8B;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEtE;AAAA,MAAC,YAAY;AAAA,MAAZ;AAAA,QACC,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAGF,UAAA,oBAAC,cAAA,EAAa,aACX,UAAA,8BACE,gBAAA,EACC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,OAAO;AAAA,YACP,cAAc;AAAA,YACd,aAAa;AAAA,YAEb,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAK,KAAK;AAAA,gBACV,MAAK;AAAA,gBACL,OAAO,EAAE,GAAG,gBAAgB,QAAQ,UAAA;AAAA,gBACpC,WAAW;AAAA,gBACV,GAAG,iBAAA;AAAA,gBACJ,cAAY;AAAA,gBACX,GAAI,YAAY,EAAE,mBAAmB,OAAA,IAAc,CAAA;AAAA,gBAEnD,UAAA;AAAA,kBAAA,KAAK,UAAU,QACd,oBAAC,SAAI,WAAU,sCACZ,eAAK,OAAA,CACR;AAAA,sCAED,cAAA,EAAa,OAAO,KAAK,YAAY,CAAA,EAAC,CAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAC5C;AAAA,QAAA,GAEJ,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AASO,SAAS,aAAa,EAAE,SAAwC;AACrE,SACE,oBAAA,UAAA,EACG,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU;;AAC1B,UAAM,aACJ,KAAK,SAAS,QAAQ,KAAK,YAAU,WAAM,QAAQ,CAAC,MAAf,mBAAkB;AACzD,UAAM,cAAc,CAAC,CAAC,KAAK,YAAY,KAAK,SAAS,SAAS;AAC9D,WACE,qBAACA,YAAA,EACE,UAAA;AAAA,MAAA,kCACE,OAAA,EAAI,MAAK,gBAAe,WAAW,mBACjC,eAAK,MAAA,CACR;AAAA,MAED,cACC,oBAAC,aAAA,EAAY,MAAY,IAEzB,oBAAC,YAAS,KAAA,CAAY;AAAA,IAAA,EAAA,GATX,KAWf;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;AAwMA,MAAM,qBAAqB,CAAC,gBAAwB,aAAa,WAAW;AAC5E,MAAM,sBAA8C,CAAA;AACpD,MAAM,uBAA+C,CAAA;AAE9C,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,cAAcA,0BAAAA;AAAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;;AACxB,QAAM,kBAAkB,uCAAW;AACnC,QAAM,iBAAiB,uCAAW;AAClC,QAAM,sBAAsB,uCAAW;AACvC,QAAM,iBAAiB,uCAAW;AAClC,QAAM,EAAE,YAAY,MAAM,UAAA,IAAcC,cAAAA,cAAc,MAAM;AAC5D,QAAM,gBAAe,kCAAM,eAAN,mBAAmB;AAExC,QAAM,aAAaC,MAAAA;AAAAA,IACjB,MAAMC,eAAAA,0BAA0B,YAAY,UAAU;AAAA,IACtD,CAAC,YAAY,UAAU;AAAA,EAAA;AAEzB,QAAM,qBAAqB,WAAW,SAAS;AAE/C,QAAM,YAAYD,MAAAA,QAAQ,MAAM;AAC9B,QAAI,mBAAoB,QAAO;AAC/B,WAAO,gBACH,aACAE,kCAAyB,YAAY,QAAQ;AAAA,EACnD,GAAG,CAAC,eAAe,UAAU,YAAY,YAAY,kBAAkB,CAAC;AAExE,QAAM,eAAeF,MAAAA,QAAQ,MAAM;AACjC,QAAI,CAAC,mBAAoB,QAAO;AAChC,WAAOG,eAAAA,yBAAyB,WAAW,UAAU;AAAA,EACvD,GAAG,CAAC,WAAW,YAAY,kBAAkB,CAAC;AAC9C,QAAM,kBAAkBH,MAAAA;AAAAA,IACtB,MACE,qBACII,eAAAA,2BAA2B,WAAW,UAAU,IAChD;AAAA,IACN,CAAC,WAAW,YAAY,kBAAkB;AAAA,EAAA;AAE5C,QAAM,kBAAiB,6CAAc,UAAU,eAAc,CAAA;AAC7D,QAAM,EAAE,SAAS,YAAY,iBAAA,IAC3BC,4BAAAA,+BAA+B;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AACH,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,MAAAA,SAAmB,CAAA,CAAE;AACjE,QAAM,CAAC,cAAc,eAAe,IAAIA,MAAAA,SAAsB,CAAA,CAAE;AAChE,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,eAAA;AAC9C,QAAM,iCAAiCN,MAAAA;AAAAA,IACrC,MACE,eACG;AAAA,MACC,CAAC;;AACC,gBAAC,CAAC,SAAS,UAAU,UAAU,QAAQ,OAAO,EAAE;AAAA,YAC9CO,MAAA,UAAU,UAAU,MAApB,gBAAAA,IAAuB,SAAQ;AAAA,QAAA;AAAA;AAAA,IACjC,EAEH,IAAI,CAAC,cAAc,UAAU,IAAI;AAAA,IACtC,CAAC,cAAc;AAAA,EAAA;AAEjB,QAAM,sBAAsBP,MAAAA;AAAAA,IAC1B,MACE,KAAK;AAAA,MACH,+BAA+B,IAAI,CAAC,SAAS;AAAA,QAC3C;AAAA,QACA,QAAQ,IAAI,KAAK;AAAA,MAAA,CAClB;AAAA,IAAA;AAAA,IAEL,CAAC,SAAS,8BAA8B;AAAA,EAAA;AAE1C,QAAM,8BAA8BQ,MAAAA,OAAO,mBAAmB;AAC9DC,QAAAA,UAAU,MAAM;AACd,QAAI,4BAA4B,YAAY,qBAAqB;AAC/D,wBAAkB,CAAA,CAAE;AACpB,sBAAgB,CAAA,CAAE;AAClB,yBAAmB,MAAS;AAC5B,kCAA4B,UAAU;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,mBAAmB,CAAC;AACxB,QAAM,mBAAmBT,MAAAA;AAAAA,IACvB,MAAMU,aAAAA,0BAA0B,kBAAkB,cAAc;AAAA,IAChE,CAAC,kBAAkB,cAAc;AAAA,EAAA;AAEnC,QAAM,WAAWV,MAAAA,QAA2C,MAAM;;AAChE,UAAM,QAAOO,MAAA,6CAAc,UAAU,gBAAxB,gBAAAA,IAAqC;AAClD,QAAI,CAAC,KAAM,QAAO;AAClB,WAAO;AAAA,MACL,OAAO,WAAW;AAAA,MAClB,GAAI,KAAK,UACL,EAAE,SAAS,KAAK,QAAA,IAChB,CAAA;AAAA,MACJ,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAA,IAAW,CAAA;AAAA,MAC5C,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAA,IAAgB,CAAA;AAAA,MAC3D,GAAI,KAAK,gBACL;AAAA,QACE,eAAe,KAAK;AAAA,MAAA,IAItB,CAAA;AAAA,IAAC;AAAA,EAET,GAAG,CAAC,WAAW,OAAO,YAAY,CAAC;AAEnC,QAAM,OAAOI,kBAAAA,kBAAkB;AAAA,IAC7B;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,GAAI,iBAAiB,EAAE,mBAAmB,CAAA;AAAA,EAAC,CAC5C;AAED,QAAM,EAAE,eAAe,kBAAkB,eAAe,KAAA,IACtDC,0BAAAA,0BAA0B;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,CAAC,CAAC;AAAA,EAAA,CACd;AACH,QAAM,kBAAkB,OAAO,WAAW,aAAY,iCAAQ,UAAS;AACvE,QAAM,cAAcJ,MAAAA,OAAO,KAAK,OAAO;AACvC,cAAY,UAAU,KAAK;AAC3B,QAAM,cAAcA,MAAAA,OAAO,kBAAkB,OAAO,cAAc,MAAS;AAC3E,cAAY,UAAU,kBAAkB,OAAO,cAAc;AAC7DC,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,mBAAmB,KAAK,iBAAiB,KAAM;AACpD,UAAM,WAAW,KAAK;AACtB,UAAM,QAAQ,WAAW,MAAM;;AAC7B,kBAAY,QAAA;AACZ,OAAAF,MAAA,YAAY,YAAZ,gBAAAA,IAAA,kBAAsB;AAAA,IACxB,GAAG,GAAG;AACN,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,iBAAiB,KAAK,YAAY,CAAC;AAEvCM,qCAAuB;AAAA,IACrB,OAAO,KAAK;AAAA,IACZ,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,WAAW;AAAA,EAAA,CACZ;AAED,QAAM,cAAcC,WAAAA,SAAkC;AAAA,IACpD,GAAGC,kDAAqB,QAAQ,cAAc,gBAAgB;AAAA,IAC9D,SAAS,CAAC,CAAC,gBAAgB,CAAC,CAAC,OAAO;AAAA,IACpC,iBAAiBC,WAAAA;AAAAA,IACjB,WAAW;AAAA,IACX,OAAO;AAAA,EAAA,CACR;AAED,QAAM,YAAYhB,MAAAA;AAAAA,IAChB,MACE,qBACIiB,eAAAA,6BAA6B,WAAW,UAAU,IAClD,CAAA;AAAA,IACN,CAAC,WAAW,YAAY,kBAAkB;AAAA,EAAA;AAE5C,QAAM,qBAAqBjB,MAAAA;AAAAA,IACzB,MACE,UAAU;AAAA,MACR,CAAC,cAAA;;AAAckB,gBAAAA,MAAAA,sCAAuB,SAAS,MAAhCA,gBAAAA,IAAmC;AAAA;AAAA,IAAA;AAAA,IAEtD,CAAC,SAAS;AAAA,EAAA;AAEZ,QAAM,sBAAsBlB,MAAAA;AAAAA,IAC1B,MACE,UAAU;AAAA,MACR,CAAC,cAAA;;AAAc,kBAACkB,MAAAA,sCAAuB,SAAS,MAAhCA,gBAAAA,IAAmC;AAAA;AAAA,IAAA;AAAA,IAEvD,CAAC,SAAS;AAAA,EAAA;AAGZ,QAAM,eAAeC,sBAAAA;AAAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGF,QAAM,kBAAkBnB,MAAAA,QAAQ,MAAM;AACpC,UAAM,UAAgC;AAAA,MACpC,kBAAkB,CAAC,OAAO;AAAA,MAC1B;AAAA,MACA,YAAY;AAAA,MACZ;AAAA,MACA,YAAY;AAAA,IAAA;AAEd,QAAI,YAAY,QAAQ,MAAM;AAC5B,cAAQ,SAAS,YAAY;AAAA,IAC/B;AACA,WAAOoB,aAAAA,uBAAuB,gBAAgB,SAAS,YAAY,OAAO;AAAA,EAC5E,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,EAAA,CACD;AACD,QAAM,sBAAsBpB,MAAAA;AAAAA,IAC1B,MACEqB,aAAAA,4BAA4B,gBAAgB,YAAY,KAAK,QAAQ;AAAA,IACvE,CAAC,gBAAgB,YAAY,KAAK,QAAQ;AAAA,EAAA;AAE5C,QAAM,cAAcC,uBAAAA,gBAAe,2BAAgB,SAAhB,mBAAsB,UAAtB,mBAA6B,GAAG;AACnE,QAAM,qBAAqBtB,MAAAA;AAAAA,IACzB,MACE,gBAAgB,YACZuB,eAAAA;AAAAA,MACE;AAAA,QACE,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OACE,gBAAgB,UAAU,gBAAgB,QACtC,eACA;AAAA,QACN,GAAG,gBAAgB;AAAA,MAAA;AAAA,MAErB;AAAA,IAAA,IAEF;AAAA,IACN,CAAC,gBAAgB,WAAW,SAAS;AAAA,EAAA;AAEvC,QAAM,mBAAmBvB,MAAAA,QAAQ,MAAM;AACrC,UAAM,OAAO,gBAAgB,QAAQ;AAAA,MAAI,CAAC,WACxCuB,qCAAsB,QAAQ,SAAS;AAAA,IAAA;AAEzC,SAAI,yDAAoB,eAAc,YAAY;AAChD,WAAK,KAAK,kBAAkB;AAAA,IAC9B;AACA,WAAO;AAAA,EACT,GAAG,CAAC,oBAAoB,gBAAgB,SAAS,SAAS,CAAC;AAC3D,QAAM,cAAcvB,MAAAA;AAAAA,IAClB,MACE,OAAO;AAAA,MACL,eACG,OAAO,CAAC,cAAA;;AAAc,iBAAAO,MAAA,UAAU,UAAU,MAApB,gBAAAA,IAAuB,UAAS;AAAA,OAAQ,EAC9D,IAAI,CAAC,cAAc;AAAA,QAClB,UAAU;AAAA,QACViB,sBAAAA,sBAAsB,QAAQ,UAAU,IAAI,KAAK,EAAE;AAAA,MAAA,CACpD;AAAA,IAAA;AAAA,IAEP,CAAC,SAAS,cAAc;AAAA,EAAA;AAE1B,QAAM,qBAAqBC,MAAAA;AAAAA,IACzB,CAAC,EAAE,KAAK,OAAO,WAA6B;AAC1C,UACE,CAAC,eAAe;AAAA,QACd,CAAC;;AACC,2BAAU,SAAS,SAAOlB,MAAA,UAAU,UAAU,MAApB,gBAAAA,IAAuB,UAAS;AAAA;AAAA,MAAA,GAE9D;AACA,cAAM,IAAI;AAAA,UACR,2DAA2D,GAAG;AAAA,QAAA;AAAA,MAElE;AAEA,iBAAW,CAAC,YAAY;AACtB,cAAM,WAAWiB,sBAAAA,sBAAsB,QAAQ,GAAG,KAAK,EAAE;AACzD,YAAI,SAAS,QAAW;AACtB,iBAAO,SAAS,KAAK;AAAA,QACvB,OAAO;AACL,mBAAS,KAAK,IAAI;AAAA,QACpB;AAEA,cAAM,OAAO,EAAE,GAAG,QAAA;AAClB,cAAM,aAAaE,sBAAAA,0BAA0B,QAAQ;AACrD,YAAI,YAAY;AACd,eAAK,GAAG,IAAI;AAAA,QACd,OAAO;AACL,iBAAO,KAAK,GAAG;AAAA,QACjB;AAEA,cAAM,SAAS,eAAe;AAAA,UAC5B,CAAC,cAAA;;AAAc,qBAAAnB,MAAA,UAAU,UAAU,MAApB,gBAAAA,IAAuB,UAAS;AAAA;AAAA,QAAA;AAEjD,YAAI,OAAQ,MAAK,OAAO,IAAI,IAAI;AAChC,cAAM,SAASoB,YAAAA,oBAAoB,cAAc;AACjD,YAAI,OAAQ,MAAK,MAAM,IAAI;AAC3B,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA,CAAC,cAAc;AAAA,EAAA;AAEjB,QAAM,qBAAqB3B,MAAAA;AAAAA,IACzB,OAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,GAAI,gBAAgB,SAAS,EAAE,QAAQ,gBAAgB,OAAA,IAAW,CAAA;AAAA,MAClE,GAAI,gBAAgB,cACpB,yDAAoB,eAAc,aAC9B,EAAE,WAAW,gBAAgB,cAC7B,CAAA;AAAA,IAAC;AAAA,IAEP;AAAA,MACE;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB,yDAAoB;AAAA,MACpB;AAAA,IAAA;AAAA,EACF;AAGF,QAAM,kBAAkBA,MAAAA;AAAAA,IACtB,MACE,eACI4B,6BAAAA,wBAAwB,cAAc,gBAAgB,IACtD;AAAA,IACN,CAAC,kBAAkB,YAAY;AAAA,EAAA;AAGjC,QAAM,YAAY,CAAC,CAAC;AACpB,MAAI,gBAAgB,CAAC,aAAa,CAAC,WAAW;AAC5C,UAAM,IAAI;AAAA,MACR,sEAAsE,cAAc,WAAW,KAAK;AAAA,IAAA;AAAA,EAExG;AACA,MAAI;AACJ,MAAI,CAAC,KAAK,YAAY;AACpB,QAAI,KAAK,SAAS;AAChB,kBAAY,KAAK;AAAA,IACnB,aAAW,UAAK,aAAL,mBAAe,aAAY,OAAO;AAC3C,kBAAY,IAAIC,UAAAA;AAAAA,QACd,KAAK,SAAS,SACZ,KAAK,SAAS,WACd,KAAK,SAAS,UACd,iCAAiC,KAAK,SAAS,SAAS;AAAA,QAC1D;AAAA,UACE,QAAQ,6CAAc;AAAA,UACtB,KAAK,KAAK,SAAS;AAAA,UACnB,cAAc,KAAK,SAAS;AAAA,UAC5B,cAAc,KAAK,SAAS;AAAA,UAC5B,iBAAiB,KAAK,SAAS;AAAA,QAAA;AAAA,MACjC;AAAA,IAEJ;AAAA,EACF;AACA,QAAM,aACJ,cAAc,SACV,YAAY,WAAW,mBAAkB,6CAAc,SAAQ,EAAE,EAAE,IACnE;AACN,QAAM,kBAAgB,UAAK,aAAL,mBAAe,aAAY,QAAQ,OAAO,KAAK;AAKrE,QAAM,kBAAkBC,uBAAAA,oBAAoB,KAAK,MAAM,KAAK,UAAU;AACtE,QAAM,oBACJ,KAAK,UACJ,CAAC,mBAAmB,gBAAgB,mBACjC;AAAA,IACE,OAAO;AAAA,IACP,SACE;AAAA,EAAA,IAEJ;AACN,QAAM,cACJ,iBAAiB,oBAAoB,CAAC,kBAClCC,uBAAAA;AAAAA,IACE;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,EAAA,IAEF;AACN,QAAM,kBAAkB,6CAAc;AACtC,QAAM,WAAW,CAAC,aAChB,YAAY,kBACRC,iDAAoB,UAAU,eAAe,IAC7C;AACN,QAAM,sBAAsB;AAAA,IAC1B,cAAc,YAAY,WAAW;AAAA,EAAA;AAKvC,QAAM,oBACJ,eAAe,YAAY,aAAa,KAAK,sBACzC;AAAA,IACE,GAAG;AAAA,IACH,QAAQ,oBAAoB,SAAS,KAAK,YAAY;AAAA,IACtD,eAAe;AAAA,EAAA,IAEjB;AACN,QAAM,YAAY,KAAK,WACnB;AAAA,IACE,OAAO,kBACH,KAAK,MAAM,IAAI,CAAC,SAASA,6BAAAA,oBAAoB,MAAM,eAAe,CAAC,IACnE,KAAK;AAAA,IACT,UAAU,KAAK;AAAA,EAAA,IAEjB,CAAA;AACJ,MAAI,aAAc,aAAa,KAAK,aAAa,KAAK,YAAY,MAAO;AACvE,WACEC,+BAACC,QAAAA,WAAQ,SAAQ,YAAW,OAAO,WAAW,WAAW,KAAK,IAAA,CAAK;AAAA,EAEvE;AAEA,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,aAAU;AAAA,MAKT,UAAA;AAAA,QAAA,CAAC,gBAAgBF,2BAAAA;AAAAA,UAACG,wBAAAA;AAAAA,UAAA;AAAA,YACjB,SAAS;AAAA,YACT,kBAAkB;AAAA,YAClB;AAAA,YACA,sBAAsB,eAAe,IAAI,CAAC,cAAc,UAAU,IAAI;AAAA,YACtE;AAAA,YACA;AAAA,YACA;AAAA,YACC,GAAI,oBAAmB,2DAAqB,UAAS,OAClD;AAAA,cACE,eAAe;AAAA,gBACb,IAAI;AAAA,gBACJ,OAAO,oBAAoB;AAAA,cAAA;AAAA,YAC7B,IAEF,CAAA;AAAA,YACJ,gBAAgB,MAAM;AACpB,gCAAkB,CAAA,CAAE;AACpB,8BAAgB,CAAA,CAAE;AAClB,iCAAmB,MAAS;AAAA,YAC9B;AAAA,YACA,YAAY,MAAM,KAAK,QAAA;AAAA,YACtB,GAAI,mBAAmB,EAAE,iBAAA,IAAqB,CAAA;AAAA,YAC9C,GAAI,sBACD,EAAE,uBAAuB,oBAAA,IACzB,CAAA;AAAA,YACH,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,YAC1C,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA;AAAA,YAC5B,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA;AAAA,YAC9B,GAAI,cAAc,EAAE,YAAA,IAAgB,CAAA;AAAA,YACpC,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,YACvC;AAAA,UAAA;AAAA,QAAA;AAAA,QAGD,YACCH,2BAAAA,IAAC,OAAA,EAAI,WAAU,gCAA+B,aAAU,6BACrD,UAAA,gBACC;AAAA,UACE,IAAI;AAAA,YACF,YAAY,cAAc,WAAW,KAAK,qBAAqB,6CAAc,IAAI,mDAAmD,6CAAc,IAAI;AAAA,UAAA;AAAA,UAExJ;AAAA,QAAA,IAGFE,2BAAAA,KAAAE,qBAAA,EACG,UAAA;AAAA,UAAA,iBAAiB,oBAChBJ,2BAAAA;AAAAA,YAACK,6BAAAA;AAAAA,YAAA;AAAA,cACC,QAAQ,KAAK;AAAA,cACb,OAAO;AAAA,cACP,aAAa,kBAAkB,IAAI,KAAK;AAAA,cACxC,aAAY,2CAAa,eAAc;AAAA,cACvC,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,WAGZ,MAAM;AACN,kBAAM,cACJL,2BAAAA;AAAAA,cAACM,oBAAAA;AAAAA,cAAA;AAAA,gBACC,UAAU;AAAA,gBACV,SAAS,KAAK;AAAA,gBACd,gBAAgB,WAAW,WAAW,KAAK;AAAA,gBAC3C,cAAa;AAAA,gBACb,WAAW,GAAG,WAAW,KAAK;AAAA,gBAC9B,WAAU;AAAA,gBACV,iBAAiB,kBAAkB,SAAY;AAAA,gBAC9C,GAAI,gBAAgB,EAAE,cAAA,IAAkB,CAAA;AAAA,gBACxC,GAAI,oBAAoB,CAAC,kBACtB,EAAE,iBAAA,IACF,CAAA;AAAA,gBACH,GAAI,kBACD,EAAE,cAAc,oBAChB,mBAAmB,SAAS,IAC5B;AAAA,kBACE,cAAc;AAAA,oBACZ;AAAA,oBACA,mBAAmB,CACjB,KACA,SACG;AACH,wCAAkB,GAAG;AACrB,sCAAgB,IAAI;AACpB,yCAAmB,MAAS;AAAA,oBAC9B;AAAA,oBACA,IAAI,2DAAqB,UAAS,QAClC,oBAAoB,kBAAkB,OAClC;AAAA,sBACE,gBAAgB;AAAA,wBACd,GAAI,kBACA,EAAE,gBAAA,IACF,CAAA;AAAA,wBACJ,MACE,iBACA,WAAW,MAAM,kBAAA;AAAA,wBACnB,QAAQ;AAAA,0BACN;AAAA,4BACE,IAAI;AAAA,4BACJ,OAAO,oBAAoB;AAAA,4BAC3B,aAAa,MACX,mBAAmB,cAAc;AAAA,0BAAA;AAAA,wBACrC;AAAA,sBACF;AAAA,oBACF,IAEF,CAAA;AAAA,oBACJ,UAAU,CAAC,QAAmB;AAC5B,4BAAM,KAAKC,cAAAA,eAAe,GAAG;AAC7B,0BAAI,CAAC,IAAI;AACP,8BAAM,IAAI;AAAA,0BACR;AAAA,wBAAA;AAAA,sBAEJ;AACA,6BAAO;AAAA,oBACT;AAAA,oBACA,iBAAiB,CAAC,QAChBA,cAAAA,eAAe,GAAG,KAAK;AAAA,kBAAA;AAAA,gBAC3B,IAEF,CAAA;AAAA,gBACJ,cAAc;AAAA,gBACb,GAAI,aAAa,EAAE,OAAO,WAAA,IAAe,CAAA;AAAA,gBACzC,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,gBAC1C,GAAI,oBACD,EAAE,YAAY,kBAAA,IACd,CAAA;AAAA,gBACH,GAAI,gBAAgB,OACjB,EAAE,MAAM,gBAAgB,KAAA,IACxB,CAAA;AAAA,gBACH,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA;AAAA,gBAC9B,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA;AAAA,gBAC5C,GAAI,gBAAgB,EAAE,cAAA,IAAkB,CAAA;AAAA,gBACxC,GAAI,UAAU,EAAE,eAAe,QAAA,IAAY,CAAA;AAAA,gBAC3C,GAAI,iBAAiB,EAAE,aAAa,eAAA,IAAmB,CAAA;AAAA,gBACvD,GAAI,sBACD,EAAE,kBAAkB,oBAAA,IACpB,CAAA;AAAA,gBACH,GAAI,iBACD,EAAE,mBAAmB,eAAA,IACrB,CAAA;AAAA,gBACH,GAAG;AAAA,cAAA;AAAA,YAAA;AAGR,mBAAO,iBACH,eAAe;AAAA,cACb,UAAU,KAAK;AAAA,cACf,SAAS,KAAK;AAAA,cACd;AAAA,cACA,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAMd,GAAI,sBACA,EAAE,YAAY,oBAAA,IACd,CAAA;AAAA,cACJ,GAAI,gBAAgB,OAChB,EAAE,MAAM,gBAAgB,KAAA,IACxB,CAAA;AAAA,cACJ,GAAI,WAAW,EAAE,SAAA,IAAa,CAAA;AAAA,cAC9B,GAAI,aAAa,EAAE,WAAA,IAAe,CAAA;AAAA,cAClC,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA;AAAA,cAC5C,GAAI,UAAU,EAAE,eAAe,QAAA,IAAY,CAAA;AAAA,cAC3C,GAAI,iBAAiB,EAAE,aAAa,eAAA,IAAmB,CAAA;AAAA,cACvD,GAAI,sBACA,EAAE,kBAAkB,oBAAA,IACpB,CAAA;AAAA,cACJ,GAAI,iBACA,EAAE,mBAAmB,eAAA,IACrB,CAAA;AAAA,cACJ,GAAG;AAAA,YAAA,CACJ,IACD;AAAA,UACN,GAAA;AAAA,QAAG,EAAA,CACL,GAEJ,IAEAP,2BAAAA;AAAAA,UAACQ,aAAAA;AAAAA,UAAA;AAAA,YACC,YAAY;AAAA,YACZ;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAIR;;"}
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,