@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,390 +0,0 @@
1
- import { z } from 'zod';
2
-
3
- export const Category = z.enum(['provider', 'gateway', 'framework', 'harness', 'mock']);
4
- export const Language = z.enum(['ts', 'python']);
5
- export const StreamFormat = z.enum(['openai-sse', 'ai-sdk', 'native']);
6
- /**
7
- * The scaffold's target.
8
- *
9
- * Two of these are NOT web-component consumers, and the difference is load-bearing:
10
- * - `angular` consumes `kai-*` like vue/svelte/html, but needs
11
- * `CUSTOM_ELEMENTS_SCHEMA` and binds arrays/objects with `[prop]="…"`.
12
- * - `solid` consumes the SolidJS components DIRECTLY from the `@kitn.ai/ui`
13
- * root entry. The kit is authored in Solid, so routing a Solid consumer
14
- * through the custom-element facade would ship the Solid runtime twice and
15
- * cross a reactive-context boundary for nothing.
16
- */
17
- export const Framework = z.enum(['html', 'react', 'next', 'vue', 'svelte', 'angular', 'solid', 'fastapi', 'express', 'worker', 'tanstack-start']);
18
- export const Placement = z.enum(['side', 'full-page', 'docked-widget', 'inline']);
19
-
20
- /**
21
- * Whether this integration's SECRET may sit in the browser bundle.
22
- *
23
- * Read `'needs-proxy'` as "a server hop is mandatory" and `'frontend-safe'` as
24
- * "the browser may call the upstream itself". This is the flag `create-kai`
25
- * consults before it decides where a key goes, so getting it wrong in the
26
- * permissive direction writes an API key into client code. There is deliberately
27
- * no default and no boolean: the refinement below REJECTS an integration that
28
- * declares neither, because "absent" must never read as "safe".
29
- *
30
- * `'needs-proxy'` covers two cases, and the second is easy to miss:
31
- * 1. a secret. The route holds a key, so a static bundle cannot.
32
- * 2. a server-only CAPABILITY. `pi` spawns a local process; no key is involved
33
- * and a browser still cannot do it.
34
- *
35
- * `'frontend-safe'` is the narrow claim: nothing secret AND no server-only
36
- * capability. Two integrations qualify, and both were read off their routes —
37
- * `ollama` fetches `localhost:11434` with no auth header at all, and `mock`
38
- * ships no route to reach.
39
- *
40
- * Do not infer this from the provider's name. A provider with a CORS-friendly
41
- * public endpoint and one that requires a proxy look identical from outside; only
42
- * the route says which it is. That is the same lesson `forwardsFromClient` and
43
- * `clientToolFormat` were each added to record.
44
- */
45
- export const KeyExposure = z.enum(['frontend-safe', 'needs-proxy']);
46
-
47
- /**
48
- * What this integration needs the developer to supply OUT OF BAND — beyond an
49
- * install and a key.
50
- *
51
- * `create-kai` groups its gateway prompt three ways: **No backend**, **Bring a
52
- * key**, **Bring a server or runtime**. The third group is defined by exactly
53
- * this question, and until now the catalog could not answer it. Every derivation
54
- * that reproduced the spec's split did so by accident and broke on inspection:
55
- * · `category` does not separate them at all — `provider` holds `openai` and
56
- * `ollama`, `framework` holds `vercel-ai-sdk` and `langgraph`.
57
- * · a non-empty `routeTemplates` picks out `cloudflare`/`pi`/`pydantic-ai`,
58
- * which is a fact about how a route is EXPRESSED, not about what it needs.
59
- * · "declares a secret env var" puts `langgraph` and `pydantic-ai` in the key
60
- * group, which is right for one and wrong for the other.
61
- * So it is declared, for the reason `keyExposure`, `forwardsFromClient` and
62
- * `clientToolFormat` are each declared: only the route knows.
63
- *
64
- * The four values, and what makes each its own case for the CLI rather than a
65
- * boolean it could have been:
66
- *
67
- * · `'none'` ......... `npm install` plus (maybe) a key is the whole story.
68
- * The upstream is a remote HTTPS endpoint, or the agent runs IN the route.
69
- * `langgraph` is the one worth reading twice: it is in the spec's "server or
70
- * runtime" group and does not belong there — its emitted route builds the
71
- * graph in process (`createReactAgent` + `new ChatOpenAI(...)`), so there is
72
- * no LangGraph server anywhere and its runNote asks only for a key.
73
- * · `'local-server'` . a separate process must already be LISTENING before the
74
- * app works. The CLI cannot create it and must say so: `ollama serve` on
75
- * 11434, a `mastra dev` server behind `MASTRA_URL`.
76
- * · `'local-binary'` . an executable must be on PATH; the route spawns it on
77
- * demand rather than talking to a port. Nothing is listening beforehand, so
78
- * "start the server" is the wrong instruction — `pi` is the case.
79
- * · `'language-runtime'` the emitted backend runs on a runtime the JS toolchain
80
- * does not provide, and the user starts it themselves. `pydantic-ai` is a
81
- * FastAPI service: `deps.pip`, `uvicorn main:app`, a second port.
82
- *
83
- * A boolean would collapse the last three, and they are three different sentences
84
- * to print next to a menu item. The refinement below REFUSES an integration that
85
- * declares nothing, for the same reason `keyExposure` does: a missing value read
86
- * as `'none'` is a scaffold that says "npm run dev" to someone who needs to start
87
- * Ollama first, and then reports as a broken kit.
88
- */
89
- export const OutOfBand = z.enum(['none', 'local-server', 'local-binary', 'language-runtime']);
90
-
91
- /**
92
- * The packages an app must install BEYOND `@kitn.ai/ui` to run this
93
- * integration's route.
94
- *
95
- * Derived once, here, from the route's own import statements, so the CLI never
96
- * has to re-parse route source to find them. Today this fact only exists as prose
97
- * in `runNote`, which no installer can read.
98
- *
99
- * The rule, enforced by `registry.test.ts`: `npm` is exactly the set of
100
- * bare-module specifiers imported by the TS route sources, normalised to package
101
- * names (`@langchain/core/tools` counts as `@langchain/core`), minus `node:`
102
- * builtins and minus `@kitn.ai/ui` itself, which every scaffold already depends
103
- * on. `pip` is a superset of the python route's imports, because a Python app
104
- * also needs its ASGI server (`uvicorn`), which nothing imports.
105
- *
106
- * Type-only packages (`@types/*`) are not listed: nothing imports them, so the
107
- * rule cannot see them, and the frameworks that need them already carry them.
108
- */
109
- export const DepsSchema = z.object({
110
- npm: z.array(z.string()).default([]),
111
- pip: z.array(z.string()).default([]),
112
- });
113
-
114
- /**
115
- * An env var name that holds a secret rather than an address.
116
- *
117
- * Anchored at the END, which is the whole precision of it: `CF_API_TOKEN` and
118
- * `AI_GATEWAY_API_KEY` match, while `CF_ACCOUNT_ID` and `MASTRA_URL` do not.
119
- * `MASTRA_URL` is the case that stops this being a proxy for "declares any env
120
- * var at all" — a base URL is not a credential.
121
- *
122
- * This is a SAFETY NET over the declaration, never its source. Three integrations
123
- * (`langgraph`, `vercel-ai-sdk`, `pydantic-ai`) hold a key their route source
124
- * never names, because the SDK reads the env var itself; their `envVars` is what
125
- * catches them here, and nothing but the author reading the route would have.
126
- *
127
- * Exported because the scaffolder names the secrets back at the developer in its
128
- * run note ("OPENAI_API_KEY stays on the server"). That sentence and the
129
- * refinement below have to agree about which env vars are secret, so there is one
130
- * pattern rather than two free to drift apart.
131
- */
132
- export const SECRET_ENV_VAR = /(?:KEY|TOKEN|SECRET|PASSWORD)$/;
133
-
134
- /**
135
- * A credential written into a request from route source. The second alternative
136
- * is Anthropic's spelling, which is not an `Authorization` header at all.
137
- */
138
- const AUTH_HEADER = /Authorization\s*:|['"]x-api-key['"]\s*:/i;
139
-
140
- /**
141
- * A route that FETCHES a loopback address — so something local has to be
142
- * listening. `ollama`'s `fetch('http://localhost:11434/v1/chat/completions')` is
143
- * the case this catches.
144
- *
145
- * Anchored at the fetch/URL call, not matched anywhere in the source, and that
146
- * precision is the whole point. Two other routes mention loopback in prose:
147
- * mastra's `throw new Error('MASTRA_URL is not set… e.g. http://localhost:4111')`
148
- * and pi's `console.log('chat api: http://localhost:3001/api/chat')`. A bare
149
- * /localhost/ would flag both — mastra for the right answer by the wrong
150
- * evidence, pi for a line about its OWN listening port, which says nothing about
151
- * what it depends on. A net that is right by accident is the thing this field
152
- * exists to replace, so it is narrowed until it only fires on a real dependency.
153
- */
154
- const LOOPBACK_FETCH = /\b(?:fetch|URL)\s*\(\s*['"`]https?:\/\/(?:localhost|127\.0\.0\.1)/;
155
-
156
- /** A route that shells out. The program it names must exist on the host. */
157
- const SPAWNS_PROCESS = /\bfrom\s+['"]node:child_process['"]|\bspawn\s*\(/;
158
-
159
- export const IntegrationSchema = z.object({
160
- id: z.string(),
161
- title: z.string(),
162
- category: Category,
163
- language: Language,
164
- streamFormat: StreamFormat,
165
- envVars: z.array(z.string()).default([]),
166
- routeTemplates: z.record(z.string(), z.string()), // keyed by Framework value → code string
167
- /**
168
- * The backend as ONE web-standard handler, `(Request) => Response`, written as
169
- * a complete `async function chatHandler(request: Request)` declaration.
170
- *
171
- * WHY THIS EXISTS. `routeTemplates` is keyed by framework, and in practice
172
- * every TS integration only ever filled in `next`. Everything else fell
173
- * through to it, so a svelte scaffold emitted a Next.js `export async function
174
- * POST(req)` — which TYPECHECKS under SvelteKit and then throws
175
- * `req.json is not a function` on the first submit, because SvelteKit calls
176
- * `POST(event)`. vue and html got the same snippet with nowhere to put it.
177
- *
178
- * The handler BODY is portable; only the few lines that declare the route
179
- * differ per framework. So integrations write the body once here and the
180
- * scaffolder wraps it (see `WEB_ROUTE_ADAPTERS` in mcp/tools/scaffold.ts).
181
- * `routeTemplates` stays for routes that genuinely cannot be expressed this
182
- * way: a Worker using an `env` binding, an Express `(req, res)` bridge, a
183
- * FastAPI service.
184
- *
185
- * An exact `routeTemplates[framework]` still wins over this.
186
- */
187
- webRoute: z.string().optional(),
188
- streamMapping: z.string(), // prose: how the stream maps to messages
189
- runNote: z.string(),
190
- docsSlug: z.string(),
191
- /**
192
- * The request-body fields this integration's ROUTE reads off the client and
193
- * forwards upstream. Anything not listed is owned by the route or by the agent
194
- * behind it.
195
- *
196
- * The scaffolder emits an editable const for a field only when it appears
197
- * here, and that is the whole point: `model` used to be emitted whenever a
198
- * route template contained the substring 'model', which is true of any
199
- * template that so much as writes `model: 'llama3.2'`, so four integrations
200
- * shipped an editable const their route threw away. The mirror-image bug is a
201
- * `tools` array that never gets sent, which leaves kai-tool a panel no code
202
- * path can populate.
203
- *
204
- * Empty by default, so a new integration emits nothing until its route really
205
- * does forward the field.
206
- */
207
- forwardsFromClient: z.array(z.enum(['model', 'tools'])).default([]),
208
- /**
209
- * The tool-definition envelope this integration's ROUTE expects to find in the
210
- * `tools` array the client POSTs. Required exactly when `forwardsFromClient`
211
- * includes `'tools'`, and meaningless otherwise.
212
- *
213
- * WHY THIS IS DECLARED AND NOT DERIVED. It used to be looked up from
214
- * `streamFormat`, and that is a category error: `streamFormat` describes the
215
- * shape of the RESPONSE stream, while the tool envelope is a REQUEST concern.
216
- * The two only appeared to agree because every integration that forwarded
217
- * tools happened to be `openai-sse`. `anthropic` is where the conflation
218
- * becomes visible — it is `streamFormat: 'native'`, which says nothing about
219
- * request shape, and the old table mapped `native` to null.
220
- *
221
- * And keying on the integration's PROVIDER would be wrong too, which is the
222
- * part worth reading the route before assuming: `anthropic`'s handler converts
223
- * the array itself (`toAnthropicTools` reads `raw.function.name` /
224
- * `.function.parameters`), so it wants `'openai'` here. Handing it Anthropic's
225
- * own `{ name, input_schema }` shape would yield tools with a blank name. Only
226
- * the route knows what it accepts, so only the integration can state it — the
227
- * same reason `forwardsFromClient` lives here rather than being sniffed out of
228
- * the route source.
229
- *
230
- * Optional in the type, mandatory in practice: the refinement below rejects an
231
- * integration that forwards tools without one. There is deliberately no
232
- * default — a default is how a tools array with no card in it ships silently.
233
- */
234
- clientToolFormat: z.enum(['openai', 'anthropic', 'jsonschema']).optional(),
235
- /** See {@link DepsSchema}. Empty is a real answer: a fetch-only route needs nothing. */
236
- deps: DepsSchema.default({ npm: [], pip: [] }),
237
- /**
238
- * See {@link KeyExposure}. Optional in the TYPE only so the refinement below
239
- * owns the error message — Zod skips refinements when the base object already
240
- * failed, so a plain required field would report "Invalid input" and this is
241
- * the one field where the reader needs to be told what is at stake.
242
- */
243
- keyExposure: KeyExposure.optional(),
244
- /**
245
- * See {@link OutOfBand}. Optional in the TYPE only so the refinement below owns
246
- * the error message — Zod skips refinements when the base object already
247
- * failed, so a plain required field would report "Invalid input" and this is a
248
- * field whose reader needs to be told what the four values mean.
249
- */
250
- outOfBand: OutOfBand.optional(),
251
- }).superRefine((integration, ctx) => {
252
- // Enforced against the real catalog by `registry.test.ts`, which parses every
253
- // integration through this schema. A new host that forwards tools therefore
254
- // cannot reach the scaffolder undeclared: it fails at the catalog boundary,
255
- // before any emit path has to decide what to do about it.
256
- if (integration.forwardsFromClient.includes('tools') && integration.clientToolFormat === undefined) {
257
- ctx.addIssue({
258
- code: z.ZodIssueCode.custom,
259
- path: ['clientToolFormat'],
260
- message:
261
- `integration '${integration.id}' forwards a 'tools' array but declares no clientToolFormat. ` +
262
- `State the envelope its route expects: 'openai' ({ type: 'function', function: { parameters } }), ` +
263
- `'anthropic' ({ name, input_schema }), or 'jsonschema' ({ name, description, schema }). ` +
264
- `Read the route's own handler to decide — a route that CONVERTS the array server-side wants the ` +
265
- `shape it converts FROM, not its own provider's.`,
266
- });
267
- }
268
-
269
- // ---- keyExposure ----
270
- //
271
- // Two checks, and the split matters. The first refuses SILENCE. The second
272
- // refuses a specific LIE, and only ever in the dangerous direction: it can
273
- // turn a 'frontend-safe' claim into an error, never the reverse. Declaring
274
- // 'needs-proxy' where a proxy was not strictly required costs a server hop;
275
- // declaring 'frontend-safe' where it was required costs the key.
276
-
277
- if (integration.keyExposure === undefined) {
278
- ctx.addIssue({
279
- code: z.ZodIssueCode.custom,
280
- path: ['keyExposure'],
281
- message:
282
- `integration '${integration.id}' declares no keyExposure. State whether its SECRET may reach the ` +
283
- `browser bundle: 'needs-proxy' (a key, or a server-only capability such as spawning a process, so ` +
284
- `the CLI must keep it behind a server) or 'frontend-safe' (nothing secret and nothing server-only, ` +
285
- `so the browser may call the upstream directly). Read the route to decide, not the provider's name: ` +
286
- `a public CORS-friendly endpoint and one that requires a proxy are indistinguishable from outside. ` +
287
- `There is no default on purpose — a missing flag read as "safe" is how an API key ships in client code.`,
288
- });
289
- }
290
-
291
- if (integration.keyExposure === 'frontend-safe') {
292
- const secrets = integration.envVars.filter((name) => SECRET_ENV_VAR.test(name));
293
- if (secrets.length > 0) {
294
- ctx.addIssue({
295
- code: z.ZodIssueCode.custom,
296
- path: ['keyExposure'],
297
- message:
298
- `integration '${integration.id}' claims keyExposure 'frontend-safe' but declares the secret env ` +
299
- `var(s) ${secrets.join(', ')}. A frontend bundle is public, so that combination puts a key in ` +
300
- `client code. Use 'needs-proxy'.`,
301
- });
302
- }
303
-
304
- const routeSources = [
305
- ...Object.values(integration.routeTemplates),
306
- ...(integration.webRoute ? [integration.webRoute] : []),
307
- ];
308
- if (routeSources.some((code) => AUTH_HEADER.test(code))) {
309
- ctx.addIssue({
310
- code: z.ZodIssueCode.custom,
311
- path: ['keyExposure'],
312
- message:
313
- `integration '${integration.id}' claims keyExposure 'frontend-safe' but its route sends an ` +
314
- `authorization header, so it holds a credential a browser bundle must not. Use 'needs-proxy'.`,
315
- });
316
- }
317
- }
318
-
319
- // ---- outOfBand ----
320
- //
321
- // Same two-check shape as keyExposure, and the same asymmetry. The first
322
- // refuses SILENCE. The second refuses a specific LIE, and only in the direction
323
- // that costs the developer something: it can turn a `'none'` claim into an
324
- // error, never the reverse. Over-declaring prints a prerequisite that was not
325
- // strictly needed; under-declaring ships a scaffold that cannot possibly run
326
- // and blames the kit.
327
-
328
- if (integration.outOfBand === undefined) {
329
- ctx.addIssue({
330
- code: z.ZodIssueCode.custom,
331
- path: ['outOfBand'],
332
- message:
333
- `integration '${integration.id}' declares no outOfBand. State what the developer must supply ` +
334
- `BEYOND an install and a key, because that is the group create-kai's gateway prompt puts it in: ` +
335
- `'none' (a remote endpoint, or the agent runs inside the route), 'local-server' (a process must ` +
336
- `already be listening, e.g. 'ollama serve'), 'local-binary' (an executable on PATH that the route ` +
337
- `spawns), or 'language-runtime' (the emitted backend needs a runtime the JS toolchain does not ` +
338
- `provide, e.g. python + uvicorn). Read the route and the runNote to decide, not the category: ` +
339
- `'provider' holds both openai and ollama. There is no default on purpose — a missing value read ` +
340
- `as 'none' is a scaffold that says "npm run dev" to someone who has nothing to connect to.`,
341
- });
342
- }
343
-
344
- if (integration.outOfBand === 'none') {
345
- const routeSources = [
346
- ...Object.values(integration.routeTemplates),
347
- ...(integration.webRoute ? [integration.webRoute] : []),
348
- ];
349
- if (integration.language === 'python') {
350
- ctx.addIssue({
351
- code: z.ZodIssueCode.custom,
352
- path: ['outOfBand'],
353
- message:
354
- `integration '${integration.id}' claims outOfBand 'none' but its route is python, so a consumer ` +
355
- `whose whole toolchain is node cannot run it without an interpreter and an ASGI server they ` +
356
- `start themselves. Use 'language-runtime'.`,
357
- });
358
- }
359
- if (routeSources.some((code) => SPAWNS_PROCESS.test(code))) {
360
- ctx.addIssue({
361
- code: z.ZodIssueCode.custom,
362
- path: ['outOfBand'],
363
- message:
364
- `integration '${integration.id}' claims outOfBand 'none' but its route spawns a child process, ` +
365
- `so the program it spawns has to be installed on the host — nothing in package.json puts it ` +
366
- `there. Use 'local-binary'.`,
367
- });
368
- }
369
- if (routeSources.some((code) => LOOPBACK_FETCH.test(code))) {
370
- ctx.addIssue({
371
- code: z.ZodIssueCode.custom,
372
- path: ['outOfBand'],
373
- message:
374
- `integration '${integration.id}' claims outOfBand 'none' but its route fetches a loopback ` +
375
- `address, so something local has to be listening before the first message works. ` +
376
- `Use 'local-server'.`,
377
- });
378
- }
379
- }
380
- });
381
- export type Integration = z.infer<typeof IntegrationSchema>;
382
-
383
- export const ArchetypeSchema = z.object({
384
- id: z.string(),
385
- title: z.string(),
386
- components: z.array(z.string()), // kai-* tags, e.g. ['kai-chat', 'kai-sources']
387
- defaultPlacement: Placement,
388
- docsSlug: z.string(),
389
- });
390
- export type Archetype = z.infer<typeof ArchetypeSchema>;
@@ -1,120 +0,0 @@
1
- // src/components/artifact-card.tsx
2
- // The `artifact` built-in card: chrome + sizing around <Artifact>, plus the
3
- // bridge from its observation callbacks onto the frozen Card Contract.
4
- import { createUniqueId, untrack, Show, type JSX } from 'solid-js';
5
- import type { CardHost } from '../primitives/card-contract';
6
- import { Artifact } from './artifact';
7
-
8
- // `ArtifactCardData` is AUTHORED IN ../primitives/card-data-types.ts, along with
9
- // `ArtifactCardFile` — the same declaration `FileTree`/`Artifact` use, which is
10
- // why nothing here restates the file shape. See the note in confirm-card.tsx, or
11
- // that file's header, for why the card payload types left a `.tsx` and why they
12
- // are `type` aliases. Re-exported here unchanged.
13
-
14
- import type { ArtifactCardData } from '../primitives/card-data-types';
15
-
16
- export type {
17
- ArtifactCardData,
18
- ArtifactCardEnvelope,
19
- ArtifactCardFile,
20
- ArtifactCardTab,
21
- } from '../primitives/card-data-types';
22
-
23
- /** Height the artifact card falls back to. Tall enough that a framed page is
24
- * actually legible in a thread, short enough to leave the conversation visible. */
25
- export const DEFAULT_ARTIFACT_CARD_HEIGHT = '420px';
26
-
27
- function resolveHeight(height: number | string | undefined): string {
28
- if (typeof height === 'number') return `${height}px`;
29
- if (typeof height === 'string' && height.trim() !== '') return height;
30
- return DEFAULT_ARTIFACT_CARD_HEIGHT;
31
- }
32
-
33
- export interface ArtifactCardProps {
34
- data: ArtifactCardData;
35
- cardId: string;
36
- heading?: string;
37
- host?: CardHost;
38
- }
39
-
40
- /** Chrome + sizing around `<Artifact>` for the `artifact` card type.
41
- *
42
- * WHY A WRAPPER IS REQUIRED, not cosmetic. `<Artifact>`'s root is
43
- * `flex h-full w-full flex-col` — it is built to FILL a container that already
44
- * has a height (a resizable panel, a split view). A message thread gives its
45
- * parts no height at all, so `h-full` resolves against an auto-height parent,
46
- * the frame computes to ZERO, and the card renders as an invisible nothing.
47
- * The explicit `height` here is what makes the card visible; `data.height`
48
- * overrides it.
49
- *
50
- * `part`/`data-card-type` are stable handles. `CardRenderer` renders card
51
- * components bare, and in the web-component path `cardComponentsFromTags` maps a
52
- * non-overridden built-in straight to its Solid component — so there is no
53
- * `<kai-artifact>` tag in the DOM to point at. This wrapper is the only stable
54
- * thing to select, which is what lets a test count rendered artifacts inside
55
- * `<kai-thread>`'s shadow root.
56
- *
57
- * `part="card"` matches the other chromed cards, which get it from `<Card>`;
58
- * this one hand-rolls its chrome and so states it directly. The artifact-specific
59
- * handle is `data-card-type`, NOT a second part token: every `::part` name has to
60
- * be declared in `elements/slots.ts` (the drift guard in `slots.test.ts` enforces
61
- * it), so adding an `artifact` part is a deliberate public-API decision to make
62
- * there, not something to smuggle in from a component.
63
- *
64
- * `envelope.title` renders as a HEADING above the frame rather than being folded
65
- * into `displayUrl`: the address field states where the preview is pointing, and
66
- * overwriting it with a title would make it lie. A heading is also what the four
67
- * other chromed cards (form/confirm/tasks/choice) already do with `title`.
68
- *
69
- * `tab`/`activeFile` are SEEDS, never re-asserted — see their notes on
70
- * `ArtifactCardData`. A revised envelope must not undo what the user did.
71
- *
72
- * The three observation callbacks emit the contract's EXISTING `state` verb —
73
- * the contract is frozen, and a new kind would force a CARD_CONTRACT_VERSION
74
- * bump. Each patch key mirrors a `data` field name, so a host can merge the
75
- * patch straight back into `envelope.data` and re-send it; `addCard` upserts on
76
- * `envelope.id`, so that round-trip revises the card instead of duplicating it. */
77
- export function ArtifactCard(props: ArtifactCardProps): JSX.Element {
78
- const headingId = createUniqueId();
79
- // Read ONCE, non-reactively: these seed the view and must not be re-asserted
80
- // when a revision replaces the envelope. See ArtifactCardData.activeFile.
81
- const seedTab = untrack(() => props.data.tab);
82
- const seedActiveFile = untrack(() => props.data.activeFile);
83
- const patch = (p: Record<string, unknown>) =>
84
- props.host?.emit({ kind: 'state', cardId: props.cardId, patch: p });
85
-
86
- return (
87
- <div
88
- part="card"
89
- data-card-type="artifact"
90
- data-card-id={props.cardId}
91
- role="group"
92
- aria-labelledby={props.heading ? headingId : undefined}
93
- aria-label={props.heading ? undefined : 'Artifact'}
94
- style={{ height: resolveHeight(props.data.height) }}
95
- class="flex w-full flex-col overflow-hidden rounded-xl border border-border bg-card"
96
- >
97
- <Show when={props.heading}>
98
- <h3
99
- id={headingId}
100
- class="shrink-0 truncate border-b border-border px-3 py-2 text-sm font-medium text-foreground"
101
- >
102
- {props.heading}
103
- </h3>
104
- </Show>
105
- <div class="min-h-0 flex-1">
106
- <Artifact
107
- src={props.data.src}
108
- files={props.data.files}
109
- defaultTab={seedTab}
110
- activeFile={seedActiveFile}
111
- displayUrl={props.data.displayUrl}
112
- iframeTitle={props.heading ? `${props.heading} preview` : 'Artifact preview'}
113
- onNavigate={(url) => patch({ src: url })}
114
- onTabChange={(tab) => patch({ tab })}
115
- onFileSelect={(path) => patch({ activeFile: path })}
116
- />
117
- </div>
118
- </div>
119
- );
120
- }