@kitn.ai/ui 0.25.2 → 0.27.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 (603) hide show
  1. package/README.md +17 -6
  2. package/bin/mcp.js +16 -3
  3. package/bin/route.js +23 -0
  4. package/bin/route.test.js +58 -0
  5. package/dist/{elements/chunks/Icon-b5A8hlHs.js → Icon-BnFKqqtY.js} +1 -1
  6. package/dist/action-icons-CBskfBMz.js +1 -0
  7. package/dist/arrow-down-Br0qtpsz.js +1 -0
  8. package/dist/arrow-left-Dj7xgE12.js +1 -0
  9. package/dist/artifact-CvXEm1lS.js +1 -0
  10. package/dist/assets/dev-5XzXYR21.js +91 -0
  11. package/dist/attachments-C43ZegEq.js +1 -0
  12. package/dist/audio-visualizer-B-79y1Tj.js +1 -0
  13. package/dist/badge-BpUbq8c0.js +1 -0
  14. package/dist/bash-InADTalH.js +1 -6
  15. package/dist/bell-sn17Ip9v.js +1 -0
  16. package/dist/{elements/chunks/button-B9okqG73.js → button-BH6rN0U-.js} +1 -1
  17. package/dist/card-renderer-Cb1gQmth.js +1 -0
  18. package/dist/card-routing-DifQgS7n.js +1 -0
  19. package/dist/check-DPeeMUYx.js +1 -0
  20. package/dist/checkbox-Dc9Yov_B.js +1 -0
  21. package/dist/checkbox-group-B1kDLLYk.js +1 -0
  22. package/dist/chevron-down-CHSWk7ZT.js +1 -0
  23. package/dist/chevron-right-B7l_fMgx.js +1 -0
  24. package/dist/choice-card-BT3c1S8g.js +1 -0
  25. package/dist/circle-Bb0yOpqM.js +1 -0
  26. package/dist/circle-check-BGZpCiz7.js +1 -0
  27. package/dist/circle-x-wobWkoSx.js +1 -0
  28. package/dist/{elements/chunks/cn-CU7UAWzk.js → cn-DN5AWfiS.js} +1 -1
  29. package/dist/code-block-CUQ5mtv0.js +1 -0
  30. package/dist/collapsible-CPJbf6FM.js +1 -0
  31. package/dist/components/attachment-types.d.ts +53 -1
  32. package/dist/components/attachments.d.ts +31 -0
  33. package/dist/components/audio-visualizer/fit-scale.d.ts +50 -0
  34. package/dist/components/audio-visualizer/index.d.ts +15 -1
  35. package/dist/components/audio-visualizer/variant-bar.d.ts +24 -1
  36. package/dist/components/card-renderer.d.ts +13 -0
  37. package/dist/components/card.d.ts +4 -0
  38. package/dist/components/chat-thread.d.ts +49 -42
  39. package/dist/components/code-block.d.ts +22 -0
  40. package/dist/components/conversation-item.d.ts +66 -1
  41. package/dist/components/conversation-list.d.ts +77 -0
  42. package/dist/components/form-widgets.d.ts +67 -2
  43. package/dist/components/form.d.ts +89 -0
  44. package/dist/components/message.d.ts +29 -0
  45. package/dist/components/reasoning.d.ts +6 -0
  46. package/dist/components/scroll-button.d.ts +11 -0
  47. package/dist/components/thread.d.ts +5 -0
  48. package/dist/components/toast.d.ts +2 -1
  49. package/dist/components/tool-types.d.ts +9 -0
  50. package/dist/components/voice-input.d.ts +8 -0
  51. package/dist/components/voice-output.d.ts +12 -1
  52. package/dist/components/workspace-shell.d.ts +87 -0
  53. package/dist/composer-CjngLzal.js +106 -0
  54. package/dist/confirm-card-DCx_A4bU.js +1 -0
  55. package/dist/construct-cli.es.js +1169 -0
  56. package/dist/context-BY8V-Nlp.js +1 -0
  57. package/dist/controllable-D43BKmtX.js +1 -0
  58. package/dist/conversation-list-D4lLU_yS.js +1 -0
  59. package/dist/copy-B6DO4PqB.js +1 -0
  60. package/dist/core-AYMC6_lb.js +12 -5874
  61. package/dist/{create-tween-CUzOlaMS.js → create-tween-BPzaefTp.js} +1 -1
  62. package/dist/{create-tween-B5Y4Im8G.js → create-tween-CnMHviKB.js} +1 -1
  63. package/dist/{create-tween-4z1XYLkR.js → create-tween-D1aiGZZh.js} +1 -1
  64. package/dist/{elements/chunks/create-tween-CUrM6D_o.js → create-tween-DUSQUKpr.js} +2 -2
  65. package/dist/css-M7EaDHN_.js +1 -6
  66. package/dist/custom-elements.json +3468 -1927
  67. package/dist/default-input-CucQEOqH.js +1 -0
  68. package/dist/define-CGGX-7Vg.js +1 -0
  69. package/dist/define.d.ts +4 -0
  70. package/dist/define.js +510 -0
  71. package/dist/define.server.d.ts +5 -0
  72. package/dist/define.server.js +506 -0
  73. package/dist/diagnostics/hook.d.ts +81 -0
  74. package/dist/diagnostics/index.d.ts +7 -0
  75. package/dist/diagnostics/report-request.d.ts +61 -0
  76. package/dist/diagnostics.d.ts +5 -0
  77. package/dist/diagnostics.js +209 -0
  78. package/dist/disclosure-CbLtajUQ.js +1 -0
  79. package/dist/dropdown-BwhViJFd.js +1 -0
  80. package/dist/elements/agent-card.js +1 -1
  81. package/dist/elements/artifact.js +1 -1
  82. package/dist/elements/attachments.js +1 -1
  83. package/dist/elements/audio-visualizer.js +1 -1
  84. package/dist/elements/autoloader.js +1 -1
  85. package/dist/elements/avatar.js +1 -1
  86. package/dist/elements/badge.js +1 -1
  87. package/dist/elements/button.js +1 -1
  88. package/dist/elements/card.js +1 -1
  89. package/dist/elements/cards.js +1 -1
  90. package/dist/elements/chain-of-thought.js +1 -1
  91. package/dist/elements/chat-scope-picker.js +1 -1
  92. package/dist/elements/chat-workspace.js +1 -1
  93. package/dist/elements/chat.js +1 -1
  94. package/dist/elements/checkbox-group.d.ts +1 -0
  95. package/dist/elements/checkbox-group.js +1 -0
  96. package/dist/elements/checkbox.d.ts +1 -0
  97. package/dist/elements/checkbox.js +1 -0
  98. package/dist/elements/checkpoint.js +1 -1
  99. package/dist/elements/choice.js +1 -1
  100. package/dist/elements/coachmark.js +1 -1
  101. package/dist/elements/code-block.js +1 -1
  102. package/dist/elements/command.js +1 -1
  103. package/dist/elements/compare.js +1 -1
  104. package/dist/elements/composer.js +1 -1
  105. package/dist/elements/confirm-card.js +1 -1
  106. package/dist/elements/context-meter.js +1 -1
  107. package/dist/elements/conversation-item.d.ts +1 -0
  108. package/dist/elements/conversation-item.js +1 -0
  109. package/dist/elements/conversation-list.js +1 -1
  110. package/dist/elements/default-input.d.ts +3 -3
  111. package/dist/elements/define-entry.d.ts +12 -0
  112. package/dist/elements/define.d.ts +27 -0
  113. package/dist/elements/diagnostic-events.d.ts +74 -0
  114. package/dist/elements/dialog.js +1 -1
  115. package/dist/elements/dock.d.ts +1 -0
  116. package/dist/elements/dock.js +243 -0
  117. package/dist/elements/dropdown.d.ts +1 -0
  118. package/dist/elements/dropdown.js +1 -0
  119. package/dist/elements/editable-label.js +1 -1
  120. package/dist/elements/element-data-types.d.ts +37 -0
  121. package/dist/elements/element-diagnostics.d.ts +81 -0
  122. package/dist/elements/embed.js +1 -1
  123. package/dist/elements/empty.js +1 -1
  124. package/dist/elements/feedback-bar.js +1 -1
  125. package/dist/elements/file-tree.js +1 -1
  126. package/dist/elements/file-upload.js +1 -1
  127. package/dist/elements/form.js +1 -1
  128. package/dist/elements/hover-card.js +1 -1
  129. package/dist/elements/icon.js +1 -1
  130. package/dist/elements/image.js +1 -1
  131. package/dist/elements/input.js +1 -1
  132. package/dist/elements/kbd.js +1 -1
  133. package/dist/elements/link-preview.js +1 -1
  134. package/dist/elements/loader.js +1 -1
  135. package/dist/elements/markdown.js +1 -1
  136. package/dist/elements/menu.js +1 -1
  137. package/dist/elements/message-skills.js +1 -1
  138. package/dist/elements/message.js +1 -1
  139. package/dist/elements/model-switcher.js +1 -1
  140. package/dist/elements/nav.js +1 -1
  141. package/dist/elements/notice.js +1 -1
  142. package/dist/elements/pane-grid.d.ts +1 -0
  143. package/dist/elements/pane-grid.js +1 -0
  144. package/dist/elements/pane-group.js +1 -1
  145. package/dist/elements/pane.js +1 -1
  146. package/dist/elements/popover.js +1 -1
  147. package/dist/elements/progress-bar.js +1 -1
  148. package/dist/elements/prompt-dock.js +1 -1
  149. package/dist/elements/prompt-input.js +1 -1
  150. package/dist/elements/prompt-suggestions.js +1 -1
  151. package/dist/elements/radio-group.d.ts +1 -0
  152. package/dist/elements/radio-group.js +1 -0
  153. package/dist/elements/reasoning.js +1 -1
  154. package/dist/elements/register.d.ts +2 -0
  155. package/dist/elements/remote.js +1 -1
  156. package/dist/elements/resizable.js +1 -1
  157. package/dist/elements/response-stream.js +3 -3
  158. package/dist/elements/screen.js +1 -1
  159. package/dist/elements/scroll-area.js +1 -1
  160. package/dist/elements/scroll-button.js +1 -1
  161. package/dist/elements/search.js +1 -1
  162. package/dist/elements/segmented.js +1 -1
  163. package/dist/elements/select.d.ts +1 -0
  164. package/dist/elements/select.js +1 -0
  165. package/dist/elements/separator.js +1 -1
  166. package/dist/elements/setting-item.js +1 -1
  167. package/dist/elements/settings-group.js +1 -1
  168. package/dist/elements/skeleton.js +1 -1
  169. package/dist/elements/slider.d.ts +1 -0
  170. package/dist/elements/slider.js +1 -0
  171. package/dist/elements/slots.d.ts +36 -4
  172. package/dist/elements/source.js +1 -1
  173. package/dist/elements/status.js +1 -1
  174. package/dist/elements/switch.js +1 -1
  175. package/dist/elements/tabs.js +1 -1
  176. package/dist/elements/tasks.js +1 -1
  177. package/dist/elements/text-shimmer.js +1 -1
  178. package/dist/elements/thinking-bar.js +1 -1
  179. package/dist/elements/thread.js +1 -1
  180. package/dist/elements/toast.js +1 -1
  181. package/dist/elements/tool.js +1 -1
  182. package/dist/elements/tooltip.js +1 -1
  183. package/dist/elements/voice-input.js +1 -1
  184. package/dist/elements/voice-output.js +1 -1
  185. package/dist/elements.d.ts +589 -167
  186. package/dist/{elements/chunks/ellipsis-CVxqfsDZ.js → ellipsis-DFr4Vqr3.js} +1 -1
  187. package/dist/embed-5s_vU4J0.js +1 -0
  188. package/dist/engine-javascript-vq0WuIJl.js +14 -2516
  189. package/dist/{elements/chunks/external-link-DG2sRdQL.js → external-link-u9d85ORQ.js} +1 -1
  190. package/dist/file-text-CX7_x42o.js +1 -0
  191. package/dist/{elements/chunks/file-tree-yGWNK0Js.js → file-tree-D3kBjXI5.js} +1 -1
  192. package/dist/folder-V-YdIL8f.js +1 -0
  193. package/dist/form-BRNUMCN2.js +1 -0
  194. package/dist/github-dark-dimmed-DUshB20C.js +1 -4
  195. package/dist/github-light-JYsPkUQd.js +1 -4
  196. package/dist/hover-card-DaeiYrTA.js +1 -0
  197. package/dist/html-CPZ3oZQ7.js +1 -10
  198. package/dist/icon-BpixdZNq.js +1 -0
  199. package/dist/{elements/chunks/index-BCRhi84a.js → index-xu_pdcPi.js} +1 -1
  200. package/dist/index.d.ts +3 -1
  201. package/dist/index.js +8473 -6470
  202. package/dist/index.server.js +6495 -4958
  203. package/dist/info-8mFsIjS3.js +1 -0
  204. package/dist/input-d1Yuu-hz.js +1 -0
  205. package/dist/javascript-C25yR2R2.js +1 -6
  206. package/dist/json-DxJze_jm.js +1 -6
  207. package/dist/kai-provider.es.js +40 -40
  208. package/dist/kai.es.js +1 -1
  209. package/dist/kbd-961zMPFB.js +1 -0
  210. package/dist/link-DlZZBGaR.js +1 -0
  211. package/dist/{elements/chunks/link-preview-Cf5KOP-i.js → link-preview-DIIbV2Sd.js} +1 -1
  212. package/dist/loader-YQszHFaW.js +1 -0
  213. package/dist/{elements/chunks/markdown-DbozyYqa.js → markdown-CVk1MPsj.js} +1 -1
  214. package/dist/mcp.es.js +3873 -544
  215. package/dist/message-CwKVEdZg.js +1 -0
  216. package/dist/message-DS8lzHc1.js +1 -0
  217. package/dist/message-circle-Xf8Q-vZp.js +1 -0
  218. package/dist/message-square-Cxnwgkns.js +1 -0
  219. package/dist/{elements/chunks/minimize-2-SegJ_oku.js → minimize-2-UEZmP2QT.js} +1 -1
  220. package/dist/{elements/chunks/model-switcher-D7JrFFHp.js → model-switcher-Kk1jEQ5t.js} +1 -1
  221. package/dist/{elements/chunks/overlay-CV7z2YuX.js → overlay-C1od6LOz.js} +1 -1
  222. package/dist/panel-right-ryET0yyn.js +1 -0
  223. package/dist/paperclip-BDNoZFJP.js +1 -0
  224. package/dist/play-OFIvYXUQ.js +1 -0
  225. package/dist/primitives/card-data-types.d.ts +49 -0
  226. package/dist/primitives/card-routing.d.ts +1 -33
  227. package/dist/primitives/card-validate.d.ts +2 -2
  228. package/dist/primitives/chat-config.d.ts +29 -2
  229. package/dist/primitives/field-mask.d.ts +96 -0
  230. package/dist/primitives/field-semantics.d.ts +36 -0
  231. package/dist/primitives/input-mask.d.ts +46 -0
  232. package/dist/primitives/url-scheme-policy.d.ts +34 -0
  233. package/dist/primitives/use-resize-observer.d.ts +23 -0
  234. package/dist/primitives/use-speech-recognition.d.ts +8 -0
  235. package/dist/primitives/use-text-stream.d.ts +5 -0
  236. package/dist/progress-bar-BvYX0aoy.js +1 -0
  237. package/dist/prompt-suggestion-BRFu2lcu.js +1 -0
  238. package/dist/radio-DcL23cNJ.js +1 -0
  239. package/dist/react/index.d.ts +306 -283
  240. package/dist/react.js +309 -247
  241. package/dist/reasoning-Cackq4Rh.js +1 -0
  242. package/dist/register-impl-C7rENvPK.js +424 -0
  243. package/dist/{elements/chunks/resizable-Dpzjlvp4.js → resizable-Cp9HUYih.js} +1 -1
  244. package/dist/rotate-ccw-0DLRDHH5.js +1 -0
  245. package/dist/rotate-cw-DOB9IGcU.js +1 -0
  246. package/dist/schemas/form.schema.json +21 -1
  247. package/dist/schemas/index.d.ts +1 -1
  248. package/dist/schemas/tool-defs.d.ts +45 -0
  249. package/dist/schemas.js +398 -305
  250. package/dist/scroll-area-emVmWP4K.js +1 -0
  251. package/dist/scroll-button-CeP_gv1x.js +1 -0
  252. package/dist/select-CWmu00tS.js +1 -0
  253. package/dist/{elements/chunks/separator-DH2r_ZSZ.js → separator-CE6vly6z.js} +1 -1
  254. package/dist/{elements/chunks/settings-BFMOd6yB.js → settings-CE-78SvZ.js} +1 -1
  255. package/dist/{elements/chunks/settings-group-B3VZKIcz.js → settings-group-ZFWNxFQR.js} +1 -1
  256. package/dist/{elements/chunks/skeleton-N8BuWYmf.js → skeleton-BebdP4mf.js} +1 -1
  257. package/dist/slider-BAKRYUlz.js +1 -0
  258. package/dist/slots-DaNjX0rc.js +1 -0
  259. package/dist/{solid-BMuDmFo_.js → solid-BE5ui6sy.js} +10672 -8116
  260. package/dist/{solid-CGYNdLRR.js → solid-DFhsce3O.js} +8137 -6056
  261. package/dist/solid.d.ts +15 -0
  262. package/dist/solid.js +248 -235
  263. package/dist/solid.server.js +248 -235
  264. package/dist/source-B0FlguSx.js +1 -0
  265. package/dist/star-CBMZvLuN.js +1 -0
  266. package/dist/state/index.d.ts +5 -1
  267. package/dist/state/mock.d.ts +32 -2
  268. package/dist/state/persistence.d.ts +51 -0
  269. package/dist/state/stream.d.ts +50 -0
  270. package/dist/state/threads.d.ts +71 -0
  271. package/dist/state.js +297 -172
  272. package/dist/store-7eoadydQ.js +1 -0
  273. package/dist/svelte--5p79yCD.js +1 -15
  274. package/dist/switch-CViARZCy.js +1 -0
  275. package/dist/tasks-card-MjCcOhR_.js +1 -0
  276. package/dist/text-shimmer-DKlwRF2G.js +1 -0
  277. package/dist/textarea-3ay2Me2-.js +1 -0
  278. package/dist/theme.tokens.css +82 -13
  279. package/dist/{elements/chunks/thumbs-up-DQe0hvkZ.js → thumbs-up-DQcu2HMO.js} +1 -1
  280. package/dist/toast-store-C6yKOhbk.js +1 -0
  281. package/dist/{elements/chunks/tool-C1YtxwPu.js → tool-BCYNlfKy.js} +1 -1
  282. package/dist/{elements/chunks/tooltip-BqwnFWhn.js → tooltip-05zI4hjs.js} +1 -1
  283. package/dist/trash-2-BR1RxGky.js +1 -0
  284. package/dist/{elements/chunks/triangle-alert-B6or7F5u.js → triangle-alert-DHohDOCy.js} +1 -1
  285. package/dist/tsx-B8rCNbgL.js +1 -6
  286. package/dist/types.d.ts +4 -2
  287. package/dist/typescript-RycA9KXf.js +1 -6
  288. package/dist/ui/checkbox-group.d.ts +83 -0
  289. package/dist/ui/checkbox.d.ts +40 -0
  290. package/dist/ui/dock.d.ts +131 -0
  291. package/dist/ui/hover-card.d.ts +44 -0
  292. package/dist/ui/icon.d.ts +3 -0
  293. package/dist/ui/input.d.ts +48 -2
  294. package/dist/ui/radio.d.ts +85 -0
  295. package/dist/ui/select.d.ts +71 -0
  296. package/dist/ui/slider.d.ts +65 -0
  297. package/dist/ui/switch.d.ts +9 -2
  298. package/dist/upload-BbGW6A_u.js +1 -0
  299. package/dist/url-scheme-policy-DHpoTJwB.js +1 -0
  300. package/dist/use-card-resolution-CJW4grFa.js +1 -0
  301. package/dist/{variant-aurora-DwSOfraQ.js → variant-aurora-BUOVgPOB.js} +27 -27
  302. package/dist/{variant-aurora-wKvAQ5wp.js → variant-aurora-CUsUJvFI.js} +28 -28
  303. package/dist/{variant-aurora-XEkPT0_z.js → variant-aurora-CW2i4bfr.js} +2 -2
  304. package/dist/{elements/chunks/variant-aurora-QXTZPyST.js → variant-aurora-xiMPty8f.js} +2 -2
  305. package/dist/variant-custom-BQtOnmeO.js +1 -0
  306. package/dist/{variant-custom-BhS9wIpU.js → variant-custom-CAm9L-E5.js} +65 -65
  307. package/dist/{variant-custom-eFIg2XWQ.js → variant-custom-CAnzzppW.js} +40 -40
  308. package/dist/variant-custom-D91HjAKz.js +1 -0
  309. package/dist/{variant-wave-CUWGx9Bn.js → variant-wave-Ca1Ls4_y.js} +21 -21
  310. package/dist/{variant-wave-CbVsmgwT.js → variant-wave-CxX39DKd.js} +25 -25
  311. package/dist/{variant-wave-BwzrHD1s.js → variant-wave-DYyzIIZv.js} +2 -2
  312. package/dist/{elements/chunks/variant-wave-DDCwhLas.js → variant-wave-uY5crU_K.js} +2 -2
  313. package/dist/vue-BmIZj4XD.js +1 -33
  314. package/dist/wire/chunk.d.ts +47 -0
  315. package/dist/wire/diagnostics.d.ts +575 -0
  316. package/dist/wire/encode-probe.d.ts +70 -0
  317. package/dist/wire/encode.d.ts +24 -0
  318. package/dist/wire/index.d.ts +2 -0
  319. package/dist/wire/sse.d.ts +10 -2
  320. package/dist/wire.js +917 -480
  321. package/dist/x-C5m1JFgi.js +1 -0
  322. package/frameworks/react/index.tsx +325 -108
  323. package/llms-full.txt +1354 -82
  324. package/llms.txt +6 -3
  325. package/package.json +39 -6
  326. package/src/agent-tooling/archetypes.ts +41 -9
  327. package/src/agent-tooling/catalog/README.md +676 -0
  328. package/src/agent-tooling/catalog/catalog-types.ts +231 -0
  329. package/src/agent-tooling/catalog/fabrications.ts +96 -0
  330. package/src/agent-tooling/catalog/invariants.ts +284 -0
  331. package/src/agent-tooling/catalog/labs-titles.ts +114 -0
  332. package/src/agent-tooling/catalog/scenarios.ts +87 -0
  333. package/src/agent-tooling/catalog/surfaces.ts +347 -0
  334. package/src/agent-tooling/construct/cli-entry.ts +8 -0
  335. package/src/agent-tooling/construct/cli.ts +131 -0
  336. package/src/agent-tooling/construct/codegen.ts +1353 -0
  337. package/src/agent-tooling/construct/construct.v1.schema.json +250 -0
  338. package/src/agent-tooling/construct/dev.ts +148 -0
  339. package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +7 -0
  340. package/src/agent-tooling/construct/fixtures/ops-console.construct.json +44 -0
  341. package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +23 -0
  342. package/src/agent-tooling/construct/schema.ts +371 -0
  343. package/src/agent-tooling/integrations/anthropic.ts +7 -1
  344. package/src/agent-tooling/integrations/cloudflare.ts +43 -2
  345. package/src/agent-tooling/integrations/langgraph.ts +7 -1
  346. package/src/agent-tooling/integrations/mastra.ts +7 -1
  347. package/src/agent-tooling/integrations/mock.ts +92 -17
  348. package/src/agent-tooling/integrations/ollama.ts +7 -1
  349. package/src/agent-tooling/integrations/openai.ts +7 -1
  350. package/src/agent-tooling/integrations/openrouter.ts +7 -1
  351. package/src/agent-tooling/integrations/pi.ts +56 -1
  352. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +7 -1
  353. package/src/agent-tooling/mcp/css-raw.d.ts +12 -0
  354. package/src/agent-tooling/mcp/manifest.ts +100 -1
  355. package/src/agent-tooling/mcp/server.ts +63 -6
  356. package/src/agent-tooling/mcp/tools/construct.ts +130 -0
  357. package/src/agent-tooling/mcp/tools/debug.ts +126 -4
  358. package/src/agent-tooling/mcp/tools/reference.ts +542 -5
  359. package/src/agent-tooling/mcp/tools/scaffold.ts +1834 -307
  360. package/src/agent-tooling/mcp/tools/theme.ts +146 -30
  361. package/src/agent-tooling/mcp/validate-args.ts +141 -0
  362. package/src/agent-tooling/recipes/composed-thread.ts +714 -0
  363. package/src/agent-tooling/recipes/index.ts +22 -0
  364. package/src/agent-tooling/recipes/types.ts +32 -0
  365. package/src/agent-tooling/registry.ts +24 -7
  366. package/src/agent-tooling/route-emit.ts +26 -2
  367. package/src/components/attachment-types.ts +54 -1
  368. package/src/components/attachments.tsx +169 -22
  369. package/src/components/audio-visualizer/fit-scale.ts +112 -0
  370. package/src/components/audio-visualizer/index.tsx +80 -3
  371. package/src/components/audio-visualizer/variant-aurora.tsx +10 -4
  372. package/src/components/audio-visualizer/variant-bar.tsx +38 -6
  373. package/src/components/audio-visualizer/variant-custom.tsx +8 -2
  374. package/src/components/audio-visualizer/variant-grid.tsx +16 -11
  375. package/src/components/audio-visualizer/variant-radial.tsx +15 -10
  376. package/src/components/audio-visualizer/variant-wave.tsx +7 -2
  377. package/src/components/card-renderer.tsx +39 -8
  378. package/src/components/card.tsx +10 -2
  379. package/src/components/chat-container.tsx +4 -1
  380. package/src/components/chat-scope-picker.tsx +2 -2
  381. package/src/components/chat-thread.tsx +105 -13
  382. package/src/components/choice-card.tsx +102 -37
  383. package/src/components/coachmark.tsx +1 -1
  384. package/src/components/code-block.tsx +81 -5
  385. package/src/components/composer.tsx +89 -8
  386. package/src/components/confirm-card.tsx +20 -4
  387. package/src/components/conversation-item.tsx +138 -4
  388. package/src/components/conversation-list.tsx +230 -15
  389. package/src/components/embed.tsx +4 -0
  390. package/src/components/empty.tsx +14 -3
  391. package/src/components/file-tree.tsx +5 -1
  392. package/src/components/form-widgets.tsx +257 -195
  393. package/src/components/form.tsx +336 -21
  394. package/src/components/loader.tsx +12 -5
  395. package/src/components/message-skills.tsx +1 -1
  396. package/src/components/message.tsx +142 -12
  397. package/src/components/prompt-input.tsx +7 -1
  398. package/src/components/prompt-suggestion.tsx +4 -1
  399. package/src/components/reasoning.tsx +30 -3
  400. package/src/components/response-compare.tsx +2 -2
  401. package/src/components/response-stream.tsx +13 -7
  402. package/src/components/screen.tsx +5 -0
  403. package/src/components/scroll-button.tsx +63 -4
  404. package/src/components/source.tsx +6 -1
  405. package/src/components/tasks-card.tsx +58 -16
  406. package/src/components/thread.tsx +10 -1
  407. package/src/components/toast.tsx +11 -5
  408. package/src/components/tool-types.ts +9 -0
  409. package/src/components/voice-input.tsx +35 -3
  410. package/src/components/voice-output.tsx +46 -6
  411. package/src/components/workspace-shell.tsx +285 -0
  412. package/src/diagnostics/hook.ts +352 -0
  413. package/src/diagnostics/index.ts +82 -0
  414. package/src/diagnostics/report-request.ts +296 -0
  415. package/src/elements/attachments.tsx +9 -8
  416. package/src/elements/audio-visualizer.tsx +48 -4
  417. package/src/elements/chat-workspace.tsx +159 -287
  418. package/src/elements/chat.tsx +31 -10
  419. package/src/elements/checkbox-group.tsx +164 -0
  420. package/src/elements/checkbox.tsx +134 -0
  421. package/src/elements/code-block.tsx +19 -1
  422. package/src/elements/command.tsx +4 -1
  423. package/src/elements/compiled.css +1 -1
  424. package/src/elements/composer.tsx +12 -1
  425. package/src/elements/conversation-item.tsx +120 -0
  426. package/src/elements/conversation-list.tsx +60 -11
  427. package/src/elements/default-input.tsx +5 -5
  428. package/src/elements/define-entry.ts +12 -0
  429. package/src/elements/define.tsx +168 -8
  430. package/src/elements/diagnostic-events.ts +114 -0
  431. package/src/elements/dialog.tsx +47 -0
  432. package/src/elements/disclosure.ts +34 -12
  433. package/src/elements/dock.tsx +215 -0
  434. package/src/elements/dropdown.tsx +123 -0
  435. package/src/elements/element-data-types.ts +40 -0
  436. package/src/elements/element-diagnostics.ts +392 -0
  437. package/src/elements/element-manifest.json +36 -0
  438. package/src/elements/element-meta.json +1483 -560
  439. package/src/elements/element-nonscalar.json +185 -0
  440. package/src/elements/element-types.d.ts +589 -167
  441. package/src/elements/feedback-bar.tsx +5 -0
  442. package/src/elements/icon-names.json +29 -0
  443. package/src/elements/input.tsx +312 -23
  444. package/src/elements/menu.tsx +13 -0
  445. package/src/elements/message.tsx +2 -0
  446. package/src/elements/pane-grid.tsx +111 -0
  447. package/src/elements/prompt-dock.tsx +2 -1
  448. package/src/elements/prompt-input.tsx +16 -10
  449. package/src/elements/radio-group.tsx +129 -0
  450. package/src/elements/register-impl.ts +52 -0
  451. package/src/elements/register.ts +28 -0
  452. package/src/elements/resizable.tsx +52 -25
  453. package/src/elements/scroll-button.tsx +59 -6
  454. package/src/elements/select.tsx +165 -0
  455. package/src/elements/slider.tsx +171 -0
  456. package/src/elements/slots.ts +108 -13
  457. package/src/elements/styles.css +119 -9
  458. package/src/elements/thinking-bar.tsx +16 -7
  459. package/src/elements/thread.tsx +2 -0
  460. package/src/elements/toast.tsx +17 -1
  461. package/src/elements/tool.tsx +26 -5
  462. package/src/elements/voice-input.tsx +11 -2
  463. package/src/elements/voice-output.tsx +16 -3
  464. package/src/index.ts +4 -1
  465. package/src/primitives/card-data-types.ts +49 -0
  466. package/src/primitives/card-host.tsx +4 -2
  467. package/src/primitives/card-routing.ts +7 -56
  468. package/src/primitives/card-schemas/form.schema.json +21 -1
  469. package/src/primitives/card-validate.ts +10 -2
  470. package/src/primitives/chat-config.tsx +33 -6
  471. package/src/primitives/field-mask.ts +256 -0
  472. package/src/primitives/field-semantics.ts +115 -0
  473. package/src/primitives/input-mask.ts +853 -0
  474. package/src/primitives/toast-store.ts +66 -4
  475. package/src/primitives/url-scheme-policy.ts +70 -0
  476. package/src/primitives/use-resize-observer.ts +33 -0
  477. package/src/primitives/use-speech-recognition.ts +12 -1
  478. package/src/primitives/use-stick-to-bottom.ts +34 -2
  479. package/src/primitives/use-text-stream.ts +33 -2
  480. package/src/remote/provider-runtime.ts +6 -3
  481. package/src/schemas/index.ts +1 -0
  482. package/src/schemas/tool-defs.ts +307 -6
  483. package/src/solid.ts +15 -0
  484. package/src/state/index.ts +13 -1
  485. package/src/state/mock.ts +92 -6
  486. package/src/state/persistence.ts +180 -0
  487. package/src/state/stream.ts +71 -4
  488. package/src/state/threads.ts +142 -0
  489. package/src/types.ts +4 -2
  490. package/src/ui/agent-card.tsx +2 -2
  491. package/src/ui/avatar.tsx +1 -1
  492. package/src/ui/checkbox-group.tsx +153 -0
  493. package/src/ui/checkbox.tsx +63 -0
  494. package/src/ui/dialog.tsx +6 -0
  495. package/src/ui/dock.tsx +584 -0
  496. package/src/ui/dropdown.tsx +67 -23
  497. package/src/ui/hover-card.tsx +156 -6
  498. package/src/ui/icon.tsx +53 -0
  499. package/src/ui/input.tsx +275 -16
  500. package/src/ui/kbd.tsx +1 -1
  501. package/src/ui/nav.tsx +1 -1
  502. package/src/ui/pane-group.tsx +2 -2
  503. package/src/ui/radio.tsx +150 -0
  504. package/src/ui/resizable.tsx +11 -0
  505. package/src/ui/select.tsx +168 -0
  506. package/src/ui/slider.tsx +178 -0
  507. package/src/ui/switch.tsx +49 -18
  508. package/src/utils/cn.ts +11 -5
  509. package/src/wire/chunk.ts +47 -0
  510. package/src/wire/consume.ts +185 -26
  511. package/src/wire/diagnostics.ts +727 -0
  512. package/src/wire/encode-probe.ts +214 -0
  513. package/src/wire/encode.ts +267 -14
  514. package/src/wire/formats/anthropic.ts +8 -1
  515. package/src/wire/formats/openai.ts +5 -0
  516. package/src/wire/index.ts +22 -0
  517. package/src/wire/read.ts +250 -6
  518. package/src/wire/sse.ts +16 -3
  519. package/theme.css +84 -13
  520. package/dist/elements/chunks/action-icons-DW9muWrY.js +0 -1
  521. package/dist/elements/chunks/arrow-left-iJVnQmxA.js +0 -1
  522. package/dist/elements/chunks/artifact-BSuPYFHY.js +0 -1
  523. package/dist/elements/chunks/attachments-CL6TaqIb.js +0 -1
  524. package/dist/elements/chunks/audio-visualizer-BuUqQmaO.js +0 -1
  525. package/dist/elements/chunks/badge-TIMiJFKc.js +0 -1
  526. package/dist/elements/chunks/bash-InADTalH.js +0 -1
  527. package/dist/elements/chunks/card-renderer-CSoTL_e1.js +0 -1
  528. package/dist/elements/chunks/card-routing-BK09BdmL.js +0 -1
  529. package/dist/elements/chunks/chat-thread-DxoKaStk.js +0 -1
  530. package/dist/elements/chunks/check-MdLzbxrm.js +0 -1
  531. package/dist/elements/chunks/chevron-down-MK7IzDqe.js +0 -1
  532. package/dist/elements/chunks/chevron-right-C5jXhmtV.js +0 -1
  533. package/dist/elements/chunks/choice-card-CGMc3kek.js +0 -1
  534. package/dist/elements/chunks/circle-BG7VkPep.js +0 -1
  535. package/dist/elements/chunks/circle-check-GqvO2UBs.js +0 -1
  536. package/dist/elements/chunks/circle-x-mhH7pOK2.js +0 -1
  537. package/dist/elements/chunks/code-block-ClhQO9RW.js +0 -1
  538. package/dist/elements/chunks/collapsible-DBcBkFPh.js +0 -1
  539. package/dist/elements/chunks/composer-CZZmtYOT.js +0 -69
  540. package/dist/elements/chunks/confirm-card-BWjf2-xo.js +0 -1
  541. package/dist/elements/chunks/context-hKjNqiyQ.js +0 -1
  542. package/dist/elements/chunks/conversation-list-CsGJjSKG.js +0 -1
  543. package/dist/elements/chunks/core-AYMC6_lb.js +0 -12
  544. package/dist/elements/chunks/css-M7EaDHN_.js +0 -1
  545. package/dist/elements/chunks/default-input-B1Mem5wu.js +0 -1
  546. package/dist/elements/chunks/define-B_tXMYRm.js +0 -1
  547. package/dist/elements/chunks/disclosure-DAoYOKew.js +0 -1
  548. package/dist/elements/chunks/download-DnCyWFJE.js +0 -1
  549. package/dist/elements/chunks/dropdown-CmNna5lT.js +0 -1
  550. package/dist/elements/chunks/embed-CjAD2jSi.js +0 -1
  551. package/dist/elements/chunks/engine-javascript-vq0WuIJl.js +0 -141
  552. package/dist/elements/chunks/file-text-D0J9F6M7.js +0 -1
  553. package/dist/elements/chunks/folder-NV1pi_ud.js +0 -1
  554. package/dist/elements/chunks/form-Cp8Y00Wn.js +0 -1
  555. package/dist/elements/chunks/github-dark-dimmed-DUshB20C.js +0 -1
  556. package/dist/elements/chunks/github-light-JYsPkUQd.js +0 -1
  557. package/dist/elements/chunks/hover-card-6KtXpLwT.js +0 -1
  558. package/dist/elements/chunks/html-CPZ3oZQ7.js +0 -1
  559. package/dist/elements/chunks/icon-97R8SR2p.js +0 -1
  560. package/dist/elements/chunks/info-C8r5Q6cc.js +0 -1
  561. package/dist/elements/chunks/input-DrseEjhp.js +0 -1
  562. package/dist/elements/chunks/javascript-C25yR2R2.js +0 -1
  563. package/dist/elements/chunks/json-DxJze_jm.js +0 -1
  564. package/dist/elements/chunks/kbd-OGJDUT-O.js +0 -1
  565. package/dist/elements/chunks/link-BdsfLB7b.js +0 -1
  566. package/dist/elements/chunks/loader-B5QzK_8_.js +0 -1
  567. package/dist/elements/chunks/message-CE4k-qaj.js +0 -1
  568. package/dist/elements/chunks/message-DtXKPqiR.js +0 -1
  569. package/dist/elements/chunks/message-square-C9ovmtOo.js +0 -1
  570. package/dist/elements/chunks/paperclip-Bg0ITU3b.js +0 -1
  571. package/dist/elements/chunks/progress-bar-D1_rzt6N.js +0 -1
  572. package/dist/elements/chunks/prompt-suggestion-D5Sm8xF1.js +0 -1
  573. package/dist/elements/chunks/reasoning-BrxQfpfI.js +0 -1
  574. package/dist/elements/chunks/rotate-cw-DzVDJOA1.js +0 -1
  575. package/dist/elements/chunks/scroll-area-93A1bbeG.js +0 -1
  576. package/dist/elements/chunks/scroll-button-CrTo7wm4.js +0 -1
  577. package/dist/elements/chunks/share-DgNbkJKY.js +0 -1
  578. package/dist/elements/chunks/slots-CIw9RlAe.js +0 -1
  579. package/dist/elements/chunks/source-w9V0NnBn.js +0 -1
  580. package/dist/elements/chunks/star-DHvACxtm.js +0 -1
  581. package/dist/elements/chunks/store-HIPGhNz9.js +0 -1
  582. package/dist/elements/chunks/svelte--5p79yCD.js +0 -1
  583. package/dist/elements/chunks/tasks-card-lPxoodlA.js +0 -1
  584. package/dist/elements/chunks/text-shimmer-BY_rI3s5.js +0 -1
  585. package/dist/elements/chunks/textarea-DPfuhswM.js +0 -1
  586. package/dist/elements/chunks/toast-store-VUZZBhzH.js +0 -1
  587. package/dist/elements/chunks/tsx-B8rCNbgL.js +0 -1
  588. package/dist/elements/chunks/typescript-RycA9KXf.js +0 -1
  589. package/dist/elements/chunks/use-card-resolution-DJg32jGH.js +0 -1
  590. package/dist/elements/chunks/variant-custom-D5ZlmziF.js +0 -1
  591. package/dist/elements/chunks/video-Bb86fVYI.js +0 -1
  592. package/dist/elements/chunks/vue-BmIZj4XD.js +0 -1
  593. package/dist/elements/chunks/x-BOhjBeOd.js +0 -1
  594. package/dist/llms/llms-full.txt +0 -2834
  595. package/dist/llms/llms.txt +0 -156
  596. package/dist/primitives/card-validate-generator.testlib.d.ts +0 -20
  597. package/dist/register-impl-DGmGzrEM.js +0 -145
  598. package/dist/ui/stat.d.ts +0 -16
  599. package/dist/variant-custom-MkTNTycd.js +0 -1
  600. package/src/primitives/card-validate-generator.testlib.ts +0 -38
  601. package/src/ui/stat.tsx +0 -41
  602. /package/dist/{elements/chunks/card-tags-D8lZ-C_U.js → card-tags-D8lZ-C_U.js} +0 -0
  603. /package/dist/{elements/chunks/link-preview-DNILK391.js → link-preview-DNILK391.js} +0 -0
