@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,76 @@
1
+ {
2
+ "name": "ModelPicker",
3
+ "slug": "model-picker",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "The full list rather than the rail: grouped by family, priced, with what each one\ncan do.",
11
+ "props": [
12
+ {
13
+ "name": "models",
14
+ "type": "readonly PickableModel[]",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "Every model on offer. Families are derived from the entries and keep their\nfirst-seen order."
18
+ },
19
+ {
20
+ "name": "selectedId",
21
+ "type": "string",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "Which model is active."
25
+ },
26
+ {
27
+ "name": "onSelect",
28
+ "type": "((id: string) => void)",
29
+ "required": false,
30
+ "defaultValue": null,
31
+ "description": "Called when a model is picked."
32
+ }
33
+ ],
34
+ "typeReferences": [
35
+ "Omit<\n ComponentProps<\"div\">,\n \"children\" | \"models\" | \"selectedId\" | \"onSelect\"\n> & {\n /**\n * Every model on offer. Families are derived from the entries and keep their\n * first-seen order.\n */\n models: readonly PickableModel[];\n /** Which model is active. */\n selectedId: string;\n /** Called when a model is picked. */\n onSelect?: (id: string) => void;\n}"
36
+ ],
37
+ "subcomponents": [],
38
+ "parts": [],
39
+ "variants": {},
40
+ "defaultVariants": {},
41
+ "tokensUsed": [
42
+ "--cue-fg-muted",
43
+ "--cue-fg-subtle",
44
+ "--cue-radius-control",
45
+ "--cue-radius-overlay",
46
+ "--cue-radius-surface",
47
+ "--cue-surface-1",
48
+ "--cue-surface-2",
49
+ "--cue-text-body"
50
+ ],
51
+ "summary": "The full list rather than the rail: grouped by family, priced, with what each one can do.",
52
+ "examples": [
53
+ {
54
+ "title": "Usage",
55
+ "code": "import { ModelPicker } from \"@cueplusplus/ui/elements\";\n\n<ModelPicker models={models} selectedId={selectedId} onSelect={setSelectedId} />",
56
+ "language": "tsx"
57
+ }
58
+ ],
59
+ "status": "todo-docs",
60
+ "url": "/docs/components/model-picker",
61
+ "mdUrl": "/docs/components/model-picker.md",
62
+ "jsonUrl": "/r/components/model-picker.json",
63
+ "specimens": [
64
+ {
65
+ "title": "ModelPicker",
66
+ "group": "elements-composer",
67
+ "components": [
68
+ "ModelPicker"
69
+ ],
70
+ "code": "<Specimens>\n <Specimen label=\"two families\" wide>\n <ModelPicker models={PICKABLE} selectedId={pickedModel} onSelect={setPickedModel} />\n </Specimen>\n <Specimen label=\"one family, nothing chosen\" wide>\n <ModelPicker models={PICKABLE.slice(0, 3)} selectedId=\"\" />\n </Specimen>\n</Specimens>",
71
+ "note": "The full list rather than the rail: grouped by family, priced, and carrying what each one can actually do. This is the screen `ComposerModelTrigger` is a shortcut to, and the split is the point — the toolbar menu is for switching between models you already chose between, and this is where that choosing happens.",
72
+ "interaction": "each row is `aria-pressed`, which is the honest role for a control that stays chosen rather than performing an action once."
73
+ }
74
+ ],
75
+ "todo": true
76
+ }
@@ -16,7 +16,7 @@
16
16
  },
