@kitn.ai/ui 0.27.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (612) hide show
  1. package/README.md +10 -2
  2. package/dist/{Icon-BnFKqqtY.js → Icon-DObhsRtm.js} +1 -1
  3. package/dist/{action-icons-CBskfBMz.js → action-icons-CcgNN2oT.js} +1 -1
  4. package/dist/agent-tooling/construct/public.d.ts +15 -0
  5. package/dist/agent-tooling/construct/schema.d.ts +111 -0
  6. package/dist/arrow-down-CjRU3JgV.js +1 -0
  7. package/dist/arrow-left-Bnpb1UEW.js +1 -0
  8. package/dist/{artifact-CvXEm1lS.js → artifact-Bwt7OgcR.js} +1 -1
  9. package/dist/{attachments-C43ZegEq.js → attachments-Qr4kg-2b.js} +1 -1
  10. package/dist/{audio-visualizer-B-79y1Tj.js → audio-visualizer-DToYdfSc.js} +1 -1
  11. package/dist/{badge-BpUbq8c0.js → badge-CdEu_jn2.js} +1 -1
  12. package/dist/{bell-sn17Ip9v.js → bell-DQAAOpDz.js} +1 -1
  13. package/dist/{button-BH6rN0U-.js → button-DkuOnGLy.js} +1 -1
  14. package/dist/{card-renderer-Cb1gQmth.js → card-renderer-Jx70m6_l.js} +1 -1
  15. package/dist/{card-routing-DifQgS7n.js → card-routing-0YidER_3.js} +1 -1
  16. package/dist/check-njkVdZu2.js +1 -0
  17. package/dist/{checkbox-Dc9Yov_B.js → checkbox-D7iRB3nL.js} +1 -1
  18. package/dist/{checkbox-group-B1kDLLYk.js → checkbox-group-B2_rpoPM.js} +1 -1
  19. package/dist/chevron-down-B72s6PXR.js +1 -0
  20. package/dist/chevron-right-BatuHzUm.js +1 -0
  21. package/dist/{choice-card-BT3c1S8g.js → choice-card-m0BYqqOK.js} +1 -1
  22. package/dist/circle-check-B62pODB3.js +1 -0
  23. package/dist/{circle-x-wobWkoSx.js → circle-x-BPG0iPst.js} +1 -1
  24. package/dist/circle-zx0ByzY9.js +1 -0
  25. package/dist/code-block-ClMLKb7C.js +1 -0
  26. package/dist/{collapsible-CPJbf6FM.js → collapsible-B4DlWicL.js} +1 -1
  27. package/dist/components/chat-thread.d.ts +89 -1
  28. package/dist/components/conversation-item.d.ts +16 -0
  29. package/dist/components/conversation-panel.d.ts +29 -0
  30. package/dist/components/home-panel.d.ts +34 -0
  31. package/dist/components/widget-tab-bar.d.ts +16 -0
  32. package/dist/{composer-CjngLzal.js → composer-sQ0HcvyG.js} +3 -3
  33. package/dist/{confirm-card-DCx_A4bU.js → confirm-card-rQWDQsnC.js} +1 -1
  34. package/dist/construct-cli.es.js +185 -17
  35. package/dist/construct.d.ts +5 -0
  36. package/dist/construct.js +327 -0
  37. package/dist/{context-BY8V-Nlp.js → context-0kg4ZX1J.js} +1 -1
  38. package/dist/controllable-CnGpMF6r.js +1 -0
  39. package/dist/conversation-item-BxwQLaFJ.js +1 -0
  40. package/dist/conversation-list-BCfGN1JU.js +1 -0
  41. package/dist/{copy-B6DO4PqB.js → copy-n9u9rqpi.js} +1 -1
  42. package/dist/core-C8fzo39E.js +1 -12
  43. package/dist/{create-tween-CnMHviKB.js → create-tween-C-q-JCM-.js} +1 -1
  44. package/dist/{create-tween-D1aiGZZh.js → create-tween-CRrJXxBd.js} +1 -1
  45. package/dist/{create-tween-BPzaefTp.js → create-tween-DZ3RRDHD.js} +1 -1
  46. package/dist/{create-tween-DUSQUKpr.js → create-tween-uPkArjIG.js} +1 -1
  47. package/dist/custom-elements.json +51 -2
  48. package/dist/{default-input-CucQEOqH.js → default-input-CaMrJkgH.js} +1 -1
  49. package/dist/define-By-uL588.js +1 -0
  50. package/dist/define.js +2 -2
  51. package/dist/define.server.js +2 -2
  52. package/dist/{disclosure-CbLtajUQ.js → disclosure-WUImBbDv.js} +1 -1
  53. package/dist/{dropdown-BwhViJFd.js → dropdown-wZVeJOMd.js} +1 -1
  54. package/dist/elements/agent-card.js +1 -1
  55. package/dist/elements/artifact.js +1 -1
  56. package/dist/elements/attachments.js +1 -1
  57. package/dist/elements/audio-visualizer.js +1 -1
  58. package/dist/elements/avatar.js +1 -1
  59. package/dist/elements/badge.js +1 -1
  60. package/dist/elements/button.js +1 -1
  61. package/dist/elements/card.js +1 -1
  62. package/dist/elements/cards.js +1 -1
  63. package/dist/elements/chain-of-thought.js +1 -1
  64. package/dist/elements/chat-scope-picker.js +1 -1
  65. package/dist/elements/chat-workspace.js +1 -1
  66. package/dist/elements/chat.js +1 -1
  67. package/dist/elements/checkbox-group.js +1 -1
  68. package/dist/elements/checkbox.js +1 -1
  69. package/dist/elements/checkpoint.js +1 -1
  70. package/dist/elements/choice.js +1 -1
  71. package/dist/elements/coachmark.js +1 -1
  72. package/dist/elements/code-block.js +1 -1
  73. package/dist/elements/command.js +1 -1
  74. package/dist/elements/compare.js +1 -1
  75. package/dist/elements/composer.js +1 -1
  76. package/dist/elements/confirm-card.js +1 -1
  77. package/dist/elements/context-meter.js +1 -1
  78. package/dist/elements/conversation-item.js +1 -1
  79. package/dist/elements/conversation-list.js +1 -1
  80. package/dist/elements/dialog.js +1 -1
  81. package/dist/elements/dock.js +3 -3
  82. package/dist/elements/dropdown.js +1 -1
  83. package/dist/elements/editable-label.js +1 -1
  84. package/dist/elements/embed.js +1 -1
  85. package/dist/elements/empty.js +1 -1
  86. package/dist/elements/feedback-bar.js +1 -1
  87. package/dist/elements/file-tree.js +1 -1
  88. package/dist/elements/file-upload.js +1 -1
  89. package/dist/elements/form.js +1 -1
  90. package/dist/elements/hover-card.js +1 -1
  91. package/dist/elements/icon.js +1 -1
  92. package/dist/elements/image.js +1 -1
  93. package/dist/elements/input.js +1 -1
  94. package/dist/elements/kbd.js +1 -1
  95. package/dist/elements/link-preview.js +1 -1
  96. package/dist/elements/loader.js +1 -1
  97. package/dist/elements/markdown.js +1 -1
  98. package/dist/elements/menu.js +1 -1
  99. package/dist/elements/message-skills.js +1 -1
  100. package/dist/elements/message.js +1 -1
  101. package/dist/elements/model-switcher.js +1 -1
  102. package/dist/elements/nav.js +1 -1
  103. package/dist/elements/notice.js +1 -1
  104. package/dist/elements/pane-grid.js +1 -1
  105. package/dist/elements/pane-group.js +1 -1
  106. package/dist/elements/pane.js +1 -1
  107. package/dist/elements/popover.js +1 -1
  108. package/dist/elements/progress-bar.js +1 -1
  109. package/dist/elements/prompt-dock.js +1 -1
  110. package/dist/elements/prompt-input.js +1 -1
  111. package/dist/elements/prompt-suggestions.js +1 -1
  112. package/dist/elements/radio-group.js +1 -1
  113. package/dist/elements/reasoning.js +1 -1
  114. package/dist/elements/remote.js +1 -1
  115. package/dist/elements/resizable.js +1 -1
  116. package/dist/elements/response-stream.js +1 -1
  117. package/dist/elements/screen.js +1 -1
  118. package/dist/elements/scroll-area.js +1 -1
  119. package/dist/elements/scroll-button.js +1 -1
  120. package/dist/elements/search.js +1 -1
  121. package/dist/elements/segmented.js +1 -1
  122. package/dist/elements/select.js +1 -1
  123. package/dist/elements/separator.js +1 -1
  124. package/dist/elements/setting-item.js +1 -1
  125. package/dist/elements/settings-group.js +1 -1
  126. package/dist/elements/skeleton.js +1 -1
  127. package/dist/elements/slider.js +1 -1
  128. package/dist/elements/source.js +1 -1
  129. package/dist/elements/status.js +1 -1
  130. package/dist/elements/switch.js +1 -1
  131. package/dist/elements/tabs.js +1 -1
  132. package/dist/elements/tasks.js +1 -1
  133. package/dist/elements/text-shimmer.js +1 -1
  134. package/dist/elements/thinking-bar.js +1 -1
  135. package/dist/elements/thread.js +1 -1
  136. package/dist/elements/toast.js +1 -1
  137. package/dist/elements/tool.js +1 -1
  138. package/dist/elements/tooltip.js +1 -1
  139. package/dist/elements/voice-input.js +1 -1
  140. package/dist/elements/voice-output.js +1 -1
  141. package/dist/elements.d.ts +20 -4
  142. package/dist/{ellipsis-DFr4Vqr3.js → ellipsis-CbOpJnU3.js} +1 -1
  143. package/dist/{embed-5s_vU4J0.js → embed-CrfjkbUG.js} +1 -1
  144. package/dist/engine-javascript-C1x7zo1_.js +1 -141
  145. package/dist/{external-link-u9d85ORQ.js → external-link-ByXAwBBQ.js} +1 -1
  146. package/dist/{file-text-CX7_x42o.js → file-text-DMib2qwt.js} +1 -1
  147. package/dist/{file-tree-D3kBjXI5.js → file-tree-CJqM2aP7.js} +1 -1
  148. package/dist/{folder-V-YdIL8f.js → folder-_BAb929C.js} +1 -1
  149. package/dist/{form-BRNUMCN2.js → form-DSZgZQZk.js} +1 -1
  150. package/dist/{hover-card-DaeiYrTA.js → hover-card-BQbul9eq.js} +1 -1
  151. package/dist/{icon-BpixdZNq.js → icon-CdcfRhYI.js} +1 -1
  152. package/dist/index.d.ts +3 -1
  153. package/dist/index.js +2842 -2703
  154. package/dist/index.server.js +2820 -2681
  155. package/dist/{info-8mFsIjS3.js → info-DsFjGuI_.js} +1 -1
  156. package/dist/{input-d1Yuu-hz.js → input-DKbmkMos.js} +1 -1
  157. package/dist/kai.es.js +1 -1
  158. package/dist/{kbd-961zMPFB.js → kbd-PvdGhX4s.js} +1 -1
  159. package/dist/{link-preview-DIIbV2Sd.js → link-preview-DbM1866N.js} +1 -1
  160. package/dist/{link-DlZZBGaR.js → link-zF8PzWfF.js} +1 -1
  161. package/dist/{loader-YQszHFaW.js → loader-BM4CEz4G.js} +1 -1
  162. package/dist/{markdown-CVk1MPsj.js → markdown-LMvmAyBk.js} +7 -7
  163. package/dist/mcp.es.js +79 -5
  164. package/dist/{message-CwKVEdZg.js → message-BSsgvHvf.js} +1 -1
  165. package/dist/{message-DS8lzHc1.js → message-BYZECyek.js} +1 -1
  166. package/dist/message-circle-DruwObfX.js +1 -0
  167. package/dist/message-square-BG6q6mlm.js +1 -0
  168. package/dist/{minimize-2-UEZmP2QT.js → minimize-2-BQRoBV1V.js} +1 -1
  169. package/dist/{model-switcher-Kk1jEQ5t.js → model-switcher-CMpCOYcB.js} +1 -1
  170. package/dist/{overlay-C1od6LOz.js → overlay-Cb-MkyDa.js} +1 -1
  171. package/dist/{panel-right-ryET0yyn.js → panel-right-i8warFxT.js} +1 -1
  172. package/dist/{paperclip-BDNoZFJP.js → paperclip-ByY3UVO6.js} +1 -1
  173. package/dist/play-BvKKq3fX.js +1 -0
  174. package/dist/primitives/conversation-store.d.ts +54 -0
  175. package/dist/{progress-bar-BvYX0aoy.js → progress-bar-jVAHvMUf.js} +1 -1
  176. package/dist/{prompt-suggestion-BRFu2lcu.js → prompt-suggestion-CD-qtNgC.js} +1 -1
  177. package/dist/{radio-DcL23cNJ.js → radio-BsoBMhkF.js} +1 -1
  178. package/dist/react/index.d.ts +393 -0
  179. package/dist/react.js +20 -20
  180. package/dist/{reasoning-Cackq4Rh.js → reasoning-4kBPtlTx.js} +1 -1
  181. package/dist/register-impl-B1hLkrI8.js +424 -0
  182. package/dist/{resizable-Cp9HUYih.js → resizable-uPmY9VY-.js} +1 -1
  183. package/dist/{rotate-ccw-0DLRDHH5.js → rotate-ccw-B2xn93py.js} +1 -1
  184. package/dist/{rotate-cw-DOB9IGcU.js → rotate-cw-CMVLoCyH.js} +1 -1
  185. package/dist/{scroll-area-emVmWP4K.js → scroll-area-BqLUo8ZZ.js} +1 -1
  186. package/dist/{scroll-button-CeP_gv1x.js → scroll-button-DslXiJyL.js} +1 -1
  187. package/dist/{select-CWmu00tS.js → select-2cLRtPGT.js} +1 -1
  188. package/dist/{separator-CE6vly6z.js → separator-BWQtNJcM.js} +1 -1
  189. package/dist/{settings-CE-78SvZ.js → settings-BBR63jLg.js} +1 -1
  190. package/dist/{settings-group-ZFWNxFQR.js → settings-group-B2ciy-Iw.js} +1 -1
  191. package/dist/{skeleton-BebdP4mf.js → skeleton-CkHI-HgC.js} +1 -1
  192. package/dist/{slider-BAKRYUlz.js → slider-DDR9U-i0.js} +1 -1
  193. package/dist/{solid-BE5ui6sy.js → solid-BzCFdL25.js} +7720 -7058
  194. package/dist/{solid-DFhsce3O.js → solid-DruVOXnf.js} +5864 -5283
  195. package/dist/solid.d.ts +6 -2
  196. package/dist/solid.js +217 -210
  197. package/dist/solid.server.js +217 -210
  198. package/dist/{source-B0FlguSx.js → source-GEnFF528.js} +1 -1
  199. package/dist/{star-CBMZvLuN.js → star-CilHq8GP.js} +1 -1
  200. package/dist/store-Ciyk6eZG.js +1 -0
  201. package/dist/{switch-CViARZCy.js → switch-KkeQIbuH.js} +1 -1
  202. package/dist/{tasks-card-MjCcOhR_.js → tasks-card-BrN4bggJ.js} +1 -1
  203. package/dist/{text-shimmer-DKlwRF2G.js → text-shimmer-Dcj1MHuq.js} +1 -1
  204. package/dist/{textarea-3ay2Me2-.js → textarea-Dpvbngbg.js} +1 -1
  205. package/dist/theme.tokens.css +28 -0
  206. package/dist/{thumbs-up-DQcu2HMO.js → thumbs-up-CsT9Wzb9.js} +1 -1
  207. package/dist/{toast-store-C6yKOhbk.js → toast-store-tgK6MuMv.js} +1 -1
  208. package/dist/{tool-BCYNlfKy.js → tool-DzUjIBT8.js} +1 -1
  209. package/dist/{tooltip-05zI4hjs.js → tooltip-Bkkg_4t0.js} +1 -1
  210. package/dist/{trash-2-BR1RxGky.js → trash-2-jBKxjGGQ.js} +1 -1
  211. package/dist/{triangle-alert-DHohDOCy.js → triangle-alert-DlQ68ppf.js} +1 -1
  212. package/dist/types.d.ts +48 -3
  213. package/dist/ui/dock.d.ts +29 -0
  214. package/dist/{upload-BbGW6A_u.js → upload-TcAHXv9W.js} +1 -1
  215. package/dist/{url-scheme-policy-DHpoTJwB.js → url-scheme-policy-DR5DgvkM.js} +1 -1
  216. package/dist/{use-card-resolution-CJW4grFa.js → use-card-resolution-DaZqAdWf.js} +1 -1
  217. package/dist/{variant-aurora-xiMPty8f.js → variant-aurora-BhLuYxJR.js} +1 -1
  218. package/dist/{variant-aurora-BUOVgPOB.js → variant-aurora-CNmfHhcx.js} +2 -2
  219. package/dist/{variant-aurora-CUsUJvFI.js → variant-aurora-D6GsdTPA.js} +2 -2
  220. package/dist/{variant-aurora-CW2i4bfr.js → variant-aurora-DbW_OWL2.js} +1 -1
  221. package/dist/{variant-custom-D91HjAKz.js → variant-custom-BRvaNHSi.js} +1 -1
  222. package/dist/{variant-custom-BQtOnmeO.js → variant-custom-BvYHR62b.js} +1 -1
  223. package/dist/{variant-custom-CAnzzppW.js → variant-custom-DMTrEO5w.js} +2 -2
  224. package/dist/{variant-custom-CAm9L-E5.js → variant-custom-DV2x254s.js} +2 -2
  225. package/dist/{variant-wave-Ca1Ls4_y.js → variant-wave-BNMGrDfj.js} +2 -2
  226. package/dist/{variant-wave-uY5crU_K.js → variant-wave-BpDd8t3Z.js} +1 -1
  227. package/dist/{variant-wave-CxX39DKd.js → variant-wave-CyBueXj9.js} +2 -2
  228. package/dist/{variant-wave-DYyzIIZv.js → variant-wave-sp-qwsdI.js} +1 -1
  229. package/dist/x-Z5UntkIJ.js +1 -0
  230. package/frameworks/react/index.tsx +14 -4
  231. package/llms-full.txt +7 -2
  232. package/package.json +16 -16
  233. package/src/elements/element-meta.json +49 -6
  234. package/theme.css +28 -0
  235. package/bin/route.test.js +0 -58
  236. package/dist/arrow-down-Br0qtpsz.js +0 -1
  237. package/dist/arrow-left-Dj7xgE12.js +0 -1
  238. package/dist/check-DPeeMUYx.js +0 -1
  239. package/dist/chevron-down-CHSWk7ZT.js +0 -1
  240. package/dist/chevron-right-B7l_fMgx.js +0 -1
  241. package/dist/circle-Bb0yOpqM.js +0 -1
  242. package/dist/circle-check-BGZpCiz7.js +0 -1
  243. package/dist/code-block-CUQ5mtv0.js +0 -1
  244. package/dist/controllable-D43BKmtX.js +0 -1
  245. package/dist/conversation-list-D4lLU_yS.js +0 -1
  246. package/dist/define-CGGX-7Vg.js +0 -1
  247. package/dist/message-circle-Xf8Q-vZp.js +0 -1
  248. package/dist/message-square-Cxnwgkns.js +0 -1
  249. package/dist/play-OFIvYXUQ.js +0 -1
  250. package/dist/register-impl-C7rENvPK.js +0 -424
  251. package/dist/store-7eoadydQ.js +0 -1
  252. package/dist/x-C5m1JFgi.js +0 -1
  253. package/src/agent-tooling/archetypes.ts +0 -205
  254. package/src/agent-tooling/catalog/README.md +0 -676
  255. package/src/agent-tooling/catalog/catalog-types.ts +0 -231
  256. package/src/agent-tooling/catalog/fabrications.ts +0 -96
  257. package/src/agent-tooling/catalog/invariants.ts +0 -284
  258. package/src/agent-tooling/catalog/labs-titles.ts +0 -114
  259. package/src/agent-tooling/catalog/scenarios.ts +0 -87
  260. package/src/agent-tooling/catalog/surfaces.ts +0 -347
  261. package/src/agent-tooling/construct/cli-entry.ts +0 -8
  262. package/src/agent-tooling/construct/cli.ts +0 -131
  263. package/src/agent-tooling/construct/codegen.ts +0 -1353
  264. package/src/agent-tooling/construct/construct.v1.schema.json +0 -250
  265. package/src/agent-tooling/construct/dev.ts +0 -148
  266. package/src/agent-tooling/construct/fixtures/demo-widget.construct.json +0 -7
  267. package/src/agent-tooling/construct/fixtures/ops-console.construct.json +0 -44
  268. package/src/agent-tooling/construct/fixtures/owner-widget.construct.json +0 -23
  269. package/src/agent-tooling/construct/schema.ts +0 -371
  270. package/src/agent-tooling/integrations/anthropic.ts +0 -442
  271. package/src/agent-tooling/integrations/cloudflare.ts +0 -218
  272. package/src/agent-tooling/integrations/langgraph.ts +0 -133
  273. package/src/agent-tooling/integrations/mastra.ts +0 -182
  274. package/src/agent-tooling/integrations/mock.ts +0 -148
  275. package/src/agent-tooling/integrations/ollama.ts +0 -97
  276. package/src/agent-tooling/integrations/openai.ts +0 -95
  277. package/src/agent-tooling/integrations/openrouter.ts +0 -82
  278. package/src/agent-tooling/integrations/pi.ts +0 -176
  279. package/src/agent-tooling/integrations/pydantic-ai.ts +0 -108
  280. package/src/agent-tooling/integrations/vercel-ai-sdk.ts +0 -398
  281. package/src/agent-tooling/mcp/css-raw.d.ts +0 -12
  282. package/src/agent-tooling/mcp/manifest.ts +0 -422
  283. package/src/agent-tooling/mcp/server.ts +0 -116
  284. package/src/agent-tooling/mcp/stdio.ts +0 -18
  285. package/src/agent-tooling/mcp/tools/construct.ts +0 -130
  286. package/src/agent-tooling/mcp/tools/debug.ts +0 -621
  287. package/src/agent-tooling/mcp/tools/reference.ts +0 -980
  288. package/src/agent-tooling/mcp/tools/scaffold.ts +0 -6708
  289. package/src/agent-tooling/mcp/tools/theme.ts +0 -456
  290. package/src/agent-tooling/mcp/tools/types.ts +0 -14
  291. package/src/agent-tooling/mcp/validate-args.ts +0 -141
  292. package/src/agent-tooling/recipes/composed-thread.ts +0 -714
  293. package/src/agent-tooling/recipes/index.ts +0 -22
  294. package/src/agent-tooling/recipes/types.ts +0 -32
  295. package/src/agent-tooling/registry.ts +0 -132
  296. package/src/agent-tooling/route-emit.ts +0 -305
  297. package/src/agent-tooling/types.ts +0 -390
  298. package/src/components/artifact-card.tsx +0 -120
  299. package/src/components/artifact.tsx +0 -914
  300. package/src/components/attachment-types.ts +0 -66
  301. package/src/components/attachments.tsx +0 -536
  302. package/src/components/audio-visualizer/audio-visualizer.voice-fixture.ts +0 -257
  303. package/src/components/audio-visualizer/aurora.glsl.ts +0 -330
  304. package/src/components/audio-visualizer/fit-scale.ts +0 -112
  305. package/src/components/audio-visualizer/index.tsx +0 -528
  306. package/src/components/audio-visualizer/labs/lab-choreography.ts +0 -187
  307. package/src/components/audio-visualizer/labs/lab-shaders.ts +0 -363
  308. package/src/components/audio-visualizer/labs/lab-visualizer.tsx +0 -102
  309. package/src/components/audio-visualizer/shader-canvas.tsx +0 -876
  310. package/src/components/audio-visualizer/sizes.ts +0 -54
  311. package/src/components/audio-visualizer/variant-aurora.tsx +0 -305
  312. package/src/components/audio-visualizer/variant-bar.tsx +0 -175
  313. package/src/components/audio-visualizer/variant-custom.tsx +0 -344
  314. package/src/components/audio-visualizer/variant-grid.tsx +0 -175
  315. package/src/components/audio-visualizer/variant-radial.tsx +0 -163
  316. package/src/components/audio-visualizer/variant-wave.tsx +0 -130
  317. package/src/components/audio-visualizer/wave.glsl.ts +0 -130
  318. package/src/components/card-fallback.tsx +0 -60
  319. package/src/components/card-renderer.tsx +0 -220
  320. package/src/components/card.tsx +0 -212
  321. package/src/components/chain-of-thought.tsx +0 -348
  322. package/src/components/chat-container.tsx +0 -89
  323. package/src/components/chat-scope-picker.tsx +0 -57
  324. package/src/components/chat-thread.tsx +0 -518
  325. package/src/components/checkpoint.tsx +0 -88
  326. package/src/components/choice-card.tsx +0 -743
  327. package/src/components/coachmark.tsx +0 -249
  328. package/src/components/code-block.tsx +0 -181
  329. package/src/components/composer-dom.ts +0 -159
  330. package/src/components/composer-highlight.ts +0 -242
  331. package/src/components/composer-history.ts +0 -82
  332. package/src/components/composer.tsx +0 -1075
  333. package/src/components/confirm-card.tsx +0 -402
  334. package/src/components/context.tsx +0 -377
  335. package/src/components/conversation-item.tsx +0 -218
  336. package/src/components/conversation-list.tsx +0 -429
  337. package/src/components/dismissed-stub.tsx +0 -80
  338. package/src/components/embed.tsx +0 -200
  339. package/src/components/empty.tsx +0 -177
  340. package/src/components/feedback-bar.tsx +0 -166
  341. package/src/components/file-tree.tsx +0 -530
  342. package/src/components/file-upload.tsx +0 -167
  343. package/src/components/form-widgets.tsx +0 -525
  344. package/src/components/form.tsx +0 -1296
  345. package/src/components/image.tsx +0 -65
  346. package/src/components/link-preview.tsx +0 -195
  347. package/src/components/loader.tsx +0 -367
  348. package/src/components/markdown.tsx +0 -162
  349. package/src/components/message-skills.tsx +0 -40
  350. package/src/components/message.tsx +0 -765
  351. package/src/components/model-switcher.tsx +0 -132
  352. package/src/components/prompt-input.tsx +0 -188
  353. package/src/components/prompt-suggestion.tsx +0 -150
  354. package/src/components/reasoning.tsx +0 -293
  355. package/src/components/response-compare-types.ts +0 -152
  356. package/src/components/response-compare.tsx +0 -455
  357. package/src/components/response-stream.tsx +0 -109
  358. package/src/components/screen.tsx +0 -181
  359. package/src/components/scroll-button.tsx +0 -93
  360. package/src/components/source.tsx +0 -192
  361. package/src/components/tasks-card.tsx +0 -801
  362. package/src/components/text-shimmer.tsx +0 -37
  363. package/src/components/thinking-bar.tsx +0 -50
  364. package/src/components/thread.tsx +0 -228
  365. package/src/components/toast.tsx +0 -503
  366. package/src/components/tool-classify.ts +0 -26
  367. package/src/components/tool-types.ts +0 -49
  368. package/src/components/tool.tsx +0 -190
  369. package/src/components/use-card-resolution.ts +0 -44
  370. package/src/components/voice-input.tsx +0 -222
  371. package/src/components/voice-output.tsx +0 -242
  372. package/src/components/workspace-shell.tsx +0 -285
  373. package/src/diagnostics/hook.ts +0 -352
  374. package/src/diagnostics/index.ts +0 -82
  375. package/src/diagnostics/report-request.ts +0 -296
  376. package/src/elements/agent-card.tsx +0 -67
  377. package/src/elements/artifact.tsx +0 -194
  378. package/src/elements/attachments.tsx +0 -140
  379. package/src/elements/audio-visualizer.tsx +0 -227
  380. package/src/elements/autoloader.ts +0 -89
  381. package/src/elements/avatar.tsx +0 -33
  382. package/src/elements/badge.tsx +0 -32
  383. package/src/elements/button.tsx +0 -149
  384. package/src/elements/card.tsx +0 -133
  385. package/src/elements/cards.tsx +0 -266
  386. package/src/elements/chain-of-thought.tsx +0 -141
  387. package/src/elements/chat-scope-picker.tsx +0 -65
  388. package/src/elements/chat-types.ts +0 -102
  389. package/src/elements/chat-workspace.tsx +0 -188
  390. package/src/elements/chat.tsx +0 -212
  391. package/src/elements/checkbox-group.tsx +0 -164
  392. package/src/elements/checkbox.tsx +0 -134
  393. package/src/elements/checkpoint.tsx +0 -47
  394. package/src/elements/choice.tsx +0 -100
  395. package/src/elements/coachmark.tsx +0 -90
  396. package/src/elements/code-block.tsx +0 -60
  397. package/src/elements/command.tsx +0 -197
  398. package/src/elements/compare.tsx +0 -111
  399. package/src/elements/compiled.css +0 -2
  400. package/src/elements/composer.tsx +0 -162
  401. package/src/elements/confirm-card.tsx +0 -76
  402. package/src/elements/context-meter.tsx +0 -107
  403. package/src/elements/conversation-item.tsx +0 -120
  404. package/src/elements/conversation-list.tsx +0 -203
  405. package/src/elements/css.ts +0 -5
  406. package/src/elements/default-input.tsx +0 -392
  407. package/src/elements/define-entry.ts +0 -12
  408. package/src/elements/define.tsx +0 -563
  409. package/src/elements/diagnostic-events.ts +0 -114
  410. package/src/elements/dialog.tsx +0 -145
  411. package/src/elements/disclosure.ts +0 -95
  412. package/src/elements/dock.tsx +0 -215
  413. package/src/elements/dropdown.tsx +0 -123
  414. package/src/elements/editable-label.tsx +0 -140
  415. package/src/elements/element-data-types.ts +0 -152
  416. package/src/elements/element-diagnostics.ts +0 -392
  417. package/src/elements/element-manifest.json +0 -354
  418. package/src/elements/element-nonscalar.json +0 -185
  419. package/src/elements/element-types.d.ts +0 -4337
  420. package/src/elements/embed.tsx +0 -35
  421. package/src/elements/empty.tsx +0 -29
  422. package/src/elements/feedback-bar.tsx +0 -66
  423. package/src/elements/file-tree.tsx +0 -62
  424. package/src/elements/file-upload.tsx +0 -44
  425. package/src/elements/form.tsx +0 -94
  426. package/src/elements/hover-card.tsx +0 -80
  427. package/src/elements/icon.tsx +0 -41
  428. package/src/elements/image.tsx +0 -32
  429. package/src/elements/input.tsx +0 -492
  430. package/src/elements/kbd.tsx +0 -45
  431. package/src/elements/link-preview.tsx +0 -34
  432. package/src/elements/loader.tsx +0 -25
  433. package/src/elements/markdown.tsx +0 -38
  434. package/src/elements/menu.tsx +0 -241
  435. package/src/elements/message-skills.tsx +0 -83
  436. package/src/elements/message.tsx +0 -361
  437. package/src/elements/model-switcher.tsx +0 -121
  438. package/src/elements/nav.tsx +0 -87
  439. package/src/elements/notice.tsx +0 -53
  440. package/src/elements/pane-grid.tsx +0 -111
  441. package/src/elements/pane-group.tsx +0 -119
  442. package/src/elements/pane.tsx +0 -129
  443. package/src/elements/popover.tsx +0 -81
  444. package/src/elements/progress-bar.tsx +0 -39
  445. package/src/elements/prompt-dock.tsx +0 -82
  446. package/src/elements/prompt-input.tsx +0 -240
  447. package/src/elements/prompt-suggestions.tsx +0 -113
  448. package/src/elements/radio-group.tsx +0 -129
  449. package/src/elements/reasoning.tsx +0 -71
  450. package/src/elements/register-impl.ts +0 -148
  451. package/src/elements/register.ts +0 -76
  452. package/src/elements/remote.tsx +0 -225
  453. package/src/elements/resizable.globals.d.ts +0 -36
  454. package/src/elements/resizable.tsx +0 -704
  455. package/src/elements/response-stream.tsx +0 -40
  456. package/src/elements/screen.tsx +0 -90
  457. package/src/elements/scroll-area.tsx +0 -33
  458. package/src/elements/scroll-button.tsx +0 -179
  459. package/src/elements/search.tsx +0 -185
  460. package/src/elements/segmented.tsx +0 -129
  461. package/src/elements/select.tsx +0 -165
  462. package/src/elements/separator.tsx +0 -36
  463. package/src/elements/setting-item.tsx +0 -50
  464. package/src/elements/settings-group.tsx +0 -37
  465. package/src/elements/skeleton.tsx +0 -45
  466. package/src/elements/slider.tsx +0 -171
  467. package/src/elements/slot-text.ts +0 -73
  468. package/src/elements/slots.ts +0 -787
  469. package/src/elements/source.tsx +0 -126
  470. package/src/elements/status.tsx +0 -42
  471. package/src/elements/styles.css +0 -328
  472. package/src/elements/switch.tsx +0 -118
  473. package/src/elements/tabs.tsx +0 -95
  474. package/src/elements/tasks.tsx +0 -103
  475. package/src/elements/text-shimmer.tsx +0 -28
  476. package/src/elements/thinking-bar.tsx +0 -43
  477. package/src/elements/thread.tsx +0 -139
  478. package/src/elements/toast.tsx +0 -106
  479. package/src/elements/tool.tsx +0 -78
  480. package/src/elements/tooltip.tsx +0 -85
  481. package/src/elements/validate-messages.ts +0 -76
  482. package/src/elements/voice-input.tsx +0 -100
  483. package/src/elements/voice-output.tsx +0 -82
  484. package/src/index.ts +0 -428
  485. package/src/primitives/audio-bands.ts +0 -174
  486. package/src/primitives/card-component-types.ts +0 -63
  487. package/src/primitives/card-contract.ts +0 -80
  488. package/src/primitives/card-data-types.ts +0 -361
  489. package/src/primitives/card-host.tsx +0 -37
  490. package/src/primitives/card-recovery.ts +0 -160
  491. package/src/primitives/card-registry.tsx +0 -78
  492. package/src/primitives/card-resolution.ts +0 -36
  493. package/src/primitives/card-routing.ts +0 -85
  494. package/src/primitives/card-schemas/artifact.schema.json +0 -92
  495. package/src/primitives/card-schemas/card-envelope.schema.json +0 -14
  496. package/src/primitives/card-schemas/card-event.schema.json +0 -12
  497. package/src/primitives/card-schemas/choice.schema.json +0 -75
  498. package/src/primitives/card-schemas/confirm.schema.json +0 -65
  499. package/src/primitives/card-schemas/embed.schema.json +0 -63
  500. package/src/primitives/card-schemas/form.result.schema.json +0 -7
  501. package/src/primitives/card-schemas/form.schema.json +0 -53
  502. package/src/primitives/card-schemas/link.schema.json +0 -54
  503. package/src/primitives/card-schemas/tasks.result.schema.json +0 -16
  504. package/src/primitives/card-schemas/tasks.schema.json +0 -83
  505. package/src/primitives/card-tags.ts +0 -61
  506. package/src/primitives/card-validate-cards.ts +0 -255
  507. package/src/primitives/card-validate-schemas.ts +0 -58
  508. package/src/primitives/card-validate.ts +0 -131
  509. package/src/primitives/chat-config.tsx +0 -103
  510. package/src/primitives/composer-model.ts +0 -49
  511. package/src/primitives/composer-triggers.ts +0 -35
  512. package/src/primitives/controllable.ts +0 -21
  513. package/src/primitives/create-kai-chat.ts +0 -66
  514. package/src/primitives/create-tween.ts +0 -266
  515. package/src/primitives/embed-providers.ts +0 -254
  516. package/src/primitives/field-mask.ts +0 -256
  517. package/src/primitives/field-semantics.ts +0 -115
  518. package/src/primitives/highlighter.ts +0 -157
  519. package/src/primitives/input-mask.ts +0 -853
  520. package/src/primitives/link-preview.ts +0 -87
  521. package/src/primitives/message-feedback.ts +0 -124
  522. package/src/primitives/pdf-preview.ts +0 -121
  523. package/src/primitives/toast-store.ts +0 -338
  524. package/src/primitives/url-scheme-policy.ts +0 -70
  525. package/src/primitives/use-audio-analysis.ts +0 -340
  526. package/src/primitives/use-auto-resize.ts +0 -31
  527. package/src/primitives/use-resize-observer.ts +0 -45
  528. package/src/primitives/use-sequencer.ts +0 -72
  529. package/src/primitives/use-speech-recognition.ts +0 -146
  530. package/src/primitives/use-stick-to-bottom.ts +0 -75
  531. package/src/primitives/use-text-stream.ts +0 -143
  532. package/src/primitives/use-voice-recorder.ts +0 -62
  533. package/src/primitives/visualizer-sequences.ts +0 -350
  534. package/src/remote/host-embed.ts +0 -345
  535. package/src/remote/index.ts +0 -2
  536. package/src/remote/origin.ts +0 -30
  537. package/src/remote/provider-runtime.ts +0 -262
  538. package/src/remote/provider.ts +0 -2
  539. package/src/remote/validate.ts +0 -22
  540. package/src/remote/version.ts +0 -12
  541. package/src/remote/wire.ts +0 -48
  542. package/src/schemas/from-tool-call.ts +0 -151
  543. package/src/schemas/index.ts +0 -341
  544. package/src/schemas/provider-subsets.ts +0 -538
  545. package/src/schemas/registry.ts +0 -355
  546. package/src/schemas/tool-defs.ts +0 -793
  547. package/src/solid.ts +0 -165
  548. package/src/state/index.ts +0 -44
  549. package/src/state/messages.ts +0 -53
  550. package/src/state/mock.ts +0 -297
  551. package/src/state/parts.ts +0 -295
  552. package/src/state/persistence.ts +0 -180
  553. package/src/state/stream.ts +0 -246
  554. package/src/state/suggestions.ts +0 -9
  555. package/src/state/threads.ts +0 -142
  556. package/src/test-utils/fake-clock.ts +0 -88
  557. package/src/types.ts +0 -53
  558. package/src/ui/action-icons.ts +0 -53
  559. package/src/ui/agent-card.tsx +0 -218
  560. package/src/ui/avatar.tsx +0 -23
  561. package/src/ui/badge.tsx +0 -21
  562. package/src/ui/button.tsx +0 -49
  563. package/src/ui/card.tsx +0 -245
  564. package/src/ui/checkbox-group.tsx +0 -153
  565. package/src/ui/checkbox.tsx +0 -63
  566. package/src/ui/collapsible.tsx +0 -163
  567. package/src/ui/command.tsx +0 -103
  568. package/src/ui/dialog.tsx +0 -223
  569. package/src/ui/dock.tsx +0 -584
  570. package/src/ui/dropdown.tsx +0 -636
  571. package/src/ui/editable-label.tsx +0 -112
  572. package/src/ui/hover-card.tsx +0 -345
  573. package/src/ui/icon.tsx +0 -167
  574. package/src/ui/input.tsx +0 -391
  575. package/src/ui/kbd.tsx +0 -118
  576. package/src/ui/nav.tsx +0 -282
  577. package/src/ui/notice.tsx +0 -84
  578. package/src/ui/overlay.tsx +0 -277
  579. package/src/ui/pane-grid.tsx +0 -117
  580. package/src/ui/pane-group.tsx +0 -291
  581. package/src/ui/pane.tsx +0 -193
  582. package/src/ui/popover.tsx +0 -106
  583. package/src/ui/progress-bar.tsx +0 -83
  584. package/src/ui/prompt-dock.tsx +0 -145
  585. package/src/ui/radio.tsx +0 -150
  586. package/src/ui/resizable.tsx +0 -693
  587. package/src/ui/scroll-area.tsx +0 -26
  588. package/src/ui/segmented.tsx +0 -109
  589. package/src/ui/select.tsx +0 -168
  590. package/src/ui/separator.tsx +0 -10
  591. package/src/ui/settings-group.tsx +0 -67
  592. package/src/ui/skeleton.tsx +0 -73
  593. package/src/ui/slider.tsx +0 -178
  594. package/src/ui/status.tsx +0 -48
  595. package/src/ui/switch.tsx +0 -119
  596. package/src/ui/tabs.tsx +0 -168
  597. package/src/ui/textarea.tsx +0 -21
  598. package/src/ui/tooltip.tsx +0 -118
  599. package/src/utils/cn.ts +0 -30
  600. package/src/wire/chunk.ts +0 -248
  601. package/src/wire/consume.ts +0 -599
  602. package/src/wire/diagnostics.ts +0 -727
  603. package/src/wire/encode-probe.ts +0 -214
  604. package/src/wire/encode.ts +0 -947
  605. package/src/wire/files.ts +0 -342
  606. package/src/wire/formats/anthropic.ts +0 -274
  607. package/src/wire/formats/openai.ts +0 -228
  608. package/src/wire/index.ts +0 -95
  609. package/src/wire/media-types.ts +0 -344
  610. package/src/wire/read.ts +0 -396
  611. package/src/wire/sink-helpers.ts +0 -50
  612. package/src/wire/sse.ts +0 -153
