@lostgradient/cinder 0.8.0 → 0.11.0

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 (371) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +2 -2
  3. package/components.json +140 -18
  4. package/dist/components/_internal/command-list-context.d.ts +3 -3
  5. package/dist/components/_internal/create-command-list-state.svelte.d.ts +11 -11
  6. package/dist/components/access-gate/index.js +435 -218
  7. package/dist/components/approval-card/approval-card-actions.svelte.d.ts +16 -0
  8. package/dist/components/approval-card/approval-card-state.d.ts +65 -0
  9. package/dist/components/approval-card/approval-card.css +269 -92
  10. package/dist/components/approval-card/approval-card.schema.js +10 -31
  11. package/dist/components/approval-card/approval-card.svelte.d.ts +3 -3
  12. package/dist/components/approval-card/approval-card.types.d.ts +14 -28
  13. package/dist/components/approval-card/index.d.ts +1 -1
  14. package/dist/components/approval-card/index.js +4268 -2884
  15. package/dist/components/card/card.css +5 -0
  16. package/dist/components/card/card.schema.js +2 -2
  17. package/dist/components/card/card.types.d.ts +2 -2
  18. package/dist/components/card/index.js +2 -1
  19. package/dist/components/chat/builders.d.ts +17 -8
  20. package/dist/components/chat/chat.schema.js +44 -2
  21. package/dist/components/chat/chat.svelte.d.ts +4 -2
  22. package/dist/components/chat/chat.types.d.ts +34 -3
  23. package/dist/components/chat/container/chat.svelte.d.ts +4 -2
  24. package/dist/components/chat/conversation-model.d.ts +1 -1
  25. package/dist/components/chat/index.d.ts +4 -4
  26. package/dist/components/chat/index.js +2767 -6278
  27. package/dist/components/chat/input/chat-attachment-serialization.d.ts +9 -0
  28. package/dist/components/chat/input/chat-input.svelte.d.ts +22 -1
  29. package/dist/components/chat/input/index.d.ts +1 -0
  30. package/dist/components/chat/utilities/conversation.d.ts +6 -6
  31. package/dist/components/chat-composer-popover/chat-composer-popover-filter.d.ts +11 -0
  32. package/dist/components/chat-composer-popover/chat-composer-popover.css +7 -0
  33. package/dist/components/chat-composer-popover/chat-composer-popover.css.d.ts +1 -0
  34. package/dist/components/chat-composer-popover/chat-composer-popover.schema.d.ts +3 -0
  35. package/dist/components/chat-composer-popover/chat-composer-popover.schema.js +150 -0
  36. package/dist/components/chat-composer-popover/chat-composer-popover.svelte.d.ts +46 -0
  37. package/dist/components/chat-composer-popover/chat-composer-popover.types.d.ts +77 -0
  38. package/dist/components/chat-composer-popover/chat-composer-popover.variables.d.ts +2 -0
  39. package/dist/components/chat-composer-popover/chat-composer-popover.variables.js +61 -0
  40. package/dist/components/chat-composer-popover/index.d.ts +6 -0
  41. package/dist/components/chat-composer-popover/index.js +3285 -0
  42. package/dist/components/chat-conversation-header/index.js +577 -4537
  43. package/dist/components/chat-conversation-list/index.js +24 -3984
  44. package/dist/components/code-block/code-block.schema.js +5 -1
  45. package/dist/components/code-block/code-block.types.d.ts +6 -0
  46. package/dist/components/code-block/index.js +4 -4
  47. package/dist/components/command-item/index.js +7 -6
  48. package/dist/components/command-menu/command-menu.schema.js +5 -1
  49. package/dist/components/command-menu/command-menu.types.d.ts +2 -0
  50. package/dist/components/command-menu/index.js +48 -19
  51. package/dist/components/command-palette/index.js +40 -14
  52. package/dist/components/connection-indicator/connection-indicator.css +136 -0
  53. package/dist/components/connection-indicator/connection-indicator.css.d.ts +1 -0
  54. package/dist/components/connection-indicator/connection-indicator.schema.d.ts +3 -0
  55. package/dist/components/connection-indicator/connection-indicator.schema.js +89 -0
  56. package/dist/components/connection-indicator/connection-indicator.svelte.d.ts +21 -0
  57. package/dist/components/connection-indicator/connection-indicator.types.d.ts +46 -0
  58. package/dist/components/connection-indicator/connection-indicator.variables.d.ts +2 -0
  59. package/dist/components/connection-indicator/connection-indicator.variables.js +61 -0
  60. package/dist/components/connection-indicator/index.d.ts +5 -0
  61. package/dist/components/connection-indicator/index.js +409 -0
  62. package/dist/components/container/container.schema.js +4 -4
  63. package/dist/components/event-stream-viewer/index.js +44 -44
  64. package/dist/components/experimental/json-viewer/index.js +44 -44
  65. package/dist/components/invocation-rule-builder/index.d.ts +1 -1
  66. package/dist/components/invocation-rule-builder/index.js +305 -150
  67. package/dist/components/invocation-rule-builder/invocation-rule-builder.css +28 -0
  68. package/dist/components/invocation-rule-builder/invocation-rule-builder.schema.js +89 -5
  69. package/dist/components/invocation-rule-builder/invocation-rule-builder.svelte.d.ts +2 -1
  70. package/dist/components/invocation-rule-builder/invocation-rule-builder.types.d.ts +114 -16
  71. package/dist/components/json-schema-editor/index.js +5 -2
  72. package/dist/components/json-viewer/index.js +44 -44
  73. package/dist/components/json-viewer/json-viewer.css +10 -6
  74. package/dist/components/payload-inspector/index.d.ts +1 -1
  75. package/dist/components/payload-inspector/index.js +306 -1422
  76. package/dist/components/payload-inspector/payload-inspector.css +15 -75
  77. package/dist/components/payload-inspector/payload-inspector.schema.js +5 -41
  78. package/dist/components/payload-inspector/payload-inspector.svelte.d.ts +5 -5
  79. package/dist/components/payload-inspector/payload-inspector.types.d.ts +10 -56
  80. package/dist/components/run-step-timeline/index.d.ts +1 -1
  81. package/dist/components/run-step-timeline/index.js +992 -559
  82. package/dist/components/run-step-timeline/run-step-branch-disclosure.svelte.d.ts +17 -0
  83. package/dist/components/run-step-timeline/run-step-timeline.css +124 -0
  84. package/dist/components/run-step-timeline/run-step-timeline.schema.js +873 -350
  85. package/dist/components/run-step-timeline/run-step-timeline.svelte.d.ts +1 -15
  86. package/dist/components/run-step-timeline/run-step-timeline.types.d.ts +182 -5
  87. package/dist/components/run-step-timeline/run-step-timeline.utilities.d.ts +52 -0
  88. package/dist/components/schedule-builder/index.d.ts +5 -0
  89. package/dist/components/schedule-builder/index.js +3176 -0
  90. package/dist/components/schedule-builder/schedule-builder.css +121 -0
  91. package/dist/components/schedule-builder/schedule-builder.css.d.ts +1 -0
  92. package/dist/components/schedule-builder/schedule-builder.schema.d.ts +3 -0
  93. package/dist/components/schedule-builder/schedule-builder.schema.js +141 -0
  94. package/dist/components/schedule-builder/schedule-builder.svelte.d.ts +22 -0
  95. package/dist/components/schedule-builder/schedule-builder.types.d.ts +130 -0
  96. package/dist/components/schedule-builder/schedule-builder.utilities.d.ts +78 -0
  97. package/dist/components/schedule-builder/schedule-builder.variables.d.ts +2 -0
  98. package/dist/components/schedule-builder/schedule-builder.variables.js +61 -0
  99. package/dist/components/tab/index.js +5 -2
  100. package/dist/components/tab/tab.schema.js +7 -3
  101. package/dist/components/tab/tab.svelte.d.ts +2 -1
  102. package/dist/components/tab/tab.types.d.ts +8 -2
  103. package/dist/components/tabs/index.js +5 -2
  104. package/dist/components/tag-input/index.js +22 -4
  105. package/dist/components/tag-input/tag-input.schema.js +5 -1
  106. package/dist/components/tag-input/tag-input.types.d.ts +4 -0
  107. package/dist/components/team-section/index.js +2 -1
  108. package/dist/components/testimonial-section/index.js +2 -1
  109. package/dist/index.d.ts +10 -4
  110. package/dist/index.js +28577 -30168
  111. package/dist/server/components/access-gate/index.js +3 -1
  112. package/dist/server/components/accordion/index.js +2 -2
  113. package/dist/server/components/alert-dialog/index.js +2 -2
  114. package/dist/server/components/approval-card/index.js +15 -19
  115. package/dist/server/components/autocomplete/index.js +7 -7
  116. package/dist/server/components/avatar-group/index.js +5 -5
  117. package/dist/server/components/button-group/index.js +3 -5
  118. package/dist/server/components/card/index.js +2 -2
  119. package/dist/server/components/chat/index.js +15 -12
  120. package/dist/server/components/chat-composer-popover/index.js +26 -0
  121. package/dist/server/components/chat-conversation-header/index.js +10 -11
  122. package/dist/server/components/chat-conversation-list/index.js +4 -5
  123. package/dist/server/components/checkbox/index.js +3 -3
  124. package/dist/server/components/choice-grid/index.js +2 -2
  125. package/dist/server/components/code-block/index.js +2 -2
  126. package/dist/server/components/color-field/index.js +3 -3
  127. package/dist/server/components/combobox/index.js +6 -6
  128. package/dist/server/components/command-item/index.js +5 -3
  129. package/dist/server/components/command-menu/index.js +6 -4
  130. package/dist/server/components/command-palette/index.js +2 -2
  131. package/dist/server/components/confirm-dialog/index.js +2 -2
  132. package/dist/server/components/connection-indicator/index.js +16 -0
  133. package/dist/server/components/context-menu/index.js +5 -5
  134. package/dist/server/components/data-table/index.js +5 -5
  135. package/dist/server/components/date-picker/index.js +6 -6
  136. package/dist/server/components/date-range-field/index.js +7 -7
  137. package/dist/server/components/description-list/index.js +3 -5
  138. package/dist/server/components/diff-viewer/index.js +9 -8
  139. package/dist/server/components/drawer/index.js +3 -3
  140. package/dist/server/components/dropdown/index.js +4 -4
  141. package/dist/server/components/event-stream-viewer/index.js +2 -2
  142. package/dist/server/components/experimental/json-viewer/index.js +2 -2
  143. package/dist/server/components/faceted-filter-bar/index.js +1 -1
  144. package/dist/server/components/hover-card/index.js +1 -1
  145. package/dist/server/components/input/index.js +3 -3
  146. package/dist/server/components/invocation-rule-builder/index.js +1 -1
  147. package/dist/server/components/json-schema-editor/index.js +24 -23
  148. package/dist/server/components/json-viewer/index.js +2 -2
  149. package/dist/server/components/markdown-editor/index.js +13 -13
  150. package/dist/server/components/modal/index.js +1 -1
  151. package/dist/server/components/multi-select/index.js +1 -1
  152. package/dist/server/components/newsletter-section/index.js +3 -3
  153. package/dist/server/components/payload-inspector/index.js +4 -16
  154. package/dist/server/components/popover/index.js +5 -5
  155. package/dist/server/components/review-editor/index.js +27 -26
  156. package/dist/server/components/run-step-timeline/index.js +2 -2
  157. package/dist/server/components/schedule-builder/index.js +30 -0
  158. package/dist/server/components/schema-form/index.js +4 -4
  159. package/dist/server/components/secret-value-field/index.js +3 -5
  160. package/dist/server/components/segment/index.js +3 -3
  161. package/dist/server/components/segmented-control/index.js +4 -4
  162. package/dist/server/components/selection-popover/index.js +4 -4
  163. package/dist/server/components/sheet/index.js +2 -2
  164. package/dist/server/components/side-navigation/index.js +2 -2
  165. package/dist/server/components/sidebar/index.js +3 -3
  166. package/dist/server/components/tab/index.js +2 -2
  167. package/dist/server/components/table/index.js +3 -3
  168. package/dist/server/components/tabs/index.js +4 -4
  169. package/dist/server/components/tag-input/index.js +3 -3
  170. package/dist/server/components/team-section/index.js +8 -8
  171. package/dist/server/components/testimonial-section/index.js +2 -2
  172. package/dist/server/components/time-field/index.js +5 -3
  173. package/dist/server/components/toggle/index.js +2 -2
  174. package/dist/server/components/tooltip/index.js +1 -1
  175. package/dist/server/index.js +235 -211
  176. package/dist/server/{index.server-20y4mdhm.js → index.server-0chhpkg7.js} +40 -14
  177. package/dist/server/index.server-0sx92swg.js +9 -0
  178. package/dist/server/{index.server-ecm1vs3g.js → index.server-1nq7z1qw.js} +1 -1
  179. package/dist/server/{index.server-s9khh4ry.js → index.server-2bbwajb2.js} +3 -5
  180. package/dist/server/index.server-2hqrv7ca.js +9 -0
  181. package/dist/server/{index.server-69epaape.js → index.server-2qj6s2mh.js} +1 -1
  182. package/dist/server/{index.server-gxf0d1p5.js → index.server-2s5h1d05.js} +2 -2
  183. package/dist/server/{index.server-qfa2rxzx.js → index.server-2zdbz3rj.js} +3 -5
  184. package/dist/server/{index.server-pt8b65mt.js → index.server-38aywdk1.js} +1 -1
  185. package/dist/server/{index.server-0jhra85x.js → index.server-3w72dxz7.js} +4 -4
  186. package/dist/server/{index.server-rermas0k.js → index.server-47v2fhp4.js} +4 -4
  187. package/dist/server/{index.server-v4zabrsx.js → index.server-4x4hgvqe.js} +434 -26
  188. package/dist/server/{index.server-9j5sym59.js → index.server-4x91gzy1.js} +2 -2
  189. package/dist/server/{index.server-q48q15g7.js → index.server-4y2jtvv1.js} +4 -2
  190. package/dist/server/{index.server-j3ddzcaa.js → index.server-5gzyqv78.js} +6 -6
  191. package/dist/server/index.server-67qgdypc.js +9 -0
  192. package/dist/server/index.server-6hnfzc7f.js +263 -0
  193. package/dist/server/{index.server-9jete4xx.js → index.server-6sh11ap6.js} +4 -4
  194. package/dist/server/{index.server-4ztq565m.js → index.server-85p4ydph.js} +1 -1
  195. package/dist/server/{index.server-4nk7gy0q.js → index.server-894t97kv.js} +1 -1
  196. package/dist/server/{index.server-1vscnped.js → index.server-8dt36sdm.js} +2 -1
  197. package/dist/server/{index.server-bfsbp9dz.js → index.server-8xvc73zh.js} +4 -4
  198. package/dist/server/{index.server-cvnw3hw9.js → index.server-9kz37z89.js} +1 -1
  199. package/dist/server/{index.server-kc1k02tk.js → index.server-9ykk1kbg.js} +1 -1
  200. package/dist/server/{index.server-g789yep6.js → index.server-aqethy0w.js} +2 -2
  201. package/dist/server/index.server-be9bpqeh.js +93 -0
  202. package/dist/server/{index.server-wc9aggfz.js → index.server-bmxbsk4y.js} +7 -7
  203. package/dist/server/{index.server-f3z7tpxr.js → index.server-c42b462p.js} +2 -4
  204. package/dist/server/{index.server-7vyzen5x.js → index.server-c5qv3p61.js} +171 -63
  205. package/dist/server/index.server-cch0eed5.js +144 -0
  206. package/dist/server/{index.server-q89dz8h1.js → index.server-d3pqthtp.js} +4 -3
  207. package/dist/server/{index.server-jk4rx4aa.js → index.server-dmmvwy6p.js} +1 -1
  208. package/dist/server/{index.server-hcfnae5y.js → index.server-dwwqssey.js} +4 -4
  209. package/dist/server/{index.server-e8x1hgw6.js → index.server-dz1r9xw5.js} +4 -4
  210. package/dist/server/{index.server-wm7mk5kw.js → index.server-ez5hp0ya.js} +1 -1
  211. package/dist/server/{index.server-wc8dbm5e.js → index.server-g95bk8rc.js} +4 -2
  212. package/dist/server/index.server-gkazv439.js +576 -0
  213. package/dist/server/index.server-gmh5ar16.js +2 -0
  214. package/dist/server/{index.server-dp9j2kkr.js → index.server-h0cvwvhy.js} +1 -1
  215. package/dist/server/{index.server-cbtg8rq5.js → index.server-h89zk5ev.js} +8 -8
  216. package/dist/server/{index.server-pacrqvyz.js → index.server-h90pjrez.js} +1 -1
  217. package/dist/server/{index.server-p8d04em5.js → index.server-hcsd5gdb.js} +6 -2
  218. package/dist/server/{index.server-n39drzes.js → index.server-hpeavvnq.js} +1 -1
  219. package/dist/server/{index.server-1p3patnj.js → index.server-hx91ng7z.js} +1 -1
  220. package/dist/server/{index.server-mehav5vs.js → index.server-jdcq5zza.js} +7 -7
  221. package/dist/server/{index.server-jync915v.js → index.server-jfrssta6.js} +25 -25
  222. package/dist/server/{index.server-jtj3r53y.js → index.server-jgb8yh5k.js} +1 -1
  223. package/dist/server/{index.server-ejyf7e48.js → index.server-jj76374p.js} +1 -1
  224. package/dist/server/{index.server-w1g5q9j9.js → index.server-jtgw9d23.js} +4 -2
  225. package/dist/server/{index.server-hd8gpehd.js → index.server-jxseyx33.js} +1 -1
  226. package/dist/server/{index.server-kg2sepsr.js → index.server-krqvnt6p.js} +14 -15
  227. package/dist/server/{index.server-0e1m3agz.js → index.server-ks49bprh.js} +1 -1
  228. package/dist/server/{index.server-f0hma3jp.js → index.server-kt0ncrqs.js} +1 -1
  229. package/dist/server/index.server-m0ezemav.js +170 -0
  230. package/dist/server/index.server-m191rm44.js +79 -0
  231. package/dist/server/{index.server-z721a5gp.js → index.server-n82rcv0m.js} +4 -4
  232. package/dist/server/{index.server-rhhmdxtz.js → index.server-np3c7kx0.js} +4 -4
  233. package/dist/server/{index.server-hpcs7tmh.js → index.server-p56xxef1.js} +1 -1
  234. package/dist/server/{index.server-w83kmcrx.js → index.server-pag862vz.js} +10 -10
  235. package/dist/server/index.server-qbkxz7r2.js +750 -0
  236. package/dist/server/{index.server-sh2rxejg.js → index.server-qke3ekjt.js} +1 -1
  237. package/dist/server/{index.server-73x2d3j3.js → index.server-rbpvcrr3.js} +1 -1
  238. package/dist/server/{index.server-8cxs4kya.js → index.server-rga8sc7j.js} +41 -44
  239. package/dist/server/{index.server-e3fnv1g6.js → index.server-sedjxt36.js} +5 -5
  240. package/dist/server/{index.server-pen9pxt6.js → index.server-sf3nk3j2.js} +2 -2
  241. package/dist/server/{index.server-f23vtaw4.js → index.server-tcay903b.js} +8 -7
  242. package/dist/server/{index.server-7fp0epev.js → index.server-veastatv.js} +4 -4
  243. package/dist/server/{index.server-jeqg2d22.js → index.server-xeqtpv61.js} +1 -1
  244. package/dist/server/{index.server-9s4na701.js → index.server-xjnge1yw.js} +4 -4
  245. package/dist/server/index.server-xtjjmsyq.js +315 -0
  246. package/dist/server/{index.server-hhxjaeen.js → index.server-xz99aed4.js} +4 -4
  247. package/dist/server/{index.server-vne4rzfa.js → index.server-y4n8vc08.js} +1 -1
  248. package/dist/server/{index.server-5d01cn4f.js → index.server-y83kqayt.js} +4 -4
  249. package/dist/server/{index.server-1nh09ck7.js → index.server-yhzydqxe.js} +5 -5
  250. package/dist/server/index.server-z38bxms8.js +734 -0
  251. package/dist/server/{index.server-atjc1qcq.js → index.server-z7hxtqs1.js} +1 -1
  252. package/dist/server/{index.server-w6k62afr.js → index.server-ze1ymmbw.js} +2 -2
  253. package/dist/server/{index.server-914v805w.js → index.server-zgd1g8mk.js} +1 -1
  254. package/dist/server/{index.server-aeexcxdp.js → index.server-zh3r8vfd.js} +1 -1
  255. package/dist/server/{index.server-10jb2jzm.js → index.server-zsjf8enc.js} +4 -4
  256. package/package.json +102 -5
  257. package/src/components/_internal/command-list-context.ts +3 -3
  258. package/src/components/_internal/create-command-list-state.svelte.ts +39 -13
  259. package/src/components/approval-card/approval-card-actions.svelte +168 -0
  260. package/src/components/approval-card/approval-card-state.ts +152 -1
  261. package/src/components/approval-card/approval-card.css +269 -92
  262. package/src/components/approval-card/approval-card.examples.json +3 -3
  263. package/src/components/approval-card/approval-card.schema.json +9 -30
  264. package/src/components/approval-card/approval-card.schema.ts +13 -31
  265. package/src/components/approval-card/approval-card.svelte +176 -470
  266. package/src/components/approval-card/approval-card.types.ts +15 -28
  267. package/src/components/approval-card/index.ts +1 -0
  268. package/src/components/card/card.css +5 -0
  269. package/src/components/card/card.schema.json +1 -1
  270. package/src/components/card/card.schema.ts +1 -1
  271. package/src/components/card/card.svelte +1 -0
  272. package/src/components/card/card.types.ts +2 -2
  273. package/src/components/chat/builders.ts +445 -14
  274. package/src/components/chat/chat.schema.json +36 -1
  275. package/src/components/chat/chat.schema.ts +44 -1
  276. package/src/components/chat/chat.svelte +12 -0
  277. package/src/components/chat/chat.types.ts +35 -3
  278. package/src/components/chat/container/chat.svelte +73 -3
  279. package/src/components/chat/conversation-model.ts +1 -0
  280. package/src/components/chat/index.ts +16 -3
  281. package/src/components/chat/input/chat-attachment-serialization.ts +63 -0
  282. package/src/components/chat/input/chat-input.svelte +22 -5
  283. package/src/components/chat/input/index.ts +5 -0
  284. package/src/components/chat/utilities/conversation.ts +33 -15
  285. package/src/components/chat-composer-popover/chat-composer-popover-filter.ts +68 -0
  286. package/src/components/chat-composer-popover/chat-composer-popover.css +7 -0
  287. package/src/components/chat-composer-popover/chat-composer-popover.examples.json +13 -0
  288. package/src/components/chat-composer-popover/chat-composer-popover.schema.json +90 -0
  289. package/src/components/chat-composer-popover/chat-composer-popover.schema.ts +95 -0
  290. package/src/components/chat-composer-popover/chat-composer-popover.svelte +234 -0
  291. package/src/components/chat-composer-popover/chat-composer-popover.types.ts +88 -0
  292. package/src/components/chat-composer-popover/chat-composer-popover.variables.json +1 -0
  293. package/src/components/chat-composer-popover/chat-composer-popover.variables.ts +3 -0
  294. package/src/components/chat-composer-popover/index.ts +19 -0
  295. package/src/components/code-block/code-block.schema.json +4 -0
  296. package/src/components/code-block/code-block.schema.ts +5 -0
  297. package/src/components/code-block/code-block.svelte +3 -3
  298. package/src/components/code-block/code-block.types.ts +6 -0
  299. package/src/components/command-item/command-item.svelte +7 -6
  300. package/src/components/command-menu/command-menu.schema.json +4 -0
  301. package/src/components/command-menu/command-menu.schema.ts +4 -0
  302. package/src/components/command-menu/command-menu.svelte +16 -5
  303. package/src/components/command-menu/command-menu.types.ts +2 -0
  304. package/src/components/connection-indicator/connection-indicator.css +136 -0
  305. package/src/components/connection-indicator/connection-indicator.examples.json +31 -0
  306. package/src/components/connection-indicator/connection-indicator.schema.json +29 -0
  307. package/src/components/connection-indicator/connection-indicator.schema.ts +36 -0
  308. package/src/components/connection-indicator/connection-indicator.svelte +63 -0
  309. package/src/components/connection-indicator/connection-indicator.types.ts +58 -0
  310. package/src/components/connection-indicator/connection-indicator.variables.json +1 -0
  311. package/src/components/connection-indicator/connection-indicator.variables.ts +3 -0
  312. package/src/components/connection-indicator/index.ts +10 -0
  313. package/src/components/container/container.schema.json +3 -3
  314. package/src/components/container/container.schema.ts +3 -3
  315. package/src/components/invocation-rule-builder/index.ts +4 -0
  316. package/src/components/invocation-rule-builder/invocation-rule-builder.css +28 -0
  317. package/src/components/invocation-rule-builder/invocation-rule-builder.examples.json +6 -0
  318. package/src/components/invocation-rule-builder/invocation-rule-builder.schema.json +76 -3
  319. package/src/components/invocation-rule-builder/invocation-rule-builder.schema.ts +83 -3
  320. package/src/components/invocation-rule-builder/invocation-rule-builder.svelte +326 -113
  321. package/src/components/invocation-rule-builder/invocation-rule-builder.types.ts +157 -43
  322. package/src/components/json-viewer/_json-viewer-node.svelte +15 -1
  323. package/src/components/json-viewer/json-viewer.css +10 -6
  324. package/src/components/payload-inspector/index.ts +0 -2
  325. package/src/components/payload-inspector/payload-inspector.css +15 -75
  326. package/src/components/payload-inspector/payload-inspector.examples.json +5 -5
  327. package/src/components/payload-inspector/payload-inspector.schema.json +3 -31
  328. package/src/components/payload-inspector/payload-inspector.schema.ts +3 -36
  329. package/src/components/payload-inspector/payload-inspector.svelte +46 -239
  330. package/src/components/payload-inspector/payload-inspector.types.ts +10 -58
  331. package/src/components/run-step-timeline/index.ts +8 -0
  332. package/src/components/run-step-timeline/run-step-branch-disclosure.svelte +16 -0
  333. package/src/components/run-step-timeline/run-step-timeline.css +124 -0
  334. package/src/components/run-step-timeline/run-step-timeline.examples.json +18 -0
  335. package/src/components/run-step-timeline/run-step-timeline.schema.json +872 -349
  336. package/src/components/run-step-timeline/run-step-timeline.schema.ts +931 -349
  337. package/src/components/run-step-timeline/run-step-timeline.svelte +387 -268
  338. package/src/components/run-step-timeline/run-step-timeline.types.ts +192 -5
  339. package/src/components/run-step-timeline/run-step-timeline.utilities.ts +242 -0
  340. package/src/components/schedule-builder/index.ts +14 -0
  341. package/src/components/schedule-builder/schedule-builder.css +121 -0
  342. package/src/components/schedule-builder/schedule-builder.examples.json +31 -0
  343. package/src/components/schedule-builder/schedule-builder.schema.json +78 -0
  344. package/src/components/schedule-builder/schedule-builder.schema.ts +86 -0
  345. package/src/components/schedule-builder/schedule-builder.svelte +629 -0
  346. package/src/components/schedule-builder/schedule-builder.types.ts +137 -0
  347. package/src/components/schedule-builder/schedule-builder.utilities.ts +344 -0
  348. package/src/components/schedule-builder/schedule-builder.variables.json +1 -0
  349. package/src/components/schedule-builder/schedule-builder.variables.ts +3 -0
  350. package/src/components/tab/tab.schema.json +6 -2
  351. package/src/components/tab/tab.schema.ts +8 -2
  352. package/src/components/tab/tab.svelte +9 -5
  353. package/src/components/tab/tab.types.ts +8 -2
  354. package/src/components/tag-input/tag-input.schema.json +4 -0
  355. package/src/components/tag-input/tag-input.schema.ts +4 -0
  356. package/src/components/tag-input/tag-input.svelte +20 -3
  357. package/src/components/tag-input/tag-input.types.ts +4 -0
  358. package/src/index.ts +41 -5
  359. package/src/styles/components.css +3 -0
  360. package/dist/server/index-49we2xfs.js +0 -344
  361. package/dist/server/index-8fhvxk30.js +0 -265
  362. package/dist/server/index-x2ysg8ds.js +0 -388
  363. package/dist/server/index.server-20j0jh30.js +0 -9
  364. package/dist/server/index.server-dc35kh7d.js +0 -1835
  365. package/dist/server/index.server-kd4b0342.js +0 -607
  366. package/dist/server/index.server-n5cdmsz4.js +0 -30
  367. package/dist/server/index.server-pxg74pyp.js +0 -393
  368. package/dist/server/index.server-rjap4k7y.js +0 -1389
  369. package/dist/server/index.server-vt6sn9y4.js +0 -447
  370. package/dist/server/index.server-w63n618v.js +0 -9
  371. package/dist/server/index.server-y2pa1k46.js +0 -9
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  conversationSummaryTimestamp
3
- } from "./index.server-s9khh4ry.js";
3
+ } from "./index.server-2bbwajb2.js";
4
4
  import {
5
5
  classNames
6
6
  } from "./index.server-z7nvkz8v.js";
