@flanksource/clicky-ui 0.3.46 → 0.3.48

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 (474) hide show
  1. package/NOTICE.md +11 -0
  2. package/README.md +49 -0
  3. package/dist/ai.cjs +13 -8
  4. package/dist/ai.cjs.map +1 -1
  5. package/dist/ai.js +7 -2
  6. package/dist/ai.js.map +1 -1
  7. package/dist/comments/CommentSidePanel.cjs +10 -4
  8. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  9. package/dist/comments/CommentSidePanel.d.ts +2 -0
  10. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  11. package/dist/comments/CommentSidePanel.js +10 -4
  12. package/dist/comments/CommentSidePanel.js.map +1 -1
  13. package/dist/comments/CommentThread.cjs +2 -0
  14. package/dist/comments/CommentThread.cjs.map +1 -1
  15. package/dist/comments/CommentThread.d.ts +2 -1
  16. package/dist/comments/CommentThread.d.ts.map +1 -1
  17. package/dist/comments/CommentThread.js +2 -0
  18. package/dist/comments/CommentThread.js.map +1 -1
  19. package/dist/comments/CommentThreadList.cjs +3 -0
  20. package/dist/comments/CommentThreadList.cjs.map +1 -1
  21. package/dist/comments/CommentThreadList.d.ts +3 -1
  22. package/dist/comments/CommentThreadList.d.ts.map +1 -1
  23. package/dist/comments/CommentThreadList.js +3 -0
  24. package/dist/comments/CommentThreadList.js.map +1 -1
  25. package/dist/components/ErrorWrapper.cjs +2 -3
  26. package/dist/components/ErrorWrapper.cjs.map +1 -1
  27. package/dist/components/ErrorWrapper.d.ts.map +1 -1
  28. package/dist/components/ErrorWrapper.js +3 -4
  29. package/dist/components/ErrorWrapper.js.map +1 -1
  30. package/dist/data/Clicky.cjs +3 -0
  31. package/dist/data/Clicky.cjs.map +1 -1
  32. package/dist/data/Clicky.js +3 -0
  33. package/dist/data/Clicky.js.map +1 -1
  34. package/dist/data/CodeLine.cjs +4 -2
  35. package/dist/data/CodeLine.cjs.map +1 -1
  36. package/dist/data/CodeLine.d.ts.map +1 -1
  37. package/dist/data/CodeLine.js +4 -2
  38. package/dist/data/CodeLine.js.map +1 -1
  39. package/dist/data/FilterPill.cjs +15 -2
  40. package/dist/data/FilterPill.cjs.map +1 -1
  41. package/dist/data/FilterPill.d.ts +1 -1
  42. package/dist/data/FilterPill.d.ts.map +1 -1
  43. package/dist/data/FilterPill.js +15 -2
  44. package/dist/data/FilterPill.js.map +1 -1
  45. package/dist/data/LogViewer.cjs +27 -8
  46. package/dist/data/LogViewer.cjs.map +1 -1
  47. package/dist/data/LogViewer.d.ts +11 -3
  48. package/dist/data/LogViewer.d.ts.map +1 -1
  49. package/dist/data/LogViewer.js +27 -8
  50. package/dist/data/LogViewer.js.map +1 -1
  51. package/dist/data/Properties.cjs +2 -15
  52. package/dist/data/Properties.cjs.map +1 -1
  53. package/dist/data/Properties.d.ts +4 -0
  54. package/dist/data/Properties.d.ts.map +1 -1
  55. package/dist/data/Properties.js +2 -15
  56. package/dist/data/Properties.js.map +1 -1
  57. package/dist/data/PropertyValue.cjs +37 -0
  58. package/dist/data/PropertyValue.cjs.map +1 -0
  59. package/dist/data/PropertyValue.d.ts +6 -0
  60. package/dist/data/PropertyValue.d.ts.map +1 -0
  61. package/dist/data/PropertyValue.js +37 -0
  62. package/dist/data/PropertyValue.js.map +1 -0
  63. package/dist/data/SymbolBadge.cjs +61 -0
  64. package/dist/data/SymbolBadge.cjs.map +1 -0
  65. package/dist/data/SymbolBadge.d.ts +21 -0
  66. package/dist/data/SymbolBadge.d.ts.map +1 -0
  67. package/dist/data/SymbolBadge.js +61 -0
  68. package/dist/data/SymbolBadge.js.map +1 -0
  69. package/dist/data/Tree.cjs +4 -3
  70. package/dist/data/Tree.cjs.map +1 -1
  71. package/dist/data/Tree.d.ts +3 -1
  72. package/dist/data/Tree.d.ts.map +1 -1
  73. package/dist/data/Tree.js +4 -3
  74. package/dist/data/Tree.js.map +1 -1
  75. package/dist/data/ai/ChatFab.cjs +1 -1
  76. package/dist/data/ai/ChatFab.cjs.map +1 -1
  77. package/dist/data/ai/ChatFab.js +1 -1
  78. package/dist/data/ai/ChatFab.js.map +1 -1
  79. package/dist/data/ai/ChatWindow.cjs +106 -171
  80. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  81. package/dist/data/ai/ChatWindow.d.ts +6 -2
  82. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  83. package/dist/data/ai/ChatWindow.header.cjs +104 -0
  84. package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
  85. package/dist/data/ai/ChatWindow.header.d.ts +29 -0
  86. package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
  87. package/dist/data/ai/ChatWindow.header.js +104 -0
  88. package/dist/data/ai/ChatWindow.header.js.map +1 -0
  89. package/dist/data/ai/ChatWindow.js +107 -172
  90. package/dist/data/ai/ChatWindow.js.map +1 -1
  91. package/dist/data/ai/ChatWindow.placement.cjs +95 -0
  92. package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
  93. package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
  94. package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
  95. package/dist/data/ai/ChatWindow.placement.js +95 -0
  96. package/dist/data/ai/ChatWindow.placement.js.map +1 -0
  97. package/dist/data/ai/SessionChatComposer.cjs +3 -1
  98. package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
  99. package/dist/data/ai/SessionChatComposer.d.ts +4 -1
  100. package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
  101. package/dist/data/ai/SessionChatComposer.js +3 -1
  102. package/dist/data/ai/SessionChatComposer.js.map +1 -1
  103. package/dist/data/ai/SessionInspector.cjs +68 -72
  104. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  105. package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
  106. package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
  107. package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
  108. package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
  109. package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
  110. package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
  111. package/dist/data/ai/SessionInspector.d.ts +6 -1
  112. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  113. package/dist/data/ai/SessionInspector.js +69 -73
  114. package/dist/data/ai/SessionInspector.js.map +1 -1
  115. package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
  116. package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
  117. package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
  118. package/dist/data/ai/SessionInspector.legacy.js +41 -42
  119. package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
  120. package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
  121. package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
  122. package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
  123. package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
  124. package/dist/data/ai/SessionInspector.remote-view.js +14 -9
  125. package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
  126. package/dist/data/ai/SessionInspector.remote.cjs +84 -16
  127. package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
  128. package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
  129. package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
  130. package/dist/data/ai/SessionInspector.remote.js +86 -18
  131. package/dist/data/ai/SessionInspector.remote.js.map +1 -1
  132. package/dist/data/ai/SessionInspector.transcript.cjs +5 -0
  133. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
  134. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
  135. package/dist/data/ai/SessionInspector.transcript.js +5 -0
  136. package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
  137. package/dist/data/ai/SessionTail.cjs +63 -0
  138. package/dist/data/ai/SessionTail.cjs.map +1 -0
  139. package/dist/data/ai/SessionTail.d.ts +14 -0
  140. package/dist/data/ai/SessionTail.d.ts.map +1 -0
  141. package/dist/data/ai/SessionTail.js +63 -0
  142. package/dist/data/ai/SessionTail.js.map +1 -0
  143. package/dist/data/ai/SessionViewer.cjs +10 -3
  144. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  145. package/dist/data/ai/SessionViewer.d.ts +7 -1
  146. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  147. package/dist/data/ai/SessionViewer.js +10 -3
  148. package/dist/data/ai/SessionViewer.js.map +1 -1
  149. package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
  150. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  151. package/dist/data/ai/index.d.ts +4 -3
  152. package/dist/data/ai/index.d.ts.map +1 -1
  153. package/dist/data/ai/use-session-scroll.cjs +30 -6
  154. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  155. package/dist/data/ai/use-session-scroll.d.ts +7 -0
  156. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  157. package/dist/data/ai/use-session-scroll.js +30 -6
  158. package/dist/data/ai/use-session-scroll.js.map +1 -1
  159. package/dist/data/chat/Chat.cjs +1 -1
  160. package/dist/data/chat/Chat.cjs.map +1 -1
  161. package/dist/data/chat/Chat.js +1 -1
  162. package/dist/data/chat/Chat.js.map +1 -1
  163. package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
  164. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  165. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  166. package/dist/data/chat/ChatRuntimeToolbar.js +4 -4
  167. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  168. package/dist/data/chat/PromptInput.cjs +4 -2
  169. package/dist/data/chat/PromptInput.cjs.map +1 -1
  170. package/dist/data/chat/PromptInput.d.ts +5 -1
  171. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  172. package/dist/data/chat/PromptInput.js +4 -2
  173. package/dist/data/chat/PromptInput.js.map +1 -1
  174. package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
  175. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  176. package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
  177. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  178. package/dist/data/diagnostics/ErrorDetails.js +14 -3
  179. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  180. package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
  181. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  182. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  183. package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
  184. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  185. package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
  186. package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
  187. package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
  188. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
  189. package/dist/data/diagnostics/error-diagnostics.js +6 -1
  190. package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
  191. package/dist/data/har/HarPanel.cjs +3 -1
  192. package/dist/data/har/HarPanel.cjs.map +1 -1
  193. package/dist/data/har/HarPanel.d.ts +4 -1
  194. package/dist/data/har/HarPanel.d.ts.map +1 -1
  195. package/dist/data/har/HarPanel.js +3 -1
  196. package/dist/data/har/HarPanel.js.map +1 -1
  197. package/dist/data/test-runner/Expectation.cjs +57 -0
  198. package/dist/data/test-runner/Expectation.cjs.map +1 -0
  199. package/dist/data/test-runner/Expectation.d.ts +19 -0
  200. package/dist/data/test-runner/Expectation.d.ts.map +1 -0
  201. package/dist/data/test-runner/Expectation.js +57 -0
  202. package/dist/data/test-runner/Expectation.js.map +1 -0
  203. package/dist/data/test-runner/MarkIcons.cjs +38 -0
  204. package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
  205. package/dist/data/test-runner/MarkIcons.d.ts +15 -0
  206. package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
  207. package/dist/data/test-runner/MarkIcons.js +38 -0
  208. package/dist/data/test-runner/MarkIcons.js.map +1 -0
  209. package/dist/data/test-runner/TestDetailPanel.cjs +99 -53
  210. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  211. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  212. package/dist/data/test-runner/TestDetailPanel.js +101 -55
  213. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  214. package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
  215. package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
  216. package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
  217. package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
  218. package/dist/data/test-runner/TestFailureDetail.js +23 -27
  219. package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
  220. package/dist/data/test-runner/TestFilterBar.cjs +87 -93
  221. package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
  222. package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
  223. package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
  224. package/dist/data/test-runner/TestFilterBar.js +89 -95
  225. package/dist/data/test-runner/TestFilterBar.js.map +1 -1
  226. package/dist/data/test-runner/TestRunSummary.cjs +35 -21
  227. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  228. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  229. package/dist/data/test-runner/TestRunSummary.js +35 -21
  230. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  231. package/dist/data/test-runner/TestRunner.cjs +58 -30
  232. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  233. package/dist/data/test-runner/TestRunner.d.ts +6 -3
  234. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  235. package/dist/data/test-runner/TestRunner.js +58 -30
  236. package/dist/data/test-runner/TestRunner.js.map +1 -1
  237. package/dist/data/test-runner/TestTree.cjs +5 -2
  238. package/dist/data/test-runner/TestTree.cjs.map +1 -1
  239. package/dist/data/test-runner/TestTree.d.ts +5 -2
  240. package/dist/data/test-runner/TestTree.d.ts.map +1 -1
  241. package/dist/data/test-runner/TestTree.js +5 -2
  242. package/dist/data/test-runner/TestTree.js.map +1 -1
  243. package/dist/data/test-runner/TestTreeNode.cjs +28 -19
  244. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  245. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  246. package/dist/data/test-runner/TestTreeNode.js +29 -20
  247. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  248. package/dist/data/test-runner/adapter.cjs +15 -0
  249. package/dist/data/test-runner/adapter.cjs.map +1 -1
  250. package/dist/data/test-runner/adapter.d.ts +27 -7
  251. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  252. package/dist/data/test-runner/adapter.js +15 -0
  253. package/dist/data/test-runner/adapter.js.map +1 -1
  254. package/dist/data/test-runner/context.cjs.map +1 -1
  255. package/dist/data/test-runner/context.d.ts +2 -0
  256. package/dist/data/test-runner/context.d.ts.map +1 -1
  257. package/dist/data/test-runner/context.js.map +1 -1
  258. package/dist/data/test-runner/copy.cjs +114 -0
  259. package/dist/data/test-runner/copy.cjs.map +1 -0
  260. package/dist/data/test-runner/copy.d.ts +47 -0
  261. package/dist/data/test-runner/copy.d.ts.map +1 -0
  262. package/dist/data/test-runner/copy.js +114 -0
  263. package/dist/data/test-runner/copy.js.map +1 -0
  264. package/dist/data/test-runner/index.d.ts +6 -3
  265. package/dist/data/test-runner/index.d.ts.map +1 -1
  266. package/dist/data/test-runner/marks.cjs +184 -0
  267. package/dist/data/test-runner/marks.cjs.map +1 -0
  268. package/dist/data/test-runner/marks.d.ts +40 -0
  269. package/dist/data/test-runner/marks.d.ts.map +1 -0
  270. package/dist/data/test-runner/marks.js +184 -0
  271. package/dist/data/test-runner/marks.js.map +1 -0
  272. package/dist/data/test-runner/status.cjs +27 -44
  273. package/dist/data/test-runner/status.cjs.map +1 -1
  274. package/dist/data/test-runner/status.d.ts +12 -3
  275. package/dist/data/test-runner/status.d.ts.map +1 -1
  276. package/dist/data/test-runner/status.js +27 -44
  277. package/dist/data/test-runner/status.js.map +1 -1
  278. package/dist/data/traces/TerminalCastPlayer.d.ts +21 -0
  279. package/dist/data/traces/TerminalCastPlayer.d.ts.map +1 -0
  280. package/dist/data/traces/TraceHarView.d.ts +13 -0
  281. package/dist/data/traces/TraceHarView.d.ts.map +1 -0
  282. package/dist/data/traces/cast.d.ts +9 -0
  283. package/dist/data/traces/cast.d.ts.map +1 -0
  284. package/dist/data/traces/fixtures.d.ts +8 -0
  285. package/dist/data/traces/fixtures.d.ts.map +1 -0
  286. package/dist/data/traces/har-adapter.d.ts +13 -0
  287. package/dist/data/traces/har-adapter.d.ts.map +1 -0
  288. package/dist/data/traces/terminal-screen.d.ts +45 -0
  289. package/dist/data/traces/terminal-screen.d.ts.map +1 -0
  290. package/dist/data/traces/terminal-timeline.d.ts +26 -0
  291. package/dist/data/traces/terminal-timeline.d.ts.map +1 -0
  292. package/dist/data/traces/types.d.ts +141 -0
  293. package/dist/data/traces/types.d.ts.map +1 -0
  294. package/dist/data/verification/VerificationResults.cjs +4 -0
  295. package/dist/data/verification/VerificationResults.cjs.map +1 -1
  296. package/dist/data/verification/VerificationResults.d.ts +3 -1
  297. package/dist/data/verification/VerificationResults.d.ts.map +1 -1
  298. package/dist/data/verification/VerificationResults.js +4 -0
  299. package/dist/data/verification/VerificationResults.js.map +1 -1
  300. package/dist/data/verification/adapterViews.cjs +28 -44
  301. package/dist/data/verification/adapterViews.cjs.map +1 -1
  302. package/dist/data/verification/adapterViews.d.ts +4 -1
  303. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  304. package/dist/data/verification/adapterViews.js +28 -44
  305. package/dist/data/verification/adapterViews.js.map +1 -1
  306. package/dist/data/verification/adapters.cjs +163 -8
  307. package/dist/data/verification/adapters.cjs.map +1 -1
  308. package/dist/data/verification/adapters.d.ts +7 -1
  309. package/dist/data/verification/adapters.d.ts.map +1 -1
  310. package/dist/data/verification/adapters.js +163 -8
  311. package/dist/data/verification/adapters.js.map +1 -1
  312. package/dist/data/verification/index.d.ts +4 -2
  313. package/dist/data/verification/index.d.ts.map +1 -1
  314. package/dist/data/verification/stepKind.cjs +217 -0
  315. package/dist/data/verification/stepKind.cjs.map +1 -0
  316. package/dist/data/verification/stepKind.d.ts +87 -0
  317. package/dist/data/verification/stepKind.d.ts.map +1 -0
  318. package/dist/data/verification/stepKind.js +217 -0
  319. package/dist/data/verification/stepKind.js.map +1 -0
  320. package/dist/data/verification/stepKindViews.cjs +111 -0
  321. package/dist/data/verification/stepKindViews.cjs.map +1 -0
  322. package/dist/data/verification/stepKindViews.d.ts +18 -0
  323. package/dist/data/verification/stepKindViews.d.ts.map +1 -0
  324. package/dist/data/verification/stepKindViews.js +111 -0
  325. package/dist/data/verification/stepKindViews.js.map +1 -0
  326. package/dist/data/verification/verifyReportTests.cjs +1 -0
  327. package/dist/data/verification/verifyReportTests.cjs.map +1 -1
  328. package/dist/data/verification/verifyReportTests.d.ts +2 -1
  329. package/dist/data/verification/verifyReportTests.d.ts.map +1 -1
  330. package/dist/data/verification/verifyReportTests.js +1 -0
  331. package/dist/data/verification/verifyReportTests.js.map +1 -1
  332. package/dist/data/version-info.cjs +3 -3
  333. package/dist/data/version-info.js +3 -3
  334. package/dist/data.cjs +58 -3
  335. package/dist/data.cjs.map +1 -1
  336. package/dist/data.d.ts +3 -0
  337. package/dist/data.d.ts.map +1 -1
  338. package/dist/data.js +60 -5
  339. package/dist/data.js.map +1 -1
  340. package/dist/icons/components/UiLogoEslint.cjs +10 -0
  341. package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
  342. package/dist/icons/components/UiLogoEslint.d.ts +9 -0
  343. package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
  344. package/dist/icons/components/UiLogoEslint.js +10 -0
  345. package/dist/icons/components/UiLogoEslint.js.map +1 -0
  346. package/dist/icons/components/UiLogoGo.cjs +10 -0
  347. package/dist/icons/components/UiLogoGo.cjs.map +1 -0
  348. package/dist/icons/components/UiLogoGo.d.ts +9 -0
  349. package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
  350. package/dist/icons/components/UiLogoGo.js +10 -0
  351. package/dist/icons/components/UiLogoGo.js.map +1 -0
  352. package/dist/icons/components/UiLogoJest.cjs +10 -0
  353. package/dist/icons/components/UiLogoJest.cjs.map +1 -0
  354. package/dist/icons/components/UiLogoJest.d.ts +9 -0
  355. package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
  356. package/dist/icons/components/UiLogoJest.js +10 -0
  357. package/dist/icons/components/UiLogoJest.js.map +1 -0
  358. package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
  359. package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
  360. package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
  361. package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
  362. package/dist/icons/components/UiLogoMarkdown.js +10 -0
  363. package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
  364. package/dist/icons/components/UiLogoOxc.cjs +10 -0
  365. package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
  366. package/dist/icons/components/UiLogoOxc.d.ts +9 -0
  367. package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
  368. package/dist/icons/components/UiLogoOxc.js +10 -0
  369. package/dist/icons/components/UiLogoOxc.js.map +1 -0
  370. package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
  371. package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
  372. package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
  373. package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
  374. package/dist/icons/components/UiLogoPlaywright.js +10 -0
  375. package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
  376. package/dist/icons/components/UiLogoPython.cjs +10 -0
  377. package/dist/icons/components/UiLogoPython.cjs.map +1 -0
  378. package/dist/icons/components/UiLogoPython.d.ts +9 -0
  379. package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
  380. package/dist/icons/components/UiLogoPython.js +10 -0
  381. package/dist/icons/components/UiLogoPython.js.map +1 -0
  382. package/dist/icons/components/UiLogoReact.cjs +10 -0
  383. package/dist/icons/components/UiLogoReact.cjs.map +1 -0
  384. package/dist/icons/components/UiLogoReact.d.ts +9 -0
  385. package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
  386. package/dist/icons/components/UiLogoReact.js +10 -0
  387. package/dist/icons/components/UiLogoReact.js.map +1 -0
  388. package/dist/icons/components/UiLogoRuff.cjs +10 -0
  389. package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
  390. package/dist/icons/components/UiLogoRuff.d.ts +9 -0
  391. package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
  392. package/dist/icons/components/UiLogoRuff.js +10 -0
  393. package/dist/icons/components/UiLogoRuff.js.map +1 -0
  394. package/dist/icons/components/UiLogoTypescript.cjs +10 -0
  395. package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
  396. package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
  397. package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
  398. package/dist/icons/components/UiLogoTypescript.js +10 -0
  399. package/dist/icons/components/UiLogoTypescript.js.map +1 -0
  400. package/dist/icons/components/UiLogoVitest.cjs +10 -0
  401. package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
  402. package/dist/icons/components/UiLogoVitest.d.ts +9 -0
  403. package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
  404. package/dist/icons/components/UiLogoVitest.js +10 -0
  405. package/dist/icons/components/UiLogoVitest.js.map +1 -0
  406. package/dist/icons/index.d.ts +11 -0
  407. package/dist/icons/index.d.ts.map +1 -1
  408. package/dist/icons/registry.cjs +22 -0
  409. package/dist/icons/registry.cjs.map +1 -1
  410. package/dist/icons/registry.d.ts.map +1 -1
  411. package/dist/icons/registry.js +22 -0
  412. package/dist/icons/registry.js.map +1 -1
  413. package/dist/icons.cjs +22 -0
  414. package/dist/icons.cjs.map +1 -1
  415. package/dist/icons.js +22 -0
  416. package/dist/icons.js.map +1 -1
  417. package/dist/index.cjs +60 -3
  418. package/dist/index.cjs.map +1 -1
  419. package/dist/index.js +62 -5
  420. package/dist/index.js.map +1 -1
  421. package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
  422. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  423. package/dist/overlay/DropdownMenuSubmenu.js +4 -4
  424. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  425. package/dist/rpc/FilterForm.cjs +9 -0
  426. package/dist/rpc/FilterForm.cjs.map +1 -1
  427. package/dist/rpc/FilterForm.d.ts +5 -1
  428. package/dist/rpc/FilterForm.d.ts.map +1 -1
  429. package/dist/rpc/FilterForm.js +9 -0
  430. package/dist/rpc/FilterForm.js.map +1 -1
  431. package/dist/rpc/InlineError.cjs +12 -43
  432. package/dist/rpc/InlineError.cjs.map +1 -1
  433. package/dist/rpc/InlineError.d.ts.map +1 -1
  434. package/dist/rpc/InlineError.js +13 -44
  435. package/dist/rpc/InlineError.js.map +1 -1
  436. package/dist/rpc/OperationArgsForm.cjs +153 -0
  437. package/dist/rpc/OperationArgsForm.cjs.map +1 -0
  438. package/dist/rpc/OperationArgsForm.d.ts +16 -0
  439. package/dist/rpc/OperationArgsForm.d.ts.map +1 -0
  440. package/dist/rpc/OperationArgsForm.js +153 -0
  441. package/dist/rpc/OperationArgsForm.js.map +1 -0
  442. package/dist/rpc/OperationScheduleDialog.cjs +119 -22
  443. package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
  444. package/dist/rpc/OperationScheduleDialog.d.ts +7 -0
  445. package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
  446. package/dist/rpc/OperationScheduleDialog.js +120 -23
  447. package/dist/rpc/OperationScheduleDialog.js.map +1 -1
  448. package/dist/rpc/OperationSchedules.cjs +17 -2
  449. package/dist/rpc/OperationSchedules.cjs.map +1 -1
  450. package/dist/rpc/OperationSchedules.d.ts.map +1 -1
  451. package/dist/rpc/OperationSchedules.js +17 -2
  452. package/dist/rpc/OperationSchedules.js.map +1 -1
  453. package/dist/rpc/operation-schedule-model.cjs +2 -7
  454. package/dist/rpc/operation-schedule-model.cjs.map +1 -1
  455. package/dist/rpc/operation-schedule-model.d.ts +0 -2
  456. package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
  457. package/dist/rpc/operation-schedule-model.js +2 -7
  458. package/dist/rpc/operation-schedule-model.js.map +1 -1
  459. package/dist/rpc/operation-schedule-types.d.ts +12 -1
  460. package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
  461. package/dist/rpc.cjs +2 -0
  462. package/dist/rpc.cjs.map +1 -1
  463. package/dist/rpc.d.ts +1 -0
  464. package/dist/rpc.d.ts.map +1 -1
  465. package/dist/rpc.js +2 -0
  466. package/dist/rpc.js.map +1 -1
  467. package/dist/styles.css +1 -1
  468. package/package.json +1 -1
  469. package/dist/data/test-runner/frameworkIcon.cjs +0 -27
  470. package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
  471. package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
  472. package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
  473. package/dist/data/test-runner/frameworkIcon.js +0 -27
  474. package/dist/data/test-runner/frameworkIcon.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperationArgsForm.cjs","sources":["../../src/rpc/OperationArgsForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { FilterForm } from \"./FilterForm\";\nimport { getOperationClickyMeta } from \"./clickyMetadata\";\nimport {\n buildInitialParameterValues,\n defaultValueForParameter,\n titleCase,\n type ParameterValues,\n} from \"./formMetadata\";\nimport type { OpenAPIParameter, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\nexport type OperationArgs = Record<string, unknown>;\n\nexport type OperationArgsFormProps = {\n client: OperationsApiClient;\n operation: ResolvedOperation;\n /** Stored args. Read when the form mounts; remount it (key) to load others. */\n args: OperationArgs;\n /** Called with the typed args (booleans, numbers, lists) on every change. */\n onChange: (args: OperationArgs) => void;\n /** Called with false while a required parameter is missing or a value is malformed. */\n onValidityChange?: ((valid: boolean) => void) | undefined;\n className?: string | undefined;\n};\n\nconst NO_PARAMETERS: OpenAPIParameter[] = [];\n\n// OperationArgsForm renders an operation's own parameter form — the FilterForm\n// its action button opens, with the operation's lookups — as a field set whose\n// value is a stored args object, for surfaces that save or queue a run (the\n// schedule dialog, a Run now confirmation) rather than execute it.\nexport function OperationArgsForm({\n client,\n operation,\n args,\n onChange,\n onValidityChange,\n className,\n}: OperationArgsFormProps) {\n const parameters = operation.operation.parameters ?? NO_PARAMETERS;\n const [initial] = useState(() =>\n storedArgsToValues(args, parameters, operation.method),\n );\n const [values, setValues] = useState(initial.values);\n const problems = useMemo(\n () => parameterProblems(parameters, values),\n [parameters, values],\n );\n const valid = problems.length === 0;\n\n useEffect(() => {\n onValidityChange?.(valid);\n }, [onValidityChange, valid]);\n\n const handleChange = (next: ParameterValues) => {\n setValues(next);\n onChange(\n valuesToArgs({\n parameters,\n method: operation.method,\n values: next,\n stored: initial.names,\n }),\n );\n };\n\n return (\n <div className=\"space-y-2\">\n <FilterForm\n client={client}\n path={operation.path}\n method={operation.method}\n parameters={parameters}\n initialValues={initial.values}\n enableLookup={Boolean(getOperationClickyMeta(operation)?.supportsLookup)}\n showSubmit={false}\n onChange={handleChange}\n onSubmit={() => undefined}\n {...(className ? { className } : {})}\n />\n {initial.dropped.length > 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n Dropped arguments this operation no longer accepts:{\" \"}\n {initial.dropped.join(\", \")}\n </p>\n ) : null}\n {problems.map((problem) => (\n <p key={problem} className=\"text-sm text-destructive\">\n {problem}\n </p>\n ))}\n </div>\n );\n}\n\nfunction storedArgsToValues(\n args: OperationArgs,\n parameters: OpenAPIParameter[],\n method: string,\n) {\n const known = new Set(parameters.map((parameter) => parameter.name));\n const stored: ParameterValues = {};\n const dropped: string[] = [];\n for (const [name, value] of Object.entries(args)) {\n if (!known.has(name)) {\n dropped.push(name);\n continue;\n }\n stored[name] = storedValueToString(name, value);\n }\n return {\n values: buildInitialParameterValues(parameters, method, {}, stored),\n names: new Set(Object.keys(stored)),\n dropped,\n };\n}\n\nfunction storedValueToString(name: string, value: unknown): string {\n if (Array.isArray(value)) return value.map(String).join(\",\");\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n throw new Error(\n `Stored argument ${name} has an unsupported value: ${JSON.stringify(value)}`,\n );\n}\n\n// valuesToArgs keeps what the schedule names: values that differ from the\n// parameter's default, required ones, and ones the stored args already held.\n// Untouched defaults stay out so the server keeps applying its own default.\nfunction valuesToArgs({\n parameters,\n method,\n values,\n stored,\n}: {\n parameters: OpenAPIParameter[];\n method: string;\n values: ParameterValues;\n stored: ReadonlySet<string>;\n}): OperationArgs {\n const args: OperationArgs = {};\n for (const parameter of parameters) {\n const raw = values[parameter.name] ?? \"\";\n if (raw.trim() === \"\") continue;\n const isDefault = raw === effectiveDefault(parameter, method);\n if (isDefault && !parameter.required && !stored.has(parameter.name)) continue;\n args[parameter.name] = typedValue(parameter, raw);\n }\n return args;\n}\n\nfunction effectiveDefault(parameter: OpenAPIParameter, method: string): string {\n const value = defaultValueForParameter(parameter, method);\n return parameter.schema?.type === \"boolean\" && value === \"\" ? \"false\" : value;\n}\n\nfunction typedValue(parameter: OpenAPIParameter, raw: string): unknown {\n switch (parameter.schema?.type) {\n case \"boolean\":\n return raw === \"true\";\n case \"integer\":\n return isWholeNumber(raw) ? Number(raw) : raw;\n case \"number\":\n return isNumber(raw) ? Number(raw) : raw;\n case \"array\":\n return raw\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n default:\n return raw;\n }\n}\n\nfunction parameterProblems(\n parameters: OpenAPIParameter[],\n values: ParameterValues,\n): string[] {\n const missing = parameters\n .filter(\n (parameter) =>\n parameter.required && (values[parameter.name] ?? \"\").trim() === \"\",\n )\n .map((parameter) => titleCase(parameter.name));\n const problems =\n missing.length > 0 ? [`Missing required fields: ${missing.join(\", \")}`] : [];\n for (const parameter of parameters) {\n const raw = (values[parameter.name] ?? \"\").trim();\n if (raw === \"\") continue;\n const label = titleCase(parameter.name);\n if (parameter.schema?.type === \"integer\" && !isWholeNumber(raw)) {\n problems.push(`${label} must be a whole number.`);\n } else if (parameter.schema?.type === \"number\" && !isNumber(raw)) {\n problems.push(`${label} must be a number.`);\n }\n }\n return problems;\n}\n\nfunction isWholeNumber(raw: string): boolean {\n return /^-?\\d+$/.test(raw.trim());\n}\n\nfunction isNumber(raw: string): boolean {\n return raw.trim() !== \"\" && Number.isFinite(Number(raw));\n}\n"],"names":["useState","useMemo","useEffect","jsxs","jsx","FilterForm","getOperationClickyMeta","buildInitialParameterValues","defaultValueForParameter","titleCase"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { ResolvedOperation } from './types.js';
2
+ import { OperationsApiClient } from './useOperations.js';
3
+ export type OperationArgs = Record<string, unknown>;
4
+ export type OperationArgsFormProps = {
5
+ client: OperationsApiClient;
6
+ operation: ResolvedOperation;
7
+ /** Stored args. Read when the form mounts; remount it (key) to load others. */
8
+ args: OperationArgs;
9
+ /** Called with the typed args (booleans, numbers, lists) on every change. */
10
+ onChange: (args: OperationArgs) => void;
11
+ /** Called with false while a required parameter is missing or a value is malformed. */
12
+ onValidityChange?: ((valid: boolean) => void) | undefined;
13
+ className?: string | undefined;
14
+ };
15
+ export declare function OperationArgsForm({ client, operation, args, onChange, onValidityChange, className, }: OperationArgsFormProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=OperationArgsForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperationArgsForm.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationArgsForm.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,+EAA+E;IAC/E,IAAI,EAAE,aAAa,CAAC;IACpB,6EAA6E;IAC7E,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IACxC,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC,CAAC;AAQF,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,SAAS,EACT,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,SAAS,GACV,EAAE,sBAAsB,+BAuDxB"}
@@ -0,0 +1,153 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState, useMemo, useEffect } from "react";
3
+ import { FilterForm } from "./FilterForm.js";
4
+ import { getOperationClickyMeta } from "./clickyMetadata.js";
5
+ import { buildInitialParameterValues, titleCase, defaultValueForParameter } from "./formMetadata.js";
6
+ const NO_PARAMETERS = [];
7
+ function OperationArgsForm({
8
+ client,
9
+ operation,
10
+ args,
11
+ onChange,
12
+ onValidityChange,
13
+ className
14
+ }) {
15
+ var _a;
16
+ const parameters = operation.operation.parameters ?? NO_PARAMETERS;
17
+ const [initial] = useState(
18
+ () => storedArgsToValues(args, parameters, operation.method)
19
+ );
20
+ const [values, setValues] = useState(initial.values);
21
+ const problems = useMemo(
22
+ () => parameterProblems(parameters, values),
23
+ [parameters, values]
24
+ );
25
+ const valid = problems.length === 0;
26
+ useEffect(() => {
27
+ onValidityChange == null ? void 0 : onValidityChange(valid);
28
+ }, [onValidityChange, valid]);
29
+ const handleChange = (next) => {
30
+ setValues(next);
31
+ onChange(
32
+ valuesToArgs({
33
+ parameters,
34
+ method: operation.method,
35
+ values: next,
36
+ stored: initial.names
37
+ })
38
+ );
39
+ };
40
+ return /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
41
+ /* @__PURE__ */ jsx(
42
+ FilterForm,
43
+ {
44
+ client,
45
+ path: operation.path,
46
+ method: operation.method,
47
+ parameters,
48
+ initialValues: initial.values,
49
+ enableLookup: Boolean((_a = getOperationClickyMeta(operation)) == null ? void 0 : _a.supportsLookup),
50
+ showSubmit: false,
51
+ onChange: handleChange,
52
+ onSubmit: () => void 0,
53
+ ...className ? { className } : {}
54
+ }
55
+ ),
56
+ initial.dropped.length > 0 ? /* @__PURE__ */ jsxs("p", { className: "text-xs text-muted-foreground", children: [
57
+ "Dropped arguments this operation no longer accepts:",
58
+ " ",
59
+ initial.dropped.join(", ")
60
+ ] }) : null,
61
+ problems.map((problem) => /* @__PURE__ */ jsx("p", { className: "text-sm text-destructive", children: problem }, problem))
62
+ ] });
63
+ }
64
+ function storedArgsToValues(args, parameters, method) {
65
+ const known = new Set(parameters.map((parameter) => parameter.name));
66
+ const stored = {};
67
+ const dropped = [];
68
+ for (const [name, value] of Object.entries(args)) {
69
+ if (!known.has(name)) {
70
+ dropped.push(name);
71
+ continue;
72
+ }
73
+ stored[name] = storedValueToString(name, value);
74
+ }
75
+ return {
76
+ values: buildInitialParameterValues(parameters, method, {}, stored),
77
+ names: new Set(Object.keys(stored)),
78
+ dropped
79
+ };
80
+ }
81
+ function storedValueToString(name, value) {
82
+ if (Array.isArray(value)) return value.map(String).join(",");
83
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
84
+ return String(value);
85
+ }
86
+ throw new Error(
87
+ `Stored argument ${name} has an unsupported value: ${JSON.stringify(value)}`
88
+ );
89
+ }
90
+ function valuesToArgs({
91
+ parameters,
92
+ method,
93
+ values,
94
+ stored
95
+ }) {
96
+ const args = {};
97
+ for (const parameter of parameters) {
98
+ const raw = values[parameter.name] ?? "";
99
+ if (raw.trim() === "") continue;
100
+ const isDefault = raw === effectiveDefault(parameter, method);
101
+ if (isDefault && !parameter.required && !stored.has(parameter.name)) continue;
102
+ args[parameter.name] = typedValue(parameter, raw);
103
+ }
104
+ return args;
105
+ }
106
+ function effectiveDefault(parameter, method) {
107
+ var _a;
108
+ const value = defaultValueForParameter(parameter, method);
109
+ return ((_a = parameter.schema) == null ? void 0 : _a.type) === "boolean" && value === "" ? "false" : value;
110
+ }
111
+ function typedValue(parameter, raw) {
112
+ var _a;
113
+ switch ((_a = parameter.schema) == null ? void 0 : _a.type) {
114
+ case "boolean":
115
+ return raw === "true";
116
+ case "integer":
117
+ return isWholeNumber(raw) ? Number(raw) : raw;
118
+ case "number":
119
+ return isNumber(raw) ? Number(raw) : raw;
120
+ case "array":
121
+ return raw.split(",").map((item) => item.trim()).filter(Boolean);
122
+ default:
123
+ return raw;
124
+ }
125
+ }
126
+ function parameterProblems(parameters, values) {
127
+ var _a, _b;
128
+ const missing = parameters.filter(
129
+ (parameter) => parameter.required && (values[parameter.name] ?? "").trim() === ""
130
+ ).map((parameter) => titleCase(parameter.name));
131
+ const problems = missing.length > 0 ? [`Missing required fields: ${missing.join(", ")}`] : [];
132
+ for (const parameter of parameters) {
133
+ const raw = (values[parameter.name] ?? "").trim();
134
+ if (raw === "") continue;
135
+ const label = titleCase(parameter.name);
136
+ if (((_a = parameter.schema) == null ? void 0 : _a.type) === "integer" && !isWholeNumber(raw)) {
137
+ problems.push(`${label} must be a whole number.`);
138
+ } else if (((_b = parameter.schema) == null ? void 0 : _b.type) === "number" && !isNumber(raw)) {
139
+ problems.push(`${label} must be a number.`);
140
+ }
141
+ }
142
+ return problems;
143
+ }
144
+ function isWholeNumber(raw) {
145
+ return /^-?\d+$/.test(raw.trim());
146
+ }
147
+ function isNumber(raw) {
148
+ return raw.trim() !== "" && Number.isFinite(Number(raw));
149
+ }
150
+ export {
151
+ OperationArgsForm
152
+ };
153
+ //# sourceMappingURL=OperationArgsForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OperationArgsForm.js","sources":["../../src/rpc/OperationArgsForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { FilterForm } from \"./FilterForm\";\nimport { getOperationClickyMeta } from \"./clickyMetadata\";\nimport {\n buildInitialParameterValues,\n defaultValueForParameter,\n titleCase,\n type ParameterValues,\n} from \"./formMetadata\";\nimport type { OpenAPIParameter, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\nexport type OperationArgs = Record<string, unknown>;\n\nexport type OperationArgsFormProps = {\n client: OperationsApiClient;\n operation: ResolvedOperation;\n /** Stored args. Read when the form mounts; remount it (key) to load others. */\n args: OperationArgs;\n /** Called with the typed args (booleans, numbers, lists) on every change. */\n onChange: (args: OperationArgs) => void;\n /** Called with false while a required parameter is missing or a value is malformed. */\n onValidityChange?: ((valid: boolean) => void) | undefined;\n className?: string | undefined;\n};\n\nconst NO_PARAMETERS: OpenAPIParameter[] = [];\n\n// OperationArgsForm renders an operation's own parameter form — the FilterForm\n// its action button opens, with the operation's lookups — as a field set whose\n// value is a stored args object, for surfaces that save or queue a run (the\n// schedule dialog, a Run now confirmation) rather than execute it.\nexport function OperationArgsForm({\n client,\n operation,\n args,\n onChange,\n onValidityChange,\n className,\n}: OperationArgsFormProps) {\n const parameters = operation.operation.parameters ?? NO_PARAMETERS;\n const [initial] = useState(() =>\n storedArgsToValues(args, parameters, operation.method),\n );\n const [values, setValues] = useState(initial.values);\n const problems = useMemo(\n () => parameterProblems(parameters, values),\n [parameters, values],\n );\n const valid = problems.length === 0;\n\n useEffect(() => {\n onValidityChange?.(valid);\n }, [onValidityChange, valid]);\n\n const handleChange = (next: ParameterValues) => {\n setValues(next);\n onChange(\n valuesToArgs({\n parameters,\n method: operation.method,\n values: next,\n stored: initial.names,\n }),\n );\n };\n\n return (\n <div className=\"space-y-2\">\n <FilterForm\n client={client}\n path={operation.path}\n method={operation.method}\n parameters={parameters}\n initialValues={initial.values}\n enableLookup={Boolean(getOperationClickyMeta(operation)?.supportsLookup)}\n showSubmit={false}\n onChange={handleChange}\n onSubmit={() => undefined}\n {...(className ? { className } : {})}\n />\n {initial.dropped.length > 0 ? (\n <p className=\"text-xs text-muted-foreground\">\n Dropped arguments this operation no longer accepts:{\" \"}\n {initial.dropped.join(\", \")}\n </p>\n ) : null}\n {problems.map((problem) => (\n <p key={problem} className=\"text-sm text-destructive\">\n {problem}\n </p>\n ))}\n </div>\n );\n}\n\nfunction storedArgsToValues(\n args: OperationArgs,\n parameters: OpenAPIParameter[],\n method: string,\n) {\n const known = new Set(parameters.map((parameter) => parameter.name));\n const stored: ParameterValues = {};\n const dropped: string[] = [];\n for (const [name, value] of Object.entries(args)) {\n if (!known.has(name)) {\n dropped.push(name);\n continue;\n }\n stored[name] = storedValueToString(name, value);\n }\n return {\n values: buildInitialParameterValues(parameters, method, {}, stored),\n names: new Set(Object.keys(stored)),\n dropped,\n };\n}\n\nfunction storedValueToString(name: string, value: unknown): string {\n if (Array.isArray(value)) return value.map(String).join(\",\");\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return String(value);\n }\n throw new Error(\n `Stored argument ${name} has an unsupported value: ${JSON.stringify(value)}`,\n );\n}\n\n// valuesToArgs keeps what the schedule names: values that differ from the\n// parameter's default, required ones, and ones the stored args already held.\n// Untouched defaults stay out so the server keeps applying its own default.\nfunction valuesToArgs({\n parameters,\n method,\n values,\n stored,\n}: {\n parameters: OpenAPIParameter[];\n method: string;\n values: ParameterValues;\n stored: ReadonlySet<string>;\n}): OperationArgs {\n const args: OperationArgs = {};\n for (const parameter of parameters) {\n const raw = values[parameter.name] ?? \"\";\n if (raw.trim() === \"\") continue;\n const isDefault = raw === effectiveDefault(parameter, method);\n if (isDefault && !parameter.required && !stored.has(parameter.name)) continue;\n args[parameter.name] = typedValue(parameter, raw);\n }\n return args;\n}\n\nfunction effectiveDefault(parameter: OpenAPIParameter, method: string): string {\n const value = defaultValueForParameter(parameter, method);\n return parameter.schema?.type === \"boolean\" && value === \"\" ? \"false\" : value;\n}\n\nfunction typedValue(parameter: OpenAPIParameter, raw: string): unknown {\n switch (parameter.schema?.type) {\n case \"boolean\":\n return raw === \"true\";\n case \"integer\":\n return isWholeNumber(raw) ? Number(raw) : raw;\n case \"number\":\n return isNumber(raw) ? Number(raw) : raw;\n case \"array\":\n return raw\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n default:\n return raw;\n }\n}\n\nfunction parameterProblems(\n parameters: OpenAPIParameter[],\n values: ParameterValues,\n): string[] {\n const missing = parameters\n .filter(\n (parameter) =>\n parameter.required && (values[parameter.name] ?? \"\").trim() === \"\",\n )\n .map((parameter) => titleCase(parameter.name));\n const problems =\n missing.length > 0 ? [`Missing required fields: ${missing.join(\", \")}`] : [];\n for (const parameter of parameters) {\n const raw = (values[parameter.name] ?? \"\").trim();\n if (raw === \"\") continue;\n const label = titleCase(parameter.name);\n if (parameter.schema?.type === \"integer\" && !isWholeNumber(raw)) {\n problems.push(`${label} must be a whole number.`);\n } else if (parameter.schema?.type === \"number\" && !isNumber(raw)) {\n problems.push(`${label} must be a number.`);\n }\n }\n return problems;\n}\n\nfunction isWholeNumber(raw: string): boolean {\n return /^-?\\d+$/.test(raw.trim());\n}\n\nfunction isNumber(raw: string): boolean {\n return raw.trim() !== \"\" && Number.isFinite(Number(raw));\n}\n"],"names":[],"mappings":"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"}
@@ -3,38 +3,74 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const button = require("../components/button.cjs");
6
+ const Combobox = require("../components/Combobox.cjs");
6
7
  const CopyButton = require("../components/CopyButton.cjs");
