@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,296 @@
1
+ // `reportRequest` — the app hands over what it actually sent.
2
+ //
3
+ // ★ THE ONE THING IN THIS STREAM THE KIT DOES NOT OBSERVE FOR ITSELF.
4
+ //
5
+ // Everything else here is the kit reporting on its own work: it parsed those
6
+ // frames, it encoded that thread, so it can describe them without being told.
7
+ // The request that leaves the app is different in kind. In the normal shape the
8
+ // app's SERVER ROUTE adds the system prompt, chooses the model, and performs any
9
+ // RAG or guardrail injection, and none of that passes through the kit at all --
10
+ // which is exactly why `encode.request.systemMessages` is always 0. That 0 is
11
+ // the kit saying "the system prompt is being added somewhere I cannot see".
12
+ //
13
+ // This is the seam for making that somewhere visible, and it is DELIBERATE
14
+ // DISCLOSURE rather than collection. The kit does not wrap fetch, does not
15
+ // monkey-patch anything, and never reads a request the app did not hand over.
16
+ // That is not caution, it is the scope rule: what a request contains, and
17
+ // whether an observer may see it, is a decision that lands in the app's own
18
+ // policy document. The kit decides HOW a disclosure is shaped -- metadata by
19
+ // default, content behind the payload switch, credentials never -- and the app
20
+ // decides WHETHER to make one.
21
+ //
22
+ // It is also why this producer is public while `emitWireDiagnostic` stays
23
+ // internal, which otherwise looks inconsistent. A general emitter lets a
24
+ // consumer forge any event and make a panel lie about a stream that never
25
+ // happened. This one emits a single type whose entire content is "what the app
26
+ // says it sent" -- and on that subject the app is the authority, so there is
27
+ // nothing here to forge.
28
+ //
29
+ // SSR-safe: no `window`, no `document`, nothing global at module scope. An app
30
+ // that reports from a server route is a normal caller, not an edge case.
31
+ import {
32
+ emitWireDiagnostic,
33
+ wireDiagnosticsActive,
34
+ wirePayloadActive,
35
+ withPayload,
36
+ type AppRequestEvent,
37
+ } from '../wire/diagnostics';
38
+
39
+ export interface ReportRequestOptions {
40
+ /**
41
+ * The app's own id for the logical turn, so this request and the read that
42
+ * answered it sit together. Same field and meaning as `ConsumeOptions.traceId`
43
+ * and the encode options.
44
+ *
45
+ * ★ CORRELATION IS ENTIRELY YOURS, AND NOTHING WARNS. Omit it and the event
46
+ * is still emitted, still complete, and completely unattached: a panel shows
47
+ * a request that belongs to no turn, beside a response that belongs to no
48
+ * request, and nothing in the kit reports that as a problem because it is not
49
+ * one -- a request legitimately may be followed by no stream, by several, or
50
+ * by one from a different turn.
51
+ *
52
+ * There is NO timing heuristic pairing a request with "the next stream that
53
+ * opens", and that omission is deliberate: such a heuristic is right often
54
+ * enough to be trusted and wrong exactly when a session is tangled enough for
55
+ * someone to have opened the panel. Pass the same id to `reportRequest` and
56
+ * to the reader, and the halves join up; pass nothing and they do not.
57
+ */
58
+ traceId?: string;
59
+ /** The app's name for this call inside its trace (`'planner'`, `'retry-2'`). */
60
+ label?: string;
61
+ /** Where it was sent. Reported as origin and pathname only; see below. */
62
+ url?: string;
63
+ }
64
+
65
+ /** Built on first use, never at module scope, so this module keeps importing
66
+ * cleanly in a runtime without the global. Only reached under payload capture. */
67
+ let encoder: TextEncoder | undefined;
68
+
69
+ /**
70
+ * Read one property without trusting the object.
71
+ *
72
+ * EVERY read of the body goes through here. A body can be a `Proxy` whose `get`
73
+ * throws, a `FormData`, a `ReadableStream`, a getter with side effects, or a
74
+ * string -- and a diagnostic that throws while describing a request would take
75
+ * down the request. There is no "we only support plain objects" version of this
76
+ * function, because the caller passes whatever their fetch takes.
77
+ */
78
+ function read(source: unknown, key: string): unknown {
79
+ if (source === null || (typeof source !== 'object' && typeof source !== 'function')) {
80
+ return undefined;
81
+ }
82
+ try {
83
+ return (source as Record<string, unknown>)[key];
84
+ } catch {
85
+ return undefined; // a hostile or exotic object; nothing is claimed about it
86
+ }
87
+ }
88
+
89
+ /** A string property, or nothing. Never coerced: a `model` that is not a string
90
+ * is not a model, and `String(x)` would invent one. */
91
+ function stringOf(source: unknown, key: string): string | undefined {
92
+ const value = read(source, key);
93
+ return typeof value === 'string' && value !== '' ? value : undefined;
94
+ }
95
+
96
+ /** An array property, or nothing. `Array.isArray` rather than a length check, so
97
+ * a string never reads as a list of characters. */
98
+ function arrayOf(source: unknown, key: string): unknown[] | undefined {
99
+ const value = read(source, key);
100
+ return Array.isArray(value) ? value : undefined;
101
+ }
102
+
103
+ /**
104
+ * Role counts over the messages array, INCLUDING system.
105
+ *
106
+ * Walks the array but never its contents: a role is a short label and the
107
+ * message text is payload. Entries that state no readable role are counted in
108
+ * `messages` and contribute to no role -- they are not guessed at, and not
109
+ * bucketed under `'unknown'`, which would be the kit inventing a role nobody
110
+ * sent.
111
+ */
112
+ function rolesOf(messages: unknown[]): { byRole: Record<string, number>; system: number } {
113
+ const byRole: Record<string, number> = {};
114
+ let system = 0;
115
+ for (const message of messages) {
116
+ const role = stringOf(message, 'role');
117
+ if (role === undefined) continue;
118
+ byRole[role] = (byRole[role] ?? 0) + 1;
119
+ if (role === 'system') system++;
120
+ }
121
+ return { byRole, system };
122
+ }
123
+
124
+ /**
125
+ * Origin and pathname of the supplied URL.
126
+ *
127
+ * THE QUERY STRING IS NEVER REPORTED, under any switch, exactly as on
128
+ * `wire.open`: `?api_key=sk-...` is a credential rather than conversation
129
+ * content, so the payload switch is not the thing that governs it. `hasQuery`
130
+ * carries the one bit a reader needs.
131
+ *
132
+ * A relative URL -- the normal shape for an app's own fetch -- has no origin to
133
+ * report and is omitted rather than resolved against a guessed base. On a
134
+ * server there is no page to resolve it against at all.
135
+ */
136
+ function locationOf(url: string): { url?: string; hasQuery?: boolean } {
137
+ try {
138
+ const parsed = new URL(url);
139
+ return { url: `${parsed.origin}${parsed.pathname}`, hasQuery: parsed.search !== '' };
140
+ } catch {
141
+ return {};
142
+ }
143
+ }
144
+
145
+ /** Does this object DECLARE a JSON form? A plain object, an array, or anything
146
+ * carrying its own `toJSON` -- which is the object stating what it serializes
147
+ * to, and therefore an answer rather than a guess.
148
+ *
149
+ * Deliberately NOT a duck-type on `.size` or `.length`: `{ size: 999999 }` is
150
+ * ordinary data whose honest byte count is its JSON length, and reading that
151
+ * field as a byte count is how a size field starts lying. */
152
+ function declaresJsonForm(body: object): boolean {
153
+ try {
154
+ if (Array.isArray(body)) return true;
155
+ if (typeof (body as { toJSON?: unknown }).toJSON === 'function') return true;
156
+ const proto = Object.getPrototypeOf(body);
157
+ return proto === Object.prototype || proto === null;
158
+ } catch {
159
+ return false; // a Proxy with hostile traps declares nothing
160
+ }
161
+ }
162
+
163
+ /**
164
+ * UTF-8 byte length of the body AS IT WILL BE SENT, or nothing.
165
+ *
166
+ * ONLY CALLED UNDER PAYLOAD CAPTURE, by the same ruling the encoder's byte
167
+ * counts follow: measuring means materializing the whole body, and unlike a
168
+ * one-off cost this recurs on every turn for as long as a subscriber is
169
+ * attached. With payload on the body is being handed over anyway.
170
+ *
171
+ * ★ IT IS REPORTED ONLY WHEN IT CAN BE KNOWN EXACTLY. The trap this exists to
172
+ * avoid: `JSON.stringify` turns a `Blob`, a `FormData` and a `ReadableStream`
173
+ * all into `"{}"`, so a FormData carrying a 40 MB upload reported `bytes: 2`.
174
+ * That is literally "the byte length of the body as JSON" and it is read by
175
+ * every panel as "how big was this request" -- the confident-number class this
176
+ * stream refuses everywhere else, and worse than the em dash it replaces. A
177
+ * typed array was further out still: `Uint8Array(64)` stringifies to
178
+ * `{"0":0,"1":0,...}` and reported 439.
179
+ *
180
+ * Four cases can be answered exactly, and they are answered:
181
+ *
182
+ * · a STRING -- it IS the body, so its encoded length is the number;
183
+ * · anything DECLARING a JSON form (plain object, array, `toJSON`) -- that
184
+ * declaration is what will be stringified onto the wire;
185
+ * · a BLOB or FILE -- `size` is the byte length, known in O(1). Reporting it
186
+ * is measurement, not estimation, and refusing would discard a true fact;
187
+ * · an ARRAYBUFFER or a view over one -- `byteLength`, same reasoning.
188
+ *
189
+ * Everything else is OMITTED, which reads as "not reported" under the absence
190
+ * rule: `FormData` (whose real size needs the multipart boundary walked),
191
+ * `ReadableStream` (whose size is not knowable without consuming it, which
192
+ * would destroy the request), `URLSearchParams`, a `Map`, a class instance
193
+ * declaring nothing. A false negative here is safe; a confident wrong number is
194
+ * not.
195
+ *
196
+ * `JSON.stringify` is also not total -- a circular body, a BigInt, a throwing
197
+ * getter -- and a diagnostic must never be the thing that breaks a request, so
198
+ * that case omits the key too.
199
+ *
200
+ * Cross-realm caveat, stated rather than hidden: a `Blob` from another realm (an
201
+ * iframe) fails `instanceof` and is omitted. That is the safe direction, and
202
+ * duck-typing `.size` to fix it would re-open the `{ size: 999999 }` hole.
203
+ */
204
+ function bodyBytes(body: unknown): number | undefined {
205
+ try {
206
+ if (typeof body === 'string') {
207
+ encoder ??= new TextEncoder();
208
+ return encoder.encode(body).length;
209
+ }
210
+ if (typeof body !== 'object' || body === null) return undefined;
211
+
212
+ // Ordered: the JSON check runs FIRST so a plain object carrying a `size`
213
+ // field is measured as JSON rather than mistaken for a Blob.
214
+ if (declaresJsonForm(body)) {
215
+ const json = JSON.stringify(body);
216
+ if (typeof json !== 'string') return undefined;
217
+ encoder ??= new TextEncoder();
218
+ return encoder.encode(json).length;
219
+ }
220
+
221
+ // `instanceof`, guarded on the global existing at all, because these are not
222
+ // globals in every runtime the kit imports into.
223
+ if (typeof Blob !== 'undefined' && body instanceof Blob) return body.size;
224
+ if (typeof ArrayBuffer !== 'undefined') {
225
+ if (body instanceof ArrayBuffer) return body.byteLength;
226
+ if (ArrayBuffer.isView(body)) return body.byteLength;
227
+ }
228
+
229
+ return undefined; // no exactly-knowable size; say nothing rather than "2"
230
+ } catch {
231
+ return undefined;
232
+ }
233
+ }
234
+
235
+ /**
236
+ * Disclose the request body the app is about to send.
237
+ *
238
+ * Call it beside your own `fetch`, with the same object you pass as the body:
239
+ *
240
+ * ```ts
241
+ * const body = { model, messages, tools };
242
+ * reportRequest(body, { traceId: 'turn-42', url: '/api/chat' });
243
+ * const res = await fetch('/api/chat', {
244
+ * method: 'POST',
245
+ * body: JSON.stringify(body),
246
+ * });
247
+ * await readOpenAIStream(res, sink, { traceId: 'turn-42' });
248
+ * ```
249
+ *
250
+ * WHAT TRAVELS BY DEFAULT: counts, role names, the tools array's length, the
251
+ * requested model, and the origin+path it went to. WHAT DOES NOT: the messages,
252
+ * the system prompt's text, the tool definitions, the query string. The body
253
+ * itself rides only under the payload switch, exactly like every other
254
+ * content-bearing value in this stream.
255
+ *
256
+ * FREE WHEN NOBODY IS LISTENING. With no subscriber this returns before reading
257
+ * a single property of `body`, so passing a `Proxy` with expensive getters, or a
258
+ * body you would rather not touch, costs one symbol read.
259
+ *
260
+ * IT NEVER THROWS. Whatever `body` is -- a string, `FormData`, a
261
+ * `ReadableStream`, a circular object, a `Proxy` that throws on every access --
262
+ * this reports what it can and stays quiet about the rest. A diagnostic that
263
+ * took down a request would be worse than no diagnostic.
264
+ *
265
+ * NO PAIRING IS INVENTED. Without a `traceId` the event carries no correlation
266
+ * key at all, rather than being attached to whichever stream opens next: a
267
+ * request may be followed by no stream, by several, or by one belonging to a
268
+ * different turn.
269
+ */
270
+ export function reportRequest(body: unknown, opts: ReportRequestOptions = {}): void {
271
+ // BEFORE the body is touched, which is what makes the inactive path free and
272
+ // keeps a hostile or expensive body entirely unread when nobody is listening.
273
+ if (!wireDiagnosticsActive()) return;
274
+
275
+ const messages = arrayOf(body, 'messages');
276
+ const roles = messages ? rolesOf(messages) : undefined;
277
+ const tools = arrayOf(body, 'tools');
278
+ const model = stringOf(body, 'model');
279
+ const bytes = wirePayloadActive() ? bodyBytes(body) : undefined;
280
+
281
+ const event: AppRequestEvent = {
282
+ type: 'app.request',
283
+ t: Date.now(),
284
+ ...(opts.traceId !== undefined ? { traceId: opts.traceId } : {}),
285
+ ...(opts.label !== undefined ? { label: opts.label } : {}),
286
+ ...(opts.url !== undefined ? locationOf(opts.url) : {}),
287
+ ...(messages !== undefined ? { messages: messages.length } : {}),
288
+ ...(roles !== undefined ? { byRole: roles.byRole, systemMessages: roles.system } : {}),
289
+ ...(tools !== undefined ? { tools: tools.length } : {}),
290
+ ...(model !== undefined ? { model } : {}),
291
+ ...(bytes !== undefined ? { bytes } : {}),
292
+ ...withPayload(() => ({ body })),
293
+ };
294
+
295
+ emitWireDiagnostic(event);
296
+ }
@@ -19,7 +19,9 @@ import {
19
19
  interface Props extends Record<string, unknown> {
20
20
  /** The attachments to render. Omit (or pass an empty array) for the empty
21
21
  * state, which shows `emptyText` if set and nothing otherwise. Set as a JS
22
- * property (array). */
22
+ * property (array). Each item's `url` must be a `data:` URI or an https
23
+ * URL, never `URL.createObjectURL`: a `blob:` URL previews here but the
24
+ * wire encoders (`toOpenAIMessages`/`toAnthropicMessages`) refuse it. */
23
25
  items?: AttachmentData[];
24
26
  /** Layout: `grid` = visual tiles, `inline` = icon + label chips, `list` = rows. */
25
27
  variant?: AttachmentVariant;
@@ -84,10 +86,11 @@ defineWebComponent<Props, Events>('kai-attachments', {
84
86
  fallback={
85
87
  <>
86
88
  <AttachmentPreview />
87
- {/* Info only for non-grid; grid is a self-contained visual tile. */}
88
- <Show when={variant() !== 'grid'}>
89
- <AttachmentInfo showMediaType={showMediaType()} />
90
- </Show>
89
+ {/* Rendered for EVERY variant now. `AttachmentInfo` decides
90
+ what a grid tile gets — a visible caption for a non-image
91
+ tile, nothing for an image, which is the only tile that
92
+ really is a self-contained visual. */}
93
+ <AttachmentInfo showMediaType={showMediaType()} />
91
94
  </>
92
95
  }
93
96
  >
@@ -101,9 +104,7 @@ defineWebComponent<Props, Events>('kai-attachments', {
101
104
  : `flex items-center gap-1.5${variant() === 'list' ? ' w-full' : ''}`}
102
105
  >
103
106
  <AttachmentPreview />
104
- <Show when={variant() !== 'grid'}>
105
- <AttachmentInfo showMediaType={showMediaType()} />
106
- </Show>
107
+ <AttachmentInfo showMediaType={showMediaType()} />
107
108
  </AttachmentHoverCardTrigger>
108
109
  <AttachmentHoverCardContent>
109
110
  {/* For image attachments, preview the actual thumbnail;
@@ -30,16 +30,29 @@ interface Props extends Record<string, unknown> {
30
30
  /** Setting this makes the element an announced image (`role="img"`) instead of
31
31
  * decorative (`aria-hidden`). Attribute: `label`. */
32
32
  label?: string;
33
- /** Live microphone or WebRTC audio to analyze. JS property only. */
33
+ /** Live microphone or WebRTC audio to analyze. JS property only. NOTE: amplitude
34
+ * renders only while state is "speaking" unless listening-amplitude is set; every
35
+ * other state plays its scripted animation and ignores the audio. */
34
36
  stream?: MediaStream;
35
- /** An `<audio>` or `<video>` element to tap for its audio. JS property only. */
37
+ /** An `<audio>` or `<video>` element to tap for its audio. JS property only. NOTE:
38
+ * amplitude renders only while state is "speaking" unless listening-amplitude is
39
+ * set; every other state plays its scripted animation and ignores the audio. */
36
40
  audioElement?: HTMLMediaElement;
37
41
  /** Pre-computed levels, 0..1. Set this and no AudioContext is ever built, which is
38
42
  * what keeps headless/SSR rendering and browser-speech-synthesis playback (which
39
43
  * exposes no audio node) free of Web Audio entirely. JS property only. A new
40
44
  * array reference is required for each update; mutating the existing array in
41
- * place will not re-render. */
45
+ * place will not re-render. NOTE: amplitude renders only while state is "speaking"
46
+ * unless listening-amplitude is set; every other state plays its scripted
47
+ * animation and ignores the audio. */
42
48
  bands?: number[];
49
+ /** Render live amplitude during the listening state as well, using the same
50
+ * presentation as speaking. Off by default, which keeps LiveKit parity: amplitude
51
+ * from stream, audio-element or bands renders only while state is "speaking". Set
52
+ * it to show a real mic-level picture while the user is the one talking. Boolean.
53
+ * Attribute: `listening-amplitude` (a bare attribute means true; reflected, so the
54
+ * property reads back what the attribute set). */
55
+ listeningAmplitude?: boolean;
43
56
  /** Custom fragment shader for `variant="custom"`. JS property only. */
44
57
  shader?: ShaderSpec;
45
58
  /** Shader variants only: keep animating while scrolled off screen. Off by default,
@@ -76,7 +89,7 @@ export function num(value: unknown): number | undefined {
76
89
  */
77
90
  export function AudioVisualizerFacade(
78
91
  props: Props,
79
- ctx?: Partial<Pick<WebComponentContext, 'dark' | 'flag'>>,
92
+ ctx?: Partial<Pick<WebComponentContext, 'dark' | 'flag' | 'reflectFlag'>>,
80
93
  ): JSX.Element {
81
94
  // Every element already resolves `theme='light'|'dark'|'auto'` against a
82
95
  // live `prefers-color-scheme` listener in `defineWebComponent` (see
@@ -102,6 +115,20 @@ export function AudioVisualizerFacade(
102
115
  ? ctx.flag('animateWhenNotVisible')
103
116
  : props.animateWhenNotVisible === true;
104
117
 
118
+ // Same bare-attribute coercion for the second boolean on this element.
119
+ const listeningAmplitude = ctx?.flag
120
+ ? ctx.flag('listeningAmplitude')
121
+ : props.listeningAmplitude === true;
122
+
123
+ // Reflected (kai-dock precedent, findings G-05): without this,
124
+ // `<kai-audio-visualizer listening-amplitude>` would leave
125
+ // `el.listeningAmplitude === undefined` even while the element honours the
126
+ // attribute, because toggleAttribute's empty-string write-back parses to
127
+ // undefined. See WebComponentContext.reflectFlag. `animateWhenNotVisible`
128
+ // predates the reflectFlag seam and is deliberately left as-is here; if it
129
+ // ever earns reflection that is its own change, not a rider on this one.
130
+ ctx?.reflectFlag?.('listeningAmplitude');
131
+
105
132
  return (
106
133
  <AudioVisualizer
107
134
  variant={props.variant as VisualizerVariant | undefined}
@@ -118,6 +145,7 @@ export function AudioVisualizerFacade(
118
145
  stream={props.stream as MediaStream | undefined}
119
146
  audioElement={props.audioElement as HTMLMediaElement | undefined}
120
147
  bands={props.bands as number[] | undefined}
148
+ listeningAmplitude={listeningAmplitude}
121
149
  shader={props.shader as ShaderSpec | undefined}
122
150
  animateWhenNotVisible={animateWhenNotVisible}
123
151
  theme={dark ? 'dark' : 'light'}
@@ -144,6 +172,19 @@ export function AudioVisualizerFacade(
144
172
  * el.shader = { fragment: glsl } // variant="custom" only
145
173
  * ```
146
174
  *
175
+ * Audio drives the geometry only while `state="speaking"`. Every other state
176
+ * plays its scripted animation, so a mic stream attached during `listening`
177
+ * changes nothing by default (LiveKit parity). Set `listening-amplitude` to
178
+ * render real amplitude while the USER is the one talking:
179
+ * ```html
180
+ * <kai-audio-visualizer state="listening" listening-amplitude></kai-audio-visualizer>
181
+ * ```
182
+ *
183
+ * Size tiers are fixed pixel designs, but the element never clips: in a
184
+ * container narrower than the tier's natural footprint the whole picture
185
+ * scales down proportionally to fit, and returns to the exact designed
186
+ * metrics as soon as the space is back. Nothing to configure.
187
+ *
147
188
  * The `wave`, `aurora`, and `custom` variants render through WebGL, and a
148
189
  * browser only allows about 16 live WebGL contexts per page. So a shader
149
190
  * variant scrolled off screen stops drawing and hands its context back,
@@ -174,6 +215,9 @@ defineWebComponent<Props>('kai-audio-visualizer', {
174
215
  stream: undefined,
175
216
  audioElement: undefined,
176
217
  bands: undefined,
218
+ // `undefined`, not `false`, for the same resolveFlag reason as
219
+ // `animateWhenNotVisible` below.
220
+ listeningAmplitude: undefined,
177
221
  shader: undefined,
178
222
  // `undefined`, not `false`: `resolveFlag` short-circuits on an explicit
179
223
  // `false` prop value, so a `false` default would beat a bare