@@ -0,0 +1,111 @@
1
+ import { createSignal, onMount, onCleanup, Index } from 'solid-js';
2
+ import { defineWebComponent } from './define';
3
+ import { PaneGrid } from '../ui/pane-grid';
4
+
5
+ interface Props extends Record<string, unknown> {
6
+ /** Minimum width of every pane, in px, before columns drop / the grid scrolls.
7
+ * Defaults to `280`. Attribute: `min-pane-width`. */
8
+ minPaneWidth?: number;
9
+ /** Minimum height of every pane, in px, before the grid scrolls vertically.
10
+ * Defaults to `200`. Attribute: `min-pane-height`. */
11
+ minPaneHeight?: number;
12
+ /** Column cap when the container is wide (default `3`). Attribute: `max-columns`. */
13
+ maxColumns?: number;
14
+ /** Gap between panes, any CSS length. Defaults to the kit gap
15
+ * (`var(--kai-pane-grid-gap, 0.5rem)`). Attribute: `gap`. */
16
+ gap?: string;
17
+ /** When set to a valid child index, render ONLY that pane full-bleed: a simple
18
+ * maximize hook the consumer drives (pair it with `<kai-pane>`'s `kai-maximize`
19
+ * event). Clear it (or point out of range) for the full tiled grid.
20
+ * Attribute: `maximized-index`. */
21
+ maximizedIndex?: number | null;
22
+ }
23
+
24
+ /** Attribute values arrive as strings; blank/invalid → undefined (the default). */
25
+ function num(value: unknown): number | undefined {
26
+ if (value == null || value === '') return undefined;
27
+ const n = Number(value);
28
+ return Number.isFinite(n) ? n : undefined;
29
+ }
30
+
31
+ /**
32
+ * `<kai-pane-grid>` — an N-pane responsive tiling grid with a min-size + scroll
33
+ * floor. Each direct light child is one tile: the grid fills up to `max-columns`
34
+ * columns when wide, DROPS columns as the container narrows so panes never squish
35
+ * below `min-pane-width`, then SCROLLS once even one column can't fit. Rows keep
36
+ * at least `min-pane-height` the same way. The natural children are `<kai-pane>` /
37
+ * `<kai-pane-group>`, but any elements tile.
38
+ *
39
+ * ```html
40
+ * <kai-pane-grid max-columns="2" min-pane-width="320" style="height: 480px">
41
+ * <kai-pane headline="Atlas">…</kai-pane>
42
+ * <kai-pane headline="Otto">…</kai-pane>
43
+ * <kai-pane headline="Nova">…</kai-pane>
44
+ * </kai-pane-grid>
45
+ * ```
46
+ *
47
+ * Maximize: set `maximized-index` to a child index to show only that pane
48
+ * full-bleed; clear it to restore. The grid never decides this itself — drive it
49
+ * from your own control (e.g. `<kai-pane>`'s `kai-maximize` event). Scalar
50
+ * attributes only; no events.
51
+ *
52
+ * Under the shadow root each pane child is projected through its own named slot
53
+ * (assigned automatically — an author-set `slot` attribute on a direct child is
54
+ * respected and left alone), so the light children become the grid tiles directly.
55
+ */
56
+ defineWebComponent<Props>('kai-pane-grid', {
57
+ minPaneWidth: undefined,
58
+ minPaneHeight: undefined,
59
+ maxColumns: undefined,
60
+ gap: undefined,
61
+ maximizedIndex: undefined,
62
+ }, (props, { element }) => {
63
+ // One named slot per direct light child, in child order. The slot names are
64
+ // written onto the children (`pane-<i>`), the same per-child-slot pattern
65
+ // <kai-resizable> uses (`p0`/`p1`/…): PaneGrid tiles its JSX children, and a
66
+ // single default <slot> would make ALL panes one tile. A child that already
67
+ // carries an author-set slot attribute outside our namespace is left alone
68
+ // (and therefore not tiled) — authoring escape hatch, same as unslotted text.
69
+ const [slotNames, setSlotNames] = createSignal<string[]>([]);
70
+
71
+ onMount(() => {
72
+ const read = () => {
73
+ const names: string[] = [];
74
+ let i = 0;
75
+ for (const child of Array.from(element.children)) {
76
+ const existing = child.getAttribute('slot');
77
+ if (existing !== null && !/^pane-\d+$/.test(existing)) continue; // author-owned
78
+ const name = `pane-${i++}`;
79
+ if (existing !== name) child.setAttribute('slot', name);
80
+ names.push(name);
81
+ }
82
+ // Structural equality: our own setAttribute('slot') writes re-fire the
83
+ // observer; an unchanged name list means an unchanged layout, so skip the
84
+ // re-render (mirrors <kai-resizable>'s itemsChanged guard).
85
+ if (names.length !== slotNames().length || names.some((n, j) => n !== slotNames()[j])) {
86
+ setSlotNames(names);
87
+ }
88
+ };
89
+ read();
90
+ const observer = new MutationObserver(read);
91
+ observer.observe(element, { childList: true });
92
+ onCleanup(() => observer.disconnect());
93
+ });
94
+
95
+ return (
96
+ <>
97
+ {/* A tiling grid fills its container — default the host to a stretching
98
+ block, same as <kai-resizable>. Give the element (or a parent) a height. */}
99
+ <style>{':host{display:block;height:100%;min-height:0;min-width:0}'}</style>
100
+ <PaneGrid
101
+ minPaneWidth={num(props.minPaneWidth)}
102
+ minPaneHeight={num(props.minPaneHeight)}
103
+ maxColumns={num(props.maxColumns)}
104
+ gap={props.gap as string | undefined}
105
+ maximizedIndex={num(props.maximizedIndex) ?? null}
106
+ >
107
+ <Index each={slotNames()}>{(name) => <slot name={name()} />}</Index>
108
+ </PaneGrid>
109
+ </>
110
+ );
111
+ });
@@ -23,7 +23,8 @@ type SlotName = (typeof SLOT_NAMES)[number];
23
23
 