7
8
  const Field = require("../components/Field.cjs");
8
9
  const InputField = require("../components/InputField.cjs");
9
- const JsonSchemaForm = require("../components/JsonSchemaForm.cjs");
10
10
  const ScheduleEditor = require("../components/ScheduleEditor.cjs");
11
11
  const Modal = require("../overlay/Modal.cjs");
12
12
  const operationScheduleModel = require("./operation-schedule-model.cjs");
13
13
  const operationCliCommand = require("./operation-cli-command.cjs");
14
14
  const InlineError = require("./InlineError.cjs");
15
+ const OperationArgsForm = require("./OperationArgsForm.cjs");
15
16
  const OperationPicker = require("./OperationPicker.cjs");
16
17
  function OperationScheduleDialog(_props) {
17
18
  var _a, _b, _c, _d;
18
- const { open, operations, schedule, cli, onClose, onSave, onRunNow } = _props;
19
+ const {
20
+ client,
21
+ open,
22
+ operations,
23
+ schedule,
24
+ cli,
25
+ targetOptions,
26
+ defaultTargets,
27
+ targetLabel = "Targets",
28
+ onClose,
29
+ onSave,
30
+ onRunNow
31
+ } = _props;
19
32
  const [input, setInput] = react.useState(
20
33
  operationScheduleModel.newOperationScheduleInput
21
34
  );
22
35
  const [pending, setPending] = react.useState();
23
36
  const [error, setError] = react.useState();
24
37
  const [confirmingRun, setConfirmingRun] = react.useState(false);
38
+ const [concurrencyText, setConcurrencyText] = react.useState("1");
39
+ const [argsValid, setArgsValid] = react.useState(true);
40
+ const [argsSession, setArgsSession] = react.useState(0);
25
41
  react.useEffect(() => {
26
42
  if (!open) return;
43
+ setArgsSession((session) => session + 1);
27
44
  setInput(
28
- schedule ? operationScheduleModel.scheduleToInput(schedule) : operationScheduleModel.newOperationScheduleInput()
45
+ schedule ? operationScheduleModel.scheduleToInput(schedule) : {
46
+ ...operationScheduleModel.newOperationScheduleInput(),
47
+ targets: [...defaultTargets ?? []]
48
+ }
29
49
  );
50
+ setConcurrencyText(String((schedule == null ? void 0 : schedule.concurrency) ?? 1));
30
51
  setError(void 0);
31
52
  setConfirmingRun(false);
32
- }, [open, schedule]);
53
+ }, [open, schedule, defaultTargets]);
54
+ const multiTarget = input.targets.length > 1;
55
+ const concurrency = Number(concurrencyText);
56
+ const concurrencyValid = !multiTarget || concurrencyText.trim() !== "" && Number.isInteger(concurrency) && concurrency >= 1 && concurrency <= input.targets.length;
57
+ const concurrencyPayload = multiTarget ? { concurrency } : {};
58
+ const changeTargets = (targets) => {
59
+ setInput({ ...input, targets });
60
+ const limit = Math.max(1, targets.length);
61
+ setConcurrencyText(
62
+ (current) => Number(current) > limit ? String(limit) : current
63
+ );
64
+ };
33
65
  const operation = operationScheduleModel.operationByID(operations, input.operationId);
