@cueplusplus/ui 0.3.0 → 0.5.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 (488) hide show
  1. package/CHANGELOG.md +2229 -0
  2. package/dist/agent-runtime/_glyphs.js +43 -0
  3. package/dist/agent-runtime/branch-picker.d.ts +45 -0
  4. package/dist/agent-runtime/branch-picker.js +87 -0
  5. package/dist/agent-runtime/index.d.ts +4 -0
  6. package/dist/agent-runtime/index.js +4 -0
  7. package/dist/agent-runtime/tool-call-card.d.ts +69 -0
  8. package/dist/agent-runtime/tool-call-card.js +187 -0
  9. package/dist/agent-runtime/use-agent-thread.d.ts +164 -0
  10. package/dist/agent-runtime/use-agent-thread.js +251 -0
  11. package/dist/chat/index.d.ts +2 -2
  12. package/dist/chat/message-list.d.ts +6 -0
  13. package/dist/chat/message-list.js +35 -0
  14. package/dist/chrome/app-shell.d.ts +52 -2
  15. package/dist/chrome/app-shell.js +80 -8
  16. package/dist/chrome/index.d.ts +2 -2
  17. package/dist/configurator/_export.js +3 -2
  18. package/dist/configurator/_overrides.d.ts +1 -1
  19. package/dist/configurator/token-editor.js +4 -1
  20. package/dist/date/_segments.js +37 -2
  21. package/dist/elements/activity-graph.d.ts +40 -0
  22. package/dist/elements/activity-graph.js +81 -0
  23. package/dist/elements/agent-card.d.ts +49 -0
  24. package/dist/elements/agent-card.js +91 -0
  25. package/dist/elements/agent-handoff.d.ts +24 -0
  26. package/dist/elements/agent-handoff.js +53 -0
  27. package/dist/elements/agent-mode-badge.d.ts +72 -0
  28. package/dist/elements/agent-mode-badge.js +110 -0
  29. package/dist/elements/agent-plan.d.ts +24 -0
  30. package/dist/elements/agent-plan.js +74 -0
  31. package/dist/elements/agent-status.d.ts +29 -0
  32. package/dist/elements/agent-status.js +46 -0
  33. package/dist/elements/agent-surface.d.ts +65 -0
  34. package/dist/elements/agent-surface.js +68 -0
  35. package/dist/elements/animated-number.d.ts +86 -0
  36. package/dist/elements/animated-number.js +118 -0
  37. package/dist/elements/approval-card.d.ts +40 -0
  38. package/dist/elements/approval-card.js +78 -0
  39. package/dist/elements/artifact-card.d.ts +30 -0
  40. package/dist/elements/artifact-card.js +58 -0
  41. package/dist/elements/background-inbox.d.ts +39 -0
  42. package/dist/elements/background-inbox.js +60 -0
  43. package/dist/elements/canvas-split.d.ts +77 -0
  44. package/dist/elements/canvas-split.js +138 -0
  45. package/dist/elements/chart.d.ts +41 -0
  46. package/dist/elements/chart.js +117 -0
  47. package/dist/elements/chat-panel.d.ts +46 -0
  48. package/dist/elements/chat-panel.js +104 -0
  49. package/dist/elements/checkpoint-history.d.ts +31 -0
  50. package/dist/elements/checkpoint-history.js +65 -0
  51. package/dist/elements/clamp.d.ts +90 -0
  52. package/dist/elements/clamp.js +109 -0
  53. package/dist/elements/code-diff.d.ts +42 -0
  54. package/dist/elements/code-diff.js +69 -0
  55. package/dist/elements/code-runner.d.ts +38 -0
  56. package/dist/elements/code-runner.js +84 -0
  57. package/dist/elements/command-palette.d.ts +48 -0
  58. package/dist/elements/command-palette.js +129 -0
  59. package/dist/elements/compaction-row.d.ts +63 -0
  60. package/dist/elements/compaction-row.js +110 -0
  61. package/dist/elements/comparison-card.d.ts +47 -0
  62. package/dist/elements/comparison-card.js +69 -0
  63. package/dist/elements/composer.d.ts +274 -0
  64. package/dist/elements/composer.js +505 -0
  65. package/dist/elements/computer-use.d.ts +40 -0
  66. package/dist/elements/computer-use.js +92 -0
  67. package/dist/elements/confidence-marker.d.ts +39 -0
  68. package/dist/elements/confidence-marker.js +64 -0
  69. package/dist/elements/connection-state.d.ts +29 -0
  70. package/dist/elements/connection-state.js +66 -0
  71. package/dist/elements/context-breakdown.d.ts +30 -0
  72. package/dist/elements/context-breakdown.js +86 -0
  73. package/dist/elements/context-usage.d.ts +99 -0
  74. package/dist/elements/context-usage.js +225 -0
  75. package/dist/elements/conversation-search.d.ts +48 -0
  76. package/dist/elements/conversation-search.js +88 -0
  77. package/dist/elements/cost-meter.d.ts +33 -0
  78. package/dist/elements/cost-meter.js +75 -0
  79. package/dist/elements/data-table.d.ts +31 -0
  80. package/dist/elements/data-table.js +67 -0
  81. package/dist/elements/day-separator.d.ts +34 -0
  82. package/dist/elements/day-separator.js +50 -0
  83. package/dist/elements/diagram.d.ts +34 -0
  84. package/dist/elements/diagram.js +75 -0
  85. package/dist/elements/document-reference.d.ts +37 -0
  86. package/dist/elements/document-reference.js +66 -0
  87. package/dist/elements/draft-restore.d.ts +27 -0
  88. package/dist/elements/draft-restore.js +54 -0
  89. package/dist/elements/edit-message.d.ts +36 -0
  90. package/dist/elements/edit-message.js +77 -0
  91. package/dist/elements/elements.css +459 -0
  92. package/dist/elements/elicitation-form.d.ts +48 -0
  93. package/dist/elements/elicitation-form.js +106 -0
  94. package/dist/elements/empty-state.d.ts +52 -0
  95. package/dist/elements/empty-state.js +98 -0
  96. package/dist/elements/end-of-turn-summary.d.ts +60 -0
  97. package/dist/elements/end-of-turn-summary.js +75 -0
  98. package/dist/elements/error-state.d.ts +29 -0
  99. package/dist/elements/error-state.js +55 -0
  100. package/dist/elements/feedback-dialog.d.ts +36 -0
  101. package/dist/elements/feedback-dialog.js +81 -0
  102. package/dist/elements/file-tree.d.ts +45 -0
  103. package/dist/elements/file-tree.js +84 -0
  104. package/dist/elements/flow-graph.d.ts +45 -0
  105. package/dist/elements/flow-graph.js +78 -0
  106. package/dist/elements/generative/chart.js +200 -0
  107. package/dist/elements/generative/faults.js +111 -0
  108. package/dist/elements/generative/icons.d.ts +41 -0
  109. package/dist/elements/generative/icons.js +190 -0
  110. package/dist/elements/generative/intrinsics.js +483 -0
  111. package/dist/elements/generative/spec.d.ts +110 -0
  112. package/dist/elements/generative/spec.js +366 -0
  113. package/dist/elements/generative.css +1145 -0
  114. package/dist/elements/generative.d.ts +144 -0
  115. package/dist/elements/generative.js +126 -0
  116. package/dist/elements/guardrail-notice.d.ts +29 -0
  117. package/dist/elements/guardrail-notice.js +63 -0
  118. package/dist/elements/image-generation.d.ts +18 -0
  119. package/dist/elements/image-generation.js +64 -0
  120. package/dist/elements/index.d.ts +116 -0
  121. package/dist/elements/index.js +115 -0
  122. package/dist/elements/inline-citation.d.ts +43 -0
  123. package/dist/elements/inline-citation.js +93 -0
  124. package/dist/elements/job-progress.d.ts +49 -0
  125. package/dist/elements/job-progress.js +74 -0
  126. package/dist/elements/launcher-bubble.d.ts +34 -0
  127. package/dist/elements/launcher-bubble.js +72 -0
  128. package/dist/elements/live-region-announcer.d.ts +130 -0
  129. package/dist/elements/live-region-announcer.js +230 -0
  130. package/dist/elements/loading-state.d.ts +27 -0
  131. package/dist/elements/loading-state.js +36 -0
  132. package/dist/elements/map-answer.d.ts +38 -0
  133. package/dist/elements/map-answer.js +93 -0
  134. package/dist/elements/markdown.d.ts +131 -0
  135. package/dist/elements/markdown.js +528 -0
  136. package/dist/elements/math-block.d.ts +51 -0
  137. package/dist/elements/math-block.js +70 -0
  138. package/dist/elements/mcp-server-panel.d.ts +41 -0
  139. package/dist/elements/mcp-server-panel.js +115 -0
  140. package/dist/elements/memory-chips.d.ts +30 -0
  141. package/dist/elements/memory-chips.js +43 -0
  142. package/dist/elements/message-actions.d.ts +38 -0
  143. package/dist/elements/message-actions.js +71 -0
  144. package/dist/elements/message-attachment.d.ts +48 -0
  145. package/dist/elements/message-attachment.js +63 -0
  146. package/dist/elements/message-branches.d.ts +25 -0
  147. package/dist/elements/message-branches.js +65 -0
  148. package/dist/elements/message-pair.d.ts +33 -0
  149. package/dist/elements/message-pair.js +65 -0
  150. package/dist/elements/message-queue.d.ts +31 -0
  151. package/dist/elements/message-queue.js +80 -0
  152. package/dist/elements/message-timing.d.ts +33 -0
  153. package/dist/elements/message-timing.js +37 -0
  154. package/dist/elements/mobile-composer.d.ts +44 -0
  155. package/dist/elements/mobile-composer.js +88 -0
  156. package/dist/elements/model-picker.d.ts +38 -0
  157. package/dist/elements/model-picker.js +69 -0
  158. package/dist/elements/number-ticker.d.ts +18 -0
  159. package/dist/elements/number-ticker.js +47 -0
  160. package/dist/elements/onboarding.d.ts +30 -0
  161. package/dist/elements/onboarding.js +75 -0
  162. package/dist/elements/permission-grant.d.ts +35 -0
  163. package/dist/elements/permission-grant.js +86 -0
  164. package/dist/elements/permission-scopes.d.ts +215 -0
  165. package/dist/elements/permission-scopes.js +249 -0
  166. package/dist/elements/prompt-library.d.ts +43 -0
  167. package/dist/elements/prompt-library.js +117 -0
  168. package/dist/elements/queue-dock.d.ts +101 -0
  169. package/dist/elements/queue-dock.js +132 -0
  170. package/dist/elements/quota-banner.d.ts +26 -0
  171. package/dist/elements/quota-banner.js +66 -0
  172. package/dist/elements/quote-reply.d.ts +44 -0
  173. package/dist/elements/quote-reply.js +79 -0
  174. package/dist/elements/range.d.ts +29 -0
  175. package/dist/elements/range.js +45 -0
  176. package/dist/elements/read-aloud.d.ts +45 -0
  177. package/dist/elements/read-aloud.js +75 -0
  178. package/dist/elements/reasoning-effort.d.ts +36 -0
  179. package/dist/elements/reasoning-effort.js +67 -0
  180. package/dist/elements/reasoning-panel.d.ts +46 -0
  181. package/dist/elements/reasoning-panel.js +75 -0
  182. package/dist/elements/recommendation-card.d.ts +45 -0
  183. package/dist/elements/recommendation-card.js +83 -0
  184. package/dist/elements/regenerate-menu.d.ts +45 -0
  185. package/dist/elements/regenerate-menu.js +51 -0
  186. package/dist/elements/replay.d.ts +217 -0
  187. package/dist/elements/replay.js +498 -0
  188. package/dist/elements/research-report.d.ts +38 -0
  189. package/dist/elements/research-report.js +69 -0
  190. package/dist/elements/retrieval-chunks.d.ts +43 -0
  191. package/dist/elements/retrieval-chunks.js +81 -0
  192. package/dist/elements/revert-dock.d.ts +159 -0
  193. package/dist/elements/revert-dock.js +327 -0
  194. package/dist/elements/reviewable-diff.d.ts +45 -0
  195. package/dist/elements/reviewable-diff.js +110 -0
  196. package/dist/elements/risk-badge.d.ts +52 -0
  197. package/dist/elements/risk-badge.js +91 -0
  198. package/dist/elements/schedule-card.d.ts +42 -0
  199. package/dist/elements/schedule-card.js +90 -0
  200. package/dist/elements/score-breakdown.d.ts +47 -0
  201. package/dist/elements/score-breakdown.js +82 -0
  202. package/dist/elements/scroll-anchor.d.ts +32 -0
  203. package/dist/elements/scroll-anchor.js +121 -0
  204. package/dist/elements/settings-panel.d.ts +52 -0
  205. package/dist/elements/settings-panel.js +107 -0
  206. package/dist/elements/shared-conversation.d.ts +39 -0
  207. package/dist/elements/shared-conversation.js +68 -0
  208. package/dist/elements/sources.d.ts +33 -0
  209. package/dist/elements/sources.js +61 -0
  210. package/dist/elements/speaker-identity.d.ts +32 -0
  211. package/dist/elements/speaker-identity.js +51 -0
  212. package/dist/elements/spec-sheet.d.ts +31 -0
  213. package/dist/elements/spec-sheet.js +45 -0
  214. package/dist/elements/stopped-run.d.ts +22 -0
  215. package/dist/elements/stopped-run.js +50 -0
  216. package/dist/elements/streaming-text.d.ts +31 -0
  217. package/dist/elements/streaming-text.js +45 -0
  218. package/dist/elements/subagent-list.d.ts +37 -0
  219. package/dist/elements/subagent-list.js +79 -0
  220. package/dist/elements/suggestions.d.ts +30 -0
  221. package/dist/elements/suggestions.js +36 -0
  222. package/dist/elements/surfaces.d.ts +85 -0
  223. package/dist/elements/surfaces.js +107 -0
  224. package/dist/elements/tail-status.d.ts +131 -0
  225. package/dist/elements/tail-status.js +94 -0
  226. package/dist/elements/terminal-block.d.ts +29 -0
  227. package/dist/elements/terminal-block.js +54 -0
  228. package/dist/elements/thinking-indicator.d.ts +18 -0
  229. package/dist/elements/thinking-indicator.js +36 -0
  230. package/dist/elements/thread-list.d.ts +35 -0
  231. package/dist/elements/thread-list.js +68 -0
  232. package/dist/elements/thread-search.d.ts +42 -0
  233. package/dist/elements/thread-search.js +99 -0
  234. package/dist/elements/timeline.d.ts +37 -0
  235. package/dist/elements/timeline.js +46 -0
  236. package/dist/elements/todo-list.d.ts +42 -0
  237. package/dist/elements/todo-list.js +59 -0
  238. package/dist/elements/tool-call.d.ts +41 -0
  239. package/dist/elements/tool-call.js +85 -0
  240. package/dist/elements/tool-error.d.ts +39 -0
  241. package/dist/elements/tool-error.js +76 -0
  242. package/dist/elements/tool-group.d.ts +45 -0
  243. package/dist/elements/tool-group.js +71 -0
  244. package/dist/elements/tool-timeline.d.ts +65 -0
  245. package/dist/elements/tool-timeline.js +88 -0
  246. package/dist/elements/trace-waterfall.d.ts +37 -0
  247. package/dist/elements/trace-waterfall.js +69 -0
  248. package/dist/elements/transcript-rules.d.ts +67 -0
  249. package/dist/elements/transcript-rules.js +95 -0
  250. package/dist/elements/turn-footer.d.ts +74 -0
  251. package/dist/elements/turn-footer.js +101 -0
  252. package/dist/elements/typing-indicator.d.ts +16 -0
  253. package/dist/elements/typing-indicator.js +51 -0
  254. package/dist/elements/verdict-row.d.ts +89 -0
  255. package/dist/elements/verdict-row.js +150 -0
  256. package/dist/elements/vocabulary.d.ts +612 -0
  257. package/dist/elements/vocabulary.js +611 -0
  258. package/dist/elements/voice-conversation.d.ts +49 -0
  259. package/dist/elements/voice-conversation.js +123 -0
  260. package/dist/elements/web-preview.d.ts +32 -0
  261. package/dist/elements/web-preview.js +66 -0
  262. package/dist/elements/web-search.d.ts +37 -0
  263. package/dist/elements/web-search.js +66 -0
  264. package/dist/elements/work-collapse.d.ts +103 -0
  265. package/dist/elements/work-collapse.js +131 -0
  266. package/dist/icons/containers.d.ts +89 -0
  267. package/dist/icons/containers.js +295 -0
  268. package/dist/icons/index.d.ts +2 -0
  269. package/dist/index.d.ts +6 -4
  270. package/dist/index.js +2 -1
  271. package/dist/instruments/two-step-button.js +25 -6
  272. package/dist/layout/sidebar.d.ts +19 -1
  273. package/dist/layout/sidebar.js +19 -1
  274. package/dist/primitives/button.js +11 -1
  275. package/dist/primitives/chip.d.ts +35 -9
  276. package/dist/primitives/chip.js +97 -11
  277. package/dist/system/agent-skin.d.ts +27 -0
  278. package/dist/system/agent-skin.js +20 -0
  279. package/dist/system/portal.d.ts +5 -3
  280. package/dist/system/portal.js +19 -5
  281. package/dist/system/theme-provider.js +54 -9
  282. package/dist/system/use-density.d.ts +9 -0
  283. package/dist/system/use-density.js +9 -0
  284. package/dist/system/use-isomorphic-layout-effect.js +19 -1
  285. package/dist/theming/_presets.d.ts +1 -1
  286. package/dist/theming/_presets.js +71 -8
  287. package/dist/theming/contrast.d.ts +16 -4
  288. package/dist/theming/contrast.js +33 -6
  289. package/dist/theming/create-theme.d.ts +6 -2
  290. package/dist/theming/create-theme.js +32 -5
  291. package/dist/theming/serialize.d.ts +10 -1
  292. package/dist/theming/serialize.js +62 -8
  293. package/manifest/components/activity-graph.json +88 -0
  294. package/manifest/components/agent-card.json +120 -0
  295. package/manifest/components/agent-handoff.json +87 -0
  296. package/manifest/components/agent-mode-badge.json +84 -0
  297. package/manifest/components/agent-plan.json +67 -0
  298. package/manifest/components/agent-status.json +73 -0
  299. package/manifest/components/agent-surface.json +78 -0
  300. package/manifest/components/alert-dialog.json +1 -1
  301. package/manifest/components/animated-number.json +67 -0
  302. package/manifest/components/app-shell.json +99 -7
  303. package/manifest/components/approval-card.json +106 -0
  304. package/manifest/components/artifact-card.json +81 -0
  305. package/manifest/components/audience-icon.json +52 -0
  306. package/manifest/components/background-inbox.json +71 -0
  307. package/manifest/components/branch-picker.json +124 -0
  308. package/manifest/components/button.json +1 -0
  309. package/manifest/components/canvas-split-body.json +62 -0
  310. package/manifest/components/canvas-split-document.json +54 -0
  311. package/manifest/components/canvas-split-header.json +83 -0
  312. package/manifest/components/canvas-split-line.json +62 -0
  313. package/manifest/components/canvas-split-message.json +62 -0
  314. package/manifest/components/canvas-split-thread.json +54 -0
  315. package/manifest/components/canvas-split.json +60 -0
  316. package/manifest/components/catalogue-icon.json +52 -0
  317. package/manifest/components/channel-beta-icon.json +52 -0
  318. package/manifest/components/channel-released-icon.json +52 -0
  319. package/manifest/components/chart.json +93 -0
  320. package/manifest/components/chat-empty-state.json +55 -0
  321. package/manifest/components/chat-panel-assistant-message.json +51 -0
  322. package/manifest/components/chat-panel-composer.json +66 -0
  323. package/manifest/components/chat-panel-messages.json +51 -0
  324. package/manifest/components/chat-panel-typing.json +51 -0
  325. package/manifest/components/chat-panel-user-message.json +51 -0
  326. package/manifest/components/chat-panel.json +57 -0
  327. package/manifest/components/checkpoint-history.json +80 -0
  328. package/manifest/components/chip.json +24 -12
  329. package/manifest/components/clamp.json +102 -0
  330. package/manifest/components/cli-tool-icon.json +52 -0
  331. package/manifest/components/code-diff.json +87 -0
  332. package/manifest/components/code-runner.json +97 -0
  333. package/manifest/components/compaction-row.json +100 -0
  334. package/manifest/components/comparison-card.json +83 -0
  335. package/manifest/components/composer-actions.json +65 -0
  336. package/manifest/components/composer-attach-button.json +65 -0
  337. package/manifest/components/composer-attachment-chip.json +75 -0
  338. package/manifest/components/composer-attachments.json +60 -0
  339. package/manifest/components/composer-bar.json +73 -0
  340. package/manifest/components/composer-command-item.json +79 -0
  341. package/manifest/components/composer-context.json +67 -0
  342. package/manifest/components/composer-input.json +73 -0
  343. package/manifest/components/composer-menu-item.json +72 -0
  344. package/manifest/components/composer-menu.json +79 -0
  345. package/manifest/components/composer-model-item.json +75 -0
  346. package/manifest/components/composer-model-trigger.json +75 -0
  347. package/manifest/components/composer-person-item.json +79 -0
  348. package/manifest/components/composer-send.json +80 -0
  349. package/manifest/components/composer-toolbar.json +65 -0
  350. package/manifest/components/composer-voice-button.json +68 -0
  351. package/manifest/components/composer-voice.json +75 -0
  352. package/manifest/components/computer-use.json +84 -0
  353. package/manifest/components/confidence-marker.json +74 -0
  354. package/manifest/components/connection-state.json +84 -0
  355. package/manifest/components/context-breakdown.json +65 -0
  356. package/manifest/components/context-usage.json +85 -0
  357. package/manifest/components/conversation-search.json +92 -0
  358. package/manifest/components/cost-meter.json +74 -0
  359. package/manifest/components/cue-portal-frame.json +1 -1
  360. package/manifest/components/day-separator.json +58 -0
  361. package/manifest/components/delegation-card.json +1 -1
  362. package/manifest/components/density.json +1 -1
  363. package/manifest/components/diagram.json +100 -0
  364. package/manifest/components/document-reference.json +90 -0
  365. package/manifest/components/draft-restore.json +82 -0
  366. package/manifest/components/drawer.json +1 -1
  367. package/manifest/components/dropdown-menu.json +1 -1
  368. package/manifest/components/edit-message.json +105 -0
  369. package/manifest/components/elements-command-palette.json +100 -0
  370. package/manifest/components/elements-composer.json +71 -0
  371. package/manifest/components/elements-data-table.json +68 -0
  372. package/manifest/components/elements-timeline.json +69 -0
  373. package/manifest/components/elicitation-form.json +103 -0
  374. package/manifest/components/empty-state-composer.json +64 -0
  375. package/manifest/components/empty-state-greeting.json +49 -0
  376. package/manifest/components/empty-state-suggestion.json +57 -0
  377. package/manifest/components/empty-state-suggestions.json +49 -0
  378. package/manifest/components/end-of-turn-summary.json +77 -0
  379. package/manifest/components/error-state.json +80 -0
  380. package/manifest/components/feedback-dialog.json +107 -0
  381. package/manifest/components/file-tree.json +83 -0
  382. package/manifest/components/flow-graph.json +75 -0
  383. package/manifest/components/folder-icon.json +52 -0
  384. package/manifest/components/frac.json +59 -0
  385. package/manifest/components/generation-loader.json +64 -0
  386. package/manifest/components/generative-ui.json +93 -0
  387. package/manifest/components/guardrail-notice.json +91 -0
  388. package/manifest/components/hover-card.json +1 -1
  389. package/manifest/components/image-generation.json +67 -0
  390. package/manifest/components/info-tip.json +1 -1
  391. package/manifest/components/inline-citation.json +77 -0
  392. package/manifest/components/job-progress.json +96 -0
  393. package/manifest/components/launcher-bubble.json +105 -0
  394. package/manifest/components/live-region-announcer.json +79 -0
  395. package/manifest/components/map-answer.json +83 -0
  396. package/manifest/components/markdown-text.json +94 -0
  397. package/manifest/components/math-block.json +74 -0
  398. package/manifest/components/mcp-server-icon.json +52 -0
  399. package/manifest/components/mcp-server-panel.json +87 -0
  400. package/manifest/components/memory-chips.json +65 -0
  401. package/manifest/components/message-actions.json +99 -0
  402. package/manifest/components/message-attachments.json +63 -0
  403. package/manifest/components/message-branches.json +71 -0
  404. package/manifest/components/message-list.json +1 -1
  405. package/manifest/components/message-pair.json +86 -0
  406. package/manifest/components/message-queue.json +74 -0
  407. package/manifest/components/message-timing.json +62 -0
  408. package/manifest/components/mobile-composer.json +126 -0
  409. package/manifest/components/model-picker.json +76 -0
  410. package/manifest/components/node-card.json +1 -1
  411. package/manifest/components/node-handle.json +1 -1
  412. package/manifest/components/number-ticker.json +61 -0
  413. package/manifest/components/onboarding.json +84 -0
  414. package/manifest/components/otp-field.json +7 -7
  415. package/manifest/components/permission-grant.json +92 -0
  416. package/manifest/components/permission-scopes.json +139 -0
  417. package/manifest/components/popover.json +1 -1
  418. package/manifest/components/prompt-library.json +99 -0
  419. package/manifest/components/queue-dock.json +110 -0
  420. package/manifest/components/quota-banner.json +94 -0
  421. package/manifest/components/quote-reply.json +105 -0
  422. package/manifest/components/read-aloud.json +111 -0
  423. package/manifest/components/reasoning-effort.json +81 -0
  424. package/manifest/components/reasoning-panel.json +108 -0
  425. package/manifest/components/recommendation-card.json +107 -0
  426. package/manifest/components/regenerate-menu.json +89 -0
  427. package/manifest/components/replay-player.json +102 -0
  428. package/manifest/components/research-report.json +76 -0
  429. package/manifest/components/retrieval-chunks.json +84 -0
  430. package/manifest/components/revert-dock.json +150 -0
  431. package/manifest/components/reviewable-diff.json +93 -0
  432. package/manifest/components/risk-badge.json +74 -0
  433. package/manifest/components/schedule-card.json +101 -0
  434. package/manifest/components/score-breakdown.json +91 -0
  435. package/manifest/components/scroll-anchor.json +72 -0
  436. package/manifest/components/scroll-area.json +7 -7
  437. package/manifest/components/search-input.json +7 -7
  438. package/manifest/components/segmented-control.json +21 -21
  439. package/manifest/components/settings-panel.json +118 -0
  440. package/manifest/components/shared-conversation.json +89 -0
  441. package/manifest/components/shimmer-label.json +59 -0
  442. package/manifest/components/skill-icon.json +52 -0
  443. package/manifest/components/sources.json +83 -0
  444. package/manifest/components/speaker-identity.json +61 -0
  445. package/manifest/components/spec-sheet.json +80 -0
  446. package/manifest/components/stack-icon.json +52 -0
  447. package/manifest/components/stacks-matrix-icon.json +52 -0
  448. package/manifest/components/stat.json +1 -1
  449. package/manifest/components/status-dot.json +1 -1
  450. package/manifest/components/stopped-run.json +81 -0
  451. package/manifest/components/streaming-text.json +71 -0
  452. package/manifest/components/sub.json +44 -0
  453. package/manifest/components/subagent-list.json +88 -0
  454. package/manifest/components/suggestions.json +84 -0
  455. package/manifest/components/sup.json +44 -0
  456. package/manifest/components/swap-label.json +71 -0
  457. package/manifest/components/tail-status.json +109 -0
  458. package/manifest/components/terminal-block.json +91 -0
  459. package/manifest/components/theme-provider.json +2 -2
  460. package/manifest/components/thinking-indicator.json +63 -0
  461. package/manifest/components/thread-list.json +76 -0
  462. package/manifest/components/thread-search.json +90 -0
  463. package/manifest/components/threshold-rail.json +2 -2
  464. package/manifest/components/time-boundary.json +62 -0
  465. package/manifest/components/timeline.json +1 -1
  466. package/manifest/components/todo-list.json +69 -0
  467. package/manifest/components/toggle-group.json +7 -7
  468. package/manifest/components/token-editor.json +1 -1
  469. package/manifest/components/tool-call-card.json +200 -0
  470. package/manifest/components/tool-call.json +119 -0
  471. package/manifest/components/tool-error.json +114 -0
  472. package/manifest/components/tool-group.json +83 -0
  473. package/manifest/components/tool-timeline.json +119 -0
  474. package/manifest/components/toolbar.json +7 -7
  475. package/manifest/components/tooltip.json +1 -1
  476. package/manifest/components/trace-waterfall.json +74 -0
  477. package/manifest/components/turn-footer.json +105 -0
  478. package/manifest/components/typing-indicator.json +53 -0
  479. package/manifest/components/unread-divider.json +55 -0
  480. package/manifest/components/usage-chart.json +1 -1
  481. package/manifest/components/verdict-row.json +91 -0
  482. package/manifest/components/voice-conversation.json +109 -0
  483. package/manifest/components/web-preview.json +87 -0
  484. package/manifest/components/web-search.json +92 -0
  485. package/manifest/components/work-collapse.json +102 -0
  486. package/manifest/manifest.json +2670 -33
  487. package/manifest/tokens.json +22 -1
  488. package/package.json +46 -4
