@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,107 @@
1
+ {
2
+ "name": "RecommendationCard",
3
+ "slug": "recommendation-card",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "The agent proposes a change with its confidence, and waits for a yes.",
11
+ "props": [
12
+ {
13
+ "name": "state",
14
+ "type": "\"idle\" | \"accepted\"",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "idle shows accept controls; accepted swaps in a confirmation row."
18
+ },
19
+ {
20
+ "name": "question",
21
+ "type": "string",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "Proposal headline the agent is asking the user about."
25
+ },
26
+ {
27
+ "name": "children",
28
+ "type": "ReactNode",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "Supporting body explaining the recommendation."
32
+ },
33
+ {
34
+ "name": "confidenceLabel",
35
+ "type": "string",
36
+ "required": true,
37
+ "defaultValue": null,
38
+ "description": "Confidence copy shown next to the bar meter while idle."
39
+ },
40
+ {
41
+ "name": "acceptedLabel",
42
+ "type": "string",
43
+ "required": true,
44
+ "defaultValue": null,
45
+ "description": "Confirmation copy shown once the proposal is accepted."
46
+ },
47
+ {
48
+ "name": "onAccept",
49
+ "type": "(() => void)",
50
+ "required": false,
51
+ "defaultValue": null,
52
+ "description": "Called when the user clicks Accept."
53
+ },
54
+ {
55
+ "name": "onAlternatives",
56
+ "type": "(() => void)",
57
+ "required": false,
58
+ "defaultValue": null,
59
+ "description": "Called when the user clicks Alternatives."
60
+ }
61
+ ],
62
+ "typeReferences": [
63
+ "Omit<\n ComponentProps<\"div\">,\n | \"state\"\n | \"question\"\n | \"children\"\n | \"confidenceLabel\"\n | \"acceptedLabel\"\n | \"onAccept\"\n | \"onAlternatives\"\n> & {\n /** idle shows accept controls; accepted swaps in a confirmation row. */\n state: RecommendationState;\n /** Proposal headline the agent is asking the user about. */\n question: string;\n /** Supporting body explaining the recommendation. */\n children: ReactNode;\n /** Confidence copy shown next to the bar meter while idle. */\n confidenceLabel: string;\n /** Confirmation copy shown once the proposal is accepted. */\n acceptedLabel: string;\n /** Called when the user clicks Accept. */\n onAccept?: () => void;\n /** Called when the user clicks Alternatives. */\n onAlternatives?: () => void;\n}"
64
+ ],
65
+ "subcomponents": [],
66
+ "parts": [],
67
+ "variants": {},
68
+ "defaultVariants": {},
69
+ "tokensUsed": [
70
+ "--cue-fg",
71
+ "--cue-fg-muted",
72
+ "--cue-fg-subtle",
73
+ "--cue-font-mono",
74
+ "--cue-ok",
75
+ "--cue-radius-control",
76
+ "--cue-radius-overlay",
77
+ "--cue-surface-2",
78
+ "--cue-text-body",
79
+ "--cue-text-label",
80
+ "--cue-text-ui"
81
+ ],
82
+ "summary": "The agent proposes a change with its confidence, and waits for a yes.",
83
+ "examples": [
84
+ {
85
+ "title": "Usage",
86
+ "code": "import { RecommendationCard } from \"@cueplusplus/ui/elements\";\n\n<RecommendationCard\n state=\"idle\"\n question=\"Enable draft autosave?\"\n confidenceLabel=\"high confidence\"\n acceptedLabel=\"Enabled for every thread\"\n onAccept={() => accept()}\n>\n Wire{\" \"}\n <span className=\"bg-surface-2 text-fg-muted rounded-(--radius-control) px-1.5 py-0.5 font-mono text-(length:--cue-text-label)\">\n runtime.drafts\n </span>{\" \"}\n with three lines.\n</RecommendationCard>",
87
+ "language": "tsx"
88
+ }
89
+ ],
90
+ "status": "todo-docs",
91
+ "url": "/docs/components/recommendation-card",
92
+ "mdUrl": "/docs/components/recommendation-card.md",
93
+ "jsonUrl": "/r/components/recommendation-card.json",
94
+ "specimens": [
95
+ {
96
+ "title": "RecommendationCard",
97
+ "group": "elements-knowledge",
98
+ "components": [
99
+ "RecommendationCard"
100
+ ],
101
+ "code": "<Specimens>\n <Specimen label=\"waiting on a yes\" wide>\n <RecommendationCard\n state={recommendation}\n question=\"Hang six ESPRITEs on the front truss?\"\n confidenceLabel=\"high confidence\"\n acceptedLabel=\"Added to the hanging plot\"\n onAccept={() => setRecommendation(\"accepted\")}\n onAlternatives={() => undefined}\n >\n They clear the front wash at 8.4 m with zoom to spare, and four of the six are\n already in the store.\n </RecommendationCard>\n </Specimen>\n <Specimen label=\"accepted\" wide>\n <RecommendationCard\n state=\"accepted\"\n question=\"Hang six ESPRITEs on the front truss?\"\n confidenceLabel=\"high confidence\"\n acceptedLabel=\"Added to the hanging plot\"\n >\n They clear the front wash at 8.4 m with zoom to spare.\n </RecommendationCard>\n </Specimen>\n</Specimens>",
102
+ "note": "The proposal itself, with how sure the agent is and a yes waiting on it. Accepting swaps the entire action row for a settled line rather than disabling the buttons, because a greyed-out Accept beside a green tick reads as an error state.",
103
+ "interaction": "Accept leads in ink and Alternatives is a ghost. The confidence bars are decorative and hidden from assistive tech — the label beside them carries the meaning."
104
+ }
105
+ ],
106
+ "todo": true
107
+ }
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "RegenerateMenu",
3
+ "slug": "regenerate-menu",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "Fork the same turn to a different model instead of rolling the same dice.",
11
+ "props": [
12
+ {
13
+ "name": "options",
14
+ "type": "readonly RegenerateOption[]",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "What the turn can be re-run with."
18
+ },
19
+ {
20
+ "name": "open",
21
+ "type": "boolean",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "Whether the menu is showing."
25
+ },
26
+ {
27
+ "name": "currentId",
28
+ "type": "string",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "Which option produced the answer on screen; it is labelled current instead of\nshowing its detail."
32
+ },
33
+ {
34
+ "name": "onOpenChange",
35
+ "type": "((open: boolean) => void)",
36
+ "required": false,
37
+ "defaultValue": null,
38
+ "description": "Called when the trigger is toggled."
39
+ },
40
+ {
41
+ "name": "onPick",
42
+ "type": "((id: string) => void)",
43
+ "required": false,
44
+ "defaultValue": null,
45
+ "description": "Called with the chosen option."
46
+ }
47
+ ],
48
+ "typeReferences": [
49
+ "Omit<\n ComponentProps<\"div\">,\n \"children\" | \"options\" | \"open\" | \"currentId\" | \"onOpenChange\" | \"onPick\"\n> & {\n /** What the turn can be re-run with. */\n options: readonly RegenerateOption[];\n /** Whether the menu is showing. */\n open: boolean;\n /**\n * Which option produced the answer on screen; it is labelled current instead of\n * showing its detail.\n */\n currentId: string;\n /** Called when the trigger is toggled. */\n onOpenChange?: (open: boolean) => void;\n /** Called with the chosen option. */\n onPick?: (id: string) => void;\n}"
50
+ ],
51
+ "subcomponents": [],
52
+ "parts": [],
53
+ "variants": {},
54
+ "defaultVariants": {},
55
+ "tokensUsed": [
56
+ "--cue-fg",
57
+ "--cue-fg-subtle",
58
+ "--cue-radius-overlay",
59
+ "--cue-radius-surface",
60
+ "--cue-surface-1",
61
+ "--cue-surface-2",
62
+ "--cue-text-body"
63
+ ],
64
+ "summary": "Fork the same turn to a different model instead of rolling the same dice.",
65
+ "examples": [
66
+ {
67
+ "title": "Usage",
68
+ "code": "import { RegenerateMenu } from \"@cueplusplus/ui/elements\";\n\n<RegenerateMenu\n options={options}\n open={open}\n currentId=\"sonnet\"\n onOpenChange={setOpen}\n onPick={regenerate}\n/>",
69
+ "language": "tsx"
70
+ }
71
+ ],
72
+ "status": "todo-docs",
73
+ "url": "/docs/components/regenerate-menu",
74
+ "mdUrl": "/docs/components/regenerate-menu.md",
75
+ "jsonUrl": "/r/components/regenerate-menu.json",
76
+ "specimens": [
77
+ {
78
+ "title": "RegenerateMenu",
79
+ "group": "elements-thread",
80
+ "components": [
81
+ "RegenerateMenu"
82
+ ],
83
+ "code": "<Specimens>\n <Specimen label=\"open\" wide>\n <RegenerateMenu\n options={MODELS}\n open={menuOpen}\n currentId={picked}\n onOpenChange={setMenuOpen}\n onPick={setPicked}\n />\n </Specimen>\n <Specimen label=\"closed\" wide>\n <RegenerateMenu options={MODELS} open={false} currentId=\"opus\" />\n </Specimen>\n</Specimens>",
84
+ "note": "Fork the same turn to a different model instead of rolling the same dice again. The row matching `currentId` says `current` where the others say what distinguishes them, which is what keeps the menu from offering you what you already have.",
85
+ "interaction": "the trigger carries aria-expanded and latches while the menu is up. The menu itself is a plain popover in flow — the elements family draws its own, so nothing here portals."
86
+ }
87
+ ],
88
+ "todo": true
89
+ }
@@ -0,0 +1,102 @@
1
+ {
2
+ "name": "ReplayPlayer",
3
+ "slug": "replay-player",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements/replay",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "A scripted run, with a transport: play, pause, step, scrub, restart, rate.\n\nThe player is a controller over a filmstrip rather than an animation of its\nown. Every frame of a {@link ReplayScript} carries the whole scene, so the\ncomponent's entire rendering rule is `frames[index].scene` — which is what\nmakes the position controls honest: frame 12 reached by scrubbing is the same\nDOM as frame 12 reached by watching, because there is no accumulated state\nfor the two paths to disagree about.\n\nThe transport is assembled from shipped cue components — `IconButton`s, a\n`Slider` for the scrubber, a `Chip` for the state — and painted with cue's\nown metrics even when the scene inside it is an `AgentSurface` island at\nupstream fidelity. That is deliberate: the chrome belongs to the console\nshowing the run, not to the run.\n\nThe playback state is legible from outside, the way `TerminalFrame` publishes\n`data-simulating`: `data-replay-state` carries the current frame's authored\nlabel, `data-replay-playing` says whether the clock is running, and\n`data-replay-frame` is the index — enough for a stylesheet, a screenshot\nharness or a test to say \"show me the awaiting-approval frame\" without\nreaching into React.\n\nUnder `prefers-reduced-motion: reduce` the player opens on the resting frame\nand schedules nothing, but the step and scrub controls keep working: play and\nrate are the only two affordances that go away, because they are the only two\nthat mean \"move on their own\".",
9
+ "props": [
10
+ {
11
+ "name": "script",
12
+ "type": "ReplayScript",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "The filmstrip to play."
16
+ },
17
+ {
18
+ "name": "autoPlay",
19
+ "type": "boolean",
20
+ "required": false,
21
+ "defaultValue": "true",
22
+ "description": "Start the clock on mount. Default `true`; ignored under reduced motion."
23
+ },
24
+ {
25
+ "name": "startAt",
26
+ "type": "number",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "The frame to open on — the seat a deep link asks for. Unset opens on the first frame, or on the last for a reduced-motion reader."
30
+ },
31
+ {
32
+ "name": "rate",
33
+ "type": "number",
34
+ "required": false,
35
+ "defaultValue": "1",
36
+ "description": "The rate multiplier to start at. Default `1`."
37
+ },
38
+ {
39
+ "name": "rates",
40
+ "type": "readonly number[]",
41
+ "required": false,
42
+ "defaultValue": "[1, 2, 4, 0.5] as const",
43
+ "description": "The rates the rate control cycles through. Default `[1, 2, 4, 0.5]`."
44
+ },
45
+ {
46
+ "name": "label",
47
+ "type": "string",
48
+ "required": false,
49
+ "defaultValue": null,
50
+ "description": "Accessible name for the transport. Defaults to the script's title, then to \"Replay\"."
51
+ },
52
+ {
53
+ "name": "className",
54
+ "type": "string",
55
+ "required": false,
56
+ "defaultValue": null,
57
+ "description": "Extra classes, merged over the root's own."
58
+ }
59
+ ],
60
+ "typeReferences": [
61
+ "Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\">"
62
+ ],
63
+ "subcomponents": [],
64
+ "parts": [],
65
+ "variants": {},
66
+ "defaultVariants": {},
67
+ "tokensUsed": [
68
+ "--cue-border",
69
+ "--cue-fg-muted",
70
+ "--cue-font-mono",
71
+ "--cue-space-3",
72
+ "--cue-space-4",
73
+ "--cue-stream",
74
+ "--cue-text-label"
75
+ ],
76
+ "summary": "A scripted run, with a transport: play, pause, step, scrub, restart, rate.",
77
+ "examples": [
78
+ {
79
+ "title": "Usage",
80
+ "code": "const SCRIPT: ReplayScript = {\n title: \"Patching universe 3\",\n frames: [\n { scene: <ToolCall label=\"Reading the plot\" running />, hold: 600, label: \"tool-call\" },\n { scene: <StreamingText segments={ANSWER} />, hold: 400, label: \"streaming\" },\n { scene: <StreamingText segments={ANSWER} settled />, hold: 0, label: \"done\" },\n ],\n};\n<ReplayPlayer script={SCRIPT} />\n// Opened at a frame from the URL, paused, at half speed.\n<ReplayPlayer script={SCRIPT} startAt={17} autoPlay={false} rate={0.5} />",
81
+ "language": "tsx"
82
+ }
83
+ ],
84
+ "status": "todo-docs",
85
+ "url": "/docs/components/replay-player",
86
+ "mdUrl": "/docs/components/replay-player.md",
87
+ "jsonUrl": "/r/components/replay-player.json",
88
+ "specimens": [
89
+ {
90
+ "title": "ReplayPlayer",
91
+ "group": "elements",
92
+ "components": [
93
+ "ReplayPlayer",
94
+ "useReplay"
95
+ ],
96
+ "code": "<Specimens>\n <Specimen label=\"playing\" wide>\n <div className=\"w-full max-w-[42rem]\">\n <ReplayPlayer script={REPLAY_SCRIPT} />\n </div>\n </Specimen>\n <Specimen label=\"seated at a frame, paused\" wide>\n <div className=\"w-full max-w-[42rem]\">\n <ReplayPlayer script={REPLAY_SCRIPT} startAt={4} autoPlay={false} />\n </div>\n </Specimen>\n</Specimens>",
97
+ "note": "The run above, playing. The player is a controller over a filmstrip rather than an animation: every frame carries the whole scene, so frame 5 reached by scrubbing is the same DOM as frame 5 reached by watching. One monotonic clock underneath it means pause keeps the unspent part of a hold instead of starting it again, and the rate control is exact rather than approximate. The root publishes data-replay-state, data-replay-playing and data-replay-frame, the way TerminalFrame publishes data-simulating. Under prefers-reduced-motion nothing is ever scheduled: the player opens on the resting frame and every control except play and rate keeps working, so a reader who asked for stillness can still step through all seven states.",
98
+ "interaction": "the transport is five controls and a scrubber, all keyboard-reachable: the slider steps a frame per arrow key. Stepping stops the clock, because a step is a position rather than a speed. The scenes stay live while they are on screen — open the tool call's disclosure, answer the approval — and what a reader touched outlives the frame it was touched on for exactly as long as the row does: a scene keeps its state while the element in a position holds its type, and starts over when the run puts something else there. The player accumulates nothing either way, which is why a deep link, which is a fresh mount, always draws the frame it names."
99
+ }
100
+ ],
101
+ "todo": true
102
+ }
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "ResearchReport",
3
+ "slug": "research-report",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "An outline that fills in section by section, each carrying the sources behind it.",
11
+ "props": [
12
+ {
13
+ "name": "title",
14
+ "type": "string",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "What the report is about."
18
+ },
19
+ {
20
+ "name": "sections",
21
+ "type": "readonly ReportSection[]",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "The outline. It exists from the start and fills in, so the shape is legible before\nthe prose lands."
25
+ },
26
+ {
27
+ "name": "sourcesRead",
28
+ "type": "number",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "Running count of sources consumed."
32
+ }
33
+ ],
34
+ "typeReferences": [
35
+ "Omit<\n ComponentProps<\"div\">,\n \"children\" | \"title\" | \"sections\" | \"sourcesRead\"\n> & {\n /** What the report is about. */\n title: string;\n /**\n * The outline. It exists from the start and fills in, so the shape is legible before\n * the prose lands.\n */\n sections: readonly ReportSection[];\n /** Running count of sources consumed. */\n sourcesRead: number;\n}"
36
+ ],
37
+ "subcomponents": [],
38
+ "parts": [],
39
+ "variants": {},
40
+ "defaultVariants": {},
41
+ "tokensUsed": [
42
+ "--cue-border",
43
+ "--cue-fg-muted",
44
+ "--cue-fg-subtle",
45
+ "--cue-radius-overlay",
46
+ "--cue-stream",
47
+ "--cue-surface-3",
48
+ "--cue-text-body",
49
+ "--cue-text-ui"
50
+ ],
51
+ "summary": "An outline that fills in section by section, each carrying the sources behind it.",
52
+ "examples": [
53
+ {
54
+ "title": "Usage",
55
+ "code": "import { ResearchReport } from \"@cueplusplus/ui/elements\";\n\n<ResearchReport title=\"Draft ownership in 0.14\" sections={sections} sourcesRead={12} />",
56
+ "language": "tsx"
57
+ }
58
+ ],
59
+ "status": "todo-docs",
60
+ "url": "/docs/components/research-report",
61
+ "mdUrl": "/docs/components/research-report.md",
62
+ "jsonUrl": "/r/components/research-report.json",
63
+ "specimens": [
64
+ {
65
+ "title": "ResearchReport",
66
+ "group": "elements-knowledge",
67
+ "components": [
68
+ "ResearchReport"
69
+ ],
70
+ "code": "<Specimens>\n <Specimen label=\"two done, one writing\" wide>\n <ResearchReport\n title=\"Which fixture for the front truss\"\n sections={REPORT}\n sourcesRead={9}\n />\n </Specimen>\n <Specimen label=\"nothing started\" wide>\n <ResearchReport\n title=\"Which fixture for the front truss\"\n sections={REPORT.map((section) => ({ ...section, state: \"pending\", preview: undefined }))}\n sourcesRead={0}\n />\n </Specimen>\n</Specimens>",
71
+ "note": "An outline that fills in rather than a spinner that spins: every heading is present from the first frame, and each one carries the number of sources behind it. The section being written spins in the streaming hue, the finished ones take a check, the ones still queued are a dot — three states, one row.",
72
+ "interaction": "none. The counter above is derived from the sections, so `2/4 sections` cannot disagree with what is drawn under it."
73
+ }
74
+ ],
75
+ "todo": true
76
+ }
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "RetrievalChunks",
3
+ "slug": "retrieval-chunks",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "The passages a retrieval answer stands on, scored, before the answer itself arrives.",
11
+ "props": [
12
+ {
13
+ "name": "query",
14
+ "type": "string",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "The text that was embedded and searched."
18
+ },
19
+ {
20
+ "name": "chunks",
21
+ "type": "readonly RetrievalChunk[]",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "Passages returned above the threshold, already sorted by score."
25
+ },
26
+ {
27
+ "name": "visibleCount",
28
+ "type": "number",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "How many passages have landed so far."
32
+ },
33
+ {
34
+ "name": "searching",
35
+ "type": "boolean",
36
+ "required": true,
37
+ "defaultValue": null,
38
+ "description": "Shimmers the status line while the index is still being queried."
39
+ }
40
+ ],
41
+ "typeReferences": [
42
+ "Omit<\n ComponentProps<\"div\">,\n \"children\" | \"query\" | \"chunks\" | \"visibleCount\" | \"searching\"\n> & {\n /** The text that was embedded and searched. */\n query: string;\n /** Passages returned above the threshold, already sorted by score. */\n chunks: readonly RetrievalChunk[];\n /** How many passages have landed so far. */\n visibleCount: number;\n /** Shimmers the status line while the index is still being queried. */\n searching: boolean;\n}"
43
+ ],
44
+ "subcomponents": [],
45
+ "parts": [],
46
+ "variants": {},
47
+ "defaultVariants": {},
48
+ "tokensUsed": [
49
+ "--cue-fg",
50
+ "--cue-fg-muted",
51
+ "--cue-fg-subtle",
52
+ "--cue-ok",
53
+ "--cue-radius-overlay",
54
+ "--cue-stream",
55
+ "--cue-surface-2",
56
+ "--cue-text-body",
57
+ "--cue-text-ui"
58
+ ],
59
+ "summary": "The passages a retrieval answer stands on, scored, before the answer itself arrives.",
60
+ "examples": [
61
+ {
62
+ "title": "Usage",
63
+ "code": "import { RetrievalChunks } from \"@cueplusplus/ui/elements\";\n\n<RetrievalChunks\n query=\"how does draft restore work\"\n chunks={chunks}\n visibleCount={3}\n searching={false}\n/>",
64
+ "language": "tsx"
65
+ }
66
+ ],
67
+ "status": "todo-docs",
68
+ "url": "/docs/components/retrieval-chunks",
69
+ "mdUrl": "/docs/components/retrieval-chunks.md",
70
+ "jsonUrl": "/r/components/retrieval-chunks.json",
71
+ "specimens": [
72
+ {
73
+ "title": "RetrievalChunks",
74
+ "group": "elements-knowledge",
75
+ "components": [
76
+ "RetrievalChunks"
77
+ ],
78
+ "code": "<Specimens>\n <Specimen label=\"retrieving\" wide>\n <RetrievalChunks\n query=\"front truss load and power\"\n chunks={CHUNKS}\n visibleCount={1}\n searching\n />\n </Specimen>\n <Specimen label=\"settled\" wide>\n <RetrievalChunks\n query=\"front truss load and power\"\n chunks={CHUNKS}\n visibleCount={CHUNKS.length}\n searching={false}\n />\n </Specimen>\n</Specimens>",
79
+ "note": "What a retrieval actually returned, before the answer built on it: the passage, where it came from, and the score — with a bar under each so a 0.62 reads as weaker than a 0.91 without arithmetic. Scores at or above 0.8 go green; that threshold is the element's one opinion.",
80
+ "interaction": "none, and that is right: these are evidence, not controls. While `searching` the header shimmers; when it settles it says how many passages cleared the threshold."
81
+ }
82
+ ],
83
+ "todo": true
84
+ }
@@ -0,0 +1,150 @@
1
+ {
2
+ "name": "RevertDock",
3
+ "slug": "revert-dock",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "Put it back — and say, in the interface, that this cannot be taken back.\n\nThe second of the two docks nobody ships, and the only destructive control in\nthis family. Four things make it that rather than a button called Restore.\n\nThe **axis**: a run changes the files and the conversation about them, and\nputting one back is not putting the other back. Every product in the study\nthat has checkpoints has this axis, and every one of them names it in its\ncopy — `Restore Files` against `Restore Files & Task`, `Reset Code` against\n`Reset Chat`. So the scopes are the controls: each one says what it does and\nwhat it costs, and the two sentences come from `REVERT_SCOPE_LABELS` and\n`REVERT_SCOPE_DESCRIPTIONS`, which a console can extend.\n\nThe **gate**: `onRestore` fires from one control only, the one that answers\n\"Discard all changes up to this checkpoint?\". Picking a scope arms the dock\nand does nothing else. `This action cannot be undone.` is on the screen the\nwhole time the dock is open, above both steps — an irreversibility that lives\nonly in a props table is an irreversibility somebody meets for the first time\nafterwards.\n\nThe **geometry**, which is the half a gate cannot do on its own: arming must\nnot put the destructive control where the hand already is. This dock used to\nswap the scope list for the confirm inside the same box, and measured in\nChromium at the bench's own 448 px the whole of `Discard and restore`\n(x13–170, y131–161) landed inside `Restore conversation` (x13–435,\ny121–175) — true at 280, 320, 360, 448, 520, 640 and 800 px and at all five\ndensities, so a double click on a scope armed the dock with its first press\nand destroyed the work with its second. Now nothing above the confirm moves:\nthe scope list stays exactly where it was, dimmed and `disabled` — so the\ncoordinates that armed the dock hold a control that no longer answers a\nclick — and the question is *appended under* it, a hairline and two lines of\ncopy below the last scope. Three defences, not one: the arming control stops\ntaking presses, the destructive control is somewhere else, and it refuses\npresses for {@link SETTLE_MS} after it arrives. It fires once per arm.\n\nAnd the **way out**, which is `TwoStepButton`'s ruling rather than a second\none: focus lands on `Keep everything` when the dock arms, never on the\ndestructive half — so a stuck Enter cannot walk through both steps, and a\nreader whose button was just unmounted is not left on `<body>`; `Keep\neverything` hands focus back to the scope that armed it; `Escape` disarms\nfrom inside the panel and stops there, so an armed dock inside a dialog does\nnot also close the dialog, *and* from the document while the dock is armed,\nbecause a press on a disabled control drops focus to `<body>` and an exit\nthat only listens to its own subtree is no exit at all after a double click;\nand folding the dock away disarms it, because an armed state nobody can see\nis one somebody re-opens into. Focus moves on the *transition* into the armed\nstate only — a page that renders three of these as stills steals nothing.\n\nTwo of that button's four exits are deliberately not taken. There is no\n**timeout**: an inline two-step's armed state is two words, and four seconds\nis longer than reading them, while this one is a question, a scope, what it\ncosts and a sentence about irreversibility — a panel that disarms itself\nwhile it is being read teaches people to hurry past exactly the copy that\nmatters. And there is no **blur exit**: `confirming` is the caller's state,\nso leaving would rewrite a prop the caller owns on a gesture as ordinary as\ntabbing into the transcript, and an armed dock is a labelled panel in the\npage rather than a button lying in wait.\n\nState is a prop, as everywhere here: `open` and `confirming` are the caller's,\nwhich is what lets the armed state be benched, tested and replayed instead of\nbeing a thing that only exists between two clicks.",
11
+ "props": [
12
+ {
13
+ "name": "label",
14
+ "type": "string",
15
+ "required": false,
16
+ "defaultValue": "Revert to this point",
17
+ "description": "What the point is called: `Six fixtures addressed`, `Before the patch`."
18
+ },
19
+ {
20
+ "name": "files",
21
+ "type": "number",
22
+ "required": false,
23
+ "defaultValue": null,
24
+ "description": "Files changed since the point. Omit when it is not counted."
25
+ },
26
+ {
27
+ "name": "messages",
28
+ "type": "number",
29
+ "required": false,
30
+ "defaultValue": null,
31
+ "description": "Messages written since the point. Omit when it is not counted."
32
+ },
33
+ {
34
+ "name": "summary",
35
+ "type": "string",
36
+ "required": false,
37
+ "defaultValue": null,
38
+ "description": "The summary line, replacing the one {@link formatRevertSummary} would\nbuild."
39
+ },
40
+ {
41
+ "name": "scopes",
42
+ "type": "readonly (\"both\" | \"files\" | \"conversation\")[]",
43
+ "required": false,
44
+ "defaultValue": "[\"files\", \"conversation\", \"both\"] as const",
45
+ "description": "Which axes this product can actually restore, in the order they are\noffered. `REVERT_SCOPES` (all three) by default; Roo and Cline each ship\ntwo, and a runtime with no workspace to put back ships `[\"conversation\"]`."
46
+ },
47
+ {
48
+ "name": "open",
49
+ "type": "boolean",
50
+ "required": true,
51
+ "defaultValue": null,
52
+ "description": "Whether the scopes are showing, or only the summary line."
53
+ },
54
+ {
55
+ "name": "onOpenChange",
56
+ "type": "((open: boolean) => void)",
57
+ "required": false,
58
+ "defaultValue": null,
59
+ "description": "Called when the dock is expanded or collapsed."
60
+ },
61
+ {
62
+ "name": "confirming",
63
+ "type": "\"both\" | \"files\" | \"conversation\" | null",
64
+ "required": false,
65
+ "defaultValue": "null",
66
+ "description": "The scope waiting to be confirmed, or `null` for the step before that.\n\nThe gate. Pressing a scope reports it here and nothing else happens; the\nrestore itself is a second, separate press. Keeping it a prop rather than\ninternal state is what lets a test — or a replay — sit in the armed state\nand look at it."
67
+ },
68
+ {
69
+ "name": "onConfirmingChange",
70
+ "type": "((scope: \"both\" | \"files\" | \"conversation\" | null) => void)",
71
+ "required": false,
72
+ "defaultValue": null,
73
+ "description": "Called when a scope is armed, and again with `null` every way the dock\nleaves the armed state: `Keep everything`, `Escape`, folding the dock away,\nand the restore itself."
74
+ },
75
+ {
76
+ "name": "onRestore",
77
+ "type": "((scope: \"both\" | \"files\" | \"conversation\") => void)",
78
+ "required": false,
79
+ "defaultValue": null,
80
+ "description": "Do it. Called **only** from the confirm control, never from the control\nthat picks a scope, and at most once per arm."
81
+ },
82
+ {
83
+ "name": "labels",
84
+ "type": "Partial<RevertLabels>",
85
+ "required": false,
86
+ "defaultValue": null,
87
+ "description": "Copy for the dock's own six strings, merged over `REVERT_LABELS` —\nincluding `warning`, the sentence this element refuses to render without."
88
+ },
89
+ {
90
+ "name": "scopeLabels",
91
+ "type": "Partial<Record<\"both\" | \"files\" | \"conversation\", string>>",
92
+ "required": false,
93
+ "defaultValue": null,
94
+ "description": "What each scope is called, merged over `REVERT_SCOPE_LABELS`."
95
+ },
96
+ {
97
+ "name": "scopeDescriptions",
98
+ "type": "Partial<Record<\"both\" | \"files\" | \"conversation\", string>>",
99
+ "required": false,
100
+ "defaultValue": null,
101
+ "description": "What each scope does, merged over `REVERT_SCOPE_DESCRIPTIONS`."
102
+ }
103
+ ],
104
+ "typeReferences": [
105
+ "Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\">"
106
+ ],
107
+ "subcomponents": [],
108
+ "parts": [],
109
+ "variants": {},
110
+ "defaultVariants": {},
111
+ "tokensUsed": [
112
+ "--cue-accent",
113
+ "--cue-accent-fg",
114
+ "--cue-border",
115
+ "--cue-danger",
116
+ "--cue-danger-fg",
117
+ "--cue-fg",
118
+ "--cue-fg-subtle",
119
+ "--cue-radius-control",
120
+ "--cue-radius-overlay",
121
+ "--cue-surface-2",
122
+ "--cue-text-ui",
123
+ "--cue-warn"
124
+ ],
125
+ "summary": "Put it back — and say, in the interface, that this cannot be taken back.",
126
+ "examples": [
127
+ {
128
+ "title": "Usage",
129
+ "code": "import { RevertDock } from \"@cueplusplus/ui/elements\";\n\n<RevertDock\n label=\"Six fixtures addressed\"\n files={6}\n messages={12}\n open={open}\n onOpenChange={setOpen}\n confirming={armed}\n onConfirmingChange={setArmed}\n onRestore={(scope) => restore(scope)}\n/>\n// A runtime with no workspace to put back: one axis, and it says so.\n<RevertDock label=\"Before the plan\" messages={9} scopes={[\"conversation\"]} open />",
130
+ "language": "tsx"
131
+ }
132
+ ],
133
+ "status": "todo-docs",
134
+ "url": "/docs/components/revert-dock",
135
+ "mdUrl": "/docs/components/revert-dock.md",
136
+ "jsonUrl": "/r/components/revert-dock.json",
137
+ "specimens": [
138
+ {
139
+ "title": "RevertDock",
140
+ "group": "elements-agents",
141
+ "components": [
142
+ "RevertDock"
143
+ ],
144
+ "code": "<Specimens>\n <Specimen\n label={\n restored === null\n ? armed === null\n ? \"open: three scopes, each with its cost\"\n : \"armed: one press from the point of no return\"\n : `restored: ${REVERT_SCOPE_LABELS[restored].toLowerCase()}`\n }\n wide\n >\n <div className=\"w-full max-w-md\">\n <RevertDock\n label=\"Six fixtures addressed\"\n files={6}\n messages={12}\n open={revertOpen}\n onOpenChange={setRevertOpen}\n confirming={armed}\n onConfirmingChange={setArmed}\n onRestore={(scope) => {\n setRestored(scope);\n setArmed(null);\n setRevertOpen(false);\n }}\n />\n </div>\n </Specimen>\n <Specimen label=\"armed, as a still\" wide>\n <div className=\"w-full max-w-md\">\n <RevertDock label=\"Universe 3 opened\" files={2} messages={31} open confirming=\"both\" />\n </div>\n </Specimen>\n <Specimen label=\"one axis, and it says so\" wide>\n <div className=\"w-full max-w-md\">\n <RevertDock\n label=\"Before the plan\"\n messages={9}\n scopes={[\"conversation\"]}\n open\n />\n </div>\n </Specimen>\n</Specimens>",
145
+ "note": "The one destructive control in this family, and the three things that make it one rather than a button called Restore. The axis: a run changes the files and the conversation about them, and putting one back is not putting the other back — Roo writes it as `Restore Files` against `Restore Files & Task`, Cline as `Reset Code` against `Reset Chat`. The gate: picking a scope only arms the dock, and `onRestore` fires from the second press alone. And the geometry, which is the half a gate cannot do on its own: the confirm is appended under the scope list rather than drawn over it, because a destructive control that inherits the coordinates of the control that armed it is one a double click reaches unread. `This action cannot be undone.` is on the screen the whole time the dock is open, above every step, because an irreversibility that lives in a props table is one somebody meets for the first time afterwards.",
146
+ "interaction": "each scope names what it costs in a second line under its label; pressing one tints that scope, disables the whole list where it stands and appends Cursor's question beneath it, so nothing above the confirm moves a pixel. Focus lands on `Keep everything`, which also comes first in the DOM; Escape backs out, folding the dock disarms it, and the destructive half refuses presses for 400 ms after it arrives. Restoring here folds the dock and says which scope it was."
147
+ }
148
+ ],
149
+ "todo": true
150
+ }