34
- const schema = operationScheduleModel.operationInputSchema(operation);
35
66
  const suggestions = ((_b = (_a = operation == null ? void 0 : operation.operation["x-clicky"]) == null ? void 0 : _a.schedule) == null ? void 0 : _b.suggestions) ?? [];
36
67
  const destructive = ((_d = (_c = operation == null ? void 0 : operation.operation["x-clicky"]) == null ? void 0 : _c.toolHints) == null ? void 0 : _d.destructiveHint) === true;
37
- const cliCommand = operationCliCommand.operationCLICommand(operation, input.args, cli);
68
+ const cliCommand = (cli == null ? void 0 : cli.targetFlag) ? input.targets.map(
69
+ (target) => operationCliCommand.operationCLICommand(operation, input.args, {
70
+ ...cli,
71
+ globalFlags: { ...cli.globalFlags, [cli.targetFlag]: target }
72
+ })
73
+ ).join("\n") : operationCliCommand.operationCLICommand(operation, input.args, cli);
38
74
  const selectOperation = (operationId) => {
39
75
  const selected = operationScheduleModel.operationByID(operations, operationId);
40
76
  setInput((current) => {
@@ -52,7 +88,7 @@ function OperationScheduleDialog(_props) {
52
88
  setPending("save");
53
89
  setError(void 0);
54
90
  try {
55
- await onSave(input);
91
+ await onSave({ ...input, ...concurrencyPayload });
56
92
  onClose();
57
93
  } catch (nextError) {
58
94
  setError(nextError);
@@ -64,7 +100,12 @@ function OperationScheduleDialog(_props) {
64
100
  setPending("run");
65
101
  setError(void 0);
66
102
  try {
67
- await onRunNow({ operationId: input.operationId, args: input.args });
103
+ await onRunNow({
104
+ operationId: input.operationId,
105
+ args: input.args,
106
+ targets: input.targets,
107
+ ...concurrencyPayload
108
+ });
68
109
  setConfirmingRun(false);
69
110
  onClose();
70
111
  } catch (nextError) {
@@ -75,9 +116,11 @@ function OperationScheduleDialog(_props) {
75
116
  }
76
117
  };
77
118
  const canSave = Boolean(
78
- input.name.trim() && input.operationId && input.cron.trim()
119
+ input.name.trim() && input.operationId && input.cron.trim() && input.targets.length && concurrencyValid && argsValid
120
+ );
121
+ const canRun = Boolean(
122
+ input.operationId && input.targets.length && concurrencyValid && argsValid
79
123
  );
80
- const canRun = Boolean(input.operationId);
81
124
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
82
125
  /* @__PURE__ */ jsxRuntime.jsx(
83
126
  Modal.Modal,
@@ -111,6 +154,51 @@ function OperationScheduleDialog(_props) {
111
154
  )
112
155
  ] }),
113
156
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-5", children: [
157
+ /* @__PURE__ */ jsxRuntime.jsx(
158
+ Field.Field,
159
+ {
160
+ label: targetLabel,
161
+ htmlFor: "operation-schedule-targets",
162
+ required: true,
163
+ children: /* @__PURE__ */ jsxRuntime.jsx(
164
+ Combobox.Combobox,
165
+ {
166
+ id: "operation-schedule-targets",
167
+ multiple: true,
168
+ variant: "tags",
169
+ ariaLabel: targetLabel,
170
+ ariaRequired: true,
171
+ allowCustomValue: false,
172
+ options: targetOptions,
173
+ value: input.targets,
174
+ onChange: changeTargets
175
+ }
176
+ )
177
+ }
178
+ ),
179
+ multiTarget ? /* @__PURE__ */ jsxRuntime.jsx(
180
+ Field.Field,
181
+ {
182
+ label: `${targetLabel} at once`,
183
+ htmlFor: "operation-schedule-concurrency",
184
+ error: concurrencyValid ? void 0 : `Enter a whole number from 1 to ${input.targets.length}.`,
185
+ helper: `How many of the ${input.targets.length} selected run at the same time; the rest wait their turn.`,
186
+ children: /* @__PURE__ */ jsxRuntime.jsx(
187
+ InputField.InputField,
188
+ {
189
+ id: "operation-schedule-concurrency",
190
+ type: "number",
191
+ inputMode: "numeric",
192
+ min: 1,
193
+ max: input.targets.length,
194
+ step: 1,
195
+ invalid: !concurrencyValid,
196
+ value: concurrencyText,
197
+ onChange: setConcurrencyText
198
+ }
199
+ )
200
+ }
201
+ ) : null,
114
202
  /* @__PURE__ */ jsxRuntime.jsx(
115
203
  Field.Field,
116
204
  {
@@ -136,23 +224,24 @@ function OperationScheduleDialog(_props) {
136
224
  onChange: selectOperation
137
225
  }
138
226
  ),
139
- operation ? schema && Object.keys(schema.properties ?? {}).length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "space-y-2", children: [
227
+ operation ? /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "space-y-2", children: [
140
228
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold", children: "Arguments" }),
141
229
  /* @__PURE__ */ jsxRuntime.jsx(
142
- JsonSchemaForm.JsonSchemaForm,
230
+ OperationArgsForm.OperationArgsForm,
143
231
  {
144
- schema,
145
- value: input.args,
146
- onChange: (args) => setInput({ ...input, args }),
147
- idPrefix: "operation-schedule-args",
148
- showPreferencesMenu: false
149
- }
232
+ client,
233
+ operation,
234
+ args: input.args,
235
+ onChange: (args) => setInput((current) => ({ ...current, args })),
236
+ onValidityChange: setArgsValid
237
+ },
238
+ `${argsSession}:${input.operationId}`
150
239
  )
151
- ] }) : /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "This operation has no arguments." }) : null,
240
+ ] }) : null,
152
241
  cliCommand ? /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "space-y-1", children: [
153
242
  /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold", children: "Equivalent CLI command" }),
154
243
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 rounded-md border bg-muted/30 px-3 py-2", children: [
155
- /* @__PURE__ */ jsxRuntime.jsx("code", { className: "min-w-0 flex-1 overflow-x-auto whitespace-nowrap text-xs", children: cliCommand }),
244
+ /* @__PURE__ */ jsxRuntime.jsx("code", { className: "min-w-0 flex-1 overflow-x-auto whitespace-pre text-xs", children: cliCommand }),
156
245
  /* @__PURE__ */ jsxRuntime.jsx(CopyButton.CopyButton, { value: cliCommand, label: "Copy CLI command" })
157
246
  ] })
