@kitn.ai/ui 0.28.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 (376) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-tooling/construct/public.d.ts +15 -0
  3. package/dist/agent-tooling/construct/schema.d.ts +111 -0
  4. package/dist/construct-cli.es.js +3 -3
  5. package/dist/construct.d.ts +5 -0
  6. package/dist/construct.js +327 -0
  7. package/dist/core-C8fzo39E.js +1 -12
  8. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  9. package/dist/mcp.es.js +1 -1
  10. package/package.json +16 -16
  11. package/bin/route.test.js +0 -58
  12. package/src/agent-tooling/README.md +0 -192
  13. package/src/agent-tooling/archetypes.ts +0 -205
  14. package/src/agent-tooling/catalog/README.md +0 -676
  15. package/src/agent-tooling/catalog/catalog-types.ts +0 -231
  16. package/src/agent-tooling/catalog/fabrications.ts +0 -96
  17. package/src/agent-tooling/catalog/invariants.ts +0 -284
  18. package/src/agent-tooling/catalog/labs-titles.ts +0 -114
  19. package/src/agent-tooling/catalog/scenarios.ts +0 -87
  20. package/src/agent-tooling/catalog/surfaces.ts +0 -347
  21. package/src/agent-tooling/construct/cli-entry.ts +0 -8
  22. package/src/agent-tooling/construct/cli.ts +0 -147
  23. package/src/agent-tooling/construct/codegen.ts +0 -1635
  24. package/src/agent-tooling/construct/construct.v1.schema.json +0 -319
  25. package/src/agent-tooling/construct/dev.ts +0 -148
  26. package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
  27. package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
  28. package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -32
  29. package/src/agent-tooling/construct/schema.ts +0 -452
  30. package/src/agent-tooling/integrations/anthropic.ts +0 -442
  31. package/src/agent-tooling/integrations/cloudflare.ts +0 -218
  32. package/src/agent-tooling/integrations/langgraph.ts +0 -133
  33. package/src/agent-tooling/integrations/mastra.ts +0 -182
  34. package/src/agent-tooling/integrations/mock.ts +0 -148
  35. package/src/agent-tooling/integrations/ollama.ts +0 -97
  36. package/src/agent-tooling/integrations/openai.ts +0 -95
  37. package/src/agent-tooling/integrations/openrouter.ts +0 -82
  38. package/src/agent-tooling/integrations/pi.ts +0 -176
  39. package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
  40. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
  41. package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
  42. package/src/agent-tooling/mcp/manifest.ts +0 -422
  43. package/src/agent-tooling/mcp/server.ts +0 -116
  44. package/src/agent-tooling/mcp/stdio.ts +0 -18
  45. package/src/agent-tooling/mcp/tools/construct.ts +0 -130
  46. package/src/agent-tooling/mcp/tools/debug.ts +0 -621
  47. package/src/agent-tooling/mcp/tools/reference.ts +0 -980
  48. package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
  49. package/src/agent-tooling/mcp/tools/theme.ts +0 -456
  50. package/src/agent-tooling/mcp/tools/types.ts +0 -14
  51. package/src/agent-tooling/mcp/validate-args.ts +0 -141
  52. package/src/agent-tooling/recipes/composed-thread.ts +0 -714
  53. package/src/agent-tooling/recipes/index.ts +0 -22
  54. package/src/agent-tooling/recipes/types.ts +0 -32
  55. package/src/agent-tooling/registry.ts +0 -132
  56. package/src/agent-tooling/route-emit.ts +0 -305
  57. package/src/agent-tooling/types.ts +0 -390
  58. package/src/components/artifact-card.tsx +0 -120
  59. package/src/components/artifact.tsx +0 -914
  60. package/src/components/attachment-types.ts +0 -66
  61. package/src/components/attachments.tsx +0 -536
  62. package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
  63. package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
  64. package/src/components/audio-visualizer/fit-scale.ts +0 -112
  65. package/src/components/audio-visualizer/index.tsx +0 -528
  66. package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
  67. package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
  68. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
  69. package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
  70. package/src/components/audio-visualizer/sizes.ts +0 -54
  71. package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
  72. package/src/components/audio-visualizer/variant-bar.tsx +0 -175
  73. package/src/components/audio-visualizer/variant-custom.tsx +0 -344
  74. package/src/components/audio-visualizer/variant-grid.tsx +0 -175
  75. package/src/components/audio-visualizer/variant-radial.tsx +0 -163
  76. package/src/components/audio-visualizer/variant-wave.tsx +0 -130
  77. package/src/components/audio-visualizer/wave.glsl.ts +0 -130
  78. package/src/components/card-fallback.tsx +0 -60
  79. package/src/components/card-renderer.tsx +0 -220
  80. package/src/components/card.tsx +0 -212
  81. package/src/components/chain-of-thought.tsx +0 -348
  82. package/src/components/chat-container.tsx +0 -89
  83. package/src/components/chat-scope-picker.tsx +0 -57
  84. package/src/components/chat-thread.tsx +0 -1014
  85. package/src/components/checkpoint.tsx +0 -88
  86. package/src/components/choice-card.tsx +0 -743
  87. package/src/components/coachmark.tsx +0 -249
  88. package/src/components/code-block.tsx +0 -181
  89. package/src/components/composer-dom.ts +0 -159
  90. package/src/components/composer-highlight.ts +0 -242
  91. package/src/components/composer-history.ts +0 -82
  92. package/src/components/composer.tsx +0 -1075
  93. package/src/components/confirm-card.tsx +0 -402
  94. package/src/components/context.tsx +0 -377
  95. package/src/components/conversation-item.tsx +0 -241
  96. package/src/components/conversation-list.tsx +0 -429
  97. package/src/components/conversation-panel.tsx +0 -118
  98. package/src/components/dismissed-stub.tsx +0 -80
  99. package/src/components/embed.tsx +0 -200
  100. package/src/components/empty.tsx +0 -177
  101. package/src/components/feedback-bar.tsx +0 -166
  102. package/src/components/file-tree.tsx +0 -530
  103. package/src/components/file-upload.tsx +0 -167
  104. package/src/components/form-widgets.tsx +0 -525
  105. package/src/components/form.tsx +0 -1296
  106. package/src/components/home-panel.tsx +0 -159
  107. package/src/components/image.tsx +0 -65
  108. package/src/components/link-preview.tsx +0 -195
  109. package/src/components/loader.tsx +0 -367
  110. package/src/components/markdown.tsx +0 -162
  111. package/src/components/message-skills.tsx +0 -40
  112. package/src/components/message.tsx +0 -765
  113. package/src/components/model-switcher.tsx +0 -132
  114. package/src/components/prompt-input.tsx +0 -188
  115. package/src/components/prompt-suggestion.tsx +0 -150
  116. package/src/components/reasoning.tsx +0 -293
  117. package/src/components/response-compare-types.ts +0 -152
  118. package/src/components/response-compare.tsx +0 -455
  119. package/src/components/response-stream.tsx +0 -109
  120. package/src/components/screen.tsx +0 -181
  121. package/src/components/scroll-button.tsx +0 -93
  122. package/src/components/source.tsx +0 -192
  123. package/src/components/tasks-card.tsx +0 -801
  124. package/src/components/text-shimmer.tsx +0 -37
  125. package/src/components/thinking-bar.tsx +0 -50
  126. package/src/components/thread.tsx +0 -228
  127. package/src/components/toast.tsx +0 -503
  128. package/src/components/tool-classify.ts +0 -26
  129. package/src/components/tool-types.ts +0 -49
  130. package/src/components/tool.tsx +0 -190
  131. package/src/components/use-card-resolution.ts +0 -44
  132. package/src/components/voice-input.tsx +0 -222
  133. package/src/components/voice-output.tsx +0 -242
  134. package/src/components/widget-tab-bar.tsx +0 -73
  135. package/src/components/workspace-shell.tsx +0 -285
  136. package/src/diagnostics/hook.ts +0 -352
  137. package/src/diagnostics/index.ts +0 -82
  138. package/src/diagnostics/report-request.ts +0 -296
  139. package/src/elements/agent-card.tsx +0 -67
  140. package/src/elements/artifact.tsx +0 -194
  141. package/src/elements/attachments.tsx +0 -140
  142. package/src/elements/audio-visualizer.tsx +0 -227
  143. package/src/elements/autoloader.ts +0 -89
  144. package/src/elements/avatar.tsx +0 -33
  145. package/src/elements/badge.tsx +0 -32
  146. package/src/elements/button.tsx +0 -149
  147. package/src/elements/card.tsx +0 -133
  148. package/src/elements/cards.tsx +0 -266
  149. package/src/elements/chain-of-thought.tsx +0 -141
  150. package/src/elements/chat-scope-picker.tsx +0 -65
  151. package/src/elements/chat-types.ts +0 -102
  152. package/src/elements/chat-workspace.tsx +0 -188
  153. package/src/elements/chat.tsx +0 -304
  154. package/src/elements/checkbox-group.tsx +0 -164
  155. package/src/elements/checkbox.tsx +0 -134
  156. package/src/elements/checkpoint.tsx +0 -47
  157. package/src/elements/choice.tsx +0 -100
  158. package/src/elements/coachmark.tsx +0 -90
  159. package/src/elements/code-block.tsx +0 -60
  160. package/src/elements/command.tsx +0 -197
  161. package/src/elements/compare.tsx +0 -111
  162. package/src/elements/compiled.css +0 -2
  163. package/src/elements/composer.tsx +0 -162
  164. package/src/elements/confirm-card.tsx +0 -76
  165. package/src/elements/context-meter.tsx +0 -107
  166. package/src/elements/conversation-item.tsx +0 -120
  167. package/src/elements/conversation-list.tsx +0 -203
  168. package/src/elements/css.ts +0 -5
  169. package/src/elements/default-input.tsx +0 -392
  170. package/src/elements/define-entry.ts +0 -12
  171. package/src/elements/define.tsx +0 -563
  172. package/src/elements/diagnostic-events.ts +0 -114
  173. package/src/elements/dialog.tsx +0 -145
  174. package/src/elements/disclosure.ts +0 -95
  175. package/src/elements/dock.tsx +0 -215
  176. package/src/elements/dropdown.tsx +0 -123
  177. package/src/elements/editable-label.tsx +0 -140
  178. package/src/elements/element-data-types.ts +0 -152
  179. package/src/elements/element-diagnostics.ts +0 -392
  180. package/src/elements/element-manifest.json +0 -354
  181. package/src/elements/element-nonscalar.json +0 -187
  182. package/src/elements/element-types.d.ts +0 -4353
  183. package/src/elements/embed.tsx +0 -35
  184. package/src/elements/empty.tsx +0 -29
  185. package/src/elements/feedback-bar.tsx +0 -66
  186. package/src/elements/file-tree.tsx +0 -62
  187. package/src/elements/file-upload.tsx +0 -44
  188. package/src/elements/form.tsx +0 -94
  189. package/src/elements/hover-card.tsx +0 -80
  190. package/src/elements/icon.tsx +0 -41
  191. package/src/elements/image.tsx +0 -32
  192. package/src/elements/input.tsx +0 -492
  193. package/src/elements/kbd.tsx +0 -45
  194. package/src/elements/link-preview.tsx +0 -34
  195. package/src/elements/loader.tsx +0 -25
  196. package/src/elements/markdown.tsx +0 -38
  197. package/src/elements/menu.tsx +0 -241
  198. package/src/elements/message-skills.tsx +0 -83
  199. package/src/elements/message.tsx +0 -361
  200. package/src/elements/model-switcher.tsx +0 -121
  201. package/src/elements/nav.tsx +0 -87
  202. package/src/elements/notice.tsx +0 -53
  203. package/src/elements/pane-grid.tsx +0 -111
  204. package/src/elements/pane-group.tsx +0 -119
  205. package/src/elements/pane.tsx +0 -129
  206. package/src/elements/popover.tsx +0 -81
  207. package/src/elements/progress-bar.tsx +0 -39
  208. package/src/elements/prompt-dock.tsx +0 -82
  209. package/src/elements/prompt-input.tsx +0 -240
  210. package/src/elements/prompt-suggestions.tsx +0 -113
  211. package/src/elements/radio-group.tsx +0 -129
  212. package/src/elements/reasoning.tsx +0 -71
  213. package/src/elements/register-impl.ts +0 -148
  214. package/src/elements/register.ts +0 -76
  215. package/src/elements/remote.tsx +0 -225
  216. package/src/elements/resizable.globals.d.ts +0 -36
  217. package/src/elements/resizable.tsx +0 -704
  218. package/src/elements/response-stream.tsx +0 -40
  219. package/src/elements/screen.tsx +0 -90
  220. package/src/elements/scroll-area.tsx +0 -33
  221. package/src/elements/scroll-button.tsx +0 -179
  222. package/src/elements/search.tsx +0 -185
  223. package/src/elements/segmented.tsx +0 -129
  224. package/src/elements/select.tsx +0 -165
  225. package/src/elements/separator.tsx +0 -36
  226. package/src/elements/setting-item.tsx +0 -50
  227. package/src/elements/settings-group.tsx +0 -37
  228. package/src/elements/skeleton.tsx +0 -45
  229. package/src/elements/slider.tsx +0 -171
  230. package/src/elements/slot-text.ts +0 -73
  231. package/src/elements/slots.ts +0 -787
  232. package/src/elements/source.tsx +0 -126
  233. package/src/elements/status.tsx +0 -42
  234. package/src/elements/styles.css +0 -328
  235. package/src/elements/switch.tsx +0 -118
  236. package/src/elements/tabs.tsx +0 -95
  237. package/src/elements/tasks.tsx +0 -103
  238. package/src/elements/text-shimmer.tsx +0 -28
  239. package/src/elements/thinking-bar.tsx +0 -43
  240. package/src/elements/thread.tsx +0 -139
  241. package/src/elements/toast.tsx +0 -106
  242. package/src/elements/tool.tsx +0 -78
  243. package/src/elements/tooltip.tsx +0 -85
  244. package/src/elements/validate-messages.ts +0 -76
  245. package/src/elements/voice-input.tsx +0 -100
  246. package/src/elements/voice-output.tsx +0 -82
  247. package/src/index.ts +0 -430
  248. package/src/primitives/audio-bands.ts +0 -174
  249. package/src/primitives/card-component-types.ts +0 -63
  250. package/src/primitives/card-contract.ts +0 -80
  251. package/src/primitives/card-data-types.ts +0 -361
  252. package/src/primitives/card-host.tsx +0 -37
  253. package/src/primitives/card-recovery.ts +0 -160
  254. package/src/primitives/card-registry.tsx +0 -78
  255. package/src/primitives/card-resolution.ts +0 -36
  256. package/src/primitives/card-routing.ts +0 -85
  257. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  258. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  259. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  260. package/src/primitives/card-schemas/choice.schema.json +0 -75
  261. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  262. package/src/primitives/card-schemas/embed.schema.json +0 -63
  263. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  264. package/src/primitives/card-schemas/form.schema.json +0 -53
  265. package/src/primitives/card-schemas/link.schema.json +0 -54
  266. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  267. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  268. package/src/primitives/card-tags.ts +0 -61
  269. package/src/primitives/card-validate-cards.ts +0 -255
  270. package/src/primitives/card-validate-schemas.ts +0 -58
  271. package/src/primitives/card-validate.ts +0 -131
  272. package/src/primitives/chat-config.tsx +0 -103
  273. package/src/primitives/composer-model.ts +0 -49
  274. package/src/primitives/composer-triggers.ts +0 -35
  275. package/src/primitives/controllable.ts +0 -21
  276. package/src/primitives/conversation-store.ts +0 -248
  277. package/src/primitives/create-kai-chat.ts +0 -66
  278. package/src/primitives/create-tween.ts +0 -266
  279. package/src/primitives/embed-providers.ts +0 -254
  280. package/src/primitives/field-mask.ts +0 -256
  281. package/src/primitives/field-semantics.ts +0 -115
  282. package/src/primitives/highlighter.ts +0 -157
  283. package/src/primitives/input-mask.ts +0 -853
  284. package/src/primitives/link-preview.ts +0 -87
  285. package/src/primitives/message-feedback.ts +0 -124
  286. package/src/primitives/pdf-preview.ts +0 -121
  287. package/src/primitives/toast-store.ts +0 -338
  288. package/src/primitives/url-scheme-policy.ts +0 -70
  289. package/src/primitives/use-audio-analysis.ts +0 -340
  290. package/src/primitives/use-auto-resize.ts +0 -31
  291. package/src/primitives/use-resize-observer.ts +0 -45
  292. package/src/primitives/use-sequencer.ts +0 -72
  293. package/src/primitives/use-speech-recognition.ts +0 -146
  294. package/src/primitives/use-stick-to-bottom.ts +0 -75
  295. package/src/primitives/use-text-stream.ts +0 -143
  296. package/src/primitives/use-voice-recorder.ts +0 -62
  297. package/src/primitives/visualizer-sequences.ts +0 -350
  298. package/src/remote/host-embed.ts +0 -345
  299. package/src/remote/index.ts +0 -2
  300. package/src/remote/origin.ts +0 -30
  301. package/src/remote/provider-runtime.ts +0 -262
  302. package/src/remote/provider.ts +0 -2
  303. package/src/remote/validate.ts +0 -22
  304. package/src/remote/version.ts +0 -12
  305. package/src/remote/wire.ts +0 -48
  306. package/src/schemas/from-tool-call.ts +0 -151
  307. package/src/schemas/index.ts +0 -341
  308. package/src/schemas/provider-subsets.ts +0 -538
  309. package/src/schemas/registry.ts +0 -355
  310. package/src/schemas/tool-defs.ts +0 -793
  311. package/src/solid.ts +0 -173
  312. package/src/state/index.ts +0 -44
  313. package/src/state/messages.ts +0 -53
  314. package/src/state/mock.ts +0 -297
  315. package/src/state/parts.ts +0 -295
  316. package/src/state/persistence.ts +0 -180
  317. package/src/state/stream.ts +0 -246
  318. package/src/state/suggestions.ts +0 -9
  319. package/src/state/threads.ts +0 -142
  320. package/src/test-utils/fake-clock.ts +0 -88
  321. package/src/types.ts +0 -95
  322. package/src/ui/action-icons.ts +0 -53
  323. package/src/ui/agent-card.tsx +0 -218
  324. package/src/ui/avatar.tsx +0 -23
  325. package/src/ui/badge.tsx +0 -21
  326. package/src/ui/button.tsx +0 -49
  327. package/src/ui/card.tsx +0 -245
  328. package/src/ui/checkbox-group.tsx +0 -153
  329. package/src/ui/checkbox.tsx +0 -63
  330. package/src/ui/collapsible.tsx +0 -163
  331. package/src/ui/command.tsx +0 -103
  332. package/src/ui/dialog.tsx +0 -223
  333. package/src/ui/dock.tsx +0 -630
  334. package/src/ui/dropdown.tsx +0 -636
  335. package/src/ui/editable-label.tsx +0 -112
  336. package/src/ui/hover-card.tsx +0 -345
  337. package/src/ui/icon.tsx +0 -167
  338. package/src/ui/input.tsx +0 -391
  339. package/src/ui/kbd.tsx +0 -118
  340. package/src/ui/nav.tsx +0 -282
  341. package/src/ui/notice.tsx +0 -84
  342. package/src/ui/overlay.tsx +0 -277
  343. package/src/ui/pane-grid.tsx +0 -117
  344. package/src/ui/pane-group.tsx +0 -291
  345. package/src/ui/pane.tsx +0 -193
  346. package/src/ui/popover.tsx +0 -106
  347. package/src/ui/progress-bar.tsx +0 -83
  348. package/src/ui/prompt-dock.tsx +0 -145
  349. package/src/ui/radio.tsx +0 -150
  350. package/src/ui/resizable.tsx +0 -693
  351. package/src/ui/scroll-area.tsx +0 -26
  352. package/src/ui/segmented.tsx +0 -109
  353. package/src/ui/select.tsx +0 -168
  354. package/src/ui/separator.tsx +0 -10
  355. package/src/ui/settings-group.tsx +0 -67
  356. package/src/ui/skeleton.tsx +0 -73
  357. package/src/ui/slider.tsx +0 -178
  358. package/src/ui/status.tsx +0 -48
  359. package/src/ui/switch.tsx +0 -119
  360. package/src/ui/tabs.tsx +0 -168
  361. package/src/ui/textarea.tsx +0 -21
  362. package/src/ui/tooltip.tsx +0 -118
  363. package/src/utils/cn.ts +0 -30
  364. package/src/wire/chunk.ts +0 -248
  365. package/src/wire/consume.ts +0 -599
  366. package/src/wire/diagnostics.ts +0 -727
  367. package/src/wire/encode-probe.ts +0 -214
  368. package/src/wire/encode.ts +0 -947
  369. package/src/wire/files.ts +0 -342
  370. package/src/wire/formats/anthropic.ts +0 -274
  371. package/src/wire/formats/openai.ts +0 -228
  372. package/src/wire/index.ts +0 -95
  373. package/src/wire/media-types.ts +0 -344
  374. package/src/wire/read.ts +0 -396
  375. package/src/wire/sink-helpers.ts +0 -50
  376. package/src/wire/sse.ts +0 -153