@@ -1,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,218 +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
- * The slotted-item shape rendered by `<kai-conversation-item>` — the composed
36
- * row of the consumer-owned loop. Distinct from the
37
- * data-mode `ConversationItem` above, which batteries mode keeps rendering
38
- * unchanged: this one takes REGIONS, not a `ConversationSummary`.
39
- *
40
- * Regions map 1:1 to the element's slots: `children` = the default slot (the
41
- * title), plus `leading`, `meta`, and `menu`. The `menu` region takes the
42
- * consumer's OWN popover (rename / fork / archive live there); the component
43
- * provides only the region plus focus and ARIA plumbing, never a declarative
44
- * actions prop. Activation has two modes: inside `<kai-conversations>` it
45
- * lives in the CONTAINER (`createConversationItemsController` in
46
- * conversation-list.tsx — this row renders no handler and the
47
- * `data-kai-item-menu` marker on the menu region is what the container's
48
- * activation guard keys off so a click in the consumer's menu never also
49
- * selects the row); STANDALONE, `onActivate` makes the row body
50
- * its own tabbable button-role control — click / Enter / Space — with the menu
51
- * still outside the control as the body's sibling.
52
- *
53
- * ARIA contract for direct Solid use: the row renders `role="listitem"` holding
54
- * a `role="button"` body (`aria-current` marks the active row, the same dialect
55
- * as the batteries-mode row above) with the menu as the body's tabbable SIBLING
56
- * (axe `nested-interactive` bans focusable descendants of
57
- * a control, and `aria-required-children` outlaws non-option content anywhere
58
- * inside a listbox, which is why the vocabulary is not listbox/option). Render
59
- * your loop's rows inside a `role="list"` ancestor; element mode has no such
60
- * burden: `<kai-conversations>`' items region provides it for slotted items.
61
- */
62
- export interface SlottedConversationItemProps {
63
- /** The row's identity, handed to the container's selection contract. In the
64
- * element this is the `conversation-id` attribute (host `id` is the fallback). */
65
- conversationId?: string;
66
- /** Selected state. Reflected as `aria-current` on the row body and a
67
- * `data-active` styling hook on the row; the container drives it from its
68
- * `activeId`. */
69
- active?: boolean;
70
- /** Dense single-line row padding. */
71
- compact?: boolean;
72
- /** Leading region before the title (an icon or avatar). */
73
- leading?: JSX.Element;
74
- /** Meta region under the title (a timestamp or status line). */
75
- meta?: JSX.Element;
76
- /** Your own row menu (a popover trigger). Never selects the row. */
77
- menu?: JSX.Element;
78
- /** The title (the element's default slot). */
79
- children?: JSX.Element;
80
- /** Set when the element HOST carries the row-group semantics: the inner row
81
- * then renders `role="presentation"` so the accessibility tree sees one
82
- * group (the host), never two. The `kai-conversation-item` facade sets it;
83
- * Solid consumers rendering the component directly leave it off and the row
84
- * itself is the group. */
85
- hostSemantics?: boolean;
86
- /** STANDALONE activation: when set, the row body is itself the
87
- * activation control — `tabindex="0"` on the `role="button"` body, and
88
- * click / Enter / Space call this. The menu region never triggers it (it is
89
- * the body's sibling, outside the control). Inside `<kai-conversations>`
90
- * leave it UNSET: the container's controller owns activation (its delegated
91
- * click/keydown → `kai-conversation-select`) plus roving tabindex, and a
92
- * handler here would double-fire. The `kai-conversation-item` facade passes
93
- * it only when the item is standalone. */
94
- onActivate?: () => void;
95
- class?: string;
96
- }
97
-
98
- export function SlottedConversationItem(props: SlottedConversationItemProps) {
99
- const [local] = splitProps(props, ['conversationId', 'active', 'compact', 'leading', 'meta', 'menu', 'children', 'hostSemantics', 'onActivate', 'class']);
100
- return (
101
- // The sibling restructure: axe nested-interactive
102
- // bans focusable descendants of an activation control, so the control role
103
- // sits on the row BODY and the consumer's menu is its tabbable SIBLING
104
- // (the nav.tsx TrailingActions precedent). The vocabulary is
105
- // list/listitem/button + aria-current — NOT listbox/option, because axe
106
- // aria-required-children lets a listbox subtree own nothing but options
107
- // (and groups of options), which outlaws a sibling menu ANYWHERE inside
108
- // it; button + aria-current is also exactly what the batteries-mode
109
- // ConversationItem row above renders, so the two modes speak one dialect.
110
- <div
111
- part="row"
112
- role={local.hostSemantics ? 'presentation' : 'listitem'}
113
- data-active={local.active ? '' : undefined}
114
- data-conversation-id={local.conversationId}
115
- class={cn(
116
- 'flex w-full items-center gap-2.5 rounded-lg text-left transition-colors',
117
- local.compact ? 'px-2.5 py-1.5' : 'px-2.5 py-2',
118
- local.active ? 'bg-muted' : 'hover:bg-muted/50',
119
- local.class,
120
- )}
121
- >
122
- <div
123
- part="body"
124
- role="button"
125
- data-kai-item-body
126
- aria-current={local.active ? 'true' : 'false'}
127
- // Standalone activation only: with `onActivate` unset —
128
- // the inside-a-container case — no tabindex and no handlers render, so
129
- // the container's delegated activation stays the single path.
130
- tabindex={local.onActivate ? 0 : undefined}
131
- onClick={() => local.onActivate?.()}
132
- onKeyDown={(e: KeyboardEvent) => {
133
- if (!local.onActivate) return;
134
- if (e.key === 'Enter' || e.key === ' ') {
135
- e.preventDefault(); // Space must not scroll the page
136
- local.onActivate();
137
- }
138
- }}
139
- 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"
140
- >
141
- <Show when={local.leading}>
142
- <span part="leading" class="flex shrink-0 items-center text-muted-foreground">{local.leading}</span>
143
- </Show>
144
- <div class="min-w-0 flex-1">
145
- <div part="title" class={cn('truncate text-sm', local.active ? 'font-medium text-foreground' : 'text-foreground/80')}>
146
- {local.children}
147
- </div>
148
- <Show when={local.meta}>
149
- <div part="meta" class="mt-0.5 truncate text-xs text-muted-foreground">{local.meta}</div>
150
- </Show>
151
- </div>
152
- </div>
153
- <Show when={local.menu}>
154
- <span part="menu" data-kai-item-menu class="ml-auto flex shrink-0 items-center">{local.menu}</span>
155
- </Show>
156
- </div>
157
- );
158
- }
159
-
160
- export function ConversationItem(props: ConversationItemProps) {
161
- const [local] = splitProps(props, ['conversation', 'isActive', 'onSelect', 'compact', 'class']);
162
- // The trailing text: the consumer's own `trailing` field, else an auto relative
163
- // time from updatedAt (fallback lastMessageAt). Never an internal clock — it is a
164
- // render-time snapshot.
165
- //
166
- // REACTIVITY, and the weaker version of this note is what #224 was filed against:
167
- // a new `conversations` array reference is NOT sufficient. `ConversationList` renders
168
- // these rows through a reference-keyed `<For>` that captures `conv` as a VALUE, so a
169
- // row whose item object is unchanged is never re-invoked and never re-reads anything
170
- // below. The consumer needs BOTH — a new array (which is what notifies at all) and a
171
- // new object for the item that changed (which is what this row can see). Adds,
172
- // removes and reorders are fine on a fresh array alone, since those rows' identities
173
- // already differ. Pinned by `src/components/reactivity-contract.test.tsx`.
174
- const trailing = createMemo(
175
- () => local.conversation.trailing ?? relativeTimeShort(local.conversation.updatedAt ?? local.conversation.lastMessageAt),
176
- );
177
- return (
178
- <button
179
- data-conversation-id={local.conversation.id}
180
- // `isActive` drives the selected LOOK below; it has to reach assistive tech
181
- // too, or the active conversation is visible only to sighted users. `true`
182
- // rather than `page` because this selects a conversation within the app, it
183
- // is not page navigation — same call as ui/agent-card.tsx and ui/pane-group.tsx
184
- // (ui/nav.tsx uses `page` because its items really are nav links).
185
- aria-current={local.isActive ? 'true' : undefined}
186
- onClick={() => local.onSelect(local.conversation.id)}
187
- class={cn(
188
- 'w-full rounded-lg text-left transition-colors',
189
- local.compact ? 'px-2.5 py-1.5' : 'px-2.5 py-2',
190
- local.isActive ? 'bg-muted' : 'hover:bg-muted/50',
191
- local.class,
192
- )}
193
- >
194
- <Show
195
- when={local.compact}
196
- fallback={
197
- <>
198
- <div class="flex items-center gap-2">
199
- <div class={cn('min-w-0 flex-1 truncate text-sm', local.isActive ? 'font-medium text-foreground' : 'text-foreground/80')}>{local.conversation.title}</div>
200
- <Show when={trailing()}>
201
- <span part="trailing" class="ml-auto shrink-0 text-xs text-muted-foreground">{trailing()}</span>
202
- </Show>
203
- </div>
204
- <div class={cn('mt-0.5 truncate text-xs', local.isActive ? 'text-foreground/70' : 'text-muted-foreground')}>{local.conversation.messageCount} messages</div>
205
- </>
206
- }
207
- >
208
- <div class="flex items-center gap-2.5">
209
- <MessageSquare class={cn('size-3.5 shrink-0', local.isActive ? 'text-foreground' : 'text-muted-foreground')} />
210
- <span class={cn('min-w-0 flex-1 truncate text-sm', local.isActive ? 'font-medium text-foreground' : 'text-foreground/80')}>{local.conversation.title}</span>
211
- <Show when={trailing()}>
212
- <span part="trailing" class="ml-auto shrink-0 text-xs text-muted-foreground">{trailing()}</span>
213
- </Show>
214
- </div>
215
- </Show>
216
- </button>
217
- );
218
- }