@flanksource/clicky-ui 0.3.40 → 0.3.41

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 (342) hide show
  1. package/README.md +24 -0
  2. package/dist/ai.cjs +10 -0
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +10 -0
  5. package/dist/ai.js.map +1 -1
  6. package/dist/components/AccordionList.cjs +5 -1
  7. package/dist/components/AccordionList.cjs.map +1 -1
  8. package/dist/components/AccordionList.d.ts +3 -1
  9. package/dist/components/AccordionList.d.ts.map +1 -1
  10. package/dist/components/AccordionList.js +5 -1
  11. package/dist/components/AccordionList.js.map +1 -1
  12. package/dist/components/JsonSchemaForm.cjs +9 -4
  13. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  14. package/dist/components/JsonSchemaForm.d.ts +1 -1
  15. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  16. package/dist/components/JsonSchemaForm.js +8 -3
  17. package/dist/components/JsonSchemaForm.js.map +1 -1
  18. package/dist/components/json-schema-form-accordion-array.cjs +3 -1
  19. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
  20. package/dist/components/json-schema-form-accordion-array.d.ts +4 -1
  21. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
  22. package/dist/components/json-schema-form-accordion-array.js +3 -1
  23. package/dist/components/json-schema-form-accordion-array.js.map +1 -1
  24. package/dist/components/json-schema-form-array-view.cjs +63 -0
  25. package/dist/components/json-schema-form-array-view.cjs.map +1 -0
  26. package/dist/components/json-schema-form-array-view.d.ts +21 -0
  27. package/dist/components/json-schema-form-array-view.d.ts.map +1 -0
  28. package/dist/components/json-schema-form-array-view.js +63 -0
  29. package/dist/components/json-schema-form-array-view.js.map +1 -0
  30. package/dist/components/json-schema-form-array.cjs +3 -7
  31. package/dist/components/json-schema-form-array.cjs.map +1 -1
  32. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  33. package/dist/components/json-schema-form-array.js +3 -7
  34. package/dist/components/json-schema-form-array.js.map +1 -1
  35. package/dist/components/json-schema-form-conditionals.cjs +67 -0
  36. package/dist/components/json-schema-form-conditionals.cjs.map +1 -0
  37. package/dist/components/json-schema-form-conditionals.d.ts +9 -0
  38. package/dist/components/json-schema-form-conditionals.d.ts.map +1 -0
  39. package/dist/components/json-schema-form-conditionals.js +67 -0
  40. package/dist/components/json-schema-form-conditionals.js.map +1 -0
  41. package/dist/components/json-schema-form-defaults.cjs +68 -0
  42. package/dist/components/json-schema-form-defaults.cjs.map +1 -0
  43. package/dist/components/json-schema-form-defaults.d.ts +4 -0
  44. package/dist/components/json-schema-form-defaults.d.ts.map +1 -0
  45. package/dist/components/json-schema-form-defaults.js +68 -0
  46. package/dist/components/json-schema-form-defaults.js.map +1 -0
  47. package/dist/components/json-schema-form-errors.cjs +49 -31
  48. package/dist/components/json-schema-form-errors.cjs.map +1 -1
  49. package/dist/components/json-schema-form-errors.d.ts +4 -2
  50. package/dist/components/json-schema-form-errors.d.ts.map +1 -1
  51. package/dist/components/json-schema-form-errors.js +51 -33
  52. package/dist/components/json-schema-form-errors.js.map +1 -1
  53. package/dist/components/json-schema-form-filter.cjs +2 -1
  54. package/dist/components/json-schema-form-filter.cjs.map +1 -1
  55. package/dist/components/json-schema-form-filter.js +2 -1
  56. package/dist/components/json-schema-form-filter.js.map +1 -1
  57. package/dist/components/json-schema-form-item-summary.cjs +6 -2
  58. package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
  59. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
  60. package/dist/components/json-schema-form-item-summary.js +6 -2
  61. package/dist/components/json-schema-form-item-summary.js.map +1 -1
  62. package/dist/components/json-schema-form-layout.cjs +28 -19
  63. package/dist/components/json-schema-form-layout.cjs.map +1 -1
  64. package/dist/components/json-schema-form-layout.d.ts +8 -6
  65. package/dist/components/json-schema-form-layout.d.ts.map +1 -1
  66. package/dist/components/json-schema-form-layout.js +29 -20
  67. package/dist/components/json-schema-form-layout.js.map +1 -1
  68. package/dist/components/json-schema-form-listener-paths.cjs +52 -0
  69. package/dist/components/json-schema-form-listener-paths.cjs.map +1 -0
  70. package/dist/components/json-schema-form-listener-paths.d.ts +10 -0
  71. package/dist/components/json-schema-form-listener-paths.d.ts.map +1 -0
  72. package/dist/components/json-schema-form-listener-paths.js +52 -0
  73. package/dist/components/json-schema-form-listener-paths.js.map +1 -0
  74. package/dist/components/json-schema-form-listener-types.d.ts +22 -0
  75. package/dist/components/json-schema-form-listener-types.d.ts.map +1 -0
  76. package/dist/components/json-schema-form-listeners.cjs +250 -0
  77. package/dist/components/json-schema-form-listeners.cjs.map +1 -0
  78. package/dist/components/json-schema-form-listeners.d.ts +13 -0
  79. package/dist/components/json-schema-form-listeners.d.ts.map +1 -0
  80. package/dist/components/json-schema-form-listeners.js +250 -0
  81. package/dist/components/json-schema-form-listeners.js.map +1 -0
  82. package/dist/components/json-schema-form-object-array-view.cjs +62 -0
  83. package/dist/components/json-schema-form-object-array-view.cjs.map +1 -0
  84. package/dist/components/json-schema-form-object-array-view.d.ts +14 -0
  85. package/dist/components/json-schema-form-object-array-view.d.ts.map +1 -0
  86. package/dist/components/json-schema-form-object-array-view.js +62 -0
  87. package/dist/components/json-schema-form-object-array-view.js.map +1 -0
  88. package/dist/components/json-schema-form-object.cjs +3 -0
  89. package/dist/components/json-schema-form-object.cjs.map +1 -1
  90. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  91. package/dist/components/json-schema-form-object.js +3 -0
  92. package/dist/components/json-schema-form-object.js.map +1 -1
  93. package/dist/components/json-schema-form-render.cjs +17 -9
  94. package/dist/components/json-schema-form-render.cjs.map +1 -1
  95. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  96. package/dist/components/json-schema-form-render.js +19 -11
  97. package/dist/components/json-schema-form-render.js.map +1 -1
  98. package/dist/components/json-schema-form-resolve.cjs +6 -99
  99. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  100. package/dist/components/json-schema-form-resolve.d.ts +1 -8
  101. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  102. package/dist/components/json-schema-form-resolve.js +5 -98
  103. package/dist/components/json-schema-form-resolve.js.map +1 -1
  104. package/dist/components/json-schema-form-runtime-types.d.ts +15 -0
  105. package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
  106. package/dist/components/json-schema-form-table-array.cjs +67 -16
  107. package/dist/components/json-schema-form-table-array.cjs.map +1 -1
  108. package/dist/components/json-schema-form-table-array.d.ts +4 -1
  109. package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
  110. package/dist/components/json-schema-form-table-array.js +70 -19
  111. package/dist/components/json-schema-form-table-array.js.map +1 -1
  112. package/dist/components/json-schema-form-types.d.ts +16 -0
  113. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  114. package/dist/components/json-schema-form-utils.cjs +7 -1
  115. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  116. package/dist/components/json-schema-form-utils.d.ts +2 -1
  117. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  118. package/dist/components/json-schema-form-utils.js +7 -1
  119. package/dist/components/json-schema-form-utils.js.map +1 -1
  120. package/dist/components.cjs +3 -2
  121. package/dist/components.cjs.map +1 -1
  122. package/dist/components.d.ts +3 -2
  123. package/dist/components.d.ts.map +1 -1
  124. package/dist/components.js +2 -1
  125. package/dist/components.js.map +1 -1
  126. package/dist/data/DataTable.cjs +9 -3
  127. package/dist/data/DataTable.cjs.map +1 -1
  128. package/dist/data/DataTable.d.ts +6 -0
  129. package/dist/data/DataTable.d.ts.map +1 -1
  130. package/dist/data/DataTable.js +9 -3
  131. package/dist/data/DataTable.js.map +1 -1
  132. package/dist/data/FixtureEditor/FixtureEditor.cjs +43 -24
  133. package/dist/data/FixtureEditor/FixtureEditor.cjs.map +1 -1
  134. package/dist/data/FixtureEditor/FixtureEditor.d.ts.map +1 -1
  135. package/dist/data/FixtureEditor/FixtureEditor.js +43 -24
  136. package/dist/data/FixtureEditor/FixtureEditor.js.map +1 -1
  137. package/dist/data/Tree.cjs +10 -2
  138. package/dist/data/Tree.cjs.map +1 -1
  139. package/dist/data/Tree.d.ts +6 -1
  140. package/dist/data/Tree.d.ts.map +1 -1
  141. package/dist/data/Tree.js +10 -2
  142. package/dist/data/Tree.js.map +1 -1
  143. package/dist/data/ai/SessionInspector.cjs +143 -167
  144. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  145. package/dist/data/ai/SessionInspector.collection-types.d.ts +5 -0
  146. package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -1
  147. package/dist/data/ai/SessionInspector.collection.cjs +18 -5
  148. package/dist/data/ai/SessionInspector.collection.cjs.map +1 -1
  149. package/dist/data/ai/SessionInspector.collection.d.ts +2 -0
  150. package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -1
  151. package/dist/data/ai/SessionInspector.collection.fixtures.d.ts +6 -0
  152. package/dist/data/ai/SessionInspector.collection.fixtures.d.ts.map +1 -0
  153. package/dist/data/ai/SessionInspector.collection.js +18 -5
  154. package/dist/data/ai/SessionInspector.collection.js.map +1 -1
  155. package/dist/data/ai/SessionInspector.d.ts +24 -2
  156. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  157. package/dist/data/ai/SessionInspector.hierarchy-state.cjs +105 -7
  158. package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -1
  159. package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +12 -1
  160. package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -1
  161. package/dist/data/ai/SessionInspector.hierarchy-state.js +107 -9
  162. package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -1
  163. package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
  164. package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
  165. package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
  166. package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
  167. package/dist/data/ai/SessionInspector.js +144 -168
  168. package/dist/data/ai/SessionInspector.js.map +1 -1
  169. package/dist/data/ai/SessionInspector.legacy.cjs +116 -0
  170. package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -0
  171. package/dist/data/ai/SessionInspector.legacy.d.ts +19 -0
  172. package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -0
  173. package/dist/data/ai/SessionInspector.legacy.js +116 -0
  174. package/dist/data/ai/SessionInspector.legacy.js.map +1 -0
  175. package/dist/data/ai/SessionInspector.panels.cjs +3 -0
  176. package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
  177. package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
  178. package/dist/data/ai/SessionInspector.panels.js +3 -0
  179. package/dist/data/ai/SessionInspector.panels.js.map +1 -1
  180. package/dist/data/ai/SessionInspector.plan.cjs +29 -12
  181. package/dist/data/ai/SessionInspector.plan.cjs.map +1 -1
  182. package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -1
  183. package/dist/data/ai/SessionInspector.plan.js +30 -13
  184. package/dist/data/ai/SessionInspector.plan.js.map +1 -1
  185. package/dist/data/ai/SessionInspector.remote-view.cjs +44 -0
  186. package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -0
  187. package/dist/data/ai/SessionInspector.remote-view.d.ts +11 -0
  188. package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -0
  189. package/dist/data/ai/SessionInspector.remote-view.js +44 -0
  190. package/dist/data/ai/SessionInspector.remote-view.js.map +1 -0
  191. package/dist/data/ai/SessionInspector.remote.cjs +275 -0
  192. package/dist/data/ai/SessionInspector.remote.cjs.map +1 -0
  193. package/dist/data/ai/SessionInspector.remote.d.ts +57 -0
  194. package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -0
  195. package/dist/data/ai/SessionInspector.remote.js +275 -0
  196. package/dist/data/ai/SessionInspector.remote.js.map +1 -0
  197. package/dist/data/ai/SessionInspector.summary.cjs +0 -156
  198. package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
  199. package/dist/data/ai/SessionInspector.summary.d.ts +0 -3
  200. package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
  201. package/dist/data/ai/SessionInspector.summary.js +2 -158
  202. package/dist/data/ai/SessionInspector.summary.js.map +1 -1
  203. package/dist/data/ai/SessionInspector.tab-state.cjs +15 -0
  204. package/dist/data/ai/SessionInspector.tab-state.cjs.map +1 -0
  205. package/dist/data/ai/SessionInspector.tab-state.d.ts +3 -0
  206. package/dist/data/ai/SessionInspector.tab-state.d.ts.map +1 -0
  207. package/dist/data/ai/SessionInspector.tab-state.js +15 -0
  208. package/dist/data/ai/SessionInspector.tab-state.js.map +1 -0
  209. package/dist/data/ai/SessionInspector.tabs.model.cjs +31 -18
  210. package/dist/data/ai/SessionInspector.tabs.model.cjs.map +1 -1
  211. package/dist/data/ai/SessionInspector.tabs.model.d.ts +3 -1
  212. package/dist/data/ai/SessionInspector.tabs.model.d.ts.map +1 -1
  213. package/dist/data/ai/SessionInspector.tabs.model.js +32 -19
  214. package/dist/data/ai/SessionInspector.tabs.model.js.map +1 -1
  215. package/dist/data/ai/SessionInspector.verification.cjs +53 -0
  216. package/dist/data/ai/SessionInspector.verification.cjs.map +1 -0
  217. package/dist/data/ai/SessionInspector.verification.d.ts +7 -0
  218. package/dist/data/ai/SessionInspector.verification.d.ts.map +1 -0
  219. package/dist/data/ai/SessionInspector.verification.js +53 -0
  220. package/dist/data/ai/SessionInspector.verification.js.map +1 -0
  221. package/dist/data/ai/SessionViewer.model.cjs +7 -1
  222. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  223. package/dist/data/ai/SessionViewer.model.d.ts +21 -3
  224. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  225. package/dist/data/ai/SessionViewer.model.js +7 -1
  226. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  227. package/dist/data/ai/SessionViewer.unified.d.ts +13 -0
  228. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  229. package/dist/data/ai/index.d.ts +3 -1
  230. package/dist/data/ai/index.d.ts.map +1 -1
  231. package/dist/data/version-info.cjs +3 -3
  232. package/dist/data/version-info.js +3 -3
  233. package/dist/devtools/useDebugStream.cjs +5 -1
  234. package/dist/devtools/useDebugStream.cjs.map +1 -1
  235. package/dist/devtools/useDebugStream.d.ts.map +1 -1
  236. package/dist/devtools/useDebugStream.js +6 -2
  237. package/dist/devtools/useDebugStream.js.map +1 -1
  238. package/dist/hooks/event-source-provider.cjs +9 -0
  239. package/dist/hooks/event-source-provider.cjs.map +1 -0
  240. package/dist/hooks/event-source-provider.d.ts +15 -0
  241. package/dist/hooks/event-source-provider.d.ts.map +1 -0
  242. package/dist/hooks/event-source-provider.js +9 -0
  243. package/dist/hooks/event-source-provider.js.map +1 -0
  244. package/dist/hooks/event-source.cjs +11 -0
  245. package/dist/hooks/event-source.cjs.map +1 -0
  246. package/dist/hooks/event-source.d.ts +22 -0
  247. package/dist/hooks/event-source.d.ts.map +1 -0
  248. package/dist/hooks/event-source.js +11 -0
  249. package/dist/hooks/event-source.js.map +1 -0
  250. package/dist/hooks/use-log-tail.cjs +5 -1
  251. package/dist/hooks/use-log-tail.cjs.map +1 -1
  252. package/dist/hooks/use-log-tail.d.ts.map +1 -1
  253. package/dist/hooks/use-log-tail.js +5 -1
  254. package/dist/hooks/use-log-tail.js.map +1 -1
  255. package/dist/hooks/use-prompts.cjs +5 -1
  256. package/dist/hooks/use-prompts.cjs.map +1 -1
  257. package/dist/hooks/use-prompts.d.ts.map +1 -1
  258. package/dist/hooks/use-prompts.js +6 -2
  259. package/dist/hooks/use-prompts.js.map +1 -1
  260. package/dist/hooks/use-task-run.cjs +9 -2
  261. package/dist/hooks/use-task-run.cjs.map +1 -1
  262. package/dist/hooks/use-task-run.d.ts.map +1 -1
  263. package/dist/hooks/use-task-run.js +10 -3
  264. package/dist/hooks/use-task-run.js.map +1 -1
  265. package/dist/hooks.cjs +4 -0
  266. package/dist/hooks.cjs.map +1 -1
  267. package/dist/hooks.d.ts +2 -0
  268. package/dist/hooks.d.ts.map +1 -1
  269. package/dist/hooks.js +4 -0
  270. package/dist/hooks.js.map +1 -1
  271. package/dist/icons/programmingCatalog.cjs +34 -34
  272. package/dist/icons/programmingCatalog.cjs.map +1 -1
  273. package/dist/icons/programmingCatalog.js +34 -34
  274. package/dist/icons/programmingCatalog.js.map +1 -1
  275. package/dist/index.cjs +9 -2
  276. package/dist/index.cjs.map +1 -1
  277. package/dist/index.js +8 -1
  278. package/dist/index.js.map +1 -1
  279. package/dist/monaco/MonacoEditor.cjs +4 -1
  280. package/dist/monaco/MonacoEditor.cjs.map +1 -1
  281. package/dist/monaco/MonacoEditor.d.ts +1 -1
  282. package/dist/monaco/MonacoEditor.d.ts.map +1 -1
  283. package/dist/monaco/MonacoEditor.js +4 -1
  284. package/dist/monaco/MonacoEditor.js.map +1 -1
  285. package/dist/monaco/types.d.ts +2 -1
  286. package/dist/monaco/types.d.ts.map +1 -1
  287. package/dist/overlay/CommandPalette.cjs +14 -4
  288. package/dist/overlay/CommandPalette.cjs.map +1 -1
  289. package/dist/overlay/CommandPalette.d.ts +5 -1
  290. package/dist/overlay/CommandPalette.d.ts.map +1 -1
  291. package/dist/overlay/CommandPalette.js +14 -4
  292. package/dist/overlay/CommandPalette.js.map +1 -1
  293. package/dist/overlay/CommandPaletteList.cjs +5 -0
  294. package/dist/overlay/CommandPaletteList.cjs.map +1 -1
  295. package/dist/overlay/CommandPaletteList.d.ts +4 -2
  296. package/dist/overlay/CommandPaletteList.d.ts.map +1 -1
  297. package/dist/overlay/CommandPaletteList.js +5 -0
  298. package/dist/overlay/CommandPaletteList.js.map +1 -1
  299. package/dist/overlay/DropdownMenu.cjs +1 -0
  300. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  301. package/dist/overlay/DropdownMenu.js +1 -0
  302. package/dist/overlay/DropdownMenu.js.map +1 -1
  303. package/dist/rpc/OperationCatalog.cjs +29 -26
  304. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  305. package/dist/rpc/OperationCatalog.d.ts +9 -1
  306. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  307. package/dist/rpc/OperationCatalog.js +29 -26
  308. package/dist/rpc/OperationCatalog.js.map +1 -1
  309. package/dist/rpc/OperationEntityContextPicker.cjs +62 -256
  310. package/dist/rpc/OperationEntityContextPicker.cjs.map +1 -1
  311. package/dist/rpc/OperationEntityContextPicker.d.ts.map +1 -1
  312. package/dist/rpc/OperationEntityContextPicker.js +64 -258
  313. package/dist/rpc/OperationEntityContextPicker.js.map +1 -1
  314. package/dist/rpc/OperationEntityPicker.cjs +185 -0
  315. package/dist/rpc/OperationEntityPicker.cjs.map +1 -0
  316. package/dist/rpc/OperationEntityPicker.d.ts +51 -0
  317. package/dist/rpc/OperationEntityPicker.d.ts.map +1 -0
  318. package/dist/rpc/OperationEntityPicker.js +185 -0
  319. package/dist/rpc/OperationEntityPicker.js.map +1 -0
  320. package/dist/rpc/OperationEntityPicker.model.cjs +39 -0
  321. package/dist/rpc/OperationEntityPicker.model.cjs.map +1 -0
  322. package/dist/rpc/OperationEntityPicker.model.d.ts +27 -0
  323. package/dist/rpc/OperationEntityPicker.model.d.ts.map +1 -0
  324. package/dist/rpc/OperationEntityPicker.model.js +39 -0
  325. package/dist/rpc/OperationEntityPicker.model.js.map +1 -0
  326. package/dist/rpc/operationCatalogRowSelection.cjs +85 -0
  327. package/dist/rpc/operationCatalogRowSelection.cjs.map +1 -0
  328. package/dist/rpc/operationCatalogRowSelection.d.ts +57 -0
  329. package/dist/rpc/operationCatalogRowSelection.d.ts.map +1 -0
  330. package/dist/rpc/operationCatalogRowSelection.js +85 -0
  331. package/dist/rpc/operationCatalogRowSelection.js.map +1 -0
  332. package/dist/rpc/operationEntityPicker.fixtures.d.ts +13 -0
  333. package/dist/rpc/operationEntityPicker.fixtures.d.ts.map +1 -0
  334. package/dist/rpc.cjs +2 -0
  335. package/dist/rpc.cjs.map +1 -1
  336. package/dist/rpc.d.ts +2 -0
  337. package/dist/rpc.d.ts.map +1 -1
  338. package/dist/rpc.js +2 -0
  339. package/dist/rpc.js.map +1 -1
  340. package/dist/styles.css +1 -1
  341. package/package.json +4 -1
  342. package/schemas/json-schema-form.schema.json +566 -0