24
24
  /**
25
25
  * `<kai-prompt-dock>` — a recessed tray that frames a prompt input and can extend
26
- * with optional "lip" regions above and/or below it. The input is the raised card
26
+ * with optional "lip" regions above and/or below it. It sits in the page flow and
27
+ * launches nothing; the floating corner launcher is `<kai-dock>`. The input is the raised card
27
28
  * that floats on the tray; the lips sit in a slightly darker recessed band sharing
28
29
  * the tray's rounding, so the whole thing reads as one cohesive control.
29
30
  *
@@ -27,9 +27,9 @@ interface Props extends Record<string, unknown> {
27
27
  /** What clicking a suggestion does: `'submit'` (default) sends it immediately
28
28
  * as if typed and submitted; `'fill'` just places it in the input. */
29
29
  suggestionMode?: 'submit' | 'fill';
30
- /** Show a Search (Globe) button in the left toolbar; clicking it fires a
31
- * `search` event. */
32
- search?: boolean;
30
+ /** Show a web-search (Globe) button in the left toolbar; clicking it fires a
31
+ * `kai-web-search` event. Attribute: `web-search`. */
32
+ webSearch?: boolean;
33
33
  /** Show a Voice (Mic) button in the left toolbar; clicking it fires a `voice`
34
34
  * event. */
