@flanksource/clicky-ui 0.3.58 → 0.3.60

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 (504) hide show
  1. package/NOTICE.md +58 -0
  2. package/dist/clicky.cjs +3 -1
  3. package/dist/clicky.d.ts +1 -0
  4. package/dist/clicky.d.ts.map +1 -1
  5. package/dist/clicky.js +3 -1
  6. package/dist/data/Clicky.cjs +23 -270
  7. package/dist/data/Clicky.cjs.map +1 -1
  8. package/dist/data/Clicky.d.ts +5 -29
  9. package/dist/data/Clicky.d.ts.map +1 -1
  10. package/dist/data/Clicky.js +11 -259
  11. package/dist/data/Clicky.js.map +1 -1
  12. package/dist/data/PromptBanner.model.cjs +10 -0
  13. package/dist/data/PromptBanner.model.cjs.map +1 -1
  14. package/dist/data/PromptBanner.model.d.ts +2 -0
  15. package/dist/data/PromptBanner.model.d.ts.map +1 -1
  16. package/dist/data/PromptBanner.model.js +10 -1
  17. package/dist/data/PromptBanner.model.js.map +1 -1
  18. package/dist/data/PromptDialog.cjs +16 -49
  19. package/dist/data/PromptDialog.cjs.map +1 -1
  20. package/dist/data/PromptDialog.d.ts +7 -1
  21. package/dist/data/PromptDialog.d.ts.map +1 -1
  22. package/dist/data/PromptDialog.js +17 -50
  23. package/dist/data/PromptDialog.js.map +1 -1
  24. package/dist/data/PromptForm.cjs +79 -0
  25. package/dist/data/PromptForm.cjs.map +1 -0
  26. package/dist/data/PromptForm.d.ts +26 -0
  27. package/dist/data/PromptForm.d.ts.map +1 -0
  28. package/dist/data/PromptForm.js +79 -0
  29. package/dist/data/PromptForm.js.map +1 -0
  30. package/dist/data/PromptIndicator.cjs +82 -0
  31. package/dist/data/PromptIndicator.cjs.map +1 -0
  32. package/dist/data/PromptIndicator.d.ts +19 -0
  33. package/dist/data/PromptIndicator.d.ts.map +1 -0
  34. package/dist/data/PromptIndicator.js +82 -0
  35. package/dist/data/PromptIndicator.js.map +1 -0
  36. package/dist/data/PromptList.cjs +67 -0
  37. package/dist/data/PromptList.cjs.map +1 -0
  38. package/dist/data/PromptList.d.ts +13 -0
  39. package/dist/data/PromptList.d.ts.map +1 -0
  40. package/dist/data/PromptList.js +67 -0
  41. package/dist/data/PromptList.js.map +1 -0
  42. package/dist/data/clicky-download.cjs +251 -0
  43. package/dist/data/clicky-download.cjs.map +1 -0
  44. package/dist/data/clicky-download.d.ts +55 -0
  45. package/dist/data/clicky-download.d.ts.map +1 -0
  46. package/dist/data/clicky-download.js +244 -0
  47. package/dist/data/clicky-download.js.map +1 -0
  48. package/dist/data/git/GitChangeList.cjs +11 -4
  49. package/dist/data/git/GitChangeList.cjs.map +1 -1
  50. package/dist/data/git/GitChangeList.d.ts +2 -35
  51. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  52. package/dist/data/git/GitChangeList.js +11 -4
  53. package/dist/data/git/GitChangeList.js.map +1 -1
  54. package/dist/data/git/GitLink.cjs +13 -0
  55. package/dist/data/git/GitLink.cjs.map +1 -0
  56. package/dist/data/git/GitLink.d.ts +8 -0
  57. package/dist/data/git/GitLink.d.ts.map +1 -0
  58. package/dist/data/git/GitLink.js +13 -0
  59. package/dist/data/git/GitLink.js.map +1 -0
  60. package/dist/data/git/git-links.cjs +54 -0
  61. package/dist/data/git/git-links.cjs.map +1 -0
  62. package/dist/data/git/git-links.d.ts +4 -0
  63. package/dist/data/git/git-links.d.ts.map +1 -0
  64. package/dist/data/git/git-links.js +53 -0
  65. package/dist/data/git/git-links.js.map +1 -0
  66. package/dist/data/git/index.d.ts +3 -0
  67. package/dist/data/git/index.d.ts.map +1 -1
  68. package/dist/data/git/types.d.ts +54 -0
  69. package/dist/data/git/types.d.ts.map +1 -0
  70. package/dist/data/test-runner/MatrixMarks.cjs +4 -3
  71. package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
  72. package/dist/data/test-runner/MatrixMarks.d.ts +7 -4
  73. package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
  74. package/dist/data/test-runner/MatrixMarks.js +4 -3
  75. package/dist/data/test-runner/MatrixMarks.js.map +1 -1
  76. package/dist/data/test-runner/TestRunSummary.cjs +1 -1
  77. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  78. package/dist/data/test-runner/TestRunSummary.js +1 -1
  79. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  80. package/dist/data/test-runner/TestTree.cjs +1 -1
  81. package/dist/data/test-runner/TestTree.cjs.map +1 -1
  82. package/dist/data/test-runner/TestTree.js +1 -1
  83. package/dist/data/test-runner/TestTree.js.map +1 -1
  84. package/dist/data/test-runner/TestTreeNode.cjs +2 -2
  85. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  86. package/dist/data/test-runner/TestTreeNode.js +2 -2
  87. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  88. package/dist/data/test-runner/adapter.cjs +7 -0
  89. package/dist/data/test-runner/adapter.cjs.map +1 -1
  90. package/dist/data/test-runner/adapter.d.ts +7 -0
  91. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  92. package/dist/data/test-runner/adapter.js +7 -0
  93. package/dist/data/test-runner/adapter.js.map +1 -1
  94. package/dist/data/test-runner/index.d.ts +1 -1
  95. package/dist/data/test-runner/index.d.ts.map +1 -1
  96. package/dist/data/test-runner/marks.cjs +3 -3
  97. package/dist/data/test-runner/marks.cjs.map +1 -1
  98. package/dist/data/test-runner/marks.js +3 -3
  99. package/dist/data/test-runner/marks.js.map +1 -1
  100. package/dist/data/test-runner/matrix-marks.cjs +12 -3
  101. package/dist/data/test-runner/matrix-marks.cjs.map +1 -1
  102. package/dist/data/test-runner/matrix-marks.d.ts +13 -0
  103. package/dist/data/test-runner/matrix-marks.d.ts.map +1 -1
  104. package/dist/data/test-runner/matrix-marks.js +12 -3
  105. package/dist/data/test-runner/matrix-marks.js.map +1 -1
  106. package/dist/data/test-runner/status.cjs +1 -1
  107. package/dist/data/test-runner/status.cjs.map +1 -1
  108. package/dist/data/test-runner/status.js +1 -1
  109. package/dist/data/test-runner/status.js.map +1 -1
  110. package/dist/data/test-runner/types.d.ts +2 -0
  111. package/dist/data/test-runner/types.d.ts.map +1 -1
  112. package/dist/data/traces/index.d.ts +2 -0
  113. package/dist/data/traces/index.d.ts.map +1 -1
  114. package/dist/data/traces/otel/OtelTraceDetail.cjs +102 -78
  115. package/dist/data/traces/otel/OtelTraceDetail.cjs.map +1 -1
  116. package/dist/data/traces/otel/OtelTraceDetail.d.ts +6 -2
  117. package/dist/data/traces/otel/OtelTraceDetail.d.ts.map +1 -1
  118. package/dist/data/traces/otel/OtelTraceDetail.js +102 -78
  119. package/dist/data/traces/otel/OtelTraceDetail.js.map +1 -1
  120. package/dist/data/traces/otel/OtelTraceTable.cjs +43 -7
  121. package/dist/data/traces/otel/OtelTraceTable.cjs.map +1 -1
  122. package/dist/data/traces/otel/OtelTraceTable.d.ts +14 -3
  123. package/dist/data/traces/otel/OtelTraceTable.d.ts.map +1 -1
  124. package/dist/data/traces/otel/OtelTraceTable.js +44 -8
  125. package/dist/data/traces/otel/OtelTraceTable.js.map +1 -1
  126. package/dist/data/traces/otel/profile-listing.cjs +61 -0
  127. package/dist/data/traces/otel/profile-listing.cjs.map +1 -0
  128. package/dist/data/traces/otel/profile-listing.d.ts +23 -0
  129. package/dist/data/traces/otel/profile-listing.d.ts.map +1 -0
  130. package/dist/data/traces/otel/profile-listing.js +60 -0
  131. package/dist/data/traces/otel/profile-listing.js.map +1 -0
  132. package/dist/data/traces/otel/profile-spans.cjs +22 -0
  133. package/dist/data/traces/otel/profile-spans.cjs.map +1 -0
  134. package/dist/data/traces/otel/profile-spans.d.ts +4 -0
  135. package/dist/data/traces/otel/profile-spans.d.ts.map +1 -0
  136. package/dist/data/traces/otel/profile-spans.js +22 -0
  137. package/dist/data/traces/otel/profile-spans.js.map +1 -0
  138. package/dist/data/traces/otel/span-traces.cjs +7 -1
  139. package/dist/data/traces/otel/span-traces.cjs.map +1 -1
  140. package/dist/data/traces/otel/span-traces.d.ts +2 -0
  141. package/dist/data/traces/otel/span-traces.d.ts.map +1 -1
  142. package/dist/data/traces/otel/span-traces.js +7 -2
  143. package/dist/data/traces/otel/span-traces.js.map +1 -1
  144. package/dist/data/useClickyTableMenu.cjs +33 -0
  145. package/dist/data/useClickyTableMenu.cjs.map +1 -0
  146. package/dist/data/useClickyTableMenu.d.ts +17 -0
  147. package/dist/data/useClickyTableMenu.d.ts.map +1 -0
  148. package/dist/data/useClickyTableMenu.js +33 -0
  149. package/dist/data/useClickyTableMenu.js.map +1 -0
  150. package/dist/data/verification/adapterViews.cjs +3 -1
  151. package/dist/data/verification/adapterViews.cjs.map +1 -1
  152. package/dist/data/verification/adapterViews.d.ts +5 -2
  153. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  154. package/dist/data/verification/adapterViews.js +4 -2
  155. package/dist/data/verification/adapterViews.js.map +1 -1
  156. package/dist/data/verification/adapters.cjs +28 -7
  157. package/dist/data/verification/adapters.cjs.map +1 -1
  158. package/dist/data/verification/adapters.d.ts +7 -1
  159. package/dist/data/verification/adapters.d.ts.map +1 -1
  160. package/dist/data/verification/adapters.js +28 -7
  161. package/dist/data/verification/adapters.js.map +1 -1
  162. package/dist/data/verification/stepKind.cjs +1 -0
  163. package/dist/data/verification/stepKind.cjs.map +1 -1
  164. package/dist/data/verification/stepKind.d.ts.map +1 -1
  165. package/dist/data/verification/stepKind.js +1 -0
  166. package/dist/data/verification/stepKind.js.map +1 -1
  167. package/dist/data/verification/stepKindViews.cjs +17 -0
  168. package/dist/data/verification/stepKindViews.cjs.map +1 -1
  169. package/dist/data/verification/stepKindViews.d.ts +4 -0
  170. package/dist/data/verification/stepKindViews.d.ts.map +1 -1
  171. package/dist/data/verification/stepKindViews.js +17 -1
  172. package/dist/data/verification/stepKindViews.js.map +1 -1
  173. package/dist/data/version-info.cjs +3 -3
  174. package/dist/data/version-info.js +3 -3
  175. package/dist/data.cjs +121 -2
  176. package/dist/data.d.ts +3 -0
  177. package/dist/data.d.ts.map +1 -1
  178. package/dist/data.js +55 -3
  179. package/dist/git.cjs +6 -0
  180. package/dist/git.d.ts +4 -0
  181. package/dist/git.d.ts.map +1 -0
  182. package/dist/git.js +3 -0
  183. package/dist/hooks/use-prompts.cjs +18 -11
  184. package/dist/hooks/use-prompts.cjs.map +1 -1
  185. package/dist/hooks/use-prompts.d.ts.map +1 -1
  186. package/dist/hooks/use-prompts.js +18 -11
  187. package/dist/hooks/use-prompts.js.map +1 -1
  188. package/dist/icons/components/UiApi.cjs +37 -0
  189. package/dist/icons/components/UiApi.cjs.map +1 -0
  190. package/dist/icons/components/UiApi.d.ts +9 -0
  191. package/dist/icons/components/UiApi.d.ts.map +1 -0
  192. package/dist/icons/components/UiApi.js +35 -0
  193. package/dist/icons/components/UiApi.js.map +1 -0
  194. package/dist/icons/components/UiApiBridge.cjs +38 -0
  195. package/dist/icons/components/UiApiBridge.cjs.map +1 -0
  196. package/dist/icons/components/UiApiBridge.d.ts +9 -0
  197. package/dist/icons/components/UiApiBridge.d.ts.map +1 -0
  198. package/dist/icons/components/UiApiBridge.js +36 -0
  199. package/dist/icons/components/UiApiBridge.js.map +1 -0
  200. package/dist/icons/components/UiApiGateway.cjs +33 -0
  201. package/dist/icons/components/UiApiGateway.cjs.map +1 -0
  202. package/dist/icons/components/UiApiGateway.d.ts +9 -0
  203. package/dist/icons/components/UiApiGateway.d.ts.map +1 -0
  204. package/dist/icons/components/UiApiGateway.js +31 -0
  205. package/dist/icons/components/UiApiGateway.js.map +1 -0
  206. package/dist/icons/components/UiApiRequest.cjs +37 -0
  207. package/dist/icons/components/UiApiRequest.cjs.map +1 -0
  208. package/dist/icons/components/UiApiRequest.d.ts +9 -0
  209. package/dist/icons/components/UiApiRequest.d.ts.map +1 -0
  210. package/dist/icons/components/UiApiRequest.js +35 -0
  211. package/dist/icons/components/UiApiRequest.js.map +1 -0
  212. package/dist/icons/components/UiArrowDecision.cjs +51 -0
  213. package/dist/icons/components/UiArrowDecision.cjs.map +1 -0
  214. package/dist/icons/components/UiArrowDecision.d.ts +15 -0
  215. package/dist/icons/components/UiArrowDecision.d.ts.map +1 -0
  216. package/dist/icons/components/UiArrowDecision.js +48 -0
  217. package/dist/icons/components/UiArrowDecision.js.map +1 -0
  218. package/dist/icons/components/UiArrowSquareIn.cjs +51 -0
  219. package/dist/icons/components/UiArrowSquareIn.cjs.map +1 -0
  220. package/dist/icons/components/UiArrowSquareIn.d.ts +15 -0
  221. package/dist/icons/components/UiArrowSquareIn.d.ts.map +1 -0
  222. package/dist/icons/components/UiArrowSquareIn.js +48 -0
  223. package/dist/icons/components/UiArrowSquareIn.js.map +1 -0
  224. package/dist/icons/components/UiBatchCheck.cjs +55 -0
  225. package/dist/icons/components/UiBatchCheck.cjs.map +1 -0
  226. package/dist/icons/components/UiBatchCheck.d.ts +15 -0
  227. package/dist/icons/components/UiBatchCheck.d.ts.map +1 -0
  228. package/dist/icons/components/UiBatchCheck.js +52 -0
  229. package/dist/icons/components/UiBatchCheck.js.map +1 -0
  230. package/dist/icons/components/UiBatchJob.cjs +39 -0
  231. package/dist/icons/components/UiBatchJob.cjs.map +1 -0
  232. package/dist/icons/components/UiBatchJob.d.ts +9 -0
  233. package/dist/icons/components/UiBatchJob.d.ts.map +1 -0
  234. package/dist/icons/components/UiBatchJob.js +37 -0
  235. package/dist/icons/components/UiBatchJob.js.map +1 -0
  236. package/dist/icons/components/UiBatchRequest.cjs +39 -0
  237. package/dist/icons/components/UiBatchRequest.cjs.map +1 -0
  238. package/dist/icons/components/UiBatchRequest.d.ts +9 -0
  239. package/dist/icons/components/UiBatchRequest.d.ts.map +1 -0
  240. package/dist/icons/components/UiBatchRequest.js +37 -0
  241. package/dist/icons/components/UiBatchRequest.js.map +1 -0
  242. package/dist/icons/components/UiBpmnConditional.cjs +29 -0
  243. package/dist/icons/components/UiBpmnConditional.cjs.map +1 -0
  244. package/dist/icons/components/UiBpmnConditional.d.ts +9 -0
  245. package/dist/icons/components/UiBpmnConditional.d.ts.map +1 -0
  246. package/dist/icons/components/UiBpmnConditional.js +27 -0
  247. package/dist/icons/components/UiBpmnConditional.js.map +1 -0
  248. package/dist/icons/components/UiBranchFlow.cjs +33 -0
  249. package/dist/icons/components/UiBranchFlow.cjs.map +1 -0
  250. package/dist/icons/components/UiBranchFlow.d.ts +9 -0
  251. package/dist/icons/components/UiBranchFlow.d.ts.map +1 -0
  252. package/dist/icons/components/UiBranchFlow.js +31 -0
  253. package/dist/icons/components/UiBranchFlow.js.map +1 -0
  254. package/dist/icons/components/UiClassicBatch.cjs +29 -0
  255. package/dist/icons/components/UiClassicBatch.cjs.map +1 -0
  256. package/dist/icons/components/UiClassicBatch.d.ts +9 -0
  257. package/dist/icons/components/UiClassicBatch.d.ts.map +1 -0
  258. package/dist/icons/components/UiClassicBatch.js +27 -0
  259. package/dist/icons/components/UiClassicBatch.js.map +1 -0
  260. package/dist/icons/components/UiCodeFile.cjs +29 -0
  261. package/dist/icons/components/UiCodeFile.cjs.map +1 -0
  262. package/dist/icons/components/UiCodeFile.d.ts +9 -0
  263. package/dist/icons/components/UiCodeFile.d.ts.map +1 -0
  264. package/dist/icons/components/UiCodeFile.js +27 -0
  265. package/dist/icons/components/UiCodeFile.js.map +1 -0
  266. package/dist/icons/components/UiColumnsLayout.cjs +29 -0
  267. package/dist/icons/components/UiColumnsLayout.cjs.map +1 -0
  268. package/dist/icons/components/UiColumnsLayout.d.ts +9 -0
  269. package/dist/icons/components/UiColumnsLayout.d.ts.map +1 -0
  270. package/dist/icons/components/UiColumnsLayout.js +27 -0
  271. package/dist/icons/components/UiColumnsLayout.js.map +1 -0
  272. package/dist/icons/components/UiCondition.cjs +37 -0
  273. package/dist/icons/components/UiCondition.cjs.map +1 -0
  274. package/dist/icons/components/UiCondition.d.ts +9 -0
  275. package/dist/icons/components/UiCondition.d.ts.map +1 -0
  276. package/dist/icons/components/UiCondition.js +35 -0
  277. package/dist/icons/components/UiCondition.js.map +1 -0
  278. package/dist/icons/components/UiConditions.cjs +29 -0
  279. package/dist/icons/components/UiConditions.cjs.map +1 -0
  280. package/dist/icons/components/UiConditions.d.ts +9 -0
  281. package/dist/icons/components/UiConditions.d.ts.map +1 -0
  282. package/dist/icons/components/UiConditions.js +27 -0
  283. package/dist/icons/components/UiConditions.js.map +1 -0
  284. package/dist/icons/components/UiDelayQueue.cjs +40 -0
  285. package/dist/icons/components/UiDelayQueue.cjs.map +1 -0
  286. package/dist/icons/components/UiDelayQueue.d.ts +9 -0
  287. package/dist/icons/components/UiDelayQueue.d.ts.map +1 -0
  288. package/dist/icons/components/UiDelayQueue.js +38 -0
  289. package/dist/icons/components/UiDelayQueue.js.map +1 -0
  290. package/dist/icons/components/UiDynamicForm.cjs +51 -0
  291. package/dist/icons/components/UiDynamicForm.cjs.map +1 -0
  292. package/dist/icons/components/UiDynamicForm.d.ts +15 -0
  293. package/dist/icons/components/UiDynamicForm.d.ts.map +1 -0
  294. package/dist/icons/components/UiDynamicForm.js +48 -0
  295. package/dist/icons/components/UiDynamicForm.js.map +1 -0
  296. package/dist/icons/components/UiFlowArrow.cjs +51 -0
  297. package/dist/icons/components/UiFlowArrow.cjs.map +1 -0
  298. package/dist/icons/components/UiFlowArrow.d.ts +15 -0
  299. package/dist/icons/components/UiFlowArrow.d.ts.map +1 -0
  300. package/dist/icons/components/UiFlowArrow.js +48 -0
  301. package/dist/icons/components/UiFlowArrow.js.map +1 -0
  302. package/dist/icons/components/UiFormFields.cjs +33 -0
  303. package/dist/icons/components/UiFormFields.cjs.map +1 -0
  304. package/dist/icons/components/UiFormFields.d.ts +9 -0
  305. package/dist/icons/components/UiFormFields.d.ts.map +1 -0
  306. package/dist/icons/components/UiFormFields.js +31 -0
  307. package/dist/icons/components/UiFormFields.js.map +1 -0
  308. package/dist/icons/components/UiFormStep.cjs +38 -0
  309. package/dist/icons/components/UiFormStep.cjs.map +1 -0
  310. package/dist/icons/components/UiFormStep.d.ts +9 -0
  311. package/dist/icons/components/UiFormStep.d.ts.map +1 -0
  312. package/dist/icons/components/UiFormStep.js +36 -0
  313. package/dist/icons/components/UiFormStep.js.map +1 -0
  314. package/dist/icons/components/UiGatewayApi.cjs +32 -0
  315. package/dist/icons/components/UiGatewayApi.cjs.map +1 -0
  316. package/dist/icons/components/UiGatewayApi.d.ts +9 -0
  317. package/dist/icons/components/UiGatewayApi.d.ts.map +1 -0
  318. package/dist/icons/components/UiGatewayApi.js +30 -0
  319. package/dist/icons/components/UiGatewayApi.js.map +1 -0
  320. package/dist/icons/components/UiImportArrow.cjs +29 -0
  321. package/dist/icons/components/UiImportArrow.cjs.map +1 -0
  322. package/dist/icons/components/UiImportArrow.d.ts +9 -0
  323. package/dist/icons/components/UiImportArrow.d.ts.map +1 -0
  324. package/dist/icons/components/UiImportArrow.js +27 -0
  325. package/dist/icons/components/UiImportArrow.js.map +1 -0
  326. package/dist/icons/components/UiInputField.cjs +33 -0
  327. package/dist/icons/components/UiInputField.cjs.map +1 -0
  328. package/dist/icons/components/UiInputField.d.ts +9 -0
  329. package/dist/icons/components/UiInputField.d.ts.map +1 -0
  330. package/dist/icons/components/UiInputField.js +31 -0
  331. package/dist/icons/components/UiInputField.js.map +1 -0
  332. package/dist/icons/components/UiInsertTable.cjs +29 -0
  333. package/dist/icons/components/UiInsertTable.cjs.map +1 -0
  334. package/dist/icons/components/UiInsertTable.d.ts +9 -0
  335. package/dist/icons/components/UiInsertTable.d.ts.map +1 -0
  336. package/dist/icons/components/UiInsertTable.js +27 -0
  337. package/dist/icons/components/UiInsertTable.js.map +1 -0
  338. package/dist/icons/components/UiLayoutTemplate.cjs +32 -0
  339. package/dist/icons/components/UiLayoutTemplate.cjs.map +1 -0
  340. package/dist/icons/components/UiLayoutTemplate.d.ts +9 -0
  341. package/dist/icons/components/UiLayoutTemplate.d.ts.map +1 -0
  342. package/dist/icons/components/UiLayoutTemplate.js +30 -0
  343. package/dist/icons/components/UiLayoutTemplate.js.map +1 -0
  344. package/dist/icons/components/UiLayoutWindow.cjs +56 -0
  345. package/dist/icons/components/UiLayoutWindow.cjs.map +1 -0
  346. package/dist/icons/components/UiLayoutWindow.d.ts +15 -0
  347. package/dist/icons/components/UiLayoutWindow.d.ts.map +1 -0
  348. package/dist/icons/components/UiLayoutWindow.js +53 -0
  349. package/dist/icons/components/UiLayoutWindow.js.map +1 -0
  350. package/dist/icons/components/UiListEnd.cjs +33 -0
  351. package/dist/icons/components/UiListEnd.cjs.map +1 -0
  352. package/dist/icons/components/UiListEnd.d.ts +9 -0
  353. package/dist/icons/components/UiListEnd.d.ts.map +1 -0
  354. package/dist/icons/components/UiListEnd.js +31 -0
  355. package/dist/icons/components/UiListEnd.js.map +1 -0
  356. package/dist/icons/components/UiListEndLine.cjs +51 -0
  357. package/dist/icons/components/UiListEndLine.cjs.map +1 -0
  358. package/dist/icons/components/UiListEndLine.d.ts +15 -0
  359. package/dist/icons/components/UiListEndLine.d.ts.map +1 -0
  360. package/dist/icons/components/UiListEndLine.js +48 -0
  361. package/dist/icons/components/UiListEndLine.js.map +1 -0
  362. package/dist/icons/components/UiListNumbers.cjs +51 -0
  363. package/dist/icons/components/UiListNumbers.cjs.map +1 -0
  364. package/dist/icons/components/UiListNumbers.d.ts +15 -0
  365. package/dist/icons/components/UiListNumbers.d.ts.map +1 -0
  366. package/dist/icons/components/UiListNumbers.js +48 -0
  367. package/dist/icons/components/UiListNumbers.js.map +1 -0
  368. package/dist/icons/components/UiLowPriority.cjs +29 -0
  369. package/dist/icons/components/UiLowPriority.cjs.map +1 -0
  370. package/dist/icons/components/UiLowPriority.d.ts +9 -0
  371. package/dist/icons/components/UiLowPriority.d.ts.map +1 -0
  372. package/dist/icons/components/UiLowPriority.js +27 -0
  373. package/dist/icons/components/UiLowPriority.js.map +1 -0
  374. package/dist/icons/components/UiMergeQueue.cjs +38 -0
  375. package/dist/icons/components/UiMergeQueue.cjs.map +1 -0
  376. package/dist/icons/components/UiMergeQueue.d.ts +9 -0
  377. package/dist/icons/components/UiMergeQueue.d.ts.map +1 -0
  378. package/dist/icons/components/UiMergeQueue.js +36 -0
  379. package/dist/icons/components/UiMergeQueue.js.map +1 -0
  380. package/dist/icons/components/UiPipelineStage.cjs +33 -0
  381. package/dist/icons/components/UiPipelineStage.cjs.map +1 -0
  382. package/dist/icons/components/UiPipelineStage.d.ts +9 -0
  383. package/dist/icons/components/UiPipelineStage.d.ts.map +1 -0
  384. package/dist/icons/components/UiPipelineStage.js +31 -0
  385. package/dist/icons/components/UiPipelineStage.js.map +1 -0
  386. package/dist/icons/components/UiPlaylistRemove.cjs +29 -0
  387. package/dist/icons/components/UiPlaylistRemove.cjs.map +1 -0
  388. package/dist/icons/components/UiPlaylistRemove.d.ts +9 -0
  389. package/dist/icons/components/UiPlaylistRemove.d.ts.map +1 -0
  390. package/dist/icons/components/UiPlaylistRemove.js +27 -0
  391. package/dist/icons/components/UiPlaylistRemove.js.map +1 -0
  392. package/dist/icons/components/UiReportForms.cjs +51 -0
  393. package/dist/icons/components/UiReportForms.cjs.map +1 -0
  394. package/dist/icons/components/UiReportForms.d.ts +15 -0
  395. package/dist/icons/components/UiReportForms.d.ts.map +1 -0
  396. package/dist/icons/components/UiReportForms.js +48 -0
  397. package/dist/icons/components/UiReportForms.js.map +1 -0
  398. package/dist/icons/components/UiScreenTemplate.cjs +29 -0
  399. package/dist/icons/components/UiScreenTemplate.cjs.map +1 -0
  400. package/dist/icons/components/UiScreenTemplate.d.ts +9 -0
  401. package/dist/icons/components/UiScreenTemplate.d.ts.map +1 -0
  402. package/dist/icons/components/UiScreenTemplate.js +27 -0
  403. package/dist/icons/components/UiScreenTemplate.js.map +1 -0
  404. package/dist/icons/components/UiServices.cjs +29 -0
  405. package/dist/icons/components/UiServices.cjs.map +1 -0
  406. package/dist/icons/components/UiServices.d.ts +9 -0
  407. package/dist/icons/components/UiServices.d.ts.map +1 -0
  408. package/dist/icons/components/UiServices.js +27 -0
  409. package/dist/icons/components/UiServices.js.map +1 -0
  410. package/dist/icons/components/UiSkipCircle.cjs +51 -0
  411. package/dist/icons/components/UiSkipCircle.cjs.map +1 -0
  412. package/dist/icons/components/UiSkipCircle.d.ts +15 -0
  413. package/dist/icons/components/UiSkipCircle.d.ts.map +1 -0
  414. package/dist/icons/components/UiSkipCircle.js +48 -0
  415. package/dist/icons/components/UiSkipCircle.js.map +1 -0
  416. package/dist/icons/components/UiTaskBatch.cjs +33 -0
  417. package/dist/icons/components/UiTaskBatch.cjs.map +1 -0
  418. package/dist/icons/components/UiTaskBatch.d.ts +9 -0
  419. package/dist/icons/components/UiTaskBatch.d.ts.map +1 -0
  420. package/dist/icons/components/UiTaskBatch.js +31 -0
  421. package/dist/icons/components/UiTaskBatch.js.map +1 -0
  422. package/dist/icons/components/UiTodoList.cjs +29 -0
  423. package/dist/icons/components/UiTodoList.cjs.map +1 -0
  424. package/dist/icons/components/UiTodoList.d.ts +9 -0
  425. package/dist/icons/components/UiTodoList.d.ts.map +1 -0
  426. package/dist/icons/components/UiTodoList.js +27 -0
  427. package/dist/icons/components/UiTodoList.js.map +1 -0
  428. package/dist/icons/components/UiTrayArrowDown.cjs +51 -0
  429. package/dist/icons/components/UiTrayArrowDown.cjs.map +1 -0
  430. package/dist/icons/components/UiTrayArrowDown.d.ts +15 -0
  431. package/dist/icons/components/UiTrayArrowDown.d.ts.map +1 -0
  432. package/dist/icons/components/UiTrayArrowDown.js +48 -0
  433. package/dist/icons/components/UiTrayArrowDown.js.map +1 -0
  434. package/dist/icons/components/UiVault.cjs +51 -0
  435. package/dist/icons/components/UiVault.cjs.map +1 -0
  436. package/dist/icons/components/UiVault.d.ts +15 -0
  437. package/dist/icons/components/UiVault.d.ts.map +1 -0
  438. package/dist/icons/components/UiVault.js +48 -0
  439. package/dist/icons/components/UiVault.js.map +1 -0
  440. package/dist/icons/components/UiWebServiceDefinition.cjs +39 -0
  441. package/dist/icons/components/UiWebServiceDefinition.cjs.map +1 -0
  442. package/dist/icons/components/UiWebServiceDefinition.d.ts +9 -0
  443. package/dist/icons/components/UiWebServiceDefinition.d.ts.map +1 -0
  444. package/dist/icons/components/UiWebServiceDefinition.js +37 -0
  445. package/dist/icons/components/UiWebServiceDefinition.js.map +1 -0
  446. package/dist/icons/components/UiWebhook.cjs +29 -0
  447. package/dist/icons/components/UiWebhook.cjs.map +1 -0
  448. package/dist/icons/components/UiWebhook.d.ts +9 -0
  449. package/dist/icons/components/UiWebhook.d.ts.map +1 -0
  450. package/dist/icons/components/UiWebhook.js +27 -0
  451. package/dist/icons/components/UiWebhook.js.map +1 -0
  452. package/dist/icons/components/UiWebhookLine.cjs +51 -0
  453. package/dist/icons/components/UiWebhookLine.cjs.map +1 -0
  454. package/dist/icons/components/UiWebhookLine.d.ts +15 -0
  455. package/dist/icons/components/UiWebhookLine.d.ts.map +1 -0
  456. package/dist/icons/components/UiWebhookLine.js +48 -0
  457. package/dist/icons/components/UiWebhookLine.js.map +1 -0
  458. package/dist/icons/index.d.ts +58 -0
  459. package/dist/icons/index.d.ts.map +1 -1
  460. package/dist/icons/registry.cjs +90 -0
  461. package/dist/icons/registry.cjs.map +1 -1
  462. package/dist/icons/registry.d.ts.map +1 -1
  463. package/dist/icons/registry.js +90 -0
  464. package/dist/icons/registry.js.map +1 -1
  465. package/dist/icons.cjs +103 -0
  466. package/dist/icons.js +46 -1
  467. package/dist/index.cjs +128 -3
  468. package/dist/index.js +59 -4
  469. package/dist/overlay/DropdownMenu.cjs +17 -14
  470. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  471. package/dist/overlay/DropdownMenu.d.ts +1 -0
  472. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  473. package/dist/overlay/DropdownMenu.js +18 -15
  474. package/dist/overlay/DropdownMenu.js.map +1 -1
  475. package/dist/rpc/EntityExplorerApp.cjs +49 -12
  476. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  477. package/dist/rpc/EntityExplorerApp.d.ts +10 -1
  478. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  479. package/dist/rpc/EntityExplorerApp.js +51 -14
  480. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  481. package/dist/rpc/EntitySurface.cjs +38 -0
  482. package/dist/rpc/EntitySurface.cjs.map +1 -0
  483. package/dist/rpc/EntitySurface.d.ts +17 -0
  484. package/dist/rpc/EntitySurface.d.ts.map +1 -0
  485. package/dist/rpc/EntitySurface.js +38 -0
  486. package/dist/rpc/EntitySurface.js.map +1 -0
  487. package/dist/rpc/ExplorerNav.cjs +48 -0
  488. package/dist/rpc/ExplorerNav.cjs.map +1 -0
  489. package/dist/rpc/ExplorerNav.d.ts +12 -0
  490. package/dist/rpc/ExplorerNav.d.ts.map +1 -0
  491. package/dist/rpc/ExplorerNav.js +48 -0
  492. package/dist/rpc/ExplorerNav.js.map +1 -0
  493. package/dist/rpc/explorer-nav-context.cjs +5 -0
  494. package/dist/rpc/explorer-nav-context.cjs.map +1 -0
  495. package/dist/rpc/explorer-nav-context.d.ts +11 -0
  496. package/dist/rpc/explorer-nav-context.d.ts.map +1 -0
  497. package/dist/rpc/explorer-nav-context.js +6 -0
  498. package/dist/rpc/explorer-nav-context.js.map +1 -0
  499. package/dist/rpc.cjs +4 -0
  500. package/dist/rpc.d.ts +2 -0
  501. package/dist/rpc.d.ts.map +1 -1
  502. package/dist/rpc.js +3 -1
  503. package/dist/styles.css +1 -1
  504. package/package.json +6 -1