@@ -0,0 +1,505 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { ShimmerLabel, field, floating, ghostButton, iconSwap, iconSwapIn, iconSwapOut, inkButton, mono, paper } from "./surfaces.js";
4
+ import { clamp, pct } from "./range.js";
5
+ import { useMemo } from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { ArrowUpIcon, CheckIcon, ChevronDownIcon, FileArchiveIcon, FileImageIcon, FileTextIcon, Loader2Icon, MicIcon, PlusIcon, SquareIcon, XIcon } from "lucide-react";
8
+ //#region src/elements/composer.tsx
9
+ const ATTACHMENT_ICONS = {
10
+ image: FileImageIcon,
11
+ text: FileTextIcon,
12
+ archive: FileArchiveIcon
13
+ };
14
+ const BARS = Array.from({ length: 14 }, (_, i) => i);
15
+ function barHeight(bar, tick) {
16
+ return 5 + Math.abs(Math.sin(bar * 1.35 + tick * .55)) * 13;
17
+ }
18
+ /**
19
+ * Commands whose name starts with the slash query, or none when not typing one.
20
+ *
21
+ * @example
22
+ * import { ComposerCommandItem, ComposerMenu, useSlashMatches } from "@cueplusplus/ui/elements";
23
+ *
24
+ * const matches = useSlashMatches(value, commands);
25
+ *
26
+ * <ComposerMenu open={matches.length > 0}>
27
+ * {matches.map((command, index) => (
28
+ * <ComposerCommandItem
29
+ * key={command.name}
30
+ * command={command}
31
+ * active={index === active}
32
+ * onClick={() => setValue(`/${command.name} `)}
33
+ * />
34
+ * ))}
35
+ * </ComposerMenu>
36
+ */
37
+ function useSlashMatches(value, commands) {
38
+ return useMemo(() => {
39
+ if (!commands || !value.startsWith("/")) return [];
40
+ const query = value.slice(1).toLowerCase();
41
+ return commands.filter((command) => command.name.startsWith(query));
42
+ }, [commands, value]);
43
+ }
44
+ /**
45
+ * People matching a trailing @mention, or none when the caret is not in one.
46
+ *
47
+ * @example
48
+ * import { ComposerMenu, ComposerPersonItem, applyMention, useMentionMatches } from "@cueplusplus/ui/elements";
49
+ *
50
+ * const matches = useMentionMatches(value, people);
51
+ *
52
+ * <ComposerMenu open={matches.length > 0} align="end">
53
+ * {matches.map((person, index) => (
54
+ * <ComposerPersonItem
55
+ * key={person.name}
56
+ * person={person}
57
+ * active={index === active}
58
+ * onClick={() => setValue(applyMention(value, person.name))}
59
+ * />
60
+ * ))}
61
+ * </ComposerMenu>
62
+ */
63
+ function useMentionMatches(value, people) {
64
+ return useMemo(() => {
65
+ if (!people) return [];
66
+ const match = /@([\w]*)$/.exec(value);
67
+ if (!match) return [];
68
+ const query = match[1]?.toLowerCase() ?? "";
69
+ return people.filter((person) => person.name.toLowerCase().startsWith(query));
70
+ }, [people, value]);
71
+ }
72
+ /** Replaces the trailing @mention with the chosen name. */
73
+ function applyMention(value, name) {
74
+ return value.replace(/@[\w]*$/, `@${name} `);
75
+ }
76
+ /**
77
+ * The unified input: attachments, commands, mentions, models, voice, and context in
78
+ * one surface.
79
+ *
80
+ * @example
81
+ * import {
82
+ * Composer,
83
+ * ComposerActions,
84
+ * ComposerAttachButton,
85
+ * ComposerBar,
86
+ * ComposerInput,
87
+ * ComposerSend,
88
+ * ComposerToolbar,
89
+ * } from "@cueplusplus/ui/elements";
90
+ *
91
+ * <Composer>
92
+ * <ComposerBar>
93
+ * <ComposerInput value={value} placeholder="Ask anything" onChange={onChange} onSubmit={send} />
94
+ * <ComposerToolbar>
95
+ * <ComposerActions><ComposerAttachButton onClick={pick} /></ComposerActions>
96
+ * <ComposerActions><ComposerSend streaming={false} idle={!value} onClick={send} /></ComposerActions>
97
+ * </ComposerToolbar>
98
+ * </ComposerBar>
99
+ * </Composer>
100
+ */
101
+ function ElementsComposer({ className, ...props }) {
102
+ return /* @__PURE__ */ jsx("div", {
103
+ "data-slot": "composer",
104
+ className: cn("relative w-full max-w-lg", className),
105
+ ...props
106
+ });
107
+ }
108
+ /**
109
+ * The bar itself: the paper the input, the attachments and the toolbar sit on.
110
+ * `dragActive` tints it while a file is over it, which is the only feedback a drop
111
+ * target gets before the drop.
112
+ */
113
+ function ComposerBar({ dragActive = false, className, ...props }) {
114
+ return /* @__PURE__ */ jsx("div", {
115
+ "data-slot": "composer-bar",
116
+ "data-drag-active": dragActive || void 0,
117
+ className: cn(paper, "flex w-full flex-col gap-2 rounded-(--radius-overlay) p-2.5 transition-colors", dragActive && "bg-stream/10", className),
118
+ ...props
119
+ });
120
+ }
121
+ /**
122
+ * The popover the slash and mention menus are drawn in, anchored above the bar. It
123
+ * animates open rather than mounting, so the caret never moves under it.
124
+ */
125
+ function ComposerMenu({ open, align = "start", className, ...props }) {
126
+ return /* @__PURE__ */ jsx("div", {
127
+ "data-slot": "composer-menu",
128
+ "data-open": open || void 0,
129
+ className: cn(floating, "absolute bottom-full z-10 mb-2 flex w-72 flex-col gap-0.5 rounded-(--radius-overlay) p-1.5", align === "start" ? "start-0 origin-bottom-left" : "end-0 origin-bottom-right", "transition-[opacity,scale] duration-200 ease-[cubic-bezier(0.23,1,0.32,1)] motion-reduce:transition-none", open ? "scale-100 opacity-100" : "pointer-events-none scale-[0.97] opacity-0", className),
130
+ ...props
131
+ });
132
+ }
133
+ /**
134
+ * One row of a `ComposerMenu`, and the chassis the command, person and model rows are
135
+ * built on.
136
+ */
137
+ function ComposerMenuItem({ active = false, className, ...props }) {
138
+ return /* @__PURE__ */ jsx("button", {
139
+ type: "button",
140
+ "data-slot": "composer-menu-item",
141
+ "data-active": active || void 0,
142
+ className: cn("flex w-full items-center gap-2.5 rounded-(--radius-surface) px-2.5 py-2 text-(length:--cue-text-body) transition-colors", active ? field : "hover:bg-surface-1", className),
143
+ ...props
144
+ });
145
+ }
146
+ /**
147
+ * A slash command in the menu: its icon, `/name`, what it does, and the return key on
148
+ * the active row.
149
+ */
150
+ function ComposerCommandItem({ command, active, ...props }) {
151
+ return /* @__PURE__ */ jsxs(ComposerMenuItem, {
152
+ active,
153
+ ...props,
154
+ children: [
155
+ /* @__PURE__ */ jsx(command.icon, { className: "text-fg-subtle size-3.5 shrink-0" }),
156
+ /* @__PURE__ */ jsxs("span", {
157
+ className: "font-medium",
158
+ children: ["/", command.name]
159
+ }),
160
+ /* @__PURE__ */ jsx("span", {
161
+ className: "text-fg-muted flex-1 truncate text-start text-(length:--cue-text-ui)",
162
+ children: command.description
163
+ }),
164
+ active && /* @__PURE__ */ jsx("kbd", {
165
+ className: "bg-surface-2 text-fg-muted rounded-(--radius-control) px-1 font-mono text-(length:--cue-text-micro)",
166
+ children: "↵"
167
+ })
168
+ ]
169
+ });
170
+ }
171
+ /**
172
+ * A mentionable person in the menu: their initial, their name, and whether they are an
173
+ * agent or a human.
174
+ */
175
+ function ComposerPersonItem({ person, active, ...props }) {
176
+ return /* @__PURE__ */ jsxs(ComposerMenuItem, {
177
+ active,
178
+ ...props,
179
+ children: [
180
+ /* @__PURE__ */ jsx("span", {
181
+ className: "bg-surface-2 text-fg-muted flex size-5 shrink-0 items-center justify-center rounded-full text-(length:--cue-text-micro) font-medium",
182
+ children: person.name[0]
183
+ }),
184
+ /* @__PURE__ */ jsx("span", {
185
+ className: "flex-1 truncate text-start",
186
+ children: person.name
187
+ }),
188
+ /* @__PURE__ */ jsx("span", {
189
+ className: cn(mono, "text-fg-subtle"),
190
+ children: person.role
191
+ })
192
+ ]
193
+ });
194
+ }
195
+ /** The rail the attachment chips wrap in, above the input. */
196
+ function ComposerAttachments({ className, ...props }) {
197
+ return /* @__PURE__ */ jsx("div", {
198
+ "data-slot": "composer-attachments",
199
+ className: cn("flex flex-wrap gap-2", className),
200
+ ...props
201
+ });
202
+ }
203
+ /**
204
+ * One attached file as a chip: an icon for its kind, its name and size, and — while it
205
+ * uploads — a progress hairline along the bottom edge. A finished one offers remove, a
206
+ * failed one says so in its meta line.
207
+ */
208
+ function ComposerAttachmentChip({ attachment, onRemove, className, ...props }) {
209
+ const Icon = ATTACHMENT_ICONS[attachment.kind ?? "text"];
210
+ return /* @__PURE__ */ jsxs("div", {
211
+ "data-slot": "composer-attachment",
212
+ "data-state": attachment.state,
213
+ className: cn(field, "relative flex items-center gap-2.5 overflow-hidden rounded-(--radius-surface) py-1.5 ps-1.5 pe-2.5", className),
214
+ ...props,
215
+ children: [
216
+ /* @__PURE__ */ jsx("span", {
217
+ className: "bg-surface-2 text-fg-muted flex size-8 shrink-0 items-center justify-center rounded-(--radius-surface)",
218
+ children: /* @__PURE__ */ jsx(Icon, { className: "size-4" })
219
+ }),
220
+ /* @__PURE__ */ jsxs("span", {
221
+ className: "flex flex-col",
222
+ children: [/* @__PURE__ */ jsx("span", {
223
+ className: "max-w-36 truncate text-(length:--cue-text-ui) font-medium",
224
+ children: attachment.name
225
+ }), /* @__PURE__ */ jsx("span", {
226
+ className: cn("text-(length:--cue-text-label)", attachment.state === "error" ? "text-danger/80" : "text-fg-subtle"),
227
+ children: attachment.meta
228
+ })]
229
+ }),
230
+ /* @__PURE__ */ jsx("span", {
231
+ className: "ms-1 flex w-5 items-center justify-end",
232
+ children: attachment.state === "uploading" ? /* @__PURE__ */ jsx(Loader2Icon, { className: "text-fg-subtle size-3.5 animate-spin motion-reduce:animate-none" }) : attachment.state === "done" && onRemove ? /* @__PURE__ */ jsx("button", {
233
+ type: "button",
234
+ "aria-label": `Remove ${attachment.name}`,
235
+ onClick: () => onRemove(attachment.name),
236
+ className: cn(ghostButton, "size-5 [&_svg]:size-3"),
237
+ children: /* @__PURE__ */ jsx(XIcon, {})
238
+ }) : attachment.state === "done" ? /* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5 text-ok" }) : null
239
+ }),
240
+ attachment.state === "uploading" && /* @__PURE__ */ jsx("span", {
241
+ "aria-hidden": true,
242
+ className: "absolute inset-x-0 bottom-0 h-0.5 bg-stream/70 transition-[width] duration-300",
243
+ style: { width: `${pct(attachment.progress ?? 0, 100)}%` }
244
+ })
245
+ ]
246
+ });
247
+ }
248
+ /**
249
+ * The text field. Enter submits, guarded against IME composition so accepting a
250
+ * candidate does not send the message.
251
+ */
252
+ function ComposerInput({ onSubmit, onKeyDown, className, ...props }) {
253
+ return /* @__PURE__ */ jsx("input", {
254
+ "data-slot": "composer-input",
255
+ onKeyDown: (event) => {
256
+ onKeyDown?.(event);
257
+ if (event.defaultPrevented) return;
258
+ if (event.key !== "Enter" || event.nativeEvent.isComposing) return;
259
+ onSubmit?.();
260
+ },
261
+ className: cn("placeholder:text-fg-subtle min-h-11 w-full bg-transparent px-3 text-(length:--cue-text-emphasis) caret-stream outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent", className),
262
+ ...props
263
+ });
264
+ }
265
+ /**
266
+ * What replaces the input while the microphone is open: a level meter, a running clock
267
+ * while recording, and a shimmering `Transcribing` once it stops.
268
+ */
269
+ function ComposerVoice({ recording, seconds, className, ...props }) {
270
+ return /* @__PURE__ */ jsxs("div", {
271
+ "data-slot": "composer-voice",
272
+ "data-recording": recording || void 0,
273
+ className: cn("flex min-h-11 items-center gap-3 ps-3", className),
274
+ ...props,
275
+ children: [
276
+ recording && /* @__PURE__ */ jsx("span", {
277
+ "aria-hidden": true,
278
+ className: "size-1.5 animate-pulse rounded-full bg-stream"
279
+ }),
280
+ /* @__PURE__ */ jsx("div", {
281
+ className: "flex h-6 items-center gap-[3px]",
282
+ "aria-hidden": true,
283
+ children: BARS.map((bar) => /* @__PURE__ */ jsx("span", {
284
+ className: cn("w-0.5 rounded-full transition-[height,background-color] duration-150 motion-reduce:transition-none", recording ? "bg-accent" : "bg-surface-3"),
285
+ style: { height: recording ? barHeight(bar, seconds * 10) : 3 }
286
+ }, bar))
287
+ }),
288
+ recording ? /* @__PURE__ */ jsxs("span", {
289
+ className: cn(mono, "text-fg-subtle tabular-nums"),
290
+ children: ["0:", String(seconds).padStart(2, "0")]
291
+ }) : /* @__PURE__ */ jsx(ShimmerLabel, {
292
+ className: "text-fg-muted relative text-(length:--cue-text-body)",
293
+ children: "Transcribing"
294
+ })
295
+ ]
296
+ });
297
+ }
298
+ /** The row under the input, which holds the two `ComposerActions` clusters. */
299
+ function ComposerToolbar({ className, ...props }) {
300
+ return /* @__PURE__ */ jsx("div", {
301
+ "data-slot": "composer-toolbar",
302
+ className: cn("flex items-center justify-between", className),
303
+ ...props
304
+ });
305
+ }
306
+ /** One cluster of controls in the toolbar. Two of them, one at each end. */
307
+ function ComposerActions({ className, ...props }) {
308
+ return /* @__PURE__ */ jsx("div", {
309
+ "data-slot": "composer-actions",
310
+ className: cn("flex items-center gap-1.5", className),
311
+ ...props
312
+ });
313
+ }
314
+ /**
315
+ * The paperclip, as a plus. Disabled when no handler is given, rather than rendering a
316
+ * control that does nothing.
317
+ */
318
+ function ComposerAttachButton({ className, ...props }) {
319
+ return /* @__PURE__ */ jsx("button", {
320
+ type: "button",
321
+ "aria-label": "Add attachment",
322
+ "data-slot": "composer-attach",
323
+ disabled: !props.onClick,
324
+ className: cn(ghostButton, "size-8 disabled:pointer-events-none disabled:opacity-30", className),
325
+ ...props,
326
+ children: /* @__PURE__ */ jsx(PlusIcon, { className: "size-4" })
327
+ });
328
+ }
329
+ /**
330
+ * The model name in the toolbar, which opens the model menu. Carries `aria-expanded`
331
+ * for it.
332
+ */
333
+ function ComposerModelTrigger({ model, open, className, ...props }) {
334
+ return /* @__PURE__ */ jsxs("button", {
335
+ type: "button",
336
+ "aria-expanded": open,
337
+ "data-slot": "composer-model-trigger",
338
+ className: cn("text-fg-muted hover:bg-surface-2 hover:text-fg flex h-8 items-center gap-1.5 rounded-full px-3 text-(length:--cue-text-body) transition-colors", className),
339
+ ...props,
340
+ children: [model, /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-3 opacity-60" })]
341
+ });
342
+ }
343
+ /** One model in the menu, with its metadata and a tick on the chosen one. */
344
+ function ComposerModelItem({ entry, selected, ...props }) {
345
+ return /* @__PURE__ */ jsxs(ComposerMenuItem, {
346
+ active: selected,
347
+ ...props,
348
+ children: [
349
+ /* @__PURE__ */ jsx("span", {
350
+ className: "flex-1 text-start",
351
+ children: entry.name
352
+ }),
353
+ /* @__PURE__ */ jsx("span", {
354
+ className: cn(mono, "text-fg-subtle tabular-nums"),
355
+ children: entry.meta
356
+ }),
357
+ /* @__PURE__ */ jsx("span", {
358
+ className: "flex w-4 justify-end",
359
+ children: selected && /* @__PURE__ */ jsx(CheckIcon, { className: "cue-elements-fade-in cue-elements-zoom-in-90 cue-elements-animate-in size-3.5 duration-200" })
360
+ })
361
+ ]
362
+ });
363
+ }
364
+ /**
365
+ * The context-window dial in the toolbar, with the breakdown on hover or focus. It
366
+ * turns danger-coloured past 85%, which is the point where the next long tool result
367
+ * starts costing the conversation its own history.
368
+ */
369
+ function ComposerContext({ usage, className, ...props }) {
370
+ const used = usage.system + usage.tools + usage.messages;
371
+ const fraction = usage.total === 0 ? 0 : used / usage.total;
372
+ const warn = fraction > .85;
373
+ const circumference = 2 * Math.PI * 6;
374
+ const segments = [
375
+ {
376
+ label: "System",
377
+ value: usage.system,
378
+ className: "bg-surface-3"
379
+ },
380
+ {
381
+ label: "Tools",
382
+ value: usage.tools,
383
+ className: "bg-surface-3"
384
+ },
385
+ {
386
+ label: "Messages",
387
+ value: usage.messages,
388
+ className: "bg-accent"
389
+ }
390
+ ];
391
+ return /* @__PURE__ */ jsxs("div", {
392
+ "data-slot": "composer-context",
393
+ className: cn("group/ctx relative", className),
394
+ ...props,
395
+ children: [/* @__PURE__ */ jsxs("div", {
396
+ className: cn(floating, "absolute end-0 bottom-full z-10 mb-2 flex w-60 origin-bottom-right flex-col gap-3.5 rounded-(--radius-overlay) p-4", "transition-[opacity,scale] duration-200 ease-[cubic-bezier(0.23,1,0.32,1)] motion-reduce:transition-none", "pointer-events-none scale-[0.97] opacity-0", "group-hover/ctx:pointer-events-auto group-hover/ctx:scale-100 group-hover/ctx:opacity-100", "group-focus-within/ctx:pointer-events-auto group-focus-within/ctx:scale-100 group-focus-within/ctx:opacity-100"),
397
+ children: [
398
+ /* @__PURE__ */ jsxs("div", {
399
+ className: "flex items-baseline justify-between",
400
+ children: [/* @__PURE__ */ jsx("p", {
401
+ className: "text-(length:--cue-text-body) font-medium",
402
+ children: "Context"
403
+ }), /* @__PURE__ */ jsxs("p", {
404
+ className: cn(mono, "tabular-nums", warn ? "text-danger" : "text-fg-subtle"),
405
+ children: [Math.round(fraction * 100), "%"]
406
+ })]
407
+ }),
408
+ /* @__PURE__ */ jsx("div", {
409
+ className: "bg-surface-2 flex h-[5px] w-full gap-px overflow-hidden rounded-full",
410
+ children: segments.map((segment) => /* @__PURE__ */ jsx("span", {
411
+ className: cn("h-full transition-[width] duration-700 motion-reduce:transition-none", segment.className),
412
+ style: { width: `${pct(segment.value, usage.total)}%` }
413
+ }, segment.label))
414
+ }),
415
+ /* @__PURE__ */ jsx("div", {
416
+ className: "flex flex-col gap-2",
417
+ children: segments.map((segment) => /* @__PURE__ */ jsxs("div", {
418
+ className: "text-fg-muted flex items-center gap-2.5 text-(length:--cue-text-body)",
419
+ children: [
420
+ /* @__PURE__ */ jsx("span", {
421
+ "aria-hidden": true,
422
+ className: cn("size-1.5 rounded-full", segment.className)
423
+ }),
424
+ /* @__PURE__ */ jsx("span", {
425
+ className: "flex-1",
426
+ children: segment.label
427
+ }),
428
+ /* @__PURE__ */ jsxs("span", {
429
+ className: cn(mono, "text-fg-subtle tabular-nums"),
430
+ children: [segment.value, "k"]
431
+ })
432
+ ]
433
+ }, segment.label))
434
+ }),
435
+ /* @__PURE__ */ jsx("div", { className: "bg-surface-2 h-px" }),
436
+ /* @__PURE__ */ jsxs("div", {
437
+ className: "text-fg-muted flex items-center justify-between text-(length:--cue-text-body)",
438
+ children: [/* @__PURE__ */ jsx("span", { children: "Total" }), /* @__PURE__ */ jsxs("span", {
439
+ className: cn(mono, "text-fg-subtle tabular-nums"),
440
+ children: [
441
+ used,
442
+ "k / ",
443
+ usage.total,
444
+ "k"
445
+ ]
446
+ })]
447
+ })
448
+ ]
449
+ }), /* @__PURE__ */ jsx("button", {
450
+ type: "button",
451
+ "aria-label": "Context usage",
452
+ className: cn(ghostButton, "size-8", warn && "text-danger"),
453
+ children: /* @__PURE__ */ jsxs("svg", {
454
+ viewBox: "0 0 16 16",
455
+ className: "size-4 -rotate-90",
456
+ "aria-hidden": true,
457
+ children: [/* @__PURE__ */ jsx("circle", {
458
+ cx: "8",
459
+ cy: "8",
460
+ r: "6",
461
+ fill: "none",
462
+ strokeWidth: "2.5",
463
+ className: "stroke-fg-subtle"
464
+ }), /* @__PURE__ */ jsx("circle", {
465
+ cx: "8",
466
+ cy: "8",
467
+ r: "6",
468
+ fill: "none",
469
+ strokeWidth: "2.5",
470
+ strokeLinecap: "round",
471
+ className: "stroke-current transition-[stroke-dashoffset] duration-700 motion-reduce:transition-none",
472
+ strokeDasharray: circumference,
473
+ strokeDashoffset: circumference * (1 - clamp(fraction, 0, 1))
474
+ })]
475
+ })
476
+ })]
477
+ });
478
+ }
479
+ /** The microphone, which becomes a filled stop while recording. */
480
+ function ComposerVoiceButton({ active, className, ...props }) {
481
+ return /* @__PURE__ */ jsx("button", {
482
+ type: "button",
483
+ "aria-label": active ? "Stop recording" : "Start voice input",
484
+ "data-slot": "composer-voice-button",
485
+ className: cn(active ? cn(inkButton, "flex size-8 items-center justify-center rounded-full") : cn(ghostButton, "size-8"), className),
486
+ ...props,
487
+ children: active ? /* @__PURE__ */ jsx(SquareIcon, { className: "size-3 fill-current" }) : /* @__PURE__ */ jsx(MicIcon, { className: "size-4" })
488
+ });
489
+ }
490
+ /**
491
+ * Send, which becomes stop while the model is streaming. Dim when the input is empty
492
+ * and there is nothing to send; the arrow and the square cross-fade rather than swap.
493
+ */
494
+ function ComposerSend({ streaming, idle, className, ...props }) {
495
+ return /* @__PURE__ */ jsxs("button", {
496
+ type: "button",
497
+ "aria-label": streaming ? "Stop generating" : "Send message",
498
+ "data-slot": "composer-send",
499
+ className: cn("grid size-8 place-items-center rounded-full", streaming || !idle ? inkButton : "bg-surface-2 text-fg-subtle transition-colors", className),
500
+ ...props,
501
+ children: [/* @__PURE__ */ jsx(ArrowUpIcon, { className: cn(iconSwap, "size-4", streaming ? iconSwapOut : iconSwapIn) }), /* @__PURE__ */ jsx(SquareIcon, { className: cn(iconSwap, "size-3 fill-current", streaming ? iconSwapIn : iconSwapOut) })]
502
+ });
503
+ }
504
+ //#endregion
505
+ export { ComposerActions, ComposerAttachButton, ComposerAttachmentChip, ComposerAttachments, ComposerBar, ComposerCommandItem, ComposerContext, ComposerInput, ComposerMenu, ComposerMenuItem, ComposerModelItem, ComposerModelTrigger, ComposerPersonItem, ComposerSend, ComposerToolbar, ComposerVoice, ComposerVoiceButton, ElementsComposer, applyMention, useMentionMatches, useSlashMatches };
@@ -0,0 +1,40 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/computer-use.d.ts
3
+ /**
4
+ * One thing the agent did to the screen, and where it did it. `x` and `y` are
5
+ * percentages of the frame, so the trail survives a resize.
6
+ */
7
+ interface ComputerStep {
8
+ /** Stable identity for the step key. */
9
+ id: string;
10
+ /** Verb the agent performed: click, type, scroll. */
11
+ action: string;
12
+ /** What it acted on. */
13
+ target: string;
14
+ /** Horizontal position as a percentage of the viewport width. */
15
+ x: number;
16
+ /** Vertical position as a percentage of the viewport height. */
17
+ y: number;
18
+ }
19
+ /**
20
+ * The screen the agent is driving, with a cursor trail and what it is doing right now.
21
+ *
22
+ * @example
23
+ * import { ComputerUse } from "@cueplusplus/ui/elements";
24
+ *
25
+ * <ComputerUse url="github.com/..." steps={steps} activeIndex={2}>
26
+ * <iframe title="Session" src={streamUrl} />
27
+ * </ComputerUse>
28
+ */
29
+ declare function ComputerUse({ url, steps, activeIndex, children, className, ...props }: Omit<ComponentProps<"div">, "url" | "steps" | "activeIndex" | "children"> & {
30
+ /** What the session is pointed at. */
31
+ url: string;
32
+ /** Actions taken, in order. Each carries the coordinates the cursor moved to. */
33
+ steps: readonly ComputerStep[];
34
+ /** Which step is happening now. The two before it stay as a fading trail. */
35
+ activeIndex: number;
36
+ /** The viewport being driven: a video stream, a screenshot, an iframe. */
37
+ children: React.ReactNode;
38
+ }): import("react").JSX.Element;
39
+ //#endregion
40
+ export { ComputerStep, ComputerUse };
@@ -0,0 +1,92 @@
1
+ "use client";
2
+ import { cn } from "../lib/cn.js";
3
+ import { field, mono, paper } from "./surfaces.js";
4
+ import { at, indexIn } from "./range.js";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { MousePointer2Icon } from "lucide-react";
7
+ //#region src/elements/computer-use.tsx
8
+ /**
9
+ * The screen the agent is driving, with a cursor trail and what it is doing right now.
10
+ *
11
+ * @example
12
+ * import { ComputerUse } from "@cueplusplus/ui/elements";
13
+ *
14
+ * <ComputerUse url="github.com/..." steps={steps} activeIndex={2}>
15
+ * <iframe title="Session" src={streamUrl} />
16
+ * </ComputerUse>
17
+ */
18
+ function ComputerUse({ url, steps, activeIndex, children, className, ...props }) {
19
+ const index = indexIn(steps, activeIndex);
20
+ const active = at(steps, index);
21
+ const trail = steps.slice(Math.max(0, index - 2), index + 1);
22
+ return /* @__PURE__ */ jsxs("div", {
23
+ "data-slot": "computer-use",
24
+ className: cn(paper, "flex w-full max-w-md flex-col overflow-hidden rounded-(--radius-overlay)", className),
25
+ ...props,
26
+ children: [
27
+ /* @__PURE__ */ jsxs("div", {
28
+ className: "flex items-center gap-2 px-3 py-2",
29
+ children: [/* @__PURE__ */ jsx("span", {
30
+ className: "flex shrink-0 gap-1",
31
+ children: [
32
+ "bg-danger/50",
33
+ "bg-warn/50",
34
+ "bg-ok/50"
35
+ ].map((tint) => /* @__PURE__ */ jsx("span", {
36
+ "aria-hidden": true,
37
+ className: cn("size-2 rounded-full", tint)
38
+ }, tint))
39
+ }), /* @__PURE__ */ jsx("span", {
40
+ className: cn(field, mono, "text-fg-muted min-w-0 flex-1 truncate rounded-full px-2.5 py-1"),
41
+ children: url
42
+ })]
43
+ }),
44
+ /* @__PURE__ */ jsxs("div", {
45
+ className: "border-border relative min-h-[8.5rem] overflow-hidden border-t",
46
+ children: [
47
+ children,
48
+ trail.map((step, i) => /* @__PURE__ */ jsx("span", {
49
+ "aria-hidden": true,
50
+ className: "pointer-events-none absolute size-2 rounded-full bg-stream transition-opacity duration-300",
51
+ style: {
52
+ left: `${step.x}%`,
53
+ top: `${step.y}%`,
54
+ opacity: .18 * (i + 1)
55
+ }
56
+ }, step.id)),
57
+ active && /* @__PURE__ */ jsx(MousePointer2Icon, {
58
+ "aria-hidden": true,
59
+ className: "pointer-events-none absolute size-4 fill-stream text-stream transition-[left,top] duration-500 ease-out motion-reduce:transition-none",
60
+ style: {
61
+ left: `${active.x}%`,
62
+ top: `${active.y}%`
63
+ }
64
+ })
65
+ ]
66
+ }),
67
+ active && /* @__PURE__ */ jsxs("div", {
68
+ className: "border-border flex items-center gap-2 border-t px-3.5 py-2",
69
+ children: [
70
+ /* @__PURE__ */ jsx("span", {
71
+ className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-muted shrink-0"),
72
+ children: active.action
73
+ }),
74
+ /* @__PURE__ */ jsx("span", {
75
+ className: "text-fg-muted min-w-0 flex-1 truncate text-(length:--cue-text-body)",
76
+ children: active.target
77
+ }),
78
+ /* @__PURE__ */ jsxs("span", {
79
+ className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle shrink-0 tabular-nums"),
80
+ children: [
81
+ index + 1,
82
+ "/",
83
+ steps.length
84
+ ]
85
+ })
86
+ ]
87
+ })
88
+ ]
89
+ });
90
+ }
91
+ //#endregion
92
+ export { ComputerUse };
@@ -0,0 +1,39 @@
1
+ import { ComponentProps } from "react";
2
+ //#region src/elements/confidence-marker.d.ts
3
+ /**
4
+ * How far a claim can be trusted: `grounded` in a source, `inferred` from one, or
5
+ * `uncertain` — the model's own guess. It decides the underline and the basis chip.
6
+ */
7
+ type Confidence = "grounded" | "inferred" | "uncertain";
8
+ /** One clause of an answer, with how far it can be trusted and what it rests on. */
9
+ interface ConfidenceClaim {
10
+ /** Stable identity, compared against hoveredId. */
11
+ id: string;
12
+ /** The claim, rendered inline with its confidence underline. */
13
+ text: string;
14
+ /** Drives the underline: solid green, solid amber, dotted red. */
15
+ confidence: Confidence;
16
+ /** What backs the claim, shown in the hover pill. */
17
+ basis: string;
18
+ }
19
+ /**
20
+ * Which claims came from a source, which were inferred, and which are guesses.
21
+ *
22
+ * @example
23
+ * import { ConfidenceMarker } from "@cueplusplus/ui/elements";
24
+ *
25
+ * <ConfidenceMarker claims={claims} hoveredId={hoveredId} onHover={setHoveredId} />
26
+ */
27
+ declare function ConfidenceMarker({ claims, hoveredId, onHover, className, ...props }: Omit<ComponentProps<"div">, "children" | "claims" | "hoveredId" | "onHover"> & {
28
+ /**
29
+ * The answer split into claims. Each is underlined according to how well it is
30
+ * supported.
31
+ */
32
+ claims: readonly ConfidenceClaim[];
33
+ /** Which claim is hovered. Pass an empty string for none. */
34
+ hoveredId: string;
35
+ /** Called with the hovered claim id, or an empty string on exit. */
36
+ onHover?: (id: string) => void;
37
+ }): import("react").JSX.Element;
38
+ //#endregion
39
+ export { Confidence, ConfidenceClaim, ConfidenceMarker };