35
35
  voice?: boolean;
@@ -49,7 +49,11 @@ interface Props extends Record<string, unknown> {
49
49
  attach?: boolean;
50
50
  /** Attachments to seed the input with (so a consumer can pre-populate staged
51
51
  * files without an upload). Set as a JS property; the element then manages its
52
- * own attachment state from there (add via the paperclip, remove per chip). */
52
+ * own attachment state from there (add via the paperclip, remove per chip).
53
+ * Each item's `url` must be a `data:` URI or an https URL, never
54
+ * `URL.createObjectURL`: a `blob:` URL previews perfectly and is meaningless
55
+ * outside this tab, so `toOpenAIMessages`/`toAnthropicMessages` refuse it.
56
+ * (The built-in paperclip already stages files as `data:` URIs.) */
53
57
  attachments?: AttachmentData[];
54
58
  /** Rich entity triggers. Each `{ char, kind, items }` opens a caret-anchored menu
55
59
  * that inserts an atomic pill. Convention: `/` → skills, `@` → agents (plugins
@@ -64,7 +68,9 @@ interface Props extends Record<string, unknown> {
64
68
  interface Events {
65
69
  /** The user submitted the prompt (Enter or send button). `value` is the
66
70
  * flattened text (back-compat); `doc` is the structured document and
67
- * `entities` the inserted pills (skills/agents) for downstream expansion. */
71
+ * `entities` the inserted pills (skills/agents) for downstream expansion.
72
+ * `<kai-prompt-input>` is the batteries-included composer row (send button,
73
+ * toolbar, attachment staging) built on `<kai-composer>`, the bare editor. */
68
74
  'kai-submit': { value: string; doc: ComposerDoc; entities: EntityRef[]; attachments: AttachmentData[] };
69
75
  /** The input changed (fires on every edit). Carries the flattened `value`
70
76
  * plus the structured `doc` + `entities`. */
@@ -75,8 +81,8 @@ interface Events {
75
81
  'kai-attachments-change': { attachments: AttachmentData[] };
76
82
  /** A suggestion was clicked while `suggestion-mode="fill"`. */
77
83
  'kai-suggestion-click': { value: string };
78
- /** The Search (Globe) toolbar button was clicked. */
79
- 'kai-search': Record<string, never>;
84
+ /** The web-search (Globe) toolbar button was clicked. */
85
+ 'kai-web-search': Record<string, never>;
80
86
  /** The Voice (Mic) toolbar button was clicked. */
81
87
  'kai-voice': Record<string, never>;
82
88
  /** The Stop button was clicked while `stoppable` and `loading` are both true. */
@@ -93,7 +99,7 @@ defineWebComponent<Props, Events>('kai-prompt-input', {
93
99
  loading: false,
94
100
  suggestions: undefined,
95
101
  suggestionMode: 'submit',
96
- search: false,
102
+ webSearch: false,
97
103
  voice: false,
98
104
  stoppable: false,
99
105
  submit: 'always',
@@ -215,7 +221,7 @@ defineWebComponent<Props, Events>('kai-prompt-input', {
215
221
  attach={flag('attach')}
216
222
  suggestions={props.suggestions}
217
223
  attachments={attachments()}
218
- search={flag('search')}
224
+ webSearch={flag('webSearch')}
219
225
  voice={flag('voice')}
220
226
  toolbarActions={toolbarActions()}
221
227
  triggers={props.triggers}
@@ -225,7 +231,7 @@ defineWebComponent<Props, Events>('kai-prompt-input', {
225
231
  onSubmit={handleSubmit}
226
232
  onSuggestionClick={handleSuggestionClick}
227
233
  onAttachmentsChange={(a) => { setAttachments(a); dispatch('kai-attachments-change', { attachments: a }); }}
228
- onSearch={() => dispatch('kai-search')}
234
+ onWebSearch={() => dispatch('kai-web-search')}
229
235
  onVoice={() => dispatch('kai-voice')}
230
236
  onStop={() => dispatch('kai-stop')}
231
237
  onAction={(id) => dispatch('kai-toolbar-action', { action: id })}
@@ -0,0 +1,129 @@
1
+ import { createEffect, createSignal, untrack } from 'solid-js';
2
+ import { defineWebComponent } from './define';
3
+ import { RadioGroup } from '../ui/radio';
4
+ // Public shape of the `options` prop; lives in ./element-data-types so the ROOT
5
+ // entry can re-export it (see that file's header).
6
+ import type { KaiRadioOption } from './element-data-types';
7
+
8
+ interface Props extends Record<string, unknown> {
9
+ /** The choices, top to bottom. Set as a JS PROPERTY (array), never an attribute. */
10
+ options: KaiRadioOption[];
11
+ /** Controlled selected `value`. Settable and reflected to the `value` attribute.
12
+ * `el.value = 'degraded'` drives it; choosing a row updates it and fires
13
+ * `kai-change`. Read `el.value` for live state. */
14
+ value?: string;
15
+ /** Shared form-control name for every radio in the group. Defaults to a generated
16
+ * id, so the group is exclusive and keyboard-navigable even when nothing is
17
+ * submitted. */
18
+ name?: string;
19
+ /** Disable every row. Individual rows carry their own `disabled`. */
20
+ disabled?: boolean;
21
+ /** Accessible name for the group. */
22
+ label?: string;
23
+ }
24
+
25
+ /** Events fired by `<kai-radio-group>`. */
26
+ interface Events {
27
+ /** A row was chosen. */
28
+ 'kai-change': { value: string };
29
+ }
30
+
31
+ /**
32
+ * `<kai-radio-group>` — the kit's "pick exactly one" control: a bordered, divided
33
+ * list over real `<input type="radio">`s that share a `name`, so one tab stop, arrow
34
+ * keys, mutual exclusion and form participation are the browser's and not a
35
+ * reimplementation.
36
+ *
37
+ * Feed it `options` (a JS-property array of `{ value, label, description?, disabled? }`),
38
+ * drive/read the selection with the `value` property (settable + reflected to the
39
+ * `value` attribute, so `:host([value])` and `el.value` see live state), and listen
40
+ * for `kai-change`.
41
+ *
42
+ * Re-rendering follows the kit's reactivity contract: hand it a NEW array reference,
43
+ * and a new object for any option whose content changed — the rows are a
44
+ * reference-keyed list, so mutating an option in place changes nothing on screen.
45
+ *
46
+ * ```html
47
+ * <kai-radio-group value="degraded" label="Severity"></kai-radio-group>
48
+ * <script type="module">
49
+ * import '@kitn.ai/ui/elements';
50
+ * const group = document.querySelector('kai-radio-group');
51
+ * group.options = [
52
+ * { value: 'blocking', label: 'Blocking', description: 'Pages the on-call' },
53
+ * { value: 'degraded', label: 'Degraded' },
54
+ * { value: 'cosmetic', label: 'Cosmetic' },
55
+ * ];
56
+ * group.addEventListener('kai-change', (e) => console.log(e.detail.value));
57
+ * group.value = 'cosmetic'; // drive it (no kai-change — the host already knows)
58
+ * </script>
59
+ * ```
60
+ */
61
+ defineWebComponent<Props, Events>('kai-radio-group', {
62
+ options: [],
63
+ value: undefined,
64
+ name: undefined,
65
+ disabled: undefined,
66
+ label: undefined,
67
+ }, (props, ctx) => {
68
+ const { element, dispatch, flag, expose } = ctx;
69
+
70
+ // Lift the selection into the facade and drive RadioGroup CONTROLLED so the host can
71
+ // read it (`el.value` / `:host([value])`) and set it after mount. Seed from the
72
+ // `value` property/attribute present on mount; nothing is auto-selected, because
73
+ // `options` normally arrives as a property AFTER upgrade (kai-segmented's structure).
74
+ const [value, setValue] = createSignal(
75
+ (props.value as string | undefined) ?? element.getAttribute('value') ?? '',
76
+ );
77
+
78
+ // Coerce anything arriving through the `value` setter (a JS assignment, or the
79
+ // attributeChangedCallback write-back) to a string, falling back to the live
80
+ // attribute when nullish so the reflect write-back equals the signal and the guards
81
+ // below absorb it — no attr⇄prop feedback loop.
82
+ const coerce = (v: unknown): string =>
83
+ v == null ? (element.getAttribute('value') ?? '') : String(v);
84
+
85
+ // Apply a new value and fire kai-change once (the user-choice path).
86
+ const apply = (next: string) => {
87
+ if (untrack(value) === next) return;
88
+ setValue(next);
89
+ dispatch('kai-change', { value: next });
90
+ };
91
+
92
+ Object.defineProperty(element, 'value', {
93
+ get: () => value(),
94
+ set: (v: unknown) => { const next = coerce(v); if (untrack(value) !== next) setValue(next); },
95
+ configurable: true,
96
+ enumerable: true,
97
+ });
98
+
99
+ // Reflect internal value → the `[value]` host attribute (for `:host([value])`).
100
+ createEffect(() => {
101
+ const v = value();
102
+ if (v) {
103
+ if (element.getAttribute('value') !== v) element.setAttribute('value', v);
104
+ } else if (element.hasAttribute('value')) {
105
+ element.removeAttribute('value');
106
+ }
107
+ });
108
+
109
+ expose({
110
+ /** Focus the group's tab stop. That is the selected radio, or the first row when
111
+ * nothing is selected yet. */
112
+ focus: (options?: FocusOptions) => {
113
+ const root = element.shadowRoot;
114
+ const radios = [...(root?.querySelectorAll<HTMLInputElement>('input[type="radio"]') ?? [])];
115
+ (radios.find((r) => r.checked) ?? radios[0])?.focus(options);
116
+ },
117
+ });
118
+
119
+ return (
120
+ <RadioGroup
121
+ options={(props.options ?? []) as KaiRadioOption[]}
122
+ value={value()}
123
+ name={props.name as string | undefined}
124
+ disabled={flag('disabled')}
125
+ label={props.label as string | undefined}
126
+ onChange={(next) => apply(next)}
127
+ />
128
+ );
129
+ });
@@ -3,7 +3,10 @@
3
3
  // from ./register.ts so the elements entry is SSR-import-safe — see the comment
4
4
  // there. This file is hand-maintained (the generator gen-element-api.mjs SKIPs
5
5
  // register.ts AND this file); keep the component import list here in sync.
6
+ import { installKaiDevtoolsHook } from '../diagnostics/hook';
7
+ import { emitElementRegistry } from './element-diagnostics';
6
8
  import './conversation-list';
9
+ import './conversation-item';
7
10
  import './prompt-input';
8
11
  import './chat';
9
12
  import './chat-workspace';
@@ -51,6 +54,11 @@ import './artifact';
51
54
  import './scroll-button';
52
55
  import './popover';
53
56
  import './switch';
57
+ import './checkbox';
58
+ import './checkbox-group';
59
+ import './radio-group';
60
+ import './slider';
61
+ import './select';
54
62
  import './button';
55
63
  import './avatar';
56
64
  import './badge';
@@ -77,6 +85,10 @@ import './compare';
77
85
  import './composer';
78
86
  // W3 phase 2: cascading action menu from a JSON items-tree
79
87
  import './menu';
88
+ // The same Dropdown surface with a consumer-owned body: you slot the rows
89
+ // instead of handing over an items tree (the shape a framework consumer needs
90
+ // when the rows are their own components).
91
+ import './dropdown';
80
92
  // W4 phase 1: grouped filterable command/mention palette
81
93
  import './command';
82
94
  // Prompt dock + settings building blocks (graduated from SolidJS prototypes)
@@ -87,10 +99,50 @@ import './setting-item';
87
99
  // Multi-agent workspace primitives (graduated from SolidJS prototypes)
88
100
  import './pane';
89
101
  import './pane-group';
102
+ import './pane-grid';
90
103
  import './agent-card';
91
104
  import './dialog';
105
+ import './dock';
92
106
  // Input & search field family
93
107
  import './input';
94
108
  import './search';
95
109
  import './kbd';
96
110
  import './editable-label';
111
+
112
+ // The devtools recorder hook, installed HERE because this file is already the
113
+ // browser-only half of the elements entry (register.ts gates it behind a window
114
+ // check and a dynamic import). So an app that registers the kai-* elements gets
115
+ // the hook with no work, while an SSR import of the entry still touches no
116
+ // global.
117
+ //
118
+ // At the BOTTOM, and it makes no difference: `import` declarations are hoisted,
119
+ // so every element module above has already evaluated by the time any statement
120
+ // in this file runs. Written here anyway so the order you read is the order that
121
+ // happens. Nothing above emits a diagnostic event, so there is nothing to miss.
122
+ //
123
+ // Idempotent and near-free: with no activation signal it allocates no buffer,
124
+ // makes no subscription, and leaves emission a guarded no-op. An app importing
125
+ // the SolidJS components directly never runs this file and must call
126
+ // `installKaiDevtoolsHook()` itself -- see the docblock in ../diagnostics/index.
127
+ installKaiDevtoolsHook();
128
+
129
+ // One registry snapshot, right after the hook installs and therefore after every
130
+ // element above has registered (import declarations are hoisted, so they all ran
131
+ // before this line).
132
+ //
133
+ // WHY HERE AND NOT INSIDE THE HOOK. The hook lives in ../diagnostics, which is
134
+ // its own rollup bundle and must stay free of any element import -- pulling the
135
+ // manifest in there would drag element bytes into a consumer who only parses
136
+ // streams. The dependency goes elements -> diagnostics, never back.
137
+ //
138
+ // WHY EMIT AT ALL WHEN A PANEL IS USUALLY NOT THERE YET. On the recording branch
139
+ // the hook has already subscribed by this point, so this snapshot lands in the
140
+ // history buffer and a panel attaching seconds later still sees the state at
141
+ // load -- which is the state that answers the hydration question. On the dormant
142
+ // branch `emitElementRegistry()` short-circuits on the active check and costs a
143
+ // symbol read.
144
+ //
145
+ // A panel attaching mid-session with no history gets no snapshot from here and
146
+ // should ask for a fresh one: `emitElementRegistry()` is exported from
147
+ // @kitn.ai/ui/elements for exactly that.
148
+ emitElementRegistry();
@@ -38,6 +38,34 @@ export type { CodeHighlightingOptions } from '../primitives/highlighter';
38
38
  export { classifyTool } from '../components/tool-classify';
39
39
  export type { ToolKind } from '../components/tool-classify';
40
40
 
41
+ // Element-layer diagnostics. `emitElementRegistry()` re-emits the which-elements-
42
+ // are-defined snapshot on demand, for a panel that attached mid-session and so
43
+ // missed the one register-impl emits at load. SSR-safe and a no-op with no
44
+ // subscriber, so calling it unconditionally is fine.
45
+ //
46
+ // WHY THIS ONE PRODUCER IS PUBLIC while `@kitn.ai/ui/diagnostics` deliberately
47
+ // keeps `emitWireDiagnostic`, `nextStreamId` and `setWirePayloadCapture`
48
+ // internal. That rule exists because a consumer able to forge events or reset
49
+ // the stream counter can make a panel lie about a stream that never happened,
50
+ // and one able to flip payload capture can start recording an app's users'
51
+ // conversations without the app deciding to. This function takes no arguments
52
+ // and reports nothing but `customElements.get()` over the manifest: there is no
53
+ // value to forge, no counter to move and no capture to arm. It can only tell the
54
+ // truth about the registry, which is the one thing a late-attaching panel cannot
55
+ // find out for itself.
56
+ //
57
+ // The event TYPES are re-exported here as well as from @kitn.ai/ui/diagnostics:
58
+ // a consumer already importing the elements entry should not have to add a
59
+ // second specifier to name the events it is handed.
60
+ export { emitElementRegistry } from './element-diagnostics';
61
+ export type {
62
+ ElementDiagnosticBase,
63
+ ElementDiagnosticEvent,
64
+ ElementRegistryEvent,
65
+ ElementViolationEvent,
66
+ ElementViolationKind,
67
+ } from './diagnostic-events';
68
+
41
69
  // Imperative toast API — usable directly from the elements entry so consumers
42
70
  // who only import the web-components bundle still get `toast()`. The store is
43
71
  // SSR-safe (no DOM touched until the first toast is raised on the client).
@@ -129,9 +129,16 @@ defineWebComponent<GroupProps, GroupEvents>('kai-resizable', {
129
129
  min: el.getAttribute('min') ?? undefined,
130
130
  max: el.getAttribute('max') ?? undefined,
131
131
  locked: el.hasAttribute('locked') && el.getAttribute('locked') !== 'false',
132
- // Honour both the `hidden` boolean attribute and the IDL property Solid
133
- // (and direct `el.hidden = true`) set the property, which doesn't reflect
134
- // to the attribute on a custom element.
132
+ // Honour both the `hidden` attribute and the property, because on THIS element
133
+ // they are two independent halves of the state and either can be the only one
134
+ // set. Not a fact about custom elements in general — a custom element that does
135
+ // not declare a `hidden` prop keeps the native reflecting accessor. It is a fact
136
+ // about this one: `<kai-resizable-item>` declares `hidden: false`, so
137
+ // component-register owns the property and nothing reflects. Measured:
138
+ // `el.hidden = true` writes no attribute, and after maximize writes the
139
+ // attribute `el.hidden` reads `undefined`. This union is what absorbs that, and
140
+ // it is why `hidden` is exempt from the reflectFlag migration rather than broken
141
+ // by it — see reflectItemConfig's doc below.
135
142
  hidden: el.hidden || (el.hasAttribute('hidden') && el.getAttribute('hidden') !== 'false'),
136
143
  collapsed,
137
144
  };
@@ -543,10 +550,22 @@ defineWebComponent<GroupProps, GroupEvents>('kai-resizable', {
543
550
  * *properties* — `el.size = "280px"` — but component-register only mirrors
544
551
  * attribute→property, never the reverse, so a property-set size never becomes an
545
552
  * attribute and the parent silently falls back to a flexible split. This is the
546
- * exact class of bug the `collapsed` reflection already fixed; extended here to
547
- * `size`/`min`/`max` (strings) and `locked` (boolean). `hidden` is deliberately
548
- * NOT reflected — native `el.hidden` reflects to the attribute on its own and the
549
- * parent honours the `hidden` property directly (and maximize drives `hidden`).
553
+ * exact class of bug the `collapsed` reflection already fixed; handled here for
554
+ * `size`/`min`/`max` (the STRINGS). The booleans — `collapsed` and `locked` go
555
+ * through `reflectFlag` in the facade body instead, which reflects AND keeps the
556
+ * property readable; see WebComponentContext.reflectFlag.
557
+ *
558
+ * `hidden` is deliberately NOT reflected, and NOT because it is already fine — it is
559
+ * split exactly like the others, and measurably so: `el.hidden = true` leaves no
560
+ * attribute (a plain `<div>` gets one), and after maximize writes the attribute
561
+ * `el.hidden` reads `undefined`. Declaring `hidden: false` is what does it — it makes
562
+ * `hidden` a component-register prop, whose non-reflecting accessor shadows the native
563
+ * reflecting one. What makes the split HARMLESS here is that both readers take the
564
+ * union, `el.hidden || el.hasAttribute('hidden')`, so neither half can be missed.
565
+ * Routing it through `reflectFlag` would put a second writer on an attribute the
566
+ * maximize/restore path already owns, so it is a behaviour decision of its own rather
567
+ * than part of the read-back fix. See the exemption in
568
+ * tests/elements/reflected-boolean-coverage.test.ts.
550
569
  *
551
570
  * Durability (don't fight drags): the parent WRITES `size` back to the live percent
552
571
  * during a drag (`persistSizes` → `setAttribute('size', …)`), and that attribute
@@ -568,7 +587,6 @@ defineWebComponent<GroupProps, GroupEvents>('kai-resizable', {
568
587
  export function reflectItemConfig(
569
588
  element: HTMLElement,
570
589
  props: { readonly size?: string; readonly min?: string; readonly max?: string },
571
- flag: (name: string) => boolean,
572
590
  ) {
573
591
  const norm = (v: unknown): string | null => (v == null || v === '' ? null : String(v));
574
592
  const reflectString = (name: 'size' | 'min' | 'max') => {
@@ -591,11 +609,11 @@ export function reflectItemConfig(
591
609
  reflectString('size');
592
610
  reflectString('min');
593
611
  reflectString('max');
594
- // Boolean: mirror the `collapsed`/`loading` precedent a bare `locked` attribute
595
- // and the IDL property are both honoured via `flag`. The parent also writes
596
- // `locked` during maximize/restore; because `flag` re-derives from that same
597
- // attribute state, the reflection stays self-consistent (no fight).
598
- createEffect(() => { element.toggleAttribute('locked', flag('locked')); });
612
+ // `locked` used to be reflected here too. It is a BOOLEAN, so it now goes through
613
+ // `reflectFlag` in the facade body next to `collapsed` a boolean reflected with a
614
+ // bare `toggleAttribute` reads back `undefined` (see WebComponentContext.reflectFlag),
615
+ // and `reflectFlag` is only reachable from the facade's context. What is left here is
616
+ // the string props, which is this helper's real subject: the drag-durability guard.
599
617
  }
600
618
 
601
619
  interface ItemProps extends Record<string, unknown> {
@@ -633,23 +651,32 @@ defineWebComponent<ItemProps>('kai-resizable-item', {
633
651
  locked: false,
634
652
  hidden: false,
635
653
  collapsed: false,
636
- }, (props, { element, flag }) => {
654
+ }, (props, { element, reflectFlag }) => {
637
655
  // Reflect the reactive `collapsed` prop to the `collapsed` ATTRIBUTE the parent
638
656
  // <kai-resizable> reads (and observes). This is what makes a bare JSX boolean
639
657
  // collapse the panel at INITIAL render from any framework: component-register
640
658
  // parses `<kai-resizable-item collapsed>` to `undefined` (not `true`), and a JSX
641
- // boolean sets neither `hidden` nor the IDL property — so `flag('collapsed')`
642
- // (which also honours the attribute) is the reliable source, and toggleAttribute
643
- // mirrors it back so the parent's readItems()/MutationObserver lay it out. Same
644
- // pattern as <kai-chat>'s `loading` reflection. We touch only `collapsed`, never
645
- // `hidden`, so the back-compat hidden path and maximize (which drive `hidden`)
646
- // are untouched.
647
- createEffect(() => { element.toggleAttribute('collapsed', flag('collapsed')); });
648
- // Reflect the other config props (`size`/`min`/`max`/`locked`) property→attribute
649
- // for the SAME reason a framework that sets them as DOM properties (React et al.)
650
- // would otherwise be invisible to the parent. See reflectItemConfig for the
659
+ // boolean sets neither `hidden` nor the IDL property — so the flag resolution
660
+ // (which also honours the attribute) is the reliable source, and the attribute is
661
+ // mirrored back so the parent's readItems()/MutationObserver lay it out. Same
662
+ // pattern as <kai-chat>'s `loading` reflection, and now literally the same code:
663
+ // `reflectFlag` also makes `el.collapsed` READ BACK, which a hand-rolled
664
+ // toggleAttribute effect does not (WebComponentContext.reflectFlag).
665
+ //
666
+ // We touch only `collapsed` and `locked`, never `hidden`, so the back-compat hidden
667
+ // path and maximize (which drive `hidden`) are untouched see the named exemption
668
+ // in tests/elements/reflected-boolean-coverage.test.ts for why `hidden` is a
669
+ // separate decision rather than an oversight.
670
+ reflectFlag('collapsed');
671
+ // `locked` is the parent's other boolean input; the parent also writes it during
672
+ // maximize/restore, and because the flag resolution re-derives from that same
673
+ // attribute state the reflection stays self-consistent (no fight).
674
+ reflectFlag('locked');
675
+ // Reflect the STRING config props (`size`/`min`/`max`) property→attribute for the
676
+ // SAME reason — a framework that sets them as DOM properties (React et al.) would
677
+ // otherwise be invisible to the parent. See reflectItemConfig for the
651
678
  // drag-durability guard on `size`.
652
- reflectItemConfig(element, props, flag);
679
+ reflectItemConfig(element, props);
653
680
  return (
654
681
  <>
655
682
  {/* The item host fills the panel's single grid cell (the panel stretches it on