@@ -117,6 +117,15 @@ function summarizePrompts(prompts) {
117
117
  expired: 0
118
118
  });
119
119
  }
120
+ var STATE_RANK = {
121
+ pending: 0,
122
+ answered: 1
123
+ };
124
+ /** Pending prompts first, then answered, then closed (cancelled, expired); each group keeps its order. */
125
+ function orderPrompts(prompts) {
126
+ const rank = (prompt) => STATE_RANK[prompt.state] ?? 2;
127
+ return [...prompts].sort((a, b) => rank(a) - rank(b));
128
+ }
120
129
  function summarizePromptAnswer(prompt) {
121
130
  if (prompt.cancelled || prompt.state === "cancelled") return "Cancelled";
122
131
  if (prompt.state === "expired") return "Expired";
@@ -142,6 +151,7 @@ function summarizePromptAnswer(prompt) {
142
151
  exports.analyzePromptInlineActions = analyzePromptInlineActions;
143
152
  exports.buildPromptInlineValues = buildPromptInlineValues;
144
153
  exports.initialPromptComment = initialPromptComment;
154
+ exports.orderPrompts = orderPrompts;
145
155
  exports.summarizePromptAnswer = summarizePromptAnswer;
146
156
  exports.summarizePrompts = summarizePrompts;
147
157
 
@@ -1 +1 @@
1
- {"version":3,"file":"PromptBanner.model.cjs","names":[],"sources":["../../src/data/PromptBanner.model.ts"],"sourcesContent":["import type { JsonSchemaObject, JsonSchemaProperty } from \"../components/json-schema-form-types\";\nimport type { PromptSnapshot } from \"../hooks/use-prompts\";\n\nexport type PromptInlineDecision = \"approve\" | \"reject\";\n\nexport interface PromptInlineActionSpec {\n field: string;\n approveValue: unknown;\n rejectValue: unknown;\n commentField?: string;\n commentRequired: boolean;\n commentLabel?: string;\n}\n\nexport interface PromptSummary {\n total: number;\n pending: number;\n answered: number;\n cancelled: number;\n expired: number;\n}\n\nconst ACTION_FIELD_PRIORITY = [\"decision\", \"choice\", \"action\", \"value\", \"approve\", \"approved\"];\nconst COMMENT_FIELD_PRIORITY = [\"comment\", \"reason\", \"message\", \"note\"];\n\nconst APPROVE_RE = /\\b(approve|approved|allow|allowed|continue|yes|accept|accepted|proceed|run)\\b/i;\nconst REJECT_RE = /\\b(reject|rejected|deny|denied|cancel|cancelled|canceled|no|block|stop|decline|declined)\\b/i;\n\nfunction hasType(schema: JsonSchemaProperty | undefined, type: string): boolean {\n if (!schema?.type) return false;\n return Array.isArray(schema.type) ? schema.type.includes(type as never) : schema.type === type;\n}\n\nfunction sortedPropertyEntries(schema: JsonSchemaObject): [string, JsonSchemaProperty][] {\n const entries = Object.entries(schema.properties ?? {});\n return entries.sort(([a], [b]) => {\n const ia = ACTION_FIELD_PRIORITY.indexOf(a);\n const ib = ACTION_FIELD_PRIORITY.indexOf(b);\n if (ia === -1 && ib === -1) return 0;\n if (ia === -1) return 1;\n if (ib === -1) return -1;\n return ia - ib;\n });\n}\n\nfunction optionText(schema: JsonSchemaProperty, value: unknown): string {\n const key = String(value);\n const label = schema[\"x-enum-labels\"]?.[key];\n return [key, label].filter(Boolean).join(\" \");\n}\n\nfunction findCommentField(schema: JsonSchemaObject): Pick<\n PromptInlineActionSpec,\n \"commentField\" | \"commentRequired\" | \"commentLabel\"\n> {\n const properties = schema.properties ?? {};\n const required = new Set(schema.required ?? []);\n for (const key of COMMENT_FIELD_PRIORITY) {\n const property = properties[key];\n if (!property || !hasType(property, \"string\") || property.enum) continue;\n return {\n commentField: key,\n commentRequired: required.has(key),\n commentLabel: property.title ?? \"Comment\",\n };\n }\n return { commentRequired: false };\n}\n\nfunction findEnumAction(schema: JsonSchemaObject): PromptInlineActionSpec | null {\n for (const [field, property] of sortedPropertyEntries(schema)) {\n const values = property.enum ?? [];\n if (values.length === 0) continue;\n\n const approve = values.find((value) => APPROVE_RE.test(optionText(property, value)));\n const reject = values.find((value) => REJECT_RE.test(optionText(property, value)));\n if (approve === undefined || reject === undefined) continue;\n\n return {\n field,\n approveValue: approve,\n rejectValue: reject,\n ...findCommentField(schema),\n };\n }\n return null;\n}\n\nfunction findBooleanAction(schema: JsonSchemaObject): PromptInlineActionSpec | null {\n const properties = schema.properties ?? {};\n const preferred = [\"value\", \"approve\", \"approved\", \"confirm\", \"confirmed\", \"allowed\"];\n const field =\n preferred.find((key) => hasType(properties[key], \"boolean\")) ??\n Object.entries(properties).find(([, property]) => hasType(property, \"boolean\"))?.[0];\n\n if (!field) return null;\n return {\n field,\n approveValue: true,\n rejectValue: false,\n ...findCommentField(schema),\n };\n}\n\nexport function analyzePromptInlineActions(prompt: PromptSnapshot): PromptInlineActionSpec | null {\n const schema = prompt.schema;\n if (!schema?.properties) return null;\n return findEnumAction(schema) ?? findBooleanAction(schema);\n}\n\nexport function initialPromptComment(prompt: PromptSnapshot, spec: PromptInlineActionSpec | null): string {\n if (!spec?.commentField) return \"\";\n const value = prompt.value?.[spec.commentField];\n return typeof value === \"string\" ? value : \"\";\n}\n\nexport function buildPromptInlineValues(\n prompt: PromptSnapshot,\n spec: PromptInlineActionSpec,\n decision: PromptInlineDecision,\n comment: string,\n): Record<string, unknown> {\n const values: Record<string, unknown> = { ...prompt.value };\n values[spec.field] = decision === \"approve\" ? spec.approveValue : spec.rejectValue;\n\n if (spec.commentField) {\n const trimmed = comment.trim();\n if (trimmed || spec.commentRequired) {\n values[spec.commentField] = trimmed;\n } else {\n delete values[spec.commentField];\n }\n }\n\n return values;\n}\n\nexport function summarizePrompts(prompts: PromptSnapshot[]): PromptSummary {\n return prompts.reduce<PromptSummary>(\n (acc, prompt) => {\n acc.total += 1;\n if (prompt.state === \"pending\") acc.pending += 1;\n else if (prompt.state === \"answered\") acc.answered += 1;\n else if (prompt.state === \"cancelled\") acc.cancelled += 1;\n else if (prompt.state === \"expired\") acc.expired += 1;\n return acc;\n },\n { total: 0, pending: 0, answered: 0, cancelled: 0, expired: 0 },\n );\n}\n\nexport function summarizePromptAnswer(prompt: PromptSnapshot): string {\n if (prompt.cancelled || prompt.state === \"cancelled\") return \"Cancelled\";\n if (prompt.state === \"expired\") return \"Expired\";\n if (prompt.state === \"pending\") return prompt.kind ? `Pending ${prompt.kind}` : \"Pending\";\n\n const values = prompt.value ?? {};\n const spec = analyzePromptInlineActions(prompt);\n const parts: string[] = [];\n if (spec && spec.field in values) {\n if (Object.is(values[spec.field], spec.approveValue)) parts.push(\"Approved\");\n else if (Object.is(values[spec.field], spec.rejectValue)) parts.push(\"Rejected\");\n }\n if (spec?.commentField) {\n const comment = values[spec.commentField];\n if (typeof comment === \"string\" && comment) parts.push(comment);\n }\n if (parts.length > 0) return parts.join(\" - \");\n\n const primitive = Object.entries(values)\n .filter(([, value]) => [\"string\", \"number\", \"boolean\"].includes(typeof value))\n .slice(0, 2)\n .map(([key, value]) => `${key}: ${String(value)}`);\n return primitive.join(\" - \") || prompt.state;\n}\n"],"mappings":";AAsBA,IAAM,wBAAwB;CAAC;CAAY;CAAU;CAAU;CAAS;CAAW;AAAU;AAC7F,IAAM,yBAAyB;CAAC;CAAW;CAAU;CAAW;AAAM;AAEtE,IAAM,aAAa;AACnB,IAAM,YAAY;AAElB,SAAS,QAAQ,QAAwC,MAAuB;CAC9E,IAAI,CAAC,QAAQ,MAAM,OAAO;CAC1B,OAAO,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,KAAK,SAAS,IAAa,IAAI,OAAO,SAAS;AAC5F;AAEA,SAAS,sBAAsB,QAA0D;CAEvF,OADgB,OAAO,QAAQ,OAAO,cAAc,CAAC,CAC9C,CAAA,CAAQ,MAAM,CAAC,IAAI,CAAC,OAAO;EAChC,MAAM,KAAK,sBAAsB,QAAQ,CAAC;EAC1C,MAAM,KAAK,sBAAsB,QAAQ,CAAC;EAC1C,IAAI,OAAO,MAAM,OAAO,IAAI,OAAO;EACnC,IAAI,OAAO,IAAI,OAAO;EACtB,IAAI,OAAO,IAAI,OAAO;EACtB,OAAO,KAAK;CACd,CAAC;AACH;AAEA,SAAS,WAAW,QAA4B,OAAwB;CACtE,MAAM,MAAM,OAAO,KAAK;CAExB,OAAO,CAAC,KADM,OAAO,gBAAgB,GAAG,IACtB,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AAC9C;AAEA,SAAS,iBAAiB,QAGxB;CACA,MAAM,aAAa,OAAO,cAAc,CAAC;CACzC,MAAM,WAAW,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC;CAC9C,KAAK,MAAM,OAAO,wBAAwB;EACxC,MAAM,WAAW,WAAW;EAC5B,IAAI,CAAC,YAAY,CAAC,QAAQ,UAAU,QAAQ,KAAK,SAAS,MAAM;EAChE,OAAO;GACL,cAAc;GACd,iBAAiB,SAAS,IAAI,GAAG;GACjC,cAAc,SAAS,SAAS;EAClC;CACF;CACA,OAAO,EAAE,iBAAiB,MAAM;AAClC;AAEA,SAAS,eAAe,QAAyD;CAC/E,KAAK,MAAM,CAAC,OAAO,aAAa,sBAAsB,MAAM,GAAG;EAC7D,MAAM,SAAS,SAAS,QAAQ,CAAC;EACjC,IAAI,OAAO,WAAW,GAAG;EAEzB,MAAM,UAAU,OAAO,MAAM,UAAU,WAAW,KAAK,WAAW,UAAU,KAAK,CAAC,CAAC;EACnF,MAAM,SAAS,OAAO,MAAM,UAAU,UAAU,KAAK,WAAW,UAAU,KAAK,CAAC,CAAC;EACjF,IAAI,YAAY,KAAA,KAAa,WAAW,KAAA,GAAW;EAEnD,OAAO;GACL;GACA,cAAc;GACd,aAAa;GACb,GAAG,iBAAiB,MAAM;EAC5B;CACF;CACA,OAAO;AACT;AAEA,SAAS,kBAAkB,QAAyD;CAClF,MAAM,aAAa,OAAO,cAAc,CAAC;CAEzC,MAAM,QACJ;EAFiB;EAAS;EAAW;EAAY;EAAW;EAAa;CAEzE,CAAA,CAAU,MAAM,QAAQ,QAAQ,WAAW,MAAM,SAAS,CAAC,KAC3D,OAAO,QAAQ,UAAU,CAAC,CAAC,MAAM,GAAG,cAAc,QAAQ,UAAU,SAAS,CAAC,CAAC,GAAG;CAEpF,IAAI,CAAC,OAAO,OAAO;CACnB,OAAO;EACL;EACA,cAAc;EACd,aAAa;EACb,GAAG,iBAAiB,MAAM;CAC5B;AACF;AAEA,SAAgB,2BAA2B,QAAuD;CAChG,MAAM,SAAS,OAAO;CACtB,IAAI,CAAC,QAAQ,YAAY,OAAO;CAChC,OAAO,eAAe,MAAM,KAAK,kBAAkB,MAAM;AAC3D;AAEA,SAAgB,qBAAqB,QAAwB,MAA6C;CACxG,IAAI,CAAC,MAAM,cAAc,OAAO;CAChC,MAAM,QAAQ,OAAO,QAAQ,KAAK;CAClC,OAAO,OAAO,UAAU,WAAW,QAAQ;AAC7C;AAEA,SAAgB,wBACd,QACA,MACA,UACA,SACyB;CACzB,MAAM,SAAkC,EAAE,GAAG,OAAO,MAAM;CAC1D,OAAO,KAAK,SAAS,aAAa,YAAY,KAAK,eAAe,KAAK;CAEvE,IAAI,KAAK,cAAc;EACrB,MAAM,UAAU,QAAQ,KAAK;EAC7B,IAAI,WAAW,KAAK,iBAClB,OAAO,KAAK,gBAAgB;OAE5B,OAAO,OAAO,KAAK;CAEvB;CAEA,OAAO;AACT;AAEA,SAAgB,iBAAiB,SAA0C;CACzE,OAAO,QAAQ,QACZ,KAAK,WAAW;EACf,IAAI,SAAS;EACb,IAAI,OAAO,UAAU,WAAW,IAAI,WAAW;OAC1C,IAAI,OAAO,UAAU,YAAY,IAAI,YAAY;OACjD,IAAI,OAAO,UAAU,aAAa,IAAI,aAAa;OACnD,IAAI,OAAO,UAAU,WAAW,IAAI,WAAW;EACpD,OAAO;CACT,GACA;EAAE,OAAO;EAAG,SAAS;EAAG,UAAU;EAAG,WAAW;EAAG,SAAS;CAAE,CAChE;AACF;AAEA,SAAgB,sBAAsB,QAAgC;CACpE,IAAI,OAAO,aAAa,OAAO,UAAU,aAAa,OAAO;CAC7D,IAAI,OAAO,UAAU,WAAW,OAAO;CACvC,IAAI,OAAO,UAAU,WAAW,OAAO,OAAO,OAAO,WAAW,OAAO,SAAS;CAEhF,MAAM,SAAS,OAAO,SAAS,CAAC;CAChC,MAAM,OAAO,2BAA2B,MAAM;CAC9C,MAAM,QAAkB,CAAC;CACzB,IAAI,QAAQ,KAAK,SAAS,QAAQ;EAChC,IAAI,OAAO,GAAG,OAAO,KAAK,QAAQ,KAAK,YAAY,GAAG,MAAM,KAAK,UAAU;OACtE,IAAI,OAAO,GAAG,OAAO,KAAK,QAAQ,KAAK,WAAW,GAAG,MAAM,KAAK,UAAU;CACjF;CACA,IAAI,MAAM,cAAc;EACtB,MAAM,UAAU,OAAO,KAAK;EAC5B,IAAI,OAAO,YAAY,YAAY,SAAS,MAAM,KAAK,OAAO;CAChE;CACA,IAAI,MAAM,SAAS,GAAG,OAAO,MAAM,KAAK,KAAK;CAM7C,OAJkB,OAAO,QAAQ,MAAM,CAAC,CACrC,QAAQ,GAAG,WAAW;EAAC;EAAU;EAAU;CAAS,CAAC,CAAC,SAAS,OAAO,KAAK,CAAC,CAAC,CAC7E,MAAM,GAAG,CAAC,CAAC,CACX,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,IAAI,OAAO,KAAK,GACzC,CAAA,CAAU,KAAK,KAAK,KAAK,OAAO;AACzC"}
1
+ {"version":3,"file":"PromptBanner.model.cjs","names":[],"sources":["../../src/data/PromptBanner.model.ts"],"sourcesContent":["import type { JsonSchemaObject, JsonSchemaProperty } from \"../components/json-schema-form-types\";\nimport type { PromptSnapshot } from \"../hooks/use-prompts\";\n\nexport type PromptInlineDecision = \"approve\" | \"reject\";\n\nexport interface PromptInlineActionSpec {\n field: string;\n approveValue: unknown;\n rejectValue: unknown;\n commentField?: string;\n commentRequired: boolean;\n commentLabel?: string;\n}\n\nexport interface PromptSummary {\n total: number;\n pending: number;\n answered: number;\n cancelled: number;\n expired: number;\n}\n\nconst ACTION_FIELD_PRIORITY = [\"decision\", \"choice\", \"action\", \"value\", \"approve\", \"approved\"];\nconst COMMENT_FIELD_PRIORITY = [\"comment\", \"reason\", \"message\", \"note\"];\n\nconst APPROVE_RE = /\\b(approve|approved|allow|allowed|continue|yes|accept|accepted|proceed|run)\\b/i;\nconst REJECT_RE = /\\b(reject|rejected|deny|denied|cancel|cancelled|canceled|no|block|stop|decline|declined)\\b/i;\n\nfunction hasType(schema: JsonSchemaProperty | undefined, type: string): boolean {\n if (!schema?.type) return false;\n return Array.isArray(schema.type) ? schema.type.includes(type as never) : schema.type === type;\n}\n\nfunction sortedPropertyEntries(schema: JsonSchemaObject): [string, JsonSchemaProperty][] {\n const entries = Object.entries(schema.properties ?? {});\n return entries.sort(([a], [b]) => {\n const ia = ACTION_FIELD_PRIORITY.indexOf(a);\n const ib = ACTION_FIELD_PRIORITY.indexOf(b);\n if (ia === -1 && ib === -1) return 0;\n if (ia === -1) return 1;\n if (ib === -1) return -1;\n return ia - ib;\n });\n}\n\nfunction optionText(schema: JsonSchemaProperty, value: unknown): string {\n const key = String(value);\n const label = schema[\"x-enum-labels\"]?.[key];\n return [key, label].filter(Boolean).join(\" \");\n}\n\nfunction findCommentField(schema: JsonSchemaObject): Pick<\n PromptInlineActionSpec,\n \"commentField\" | \"commentRequired\" | \"commentLabel\"\n> {\n const properties = schema.properties ?? {};\n const required = new Set(schema.required ?? []);\n for (const key of COMMENT_FIELD_PRIORITY) {\n const property = properties[key];\n if (!property || !hasType(property, \"string\") || property.enum) continue;\n return {\n commentField: key,\n commentRequired: required.has(key),\n commentLabel: property.title ?? \"Comment\",\n };\n }\n return { commentRequired: false };\n}\n\nfunction findEnumAction(schema: JsonSchemaObject): PromptInlineActionSpec | null {\n for (const [field, property] of sortedPropertyEntries(schema)) {\n const values = property.enum ?? [];\n if (values.length === 0) continue;\n\n const approve = values.find((value) => APPROVE_RE.test(optionText(property, value)));\n const reject = values.find((value) => REJECT_RE.test(optionText(property, value)));\n if (approve === undefined || reject === undefined) continue;\n\n return {\n field,\n approveValue: approve,\n rejectValue: reject,\n ...findCommentField(schema),\n };\n }\n return null;\n}\n\nfunction findBooleanAction(schema: JsonSchemaObject): PromptInlineActionSpec | null {\n const properties = schema.properties ?? {};\n const preferred = [\"value\", \"approve\", \"approved\", \"confirm\", \"confirmed\", \"allowed\"];\n const field =\n preferred.find((key) => hasType(properties[key], \"boolean\")) ??\n Object.entries(properties).find(([, property]) => hasType(property, \"boolean\"))?.[0];\n\n if (!field) return null;\n return {\n field,\n approveValue: true,\n rejectValue: false,\n ...findCommentField(schema),\n };\n}\n\nexport function analyzePromptInlineActions(prompt: PromptSnapshot): PromptInlineActionSpec | null {\n const schema = prompt.schema;\n if (!schema?.properties) return null;\n return findEnumAction(schema) ?? findBooleanAction(schema);\n}\n\nexport function initialPromptComment(prompt: PromptSnapshot, spec: PromptInlineActionSpec | null): string {\n if (!spec?.commentField) return \"\";\n const value = prompt.value?.[spec.commentField];\n return typeof value === \"string\" ? value : \"\";\n}\n\nexport function buildPromptInlineValues(\n prompt: PromptSnapshot,\n spec: PromptInlineActionSpec,\n decision: PromptInlineDecision,\n comment: string,\n): Record<string, unknown> {\n const values: Record<string, unknown> = { ...prompt.value };\n values[spec.field] = decision === \"approve\" ? spec.approveValue : spec.rejectValue;\n\n if (spec.commentField) {\n const trimmed = comment.trim();\n if (trimmed || spec.commentRequired) {\n values[spec.commentField] = trimmed;\n } else {\n delete values[spec.commentField];\n }\n }\n\n return values;\n}\n\nexport function summarizePrompts(prompts: PromptSnapshot[]): PromptSummary {\n return prompts.reduce<PromptSummary>(\n (acc, prompt) => {\n acc.total += 1;\n if (prompt.state === \"pending\") acc.pending += 1;\n else if (prompt.state === \"answered\") acc.answered += 1;\n else if (prompt.state === \"cancelled\") acc.cancelled += 1;\n else if (prompt.state === \"expired\") acc.expired += 1;\n return acc;\n },\n { total: 0, pending: 0, answered: 0, cancelled: 0, expired: 0 },\n );\n}\n\nconst STATE_RANK: Record<string, number> = { pending: 0, answered: 1 };\n\n/** Pending prompts first, then answered, then closed (cancelled, expired); each group keeps its order. */\nexport function orderPrompts(prompts: readonly PromptSnapshot[]): PromptSnapshot[] {\n const rank = (prompt: PromptSnapshot) => STATE_RANK[prompt.state] ?? 2;\n return [...prompts].sort((a, b) => rank(a) - rank(b));\n}\n\nexport function summarizePromptAnswer(prompt: PromptSnapshot): string {\n if (prompt.cancelled || prompt.state === \"cancelled\") return \"Cancelled\";\n if (prompt.state === \"expired\") return \"Expired\";\n if (prompt.state === \"pending\") return prompt.kind ? `Pending ${prompt.kind}` : \"Pending\";\n\n const values = prompt.value ?? {};\n const spec = analyzePromptInlineActions(prompt);\n const parts: string[] = [];\n if (spec && spec.field in values) {\n if (Object.is(values[spec.field], spec.approveValue)) parts.push(\"Approved\");\n else if (Object.is(values[spec.field], spec.rejectValue)) parts.push(\"Rejected\");\n }\n if (spec?.commentField) {\n const comment = values[spec.commentField];\n if (typeof comment === \"string\" && comment) parts.push(comment);\n }\n if (parts.length > 0) return parts.join(\" - \");\n\n const primitive = Object.entries(values)\n .filter(([, value]) => [\"string\", \"number\", \"boolean\"].includes(typeof value))\n .slice(0, 2)\n .map(([key, value]) => `${key}: ${String(value)}`);\n return primitive.join(\" - \") || prompt.state;\n}\n"],"mappings":"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"}
@@ -19,5 +19,7 @@ export declare function analyzePromptInlineActions(prompt: PromptSnapshot): Prom
19
19
  export declare function initialPromptComment(prompt: PromptSnapshot, spec: PromptInlineActionSpec | null): string;
20
20
  export declare function buildPromptInlineValues(prompt: PromptSnapshot, spec: PromptInlineActionSpec, decision: PromptInlineDecision, comment: string): Record<string, unknown>;
21
21
  export declare function summarizePrompts(prompts: PromptSnapshot[]): PromptSummary;
22
+ /** Pending prompts first, then answered, then closed (cancelled, expired); each group keeps its order. */
23
+ export declare function orderPrompts(prompts: readonly PromptSnapshot[]): PromptSnapshot[];
22
24
  export declare function summarizePromptAnswer(prompt: PromptSnapshot): string;
23
25
  //# sourceMappingURL=PromptBanner.model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromptBanner.model.d.ts","sourceRoot":"","sources":["../../src/data/PromptBanner.model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAoFD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,cAAc,GAAG,sBAAsB,GAAG,IAAI,CAIhG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,sBAAsB,GAAG,IAAI,GAAG,MAAM,CAIxG;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,sBAAsB,EAC5B,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,aAAa,CAYzE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAuBpE"}
1
+ {"version":3,"file":"PromptBanner.model.d.ts","sourceRoot":"","sources":["../../src/data/PromptBanner.model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAoFD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,cAAc,GAAG,sBAAsB,GAAG,IAAI,CAIhG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,sBAAsB,GAAG,IAAI,GAAG,MAAM,CAIxG;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,sBAAsB,EAC5B,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,aAAa,CAYzE;AAID,0GAA0G;AAC1G,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,cAAc,EAAE,CAGjF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAuBpE"}
@@ -117,6 +117,15 @@ function summarizePrompts(prompts) {
117
117
  expired: 0
118
118
  });
119
119
  }
120
+ var STATE_RANK = {
121
+ pending: 0,
122
+ answered: 1
123
+ };
124
+ /** Pending prompts first, then answered, then closed (cancelled, expired); each group keeps its order. */
125
+ function orderPrompts(prompts) {
126
+ const rank = (prompt) => STATE_RANK[prompt.state] ?? 2;
127
+ return [...prompts].sort((a, b) => rank(a) - rank(b));
128
+ }
120
129
  function summarizePromptAnswer(prompt) {
121
130
  if (prompt.cancelled || prompt.state === "cancelled") return "Cancelled";
122
131
  if (prompt.state === "expired") return "Expired";
@@ -139,6 +148,6 @@ function summarizePromptAnswer(prompt) {
139
148
  "boolean"
140
149
  ].includes(typeof value)).slice(0, 2).map(([key, value]) => `${key}: ${String(value)}`).join(" - ") || prompt.state;
141
150
  }