@@ -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 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\";\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\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}: 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 queryKey: [\n \"operation-lookup\",\n listEndpoint?.method,\n listEndpoint?.path,\n lookupParameters,\n ],\n queryFn: async () =>\n (await client.lookupFilters?.(\n listEndpoint!.path,\n listEndpoint!.method,\n lookupParameters,\n { Accept: \"application/json+clicky\" }\n )) ?? { filters: {} },\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 showTable = !!listEndpoint;\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 mergedTableResponse = followMerge\n ? followMerge.response\n : tableResponse;\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 ? { pages: list.pages, infinite: list.infinite }\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-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 <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=\"min-h-0 flex-1\" 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\"\n detailOperation={detailOperation}\n {...(hiddenColumns ? { hiddenColumns } : {})}\n {...(getRowDetailHref ? { getRowDetailHref } : {})}\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","keepPreviousData","findSurfaceCollectionActions","getOperationClickyMeta","useOperationFilterSearch","parametersToFormConfig","dataTablePaginationFromForm","followRowOrder","applyFilterExtensions","parseMultiFilterValue","useCallback","serializeMultiFilterValue","cursorParameterName","OperationsApiClientError","partitionFollowRows","mergeFollowRowsIntoResponse","jsx","Loading","jsxs","OperationCatalogActions","Fragment","OperationCatalogFollowStatus","OperationResultView","getClickyRowId","EndpointList"],"mappings":"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"}
1
+ {"version":3,"file":"OperationCatalog.cjs","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { useOperationPages } from \"./useOperationPages\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceCollectionActions,\n findSurfaceDetailOperation,\n findSurfaceListOperation,\n getOperationClickyMeta,\n} from \"./clickyMetadata\";\nimport type {\n ClickyCommandRuntime,\n ClickyDownloadOptions,\n ClickyRemoteFormat,\n ClickyRow,\n ClickyRowDetailRenderer,\n ClickyCellRenderers,\n ClickyRowCardRenderer,\n ClickyRowDetailTitle,\n} from \"../data/Clicky\";\nimport type { ModalSize } from \"../overlay/Modal\";\nimport type { CellFilterChange } from \"../data/cells/CellFilterActions\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { OperationCatalogActions } from \"./OperationCatalogActions\";\nimport { OperationsApiClientError } from \"./apiClient\";\nimport { renderOperationError } from \"./operationErrorDiagnostics\";\nimport {\n OperationResultView,\n type OperationResultFilterConfig,\n type ResultRenderer,\n} from \"./OperationResultView\";\nimport { type FormActionsRenderer } from \"./SchemaActionForm\";\nimport {\n applyFilterExtensions,\n type FilterExtension,\n} from \"../components/filter-bar-utils\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\n dataTablePaginationFromForm,\n packLookupParameterValues,\n parametersToFormConfig,\n type ParameterFormOptions,\n} from \"./formMetadata\";\nimport { cursorParameterName, useCursorStaleRecovery } from \"./cursorStale\";\nimport { useOperationFilterSearch } from \"./operationFilterSearch\";\nimport {\n parseMultiFilterValue,\n serializeMultiFilterValue,\n} from \"../data/data-table-filter-values\";\nimport { Loading } from \"../components/loading\";\nimport { getClickyRowId } from \"./rowNavigation\";\nimport { useOperationCatalogFilterState } from \"./operationCatalogFilterState\";\nimport {\n followRowOrder,\n mergeFollowRowsIntoResponse,\n partitionFollowRows,\n} from \"./operationCatalogFollow\";\nimport { OperationCatalogFollowStatus } from \"./OperationCatalogFollowStatus\";\nimport { useOperationCatalogFollow, type OperationCatalogFollowOption } from \"./useOperationCatalogFollow\";\nimport type { LogTailError } from \"../hooks/use-log-tail\";\nimport {\n markUnavailableRows,\n operationLookupQuery,\n pickerTableRowSelection,\n type OperationCatalogRowSelection,\n} from \"./operationCatalogRowSelection\";\n\nexport type OperationCatalogProps = {\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink: RenderLink;\n // Override to return all operations (e.g. for an \"API explorer\" domain\n // that shouldn't be filtered by entity tags).\n allOperations?: boolean;\n surfaceKey?: string;\n // Domain-specific filter decorators (e.g. stamp an entity icon by filter\n // name). Composed in array order; mirrors JsonSchemaForm's `pre`.\n filterPre?: FilterExtension[];\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n commandRuntime?: ClickyCommandRuntime;\n // Custom JsonSchemaForm field extensions forwarded to the create/edit form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions for the create/edit form (e.g. a connection\n // \"Test\" button).\n formActions?: FormActionsRenderer;\n actionLabels?: Record<string, string>;\n // Optional host override for the result surface, keyed off the current surface.\n // Receives the default OperationResultView so non-overridden surfaces render\n // unchanged.\n resultRenderer?: ResultRenderer;\n /**\n * Portal target for the collection action bar (Create, bulk actions). When\n * set, the bar renders into this element — typically an app shell's\n * `bodyActions` slot — instead of inline under the catalog header.\n *\n * A portal rather than a render-prop because the bar owns its own dialog\n * state and closes over the catalog's live filters and list query; moving the\n * element would sever both. Falls back to inline rendering when null, so\n * existing consumers are unaffected.\n */\n actionsContainer?: Element | null;\n getRowDetailHref?: (id: string) => string | undefined;\n actionInitialValues?: Record<string, Record<string, string>>;\n /** Plural noun used by the cross-page selection notice. */\n selectionNoun?: string;\n /**\n * Parameter values pinned by the host — sent on every list request, every\n * filter lookup (both `client.lookupFilters` and per-filter type-ahead), and\n * every export/download URL. Never rendered as an editable filter chip or\n * form field, and never round-tripped through the URL: the host, not the\n * reader, owns them (e.g. the `stream` a trace-results panel is scoped to).\n */\n lockedValues?: Record<string, string>;\n /**\n * Editable seed values for filters the URL has no value for yet — e.g. a\n * database filter that should start at the host's current environment but\n * stay changeable. Applied per-key only when the URL is silent on that key\n * (a URL value always wins), still rendered as an ordinary editable filter\n * field, and never sent as a locked value or written back to the URL as\n * anything other than the resulting filter edit. Unlike `lockedValues`,\n * these seed the FilterBar's own state, not an overlay on top of it.\n */\n initialValues?: Record<string, string>;\n /**\n * Controls whether list filters/pagination/sort read and write the URL.\n * Omit for today's behaviour: unprefixed query params. `false` neither\n * reads nor writes the URL — for a catalog embedded where the host owns the\n * whole URL. `{ prefix }` reads and writes only `<prefix>.<name>` keys, so\n * the catalog can live inside a host route with its own `?step=`/`?tab=`\n * params without colliding.\n */\n urlState?: false | { prefix: string };\n /** Omit to infer cursor walking automatically; set when a host requires a specific paging presentation. */\n paginationMode?: \"paged\" | \"infinite\";\n /** 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;;"}
@@ -9,6 +9,7 @@ import { PreExtension, PostExtension } from '../components/json-schema-form-type
9
9
  import { DomainDefinition, ResolvedOperation } from './types.js';
