@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,114 +0,0 @@
1
- import ts from 'typescript';
2
-
3
- /**
4
- * The `Labs/…` title a story file REGISTERS: the `title` property of its
5
- * default-exported meta object, parsed rather than matched.
6
- *
7
- * ★ WHY IT IS SPELLED THAT PRECISELY. Three text-based versions of this question
8
- * shipped and each was defeated, and the fourth — a parse that was still too
9
- * broad — was defeated too:
10
- *
11
- * 1. A raw regex over file text counted PROSE as a registration. Renaming every
12
- * real `Labs/Proofs` meta title across all six proof-*.stories.tsx left the
13
- * `Proofs` inventory row resolving, kept alive by one comment.
14
- * 2. A hand-rolled comment stripper fixed that and introduced a worse bug. JSX
15
- * text like `Don't have an account?` put the scanner into single-quote state,
16
- * which it never left, so every `//` after it survived stripping. Live in
17
- * three story files; appending ONE comment line to one of them made an
18
- * invented `GHOSTPROBE` row resolve at exit 0.
19
- * 3. The equivalence guard between the two copies of that stripper could not
20
- * see it: both carried the identical bug, so they agreed perfectly.
21
- * 4. Parsing every `title:` in the file — the first version of THIS function —
22
- * was still wrong. A `title` nested in a story's `args` is not a
23
- * registration: `export const S = { args: { title: 'Labs/Apps' } };` in a
24
- * non-app story conjured a phantom app that satisfied this lint and
25
- * surfaces.test.ts together, with no comment involved at all.
26
- *
27
- * So the rule is the meta's own `title`, and nothing else. Comments are TRIVIA
28
- * and never nodes; apostrophes, escapes and template literals are the real
29
- * lexer's problem; and a title that is not the meta's is not a registration.
30
- * Single-quoted, double-quoted and untemplated-backtick spellings are all read.
31
- *
32
- * REGISTERED COPY: `scripts/lint-catalog-drift.mjs` carries an equivalent
33
- * `readLabsTitles`, because a Node `.mjs` cannot import a `.ts` at runtime.
34
- * `tests/scripts/catalog-drift-guard-wiring.test.ts` imports both and asserts
35
- * they agree over every story file in the tree plus adversarial inputs. Note
36
- * what that guard is worth: it catches DIVERGENCE, and it is blind by
37
- * construction to a bug both copies share — it stayed green through defects 2
38
- * AND 4 above, both of which were present in both copies at once.
39
- */
40
- export function readLabsTitles(text: string, fileName = 'story.tsx'): string[] {
41
- // ScriptKind BY EXTENSION. Parsing a `.stories.ts` as TSX loses every title
42
- // after a `<number>x` cast or a bare `<T>(x) => x` generic arrow, because
43
- // neither is valid TSX. tsc parses that file as TS, accepts it and stays
44
- // green, so typecheck does NOT contain this one — the lint would silently
45
- // drop the registration on a file CI calls fine. storyExtensions() already
46
- // admits `.ts` because the Storybook glob does.
47
- const kind = fileName.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS;
48
- const source = ts.createSourceFile(fileName, text, ts.ScriptTarget.Latest, false, kind);
49
- const meta = metaObject(source);
50
- if (!meta) return [];
51
- const titles: string[] = [];
52
- for (const prop of meta.properties) {
53
- if (!ts.isPropertyAssignment(prop)) continue;
54
- const key = ts.isIdentifier(prop.name) || ts.isStringLiteral(prop.name) ? prop.name.text : undefined;
55
- if (key !== 'title') continue;
56
- const init = prop.initializer;
57
- if (ts.isStringLiteral(init) || ts.isNoSubstitutionTemplateLiteral(init)) {
58
- if (init.text.startsWith('Labs/')) titles.push(init.text);
59
- }
60
- }
61
- return titles;
62
- }
63
-
64
- /**
65
- * The story file's DEFAULT-EXPORTED meta object, or null.
66
- *
67
- * Walking every `title:` in the file was the narrower defect: a `title` nested
68
- * in a story's `args` is not a registration, and Storybook never reads it as
69
- * one. Measured before this existed, both exit 0:
70
- * `export const GhostProbeStory = { args: { title: 'Labs/GHOSTPROBE' } };`
71
- * made an invented inventory row resolve, and the `Labs/Apps` spelling of the
72
- * same shape produced a PHANTOM app that satisfied the lint and
73
- * surfaces.test.ts together — the exact both-sides-green shape this guard
74
- * exists to prevent, reached without a single comment.
75
- *
76
- * Restricting to the meta is a measured NO-OP on the clean tree: the title set
77
- * and the nine `Labs/Apps` files are identical by set difference in both
78
- * directions.
79
- *
80
- * Handles the two shapes in the tree and their wrappers:
81
- * `const meta = {…} satisfies Meta; export default meta;` and
82
- * `export default {…} as Meta;`
83
- * `satisfies`, `as` and parentheses are unwrapped. An angle-bracket assertion
84
- * (`export default <Meta>{…}`) deliberately is NOT: every story file is parsed
85
- * as TSX, where `<Meta>{…}` is JSX and never a type assertion, so a branch for
86
- * it would be dead code. Measured: that spelling returns []. It is also not a
87
- * spelling any story in the tree uses.
88
- */
89
- function metaObject(source: ts.SourceFile): ts.ObjectLiteralExpression | null {
90
- const unwrap = (expr: ts.Expression | undefined): ts.Expression | undefined => {
91
- let cur = expr;
92
- while (
93
- cur &&
94
- (ts.isAsExpression(cur) || ts.isSatisfiesExpression(cur) || ts.isParenthesizedExpression(cur))
95
- ) {
96
- cur = cur.expression;
97
- }
98
- return cur;
99
- };
100
- const topLevel = new Map<string, ts.Expression>();
101
- let defaultExport: ts.Expression | undefined;
102
- for (const stmt of source.statements) {
103
- if (ts.isVariableStatement(stmt)) {
104
- for (const d of stmt.declarationList.declarations) {
105
- if (ts.isIdentifier(d.name) && d.initializer) topLevel.set(d.name.text, d.initializer);
106
- }
107
- } else if (ts.isExportAssignment(stmt) && !stmt.isExportEquals) {
108
- defaultExport = stmt.expression;
109
- }
110
- }
111
- let expr = unwrap(defaultExport);
112
- if (expr && ts.isIdentifier(expr)) expr = unwrap(topLevel.get(expr.text));
113
- return expr && ts.isObjectLiteralExpression(expr) ? expr : null;
114
- }
@@ -1,87 +0,0 @@
1
- import { z } from 'zod';
2
- import { Scenario, type TScenario } from './catalog-types';
3
-
4
- /**
5
- * The acceptance deck, spec §6. Normative: written BEFORE the catalog so the
6
- * catalog is built toward a measurement. The harness gives an agent the catalog
7
- * and NO kit source; whatever it cannot build names what the catalog is missing.
8
- */
9
- export const scenarios: TScenario[] = [
10
- {
11
- id: 'S1',
12
- prompt:
13
- 'I already have <kai-chat> in my React app. Add a conversations sidebar and let assistant replies open artifacts in a side panel.',
14
- needs: ['composition validity', 'wiring topology', 'invariant:reactivity-two-halves'],
15
- depth: 'surface recipe applied to an existing tree',
16
- scoring: [
17
- 'emitted code compiles under the react consumer tsc project',
18
- 'kai-conversations and kai-artifact register and render',
19
- 'kai-conversation-select wiring updates kai-chat.messages with a new array AND new changed-item objects',
20
- ],
21
- },
22
- {
23
- id: 'S2',
24
- prompt:
25
- 'Add an AI chat to this Vue app. Messages stream from our existing /api/chat endpoint that speaks OpenAI SSE.',
26
- needs: ['ingredient contracts', 'invariant:kit-parses-consumer-fetches', 'backend: consumer-owned endpoint'],
27
- depth: 'greenfield, contract',
28
- scoring: [
29
- 'imports readOpenAIStream from @kitn.ai/ui/wire; no hand-rolled SSE reader anywhere in the output',
30
- 'streams correctly against a mock OpenAI-SSE wire fixture',
31
- 'compiles under the vue consumer path',
32
- ],
33
- },
34
- {
35
- id: 'S3',
36
- prompt: 'Give the prompt input slash-commands and voice, like your command palette demo.',
37
- needs: ['ingredient configuration space', 'function-valued property contract (transcribe)'],
38
- depth: 'capability',
39
- scoring: [
40
- 'transcribe is set as a function-valued JS property, not an attribute',
41
- 'the slash-command trigger is wired per the ingredient contract',
42
- ],
43
- },
44
- {
45
- id: 'S4',
46
- prompt: 'Build me a Perplexity-style research UI: sources, reasoning panel, follow-up suggestions.',
47
- needs: ['surface recipes'],
48
- depth: 'whole surface; expected to fail hardest first',
49
- scoring: ['human eyeball against the perplexity Labs/App story', 'compiles and registers'],
50
- },
51
- {
52
- id: 'S5',
53
- prompt:
54
- "I'm on WordPress. No build step. Give me a script tag for a support chat widget that talks to my service at https://example.com/chat.",
55
- needs: ['delivery target: script-tag', 'invariant:upgrade-race', 'widget recipe', 'backend: consumer-owned endpoint'],
56
- depth: 'platform embed',
57
- scoring: [
58
- 'script-tag only, no bundler assumed',
59
- 'the output acknowledges the upgrade race per the open invariant (props set after registration, or the documented gate)',
60
- 'human eyeball in a plain HTML page',
61
- ],
62
- },
63
- {
64
- id: 'S6',
65
- prompt: 'Add a spreadsheet-grid message type showing live cell edits.',
66
- needs: ['the honesty bound: refuse what is not composable from these parts'],
67
- depth: 'refusal',
68
- scoring: [
69
- 'the agent refuses loudly, naming that no such element exists, instead of inventing <kai-datagrid>',
70
- 'no fabricated tag appears in the output',
71
- ],
72
- },
73
- {
74
- id: 'S7',
75
- prompt: 'My messages render but nothing updates while streaming.',
76
- needs: ['invariant diagnosis fields'],
77
- depth: 'debugging',
78
- scoring: [
79
- 'the answer identifies the reactivity-two-halves cause: same array reference, or same item object identity',
80
- 'the fix it proposes matches the invariant statement',
81
- ],
82
- },
83
- ];
84
-
85
- export function listScenarios(): TScenario[] {
86
- return z.array(Scenario).parse(scenarios);
87
- }
@@ -1,347 +0,0 @@
1
- import { z } from 'zod';
2
- import {
3
- InventoryEntry,
4
- PartConsumption,
5
- SurfaceRecipe,
6
- type TInventoryEntry,
7
- type TPartConsumption,
8
- type TSurfaceRecipe,
9
- } from './catalog-types';
10
-
11
- /**
12
- * Spec §4's sort, as records. Criterion: a surface is product-shaped, something
13
- * a user could be handed, proven end-to-end by a Labs/App or deployable alone;
14
- * an ingredient exists only inside something else; fixtures and proofs are
15
- * corpus (tests), not catalog entries.
16
- *
17
- * TWO SENSES OF "CORPUS", and they are not the same thing. Here it is a `sort`:
18
- * this entry is a fixture or a proof, so it is test material rather than a
19
- * catalog entry. On a SurfaceRecipe, `corpus:` is a list of repo PATHS that
20
- * demonstrate the recipe. A story can be both — `split-workspace` is sorted
21
- * `surface` in this inventory and also appears in a recipe's `corpus:` array,
22
- * which is coherent (a product-shaped surface is exactly what demonstrates a
23
- * recipe) but reads as a contradiction if you join the two on the word. A
24
- * packer must key on `sort === 'corpus'` and on `recipe.corpus` separately.
25
- *
26
- * Every `title` is a real Storybook title segment under `Labs/` — the app names
27
- * are the `Labs/Apps` story FILENAMES, the rest are `title: 'Labs/<x>'` values
28
- * under src/ (note: NOT all under src/elements/ — Settings lives in src/ui/ and
29
- * Audio Visualizers under src/components/, so a check scoped to src/elements/
30
- * alone would wrongly flag them).
31
- *
32
- * WHAT IS ENFORCED TODAY, in the present tense. Every claim below was measured
33
- * by mutation in both directions, not reasoned from reading the guards.
34
- *
35
- * EVERY ROW IS RESOLVED AGAINST THE TREE. `lint:catalog-drift` (required CI,
36
- * needs no build) requires each title to match a Labs story title or a
37
- * `Labs/Apps` story filename on disk. Misspell ANY row -- tier is irrelevant --
38
- * and CI fails by name: `Settings` -> `Settingss` gives
39
- * `inventory: "Settingss" matches no Labs story title or Labs/Apps story file in
40
- * the tree.` That closes what an earlier version of this comment called
41
- * "GENUINELY UNCHECKED", and the earlier text is worth remembering as a defect
42
- * in its own right: it survived the guard landing and went on telling every
43
- * maintainer that the coverage did not exist, which is how someone ends up
44
- * rebuilding it.
45
- *
46
- * WHAT RESOLUTION DOES NOT COVER IS DELETION, because the check runs row -> tree
47
- * and a deleted row asks nothing of the tree. The other direction is covered
48
- * unevenly, and this is the part to read before deleting anything:
49
- *
50
- * 1. `surface` rows naming a `Labs/Apps` story FILE -- deletion FAILS
51
- * surfaces.test.ts, which reads those filenames off disk and requires each
52
- * to have a row sorted `surface`. Covered in both directions.
53
- * 2. `Proofs`, `Chat Slots`, `Prompt Input Slots`, `Workspace Slots` --
54
- * deletion FAILS surfaces.test.ts, which asserts those four exact titles are
55
- * present and sorted `corpus`. That list is a literal copy of these four
56
- * titles living inside the test; changing one means changing both.
57
- * 3. Every remaining row -- deletion PASSES everything. Measured: removing the
58
- * `Settings` row leaves both surfaces.test.ts and lint:catalog-drift green.
59
- * This is the one real gap, and the lint's own honesty item 8 states it.
60
- *
61
- * Each row's tier is decided by which test in surfaces.test.ts covers it, so
62
- * read that file, not this list, if they drift.
63
- */
64
- export const inventory: TInventoryEntry[] = [
65
- { title: 'claude-code', sort: 'surface', note: 'Labs/App, end-to-end composition' },
66
- { title: 'chatgpt', sort: 'surface', note: 'Labs/App, end-to-end composition' },
67
- { title: 'codex', sort: 'surface', note: 'Labs/App, end-to-end composition' },
68
- { title: 't3code', sort: 'surface', note: 'Labs/App, end-to-end composition' },
69
- { title: 'perplexity', sort: 'surface', note: 'Labs/App, end-to-end composition' },
70
- { title: 'perplexity-pro', sort: 'surface', note: 'Labs/App, end-to-end composition' },
71
- { title: 'v0', sort: 'surface', note: 'Labs/App, end-to-end composition' },
72
- { title: 'wisp', sort: 'surface', note: 'Labs/App, end-to-end composition' },
73
- { title: 'lovable', sort: 'surface', note: 'Labs/App, end-to-end composition' },
74
- { title: 'split-workspace', sort: 'surface', note: 'Labs/App, end-to-end composition' },
75
- { title: 'Workspace Home', sort: 'surface', note: 'the workspace preset' },
76
- { title: 'Message Thread', sort: 'ingredient', note: 'the keystone of the composition-first direction (kai-thread)' },
77
- { title: 'Composer', sort: 'ingredient', note: 'rich input, lives inside a surface' },
78
- { title: 'Command', sort: 'ingredient', note: 'palette, summoned inside something' },
79
- { title: 'Menu', sort: 'ingredient', note: 'menu primitive' },
80
- { title: 'User Menu', sort: 'ingredient', note: 'account affordance inside a surface' },
81
- { title: 'Settings', sort: 'ingredient', note: 'a panel, not a product' },
82
- { title: 'Onboarding checklist', sort: 'ingredient', note: 'lives inside a surface' },
83
- { title: 'Conversations Collapse', sort: 'ingredient', note: 'behavior of a part' },
84
- { title: 'Resizable Collapsed', sort: 'ingredient', note: 'behavior of a part' },
85
- { title: 'Audio Visualizers', sort: 'ingredient', note: 'voice affordance inside a surface' },
86
- { title: 'Card', sort: 'ingredient', note: 'generative-UI cards arrive as tool calls (settled)' },
87
- {
88
- title: 'Foundations',
89
- sort: 'ingredient',
90
- note: 'atoms: Input, Search, Kbd, Nav, Tabs, Status, Screen, Progress Bar, Coachmark, EditableLabel, Voice output',
91
- },
92
- { title: 'Chat Slots', sort: 'corpus', note: 'fixture proving kai-chat injection seams' },
93
- { title: 'Prompt Input Slots', sort: 'corpus', note: 'fixture proving prompt-input seams' },
94
- { title: 'Workspace Slots', sort: 'corpus', note: 'fixture proving workspace injection seams' },
95
- { title: 'Proofs', sort: 'corpus', note: 'tests by construction' },
96
- ];
97
-
98
- /**
99
- * Two recipes: one per delivery target. Between them they instance every
100
- * invariant, which is what makes the drift lint's checks non-vacuous. Further
101
- * recipes are added through acceptance-run iteration, each proven against a
102
- * scenario before it lands.
103
- *
104
- * EVERY `wiring` edge below is EXECUTED in surfaces.test.ts against the real
105
- * registered elements in jsdom — the event is fired the way a user fires it,
106
- * the named property is assigned, and the effect is asserted in the shadow DOM.
107
- * Name resolution against derived.json proves an event and a property EXIST; it
108
- * does not prove the edge works, and that gap is where a plausible falsehood
109
- * would live. Add an edge here only with a probe beside it.
110
- */
111
- export const surfaceRecipes: TSurfaceRecipe[] = [
112
- {
113
- id: 'workspace-chat',
114
- intent:
115
- 'Full-screen chat with a conversations sidebar; assistant replies can open artifacts in a resizable side panel.',
116
- archetypes: ['full-screen'],
117
- targets: ['bundler'],
118
- ingredients: ['kai-chat', 'kai-conversations', 'kai-resizable', 'kai-artifact'],
119
- backend: { endpoint: 'consumer-owned', reader: 'readModelStream' },
120
- // WHERE the parts go, which the wiring edges below never said. Until this
121
- // field existed a builder could read the whole recipe, the whole element
122
- // reference and the whole scaffold and still not know whether the rail was a
123
- // child of the chat or a sibling beside it — and the two answers lay out
124
- // differently, so it is not a detail anyone can defer. One agent building
125
- // from the MCP said so in as many words and then guessed.
126
- //
127
- // Slotted, and the tree decided it rather than taste: `<kai-chat>` declares a
128
- // `sidebar` slot whose own description is "Left column (your nav /
129
- // conversation list). Fixed width; use compose-your-own for resizable", and
130
- // this recipe's own corpus story — chat-slots.stories.tsx — composes exactly
131
- // `<kai-conversations slot="sidebar">` inside `<kai-chat>`.
132
- //
133
- // THE TREE ALSO PUBLISHES THE OTHER ANSWER, and an earlier version of this
134
- // comment claimed it did not ("nothing in the tree composes them as
135
- // siblings") — asserted without looking, which is the same defect as the
136
- // over-generous `note` below it. The docs put the pair side by side in at
137
- // least five places: guides/frameworks/html.mdx, svelte.mdx (a section
138
- // titled "Add a conversation sidebar"), angular.mdx, vue.mdx, and
139
- // examples/knowledge-base.mdx with its live demo. Every one of them is a
140
- // layout the CONSUMER owns — a flex row they write, or `<kai-resizable>` —
141
- // which is the compose-your-own path the slot's own description points at,
142
- // and is what you want when the rail must resize. So the two are not in
143
- // conflict about what is legal; this record says which one the RECIPE is,
144
- // and the docs currently present the sibling form without saying that.
145
- composition: [
146
- {
147
- child: 'kai-conversations',
148
- parent: 'kai-chat',
149
- slot: 'sidebar',
150
- // Every clause here is checked against chat-thread.tsx, not inferred
151
- // from the slot's name. The shell's whole sidebar implementation is one
152
- // `<aside part="sidebar" class="flex w-64 shrink-0 …">` around a
153
- // `<slot name="sidebar" />`: fixed width, no responsive class in the
154
- // file, no collapse logic, and `<kai-chat>` never listens for
155
- // `kai-collapse-toggle`. Collapse belongs to the rail
156
- // (`collapsed`/`collapse()`), and conversation-list.tsx says so in as
157
- // many words: "the host owns the surrounding region". A note that
158
- // credited the shell with collapse and a breakpoint would send a builder
159
- // into a 16rem empty column holding a floating reopen button.
160
- note: 'the rail is a light-DOM child of <kai-chat> carrying slot="sidebar", not a sibling: the shell renders it into its own ::part(sidebar) aside, a FIXED-WIDTH column (w-64 in chat-thread.tsx, exposed as a part so you can restyle it) — and that is the whole of what the shell does. Collapse is the RAIL\'s own (collapsed / collapse() / kai-collapse-toggle) and <kai-chat> does not react to it, so a collapsed rail leaves the column at its fixed width; there is no responsive behaviour here either. Give the rail height (display:block;height:100%) and drive it through its own JS properties — being slotted changes where it renders, never how it is wired. If the COLUMN itself has to collapse, resize or respond to width, that is the <kai-workspace> layout shell (its start aside: startCollapsed / collapseBelow / drawer-below, widths via the --kai-workspace-start-* custom properties) or a layout you own',
161
- },
162
- ],
163
- wiring: [
164
- {
165
- from: 'kai-conversations',
166
- event: 'kai-conversation-select',
167
- to: 'kai-chat',
168
- property: 'messages',
169
- note: 'detail is {id}; the host looks the thread up and assigns it — a new array AND a new object per changed item (reactivity-two-halves)',
170
- },
171
- {
172
- from: 'kai-conversations',
173
- event: 'kai-new-chat',
174
- to: 'kai-chat',
175
- property: 'messages',
176
- note: 'detail is empty by design; the event is the whole signal and the host resets to an empty thread',
177
- },
178
- {
179
- from: 'kai-chat',
180
- event: 'kai-submit',
181
- to: 'kai-chat',
182
- property: 'messages',
183
- note: 'host reads event.detail.value, appends the user turn, streams the reply through the wire reader onto parts[]',
184
- },
185
- {
186
- from: 'kai-artifact',
187
- event: 'kai-maximize-change',
188
- to: 'kai-resizable',
189
- property: 'maximizedIndex',
190
- note: 'detail is {maximized}, NOT an index: the host knows which panel holds the artifact and mirrors the boolean onto that index (null to restore). Only needed when the panel is not an ancestor — an artifact INSIDE a kai-resizable-item already drives it through the bubbling kai-maximize-intent protocol, with no host code at all',
191
- },
192
- ],
193
- invariants: [
194
- 'reactivity-two-halves',
195
- 'props-not-attributes',
196
- 'events-non-bubbling',
197
- 'host-coordinates',
198
- 'kit-parses-consumer-fetches',
199
- 'untrusted-model-output',
200
- ],
201
- // No single story composes all four ingredients, so the corpus names what
202
- // each half is really proven by rather than one path that only half applies:
203
- // chat-slots composes kai-chat with kai-conversations, split-workspace
204
- // composes kai-resizable with kai-artifact, and surfaces.test.ts is where
205
- // the four wiring edges above are actually executed.
206
- corpus: [
207
- 'packages/ui/src/elements/chat-slots.stories.tsx',
208
- 'packages/ui/src/elements/split-workspace.stories.tsx',
209
- 'packages/ui/src/agent-tooling/catalog/surfaces.test.ts',
210
- ],
211
- },
212
- {
213
- // The script-tag instance. Without it, DeliveryTarget 'script-tag' and the
214
- // whole upgrade-race invariant exist in the schema with no recipe using
215
- // them, and S5 has nothing to reconstruct from.
216
- id: 'support-widget-script-tag',
217
- intent:
218
- 'A docked support chat widget added to a page with a script tag and no build step, talking to an endpoint the site owner already runs. The CMS case.',
219
- archetypes: ['widget', 'docked'],
220
- targets: ['script-tag'],
221
- ingredients: ['kai-chat'],
222
- backend: { endpoint: 'consumer-owned', reader: 'readOpenAIStream' },
223
- wiring: [
224
- {
225
- from: 'kai-chat',
226
- event: 'kai-submit',
227
- to: 'kai-chat',
228
- property: 'messages',
229
- note: 'host reads event.detail.value, appends the user turn, streams the reply through the wire reader; on this target the host is an inline script, not a framework, so the listener must be attached after customElements.whenDefined (upgrade-race)',
230
- },
231
- ],
232
- invariants: [
233
- 'upgrade-race',
234
- 'reactivity-two-halves',
235
- 'props-not-attributes',
236
- 'events-non-bubbling',
237
- 'kit-parses-consumer-fetches',
238
- 'untrusted-model-output',
239
- ],
240
- corpus: ['packages/ui/README.md'],
241
- },
242
- {
243
- // The hand-composed thread (rung-6 F-49): kai-chat deliberately absent —
244
- // kai-thread renders the transcript, kai-composer takes input, and the
245
- // HOST is every line of wiring between them. This record is the catalog
246
- // half; the full compiling host module is the `composed-thread` CODE
247
- // recipe (../recipes/composed-thread.ts, served by component_reference
248
- // { name: "composed-thread" } and compiled by verify:scaffold), which is
249
- // also this record's corpus. Ingredients with no wiring edge below are
250
- // still real members of the composition: kai-feedback-bar's events
251
- // terminate in the host rather than setting another element's property.
252
- // (kai-conversation-item used to be in that list as "presentational
253
- // standalone"; since F-45 tier 2 a standalone row activates itself, so
254
- // the rail is a real kai-select edge below.)
255
- id: 'composed-thread',
256
- intent:
257
- 'A full chat surface composed by hand from standalone elements — no <kai-chat>. ' +
258
- 'The host module owns the store, streams through createAssistantStream + the wire ' +
259
- 'reader, stages attachments as data: URIs, and drives the toast region as data.',
260
- archetypes: ['full-screen'],
261
- targets: ['bundler'],
262
- ingredients: [
263
- 'kai-thread',
264
- 'kai-composer',
265
- 'kai-attachments',
266
- 'kai-toast-region',
267
- 'kai-conversation-item',
268
- 'kai-feedback-bar',
269
- ],
270
- backend: { endpoint: 'consumer-owned', reader: 'readOpenAIStream' },
271
- wiring: [
272
- {
273
- from: 'kai-composer',
274
- event: 'kai-submit',
275
- to: 'kai-thread',
276
- property: 'messages',
277
- note: 'detail is {doc, text, entities} — read detail.text (NOT detail.value, which is kai-chat/kai-prompt-input\'s shape). The host appends the user turn plus any staged file parts and assigns a NEW array; the reply then streams onto the same property via createAssistantStream',
278
- },
279
- {
280
- from: 'kai-attachments',
281
- event: 'kai-remove',
282
- to: 'kai-attachments',
283
- property: 'items',
284
- note: 'detail is {id}; the tray never mutates its own list — the host filters and reassigns items, and a data: URI needs no revocation on removal (attachment-blob-url is the rule this recipe corrects: F-44)',
285
- },
286
- {
287
- from: 'kai-toast-region',
288
- event: 'kai-dismiss',
289
- to: 'kai-toast-region',
290
- property: 'toasts',
291
- note: 'detail is {id}; the region is driven as DATA because this app places its own and owns the array — the imperative toast() would ADOPT this markup-placed region (it mounts its own only when none exists) and bind its store over the toasts property, so pick one API per region',
292
- },
293
- {
294
- from: 'kai-conversation-item',
295
- event: 'kai-select',
296
- to: 'kai-thread',
297
- property: 'messages',
298
- note: 'detail is {id}; STANDALONE rows only (F-45 tier 2) — outside <kai-conversations> the row body is a tabbable button and click / Enter / Space fire kai-select on the item (non-bubbling: listen on the row). Inside a container this never fires; the container\'s kai-conversation-select is the one activation event. The container\'s list story (roving tabindex, arrow keys) stays the host\'s job in a hand-rolled rail',
299
- },
300
- ],
301
- invariants: [
302
- 'reactivity-two-halves',
303
- 'props-not-attributes',
304
- 'events-non-bubbling',
305
- 'host-coordinates',
306
- 'kit-parses-consumer-fetches',
307
- 'untrusted-model-output',
308
- ],
309
- corpus: [
310
- 'packages/ui/src/agent-tooling/recipes/composed-thread.ts',
311
- 'packages/ui/src/agent-tooling/catalog/surfaces.test.ts',
312
- ],
313
- },
314
- ];
315
-
316
- /**
317
- * REGISTERED COPY (spec §3). Which MessagePart variants an element consumes is
318
- * not derivable from any type today, so it is recorded here as an explicit copy.
319
- * Task 7's drift lint fails when the union gains a variant no record accounts
320
- * for, which is what stops this going stale silently.
321
- *
322
- * WHAT THE CHECKS CAN AND CANNOT SEE. surfaces.test.ts asserts both directions
323
- * of NAME agreement with `derived.partVariants`: no variant in the union is
324
- * unaccounted for by any record, and no record claims a variant the union does
325
- * not have. Neither can check the claim that actually matters — whether
326
- * `kai-chat` really renders a `source` part is an EDITORIAL judgement, and
327
- * nothing in the tree derives it, which is exactly why this is a registered
328
- * copy rather than generated data. A machine cannot tell a correct record from
329
- * a confident wrong one here. That claim is measured by the acceptance deck,
330
- * not by CI, so do not add an assertion that looks like it covers it.
331
- */
332
- export const partConsumption: TPartConsumption[] = [
333
- { tag: 'kai-chat', consumes: ['text', 'reasoning', 'tool', 'card', 'source', 'file'] },
334
- { tag: 'kai-message', consumes: ['text', 'reasoning', 'tool', 'card', 'source', 'file'] },
335
- ];
336
-
337
- export function listInventory(): TInventoryEntry[] {
338
- return z.array(InventoryEntry).parse(inventory);
339
- }
340
-
341
- export function listSurfaceRecipes(): TSurfaceRecipe[] {
342
- return z.array(SurfaceRecipe).parse(surfaceRecipes);
343
- }
344
-
345
- export function listPartConsumption(): TPartConsumption[] {
346
- return z.array(PartConsumption).parse(partConsumption);
347
- }
@@ -1,8 +0,0 @@
1
- /** Build entry for dist/construct-cli.es.js (vite.config.construct-cli.ts).
2
- * bin/mcp.js imports this with the subcommand argv; process handling stays in
3
- * the bin (this file stays free of exit calls, same split as mcp/stdio.ts). */
4
- import { runCli } from './cli';
5
-
6
- runCli(process.argv.slice(2)).then((code) => {
7
- process.exitCode = code;
8
- });