142
- export { analyzePromptInlineActions, buildPromptInlineValues, initialPromptComment, summarizePromptAnswer, summarizePrompts };
151
+ export { analyzePromptInlineActions, buildPromptInlineValues, initialPromptComment, orderPrompts, summarizePromptAnswer, summarizePrompts };
143
152
 
144
153
  //# sourceMappingURL=PromptBanner.model.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromptBanner.model.js","names":[],"sources":["../../src/data/PromptBanner.model.ts"],"sourcesContent":["import type { JsonSchemaObject, JsonSchemaProperty } from \"../components/json-schema-form-types\";\nimport type { PromptSnapshot } from \"../hooks/use-prompts\";\n\nexport type PromptInlineDecision = \"approve\" | \"reject\";\n\nexport interface PromptInlineActionSpec {\n field: string;\n approveValue: unknown;\n rejectValue: unknown;\n commentField?: string;\n commentRequired: boolean;\n commentLabel?: string;\n}\n\nexport interface PromptSummary {\n total: number;\n pending: number;\n answered: number;\n cancelled: number;\n expired: number;\n}\n\nconst ACTION_FIELD_PRIORITY = [\"decision\", \"choice\", \"action\", \"value\", \"approve\", \"approved\"];\nconst COMMENT_FIELD_PRIORITY = [\"comment\", \"reason\", \"message\", \"note\"];\n\nconst APPROVE_RE = /\\b(approve|approved|allow|allowed|continue|yes|accept|accepted|proceed|run)\\b/i;\nconst REJECT_RE = /\\b(reject|rejected|deny|denied|cancel|cancelled|canceled|no|block|stop|decline|declined)\\b/i;\n\nfunction hasType(schema: JsonSchemaProperty | undefined, type: string): boolean {\n if (!schema?.type) return false;\n return Array.isArray(schema.type) ? schema.type.includes(type as never) : schema.type === type;\n}\n\nfunction sortedPropertyEntries(schema: JsonSchemaObject): [string, JsonSchemaProperty][] {\n const entries = Object.entries(schema.properties ?? {});\n return entries.sort(([a], [b]) => {\n const ia = ACTION_FIELD_PRIORITY.indexOf(a);\n const ib = ACTION_FIELD_PRIORITY.indexOf(b);\n if (ia === -1 && ib === -1) return 0;\n if (ia === -1) return 1;\n if (ib === -1) return -1;\n return ia - ib;\n });\n}\n\nfunction optionText(schema: JsonSchemaProperty, value: unknown): string {\n const key = String(value);\n const label = schema[\"x-enum-labels\"]?.[key];\n return [key, label].filter(Boolean).join(\" \");\n}\n\nfunction findCommentField(schema: JsonSchemaObject): Pick<\n PromptInlineActionSpec,\n \"commentField\" | \"commentRequired\" | \"commentLabel\"\n> {\n const properties = schema.properties ?? {};\n const required = new Set(schema.required ?? []);\n for (const key of COMMENT_FIELD_PRIORITY) {\n const property = properties[key];\n if (!property || !hasType(property, \"string\") || property.enum) continue;\n return {\n commentField: key,\n commentRequired: required.has(key),\n commentLabel: property.title ?? \"Comment\",\n };\n }\n return { commentRequired: false };\n}\n\nfunction findEnumAction(schema: JsonSchemaObject): PromptInlineActionSpec | null {\n for (const [field, property] of sortedPropertyEntries(schema)) {\n const values = property.enum ?? [];\n if (values.length === 0) continue;\n\n const approve = values.find((value) => APPROVE_RE.test(optionText(property, value)));\n const reject = values.find((value) => REJECT_RE.test(optionText(property, value)));\n if (approve === undefined || reject === undefined) continue;\n\n return {\n field,\n approveValue: approve,\n rejectValue: reject,\n ...findCommentField(schema),\n };\n }\n return null;\n}\n\nfunction findBooleanAction(schema: JsonSchemaObject): PromptInlineActionSpec | null {\n const properties = schema.properties ?? {};\n const preferred = [\"value\", \"approve\", \"approved\", \"confirm\", \"confirmed\", \"allowed\"];\n const field =\n preferred.find((key) => hasType(properties[key], \"boolean\")) ??\n Object.entries(properties).find(([, property]) => hasType(property, \"boolean\"))?.[0];\n\n if (!field) return null;\n return {\n field,\n approveValue: true,\n rejectValue: false,\n ...findCommentField(schema),\n };\n}\n\nexport function analyzePromptInlineActions(prompt: PromptSnapshot): PromptInlineActionSpec | null {\n const schema = prompt.schema;\n if (!schema?.properties) return null;\n return findEnumAction(schema) ?? findBooleanAction(schema);\n}\n\nexport function initialPromptComment(prompt: PromptSnapshot, spec: PromptInlineActionSpec | null): string {\n if (!spec?.commentField) return \"\";\n const value = prompt.value?.[spec.commentField];\n return typeof value === \"string\" ? value : \"\";\n}\n\nexport function buildPromptInlineValues(\n prompt: PromptSnapshot,\n spec: PromptInlineActionSpec,\n decision: PromptInlineDecision,\n comment: string,\n): Record<string, unknown> {\n const values: Record<string, unknown> = { ...prompt.value };\n values[spec.field] = decision === \"approve\" ? spec.approveValue : spec.rejectValue;\n\n if (spec.commentField) {\n const trimmed = comment.trim();\n if (trimmed || spec.commentRequired) {\n values[spec.commentField] = trimmed;\n } else {\n delete values[spec.commentField];\n }\n }\n\n return values;\n}\n\nexport function summarizePrompts(prompts: PromptSnapshot[]): PromptSummary {\n return prompts.reduce<PromptSummary>(\n (acc, prompt) => {\n acc.total += 1;\n if (prompt.state === \"pending\") acc.pending += 1;\n else if (prompt.state === \"answered\") acc.answered += 1;\n else if (prompt.state === \"cancelled\") acc.cancelled += 1;\n else if (prompt.state === \"expired\") acc.expired += 1;\n return acc;\n },\n { total: 0, pending: 0, answered: 0, cancelled: 0, expired: 0 },\n );\n}\n\nexport function summarizePromptAnswer(prompt: PromptSnapshot): string {\n if (prompt.cancelled || prompt.state === \"cancelled\") return \"Cancelled\";\n if (prompt.state === \"expired\") return \"Expired\";\n if (prompt.state === \"pending\") return prompt.kind ? `Pending ${prompt.kind}` : \"Pending\";\n\n const values = prompt.value ?? {};\n const spec = analyzePromptInlineActions(prompt);\n const parts: string[] = [];\n if (spec && spec.field in values) {\n if (Object.is(values[spec.field], spec.approveValue)) parts.push(\"Approved\");\n else if (Object.is(values[spec.field], spec.rejectValue)) parts.push(\"Rejected\");\n }\n if (spec?.commentField) {\n const comment = values[spec.commentField];\n if (typeof comment === \"string\" && comment) parts.push(comment);\n }\n if (parts.length > 0) return parts.join(\" - \");\n\n const primitive = Object.entries(values)\n .filter(([, value]) => [\"string\", \"number\", \"boolean\"].includes(typeof value))\n .slice(0, 2)\n .map(([key, value]) => `${key}: ${String(value)}`);\n return primitive.join(\" - \") || prompt.state;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PromptBanner.model.js","names":[],"sources":["../../src/data/PromptBanner.model.ts"],"sourcesContent":["import type { JsonSchemaObject, JsonSchemaProperty } from \"../components/json-schema-form-types\";\nimport type { PromptSnapshot } from \"../hooks/use-prompts\";\n\nexport type PromptInlineDecision = \"approve\" | \"reject\";\n\nexport interface PromptInlineActionSpec {\n field: string;\n approveValue: unknown;\n rejectValue: unknown;\n commentField?: string;\n commentRequired: boolean;\n commentLabel?: string;\n}\n\nexport interface PromptSummary {\n total: number;\n pending: number;\n answered: number;\n cancelled: number;\n expired: number;\n}\n\nconst ACTION_FIELD_PRIORITY = [\"decision\", \"choice\", \"action\", \"value\", \"approve\", \"approved\"];\nconst COMMENT_FIELD_PRIORITY = [\"comment\", \"reason\", \"message\", \"note\"];\n\nconst APPROVE_RE = /\\b(approve|approved|allow|allowed|continue|yes|accept|accepted|proceed|run)\\b/i;\nconst REJECT_RE = /\\b(reject|rejected|deny|denied|cancel|cancelled|canceled|no|block|stop|decline|declined)\\b/i;\n\nfunction hasType(schema: JsonSchemaProperty | undefined, type: string): boolean {\n if (!schema?.type) return false;\n return Array.isArray(schema.type) ? schema.type.includes(type as never) : schema.type === type;\n}\n\nfunction sortedPropertyEntries(schema: JsonSchemaObject): [string, JsonSchemaProperty][] {\n const entries = Object.entries(schema.properties ?? {});\n return entries.sort(([a], [b]) => {\n const ia = ACTION_FIELD_PRIORITY.indexOf(a);\n const ib = ACTION_FIELD_PRIORITY.indexOf(b);\n if (ia === -1 && ib === -1) return 0;\n if (ia === -1) return 1;\n if (ib === -1) return -1;\n return ia - ib;\n });\n}\n\nfunction optionText(schema: JsonSchemaProperty, value: unknown): string {\n const key = String(value);\n const label = schema[\"x-enum-labels\"]?.[key];\n return [key, label].filter(Boolean).join(\" \");\n}\n\nfunction findCommentField(schema: JsonSchemaObject): Pick<\n PromptInlineActionSpec,\n \"commentField\" | \"commentRequired\" | \"commentLabel\"\n> {\n const properties = schema.properties ?? {};\n const required = new Set(schema.required ?? []);\n for (const key of COMMENT_FIELD_PRIORITY) {\n const property = properties[key];\n if (!property || !hasType(property, \"string\") || property.enum) continue;\n return {\n commentField: key,\n commentRequired: required.has(key),\n commentLabel: property.title ?? \"Comment\",\n };\n }\n return { commentRequired: false };\n}\n\nfunction findEnumAction(schema: JsonSchemaObject): PromptInlineActionSpec | null {\n for (const [field, property] of sortedPropertyEntries(schema)) {\n const values = property.enum ?? [];\n if (values.length === 0) continue;\n\n const approve = values.find((value) => APPROVE_RE.test(optionText(property, value)));\n const reject = values.find((value) => REJECT_RE.test(optionText(property, value)));\n if (approve === undefined || reject === undefined) continue;\n\n return {\n field,\n approveValue: approve,\n rejectValue: reject,\n ...findCommentField(schema),\n };\n }\n return null;\n}\n\nfunction findBooleanAction(schema: JsonSchemaObject): PromptInlineActionSpec | null {\n const properties = schema.properties ?? {};\n const preferred = [\"value\", \"approve\", \"approved\", \"confirm\", \"confirmed\", \"allowed\"];\n const field =\n preferred.find((key) => hasType(properties[key], \"boolean\")) ??\n Object.entries(properties).find(([, property]) => hasType(property, \"boolean\"))?.[0];\n\n if (!field) return null;\n return {\n field,\n approveValue: true,\n rejectValue: false,\n ...findCommentField(schema),\n };\n}\n\nexport function analyzePromptInlineActions(prompt: PromptSnapshot): PromptInlineActionSpec | null {\n const schema = prompt.schema;\n if (!schema?.properties) return null;\n return findEnumAction(schema) ?? findBooleanAction(schema);\n}\n\nexport function initialPromptComment(prompt: PromptSnapshot, spec: PromptInlineActionSpec | null): string {\n if (!spec?.commentField) return \"\";\n const value = prompt.value?.[spec.commentField];\n return typeof value === \"string\" ? value : \"\";\n}\n\nexport function buildPromptInlineValues(\n prompt: PromptSnapshot,\n spec: PromptInlineActionSpec,\n decision: PromptInlineDecision,\n comment: string,\n): Record<string, unknown> {\n const values: Record<string, unknown> = { ...prompt.value };\n values[spec.field] = decision === \"approve\" ? spec.approveValue : spec.rejectValue;\n\n if (spec.commentField) {\n const trimmed = comment.trim();\n if (trimmed || spec.commentRequired) {\n values[spec.commentField] = trimmed;\n } else {\n delete values[spec.commentField];\n }\n }\n\n return values;\n}\n\nexport function summarizePrompts(prompts: PromptSnapshot[]): PromptSummary {\n return prompts.reduce<PromptSummary>(\n (acc, prompt) => {\n acc.total += 1;\n if (prompt.state === \"pending\") acc.pending += 1;\n else if (prompt.state === \"answered\") acc.answered += 1;\n else if (prompt.state === \"cancelled\") acc.cancelled += 1;\n else if (prompt.state === \"expired\") acc.expired += 1;\n return acc;\n },\n { total: 0, pending: 0, answered: 0, cancelled: 0, expired: 0 },\n );\n}\n\nconst STATE_RANK: Record<string, number> = { pending: 0, answered: 1 };\n\n/** Pending prompts first, then answered, then closed (cancelled, expired); each group keeps its order. */\nexport function orderPrompts(prompts: readonly PromptSnapshot[]): PromptSnapshot[] {\n const rank = (prompt: PromptSnapshot) => STATE_RANK[prompt.state] ?? 2;\n return [...prompts].sort((a, b) => rank(a) - rank(b));\n}\n\nexport function summarizePromptAnswer(prompt: PromptSnapshot): string {\n if (prompt.cancelled || prompt.state === \"cancelled\") return \"Cancelled\";\n if (prompt.state === \"expired\") return \"Expired\";\n if (prompt.state === \"pending\") return prompt.kind ? `Pending ${prompt.kind}` : \"Pending\";\n\n const values = prompt.value ?? {};\n const spec = analyzePromptInlineActions(prompt);\n const parts: string[] = [];\n if (spec && spec.field in values) {\n if (Object.is(values[spec.field], spec.approveValue)) parts.push(\"Approved\");\n else if (Object.is(values[spec.field], spec.rejectValue)) parts.push(\"Rejected\");\n }\n if (spec?.commentField) {\n const comment = values[spec.commentField];\n if (typeof comment === \"string\" && comment) parts.push(comment);\n }\n if (parts.length > 0) return parts.join(\" - \");\n\n const primitive = Object.entries(values)\n .filter(([, value]) => [\"string\", \"number\", \"boolean\"].includes(typeof value))\n .slice(0, 2)\n .map(([key, value]) => `${key}: ${String(value)}`);\n return primitive.join(\" - \") || prompt.state;\n}\n"],"mappings":"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"}
