@kitn.ai/ui 0.28.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (615) hide show
  1. package/README.md +11 -7
  2. package/dist/{Icon-DObhsRtm.js → Icon-BzBET3E-.js} +1 -1
  3. package/dist/{action-icons-CcgNN2oT.js → action-icons-DaW2pU6m.js} +1 -1
  4. package/dist/agent-tooling/construct/public.d.ts +15 -0
  5. package/dist/agent-tooling/construct/schema.d.ts +111 -0
  6. package/dist/arrow-down-D783iMJj.js +1 -0
  7. package/dist/arrow-left-0VLM5kyg.js +1 -0
  8. package/dist/artifact-DGjzHYUT.js +1 -0
  9. package/dist/{attachments-Qr4kg-2b.js → attachments-YvXHlg88.js} +1 -1
  10. package/dist/{audio-visualizer-DToYdfSc.js → audio-visualizer-9lz5IHsL.js} +1 -1
  11. package/dist/{badge-CdEu_jn2.js → badge-Dh_vp8A5.js} +1 -1
  12. package/dist/{bell-DQAAOpDz.js → bell-CT7_WUwS.js} +1 -1
  13. package/dist/{button-DkuOnGLy.js → button-C_3te6fm.js} +1 -1
  14. package/dist/{card-renderer-Jx70m6_l.js → card-renderer-DZVaGH2e.js} +1 -1
  15. package/dist/check-CiEOVnEN.js +1 -0
  16. package/dist/{checkbox-D7iRB3nL.js → checkbox-Bu2T2e0U.js} +1 -1
  17. package/dist/{checkbox-group-B2_rpoPM.js → checkbox-group-BiryEXPQ.js} +1 -1
  18. package/dist/chevron-down-CSobuZRG.js +1 -0
  19. package/dist/chevron-right-DR9ZAP-2.js +1 -0
  20. package/dist/{choice-card-m0BYqqOK.js → choice-card-CM6IjkmL.js} +1 -1
  21. package/dist/circle-BC66EYF7.js +1 -0
  22. package/dist/circle-check-BqmahW0O.js +1 -0
  23. package/dist/{circle-x-BPG0iPst.js → circle-x-Bk-dA5Wf.js} +1 -1
  24. package/dist/{code-block-ClMLKb7C.js → code-block-B26t-Q7q.js} +1 -1
  25. package/dist/{collapsible-B4DlWicL.js → collapsible-Bhc636Cf.js} +1 -1
  26. package/dist/components/builder-composer-triggers.d.ts +62 -0
  27. package/dist/components/builder-layout.d.ts +54 -0
  28. package/dist/components/builder-message-actions.d.ts +72 -0
  29. package/dist/components/builder-panel.d.ts +189 -0
  30. package/dist/components/builder-preview.d.ts +11 -0
  31. package/dist/components/builder-shell-controls.d.ts +69 -0
  32. package/dist/components/builder-skeleton.d.ts +58 -0
  33. package/dist/components/builder-start.d.ts +75 -0
  34. package/dist/components/builder-workspace-variants.d.ts +23 -0
  35. package/dist/components/captions.d.ts +66 -0
  36. package/dist/{composer-sQ0HcvyG.js → composer-DMI85B6j.js} +1 -1
  37. package/dist/{confirm-card-rQWDQsnC.js → confirm-card-B0YIAwXp.js} +1 -1
  38. package/dist/construct-cli.es.js +3 -3
  39. package/dist/construct.d.ts +5 -0
  40. package/dist/construct.js +327 -0
  41. package/dist/{context-0kg4ZX1J.js → context-DWgfhqWp.js} +1 -1
  42. package/dist/controllable-BagRpyHv.js +1 -0
  43. package/dist/{conversation-item-BxwQLaFJ.js → conversation-item-BsOsVGmT.js} +1 -1
  44. package/dist/{conversation-list-BCfGN1JU.js → conversation-list-aX3Vtc7L.js} +1 -1
  45. package/dist/{copy-n9u9rqpi.js → copy-BmEwsNhJ.js} +1 -1
  46. package/dist/core-C8fzo39E.js +1 -12
  47. package/dist/{create-tween-uPkArjIG.js → create-tween-CNOAU3Fx.js} +1 -1
  48. package/dist/{create-tween-C-q-JCM-.js → create-tween-WfqiENls.js} +1 -1
  49. package/dist/{create-tween-CRrJXxBd.js → create-tween-wlFtW9Kh.js} +1 -1
  50. package/dist/{create-tween-DZ3RRDHD.js → create-tween-zt79ba32.js} +1 -1
  51. package/dist/{default-input-CaMrJkgH.js → default-input-DMV5Eaze.js} +1 -1
  52. package/dist/define-CI0y3eE4.js +1 -0
  53. package/dist/define.js +40 -40
  54. package/dist/define.server.js +45 -45
  55. package/dist/{disclosure-WUImBbDv.js → disclosure-NnACBxsC.js} +1 -1
  56. package/dist/{dropdown-wZVeJOMd.js → dropdown-DT7G0RGR.js} +1 -1
  57. package/dist/elements/agent-card.js +1 -1
  58. package/dist/elements/artifact.js +1 -1
  59. package/dist/elements/attachments.js +1 -1
  60. package/dist/elements/audio-visualizer.js +1 -1
  61. package/dist/elements/avatar.js +1 -1
  62. package/dist/elements/badge.js +1 -1
  63. package/dist/elements/button.js +1 -1
  64. package/dist/elements/card.js +1 -1
  65. package/dist/elements/cards.js +1 -1
  66. package/dist/elements/chain-of-thought.js +1 -1
  67. package/dist/elements/chat-scope-picker.js +1 -1
  68. package/dist/elements/chat-workspace.js +1 -1
  69. package/dist/elements/chat.js +1 -1
  70. package/dist/elements/checkbox-group.js +1 -1
  71. package/dist/elements/checkbox.js +1 -1
  72. package/dist/elements/checkpoint.js +1 -1
  73. package/dist/elements/choice.js +1 -1
  74. package/dist/elements/coachmark.js +1 -1
  75. package/dist/elements/code-block.js +1 -1
  76. package/dist/elements/command.js +1 -1
  77. package/dist/elements/compare.js +1 -1
  78. package/dist/elements/composer.js +1 -1
  79. package/dist/elements/confirm-card.js +1 -1
  80. package/dist/elements/context-meter.js +1 -1
  81. package/dist/elements/conversation-item.js +1 -1
  82. package/dist/elements/conversation-list.js +1 -1
  83. package/dist/elements/dialog.js +1 -1
  84. package/dist/elements/dock.js +1 -1
  85. package/dist/elements/dropdown.js +1 -1
  86. package/dist/elements/editable-label.js +1 -1
  87. package/dist/elements/embed.js +1 -1
  88. package/dist/elements/empty.js +1 -1
  89. package/dist/elements/feedback-bar.js +1 -1
  90. package/dist/elements/file-tree.js +1 -1
  91. package/dist/elements/file-upload.js +1 -1
  92. package/dist/elements/form.js +1 -1
  93. package/dist/elements/hover-card.js +1 -1
  94. package/dist/elements/icon.js +1 -1
  95. package/dist/elements/image.js +1 -1
  96. package/dist/elements/input.js +1 -1
  97. package/dist/elements/kbd.js +1 -1
  98. package/dist/elements/link-preview.js +1 -1
  99. package/dist/elements/loader.js +1 -1
  100. package/dist/elements/markdown.js +1 -1
  101. package/dist/elements/menu.js +1 -1
  102. package/dist/elements/message-skills.js +1 -1
  103. package/dist/elements/message.js +1 -1
  104. package/dist/elements/model-switcher.js +1 -1
  105. package/dist/elements/nav.js +1 -1
  106. package/dist/elements/notice.js +1 -1
  107. package/dist/elements/pane-grid.js +1 -1
  108. package/dist/elements/pane-group.js +1 -1
  109. package/dist/elements/pane.js +1 -1
  110. package/dist/elements/popover.js +1 -1
  111. package/dist/elements/progress-bar.js +1 -1
  112. package/dist/elements/prompt-dock.js +1 -1
  113. package/dist/elements/prompt-input.js +1 -1
  114. package/dist/elements/prompt-suggestions.js +1 -1
  115. package/dist/elements/radio-group.js +1 -1
  116. package/dist/elements/reasoning.js +1 -1
  117. package/dist/elements/remote.js +1 -1
  118. package/dist/elements/resizable.js +1 -1
  119. package/dist/elements/response-stream.js +1 -1
  120. package/dist/elements/screen.js +1 -1
  121. package/dist/elements/scroll-area.js +1 -1
  122. package/dist/elements/scroll-button.js +1 -1
  123. package/dist/elements/search.js +1 -1
  124. package/dist/elements/segmented.js +1 -1
  125. package/dist/elements/select.js +1 -1
  126. package/dist/elements/separator.js +1 -1
  127. package/dist/elements/setting-item.js +1 -1
  128. package/dist/elements/settings-group.js +1 -1
  129. package/dist/elements/skeleton.js +1 -1
  130. package/dist/elements/slider.js +1 -1
  131. package/dist/elements/source.js +1 -1
  132. package/dist/elements/status.js +1 -1
  133. package/dist/elements/switch.js +1 -1
  134. package/dist/elements/tabs.js +1 -1
  135. package/dist/elements/tasks.js +1 -1
  136. package/dist/elements/text-shimmer.js +1 -1
  137. package/dist/elements/thinking-bar.js +1 -1
  138. package/dist/elements/thread.js +1 -1
  139. package/dist/elements/toast.js +1 -1
  140. package/dist/elements/tool.js +1 -1
  141. package/dist/elements/tooltip.js +1 -1
  142. package/dist/elements/voice-input.js +1 -1
  143. package/dist/elements/voice-output.js +1 -1
  144. package/dist/{ellipsis-CbOpJnU3.js → ellipsis-6pJ7SxYT.js} +1 -1
  145. package/dist/{embed-CrfjkbUG.js → embed-BMje-nxj.js} +1 -1
  146. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  147. package/dist/{external-link-ByXAwBBQ.js → external-link-Beh9DKeR.js} +1 -1
  148. package/dist/{file-text-DMib2qwt.js → file-text-D1GPfZ8Q.js} +1 -1
  149. package/dist/{file-tree-CJqM2aP7.js → file-tree-Dwj2lqg-.js} +1 -1
  150. package/dist/{folder-_BAb929C.js → folder-b6D8x1DY.js} +1 -1
  151. package/dist/{form-DSZgZQZk.js → form-DWgdxDXu.js} +1 -1
  152. package/dist/{hover-card-BQbul9eq.js → hover-card-CWRkqm40.js} +1 -1
  153. package/dist/{icon-CdcfRhYI.js → icon-CL0jdhsf.js} +1 -1
  154. package/dist/index.js +1741 -1725
  155. package/dist/index.server.js +1582 -1566
  156. package/dist/{info-DsFjGuI_.js → info-0cOUherQ.js} +1 -1
  157. package/dist/{input-DKbmkMos.js → input-BH6Ru91Q.js} +1 -1
  158. package/dist/kai.es.js +1 -1
  159. package/dist/{kbd-PvdGhX4s.js → kbd-DRAnVtNX.js} +1 -1
  160. package/dist/{link-zF8PzWfF.js → link-Dlr0vssB.js} +1 -1
  161. package/dist/{link-preview-DbM1866N.js → link-preview-DODgRyV9.js} +1 -1
  162. package/dist/loader-KvJB6NrT.js +1 -0
  163. package/dist/{markdown-LMvmAyBk.js → markdown-DX9tuJVj.js} +1 -1
  164. package/dist/mcp.es.js +9 -5
  165. package/dist/{message-BYZECyek.js → message-BqQ7Ot5q.js} +1 -1
  166. package/dist/{message-BSsgvHvf.js → message-DkaGfBd8.js} +1 -1
  167. package/dist/message-circle-BPpp5QKv.js +1 -0
  168. package/dist/message-square-BLbsd9BJ.js +1 -0
  169. package/dist/{minimize-2-BQRoBV1V.js → minimize-2-CyOHJwcN.js} +1 -1
  170. package/dist/{model-switcher-CMpCOYcB.js → model-switcher-0hrKDiK2.js} +1 -1
  171. package/dist/{overlay-Cb-MkyDa.js → overlay-DBMFXie6.js} +1 -1
  172. package/dist/{panel-right-i8warFxT.js → panel-right-t8SWJL6e.js} +1 -1
  173. package/dist/{paperclip-ByY3UVO6.js → paperclip-CdzuOjbU.js} +1 -1
  174. package/dist/play-BXy1u7rW.js +1 -0
  175. package/dist/primitives/use-auto-resize.d.ts +11 -0
  176. package/dist/{progress-bar-jVAHvMUf.js → progress-bar-CiBtxMWT.js} +1 -1
  177. package/dist/{prompt-suggestion-CD-qtNgC.js → prompt-suggestion-I_DHP21i.js} +1 -1
  178. package/dist/{radio-BsoBMhkF.js → radio-C_p3n39l.js} +1 -1
  179. package/dist/{reasoning-4kBPtlTx.js → reasoning-BDwy_tIe.js} +1 -1
  180. package/dist/register-impl-DvEnhIxx.js +424 -0
  181. package/dist/{resizable-uPmY9VY-.js → resizable-SYC-fStM.js} +1 -1
  182. package/dist/{rotate-ccw-B2xn93py.js → rotate-ccw-B1nwmwuY.js} +1 -1
  183. package/dist/{rotate-cw-CMVLoCyH.js → rotate-cw-CLAnBcm1.js} +1 -1
  184. package/dist/{scroll-area-BqLUo8ZZ.js → scroll-area-zRyXoLhI.js} +1 -1
  185. package/dist/{scroll-button-DslXiJyL.js → scroll-button-jzrbYCG9.js} +1 -1
  186. package/dist/{select-2cLRtPGT.js → select-DM-0nEe0.js} +1 -1
  187. package/dist/{separator-BWQtNJcM.js → separator-BToOOoOt.js} +1 -1
  188. package/dist/{settings-BBR63jLg.js → settings-PaGo_S4U.js} +1 -1
  189. package/dist/{settings-group-B2ciy-Iw.js → settings-group-BFXGIfXq.js} +1 -1
  190. package/dist/{skeleton-CkHI-HgC.js → skeleton-DYpmFnnm.js} +1 -1
  191. package/dist/{slider-DDR9U-i0.js → slider-ebutAmkQ.js} +1 -1
  192. package/dist/{solid-DruVOXnf.js → solid-15v_3WVL.js} +3563 -3412
  193. package/dist/{solid-BzCFdL25.js → solid-5P-otgdi.js} +4502 -4296
  194. package/dist/solid.d.ts +6 -0
  195. package/dist/solid.js +259 -254
  196. package/dist/solid.server.js +259 -254
  197. package/dist/{source-GEnFF528.js → source-c1gpRl9h.js} +1 -1
  198. package/dist/{star-CilHq8GP.js → star-pcV_3LqF.js} +1 -1
  199. package/dist/{store-Ciyk6eZG.js → store-CSgbFFCg.js} +1 -1
  200. package/dist/{switch-KkeQIbuH.js → switch-Bh2OdLV2.js} +1 -1
  201. package/dist/{tasks-card-BrN4bggJ.js → tasks-card-CbqQAn2S.js} +1 -1
  202. package/dist/text-shimmer-BSzgEnDH.js +1 -0
  203. package/dist/textarea-DrYNt_0z.js +1 -0
  204. package/dist/theme.tokens.css +22 -21
  205. package/dist/{thumbs-up-CsT9Wzb9.js → thumbs-up-BL3-NenK.js} +1 -1
  206. package/dist/{toast-store-tgK6MuMv.js → toast-store-DkOlYczt.js} +1 -1
  207. package/dist/{tool-DzUjIBT8.js → tool-CeIWUVUe.js} +1 -1
  208. package/dist/{tooltip-Bkkg_4t0.js → tooltip-GA-nmg06.js} +1 -1
  209. package/dist/{trash-2-jBKxjGGQ.js → trash-2-CT66QWlm.js} +1 -1
  210. package/dist/{triangle-alert-DlQ68ppf.js → triangle-alert-CeHLWxhD.js} +1 -1
  211. package/dist/ui/color-field.d.ts +48 -0
  212. package/dist/ui/textarea.d.ts +4 -0
  213. package/dist/ui/toggle-chip.d.ts +40 -0
  214. package/dist/{upload-TcAHXv9W.js → upload-9Csb0F0J.js} +1 -1
  215. package/dist/{use-card-resolution-DaZqAdWf.js → use-card-resolution-Zg0a08Z-.js} +1 -1
  216. package/dist/{variant-aurora-DbW_OWL2.js → variant-aurora-4VBQHIKV.js} +1 -1
  217. package/dist/{variant-aurora-CNmfHhcx.js → variant-aurora-DBeCAQNk.js} +2 -2
  218. package/dist/{variant-aurora-D6GsdTPA.js → variant-aurora-FzHVXHby.js} +2 -2
  219. package/dist/{variant-aurora-BhLuYxJR.js → variant-aurora-LE3fqxgw.js} +1 -1
  220. package/dist/{variant-custom-BvYHR62b.js → variant-custom-AFRGcOBS.js} +1 -1
  221. package/dist/{variant-custom-DV2x254s.js → variant-custom-BQkNuPpE.js} +2 -2
  222. package/dist/{variant-custom-BRvaNHSi.js → variant-custom-DI5R0rln.js} +1 -1
  223. package/dist/{variant-custom-DMTrEO5w.js → variant-custom-WWnrrRHS.js} +2 -2
  224. package/dist/{variant-wave-CyBueXj9.js → variant-wave-DUCbH5oI.js} +2 -2
  225. package/dist/{variant-wave-BNMGrDfj.js → variant-wave-DuQV7DhQ.js} +2 -2
  226. package/dist/{variant-wave-BpDd8t3Z.js → variant-wave-nSI2sfII.js} +1 -1
  227. package/dist/{variant-wave-sp-qwsdI.js → variant-wave-wTP5v_jU.js} +1 -1
  228. package/dist/x-eiO9V6J6.js +1 -0
  229. package/{src/elements/styles.css → kit-base.css} +27 -44
  230. package/package.json +32 -17
  231. package/solid.css +33 -0
  232. package/theme.css +39 -23
  233. package/bin/route.test.js +0 -58
  234. package/dist/arrow-down-CjRU3JgV.js +0 -1
  235. package/dist/arrow-left-Bnpb1UEW.js +0 -1
  236. package/dist/artifact-Bwt7OgcR.js +0 -1
  237. package/dist/check-njkVdZu2.js +0 -1
  238. package/dist/chevron-down-B72s6PXR.js +0 -1
  239. package/dist/chevron-right-BatuHzUm.js +0 -1
  240. package/dist/circle-check-B62pODB3.js +0 -1
  241. package/dist/circle-zx0ByzY9.js +0 -1
  242. package/dist/controllable-CnGpMF6r.js +0 -1
  243. package/dist/define-By-uL588.js +0 -1
  244. package/dist/loader-BM4CEz4G.js +0 -1
  245. package/dist/message-circle-DruwObfX.js +0 -1
  246. package/dist/message-square-BG6q6mlm.js +0 -1
  247. package/dist/play-BvKKq3fX.js +0 -1
  248. package/dist/register-impl-B1hLkrI8.js +0 -424
  249. package/dist/text-shimmer-Dcj1MHuq.js +0 -1
  250. package/dist/textarea-Dpvbngbg.js +0 -1
  251. package/dist/x-Z5UntkIJ.js +0 -1
  252. package/src/agent-tooling/README.md +0 -192
  253. package/src/agent-tooling/archetypes.ts +0 -205
  254. package/src/agent-tooling/catalog/README.md +0 -676
  255. package/src/agent-tooling/catalog/catalog-types.ts +0 -231
  256. package/src/agent-tooling/catalog/fabrications.ts +0 -96
  257. package/src/agent-tooling/catalog/invariants.ts +0 -284
  258. package/src/agent-tooling/catalog/labs-titles.ts +0 -114
  259. package/src/agent-tooling/catalog/scenarios.ts +0 -87
  260. package/src/agent-tooling/catalog/surfaces.ts +0 -347
  261. package/src/agent-tooling/construct/cli-entry.ts +0 -8
  262. package/src/agent-tooling/construct/cli.ts +0 -147
  263. package/src/agent-tooling/construct/codegen.ts +0 -1635
  264. package/src/agent-tooling/construct/construct.v1.schema.json +0 -319
  265. package/src/agent-tooling/construct/dev.ts +0 -148
  266. package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
  267. package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
  268. package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -32
  269. package/src/agent-tooling/construct/schema.ts +0 -452
  270. package/src/agent-tooling/integrations/anthropic.ts +0 -442
  271. package/src/agent-tooling/integrations/cloudflare.ts +0 -218
  272. package/src/agent-tooling/integrations/langgraph.ts +0 -133
  273. package/src/agent-tooling/integrations/mastra.ts +0 -182
  274. package/src/agent-tooling/integrations/mock.ts +0 -148
  275. package/src/agent-tooling/integrations/ollama.ts +0 -97
  276. package/src/agent-tooling/integrations/openai.ts +0 -95
  277. package/src/agent-tooling/integrations/openrouter.ts +0 -82
  278. package/src/agent-tooling/integrations/pi.ts +0 -176
  279. package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
  280. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
  281. package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
  282. package/src/agent-tooling/mcp/manifest.ts +0 -422
  283. package/src/agent-tooling/mcp/server.ts +0 -116
  284. package/src/agent-tooling/mcp/stdio.ts +0 -18
  285. package/src/agent-tooling/mcp/tools/construct.ts +0 -130
  286. package/src/agent-tooling/mcp/tools/debug.ts +0 -621
  287. package/src/agent-tooling/mcp/tools/reference.ts +0 -980
  288. package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
  289. package/src/agent-tooling/mcp/tools/theme.ts +0 -456
  290. package/src/agent-tooling/mcp/tools/types.ts +0 -14
  291. package/src/agent-tooling/mcp/validate-args.ts +0 -141
  292. package/src/agent-tooling/recipes/composed-thread.ts +0 -714
  293. package/src/agent-tooling/recipes/index.ts +0 -22
  294. package/src/agent-tooling/recipes/types.ts +0 -32
  295. package/src/agent-tooling/registry.ts +0 -132
  296. package/src/agent-tooling/route-emit.ts +0 -305
  297. package/src/agent-tooling/types.ts +0 -390
  298. package/src/components/artifact-card.tsx +0 -120
  299. package/src/components/artifact.tsx +0 -914
  300. package/src/components/attachment-types.ts +0 -66
  301. package/src/components/attachments.tsx +0 -536
  302. package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
  303. package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
  304. package/src/components/audio-visualizer/fit-scale.ts +0 -112
  305. package/src/components/audio-visualizer/index.tsx +0 -528
  306. package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
  307. package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
  308. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
  309. package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
  310. package/src/components/audio-visualizer/sizes.ts +0 -54
  311. package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
  312. package/src/components/audio-visualizer/variant-bar.tsx +0 -175
  313. package/src/components/audio-visualizer/variant-custom.tsx +0 -344
  314. package/src/components/audio-visualizer/variant-grid.tsx +0 -175
  315. package/src/components/audio-visualizer/variant-radial.tsx +0 -163
  316. package/src/components/audio-visualizer/variant-wave.tsx +0 -130
  317. package/src/components/audio-visualizer/wave.glsl.ts +0 -130
  318. package/src/components/card-fallback.tsx +0 -60
  319. package/src/components/card-renderer.tsx +0 -220
  320. package/src/components/card.tsx +0 -212
  321. package/src/components/chain-of-thought.tsx +0 -348
  322. package/src/components/chat-container.tsx +0 -89
  323. package/src/components/chat-scope-picker.tsx +0 -57
  324. package/src/components/chat-thread.tsx +0 -1014
  325. package/src/components/checkpoint.tsx +0 -88
  326. package/src/components/choice-card.tsx +0 -743
  327. package/src/components/coachmark.tsx +0 -249
  328. package/src/components/code-block.tsx +0 -181
  329. package/src/components/composer-dom.ts +0 -159
  330. package/src/components/composer-highlight.ts +0 -242
  331. package/src/components/composer-history.ts +0 -82
  332. package/src/components/composer.tsx +0 -1075
  333. package/src/components/confirm-card.tsx +0 -402
  334. package/src/components/context.tsx +0 -377
  335. package/src/components/conversation-item.tsx +0 -241
  336. package/src/components/conversation-list.tsx +0 -429
  337. package/src/components/conversation-panel.tsx +0 -118
  338. package/src/components/dismissed-stub.tsx +0 -80
  339. package/src/components/embed.tsx +0 -200
  340. package/src/components/empty.tsx +0 -177
  341. package/src/components/feedback-bar.tsx +0 -166
  342. package/src/components/file-tree.tsx +0 -530
  343. package/src/components/file-upload.tsx +0 -167
  344. package/src/components/form-widgets.tsx +0 -525
  345. package/src/components/form.tsx +0 -1296
  346. package/src/components/home-panel.tsx +0 -159
  347. package/src/components/image.tsx +0 -65
  348. package/src/components/link-preview.tsx +0 -195
  349. package/src/components/loader.tsx +0 -367
  350. package/src/components/markdown.tsx +0 -162
  351. package/src/components/message-skills.tsx +0 -40
  352. package/src/components/message.tsx +0 -765
  353. package/src/components/model-switcher.tsx +0 -132
  354. package/src/components/prompt-input.tsx +0 -188
  355. package/src/components/prompt-suggestion.tsx +0 -150
  356. package/src/components/reasoning.tsx +0 -293
  357. package/src/components/response-compare-types.ts +0 -152
  358. package/src/components/response-compare.tsx +0 -455
  359. package/src/components/response-stream.tsx +0 -109
  360. package/src/components/screen.tsx +0 -181
  361. package/src/components/scroll-button.tsx +0 -93
  362. package/src/components/source.tsx +0 -192
  363. package/src/components/tasks-card.tsx +0 -801
  364. package/src/components/text-shimmer.tsx +0 -37
  365. package/src/components/thinking-bar.tsx +0 -50
  366. package/src/components/thread.tsx +0 -228
  367. package/src/components/toast.tsx +0 -503
  368. package/src/components/tool-classify.ts +0 -26
  369. package/src/components/tool-types.ts +0 -49
  370. package/src/components/tool.tsx +0 -190
  371. package/src/components/use-card-resolution.ts +0 -44
  372. package/src/components/voice-input.tsx +0 -222
  373. package/src/components/voice-output.tsx +0 -242
  374. package/src/components/widget-tab-bar.tsx +0 -73
  375. package/src/components/workspace-shell.tsx +0 -285
  376. package/src/diagnostics/hook.ts +0 -352
  377. package/src/diagnostics/index.ts +0 -82
  378. package/src/diagnostics/report-request.ts +0 -296
  379. package/src/elements/agent-card.tsx +0 -67
  380. package/src/elements/artifact.tsx +0 -194
  381. package/src/elements/attachments.tsx +0 -140
  382. package/src/elements/audio-visualizer.tsx +0 -227
  383. package/src/elements/autoloader.ts +0 -89
  384. package/src/elements/avatar.tsx +0 -33
  385. package/src/elements/badge.tsx +0 -32
  386. package/src/elements/button.tsx +0 -149
  387. package/src/elements/card.tsx +0 -133
  388. package/src/elements/cards.tsx +0 -266
  389. package/src/elements/chain-of-thought.tsx +0 -141
  390. package/src/elements/chat-scope-picker.tsx +0 -65
  391. package/src/elements/chat-types.ts +0 -102
  392. package/src/elements/chat-workspace.tsx +0 -188
  393. package/src/elements/chat.tsx +0 -304
  394. package/src/elements/checkbox-group.tsx +0 -164
  395. package/src/elements/checkbox.tsx +0 -134
  396. package/src/elements/checkpoint.tsx +0 -47
  397. package/src/elements/choice.tsx +0 -100
  398. package/src/elements/coachmark.tsx +0 -90
  399. package/src/elements/code-block.tsx +0 -60
  400. package/src/elements/command.tsx +0 -197
  401. package/src/elements/compare.tsx +0 -111
  402. package/src/elements/compiled.css +0 -2
  403. package/src/elements/composer.tsx +0 -162
  404. package/src/elements/confirm-card.tsx +0 -76
  405. package/src/elements/context-meter.tsx +0 -107
  406. package/src/elements/conversation-item.tsx +0 -120
  407. package/src/elements/conversation-list.tsx +0 -203
  408. package/src/elements/css.ts +0 -5
  409. package/src/elements/default-input.tsx +0 -392
  410. package/src/elements/define-entry.ts +0 -12
  411. package/src/elements/define.tsx +0 -563
  412. package/src/elements/diagnostic-events.ts +0 -114
  413. package/src/elements/dialog.tsx +0 -145
  414. package/src/elements/disclosure.ts +0 -95
  415. package/src/elements/dock.tsx +0 -215
  416. package/src/elements/dropdown.tsx +0 -123
  417. package/src/elements/editable-label.tsx +0 -140
  418. package/src/elements/element-data-types.ts +0 -152
  419. package/src/elements/element-diagnostics.ts +0 -392
  420. package/src/elements/element-manifest.json +0 -354
  421. package/src/elements/element-nonscalar.json +0 -187
  422. package/src/elements/element-types.d.ts +0 -4353
  423. package/src/elements/embed.tsx +0 -35
  424. package/src/elements/empty.tsx +0 -29
  425. package/src/elements/feedback-bar.tsx +0 -66
  426. package/src/elements/file-tree.tsx +0 -62
  427. package/src/elements/file-upload.tsx +0 -44
  428. package/src/elements/form.tsx +0 -94
  429. package/src/elements/hover-card.tsx +0 -80
  430. package/src/elements/icon.tsx +0 -41
  431. package/src/elements/image.tsx +0 -32
  432. package/src/elements/input.tsx +0 -492
  433. package/src/elements/kbd.tsx +0 -45
  434. package/src/elements/link-preview.tsx +0 -34
  435. package/src/elements/loader.tsx +0 -25
  436. package/src/elements/markdown.tsx +0 -38
  437. package/src/elements/menu.tsx +0 -241
  438. package/src/elements/message-skills.tsx +0 -83
  439. package/src/elements/message.tsx +0 -361
  440. package/src/elements/model-switcher.tsx +0 -121
  441. package/src/elements/nav.tsx +0 -87
  442. package/src/elements/notice.tsx +0 -53
  443. package/src/elements/pane-grid.tsx +0 -111
  444. package/src/elements/pane-group.tsx +0 -119
  445. package/src/elements/pane.tsx +0 -129
  446. package/src/elements/popover.tsx +0 -81
  447. package/src/elements/progress-bar.tsx +0 -39
  448. package/src/elements/prompt-dock.tsx +0 -82
  449. package/src/elements/prompt-input.tsx +0 -240
  450. package/src/elements/prompt-suggestions.tsx +0 -113
  451. package/src/elements/radio-group.tsx +0 -129
  452. package/src/elements/reasoning.tsx +0 -71
  453. package/src/elements/register-impl.ts +0 -148
  454. package/src/elements/register.ts +0 -76
  455. package/src/elements/remote.tsx +0 -225
  456. package/src/elements/resizable.globals.d.ts +0 -36
  457. package/src/elements/resizable.tsx +0 -704
  458. package/src/elements/response-stream.tsx +0 -40
  459. package/src/elements/screen.tsx +0 -90
  460. package/src/elements/scroll-area.tsx +0 -33
  461. package/src/elements/scroll-button.tsx +0 -179
  462. package/src/elements/search.tsx +0 -185
  463. package/src/elements/segmented.tsx +0 -129
  464. package/src/elements/select.tsx +0 -165
  465. package/src/elements/separator.tsx +0 -36
  466. package/src/elements/setting-item.tsx +0 -50
  467. package/src/elements/settings-group.tsx +0 -37
  468. package/src/elements/skeleton.tsx +0 -45
  469. package/src/elements/slider.tsx +0 -171
  470. package/src/elements/slot-text.ts +0 -73
  471. package/src/elements/slots.ts +0 -787
  472. package/src/elements/source.tsx +0 -126
  473. package/src/elements/status.tsx +0 -42
  474. package/src/elements/switch.tsx +0 -118
  475. package/src/elements/tabs.tsx +0 -95
  476. package/src/elements/tasks.tsx +0 -103
  477. package/src/elements/text-shimmer.tsx +0 -28
  478. package/src/elements/thinking-bar.tsx +0 -43
  479. package/src/elements/thread.tsx +0 -139
  480. package/src/elements/toast.tsx +0 -106
  481. package/src/elements/tool.tsx +0 -78
  482. package/src/elements/tooltip.tsx +0 -85
  483. package/src/elements/validate-messages.ts +0 -76
  484. package/src/elements/voice-input.tsx +0 -100
  485. package/src/elements/voice-output.tsx +0 -82
  486. package/src/index.ts +0 -430
  487. package/src/primitives/audio-bands.ts +0 -174
  488. package/src/primitives/card-component-types.ts +0 -63
  489. package/src/primitives/card-contract.ts +0 -80
  490. package/src/primitives/card-data-types.ts +0 -361
  491. package/src/primitives/card-host.tsx +0 -37
  492. package/src/primitives/card-recovery.ts +0 -160
  493. package/src/primitives/card-registry.tsx +0 -78
  494. package/src/primitives/card-resolution.ts +0 -36
  495. package/src/primitives/card-routing.ts +0 -85
  496. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  497. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  498. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  499. package/src/primitives/card-schemas/choice.schema.json +0 -75
  500. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  501. package/src/primitives/card-schemas/embed.schema.json +0 -63
  502. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  503. package/src/primitives/card-schemas/form.schema.json +0 -53
  504. package/src/primitives/card-schemas/link.schema.json +0 -54
  505. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  506. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  507. package/src/primitives/card-tags.ts +0 -61
  508. package/src/primitives/card-validate-cards.ts +0 -255
  509. package/src/primitives/card-validate-schemas.ts +0 -58
  510. package/src/primitives/card-validate.ts +0 -131
  511. package/src/primitives/chat-config.tsx +0 -103
  512. package/src/primitives/composer-model.ts +0 -49
  513. package/src/primitives/composer-triggers.ts +0 -35
  514. package/src/primitives/controllable.ts +0 -21
  515. package/src/primitives/conversation-store.ts +0 -248
  516. package/src/primitives/create-kai-chat.ts +0 -66
  517. package/src/primitives/create-tween.ts +0 -266
  518. package/src/primitives/embed-providers.ts +0 -254
  519. package/src/primitives/field-mask.ts +0 -256
  520. package/src/primitives/field-semantics.ts +0 -115
  521. package/src/primitives/highlighter.ts +0 -157
  522. package/src/primitives/input-mask.ts +0 -853
  523. package/src/primitives/link-preview.ts +0 -87
  524. package/src/primitives/message-feedback.ts +0 -124
  525. package/src/primitives/pdf-preview.ts +0 -121
  526. package/src/primitives/toast-store.ts +0 -338
  527. package/src/primitives/url-scheme-policy.ts +0 -70
  528. package/src/primitives/use-audio-analysis.ts +0 -340
  529. package/src/primitives/use-auto-resize.ts +0 -31
  530. package/src/primitives/use-resize-observer.ts +0 -45
  531. package/src/primitives/use-sequencer.ts +0 -72
  532. package/src/primitives/use-speech-recognition.ts +0 -146
  533. package/src/primitives/use-stick-to-bottom.ts +0 -75
  534. package/src/primitives/use-text-stream.ts +0 -143
  535. package/src/primitives/use-voice-recorder.ts +0 -62
  536. package/src/primitives/visualizer-sequences.ts +0 -350
  537. package/src/remote/host-embed.ts +0 -345
  538. package/src/remote/index.ts +0 -2
  539. package/src/remote/origin.ts +0 -30
  540. package/src/remote/provider-runtime.ts +0 -262
  541. package/src/remote/provider.ts +0 -2
  542. package/src/remote/validate.ts +0 -22
  543. package/src/remote/version.ts +0 -12
  544. package/src/remote/wire.ts +0 -48
  545. package/src/schemas/from-tool-call.ts +0 -151
  546. package/src/schemas/index.ts +0 -341
  547. package/src/schemas/provider-subsets.ts +0 -538
  548. package/src/schemas/registry.ts +0 -355
  549. package/src/schemas/tool-defs.ts +0 -793
  550. package/src/solid.ts +0 -173
  551. package/src/state/index.ts +0 -44
  552. package/src/state/messages.ts +0 -53
  553. package/src/state/mock.ts +0 -297
  554. package/src/state/parts.ts +0 -295
  555. package/src/state/persistence.ts +0 -180
  556. package/src/state/stream.ts +0 -246
  557. package/src/state/suggestions.ts +0 -9
  558. package/src/state/threads.ts +0 -142
  559. package/src/test-utils/fake-clock.ts +0 -88
  560. package/src/types.ts +0 -95
  561. package/src/ui/action-icons.ts +0 -53
  562. package/src/ui/agent-card.tsx +0 -218
  563. package/src/ui/avatar.tsx +0 -23
  564. package/src/ui/badge.tsx +0 -21
  565. package/src/ui/button.tsx +0 -49
  566. package/src/ui/card.tsx +0 -245
  567. package/src/ui/checkbox-group.tsx +0 -153
  568. package/src/ui/checkbox.tsx +0 -63
  569. package/src/ui/collapsible.tsx +0 -163
  570. package/src/ui/command.tsx +0 -103
  571. package/src/ui/dialog.tsx +0 -223
  572. package/src/ui/dock.tsx +0 -630
  573. package/src/ui/dropdown.tsx +0 -636
  574. package/src/ui/editable-label.tsx +0 -112
  575. package/src/ui/hover-card.tsx +0 -345
  576. package/src/ui/icon.tsx +0 -167
  577. package/src/ui/input.tsx +0 -391
  578. package/src/ui/kbd.tsx +0 -118
  579. package/src/ui/nav.tsx +0 -282
  580. package/src/ui/notice.tsx +0 -84
  581. package/src/ui/overlay.tsx +0 -277
  582. package/src/ui/pane-grid.tsx +0 -117
  583. package/src/ui/pane-group.tsx +0 -291
  584. package/src/ui/pane.tsx +0 -193
  585. package/src/ui/popover.tsx +0 -106
  586. package/src/ui/progress-bar.tsx +0 -83
  587. package/src/ui/prompt-dock.tsx +0 -145
  588. package/src/ui/radio.tsx +0 -150
  589. package/src/ui/resizable.tsx +0 -693
  590. package/src/ui/scroll-area.tsx +0 -26
  591. package/src/ui/segmented.tsx +0 -109
  592. package/src/ui/select.tsx +0 -168
  593. package/src/ui/separator.tsx +0 -10
  594. package/src/ui/settings-group.tsx +0 -67
  595. package/src/ui/skeleton.tsx +0 -73
  596. package/src/ui/slider.tsx +0 -178
  597. package/src/ui/status.tsx +0 -48
  598. package/src/ui/switch.tsx +0 -119
  599. package/src/ui/tabs.tsx +0 -168
  600. package/src/ui/textarea.tsx +0 -21
  601. package/src/ui/tooltip.tsx +0 -118
  602. package/src/utils/cn.ts +0 -30
  603. package/src/wire/chunk.ts +0 -248
  604. package/src/wire/consume.ts +0 -599
  605. package/src/wire/diagnostics.ts +0 -727
  606. package/src/wire/encode-probe.ts +0 -214
  607. package/src/wire/encode.ts +0 -947
  608. package/src/wire/files.ts +0 -342
  609. package/src/wire/formats/anthropic.ts +0 -274
  610. package/src/wire/formats/openai.ts +0 -228
  611. package/src/wire/index.ts +0 -95
  612. package/src/wire/media-types.ts +0 -344
  613. package/src/wire/read.ts +0 -396
  614. package/src/wire/sink-helpers.ts +0 -50
  615. package/src/wire/sse.ts +0 -153