10
10
  import { OperationsApiClient } from './useOperations.js';
11
11
  import { OperationCatalogFollowOption } from './useOperationCatalogFollow.js';
12
+ import { OperationCatalogRowSelection } from './operationCatalogRowSelection.js';
12
13
  export type OperationCatalogProps = {
13
14
  definition: DomainDefinition;
14
15
  entities: string[];
@@ -107,6 +108,13 @@ export type OperationCatalogProps = {
107
108
  * see `useLogTail`); older rows are evicted and counted as `dropped`.
108
109
  */
109
110
  follow?: OperationCatalogFollowOption;
111
+ /**
112
+ * Turns the catalog into a picker: every row gets a checkbox, a row click
113
+ * toggles it instead of opening the detail page, and the surface's action
114
+ * bar (create and bulk actions) is not rendered — the host owns the
115
+ * selection and what happens to it. Requires a list operation.
116
+ */
117
+ rowSelection?: OperationCatalogRowSelection;
110
118
  };
111
- 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, }: OperationCatalogProps): import("react").JSX.Element;
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;
112
120
  //# 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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"}
@@ -21,6 +21,7 @@ import { useOperationCatalogFilterState } from "./operationCatalogFilterState.js
21
21
  import { followRowOrder, partitionFollowRows, mergeFollowRowsIntoResponse } from "./operationCatalogFollow.js";