@@ -1,57 +1,24 @@
1
- const require_use_prompts = require("../hooks/use-prompts.cjs");
2
- const require_button = require("../components/button.cjs");
3
1
  const require_Modal = require("../overlay/Modal.cjs");
4
- const require_JsonSchemaForm = require("../components/JsonSchemaForm.cjs");
5
- let react = require("react");
2
+ const require_PromptForm = require("./PromptForm.cjs");
6
3
  let react_jsx_runtime = require("react/jsx-runtime");
7
4
  // src/data/PromptDialog.tsx
8
- function PromptDialog({ prompt, basePath, open, onClose, onResolved }) {
9
- const [value, setValue] = (0, react.useState)(() => ({ ...prompt.value }));
10
- const [busy, setBusy] = (0, react.useState)(false);
11
- const [error, setError] = (0, react.useState)(null);
12
- const resolve = async (answer) => {
13
- setBusy(true);
14
- setError(null);
15
- try {
16
- await require_use_prompts.answerPrompt(basePath, prompt.id, answer);
5
+ function PromptDialog({ prompt, basePath, open, onClose, onResolved, lookupFetcher, size = "lg" }) {
6
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_PromptForm.PromptForm, {
7
+ prompt,
8
+ basePath,
9
+ lookupFetcher,
10
+ onResolved: () => {
17
11
  onResolved?.();
18
12
  onClose();
19
- } catch (e) {
20
- setError(e instanceof Error ? e.message : String(e));
21
- } finally {
22
- setBusy(false);
23
- }
24
- };
25
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Modal.Modal, {
26
- open,
27
- onClose,
28
- title: prompt.title,
29
- subtitle: prompt.description,
30
- footer: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
31
- className: "flex items-center justify-end gap-2",
32
- children: [
33
- error ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
34
- className: "mr-auto text-sm text-red-600",
35
- children: error
36
- }) : null,
37
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
38
- variant: "ghost",
39
- disabled: busy,
40
- onClick: () => void resolve({ cancelled: true }),
41
- children: "Cancel"
42
- }),
43
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
44
- disabled: busy,
45
- onClick: () => void resolve({ values: value }),
46
- children: "Submit"
47
- })
48
- ]
49
- }),
50
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_JsonSchemaForm.JsonSchemaForm, {
51
- schema: prompt.schema,
52
- value,
53
- onChange: setValue,
54
- idPrefix: `prompt-${prompt.id}`
13
+ },
14
+ frame: ({ form, actions }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Modal.Modal, {
15
+ open,
16
+ size,
17
+ onClose,
18
+ title: prompt.title,
19
+ subtitle: prompt.description,
20
+ footer: actions,
21
+ children: form
55
22
  })