@@ -55,7 +55,7 @@ function _json_viewer_node($$renderer, $$props) {
55
55
  } else {
56
56
  $$renderer2.push("<!--[-1-->");
57
57
  }
58
- $$renderer2.push(`<!--]--> <span class="cinder-json-viewer__caret"${$.attr("data-cinder-collapsed", collapsed || undefined)}></span> <span class="cinder-json-viewer__brace">${$.escape(isArray() ? "[" : "{")}</span> `);
58
+ $$renderer2.push(`<!--]--> <svg class="cinder-json-viewer__caret"${$.attr("data-cinder-collapsed", collapsed || undefined)} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" focusable="false"><path fill-rule="evenodd" d="M5.22 8.22a.75.75 0 0 1 1.06 0L10 11.94l3.72-3.72a.75.75 0 1 1 1.06 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0L5.22 9.28a.75.75 0 0 1 0-1.06z" clip-rule="evenodd"></path></svg> <span class="cinder-json-viewer__brace">${$.escape(isArray() ? "[" : "{")}</span> `);
59
59
  if (collapsed) {
60
60
  $$renderer2.push("<!--[0-->");
61
61
  $$renderer2.push(`<span class="cinder-json-viewer__summary">${$.escape(itemCount())} ${$.escape(itemCount() === 1 ? "item" : "items")}</span> <span class="cinder-json-viewer__brace">${$.escape(isArray() ? "]" : "}")}</span>`);
@@ -220,4 +220,4 @@ function Json_viewer($$renderer, $$props) {
220
220
 
221
221
  export { Json_viewer };
222
222
 
223
- //# debugId=4610D0EF23A4B97D64756E2164756E21
223
+ //# debugId=73E01DFC934121F164756E2164756E21
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Json_viewer
3
- } from "./index.server-w6k62afr.js";
3
+ } from "./index.server-ze1ymmbw.js";
4
4
 
