@kitn.ai/ui 0.28.0 → 0.30.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 (615) hide show
  1. package/README.md +11 -7
  2. package/dist/{Icon-DObhsRtm.js → Icon-BzBET3E-.js} +1 -1
  3. package/dist/{action-icons-CcgNN2oT.js → action-icons-DaW2pU6m.js} +1 -1
  4. package/dist/agent-tooling/construct/public.d.ts +15 -0
  5. package/dist/agent-tooling/construct/schema.d.ts +111 -0
  6. package/dist/arrow-down-D783iMJj.js +1 -0
  7. package/dist/arrow-left-0VLM5kyg.js +1 -0
  8. package/dist/artifact-DGjzHYUT.js +1 -0
  9. package/dist/{attachments-Qr4kg-2b.js → attachments-YvXHlg88.js} +1 -1
  10. package/dist/{audio-visualizer-DToYdfSc.js → audio-visualizer-9lz5IHsL.js} +1 -1
  11. package/dist/{badge-CdEu_jn2.js → badge-Dh_vp8A5.js} +1 -1
  12. package/dist/{bell-DQAAOpDz.js → bell-CT7_WUwS.js} +1 -1
  13. package/dist/{button-DkuOnGLy.js → button-C_3te6fm.js} +1 -1
  14. package/dist/{card-renderer-Jx70m6_l.js → card-renderer-DZVaGH2e.js} +1 -1
  15. package/dist/check-CiEOVnEN.js +1 -0
  16. package/dist/{checkbox-D7iRB3nL.js → checkbox-Bu2T2e0U.js} +1 -1
  17. package/dist/{checkbox-group-B2_rpoPM.js → checkbox-group-BiryEXPQ.js} +1 -1
  18. package/dist/chevron-down-CSobuZRG.js +1 -0
  19. package/dist/chevron-right-DR9ZAP-2.js +1 -0
  20. package/dist/{choice-card-m0BYqqOK.js → choice-card-CM6IjkmL.js} +1 -1
  21. package/dist/circle-BC66EYF7.js +1 -0
  22. package/dist/circle-check-BqmahW0O.js +1 -0
  23. package/dist/{circle-x-BPG0iPst.js → circle-x-Bk-dA5Wf.js} +1 -1
  24. package/dist/{code-block-ClMLKb7C.js → code-block-B26t-Q7q.js} +1 -1
  25. package/dist/{collapsible-B4DlWicL.js → collapsible-Bhc636Cf.js} +1 -1
  26. package/dist/components/builder-composer-triggers.d.ts +62 -0
  27. package/dist/components/builder-layout.d.ts +54 -0
  28. package/dist/components/builder-message-actions.d.ts +72 -0
  29. package/dist/components/builder-panel.d.ts +189 -0
  30. package/dist/components/builder-preview.d.ts +11 -0
  31. package/dist/components/builder-shell-controls.d.ts +69 -0
  32. package/dist/components/builder-skeleton.d.ts +58 -0
  33. package/dist/components/builder-start.d.ts +75 -0
  34. package/dist/components/builder-workspace-variants.d.ts +23 -0
  35. package/dist/components/captions.d.ts +66 -0
  36. package/dist/{composer-sQ0HcvyG.js → composer-DMI85B6j.js} +1 -1
  37. package/dist/{confirm-card-rQWDQsnC.js → confirm-card-B0YIAwXp.js} +1 -1
  38. package/dist/construct-cli.es.js +3 -3
  39. package/dist/construct.d.ts +5 -0
  40. package/dist/construct.js +327 -0
  41. package/dist/{context-0kg4ZX1J.js → context-DWgfhqWp.js} +1 -1
  42. package/dist/controllable-BagRpyHv.js +1 -0
  43. package/dist/{conversation-item-BxwQLaFJ.js → conversation-item-BsOsVGmT.js} +1 -1
  44. package/dist/{conversation-list-BCfGN1JU.js → conversation-list-aX3Vtc7L.js} +1 -1
  45. package/dist/{copy-n9u9rqpi.js → copy-BmEwsNhJ.js} +1 -1
  46. package/dist/core-C8fzo39E.js +1 -12
  47. package/dist/{create-tween-uPkArjIG.js → create-tween-CNOAU3Fx.js} +1 -1
  48. package/dist/{create-tween-C-q-JCM-.js → create-tween-WfqiENls.js} +1 -1
  49. package/dist/{create-tween-CRrJXxBd.js → create-tween-wlFtW9Kh.js} +1 -1
  50. package/dist/{create-tween-DZ3RRDHD.js → create-tween-zt79ba32.js} +1 -1
  51. package/dist/{default-input-CaMrJkgH.js → default-input-DMV5Eaze.js} +1 -1
  52. package/dist/define-CI0y3eE4.js +1 -0
  53. package/dist/define.js +40 -40
  54. package/dist/define.server.js +45 -45
  55. package/dist/{disclosure-WUImBbDv.js → disclosure-NnACBxsC.js} +1 -1
  56. package/dist/{dropdown-wZVeJOMd.js → dropdown-DT7G0RGR.js} +1 -1
  57. package/dist/elements/agent-card.js +1 -1
  58. package/dist/elements/artifact.js +1 -1
  59. package/dist/elements/attachments.js +1 -1
  60. package/dist/elements/audio-visualizer.js +1 -1
  61. package/dist/elements/avatar.js +1 -1
  62. package/dist/elements/badge.js +1 -1
  63. package/dist/elements/button.js +1 -1
  64. package/dist/elements/card.js +1 -1
  65. package/dist/elements/cards.js +1 -1
  66. package/dist/elements/chain-of-thought.js +1 -1
  67. package/dist/elements/chat-scope-picker.js +1 -1
  68. package/dist/elements/chat-workspace.js +1 -1
  69. package/dist/elements/chat.js +1 -1
  70. package/dist/elements/checkbox-group.js +1 -1
  71. package/dist/elements/checkbox.js +1 -1
  72. package/dist/elements/checkpoint.js +1 -1
  73. package/dist/elements/choice.js +1 -1
  74. package/dist/elements/coachmark.js +1 -1
  75. package/dist/elements/code-block.js +1 -1
  76. package/dist/elements/command.js +1 -1
  77. package/dist/elements/compare.js +1 -1
  78. package/dist/elements/composer.js +1 -1
  79. package/dist/elements/confirm-card.js +1 -1
  80. package/dist/elements/context-meter.js +1 -1
  81. package/dist/elements/conversation-item.js +1 -1
  82. package/dist/elements/conversation-list.js +1 -1
  83. package/dist/elements/dialog.js +1 -1
  84. package/dist/elements/dock.js +1 -1
  85. package/dist/elements/dropdown.js +1 -1
  86. package/dist/elements/editable-label.js +1 -1
  87. package/dist/elements/embed.js +1 -1
  88. package/dist/elements/empty.js +1 -1
  89. package/dist/elements/feedback-bar.js +1 -1
  90. package/dist/elements/file-tree.js +1 -1
  91. package/dist/elements/file-upload.js +1 -1
  92. package/dist/elements/form.js +1 -1
  93. package/dist/elements/hover-card.js +1 -1
  94. package/dist/elements/icon.js +1 -1
  95. package/dist/elements/image.js +1 -1
  96. package/dist/elements/input.js +1 -1
  97. package/dist/elements/kbd.js +1 -1
  98. package/dist/elements/link-preview.js +1 -1
  99. package/dist/elements/loader.js +1 -1
  100. package/dist/elements/markdown.js +1 -1
  101. package/dist/elements/menu.js +1 -1
  102. package/dist/elements/message-skills.js +1 -1
  103. package/dist/elements/message.js +1 -1
  104. package/dist/elements/model-switcher.js +1 -1
  105. package/dist/elements/nav.js +1 -1
  106. package/dist/elements/notice.js +1 -1
  107. package/dist/elements/pane-grid.js +1 -1
  108. package/dist/elements/pane-group.js +1 -1
  109. package/dist/elements/pane.js +1 -1
  110. package/dist/elements/popover.js +1 -1
  111. package/dist/elements/progress-bar.js +1 -1
  112. package/dist/elements/prompt-dock.js +1 -1
  113. package/dist/elements/prompt-input.js +1 -1
  114. package/dist/elements/prompt-suggestions.js +1 -1
  115. package/dist/elements/radio-group.js +1 -1
  116. package/dist/elements/reasoning.js +1 -1
  117. package/dist/elements/remote.js +1 -1
  118. package/dist/elements/resizable.js +1 -1
  119. package/dist/elements/response-stream.js +1 -1
  120. package/dist/elements/screen.js +1 -1
  121. package/dist/elements/scroll-area.js +1 -1
  122. package/dist/elements/scroll-button.js +1 -1
  123. package/dist/elements/search.js +1 -1
  124. package/dist/elements/segmented.js +1 -1
  125. package/dist/elements/select.js +1 -1
  126. package/dist/elements/separator.js +1 -1
  127. package/dist/elements/setting-item.js +1 -1
  128. package/dist/elements/settings-group.js +1 -1
  129. package/dist/elements/skeleton.js +1 -1
  130. package/dist/elements/slider.js +1 -1
  131. package/dist/elements/source.js +1 -1
  132. package/dist/elements/status.js +1 -1
  133. package/dist/elements/switch.js +1 -1
  134. package/dist/elements/tabs.js +1 -1
  135. package/dist/elements/tasks.js +1 -1
  136. package/dist/elements/text-shimmer.js +1 -1
  137. package/dist/elements/thinking-bar.js +1 -1
  138. package/dist/elements/thread.js +1 -1
  139. package/dist/elements/toast.js +1 -1
  140. package/dist/elements/tool.js +1 -1
  141. package/dist/elements/tooltip.js +1 -1
  142. package/dist/elements/voice-input.js +1 -1
  143. package/dist/elements/voice-output.js +1 -1
  144. package/dist/{ellipsis-CbOpJnU3.js → ellipsis-6pJ7SxYT.js} +1 -1
  145. package/dist/{embed-CrfjkbUG.js → embed-BMje-nxj.js} +1 -1
  146. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  147. package/dist/{external-link-ByXAwBBQ.js → external-link-Beh9DKeR.js} +1 -1
  148. package/dist/{file-text-DMib2qwt.js → file-text-D1GPfZ8Q.js} +1 -1
  149. package/dist/{file-tree-CJqM2aP7.js → file-tree-Dwj2lqg-.js} +1 -1
  150. package/dist/{folder-_BAb929C.js → folder-b6D8x1DY.js} +1 -1
  151. package/dist/{form-DSZgZQZk.js → form-DWgdxDXu.js} +1 -1
  152. package/dist/{hover-card-BQbul9eq.js → hover-card-CWRkqm40.js} +1 -1
  153. package/dist/{icon-CdcfRhYI.js → icon-CL0jdhsf.js} +1 -1
  154. package/dist/index.js +1741 -1725
  155. package/dist/index.server.js +1582 -1566
  156. package/dist/{info-DsFjGuI_.js → info-0cOUherQ.js} +1 -1
  157. package/dist/{input-DKbmkMos.js → input-BH6Ru91Q.js} +1 -1
  158. package/dist/kai.es.js +1 -1
  159. package/dist/{kbd-PvdGhX4s.js → kbd-DRAnVtNX.js} +1 -1
  160. package/dist/{link-zF8PzWfF.js → link-Dlr0vssB.js} +1 -1
  161. package/dist/{link-preview-DbM1866N.js → link-preview-DODgRyV9.js} +1 -1
  162. package/dist/loader-KvJB6NrT.js +1 -0
  163. package/dist/{markdown-LMvmAyBk.js → markdown-DX9tuJVj.js} +1 -1
  164. package/dist/mcp.es.js +9 -5
  165. package/dist/{message-BYZECyek.js → message-BqQ7Ot5q.js} +1 -1
  166. package/dist/{message-BSsgvHvf.js → message-DkaGfBd8.js} +1 -1
  167. package/dist/message-circle-BPpp5QKv.js +1 -0
  168. package/dist/message-square-BLbsd9BJ.js +1 -0
  169. package/dist/{minimize-2-BQRoBV1V.js → minimize-2-CyOHJwcN.js} +1 -1
  170. package/dist/{model-switcher-CMpCOYcB.js → model-switcher-0hrKDiK2.js} +1 -1
  171. package/dist/{overlay-Cb-MkyDa.js → overlay-DBMFXie6.js} +1 -1
  172. package/dist/{panel-right-i8warFxT.js → panel-right-t8SWJL6e.js} +1 -1
  173. package/dist/{paperclip-ByY3UVO6.js → paperclip-CdzuOjbU.js} +1 -1
  174. package/dist/play-BXy1u7rW.js +1 -0
  175. package/dist/primitives/use-auto-resize.d.ts +11 -0
  176. package/dist/{progress-bar-jVAHvMUf.js → progress-bar-CiBtxMWT.js} +1 -1
  177. package/dist/{prompt-suggestion-CD-qtNgC.js → prompt-suggestion-I_DHP21i.js} +1 -1
  178. package/dist/{radio-BsoBMhkF.js → radio-C_p3n39l.js} +1 -1
  179. package/dist/{reasoning-4kBPtlTx.js → reasoning-BDwy_tIe.js} +1 -1
  180. package/dist/register-impl-DvEnhIxx.js +424 -0
  181. package/dist/{resizable-uPmY9VY-.js → resizable-SYC-fStM.js} +1 -1
  182. package/dist/{rotate-ccw-B2xn93py.js → rotate-ccw-B1nwmwuY.js} +1 -1
  183. package/dist/{rotate-cw-CMVLoCyH.js → rotate-cw-CLAnBcm1.js} +1 -1
  184. package/dist/{scroll-area-BqLUo8ZZ.js → scroll-area-zRyXoLhI.js} +1 -1
  185. package/dist/{scroll-button-DslXiJyL.js → scroll-button-jzrbYCG9.js} +1 -1
  186. package/dist/{select-2cLRtPGT.js → select-DM-0nEe0.js} +1 -1
  187. package/dist/{separator-BWQtNJcM.js → separator-BToOOoOt.js} +1 -1
  188. package/dist/{settings-BBR63jLg.js → settings-PaGo_S4U.js} +1 -1
  189. package/dist/{settings-group-B2ciy-Iw.js → settings-group-BFXGIfXq.js} +1 -1
  190. package/dist/{skeleton-CkHI-HgC.js → skeleton-DYpmFnnm.js} +1 -1
  191. package/dist/{slider-DDR9U-i0.js → slider-ebutAmkQ.js} +1 -1
  192. package/dist/{solid-DruVOXnf.js → solid-15v_3WVL.js} +3563 -3412
  193. package/dist/{solid-BzCFdL25.js → solid-5P-otgdi.js} +4502 -4296
  194. package/dist/solid.d.ts +6 -0
  195. package/dist/solid.js +259 -254
  196. package/dist/solid.server.js +259 -254
  197. package/dist/{source-GEnFF528.js → source-c1gpRl9h.js} +1 -1
  198. package/dist/{star-CilHq8GP.js → star-pcV_3LqF.js} +1 -1
  199. package/dist/{store-Ciyk6eZG.js → store-CSgbFFCg.js} +1 -1
  200. package/dist/{switch-KkeQIbuH.js → switch-Bh2OdLV2.js} +1 -1
  201. package/dist/{tasks-card-BrN4bggJ.js → tasks-card-CbqQAn2S.js} +1 -1
  202. package/dist/text-shimmer-BSzgEnDH.js +1 -0
  203. package/dist/textarea-DrYNt_0z.js +1 -0
  204. package/dist/theme.tokens.css +22 -21
  205. package/dist/{thumbs-up-CsT9Wzb9.js → thumbs-up-BL3-NenK.js} +1 -1
  206. package/dist/{toast-store-tgK6MuMv.js → toast-store-DkOlYczt.js} +1 -1
  207. package/dist/{tool-DzUjIBT8.js → tool-CeIWUVUe.js} +1 -1
  208. package/dist/{tooltip-Bkkg_4t0.js → tooltip-GA-nmg06.js} +1 -1
  209. package/dist/{trash-2-jBKxjGGQ.js → trash-2-CT66QWlm.js} +1 -1
  210. package/dist/{triangle-alert-DlQ68ppf.js → triangle-alert-CeHLWxhD.js} +1 -1
  211. package/dist/ui/color-field.d.ts +48 -0
  212. package/dist/ui/textarea.d.ts +4 -0
  213. package/dist/ui/toggle-chip.d.ts +40 -0
  214. package/dist/{upload-TcAHXv9W.js → upload-9Csb0F0J.js} +1 -1
  215. package/dist/{use-card-resolution-DaZqAdWf.js → use-card-resolution-Zg0a08Z-.js} +1 -1
  216. package/dist/{variant-aurora-DbW_OWL2.js → variant-aurora-4VBQHIKV.js} +1 -1
  217. package/dist/{variant-aurora-CNmfHhcx.js → variant-aurora-DBeCAQNk.js} +2 -2
  218. package/dist/{variant-aurora-D6GsdTPA.js → variant-aurora-FzHVXHby.js} +2 -2
  219. package/dist/{variant-aurora-BhLuYxJR.js → variant-aurora-LE3fqxgw.js} +1 -1
  220. package/dist/{variant-custom-BvYHR62b.js → variant-custom-AFRGcOBS.js} +1 -1
  221. package/dist/{variant-custom-DV2x254s.js → variant-custom-BQkNuPpE.js} +2 -2
  222. package/dist/{variant-custom-BRvaNHSi.js → variant-custom-DI5R0rln.js} +1 -1
  223. package/dist/{variant-custom-DMTrEO5w.js → variant-custom-WWnrrRHS.js} +2 -2
  224. package/dist/{variant-wave-CyBueXj9.js → variant-wave-DUCbH5oI.js} +2 -2
  225. package/dist/{variant-wave-BNMGrDfj.js → variant-wave-DuQV7DhQ.js} +2 -2
  226. package/dist/{variant-wave-BpDd8t3Z.js → variant-wave-nSI2sfII.js} +1 -1
  227. package/dist/{variant-wave-sp-qwsdI.js → variant-wave-wTP5v_jU.js} +1 -1
  228. package/dist/x-eiO9V6J6.js +1 -0
  229. package/{src/elements/styles.css → kit-base.css} +27 -44
  230. package/package.json +32 -17
  231. package/solid.css +33 -0
  232. package/theme.css +39 -23
  233. package/bin/route.test.js +0 -58
  234. package/dist/arrow-down-CjRU3JgV.js +0 -1
  235. package/dist/arrow-left-Bnpb1UEW.js +0 -1
  236. package/dist/artifact-Bwt7OgcR.js +0 -1
  237. package/dist/check-njkVdZu2.js +0 -1
  238. package/dist/chevron-down-B72s6PXR.js +0 -1
  239. package/dist/chevron-right-BatuHzUm.js +0 -1
  240. package/dist/circle-check-B62pODB3.js +0 -1
  241. package/dist/circle-zx0ByzY9.js +0 -1
  242. package/dist/controllable-CnGpMF6r.js +0 -1
  243. package/dist/define-By-uL588.js +0 -1
  244. package/dist/loader-BM4CEz4G.js +0 -1
  245. package/dist/message-circle-DruwObfX.js +0 -1
  246. package/dist/message-square-BG6q6mlm.js +0 -1
  247. package/dist/play-BvKKq3fX.js +0 -1
  248. package/dist/register-impl-B1hLkrI8.js +0 -424
  249. package/dist/text-shimmer-Dcj1MHuq.js +0 -1
  250. package/dist/textarea-Dpvbngbg.js +0 -1
  251. package/dist/x-Z5UntkIJ.js +0 -1
  252. package/src/agent-tooling/README.md +0 -192
  253. package/src/agent-tooling/archetypes.ts +0 -205
  254. package/src/agent-tooling/catalog/README.md +0 -676
  255. package/src/agent-tooling/catalog/catalog-types.ts +0 -231
  256. package/src/agent-tooling/catalog/fabrications.ts +0 -96
  257. package/src/agent-tooling/catalog/invariants.ts +0 -284
  258. package/src/agent-tooling/catalog/labs-titles.ts +0 -114
  259. package/src/agent-tooling/catalog/scenarios.ts +0 -87
  260. package/src/agent-tooling/catalog/surfaces.ts +0 -347
  261. package/src/agent-tooling/construct/cli-entry.ts +0 -8
  262. package/src/agent-tooling/construct/cli.ts +0 -147
  263. package/src/agent-tooling/construct/codegen.ts +0 -1635
  264. package/src/agent-tooling/construct/construct.v1.schema.json +0 -319
  265. package/src/agent-tooling/construct/dev.ts +0 -148
  266. package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
  267. package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
  268. package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -32
  269. package/src/agent-tooling/construct/schema.ts +0 -452
  270. package/src/agent-tooling/integrations/anthropic.ts +0 -442
  271. package/src/agent-tooling/integrations/cloudflare.ts +0 -218
  272. package/src/agent-tooling/integrations/langgraph.ts +0 -133
  273. package/src/agent-tooling/integrations/mastra.ts +0 -182
  274. package/src/agent-tooling/integrations/mock.ts +0 -148
  275. package/src/agent-tooling/integrations/ollama.ts +0 -97
  276. package/src/agent-tooling/integrations/openai.ts +0 -95
  277. package/src/agent-tooling/integrations/openrouter.ts +0 -82
  278. package/src/agent-tooling/integrations/pi.ts +0 -176
  279. package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
  280. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
  281. package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
  282. package/src/agent-tooling/mcp/manifest.ts +0 -422
  283. package/src/agent-tooling/mcp/server.ts +0 -116
  284. package/src/agent-tooling/mcp/stdio.ts +0 -18
  285. package/src/agent-tooling/mcp/tools/construct.ts +0 -130
  286. package/src/agent-tooling/mcp/tools/debug.ts +0 -621
  287. package/src/agent-tooling/mcp/tools/reference.ts +0 -980
  288. package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
  289. package/src/agent-tooling/mcp/tools/theme.ts +0 -456
  290. package/src/agent-tooling/mcp/tools/types.ts +0 -14
  291. package/src/agent-tooling/mcp/validate-args.ts +0 -141
  292. package/src/agent-tooling/recipes/composed-thread.ts +0 -714
  293. package/src/agent-tooling/recipes/index.ts +0 -22
  294. package/src/agent-tooling/recipes/types.ts +0 -32
  295. package/src/agent-tooling/registry.ts +0 -132
  296. package/src/agent-tooling/route-emit.ts +0 -305
  297. package/src/agent-tooling/types.ts +0 -390
  298. package/src/components/artifact-card.tsx +0 -120
  299. package/src/components/artifact.tsx +0 -914
  300. package/src/components/attachment-types.ts +0 -66
  301. package/src/components/attachments.tsx +0 -536
  302. package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
  303. package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
  304. package/src/components/audio-visualizer/fit-scale.ts +0 -112
  305. package/src/components/audio-visualizer/index.tsx +0 -528
  306. package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
  307. package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
  308. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
  309. package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
  310. package/src/components/audio-visualizer/sizes.ts +0 -54
  311. package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
  312. package/src/components/audio-visualizer/variant-bar.tsx +0 -175
  313. package/src/components/audio-visualizer/variant-custom.tsx +0 -344
  314. package/src/components/audio-visualizer/variant-grid.tsx +0 -175
  315. package/src/components/audio-visualizer/variant-radial.tsx +0 -163
  316. package/src/components/audio-visualizer/variant-wave.tsx +0 -130
  317. package/src/components/audio-visualizer/wave.glsl.ts +0 -130
  318. package/src/components/card-fallback.tsx +0 -60
  319. package/src/components/card-renderer.tsx +0 -220
  320. package/src/components/card.tsx +0 -212
  321. package/src/components/chain-of-thought.tsx +0 -348
  322. package/src/components/chat-container.tsx +0 -89
  323. package/src/components/chat-scope-picker.tsx +0 -57
  324. package/src/components/chat-thread.tsx +0 -1014
  325. package/src/components/checkpoint.tsx +0 -88
  326. package/src/components/choice-card.tsx +0 -743
  327. package/src/components/coachmark.tsx +0 -249
  328. package/src/components/code-block.tsx +0 -181
  329. package/src/components/composer-dom.ts +0 -159
  330. package/src/components/composer-highlight.ts +0 -242
  331. package/src/components/composer-history.ts +0 -82
  332. package/src/components/composer.tsx +0 -1075
  333. package/src/components/confirm-card.tsx +0 -402
  334. package/src/components/context.tsx +0 -377
  335. package/src/components/conversation-item.tsx +0 -241
  336. package/src/components/conversation-list.tsx +0 -429
  337. package/src/components/conversation-panel.tsx +0 -118
  338. package/src/components/dismissed-stub.tsx +0 -80
  339. package/src/components/embed.tsx +0 -200
  340. package/src/components/empty.tsx +0 -177
  341. package/src/components/feedback-bar.tsx +0 -166
  342. package/src/components/file-tree.tsx +0 -530
  343. package/src/components/file-upload.tsx +0 -167
  344. package/src/components/form-widgets.tsx +0 -525
  345. package/src/components/form.tsx +0 -1296
  346. package/src/components/home-panel.tsx +0 -159
  347. package/src/components/image.tsx +0 -65
  348. package/src/components/link-preview.tsx +0 -195
  349. package/src/components/loader.tsx +0 -367
  350. package/src/components/markdown.tsx +0 -162
  351. package/src/components/message-skills.tsx +0 -40
  352. package/src/components/message.tsx +0 -765
  353. package/src/components/model-switcher.tsx +0 -132
  354. package/src/components/prompt-input.tsx +0 -188
  355. package/src/components/prompt-suggestion.tsx +0 -150
  356. package/src/components/reasoning.tsx +0 -293
  357. package/src/components/response-compare-types.ts +0 -152
  358. package/src/components/response-compare.tsx +0 -455
  359. package/src/components/response-stream.tsx +0 -109
  360. package/src/components/screen.tsx +0 -181
  361. package/src/components/scroll-button.tsx +0 -93
  362. package/src/components/source.tsx +0 -192
  363. package/src/components/tasks-card.tsx +0 -801
  364. package/src/components/text-shimmer.tsx +0 -37
  365. package/src/components/thinking-bar.tsx +0 -50
  366. package/src/components/thread.tsx +0 -228
  367. package/src/components/toast.tsx +0 -503
  368. package/src/components/tool-classify.ts +0 -26
  369. package/src/components/tool-types.ts +0 -49
  370. package/src/components/tool.tsx +0 -190
  371. package/src/components/use-card-resolution.ts +0 -44
  372. package/src/components/voice-input.tsx +0 -222
  373. package/src/components/voice-output.tsx +0 -242
  374. package/src/components/widget-tab-bar.tsx +0 -73
  375. package/src/components/workspace-shell.tsx +0 -285
  376. package/src/diagnostics/hook.ts +0 -352
  377. package/src/diagnostics/index.ts +0 -82
  378. package/src/diagnostics/report-request.ts +0 -296
  379. package/src/elements/agent-card.tsx +0 -67
  380. package/src/elements/artifact.tsx +0 -194
  381. package/src/elements/attachments.tsx +0 -140
  382. package/src/elements/audio-visualizer.tsx +0 -227
  383. package/src/elements/autoloader.ts +0 -89
  384. package/src/elements/avatar.tsx +0 -33
  385. package/src/elements/badge.tsx +0 -32
  386. package/src/elements/button.tsx +0 -149
  387. package/src/elements/card.tsx +0 -133
  388. package/src/elements/cards.tsx +0 -266
  389. package/src/elements/chain-of-thought.tsx +0 -141
  390. package/src/elements/chat-scope-picker.tsx +0 -65
  391. package/src/elements/chat-types.ts +0 -102
  392. package/src/elements/chat-workspace.tsx +0 -188
  393. package/src/elements/chat.tsx +0 -304
  394. package/src/elements/checkbox-group.tsx +0 -164
  395. package/src/elements/checkbox.tsx +0 -134
  396. package/src/elements/checkpoint.tsx +0 -47
  397. package/src/elements/choice.tsx +0 -100
  398. package/src/elements/coachmark.tsx +0 -90
  399. package/src/elements/code-block.tsx +0 -60
  400. package/src/elements/command.tsx +0 -197
  401. package/src/elements/compare.tsx +0 -111
  402. package/src/elements/compiled.css +0 -2
  403. package/src/elements/composer.tsx +0 -162
  404. package/src/elements/confirm-card.tsx +0 -76
  405. package/src/elements/context-meter.tsx +0 -107
  406. package/src/elements/conversation-item.tsx +0 -120
  407. package/src/elements/conversation-list.tsx +0 -203
  408. package/src/elements/css.ts +0 -5
  409. package/src/elements/default-input.tsx +0 -392
  410. package/src/elements/define-entry.ts +0 -12
  411. package/src/elements/define.tsx +0 -563
  412. package/src/elements/diagnostic-events.ts +0 -114
  413. package/src/elements/dialog.tsx +0 -145
  414. package/src/elements/disclosure.ts +0 -95
  415. package/src/elements/dock.tsx +0 -215
  416. package/src/elements/dropdown.tsx +0 -123
  417. package/src/elements/editable-label.tsx +0 -140
  418. package/src/elements/element-data-types.ts +0 -152
  419. package/src/elements/element-diagnostics.ts +0 -392
  420. package/src/elements/element-manifest.json +0 -354
  421. package/src/elements/element-nonscalar.json +0 -187
  422. package/src/elements/element-types.d.ts +0 -4353
  423. package/src/elements/embed.tsx +0 -35
  424. package/src/elements/empty.tsx +0 -29
  425. package/src/elements/feedback-bar.tsx +0 -66
  426. package/src/elements/file-tree.tsx +0 -62
  427. package/src/elements/file-upload.tsx +0 -44
  428. package/src/elements/form.tsx +0 -94
  429. package/src/elements/hover-card.tsx +0 -80
  430. package/src/elements/icon.tsx +0 -41
  431. package/src/elements/image.tsx +0 -32
  432. package/src/elements/input.tsx +0 -492
  433. package/src/elements/kbd.tsx +0 -45
  434. package/src/elements/link-preview.tsx +0 -34
  435. package/src/elements/loader.tsx +0 -25
  436. package/src/elements/markdown.tsx +0 -38
  437. package/src/elements/menu.tsx +0 -241
  438. package/src/elements/message-skills.tsx +0 -83
  439. package/src/elements/message.tsx +0 -361
  440. package/src/elements/model-switcher.tsx +0 -121
  441. package/src/elements/nav.tsx +0 -87
  442. package/src/elements/notice.tsx +0 -53
  443. package/src/elements/pane-grid.tsx +0 -111
  444. package/src/elements/pane-group.tsx +0 -119
  445. package/src/elements/pane.tsx +0 -129
  446. package/src/elements/popover.tsx +0 -81
  447. package/src/elements/progress-bar.tsx +0 -39
  448. package/src/elements/prompt-dock.tsx +0 -82
  449. package/src/elements/prompt-input.tsx +0 -240
  450. package/src/elements/prompt-suggestions.tsx +0 -113
  451. package/src/elements/radio-group.tsx +0 -129
  452. package/src/elements/reasoning.tsx +0 -71
  453. package/src/elements/register-impl.ts +0 -148
  454. package/src/elements/register.ts +0 -76
  455. package/src/elements/remote.tsx +0 -225
  456. package/src/elements/resizable.globals.d.ts +0 -36
  457. package/src/elements/resizable.tsx +0 -704
  458. package/src/elements/response-stream.tsx +0 -40
  459. package/src/elements/screen.tsx +0 -90
  460. package/src/elements/scroll-area.tsx +0 -33
  461. package/src/elements/scroll-button.tsx +0 -179
  462. package/src/elements/search.tsx +0 -185
  463. package/src/elements/segmented.tsx +0 -129
  464. package/src/elements/select.tsx +0 -165
  465. package/src/elements/separator.tsx +0 -36
  466. package/src/elements/setting-item.tsx +0 -50
  467. package/src/elements/settings-group.tsx +0 -37
  468. package/src/elements/skeleton.tsx +0 -45
  469. package/src/elements/slider.tsx +0 -171
  470. package/src/elements/slot-text.ts +0 -73
  471. package/src/elements/slots.ts +0 -787
  472. package/src/elements/source.tsx +0 -126
  473. package/src/elements/status.tsx +0 -42
  474. package/src/elements/switch.tsx +0 -118
  475. package/src/elements/tabs.tsx +0 -95
  476. package/src/elements/tasks.tsx +0 -103
  477. package/src/elements/text-shimmer.tsx +0 -28
  478. package/src/elements/thinking-bar.tsx +0 -43
  479. package/src/elements/thread.tsx +0 -139
  480. package/src/elements/toast.tsx +0 -106
  481. package/src/elements/tool.tsx +0 -78
  482. package/src/elements/tooltip.tsx +0 -85
  483. package/src/elements/validate-messages.ts +0 -76
  484. package/src/elements/voice-input.tsx +0 -100
  485. package/src/elements/voice-output.tsx +0 -82
  486. package/src/index.ts +0 -430
  487. package/src/primitives/audio-bands.ts +0 -174
  488. package/src/primitives/card-component-types.ts +0 -63
  489. package/src/primitives/card-contract.ts +0 -80
  490. package/src/primitives/card-data-types.ts +0 -361
  491. package/src/primitives/card-host.tsx +0 -37
  492. package/src/primitives/card-recovery.ts +0 -160
  493. package/src/primitives/card-registry.tsx +0 -78
  494. package/src/primitives/card-resolution.ts +0 -36
  495. package/src/primitives/card-routing.ts +0 -85
  496. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  497. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  498. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  499. package/src/primitives/card-schemas/choice.schema.json +0 -75
  500. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  501. package/src/primitives/card-schemas/embed.schema.json +0 -63
  502. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  503. package/src/primitives/card-schemas/form.schema.json +0 -53
  504. package/src/primitives/card-schemas/link.schema.json +0 -54
  505. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  506. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  507. package/src/primitives/card-tags.ts +0 -61
  508. package/src/primitives/card-validate-cards.ts +0 -255
  509. package/src/primitives/card-validate-schemas.ts +0 -58
  510. package/src/primitives/card-validate.ts +0 -131
  511. package/src/primitives/chat-config.tsx +0 -103
  512. package/src/primitives/composer-model.ts +0 -49
  513. package/src/primitives/composer-triggers.ts +0 -35
  514. package/src/primitives/controllable.ts +0 -21
  515. package/src/primitives/conversation-store.ts +0 -248
  516. package/src/primitives/create-kai-chat.ts +0 -66
  517. package/src/primitives/create-tween.ts +0 -266
  518. package/src/primitives/embed-providers.ts +0 -254
  519. package/src/primitives/field-mask.ts +0 -256
  520. package/src/primitives/field-semantics.ts +0 -115
  521. package/src/primitives/highlighter.ts +0 -157
  522. package/src/primitives/input-mask.ts +0 -853
  523. package/src/primitives/link-preview.ts +0 -87
  524. package/src/primitives/message-feedback.ts +0 -124
  525. package/src/primitives/pdf-preview.ts +0 -121
  526. package/src/primitives/toast-store.ts +0 -338
  527. package/src/primitives/url-scheme-policy.ts +0 -70
  528. package/src/primitives/use-audio-analysis.ts +0 -340
  529. package/src/primitives/use-auto-resize.ts +0 -31
  530. package/src/primitives/use-resize-observer.ts +0 -45
  531. package/src/primitives/use-sequencer.ts +0 -72
  532. package/src/primitives/use-speech-recognition.ts +0 -146
  533. package/src/primitives/use-stick-to-bottom.ts +0 -75
  534. package/src/primitives/use-text-stream.ts +0 -143
  535. package/src/primitives/use-voice-recorder.ts +0 -62
  536. package/src/primitives/visualizer-sequences.ts +0 -350
  537. package/src/remote/host-embed.ts +0 -345
  538. package/src/remote/index.ts +0 -2
  539. package/src/remote/origin.ts +0 -30
  540. package/src/remote/provider-runtime.ts +0 -262
  541. package/src/remote/provider.ts +0 -2
  542. package/src/remote/validate.ts +0 -22
  543. package/src/remote/version.ts +0 -12
  544. package/src/remote/wire.ts +0 -48
  545. package/src/schemas/from-tool-call.ts +0 -151
  546. package/src/schemas/index.ts +0 -341
  547. package/src/schemas/provider-subsets.ts +0 -538
  548. package/src/schemas/registry.ts +0 -355
  549. package/src/schemas/tool-defs.ts +0 -793
  550. package/src/solid.ts +0 -173
  551. package/src/state/index.ts +0 -44
  552. package/src/state/messages.ts +0 -53
  553. package/src/state/mock.ts +0 -297
  554. package/src/state/parts.ts +0 -295
  555. package/src/state/persistence.ts +0 -180
  556. package/src/state/stream.ts +0 -246
  557. package/src/state/suggestions.ts +0 -9
  558. package/src/state/threads.ts +0 -142
  559. package/src/test-utils/fake-clock.ts +0 -88
  560. package/src/types.ts +0 -95
  561. package/src/ui/action-icons.ts +0 -53
  562. package/src/ui/agent-card.tsx +0 -218
  563. package/src/ui/avatar.tsx +0 -23
  564. package/src/ui/badge.tsx +0 -21
  565. package/src/ui/button.tsx +0 -49
  566. package/src/ui/card.tsx +0 -245
  567. package/src/ui/checkbox-group.tsx +0 -153
  568. package/src/ui/checkbox.tsx +0 -63
  569. package/src/ui/collapsible.tsx +0 -163
  570. package/src/ui/command.tsx +0 -103
  571. package/src/ui/dialog.tsx +0 -223
  572. package/src/ui/dock.tsx +0 -630
  573. package/src/ui/dropdown.tsx +0 -636
  574. package/src/ui/editable-label.tsx +0 -112
  575. package/src/ui/hover-card.tsx +0 -345
  576. package/src/ui/icon.tsx +0 -167
  577. package/src/ui/input.tsx +0 -391
  578. package/src/ui/kbd.tsx +0 -118
  579. package/src/ui/nav.tsx +0 -282
  580. package/src/ui/notice.tsx +0 -84
  581. package/src/ui/overlay.tsx +0 -277
  582. package/src/ui/pane-grid.tsx +0 -117
  583. package/src/ui/pane-group.tsx +0 -291
  584. package/src/ui/pane.tsx +0 -193
  585. package/src/ui/popover.tsx +0 -106
  586. package/src/ui/progress-bar.tsx +0 -83
  587. package/src/ui/prompt-dock.tsx +0 -145
  588. package/src/ui/radio.tsx +0 -150
  589. package/src/ui/resizable.tsx +0 -693
  590. package/src/ui/scroll-area.tsx +0 -26
  591. package/src/ui/segmented.tsx +0 -109
  592. package/src/ui/select.tsx +0 -168
  593. package/src/ui/separator.tsx +0 -10
  594. package/src/ui/settings-group.tsx +0 -67
  595. package/src/ui/skeleton.tsx +0 -73
  596. package/src/ui/slider.tsx +0 -178
  597. package/src/ui/status.tsx +0 -48
  598. package/src/ui/switch.tsx +0 -119
  599. package/src/ui/tabs.tsx +0 -168
  600. package/src/ui/textarea.tsx +0 -21
  601. package/src/ui/tooltip.tsx +0 -118
  602. package/src/utils/cn.ts +0 -30
  603. package/src/wire/chunk.ts +0 -248
  604. package/src/wire/consume.ts +0 -599
  605. package/src/wire/diagnostics.ts +0 -727
  606. package/src/wire/encode-probe.ts +0 -214
  607. package/src/wire/encode.ts +0 -947
  608. package/src/wire/files.ts +0 -342
  609. package/src/wire/formats/anthropic.ts +0 -274
  610. package/src/wire/formats/openai.ts +0 -228
  611. package/src/wire/index.ts +0 -95
  612. package/src/wire/media-types.ts +0 -344
  613. package/src/wire/read.ts +0 -396
  614. package/src/wire/sink-helpers.ts +0 -50
  615. package/src/wire/sse.ts +0 -153