56
23
  });
57
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PromptDialog.cjs","names":["useState","answerPrompt","Modal","Button","JsonSchemaForm"],"sources":["../../src/data/PromptDialog.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { Modal } from \"../overlay/Modal\";\nimport { answerPrompt, type PromptSnapshot } from \"../hooks/use-prompts\";\n\nexport interface PromptDialogProps {\n /** The pending prompt to answer. Its `schema` drives the rendered form. */\n prompt: PromptSnapshot;\n /** Base path the prompt API is mounted under, e.g. \"/api/todos\". */\n basePath: string;\n open: boolean;\n /** Closes the modal without answering (the prompt stays pending). */\n onClose: () => void;\n /** Called after the prompt is successfully answered or cancelled. */\n onResolved?: (() => void) | undefined;\n}\n\n// PromptDialog renders a pending prompt's JSON Schema via the generic\n// JsonSchemaForm inside a Modal and POSTs the answer back to the prompt manager.\n// It is the human side of the same mechanism an AI model elicits through.\nexport function PromptDialog({ prompt, basePath, open, onClose, onResolved }: PromptDialogProps) {\n const [value, setValue] = useState<Record<string, unknown>>(() => ({ ...prompt.value }));\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const resolve = async (answer: { values?: Record<string, unknown>; cancelled?: boolean }) => {\n setBusy(true);\n setError(null);\n try {\n await answerPrompt(basePath, prompt.id, answer);\n onResolved?.();\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={prompt.title}\n subtitle={prompt.description}\n footer={\n <div className=\"flex items-center justify-end gap-2\">\n {error ? <span className=\"mr-auto text-sm text-red-600\">{error}</span> : null}\n <Button variant=\"ghost\" disabled={busy} onClick={() => void resolve({ cancelled: true })}>\n Cancel\n </Button>\n <Button disabled={busy} onClick={() => void resolve({ values: value })}>\n Submit\n </Button>\n </div>\n }\n >\n <JsonSchemaForm schema={prompt.schema} value={value} onChange={setValue} idPrefix={`prompt-${prompt.id}`} />\n </Modal>\n );\n}\n"],"mappings":";;;;;;;AAqBA,SAAgB,aAAa,EAAE,QAAQ,UAAU,MAAM,SAAS,cAAiC;CAC/F,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,QAAyC,EAAE,GAAG,OAAO,MAAM,EAAE;CACvF,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;CACtC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAwB,IAAI;CAEtD,MAAM,UAAU,OAAO,WAAsE;EAC3F,QAAQ,IAAI;EACZ,SAAS,IAAI;EACb,IAAI;GACF,MAAMC,oBAAAA,aAAa,UAAU,OAAO,IAAI,MAAM;GAC9C,aAAa;GACb,QAAQ;EACV,SAAS,GAAG;GACV,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;EACrD,UAAU;GACR,QAAQ,KAAK;EACf;CACF;CAEA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,OAAD;EACQ;EACG;EACT,OAAO,OAAO;EACd,UAAU,OAAO;EACjB,QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACG,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAU;KAAgC,UAAA;IAAY,CAAA,IAAI;IACzE,iBAAA,GAAA,kBAAA,IAAA,CAACC,eAAAA,QAAD;KAAQ,SAAQ;KAAQ,UAAU;KAAM,eAAe,KAAK,QAAQ,EAAE,WAAW,KAAK,CAAC;KAAG,UAAA;IAElF,CAAA;IACR,iBAAA,GAAA,kBAAA,IAAA,CAACA,eAAAA,QAAD;KAAQ,UAAU;KAAM,eAAe,KAAK,QAAQ,EAAE,QAAQ,MAAM,CAAC;KAAG,UAAA;IAEhE,CAAA;GACL;;EAGP,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,gBAAD;GAAgB,QAAQ,OAAO;GAAe;GAAO,UAAU;GAAU,UAAU,UAAU,OAAO;EAAO,CAAA;CACtG,CAAA;AAEX"}
1
+ {"version":3,"file":"PromptDialog.cjs","names":["PromptForm","Modal"],"sources":["../../src/data/PromptDialog.tsx"],"sourcesContent":["import type { LookupFetcher } from \"../components/json-schema-form-runtime-types\";\nimport { Modal, type ModalSize } from \"../overlay/Modal\";\nimport type { PromptSnapshot } from \"../hooks/use-prompts\";\nimport { PromptForm } from \"./PromptForm\";\n\nexport interface PromptDialogProps {\n /** The pending prompt to answer. Its `schema` drives the rendered form. */\n prompt: PromptSnapshot;\n /** Base path the prompt API is mounted under, e.g. \"/api/todos\". */\n basePath: string;\n open: boolean;\n /** Closes the modal without answering (the prompt stays pending). */\n onClose: () => void;\n /** Called after the prompt is successfully answered or cancelled. */\n onResolved?: (() => void) | undefined;\n /** Resolves the options of the schema's `x-clicky-lookup` fields (e.g. a connection picker). */\n lookupFetcher?: LookupFetcher | undefined;\n /** The dialog width; a form of several fields needs more than a confirm box. */\n size?: ModalSize | undefined;\n}\n\n// PromptDialog is PromptForm inside a Modal: the prompt's title and description\n// head the dialog, Submit/Cancel are pinned in its footer, and answering closes\n// it. It is the human side of the same mechanism an AI model elicits through.\nexport function PromptDialog({ prompt, basePath, open, onClose, onResolved, lookupFetcher, size = \"lg\" }: PromptDialogProps) {\n return (\n <PromptForm\n prompt={prompt}\n basePath={basePath}\n lookupFetcher={lookupFetcher}\n onResolved={() => {\n onResolved?.();\n onClose();\n }}\n frame={({ form, actions }) => (\n <Modal open={open} size={size} onClose={onClose} title={prompt.title} subtitle={prompt.description} footer={actions}>\n {form}\n </Modal>\n )}\n />\n );\n}\n"],"mappings":";;;;AAwBA,SAAgB,aAAa,EAAE,QAAQ,UAAU,MAAM,SAAS,YAAY,eAAe,OAAO,QAA2B;CAC3H,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACA,mBAAAA,YAAD;EACU;EACE;EACK;EACf,kBAAkB;GAChB,aAAa;GACb,QAAQ;EACV;EACA,QAAQ,EAAE,MAAM,cACd,iBAAA,GAAA,kBAAA,IAAA,CAACC,cAAAA,OAAD;GAAa;GAAY;GAAe;GAAS,OAAO,OAAO;GAAO,UAAU,OAAO;GAAa,QAAQ;GACzG,UAAA;EACI,CAAA;CAEV,CAAA;AAEL"}
@@ -1,3 +1,5 @@
1
+ import { LookupFetcher } from '../components/json-schema-form-runtime-types.js';
2
+ import { ModalSize } from '../overlay/Modal.js';
1
3
  import { PromptSnapshot } from '../hooks/use-prompts.js';