5
5
  // src/components/json-viewer/index.ts
6
6
  var json_viewer_default = Json_viewer;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Payload_inspector
3
- } from "./index.server-vt6sn9y4.js";
3
+ } from "./index.server-m0ezemav.js";
4
4
 
5
5
  // src/components/payload-inspector/index.ts
6
6
  var payload_inspector_default = Payload_inspector;
@@ -1,9 +1,9 @@
1
- import {
2
- getFormFieldContext
3
- } from "./index.server-weae7gs2.js";
4
1
  import {
5
2
  commitValue
6
3
  } from "./index.server-42qeekwc.js";
4
+ import {
5
+ getFormFieldContext
6
+ } from "./index.server-weae7gs2.js";
7
7
  import {
8
8
  classNames
9
9
  } from "./index.server-z7nvkz8v.js";
@@ -50,4 +50,4 @@ function Toggle($$renderer, $$props) {
50
50
  var toggle_default = Toggle;
51
51
  export { Toggle, toggle_default };
52
52
 
53
- //# debugId=426B7366973E509A64756E2164756E21
53
+ //# debugId=12CB9C541A47207164756E2164756E21
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lostgradient/cinder",
3
- "version": "0.8.0",
3
+ "version": "0.11.0",
4
4
  "description": "A Svelte 5 component library and design system focused on accessibility, theming, and per-component tree-shaking.",
5
5
  "keywords": [
6
6
  "svelte",
@@ -967,6 +967,38 @@
967
967
  "import": "./src/components/chat/chat.examples.json",
968
968
  "default": "./src/components/chat/chat.examples.json"
969
969
  },
970
+ "./chat-composer-popover": {
971
+ "types": "./dist/components/chat-composer-popover/index.d.ts",
972
+ "browser": "./src/components/chat-composer-popover/index.ts",
973
+ "node": "./dist/server/components/chat-composer-popover/index.js",
974
+ "svelte": "./src/components/chat-composer-popover/index.ts",
975
+ "import": "./src/components/chat-composer-popover/index.ts",
976
+ "default": "./dist/components/chat-composer-popover/index.js"
977
+ },
978
+ "./chat-composer-popover/schema": {
979
+ "types": "./dist/components/chat-composer-popover/chat-composer-popover.schema.d.ts",
980
+ "browser": "./src/components/chat-composer-popover/chat-composer-popover.schema.ts",
981
+ "node": "./dist/components/chat-composer-popover/chat-composer-popover.schema.js",
982
+ "svelte": "./src/components/chat-composer-popover/chat-composer-popover.schema.ts",
983
+ "import": "./src/components/chat-composer-popover/chat-composer-popover.schema.ts",
984
+ "default": "./dist/components/chat-composer-popover/chat-composer-popover.schema.js"
985
+ },
986
+ "./chat-composer-popover/variables": {
987
+ "types": "./dist/components/chat-composer-popover/chat-composer-popover.variables.d.ts",
988
+ "browser": "./src/components/chat-composer-popover/chat-composer-popover.variables.ts",
989
+ "node": "./dist/components/chat-composer-popover/chat-composer-popover.variables.js",
990
+ "svelte": "./src/components/chat-composer-popover/chat-composer-popover.variables.ts",
991
+ "import": "./src/components/chat-composer-popover/chat-composer-popover.variables.ts",
992
+ "default": "./dist/components/chat-composer-popover/chat-composer-popover.variables.js"
993
+ },
994
+ "./chat-composer-popover/styles": {
995
+ "types": "./dist/components/chat-composer-popover/chat-composer-popover.css.d.ts",
996
+ "default": "./dist/components/chat-composer-popover/chat-composer-popover.css"
997
+ },
998
+ "./chat-composer-popover/examples": {
999
+ "import": "./src/components/chat-composer-popover/chat-composer-popover.examples.json",
1000
+ "default": "./src/components/chat-composer-popover/chat-composer-popover.examples.json"
1001
+ },
970
1002
  "./chat-conversation-header": {
971
1003
  "types": "./dist/components/chat-conversation-header/index.d.ts",
972
1004
  "browser": "./src/components/chat-conversation-header/index.ts",
@@ -1531,6 +1563,38 @@
1531
1563
  "import": "./src/components/confirm-dialog/confirm-dialog.examples.json",
1532
1564
  "default": "./src/components/confirm-dialog/confirm-dialog.examples.json"
1533
1565
  },
1566
+ "./connection-indicator": {
1567
+ "types": "./dist/components/connection-indicator/index.d.ts",
1568
+ "browser": "./src/components/connection-indicator/index.ts",
1569
+ "node": "./dist/server/components/connection-indicator/index.js",
1570
+ "svelte": "./src/components/connection-indicator/index.ts",
1571
+ "import": "./src/components/connection-indicator/index.ts",
1572
+ "default": "./dist/components/connection-indicator/index.js"
1573
+ },
1574
+ "./connection-indicator/schema": {
1575
+ "types": "./dist/components/connection-indicator/connection-indicator.schema.d.ts",
1576
+ "browser": "./src/components/connection-indicator/connection-indicator.schema.ts",
1577
+ "node": "./dist/components/connection-indicator/connection-indicator.schema.js",
1578
+ "svelte": "./src/components/connection-indicator/connection-indicator.schema.ts",
1579
+ "import": "./src/components/connection-indicator/connection-indicator.schema.ts",
1580
+ "default": "./dist/components/connection-indicator/connection-indicator.schema.js"
1581
+ },
1582
+ "./connection-indicator/variables": {
1583
+ "types": "./dist/components/connection-indicator/connection-indicator.variables.d.ts",
1584
+ "browser": "./src/components/connection-indicator/connection-indicator.variables.ts",
1585
+ "node": "./dist/components/connection-indicator/connection-indicator.variables.js",
1586
+ "svelte": "./src/components/connection-indicator/connection-indicator.variables.ts",
1587
+ "import": "./src/components/connection-indicator/connection-indicator.variables.ts",
1588
+ "default": "./dist/components/connection-indicator/connection-indicator.variables.js"
1589
+ },
1590
+ "./connection-indicator/styles": {
1591
+ "types": "./dist/components/connection-indicator/connection-indicator.css.d.ts",
1592
+ "default": "./dist/components/connection-indicator/connection-indicator.css"
1593
+ },
1594
+ "./connection-indicator/examples": {
1595
+ "import": "./src/components/connection-indicator/connection-indicator.examples.json",
1596
+ "default": "./src/components/connection-indicator/connection-indicator.examples.json"
1597
+ },
1534
1598
  "./container": {
1535
1599
  "types": "./dist/components/container/index.d.ts",
1536
1600
  "browser": "./src/components/container/index.ts",
@@ -4243,6 +4307,38 @@
4243
4307
  "import": "./src/components/run-step-timeline/run-step-timeline.examples.json",
4244
4308
  "default": "./src/components/run-step-timeline/run-step-timeline.examples.json"
4245
4309
  },
4310
+ "./schedule-builder": {
4311
+ "types": "./dist/components/schedule-builder/index.d.ts",
4312
+ "browser": "./src/components/schedule-builder/index.ts",
4313
+ "node": "./dist/server/components/schedule-builder/index.js",
4314
+ "svelte": "./src/components/schedule-builder/index.ts",
4315
+ "import": "./src/components/schedule-builder/index.ts",
4316
+ "default": "./dist/components/schedule-builder/index.js"
4317
+ },
4318
+ "./schedule-builder/schema": {
4319
+ "types": "./dist/components/schedule-builder/schedule-builder.schema.d.ts",
4320
+ "browser": "./src/components/schedule-builder/schedule-builder.schema.ts",
4321
+ "node": "./dist/components/schedule-builder/schedule-builder.schema.js",
4322
+ "svelte": "./src/components/schedule-builder/schedule-builder.schema.ts",
4323
+ "import": "./src/components/schedule-builder/schedule-builder.schema.ts",
4324
+ "default": "./dist/components/schedule-builder/schedule-builder.schema.js"
4325
+ },
4326
+ "./schedule-builder/variables": {
4327
+ "types": "./dist/components/schedule-builder/schedule-builder.variables.d.ts",
4328
+ "browser": "./src/components/schedule-builder/schedule-builder.variables.ts",
4329
+ "node": "./dist/components/schedule-builder/schedule-builder.variables.js",
4330
+ "svelte": "./src/components/schedule-builder/schedule-builder.variables.ts",
4331
+ "import": "./src/components/schedule-builder/schedule-builder.variables.ts",
4332
+ "default": "./dist/components/schedule-builder/schedule-builder.variables.js"
4333
+ },
4334
+ "./schedule-builder/styles": {
4335
+ "types": "./dist/components/schedule-builder/schedule-builder.css.d.ts",
4336
+ "default": "./dist/components/schedule-builder/schedule-builder.css"
4337
+ },
4338
+ "./schedule-builder/examples": {
4339
+ "import": "./src/components/schedule-builder/schedule-builder.examples.json",
4340
+ "default": "./src/components/schedule-builder/schedule-builder.examples.json"
4341
+ },
4246
4342
  "./schema-form": {
4247
4343
  "types": "./dist/components/schema-form/index.d.ts",
4248
4344
  "browser": "./src/components/schema-form/index.ts",
@@ -6418,8 +6514,7 @@
6418
6514
  "diff-match-patch": "^1.0.5",
6419
6515
  "esm-env": "^1.2.0",
6420
6516
  "libphonenumber-js": "^1.13.3",
6421
- "qrcode": "^1.5.4",
6422
- "zod": "4.4.1"
6517
+ "qrcode": "^1.5.4"
6423
6518
  },
6424
6519
  "devDependencies": {
6425
6520
  "@changesets/parse": "0.4.3",
@@ -6446,7 +6541,8 @@
6446
6541
  "svelte-check": "^4.0.0",
6447
6542
  "svelte2tsx": "^0.7.33",
6448
6543
  "ts-morph": "^28.0.0",
6449
- "typescript": "^5.9.0"
6544
+ "typescript": "^5.9.0",
6545
+ "zod": "4.4.1"
6450
6546
  },
6451
6547
  "peerDependencies": {
6452
6548
  "@milkdown/ctx": "^7.17.3",
@@ -6480,7 +6576,8 @@
6480
6576
  "svelte": ">=5.56.0 <6",
6481
6577
  "unified": "^11.0.5",
6482
6578
  "unist-util-remove": "^4.0.0",
6483
- "unist-util-visit": "^5.0.0"
6579
+ "unist-util-visit": "^5.0.0",
6580
+ "zod": "4.4.1"
6484
6581
  },
6485
6582
  "peerDependenciesMeta": {
6486
6583
  "@milkdown/ctx": {
@@ -34,18 +34,18 @@ export type CommandItemRegistrationInput = {
34
34
  * Context provided by CommandPalette and consumed by CommandItem.
35
35
  */
36
36
  export type CommandListContext = {
37
- /** Stable id for the listbox; items compose their own ids from this. */
37
+ /** Live id for the listbox; items keep their ids in sync with it. */
38
38
  readonly listboxId: string;
39
39
  /** Id of the currently active (virtually focused) item, or null. */
40
40
  readonly activeItemId: string | null;
41
41
  /**
42
42
  * Called by each CommandItem when it mounts.
43
- * Returns a stable id and an unregister function.
43
+ * Returns a live id handle and an unregister function.
44
44
  */
45
45
  register: (
46
46
  input: CommandItemRegistrationInput,
47
47
  node: HTMLElement,
48
- ) => { id: string; unregister: () => void };
48
+ ) => { readonly id: string; unregister: () => void };
49
49
  /** Called by items on pointerenter to sync hover with arrow-key navigation. */
50
50
  setActiveById: (id: string) => void;
51
51
  /** Called by items and owners to activate the current item by id. */
@@ -1,6 +1,7 @@
1
1
  import { inDocumentOrder } from '../../utilities/document-order.ts';
2
2
  export class CommandListState {
3
- listboxId;
3
+ #getListboxId;
4
+ #registeredListboxId = $state('');
4
5
  registrations = $state([]);
5
6
  registrationsReady = $state(false);
6
7
  #itemCounter = 0;
@@ -15,7 +16,24 @@ export class CommandListState {
15
16
  ? this.#intendedActiveId
16
17
  : (this.enabledIds[0] ?? null));
17
18
  constructor(listboxId) {
18
- this.listboxId = listboxId;
19
+ this.#getListboxId = typeof listboxId === 'function' ? listboxId : () => listboxId;
20
+ this.#registeredListboxId = this.#getListboxId();
21
+ }
22
+ get listboxId() {
23
+ return this.#registeredListboxId;
24
+ }
25
+ syncListboxId(nextListboxId = this.#getListboxId()) {
26
+ const listboxId = nextListboxId;
27
+ if (this.#registeredListboxId === listboxId)
28
+ return;
29
+ this.#registeredListboxId = listboxId;
30
+ this.#intendedActiveId = null;
31
+ this.registrations = this.registrations.map((registration, index) => ({
32
+ ...registration,
33
+ id: updateRegistrationHandleId(registration, `${listboxId}-item-${index + 1}`),
34
+ }));
35
+ this.#itemCounter = this.registrations.length;
36
+ this.refreshRegistrationsReady();
19
37
  }
20
38
  resetActiveItem() {
21
39
  this.#intendedActiveId = null;
@@ -38,22 +56,26 @@ export class CommandListState {
38
56
  this.#intendedActiveId = id;
39
57
  }
40
58
  register(input, node) {
59
+ this.syncListboxId();
41
60
  const id = `${this.listboxId}-item-${++this.#itemCounter}`;
42
- this.registrations.push({
43
- id,
44
- node,
45
- getValue: input.getValue,
46
- getOnselect: input.getOnselect,
47
- getDisabled: input.getDisabled,
48
- });
49
- return {
61
+ const handle = $state({
50
62
  id,
51
63
  unregister: () => {
52
- const index = this.registrations.findIndex((registration) => registration.id === id);
64
+ const index = this.registrations.findIndex((registeredItem) => registeredItem.node === node);
53
65
  if (index !== -1)
54
66
  this.registrations.splice(index, 1);
55
67
  },
68
+ });
69
+ const registration = {
70
+ id,
71
+ node,
72
+ handle,
73
+ getValue: input.getValue,
74
+ getOnselect: input.getOnselect,
75
+ getDisabled: input.getDisabled,
56
76
  };
77
+ this.registrations.push(registration);
78
+ return handle;
57
79
  }
58
80
  activateItemById(id) {
59
81
  const record = this.registrations.find((registration) => registration.id === id);
@@ -122,13 +144,13 @@ export class CommandListState {
122
144
  return false;
123
145
  }
124
146
  createContext(activateItemById = (id) => void this.activateItemById(id)) {
125
- const listboxId = this.listboxId;
147
+ const getListboxId = () => this.listboxId;
126
148
  const getActiveItemId = () => this.activeItemId;
127
149
  const register = (input, node) => this.register(input, node);
128
150
  const setActiveById = (id) => this.setActiveById(id);
129
151
  return {
130
152
  get listboxId() {
131
- return listboxId;
153
+ return getListboxId();
132
154
  },
133
155
  get activeItemId() {
134
156
  return getActiveItemId();
@@ -142,3 +164,7 @@ export class CommandListState {
142
164
  export function createCommandListState(listboxId) {
143
165
  return new CommandListState(listboxId);
144
166
  }
167
+ function updateRegistrationHandleId(registration, id) {
168
+ registration.handle.id = id;
169
+ return id;
170
+ }
@@ -0,0 +1,168 @@
1
+ <script lang="ts">
2
+ import Button from '../button/button.svelte';
3
+ import { formatEditableArguments, parseJsonText } from './approval-card-state.ts';
4
+ let { idBase, requestKey, canEditArguments, argumentsValue, resolve } = $props();
5
+ const reasonId = $derived(`${idBase}-resolution-reason`);
6
+ const editorId = $derived(`${idBase}-edited-arguments`);
7
+ const editRegionId = $derived(`${idBase}-edit-region`);
8
+ const editDescriptionId = $derived(`${idBase}-edit-description`);
9
+ const editErrorId = $derived(`${idBase}-edit-error`);
10
+ let resolutionReason = $state('');
11
+ let rememberResolution = $state(false);
12
+ let editingArguments = $state(false);
13
+ let editedArgumentsText = $state('');
14
+ // A writable `$derived` that reads `requestKey` looked like the simpler
15
+ // reset mechanism, but a $derived re-runs whenever ANY parent prop update
16
+ // touches its host — not only when the tracked value actually changes —
17
+ // so it silently wiped in-progress reason text / edits on every unrelated
18
+ // host re-render. `{#key requestKey}` has the same intent but was
19
+ // unreliable in practice here (a fresh DOM node with a stale value).
20
+ // Comparing the previous value explicitly, inside the effect, is the
21
+ // one thing that's actually gated on requestKey CHANGING, not merely
22
+ // being re-touched.
23
+ let previousRequestKey = requestKey;
24
+ $effect(() => {
25
+ if (requestKey === previousRequestKey)
26
+ return;
27
+ previousRequestKey = requestKey;
28
+ resolutionReason = '';
29
+ rememberResolution = false;
30
+ // A new request must never leave a stale editor open, even if its
31
+ // arguments happen to serialize identically to the previous request's
32
+ // (the separate snapshot effect below wouldn't see a change in that
33
+ // case) — an edit must never be confirmed against the wrong request.
34
+ editingArguments = false;
35
+ editedArgumentsText = '';
36
+ });
37
+ // Separate from the identity reset above: a host can revise
38
+ // `operation.argsPreview` for the SAME request (e.g. a live update) while
39
+ // the edit panel is open. Comparing the formatted snapshot — not object
40
+ // identity, which changes on unrelated re-renders too — closes a stale
41
+ // editor whenever the underlying arguments actually change, so a confirmed
42
+ // edit can never be based on arguments older than what PayloadInspector is
43
+ // currently showing. Re-opening reseeds from the current value.
44
+ let previousArgumentsSnapshot = formatEditableArguments(argumentsValue);
45
+ $effect(() => {
46
+ const snapshot = formatEditableArguments(argumentsValue);
47
+ if (snapshot === previousArgumentsSnapshot)
48
+ return;
49
+ previousArgumentsSnapshot = snapshot;
50
+ editingArguments = false;
51
+ editedArgumentsText = '';
52
+ });
53
+ const editParseResult = $derived(parseJsonText(editedArgumentsText));
54
+ function emitResolution(decision, editedArgs) {
55
+ const trimmedReason = resolutionReason.trim();
56
+ const resolution = {
57
+ decision,
58
+ remember: rememberResolution,
59
+ };
60
+ if (decision === 'approve_with_edits') {
61
+ resolution.editedArgs = editedArgs;
62
+ }
63
+ if (trimmedReason) {
64
+ resolution.reason = trimmedReason;
65
+ }
66
+ resolve(resolution);
67
+ }
68
+ function toggleEditingArguments() {
69
+ if (!canEditArguments)
70
+ return;
71
+ if (!editingArguments) {
72
+ editedArgumentsText = formatEditableArguments(argumentsValue);
73
+ }
74
+ editingArguments = !editingArguments;
75
+ }
76
+ function handleConfirmEditedApproval() {
77
+ if (!canEditArguments || !editParseResult.ok)
78
+ return;
79
+ emitResolution('approve_with_edits', editParseResult.value);
80
+ }
81
+ </script>
82
+
83
+ <div class="cinder-approval-card__actions">
84
+ <div class="cinder-approval-card__resolution-controls">
85
+ <label class="cinder-approval-card__control-label" for={reasonId}>Reason</label>
86
+ <textarea
87
+ id={reasonId}
88
+ class="cinder-approval-card__textarea cinder-approval-card__textarea--reason"
89
+ bind:value={resolutionReason}
90
+ rows="2"
91
+ ></textarea>
92
+ </div>
93
+
94
+ <div class="cinder-approval-card__action-row" role="group" aria-label="Approval actions">
95
+ <label class="cinder-approval-card__remember-control">
96
+ <input type="checkbox" bind:checked={rememberResolution} />
97
+ <span>Don't ask again for operations like this</span>
98
+ </label>
99
+
100
+ <div class="cinder-approval-card__action-buttons">
101
+ <Button
102
+ type="button"
103
+ variant="ghost"
104
+ class="cinder-approval-card__dismiss"
105
+ onclick={() => emitResolution('cancel')}
106
+ >
107
+ Dismiss
108
+ </Button>
109
+ <Button type="button" variant="soft-danger" onclick={() => emitResolution('deny')}>
110
+ Deny
111
+ </Button>
112
+ {#if canEditArguments}
113
+ <Button
114
+ type="button"
115
+ variant="secondary"
116
+ onclick={toggleEditingArguments}
117
+ aria-expanded={editingArguments}
118
+ aria-controls={editingArguments ? editRegionId : undefined}
119
+ >
120
+ Approve with edits
121
+ </Button>
122
+ {/if}
123
+ <Button type="button" variant="primary" onclick={() => emitResolution('approve')}>
124
+ Approve
125
+ </Button>
126
+ </div>
127
+ </div>
128
+
129
+ {#if editingArguments && canEditArguments}
130
+ <div id={editRegionId} class="cinder-approval-card__editor">
131
+ <label class="cinder-approval-card__control-label" for={editorId}>
132
+ Edited arguments JSON
133
+ </label>
134
+ <p id={editDescriptionId} class="cinder-approval-card__muted">
135
+ Approving sends the parsed JSON below instead of the original arguments.
136
+ </p>
137
+ <textarea
138
+ id={editorId}
139
+ class="cinder-approval-card__textarea"
140
+ bind:value={editedArgumentsText}
141
+ rows="8"
142
+ spellcheck="false"
143
+ aria-describedby={editParseResult.ok
144
+ ? editDescriptionId
145
+ : `${editDescriptionId} ${editErrorId}`}
146
+ aria-invalid={editParseResult.ok ? undefined : 'true'}
147
+ {@attach (element) => {
148
+ element.focus();
149
+ }}
150
+ ></textarea>
151
+ {#if !editParseResult.ok}
152
+ <p id={editErrorId} class="cinder-approval-card__error" role="alert">
153
+ {editParseResult.message}
154
+ </p>
155
+ {/if}
156
+ <div class="cinder-approval-card__editor-actions">
157
+ <Button
158
+ type="button"
159
+ variant="primary"
160
+ onclick={handleConfirmEditedApproval}
161
+ disabled={!editParseResult.ok}
162
+ >
163
+ Confirm edited approval
164
+ </Button>
165
+ </div>
166
+ </div>
167
+ {/if}
168
+ </div>
@@ -1,5 +1,40 @@
1
- import type { ApprovalState } from './approval-card.types.ts';
1
+ import type { StatusDotStatus } from '../status-dot/status-dot.types.ts';
2
+ import type { ApprovalState, ApprovalToolRisk } from './approval-card.types.ts';
2
3
 
4
+ /** Character budget for the serialized arguments preview before truncation. */
5
+ export const ARGUMENTS_PREVIEW_MAX_CHARACTERS = 4_096;
6
+
7
+ /** Visible label for each risk level. */
8
+ export const RISK_LABELS = {
9
+ low: 'Low risk',
10
+ medium: 'Medium risk',
11
+ high: 'High risk',
12
+ } as const satisfies Record<ApprovalToolRisk, string>;
13
+
14
+ /** Visible label for each approval state. */
15
+ export const STATE_LABELS = {
16
+ pending: 'Pending',
17
+ approved: 'Approved',
18
+ approved_with_edits: 'Approved with edits',
19
+ denied: 'Denied',
20
+ expired: 'Expired',
21
+ cancelled: 'Cancelled',
22
+ } as const satisfies Record<ApprovalState, string>;
23
+
24
+ /** StatusDot status for each approval state. */
25
+ export const STATE_DOT_STATUS = {
26
+ pending: 'pending',
27
+ approved: 'success',
28
+ approved_with_edits: 'success',
29
+ denied: 'danger',
30
+ expired: 'neutral',
31
+ cancelled: 'offline',
32
+ } as const satisfies Record<ApprovalState, StatusDotStatus>;
33
+
34
+ /**
35
+ * Resolves the state shown to the approver: a pending approval whose
36
+ * expiration timestamp has passed presents as expired.
37
+ */
3
38
  export function resolveEffectiveApprovalState(
4
39
  approvalState: ApprovalState,
5
40
  expirationTimestamp: number | undefined,
@@ -9,6 +44,7 @@ export function resolveEffectiveApprovalState(
9
44
  return resolveComparisonTime(currentTime) >= expirationTimestamp ? 'expired' : approvalState;
10
45
  }
11
46
 
47
+ /** Whether approval actions may still be taken on the request. */
12
48
  export function isApprovalActionable(
13
49
  approvalState: ApprovalState,
14
50
  expirationTimestamp: number | undefined,
@@ -22,3 +58,118 @@ export function isApprovalActionable(
22
58
  function resolveComparisonTime(currentTime: number | undefined): number {
23
59
  return currentTime ?? Date.now();
24
60
  }
61
+
62
+ /** Parses an ISO expiration timestamp, returning undefined for invalid input. */
63
+ export function parseExpirationTimestamp(value: string | undefined): number | undefined {
64
+ if (!value) return undefined;
65
+ const timestamp = Date.parse(value);
66
+ return Number.isFinite(timestamp) ? timestamp : undefined;
67
+ }
68
+
69
+ /** Formats a millisecond duration as a compact countdown such as `2h 5m` or `45s`. */
70
+ export function formatRemainingTime(milliseconds: number): string {
71
+ const totalSeconds = Math.max(0, Math.ceil(milliseconds / 1_000));
72
+ const hours = Math.floor(totalSeconds / 3_600);
73
+ const minutes = Math.floor((totalSeconds % 3_600) / 60);
74
+ const seconds = totalSeconds % 60;
75
+
76
+ if (hours > 0) return `${hours}h ${minutes}m`;
77
+ if (minutes > 0) return `${minutes}m ${seconds}s`;
78
+ return `${seconds}s`;
79
+ }
80
+
81
+ /**
82
+ * Accepts serialized JSON strings as argument previews by parsing them into
83
+ * their structured form; any other value passes through unchanged.
84
+ */
85
+ export function normalizeArgumentsPreviewValue(value: unknown): unknown {
86
+ if (typeof value !== 'string') return value;
87
+
88
+ try {
89
+ return JSON.parse(value);
90
+ } catch {
91
+ return value;
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Bounds the arguments preview: values whose serialized form exceeds the
97
+ * character budget are replaced with a truncation notice and an excerpt.
98
+ */
99
+ export function prepareArgumentsPreview(value: unknown): { value: unknown; truncated: boolean } {
100
+ try {
101
+ const serialized = JSON.stringify(value);
102
+ if (typeof serialized !== 'string' || serialized.length <= ARGUMENTS_PREVIEW_MAX_CHARACTERS) {
103
+ // Pass the original value through unchanged — including strings.
104
+ // PayloadInspector does its own parsing/display/copy handling for
105
+ // strings; re-serializing here would hand it an already-quoted JSON
106
+ // string, which displays unquoted but copies quoted (a mismatch).
107
+ return { value, truncated: false };
108
+ }
109
+ return {
110
+ value: {
111
+ notice: 'Arguments preview truncated',
112
+ originalCharacters: serialized.length,
113
+ displayedCharacters: ARGUMENTS_PREVIEW_MAX_CHARACTERS,
114
+ excerpt: serialized.slice(0, ARGUMENTS_PREVIEW_MAX_CHARACTERS),
115
+ },
116
+ truncated: true,
117
+ };
118
+ } catch {
119
+ return { value, truncated: false };
120
+ }
121
+ }
122
+
123
+ /** Serializes the arguments preview as the editable JSON seed text. */
124
+ export function formatEditableArguments(value: unknown): string {
125
+ try {
126
+ const serialized = JSON.stringify(value, null, 2);
127
+ return serialized ?? 'null';
128
+ } catch {
129
+ return '{}';
130
+ }
131
+ }
132
+
133
+ /** Parses editor text as JSON, returning a friendly error for invalid input. */
134
+ export function parseJsonText(
135
+ text: string,
136
+ ): { ok: true; value: unknown } | { ok: false; message: string } {
137
+ try {
138
+ return { ok: true, value: JSON.parse(text) };
139
+ } catch {
140
+ return { ok: false, message: 'Edited arguments must be valid JSON.' };
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Reduces environment entries to unique variable names. Values accidentally
146
+ * supplied as `NAME=value` are stripped so no secret material is rendered.
147
+ */
148
+ export function sanitizeEnvironmentNames(names: string[]): string[] {
149
+ const seen = new Set<string>();
150
+ const sanitizedNames: string[] = [];
151
+
152
+ for (const name of names) {
153
+ const [firstPart] = name.split('=');
154
+ const sanitizedName = firstPart?.trim() ?? '';
155
+ if (!sanitizedName || seen.has(sanitizedName)) continue;
156
+ seen.add(sanitizedName);
157
+ sanitizedNames.push(sanitizedName);
158
+ }
159
+
160
+ return sanitizedNames;
161
+ }
162
+
163
+ /** Collapses duplicate file paths while preserving first-seen order. */
164
+ export function dedupeFilePaths(paths: string[]): string[] {
165
+ const seen = new Set<string>();
166
+ const uniquePaths: string[] = [];
167
+
168
+ for (const path of paths) {
169
+ if (seen.has(path)) continue;
170
+ seen.add(path);
171
+ uniquePaths.push(path);
172
+ }
173
+
174
+ return uniquePaths;
175
+ }