17
17
  {
18
18
  "name": "state",
19
- "type": "\"idle\" | \"selected\" | \"disabled\" | \"live\"",
19
+ "type": "\"disabled\" | \"idle\" | \"selected\" | \"live\"",
20
20
  "required": false,
21
21
  "defaultValue": null,
22
22
  "description": "What the node is doing right now. Outranks `tone`.\n\nPass React Flow's own `selected` through:\n`state={selected ? \"selected\" : \"idle\"}`."
@@ -11,7 +11,7 @@
11
11
  "props": [
12
12
  {
13
13
  "name": "tone",
14
- "type": "\"accent\" | \"danger\" | \"busy\" | \"muted\" | \"ok\" | \"warn\" | \"info\"",
14
+ "type": "\"danger\" | \"accent\" | \"busy\" | \"muted\" | \"ok\" | \"warn\" | \"info\"",
15
15
  "required": false,
16
16
  "defaultValue": "accent",
17
17
  "description": "What the connection carries. Defaults to `\"accent\"`."
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "NumberTicker",
3
+ "slug": "number-ticker",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "Digits that roll into place as a count updates in real time.",
9
+ "props": [
10
+ {
11
+ "name": "value",
12
+ "type": "number",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "Numeric value whose digits roll into place as it changes."
16
+ },
17
+ {
18
+ "name": "label",
19
+ "type": "string",
20
+ "required": true,
21
+ "defaultValue": null,
22
+ "description": "Mono caption rendered under the rolling number."
23
+ }
24
+ ],
25
+ "typeReferences": [
26
+ "Omit<ComponentProps<\"div\">, \"children\" | \"value\" | \"label\"> & {\n /** Numeric value whose digits roll into place as it changes. */\n value: number;\n /** Mono caption rendered under the rolling number. */\n label: string;\n}"
27
+ ],
28
+ "subcomponents": [],
29
+ "parts": [],
30
+ "variants": {},
31
+ "defaultVariants": {},
32
+ "tokensUsed": [
33
+ "--cue-fg-subtle",
34
+ "--cue-text-title"
35
+ ],
36
+ "summary": "Digits that roll into place as a count updates in real time.",
37
+ "examples": [
38
+ {
39
+ "title": "Usage",
40
+ "code": "import { NumberTicker } from \"@cueplusplus/ui/elements\";\n\n<NumberTicker value={1284} label=\"tokens / sec\" />",
41
+ "language": "tsx"
42
+ }
43
+ ],
44
+ "status": "todo-docs",
45
+ "url": "/docs/components/number-ticker",
46
+ "mdUrl": "/docs/components/number-ticker.md",
47
+ "jsonUrl": "/r/components/number-ticker.json",
48
+ "specimens": [
49
+ {
50
+ "title": "NumberTicker",
51
+ "group": "elements-knowledge",
52
+ "components": [
53
+ "NumberTicker"
54
+ ],
55
+ "code": "<Specimens>\n <Specimen label=\"channels patched\">\n <NumberTicker value={48} label=\"channels patched\" />\n </Specimen>\n <Specimen label=\"a larger figure\">\n <NumberTicker value={22300} label=\"lumens\" />\n </Specimen>\n</Specimens>",
56
+ "note": "A count that rolls rather than jumps: each digit is a column of ten sliding into place, so 47 to 48 moves one wheel and leaves the other alone. The whole figure is announced once as text, which is what keeps ten rolling columns from being read out as ten numbers.",
57
+ "interaction": "none. The columns translate on a long ease and stop moving entirely under reduced motion."
58
+ }
59
+ ],
60
+ "todo": true
61
+ }
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "Onboarding",
3
+ "slug": "onboarding",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "First run: three moves that teach what this assistant is actually for.",
9
+ "props": [
10
+ {
11
+ "name": "steps",
12
+ "type": "readonly OnboardingStep[]",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "What to teach, in order. Three is usually the limit before it is skipped."
16
+ },
17
+ {
18
+ "name": "index",
19
+ "type": "number",
20
+ "required": true,
21
+ "defaultValue": null,
22
+ "description": "Which step is showing. The final step's action reads Start instead of Next."
23
+ },
24
+ {
25
+ "name": "onNext",
26
+ "type": "(() => void)",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "Called to advance."
30
+ },
31
+ {
32
+ "name": "onSkip",
33
+ "type": "(() => void)",
34
+ "required": false,
35
+ "defaultValue": null,
36
+ "description": "Called to dismiss. Always offer it."
37
+ }
38
+ ],
39
+ "typeReferences": [
40
+ "Omit<\n ComponentProps<\"div\">,\n \"children\" | \"steps\" | \"index\" | \"onNext\" | \"onSkip\"\n> & {\n /** What to teach, in order. Three is usually the limit before it is skipped. */\n steps: readonly OnboardingStep[];\n /** Which step is showing. The final step's action reads Start instead of Next. */\n index: number;\n /** Called to advance. */\n onNext?: () => void;\n /** Called to dismiss. Always offer it. */\n onSkip?: () => void;\n}"
41
+ ],
42
+ "subcomponents": [],
43
+ "parts": [],
44
+ "variants": {},
45
+ "defaultVariants": {},
46
+ "tokensUsed": [
47
+ "--cue-accent",
48
+ "--cue-fg",
49
+ "--cue-fg-muted",
50
+ "--cue-fg-subtle",
51
+ "--cue-radius-overlay",
52
+ "--cue-radius-surface",
53
+ "--cue-surface-2",
54
+ "--cue-surface-3",
55
+ "--cue-text-body",
56
+ "--cue-text-emphasis",
57
+ "--cue-text-ui"
58
+ ],
59
+ "summary": "First run: three moves that teach what this assistant is actually for.",
60
+ "examples": [
61
+ {
62
+ "title": "Usage",
63
+ "code": "import { Onboarding } from \"@cueplusplus/ui/elements\";\n\n<Onboarding steps={steps} index={index} onNext={next} onSkip={skip} />",
64
+ "language": "tsx"
65
+ }
66
+ ],
67
+ "status": "todo-docs",
68
+ "url": "/docs/components/onboarding",
69
+ "mdUrl": "/docs/components/onboarding.md",
70
+ "jsonUrl": "/r/components/onboarding.json",
71
+ "specimens": [
72
+ {
73
+ "title": "Onboarding",
74
+ "group": "elements-composer",
75
+ "components": [
76
+ "Onboarding"
77
+ ],
78
+ "code": "<Specimens>\n <Specimen label=\"walking it\" wide>\n <Onboarding\n steps={ONBOARDING}\n index={step}\n onNext={() => setStep((current) => Math.min(current + 1, ONBOARDING.length - 1))}\n onSkip={() => setStep(0)}\n />\n </Specimen>\n <Specimen label=\"last step\" wide>\n <Onboarding steps={ONBOARDING} index={ONBOARDING.length - 1} />\n </Specimen>\n</Specimens>",
79
+ "note": "First run: three moves that teach what this assistant is actually for, each with a prompt you could send verbatim. Showing beats describing, which is why every step carries an example rather than a screenshot. The dots are the progress and the final step's action reads `Start` instead of `Next`, so the end of the tour is visible from the second step.",
80
+ "interaction": "skip is always offered and always in the same place — a tour with no way out is a modal wearing a card."
81
+ }
82
+ ],
83
+ "todo": true
84
+ }
@@ -28,13 +28,6 @@
28
28
  "defaultValue": null,
29
29
  "description": "Accessible name for the field. Names the group *and*, through a visually\nhidden `<label>`, the first slot — the ARIA pattern for a code field. Leave\nit off inside a {@link Field }, which supplies a real label."
30
30
  },
