@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
@@ -2,6 +2,9 @@ import type { HTMLAttributes } from 'svelte/elements';
2
2
 
3
3
  export type ApprovalToolRisk = 'low' | 'medium' | 'high';
4
4
 
5
+ /** Heading level rendered for the card title. Section headings render one level deeper. */
6
+ export type ApprovalCardHeadingLevel = 2 | 3 | 4 | 5 | 6;
7
+
5
8
  /** @schemaObject */
6
9
  export type ApprovalTool = {
7
10
  /** Human-readable tool name requesting approval. */
@@ -28,7 +31,7 @@ export type ApprovalCommandOperation = {
28
31
  kind: 'command';
29
32
  /** Shell command for command approvals. */
30
33
  command: string;
31
- /** File paths that the operation may read or write. */
34
+ /** File paths that the operation may read or write. Duplicate paths are collapsed for display. */
32
35
  filesTouched?: string[];
33
36
  /**
34
37
  * JSON-like argument preview shown to the approver.
@@ -42,7 +45,7 @@ export type ApprovalCommandOperation = {
42
45
  export type ApprovalFileWriteOperation = {
43
46
  /** Operation family being approved. */
44
47
  kind: 'file-write';
45
- /** File paths that the operation may read or write. File-write approvals require at least one path. */
48
+ /** File paths that the operation may read or write. File-write approvals require at least one path. Duplicate paths are collapsed for display. */
46
49
  filesTouched: string[];
47
50
  /**
48
51
  * JSON-like argument preview shown to the approver.
@@ -56,7 +59,7 @@ export type ApprovalFileWriteOperation = {
56
59
  export type ApprovalPatchOperation = {
57
60
  /** Operation family being approved. */
58
61
  kind: 'patch';
59
- /** File paths that the operation may read or write. */
62
+ /** File paths that the operation may read or write. Duplicate paths are collapsed for display. */
60
63
  filesTouched?: string[];
61
64
  /**
62
65
  * JSON-like argument preview shown to the approver.
@@ -72,7 +75,7 @@ export type ApprovalPatchOperation = {
72
75
  export type ApprovalOtherOperation = {
73
76
  /** Operation family being approved. */
74
77
  kind: 'other';
75
- /** File paths that the operation may read or write. */
78
+ /** File paths that the operation may read or write. Duplicate paths are collapsed for display. */
76
79
  filesTouched?: string[];
77
80
  /**
78
81
  * JSON-like argument preview shown to the approver.
@@ -117,18 +120,8 @@ export type ApprovalResolution = {
117
120
  };
118
121
 
119
122
  export type ApprovalCardCallbacks = {
120
- /** Called for approve, approve-with-edits, deny, and cancel with the complete resolution payload. */
123
+ /** Called for approve, approve-with-edits, deny, and dismiss with the complete resolution payload. */
121
124
  onresolve?: (resolution: ApprovalResolution) => void;
122
- /** Called when the approver accepts the operation as presented. */
123
- onapprove?: () => void;
124
- /** Called with parsed JSON arguments when the approver accepts edited arguments. */
125
- onapprovewithedits?: (editedArgs: unknown) => void;
126
- /** Called when the approver denies the operation. */
127
- ondeny?: () => void;
128
- /** Called when the approver asks the host application to remember the decision. */
129
- onremember?: () => void;
130
- /** Called when the approver cancels the approval prompt. */
131
- oncancel?: () => void;
132
125
  };
133
126
 
134
127
  /** Props for the ApprovalCard component. */
@@ -154,6 +147,8 @@ export type ApprovalCardProps = Omit<HTMLAttributes<HTMLElement>, 'class' | 'chi
154
147
  state: ApprovalState;
155
148
  /** Whether approving with edited JSON arguments is available. Default `false`. */
156
149
  editableArgs?: boolean;
150
+ /** Heading level for the card title; section headings render one level deeper. Default `3`. */
151
+ headingLevel?: ApprovalCardHeadingLevel;
157
152
  /** Additional CSS classes applied to the root element. */
158
153
  class?: string;
159
154
  };