@@ -1,377 +0,0 @@
1
- import { type JSX, Show, createContext, createMemo, useContext } from 'solid-js';
2
- import { HoverCardRoot, HoverCardTrigger, HoverCardContent } from '../ui/hover-card';
3
- import { cn } from '../utils/cn';
4
- import { Button } from '../ui/button';
5
- import { ProgressBar, type ProgressTone } from '../ui/progress-bar';
6
-
7
- const ICON_RADIUS = 10;
8
- const ICON_VIEWBOX = 24;
9
- const ICON_CENTER = 12;
10
- const ICON_STROKE_WIDTH = 2;
11
-
12
- /** Default fraction (0–1) at which the meter transitions to the warning colour. */
13
- export const DEFAULT_WARN_THRESHOLD = 0.7;
14
- /** Default fraction (0–1) at which the meter transitions to the danger colour. */
15
- export const DEFAULT_DANGER_THRESHOLD = 0.9;
16
-
17
- /**
18
- * Compute the severity level for a given usage fraction and thresholds.
19
- * `pct` is a 0–1 fraction (e.g. `usedTokens / maxTokens`).
20
- */
21
- export function computeSeverity(
22
- pct: number,
23
- warnThreshold = DEFAULT_WARN_THRESHOLD,
24
- dangerThreshold = DEFAULT_DANGER_THRESHOLD,
25
- ): ContextSeverity {
26
- if (pct > dangerThreshold) return 'danger';
27
- if (pct > warnThreshold) return 'warn';
28
- return 'ok';
29
- }
30
-
31
- export type ContextSeverity = 'ok' | 'warn' | 'danger';
32
-
33
- interface ContextSchema {
34
- usedTokens: number;
35
- maxTokens: number;
36
- inputTokens?: number;
37
- outputTokens?: number;
38
- reasoningTokens?: number;
39
- cacheTokens?: number;
40
- estimatedCost?: number;
41
- /** Fraction (0–1) above which the meter turns yellow. Default 0.7. */
42
- warnThreshold: number;
43
- /** Fraction (0–1) above which the meter turns red. Default 0.9. */
44
- dangerThreshold: number;
45
- }
46
-
47
- const ContextCtx = createContext<ContextSchema>();
48
-
49
- function useContextValue(): ContextSchema {
50
- const ctx = useContext(ContextCtx);
51
- if (!ctx) {
52
- throw new Error('Context components must be used within Context');
53
- }
54
- return ctx;
55
- }
56
-
57
- const fmtCompact = new Intl.NumberFormat('en-US', { notation: 'compact' });
58
- const fmtPercent = new Intl.NumberFormat('en-US', { maximumFractionDigits: 1, style: 'percent' });
59
- const fmtCurrency = new Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' });
60
-
61
- // --- Root provider ---
62
-
63
- export interface ContextProps {
64
- usedTokens: number;
65
- maxTokens: number;
66
- inputTokens?: number;
67
- outputTokens?: number;
68
- reasoningTokens?: number;
69
- cacheTokens?: number;
70
- estimatedCost?: number;
71
- /**
72
- * Fraction (0–1) above which the progress bar turns yellow.
73
- * Defaults to `0.7` (70%).
74
- */
75
- warnThreshold?: number;
76
- /**
77
- * Fraction (0–1) above which the progress bar turns red.
78
- * Defaults to `0.9` (90%).
79
- */
80
- dangerThreshold?: number;
81
- children?: JSX.Element;
82
- }
83
-
84
- export function Context(props: ContextProps) {
85
- const value = createMemo<ContextSchema>(() => ({
86
- usedTokens: props.usedTokens,
87
- maxTokens: props.maxTokens,
88
- inputTokens: props.inputTokens,
89
- outputTokens: props.outputTokens,
90
- reasoningTokens: props.reasoningTokens,
91
- cacheTokens: props.cacheTokens,
92
- estimatedCost: props.estimatedCost,
93
- warnThreshold: props.warnThreshold ?? DEFAULT_WARN_THRESHOLD,
94
- dangerThreshold: props.dangerThreshold ?? DEFAULT_DANGER_THRESHOLD,
95
- }));
96
-
97
- return (
98
- <ContextCtx.Provider value={value()}>
99
- <HoverCardRoot openDelay={0}>
100
- {props.children}
101
- </HoverCardRoot>
102
- </ContextCtx.Provider>
103
- );
104
- }
105
-
106
- // --- Icon (internal) ---
107
-
108
- function ContextIcon() {
109
- const ctx = useContextValue();
110
- const circumference = 2 * Math.PI * ICON_RADIUS;
111
- const usedPercent = createMemo(() => ctx.usedTokens / ctx.maxTokens);
112
- const dashOffset = createMemo(() => circumference * (1 - usedPercent()));
113
-
114
- return (
115
- <svg
116
- aria-label="Model context usage"
117
- height="20"
118
- role="img"
119
- style={{ color: 'currentcolor' }}
120
- viewBox={`0 0 ${ICON_VIEWBOX} ${ICON_VIEWBOX}`}
121
- width="20"
122
- >
123
- <circle
124
- cx={ICON_CENTER}
125
- cy={ICON_CENTER}
126
- fill="none"
127
- opacity="0.25"
128
- r={ICON_RADIUS}
129
- stroke="currentColor"
130
- stroke-width={ICON_STROKE_WIDTH}
131
- />
132
- <circle
133
- cx={ICON_CENTER}
134
- cy={ICON_CENTER}
135
- fill="none"
136
- opacity="0.7"
137
- r={ICON_RADIUS}
138
- stroke="currentColor"
139
- stroke-dasharray={`${circumference} ${circumference}`}
140
- stroke-dashoffset={dashOffset()}
141
- stroke-linecap="round"
142
- stroke-width={ICON_STROKE_WIDTH}
143
- style={{ transform: 'rotate(-90deg)', 'transform-origin': 'center' }}
144
- />
145
- </svg>
146
- );
147
- }
148
-
149
- // --- Trigger ---
150
-
151
- export interface ContextTriggerProps {
152
- children?: JSX.Element;
153
- class?: string;
154
- }
155
-
156
- export function ContextTrigger(props: ContextTriggerProps) {
157
- const ctx = useContextValue();
158
- const usedPercent = createMemo(() => ctx.usedTokens / ctx.maxTokens);
159
- const renderedPercent = createMemo(() => fmtPercent.format(usedPercent()));
160
-
161
- return (
162
- <HoverCardTrigger>
163
- <Show
164
- when={!props.children}
165
- fallback={props.children}
166
- >
167
- <Button type="button" variant="ghost" class={props.class}>
168
- <span class="font-medium text-muted-foreground">{renderedPercent()}</span>
169
- <ContextIcon />
170
- </Button>
171
- </Show>
172
- </HoverCardTrigger>
173
- );
174
- }
175
-
176
- // --- Content ---
177
-
178
- export interface ContextContentProps {
179
- class?: string;
180
- children?: JSX.Element;
181
- }
182
-
183
- export function ContextContent(props: ContextContentProps) {
184
- return (
185
- <HoverCardContent
186
- class={cn(
187
- 'min-w-60 divide-y divide-border overflow-hidden',
188
- props.class
189
- )}
190
- >
191
- {props.children}
192
- </HoverCardContent>
193
- );
194
- }
195
-
196
- // --- Content Header ---
197
-
198
- export interface ContextContentHeaderProps {
199
- class?: string;
200
- children?: JSX.Element;
201
- }
202
-
203
- export function ContextContentHeader(props: ContextContentHeaderProps) {
204
- const ctx = useContextValue();
205
- const usedPercent = createMemo(() => ctx.usedTokens / ctx.maxTokens);
206
- const displayPct = createMemo(() => fmtPercent.format(usedPercent()));
207
- const used = createMemo(() => fmtCompact.format(ctx.usedTokens));
208
- const total = createMemo(() => fmtCompact.format(ctx.maxTokens));
209
-
210
- const severity = createMemo<ContextSeverity>(() => {
211
- const pct = usedPercent();
212
- if (pct > ctx.dangerThreshold) return 'danger';
213
- if (pct > ctx.warnThreshold) return 'warn';
214
- return 'ok';
215
- });
216
-
217
- // Severity used to pick a bare hue class and nothing else, so the meter was a
218
- // pair of styled divs: no role, no value, invisible to assistive tech. Map it to
219
- // the shared ProgressBar's semantic `tone` instead and let that primitive supply
220
- // `role="progressbar"` + aria-valuenow/min/max, rather than hand-rolling those
221
- // onto the divs.
222
- const tone = createMemo<ProgressTone>(() => {
223
- const s = severity();
224
- if (s === 'danger') return 'error';
225
- if (s === 'warn') return 'warning';
226
- return 'primary';
227
- });
228
-
229
- return (
230
- <div class={cn('w-full space-y-2 p-3', props.class)}>
231
- <Show when={!props.children} fallback={props.children}>
232
- <div class="flex items-center justify-between gap-3 text-xs">
233
- <p>{displayPct()}</p>
234
- <p class="font-mono text-muted-foreground">
235
- {used()} / {total()}
236
- </p>
237
- </div>
238
- <div class="space-y-2">
239
- {/* Values are the raw token counts, so a screen reader announces
240
- "190,000 of 200,000" rather than a bare percentage. */}
241
- <ProgressBar
242
- value={ctx.usedTokens}
243
- max={ctx.maxTokens}
244
- tone={tone()}
245
- aria-label="Context usage"
246
- />
247
- </div>
248
- </Show>
249
- </div>
250
- );
251
- }
252
-
253
- // --- Content Body ---
254
-
255
- export interface ContextContentBodyProps {
256
- class?: string;
257
- children?: JSX.Element;
258
- }
259
-
260
- export function ContextContentBody(props: ContextContentBodyProps) {
261
- return (
262
- <div class={cn('w-full p-3', props.class)}>
263
- {props.children}
264
- </div>
265
- );
266
- }
267
-
268
- // --- Content Footer ---
269
-
270
- export interface ContextContentFooterProps {
271
- class?: string;
272
- children?: JSX.Element;
273
- }
274
-
275
- export function ContextContentFooter(props: ContextContentFooterProps) {
276
- const ctx = useContextValue();
277
- const totalCost = createMemo(() =>
278
- fmtCurrency.format(ctx.estimatedCost ?? 0)
279
- );
280
-
281
- return (
282
- <div
283
- class={cn(
284
- 'flex w-full items-center justify-between gap-3 bg-muted p-3 text-xs',
285
- props.class
286
- )}
287
- >
288
- <Show when={!props.children} fallback={props.children}>
289
- <span class="text-muted-foreground">Total cost</span>
290
- <span>{totalCost()}</span>
291
- </Show>
292
- </div>
293
- );
294
- }
295
-
296
- // --- Token row helper ---
297
-
298
- function TokensDisplay(props: { tokens?: number }) {
299
- return (
300
- <span>
301
- {props.tokens === undefined
302
- ? '\u2014'
303
- : fmtCompact.format(props.tokens)}
304
- </span>
305
- );
306
- }
307
-
308
- // --- Specialized usage rows ---
309
-
310
- export interface ContextUsageRowProps {
311
- class?: string;
312
- children?: JSX.Element;
313
- }
314
-
315
- // The four rows share one shape, but each still ships a `<Name>Props` alias: a
316
- // consumer typing a wrapper around one of them should not have to discover that
317
- // the shared name exists.
318
- export type ContextInputUsageProps = ContextUsageRowProps;
319
- export type ContextOutputUsageProps = ContextUsageRowProps;
320
- export type ContextReasoningUsageProps = ContextUsageRowProps;
321
- export type ContextCacheUsageProps = ContextUsageRowProps;
322
-
323
- export function ContextInputUsage(props: ContextInputUsageProps) {
324
- const ctx = useContextValue();
325
- return (
326
- <Show when={props.children || ctx.inputTokens}>
327
- <Show when={!props.children} fallback={props.children}>
328
- <div class={cn('flex items-center justify-between text-xs', props.class)}>
329
- <span class="text-muted-foreground">Input</span>
330
- <TokensDisplay tokens={ctx.inputTokens} />
331
- </div>
332
- </Show>
333
- </Show>
334
- );
335
- }
336
-
337
- export function ContextOutputUsage(props: ContextOutputUsageProps) {
338
- const ctx = useContextValue();
339
- return (
340
- <Show when={props.children || ctx.outputTokens}>
341
- <Show when={!props.children} fallback={props.children}>
342
- <div class={cn('flex items-center justify-between text-xs', props.class)}>
343
- <span class="text-muted-foreground">Output</span>
344
- <TokensDisplay tokens={ctx.outputTokens} />
345
- </div>
346
- </Show>
347
- </Show>
348
- );
349
- }
350
-
351
- export function ContextReasoningUsage(props: ContextReasoningUsageProps) {
352
- const ctx = useContextValue();
353
- return (
354
- <Show when={props.children || ctx.reasoningTokens}>
355
- <Show when={!props.children} fallback={props.children}>
356
- <div class={cn('flex items-center justify-between text-xs', props.class)}>
357
- <span class="text-muted-foreground">Reasoning</span>
358
- <TokensDisplay tokens={ctx.reasoningTokens} />
359
- </div>
360
- </Show>
361
- </Show>
362
- );
363
- }
364
-
365
- export function ContextCacheUsage(props: ContextCacheUsageProps) {
366
- const ctx = useContextValue();
367
- return (
368
- <Show when={props.children || ctx.cacheTokens}>
369
- <Show when={!props.children} fallback={props.children}>
370
- <div class={cn('flex items-center justify-between text-xs', props.class)}>
371
- <span class="text-muted-foreground">Cache</span>
372
- <TokensDisplay tokens={ctx.cacheTokens} />
373
- </div>
374
- </Show>
375
- </Show>
376
- );
377
- }
@@ -1,241 +0,0 @@
1
- import { Show, splitProps, createMemo, type JSX } from 'solid-js';
2
- import { MessageSquare } from 'lucide-solid';
3
- import { cn } from '../utils/cn';
4
- import type { ConversationSummary } from '../types';
5
-
6
- export interface ConversationItemProps {
7
- conversation: ConversationSummary;
8
- isActive: boolean;
9
- onSelect: (id: string) => void;
10
- /** Dense single-line row: a leading dot + title, no message count. */
11
- compact?: boolean;
12
- class?: string;
13
- }
14
-
15
- /**
16
- * Short relative time from an ISO date string: "just now", "5m ago", "3h ago",
17
- * "2d ago", "24d ago". Pure — it snapshots `now` (defaults to `Date.now()`) at
18
- * call time, so it re-derives whenever the list re-renders; there is no internal
19
- * ticking clock. Returns '' for a missing or unparseable date.
20
- */
21
- export function relativeTimeShort(iso?: string, now: number = Date.now()): string {
22
- if (!iso) return '';
23
- const then = Date.parse(iso);
24
- if (Number.isNaN(then)) return '';
25
- const secs = Math.max(0, Math.round((now - then) / 1000));
26
- if (secs < 60) return 'just now';
27
- const mins = Math.floor(secs / 60);
28
- if (mins < 60) return `${mins}m ago`;
29
- const hours = Math.floor(mins / 60);
30
- if (hours < 24) return `${hours}h ago`;
31
- return `${Math.floor(hours / 24)}d ago`;
32
- }
33
-
34
- /**
35
- * Whether a conversation should show an unread indicator (owner round,
36
- * 2026-08-26). `lastReadAt`'s own doc (`types.ts`) has the full contract;
37
- * this is the one place that reads it, so both list surfaces (this file's
38
- * `ConversationItem` and the widget-box `ConversationPanel`) derive it
39
- * identically rather than each restating the comparison.
40
- *
41
- * Absent `lastReadAt` reads as NOT unread — the decide-loudly default for a
42
- * store that never implements `ConversationStore.markRead` at all (every
43
- * summary it returns leaves the field undefined forever, so this always
44
- * returns `false` for it) rather than guessing "probably unread" from a
45
- * signal the store never actually provided. Defensive `Date.parse`, same
46
- * pattern as `relativeTimeShort` above: an unparsable date reads as not
47
- * unread rather than throwing.
48
- */
49
- export function isConversationUnread(conv: Pick<ConversationSummary, 'updatedAt' | 'lastReadAt'>): boolean {
50
- if (!conv.lastReadAt) return false;
51
- const updated = Date.parse(conv.updatedAt);
52
- const read = Date.parse(conv.lastReadAt);
53
- if (Number.isNaN(updated) || Number.isNaN(read)) return false;
54
- return updated > read;
55
- }
56
-
57
- /**
58
- * The slotted-item shape rendered by `<kai-conversation-item>` — the composed
59
- * row of the consumer-owned loop. Distinct from the
60
- * data-mode `ConversationItem` above, which batteries mode keeps rendering
61
- * unchanged: this one takes REGIONS, not a `ConversationSummary`.
62
- *
63
- * Regions map 1:1 to the element's slots: `children` = the default slot (the
64
- * title), plus `leading`, `meta`, and `menu`. The `menu` region takes the
65
- * consumer's OWN popover (rename / fork / archive live there); the component
66
- * provides only the region plus focus and ARIA plumbing, never a declarative
67
- * actions prop. Activation has two modes: inside `<kai-conversations>` it
68
- * lives in the CONTAINER (`createConversationItemsController` in
69
- * conversation-list.tsx — this row renders no handler and the
70
- * `data-kai-item-menu` marker on the menu region is what the container's
71
- * activation guard keys off so a click in the consumer's menu never also
72
- * selects the row); STANDALONE, `onActivate` makes the row body
73
- * its own tabbable button-role control — click / Enter / Space — with the menu
74
- * still outside the control as the body's sibling.
75
- *
76
- * ARIA contract for direct Solid use: the row renders `role="listitem"` holding
77
- * a `role="button"` body (`aria-current` marks the active row, the same dialect
78
- * as the batteries-mode row above) with the menu as the body's tabbable SIBLING
79
- * (axe `nested-interactive` bans focusable descendants of
80
- * a control, and `aria-required-children` outlaws non-option content anywhere
81
- * inside a listbox, which is why the vocabulary is not listbox/option). Render
82
- * your loop's rows inside a `role="list"` ancestor; element mode has no such
83
- * burden: `<kai-conversations>`' items region provides it for slotted items.
84
- */
85
- export interface SlottedConversationItemProps {
86
- /** The row's identity, handed to the container's selection contract. In the
87
- * element this is the `conversation-id` attribute (host `id` is the fallback). */
88
- conversationId?: string;
89
- /** Selected state. Reflected as `aria-current` on the row body and a
90
- * `data-active` styling hook on the row; the container drives it from its
91
- * `activeId`. */
92
- active?: boolean;
93
- /** Dense single-line row padding. */
94
- compact?: boolean;
95
- /** Leading region before the title (an icon or avatar). */
96
- leading?: JSX.Element;
97
- /** Meta region under the title (a timestamp or status line). */
98
- meta?: JSX.Element;
99
- /** Your own row menu (a popover trigger). Never selects the row. */
100
- menu?: JSX.Element;
101
- /** The title (the element's default slot). */
102
- children?: JSX.Element;
103
- /** Set when the element HOST carries the row-group semantics: the inner row
104
- * then renders `role="presentation"` so the accessibility tree sees one
105
- * group (the host), never two. The `kai-conversation-item` facade sets it;
106
- * Solid consumers rendering the component directly leave it off and the row
107
- * itself is the group. */
108
- hostSemantics?: boolean;
109
- /** STANDALONE activation: when set, the row body is itself the
110
- * activation control — `tabindex="0"` on the `role="button"` body, and
111
- * click / Enter / Space call this. The menu region never triggers it (it is
112
- * the body's sibling, outside the control). Inside `<kai-conversations>`
113
- * leave it UNSET: the container's controller owns activation (its delegated
114
- * click/keydown → `kai-conversation-select`) plus roving tabindex, and a
115
- * handler here would double-fire. The `kai-conversation-item` facade passes
116
- * it only when the item is standalone. */
117
- onActivate?: () => void;
118
- class?: string;
119
- }
120
-
121
- export function SlottedConversationItem(props: SlottedConversationItemProps) {
122
- const [local] = splitProps(props, ['conversationId', 'active', 'compact', 'leading', 'meta', 'menu', 'children', 'hostSemantics', 'onActivate', 'class']);
123
- return (
124
- // The sibling restructure: axe nested-interactive
125
- // bans focusable descendants of an activation control, so the control role
126
- // sits on the row BODY and the consumer's menu is its tabbable SIBLING
127
- // (the nav.tsx TrailingActions precedent). The vocabulary is
128
- // list/listitem/button + aria-current — NOT listbox/option, because axe
129
- // aria-required-children lets a listbox subtree own nothing but options
130
- // (and groups of options), which outlaws a sibling menu ANYWHERE inside
131
- // it; button + aria-current is also exactly what the batteries-mode
132
- // ConversationItem row above renders, so the two modes speak one dialect.
133
- <div
134
- part="row"
135
- role={local.hostSemantics ? 'presentation' : 'listitem'}
136
- data-active={local.active ? '' : undefined}
137
- data-conversation-id={local.conversationId}
138
- class={cn(
139
- 'flex w-full items-center gap-2.5 rounded-lg text-left transition-colors',
140
- local.compact ? 'px-2.5 py-1.5' : 'px-2.5 py-2',
141
- local.active ? 'bg-muted' : 'hover:bg-muted/50',
142
- local.class,
143
- )}
144
- >
145
- <div
146
- part="body"
147
- role="button"
148
- data-kai-item-body
149
- aria-current={local.active ? 'true' : 'false'}
150
- // Standalone activation only: with `onActivate` unset —
151
- // the inside-a-container case — no tabindex and no handlers render, so
152
- // the container's delegated activation stays the single path.
153
- tabindex={local.onActivate ? 0 : undefined}
154
- onClick={() => local.onActivate?.()}
155
- onKeyDown={(e: KeyboardEvent) => {
156
- if (!local.onActivate) return;
157
- if (e.key === 'Enter' || e.key === ' ') {
158
- e.preventDefault(); // Space must not scroll the page
159
- local.onActivate();
160
- }
161
- }}
162
- class="flex min-w-0 flex-1 cursor-pointer items-center gap-2.5 rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
163
- >
164
- <Show when={local.leading}>
165
- <span part="leading" class="flex shrink-0 items-center text-muted-foreground">{local.leading}</span>
166
- </Show>
167
- <div class="min-w-0 flex-1">
168
- <div part="title" class={cn('truncate text-sm', local.active ? 'font-medium text-foreground' : 'text-foreground/80')}>
169
- {local.children}
170
- </div>
171
- <Show when={local.meta}>
172
- <div part="meta" class="mt-0.5 truncate text-xs text-muted-foreground">{local.meta}</div>
173
- </Show>
174
- </div>
175
- </div>
176
- <Show when={local.menu}>
177
- <span part="menu" data-kai-item-menu class="ml-auto flex shrink-0 items-center">{local.menu}</span>
178
- </Show>
179
- </div>
180
- );
181
- }
182
-
183
- export function ConversationItem(props: ConversationItemProps) {
184
- const [local] = splitProps(props, ['conversation', 'isActive', 'onSelect', 'compact', 'class']);
185
- // The trailing text: the consumer's own `trailing` field, else an auto relative
186
- // time from updatedAt (fallback lastMessageAt). Never an internal clock — it is a
187
- // render-time snapshot.
188
- //
189
- // REACTIVITY, and the weaker version of this note is what #224 was filed against:
190
- // a new `conversations` array reference is NOT sufficient. `ConversationList` renders
191
- // these rows through a reference-keyed `<For>` that captures `conv` as a VALUE, so a
192
- // row whose item object is unchanged is never re-invoked and never re-reads anything
193
- // below. The consumer needs BOTH — a new array (which is what notifies at all) and a
194
- // new object for the item that changed (which is what this row can see). Adds,
195
- // removes and reorders are fine on a fresh array alone, since those rows' identities
196
- // already differ. Pinned by `src/components/reactivity-contract.test.tsx`.
197
- const trailing = createMemo(
198
- () => local.conversation.trailing ?? relativeTimeShort(local.conversation.updatedAt ?? local.conversation.lastMessageAt),
199
- );
200
- return (
201
- <button
202
- data-conversation-id={local.conversation.id}
203
- // `isActive` drives the selected LOOK below; it has to reach assistive tech
204
- // too, or the active conversation is visible only to sighted users. `true`
205
- // rather than `page` because this selects a conversation within the app, it
206
- // is not page navigation — same call as ui/agent-card.tsx and ui/pane-group.tsx
207
- // (ui/nav.tsx uses `page` because its items really are nav links).
208
- aria-current={local.isActive ? 'true' : undefined}
209
- onClick={() => local.onSelect(local.conversation.id)}
210
- class={cn(
211
- 'w-full rounded-lg text-left transition-colors',
212
- local.compact ? 'px-2.5 py-1.5' : 'px-2.5 py-2',
213
- local.isActive ? 'bg-muted' : 'hover:bg-muted/50',
214
- local.class,
215
- )}
216
- >
217
- <Show
218
- when={local.compact}
219
- fallback={
220
- <>
221
- <div class="flex items-center gap-2">
222
- <div class={cn('min-w-0 flex-1 truncate text-sm', local.isActive ? 'font-medium text-foreground' : 'text-foreground/80')}>{local.conversation.title}</div>
223
- <Show when={trailing()}>
224
- <span part="trailing" class="ml-auto shrink-0 text-xs text-muted-foreground">{trailing()}</span>
225
- </Show>
226
- </div>
227
- <div class={cn('mt-0.5 truncate text-xs', local.isActive ? 'text-foreground/70' : 'text-muted-foreground')}>{local.conversation.messageCount} messages</div>
228
- </>
229
- }
230
- >
231
- <div class="flex items-center gap-2.5">
232
- <MessageSquare class={cn('size-3.5 shrink-0', local.isActive ? 'text-foreground' : 'text-muted-foreground')} />
233
- <span class={cn('min-w-0 flex-1 truncate text-sm', local.isActive ? 'font-medium text-foreground' : 'text-foreground/80')}>{local.conversation.title}</span>
234
- <Show when={trailing()}>
235
- <span part="trailing" class="ml-auto shrink-0 text-xs text-muted-foreground">{trailing()}</span>
236
- </Show>
237
- </div>
238
- </Show>
239
- </button>
240
- );
241
- }