158
247
  ] }) : null,
@@ -170,7 +259,7 @@ function OperationScheduleDialog(_props) {
170
259
  ] })
171
260
  }
172
261
  ),
173
- /* @__PURE__ */ jsxRuntime.jsx(
262
+ /* @__PURE__ */ jsxRuntime.jsxs(
174
263
  Modal.Modal,
175
264
  {
176
265
  open: confirmingRun,
@@ -198,7 +287,15 @@ function OperationScheduleDialog(_props) {
198
287
  }
199
288
  )
200
289
  ] }),
201
- children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "This runs the configured operation once without creating or changing a recurring schedule." })
290
+ children: [
291
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "This runs the configured operation once without creating or changing a recurring schedule." }),
292
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-2 text-sm", children: [
293
+ targetLabel,
294
+ ": ",
295
+ input.targets.join(", "),
296
+ multiTarget ? ` (${concurrency} at once)` : ""
297
+ ] })
298
+ ]
202
299
  }
203
300
  )
204
301
  ] });
@@ -1 +1 @@
1
- {"version":3,"file":"OperationScheduleDialog.cjs","sources":["../../src/rpc/OperationScheduleDialog.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { CopyButton } from \"../components/CopyButton\";\nimport { Field } from \"../components/Field\";\nimport { InputField } from \"../components/InputField\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { ScheduleEditor } from \"../components/ScheduleEditor\";\nimport { Modal } from \"../overlay/Modal\";\nimport {\n newOperationScheduleInput,\n operationByID,\n operationInputSchema,\n operationLabel,\n scheduleToInput,\n} from \"./operation-schedule-model\";\nimport { operationCLICommand } from \"./operation-cli-command\";\nimport type {\n OperationSchedule,\n OperationScheduleCLI,\n OperationScheduleInput,\n OperationScheduleRunInput,\n} from \"./operation-schedule-types\";\nimport type { ResolvedOperation } from \"./types\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationPicker } from \"./OperationPicker\";\n\nexport interface OperationScheduleDialogProps {\n open: boolean;\n operations: readonly ResolvedOperation[];\n schedule?: OperationSchedule;\n cli?: OperationScheduleCLI;\n onClose: () => void;\n onSave: (input: OperationScheduleInput) => Promise<unknown>;\n onRunNow: (input: OperationScheduleRunInput) => Promise<unknown>;\n}\n\nexport function OperationScheduleDialog(_props: OperationScheduleDialogProps) {\n const { open, operations, schedule, cli, onClose, onSave, onRunNow } = _props;\n const [input, setInput] = useState<OperationScheduleInput>(\n newOperationScheduleInput,\n );\n const [pending, setPending] = useState<\"save\" | \"run\">();\n const [error, setError] = useState<unknown>();\n const [confirmingRun, setConfirmingRun] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n setInput(\n schedule ? scheduleToInput(schedule) : newOperationScheduleInput(),\n );\n setError(undefined);\n setConfirmingRun(false);\n }, [open, schedule]);\n\n const operation = operationByID(operations, input.operationId);\n const schema = operationInputSchema(operation);\n const suggestions =\n operation?.operation[\"x-clicky\"]?.schedule?.suggestions ?? [];\n const destructive =\n operation?.operation[\"x-clicky\"]?.toolHints?.destructiveHint === true;\n const cliCommand = operationCLICommand(operation, input.args, cli);\n\n const selectOperation = (operationId: string) => {\n const selected = operationByID(operations, operationId);\n setInput((current) => ({\n ...current,\n operationId,\n args: {},\n name: current.name || operationLabel(selected),\n cron:\n selected?.operation[\"x-clicky\"]?.schedule?.suggestions?.[0]?.cron ??\n current.cron,\n }));\n };\n\n const save = async () => {\n setPending(\"save\");\n setError(undefined);\n try {\n await onSave(input);\n onClose();\n } catch (nextError) {\n setError(nextError);\n } finally {\n setPending(undefined);\n }\n };\n\n const run = async () => {\n setPending(\"run\");\n setError(undefined);\n try {\n await onRunNow({ operationId: input.operationId, args: input.args });\n setConfirmingRun(false);\n onClose();\n } catch (nextError) {\n setError(nextError);\n setConfirmingRun(false);\n } finally {\n setPending(undefined);\n }\n };\n\n const canSave = Boolean(\n input.name.trim() && input.operationId && input.cron.trim(),\n );\n const canRun = Boolean(input.operationId);\n\n return (\n <>\n <Modal\n open={open}\n onClose={onClose}\n title={schedule ? \"Edit schedule\" : \"Add schedule\"}\n size=\"xl\"\n footer={\n <div className=\"flex w-full flex-wrap justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"secondary\"}\n disabled={!canRun}\n loading={pending === \"run\"}\n onClick={() => setConfirmingRun(true)}\n >\n Run now\n </Button>\n <Button\n type=\"button\"\n disabled={!canSave}\n loading={pending === \"save\"}\n onClick={save}\n >\n Save schedule\n </Button>\n </div>\n }\n >\n <div className=\"space-y-5\">\n <Field\n label=\"Schedule name\"\n htmlFor=\"operation-schedule-name\"\n required\n >\n <InputField\n id=\"operation-schedule-name\"\n value={input.name}\n onChange={(name) => setInput({ ...input, name })}\n />\n </Field>\n <OperationPicker\n id=\"operation-schedule-operation\"\n operations={operations}\n value={input.operationId}\n onChange={selectOperation}\n />\n {operation ? (\n schema && Object.keys(schema.properties ?? {}).length > 0 ? (\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Arguments</h3>\n <JsonSchemaForm\n schema={schema}\n value={input.args}\n onChange={(args) => setInput({ ...input, args })}\n idPrefix=\"operation-schedule-args\"\n showPreferencesMenu={false}\n />\n </section>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n This operation has no arguments.\n </p>\n )\n ) : null}\n {cliCommand ? (\n <section className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold\">Equivalent CLI command</h3>\n <div className=\"flex items-center gap-2 rounded-md border bg-muted/30 px-3 py-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto whitespace-nowrap text-xs\">\n {cliCommand}\n </code>\n <CopyButton value={cliCommand} label=\"Copy CLI command\" />\n </div>\n </section>\n ) : null}\n <ScheduleEditor\n id=\"operation-schedule\"\n value={input}\n onChange={(timing) => setInput({ ...input, ...timing })}\n cronSuggestions={suggestions}\n timezoneSuggestions={[input.timezone, \"UTC\"]}\n />\n {error ? (\n <InlineError title=\"Schedule action failed\" error={error} />\n ) : null}\n </div>\n </Modal>\n <Modal\n open={confirmingRun}\n onClose={() => setConfirmingRun(false)}\n title={`Run ${operationLabel(operation)} now?`}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmingRun(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"default\"}\n loading={pending === \"run\"}\n onClick={run}\n >\n Run now\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n This runs the configured operation once without creating or changing a\n recurring schedule.\n </p>\n </Modal>\n </>\n );\n}\n"],"names":["useState","newOperationScheduleInput","useEffect","scheduleToInput","operationByID","operationInputSchema","operationCLICommand","operationLabel","_d","_c","_b","_a","jsxs","Fragment","jsx","Modal","Button","Field","InputField","OperationPicker","JsonSchemaForm","CopyButton","ScheduleEditor","InlineError"],"mappings":"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"}
1
+ {"version":3,"file":"OperationScheduleDialog.cjs","sources":["../../src/rpc/OperationScheduleDialog.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Combobox } from \"../components/Combobox\";\nimport type { ComboboxOption } from \"../components/combobox-types\";\nimport { CopyButton } from \"../components/CopyButton\";\nimport { Field } from \"../components/Field\";\nimport { InputField } from \"../components/InputField\";\nimport { ScheduleEditor } from \"../components/ScheduleEditor\";\nimport { Modal } from \"../overlay/Modal\";\nimport {\n newOperationScheduleInput,\n operationByID,\n operationLabel,\n scheduleToInput,\n} from \"./operation-schedule-model\";\nimport { operationCLICommand } from \"./operation-cli-command\";\nimport type {\n OperationSchedule,\n OperationScheduleCLI,\n OperationScheduleInput,\n OperationScheduleRunInput,\n} from \"./operation-schedule-types\";\nimport type { ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationArgsForm } from \"./OperationArgsForm\";\nimport { OperationPicker } from \"./OperationPicker\";\n\nexport interface OperationScheduleDialogProps {\n /** Client for the argument form's lookups (the operation's parameter pickers). */\n client: OperationsApiClient;\n open: boolean;\n operations: readonly ResolvedOperation[];\n targetOptions: ComboboxOption[];\n defaultTargets?: string[];\n targetLabel?: string;\n schedule?: OperationSchedule;\n cli?: OperationScheduleCLI;\n onClose: () => void;\n onSave: (input: OperationScheduleInput) => Promise<unknown>;\n onRunNow: (input: OperationScheduleRunInput) => Promise<unknown>;\n}\n\nexport function OperationScheduleDialog(_props: OperationScheduleDialogProps) {\n const {\n client,\n open,\n operations,\n schedule,\n cli,\n targetOptions,\n defaultTargets,\n targetLabel = \"Targets\",\n onClose,\n onSave,\n onRunNow,\n } = _props;\n const [input, setInput] = useState<OperationScheduleInput>(\n newOperationScheduleInput,\n );\n const [pending, setPending] = useState<\"save\" | \"run\">();\n const [error, setError] = useState<unknown>();\n const [confirmingRun, setConfirmingRun] = useState(false);\n const [concurrencyText, setConcurrencyText] = useState(\"1\");\n const [argsValid, setArgsValid] = useState(true);\n // Each opening remounts the argument form so it loads the args set below,\n // not the ones a previous opening left in input.\n const [argsSession, setArgsSession] = useState(0);\n\n useEffect(() => {\n if (!open) return;\n setArgsSession((session) => session + 1);\n setInput(\n schedule\n ? scheduleToInput(schedule)\n : {\n ...newOperationScheduleInput(),\n targets: [...(defaultTargets ?? [])],\n },\n );\n setConcurrencyText(String(schedule?.concurrency ?? 1));\n setError(undefined);\n setConfirmingRun(false);\n }, [open, schedule, defaultTargets]);\n\n const multiTarget = input.targets.length > 1;\n const concurrency = Number(concurrencyText);\n const concurrencyValid =\n !multiTarget ||\n (concurrencyText.trim() !== \"\" &&\n Number.isInteger(concurrency) &&\n concurrency >= 1 &&\n concurrency <= input.targets.length);\n const concurrencyPayload = multiTarget ? { concurrency } : {};\n\n const changeTargets = (targets: string[]) => {\n setInput({ ...input, targets });\n const limit = Math.max(1, targets.length);\n setConcurrencyText((current) =>\n Number(current) > limit ? String(limit) : current,\n );\n };\n\n const operation = operationByID(operations, input.operationId);\n const suggestions =\n operation?.operation[\"x-clicky\"]?.schedule?.suggestions ?? [];\n const destructive =\n operation?.operation[\"x-clicky\"]?.toolHints?.destructiveHint === true;\n const cliCommand = cli?.targetFlag\n ? input.targets\n .map((target) =>\n operationCLICommand(operation, input.args, {\n ...cli,\n globalFlags: { ...cli.globalFlags, [cli.targetFlag!]: target },\n }),\n )\n .join(\"\\n\")\n : operationCLICommand(operation, input.args, cli);\n\n const selectOperation = (operationId: string) => {\n const selected = operationByID(operations, operationId);\n setInput((current) => ({\n ...current,\n operationId,\n args: {},\n name: current.name || operationLabel(selected),\n cron:\n selected?.operation[\"x-clicky\"]?.schedule?.suggestions?.[0]?.cron ??\n current.cron,\n }));\n };\n\n const save = async () => {\n setPending(\"save\");\n setError(undefined);\n try {\n await onSave({ ...input, ...concurrencyPayload });\n onClose();\n } catch (nextError) {\n setError(nextError);\n } finally {\n setPending(undefined);\n }\n };\n\n const run = async () => {\n setPending(\"run\");\n setError(undefined);\n try {\n await onRunNow({\n operationId: input.operationId,\n args: input.args,\n targets: input.targets,\n ...concurrencyPayload,\n });\n setConfirmingRun(false);\n onClose();\n } catch (nextError) {\n setError(nextError);\n setConfirmingRun(false);\n } finally {\n setPending(undefined);\n }\n };\n\n const canSave = Boolean(\n input.name.trim() &&\n input.operationId &&\n input.cron.trim() &&\n input.targets.length &&\n concurrencyValid &&\n argsValid,\n );\n const canRun = Boolean(\n input.operationId && input.targets.length && concurrencyValid && argsValid,\n );\n\n return (\n <>\n <Modal\n open={open}\n onClose={onClose}\n title={schedule ? \"Edit schedule\" : \"Add schedule\"}\n size=\"xl\"\n footer={\n <div className=\"flex w-full flex-wrap justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"secondary\"}\n disabled={!canRun}\n loading={pending === \"run\"}\n onClick={() => setConfirmingRun(true)}\n >\n Run now\n </Button>\n <Button\n type=\"button\"\n disabled={!canSave}\n loading={pending === \"save\"}\n onClick={save}\n >\n Save schedule\n </Button>\n </div>\n }\n >\n <div className=\"space-y-5\">\n <Field\n label={targetLabel}\n htmlFor=\"operation-schedule-targets\"\n required\n >\n <Combobox\n id=\"operation-schedule-targets\"\n multiple\n variant=\"tags\"\n ariaLabel={targetLabel}\n ariaRequired\n allowCustomValue={false}\n options={targetOptions}\n value={input.targets}\n onChange={changeTargets}\n />\n </Field>\n {multiTarget ? (\n <Field\n label={`${targetLabel} at once`}\n htmlFor=\"operation-schedule-concurrency\"\n error={\n concurrencyValid\n ? undefined\n : `Enter a whole number from 1 to ${input.targets.length}.`\n }\n helper={`How many of the ${input.targets.length} selected run at the same time; the rest wait their turn.`}\n >\n <InputField\n id=\"operation-schedule-concurrency\"\n type=\"number\"\n inputMode=\"numeric\"\n min={1}\n max={input.targets.length}\n step={1}\n invalid={!concurrencyValid}\n value={concurrencyText}\n onChange={setConcurrencyText}\n />\n </Field>\n ) : null}\n <Field\n label=\"Schedule name\"\n htmlFor=\"operation-schedule-name\"\n required\n >\n <InputField\n id=\"operation-schedule-name\"\n value={input.name}\n onChange={(name) => setInput({ ...input, name })}\n />\n </Field>\n <OperationPicker\n id=\"operation-schedule-operation\"\n operations={operations}\n value={input.operationId}\n onChange={selectOperation}\n />\n {operation ? (\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Arguments</h3>\n <OperationArgsForm\n key={`${argsSession}:${input.operationId}`}\n client={client}\n operation={operation}\n args={input.args}\n onChange={(args) =>\n setInput((current) => ({ ...current, args }))\n }\n onValidityChange={setArgsValid}\n />\n </section>\n ) : null}\n {cliCommand ? (\n <section className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold\">Equivalent CLI command</h3>\n <div className=\"flex items-center gap-2 rounded-md border bg-muted/30 px-3 py-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto whitespace-pre text-xs\">\n {cliCommand}\n </code>\n <CopyButton value={cliCommand} label=\"Copy CLI command\" />\n </div>\n </section>\n ) : null}\n <ScheduleEditor\n id=\"operation-schedule\"\n value={input}\n onChange={(timing) => setInput({ ...input, ...timing })}\n cronSuggestions={suggestions}\n timezoneSuggestions={[input.timezone, \"UTC\"]}\n />\n {error ? (\n <InlineError title=\"Schedule action failed\" error={error} />\n ) : null}\n </div>\n </Modal>\n <Modal\n open={confirmingRun}\n onClose={() => setConfirmingRun(false)}\n title={`Run ${operationLabel(operation)} now?`}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmingRun(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"default\"}\n loading={pending === \"run\"}\n onClick={run}\n >\n Run now\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n This runs the configured operation once without creating or changing a\n recurring schedule.\n </p>\n <p className=\"mt-2 text-sm\">\n {targetLabel}: {input.targets.join(\", \")}\n {multiTarget ? ` (${concurrency} at once)` : \"\"}\n </p>\n </Modal>\n </>\n );\n}\n"],"names":["useState","newOperationScheduleInput","useEffect","scheduleToInput","operationByID","operationCLICommand","operationLabel","_d","_c","_b","_a","jsxs","Fragment","jsx","Modal","Button","Field","Combobox","InputField","OperationPicker","OperationArgsForm","CopyButton","ScheduleEditor","InlineError"],"mappings":"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"}
@@ -1,8 +1,15 @@
1
+ import { ComboboxOption } from '../components/combobox-types.js';
1
2
  import { OperationSchedule, OperationScheduleCLI, OperationScheduleInput, OperationScheduleRunInput } from './operation-schedule-types.js';
2
3
  import { ResolvedOperation } from './types.js';
4
+ import { OperationsApiClient } from './useOperations.js';
3
5
  export interface OperationScheduleDialogProps {
6
+ /** Client for the argument form's lookups (the operation's parameter pickers). */
7
+ client: OperationsApiClient;
4
8
  open: boolean;
5
9
  operations: readonly ResolvedOperation[];
10
+ targetOptions: ComboboxOption[];
11
+ defaultTargets?: string[];
12
+ targetLabel?: string;
6
13
  schedule?: OperationSchedule;
7
14
  cli?: OperationScheduleCLI;
8
15
  onClose: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"OperationScheduleDialog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationScheduleDialog.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAIjD,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACzC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,QAAQ,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,4BAA4B,+BAmM3E"}
1
+ {"version":3,"file":"OperationScheduleDialog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationScheduleDialog.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAanE,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAK3D,MAAM,WAAW,4BAA4B;IAC3C,kFAAkF;IAClF,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACzC,aAAa,EAAE,cAAc,EAAE,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,QAAQ,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,4BAA4B,+BA2S3E"}