package/dist/mcp.es.js CHANGED
@@ -9331,7 +9331,7 @@ const RULES = [
9331
9331
  t
9332
9332
  ),
9333
9333
  title: "tsc errors inside node_modules/@kitn.ai/ui/src (SolidJS source compiled under React)",
9334
- cause: "The package currently ships TypeScript/TSX source, and a type entry value-re-exports from it, so the consumer's `tsc` resolves and compiles the library's SolidJS internals (`src/ui/*.tsx`) under the app's React JSX config — `Show`/`Portal`/`Dynamic` aren't React components, causing TS2786 / \"cannot be used as a JSX component\" errors. `vite`/esbuild build fine (they strip types); only `tsc` breaks. `skipLibCheck` does not help (these are `.tsx` source, not `.d.ts`).",
9334
+ cause: "On versions <=0.27.x, the package shipped TypeScript/TSX source, and a type entry value-re-exports from it, so the consumer's `tsc` resolves and compiles the library's SolidJS internals (`src/ui/*.tsx`) under the app's React JSX config — `Show`/`Portal`/`Dynamic` aren't React components, causing TS2786 / \"cannot be used as a JSX component\" errors. `vite`/esbuild build fine (they strip types); only `tsc` breaks. `skipLibCheck` does not help (these are `.tsx` source, not `.d.ts`). Fixed for newer releases: the package no longer ships that source tree (`files` in package.json narrowed to `dist/` plus two reachable JSON exports) — if you're still hitting this, check your installed version first (`npm ls @kitn.ai/ui`) and upgrade before reaching for the workaround below.",
9335
9335
  fix: 'Redirect the type resolution for that subpath in your tsconfig (Vite ignores tsconfig `paths`, so runtime is unaffected):\n\n```jsonc\n// tsconfig (app)\n"baseUrl": ".",\n"paths": { "@kitn.ai/ui/elements": ["./src/stubs/kitn-elements.d.ts"] }\n```\n\n```ts\n// src/stubs/kitn-elements.d.ts\nexport {}\n```\n\n(This is a known packaging gap being tracked upstream.)'
