@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,22 +0,0 @@
1
- import type { CodeRecipe } from './types';
2
- import { composedThread } from './composed-thread';
3
-
4
- export type { CodeRecipe, CodeRecipeFile } from './types';
5
-
6
- /**
7
- * The code-recipe registry.
8
- *
9
- * Registered here → served by `component_reference({ name: "<id>" })` AND
10
- * compiled by `verify:scaffold` (which loads this list through the registry
11
- * bundle, so adding an entry moves that gate's printed cell count by itself —
12
- * the same derive-don't-list contract as the integration and surface axes).
13
- */
14
- export const codeRecipes: CodeRecipe[] = [composedThread];
15
-
16
- export function listCodeRecipes(): CodeRecipe[] {
17
- return codeRecipes;
18
- }
19
-
20
- export function getCodeRecipe(id: string): CodeRecipe | undefined {
21
- return codeRecipes.find((r) => r.id === id);
22
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * A CODE recipe: a complete, compiling composition the MCP serves as files.
3
- *
4
- * Distinct from a `TSurfaceRecipe` (../catalog/catalog-types.ts) on purpose:
5
- * the catalog record is DATA — ingredients, wiring edges, invariants, each
6
- * resolved and executed by its own guards — while a code recipe is the full
7
- * host module a builder pastes. The two meet on `id`: a code recipe whose id
8
- * also names a surface recipe is that record's body.
9
- *
10
- * `verify:scaffold` compiles every `lang: 'ts'` file of every registered code
11
- * recipe with a stock consumer tsconfig, resolving `@kitn.ai/ui` through the
12
- * shipped exports map — the same gate the scaffolder's emitted string literals
13
- * go through, because this code is string literals with the same failure mode.
14
- */
15
- export interface CodeRecipeFile {
16
- /** Path inside the consumer's app, e.g. `src/main.ts`. */
17
- path: string;
18
- lang: 'ts' | 'html' | 'css';
19
- code: string;
20
- }
21
-
22
- export interface CodeRecipe {
23
- /** Kebab-case id, e.g. `composed-thread`. Also the component_reference topic name. */
24
- id: string;
25
- title: string;
26
- intent: string;
27
- /** The kai-* tags the composition places. */
28
- ingredients: string[];
29
- /** The teaching notes served above the files — the WHY a prop table cannot carry. */
30
- notes: string[];
31
- files: CodeRecipeFile[];
32
- }
@@ -1,132 +0,0 @@
1
- import type { Integration, Archetype } from './types';
2
- import openai from './integrations/openai';
3
- import anthropic from './integrations/anthropic';
4
- import openrouter from './integrations/openrouter';
5
- import vercelAiSdk from './integrations/vercel-ai-sdk';
6
- import langgraph from './integrations/langgraph';
7
- import cloudflare from './integrations/cloudflare';
8
- import ollama from './integrations/ollama';
9
- import mastra from './integrations/mastra';
10
- import pi from './integrations/pi';
11
- import pydanticAi from './integrations/pydantic-ai';
12
- import mock from './integrations/mock';
13
- import { archetypes as _archetypes } from './archetypes';
14
-
15
- // The surface axis for the scaffolder's gate, derived from the presets above.
16
- // Re-exported here because `scripts/verify-scaffold-compiles.mjs` bundles this
17
- // module for its axes and must not reach past the registry for one of them.
18
- export {
19
- BASE_COMPONENT,
20
- listCapabilityGroups,
21
- listSurfaceProbes,
22
- type CapabilityGroup,
23
- type SurfaceProbe,
24
- } from './archetypes';
25
-
26
- // The code-recipe axis, same contract as the two above: the gate loads it from
27
- // this registry bundle, so registering a recipe adds its compile cells without
28
- // touching the verify script.
29
- export { listCodeRecipes, getCodeRecipe, type CodeRecipe, type CodeRecipeFile } from './recipes';
30
-
31
- // Order is the order a scaffolding agent reads them in. `openai` and `anthropic`
32
- // lead because they are the two keys a developer is most likely to already hold.
33
- export const integrations: Integration[] = [
34
- openai,
35
- anthropic,
36
- openrouter,
37
- vercelAiSdk,
38
- langgraph,
39
- cloudflare,
40
- ollama,
41
- mastra,
42
- pi,
43
- pydanticAi,
44
- mock,
45
- ];
46
-
47
- export const archetypes: Archetype[] = _archetypes;
48
-
49
- export function getIntegration(id: string): Integration | undefined {
50
- return integrations.find((i) => i.id === id);
51
- }
52
-
53
- export function getArchetype(id: string): Archetype | undefined {
54
- return archetypes.find((a) => a.id === id);
55
- }
56
-
57
- export function listIntegrations(): Integration[] {
58
- return integrations;
59
- }
60
-
61
- /** One heading in `create-kai`'s gateway prompt. */
62
- export interface GatewayGroup {
63
- id: 'no-backend' | 'bring-a-key' | 'bring-a-server';
64
- title: string;
65
- integrations: Integration[];
66
- }
67
-
68
- /**
69
- * The gateway prompt's three groups, DERIVED — the thing the spec described and
70
- * the catalog could not answer.
71
- *
72
- * It is here, and not in the CLI, for the reason `deps` is not in the spec's
73
- * prose: a grouping maintained next to the menu that renders it is a second copy
74
- * of the catalog, and it goes stale the first time an integration lands. Adding
75
- * one now moves these groups by itself, because the only inputs are declared
76
- * fields.
77
- *
78
- * THE ORDER OF THE TESTS IS THE DESIGN, not an implementation detail:
79
- *
80
- * 1. `keyExposure === 'frontend-safe' && outOfBand === 'none'` -> **No
81
- * backend**. Exactly `mock` today, and still derived from declared facts
82
- * rather than from `id === 'mock'` or `category === 'mock'`: a second
83
- * no-backend entry (a canned transcript player, say) lands here by
84
- * declaring the same two. This USED to be "has no route at all", and the
85
- * G-04 fix broke that derivation on purpose: mock now ships an OPTIONAL
86
- * route (the same responder frames over HTTP), and a route the app runs
87
- * fine without must not move its heading. What "no backend" really claims
88
- * is that the browser can do the whole job — nothing secret or server-only
89
- * (frontend-safe) and nothing to install or start out of band ('none') —
90
- * so that pair is the derivation. `ollama` is the near-miss that keeps it
91
- * honest: frontend-safe, but 'local-server' — something must be listening.
92
- * 2. `outOfBand !== 'none'` -> **Bring a server or runtime**, and this is
93
- * checked BEFORE the key test on purpose. `pydantic-ai` needs both a python
94
- * runtime and OPENAI_API_KEY; the groups are not disjoint in reality, so
95
- * something has to win, and the prerequisite does — a key is useless until
96
- * the service it authenticates is running. The prompt still asks for the
97
- * key afterwards; only the HEADING is decided here.
98
- * 3. Everything else -> **Bring a key**.
99
- *
100
- * WHERE THIS DIVERGES FROM THE SPEC, ON PURPOSE. The spec's third group reads
101
- * "Ollama, LangGraph, Mastra, Pydantic AI, Pi". `langgraph` comes out of this
102
- * function in **Bring a key** instead, because its emitted route compiles the
103
- * graph in process and asks for nothing but `OPENAI_API_KEY` — see the comment on
104
- * its `outOfBand`. The spec sentence was written before the field existed and is
105
- * wrong about that one entry; this is the derivation, so this is the answer.
106
- */
107
- export function listGatewayGroups(): GatewayGroup[] {
108
- // The browser can do the whole job: nothing secret or server-only, nothing to
109
- // install or start. NOT "has no route" — mock's G-04 route is optional, and a
110
- // route the app runs fine without must not move its heading (see the comment
111
- // above).
112
- const selfContained = (i: Integration) =>
113
- i.keyExposure === 'frontend-safe' && i.outOfBand === 'none';
114
-
115
- const groups: GatewayGroup[] = [
116
- { id: 'no-backend', title: 'No backend', integrations: [] },
117
- { id: 'bring-a-key', title: 'Bring a key', integrations: [] },
118
- { id: 'bring-a-server', title: 'Bring a server or runtime', integrations: [] },
119
- ];
120
- const into = (id: GatewayGroup['id']) => groups.find((g) => g.id === id)!;
121
-
122
- for (const integration of integrations) {
123
- if (selfContained(integration)) into('no-backend').integrations.push(integration);
124
- else if (integration.outOfBand !== 'none') into('bring-a-server').integrations.push(integration);
125
- else into('bring-a-key').integrations.push(integration);
126
- }
127
- return groups;
128
- }
129
-
130
- export function listArchetypes(): Archetype[] {
131
- return archetypes;
132
- }
@@ -1,305 +0,0 @@
1
- /**
2
- * What a second emitter needs in order to write a chat route to a real file.
3
- *
4
- * Three facts live here, and they are the three a consumer that writes handlers
5
- * to disk cannot do without: `chatRoutePreamble` (what goes above a bare
6
- * `Integration.webRoute` so it compiles), and `CLIENT_MODEL_IDS` +
7
- * `defaultModelFor` (whether the front end sends a model, and which id is valid
8
- * for the host its route POSTs to). The `kai` MCP's own emitter in
9
- * `mcp/tools/scaffold.ts` imports them from here, so there is one code path and
10
- * the two emitters cannot disagree.
11
- *
12
- * WHY THIS IS ITS OWN MODULE, AND WHY IT MUST STAY A LEAF. These three were
13
- * exported from `mcp/tools/scaffold.ts`, which is ~5,300 lines and builds a zod
14
- * schema at MODULE SCOPE (`scaffold.inputSchema = z.object({…})`). A side effect
15
- * at module scope is not tree-shakeable, so a bundler asked for
16
- * `chatRoutePreamble` alone had to keep the whole file and all of zod with it.
17
- * Measured on `create-kai`, whose CLI is one bundled zero-dependency file:
18
- * **203 kB -> 904 kB**, of which 505 kB was zod the CLI never executes, on every
19
- * `npx create-kai`. It also pulled 5,300 lines of kit source into `create-kai`'s
20
- * `tsc` program under `--noUnusedLocals`, a flag the kit's own typecheck does not
21
- * run, which forced an unrelated deletion in the kit to keep the CLI green.
22
- *
23
- * So the rule for this file is a rule about its IMPORTS, not its size: nothing
24
- * here may import a module that reaches zod, the registry, or the integration
25
- * catalog. `import type` is fine — it erases. Today that means exactly one
26
- * import, and it is type-only. `create-kai`'s build guard
27
- * (`bundleGraphProblem` in its `src/build-guards.ts`) fails the CLI build if zod
28
- * ever reappears in the bundle, which is the check that turns this paragraph
29
- * into something that can go red.
30
- *
31
- * NOT RE-EXPORTED from `mcp/tools/scaffold.ts`, deliberately. A second import
32
- * path for the same symbol is how the fat one gets picked again.
33
- */
34
- import type { Integration } from './types';
35
-
36
- // ── SCAF-8: per-integration default model ids ─────────────────────────────────
37
-
38
- /**
39
- * Default model id per integration whose route forwards one.
40
- *
41
- * THE ID IS HOST-SPECIFIC, and there is no such thing as a safe generic one.
42
- * This used to fall through to `'openai/gpt-4o-mini'` for anything unlisted, on
43
- * the reasoning that "a route that forwards the client's model is by definition
44
- * pointed at an OpenAI-compatible endpoint". That was false twice over the
45
- * moment a first-party provider landed: `openai/gpt-4o-mini` is an OPENROUTER
46
- * slug — api.openai.com 404s the prefixed form, and api.anthropic.com rejects it
47
- * outright — so a scaffold generated for the provider it names could not run
48
- * against it.
49
- *
50
- * tsc cannot see any of this; every one of those strings compiles. The guard is
51
- * `scaffold.test.ts` → "the emitted model id is valid for the host its route
52
- * POSTs to", which reads the id out of the EMITTED scaffold and the host out of
53
- * the route source, so a new integration cannot reintroduce a wrong one.
54
- *
55
- * EXPORTED because a route is only half of the fact. `openrouter`'s handler puts
56
- * the client's `model` straight into its upstream payload, so a front end that
57
- * posts `{ messages }` alone sends no model, OpenRouter answers 400, and nothing
58
- * in a build or a typecheck can see it. Any second emitter of these routes needs
59
- * the same table; `defaultModelFor` below is the accessor, and the raw table is
60
- * exported alongside it so a consumer can also check it for drift at ITS build
61
- * time rather than discovering a missing row when a user types.
62
- */
63
- export const CLIENT_MODEL_IDS: Record<string, string> = {
64
- // Vendor-prefixed `vendor/model`: OpenRouter's own id space, and the ONLY one
65
- // of the three where the prefix belongs.
66
- openrouter: 'openai/gpt-4o-mini',
67
- // No vendor prefix. This is what the route already pinned, so moving the knob
68
- // to the client changes the wire not at all.
69
- openai: 'gpt-4o-mini',
70
- // Anthropic's id space. Matches what the route pinned; 'claude-sonnet-5' and
71
- // 'claude-haiku-4-5' are the cheaper swaps (see this integration's runNote).
72
- anthropic: 'claude-opus-5',
73
- };
74
-
75
- /**
76
- * The default model id for an integration whose ROUTE reads the client's `model`
77
- * field, and undefined for every other one.
78
- *
79
- * This used to be a substring test (`routeSrc.includes('model')`), which is true
80
- * of any template that so much as writes `model: 'llama3.2'`. That emitted an
81
- * editable `const model` into ollama, langgraph, vercel-ai-sdk and cloudflare
82
- * scaffolds whose routes pin their own model and never read the field, so
83
- * changing it did nothing, and cloudflare's default was not even a valid Workers
84
- * AI id. `forwardsFromClient` states the fact instead of guessing at it.
85
- *
86
- * Exported for the same reason as `CLIENT_MODEL_IDS`: a second emitter of these
87
- * routes has to answer "does this front end send a model, and which" the same
88
- * way, and both halves of that answer live here.
89
- */
90
- export function defaultModelFor(integration: Integration): string | undefined {
91
- if (!integration.forwardsFromClient.includes('model')) return undefined;
92
- const id = CLIENT_MODEL_IDS[integration.id];
93
- // No fallback, deliberately — the old `?? 'openai/gpt-4o-mini'` is what let a
94
- // first-party provider inherit an OpenRouter slug and emit a scaffold that
95
- // 404s on its own host. A model id is a per-host fact; an integration that
96
- // forwards one has to say which.
97
- if (id === undefined) {
98
- throw new Error(
99
- `Integration '${integration.id}' forwards the client's 'model' but has no CLIENT_MODEL_IDS entry, so the ` +
100
- `scaffold would emit a model id that is not valid for the host its route POSTs to. Add one in ` +
101
- `agent-tooling/route-emit.ts.`,
102
- );
103
- }
104
- return id;
105
- }
106
-
107
- /**
108
- * The request body, declared once per route file.
109
- *
110
- * `await request.json()` is `unknown` — it is whatever the client sent — so
111
- * destructuring it directly is TS2339 on EVERY field. That is not pedantry: it
112
- * is a hard `npm run build` failure the moment a Node-typed project compiles the
113
- * route, where `Request` comes from undici (`json(): Promise<unknown>`) rather
114
- * than from the DOM lib (`json(): Promise<any>`). A stock Vite app does exactly
115
- * that — `tsc -b` walks vite.config.ts → vite-chat-api.ts → src/server/chat.ts
116
- * with `lib` and no DOM — so the route ran fine and the build did not.
117
- *
118
- * `messages` is typed as the kit's OWN encoder output rather than restated
119
- * structurally, which keeps the two halves of the scaffold pinned to one type:
120
- * the front end sends `toOpenAIMessages(thread)`, and this is what that returns.
121
- * The import is type-only and erases at build time, so the route ships no
122
- * runtime dependency on the kit.
123
- */
124
- const CHAT_REQUEST_BODY_IMPORT = `import type { OpenAIWireMessage } from '@kitn.ai/ui/wire';`;
125
- const CHAT_REQUEST_BODY_DECL = [
126
- `/**`,
127
- ` * What the front end POSTs. \`request.json()\` is \`unknown\` (it is whatever the`,
128
- ` * client sent), so the body is narrowed once here instead of at every use —`,
129
- ` * without it this route does not compile under a server tsconfig. Widen it as`,
130
- ` * you add fields of your own.`,
131
- ` */`,
132
- `type ChatRequestBody = {`,
133
- ` messages: OpenAIWireMessage[];`,
134
- ` model?: string;`,
135
- ` tools?: unknown[];`,
136
- `};`,
137
- ``,
138
- `class ChatRequestError extends Error {`,
139
- ` constructor(readonly status: number, message: string) { super(message); }`,
140
- `}`,
141
- ``,
142
- `/** Narrow the JSON body once, at the edge. A bare GET, a malformed body, or a`,
143
- ` * missing messages array is a ChatRequestError with a status — NEVER an`,
144
- ` * unhandled SyntaxError: one killed a Vite dev server (findings F-10). */`,
145
- `async function readChatRequest(request: Request): Promise<ChatRequestBody> {`,
146
- ` if (request.method !== 'POST') {`,
147
- ` throw new ChatRequestError(405, \`Method \${request.method} not allowed — POST /api/chat.\`);`,
148
- ` }`,
149
- ` let parsed: unknown;`,
150
- ` try { parsed = await request.json(); } catch {`,
151
- ` throw new ChatRequestError(400, 'Request body is not valid JSON.');`,
152
- ` }`,
153
- ` const body = parsed as ChatRequestBody;`,
154
- ` if (!Array.isArray(body?.messages)) {`,
155
- ` throw new ChatRequestError(400, 'Request body must carry a messages array.');`,
156
- ` }`,
157
- ` return body;`,
158
- `}`,
159
- ``,
160
- `/** Map a guard rejection to the Response its status demands; rethrow anything`,
161
- ` * else — an unexpected error should be loud, not laundered into a 400. */`,
162
- `function toChatErrorResponse(error: unknown): Response {`,
163
- ` if (error instanceof ChatRequestError) return Response.json({ error: error.message }, { status: error.status });`,
164
- ` throw error;`,
165
- `}`,
166
- ];
167
-
168
- /**
169
- * Attachments, on the way IN.
170
- *
171
- * A user turn's `content` is a plain string until it carries a file, at which
172
- * point `toOpenAIMessages` emits the ARRAY form. Every route that re-maps
173
- * messages into some other SDK's shape has to handle both, and the three that do
174
- * (anthropic, mastra, vercel-ai-sdk) were each written when only the string form
175
- * existed — so each one would have quietly dropped the attachment while still
176
- * compiling, which is the same defect the encoder was just fixed for.
177
- *
178
- * These two helpers are the shared half of that: flattening the wire shape is
179
- * identical everywhere, while the target shape is not, so each route maps
180
- * `WirePart[]` into its own SDK itself rather than inheriting a lowest common
181
- * denominator.
182
- *
183
- * Only injected into routes that actually call them — the eight pass-through
184
- * integrations forward `messages` untouched and need none of this, and an unused
185
- * declaration is a hard error under the gate's `--noUnusedLocals`.
186
- */
187
- const CONTENT_PARTS_DECL = [
188
- `/** Where an attachment's bytes are: inline base64, or an address the PROVIDER`,
189
- ` * fetches. Never both. */`,
190
- `type WireFileSource = { type: 'data'; data: string } | { type: 'url'; url: string };`,
191
- ``,
192
- `/** One piece of a turn, with the string and array content forms flattened into`,
193
- ` * a single shape. */`,
194
- `type WirePart =`,
195
- ` | { kind: 'text'; text: string }`,
196
- ` | { kind: 'file'; mediaType: string; filename?: string; source: WireFileSource };`,
197
- ``,
198
- `const DATA_URI = /^data:([^;,]+);base64,([\\s\\S]*)$/;`,
199
- ``,
200
- `/**`,
201
- ` * Flatten a wire message's content into parts.`,
202
- ` *`,
203
- ` * An image sent by URL has no media type here — \`image_url\` carries only the`,
204
- ` * address — so it reports the top-level segment \`'image'\`, which is all a URL`,
205
- ` * source needs. Only images can reach that branch: the kit refuses to encode a`,
206
- ` * remote PDF rather than guess at one.`,
207
- ` */`,
208
- `function wireParts(content: OpenAIWireMessage['content']): WirePart[] {`,
209
- ` if (content == null) return [];`,
210
- ` if (typeof content === 'string') return content === '' ? [] : [{ kind: 'text', text: content }];`,
211
- ` return content.map((part): WirePart => {`,
212
- ` if (part.type === 'text') return { kind: 'text', text: part.text };`,
213
- ` if (part.type === 'image_url') {`,
214
- ` const asData = DATA_URI.exec(part.image_url.url);`,
215
- ` return asData`,
216
- ` ? { kind: 'file', mediaType: asData[1], source: { type: 'data', data: asData[2] } }`,
217
- ` : { kind: 'file', mediaType: 'image', source: { type: 'url', url: part.image_url.url } };`,
218
- ` }`,
219
- ` const asData = DATA_URI.exec(part.file.file_data);`,
220
- ` if (!asData) {`,
221
- ` // LOUD on purpose. \`file_data\` is a data URI on this wire; anything else`,
222
- ` // cannot be turned into bytes without fetching it, and forwarding a turn`,
223
- ` // with the attachment quietly missing is the bug this whole path exists`,
224
- ` // to prevent.`,
225
- ` throw new Error(`,
226
- ` 'Unsupported file content part: file_data must be a data: URI of the form data:<media type>;base64,<data>.',`,
227
- ` );`,
228
- ` }`,
229
- ` return {`,
230
- ` kind: 'file',`,
231
- ` mediaType: asData[1],`,
232
- ` filename: part.file.filename,`,
233
- ` source: { type: 'data', data: asData[2] },`,
234
- ` };`,
235
- ` });`,
236
- `}`,
237
- ``,
238
- `/** Just the text of a turn. System, assistant and tool messages are text-only`,
239
- ` * on this wire, so this collapses the array form for them. */`,
240
- `function wireText(content: OpenAIWireMessage['content']): string {`,
241
- ` return wireParts(content)`,
242
- ` .map((p) => (p.kind === 'text' ? p.text : ''))`,
243
- ` .join('');`,
244
- `}`,
245
- ];
246
-
247
- /**
248
- * What a bare `Integration.webRoute` needs above it before it will compile.
249
- *
250
- * WHY THIS IS A FUNCTION AND NOT TWO EXPORTED CONSTANTS. `webRoute` reads like a
251
- * self-contained handler and is not one: every fragment in the catalog calls
252
- * `readChatRequest`, and three of them (anthropic, mastra, vercel-ai-sdk) also
253
- * call `wireParts` / `wireText` and annotate with `WirePart`. Measured over the
254
- * catalog, a bare fragment under `tsc --strict` is TS2304 on five distinct names.
255
- * A consumer handed `CHAT_REQUEST_BODY_DECL` alone would therefore emit five
256
- * routes that compile and three that do not, and would find out only for the
257
- * ones it happened to wire first. Asking the question the caller actually has —
258
- * "what goes above THIS fragment" — is the shape that cannot be answered
259
- * half-right, so that is what is exported.
260
- *
261
- * `symbols` is DERIVED from `decl` rather than listed beside it, so a rename
262
- * inside either declaration block moves it and a consumer's drift guard grades
263
- * the real text.
264
- */
265
- export interface ChatRoutePreamble {
266
- /** import lines the declarations need, emitted at the top of the route file */
267
- readonly imports: readonly string[];
268
- /** the declaration lines, emitted immediately above the handler */
269
- readonly decl: readonly string[];
270
- /** every symbol `decl` declares, read back out of `decl` */
271
- readonly symbols: readonly string[];
272
- }
273
-
274
- /** A top-level declaration in a preamble block. Indented lines are bodies. */
275
- const PREAMBLE_DECLARATION = /^(?:export\s+)?(?:async\s+)?(?:function|type|interface|const|class)\s+([A-Za-z_$][\w$]*)/;
276
-
277
- /**
278
- * The preamble a given handler fragment needs.
279
- *
280
- * Used by the MCP below to build its own route blocks, and exported for
281
- * `create-kai`, which writes the same handler to a real file that has to
282
- * compile. One code path, so the two cannot disagree about what a route needs.
283
- */
284
- export function chatRoutePreamble(fragment: string): ChatRoutePreamble {
285
- // The content helpers ride along only where the route calls them; see
286
- // CONTENT_PARTS_DECL for why an unconditional injection would not compile.
287
- //
288
- // KNOWN GAP, live but not yet reachable: this tests for a CALL, so a fragment
289
- // that only annotates with `WirePart` / `WireFileSource` and never calls
290
- // either helper would be told it needs nothing and would not compile. No
291
- // catalog route is shaped that way today — vercel-ai-sdk is the only one that
292
- // names the type, and it calls `wireParts` two lines later — so widening the
293
- // test would change no emitted byte, and that is exactly why it is left alone
294
- // here rather than fixed blind. `scaffold.test.ts` → "webRoute has no symbol
295
- // its own preamble fails to declare" is the check that turns this from a
296
- // comment into a failing build the day an integration lands in that shape.
297
- const decl = /\bwire(?:Parts|Text)\s*\(/.test(fragment)
298
- ? [...CHAT_REQUEST_BODY_DECL, ``, ...CONTENT_PARTS_DECL]
299
- : [...CHAT_REQUEST_BODY_DECL];
300
- return {
301
- imports: [CHAT_REQUEST_BODY_IMPORT],
302
- decl,
303
- symbols: decl.flatMap((line) => PREAMBLE_DECLARATION.exec(line)?.[1] ?? []),
304
- };
305
- }