22
22
  import { OperationCatalogFollowStatus } from "./OperationCatalogFollowStatus.js";
23
23
  import { useOperationCatalogFollow } from "./useOperationCatalogFollow.js";
24
+ import { operationLookupQuery, pickerTableRowSelection, markUnavailableRows } from "./operationCatalogRowSelection.js";
24
25
  const defaultCommandHref = (operationId) => `/commands/${operationId}`;
25
26
  const EMPTY_LOCKED_VALUES = {};
26
27
  const EMPTY_INITIAL_VALUES = {};
@@ -52,7 +53,8 @@ function OperationCatalog({
52
53
  rowDetail,
53
54
  cellRenderers,
54
55
  rowCard,
55
- follow
56
+ follow,
57
+ rowSelection
56
58
  }) {
57
59
  var _a, _b, _c, _d, _e;
58
60
  const renderRowDetail = rowDetail == null ? void 0 : rowDetail.render;
@@ -172,22 +174,7 @@ function OperationCatalog({
172
174
  setValues: setFilters
173
175
  });
174
176
  const lookupQuery = useQuery({
175
- queryKey: [
176
- "operation-lookup",
177
- listEndpoint == null ? void 0 : listEndpoint.method,
178
- listEndpoint == null ? void 0 : listEndpoint.path,
179
- lookupParameters
180
- ],
181
- queryFn: async () => {
182
- var _a2;
183
- return await ((_a2 = client.lookupFilters) == null ? void 0 : _a2.call(
184
- client,
185
- listEndpoint.path,
186
- listEndpoint.method,
187
- lookupParameters,
188
- { Accept: "application/json+clicky" }
189
- )) ?? { filters: {} };
190
- },
177
+ ...operationLookupQuery(client, listEndpoint, lookupParameters),
191
178
  enabled: !!listEndpoint && !!client.lookupFilters,
192
179
  placeholderData: keepPreviousData,
193
180
  staleTime: 3e4,
@@ -336,7 +323,16 @@ function OperationCatalog({
336
323
  onCellFilterChange
337
324
  ]
338
325
  );
326
+ const pickerSelection = useMemo(
327
+ () => rowSelection ? pickerTableRowSelection(rowSelection, effectiveFilters) : void 0,
328
+ [effectiveFilters, rowSelection]
329
+ );
339
330
  const showTable = !!listEndpoint;
331
+ if (rowSelection && !isLoading && !showTable) {
332
+ throw new Error(
333
+ `OperationCatalog rowSelection needs a list operation, but surface "${surfaceKey ?? definition.title}" has none`
334
+ );
335
+ }
340
336
  let listError;
341
337
  if (!list.isFetching) {
342
338
  if (list.isError) {
@@ -366,23 +362,30 @@ function OperationCatalog({
366
362
  followPartition.rows,
367
363
  followOrder
368
364
  ) : void 0;
369
- const mergedTableResponse = followMerge ? followMerge.response : tableResponse;
365
+ const unavailableRows = rowSelection == null ? void 0 : rowSelection.unavailableRows;
366
+ const markRows = (response) => response && unavailableRows ? markUnavailableRows(response, unavailableRows) : response;
367
+ const mergedTableResponse = markRows(
368
+ followMerge ? followMerge.response : tableResponse
369
+ );
370
370
  const resultsPagination = followMerge && followMerge.addedCount > 0 && dataTablePagination ? {
371
371
  ...dataTablePagination,
372
372
  total: (dataTablePagination.total ?? 0) + followMerge.addedCount,
373
373
  totalRelation: "gte"
374
374
  } : dataTablePagination;
375
- const walkProps = list.infinite ? { pages: list.pages, infinite: list.infinite } : {};
375
+ const walkProps = list.infinite ? {
376
+ pages: unavailableRows ? list.pages.map((page) => markUnavailableRows(page, unavailableRows)) : list.pages,
377
+ infinite: list.infinite
378
+ } : {};
376
379
  if (isLoading || showTable && list.isPending && list.response == null) {
377
380
  return /* @__PURE__ */ jsx(Loading, { variant: "centered", label: `Loading ${definition.title}…` });
378
381
  }
379
382
  return /* @__PURE__ */ jsxs(
380
383
  "div",
381
384
  {
382
- className: "flex h-full min-h-0 flex-col gap-2",
385
+ className: "flex h-full min-h-0 flex-1 flex-col gap-2",
383
386
  "data-slot": "operation-catalog",
384
387
  children: [
385
- /* @__PURE__ */ jsx(
388
+ !rowSelection && /* @__PURE__ */ jsx(
386
389
  OperationCatalogActions,
387
390
  {
388
391
  actions: collectionActionOps,
@@ -414,7 +417,7 @@ function OperationCatalog({
414
417
  client
415
418
  }
416
419
  ),
417
- showTable ? /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1", "data-slot": "operation-catalog-results", children: followMissing ? renderError(
420
+ showTable ? /* @__PURE__ */ jsx("div", { className: "flex min-h-0 flex-1 flex-col", "data-slot": "operation-catalog-results", children: followMissing ? renderError(
418
421
  new Error(
419
422
  `Surface "${surfaceKey ?? definition.title}" set follow, but ${listEndpoint == null ? void 0 : listEndpoint.path} advertises no session to follow (expected POST ${listEndpoint == null ? void 0 : listEndpoint.path}/sessions)`
420
423
  ),
@@ -439,11 +442,11 @@ function OperationCatalog({
439
442
  loadingMessage: `Loading ${definition.title} results…`,
440
443
  emptyMessage: "No records returned",
441
444
  ariaLabel: `${definition.title} results`,
442
- className: "mt-0 h-full min-h-0",
443
- detailOperation,
445
+ className: "mt-0 h-full min-h-0 flex-1",
446
+ detailOperation: pickerSelection ? void 0 : detailOperation,
444
447
  ...hiddenColumns ? { hiddenColumns } : {},
445
- ...getRowDetailHref ? { getRowDetailHref } : {},
446
- ...selectionActionOps.length > 0 ? {
448
+ ...getRowDetailHref && !pickerSelection ? { getRowDetailHref } : {},
449
+ ...pickerSelection ? { rowSelection: pickerSelection } : selectionActionOps.length > 0 ? {
447
450
  rowSelection: {
448
451
  selectedRowIds,
449
452
  onSelectionChange: (ids, rows) => {
@@ -1 +1 @@
1
- {"version":3,"file":"OperationCatalog.js","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 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\";\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\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}: 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 queryKey: [\n \"operation-lookup\",\n listEndpoint?.method,\n listEndpoint?.path,\n lookupParameters,\n ],\n queryFn: async () =>\n (await client.lookupFilters?.(\n listEndpoint!.path,\n listEndpoint!.method,\n lookupParameters,\n { Accept: \"application/json+clicky\" }\n )) ?? { filters: {} },\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 showTable = !!listEndpoint;\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 mergedTableResponse = followMerge\n ? followMerge.response\n : tableResponse;\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 ? { pages: list.pages, infinite: list.infinite }\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-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 <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=\"min-h-0 flex-1\" 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\"\n detailOperation={detailOperation}\n {...(hiddenColumns ? { hiddenColumns } : {})}\n {...(getRowDetailHref ? { getRowDetailHref } : {})}\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":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"OperationCatalog.js","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":["_a"],"mappings":"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"}