@kitn.ai/ui 0.27.0 → 0.29.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 (612) hide show
  1. package/README.md +10 -2
  2. package/dist/{Icon-BnFKqqtY.js → Icon-DObhsRtm.js} +1 -1
  3. package/dist/{action-icons-CBskfBMz.js → action-icons-CcgNN2oT.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-CjRU3JgV.js +1 -0
  7. package/dist/arrow-left-Bnpb1UEW.js +1 -0
  8. package/dist/{artifact-CvXEm1lS.js → artifact-Bwt7OgcR.js} +1 -1
  9. package/dist/{attachments-C43ZegEq.js → attachments-Qr4kg-2b.js} +1 -1
  10. package/dist/{audio-visualizer-B-79y1Tj.js → audio-visualizer-DToYdfSc.js} +1 -1
  11. package/dist/{badge-BpUbq8c0.js → badge-CdEu_jn2.js} +1 -1
  12. package/dist/{bell-sn17Ip9v.js → bell-DQAAOpDz.js} +1 -1
  13. package/dist/{button-BH6rN0U-.js → button-DkuOnGLy.js} +1 -1
  14. package/dist/{card-renderer-Cb1gQmth.js → card-renderer-Jx70m6_l.js} +1 -1
  15. package/dist/{card-routing-DifQgS7n.js → card-routing-0YidER_3.js} +1 -1
  16. package/dist/check-njkVdZu2.js +1 -0
  17. package/dist/{checkbox-Dc9Yov_B.js → checkbox-D7iRB3nL.js} +1 -1
  18. package/dist/{checkbox-group-B1kDLLYk.js → checkbox-group-B2_rpoPM.js} +1 -1
  19. package/dist/chevron-down-B72s6PXR.js +1 -0
  20. package/dist/chevron-right-BatuHzUm.js +1 -0
  21. package/dist/{choice-card-BT3c1S8g.js → choice-card-m0BYqqOK.js} +1 -1
  22. package/dist/circle-check-B62pODB3.js +1 -0
  23. package/dist/{circle-x-wobWkoSx.js → circle-x-BPG0iPst.js} +1 -1
  24. package/dist/circle-zx0ByzY9.js +1 -0
  25. package/dist/code-block-ClMLKb7C.js +1 -0
  26. package/dist/{collapsible-CPJbf6FM.js → collapsible-B4DlWicL.js} +1 -1
  27. package/dist/components/chat-thread.d.ts +89 -1
  28. package/dist/components/conversation-item.d.ts +16 -0
  29. package/dist/components/conversation-panel.d.ts +29 -0
  30. package/dist/components/home-panel.d.ts +34 -0
  31. package/dist/components/widget-tab-bar.d.ts +16 -0
  32. package/dist/{composer-CjngLzal.js → composer-sQ0HcvyG.js} +3 -3
  33. package/dist/{confirm-card-DCx_A4bU.js → confirm-card-rQWDQsnC.js} +1 -1
  34. package/dist/construct-cli.es.js +185 -17
  35. package/dist/construct.d.ts +5 -0
  36. package/dist/construct.js +327 -0
  37. package/dist/{context-BY8V-Nlp.js → context-0kg4ZX1J.js} +1 -1
  38. package/dist/controllable-CnGpMF6r.js +1 -0
  39. package/dist/conversation-item-BxwQLaFJ.js +1 -0
  40. package/dist/conversation-list-BCfGN1JU.js +1 -0
  41. package/dist/{copy-B6DO4PqB.js → copy-n9u9rqpi.js} +1 -1
  42. package/dist/core-C8fzo39E.js +1 -12
  43. package/dist/{create-tween-CnMHviKB.js → create-tween-C-q-JCM-.js} +1 -1
  44. package/dist/{create-tween-D1aiGZZh.js → create-tween-CRrJXxBd.js} +1 -1
  45. package/dist/{create-tween-BPzaefTp.js → create-tween-DZ3RRDHD.js} +1 -1
  46. package/dist/{create-tween-DUSQUKpr.js → create-tween-uPkArjIG.js} +1 -1
  47. package/dist/custom-elements.json +51 -2
  48. package/dist/{default-input-CucQEOqH.js → default-input-CaMrJkgH.js} +1 -1
  49. package/dist/define-By-uL588.js +1 -0
  50. package/dist/define.js +2 -2
  51. package/dist/define.server.js +2 -2
  52. package/dist/{disclosure-CbLtajUQ.js → disclosure-WUImBbDv.js} +1 -1
  53. package/dist/{dropdown-BwhViJFd.js → dropdown-wZVeJOMd.js} +1 -1
  54. package/dist/elements/agent-card.js +1 -1
  55. package/dist/elements/artifact.js +1 -1
  56. package/dist/elements/attachments.js +1 -1
  57. package/dist/elements/audio-visualizer.js +1 -1
  58. package/dist/elements/avatar.js +1 -1
  59. package/dist/elements/badge.js +1 -1
  60. package/dist/elements/button.js +1 -1
  61. package/dist/elements/card.js +1 -1
  62. package/dist/elements/cards.js +1 -1
  63. package/dist/elements/chain-of-thought.js +1 -1
  64. package/dist/elements/chat-scope-picker.js +1 -1
  65. package/dist/elements/chat-workspace.js +1 -1
  66. package/dist/elements/chat.js +1 -1
  67. package/dist/elements/checkbox-group.js +1 -1
  68. package/dist/elements/checkbox.js +1 -1
  69. package/dist/elements/checkpoint.js +1 -1
  70. package/dist/elements/choice.js +1 -1
  71. package/dist/elements/coachmark.js +1 -1
  72. package/dist/elements/code-block.js +1 -1
  73. package/dist/elements/command.js +1 -1
  74. package/dist/elements/compare.js +1 -1
  75. package/dist/elements/composer.js +1 -1
  76. package/dist/elements/confirm-card.js +1 -1
  77. package/dist/elements/context-meter.js +1 -1
  78. package/dist/elements/conversation-item.js +1 -1
  79. package/dist/elements/conversation-list.js +1 -1
  80. package/dist/elements/dialog.js +1 -1
  81. package/dist/elements/dock.js +3 -3
  82. package/dist/elements/dropdown.js +1 -1
  83. package/dist/elements/editable-label.js +1 -1
  84. package/dist/elements/embed.js +1 -1
  85. package/dist/elements/empty.js +1 -1
  86. package/dist/elements/feedback-bar.js +1 -1
  87. package/dist/elements/file-tree.js +1 -1
  88. package/dist/elements/file-upload.js +1 -1
  89. package/dist/elements/form.js +1 -1
  90. package/dist/elements/hover-card.js +1 -1
  91. package/dist/elements/icon.js +1 -1
  92. package/dist/elements/image.js +1 -1
  93. package/dist/elements/input.js +1 -1
  94. package/dist/elements/kbd.js +1 -1
  95. package/dist/elements/link-preview.js +1 -1
  96. package/dist/elements/loader.js +1 -1
  97. package/dist/elements/markdown.js +1 -1
  98. package/dist/elements/menu.js +1 -1
  99. package/dist/elements/message-skills.js +1 -1
  100. package/dist/elements/message.js +1 -1
  101. package/dist/elements/model-switcher.js +1 -1
  102. package/dist/elements/nav.js +1 -1
  103. package/dist/elements/notice.js +1 -1
  104. package/dist/elements/pane-grid.js +1 -1
  105. package/dist/elements/pane-group.js +1 -1
  106. package/dist/elements/pane.js +1 -1
  107. package/dist/elements/popover.js +1 -1
  108. package/dist/elements/progress-bar.js +1 -1
  109. package/dist/elements/prompt-dock.js +1 -1
  110. package/dist/elements/prompt-input.js +1 -1
  111. package/dist/elements/prompt-suggestions.js +1 -1
  112. package/dist/elements/radio-group.js +1 -1
  113. package/dist/elements/reasoning.js +1 -1
  114. package/dist/elements/remote.js +1 -1
  115. package/dist/elements/resizable.js +1 -1
  116. package/dist/elements/response-stream.js +1 -1
  117. package/dist/elements/screen.js +1 -1
  118. package/dist/elements/scroll-area.js +1 -1
  119. package/dist/elements/scroll-button.js +1 -1
  120. package/dist/elements/search.js +1 -1
  121. package/dist/elements/segmented.js +1 -1
  122. package/dist/elements/select.js +1 -1
  123. package/dist/elements/separator.js +1 -1
  124. package/dist/elements/setting-item.js +1 -1
  125. package/dist/elements/settings-group.js +1 -1
  126. package/dist/elements/skeleton.js +1 -1
  127. package/dist/elements/slider.js +1 -1
  128. package/dist/elements/source.js +1 -1
  129. package/dist/elements/status.js +1 -1
  130. package/dist/elements/switch.js +1 -1
  131. package/dist/elements/tabs.js +1 -1
  132. package/dist/elements/tasks.js +1 -1
  133. package/dist/elements/text-shimmer.js +1 -1
  134. package/dist/elements/thinking-bar.js +1 -1
  135. package/dist/elements/thread.js +1 -1
  136. package/dist/elements/toast.js +1 -1
  137. package/dist/elements/tool.js +1 -1
  138. package/dist/elements/tooltip.js +1 -1
  139. package/dist/elements/voice-input.js +1 -1
  140. package/dist/elements/voice-output.js +1 -1
  141. package/dist/elements.d.ts +20 -4
  142. package/dist/{ellipsis-DFr4Vqr3.js → ellipsis-CbOpJnU3.js} +1 -1
  143. package/dist/{embed-5s_vU4J0.js → embed-CrfjkbUG.js} +1 -1
  144. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  145. package/dist/{external-link-u9d85ORQ.js → external-link-ByXAwBBQ.js} +1 -1
  146. package/dist/{file-text-CX7_x42o.js → file-text-DMib2qwt.js} +1 -1
  147. package/dist/{file-tree-D3kBjXI5.js → file-tree-CJqM2aP7.js} +1 -1
  148. package/dist/{folder-V-YdIL8f.js → folder-_BAb929C.js} +1 -1
  149. package/dist/{form-BRNUMCN2.js → form-DSZgZQZk.js} +1 -1
  150. package/dist/{hover-card-DaeiYrTA.js → hover-card-BQbul9eq.js} +1 -1
  151. package/dist/{icon-BpixdZNq.js → icon-CdcfRhYI.js} +1 -1
  152. package/dist/index.d.ts +3 -1
  153. package/dist/index.js +2842 -2703
  154. package/dist/index.server.js +2820 -2681
  155. package/dist/{info-8mFsIjS3.js → info-DsFjGuI_.js} +1 -1
  156. package/dist/{input-d1Yuu-hz.js → input-DKbmkMos.js} +1 -1
  157. package/dist/kai.es.js +1 -1
  158. package/dist/{kbd-961zMPFB.js → kbd-PvdGhX4s.js} +1 -1
  159. package/dist/{link-preview-DIIbV2Sd.js → link-preview-DbM1866N.js} +1 -1
  160. package/dist/{link-DlZZBGaR.js → link-zF8PzWfF.js} +1 -1
  161. package/dist/{loader-YQszHFaW.js → loader-BM4CEz4G.js} +1 -1
  162. package/dist/{markdown-CVk1MPsj.js → markdown-LMvmAyBk.js} +7 -7
  163. package/dist/mcp.es.js +79 -5
  164. package/dist/{message-CwKVEdZg.js → message-BSsgvHvf.js} +1 -1
  165. package/dist/{message-DS8lzHc1.js → message-BYZECyek.js} +1 -1
  166. package/dist/message-circle-DruwObfX.js +1 -0
  167. package/dist/message-square-BG6q6mlm.js +1 -0
  168. package/dist/{minimize-2-UEZmP2QT.js → minimize-2-BQRoBV1V.js} +1 -1
  169. package/dist/{model-switcher-Kk1jEQ5t.js → model-switcher-CMpCOYcB.js} +1 -1
  170. package/dist/{overlay-C1od6LOz.js → overlay-Cb-MkyDa.js} +1 -1
  171. package/dist/{panel-right-ryET0yyn.js → panel-right-i8warFxT.js} +1 -1
  172. package/dist/{paperclip-BDNoZFJP.js → paperclip-ByY3UVO6.js} +1 -1
  173. package/dist/play-BvKKq3fX.js +1 -0
  174. package/dist/primitives/conversation-store.d.ts +54 -0
  175. package/dist/{progress-bar-BvYX0aoy.js → progress-bar-jVAHvMUf.js} +1 -1
  176. package/dist/{prompt-suggestion-BRFu2lcu.js → prompt-suggestion-CD-qtNgC.js} +1 -1
  177. package/dist/{radio-DcL23cNJ.js → radio-BsoBMhkF.js} +1 -1
  178. package/dist/react/index.d.ts +393 -0
  179. package/dist/react.js +20 -20
  180. package/dist/{reasoning-Cackq4Rh.js → reasoning-4kBPtlTx.js} +1 -1
  181. package/dist/register-impl-B1hLkrI8.js +424 -0
  182. package/dist/{resizable-Cp9HUYih.js → resizable-uPmY9VY-.js} +1 -1
  183. package/dist/{rotate-ccw-0DLRDHH5.js → rotate-ccw-B2xn93py.js} +1 -1
  184. package/dist/{rotate-cw-DOB9IGcU.js → rotate-cw-CMVLoCyH.js} +1 -1
  185. package/dist/{scroll-area-emVmWP4K.js → scroll-area-BqLUo8ZZ.js} +1 -1
  186. package/dist/{scroll-button-CeP_gv1x.js → scroll-button-DslXiJyL.js} +1 -1
  187. package/dist/{select-CWmu00tS.js → select-2cLRtPGT.js} +1 -1
  188. package/dist/{separator-CE6vly6z.js → separator-BWQtNJcM.js} +1 -1
  189. package/dist/{settings-CE-78SvZ.js → settings-BBR63jLg.js} +1 -1
  190. package/dist/{settings-group-ZFWNxFQR.js → settings-group-B2ciy-Iw.js} +1 -1
  191. package/dist/{skeleton-BebdP4mf.js → skeleton-CkHI-HgC.js} +1 -1
  192. package/dist/{slider-BAKRYUlz.js → slider-DDR9U-i0.js} +1 -1
  193. package/dist/{solid-BE5ui6sy.js → solid-BzCFdL25.js} +7720 -7058
  194. package/dist/{solid-DFhsce3O.js → solid-DruVOXnf.js} +5864 -5283
  195. package/dist/solid.d.ts +6 -2
  196. package/dist/solid.js +217 -210
  197. package/dist/solid.server.js +217 -210
  198. package/dist/{source-B0FlguSx.js → source-GEnFF528.js} +1 -1
  199. package/dist/{star-CBMZvLuN.js → star-CilHq8GP.js} +1 -1
  200. package/dist/store-Ciyk6eZG.js +1 -0
  201. package/dist/{switch-CViARZCy.js → switch-KkeQIbuH.js} +1 -1
  202. package/dist/{tasks-card-MjCcOhR_.js → tasks-card-BrN4bggJ.js} +1 -1
  203. package/dist/{text-shimmer-DKlwRF2G.js → text-shimmer-Dcj1MHuq.js} +1 -1
  204. package/dist/{textarea-3ay2Me2-.js → textarea-Dpvbngbg.js} +1 -1
  205. package/dist/theme.tokens.css +28 -0
  206. package/dist/{thumbs-up-DQcu2HMO.js → thumbs-up-CsT9Wzb9.js} +1 -1
  207. package/dist/{toast-store-C6yKOhbk.js → toast-store-tgK6MuMv.js} +1 -1
  208. package/dist/{tool-BCYNlfKy.js → tool-DzUjIBT8.js} +1 -1
  209. package/dist/{tooltip-05zI4hjs.js → tooltip-Bkkg_4t0.js} +1 -1
  210. package/dist/{trash-2-BR1RxGky.js → trash-2-jBKxjGGQ.js} +1 -1
  211. package/dist/{triangle-alert-DHohDOCy.js → triangle-alert-DlQ68ppf.js} +1 -1
  212. package/dist/types.d.ts +48 -3
  213. package/dist/ui/dock.d.ts +29 -0
  214. package/dist/{upload-BbGW6A_u.js → upload-TcAHXv9W.js} +1 -1
  215. package/dist/{url-scheme-policy-DHpoTJwB.js → url-scheme-policy-DR5DgvkM.js} +1 -1
  216. package/dist/{use-card-resolution-CJW4grFa.js → use-card-resolution-DaZqAdWf.js} +1 -1
  217. package/dist/{variant-aurora-xiMPty8f.js → variant-aurora-BhLuYxJR.js} +1 -1
  218. package/dist/{variant-aurora-BUOVgPOB.js → variant-aurora-CNmfHhcx.js} +2 -2
  219. package/dist/{variant-aurora-CUsUJvFI.js → variant-aurora-D6GsdTPA.js} +2 -2
  220. package/dist/{variant-aurora-CW2i4bfr.js → variant-aurora-DbW_OWL2.js} +1 -1
  221. package/dist/{variant-custom-D91HjAKz.js → variant-custom-BRvaNHSi.js} +1 -1
  222. package/dist/{variant-custom-BQtOnmeO.js → variant-custom-BvYHR62b.js} +1 -1
  223. package/dist/{variant-custom-CAnzzppW.js → variant-custom-DMTrEO5w.js} +2 -2
  224. package/dist/{variant-custom-CAm9L-E5.js → variant-custom-DV2x254s.js} +2 -2
  225. package/dist/{variant-wave-Ca1Ls4_y.js → variant-wave-BNMGrDfj.js} +2 -2
  226. package/dist/{variant-wave-uY5crU_K.js → variant-wave-BpDd8t3Z.js} +1 -1
  227. package/dist/{variant-wave-CxX39DKd.js → variant-wave-CyBueXj9.js} +2 -2
  228. package/dist/{variant-wave-DYyzIIZv.js → variant-wave-sp-qwsdI.js} +1 -1
  229. package/dist/x-Z5UntkIJ.js +1 -0
  230. package/frameworks/react/index.tsx +14 -4
  231. package/llms-full.txt +7 -2
  232. package/package.json +16 -16
  233. package/src/elements/element-meta.json +49 -6
  234. package/theme.css +28 -0
  235. package/bin/route.test.js +0 -58
  236. package/dist/arrow-down-Br0qtpsz.js +0 -1
  237. package/dist/arrow-left-Dj7xgE12.js +0 -1
  238. package/dist/check-DPeeMUYx.js +0 -1
  239. package/dist/chevron-down-CHSWk7ZT.js +0 -1
  240. package/dist/chevron-right-B7l_fMgx.js +0 -1
  241. package/dist/circle-Bb0yOpqM.js +0 -1
  242. package/dist/circle-check-BGZpCiz7.js +0 -1
  243. package/dist/code-block-CUQ5mtv0.js +0 -1
  244. package/dist/controllable-D43BKmtX.js +0 -1
  245. package/dist/conversation-list-D4lLU_yS.js +0 -1
  246. package/dist/define-CGGX-7Vg.js +0 -1
  247. package/dist/message-circle-Xf8Q-vZp.js +0 -1
  248. package/dist/message-square-Cxnwgkns.js +0 -1
  249. package/dist/play-OFIvYXUQ.js +0 -1
  250. package/dist/register-impl-C7rENvPK.js +0 -424
  251. package/dist/store-7eoadydQ.js +0 -1
  252. package/dist/x-C5m1JFgi.js +0 -1
  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 -131
  263. package/src/agent-tooling/construct/codegen.ts +0 -1353
  264. package/src/agent-tooling/construct/construct.v1.schema.json +0 -250
  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 -23
  269. package/src/agent-tooling/construct/schema.ts +0 -371
  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 -518
  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 -218
  336. package/src/components/conversation-list.tsx +0 -429
  337. package/src/components/dismissed-stub.tsx +0 -80
  338. package/src/components/embed.tsx +0 -200
  339. package/src/components/empty.tsx +0 -177
  340. package/src/components/feedback-bar.tsx +0 -166
  341. package/src/components/file-tree.tsx +0 -530
  342. package/src/components/file-upload.tsx +0 -167
  343. package/src/components/form-widgets.tsx +0 -525
  344. package/src/components/form.tsx +0 -1296
  345. package/src/components/image.tsx +0 -65
  346. package/src/components/link-preview.tsx +0 -195
  347. package/src/components/loader.tsx +0 -367
  348. package/src/components/markdown.tsx +0 -162
  349. package/src/components/message-skills.tsx +0 -40
  350. package/src/components/message.tsx +0 -765
  351. package/src/components/model-switcher.tsx +0 -132
  352. package/src/components/prompt-input.tsx +0 -188
  353. package/src/components/prompt-suggestion.tsx +0 -150
  354. package/src/components/reasoning.tsx +0 -293
  355. package/src/components/response-compare-types.ts +0 -152
  356. package/src/components/response-compare.tsx +0 -455
  357. package/src/components/response-stream.tsx +0 -109
  358. package/src/components/screen.tsx +0 -181
  359. package/src/components/scroll-button.tsx +0 -93
  360. package/src/components/source.tsx +0 -192
  361. package/src/components/tasks-card.tsx +0 -801
  362. package/src/components/text-shimmer.tsx +0 -37
  363. package/src/components/thinking-bar.tsx +0 -50
  364. package/src/components/thread.tsx +0 -228
  365. package/src/components/toast.tsx +0 -503
  366. package/src/components/tool-classify.ts +0 -26
  367. package/src/components/tool-types.ts +0 -49
  368. package/src/components/tool.tsx +0 -190
  369. package/src/components/use-card-resolution.ts +0 -44
  370. package/src/components/voice-input.tsx +0 -222
  371. package/src/components/voice-output.tsx +0 -242
  372. package/src/components/workspace-shell.tsx +0 -285
  373. package/src/diagnostics/hook.ts +0 -352
  374. package/src/diagnostics/index.ts +0 -82
  375. package/src/diagnostics/report-request.ts +0 -296
  376. package/src/elements/agent-card.tsx +0 -67
  377. package/src/elements/artifact.tsx +0 -194
  378. package/src/elements/attachments.tsx +0 -140
  379. package/src/elements/audio-visualizer.tsx +0 -227
  380. package/src/elements/autoloader.ts +0 -89
  381. package/src/elements/avatar.tsx +0 -33
  382. package/src/elements/badge.tsx +0 -32
  383. package/src/elements/button.tsx +0 -149
  384. package/src/elements/card.tsx +0 -133
  385. package/src/elements/cards.tsx +0 -266
  386. package/src/elements/chain-of-thought.tsx +0 -141
  387. package/src/elements/chat-scope-picker.tsx +0 -65
  388. package/src/elements/chat-types.ts +0 -102
  389. package/src/elements/chat-workspace.tsx +0 -188
  390. package/src/elements/chat.tsx +0 -212
  391. package/src/elements/checkbox-group.tsx +0 -164
  392. package/src/elements/checkbox.tsx +0 -134
  393. package/src/elements/checkpoint.tsx +0 -47
  394. package/src/elements/choice.tsx +0 -100
  395. package/src/elements/coachmark.tsx +0 -90
  396. package/src/elements/code-block.tsx +0 -60
  397. package/src/elements/command.tsx +0 -197
  398. package/src/elements/compare.tsx +0 -111
  399. package/src/elements/compiled.css +0 -2
  400. package/src/elements/composer.tsx +0 -162
  401. package/src/elements/confirm-card.tsx +0 -76
  402. package/src/elements/context-meter.tsx +0 -107
  403. package/src/elements/conversation-item.tsx +0 -120
  404. package/src/elements/conversation-list.tsx +0 -203
  405. package/src/elements/css.ts +0 -5
  406. package/src/elements/default-input.tsx +0 -392
  407. package/src/elements/define-entry.ts +0 -12
  408. package/src/elements/define.tsx +0 -563
  409. package/src/elements/diagnostic-events.ts +0 -114
  410. package/src/elements/dialog.tsx +0 -145
  411. package/src/elements/disclosure.ts +0 -95
  412. package/src/elements/dock.tsx +0 -215
  413. package/src/elements/dropdown.tsx +0 -123
  414. package/src/elements/editable-label.tsx +0 -140
  415. package/src/elements/element-data-types.ts +0 -152
  416. package/src/elements/element-diagnostics.ts +0 -392
  417. package/src/elements/element-manifest.json +0 -354
  418. package/src/elements/element-nonscalar.json +0 -185
  419. package/src/elements/element-types.d.ts +0 -4337
  420. package/src/elements/embed.tsx +0 -35
  421. package/src/elements/empty.tsx +0 -29
  422. package/src/elements/feedback-bar.tsx +0 -66
  423. package/src/elements/file-tree.tsx +0 -62
  424. package/src/elements/file-upload.tsx +0 -44
  425. package/src/elements/form.tsx +0 -94
  426. package/src/elements/hover-card.tsx +0 -80
  427. package/src/elements/icon.tsx +0 -41
  428. package/src/elements/image.tsx +0 -32
  429. package/src/elements/input.tsx +0 -492
  430. package/src/elements/kbd.tsx +0 -45
  431. package/src/elements/link-preview.tsx +0 -34
  432. package/src/elements/loader.tsx +0 -25
  433. package/src/elements/markdown.tsx +0 -38
  434. package/src/elements/menu.tsx +0 -241
  435. package/src/elements/message-skills.tsx +0 -83
  436. package/src/elements/message.tsx +0 -361
  437. package/src/elements/model-switcher.tsx +0 -121
  438. package/src/elements/nav.tsx +0 -87
  439. package/src/elements/notice.tsx +0 -53
  440. package/src/elements/pane-grid.tsx +0 -111
  441. package/src/elements/pane-group.tsx +0 -119
  442. package/src/elements/pane.tsx +0 -129
  443. package/src/elements/popover.tsx +0 -81
  444. package/src/elements/progress-bar.tsx +0 -39
  445. package/src/elements/prompt-dock.tsx +0 -82
  446. package/src/elements/prompt-input.tsx +0 -240
  447. package/src/elements/prompt-suggestions.tsx +0 -113
  448. package/src/elements/radio-group.tsx +0 -129
  449. package/src/elements/reasoning.tsx +0 -71
  450. package/src/elements/register-impl.ts +0 -148
  451. package/src/elements/register.ts +0 -76
  452. package/src/elements/remote.tsx +0 -225
  453. package/src/elements/resizable.globals.d.ts +0 -36
  454. package/src/elements/resizable.tsx +0 -704
  455. package/src/elements/response-stream.tsx +0 -40
  456. package/src/elements/screen.tsx +0 -90
  457. package/src/elements/scroll-area.tsx +0 -33
  458. package/src/elements/scroll-button.tsx +0 -179
  459. package/src/elements/search.tsx +0 -185
  460. package/src/elements/segmented.tsx +0 -129
  461. package/src/elements/select.tsx +0 -165
  462. package/src/elements/separator.tsx +0 -36
  463. package/src/elements/setting-item.tsx +0 -50
  464. package/src/elements/settings-group.tsx +0 -37
  465. package/src/elements/skeleton.tsx +0 -45
  466. package/src/elements/slider.tsx +0 -171
  467. package/src/elements/slot-text.ts +0 -73
  468. package/src/elements/slots.ts +0 -787
  469. package/src/elements/source.tsx +0 -126
  470. package/src/elements/status.tsx +0 -42
  471. package/src/elements/styles.css +0 -328
  472. package/src/elements/switch.tsx +0 -118
  473. package/src/elements/tabs.tsx +0 -95
  474. package/src/elements/tasks.tsx +0 -103
  475. package/src/elements/text-shimmer.tsx +0 -28
  476. package/src/elements/thinking-bar.tsx +0 -43
  477. package/src/elements/thread.tsx +0 -139
  478. package/src/elements/toast.tsx +0 -106
  479. package/src/elements/tool.tsx +0 -78
  480. package/src/elements/tooltip.tsx +0 -85
  481. package/src/elements/validate-messages.ts +0 -76
  482. package/src/elements/voice-input.tsx +0 -100
  483. package/src/elements/voice-output.tsx +0 -82
  484. package/src/index.ts +0 -428
  485. package/src/primitives/audio-bands.ts +0 -174
  486. package/src/primitives/card-component-types.ts +0 -63
  487. package/src/primitives/card-contract.ts +0 -80
  488. package/src/primitives/card-data-types.ts +0 -361
  489. package/src/primitives/card-host.tsx +0 -37
  490. package/src/primitives/card-recovery.ts +0 -160
  491. package/src/primitives/card-registry.tsx +0 -78
  492. package/src/primitives/card-resolution.ts +0 -36
  493. package/src/primitives/card-routing.ts +0 -85
  494. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  495. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  496. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  497. package/src/primitives/card-schemas/choice.schema.json +0 -75
  498. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  499. package/src/primitives/card-schemas/embed.schema.json +0 -63
  500. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  501. package/src/primitives/card-schemas/form.schema.json +0 -53
  502. package/src/primitives/card-schemas/link.schema.json +0 -54
  503. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  504. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  505. package/src/primitives/card-tags.ts +0 -61
  506. package/src/primitives/card-validate-cards.ts +0 -255
  507. package/src/primitives/card-validate-schemas.ts +0 -58
  508. package/src/primitives/card-validate.ts +0 -131
  509. package/src/primitives/chat-config.tsx +0 -103
  510. package/src/primitives/composer-model.ts +0 -49
  511. package/src/primitives/composer-triggers.ts +0 -35
  512. package/src/primitives/controllable.ts +0 -21
  513. package/src/primitives/create-kai-chat.ts +0 -66
  514. package/src/primitives/create-tween.ts +0 -266
  515. package/src/primitives/embed-providers.ts +0 -254
  516. package/src/primitives/field-mask.ts +0 -256
  517. package/src/primitives/field-semantics.ts +0 -115
  518. package/src/primitives/highlighter.ts +0 -157
  519. package/src/primitives/input-mask.ts +0 -853
  520. package/src/primitives/link-preview.ts +0 -87
  521. package/src/primitives/message-feedback.ts +0 -124
  522. package/src/primitives/pdf-preview.ts +0 -121
  523. package/src/primitives/toast-store.ts +0 -338
  524. package/src/primitives/url-scheme-policy.ts +0 -70
  525. package/src/primitives/use-audio-analysis.ts +0 -340
  526. package/src/primitives/use-auto-resize.ts +0 -31
  527. package/src/primitives/use-resize-observer.ts +0 -45
  528. package/src/primitives/use-sequencer.ts +0 -72
  529. package/src/primitives/use-speech-recognition.ts +0 -146
  530. package/src/primitives/use-stick-to-bottom.ts +0 -75
  531. package/src/primitives/use-text-stream.ts +0 -143
  532. package/src/primitives/use-voice-recorder.ts +0 -62
  533. package/src/primitives/visualizer-sequences.ts +0 -350
  534. package/src/remote/host-embed.ts +0 -345
  535. package/src/remote/index.ts +0 -2
  536. package/src/remote/origin.ts +0 -30
  537. package/src/remote/provider-runtime.ts +0 -262
  538. package/src/remote/provider.ts +0 -2
  539. package/src/remote/validate.ts +0 -22
  540. package/src/remote/version.ts +0 -12
  541. package/src/remote/wire.ts +0 -48
  542. package/src/schemas/from-tool-call.ts +0 -151
  543. package/src/schemas/index.ts +0 -341
  544. package/src/schemas/provider-subsets.ts +0 -538
  545. package/src/schemas/registry.ts +0 -355
  546. package/src/schemas/tool-defs.ts +0 -793
  547. package/src/solid.ts +0 -165
  548. package/src/state/index.ts +0 -44
  549. package/src/state/messages.ts +0 -53
  550. package/src/state/mock.ts +0 -297
  551. package/src/state/parts.ts +0 -295
  552. package/src/state/persistence.ts +0 -180
  553. package/src/state/stream.ts +0 -246
  554. package/src/state/suggestions.ts +0 -9
  555. package/src/state/threads.ts +0 -142
  556. package/src/test-utils/fake-clock.ts +0 -88
  557. package/src/types.ts +0 -53
  558. package/src/ui/action-icons.ts +0 -53
  559. package/src/ui/agent-card.tsx +0 -218
  560. package/src/ui/avatar.tsx +0 -23
  561. package/src/ui/badge.tsx +0 -21
  562. package/src/ui/button.tsx +0 -49
  563. package/src/ui/card.tsx +0 -245
  564. package/src/ui/checkbox-group.tsx +0 -153
  565. package/src/ui/checkbox.tsx +0 -63
  566. package/src/ui/collapsible.tsx +0 -163
  567. package/src/ui/command.tsx +0 -103
  568. package/src/ui/dialog.tsx +0 -223
  569. package/src/ui/dock.tsx +0 -584
  570. package/src/ui/dropdown.tsx +0 -636
  571. package/src/ui/editable-label.tsx +0 -112
  572. package/src/ui/hover-card.tsx +0 -345
  573. package/src/ui/icon.tsx +0 -167
  574. package/src/ui/input.tsx +0 -391
  575. package/src/ui/kbd.tsx +0 -118
  576. package/src/ui/nav.tsx +0 -282
  577. package/src/ui/notice.tsx +0 -84
  578. package/src/ui/overlay.tsx +0 -277
  579. package/src/ui/pane-grid.tsx +0 -117
  580. package/src/ui/pane-group.tsx +0 -291
  581. package/src/ui/pane.tsx +0 -193
  582. package/src/ui/popover.tsx +0 -106
  583. package/src/ui/progress-bar.tsx +0 -83
  584. package/src/ui/prompt-dock.tsx +0 -145
  585. package/src/ui/radio.tsx +0 -150
  586. package/src/ui/resizable.tsx +0 -693
  587. package/src/ui/scroll-area.tsx +0 -26
  588. package/src/ui/segmented.tsx +0 -109
  589. package/src/ui/select.tsx +0 -168
  590. package/src/ui/separator.tsx +0 -10
  591. package/src/ui/settings-group.tsx +0 -67
  592. package/src/ui/skeleton.tsx +0 -73
  593. package/src/ui/slider.tsx +0 -178
  594. package/src/ui/status.tsx +0 -48
  595. package/src/ui/switch.tsx +0 -119
  596. package/src/ui/tabs.tsx +0 -168
  597. package/src/ui/textarea.tsx +0 -21
  598. package/src/ui/tooltip.tsx +0 -118
  599. package/src/utils/cn.ts +0 -30
  600. package/src/wire/chunk.ts +0 -248
  601. package/src/wire/consume.ts +0 -599
  602. package/src/wire/diagnostics.ts +0 -727
  603. package/src/wire/encode-probe.ts +0 -214
  604. package/src/wire/encode.ts +0 -947
  605. package/src/wire/files.ts +0 -342
  606. package/src/wire/formats/anthropic.ts +0 -274
  607. package/src/wire/formats/openai.ts +0 -228
  608. package/src/wire/index.ts +0 -95
  609. package/src/wire/media-types.ts +0 -344
  610. package/src/wire/read.ts +0 -396
  611. package/src/wire/sink-helpers.ts +0 -50
  612. package/src/wire/sse.ts +0 -153
@@ -1,422 +0,0 @@
1
- /**
2
- * manifest.ts — reads dist/custom-elements.json (a Custom Elements Manifest)
3
- * and exposes helpers for the component_reference tool.
4
- *
5
- * Resolution strategy (dual-context) — each context is an EXACT location, never a
6
- * search. See `resolveManifestPath` for why that distinction is the whole point:
7
- * 1. Bundled bin: dist/mcp.es.js lives in dist/, so custom-elements.json is
8
- * a sibling → ./custom-elements.json relative to import.meta.url.
9
- * 2. Vitest (source): manifest.ts lives at <package>/src/agent-tooling/mcp/, so
10
- * the manifest is <package>/dist/custom-elements.json and nowhere else.
11
- *
12
- * It also answers "which of these 80 elements has anything to do with cards", for
13
- * the card contract component_reference serves. That question lives HERE rather than
14
- * in reference.ts because half of it is a question about the element manifest — the
15
- * kit's own `type -> tag` map, crossed against the tag list this module already owns
16
- * — and because both halves of the answer must come off one place. See
17
- * `cardTagForType` for the rule and for what happens when an eighth card type lands.
18
- */
19
-
20
- import { readFileSync, readdirSync, existsSync } from 'node:fs';
21
- import { fileURLToPath } from 'node:url';
22
- import { join, dirname, resolve } from 'node:path';
23
- // The package's own public entry, by the same specifier the scaffolder tells a
24
- // consumer's route to use. That is now a CHOICE, and this comment used to say the
25
- // opposite: the barrel re-exports src/schemas/registry.ts, which type-IMPORTED
26
- // `CardComponentMap` from src/primitives/card-registry.TSX, and pulling a .tsx into
27
- // this pass would mean giving tsconfig.mcp.json `jsx` + `jsxImportSource` + the DOM
28
- // lib, dragging the whole Solid component tree into a Node-only project — measured
29
- // as 0 errors -> 1364. Those two types moved to the DOM-free
30
- // src/primitives/card-component-types.ts, so a relative import of the barrel would
31
- // typecheck here today. It stays on the public specifier anyway, because emitting
32
- // and consuming the same string is the point of this module. The built entry
33
- // resolves to dist/schemas/index.d.ts, whose own reference to card-registry is a
34
- // .d.ts that skipLibCheck skips, so the Node/no-DOM guarantee survives intact.
35
- //
36
- // `BUILTIN_CARD_TAGS` is the authoritative `CardEnvelope.type -> kai-* tag` map and
37
- // arrives here as DATA, not a type. It is authored in src/primitives/card-tags.ts,
38
- // which holds that map ALONE — no Solid below it — so it is readable from source by a
39
- // Node/no-DOM project rather than only through this built entry. Before that split it
40
- // shared a module with `BUILTIN_CARD_COMPONENTS` and this module re-derived it by
41
- // convention instead; see `cardTagForType`.
42
- //
43
- // This costs a build before typecheck and before the unit suite. That is not a new
44
- // dependency: resolveManifestPath() below already requires dist/custom-elements.json,
45
- // and CI already runs `nx build ui` ahead of both.
46
- import { BUILTIN_CARD_TAGS, cardSchemaNames } from '@kitn.ai/ui/schemas';
47
-
48
- // ── CEM types ────────────────────────────────────────────────────────────────
49
-
50
- export interface CemType {
51
- text: string;
52
- }
53
-
54
- export interface CemMember {
55
- kind: 'field' | 'method';
56
- privacy?: 'public' | 'private' | 'protected';
57
- name: string;
58
- type?: CemType;
59
- description?: string;
60
- }
61
-
62
- export interface CemAttribute {
63
- name: string;
64
- fieldName?: string;
65
- type?: CemType;
66
- description?: string;
67
- }
68
-
69
- export interface CemEvent {
70
- name: string;
71
- type?: CemType;
72
- description?: string;
73
- }
74
-
75
- export interface CemCssProperty {
76
- name: string;
77
- description?: string;
78
- default?: string;
79
- }
80
-
81
- export interface CemSlot {
82
- name: string;
83
- description?: string;
84
- }
85
-
86
- export interface CemCssPart {
87
- name: string;
88
- description?: string;
89
- /** Our extension: a copy-paste styling example. */
90
- recipe?: string;
91
- }
92
-
93
- export interface Declaration {
94
- tagName?: string;
95
- name: string;
96
- kind: string;
97
- description?: string;
98
- members?: CemMember[];
99
- attributes?: CemAttribute[];
100
- events?: CemEvent[];
101
- cssProperties?: CemCssProperty[];
102
- slots?: CemSlot[];
103
- cssParts?: CemCssPart[];
104
- }
105
-
106
- interface CemModule {
107
- path?: string;
108
- declarations?: Declaration[];
109
- }
110
-
111
- interface CustomElementsManifest {
112
- modules: CemModule[];
113
- }
114
-
115
- // ── Manifest resolution ───────────────────────────────────────────────────────
116
- //
117
- // THE MANIFEST IS THIS PACKAGE'S OWN BUILD ARTIFACT, SO IT IS ADDRESSED, NOT SEARCHED
118
- // FOR. This used to walk up ten parent directories taking the first
119
- // `<dir>/dist/custom-elements.json` it found, and that is a categorically weaker
120
- // thing than it looks: "a custom-elements.json exists somewhere above me" and "THIS
121
- // package's custom-elements.json exists" are different facts, and a walk-up cannot
122
- // tell them apart. It reports success for both.
123
- //
124
- // It was not hypothetical. Measured from an agent git worktree at
125
- // `<repo>/.claude/worktrees/<agent>/packages/ui/src/agent-tooling/mcp`, the loop
126
- // climbed past the worktree's own (unbuilt) `packages/ui/dist`, out of the worktree
127
- // entirely, and bound on iteration 8 to `<repo>/dist/custom-elements.json` — a
128
- // leftover from the pre-monorepo layout, six weeks stale, 78 tags, and zero elements
129
- // declaring `cardSchemas`. The consequence is this repo's dominant failure mode in
130
- // its purest form: on an unbuilt tree the MCP manifest tests did not error, they
131
- // PASSED, 16 of 17, against an artifact from a tree nobody was working in. Two
132
- // checkouts could disagree about what they had tested and nothing said so.
133
- //
134
- // So the rule here is now: a missing manifest is a HARD FAILURE that names the path
135
- // it expected. Never a fallback, never a wider search. If this throws, the answer is
136
- // to build — not to let it find someone else's build.
137
-
138
- const PACKAGE_NAME = '@kitn.ai/ui';
139
- const MANIFEST_FILE = 'custom-elements.json';
140
-
141
- /**
142
- * `<package>/src/agent-tooling/mcp` -> `<package>`. A fixed, exact hop, and it is
143
- * CHECKED below rather than trusted: if this module is ever moved to a different
144
- * depth the derived root stops being this package and resolution throws, instead of
145
- * silently addressing whatever directory happens to sit three levels up.
146
- */
147
- const SOURCE_TO_PACKAGE_ROOT = ['..', '..', '..'] as const;
148
-
149
- /** Is `root` the root of THIS package — not merely *a* directory holding a dist/? */
150
- function isThisPackage(root: string): boolean {
151
- const manifest = join(root, 'package.json');
152
- if (!existsSync(manifest)) return false;
153
- try {
154
- return (JSON.parse(readFileSync(manifest, 'utf-8')) as { name?: string }).name === PACKAGE_NAME;
155
- } catch {
156
- return false;
157
- }
158
- }
159
-
160
- /**
161
- * Absolute path to this package's Custom Elements Manifest, or a throw naming what
162
- * it looked for.
163
- *
164
- * `fromDir` exists for the tests and defaults to this module's own directory. It is
165
- * the only way to write the check that matters: the guarantee is not "a manifest was
166
- * found", it is "THIS package's manifest was found", and the two only come apart
167
- * when there is a decoy above the origin. manifest.test.ts builds exactly that tree.
168
- */
169
- export function resolveManifestPath(
170
- fromDir: string = dirname(fileURLToPath(import.meta.url)),
171
- ): string {
172
- // 1. Bundled bin: dist/mcp.es.js and dist/custom-elements.json are siblings.
173
- // Unambiguous by construction — a sibling cannot be another checkout's artifact.
174
- const sibling = join(fromDir, MANIFEST_FILE);
175
- if (existsSync(sibling)) return sibling;
176
-
177
- // 2. Source (vitest, tsx): one exact location, derived and then verified.
178
- const packageRoot = resolve(fromDir, ...SOURCE_TO_PACKAGE_ROOT);
179
- const expected = join(packageRoot, 'dist', MANIFEST_FILE);
180
-
181
- if (!isThisPackage(packageRoot)) {
182
- throw new Error(
183
- `[${PACKAGE_NAME}] Cannot locate the Custom Elements Manifest: ${packageRoot} is not ` +
184
- `the ${PACKAGE_NAME} package root, so ${expected} would not be this package's ` +
185
- `manifest even if it existed.\n` +
186
- `Resolved from: ${fromDir}\n` +
187
- `This module must live at <package>/src/agent-tooling/mcp/ (or be bundled beside ` +
188
- `${MANIFEST_FILE} in dist/). Resolution deliberately does NOT search parent ` +
189
- `directories — finding some other checkout's manifest is worse than failing.`,
190
- );
191
- }
192
-
193
- if (!existsSync(expected)) {
194
- throw new Error(
195
- `[${PACKAGE_NAME}] Missing build artifact: ${expected}\n` +
196
- `Resolved from: ${fromDir}\n` +
197
- `The Custom Elements Manifest is generated by the build. Run \`nx build ui\` ` +
198
- `(or \`npm run build:api\` in packages/ui) and try again.\n` +
199
- `Resolution deliberately does NOT search parent directories: binding to a ` +
200
- `neighbouring checkout's manifest would make this succeed against stale data.`,
201
- );
202
- }
203
-
204
- return expected;
205
- }
206
-
207
- // ── Parsed manifest (module-level cache) ─────────────────────────────────────
208
-
209
- let _manifest: CustomElementsManifest | undefined;
210
-
211
- function getManifest(): CustomElementsManifest {
212
- if (!_manifest) {
213
- const path = resolveManifestPath();
214
- const raw = readFileSync(path, 'utf-8');
215
- _manifest = JSON.parse(raw) as CustomElementsManifest;
216
- }
217
- return _manifest;
218
- }
219
-
220
- function getDeclarations(): Declaration[] {
221
- return getManifest().modules.flatMap((m) => m.declarations ?? []);
222
- }
223
-
224
- // ── Public API ────────────────────────────────────────────────────────────────
225
-
226
- /** Returns the Declaration for a given custom-element tag, or undefined. */
227
- export function getElement(tag: string): Declaration | undefined {
228
- return getDeclarations().find((d) => d.tagName === tag);
229
- }
230
-
231
- /** Returns all custom-element tagNames, sorted alphabetically. */
232
- export function listElements(): string[] {
233
- return getDeclarations()
234
- .filter((d) => d.tagName)
235
- .map((d) => d.tagName!)
236
- .sort();
237
- }
238
-
239
- // ── Per-element entry map ─────────────────────────────────────────────────────
240
- //
241
- // A STATIC import, not an fs read off resolveManifestPath's dual-context pattern:
242
- // element-manifest.json (unlike custom-elements.json) is never copied into dist/,
243
- // so an fs read relative to this module's own URL would resolve in the vitest/source
244
- // context and 404 in the bundled dist/mcp.es.js. A static import sidesteps the gap
245
- // entirely — Rollup inlines the JSON at build time, so the bundled bin carries the
246
- // data with no runtime file dependency. NAMED import (not the whole module), matching
247
- // the same tradeoff element-diagnostics.ts already made for this file: a default
248
- // import would pull `files` in too for 0 benefit here.
249
- import { tags as ELEMENT_ENTRY_TAGS } from '../../elements/element-manifest.json';
250
-
251
- /**
252
- * The per-element entry basename for a tag, e.g. 'kai-chat' -> 'chat'.
253
- *
254
- * Read from element-manifest.json's `tags` map rather than derived by stripping
255
- * the `kai-` prefix: TEN of the eighty elements do not match that derivation
256
- * (`kai-conversations` -> `conversation-list`), so a derived path would emit a
257
- * broken import for them.
258
- */
259
- export function entryForTag(tag: string): string | undefined {
260
- return (ELEMENT_ENTRY_TAGS as Record<string, string>)[tag];
261
- }
262
-
263
- /**
264
- * The per-element entry basename for a tag the register-all bundle does NOT
265
- * carry, e.g. 'kai-remote' -> 'remote'. `undefined` for every tag `entryForTag`
266
- * already answers, and for a tag no built module registers.
267
- *
268
- * WHY THIS EXISTS. `entryForTag` reads element-manifest.json, which is generated
269
- * from the import list in register-impl.ts — so an opt-in element is absent from
270
- * it by construction, and the reference had nothing to name. It said "find the
271
- * entry point in the package's published exports", which is the one place in the
272
- * reference where "how to make this element exist" does not answer itself.
273
- *
274
- * WHY IT IS READ AND NOT DERIVED. Stripping `kai-` is wrong for ten of the eighty
275
- * elements, so guessing here risks exactly the broken import this tool exists to
276
- * catch. The fact is stated in vite.config.elements.ts, which adds an explicit
277
- * entry for each opt-in element precisely "so `@kitn.ai/ui/elements/remote`
278
- * resolves to a real dist file" — but a vite config is not shipped in the
279
- * package, so the runtime reads that intent where it LANDS: dist/elements/. A
280
- * candidate is a built module that element-manifest.json does not already claim
281
- * (plus the two non-element entries the same build emits), and it is matched to a
282
- * tag by the tag literal it registers. So the answer is the built artifact's,
283
- * confirmed against the tag rather than assumed from a filename.
284
- *
285
- * dist/elements/ is a sibling of the manifest in both contexts — the bundled bin
286
- * (dist/mcp.es.js) and vitest-over-source, which resolveManifestPath already
287
- * normalises — so this needs no second resolution strategy. A missing or
288
- * unreadable directory yields `undefined` rather than throwing: the caller's
289
- * fallback is the honest "this is opt-in" paragraph it already prints.
290
- */
291
- export function optInEntryForTag(tag: string): string | undefined {
292
- if (entryForTag(tag)) return undefined;
293
- return optInEntries().get(tag);
294
- }
295
-
296
- /** Not element entries: the register-all barrel and the DOM autoloader, both
297
- * emitted into dist/elements/ by the same per-element build. */
298
- const NON_ELEMENT_ENTRIES = new Set(['index', 'autoloader']);
299
-
300
- let _optInEntries: Map<string, string> | undefined;
301
-
302
- function optInEntries(): Map<string, string> {
303
- if (_optInEntries) return _optInEntries;
304
- _optInEntries = new Map();
305
-
306
- const dir = join(dirname(resolveManifestPath()), 'elements');
307
- let candidates: string[];
308
- try {
309
- const registered = new Set(Object.values(ELEMENT_ENTRY_TAGS as Record<string, string>));
310
- candidates = readdirSync(dir)
311
- .filter((f) => f.endsWith('.js'))
312
- .map((f) => f.slice(0, -'.js'.length))
313
- .filter((base) => !registered.has(base) && !NON_ELEMENT_ENTRIES.has(base));
314
- } catch {
315
- return _optInEntries;
316
- }
317
-
318
- // Only the tags element-manifest.json does not already answer for. Narrow on
319
- // purpose: an element module may mention a tag it merely renders, and matching
320
- // against the whole tag list would let that be read as a registration.
321
- const unclaimed = listElements().filter((t) => !entryForTag(t));
322
-
323
- for (const base of candidates) {
324
- let code: string;
325
- try {
326
- code = readFileSync(join(dir, `${base}.js`), 'utf-8');
327
- } catch {
328
- continue;
329
- }
330
- for (const tag of unclaimed) {
331
- if (!_optInEntries.has(tag) && code.includes(`"${tag}"`)) _optInEntries.set(tag, base);
332
- }
333
- }
334
-
335
- return _optInEntries;
336
- }
337
-
338
- // ── Which elements have anything to do with cards ────────────────────────────
339
- //
340
- // Two different populations, and conflating them would be the "attaches card
341
- // material to everything" failure:
342
- //
343
- // CARD-BACKED kai-confirm, kai-choice, … — one element per CardEnvelope.type.
344
- // These get a schema and a generated tool definition.
345
- // CARD HOST kai-chat, kai-message, … — the elements that RENDER a thread of
346
- // cards and therefore carry the `cardTypes` / `cardSchemas` props.
347
- // These get the wiring note, not a schema.
348
- //
349
- // Neither list is written down here. The host list is derived from the manifest; the
350
- // card-backed one is the kit's own map, read rather than guessed at. Either way an
351
- // eighth card type is covered the day it lands rather than the day someone remembers
352
- // this file.
353
-
354
- /** Cached derivations. Same lifetime as the parsed manifest above. */
355
- let _cardTags: Map<string, string> | undefined;
356
- let _cardHosts: string[] | undefined;
357
-
358
- /**
359
- * `CardEnvelope.type` -> the `kai-*` element that renders it.
360
- *
361
- * THE MAP IS IMPORTED, NOT INFERRED. `BUILTIN_CARD_TAGS` is the same object
362
- * `<kai-cards>` dispatches on in the browser, reached here through
363
- * `@kitn.ai/ui/schemas`. This function used to RE-DERIVE it by convention — the tag
364
- * is `kai-<t>` when that element exists, else the single element whose tag starts
365
- * `kai-<t>-` — which was correct against all 80 tags on this tree, `link` ->
366
- * `kai-link-preview` included, and was still a second copy of a fact the repo already
367
- * held. The eighth card type is the one that would have broken it: any type whose tag
368
- * is neither `kai-<t>` nor the sole `kai-<t>-*` had to be noticed by a human, and a
369
- * future `kai-form-field` would have made `form` ambiguous on its own. A lookup has
370
- * neither failure mode.
371
- *
372
- * WHY IT IS STILL CROSSED AGAINST THE MANIFEST. The map is authoritative for the
373
- * ASSOCIATION; only the manifest knows what actually got registered. A tag in the map
374
- * with no element behind it (a rename that missed this file) would otherwise have
375
- * `component_reference` send a harness to an element that does not exist. Entries with
376
- * no registered element are dropped, so the answer is a real tag or nothing.
377
- *
378
- * WHEN IT BREAKS, IT BREAKS LOUDLY. reference.test.ts asserts every member of
379
- * `cardSchemaNames` resolves AND that what it resolves to is in `listElements()`, so a
380
- * card type missing from the map, or pointed at a tag nobody registered, fails a test
381
- * instead of silently losing its schema in the reference.
382
- */
383
- export function cardTagForType(type: string): string | undefined {
384
- if (!_cardTags) {
385
- const present = new Set(listElements());
386
- _cardTags = new Map(Object.entries(BUILTIN_CARD_TAGS).filter(([, tag]) => present.has(tag)));
387
- }
388
- return _cardTags.get(type);
389
- }
390
-
391
- /** The inverse: which card type does this element render, if any. */
392
- export function cardTypeForTag(tag: string): string | undefined {
393
- for (const name of cardSchemaNames) {
394
- if (cardTagForType(name) === tag) return name;
395
- }
396
- return undefined;
397
- }
398
-
399
- /**
400
- * The elements that host a thread of cards, derived from the manifest: an element is
401
- * a card host exactly when it declares the `cardSchemas` prop.
402
- *
403
- * That prop is the one that carries a developer's own card schemas into the browser
404
- * validator, so "declares it" and "hosts cards" are the same fact rather than two
405
- * facts that can disagree. Today it selects kai-chat / kai-message / kai-thread /
406
- * kai-workspace; an element that grows the prop tomorrow joins without an edit here.
407
- */
408
- export function cardHostTags(): string[] {
409
- if (!_cardHosts) {
410
- _cardHosts = getDeclarations()
411
- .filter(
412
- (d) =>
413
- d.tagName !== undefined &&
414
- (d.members ?? []).some(
415
- (m) => m.kind === 'field' && m.privacy === 'public' && m.name === 'cardSchemas',
416
- ),
417
- )
418
- .map((d) => d.tagName!)
419
- .sort();
420
- }
421
- return _cardHosts;
422
- }
@@ -1,116 +0,0 @@
1
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
- import {
3
- CallToolRequestSchema,
4
- ListToolsRequestSchema,
5
- } from '@modelcontextprotocol/sdk/types.js';
6
- import { createRequire } from 'node:module';
7
- import { z } from 'zod';
8
- import { reference } from './tools/reference';
9
- import { scaffold } from './tools/scaffold';
10
- import { theme } from './tools/theme';
11
- import { debug } from './tools/debug';
12
- import { constructTool } from './tools/construct';
13
- import type { Tool } from './tools/types';
14
- import { validateToolArgs } from './validate-args';
15
-
16
- const tools: Tool[] = [reference, scaffold, theme, debug, constructTool];
17
-
18
- const PACKAGE_NAME = '@kitn.ai/ui';
19
-
20
- /**
21
- * The `serverInfo` every MCP harness reads back on `initialize`. READ, NOT TYPED.
22
- *
23
- * This was a hand-typed `{ name: '@kitn.ai/ui', version: '0.15.0' }` and the kit kept
24
- * releasing past it, so every harness that connected was told a version ten minors
25
- * stale — the same "derive it, don't type it" failure as the CDN pins, minus their
26
- * lint. Nothing here is allowed to restate the version: `server.test.ts` reads
27
- * package.json off disk itself and compares.
28
- *
29
- * RESOLVED BY THE PACKAGE'S OWN NAME, not by path arithmetic. This module runs from
30
- * two places — `<package>/src/agent-tooling/mcp/server.ts` under vitest, and inlined
31
- * into `<package>/dist/mcp.es.js` for the bin — which sit at different depths, so a
32
- * relative hop would need one rule per context (what manifest.ts has to do, because
33
- * `dist/custom-elements.json` is a build artifact with no name to ask for). A
34
- * self-reference has no depth to get wrong: Node resolves `@kitn.ai/ui/package.json`
35
- * against the nearest package.json whose `name` matches, which is this package in
36
- * both contexts and in an install. It also never escapes into a neighbouring
37
- * checkout the way a parent-directory search can.
38
- *
39
- * WHY IT SURVIVES PUBLISHING. npm always ships package.json, `exports` carries
40
- * `"./package.json": "./package.json"` (self-reference is restricted to the exports
41
- * map, so that key is load-bearing — drop it and this throws, and the test goes red
42
- * with it), and `bin/mcp.js` imports `../dist/mcp.es.js` by its own URL, so the
43
- * resolver starts inside the installed package however it was launched (npx, global
44
- * install, symlink). Not a JSON import: that inlines the version at BUILD time, which
45
- * is a second copy that can disagree with the package.json shipped beside it, and it
46
- * would need `resolveJsonModule` on the repo's browser tsc pass as well as this one.
47
- *
48
- * A broken resolve throws instead of falling back to a placeholder — `bin/mcp.js`
49
- * turns that into a named fatal on stderr, which is the loud version. A wrong version
50
- * silently announced to every harness is the quiet one.
51
- */
52
- function packageIdentity(): { name: string; version: string } {
53
- const specifier = `${PACKAGE_NAME}/package.json`;
54
- const require = createRequire(import.meta.url);
55
- const pkg = require(specifier) as { name?: string; version?: string };
56
- if (pkg.name !== PACKAGE_NAME || typeof pkg.version !== 'string') {
57
- throw new Error(
58
- `[${PACKAGE_NAME}] Refusing to report a serverInfo that is not this package's: ` +
59
- `${specifier} resolved to ${require.resolve(specifier)}, whose name is ` +
60
- `${JSON.stringify(pkg.name)} and version ${JSON.stringify(pkg.version)}.`,
61
- );
62
- }
63
- return { name: pkg.name, version: pkg.version };
64
- }
65
-
66
- /**
67
- * The AI/UI MCP server. A stdio server (see ./stdio.ts) exposing the AI/UI tools
68
- * to any MCP harness. Registers four tools; Tasks 2–5 fill in each handler.
69
- *
70
- * The returned `Server` is augmented with `__listToolsForTest()`, a test-only
71
- * helper that returns the registered tool names without touching the transport.
72
- */
73
- export interface AiUiServer extends Server {
74
- __listToolsForTest(): string[];
75
- }
76
-
77
- export function createServer(): AiUiServer {
78
- const server = new Server(packageIdentity(), { capabilities: { tools: {} } }) as AiUiServer;
79
-
80
- const byName = new Map(tools.map((t) => [t.name, t]));
81
-
82
- server.setRequestHandler(ListToolsRequestSchema, async () => ({
83
- tools: tools.map((t) => ({
84
- name: t.name,
85
- description: t.description,
86
- // The protocol requires a JSON Schema. We use zod 4's native converter
87
- // (the repo is on zod 4); the SDK-bundled zod-to-json-schema only
88
- // understands zod 3 and emits an empty schema for our zod 4 objects.
89
- inputSchema: z.toJSONSchema(t.inputSchema) as Record<string, unknown>,
90
- })),
91
- }));
92
-
93
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
94
- const tool = byName.get(request.params.name);
95
- if (!tool) {
96
- return {
97
- isError: true,
98
- content: [{ type: 'text', text: `Unknown tool: ${request.params.name}` }],
99
- };
100
- }
101
- const args = request.params.arguments ?? {};
102
- // Enforce the schema each tool ADVERTISES (additionalProperties: false +
103
- // required) — one path for all four tools. Without this, a wrong key was
104
- // silently ignored and the handler answered a different question (see
105
- // validate-args.ts for the observed failure).
106
- const problem = validateToolArgs(tool.name, tool.inputSchema, args);
107
- if (problem) {
108
- return { isError: true, content: [{ type: 'text', text: problem }] };
109
- }
110
- return tool.handler(args);
111
- });
112
-
113
- server.__listToolsForTest = () => tools.map((t) => t.name);
114
-
115
- return server;
116
- }
@@ -1,18 +0,0 @@
1
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
2
- import { createServer } from './server';
3
-
4
- /**
5
- * Build entry for the AI/UI MCP server. Connects the server (./server.ts) to a
6
- * stdio transport so any MCP harness (Claude Code, Codex, …) can drive it over
7
- * stdin/stdout. Compiled to dist/mcp.es.js by vite.config.mcp.ts and launched by
8
- * bin/mcp.js, which handles fatal errors / exit (this file stays free of Node
9
- * globals so it typechecks under the repo's vite/client-only tsconfig).
10
- */
11
- export async function startStdioServer(): Promise<void> {
12
- const server = createServer();
13
- const transport = new StdioServerTransport();
14
- await server.connect(transport);
15
- }
16
-
17
- // Auto-start when imported as the entry (the only consumer is bin/mcp.js).
18
- startStdioServer();
@@ -1,130 +0,0 @@
1
- import { z } from 'zod';
2
- import type { Tool } from './types';
3
- import { validateConstruct, CONSTRUCT_SCHEMA_URL } from '../../construct/schema';
4
-
5
- /**
6
- * construct — turn-by-turn authoring of a kitn construct (one JSON file → one
7
- * web component). Stateless by design: the HARNESS owns the construct file;
8
- * every call carries the full construct for THIS turn — that is what makes
9
- * turn 40 safe, there is no server-side draft to corrupt.
10
- *
11
- * Two entry shapes: `intent` alone returns a STARTER construct plus the
12
- * real-choice questions the intent leaves open (menu-honesty: never ask a
13
- * question the intent already answers). `construct` (optionally with
14
- * `intent`) validates — rejection is a NORMAL, non-error result, not a thrown
15
- * error, because an invalid turn does not change the file: the previous good
16
- * construct still stands.
17
- *
18
- * NOTE on the advertised schema: `Tool.inputSchema` is a plain `z.ZodObject`,
19
- * and both `server.ts` (`z.toJSONSchema`) and `validate-args.ts`
20
- * (`schema.shape`) need that exact shape — a `.superRefine` wrapper is a
21
- * `ZodEffects`-like type with no `.shape`, so it can't be `tool.inputSchema`.
22
- * The advertised schema therefore stays a plain `.strict()` object; the
23
- * "at least one of intent/construct" rule is enforced here in the handler
24
- * with the same message the skeleton's superRefine would have produced.
25
- */
26
-
27
- const inputSchema = z
28
- .object({
29
- intent: z
30
- .string()
31
- .min(1)
32
- .optional()
33
- .describe('What the author wants, in their words. Alone: returns a starter construct.'),
34
- construct: z
35
- .record(z.string(), z.unknown())
36
- .optional()
37
- .describe('The FULL construct JSON for this turn. The harness owns the file; send all of it every turn.'),
38
- })
39
- .strict();
40
-
41
- function starterFor(intent: string) {
42
- // Derive what the intent already implies; ask only what it leaves open.
43
- const impliesWidget = /widget|embed|bubble|corner|launcher/i.test(intent);
44
- const name = 'my-chat'; // real-choice: always ask for the tag name (it is theirs)
45
- return {
46
- construct: {
47
- $schema: CONSTRUCT_SCHEMA_URL,
48
- name,
49
- layout: 'widget',
50
- provider: { mode: 'mock' },
51
- },
52
- stated: impliesWidget ? ['layout: widget (implied by your request)'] : [],
53
- questions: [
54
- `What should the element tag be? (kebab-case, e.g. "acme-support"; using "${name}" until you say)`,
55
- ...(impliesWidget ? [] : ['Layout: widget, fullscreen, aside, split, or custom?']),
56
- ],
57
- };
58
- }
59
-
60
- export const constructTool: Tool = {
61
- name: 'construct',
62
- description:
63
- 'Author a kitn construct (one JSON file → one web component) turn by turn. ' +
64
- 'Send the full construct each turn; invalid turns come back REJECTED with per-path reasons and the previous good construct stands. ' +
65
- `Schema: ${CONSTRUCT_SCHEMA_URL}. Preview with "kai dev <file>".`,
66
- inputSchema,
67
- handler: async (args) => {
68
- const { intent, construct } = args as { intent?: string; construct?: Record<string, unknown> };
69
-
70
- if (!intent && !construct) {
71
- return {
72
- isError: true,
73
- content: [{ type: 'text', text: 'construct: pass intent, construct, or both' }],
74
- };
75
- }
76
-
77
- if (!construct) {
78
- const s = starterFor(intent ?? '');
79
- return {
80
- content: [
81
- {
82
- type: 'text',
83
- text: [
84
- 'STARTER construct (mock provider — keyless, previews immediately):',
85
- '```json',
86
- JSON.stringify(s.construct, null, 2),
87
- '```',
88
- ...s.stated,
89
- ...s.questions,
90
- ].join('\n'),
91
- },
92
- ],
93
- };
94
- }
95
-
96
- const out = validateConstruct(construct);
97
- if (!out.ok) {
98
- return {
99
- content: [
100
- {
101
- type: 'text',
102
- text: [
103
- 'REJECTED — this turn does not change the file; the previous good construct stands.',
104
- ...out.problems.map((p) => ` ${p.path || '(root)'}: ${p.message}`),
105
- ].join('\n'),
106
- },
107
- ],
108
- };
109
- }
110
-
111
- const c = out.construct;
112
- return {
113
- content: [
114
- {
115
- type: 'text',
116
- text: [
117
- `VALID: <${c.name}> (${c.layout}, ${c.provider.mode}).`,
118
- '```json',
119
- JSON.stringify(c, null, 2),
120
- '```',
121
- `Preview: kai dev <file>. Compile: kai compile <file>.`,
122
- ...(c.provider.mode === 'endpoint'
123
- ? ['Backend route: use the scaffold tool — it emits a compiling route for your framework and wire.']
124
- : []),
125
- ].join('\n'),
126
- },
127
- ],
128
- };
129
- },
130
- };