9336
9336
  },
9337
9337
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kitn.ai/ui",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "nx": {
5
5
  "name": "ui",
6
6
  "targets": {
@@ -68,7 +68,8 @@
68
68
  "jsdelivr": "./dist/kai.es.js",
69
69
  "customElements": "dist/custom-elements.json",
70
70
  "bin": {
71
- "kai-mcp": "./bin/mcp.js"
71
+ "kai-mcp": "./bin/mcp.js",
72
+ "kai": "./bin/mcp.js"
72
73
  },
73
74
  "exports": {
74
75
  ".": {
@@ -133,6 +134,10 @@
133
134
  "default": "./dist/schemas.js"
134
135
  },
135
136
  "./schemas/*": "./dist/schemas/*",
137
+ "./construct": {
138
+ "types": "./dist/agent-tooling/construct/public.d.ts",
139
+ "default": "./dist/construct.js"
140
+ },
136
141
  "./provider": {
137
142
  "types": "./dist/remote/provider.d.ts",
138
143
  "default": "./dist/kai-provider.es.js"
@@ -142,25 +147,19 @@
142
147
  "*": {
143
148
  "schemas": [
144
149
  "./dist/schemas/index.d.ts"
150
+ ],
151
+ "construct": [
152
+ "./dist/agent-tooling/construct/public.d.ts"
145
153
  ]
146
154
  }
147
155
  },
148
156
  "files": [
149
157
  "dist",
150
- "src",
158
+ "src/elements/element-meta.json",
159
+ "src/elements/icon-names.json",
151
160
  "bin",
152
- "!src/**/*.stories.tsx",
153
- "!src/**/*.test.ts",
154
- "!src/**/*.test.tsx",
155
- "!src/**/*.testlib.ts",
161
+ "!bin/**/*.test.js",
156
162
  "!dist/**/*.testlib.*",
157
- "!src/**/*.mdx",
158
- "!src/stories",
159
- "!src/wire/fixtures",
160
- "!src/agent-tooling/catalog/derived.json",
161
- "!src/elements/logos",
162
- "!src/elements/card-media.jpg",
163
- "!src/elements/video-poster.jpg",
164
163
  "frameworks",
165
164
  "theme.css",
166
165
  "llms.txt",
@@ -170,7 +169,7 @@
170
169
  "scripts": {
171
170
  "prepublishOnly": "npm run build",
172
171
  "prebuild": "npm run build:css && npm run build:card-validation",
173
- "build": "vite build --config vite.config.ts && vite build --config vite.config.provider.ts && vite build --config vite.config.react.ts && vite build --config vite.config.barrel.ts && vite build --config vite.config.barrel.server.ts && vite build --config vite.config.solid.ts && vite build --config vite.config.solid.server.ts && vite build --config vite.config.state.ts && vite build --config vite.config.wire.ts && vite build --config vite.config.define.ts && vite build --config vite.config.define.server.ts && vite build --config vite.config.diagnostics.ts && vite build --config vite.config.schemas.ts && vite build --config vite.config.mcp.ts && vite build --config vite.config.construct-cli.ts && npm run build:elements && npm run verify:elements-bundle && npm run verify:react-wrappers && npm run verify:shader-lazy",
172
+ "build": "vite build --config vite.config.ts && vite build --config vite.config.provider.ts && vite build --config vite.config.react.ts && vite build --config vite.config.barrel.ts && vite build --config vite.config.barrel.server.ts && vite build --config vite.config.solid.ts && vite build --config vite.config.solid.server.ts && vite build --config vite.config.state.ts && vite build --config vite.config.wire.ts && vite build --config vite.config.define.ts && vite build --config vite.config.define.server.ts && vite build --config vite.config.diagnostics.ts && vite build --config vite.config.schemas.ts && vite build --config vite.config.mcp.ts && vite build --config vite.config.construct-cli.ts && vite build --config vite.config.construct.ts && npm run build:elements && npm run dedupe:shiki && npm run verify:elements-bundle && npm run verify:react-wrappers && npm run verify:shader-lazy",
174
173
  "build:elements": "node scripts/gen-elements-manifest.mjs && vite build --config vite.config.elements.ts && node scripts/gen-element-dts.mjs",
175
174
  "postbuild": "npm run build:theme && npm run build:api && npm run build:schemas && npm run build:subpath-dts && npm run verify:dts",
176
175
  "build:theme": "node scripts/build-theme-tokens.mjs",
@@ -193,13 +192,14 @@
193
192
  "gate:compiles:self-test": "node scripts/acceptance-gate-compiles.mjs --self-test",
194
193
  "verify:schemas": "node scripts/verify-schemas-exported.mjs --self-test && node scripts/verify-schemas-exported.mjs",
195
194
  "verify:shader-lazy": "node scripts/verify-shader-lazy.mjs --self-test && node scripts/verify-shader-lazy.mjs",
195
+ "dedupe:shiki": "node scripts/dedupe-shiki-chunks.mjs --self-test && node scripts/dedupe-shiki-chunks.mjs",
196
196
  "verify:solid-coverage": "node scripts/verify-solid-coverage.mjs --self-test && node scripts/verify-solid-coverage.mjs",
197
197
  "verify:tool-schemas": "node scripts/verify-tool-schemas.mjs",
198
198
  "verify:ssr": "node scripts/verify-ssr-imports.mjs && node scripts/verify-ssr-render.mjs",
199
199
  "verify:diagnostics-wiring": "node scripts/verify-diagnostics-wiring.mjs",
200
200
  "verify:ssr:imports": "node scripts/verify-ssr-imports.mjs",
201
201
  "verify:ssr:render": "node scripts/verify-ssr-render.mjs",
202
- "verify:pack": "node scripts/verify-pack-weight.mjs",
202
+ "verify:pack": "node scripts/verify-pack-weight.mjs --self-test && node scripts/verify-pack-weight.mjs",
203
203
  "verify:starters": "node scripts/verify-starters.mjs",
204
204
  "lint:attachment-object-urls": "node scripts/lint-attachment-object-urls.mjs --self-test && node scripts/lint-attachment-object-urls.mjs",
205
205
  "lint:cdn-pins": "node scripts/lint-cdn-pins.mjs --self-test && node scripts/lint-cdn-pins.mjs --check-release-wiring && node scripts/lint-cdn-pins.mjs",
package/bin/route.test.js DELETED
@@ -1,58 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { execFileSync } from 'node:child_process';
3
- import { fileURLToPath } from 'node:url';
4
- import { dirname, join } from 'node:path';
5
- import { decideEntry, CONSTRUCT_COMMANDS, KNOWN_COMMANDS } from './route.js';
6
-
7
- const __dirname = dirname(fileURLToPath(import.meta.url));
8
- const binPath = join(__dirname, 'mcp.js');
9
-
10
- describe('decideEntry (pure routing decision)', () => {
11
- it('no args -> mcp (byte-compatible historical behavior)', () => {
12
- expect(decideEntry(undefined)).toEqual({ kind: 'mcp' });
13
- });
14
-
15
- it('"mcp" -> mcp (byte-compatible historical behavior)', () => {
16
- expect(decideEntry('mcp')).toEqual({ kind: 'mcp' });
17
- });
18
-
19
- it.each(CONSTRUCT_COMMANDS)('%s -> construct', (cmd) => {
20
- expect(decideEntry(cmd)).toEqual({ kind: 'construct' });
21
- });
22
-
23
- it('unknown/typo\'d command -> error naming the valid commands', () => {
24
- const decision = decideEntry('frobnicate');
25
- expect(decision.kind).toBe('error');
26
- for (const known of KNOWN_COMMANDS) {
27
- expect(decision.message).toContain(known);
28
- }
29
- });
30
- });
31
-
32
- describe('bin/mcp.js dispatcher (spawned, real process)', () => {
33
- it('unknown subcommand exits 2 with stderr naming valid commands, never falling through to the server', () => {
34
- let status = 0;
35
- let stderr = '';
36
- try {
37
- execFileSync('node', [binPath, 'frobnicate'], { timeout: 5000, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
38
- } catch (err) {
39
- status = err.status;
40
- stderr = err.stderr;
41
- }
42
- expect(status).toBe(2);
43
- expect(stderr).toMatch(/valid commands/i);
44
- });
45
-
46
- it('a typo\'d valid-ish command (validat) also exits 2, not a hang', () => {
47
- let status = 0;
48
- let stderr = '';
49
- try {
50
- execFileSync('node', [binPath, 'validat'], { timeout: 5000, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
51
- } catch (err) {
52
- status = err.status;
53
- stderr = err.stderr;
54
- }
55
- expect(status).toBe(2);
56
- expect(stderr).toMatch(/valid commands/i);
57
- });
58
- });
@@ -1,192 +0,0 @@
1
- # `agent-tooling/`
2
-
3
- The kit's machine-facing front door: everything that makes AI coding agents
4
- and CLIs fluent building with `@kitn.ai/ui`. It is packaging and tooling on
5
- top of the library, not part of it — `grep -rn "agent-tooling"
6
- packages/ui/src/components packages/ui/src/elements` returns no imports (only
7
- a code comment and a test's `UNSCANNED_DIRS` entry mention the directory by
8
- name). Nothing a consumer's chat UI renders depends on anything in here.
9
-
10
- ## The four parts
11
-
12
- ```
13
- ┌─────────────────────────┐
14
- │ kai MCP server (mcp/) │
15
- │ construct · scaffold · │
16
- │ reference · theme · │
17
- │ debug │
18
- └───────┬─────────┬────────┘
19
- consumes consumes
20
- │ │
21
- ▼ ▼
22
- ┌────────────────┐ ┌──────────────────┐
23
- │ construct/ │ │ catalog/ │
24
- │ (schema→codegen │ │ (invariants, │
25
- │ →cli engine) │ │ surfaces, │
26
- └────────▲────────┘ │ fabrications, …) │
27
- │ └───────────────────┘
28
- standalone,
29
- no MCP involved
30
-
31
- ┌────────┴────────┐
32
- │ bin/mcp.js CLI │
33
- │ validate/dev/ │
34
- │ compile/eject │
35
- └──────────────────┘
36
- ```
37
-
38
- - **`mcp/`** — the `kai` MCP server. The tools in `mcp/tools/`:
39
- - `construct.ts` — turn-by-turn authoring of a construct JSON file (one
40
- JSON file → one web component); stateless, the harness owns the file.
41
- - `scaffold.ts` — generates a full chat integration (framework + backend
42
- route + integration wiring) from `agent-tooling/registry.ts` and
43
- `agent-tooling/archetypes.ts` (backed by `agent-tooling/integrations/`).
44
- - `reference.ts` — component/element/card lookup for an agent deciding what
45
- to use.
46
- - `theme.ts` — produces a `--kai-*` CSS token override block from a brand
47
- color or description, resolved against the kit's own `theme.css`.
48
- - `debug.ts` — diagnoses common `kai-*` integration failures from a
49
- symptom/snippet, sourced from `apps/docs/src/content/docs/guides/for-ai-agents.mdx`.
50
- - **`construct/`** — the construct engine: a declarative JSON format compiled
51
- to a self-registering web component. Pipeline is `schema.ts` (Zod, single
52
- source of truth) → `codegen.ts` (the one generation path — `kai dev`,
53
- `kai compile`, and `kai eject` all call the same `generateProject`) →
54
- `cli.ts` (the `validate | eject | dev | compile` subcommands). Fixtures
55
- live in `construct/fixtures/` (`demo-widget`, `ops-console`,
56
- `owner-widget`). The published JSON Schema artifact is
57
- `construct/construct.v1.schema.json`, mirrored byte-identical at
58
- `apps/docs/public/schemas/construct/v1.json`; both are guarded against
59
- drift from the Zod source by `construct/schema-artifact.test.ts` (asserts
60
- the checked-in artifact equals `z.toJSONSchema(ConstructSchema)` right now)
61
- and regenerated by `scripts/gen-construct-schema.mjs` via `build:api`.
62
- - **`catalog/`** — Zod-typed reference data, mostly independent of the
63
- construct engine, each file feeding a specific consumer:
64
- - `catalog-types.ts` — the shared Zod types (`SurfaceArchetype`,
65
- `DeliveryTarget`, `WireReader`, `Backend`, …) the rest of the catalog is
66
- built from.
67
- - `invariants.ts` — the composition invariants an agent must hold, each
68
- with an `enforcedBy` path and a `lint` script name; feeds
69
- `invariants.test.ts` and the acceptance harness.
70
- - `surfaces.ts` — the sorted inventory of product-shaped surfaces vs.
71
- ingredients vs. corpus; feeds `surfaces.test.ts` and `derived.json`.
72
- - `fabrications.ts` — tags agents have invented while working from an
73
- acceptance pack (and what they should have used instead); renders the
74
- pack's `FABRICATED.md`, checked against `derived.json` in both directions
75
- by `fabrications.test.ts`.
76
- - `scenarios.ts` — the acceptance deck (spec §6): prompts + what each
77
- needs, written before the catalog it measures.
78
- - `labs-titles.ts` — parses the real `Labs/…` story titles registered by
79
- story files (TypeScript AST, not a regex), used to keep the catalog's
80
- story inventory honest.
81
- - `derived.json` — generated inventory of elements/props read by
82
- `catalog-types.ts`, `fabrications.ts`, and `surfaces.ts` (and their
83
- tests) rather than by anything outside the catalog.
84
- - `catalog/README.md` — the catalog's own deeper documentation.
85
-
86
- How they relate: the MCP's `construct` and `scaffold` tools **consume** the
87
- construct engine and the catalogs — they don't reimplement authoring logic,
88
- they call into `construct/schema.ts` / `construct/codegen.ts` and read the
89
- registry/catalog data. The construct CLI (`bin/mcp.js validate|dev|compile|eject`,
90
- built from `construct/cli-entry.ts` → `dist/construct-cli.es.js`) runs the
91
- engine standalone, with no MCP server involved at all.
92
-
93
- ## Usage
94
-
95
- - **`npx @kitn.ai/ui mcp`** starts the MCP server (the historical default
96
- subcommand). For wiring it into a multi-harness setup, see the docs site's
97
- agents guide: `apps/docs/src/content/docs/guides/for-ai-agents.mdx`.
98
- - **CLI form**, no MCP: `node bin/mcp.js validate|dev|compile|eject <construct.json>`
99
- (`bin/mcp.js` dispatches `dev`/`compile`/`eject`/`validate` to the construct
100
- CLI and anything else, including `mcp` or no argument, to the MCP server;
101
- an unrecognized subcommand is a loud error, not a silent fallthrough).
102
- `eject` writes a real Solid project you own; `dev` gives a live-reload
103
- preview; `compile` emits one self-registering `.js`.
104
- - **Acceptance harness** (`packages/ui/scripts/acceptance-*.mjs`:
105
- `acceptance-pack.mjs`, `acceptance-run.mjs`, `acceptance-eval.mjs`,
106
- `acceptance-gate-compiles.mjs`) — builds and grades a coding agent's
107
- from-scratch attempt at using the catalog with no kit source, per the
108
- scenarios in `catalog/scenarios.ts`; this is how the catalog's own claims
109
- get checked against a real agent rather than asserted.
110
-
111
- ## Worked example
112
-
113
- `construct/fixtures/owner-widget.construct.json`, field by field:
114
-
115
- - `"$schema"` — points at the published schema URL for editor validation.
116
- - `"name": "acme-support"` — the construct's name; also the emitted custom
117
- element's tag basis.
118
- - `"layout": "widget"` — a floating launcher widget, not full-screen or docked.
119
- - `"provider": { "mode": "mock" }` — no backend; canned responses (vs.
120
- `mode: "endpoint"`, the consumer's own chat route).
121
- - `"userId": "user_123"` — the identity value threaded through for
122
- history/persistence.
123
- - `"header": { "title": "Acme Support" }` — the chat header's title text.
124
- - `"theme": { "unreadColor": "#38BDF8" }` — one branded token override.
125
- - `"empty": { "title": ..., "description": ... }` — the empty-state copy
126
- shown before the first message.
127
- - `"widget": { "position": "top-start", "defaultOpen": true }` — widget-layout
128
- placement and initial open state.
129
- - `"capabilities.attachments.accept"` — allowed MIME patterns for uploads.
130
- - `"capabilities.history.persistence": "local"` — history persisted in the
131
- browser, not the consumer's backend.
132
- - `"capabilities.starters"` — suggested first prompts.
133
- - `"capabilities.reasoningOpen": true` — reasoning panels start expanded.
134
- - `"capabilities.conversations": true` — enables the conversations sidebar.
135
-
136
- `codegen.ts` turns this into a small, deterministic (no dates, no randomness,
137
- fixed key order) Solid project: pure Solid interior composing
138
- `@kitn.ai/ui/solid` components, provider glue built on `@kitn.ai/ui/state` +
139
- `@kitn.ai/ui/wire` (never a hand-rolled SSE reader), and one
140
- `defineWebComponent` facade carrying the tag, theme default, and slots. The
141
- facade injects the kit's compiled CSS into the shadow root, so the generated
142
- project needs no Tailwind and no CSS build step. `kai dev`, `kai compile`,
143
- and `kai eject` all go through this same generation path — the preview is
144
- the artifact, there is no separate interpreter to drift from it.
145
-
146
- ## Rules that bind changes here
147
-
148
- - **Vocabulary never logic** — the construct format has no handlers and no
149
- expressions; it describes, it doesn't script. `schema.ts` is `.strict()`
150
- everywhere, so an unknown key is a loud rejection.
151
- - **Widen, never restructure `schema.ts`** — it's the single source of truth;
152
- never hand-edit the generated JSON Schema artifacts or restate an enum
153
- elsewhere, read it off `ConstructSchema.shape` or the generated artifact.
154
- - **Derive, don't type** — the published schema artifact is generated from
155
- Zod (`scripts/gen-construct-schema.mjs`, run by `build:api`) and pinned by
156
- `construct/schema-artifact.test.ts`; `verify:construct`'s layout and
157
- capability axes are read off that same drift-guarded artifact rather than
158
- hand-listed, so adding a layout or capability to the Zod schema moves what
159
- the gate covers on its own.
160
- - **`verify:construct`** (`scripts/verify-construct.mjs`) drives the real CLI
161
- end to end against this checkout's own packed tarball — eject, install,
162
- compile under the emitted tsconfig, build, and bundle inside a real
163
- consumer app — for every layout/capability combination the schema
164
- currently declares. No unit test in this tree leaves the process; this is
165
- the one that does.
166
- - **`verify:scaffold`** (`scripts/verify-scaffold-compiles.mjs`) compiles the
167
- scaffolder's emitted front ends and backend routes under `tsc --strict`
168
- across the integration × surface × framework axes derived from the
169
- registry, plus structural checks (e.g. the Solid emit branches on every
170
- `MessagePart` variant).
171
- - **`verify:generated`** (`scripts/verify-generated-sync.mjs`) re-runs
172
- `build:api` and fails if any derived artifact in the tree (including
173
- catalog/manifest files this directory reads) differs from what the
174
- generator produces right now — catches drift `nx build ui`'s NX cache can
175
- hide.
176
- - **The schema-artifact test pair** (`construct/schema-artifact.test.ts`)
177
- catches a `schema.ts` edit that shipped without a regen, in the unit suite
178
- itself rather than only in CI's `verify:generated`.
179
-
180
- ## Where deeper docs live
181
-
182
- - Repo root [`CLAUDE.md`](../../../../CLAUDE.md)'s **Map** section for how
183
- this directory sits relative to `primitives/`, `ui/`, `components/`, and
184
- `elements/`.
185
- - [`.claude/README.md`](../../../../.claude/README.md) for the project-local
186
- skills/agents that exercise this tooling (notably `/consumer-regression`).
187
- - The docs site's agents guide,
188
- `apps/docs/src/content/docs/guides/for-ai-agents.mdx` — the rules
189
- `debug.ts` and the MCP's contract enforcement are sourced from.
190
- - `docs/superpowers/specs/2026-08-25-construct-engine-design.md` — the
191
- construct engine's design spec (decisions ledger, format rules, success
192
- criteria).
@@ -1,205 +0,0 @@
1
- import type { Archetype } from './types';
2
-
3
- /**
4
- * The archetypes are PRESETS over a components list, not the surface axis.
5
- *
6
- * `renderSurface({ framework, components, integration })` renders any components
7
- * list; each entry below is a named point in that space plus a default placement.
8
- * Read the table as "components + placement" and the CLI's feature multi-select
9
- * falls out of it: placement is the layout question, `components` is the features.
10
- *
11
- * Adding an entry here adds a PRESET. It does not add a capability, and it is not
12
- * how a new component reaches the renderers — that is `components` at the call
13
- * site. See `listCapabilityGroups` below for what this catalog does still decide.
14
- */
15
- export const archetypes: Archetype[] = [
16
- {
17
- id: 'drop-in-chat',
18
- title: 'Drop-in chat',
19
- components: ['kai-chat'],
20
- defaultPlacement: 'full-page',
21
- docsSlug: 'examples/drop-in-chat',
22
- },
23
- {
24
- id: 'support-widget',
25
- title: 'Support widget',
26
- components: ['kai-chat'],
27
- defaultPlacement: 'docked-widget',
28
- docsSlug: 'examples/support-widget',
29
- },
30
- {
31
- id: 'knowledge-base',
32
- title: 'Knowledge base / RAG',
33
- components: ['kai-chat', 'kai-sources'],
34
- defaultPlacement: 'full-page',
35
- docsSlug: 'examples/knowledge-base',
36
- },
37
- {
38
- id: 'agentic',
39
- title: 'Agentic assistant',
40
- components: ['kai-chat', 'kai-tool', 'kai-reasoning'],
41
- defaultPlacement: 'side',
42
- docsSlug: 'examples/agentic-assistant',
43
- },
44
- /**
45
- * THE FIRST OFFICIAL BLOCK (recast spec 2026-08-20 § 3b; F-16).
46
- *
47
- * This preset used to carry `kai-artifact` + `kai-resizable` — an UNWIRED
48
- * artifact split — while omitting the conversation rail, the one thing its
49
- * name promised (rung-3 finding F-16). It now names the workspace BLOCK: the
50
- * chat-agnostic `kai-workspace` layout shell, a WIRED `kai-conversations`
51
- * rail, `kai-chat` in the main region, and the `@kitn.ai/ui/state` thread
52
- * helpers (bindThreadMessages / createThreadSessions / createSaveScheduler /
53
- * parseStoredThread) with the persistence POLICY left in consumer-owned
54
- * lines. `examples/apps/workspace/` is the block's reference implementation.
55
- *
56
- * The artifact split did not vanish — it moved to `artifact-split` below, so
57
- * its renderer branch keeps its cells in `verify:scaffold`.
58
- */
59
- {
60
- id: 'workspace',
61
- title: 'Agentic workspace',
62
- components: ['kai-chat', 'kai-workspace', 'kai-conversations'],
63
- defaultPlacement: 'full-page',
64
- docsSlug: 'examples/workspace',
65
- },
66
- /**
67
- * THE PRESET THAT KEEPS A CAPABILITY ON THE AXIS — the same reason the
68
- * `attachments` preset exists (see its comment below): `listCapabilityGroups`
69
- * derives the gate's surface axis from this table, so when the recast moved
70
- * the artifact pair off `workspace`, this entry is what kept
71
- * `kai-artifact`+`kai-resizable` compiling in `verify:scaffold` instead of
72
- * silently losing every cell. The pair is ONE capability because `isArtifactSplit`
73
- * in scaffold.ts requires both: a split with no preview pane is an empty
74
- * panel, and a preview with no split has nowhere to sit.
75
- */
76
- {
77
- id: 'artifact-split',
78
- title: 'Artifact preview split',
79
- components: ['kai-chat', 'kai-artifact', 'kai-resizable'],
80
- defaultPlacement: 'side',
81
- docsSlug: 'examples/workspace',
82
- },
83
- {
84
- id: 'voice',
85
- title: 'Voice assistant',
86
- components: ['kai-chat', 'kai-voice-input'],
87
- defaultPlacement: 'full-page',
88
- docsSlug: 'examples/voice-assistant',
89
- },
90
- /**
91
- * THE PRESET THAT EXISTS TO MAKE A CAPABILITY REACHABLE, not to name a product
92
- * shape someone asked for.
93
- *
94
- * `kai-file-upload` and `kai-attachments` were registered elements that NO
95
- * preset composed, and `listCapabilityGroups` derives its answer from this
96
- * table — so the attachments capability reached neither `listSurfaceProbes`
97
- * nor `verify:scaffold`, and `renderSurface` had no branch that emitted either
98
- * tag. A caller could pass them in `components` (the axis takes any list) and
99
- * get two bare `<kai-file-upload></kai-file-upload>` / `<kai-attachments>`
100
- * siblings with nothing wired to them: on screen, inert, silent.
101
- *
102
- * The pair is ONE capability for the same reason `kai-artifact` +
103
- * `kai-resizable` are: a dropzone with no list is a black hole, and a list
104
- * with no dropzone can never fill. `hasAttachments` in scaffold.ts requires
105
- * both for exactly that reason.
106
- *
107
- * The components match the create-kai spec's own feature table
108
- * (`attachments` -> `kai-file-upload`, `kai-attachments`), so the CLI's
109
- * multi-select and this preset name the same surface rather than two.
110
- */
111
- {
112
- id: 'attachments',
113
- title: 'File attachments',
114
- components: ['kai-chat', 'kai-file-upload', 'kai-attachments'],
115
- defaultPlacement: 'full-page',
116
- docsSlug: 'examples/attachments',
117
- },
118
- ];
119
-
120
- /** The component every surface composes around, so never a capability by itself. */
121
- export const BASE_COMPONENT = 'kai-chat';
122
-
123
- /** One capability: the components a preset adds on top of `BASE_COMPONENT`. */
124
- export interface CapabilityGroup {
125
- /** derived from the components, e.g. `tool+reasoning` — not a preset name */
126
- id: string;
127
- components: string[];
128
- }
129
-
130
- /**
131
- * The distinct capabilities the presets know about, DERIVED from them.
132
- *
133
- * A capability is one preset's components minus `kai-chat`, deduped across the
134
- * catalog (run `listCapabilityGroups()` for the current list — `drop-in-chat`
135
- * and `support-widget` collapse onto the same empty capability because both add
136
- * nothing and differ only in `defaultPlacement`).
137
- *
138
- * Derived rather than listed for the reason the verify script's other axes are:
139
- * a hand-written list would have to be edited by the same hand that adds a
140
- * preset, so a new capability could land with nothing covering it and nothing
141
- * failing to say so. Registering a preset whose components are new moves the
142
- * cell count in `verify:scaffold` by itself.
143
- *
144
- * The grouping is real and not an artifact of the derivation: `kai-tool` and
145
- * `kai-reasoning` are one capability because a tool panel with no reasoning
146
- * disclosure is not a surface anyone asks for, `kai-artifact` /
147
- * `kai-resizable` are one because `isArtifactSplit` in scaffold.ts only fires when BOTH are present
148
- * — split them and the renderer emits a bare artifact with no pane to put it in
149
- * — and `kai-file-upload` / `kai-attachments` are one because `hasAttachments`
150
- * fires the same way, for the same kind of reason.
151
- */
152
- export function listCapabilityGroups(): CapabilityGroup[] {
153
- const seen = new Map<string, CapabilityGroup>();
154
- for (const a of archetypes) {
155
- const components = a.components.filter((c) => c !== BASE_COMPONENT);
156
- if (components.length === 0) continue;
157
- const key = [...components].sort().join(',');
158
- if (seen.has(key)) continue;
159
- seen.set(key, { id: components.map((c) => c.replace(/^kai-/, '')).join('+'), components });
160
- }
161
- return [...seen.values()];
162
- }
163
-
164
- /** One surface the scaffolder's gate compiles across every integration × framework. */
165
- export interface SurfaceProbe {
166
- id: string;
167
- components: string[];
168
- }
169
-
170
- /**
171
- * The surface axis for `verify:scaffold`: each capability ALONE, plus none, plus
172
- * ALL of them.
173
- *
174
- * WHY THESE AND NOT THE PRESETS. The presets are seven cells covering six
175
- * distinct components lists (`support-widget` repeats `drop-in-chat`'s, and the
176
- * matrix holds `placement` at one value, so that pair compiled the same types
177
- * twice). More importantly they cover no combination at all — every preset is
178
- * exactly one capability — so the surfaces the multi-select makes reachable,
179
- * which is most of them, had nothing compiling them.
180
- *
181
- * WHY NOT THE POWER SET. 2^groups x integrations x frameworks is thousands of
182
- * cells to exercise no new branch. The renderers compose capabilities
183
- * INDEPENDENTLY: each companion tag is emitted on its own terms, and the
184
- * multi-component predicates (`isArtifactSplit`, `isWorkspaceBlock`) each read
185
- * components from within a single group. So
186
- * "every capability alone" reaches every branch, and "all capabilities together"
187
- * makes every PAIR of capabilities co-occur, which is what proves they compose.
188
- *
189
- * THE LIMIT, STATED: a defect needing exactly two capabilities and masked by a
190
- * third would survive this. That is a real gap and the honest reason it is
191
- * accepted is cost, not safety — no such branch exists in the renderers today,
192
- * and `assertSurfacesAreDistinct` fails if the axis ever degenerates so that this
193
- * reasoning is quietly checking less than it claims.
194
- */
195
- export function listSurfaceProbes(): SurfaceProbe[] {
196
- const groups = listCapabilityGroups();
197
- return [
198
- { id: 'chat-only', components: [BASE_COMPONENT] },
199
- ...groups.map((g) => ({ id: g.id, components: [BASE_COMPONENT, ...g.components] })),
200
- {
201
- id: 'every-capability',
202
- components: [BASE_COMPONENT, ...groups.flatMap((g) => g.components)],
203
- },
204
- ];
205
- }