2
4
  export interface PromptDialogProps {
3
5
  /** The pending prompt to answer. Its `schema` drives the rendered form. */
@@ -9,6 +11,10 @@ export interface PromptDialogProps {
9
11
  onClose: () => void;
10
12
  /** Called after the prompt is successfully answered or cancelled. */
11
13
  onResolved?: (() => void) | undefined;
14
+ /** Resolves the options of the schema's `x-clicky-lookup` fields (e.g. a connection picker). */
15
+ lookupFetcher?: LookupFetcher | undefined;
16
+ /** The dialog width; a form of several fields needs more than a confirm box. */
17
+ size?: ModalSize | undefined;
12
18
  }
13
- export declare function PromptDialog({ prompt, basePath, open, onClose, onResolved }: PromptDialogProps): import("react").JSX.Element;
19
+ export declare function PromptDialog({ prompt, basePath, open, onClose, onResolved, lookupFetcher, size }: PromptDialogProps): import("react").JSX.Element;
14
20
  //# sourceMappingURL=PromptDialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PromptDialog.d.ts","sourceRoot":"","sources":["../../src/data/PromptDialog.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEzE,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,MAAM,EAAE,cAAc,CAAC;IACvB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,qEAAqE;IACrE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qEAAqE;IACrE,UAAU,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACvC;AAKD,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,iBAAiB,+BAwC9F"}
1
+ {"version":3,"file":"PromptDialog.d.ts","sourceRoot":"","sources":["../../src/data/PromptDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAClF,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,MAAM,EAAE,cAAc,CAAC;IACvB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,qEAAqE;IACrE,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qEAAqE;IACrE,UAAU,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACtC,gGAAgG;IAChG,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC1C,gFAAgF;IAChF,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAC9B;AAKD,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,IAAW,EAAE,EAAE,iBAAiB,+BAiB1H"}
@@ -1,57 +1,24 @@
1
- import { answerPrompt } from "../hooks/use-prompts.js";
2
- import { Button } from "../components/button.js";
3
1
  import { Modal } from "../overlay/Modal.js";
4
- import { JsonSchemaForm } from "../components/JsonSchemaForm.js";
5
- import { useState } from "react";
6
- import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { PromptForm } from "./PromptForm.js";
3
+ import { jsx } from "react/jsx-runtime";
7
4
  // src/data/PromptDialog.tsx
8
- function PromptDialog({ prompt, basePath, open, onClose, onResolved }) {
9
- const [value, setValue] = useState(() => ({ ...prompt.value }));
10
- const [busy, setBusy] = useState(false);
11
- const [error, setError] = useState(null);
12
- const resolve = async (answer) => {
13
- setBusy(true);
14
- setError(null);
15
- try {
16
- await answerPrompt(basePath, prompt.id, answer);
5
+ function PromptDialog({ prompt, basePath, open, onClose, onResolved, lookupFetcher, size = "lg" }) {
6
+ return /* @__PURE__ */ jsx(PromptForm, {
7
+ prompt,
8
+ basePath,
9
+ lookupFetcher,
10
+ onResolved: () => {
17
11
  onResolved?.();
18
12
  onClose();
19
- } catch (e) {
20
- setError(e instanceof Error ? e.message : String(e));
21
- } finally {
22
- setBusy(false);
23
- }
24
- };
25
- return /* @__PURE__ */ jsx(Modal, {
26
- open,
27
- onClose,
28
- title: prompt.title,
29
- subtitle: prompt.description,
30
- footer: /* @__PURE__ */ jsxs("div", {
31
- className: "flex items-center justify-end gap-2",
32
- children: [
33
- error ? /* @__PURE__ */ jsx("span", {
34
- className: "mr-auto text-sm text-red-600",
35
- children: error
36
- }) : null,
37
- /* @__PURE__ */ jsx(Button, {
38
- variant: "ghost",
39
- disabled: busy,
40
- onClick: () => void resolve({ cancelled: true }),
41
- children: "Cancel"
42
- }),
43
- /* @__PURE__ */ jsx(Button, {
44
- disabled: busy,
45
- onClick: () => void resolve({ values: value }),
46
- children: "Submit"
47
- })
48
- ]
49
- }),
50
- children: /* @__PURE__ */ jsx(JsonSchemaForm, {
51
- schema: prompt.schema,
52
- value,
53
- onChange: setValue,
54
- idPrefix: `prompt-${prompt.id}`
13
+ },
14
+ frame: ({ form, actions }) => /* @__PURE__ */ jsx(Modal, {
15
+ open,
16
+ size,
17
+ onClose,
18
+ title: prompt.title,
19
+ subtitle: prompt.description,
20
+ footer: actions,
21
+ children: form
55
22
  })
56
23
  });
57
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PromptDialog.js","names":[],"sources":["../../src/data/PromptDialog.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { Modal } from \"../overlay/Modal\";\nimport { answerPrompt, type PromptSnapshot } from \"../hooks/use-prompts\";\n\nexport interface PromptDialogProps {\n /** The pending prompt to answer. Its `schema` drives the rendered form. */\n prompt: PromptSnapshot;\n /** Base path the prompt API is mounted under, e.g. \"/api/todos\". */\n basePath: string;\n open: boolean;\n /** Closes the modal without answering (the prompt stays pending). */\n onClose: () => void;\n /** Called after the prompt is successfully answered or cancelled. */\n onResolved?: (() => void) | undefined;\n}\n\n// PromptDialog renders a pending prompt's JSON Schema via the generic\n// JsonSchemaForm inside a Modal and POSTs the answer back to the prompt manager.\n// It is the human side of the same mechanism an AI model elicits through.\nexport function PromptDialog({ prompt, basePath, open, onClose, onResolved }: PromptDialogProps) {\n const [value, setValue] = useState<Record<string, unknown>>(() => ({ ...prompt.value }));\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const resolve = async (answer: { values?: Record<string, unknown>; cancelled?: boolean }) => {\n setBusy(true);\n setError(null);\n try {\n await answerPrompt(basePath, prompt.id, answer);\n onResolved?.();\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n title={prompt.title}\n subtitle={prompt.description}\n footer={\n <div className=\"flex items-center justify-end gap-2\">\n {error ? <span className=\"mr-auto text-sm text-red-600\">{error}</span> : null}\n <Button variant=\"ghost\" disabled={busy} onClick={() => void resolve({ cancelled: true })}>\n Cancel\n </Button>\n <Button disabled={busy} onClick={() => void resolve({ values: value })}>\n Submit\n </Button>\n </div>\n }\n >\n <JsonSchemaForm schema={prompt.schema} value={value} onChange={setValue} idPrefix={`prompt-${prompt.id}`} />\n </Modal>\n );\n}\n"],"mappings":";;;;;;;AAqBA,SAAgB,aAAa,EAAE,QAAQ,UAAU,MAAM,SAAS,cAAiC;CAC/F,MAAM,CAAC,OAAO,YAAY,gBAAyC,EAAE,GAAG,OAAO,MAAM,EAAE;CACvF,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,OAAO,YAAY,SAAwB,IAAI;CAEtD,MAAM,UAAU,OAAO,WAAsE;EAC3F,QAAQ,IAAI;EACZ,SAAS,IAAI;EACb,IAAI;GACF,MAAM,aAAa,UAAU,OAAO,IAAI,MAAM;GAC9C,aAAa;GACb,QAAQ;EACV,SAAS,GAAG;GACV,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;EACrD,UAAU;GACR,QAAQ,KAAK;EACf;CACF;CAEA,OACE,oBAAC,OAAD;EACQ;EACG;EACT,OAAO,OAAO;EACd,UAAU,OAAO;EACjB,QACE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACG,QAAQ,oBAAC,QAAD;KAAM,WAAU;KAAgC,UAAA;IAAY,CAAA,IAAI;IACzE,oBAAC,QAAD;KAAQ,SAAQ;KAAQ,UAAU;KAAM,eAAe,KAAK,QAAQ,EAAE,WAAW,KAAK,CAAC;KAAG,UAAA;IAElF,CAAA;IACR,oBAAC,QAAD;KAAQ,UAAU;KAAM,eAAe,KAAK,QAAQ,EAAE,QAAQ,MAAM,CAAC;KAAG,UAAA;IAEhE,CAAA;GACL;;EAGP,UAAA,oBAAC,gBAAD;GAAgB,QAAQ,OAAO;GAAe;GAAO,UAAU;GAAU,UAAU,UAAU,OAAO;EAAO,CAAA;CACtG,CAAA;AAEX"}
1
+ {"version":3,"file":"PromptDialog.js","names":[],"sources":["../../src/data/PromptDialog.tsx"],"sourcesContent":["import type { LookupFetcher } from \"../components/json-schema-form-runtime-types\";\nimport { Modal, type ModalSize } from \"../overlay/Modal\";\nimport type { PromptSnapshot } from \"../hooks/use-prompts\";\nimport { PromptForm } from \"./PromptForm\";\n\nexport interface PromptDialogProps {\n /** The pending prompt to answer. Its `schema` drives the rendered form. */\n prompt: PromptSnapshot;\n /** Base path the prompt API is mounted under, e.g. \"/api/todos\". */\n basePath: string;\n open: boolean;\n /** Closes the modal without answering (the prompt stays pending). */\n onClose: () => void;\n /** Called after the prompt is successfully answered or cancelled. */\n onResolved?: (() => void) | undefined;\n /** Resolves the options of the schema's `x-clicky-lookup` fields (e.g. a connection picker). */\n lookupFetcher?: LookupFetcher | undefined;\n /** The dialog width; a form of several fields needs more than a confirm box. */\n size?: ModalSize | undefined;\n}\n\n// PromptDialog is PromptForm inside a Modal: the prompt's title and description\n// head the dialog, Submit/Cancel are pinned in its footer, and answering closes\n// it. It is the human side of the same mechanism an AI model elicits through.\nexport function PromptDialog({ prompt, basePath, open, onClose, onResolved, lookupFetcher, size = \"lg\" }: PromptDialogProps) {\n return (\n <PromptForm\n prompt={prompt}\n basePath={basePath}\n lookupFetcher={lookupFetcher}\n onResolved={() => {\n onResolved?.();\n onClose();\n }}\n frame={({ form, actions }) => (\n <Modal open={open} size={size} onClose={onClose} title={prompt.title} subtitle={prompt.description} footer={actions}>\n {form}\n </Modal>\n )}\n />\n );\n}\n"],"mappings":";;;;AAwBA,SAAgB,aAAa,EAAE,QAAQ,UAAU,MAAM,SAAS,YAAY,eAAe,OAAO,QAA2B;CAC3H,OACE,oBAAC,YAAD;EACU;EACE;EACK;EACf,kBAAkB;GAChB,aAAa;GACb,QAAQ;EACV;EACA,QAAQ,EAAE,MAAM,cACd,oBAAC,OAAD;GAAa;GAAY;GAAe;GAAS,OAAO,OAAO;GAAO,UAAU,OAAO;GAAa,QAAQ;GACzG,UAAA;EACI,CAAA;CAEV,CAAA;AAEL"}
@@ -0,0 +1,79 @@
1
+ const require_use_prompts = require("../hooks/use-prompts.cjs");
2
+ const require_button = require("../components/button.cjs");
3
+ const require_JsonSchemaForm = require("../components/JsonSchemaForm.cjs");
4
+ let react = require("react");
5
+ let react_jsx_runtime = require("react/jsx-runtime");
6
+ // src/data/PromptForm.tsx
7
+ function PromptForm({ prompt, basePath, onResolved, lookupFetcher, idPrefix, frame }) {
8
+ const [value, setValue] = (0, react.useState)(() => ({ ...prompt.value }));
9
+ const [busy, setBusy] = (0, react.useState)(false);
10
+ const [error, setError] = (0, react.useState)(null);
11
+ const [answering, setAnswering] = (0, react.useState)(prompt.id);
12
+ if (answering !== prompt.id) {
13
+ setAnswering(prompt.id);
14
+ setValue({ ...prompt.value });
15
+ setBusy(false);
16
+ setError(null);
17
+ }
18
+ const resolve = async (answer) => {
19
+ setBusy(true);
20
+ setError(null);
21
+ try {
22
+ await require_use_prompts.answerPrompt(basePath, prompt.id, answer);
23
+ onResolved?.();
24
+ } catch (e) {
25
+ setError(e instanceof Error ? e.message : String(e));
26
+ } finally {
27
+ setBusy(false);
28
+ }
29
+ };
30
+ const form = /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_JsonSchemaForm.JsonSchemaForm, {
31
+ schema: prompt.schema,
32
+ value,
33
+ onChange: setValue,
34
+ idPrefix: idPrefix ?? `prompt-${prompt.id}`,
35
+ ...lookupFetcher ? { lookupFetcher } : {}
36
+ });
37
+ const actions = /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
38
+ className: "flex items-center justify-end gap-2",
39
+ children: [
40
+ error ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
41
+ className: "mr-auto text-sm text-destructive",
42
+ children: error
43
+ }) : null,
44
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
45
+ variant: "ghost",
46
+ disabled: busy,
47
+ onClick: () => void resolve({ cancelled: true }),
48
+ children: "Cancel"
49
+ }),
50
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
51
+ disabled: busy,
52
+ onClick: () => void resolve({ values: value }),
53
+ children: "Submit"
54
+ })
55
+ ]
56
+ });
57
+ if (frame) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: frame({
58
+ form,
59
+ actions
60
+ }) });
61
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
62
+ className: "min-w-0 space-y-density-2",
63
+ "data-prompt-form": prompt.id,
64
+ children: [
65
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
66
+ className: "text-sm font-medium",
67
+ children: prompt.title
68
+ }), prompt.description ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
69
+ className: "text-xs text-muted-foreground",
70
+ children: prompt.description
71
+ }) : null] }),
72
+ form,
73
+ actions
74
+ ]
75
+ });
76
+ }
77
+ exports.PromptForm = PromptForm;
78
+
79
+ //# sourceMappingURL=PromptForm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptForm.cjs","names":["useState","answerPrompt","JsonSchemaForm","Button","_Fragment"],"sources":["../../src/data/PromptForm.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport type { LookupFetcher } from \"../components/json-schema-form-runtime-types\";\nimport { answerPrompt, type PromptSnapshot } from \"../hooks/use-prompts\";\n\nexport interface PromptFormProps {\n /** The pending prompt to answer. Its `schema` drives the rendered form. */\n prompt: PromptSnapshot;\n /** Base path the prompt API is mounted under, e.g. \"/api/todos\". */\n basePath: string;\n /** Called after the prompt is successfully answered or cancelled. */\n onResolved?: (() => void) | undefined;\n /** Resolves the options of the schema's `x-clicky-lookup` fields (e.g. a connection picker). */\n lookupFetcher?: LookupFetcher | undefined;\n /** Prefix for the form's field ids; give each copy of the same prompt on a page its own. Defaults to `prompt-<id>`. */\n idPrefix?: string | undefined;\n /**\n * Lays out the form and its Submit/Cancel actions. PromptDialog pins the\n * actions in its Modal footer; without a frame the prompt's title and\n * description head the form and the actions sit below it.\n */\n frame?: ((parts: { form: ReactNode; actions: ReactNode }) => ReactNode) | undefined;\n}\n\n// PromptForm renders a pending prompt's JSON Schema via the generic\n// JsonSchemaForm and POSTs the answer back to the prompt manager: Submit sends\n// the values, Cancel sends `{cancelled: true}`. PromptDialog is this form in a\n// Modal; a host can also render it inline, beside what the prompt is about.\nexport function PromptForm({ prompt, basePath, onResolved, lookupFetcher, idPrefix, frame }: PromptFormProps) {\n const [value, setValue] = useState<Record<string, unknown>>(() => ({ ...prompt.value }));\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n // Handed another prompt, start over from its value; a refetched snapshot of the same prompt keeps the edits.\n const [answering, setAnswering] = useState(prompt.id);\n if (answering !== prompt.id) {\n setAnswering(prompt.id);\n setValue({ ...prompt.value });\n setBusy(false);\n setError(null);\n }\n\n const resolve = async (answer: { values?: Record<string, unknown>; cancelled?: boolean }) => {\n setBusy(true);\n setError(null);\n try {\n await answerPrompt(basePath, prompt.id, answer);\n onResolved?.();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setBusy(false);\n }\n };\n\n const form = (\n <JsonSchemaForm\n schema={prompt.schema}\n value={value}\n onChange={setValue}\n idPrefix={idPrefix ?? `prompt-${prompt.id}`}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n );\n const actions = (\n <div className=\"flex items-center justify-end gap-2\">\n {error ? <span className=\"mr-auto text-sm text-destructive\">{error}</span> : null}\n <Button variant=\"ghost\" disabled={busy} onClick={() => void resolve({ cancelled: true })}>\n Cancel\n </Button>\n <Button disabled={busy} onClick={() => void resolve({ values: value })}>\n Submit\n </Button>\n </div>\n );\n\n if (frame) return <>{frame({ form, actions })}</>;\n return (\n <div className=\"min-w-0 space-y-density-2\" data-prompt-form={prompt.id}>\n <div>\n <div className=\"text-sm font-medium\">{prompt.title}</div>\n {prompt.description ? <div className=\"text-xs text-muted-foreground\">{prompt.description}</div> : null}\n </div>\n {form}\n {actions}\n </div>\n );\n}\n"],"mappings":";;;;;;AA6BA,SAAgB,WAAW,EAAE,QAAQ,UAAU,YAAY,eAAe,UAAU,SAA0B;CAC5G,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,QAAyC,EAAE,GAAG,OAAO,MAAM,EAAE;CACvF,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;CACtC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAwB,IAAI;CAEtD,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,OAAO,EAAE;CACpD,IAAI,cAAc,OAAO,IAAI;EAC3B,aAAa,OAAO,EAAE;EACtB,SAAS,EAAE,GAAG,OAAO,MAAM,CAAC;EAC5B,QAAQ,KAAK;EACb,SAAS,IAAI;CACf;CAEA,MAAM,UAAU,OAAO,WAAsE;EAC3F,QAAQ,IAAI;EACZ,SAAS,IAAI;EACb,IAAI;GACF,MAAMC,oBAAAA,aAAa,UAAU,OAAO,IAAI,MAAM;GAC9C,aAAa;EACf,SAAS,GAAG;GACV,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;EACrD,UAAU;GACR,QAAQ,KAAK;EACf;CACF;CAEA,MAAM,OACJ,iBAAA,GAAA,kBAAA,IAAA,CAACC,uBAAAA,gBAAD;EACE,QAAQ,OAAO;EACR;EACP,UAAU;EACV,UAAU,YAAY,UAAU,OAAO;EACvC,GAAK,gBAAgB,EAAE,cAAc,IAAI,CAAC;CAC3C,CAAA;CAEH,MAAM,UACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACG,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,WAAU;IAAoC,UAAA;GAAY,CAAA,IAAI;GAC7E,iBAAA,GAAA,kBAAA,IAAA,CAACC,eAAAA,QAAD;IAAQ,SAAQ;IAAQ,UAAU;IAAM,eAAe,KAAK,QAAQ,EAAE,WAAW,KAAK,CAAC;IAAG,UAAA;GAElF,CAAA;GACR,iBAAA,GAAA,kBAAA,IAAA,CAACA,eAAAA,QAAD;IAAQ,UAAU;IAAM,eAAe,KAAK,QAAQ,EAAE,QAAQ,MAAM,CAAC;IAAG,UAAA;GAEhE,CAAA;EACL;;CAGP,IAAI,OAAO,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAAC,kBAAAA,UAAA,EAAA,UAAG,MAAM;EAAE;EAAM;CAAQ,CAAC,EAAI,CAAA;CAChD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAA4B,oBAAkB,OAAO;EAApE,UAAA;GACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAU;IAAuB,UAAA,OAAO;GAAW,CAAA,GACvD,OAAO,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAU;IAAiC,UAAA,OAAO;GAAiB,CAAA,IAAI,IAC/F,EAAA,CAAA;GACJ;GACA;EACE;;AAET"}
@@ -0,0 +1,26 @@
1
+ import { ReactNode } from 'react';
2
+ import { LookupFetcher } from '../components/json-schema-form-runtime-types.js';
3
+ import { PromptSnapshot } from '../hooks/use-prompts.js';
4
+ export interface PromptFormProps {
5
+ /** The pending prompt to answer. Its `schema` drives the rendered form. */
6
+ prompt: PromptSnapshot;
7
+ /** Base path the prompt API is mounted under, e.g. "/api/todos". */
8
+ basePath: string;
9
+ /** Called after the prompt is successfully answered or cancelled. */
10
+ onResolved?: (() => void) | undefined;
11
+ /** Resolves the options of the schema's `x-clicky-lookup` fields (e.g. a connection picker). */
12
+ lookupFetcher?: LookupFetcher | undefined;
13
+ /** Prefix for the form's field ids; give each copy of the same prompt on a page its own. Defaults to `prompt-<id>`. */
14
+ idPrefix?: string | undefined;
15
+ /**
16
+ * Lays out the form and its Submit/Cancel actions. PromptDialog pins the
17
+ * actions in its Modal footer; without a frame the prompt's title and
18
+ * description head the form and the actions sit below it.
19
+ */
20
+ frame?: ((parts: {
21
+ form: ReactNode;
22
+ actions: ReactNode;
23
+ }) => ReactNode) | undefined;
24
+ }
25
+ export declare function PromptForm({ prompt, basePath, onResolved, lookupFetcher, idPrefix, frame }: PromptFormProps): import("react").JSX.Element;
26
+ //# sourceMappingURL=PromptForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptForm.d.ts","sourceRoot":"","sources":["../../src/data/PromptForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAClF,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEzE,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,MAAM,EAAE,cAAc,CAAC;IACvB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,UAAU,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACtC,gGAAgG;IAChG,aAAa,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IAC1C,uHAAuH;IACvH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,OAAO,EAAE,SAAS,CAAA;KAAE,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC;CACrF;AAMD,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,eAAe,+BA0D3G"}
@@ -0,0 +1,79 @@
1
+ import { answerPrompt } from "../hooks/use-prompts.js";
2
+ import { Button } from "../components/button.js";
3
+ import { JsonSchemaForm } from "../components/JsonSchemaForm.js";
4
+ import { useState } from "react";
5
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
+ // src/data/PromptForm.tsx
7
+ function PromptForm({ prompt, basePath, onResolved, lookupFetcher, idPrefix, frame }) {
8
+ const [value, setValue] = useState(() => ({ ...prompt.value }));
9
+ const [busy, setBusy] = useState(false);
10
+ const [error, setError] = useState(null);
11
+ const [answering, setAnswering] = useState(prompt.id);
12
+ if (answering !== prompt.id) {
13
+ setAnswering(prompt.id);
14
+ setValue({ ...prompt.value });
15
+ setBusy(false);
16
+ setError(null);
17
+ }
18
+ const resolve = async (answer) => {
19
+ setBusy(true);
20
+ setError(null);
21
+ try {
22
+ await answerPrompt(basePath, prompt.id, answer);
23
+ onResolved?.();
24
+ } catch (e) {
25
+ setError(e instanceof Error ? e.message : String(e));
26
+ } finally {
27
+ setBusy(false);
28
+ }
29
+ };
30
+ const form = /* @__PURE__ */ jsx(JsonSchemaForm, {
31
+ schema: prompt.schema,
32
+ value,
33
+ onChange: setValue,
34
+ idPrefix: idPrefix ?? `prompt-${prompt.id}`,
35
+ ...lookupFetcher ? { lookupFetcher } : {}
36
+ });
37
+ const actions = /* @__PURE__ */ jsxs("div", {
38
+ className: "flex items-center justify-end gap-2",
39
+ children: [
40
+ error ? /* @__PURE__ */ jsx("span", {
41
+ className: "mr-auto text-sm text-destructive",
42
+ children: error
43
+ }) : null,
44
+ /* @__PURE__ */ jsx(Button, {
45
+ variant: "ghost",
46
+ disabled: busy,
47
+ onClick: () => void resolve({ cancelled: true }),
48
+ children: "Cancel"
49
+ }),
50
+ /* @__PURE__ */ jsx(Button, {
51
+ disabled: busy,
52
+ onClick: () => void resolve({ values: value }),
53
+ children: "Submit"
54
+ })
55
+ ]
56
+ });
57
+ if (frame) return /* @__PURE__ */ jsx(Fragment$1, { children: frame({
58
+ form,
59
+ actions
60
+ }) });
61
+ return /* @__PURE__ */ jsxs("div", {
62
+ className: "min-w-0 space-y-density-2",
63
+ "data-prompt-form": prompt.id,
64
+ children: [
65
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("div", {
66
+ className: "text-sm font-medium",
67
+ children: prompt.title
68
+ }), prompt.description ? /* @__PURE__ */ jsx("div", {
69
+ className: "text-xs text-muted-foreground",
70
+ children: prompt.description
71
+ }) : null] }),
72
+ form,
73
+ actions
74
+ ]
75
+ });
76
+ }
77
+ export { PromptForm };
78
+
79
+ //# sourceMappingURL=PromptForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptForm.js","names":["_Fragment"],"sources":["../../src/data/PromptForm.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport type { LookupFetcher } from \"../components/json-schema-form-runtime-types\";\nimport { answerPrompt, type PromptSnapshot } from \"../hooks/use-prompts\";\n\nexport interface PromptFormProps {\n /** The pending prompt to answer. Its `schema` drives the rendered form. */\n prompt: PromptSnapshot;\n /** Base path the prompt API is mounted under, e.g. \"/api/todos\". */\n basePath: string;\n /** Called after the prompt is successfully answered or cancelled. */\n onResolved?: (() => void) | undefined;\n /** Resolves the options of the schema's `x-clicky-lookup` fields (e.g. a connection picker). */\n lookupFetcher?: LookupFetcher | undefined;\n /** Prefix for the form's field ids; give each copy of the same prompt on a page its own. Defaults to `prompt-<id>`. */\n idPrefix?: string | undefined;\n /**\n * Lays out the form and its Submit/Cancel actions. PromptDialog pins the\n * actions in its Modal footer; without a frame the prompt's title and\n * description head the form and the actions sit below it.\n */\n frame?: ((parts: { form: ReactNode; actions: ReactNode }) => ReactNode) | undefined;\n}\n\n// PromptForm renders a pending prompt's JSON Schema via the generic\n// JsonSchemaForm and POSTs the answer back to the prompt manager: Submit sends\n// the values, Cancel sends `{cancelled: true}`. PromptDialog is this form in a\n// Modal; a host can also render it inline, beside what the prompt is about.\nexport function PromptForm({ prompt, basePath, onResolved, lookupFetcher, idPrefix, frame }: PromptFormProps) {\n const [value, setValue] = useState<Record<string, unknown>>(() => ({ ...prompt.value }));\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n // Handed another prompt, start over from its value; a refetched snapshot of the same prompt keeps the edits.\n const [answering, setAnswering] = useState(prompt.id);\n if (answering !== prompt.id) {\n setAnswering(prompt.id);\n setValue({ ...prompt.value });\n setBusy(false);\n setError(null);\n }\n\n const resolve = async (answer: { values?: Record<string, unknown>; cancelled?: boolean }) => {\n setBusy(true);\n setError(null);\n try {\n await answerPrompt(basePath, prompt.id, answer);\n onResolved?.();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n } finally {\n setBusy(false);\n }\n };\n\n const form = (\n <JsonSchemaForm\n schema={prompt.schema}\n value={value}\n onChange={setValue}\n idPrefix={idPrefix ?? `prompt-${prompt.id}`}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n );\n const actions = (\n <div className=\"flex items-center justify-end gap-2\">\n {error ? <span className=\"mr-auto text-sm text-destructive\">{error}</span> : null}\n <Button variant=\"ghost\" disabled={busy} onClick={() => void resolve({ cancelled: true })}>\n Cancel\n </Button>\n <Button disabled={busy} onClick={() => void resolve({ values: value })}>\n Submit\n </Button>\n </div>\n );\n\n if (frame) return <>{frame({ form, actions })}</>;\n return (\n <div className=\"min-w-0 space-y-density-2\" data-prompt-form={prompt.id}>\n <div>\n <div className=\"text-sm font-medium\">{prompt.title}</div>\n {prompt.description ? <div className=\"text-xs text-muted-foreground\">{prompt.description}</div> : null}\n </div>\n {form}\n {actions}\n </div>\n );\n}\n"],"mappings":";;;;;;AA6BA,SAAgB,WAAW,EAAE,QAAQ,UAAU,YAAY,eAAe,UAAU,SAA0B;CAC5G,MAAM,CAAC,OAAO,YAAY,gBAAyC,EAAE,GAAG,OAAO,MAAM,EAAE;CACvF,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,CAAC,OAAO,YAAY,SAAwB,IAAI;CAEtD,MAAM,CAAC,WAAW,gBAAgB,SAAS,OAAO,EAAE;CACpD,IAAI,cAAc,OAAO,IAAI;EAC3B,aAAa,OAAO,EAAE;EACtB,SAAS,EAAE,GAAG,OAAO,MAAM,CAAC;EAC5B,QAAQ,KAAK;EACb,SAAS,IAAI;CACf;CAEA,MAAM,UAAU,OAAO,WAAsE;EAC3F,QAAQ,IAAI;EACZ,SAAS,IAAI;EACb,IAAI;GACF,MAAM,aAAa,UAAU,OAAO,IAAI,MAAM;GAC9C,aAAa;EACf,SAAS,GAAG;GACV,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;EACrD,UAAU;GACR,QAAQ,KAAK;EACf;CACF;CAEA,MAAM,OACJ,oBAAC,gBAAD;EACE,QAAQ,OAAO;EACR;EACP,UAAU;EACV,UAAU,YAAY,UAAU,OAAO;EACvC,GAAK,gBAAgB,EAAE,cAAc,IAAI,CAAC;CAC3C,CAAA;CAEH,MAAM,UACJ,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACG,QAAQ,oBAAC,QAAD;IAAM,WAAU;IAAoC,UAAA;GAAY,CAAA,IAAI;GAC7E,oBAAC,QAAD;IAAQ,SAAQ;IAAQ,UAAU;IAAM,eAAe,KAAK,QAAQ,EAAE,WAAW,KAAK,CAAC;IAAG,UAAA;GAElF,CAAA;GACR,oBAAC,QAAD;IAAQ,UAAU;IAAM,eAAe,KAAK,QAAQ,EAAE,QAAQ,MAAM,CAAC;IAAG,UAAA;GAEhE,CAAA;EACL;;CAGP,IAAI,OAAO,OAAO,oBAAAA,YAAA,EAAA,UAAG,MAAM;EAAE;EAAM;CAAQ,CAAC,EAAI,CAAA;CAChD,OACE,qBAAC,OAAD;EAAK,WAAU;EAA4B,oBAAkB,OAAO;EAApE,UAAA;GACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,OAAD;IAAK,WAAU;IAAuB,UAAA,OAAO;GAAW,CAAA,GACvD,OAAO,cAAc,oBAAC,OAAD;IAAK,WAAU;IAAiC,UAAA,OAAO;GAAiB,CAAA,IAAI,IAC/F,EAAA,CAAA;GACJ;GACA;EACE;;AAET"}