@@ -161,8 +156,8 @@ export type ApprovalCardProps = Omit<HTMLAttributes<HTMLElement>, 'class' | 'chi
161
156
  /**
162
157
  * Cinder-specific schema surface for ApprovalCard.
163
158
  *
164
- * Callback props are documented but marked unsupported because functions cannot
165
- * be represented as JSON Schema controls.
159
+ * The resolution callback is documented but marked unsupported because
160
+ * functions cannot be represented as JSON Schema controls.
166
161
  */
167
162
  export type ApprovalCardSchemaProps = {
168
163
  /** Tool requesting approval. */
@@ -185,18 +180,10 @@ export type ApprovalCardSchemaProps = {
185
180
  state: ApprovalState;
186
181
  /** Whether approving with edited JSON arguments is available. Default `false`. */
187
182
  editableArgs?: boolean;
188
- /** Called when the approver accepts the operation as presented. */
189
- onapprove?: () => void;
190
- /** Called for approve, approve-with-edits, deny, and cancel with the complete resolution payload. */
183
+ /** Heading level for the card title; section headings render one level deeper. Default `3`. */
184
+ headingLevel?: ApprovalCardHeadingLevel;
185
+ /** Called for approve, approve-with-edits, deny, and dismiss with the complete resolution payload. */
191
186
  onresolve?: (resolution: ApprovalResolution) => void;
192
- /** Called with parsed JSON arguments when the approver accepts edited arguments. */
193
- onapprovewithedits?: (editedArgs: unknown) => void;
194
- /** Called when the approver denies the operation. */
195
- ondeny?: () => void;
196
- /** Called when the approver asks the host application to remember the decision. */
197
- onremember?: () => void;
198
- /** Called when the approver cancels the approval prompt. */
199
- oncancel?: () => void;
200
187
  /** Additional CSS classes applied to the root element. */
201
188
  class?: string;
202
189
  };
@@ -4,6 +4,7 @@ import ApprovalCard from './approval-card.svelte';
4
4
  export default ApprovalCard;
5
5
  export type {
6
6
  ApprovalCardCallbacks,
7
+ ApprovalCardHeadingLevel,
7
8
  ApprovalCardProps,
8
9
  ApprovalCardSchemaProps,
9
10
  ApprovalOperation,
@@ -95,6 +95,11 @@
95
95
  padding: 0;
96
96
  }
97
97
 
98
+ .cinder-card[data-cinder-padding='none'] > .cinder-card__header,
99
+ .cinder-card[data-cinder-padding='none'] > .cinder-card__footer {
100
+ padding: 0;
101
+ }
102
+
98
103
  .cinder-card[data-cinder-variant='well'] > .cinder-card__body {
99
104
  background: var(--cinder-surface-inset);
100
105
  }
@@ -28,7 +28,7 @@
28
28
  },
29
29
  "padding": {
30
30
  "enum": ["none", "default"],
31
- "description": "Body padding. `none` removes all padding for flush or full-bleed content (e.g. an image)."
31
+ "description": "Region padding. `none` removes body, header, and footer padding for flush or full-bleed content (e.g. an image)."
32
32
  },