31
- {
32
- "name": "size",
33
- "type": "\"sm\" | \"md\" | \"lg\"",
34
- "required": false,
35
- "defaultValue": "md",
36
- "description": "Rung of the control ladder. Defaults to `\"md\"`."
37
- },
38
31
  {
39
32
  "name": "separator",
40
33
  "type": "ReactNode",
@@ -42,6 +35,13 @@
42
35
  "defaultValue": "–",
43
36
  "description": "What sits between groups. Defaults to `\"–\"`. Always `aria-hidden`."
44
37
  },
38
+ {
39
+ "name": "size",
40
+ "type": "\"sm\" | \"md\" | \"lg\"",
41
+ "required": false,
42
+ "defaultValue": "md",
43
+ "description": "Rung of the control ladder. Defaults to `\"md\"`."
44
+ },
45
45
  {
46
46
  "name": "length",
47
47
  "type": "number",
@@ -0,0 +1,92 @@
1
+ {
2
+ "name": "PermissionGrant",
3
+ "slug": "permission-grant",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "Granting a capability rather than approving one action, with the reach spelled out.",
11
+ "props": [
12
+ {
13
+ "name": "capability",
14
+ "type": "string",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "What is being granted, named as a capability rather than an action."
18
+ },
19
+ {
20
+ "name": "requester",
21
+ "type": "string",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "Who is asking."
25
+ },
26
+ {
27
+ "name": "reach",
28
+ "type": "readonly string[]",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "Exactly what the grant covers, and what it does not. Write the limits in too."
32
+ },
33
+ {
34
+ "name": "scope",
35
+ "type": "\"pending\" | \"always\" | \"denied\" | \"session\"",
36
+ "required": true,
37
+ "defaultValue": null,
38
+ "description": "pending shows the choices; anything else shows the settled outcome."
39
+ },
40
+ {
41
+ "name": "onGrant",
42
+ "type": "((scope: GrantScope) => void)",
43
+ "required": false,
44
+ "defaultValue": null,
45
+ "description": "Called with the scope the user chose."
46
+ }
47
+ ],
48
+ "typeReferences": [
49
+ "Omit<\n ComponentProps<\"div\">,\n \"children\" | \"capability\" | \"requester\" | \"reach\" | \"scope\" | \"onGrant\"\n> & {\n /** What is being granted, named as a capability rather than an action. */\n capability: string;\n /** Who is asking. */\n requester: string;\n /** Exactly what the grant covers, and what it does not. Write the limits in too. */\n reach: readonly string[];\n /** pending shows the choices; anything else shows the settled outcome. */\n scope: GrantScope | \"pending\";\n /** Called with the scope the user chose. */\n onGrant?: (scope: GrantScope) => void;\n}"
50
+ ],
51
+ "subcomponents": [],
52
+ "parts": [],
53
+ "variants": {},
54
+ "defaultVariants": {},
55
+ "tokensUsed": [
56
+ "--cue-fg",
57
+ "--cue-fg-muted",
58
+ "--cue-fg-subtle",
59
+ "--cue-radius-overlay",
60
+ "--cue-radius-surface",
61
+ "--cue-surface-1",
62
+ "--cue-surface-2",
63
+ "--cue-surface-3",
64
+ "--cue-text-body",
65
+ "--cue-text-ui"
66
+ ],
67
+ "summary": "Granting a capability rather than approving one action, with the reach spelled out.",
68
+ "examples": [
69
+ {
70
+ "title": "Usage",
71
+ "code": "import { PermissionGrant } from \"@cueplusplus/ui/elements\";\n\n<PermissionGrant\n capability=\"Filesystem access\"\n requester=\"filesystem-mcp\"\n reach={reach}\n scope=\"pending\"\n onGrant={setScope}\n/>",
72
+ "language": "tsx"
73
+ }
74
+ ],
75
+ "status": "todo-docs",
76
+ "url": "/docs/components/permission-grant",
77
+ "mdUrl": "/docs/components/permission-grant.md",
78
+ "jsonUrl": "/r/components/permission-grant.json",
79
+ "specimens": [
80
+ {
81
+ "title": "PermissionGrant",
82
+ "group": "elements",
83
+ "components": [
84
+ "PermissionGrant"
85
+ ],
86
+ "code": "<Specimens>\n {SCOPES.map((scope) => (\n <Specimen key={scope} label={scope} wide>\n <PermissionGrant\n capability=\"Write show files\"\n requester=\"Patcher\"\n reach={REACH}\n scope={grants[scope] ?? scope}\n onGrant={grant(scope)}\n />\n </Specimen>\n ))}\n</Specimens>",
87
+ "note": "The other half of the loop: granting a capability rather than approving one action. The reach is a list the caller writes, and the limits belong in it, because a grant a reader cannot bound is a grant they cannot give.",
88
+ "interaction": "the three answers are Deny, this session and Always. Answer any card and it settles into the scope you chose."
89
+ }
90
+ ],
91
+ "todo": true
92
+ }
@@ -0,0 +1,139 @@
1
+ {
2
+ "name": "PermissionScopes",
3
+ "slug": "permission-scopes",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [],
7
+ "clientOnly": true,
8
+ "description": "Approval that says how far it reaches and where that is written down.\n\nEvery product in the study offers a scope at the moment of approval, and\nevery one of them labels it the same static way — `Always allow` — which is\nthe least informative string in an agent UI: it is the only control on the\nscreen whose consequences outlive the conversation, and it says nothing about\nwhat it grants or where the grant goes. So this one writes its own label.\n`Yes, allow Bash(git commit:*) for this project (just you)` names the rule\nand the reach; the line under it names the file, in a sentence, permanently\nvisible.\n\nNothing is shortened. Claude Code elides a long rule and strips the `:*` off\na prefix rule, and both cuts land on the part that says how much is being\ngranted, so the label here wraps instead. When there are more rules than the\nsentence can name, every one of them is listed under the answer — `and 3\nmore` is a count, and a count is not an account.\n\nThe three answers are numbered, and the numbers are real **while focus is\ninside the card**: `1`, `2` and `3` fire whichever answers are rendered,\nbuilt from the same list that draws them, so a card with no always-allow has\n`2` on its deny, and `Escape` denies. The handler is the card's own\n`onKeyDown` and nothing is ever bound to the document, so the keys answer for\na reader who has tabbed to an answer or been handed the card, and for nobody\nelse.\n\nThat is narrower than the reference, and the narrowing is the point. Claude\nCode disables its buttons for 500ms after mount and *then* takes focus, so\nits digits answer from anywhere; this card never claims focus at all, because\na card that arrives mid-sentence and starts answering keystrokes is the bug\nthat delay exists to prevent — and a row in a library cannot know whether the\nreader is halfway through typing `1` into a composer above it. A product that\nwants the digits to answer from anywhere has the information to decide that\nsafely and this element does not: it routes its own key handler to the same\nthree callbacks, or hands the card focus itself with a `ref` and a `tabIndex`\nof its own.\n\nThere is no settled state. An answered permission is not a card any more; the\nrow that survives is the tool call's own, with its status changed. Every\nproduct that modelled approval as an overlay ended up with the bug where the\nnext message hides the answer.",
9
+ "props": [
10
+ {
11
+ "name": "question",
12
+ "type": "string",
13
+ "required": true,
14
+ "defaultValue": null,
15
+ "description": "The question, in the words of the thing being asked for: `Run this\ncommand?`, `Edit this file?`. One step up in size, as the reference sets\nit: it is the only sentence on the card that has to be read."
16
+ },
17
+ {
18
+ "name": "subject",
19
+ "type": "string",
20
+ "required": false,
21
+ "defaultValue": null,
22
+ "description": "The file, host or command the question is about, set in mono beside it.\nOmit for a question that names its own subject."
23
+ },
24
+ {
25
+ "name": "input",
26
+ "type": "string",
27
+ "required": false,
28
+ "defaultValue": null,
29
+ "description": "The exact input the call would run with, drawn in a recessed mono box —\nthe command, the patch, the URL. Shown verbatim and never parsed."
30
+ },
31
+ {
32
+ "name": "rules",
33
+ "type": "readonly string[]",
34
+ "required": false,
35
+ "defaultValue": "[]",
36
+ "description": "The rules a standing grant would write, exactly as they will be written.\nThe always-allow answer's label is built from these; when there are more\nthan the label can name, all of them are listed under it."
37
+ },
38
+ {
39
+ "name": "ruleKind",
40
+ "type": "\"directory\" | \"rule\"",
41
+ "required": false,
42
+ "defaultValue": "rule",
43
+ "description": "Whether `rules` are rules or directories, which changes the phrasing."
44
+ },
45
+ {
46
+ "name": "scopes",
47
+ "type": "readonly PermissionScope[]",
48
+ "required": false,
49
+ "defaultValue": "[]",
50
+ "description": "Where a standing grant can be written, in the order they are offered.\n**No scopes means no always-allow answer**: a permanent grant that cannot\nsay where it is saved is not one this element will offer."
51
+ },
52
+ {
53
+ "name": "scope",
54
+ "type": "string",
55
+ "required": false,
56
+ "defaultValue": null,
57
+ "description": "Which scope is chosen, by `id`. Defaults to the first. Claude Code\npersists this choice across prompts and so should a console — which is why\nit is a prop here rather than state: this element never remembers anything."
58
+ },
59
+ {
60
+ "name": "onScopeChange",
61
+ "type": "((id: string) => void)",
62
+ "required": false,
63
+ "defaultValue": null,
64
+ "description": "Called with the next scope's `id` when the destination is cycled."
65
+ },
66
+ {
67
+ "name": "onAllowOnce",
68
+ "type": "(() => void)",
69
+ "required": false,
70
+ "defaultValue": null,
71
+ "description": "Yes, once. The answer exists only when this is given."
72
+ },
73
+ {
74
+ "name": "onAlwaysAllow",
75
+ "type": "((scope: string) => void)",
76
+ "required": false,
77
+ "defaultValue": null,
78
+ "description": "Yes, and write the rules to the chosen scope — reported by `id`. The\nanswer exists only when this **and** at least one scope are given."
79
+ },
80
+ {
81
+ "name": "onDeny",
82
+ "type": "(() => void)",
83
+ "required": false,
84
+ "defaultValue": null,
85
+ "description": "No. Also what `Escape` does, while focus is inside the card. The answer\nexists only when this is given."
86
+ },
87
+ {
88
+ "name": "labels",
89
+ "type": "Partial<PermissionLabels>",
90
+ "required": false,
91
+ "defaultValue": null,
92
+ "description": "The card's own six strings, merged over `PERMISSION_LABELS`."
93
+ }
94
+ ],
95
+ "typeReferences": [
96
+ "Omit<React.ComponentPropsWithoutRef<\"div\">, \"children\" | \"onSelect\">"
97
+ ],
98
+ "subcomponents": [],
99
+ "parts": [],
100
+ "variants": {},
101
+ "defaultVariants": {},
102
+ "tokensUsed": [
103
+ "--cue-accent",
104
+ "--cue-fg",
105
+ "--cue-fg-muted",
106
+ "--cue-fg-subtle",
107
+ "--cue-radius-control",
108
+ "--cue-radius-overlay",
109
+ "--cue-surface-2",
110
+ "--cue-surface-3",
111
+ "--cue-text-body",
112
+ "--cue-text-ui"
113
+ ],
114
+ "summary": "Approval that says how far it reaches and where that is written down.",
115
+ "examples": [
116
+ {
117
+ "title": "Usage",
118
+ "code": "import { PermissionScopes, PERMISSION_SCOPE_LABELS } from \"@cueplusplus/ui/elements\";\n\n<PermissionScopes\n question=\"Run this command?\"\n subject=\"cue-cli\"\n input='cue patch --universe 3 --fixtures 6'\n rules={[\"Bash(cue patch:*)\"]}\n scopes={[\n { id: \"session\", label: PERMISSION_SCOPE_LABELS.session, writes: \"Not saved. Gone when this run ends.\" },\n { id: \"project\", label: PERMISSION_SCOPE_LABELS.project, writes: \"Saves to .cue/settings.local.json (gitignored)\" },\n ]}\n scope={scope}\n onScopeChange={setScope}\n onAllowOnce={() => allow()}\n onAlwaysAllow={(id) => remember(id)}\n onDeny={() => deny()}\n/>\n// No scopes: the card asks, and the only answers are once and no.\n<PermissionScopes question=\"Delete this file?\" subject=\"cues/old.cue\" onAllowOnce={allow} onDeny={deny} />",
119
+ "language": "tsx"
120
+ }
121
+ ],
122
+ "status": "todo-docs",
123
+ "url": "/docs/components/permission-scopes",
124
+ "mdUrl": "/docs/components/permission-scopes.md",
125
+ "jsonUrl": "/r/components/permission-scopes.json",
126
+ "specimens": [
127
+ {
128
+ "title": "PermissionScopes",
129
+ "group": "elements",
130
+ "components": [
131
+ "PermissionScopes"
132
+ ],
133
+ "code": "<Specimens>\n <Specimen label={answered === null ? \"asking\" : `answered: ${answered}`} wide>\n <div className=\"flex w-full max-w-md flex-col gap-(--cue-space-2)\">\n <PermissionScopes\n question=\"Run this command?\"\n subject=\"cue-cli\"\n input=\"cue patch --universe 3 --fixtures 6 --start 1\"\n rules={[\"Bash(cue patch:*)\"]}\n scopes={SAVES_TO}\n scope={saveTo}\n onScopeChange={setSaveTo}\n onAllowOnce={() => setAnswered(\"once\")}\n onAlwaysAllow={(id) => setAnswered(`always · ${id}`)}\n onDeny={() => setAnswered(\"denied\")}\n />\n <p className=\"text-(length:--cue-text-label) text-fg-subtle\">\n last answer: {answered ?? \"none yet\"}\n </p>\n </div>\n </Specimen>\n <Specimen label=\"one destination, so no choice to make\" wide>\n <div className=\"w-full max-w-md\">\n <PermissionScopes\n question=\"Write this file?\"\n subject=\"shows/rig.cue\"\n rules={[\"Write(shows/**)\"]}\n scopes={[SAVES_TO[0] as PermissionScope]}\n onAllowOnce={() => {}}\n onAlwaysAllow={() => {}}\n onDeny={() => {}}\n />\n </div>\n </Specimen>\n <Specimen label=\"four rules, and all four named\" wide>\n <div className=\"w-full max-w-md\">\n <PermissionScopes\n question=\"Read these paths?\"\n rules={[\"Read(plots/**)\", \"Read(shows/**)\", \"Read(cues/**)\", \"Read(docs/**)\"]}\n scopes={SAVES_TO}\n scope=\"everywhere\"\n onAlwaysAllow={() => {}}\n onDeny={() => {}}\n />\n </div>\n </Specimen>\n <Specimen label=\"one directory, and nowhere to break the line\" wide>\n <div className=\"w-full max-w-md\">\n <PermissionScopes\n question=\"Allow access to this directory?\"\n rules={[\n \"/Users/kit/rig/shows/2026_midsummer_transfer_technical_rehearsal_moving_heads\",\n ]}\n ruleKind=\"directory\"\n scopes={SAVES_TO}\n scope=\"project\"\n onAlwaysAllow={() => {}}\n onDeny={() => {}}\n />\n </div>\n </Specimen>\n <Specimen label=\"the destination is the long word this time\" wide>\n <div className=\"flex w-full max-w-md flex-col gap-(--cue-space-2)\">\n <PermissionScopes\n question=\"Write this file?\"\n subject=\"shows/2026_midsummer_transfer_technical_rehearsal_moving_heads.cue\"\n rules={[\"Write(shows/**)\"]}\n scopes={SAVES_TO_A_LONG_WAY}\n scope={savedFar}\n onScopeChange={setSavedFar}\n onAlwaysAllow={() => {}}\n onDeny={() => {}}\n />\n <PermissionScopes\n question=\"Write this file?\"\n subject=\"shows/2026_midsummer_transfer_technical_rehearsal_moving_heads.cue\"\n rules={[\"Write(shows/**)\"]}\n scopes={[SAVES_TO_A_LONG_WAY[1] as PermissionScope]}\n onAlwaysAllow={() => {}}\n onDeny={() => {}}\n />\n </div>\n </Specimen>\n</Specimens>",
134
+ "note": "The one control in an agent UI whose label has to be computed, because what it grants is different every time it appears. `Yes, allow Bash(cue patch:*) for this project (just you)` is written from the rules it would add and the reach it would add them to, and the sentence under it names the file — permanently, not on hover. Nothing is shortened: the reference elides a long rule and strips the `:*` off a prefix rule, and both cuts land on the part that says how far the grant reaches, so this one wraps instead. When there are more rules than the sentence can name, every one of them is listed underneath, because `and 3 more` is a count and a count is not an account. The last card is what that costs: one directory of seventy-seven characters that a line breaker reads as a single word — it would take a hyphen if the name had one, and an underscored path has none — so the sentence breaks mid-path rather than running out of the card. It is also the card where the sentence is the whole account, since a grant naming one directory draws no rule list under it. The card after it moves the long word to the other two caller strings that can carry one — the subject beside the question, and the destination naming the file the grant is written into — and draws the destination both ways: the top card cycles it, so it is a button sized to its own text, and the bottom card has one destination and draws a span. Cycle the top one onto the project and the sentence breaks mid-path instead of leaving the card, which is the whole point of drawing where a permission is saved rather than hiding it behind a hover.",
135
+ "interaction": "tab into the card and the numbers work — 1, 2, 3 fire whichever answers are rendered, built from the same list that drew them, and Escape denies. They are the card's own keys, not the document's: nothing here answers a digit typed into a composer somewhere above it, and a console that wants them to answer from anywhere routes them there itself. Press the dotted line to move the grant to another destination and watch the answer above it change with it: there is one resolved scope behind the label, the sentence and the callback, so they cannot disagree about what is being granted."
136
+ }
137
+ ],
138
+ "todo": true
139
+ }
@@ -85,7 +85,7 @@
85
85
  },