@@ -1,296 +0,0 @@
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
- }
@@ -1,67 +0,0 @@
1
- import { defineWebComponent } from './define';
2
- import { AgentCard, type AgentStatus } from '../ui/agent-card';
3
-
4
- interface Props extends Record<string, unknown> {
5
- /** The agent's name, the primary label. Attribute: `name`. */
6
- name?: string;
7
- /** Selected / focused state: highlighted border + surface. Attribute: `active`. */
8
- active?: boolean;
9
- /** Raise a prominent "Needs you" pill plus a glowing amber edge. This
10
- * is the attention-routing signal that pulls focus to this agent.
11
- * Attribute: `needs-attention`. */
12
- needsAttention?: boolean;
13
- /** Run status. A JS PROPERTY (object), not an attribute. Shape: `{ tone,
14
- * label?, pulse? }`, where `tone` is one of `working` | `idle` | `done` |
15
- * `error` | `blocked` (maps to the kit's tool hues), `label` is an optional
16
- * short string beside the dot, and `pulse` animates the dot. Set it with
17
- * `el.status = { tone: 'working', label: 'Working', pulse: true }`. */
18
- status?: AgentStatus;
19
- }
20
-
21
- /** Events fired by `<kai-agent-card>`. */
22
- interface Events {
23
- /** The card was activated by a click, or by Enter / Space while focused.
24
- * Promote this agent back to focus. */
25
- 'kai-activate': void;
26
- /** The trailing "..." kebab was clicked. The consumer opens its own menu; the
27
- * card only surfaces the affordance (the click does not also activate the card). */
28
- 'kai-menu': void;
29
- }
30
-
31
- /**
32
- * `<kai-agent-card>` — the compact glanceable card for one agent in a multi-agent
33
- * workspace. The agent name with a leading tone-colored status dot, an optional
34
- * "Needs you" attention treatment, an `active` (selected) state, and a trailing
35
- * "..." overflow button.
36
- *
37
- * Set `status` as a JS property (it's an object); `name` is a string attribute and
38
- * `active` / `needs-attention` are boolean attributes. Listen for `kai-activate`
39
- * (promote to focus) and `kai-menu` (open your own per-agent menu).
40
- *
41
- * ```html
42
- * <kai-agent-card name="Refactor bot" active></kai-agent-card>
43
- * <script type="module">
44
- * import '@kitn.ai/ui/elements';
45
- * const card = document.querySelector('kai-agent-card');
46
- * card.status = { tone: 'working', label: 'Working', pulse: true };
47
- * card.addEventListener('kai-activate', () => focusAgent());
48
- * card.addEventListener('kai-menu', () => openMenu());
49
- * </script>
50
- * ```
51
- * Recolor the status dot via `::part(status)` and the kebab via `::part(menu)`.
52
- */
53
- defineWebComponent<Props, Events>('kai-agent-card', {
54
- name: undefined,
55
- active: undefined,
56
- needsAttention: undefined,
57
- status: undefined,
58
- }, (props, { dispatch, flag }) => (
59
- <AgentCard
60
- name={(props.name as string) ?? ''}
61
- active={flag('active')}
62
- needsAttention={flag('needsAttention')}
63
- status={(props.status as AgentStatus) ?? { tone: 'idle' }}
64
- onActivate={() => dispatch('kai-activate')}
65
- onMenu={() => dispatch('kai-menu')}
66
- />
67
- ));
@@ -1,194 +0,0 @@
1
- import { createSignal, onMount, onCleanup } from 'solid-js';
2
- import { defineWebComponent } from './define';
3
- import { Artifact, type ArtifactController, type ArtifactFile, type ArtifactTab } from '../components/artifact';
4
-
5
- interface Props extends Record<string, unknown> {
6
- /** URL the preview iframe frames. Consumer-controlled. */
7
- src?: string;
8
- /** Files for the Code tab tree + each file's preview `url`. Omit for a
9
- * preview-only artifact (the Code tab then has nothing to show; pair it with
10
- * `no-tabs` to hide the toggle). Set as a JS property (array). */
11
- files?: ArtifactFile[];
12
- /** Controlled active tab: `preview` or `code`. When set, the artifact follows it
13
- * (re-asserted on change). Leave unset for an uncontrolled tab (see `defaultTab`). */
14
- tab?: ArtifactTab;
15
- /** Uncontrolled INITIAL tab (used only when `tab` is unset). Default `preview`.
16
- * Seeds the starting tab; the user can then switch freely without the consumer
17
- * re-asserting a controlled `tab`. */
18
- defaultTab?: ArtifactTab;
19
- /** Selected file path. Syncs the tree highlight, Code source, and preview. */
20
- activeFile?: string;
21
- /** iframe `sandbox` override. Secure default `allow-scripts allow-forms` (NOT `allow-same-origin`). */
22
- sandbox?: string;
23
- /** Accessible title for the preview iframe. */
24
- iframeTitle?: string;
25
- /** Reflects the artifact's own maximized view-state (usually driven by the protocol). */
26
- maximized?: boolean;
27
- /** Show the expand-to-fill button (OPT-IN). */
28
- expandable?: boolean;
29
- /** Show the open-in-new-tab button (OPT-IN). */
30
- openInTab?: boolean;
31
- /** Hide back/forward. */
32
- noNav?: boolean;
33
- /** Hide reload. */
34
- noReload?: boolean;
35
- /** Hide home. */
36
- noHome?: boolean;
37
- /** Hide the address field. */
38
- noPathField?: boolean;
39
- /** Hide the Preview|Code toggle. */
40
- noTabs?: boolean;
41
- /** Standalone chrome: rounded corners + border (else square, borderless in-panel). */
42
- standalone?: boolean;
43
- /** Show the address but make it read-only (visible, nav-tracking, non-editable). */
44
- readonlyPath?: boolean;
45
- /** Friendly address shown in the path field instead of the real current url
46
- * (read-only, non-navigable). Use when the framed url is not consumer-facing
47
- * (e.g. a `data:` blob) so a clean address shows instead of leaking it. Scalar
48
- * string: set as the `display-url` attribute or the `displayUrl` property. */
49
- displayUrl?: string;
50
- }
51
-
52
- interface Events extends Record<string, unknown> {
53
- /** Fired when the preview navigates. `detail.url` = the new location. */
54
- 'kai-navigate': { url: string };
55
- /** Fired when the Preview|Code tab changes. `detail.tab`. */
56
- 'kai-tab-change': { tab: ArtifactTab };
57
- /** Fired when a file is selected. `detail.path`. */
58
- 'kai-file-select': { path: string };
59
- /** Artifact's own maximize button toggled (consumer-observable; non-bubbling). */
60
- 'kai-maximize-change': { maximized: boolean };
61
- /** The maximize PROTOCOL intent, raised as a raw bubbling + composed CustomEvent
62
- * (not through `dispatch`) so an enclosing `<kai-resizable>` can catch it and
63
- * maximize the containing panel. Declared here so it is typed and reaches the
64
- * generated API. Listen for it to drive maximize from your own chrome, or
65
- * re-emit it to trigger one. */
66
- 'kai-maximize-intent': { requested: boolean };
67
- }
68
-
69
- /**
70
- * `<kai-artifact>` — a framed, switchable generated-artifact viewer: a sandboxed
71
- * preview iframe with a functional nav toolbar (back · forward · reload · home +
72
- * editable path field) and a Preview|Code toggle; the Code tab shows a file tree
73
- * (`<kai-file-tree>`) + the active file's source via `<kai-code-block>`. The
74
- * component self-navigates the iframe and emits `kai-navigate` / `kai-tab-change` /
75
- * `kai-file-select`. Designed to FILL its container (e.g. a `<kai-resizable>` panel).
76
- */
77
- defineWebComponent<Props, Events>('kai-artifact', {
78
- src: undefined,
79
- files: [],
80
- tab: undefined,
81
- defaultTab: undefined,
82
- activeFile: undefined,
83
- sandbox: 'allow-scripts allow-forms',
84
- iframeTitle: undefined,
85
- maximized: false,
86
- expandable: false,
87
- openInTab: false,
88
- noNav: false,
89
- noReload: false,
90
- noHome: false,
91
- noPathField: false,
92
- noTabs: false,
93
- standalone: false,
94
- readonlyPath: false,
95
- displayUrl: undefined,
96
- }, (props, { element, dispatch, flag, expose }) => {
97
- const [maximized, setMaximized] = createSignal(flag('maximized'));
98
-
99
- // ── Imperative API (instance methods on the host) ──────────────────────────
100
- // Pattern C: the Artifact component owns the history stack + tab/file/maximize
101
- // state and hands up a controller; the facade captures it and exposes delegating
102
- // methods. Every internal handler still fires its event (navigate → kai-navigate;
103
- // selectFile → kai-file-select; maximize/restore → kai-maximize-change). Names are
104
- // collision-checked against the props: openExternal (not openInTab — a prop),
105
- // maximize/restore (not maximized — a prop), navigate/selectFile (not src/activeFile
106
- // — props); NO tab-switching method (tab is a prop → switch via `el.tab`).
107
- let controller: ArtifactController | undefined;
108
- expose({
109
- /** Go back in the artifact's own history stack (no-op when there's no prior entry). */
110
- back: () => controller?.back(),
111
- /** Go forward in the history stack (no-op when there's no forward entry). */
112
- forward: () => controller?.forward(),
113
- /** Force-reload the current preview url (also re-renders an inline PDF). */
114
- reload: () => controller?.reload(),
115
- /** Navigate to the `src` home url (no-op when there's no `src`). */
116
- home: () => controller?.home(),
117
- /** Push + load a url in the preview, the path-field submit path (fires kai-navigate). */
118
- navigate: (url: string) => controller?.navigate(url),
119
- /** Select a file by path: highlights the tree, shows its source, navigates the
120
- * preview (fires kai-file-select + kai-navigate). Named selectFile to avoid the
121
- * `activeFile` prop. */
122
- selectFile: (path: string) => controller?.selectFile(path),
123
- /** Open the current url in a new browser tab (no-op when there's no concrete url).
124
- * Named openExternal, NOT openInTab, which is a prop (toolbar button visibility). */
125
- openExternal: () => controller?.openExternal(),
126
- /** Enter the maximized view-state (fires kai-maximize-change{maximized:true}).
127
- * Named maximize, NOT maximized, which is a prop. */
128
- maximize: () => controller?.maximize(),
129
- /** Exit the maximized view-state (fires kai-maximize-change{maximized:false}). */
130
- restore: () => controller?.restore(),
131
- });
132
-
133
- const onMaximizeChange = (next: boolean) => {
134
- setMaximized(next);
135
- // 1) The PROTOCOL intent — raw, bubbling + composed (NOT via dispatch()).
136
- element.dispatchEvent(
137
- new CustomEvent('kai-maximize-intent', { detail: { requested: next }, bubbles: true, composed: true }),
138
- );
139
- // 2) The PUBLIC observable event (non-bubbling, on the host).
140
- dispatch('kai-maximize-change', { maximized: next });
141
- };
142
-
143
- // Authoritative reconcile: the resizable tells us the effective state.
144
- onMount(() => {
145
- const onState = (e: Event) => setMaximized((e as CustomEvent<{ maximized: boolean }>).detail.maximized);
146
- element.addEventListener('kai-maximize-state', onState);
147
- onCleanup(() => element.removeEventListener('kai-maximize-state', onState));
148
- });
149
-
150
- return (
151
- <>
152
- {/* The artifact fills its container; the internal column flex (toolbar
153
- flex-shrink:0, body flex:1/min-height:0) is in the Solid component. Wrap
154
- in a definite `1fr` grid cell (NOT :host) so the facade's sibling
155
- portal-mount div can't steal a grid track — see resizable.tsx. */}
156
- <style>{':host{display:block;height:100%;min-height:0}'}</style>
157
- <div
158
- style={{
159
- display: 'grid',
160
- 'grid-template-rows': 'minmax(0, 1fr)',
161
- 'grid-template-columns': 'minmax(0, 1fr)',
162
- height: '100%',
163
- 'min-height': '0',
164
- }}
165
- >
166
- <Artifact
167
- src={props.src}
168
- files={props.files ?? []}
169
- tab={props.tab}
170
- defaultTab={props.defaultTab}
171
- activeFile={props.activeFile}
172
- sandbox={props.sandbox}
173
- iframeTitle={props.iframeTitle}
174
- maximized={maximized()}
175
- expandable={flag('expandable')}
176
- openInTab={flag('openInTab')}
177
- showNav={!flag('noNav')}
178
- showReload={!flag('noReload')}
179
- showHome={!flag('noHome')}
180
- showPathField={!flag('noPathField')}
181
- showTabs={!flag('noTabs')}
182
- standalone={flag('standalone')}
183
- readonlyPath={flag('readonlyPath')}
184
- displayUrl={props.displayUrl}
185
- onMaximizeChange={onMaximizeChange}
186
- onNavigate={(url) => dispatch('kai-navigate', { url })}
187
- onTabChange={(tab) => dispatch('kai-tab-change', { tab })}
188
- onFileSelect={(path) => dispatch('kai-file-select', { path })}
189
- controllerRef={(c) => (controller = c)}
190
- />
191
- </div>
192
- </>
193
- );
194
- });