33
33
  "headingLevel": {
34
34
  "enum": [2, 3, 4, 5, 6],
@@ -32,7 +32,7 @@ const schema = {
32
32
  padding: {
33
33
  enum: ['none', 'default'],
34
34
  description:
35
- 'Body padding. `none` removes all padding for flush or full-bleed content (e.g. an image).',
35
+ 'Region padding. `none` removes body, header, and footer padding for flush or full-bleed content (e.g. an image).',
36
36
  },
37
37
  headingLevel: {
38
38
  enum: [2, 3, 4, 5, 6],
@@ -37,6 +37,7 @@ const labelAttributes = $derived(hasGeneratedHeader
37
37
  data-cinder-variant={variant}
38
38
  data-cinder-tone={tone}
39
39
  data-cinder-edge-to-edge-mobile={edgeToEdgeOnMobile ? '' : undefined}
40
+ data-cinder-padding={padding}
40
41
  {...labelAttributes}
41
42
  >
42
43
  {#if header}
@@ -3,7 +3,7 @@ import type { HTMLAttributes } from 'svelte/elements';
3
3
  export type CardVariant = 'card' | 'well';
4
4
  export type CardTone = 'default' | 'muted';
5
5
  export type CardSurfaceTone = 'default' | 'danger';
6
- /** Controls body padding. `none` removes all padding for flush/full-bleed content. Future values like `compact` may be added. */
6
+ /** Controls region padding. `none` removes body, header, and footer padding for flush/full-bleed content. Future values like `compact` may be added. */
7
7
  export type CardPadding = 'default' | 'none';
8
8
  /** Heading level for the generated card title, so the document outline stays correct. */
9
9
  export type CardHeadingLevel = 2 | 3 | 4 | 5 | 6;
@@ -19,7 +19,7 @@ type CardBase = HTMLAttributes<HTMLDivElement> & {
19
19
  footerTone?: CardTone;
20
20
  /** Remove side borders/radius and bleed to the viewport edge on narrow screens. */
21
21
  edgeToEdgeOnMobile?: boolean;
22
- /** Body padding. `none` removes all padding for flush or full-bleed content (e.g. an image). */
22
+ /** Region padding. `none` removes body, header, and footer padding for flush or full-bleed content (e.g. an image). */
23
23
  padding?: CardPadding;
24
24
  };
25
25
  /** Basic card with no generated header. */
@@ -1,33 +1,464 @@
1
1
  /**
2
2
  * Conversation builders for the Chat component.
3
3
  *
4
- * Chat renders a {@link ConversationHistory} snapshot. These are thin aliases
5
- * over the published `conversationalist` builders so examples, demos, tests, and
6
- * simple apps construct the same transcript shape Chat consumes.
4
+ * Chat renders a {@link ConversationHistory} snapshot. These helpers construct
5
+ * the published Conversationalist shape without importing the package runtime
6
+ * into Cinder's browser graph.
7
7
  */
8
8
 
9
- import {
10
- appendAssistantMessage as appendConversationalistAssistantMessage,
11
- appendMessages as appendConversationalistMessages,
12
- appendUserMessage as appendConversationalistUserMessage,
13
- createConversationHistory,
14
- } from 'conversationalist';
9
+ import type {
10
+ ConversationEnvironment,
11
+ ConversationHistory,
12
+ ConversationStatus,
13
+ JSONValue,
14
+ Message,
15
+ MessageInput,
16
+ MultiModalContent,
17
+ TokenUsage,
18
+ ToolCall,
19
+ ToolResult,
20
+ } from './conversation-model.ts';
15
21
 
16
- import type { ConversationHistory, MessageInput } from './conversation-model.ts';
22
+ type CreateConversationOptions = {
23
+ id?: string;
24
+ title?: string;
25
+ status?: ConversationStatus;
26
+ metadata?: Record<string, JSONValue>;
27
+ };
28
+
29
+ type ConversationEnvironmentInput = Partial<ConversationEnvironment>;
30
+ type MessageContentInput = MessageInput['content'] | MultiModalContent;
31
+ type LooseMessageInput = Omit<MessageInput, 'content'> & { content: MessageContentInput };
32
+
33
+ const MESSAGE_ROLES = new Set([
34
+ 'user',
35
+ 'assistant',
36
+ 'system',
37
+ 'developer',
38
+ 'tool-call',
39
+ 'tool-result',
40
+ 'snapshot',
41
+ ]);
42
+ const CONVERSATION_STATUSES = new Set<ConversationStatus>(['active', 'archived', 'deleted']);
43
+
44
+ function createId(): string {
45
+ return globalThis.crypto?.randomUUID?.() ?? `message-${Date.now()}-${Math.random()}`;
46
+ }
47
+
48
+ function isRecord(value: unknown): value is Record<string, unknown> {
49
+ return typeof value === 'object' && value !== null;
50
+ }
51
+
52
+ function isJsonObject(value: unknown): value is Record<string, JSONValue> {
53
+ if (!isRecord(value) || Array.isArray(value)) return false;
54
+ const prototype = Object.getPrototypeOf(value);
55
+ return prototype === Object.prototype || prototype === null;
56
+ }
57
+
58
+ function isJsonValue(value: unknown): value is JSONValue {
59
+ if (value === null) return true;
60
+ switch (typeof value) {
61
+ case 'string':
62
+ case 'boolean':
63
+ return true;
64
+ case 'number':
65
+ return Number.isFinite(value);
66
+ case 'object':
67
+ if (Array.isArray(value)) return value.every(isJsonValue);
68
+ return isJsonObject(value) && Object.values(value).every(isJsonValue);
69
+ default:
70
+ return false;
71
+ }
72
+ }
73
+
74
+ function assertJsonObject(
75
+ value: unknown,
76
+ label: string,
77
+ ): asserts value is Record<string, JSONValue> {
78
+ if (!isJsonObject(value) || !Object.values(value).every(isJsonValue)) {
79
+ throw new Error(`${label} must be a JSON-compatible object`);
80
+ }
81
+ }
82
+
83
+ function isConversationEnvironmentParameter(value: unknown): value is ConversationEnvironmentInput {
84
+ if (!isRecord(value) || 'role' in value) return false;
85
+ return (
86
+ typeof value['now'] === 'function' ||
87
+ typeof value['randomId'] === 'function' ||
88
+ typeof value['estimateTokens'] === 'function' ||
89
+ (Array.isArray(value['plugins']) &&
90
+ value['plugins'].every((plugin) => typeof plugin === 'function'))
91
+ );
92
+ }
93
+
94
+ function isRoleHelperEnvironmentParameter(value: unknown): value is ConversationEnvironmentInput {
95
+ if (!isRecord(value) || 'role' in value) return false;
96
+ return (
97
+ typeof value['now'] === 'function' ||
98
+ typeof value['randomId'] === 'function' ||
99
+ typeof value['estimateTokens'] === 'function' ||
100
+ (Array.isArray(value['plugins']) &&
101
+ value['plugins'].length > 0 &&
102
+ value['plugins'].every((plugin) => typeof plugin === 'function'))
103
+ );
104
+ }
105
+
106
+ function isMultiModalContentPart(value: unknown): value is MultiModalContent {
107
+ if (!isJsonObject(value) || typeof value['type'] !== 'string') return false;
108
+ if (!Object.values(value).every(isJsonValue)) return false;
109
+ switch (value['type']) {
110
+ case 'text':
111
+ return typeof value['text'] === 'string';
112
+ case 'image':
113
+ return typeof value['url'] === 'string';
114
+ case 'thinking':
115
+ return typeof value['thinking'] === 'string';
116
+ case 'redacted_thinking':
117
+ return typeof value['data'] === 'string';
118
+ case 'server_tool_use':
119
+ return typeof value['id'] === 'string' && typeof value['name'] === 'string';
120
+ case 'web_search_tool_result':
121
+ return typeof value['tool_use_id'] === 'string' && 'content' in value;
122
+ case 'container_upload':
123
+ return typeof value['file_id'] === 'string';
124
+ default:
125
+ return false;
126
+ }
127
+ }
128
+
129
+ function isMessageContentInput(value: unknown): value is MessageContentInput {
130
+ return (
131
+ typeof value === 'string' ||
132
+ (Array.isArray(value) && value.every(isMultiModalContentPart)) ||
133
+ isMultiModalContentPart(value)
134
+ );
135
+ }
136
+
137
+ function isLooseMessageInput(value: unknown): value is LooseMessageInput {
138
+ return (
139
+ isRecord(value) &&
140
+ typeof value['role'] === 'string' &&
141
+ MESSAGE_ROLES.has(value['role']) &&
142
+ isMessageContentInput(value['content']) &&
143
+ (value['hidden'] === undefined || typeof value['hidden'] === 'boolean') &&
144
+ (value['goalCompleted'] === undefined || typeof value['goalCompleted'] === 'boolean')
145
+ );
146
+ }
147
+
148
+ function isMetadataRecord(value: unknown): value is Record<string, JSONValue> {
149
+ return isJsonObject(value);
150
+ }
151
+
152
+ function resolveEnvironment(environment?: ConversationEnvironmentInput): {
153
+ now: () => string;
154
+ randomId: () => string;
155
+ plugins: NonNullable<ConversationEnvironmentInput['plugins']>;
156
+ } {
157
+ const plugins = environment?.plugins ?? [];
158
+ if (!Array.isArray(plugins) || plugins.some((plugin) => typeof plugin !== 'function')) {
159
+ throw new Error('conversation environment plugins must be functions');
160
+ }
161
+ return {
162
+ now: environment?.now ?? (() => new Date().toISOString()),
163
+ randomId: environment?.randomId ?? createId,
164
+ plugins: [...plugins],
165
+ };
166
+ }
167
+
168
+ function cloneStructuredValue<T>(value: T): T {
169
+ return structuredClone(value);
170
+ }
171
+
172
+ function cloneMetadata(metadata: Record<string, JSONValue> | undefined): Record<string, JSONValue> {
173
+ if (metadata === undefined) return {};
174
+ assertJsonObject(metadata, 'metadata');
175
+ return cloneStructuredValue(metadata);
176
+ }
177
+
178
+ function normalizeContent(content: MessageContentInput): MessageInput['content'] {
179
+ if (typeof content === 'string') return content;
180
+ return Array.isArray(content) ? cloneStructuredValue(content) : [cloneStructuredValue(content)];
181
+ }
182
+
183
+ function cloneTokenUsage(tokenUsage: TokenUsage): TokenUsage {
184
+ assertJsonObject(tokenUsage, 'tokenUsage');
185
+ const values = Object.values(tokenUsage);
186
+ if (values.some((value) => typeof value !== 'number')) {
187
+ throw new Error('tokenUsage values must be numbers');
188
+ }
189
+ if (
190
+ values.some((value) => typeof value === 'number' && (!Number.isInteger(value) || value < 0))
191
+ ) {
192
+ throw new Error('tokenUsage values must be non-negative integers');
193
+ }
194
+ return cloneStructuredValue(tokenUsage);
195
+ }
196
+
197
+ function cloneToolCall(toolCall: ToolCall): ToolCall {
198
+ assertJsonObject(toolCall, 'toolCall');
199
+ if (
200
+ typeof toolCall.id !== 'string' ||
201
+ typeof toolCall.name !== 'string' ||
202
+ !('arguments' in toolCall) ||
203
+ !isJsonValue(toolCall.arguments)
204
+ ) {
205
+ throw new Error('toolCall must include string id, string name, and JSON arguments');
206
+ }
207
+ return cloneStructuredValue(toolCall);
208
+ }
209
+
210
+ function cloneToolResult(toolResult: ToolResult): ToolResult {
211
+ assertJsonObject(toolResult, 'toolResult');
212
+ if (
213
+ typeof toolResult.callId !== 'string' ||
214
+ !['success', 'error', 'action_required'].includes(String(toolResult.outcome)) ||
215
+ !('content' in toolResult) ||
216
+ !isJsonValue(toolResult.content)
217
+ ) {
218
+ throw new Error('toolResult must include string callId, valid outcome, and JSON content');
219
+ }
220
+ return cloneStructuredValue(toolResult);
221
+ }
222
+
223
+ function getOrderedMessages(conversation: ConversationHistory): Message[] {
224
+ return conversation.ids
225
+ .map((id) => conversation.messages[id])
226
+ .filter((message): message is Message => message !== undefined);
227
+ }
228
+
229
+ function buildToolCallIds(messages: ReadonlyArray<Message>): Set<string> {
230
+ const toolCallIds = new Set<string>();
231
+ for (const message of messages) {
232
+ if (message.role === 'tool-call' && message.toolCall !== undefined) {
233
+ if (toolCallIds.has(message.toolCall.id)) {
234
+ throw new Error(`duplicate toolCall.id in conversation: ${message.toolCall.id}`);
235
+ }
236
+ toolCallIds.add(message.toolCall.id);
237
+ }
238
+ }
239
+ return toolCallIds;
240
+ }
241
+
242
+ function assertValidToolMessage(input: LooseMessageInput, toolCallIds: Set<string>): void {
243
+ if (input.role === 'tool-result' && input.toolResult !== undefined) {
244
+ if (!toolCallIds.has(input.toolResult.callId)) {
245
+ throw new Error(`tool result references non-existent tool-call: ${input.toolResult.callId}`);
246
+ }
247
+ }
248
+ if (input.role === 'tool-call' && input.toolCall !== undefined) {
249
+ if (toolCallIds.has(input.toolCall.id)) {
250
+ throw new Error(`duplicate toolCall.id in conversation: ${input.toolCall.id}`);
251
+ }
252
+ toolCallIds.add(input.toolCall.id);
253
+ }
254
+ }
17
255
 
18
256
  /** Creates a new empty conversation snapshot. */
19
- const createConversation = createConversationHistory;
257
+ function createConversation(
258
+ options: CreateConversationOptions = {},
259
+ environment?: ConversationEnvironmentInput,
260
+ ): ConversationHistory {
261
+ const resolvedEnvironment = resolveEnvironment(environment);
262
+ const createdAt = resolvedEnvironment.now();
263
+ const conversationId = options.id ?? resolvedEnvironment.randomId();
264
+ if (typeof conversationId !== 'string') {
265
+ throw new Error('conversation id must be a string');
266
+ }
267
+ if (typeof createdAt !== 'string') {
268
+ throw new Error('conversation timestamp must be a string');
269
+ }
270
+ if (options.title !== undefined && typeof options.title !== 'string') {
271
+ throw new Error('conversation title must be a string');
272
+ }
273
+ if (options.status !== undefined && !CONVERSATION_STATUSES.has(options.status)) {
274
+ throw new Error('conversation status must be active, archived, or deleted');
275
+ }
276
+ return {
277
+ schemaVersion: 4,
278
+ id: conversationId,
279
+ ...(options.title !== undefined ? { title: options.title } : {}),
280
+ status: options.status ?? 'active',
281
+ metadata: cloneMetadata(options.metadata),
282
+ ids: [],
283
+ messages: {},
284
+ createdAt,
285
+ updatedAt: createdAt,
286
+ };
287
+ }
288
+
289
+ function materializeMessage(
290
+ input: LooseMessageInput,
291
+ position: number,
292
+ createdAt: string,
293
+ id: string,
294
+ ): Message {
295
+ return {
296
+ id,
297
+ role: input.role,
298
+ content: normalizeContent(input.content),
299
+ position,
300
+ createdAt,
301
+ metadata: cloneMetadata(input.metadata),
302
+ hidden: input.hidden ?? false,
303
+ ...(input.toolCall !== undefined ? { toolCall: cloneToolCall(input.toolCall) } : {}),
304
+ ...(input.toolResult !== undefined ? { toolResult: cloneToolResult(input.toolResult) } : {}),
305
+ ...(input.tokenUsage !== undefined ? { tokenUsage: cloneTokenUsage(input.tokenUsage) } : {}),
306
+ ...(input.role === 'assistant' && input.goalCompleted !== undefined
307
+ ? { goalCompleted: input.goalCompleted }
308
+ : {}),
309
+ };
310
+ }
311
+
312
+ function partitionAppendArguments(args: unknown[]): {
313
+ inputs: LooseMessageInput[];
314
+ environment?: ConversationEnvironmentInput;
315
+ } {
316
+ const filteredArguments = args.at(-1) === undefined ? args.slice(0, -1) : args;
317
+ if (filteredArguments.some((argument) => argument === undefined)) {
318
+ throw new Error(
319
+ 'appendMessages expected MessageInput arguments before the optional environment',
320
+ );
321
+ }
322
+ const lastArgument = filteredArguments.at(-1);
323
+ const inputArguments = isConversationEnvironmentParameter(lastArgument)
324
+ ? filteredArguments.slice(0, -1)
325
+ : filteredArguments;
326
+ const inputs: LooseMessageInput[] = [];
327
+ for (const argument of inputArguments) {
328
+ if (!isLooseMessageInput(argument)) {
329
+ throw new Error(
330
+ 'appendMessages expected MessageInput arguments before the optional environment',
331
+ );
332
+ }
333
+ inputs.push(argument);
334
+ }
335
+ if (isConversationEnvironmentParameter(lastArgument)) {
336
+ return { inputs, environment: lastArgument };
337
+ }
338
+ return { inputs };
339
+ }
20
340
 
21
341
  /** Appends one or more messages, preserving the previous no-op identity contract. */
22
342
  function appendMessages(
23
343
  conversation: ConversationHistory,
24
344
  ...inputs: MessageInput[]
345
+ ): ConversationHistory;
346
+ function appendMessages(
347
+ conversation: ConversationHistory,
348
+ ...inputsAndEnvironment: [...MessageInput[], ConversationEnvironmentInput | undefined]
349
+ ): ConversationHistory;
350
+ function appendMessages(
351
+ conversation: ConversationHistory,
352
+ ...args: unknown[]
25
353
  ): ConversationHistory {
354
+ const { inputs, environment } = partitionAppendArguments(args);
26
355
  if (inputs.length === 0) return conversation;
27
- return appendConversationalistMessages(conversation, ...inputs);
356
+ const resolvedEnvironment = resolveEnvironment(environment);
357
+ const updatedAt = resolvedEnvironment.now();
358
+ if (typeof updatedAt !== 'string') {
359
+ throw new Error('conversation timestamp must be a string');
360
+ }
361
+ const nextIds = [...conversation.ids];
362
+ const nextMessages = { ...conversation.messages };
363
+ const toolCallIds = buildToolCallIds(getOrderedMessages(conversation));
364
+
365
+ inputs.forEach((input, index) => {
366
+ const normalizedInput: MessageInput = { ...input, content: normalizeContent(input.content) };
367
+ const processedInput = resolvedEnvironment.plugins.reduce(
368
+ (current, plugin) => plugin(current),
369
+ normalizedInput,
370
+ );
371
+ if (!isLooseMessageInput(processedInput)) {
372
+ throw new Error('conversation plugin returned an invalid MessageInput');
373
+ }
374
+ assertValidToolMessage(processedInput, toolCallIds);
375
+ const messageId = resolvedEnvironment.randomId();
376
+ if (typeof messageId !== 'string') {
377
+ throw new Error('generated message id must be a string');
378
+ }
379
+ if (nextMessages[messageId] !== undefined || nextIds.includes(messageId)) {
380
+ throw new Error(`duplicate message id in conversation: ${messageId}`);
381
+ }
382
+ const message = materializeMessage(
383
+ processedInput,
384
+ conversation.ids.length + index,
385
+ updatedAt,
386
+ messageId,
387
+ );
388
+ nextIds.push(message.id);
389
+ nextMessages[message.id] = message;
390
+ });
391
+
392
+ return {
393
+ ...conversation,
394
+ ids: nextIds,
395
+ messages: nextMessages,
396
+ updatedAt,
397
+ };
28
398
  }
29
399
 
30
- const appendUserMessage = appendConversationalistUserMessage;
31
- const appendAssistantMessage = appendConversationalistAssistantMessage;
400
+ function appendUserMessage(
401
+ conversation: ConversationHistory,
402
+ content: MessageInput['content'],
403
+ metadata?: Record<string, JSONValue>,
404
+ environment?: ConversationEnvironmentInput,
405
+ ): ConversationHistory;
406
+ function appendUserMessage(
407
+ conversation: ConversationHistory,
408
+ content: MessageInput['content'],
409
+ environment?: ConversationEnvironmentInput,
410
+ ): ConversationHistory;
411
+ function appendUserMessage(
412
+ conversation: ConversationHistory,
413
+ content: MessageInput['content'],
414
+ metadataOrEnvironment?: Record<string, JSONValue> | ConversationEnvironmentInput,
415
+ environment?: ConversationEnvironmentInput,
416
+ ): ConversationHistory {
417
+ const metadata = resolveRoleHelperMetadata(metadataOrEnvironment, environment);
418
+ const resolvedEnvironment =
419
+ environment ??
420
+ (isRoleHelperEnvironmentParameter(metadataOrEnvironment) ? metadataOrEnvironment : undefined);
421
+ return appendMessages(conversation, { role: 'user', content, metadata }, resolvedEnvironment);
422
+ }
423
+
424
+ function appendAssistantMessage(
425
+ conversation: ConversationHistory,
426
+ content: MessageInput['content'],
427
+ metadata?: Record<string, JSONValue>,
428
+ environment?: ConversationEnvironmentInput,
429
+ ): ConversationHistory;
430
+ function appendAssistantMessage(
431
+ conversation: ConversationHistory,
432
+ content: MessageInput['content'],
433
+ environment?: ConversationEnvironmentInput,
434
+ ): ConversationHistory;
435
+ function appendAssistantMessage(
436
+ conversation: ConversationHistory,
437
+ content: MessageInput['content'],
438
+ metadataOrEnvironment?: Record<string, JSONValue> | ConversationEnvironmentInput,
439
+ environment?: ConversationEnvironmentInput,
440
+ ): ConversationHistory {
441
+ const metadata = resolveRoleHelperMetadata(metadataOrEnvironment, environment);
442
+ const resolvedEnvironment =
443
+ environment ??
444
+ (isRoleHelperEnvironmentParameter(metadataOrEnvironment) ? metadataOrEnvironment : undefined);
445
+ return appendMessages(
446
+ conversation,
447
+ { role: 'assistant', content, metadata },
448
+ resolvedEnvironment,
449
+ );
450
+ }
451
+
452
+ function resolveRoleHelperMetadata(
453
+ metadataOrEnvironment: Record<string, JSONValue> | ConversationEnvironmentInput | undefined,
454
+ environment: ConversationEnvironmentInput | undefined,
455
+ ): Record<string, JSONValue> | undefined {
456
+ if (metadataOrEnvironment === undefined) return undefined;
457
+ if (environment === undefined && isRoleHelperEnvironmentParameter(metadataOrEnvironment)) {
458
+ return undefined;
459
+ }
460
+ if (isMetadataRecord(metadataOrEnvironment)) return metadataOrEnvironment;
461
+ throw new Error('metadata must be a JSON-compatible object');
462
+ }
32
463
 
33
464
  export { appendAssistantMessage, appendMessages, appendUserMessage, createConversation };