86
86
  {
87
87
  "name": "side",
88
- "type": "\"left\" | \"right\" | \"top\" | \"bottom\" | \"inline-end\" | \"inline-start\"",
88
+ "type": "\"left\" | \"right\" | \"bottom\" | \"top\" | \"inline-end\" | \"inline-start\"",
89
89
  "required": false,
90
90
  "defaultValue": null,
91
91
  "description": "Preferred side of the trigger. Defaults to `\"bottom\"`."
@@ -0,0 +1,99 @@
1
+ {
2
+ "name": "PromptLibrary",
3
+ "slug": "prompt-library",
4
+ "group": "elements",
5
+ "importPath": "@cueplusplus/ui/elements",
6
+ "peerDependencies": [
7
+ "lucide-react"
8
+ ],
9
+ "clientOnly": true,
10
+ "description": "Prompts you saved, searchable, with their variables shown before you insert one.",
11
+ "props": [
12
+ {
13
+ "name": "prompts",
14
+ "type": "readonly SavedPrompt[]",
15
+ "required": true,
16
+ "defaultValue": null,
17
+ "description": "Everything saved. Filtering happens inside against the name."
18
+ },
19
+ {
20
+ "name": "query",
21
+ "type": "string",
22
+ "required": true,
23
+ "defaultValue": null,
24
+ "description": "Current search text."
25
+ },
26
+ {
27
+ "name": "selectedId",
28
+ "type": "string",
29
+ "required": true,
30
+ "defaultValue": null,
31
+ "description": "Which prompt is previewed below the list."
32
+ },
33
+ {
34
+ "name": "onQueryChange",
35
+ "type": "((query: string) => void)",
36
+ "required": false,
37
+ "defaultValue": null,
38
+ "description": "Called as the search is typed."
39
+ },
40
+ {
41
+ "name": "onSelect",
42
+ "type": "((id: string) => void)",
43
+ "required": false,
44
+ "defaultValue": null,
45
+ "description": "Called when a prompt is highlighted."
46
+ },
47
+ {
48
+ "name": "onInsert",
49
+ "type": "((id: string) => void)",
50
+ "required": false,
51
+ "defaultValue": null,
52
+ "description": "Called on double click, to drop the prompt into the composer."
53
+ }
54
+ ],
55
+ "typeReferences": [
56
+ "Omit<\n ComponentProps<\"div\">,\n | \"children\"\n | \"prompts\"\n | \"query\"\n | \"selectedId\"\n | \"onQueryChange\"\n | \"onSelect\"\n | \"onInsert\"\n> & {\n /** Everything saved. Filtering happens inside against the name. */\n prompts: readonly SavedPrompt[];\n /** Current search text. */\n query: string;\n /** Which prompt is previewed below the list. */\n selectedId: string;\n /** Called as the search is typed. */\n onQueryChange?: (query: string) => void;\n /** Called when a prompt is highlighted. */\n onSelect?: (id: string) => void;\n /** Called on double click, to drop the prompt into the composer. */\n onInsert?: (id: string) => void;\n}"
57
+ ],
58
+ "subcomponents": [],
59
+ "parts": [],
60
+ "variants": {},
61
+ "defaultVariants": {},
62
+ "tokensUsed": [
63
+ "--cue-accent",
64
+ "--cue-bg",
65
+ "--cue-fg-muted",
66
+ "--cue-fg-subtle",
67
+ "--cue-radius-control",
68
+ "--cue-radius-overlay",
69
+ "--cue-radius-surface",
70
+ "--cue-surface-1",
71
+ "--cue-text-body",
72
+ "--cue-text-ui"
73
+ ],
74
+ "summary": "Prompts you saved, searchable, with their variables shown before you insert one.",
75
+ "examples": [
76
+ {
77
+ "title": "Usage",
78
+ "code": "import { PromptLibrary } from \"@cueplusplus/ui/elements\";\n\n<PromptLibrary\n prompts={prompts}\n query={query}\n selectedId={selectedId}\n onQueryChange={setQuery}\n onSelect={setSelectedId}\n onInsert={insert}\n/>",
79
+ "language": "tsx"
80
+ }
81
+ ],
82
+ "status": "todo-docs",
83
+ "url": "/docs/components/prompt-library",
84
+ "mdUrl": "/docs/components/prompt-library.md",
85
+ "jsonUrl": "/r/components/prompt-library.json",
86
+ "specimens": [
87
+ {
88
+ "title": "PromptLibrary",
89
+ "group": "elements-composer",
90
+ "components": [
91
+ "PromptLibrary"
92
+ ],
93
+ "code": "<Specimens>\n <Specimen label=\"browsing\" wide>\n <PromptLibrary\n prompts={PROMPTS}\n query={promptQuery}\n selectedId={promptId}\n onQueryChange={setPromptQuery}\n onSelect={setPromptId}\n onInsert={setPromptId}\n />\n </Specimen>\n <Specimen label=\"nothing matches\" wide>\n <PromptLibrary prompts={PROMPTS} query=\"haze\" selectedId=\"\" />\n </Specimen>\n</Specimens>",
94
+ "note": "Prompts somebody saved, searchable, with the holes in them counted before you insert one — `3 vars` is the difference between a prompt you can send and a template you still have to fill. The preview underneath is the whole body, because a prompt library that hides the prompt is a list of file names.",
95
+ "interaction": "arrows walk the list and Enter inserts; a row also inserts on double-click, so the mouse has the same two gestures the keyboard does. An empty result says what it found nothing for rather than showing an empty box."
96
+ }
97
+ ],
98
+ "todo": true
99
+ }