@flanksource/clicky-ui 0.2.19 → 0.2.21

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 (423) hide show
  1. package/dist/ai.cjs +26 -0
  2. package/dist/ai.cjs.map +1 -0
  3. package/dist/ai.d.ts +2 -0
  4. package/dist/ai.d.ts.map +1 -0
  5. package/dist/ai.js +26 -0
  6. package/dist/ai.js.map +1 -0
  7. package/dist/chat.cjs +7 -0
  8. package/dist/chat.cjs.map +1 -1
  9. package/dist/chat.js +7 -0
  10. package/dist/chat.js.map +1 -1
  11. package/dist/components/FilterBar.cjs +49 -18
  12. package/dist/components/FilterBar.cjs.map +1 -1
  13. package/dist/components/FilterBar.d.ts +0 -2
  14. package/dist/components/FilterBar.d.ts.map +1 -1
  15. package/dist/components/FilterBar.js +50 -19
  16. package/dist/components/FilterBar.js.map +1 -1
  17. package/dist/components/SearchInput.cjs +63 -0
  18. package/dist/components/SearchInput.cjs.map +1 -0
  19. package/dist/components/SearchInput.d.ts +31 -0
  20. package/dist/components/SearchInput.d.ts.map +1 -0
  21. package/dist/components/SearchInput.js +63 -0
  22. package/dist/components/SearchInput.js.map +1 -0
  23. package/dist/components/SegmentedControl.cjs +88 -0
  24. package/dist/components/SegmentedControl.cjs.map +1 -0
  25. package/dist/components/SegmentedControl.d.ts +38 -0
  26. package/dist/components/SegmentedControl.d.ts.map +1 -0
  27. package/dist/components/SegmentedControl.js +88 -0
  28. package/dist/components/SegmentedControl.js.map +1 -0
  29. package/dist/components/Switch.cjs +51 -0
  30. package/dist/components/Switch.cjs.map +1 -0
  31. package/dist/components/Switch.d.ts +23 -0
  32. package/dist/components/Switch.d.ts.map +1 -0
  33. package/dist/components/Switch.js +51 -0
  34. package/dist/components/Switch.js.map +1 -0
  35. package/dist/components/TimeRange.cjs +53 -45
  36. package/dist/components/TimeRange.cjs.map +1 -1
  37. package/dist/components/TimeRange.d.ts.map +1 -1
  38. package/dist/components/TimeRange.js +53 -45
  39. package/dist/components/TimeRange.js.map +1 -1
  40. package/dist/components/TreePickerField.cjs +5 -1
  41. package/dist/components/TreePickerField.cjs.map +1 -1
  42. package/dist/components/TreePickerField.d.ts.map +1 -1
  43. package/dist/components/TreePickerField.js +5 -1
  44. package/dist/components/TreePickerField.js.map +1 -1
  45. package/dist/components/filter-bar-utils.cjs +5 -0
  46. package/dist/components/filter-bar-utils.cjs.map +1 -1
  47. package/dist/components/filter-bar-utils.d.ts +2 -0
  48. package/dist/components/filter-bar-utils.d.ts.map +1 -1
  49. package/dist/components/filter-bar-utils.js +5 -0
  50. package/dist/components/filter-bar-utils.js.map +1 -1
  51. package/dist/components/json-schema-form-fields.cjs +8 -2
  52. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  53. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  54. package/dist/components/json-schema-form-fields.js +8 -2
  55. package/dist/components/json-schema-form-fields.js.map +1 -1
  56. package/dist/components/json-schema-form-resolve.cjs +1 -1
  57. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  58. package/dist/components/json-schema-form-resolve.js +1 -1
  59. package/dist/components/json-schema-form-resolve.js.map +1 -1
  60. package/dist/components.cjs +15 -1
  61. package/dist/components.cjs.map +1 -1
  62. package/dist/components.d.ts +8 -1
  63. package/dist/components.d.ts.map +1 -1
  64. package/dist/components.js +15 -1
  65. package/dist/components.js.map +1 -1
  66. package/dist/data/Clicky.cjs +33 -44
  67. package/dist/data/Clicky.cjs.map +1 -1
  68. package/dist/data/Clicky.d.ts +0 -9
  69. package/dist/data/Clicky.d.ts.map +1 -1
  70. package/dist/data/Clicky.js +31 -42
  71. package/dist/data/Clicky.js.map +1 -1
  72. package/dist/data/DataTable.cjs +73 -50
  73. package/dist/data/DataTable.cjs.map +1 -1
  74. package/dist/data/DataTable.d.ts +4 -0
  75. package/dist/data/DataTable.d.ts.map +1 -1
  76. package/dist/data/DataTable.js +73 -50
  77. package/dist/data/DataTable.js.map +1 -1
  78. package/dist/data/Icon.cjs +2 -5
  79. package/dist/data/Icon.cjs.map +1 -1
  80. package/dist/data/Icon.d.ts +1 -21
  81. package/dist/data/Icon.d.ts.map +1 -1
  82. package/dist/data/Icon.js +3 -6
  83. package/dist/data/Icon.js.map +1 -1
  84. package/dist/data/MatrixTable.cjs +4 -4
  85. package/dist/data/MatrixTable.cjs.map +1 -1
  86. package/dist/data/MatrixTable.js +4 -4
  87. package/dist/data/MatrixTable.js.map +1 -1
  88. package/dist/data/RadialGauge.cjs +76 -0
  89. package/dist/data/RadialGauge.cjs.map +1 -0
  90. package/dist/data/RadialGauge.d.ts +24 -0
  91. package/dist/data/RadialGauge.d.ts.map +1 -0
  92. package/dist/data/RadialGauge.js +76 -0
  93. package/dist/data/RadialGauge.js.map +1 -0
  94. package/dist/data/StatusBreakdown.cjs +0 -4
  95. package/dist/data/StatusBreakdown.cjs.map +1 -1
  96. package/dist/data/StatusBreakdown.d.ts +0 -2
  97. package/dist/data/StatusBreakdown.d.ts.map +1 -1
  98. package/dist/data/StatusBreakdown.js +1 -5
  99. package/dist/data/StatusBreakdown.js.map +1 -1
  100. package/dist/data/Timeline.cjs +61 -0
  101. package/dist/data/Timeline.cjs.map +1 -0
  102. package/dist/data/Timeline.d.ts +36 -0
  103. package/dist/data/Timeline.d.ts.map +1 -0
  104. package/dist/data/Timeline.js +61 -0
  105. package/dist/data/Timeline.js.map +1 -0
  106. package/dist/data/TimeseriesCoreBars.cjs +2 -25
  107. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  108. package/dist/data/TimeseriesCoreBars.d.ts +0 -19
  109. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  110. package/dist/data/TimeseriesCoreBars.js +2 -25
  111. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  112. package/dist/data/TimeseriesCoreBars.model.cjs +27 -0
  113. package/dist/data/TimeseriesCoreBars.model.cjs.map +1 -0
  114. package/dist/data/TimeseriesCoreBars.model.d.ts +20 -0
  115. package/dist/data/TimeseriesCoreBars.model.d.ts.map +1 -0
  116. package/dist/data/TimeseriesCoreBars.model.js +27 -0
  117. package/dist/data/TimeseriesCoreBars.model.js.map +1 -0
  118. package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
  119. package/dist/data/TimeseriesPanel.axes.d.ts +1 -1
  120. package/dist/data/TimeseriesPanel.axes.d.ts.map +1 -1
  121. package/dist/data/TimeseriesPanel.axes.js.map +1 -1
  122. package/dist/data/TimeseriesPanel.cjs +4 -54
  123. package/dist/data/TimeseriesPanel.cjs.map +1 -1
  124. package/dist/data/TimeseriesPanel.d.ts +2 -138
  125. package/dist/data/TimeseriesPanel.d.ts.map +1 -1
  126. package/dist/data/TimeseriesPanel.js +2 -52
  127. package/dist/data/TimeseriesPanel.js.map +1 -1
  128. package/dist/data/TimeseriesPanel.model.cjs +53 -0
  129. package/dist/data/TimeseriesPanel.model.cjs.map +1 -0
  130. package/dist/data/TimeseriesPanel.model.d.ts +88 -0
  131. package/dist/data/TimeseriesPanel.model.d.ts.map +1 -0
  132. package/dist/data/TimeseriesPanel.model.js +53 -0
  133. package/dist/data/TimeseriesPanel.model.js.map +1 -0
  134. package/dist/data/Tree.cjs +1 -1
  135. package/dist/data/Tree.cjs.map +1 -1
  136. package/dist/data/Tree.js +1 -1
  137. package/dist/data/Tree.js.map +1 -1
  138. package/dist/data/ai/ChatFab.cjs +29 -0
  139. package/dist/data/ai/ChatFab.cjs.map +1 -0
  140. package/dist/data/ai/ChatFab.d.ts +12 -0
  141. package/dist/data/ai/ChatFab.d.ts.map +1 -0
  142. package/dist/data/ai/ChatFab.js +29 -0
  143. package/dist/data/ai/ChatFab.js.map +1 -0
  144. package/dist/data/ai/ChatWindow.cjs +178 -0
  145. package/dist/data/ai/ChatWindow.cjs.map +1 -0
  146. package/dist/data/ai/ChatWindow.d.ts +38 -0
  147. package/dist/data/ai/ChatWindow.d.ts.map +1 -0
  148. package/dist/data/ai/ChatWindow.js +156 -0
  149. package/dist/data/ai/ChatWindow.js.map +1 -0
  150. package/dist/data/ai/ChatWindowManager.cjs +139 -0
  151. package/dist/data/ai/ChatWindowManager.cjs.map +1 -0
  152. package/dist/data/ai/ChatWindowManager.d.ts +12 -0
  153. package/dist/data/ai/ChatWindowManager.d.ts.map +1 -0
  154. package/dist/data/ai/ChatWindowManager.js +139 -0
  155. package/dist/data/ai/ChatWindowManager.js.map +1 -0
  156. package/dist/data/ai/ContextBadges.cjs +74 -0
  157. package/dist/data/ai/ContextBadges.cjs.map +1 -0
  158. package/dist/data/ai/ContextBadges.d.ts +16 -0
  159. package/dist/data/ai/ContextBadges.d.ts.map +1 -0
  160. package/dist/data/ai/ContextBadges.js +74 -0
  161. package/dist/data/ai/ContextBadges.js.map +1 -0
  162. package/dist/data/ai/ThreadPicker.cjs +148 -0
  163. package/dist/data/ai/ThreadPicker.cjs.map +1 -0
  164. package/dist/data/ai/ThreadPicker.d.ts +37 -0
  165. package/dist/data/ai/ThreadPicker.d.ts.map +1 -0
  166. package/dist/data/ai/ThreadPicker.js +148 -0
  167. package/dist/data/ai/ThreadPicker.js.map +1 -0
  168. package/dist/data/ai/ToolPreferences.cjs +80 -0
  169. package/dist/data/ai/ToolPreferences.cjs.map +1 -0
  170. package/dist/data/ai/ToolPreferences.d.ts +19 -0
  171. package/dist/data/ai/ToolPreferences.d.ts.map +1 -0
  172. package/dist/data/ai/ToolPreferences.js +80 -0
  173. package/dist/data/ai/ToolPreferences.js.map +1 -0
  174. package/dist/data/ai/chat-window-context.cjs +78 -0
  175. package/dist/data/ai/chat-window-context.cjs.map +1 -0
  176. package/dist/data/ai/chat-window-context.d.ts +57 -0
  177. package/dist/data/ai/chat-window-context.d.ts.map +1 -0
  178. package/dist/data/ai/chat-window-context.js +78 -0
  179. package/dist/data/ai/chat-window-context.js.map +1 -0
  180. package/dist/data/ai/context.cjs +43 -0
  181. package/dist/data/ai/context.cjs.map +1 -0
  182. package/dist/data/ai/context.d.ts +35 -0
  183. package/dist/data/ai/context.d.ts.map +1 -0
  184. package/dist/data/ai/context.js +43 -0
  185. package/dist/data/ai/context.js.map +1 -0
  186. package/dist/data/ai/index.d.ts +10 -0
  187. package/dist/data/ai/index.d.ts.map +1 -0
  188. package/dist/data/cache-browser/CacheDetailPanel.cjs +15 -0
  189. package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -1
  190. package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -1
  191. package/dist/data/cache-browser/CacheDetailPanel.js +15 -0
  192. package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -1
  193. package/dist/data/cache-browser/cache-browser.fixtures.d.ts +10 -0
  194. package/dist/data/cache-browser/cache-browser.fixtures.d.ts.map +1 -0
  195. package/dist/data/cache-browser/download.cjs +13 -0
  196. package/dist/data/cache-browser/download.cjs.map +1 -0
  197. package/dist/data/cache-browser/download.d.ts +3 -0
  198. package/dist/data/cache-browser/download.d.ts.map +1 -0
  199. package/dist/data/cache-browser/download.js +13 -0
  200. package/dist/data/cache-browser/download.js.map +1 -0
  201. package/dist/data/chat/Chat.cjs +44 -3
  202. package/dist/data/chat/Chat.cjs.map +1 -1
  203. package/dist/data/chat/Chat.d.ts +5 -2
  204. package/dist/data/chat/Chat.d.ts.map +1 -1
  205. package/dist/data/chat/Chat.fixtures.cjs +86 -0
  206. package/dist/data/chat/Chat.fixtures.cjs.map +1 -0
  207. package/dist/data/chat/Chat.fixtures.d.ts +4 -0
  208. package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
  209. package/dist/data/chat/Chat.fixtures.js +86 -0
  210. package/dist/data/chat/Chat.fixtures.js.map +1 -0
  211. package/dist/data/chat/Chat.js +45 -4
  212. package/dist/data/chat/Chat.js.map +1 -1
  213. package/dist/data/chat/ContextUsage.cjs +99 -0
  214. package/dist/data/chat/ContextUsage.cjs.map +1 -0
  215. package/dist/data/chat/ContextUsage.d.ts +19 -0
  216. package/dist/data/chat/ContextUsage.d.ts.map +1 -0
  217. package/dist/data/chat/ContextUsage.js +99 -0
  218. package/dist/data/chat/ContextUsage.js.map +1 -0
  219. package/dist/data/chat/Conversation.cjs +47 -2
  220. package/dist/data/chat/Conversation.cjs.map +1 -1
  221. package/dist/data/chat/Conversation.d.ts +8 -2
  222. package/dist/data/chat/Conversation.d.ts.map +1 -1
  223. package/dist/data/chat/Conversation.js +47 -2
  224. package/dist/data/chat/Conversation.js.map +1 -1
  225. package/dist/data/chat/ModelSelector.cjs +28 -14
  226. package/dist/data/chat/ModelSelector.cjs.map +1 -1
  227. package/dist/data/chat/ModelSelector.d.ts +5 -4
  228. package/dist/data/chat/ModelSelector.d.ts.map +1 -1
  229. package/dist/data/chat/ModelSelector.js +28 -14
  230. package/dist/data/chat/ModelSelector.js.map +1 -1
  231. package/dist/data/chat/clickyOperationsToTools.cjs +21 -1
  232. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  233. package/dist/data/chat/clickyOperationsToTools.d.ts +5 -4
  234. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  235. package/dist/data/chat/clickyOperationsToTools.js +21 -1
  236. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  237. package/dist/data/chat/index.d.ts +4 -1
  238. package/dist/data/chat/index.d.ts.map +1 -1
  239. package/dist/data/chat/provider-icons.cjs +15 -0
  240. package/dist/data/chat/provider-icons.cjs.map +1 -0
  241. package/dist/data/chat/provider-icons.d.ts +7 -0
  242. package/dist/data/chat/provider-icons.d.ts.map +1 -0
  243. package/dist/data/chat/provider-icons.js +15 -0
  244. package/dist/data/chat/provider-icons.js.map +1 -0
  245. package/dist/data/chat/types.cjs.map +1 -1
  246. package/dist/data/chat/types.d.ts +41 -9
  247. package/dist/data/chat/types.d.ts.map +1 -1
  248. package/dist/data/chat/types.js.map +1 -1
  249. package/dist/data/clicky-parse.cjs +42 -0
  250. package/dist/data/clicky-parse.cjs.map +1 -0
  251. package/dist/data/clicky-parse.d.ts +11 -0
  252. package/dist/data/clicky-parse.d.ts.map +1 -0
  253. package/dist/data/clicky-parse.js +42 -0
  254. package/dist/data/clicky-parse.js.map +1 -0
  255. package/dist/data/diagnostics/FrameSourceWindow.cjs +0 -4
  256. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  257. package/dist/data/diagnostics/FrameSourceWindow.d.ts +1 -11
  258. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  259. package/dist/data/diagnostics/FrameSourceWindow.js +1 -5
  260. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  261. package/dist/data/diagnostics/FrameSourceWindow.utils.cjs +7 -0
  262. package/dist/data/diagnostics/FrameSourceWindow.utils.cjs.map +1 -0
  263. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts +12 -0
  264. package/dist/data/diagnostics/FrameSourceWindow.utils.d.ts.map +1 -0
  265. package/dist/data/diagnostics/FrameSourceWindow.utils.js +7 -0
  266. package/dist/data/diagnostics/FrameSourceWindow.utils.js.map +1 -0
  267. package/dist/data/diagnostics/JvmStackTrace.cjs +2 -1
  268. package/dist/data/diagnostics/JvmStackTrace.cjs.map +1 -1
  269. package/dist/data/diagnostics/JvmStackTrace.d.ts.map +1 -1
  270. package/dist/data/diagnostics/JvmStackTrace.js +2 -1
  271. package/dist/data/diagnostics/JvmStackTrace.js.map +1 -1
  272. package/dist/data/icon-fallback.cjs +12 -0
  273. package/dist/data/icon-fallback.cjs.map +1 -0
  274. package/dist/data/icon-fallback.d.ts +19 -0
  275. package/dist/data/icon-fallback.d.ts.map +1 -0
  276. package/dist/data/icon-fallback.js +12 -0
  277. package/dist/data/icon-fallback.js.map +1 -0
  278. package/dist/data/status-breakdown-utils.cjs +7 -0
  279. package/dist/data/status-breakdown-utils.cjs.map +1 -0
  280. package/dist/data/status-breakdown-utils.d.ts +4 -0
  281. package/dist/data/status-breakdown-utils.d.ts.map +1 -0
  282. package/dist/data/status-breakdown-utils.js +7 -0
  283. package/dist/data/status-breakdown-utils.js.map +1 -0
  284. package/dist/data/test-runner/TestRunSummary.cjs +36 -0
  285. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  286. package/dist/data/test-runner/TestRunSummary.d.ts +7 -1
  287. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  288. package/dist/data/test-runner/TestRunSummary.js +36 -0
  289. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  290. package/dist/data/test-runner/TestRunner.cjs +5 -3
  291. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  292. package/dist/data/test-runner/TestRunner.d.ts +13 -1
  293. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  294. package/dist/data/test-runner/TestRunner.js +5 -3
  295. package/dist/data/test-runner/TestRunner.js.map +1 -1
  296. package/dist/data/version-info.cjs +3 -3
  297. package/dist/data/version-info.js +3 -3
  298. package/dist/data.cjs +19 -6
  299. package/dist/data.cjs.map +1 -1
  300. package/dist/data.d.ts +13 -5
  301. package/dist/data.d.ts.map +1 -1
  302. package/dist/data.js +18 -5
  303. package/dist/data.js.map +1 -1
  304. package/dist/index.cjs +51 -7
  305. package/dist/index.cjs.map +1 -1
  306. package/dist/index.js +50 -6
  307. package/dist/index.js.map +1 -1
  308. package/dist/layout/AppShell.cjs +179 -29
  309. package/dist/layout/AppShell.cjs.map +1 -1
  310. package/dist/layout/AppShell.d.ts +5 -5
  311. package/dist/layout/AppShell.d.ts.map +1 -1
  312. package/dist/layout/AppShell.js +179 -29
  313. package/dist/layout/AppShell.js.map +1 -1
  314. package/dist/layout/AppSidebar.cjs +239 -0
  315. package/dist/layout/AppSidebar.cjs.map +1 -0
  316. package/dist/layout/AppSidebar.d.ts +62 -0
  317. package/dist/layout/AppSidebar.d.ts.map +1 -0
  318. package/dist/layout/AppSidebar.js +239 -0
  319. package/dist/layout/AppSidebar.js.map +1 -0
  320. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  321. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  322. package/dist/overlay/DropdownMenu.js.map +1 -1
  323. package/dist/overlay/Modal.cjs +4 -2
  324. package/dist/overlay/Modal.cjs.map +1 -1
  325. package/dist/overlay/Modal.d.ts +1 -1
  326. package/dist/overlay/Modal.d.ts.map +1 -1
  327. package/dist/overlay/Modal.js +4 -2
  328. package/dist/overlay/Modal.js.map +1 -1
  329. package/dist/overlay/Toast.cjs +89 -0
  330. package/dist/overlay/Toast.cjs.map +1 -0
  331. package/dist/overlay/Toast.d.ts +14 -0
  332. package/dist/overlay/Toast.d.ts.map +1 -0
  333. package/dist/overlay/Toast.js +89 -0
  334. package/dist/overlay/Toast.js.map +1 -0
  335. package/dist/overlay/toast-context.cjs +12 -0
  336. package/dist/overlay/toast-context.cjs.map +1 -0
  337. package/dist/overlay/toast-context.d.ts +24 -0
  338. package/dist/overlay/toast-context.d.ts.map +1 -0
  339. package/dist/overlay/toast-context.js +12 -0
  340. package/dist/overlay/toast-context.js.map +1 -0
  341. package/dist/rpc/AcceptPicker.cjs +81 -58
  342. package/dist/rpc/AcceptPicker.cjs.map +1 -1
  343. package/dist/rpc/AcceptPicker.d.ts.map +1 -1
  344. package/dist/rpc/AcceptPicker.js +81 -58
  345. package/dist/rpc/AcceptPicker.js.map +1 -1
  346. package/dist/rpc/CommandForm.cjs +5 -35
  347. package/dist/rpc/CommandForm.cjs.map +1 -1
  348. package/dist/rpc/CommandForm.d.ts +0 -3
  349. package/dist/rpc/CommandForm.d.ts.map +1 -1
  350. package/dist/rpc/CommandForm.js +2 -32
  351. package/dist/rpc/CommandForm.js.map +1 -1
  352. package/dist/rpc/CommandOutput.cjs +2 -1
  353. package/dist/rpc/CommandOutput.cjs.map +1 -1
  354. package/dist/rpc/CommandOutput.d.ts.map +1 -1
  355. package/dist/rpc/CommandOutput.js +2 -1
  356. package/dist/rpc/CommandOutput.js.map +1 -1
  357. package/dist/rpc/EntityExplorerApp.cjs +28 -83
  358. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  359. package/dist/rpc/EntityExplorerApp.d.ts +1 -4
  360. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  361. package/dist/rpc/EntityExplorerApp.js +13 -68
  362. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  363. package/dist/rpc/OperationCatalog.cjs +2 -2
  364. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  365. package/dist/rpc/OperationCatalog.d.ts +1 -1
  366. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  367. package/dist/rpc/OperationCatalog.js +1 -1
  368. package/dist/rpc/OperationCatalog.js.map +1 -1
  369. package/dist/rpc/OperationCommandPage.cjs +6 -4
  370. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  371. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  372. package/dist/rpc/OperationCommandPage.js +3 -1
  373. package/dist/rpc/OperationCommandPage.js.map +1 -1
  374. package/dist/rpc/RouterProvider.cjs +10 -0
  375. package/dist/rpc/RouterProvider.cjs.map +1 -0
  376. package/dist/rpc/RouterProvider.d.ts +10 -0
  377. package/dist/rpc/RouterProvider.d.ts.map +1 -0
  378. package/dist/rpc/RouterProvider.js +10 -0
  379. package/dist/rpc/RouterProvider.js.map +1 -0
  380. package/dist/rpc/apiClient.cjs +4 -4
  381. package/dist/rpc/apiClient.cjs.map +1 -1
  382. package/dist/rpc/apiClient.js +4 -4
  383. package/dist/rpc/apiClient.js.map +1 -1
  384. package/dist/rpc/command-form-utils.cjs +43 -0
  385. package/dist/rpc/command-form-utils.cjs.map +1 -0
  386. package/dist/rpc/command-form-utils.d.ts +5 -0
  387. package/dist/rpc/command-form-utils.d.ts.map +1 -0
  388. package/dist/rpc/command-form-utils.js +43 -0
  389. package/dist/rpc/command-form-utils.js.map +1 -0
  390. package/dist/rpc/commandHref.cjs +62 -0
  391. package/dist/rpc/commandHref.cjs.map +1 -0
  392. package/dist/rpc/commandHref.d.ts +7 -0
  393. package/dist/rpc/commandHref.d.ts.map +1 -0
  394. package/dist/rpc/commandHref.js +62 -0
  395. package/dist/rpc/commandHref.js.map +1 -0
  396. package/dist/rpc/formMetadata.cjs +1 -1
  397. package/dist/rpc/formMetadata.cjs.map +1 -1
  398. package/dist/rpc/formMetadata.js +1 -1
  399. package/dist/rpc/formMetadata.js.map +1 -1
  400. package/dist/rpc/router.cjs +83 -0
  401. package/dist/rpc/router.cjs.map +1 -0
  402. package/dist/rpc/router.d.ts +24 -0
  403. package/dist/rpc/router.d.ts.map +1 -0
  404. package/dist/rpc/router.js +83 -0
  405. package/dist/rpc/router.js.map +1 -0
  406. package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts +3 -0
  407. package/dist/rpc/rpc-story-fixtures/orders.fixture.d.ts.map +1 -0
  408. package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts +3 -0
  409. package/dist/rpc/rpc-story-fixtures/services.fixture.d.ts.map +1 -0
  410. package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts +24 -0
  411. package/dist/rpc/rpc-story-fixtures/surface-fixture.d.ts.map +1 -0
  412. package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts +3 -0
  413. package/dist/rpc/rpc-story-fixtures/widgets.fixture.d.ts.map +1 -0
  414. package/dist/rpc/rpc-story.fixtures.d.ts +16 -0
  415. package/dist/rpc/rpc-story.fixtures.d.ts.map +1 -0
  416. package/dist/rpc.cjs +17 -0
  417. package/dist/rpc.cjs.map +1 -1
  418. package/dist/rpc.d.ts +5 -0
  419. package/dist/rpc.d.ts.map +1 -1
  420. package/dist/rpc.js +18 -1
  421. package/dist/rpc.js.map +1 -1
  422. package/dist/styles.css +1 -1
  423. package/package.json +11 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CommandForm.js","sources":["../../src/rpc/CommandForm.tsx"],"sourcesContent":["import { useReducer, type FormEvent, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiClose } from \"../icons\";\nimport {\n isPositionalParam,\n parameterPlaceholder,\n type OpenAPIParameter,\n} from \"./types\";\n\nexport type CommandFormProps = {\n parameters: OpenAPIParameter[];\n onExecute: (params: Record<string, string>, headers: Record<string, string>) => void;\n isPending: boolean;\n method: string;\n path: string;\n accept: string;\n initialValues?: Record<string, string>;\n};\n\ntype FormState = Record<string, string>;\ntype FormAction = { name: string; value: string };\n\nfunction formReducer(state: FormState, action: FormAction): FormState {\n return { ...state, [action.name]: action.value };\n}\n\nexport function CommandForm({\n parameters,\n onExecute,\n isPending,\n method: _method,\n path,\n accept,\n initialValues,\n}: CommandFormProps) {\n const [values, dispatch] = useReducer(\n formReducer,\n { parameters, path, initialValues },\n ({ parameters: params, path: formPath, initialValues: overrides }) =>\n buildInitialState(normalizeParameters(params, formPath), formPath, overrides),\n );\n\n const formParameters = normalizeParameters(parameters, path);\n const visibleParams = formParameters.filter((p) => !(p.in === \"path\" && initialValues?.[p.name]));\n const positionalNames = new Set(formParameters.filter(isPositionalParam).map((p) => p.name));\n const inlineLayout = visibleParams.length >= INLINE_LAYOUT_THRESHOLD;\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault();\n const params: Record<string, string> = {};\n const args: string[] = [];\n for (const param of formParameters) {\n const value = submitValue(param, values[param.name]);\n if (value == null) continue;\n if (positionalNames.has(param.name)) {\n args.push(...splitArgsValue(value));\n } else {\n params[param.name] = value;\n }\n }\n if (args.length > 0) params.args = args.join(\",\");\n onExecute(params, { Accept: accept });\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {visibleParams.length > 0 && (\n <div className={inlineLayout ? \"grid gap-2\" : \"grid gap-4\"}>\n {visibleParams.map((param) => (\n <ParameterField\n key={param.name}\n param={param}\n value={values[param.name] || \"\"}\n inline={inlineLayout}\n onChange={(value) => dispatch({ name: param.name, value })}\n />\n ))}\n </div>\n )}\n\n <div\n className={\n inlineLayout\n ? \"sticky bottom-0 z-10 -mx-2 flex justify-end border-t border-border bg-background/95 px-2 py-3 backdrop-blur-sm\"\n : \"flex justify-end\"\n }\n >\n <Button type=\"submit\" disabled={isPending}>\n {isPending ? \"Executing...\" : \"Execute\"}\n </Button>\n </div>\n </form>\n );\n}\n\nconst INLINE_LAYOUT_THRESHOLD = 6;\n\nfunction ParameterField({\n param,\n value,\n inline,\n onChange,\n}: {\n param: OpenAPIParameter;\n value: string;\n inline: boolean;\n onChange: (value: string) => void;\n}) {\n const schema = param.schema;\n const fieldId = `param-${param.name}`;\n\n if (isMultiValueParam(param)) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <TagInput\n id={fieldId}\n value={value}\n placeholder={parameterPlaceholder(param) || param.name}\n onChange={onChange}\n />\n </FieldWrapper>\n );\n }\n\n if (schema?.enum) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <select\n id={fieldId}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">Select {param.name}</option>\n {schema.enum.map((v) => (\n <option key={String(v)} value={String(v)}>\n {String(v)}\n </option>\n ))}\n </select>\n </FieldWrapper>\n );\n }\n\n if (schema?.type === \"boolean\") {\n const checkbox = (\n <input\n id={fieldId}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-primary\"\n checked={value === \"true\"}\n onChange={(event) => onChange(event.target.checked ? \"true\" : \"false\")}\n />\n );\n if (inline) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline>\n <div className=\"flex h-9 items-center\">{checkbox}</div>\n </FieldWrapper>\n );\n }\n return (\n <div className=\"flex items-center gap-2\">\n {checkbox}\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n {param.description && (\n <span className=\"text-xs text-muted-foreground\">{param.description}</span>\n )}\n </div>\n );\n }\n\n if (isDateParam(param)) {\n const dateTime = schema?.format === \"date-time\";\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <div className=\"flex gap-2\">\n <input\n id={fieldId}\n type={dateTime ? \"datetime-local\" : \"date\"}\n value={dateInputValue(value, dateTime)}\n className={inputClassName}\n onChange={(event) => onChange(dateOutputValue(event.target.value, dateTime))}\n />\n {value && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`Clear ${param.name}`}\n onClick={() => onChange(\"\")}\n >\n <Icon icon={UiClose} />\n </Button>\n )}\n </div>\n </FieldWrapper>\n );\n }\n\n const inputType = schema?.type === \"integer\" || schema?.type === \"number\" ? \"number\" : \"text\";\n\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <input\n id={fieldId}\n type={inputType}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n placeholder={\n schema?.default != null\n ? String(schema.default)\n : parameterPlaceholder(param) || param.name\n }\n />\n </FieldWrapper>\n );\n}\n\nfunction TagInput({\n id,\n value,\n placeholder,\n onChange,\n}: {\n id: string;\n value: string;\n placeholder: string;\n onChange: (value: string) => void;\n}) {\n const tags = parseTags(value);\n\n function commit(raw: string, input: HTMLInputElement) {\n const next = raw\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n if (next.length === 0) return;\n onChange(serializeTags([...tags, ...next]));\n input.value = \"\";\n }\n\n function remove(index: number) {\n onChange(serializeTags(tags.filter((_, i) => i !== index)));\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n const input = event.currentTarget;\n if (event.key === \"Enter\" || event.key === \",\") {\n event.preventDefault();\n commit(input.value, input);\n return;\n }\n if (event.key === \"Backspace\" && input.value === \"\" && tags.length > 0) {\n remove(tags.length - 1);\n }\n }\n\n return (\n <div className=\"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\">\n {tags.map((tag, index) => (\n <span\n key={`${tag}-${index}`}\n className=\"inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-muted px-2 text-xs\"\n >\n <span className=\"truncate\">{tag}</span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={`Remove ${tag}`}\n onClick={() => remove(index)}\n >\n <Icon icon={UiClose} />\n </button>\n </span>\n ))}\n <input\n id={id}\n className=\"min-w-32 flex-1 bg-transparent px-1 py-1 text-sm outline-none\"\n placeholder={tags.length === 0 ? placeholder : \"\"}\n onKeyDown={handleKeyDown}\n onBlur={(event) => commit(event.currentTarget.value, event.currentTarget)}\n />\n </div>\n );\n}\n\nfunction FieldWrapper({\n param,\n fieldId,\n inline,\n children,\n}: {\n param: OpenAPIParameter;\n fieldId: string;\n inline?: boolean;\n children: ReactNode;\n}) {\n const label = (\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n );\n\n if (inline) {\n return (\n <div className=\"grid grid-cols-[10rem_1fr] items-start gap-x-3 gap-y-0.5\">\n <div className=\"flex h-9 items-center\">{label}</div>\n <div className=\"min-w-0\">{children}</div>\n {param.description && (\n <p className=\"col-start-2 text-xs text-muted-foreground\">{param.description}</p>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-1.5\">\n {label}\n {children}\n {param.description && <p className=\"text-xs text-muted-foreground\">{param.description}</p>}\n </div>\n );\n}\n\nexport function normalizeParameters(\n parameters: OpenAPIParameter[],\n path: string,\n): OpenAPIParameter[] {\n const pathParams = pathParamNames(path);\n const firstPathParam = pathParams[0];\n const seen = new Set(parameters.map((param) => param.name));\n const normalized = parameters.filter(\n (param) => !(param.name === \"args\" && firstPathParam != null && !seen.has(firstPathParam)),\n );\n for (const name of pathParams) {\n if (seen.has(name)) continue;\n normalized.unshift({\n name,\n in: \"path\",\n required: true,\n description: \"Path parameter\",\n schema: { type: \"string\" },\n });\n }\n return normalized;\n}\n\nexport function pathParamNames(path: string): string[] {\n return [...path.matchAll(/\\{([^}]+)\\}/g)]\n .map((match) => match[1])\n .filter((name): name is string => Boolean(name));\n}\n\nfunction buildInitialState(\n parameters: OpenAPIParameter[],\n path: string,\n overrides?: Record<string, string>,\n): FormState {\n const state: FormState = {};\n for (const p of parameters) {\n state[p.name] = initialParamValue(p, overrides?.[p.name]);\n }\n for (const name of pathParamNames(path)) {\n if (state[name] == null) {\n state[name] = overrides?.[name] ?? \"\";\n }\n }\n return state;\n}\n\nfunction initialParamValue(param: OpenAPIParameter, override: string | undefined): string {\n if (override != null) return sanitizeInitialValue(param, override);\n const value = param.schema?.default;\n if (value == null) return \"\";\n return sanitizeInitialValue(param, String(value));\n}\n\nfunction sanitizeInitialValue(param: OpenAPIParameter, value: string): string {\n const trimmed = value.trim();\n if (trimmed === \"[]\" || trimmed === \"null\") return \"\";\n if (isDateParam(param) && isZeroDate(trimmed)) return \"\";\n return value;\n}\n\nexport function submitValue(param: OpenAPIParameter, value: string | undefined): string | null {\n const trimmed = (value ?? \"\").trim();\n if (!trimmed || trimmed === \"[]\" || trimmed === \"null\") return null;\n if (isDateParam(param) && isZeroDate(trimmed)) return null;\n return trimmed;\n}\n\nfunction splitArgsValue(value: string): string[] {\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Use comma splitting below.\n }\n return value\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction isMultiValueParam(param: OpenAPIParameter): boolean {\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return (\n param.schema?.type === \"array\" ||\n String(param.schema?.default ?? \"\") === \"[]\" ||\n text.includes(\"repeatable\")\n );\n}\n\nfunction parseTags(value: string): string[] {\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited tags below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction serializeTags(tags: string[]): string {\n return tags.join(\",\");\n}\n\nfunction isDateParam(param: OpenAPIParameter): boolean {\n const format = param.schema?.format?.toLowerCase();\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return format === \"date\" || format === \"date-time\" || text.includes(\"date\");\n}\n\nfunction isZeroDate(value: string): boolean {\n return value.startsWith(\"0001-01-01\") || value === \"0001-01-01\";\n}\n\nfunction dateInputValue(value: string, dateTime: boolean): string {\n if (!value || value.startsWith(\"0001-01-01\")) return \"\";\n if (!dateTime) return value.slice(0, 10);\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value.slice(0, 16);\n const offset = parsed.getTimezoneOffset() * 60_000;\n return new Date(parsed.getTime() - offset).toISOString().slice(0, 16);\n}\n\nfunction dateOutputValue(value: string, dateTime: boolean): string {\n if (!value) return \"\";\n if (!dateTime) return value;\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value;\n return parsed.toISOString();\n}\n\nconst inputClassName =\n \"h-9 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring\";\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CommandForm.js","sources":["../../src/rpc/CommandForm.tsx"],"sourcesContent":["import { useReducer, type FormEvent, type KeyboardEvent, type ReactNode } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiClose } from \"../icons\";\nimport {\n isPositionalParam,\n parameterPlaceholder,\n type OpenAPIParameter,\n} from \"./types\";\nimport { normalizeParameters, pathParamNames, submitValue } from \"./command-form-utils\";\n\nexport type CommandFormProps = {\n parameters: OpenAPIParameter[];\n onExecute: (params: Record<string, string>, headers: Record<string, string>) => void;\n isPending: boolean;\n method: string;\n path: string;\n accept: string;\n initialValues?: Record<string, string>;\n};\n\ntype FormState = Record<string, string>;\ntype FormAction = { name: string; value: string };\n\nfunction formReducer(state: FormState, action: FormAction): FormState {\n return { ...state, [action.name]: action.value };\n}\n\nexport function CommandForm({\n parameters,\n onExecute,\n isPending,\n method: _method,\n path,\n accept,\n initialValues,\n}: CommandFormProps) {\n const [values, dispatch] = useReducer(\n formReducer,\n { parameters, path, initialValues },\n ({ parameters: params, path: formPath, initialValues: overrides }) =>\n buildInitialState(normalizeParameters(params, formPath), formPath, overrides),\n );\n\n const formParameters = normalizeParameters(parameters, path);\n const visibleParams = formParameters.filter((p) => !(p.in === \"path\" && initialValues?.[p.name]));\n const positionalNames = new Set(formParameters.filter(isPositionalParam).map((p) => p.name));\n const inlineLayout = visibleParams.length >= INLINE_LAYOUT_THRESHOLD;\n\n function handleSubmit(event: FormEvent) {\n event.preventDefault();\n const params: Record<string, string> = {};\n const args: string[] = [];\n for (const param of formParameters) {\n const value = submitValue(param, values[param.name]);\n if (value == null) continue;\n if (positionalNames.has(param.name)) {\n args.push(...splitArgsValue(value));\n } else {\n params[param.name] = value;\n }\n }\n if (args.length > 0) params.args = args.join(\",\");\n onExecute(params, { Accept: accept });\n }\n\n return (\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {visibleParams.length > 0 && (\n <div className={inlineLayout ? \"grid gap-2\" : \"grid gap-4\"}>\n {visibleParams.map((param) => (\n <ParameterField\n key={param.name}\n param={param}\n value={values[param.name] || \"\"}\n inline={inlineLayout}\n onChange={(value) => dispatch({ name: param.name, value })}\n />\n ))}\n </div>\n )}\n\n <div\n className={\n inlineLayout\n ? \"sticky bottom-0 z-10 -mx-2 flex justify-end border-t border-border bg-background/95 px-2 py-3 backdrop-blur-sm\"\n : \"flex justify-end\"\n }\n >\n <Button type=\"submit\" disabled={isPending}>\n {isPending ? \"Executing...\" : \"Execute\"}\n </Button>\n </div>\n </form>\n );\n}\n\nconst INLINE_LAYOUT_THRESHOLD = 6;\n\nfunction ParameterField({\n param,\n value,\n inline,\n onChange,\n}: {\n param: OpenAPIParameter;\n value: string;\n inline: boolean;\n onChange: (value: string) => void;\n}) {\n const schema = param.schema;\n const fieldId = `param-${param.name}`;\n\n if (isMultiValueParam(param)) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <TagInput\n id={fieldId}\n value={value}\n placeholder={parameterPlaceholder(param) || param.name}\n onChange={onChange}\n />\n </FieldWrapper>\n );\n }\n\n if (schema?.enum) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <select\n id={fieldId}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n >\n <option value=\"\">Select {param.name}</option>\n {schema.enum.map((v) => (\n <option key={String(v)} value={String(v)}>\n {String(v)}\n </option>\n ))}\n </select>\n </FieldWrapper>\n );\n }\n\n if (schema?.type === \"boolean\") {\n const checkbox = (\n <input\n id={fieldId}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-primary\"\n checked={value === \"true\"}\n onChange={(event) => onChange(event.target.checked ? \"true\" : \"false\")}\n />\n );\n if (inline) {\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline>\n <div className=\"flex h-9 items-center\">{checkbox}</div>\n </FieldWrapper>\n );\n }\n return (\n <div className=\"flex items-center gap-2\">\n {checkbox}\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n {param.description && (\n <span className=\"text-xs text-muted-foreground\">{param.description}</span>\n )}\n </div>\n );\n }\n\n if (isDateParam(param)) {\n const dateTime = schema?.format === \"date-time\";\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <div className=\"flex gap-2\">\n <input\n id={fieldId}\n type={dateTime ? \"datetime-local\" : \"date\"}\n value={dateInputValue(value, dateTime)}\n className={inputClassName}\n onChange={(event) => onChange(dateOutputValue(event.target.value, dateTime))}\n />\n {value && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label={`Clear ${param.name}`}\n onClick={() => onChange(\"\")}\n >\n <Icon icon={UiClose} />\n </Button>\n )}\n </div>\n </FieldWrapper>\n );\n }\n\n const inputType = schema?.type === \"integer\" || schema?.type === \"number\" ? \"number\" : \"text\";\n\n return (\n <FieldWrapper param={param} fieldId={fieldId} inline={inline}>\n <input\n id={fieldId}\n type={inputType}\n value={value}\n className={inputClassName}\n onChange={(event) => onChange(event.target.value)}\n placeholder={\n schema?.default != null\n ? String(schema.default)\n : parameterPlaceholder(param) || param.name\n }\n />\n </FieldWrapper>\n );\n}\n\nfunction TagInput({\n id,\n value,\n placeholder,\n onChange,\n}: {\n id: string;\n value: string;\n placeholder: string;\n onChange: (value: string) => void;\n}) {\n const tags = parseTags(value);\n\n function commit(raw: string, input: HTMLInputElement) {\n const next = raw\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n if (next.length === 0) return;\n onChange(serializeTags([...tags, ...next]));\n input.value = \"\";\n }\n\n function remove(index: number) {\n onChange(serializeTags(tags.filter((_, i) => i !== index)));\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n const input = event.currentTarget;\n if (event.key === \"Enter\" || event.key === \",\") {\n event.preventDefault();\n commit(input.value, input);\n return;\n }\n if (event.key === \"Backspace\" && input.value === \"\" && tags.length > 0) {\n remove(tags.length - 1);\n }\n }\n\n return (\n <div className=\"flex min-h-9 flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\">\n {tags.map((tag, index) => (\n <span\n key={`${tag}-${index}`}\n className=\"inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-muted px-2 text-xs\"\n >\n <span className=\"truncate\">{tag}</span>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={`Remove ${tag}`}\n onClick={() => remove(index)}\n >\n <Icon icon={UiClose} />\n </button>\n </span>\n ))}\n <input\n id={id}\n className=\"min-w-32 flex-1 bg-transparent px-1 py-1 text-sm outline-none\"\n placeholder={tags.length === 0 ? placeholder : \"\"}\n onKeyDown={handleKeyDown}\n onBlur={(event) => commit(event.currentTarget.value, event.currentTarget)}\n />\n </div>\n );\n}\n\nfunction FieldWrapper({\n param,\n fieldId,\n inline,\n children,\n}: {\n param: OpenAPIParameter;\n fieldId: string;\n inline?: boolean;\n children: ReactNode;\n}) {\n const label = (\n <label htmlFor={fieldId} className=\"text-sm font-medium\">\n {param.name}\n {param.required && <span className=\"text-destructive\"> *</span>}\n </label>\n );\n\n if (inline) {\n return (\n <div className=\"grid grid-cols-[10rem_1fr] items-start gap-x-3 gap-y-0.5\">\n <div className=\"flex h-9 items-center\">{label}</div>\n <div className=\"min-w-0\">{children}</div>\n {param.description && (\n <p className=\"col-start-2 text-xs text-muted-foreground\">{param.description}</p>\n )}\n </div>\n );\n }\n\n return (\n <div className=\"space-y-1.5\">\n {label}\n {children}\n {param.description && <p className=\"text-xs text-muted-foreground\">{param.description}</p>}\n </div>\n );\n}\n\nfunction buildInitialState(\n parameters: OpenAPIParameter[],\n path: string,\n overrides?: Record<string, string>,\n): FormState {\n const state: FormState = {};\n for (const p of parameters) {\n state[p.name] = initialParamValue(p, overrides?.[p.name]);\n }\n for (const name of pathParamNames(path)) {\n if (state[name] == null) {\n state[name] = overrides?.[name] ?? \"\";\n }\n }\n return state;\n}\n\nfunction initialParamValue(param: OpenAPIParameter, override: string | undefined): string {\n if (override != null) return sanitizeInitialValue(param, override);\n const value = param.schema?.default;\n if (value == null) return \"\";\n return sanitizeInitialValue(param, String(value));\n}\n\nfunction sanitizeInitialValue(param: OpenAPIParameter, value: string): string {\n const trimmed = value.trim();\n if (trimmed === \"[]\" || trimmed === \"null\") return \"\";\n if (isDateParam(param) && isZeroDate(trimmed)) return \"\";\n return value;\n}\n\nfunction splitArgsValue(value: string): string[] {\n try {\n const parsed = JSON.parse(value);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Use comma splitting below.\n }\n return value\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction isMultiValueParam(param: OpenAPIParameter): boolean {\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return (\n param.schema?.type === \"array\" ||\n String(param.schema?.default ?? \"\") === \"[]\" ||\n text.includes(\"repeatable\")\n );\n}\n\nfunction parseTags(value: string): string[] {\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"[]\" || trimmed === \"null\") return [];\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed)) return parsed.map(String).filter(Boolean);\n } catch {\n // Fall back to comma-delimited tags below.\n }\n return trimmed\n .split(\",\")\n .map((part) => part.trim())\n .filter(Boolean);\n}\n\nfunction serializeTags(tags: string[]): string {\n return tags.join(\",\");\n}\n\nfunction isDateParam(param: OpenAPIParameter): boolean {\n const format = param.schema?.format?.toLowerCase();\n const text = `${param.name} ${param.description ?? \"\"}`.toLowerCase();\n return format === \"date\" || format === \"date-time\" || text.includes(\"date\");\n}\n\nfunction isZeroDate(value: string): boolean {\n return value.startsWith(\"0001-01-01\") || value === \"0001-01-01\";\n}\n\nfunction dateInputValue(value: string, dateTime: boolean): string {\n if (!value || value.startsWith(\"0001-01-01\")) return \"\";\n if (!dateTime) return value.slice(0, 10);\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value.slice(0, 16);\n const offset = parsed.getTimezoneOffset() * 60_000;\n return new Date(parsed.getTime() - offset).toISOString().slice(0, 16);\n}\n\nfunction dateOutputValue(value: string, dateTime: boolean): string {\n if (!value) return \"\";\n if (!dateTime) return value;\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) return value;\n return parsed.toISOString();\n}\n\nconst inputClassName =\n \"h-9 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring\";\n"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const DataTable = require("../data/DataTable.cjs");
6
6
  const Clicky = require("../data/Clicky.cjs");
7
+ const clickyParse = require("../data/clicky-parse.cjs");
7
8
  const JsonView = require("../data/JsonView.cjs");
8
9
  const utils = require("../lib/utils.cjs");
9
10
  const LOADING_RESULT_COLUMNS = [
@@ -136,7 +137,7 @@ function OutputBody({
136
137
  return /* @__PURE__ */ jsxRuntime.jsx(PdfOutput, { blob });
137
138
  }
138
139
  const clickyPayload = typeof parsed === "string" || parsed != null && typeof parsed === "object" ? parsed : text;
139
- const parsedClicky = clickyPayload === "" ? null : Clicky.parseClickyData(clickyPayload);
140
+ const parsedClicky = clickyPayload === "" ? null : clickyParse.parseClickyData(clickyPayload);
140
141
  if ((parsedClicky == null ? void 0 : parsedClicky.ok) || ct === "application/clicky+json" || ct === "application/json+clicky") {
141
142
  const clicky = /* @__PURE__ */ jsxRuntime.jsx(
142
143
  Clicky.Clicky,
@@ -1 +1 @@
1
- {"version":3,"file":"CommandOutput.cjs","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n parseClickyData,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-background\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":["useMemo","jsx","jsxs","cn","parseClickyData","Clicky","DataTable","useState","useEffect","JsonView"],"mappings":"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"}
1
+ {"version":3,"file":"CommandOutput.cjs","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { parseClickyData } from \"../data/clicky-parse\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-background\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":["useMemo","jsx","jsxs","cn","parseClickyData","Clicky","DataTable","useState","useEffect","JsonView"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CommandOutput.d.ts","sourceRoot":"","sources":["../../src/rpc/CommandOutput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAmC,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAGL,KAAK,oBAAoB,EAGzB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC7B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,EAAE,CAAC;IACpC,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC,CAAC;AAgBF,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,OAAe,EACf,cAA6C,EAC7C,YAAiC,EACjC,SAAS,EACT,SAAS,EACT,IAAY,EACZ,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,MAAM,EACN,SAAS,EACT,eAAe,EACf,UAAU,GACX,EAAE,kBAAkB,2CAuGpB"}
1
+ {"version":3,"file":"CommandOutput.d.ts","sourceRoot":"","sources":["../../src/rpc/CommandOutput.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAmC,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC9F,OAAO,EAEL,KAAK,oBAAoB,EAGzB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC7B,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,eAAe,CAAC,EAAE,kBAAkB,CAAC;IACrC,mBAAmB,CAAC,EAAE,uBAAuB,CAAC;IAC9C,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,EAAE,CAAC;IACpC,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC,CAAC;AAgBF,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,OAAe,EACf,cAA6C,EAC7C,YAAiC,EACjC,SAAS,EACT,SAAS,EACT,IAAY,EACZ,cAAc,EACd,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,MAAM,EACN,SAAS,EACT,eAAe,EACf,UAAU,GACX,EAAE,kBAAkB,2CAuGpB"}
@@ -1,7 +1,8 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { useMemo, useState, useEffect } from "react";
3
3
  import { DataTable } from "../data/DataTable.js";
4
- import { parseClickyData, Clicky } from "../data/Clicky.js";
4
+ import { Clicky } from "../data/Clicky.js";
5
+ import { parseClickyData } from "../data/clicky-parse.js";
5
6
  import { JsonView } from "../data/JsonView.js";
6
7
  import { cn } from "../lib/utils.js";
7
8
  const LOADING_RESULT_COLUMNS = [
@@ -1 +1 @@
1
- {"version":3,"file":"CommandOutput.js","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n parseClickyData,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-background\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CommandOutput.js","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { parseClickyData } from \"../data/clicky-parse\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-background\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const themeSwitcher = require("../components/theme-switcher.cjs");
6
6
  const clickyMetadata = require("./clickyMetadata.cjs");
7
+ const commandHref = require("./commandHref.cjs");
8
+ const router = require("./router.cjs");
7
9
  const OperationCatalog = require("./OperationCatalog.cjs");
8
10
  const OperationCommandPage = require("./OperationCommandPage.cjs");
9
11
  const OperationEntityPage = require("./OperationEntityPage.cjs");
@@ -11,12 +13,11 @@ const useOperations = require("./useOperations.cjs");
11
13
  const SURFACE_GROUP_STATE_KEY = "clicky-ui:sidebar:groupCollapsed";
12
14
  function EntityExplorerApp({
13
15
  client,
14
- pathname,
15
- renderLink,
16
16
  basePath = "",
17
17
  showApiExplorer = true,
18
18
  surfaceIcons
19
19
  }) {
20
+ const { pathname, renderLink, navigate } = router.useRouter();
20
21
  const { operations, spec } = useOperations.useOperations(client);
21
22
  const surfaces = react.useMemo(() => clickyMetadata.getClickySurfaces(spec), [spec]);
22
23
  const surfaceGroups = react.useMemo(() => groupSurfacesByParent(surfaces), [surfaces]);
@@ -25,7 +26,7 @@ function EntityExplorerApp({
25
26
  for (const surface of surfaces) {
26
27
  const listOp = clickyMetadata.findSurfaceListOperation(operations, surface.key);
27
28
  if (!(listOp == null ? void 0 : listOp.operation.operationId)) continue;
28
- const href = buildCommandHref(basePath, {
29
+ const href = commandHref.buildCommandHref(basePath, {
29
30
  operation: listOp,
30
31
  request: { command: listOp.operation.operationId, autoRun: true }
31
32
  });
@@ -53,17 +54,16 @@ function EntityExplorerApp({
53
54
  const commandRuntime = react.useMemo(
54
55
  () => ({
55
56
  client,
56
- hrefForCommand: (resolved) => buildCommandHref(basePath, resolved),
57
+ hrefForCommand: (resolved) => commandHref.buildCommandHref(basePath, resolved),
57
58
  onNavigate: (resolved) => {
58
- const href = buildCommandHref(basePath, resolved);
59
- if (!href || typeof window === "undefined") return;
60
- window.history.pushState(window.history.state, "", href);
61
- window.dispatchEvent(new PopStateEvent("popstate"));
59
+ const href = commandHref.buildCommandHref(basePath, resolved);
60
+ if (!href) return;
61
+ navigate(href);
62
62
  }
63
63
  }),
64
- [basePath, client]
64
+ [basePath, client, navigate]
65
65
  );
66
- const { initialValues: commandInitialValues, autoRun: commandAutoRun } = react.useMemo(
66
+ const { initialValues: commandInitialValues } = react.useMemo(
67
67
  () => resolvedRoute.kind === "command" ? readCommandQueryParams() : { initialValues: {}, autoRun: false },
68
68
  [resolvedRoute.kind, pathname]
69
69
  );
@@ -76,14 +76,10 @@ function EntityExplorerApp({
76
76
  []
77
77
  );
78
78
  react.useEffect(() => {
79
- if (typeof window === "undefined" || defaultSurface == null || relativePath !== "/" || window.location.pathname !== withBasePath(basePath, "/")) {
80
- return;
81
- }
82
- const target = withBasePath(basePath, `/${defaultSurface.key}`);
83
- window.history.replaceState(window.history.state, "", target);
84
- window.dispatchEvent(new PopStateEvent("popstate"));
85
- }, [basePath, defaultSurface, relativePath]);
86
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full", children: [
79
+ if (defaultSurface == null || relativePath !== "/") return;
80
+ navigate(commandHref.withBasePath(basePath, `/${defaultSurface.key}`), { replace: true });
81
+ }, [basePath, defaultSurface, relativePath, navigate]);
82
+ const content = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full", children: [
87
83
  /* @__PURE__ */ jsxRuntime.jsxs("aside", { className: "flex w-64 shrink-0 flex-col border-r border-border bg-muted/30 p-4", children: [
88
84
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-6", children: [
89
85
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-semibold", children: (spec == null ? void 0 : spec.info.title) ?? "Clicky Explorer" }),
@@ -110,7 +106,7 @@ function EntityExplorerApp({
110
106
  !collapsed && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-2 mt-1 flex flex-col gap-1 border-l border-border/60 pl-2", children: group.surfaces.map(
111
107
  (surface) => renderLink({
112
108
  key: surface.key,
113
- to: listHrefBySurface[surface.key] ?? withBasePath(basePath, `/${surface.key}`),
109
+ to: listHrefBySurface[surface.key] ?? commandHref.withBasePath(basePath, `/${surface.key}`),
114
110
  className: navLinkClassName(
115
111
  isSurfaceRouteActive(resolvedRoute, surface.key)
116
112
  ),
@@ -121,7 +117,7 @@ function EntityExplorerApp({
121
117
  }),
122
118
  showApiExplorer && renderLink({
123
119
  key: explorerDefinition.key,
124
- to: withBasePath(basePath, "/explorer"),
120
+ to: commandHref.withBasePath(basePath, "/explorer"),
125
121
  className: navLinkClassName(
126
122
  resolvedRoute.kind === "explorer" || resolvedRoute.kind === "command"
127
123
  ),
@@ -148,7 +144,7 @@ function EntityExplorerApp({
148
144
  client,
149
145
  renderLink,
150
146
  surfaceKey: resolvedRoute.surface.key,
151
- backHref: withBasePath(basePath, `/${resolvedRoute.surface.key}`),
147
+ backHref: commandHref.withBasePath(basePath, `/${resolvedRoute.surface.key}`),
152
148
  backLabel: `Back to ${resolvedRoute.surface.title}`,
153
149
  commandRuntime,
154
150
  ...resolvedRoute.id ? { id: resolvedRoute.id } : {}
@@ -157,12 +153,12 @@ function EntityExplorerApp({
157
153
  OperationCommandPage.OperationCommandPage,
158
154
  {
159
155
  client,
160
- backHref: withBasePath(basePath, "/explorer"),
156
+ backHref: commandHref.withBasePath(basePath, "/explorer"),
161
157
  backLabel: "Back to API Explorer",
162
158
  renderLink,
163
159
  commandRuntime,
164
160
  initialValues: commandInitialValues,
165
- autoRun: commandAutoRun,
161
+ autoRun: true,
166
162
  ...resolvedRoute.operationId ? { operationId: resolvedRoute.operationId } : {}
167
163
  }
168
164
  ) : resolvedRoute.kind === "explorer" ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -177,9 +173,10 @@ function EntityExplorerApp({
177
173
  }
178
174
  ) : defaultSurface == null ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground", children: "Loading surfaces…" }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm text-muted-foreground", children: "Redirecting…" }) })
179
175
  ] });
176
+ return content;
180
177
  }
181
178
  function parseExplorerRoute(pathname) {
182
- const normalized = trimTrailingSlash(pathname) || "/";
179
+ const normalized = commandHref.trimTrailingSlash(pathname) || "/";
183
180
  if (normalized === "/") {
184
181
  return { kind: "root" };
185
182
  }
@@ -217,28 +214,17 @@ function navLinkClassName(active) {
217
214
  ].join(" ");
218
215
  }
219
216
  function stripBasePath(pathname, basePath) {
220
- const base = trimTrailingSlash(basePath);
217
+ const base = commandHref.trimTrailingSlash(basePath);
221
218
  if (!base || base === "/") {
222
- return trimTrailingSlash(pathname) || "/";
219
+ return commandHref.trimTrailingSlash(pathname) || "/";
223
220
  }
224
221
  if (pathname === base) {
225
222
  return "/";
226
223
  }
227
224
  if (pathname.startsWith(`${base}/`)) {
228
- return trimTrailingSlash(pathname.slice(base.length)) || "/";
229
- }
230
- return trimTrailingSlash(pathname) || "/";
231
- }
232
- function withBasePath(basePath, pathname) {
233
- const base = trimTrailingSlash(basePath);
234
- if (!base || base === "/") {
235
- return pathname;
225
+ return commandHref.trimTrailingSlash(pathname.slice(base.length)) || "/";
236
226
  }
237
- return `${base}${pathname}`;
238
- }
239
- function trimTrailingSlash(value) {
240
- if (!value) return "";
241
- return value.length > 1 ? value.replace(/\/+$/, "") : value;
227
+ return commandHref.trimTrailingSlash(pathname) || "/";
242
228
  }
243
229
  function UnknownSurface({ surfaceKey }) {
244
230
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6 text-sm text-muted-foreground", children: [
@@ -246,48 +232,7 @@ function UnknownSurface({ surfaceKey }) {
246
232
  /* @__PURE__ */ jsxRuntime.jsx("code", { children: surfaceKey })
247
233
  ] });
248
234
  }
249
- const AUTORUN_QUERY_PARAM = "autoRun";
250
235
  const LEGACY_AUTORUN_QUERY_PARAM = "__autoRun";
251
- const ARG_QUERY_PREFIX = "__arg";
252
- function buildCommandHref(basePath, resolved) {
253
- var _a, _b;
254
- const commandId = ((_a = resolved.operation) == null ? void 0 : _a.operation.operationId) ?? resolved.request.command;
255
- if (!commandId) return void 0;
256
- const meta = (_b = resolved.operation) == null ? void 0 : _b.operation["x-clicky"];
257
- const args = resolved.request.args ?? [];
258
- const flags = resolved.request.flags ?? {};
259
- if ((meta == null ? void 0 : meta.verb) === "get" && (meta == null ? void 0 : meta.scope) === "entity" && meta.surface && args[0]) {
260
- const search2 = new URLSearchParams();
261
- for (const [key, value] of Object.entries(flags)) {
262
- if (value !== void 0 && value !== "") {
263
- search2.set(key, value);
264
- }
265
- }
266
- const query2 = search2.toString();
267
- const suffix2 = query2 ? `?${query2}` : "";
268
- return withBasePath(
269
- basePath,
270
- `/${encodeURIComponent(meta.surface)}/${encodeURIComponent(args[0])}${suffix2}`
271
- );
272
- }
273
- const search = new URLSearchParams();
274
- args.forEach((value, index) => {
275
- if (value !== void 0 && value !== "") {
276
- search.set(`${ARG_QUERY_PREFIX}${index}`, value);
277
- }
278
- });
279
- for (const [key, value] of Object.entries(flags)) {
280
- if (value !== void 0 && value !== "") {
281
- search.set(key, value);
282
- }
283
- }
284
- if (resolved.request.autoRun) {
285
- search.set(AUTORUN_QUERY_PARAM, "1");
286
- }
287
- const query = search.toString();
288
- const suffix = query ? `?${query}` : "";
289
- return withBasePath(basePath, `/commands/${encodeURIComponent(commandId)}${suffix}`);
290
- }
291
236
  function groupSurfacesByParent(surfaces) {
292
237
  const order = [];
293
238
  const buckets = /* @__PURE__ */ new Map();
@@ -336,12 +281,12 @@ function readCommandQueryParams() {
336
281
  let autoRun = false;
337
282
  const positional = [];
338
283
  for (const [key, value] of search.entries()) {
339
- if (key === AUTORUN_QUERY_PARAM || key === LEGACY_AUTORUN_QUERY_PARAM) {
284
+ if (key === commandHref.AUTORUN_QUERY_PARAM || key === LEGACY_AUTORUN_QUERY_PARAM) {
340
285
  autoRun = value === "1" || value === "true";
341
286
  continue;
342
287
  }
343
- if (key.startsWith(ARG_QUERY_PREFIX)) {
344
- const index = Number.parseInt(key.slice(ARG_QUERY_PREFIX.length), 10);
288
+ if (key.startsWith(commandHref.ARG_QUERY_PREFIX)) {
289
+ const index = Number.parseInt(key.slice(commandHref.ARG_QUERY_PREFIX.length), 10);
345
290
  if (Number.isFinite(index) && index >= 0) {
346
291
  positional[index] = value;
347
292
  }