@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.
- package/CHANGELOG.md +2229 -0
- package/dist/agent-runtime/_glyphs.js +43 -0
- package/dist/agent-runtime/branch-picker.d.ts +45 -0
- package/dist/agent-runtime/branch-picker.js +87 -0
- package/dist/agent-runtime/index.d.ts +4 -0
- package/dist/agent-runtime/index.js +4 -0
- package/dist/agent-runtime/tool-call-card.d.ts +69 -0
- package/dist/agent-runtime/tool-call-card.js +187 -0
- package/dist/agent-runtime/use-agent-thread.d.ts +164 -0
- package/dist/agent-runtime/use-agent-thread.js +251 -0
- package/dist/chat/index.d.ts +2 -2
- package/dist/chat/message-list.d.ts +6 -0
- package/dist/chat/message-list.js +35 -0
- package/dist/chrome/app-shell.d.ts +52 -2
- package/dist/chrome/app-shell.js +80 -8
- package/dist/chrome/index.d.ts +2 -2
- package/dist/configurator/_export.js +3 -2
- package/dist/configurator/_overrides.d.ts +1 -1
- package/dist/configurator/token-editor.js +4 -1
- package/dist/date/_segments.js +37 -2
- package/dist/elements/activity-graph.d.ts +40 -0
- package/dist/elements/activity-graph.js +81 -0
- package/dist/elements/agent-card.d.ts +49 -0
- package/dist/elements/agent-card.js +91 -0
- package/dist/elements/agent-handoff.d.ts +24 -0
- package/dist/elements/agent-handoff.js +53 -0
- package/dist/elements/agent-mode-badge.d.ts +72 -0
- package/dist/elements/agent-mode-badge.js +110 -0
- package/dist/elements/agent-plan.d.ts +24 -0
- package/dist/elements/agent-plan.js +74 -0
- package/dist/elements/agent-status.d.ts +29 -0
- package/dist/elements/agent-status.js +46 -0
- package/dist/elements/agent-surface.d.ts +65 -0
- package/dist/elements/agent-surface.js +68 -0
- package/dist/elements/animated-number.d.ts +86 -0
- package/dist/elements/animated-number.js +118 -0
- package/dist/elements/approval-card.d.ts +40 -0
- package/dist/elements/approval-card.js +78 -0
- package/dist/elements/artifact-card.d.ts +30 -0
- package/dist/elements/artifact-card.js +58 -0
- package/dist/elements/background-inbox.d.ts +39 -0
- package/dist/elements/background-inbox.js +60 -0
- package/dist/elements/canvas-split.d.ts +77 -0
- package/dist/elements/canvas-split.js +138 -0
- package/dist/elements/chart.d.ts +41 -0
- package/dist/elements/chart.js +117 -0
- package/dist/elements/chat-panel.d.ts +46 -0
- package/dist/elements/chat-panel.js +104 -0
- package/dist/elements/checkpoint-history.d.ts +31 -0
- package/dist/elements/checkpoint-history.js +65 -0
- package/dist/elements/clamp.d.ts +90 -0
- package/dist/elements/clamp.js +109 -0
- package/dist/elements/code-diff.d.ts +42 -0
- package/dist/elements/code-diff.js +69 -0
- package/dist/elements/code-runner.d.ts +38 -0
- package/dist/elements/code-runner.js +84 -0
- package/dist/elements/command-palette.d.ts +48 -0
- package/dist/elements/command-palette.js +129 -0
- package/dist/elements/compaction-row.d.ts +63 -0
- package/dist/elements/compaction-row.js +110 -0
- package/dist/elements/comparison-card.d.ts +47 -0
- package/dist/elements/comparison-card.js +69 -0
- package/dist/elements/composer.d.ts +274 -0
- package/dist/elements/composer.js +505 -0
- package/dist/elements/computer-use.d.ts +40 -0
- package/dist/elements/computer-use.js +92 -0
- package/dist/elements/confidence-marker.d.ts +39 -0
- package/dist/elements/confidence-marker.js +64 -0
- package/dist/elements/connection-state.d.ts +29 -0
- package/dist/elements/connection-state.js +66 -0
- package/dist/elements/context-breakdown.d.ts +30 -0
- package/dist/elements/context-breakdown.js +86 -0
- package/dist/elements/context-usage.d.ts +99 -0
- package/dist/elements/context-usage.js +225 -0
- package/dist/elements/conversation-search.d.ts +48 -0
- package/dist/elements/conversation-search.js +88 -0
- package/dist/elements/cost-meter.d.ts +33 -0
- package/dist/elements/cost-meter.js +75 -0
- package/dist/elements/data-table.d.ts +31 -0
- package/dist/elements/data-table.js +67 -0
- package/dist/elements/day-separator.d.ts +34 -0
- package/dist/elements/day-separator.js +50 -0
- package/dist/elements/diagram.d.ts +34 -0
- package/dist/elements/diagram.js +75 -0
- package/dist/elements/document-reference.d.ts +37 -0
- package/dist/elements/document-reference.js +66 -0
- package/dist/elements/draft-restore.d.ts +27 -0
- package/dist/elements/draft-restore.js +54 -0
- package/dist/elements/edit-message.d.ts +36 -0
- package/dist/elements/edit-message.js +77 -0
- package/dist/elements/elements.css +459 -0
- package/dist/elements/elicitation-form.d.ts +48 -0
- package/dist/elements/elicitation-form.js +106 -0
- package/dist/elements/empty-state.d.ts +52 -0
- package/dist/elements/empty-state.js +98 -0
- package/dist/elements/end-of-turn-summary.d.ts +60 -0
- package/dist/elements/end-of-turn-summary.js +75 -0
- package/dist/elements/error-state.d.ts +29 -0
- package/dist/elements/error-state.js +55 -0
- package/dist/elements/feedback-dialog.d.ts +36 -0
- package/dist/elements/feedback-dialog.js +81 -0
- package/dist/elements/file-tree.d.ts +45 -0
- package/dist/elements/file-tree.js +84 -0
- package/dist/elements/flow-graph.d.ts +45 -0
- package/dist/elements/flow-graph.js +78 -0
- package/dist/elements/generative/chart.js +200 -0
- package/dist/elements/generative/faults.js +111 -0
- package/dist/elements/generative/icons.d.ts +41 -0
- package/dist/elements/generative/icons.js +190 -0
- package/dist/elements/generative/intrinsics.js +483 -0
- package/dist/elements/generative/spec.d.ts +110 -0
- package/dist/elements/generative/spec.js +366 -0
- package/dist/elements/generative.css +1145 -0
- package/dist/elements/generative.d.ts +144 -0
- package/dist/elements/generative.js +126 -0
- package/dist/elements/guardrail-notice.d.ts +29 -0
- package/dist/elements/guardrail-notice.js +63 -0
- package/dist/elements/image-generation.d.ts +18 -0
- package/dist/elements/image-generation.js +64 -0
- package/dist/elements/index.d.ts +116 -0
- package/dist/elements/index.js +115 -0
- package/dist/elements/inline-citation.d.ts +43 -0
- package/dist/elements/inline-citation.js +93 -0
- package/dist/elements/job-progress.d.ts +49 -0
- package/dist/elements/job-progress.js +74 -0
- package/dist/elements/launcher-bubble.d.ts +34 -0
- package/dist/elements/launcher-bubble.js +72 -0
- package/dist/elements/live-region-announcer.d.ts +130 -0
- package/dist/elements/live-region-announcer.js +230 -0
- package/dist/elements/loading-state.d.ts +27 -0
- package/dist/elements/loading-state.js +36 -0
- package/dist/elements/map-answer.d.ts +38 -0
- package/dist/elements/map-answer.js +93 -0
- package/dist/elements/markdown.d.ts +131 -0
- package/dist/elements/markdown.js +528 -0
- package/dist/elements/math-block.d.ts +51 -0
- package/dist/elements/math-block.js +70 -0
- package/dist/elements/mcp-server-panel.d.ts +41 -0
- package/dist/elements/mcp-server-panel.js +115 -0
- package/dist/elements/memory-chips.d.ts +30 -0
- package/dist/elements/memory-chips.js +43 -0
- package/dist/elements/message-actions.d.ts +38 -0
- package/dist/elements/message-actions.js +71 -0
- package/dist/elements/message-attachment.d.ts +48 -0
- package/dist/elements/message-attachment.js +63 -0
- package/dist/elements/message-branches.d.ts +25 -0
- package/dist/elements/message-branches.js +65 -0
- package/dist/elements/message-pair.d.ts +33 -0
- package/dist/elements/message-pair.js +65 -0
- package/dist/elements/message-queue.d.ts +31 -0
- package/dist/elements/message-queue.js +80 -0
- package/dist/elements/message-timing.d.ts +33 -0
- package/dist/elements/message-timing.js +37 -0
- package/dist/elements/mobile-composer.d.ts +44 -0
- package/dist/elements/mobile-composer.js +88 -0
- package/dist/elements/model-picker.d.ts +38 -0
- package/dist/elements/model-picker.js +69 -0
- package/dist/elements/number-ticker.d.ts +18 -0
- package/dist/elements/number-ticker.js +47 -0
- package/dist/elements/onboarding.d.ts +30 -0
- package/dist/elements/onboarding.js +75 -0
- package/dist/elements/permission-grant.d.ts +35 -0
- package/dist/elements/permission-grant.js +86 -0
- package/dist/elements/permission-scopes.d.ts +215 -0
- package/dist/elements/permission-scopes.js +249 -0
- package/dist/elements/prompt-library.d.ts +43 -0
- package/dist/elements/prompt-library.js +117 -0
- package/dist/elements/queue-dock.d.ts +101 -0
- package/dist/elements/queue-dock.js +132 -0
- package/dist/elements/quota-banner.d.ts +26 -0
- package/dist/elements/quota-banner.js +66 -0
- package/dist/elements/quote-reply.d.ts +44 -0
- package/dist/elements/quote-reply.js +79 -0
- package/dist/elements/range.d.ts +29 -0
- package/dist/elements/range.js +45 -0
- package/dist/elements/read-aloud.d.ts +45 -0
- package/dist/elements/read-aloud.js +75 -0
- package/dist/elements/reasoning-effort.d.ts +36 -0
- package/dist/elements/reasoning-effort.js +67 -0
- package/dist/elements/reasoning-panel.d.ts +46 -0
- package/dist/elements/reasoning-panel.js +75 -0
- package/dist/elements/recommendation-card.d.ts +45 -0
- package/dist/elements/recommendation-card.js +83 -0
- package/dist/elements/regenerate-menu.d.ts +45 -0
- package/dist/elements/regenerate-menu.js +51 -0
- package/dist/elements/replay.d.ts +217 -0
- package/dist/elements/replay.js +498 -0
- package/dist/elements/research-report.d.ts +38 -0
- package/dist/elements/research-report.js +69 -0
- package/dist/elements/retrieval-chunks.d.ts +43 -0
- package/dist/elements/retrieval-chunks.js +81 -0
- package/dist/elements/revert-dock.d.ts +159 -0
- package/dist/elements/revert-dock.js +327 -0
- package/dist/elements/reviewable-diff.d.ts +45 -0
- package/dist/elements/reviewable-diff.js +110 -0
- package/dist/elements/risk-badge.d.ts +52 -0
- package/dist/elements/risk-badge.js +91 -0
- package/dist/elements/schedule-card.d.ts +42 -0
- package/dist/elements/schedule-card.js +90 -0
- package/dist/elements/score-breakdown.d.ts +47 -0
- package/dist/elements/score-breakdown.js +82 -0
- package/dist/elements/scroll-anchor.d.ts +32 -0
- package/dist/elements/scroll-anchor.js +121 -0
- package/dist/elements/settings-panel.d.ts +52 -0
- package/dist/elements/settings-panel.js +107 -0
- package/dist/elements/shared-conversation.d.ts +39 -0
- package/dist/elements/shared-conversation.js +68 -0
- package/dist/elements/sources.d.ts +33 -0
- package/dist/elements/sources.js +61 -0
- package/dist/elements/speaker-identity.d.ts +32 -0
- package/dist/elements/speaker-identity.js +51 -0
- package/dist/elements/spec-sheet.d.ts +31 -0
- package/dist/elements/spec-sheet.js +45 -0
- package/dist/elements/stopped-run.d.ts +22 -0
- package/dist/elements/stopped-run.js +50 -0
- package/dist/elements/streaming-text.d.ts +31 -0
- package/dist/elements/streaming-text.js +45 -0
- package/dist/elements/subagent-list.d.ts +37 -0
- package/dist/elements/subagent-list.js +79 -0
- package/dist/elements/suggestions.d.ts +30 -0
- package/dist/elements/suggestions.js +36 -0
- package/dist/elements/surfaces.d.ts +85 -0
- package/dist/elements/surfaces.js +107 -0
- package/dist/elements/tail-status.d.ts +131 -0
- package/dist/elements/tail-status.js +94 -0
- package/dist/elements/terminal-block.d.ts +29 -0
- package/dist/elements/terminal-block.js +54 -0
- package/dist/elements/thinking-indicator.d.ts +18 -0
- package/dist/elements/thinking-indicator.js +36 -0
- package/dist/elements/thread-list.d.ts +35 -0
- package/dist/elements/thread-list.js +68 -0
- package/dist/elements/thread-search.d.ts +42 -0
- package/dist/elements/thread-search.js +99 -0
- package/dist/elements/timeline.d.ts +37 -0
- package/dist/elements/timeline.js +46 -0
- package/dist/elements/todo-list.d.ts +42 -0
- package/dist/elements/todo-list.js +59 -0
- package/dist/elements/tool-call.d.ts +41 -0
- package/dist/elements/tool-call.js +85 -0
- package/dist/elements/tool-error.d.ts +39 -0
- package/dist/elements/tool-error.js +76 -0
- package/dist/elements/tool-group.d.ts +45 -0
- package/dist/elements/tool-group.js +71 -0
- package/dist/elements/tool-timeline.d.ts +65 -0
- package/dist/elements/tool-timeline.js +88 -0
- package/dist/elements/trace-waterfall.d.ts +37 -0
- package/dist/elements/trace-waterfall.js +69 -0
- package/dist/elements/transcript-rules.d.ts +67 -0
- package/dist/elements/transcript-rules.js +95 -0
- package/dist/elements/turn-footer.d.ts +74 -0
- package/dist/elements/turn-footer.js +101 -0
- package/dist/elements/typing-indicator.d.ts +16 -0
- package/dist/elements/typing-indicator.js +51 -0
- package/dist/elements/verdict-row.d.ts +89 -0
- package/dist/elements/verdict-row.js +150 -0
- package/dist/elements/vocabulary.d.ts +612 -0
- package/dist/elements/vocabulary.js +611 -0
- package/dist/elements/voice-conversation.d.ts +49 -0
- package/dist/elements/voice-conversation.js +123 -0
- package/dist/elements/web-preview.d.ts +32 -0
- package/dist/elements/web-preview.js +66 -0
- package/dist/elements/web-search.d.ts +37 -0
- package/dist/elements/web-search.js +66 -0
- package/dist/elements/work-collapse.d.ts +103 -0
- package/dist/elements/work-collapse.js +131 -0
- package/dist/icons/containers.d.ts +89 -0
- package/dist/icons/containers.js +295 -0
- package/dist/icons/index.d.ts +2 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +2 -1
- package/dist/instruments/two-step-button.js +25 -6
- package/dist/layout/sidebar.d.ts +19 -1
- package/dist/layout/sidebar.js +19 -1
- package/dist/primitives/button.js +11 -1
- package/dist/primitives/chip.d.ts +35 -9
- package/dist/primitives/chip.js +97 -11
- package/dist/system/agent-skin.d.ts +27 -0
- package/dist/system/agent-skin.js +20 -0
- package/dist/system/portal.d.ts +5 -3
- package/dist/system/portal.js +19 -5
- package/dist/system/theme-provider.js +54 -9
- package/dist/system/use-density.d.ts +9 -0
- package/dist/system/use-density.js +9 -0
- package/dist/system/use-isomorphic-layout-effect.js +19 -1
- package/dist/theming/_presets.d.ts +1 -1
- package/dist/theming/_presets.js +71 -8
- package/dist/theming/contrast.d.ts +16 -4
- package/dist/theming/contrast.js +33 -6
- package/dist/theming/create-theme.d.ts +6 -2
- package/dist/theming/create-theme.js +32 -5
- package/dist/theming/serialize.d.ts +10 -1
- package/dist/theming/serialize.js +62 -8
- package/manifest/components/activity-graph.json +88 -0
- package/manifest/components/agent-card.json +120 -0
- package/manifest/components/agent-handoff.json +87 -0
- package/manifest/components/agent-mode-badge.json +84 -0
- package/manifest/components/agent-plan.json +67 -0
- package/manifest/components/agent-status.json +73 -0
- package/manifest/components/agent-surface.json +78 -0
- package/manifest/components/alert-dialog.json +1 -1
- package/manifest/components/animated-number.json +67 -0
- package/manifest/components/app-shell.json +99 -7
- package/manifest/components/approval-card.json +106 -0
- package/manifest/components/artifact-card.json +81 -0
- package/manifest/components/audience-icon.json +52 -0
- package/manifest/components/background-inbox.json +71 -0
- package/manifest/components/branch-picker.json +124 -0
- package/manifest/components/button.json +1 -0
- package/manifest/components/canvas-split-body.json +62 -0
- package/manifest/components/canvas-split-document.json +54 -0
- package/manifest/components/canvas-split-header.json +83 -0
- package/manifest/components/canvas-split-line.json +62 -0
- package/manifest/components/canvas-split-message.json +62 -0
- package/manifest/components/canvas-split-thread.json +54 -0
- package/manifest/components/canvas-split.json +60 -0
- package/manifest/components/catalogue-icon.json +52 -0
- package/manifest/components/channel-beta-icon.json +52 -0
- package/manifest/components/channel-released-icon.json +52 -0
- package/manifest/components/chart.json +93 -0
- package/manifest/components/chat-empty-state.json +55 -0
- package/manifest/components/chat-panel-assistant-message.json +51 -0
- package/manifest/components/chat-panel-composer.json +66 -0
- package/manifest/components/chat-panel-messages.json +51 -0
- package/manifest/components/chat-panel-typing.json +51 -0
- package/manifest/components/chat-panel-user-message.json +51 -0
- package/manifest/components/chat-panel.json +57 -0
- package/manifest/components/checkpoint-history.json +80 -0
- package/manifest/components/chip.json +24 -12
- package/manifest/components/clamp.json +102 -0
- package/manifest/components/cli-tool-icon.json +52 -0
- package/manifest/components/code-diff.json +87 -0
- package/manifest/components/code-runner.json +97 -0
- package/manifest/components/compaction-row.json +100 -0
- package/manifest/components/comparison-card.json +83 -0
- package/manifest/components/composer-actions.json +65 -0
- package/manifest/components/composer-attach-button.json +65 -0
- package/manifest/components/composer-attachment-chip.json +75 -0
- package/manifest/components/composer-attachments.json +60 -0
- package/manifest/components/composer-bar.json +73 -0
- package/manifest/components/composer-command-item.json +79 -0
- package/manifest/components/composer-context.json +67 -0
- package/manifest/components/composer-input.json +73 -0
- package/manifest/components/composer-menu-item.json +72 -0
- package/manifest/components/composer-menu.json +79 -0
- package/manifest/components/composer-model-item.json +75 -0
- package/manifest/components/composer-model-trigger.json +75 -0
- package/manifest/components/composer-person-item.json +79 -0
- package/manifest/components/composer-send.json +80 -0
- package/manifest/components/composer-toolbar.json +65 -0
- package/manifest/components/composer-voice-button.json +68 -0
- package/manifest/components/composer-voice.json +75 -0
- package/manifest/components/computer-use.json +84 -0
- package/manifest/components/confidence-marker.json +74 -0
- package/manifest/components/connection-state.json +84 -0
- package/manifest/components/context-breakdown.json +65 -0
- package/manifest/components/context-usage.json +85 -0
- package/manifest/components/conversation-search.json +92 -0
- package/manifest/components/cost-meter.json +74 -0
- package/manifest/components/cue-portal-frame.json +1 -1
- package/manifest/components/day-separator.json +58 -0
- package/manifest/components/delegation-card.json +1 -1
- package/manifest/components/density.json +1 -1
- package/manifest/components/diagram.json +100 -0
- package/manifest/components/document-reference.json +90 -0
- package/manifest/components/draft-restore.json +82 -0
- package/manifest/components/drawer.json +1 -1
- package/manifest/components/dropdown-menu.json +1 -1
- package/manifest/components/edit-message.json +105 -0
- package/manifest/components/elements-command-palette.json +100 -0
- package/manifest/components/elements-composer.json +71 -0
- package/manifest/components/elements-data-table.json +68 -0
- package/manifest/components/elements-timeline.json +69 -0
- package/manifest/components/elicitation-form.json +103 -0
- package/manifest/components/empty-state-composer.json +64 -0
- package/manifest/components/empty-state-greeting.json +49 -0
- package/manifest/components/empty-state-suggestion.json +57 -0
- package/manifest/components/empty-state-suggestions.json +49 -0
- package/manifest/components/end-of-turn-summary.json +77 -0
- package/manifest/components/error-state.json +80 -0
- package/manifest/components/feedback-dialog.json +107 -0
- package/manifest/components/file-tree.json +83 -0
- package/manifest/components/flow-graph.json +75 -0
- package/manifest/components/folder-icon.json +52 -0
- package/manifest/components/frac.json +59 -0
- package/manifest/components/generation-loader.json +64 -0
- package/manifest/components/generative-ui.json +93 -0
- package/manifest/components/guardrail-notice.json +91 -0
- package/manifest/components/hover-card.json +1 -1
- package/manifest/components/image-generation.json +67 -0
- package/manifest/components/info-tip.json +1 -1
- package/manifest/components/inline-citation.json +77 -0
- package/manifest/components/job-progress.json +96 -0
- package/manifest/components/launcher-bubble.json +105 -0
- package/manifest/components/live-region-announcer.json +79 -0
- package/manifest/components/map-answer.json +83 -0
- package/manifest/components/markdown-text.json +94 -0
- package/manifest/components/math-block.json +74 -0
- package/manifest/components/mcp-server-icon.json +52 -0
- package/manifest/components/mcp-server-panel.json +87 -0
- package/manifest/components/memory-chips.json +65 -0
- package/manifest/components/message-actions.json +99 -0
- package/manifest/components/message-attachments.json +63 -0
- package/manifest/components/message-branches.json +71 -0
- package/manifest/components/message-list.json +1 -1
- package/manifest/components/message-pair.json +86 -0
- package/manifest/components/message-queue.json +74 -0
- package/manifest/components/message-timing.json +62 -0
- package/manifest/components/mobile-composer.json +126 -0
- package/manifest/components/model-picker.json +76 -0
- package/manifest/components/node-card.json +1 -1
- package/manifest/components/node-handle.json +1 -1
- package/manifest/components/number-ticker.json +61 -0
- package/manifest/components/onboarding.json +84 -0
- package/manifest/components/otp-field.json +7 -7
- package/manifest/components/permission-grant.json +92 -0
- package/manifest/components/permission-scopes.json +139 -0
- package/manifest/components/popover.json +1 -1
- package/manifest/components/prompt-library.json +99 -0
- package/manifest/components/queue-dock.json +110 -0
- package/manifest/components/quota-banner.json +94 -0
- package/manifest/components/quote-reply.json +105 -0
- package/manifest/components/read-aloud.json +111 -0
- package/manifest/components/reasoning-effort.json +81 -0
- package/manifest/components/reasoning-panel.json +108 -0
- package/manifest/components/recommendation-card.json +107 -0
- package/manifest/components/regenerate-menu.json +89 -0
- package/manifest/components/replay-player.json +102 -0
- package/manifest/components/research-report.json +76 -0
- package/manifest/components/retrieval-chunks.json +84 -0
- package/manifest/components/revert-dock.json +150 -0
- package/manifest/components/reviewable-diff.json +93 -0
- package/manifest/components/risk-badge.json +74 -0
- package/manifest/components/schedule-card.json +101 -0
- package/manifest/components/score-breakdown.json +91 -0
- package/manifest/components/scroll-anchor.json +72 -0
- package/manifest/components/scroll-area.json +7 -7
- package/manifest/components/search-input.json +7 -7
- package/manifest/components/segmented-control.json +21 -21
- package/manifest/components/settings-panel.json +118 -0
- package/manifest/components/shared-conversation.json +89 -0
- package/manifest/components/shimmer-label.json +59 -0
- package/manifest/components/skill-icon.json +52 -0
- package/manifest/components/sources.json +83 -0
- package/manifest/components/speaker-identity.json +61 -0
- package/manifest/components/spec-sheet.json +80 -0
- package/manifest/components/stack-icon.json +52 -0
- package/manifest/components/stacks-matrix-icon.json +52 -0
- package/manifest/components/stat.json +1 -1
- package/manifest/components/status-dot.json +1 -1
- package/manifest/components/stopped-run.json +81 -0
- package/manifest/components/streaming-text.json +71 -0
- package/manifest/components/sub.json +44 -0
- package/manifest/components/subagent-list.json +88 -0
- package/manifest/components/suggestions.json +84 -0
- package/manifest/components/sup.json +44 -0
- package/manifest/components/swap-label.json +71 -0
- package/manifest/components/tail-status.json +109 -0
- package/manifest/components/terminal-block.json +91 -0
- package/manifest/components/theme-provider.json +2 -2
- package/manifest/components/thinking-indicator.json +63 -0
- package/manifest/components/thread-list.json +76 -0
- package/manifest/components/thread-search.json +90 -0
- package/manifest/components/threshold-rail.json +2 -2
- package/manifest/components/time-boundary.json +62 -0
- package/manifest/components/timeline.json +1 -1
- package/manifest/components/todo-list.json +69 -0
- package/manifest/components/toggle-group.json +7 -7
- package/manifest/components/token-editor.json +1 -1
- package/manifest/components/tool-call-card.json +200 -0
- package/manifest/components/tool-call.json +119 -0
- package/manifest/components/tool-error.json +114 -0
- package/manifest/components/tool-group.json +83 -0
- package/manifest/components/tool-timeline.json +119 -0
- package/manifest/components/toolbar.json +7 -7
- package/manifest/components/tooltip.json +1 -1
- package/manifest/components/trace-waterfall.json +74 -0
- package/manifest/components/turn-footer.json +105 -0
- package/manifest/components/typing-indicator.json +53 -0
- package/manifest/components/unread-divider.json +55 -0
- package/manifest/components/usage-chart.json +1 -1
- package/manifest/components/verdict-row.json +91 -0
- package/manifest/components/voice-conversation.json +109 -0
- package/manifest/components/web-preview.json +87 -0
- package/manifest/components/web-search.json +92 -0
- package/manifest/components/work-collapse.json +102 -0
- package/manifest/manifest.json +2670 -33
- package/manifest/tokens.json +22 -1
- package/package.json +46 -4
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/read-aloud.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* An answer played back, the spoken word lit as it goes, speed under your thumb.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* import { ReadAloud } from "@cueplusplus/ui/elements";
|
|
8
|
+
*
|
|
9
|
+
* <ReadAloud
|
|
10
|
+
* words={words}
|
|
11
|
+
* spokenIndex={12}
|
|
12
|
+
* playing
|
|
13
|
+
* rate={1}
|
|
14
|
+
* elapsed="0:04"
|
|
15
|
+
* duration="0:11"
|
|
16
|
+
* onToggle={toggle}
|
|
17
|
+
* onRateChange={cycleRate}
|
|
18
|
+
* />
|
|
19
|
+
*/
|
|
20
|
+
declare function ReadAloud({ words, spokenIndex, playing, rate, elapsed, duration, onToggle, onRateChange, className, ...props }: Omit<ComponentProps<"div">, "children" | "words" | "spokenIndex" | "playing" | "rate" | "elapsed" | "duration" | "onToggle" | "onRateChange"> & {
|
|
21
|
+
/**
|
|
22
|
+
* The answer split into words, so the spoken one can be lit without re-parsing the
|
|
23
|
+
* text.
|
|
24
|
+
*/
|
|
25
|
+
words: readonly string[];
|
|
26
|
+
/**
|
|
27
|
+
* Index of the word being spoken. Everything before it dims, everything after stays
|
|
28
|
+
* waiting, and an index outside the text speaks none of it.
|
|
29
|
+
*/
|
|
30
|
+
spokenIndex: number;
|
|
31
|
+
/** Swaps the transport button between play and pause. */
|
|
32
|
+
playing: boolean;
|
|
33
|
+
/** Playback speed, printed on the rate control. */
|
|
34
|
+
rate: number;
|
|
35
|
+
/** Pre-formatted elapsed time. */
|
|
36
|
+
elapsed: string;
|
|
37
|
+
/** Pre-formatted total duration. */
|
|
38
|
+
duration: string;
|
|
39
|
+
/** Called when playback is started or paused. */
|
|
40
|
+
onToggle?: () => void;
|
|
41
|
+
/** Called when the rate control is tapped; cycle the rate yourself. */
|
|
42
|
+
onRateChange?: () => void;
|
|
43
|
+
}): import("react").JSX.Element;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { ReadAloud };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { field, ghostButton, mono, paper } from "./surfaces.js";
|
|
4
|
+
import { pct } from "./range.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { PauseIcon, PlayIcon, Volume2Icon } from "lucide-react";
|
|
7
|
+
//#region src/elements/read-aloud.tsx
|
|
8
|
+
/**
|
|
9
|
+
* An answer played back, the spoken word lit as it goes, speed under your thumb.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { ReadAloud } from "@cueplusplus/ui/elements";
|
|
13
|
+
*
|
|
14
|
+
* <ReadAloud
|
|
15
|
+
* words={words}
|
|
16
|
+
* spokenIndex={12}
|
|
17
|
+
* playing
|
|
18
|
+
* rate={1}
|
|
19
|
+
* elapsed="0:04"
|
|
20
|
+
* duration="0:11"
|
|
21
|
+
* onToggle={toggle}
|
|
22
|
+
* onRateChange={cycleRate}
|
|
23
|
+
* />
|
|
24
|
+
*/
|
|
25
|
+
function ReadAloud({ words, spokenIndex, playing, rate, elapsed, duration, onToggle, onRateChange, className, ...props }) {
|
|
26
|
+
const progress = pct(spokenIndex, words.length);
|
|
27
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
28
|
+
"data-slot": "read-aloud",
|
|
29
|
+
className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-3.5", className),
|
|
30
|
+
...props,
|
|
31
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
32
|
+
className: "text-(length:--cue-text-body) leading-relaxed",
|
|
33
|
+
children: words.map((word, i) => /* @__PURE__ */ jsxs("span", {
|
|
34
|
+
className: cn("transition-colors duration-200 motion-reduce:transition-none", i < spokenIndex ? "text-fg-subtle" : i === spokenIndex ? "text-fg rounded-(--radius-control) bg-stream/15" : "text-fg-muted"),
|
|
35
|
+
children: [word, " "]
|
|
36
|
+
}, `${i}-${word}`))
|
|
37
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
38
|
+
className: "flex items-center gap-2.5",
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ jsx("button", {
|
|
41
|
+
type: "button",
|
|
42
|
+
"aria-label": playing ? "Pause" : "Play",
|
|
43
|
+
onClick: onToggle,
|
|
44
|
+
className: cn(ghostButton, "bg-surface-2 size-8 shrink-0"),
|
|
45
|
+
children: playing ? /* @__PURE__ */ jsx(PauseIcon, { className: "size-3.5" }) : /* @__PURE__ */ jsx(PlayIcon, { className: "size-3.5 translate-x-px" })
|
|
46
|
+
}),
|
|
47
|
+
/* @__PURE__ */ jsx("span", {
|
|
48
|
+
className: "bg-surface-2 h-[3px] min-w-0 flex-1 overflow-hidden rounded-full",
|
|
49
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
50
|
+
className: "block h-full rounded-full bg-stream transition-[width] duration-200 ease-linear motion-reduce:transition-none",
|
|
51
|
+
style: { width: `${progress}%` }
|
|
52
|
+
})
|
|
53
|
+
}),
|
|
54
|
+
/* @__PURE__ */ jsxs("span", {
|
|
55
|
+
className: cn(mono, "text-fg-subtle shrink-0 tabular-nums"),
|
|
56
|
+
children: [
|
|
57
|
+
elapsed,
|
|
58
|
+
" / ",
|
|
59
|
+
duration
|
|
60
|
+
]
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ jsxs("button", {
|
|
63
|
+
type: "button",
|
|
64
|
+
"aria-label": `Playback speed, currently ${rate} times`,
|
|
65
|
+
onClick: onRateChange,
|
|
66
|
+
className: cn(field, mono, "text-fg-muted hover:text-fg shrink-0 rounded-full px-2 py-1 tabular-nums transition-colors"),
|
|
67
|
+
children: [rate, "×"]
|
|
68
|
+
}),
|
|
69
|
+
/* @__PURE__ */ jsx(Volume2Icon, { className: "text-fg-subtle size-3.5 shrink-0" })
|
|
70
|
+
]
|
|
71
|
+
})]
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { ReadAloud };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/reasoning-effort.d.ts
|
|
3
|
+
/** One rung of the thinking budget: what it is called, and how many tokens it buys. */
|
|
4
|
+
interface EffortLevel {
|
|
5
|
+
/** Identifies the rung, and what `onSelect` reports. */
|
|
6
|
+
key: string;
|
|
7
|
+
/** The word on the segment — `Low`, `Medium`, `High`. */
|
|
8
|
+
label: string;
|
|
9
|
+
/** Tokens this rung allows, which is what the meter underneath is a fraction of. */
|
|
10
|
+
budget: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* How hard to think, and how much of that budget the run actually spent.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* import { ReasoningEffort } from "@cueplusplus/ui/elements";
|
|
17
|
+
*
|
|
18
|
+
* <ReasoningEffort
|
|
19
|
+
* levels={levels}
|
|
20
|
+
* selectedKey="high"
|
|
21
|
+
* spent={5200}
|
|
22
|
+
* onSelect={setLevel}
|
|
23
|
+
* />
|
|
24
|
+
*/
|
|
25
|
+
declare function ReasoningEffort({ levels, selectedKey, spent, onSelect, className, ...props }: Omit<ComponentProps<"div">, "children" | "levels" | "selectedKey" | "spent" | "onSelect"> & {
|
|
26
|
+
/** Every tier on offer, each carrying its own token budget. */
|
|
27
|
+
levels: readonly EffortLevel[];
|
|
28
|
+
/** Which tier is active. Its budget becomes the denominator. */
|
|
29
|
+
selectedKey: string;
|
|
30
|
+
/** Thinking tokens used so far, filling the bar against the selected budget. */
|
|
31
|
+
spent: number;
|
|
32
|
+
/** Called when a tier is picked. */
|
|
33
|
+
onSelect?: (key: string) => void;
|
|
34
|
+
}): import("react").JSX.Element;
|
|
35
|
+
//#endregion
|
|
36
|
+
export { EffortLevel, ReasoningEffort };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { field, mono } from "./surfaces.js";
|
|
4
|
+
import { pct } from "./range.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
//#region src/elements/reasoning-effort.tsx
|
|
7
|
+
const fmt = (n) => n.toLocaleString("en-US");
|
|
8
|
+
/**
|
|
9
|
+
* How hard to think, and how much of that budget the run actually spent.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { ReasoningEffort } from "@cueplusplus/ui/elements";
|
|
13
|
+
*
|
|
14
|
+
* <ReasoningEffort
|
|
15
|
+
* levels={levels}
|
|
16
|
+
* selectedKey="high"
|
|
17
|
+
* spent={5200}
|
|
18
|
+
* onSelect={setLevel}
|
|
19
|
+
* />
|
|
20
|
+
*/
|
|
21
|
+
function ReasoningEffort({ levels, selectedKey, spent, onSelect, className, ...props }) {
|
|
22
|
+
const budget = levels.find((level) => level.key === selectedKey)?.budget ?? 0;
|
|
23
|
+
const used = pct(spent, budget);
|
|
24
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
25
|
+
"data-slot": "reasoning-effort",
|
|
26
|
+
className: cn("flex w-full max-w-sm flex-col gap-2.5", className),
|
|
27
|
+
...props,
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsxs("div", {
|
|
30
|
+
className: "flex items-baseline justify-between",
|
|
31
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
32
|
+
className: "text-(length:--cue-text-body) font-medium",
|
|
33
|
+
children: "Thinking"
|
|
34
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
35
|
+
className: cn(mono, "text-fg-subtle tabular-nums"),
|
|
36
|
+
children: [
|
|
37
|
+
fmt(spent),
|
|
38
|
+
" / ",
|
|
39
|
+
fmt(budget)
|
|
40
|
+
]
|
|
41
|
+
})]
|
|
42
|
+
}),
|
|
43
|
+
/* @__PURE__ */ jsx("div", {
|
|
44
|
+
className: cn(field, "flex gap-0.5 rounded-full p-0.5"),
|
|
45
|
+
children: levels.map((level) => {
|
|
46
|
+
const active = level.key === selectedKey;
|
|
47
|
+
return /* @__PURE__ */ jsx("button", {
|
|
48
|
+
type: "button",
|
|
49
|
+
"aria-pressed": active,
|
|
50
|
+
onClick: () => onSelect?.(level.key),
|
|
51
|
+
className: cn("flex-1 rounded-full py-1 text-(length:--cue-text-ui) font-medium transition-[background-color,color,scale] duration-150 active:scale-[0.97]", active ? "bg-bg text-fg" : "text-fg-muted hover:text-fg-muted"),
|
|
52
|
+
children: level.label
|
|
53
|
+
}, level.key);
|
|
54
|
+
})
|
|
55
|
+
}),
|
|
56
|
+
/* @__PURE__ */ jsx("span", {
|
|
57
|
+
className: "bg-surface-2 h-[3px] w-full overflow-hidden rounded-full",
|
|
58
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
59
|
+
className: "block h-full rounded-full bg-stream transition-[width] duration-500 motion-reduce:transition-none",
|
|
60
|
+
style: { width: `${used}%` }
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
]
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { ReasoningEffort };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//#region src/elements/reasoning-panel.d.ts
|
|
2
|
+
/** One beat of the model's thinking: what it turned to, and what it made of it. */
|
|
3
|
+
interface ReasoningStep {
|
|
4
|
+
/** What this beat is about, in a few words. Also the row's key, so keep it unique. */
|
|
5
|
+
title: string;
|
|
6
|
+
/** The thought itself, in full. Wraps and breaks; nothing truncates it. */
|
|
7
|
+
body: string;
|
|
8
|
+
}
|
|
9
|
+
interface ReasoningPanelProps {
|
|
10
|
+
/** Full list of reasoning steps available to reveal. */
|
|
11
|
+
steps: ReasoningStep[];
|
|
12
|
+
/** How many steps from the start are currently shown on the timeline. */
|
|
13
|
+
visibleSteps: number;
|
|
14
|
+
/** When true the trigger shows a shimmering Thinking label and the active step pulses. */
|
|
15
|
+
streaming: boolean;
|
|
16
|
+
/** Whether the collapsible step list is expanded. */
|
|
17
|
+
open: boolean;
|
|
18
|
+
/** Called when the user expands or collapses the panel. */
|
|
19
|
+
onOpenChange: (open: boolean) => void;
|
|
20
|
+
/** Trigger label once streaming finishes, for example a summary of how long it thought. */
|
|
21
|
+
restingLabel: string;
|
|
22
|
+
/** Elapsed timer shown next to Thinking while streaming. Omit to hide it. */
|
|
23
|
+
elapsed?: string;
|
|
24
|
+
/** Extra classes merged onto the root. */
|
|
25
|
+
className?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A collapsible trace that streams reasoning steps along a timeline, then settles into
|
|
29
|
+
* a summary.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* import { ReasoningPanel } from "@cueplusplus/ui/elements";
|
|
33
|
+
*
|
|
34
|
+
* <ReasoningPanel
|
|
35
|
+
* steps={[{ title: "Scope", body: "Find the failing path." }]}
|
|
36
|
+
* visibleSteps={1}
|
|
37
|
+
* streaming
|
|
38
|
+
* open
|
|
39
|
+
* onOpenChange={setOpen}
|
|
40
|
+
* restingLabel="Reasoned for 4s"
|
|
41
|
+
* elapsed="2s"
|
|
42
|
+
* />
|
|
43
|
+
*/
|
|
44
|
+
declare function ReasoningPanel({ steps, visibleSteps, streaming, open, onOpenChange, restingLabel, elapsed, className }: ReasoningPanelProps): import("react").JSX.Element;
|
|
45
|
+
//#endregion
|
|
46
|
+
export { ReasoningPanel, ReasoningPanelProps, ReasoningStep };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { ShimmerLabel, SwapLabel, collapsePanel } from "./surfaces.js";
|
|
4
|
+
import { take } from "./range.js";
|
|
5
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { Collapsible } from "@base-ui/react/collapsible";
|
|
7
|
+
import { ChevronDownIcon } from "lucide-react";
|
|
8
|
+
//#region src/elements/reasoning-panel.tsx
|
|
9
|
+
/**
|
|
10
|
+
* A collapsible trace that streams reasoning steps along a timeline, then settles into
|
|
11
|
+
* a summary.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* import { ReasoningPanel } from "@cueplusplus/ui/elements";
|
|
15
|
+
*
|
|
16
|
+
* <ReasoningPanel
|
|
17
|
+
* steps={[{ title: "Scope", body: "Find the failing path." }]}
|
|
18
|
+
* visibleSteps={1}
|
|
19
|
+
* streaming
|
|
20
|
+
* open
|
|
21
|
+
* onOpenChange={setOpen}
|
|
22
|
+
* restingLabel="Reasoned for 4s"
|
|
23
|
+
* elapsed="2s"
|
|
24
|
+
* />
|
|
25
|
+
*/
|
|
26
|
+
function ReasoningPanel({ steps, visibleSteps, streaming, open, onOpenChange, restingLabel, elapsed, className }) {
|
|
27
|
+
const shown = take(steps, visibleSteps);
|
|
28
|
+
return /* @__PURE__ */ jsxs(Collapsible.Root, {
|
|
29
|
+
"data-slot": "reasoning-panel",
|
|
30
|
+
open,
|
|
31
|
+
onOpenChange,
|
|
32
|
+
className: cn("w-full max-w-sm", className),
|
|
33
|
+
children: [/* @__PURE__ */ jsxs(Collapsible.Trigger, {
|
|
34
|
+
className: "group/trigger text-fg-muted hover:text-fg flex items-center gap-1.5 py-1 text-(length:--cue-text-body) transition-[color,scale] outline-none active:scale-[0.98] focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent",
|
|
35
|
+
children: [/* @__PURE__ */ jsxs(SwapLabel, {
|
|
36
|
+
active: streaming ? 0 : 1,
|
|
37
|
+
className: "text-start",
|
|
38
|
+
children: [/* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(ShimmerLabel, {
|
|
39
|
+
active: streaming,
|
|
40
|
+
className: "relative inline-block leading-none",
|
|
41
|
+
children: "Thinking"
|
|
42
|
+
}), elapsed !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
43
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle tabular-nums"),
|
|
44
|
+
children: elapsed
|
|
45
|
+
})] }), /* @__PURE__ */ jsx(Fragment, { children: restingLabel })]
|
|
46
|
+
}), /* @__PURE__ */ jsx(ChevronDownIcon, { className: "size-3.5 shrink-0 opacity-60 transition-transform duration-200 ease-[cubic-bezier(0.32,0.72,0,1)] group-data-[panel-open]/trigger:rotate-180 motion-reduce:transition-none" })]
|
|
47
|
+
}), /* @__PURE__ */ jsx(Collapsible.Panel, {
|
|
48
|
+
className: cn(collapsePanel, "outline-none"),
|
|
49
|
+
children: /* @__PURE__ */ jsx("ol", {
|
|
50
|
+
className: "flex flex-col gap-4 pt-3 pb-1",
|
|
51
|
+
children: shown.map((step, i) => {
|
|
52
|
+
const active = streaming && i === shown.length - 1;
|
|
53
|
+
return /* @__PURE__ */ jsxs("li", {
|
|
54
|
+
className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both flex gap-3 duration-300",
|
|
55
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
56
|
+
"aria-hidden": true,
|
|
57
|
+
className: cn("mt-[7px] size-[5px] shrink-0 rounded-full transition-colors duration-300", active ? "animate-pulse bg-stream" : "bg-surface-3")
|
|
58
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
59
|
+
className: "flex min-w-0 flex-1 flex-col",
|
|
60
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
61
|
+
className: "text-fg text-(length:--cue-text-body) font-medium",
|
|
62
|
+
children: step.title
|
|
63
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
64
|
+
className: "text-fg-muted mt-0.5 text-(length:--cue-text-body) leading-relaxed break-words",
|
|
65
|
+
children: step.body
|
|
66
|
+
})]
|
|
67
|
+
})]
|
|
68
|
+
}, step.title);
|
|
69
|
+
})
|
|
70
|
+
})
|
|
71
|
+
})]
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { ReasoningPanel };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ComponentProps, ReactNode } from "react";
|
|
2
|
+
//#region src/elements/recommendation-card.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Whether the proposal is still standing (`idle`) or the person has taken it
|
|
5
|
+
* (`accepted`). The card swaps its whole action row rather than disabling it.
|
|
6
|
+
*/
|
|
7
|
+
type RecommendationState = "idle" | "accepted";
|
|
8
|
+
/**
|
|
9
|
+
* The agent proposes a change with its confidence, and waits for a yes.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { RecommendationCard } from "@cueplusplus/ui/elements";
|
|
13
|
+
*
|
|
14
|
+
* <RecommendationCard
|
|
15
|
+
* state="idle"
|
|
16
|
+
* question="Enable draft autosave?"
|
|
17
|
+
* confidenceLabel="high confidence"
|
|
18
|
+
* acceptedLabel="Enabled for every thread"
|
|
19
|
+
* onAccept={() => accept()}
|
|
20
|
+
* >
|
|
21
|
+
* Wire{" "}
|
|
22
|
+
* <span className="bg-surface-2 text-fg-muted rounded-(--radius-control) px-1.5 py-0.5 font-mono text-(length:--cue-text-label)">
|
|
23
|
+
* runtime.drafts
|
|
24
|
+
* </span>{" "}
|
|
25
|
+
* with three lines.
|
|
26
|
+
* </RecommendationCard>
|
|
27
|
+
*/
|
|
28
|
+
declare function RecommendationCard({ state, question, children, confidenceLabel, acceptedLabel, onAccept, onAlternatives, className, ...props }: Omit<ComponentProps<"div">, "state" | "question" | "children" | "confidenceLabel" | "acceptedLabel" | "onAccept" | "onAlternatives"> & {
|
|
29
|
+
/** idle shows accept controls; accepted swaps in a confirmation row. */
|
|
30
|
+
state: RecommendationState;
|
|
31
|
+
/** Proposal headline the agent is asking the user about. */
|
|
32
|
+
question: string;
|
|
33
|
+
/** Supporting body explaining the recommendation. */
|
|
34
|
+
children: ReactNode;
|
|
35
|
+
/** Confidence copy shown next to the bar meter while idle. */
|
|
36
|
+
confidenceLabel: string;
|
|
37
|
+
/** Confirmation copy shown once the proposal is accepted. */
|
|
38
|
+
acceptedLabel: string;
|
|
39
|
+
/** Called when the user clicks Accept. */
|
|
40
|
+
onAccept?: () => void;
|
|
41
|
+
/** Called when the user clicks Alternatives. */
|
|
42
|
+
onAlternatives?: () => void;
|
|
43
|
+
}): import("react").JSX.Element;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { RecommendationCard, RecommendationState };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { inkButton, mono, paper } from "./surfaces.js";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { CheckIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/recommendation-card.tsx
|
|
7
|
+
const CONFIDENCE_BARS = [
|
|
8
|
+
0,
|
|
9
|
+
1,
|
|
10
|
+
2
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* The agent proposes a change with its confidence, and waits for a yes.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* import { RecommendationCard } from "@cueplusplus/ui/elements";
|
|
17
|
+
*
|
|
18
|
+
* <RecommendationCard
|
|
19
|
+
* state="idle"
|
|
20
|
+
* question="Enable draft autosave?"
|
|
21
|
+
* confidenceLabel="high confidence"
|
|
22
|
+
* acceptedLabel="Enabled for every thread"
|
|
23
|
+
* onAccept={() => accept()}
|
|
24
|
+
* >
|
|
25
|
+
* Wire{" "}
|
|
26
|
+
* <span className="bg-surface-2 text-fg-muted rounded-(--radius-control) px-1.5 py-0.5 font-mono text-(length:--cue-text-label)">
|
|
27
|
+
* runtime.drafts
|
|
28
|
+
* </span>{" "}
|
|
29
|
+
* with three lines.
|
|
30
|
+
* </RecommendationCard>
|
|
31
|
+
*/
|
|
32
|
+
function RecommendationCard({ state, question, children, confidenceLabel, acceptedLabel, onAccept, onAlternatives, className, ...props }) {
|
|
33
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
34
|
+
"data-slot": "recommendation-card",
|
|
35
|
+
className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
|
|
36
|
+
...props,
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsx("p", {
|
|
39
|
+
className: "text-(length:--cue-text-body) font-medium",
|
|
40
|
+
children: question
|
|
41
|
+
}),
|
|
42
|
+
/* @__PURE__ */ jsx("p", {
|
|
43
|
+
className: "text-fg-muted text-(length:--cue-text-body) leading-relaxed",
|
|
44
|
+
children
|
|
45
|
+
}),
|
|
46
|
+
/* @__PURE__ */ jsx("div", {
|
|
47
|
+
className: "flex h-8 items-center justify-between",
|
|
48
|
+
children: state === "idle" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
|
|
49
|
+
className: "flex items-center gap-2",
|
|
50
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
51
|
+
className: "flex items-end gap-0.5",
|
|
52
|
+
"aria-hidden": true,
|
|
53
|
+
children: CONFIDENCE_BARS.map((bar) => /* @__PURE__ */ jsx("span", {
|
|
54
|
+
className: "w-1 rounded-full bg-ok/70",
|
|
55
|
+
style: { height: 6 + bar * 3 }
|
|
56
|
+
}, bar))
|
|
57
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
58
|
+
className: cn(mono, "text-fg-subtle"),
|
|
59
|
+
children: confidenceLabel
|
|
60
|
+
})]
|
|
61
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
62
|
+
className: "flex items-center gap-2",
|
|
63
|
+
children: [/* @__PURE__ */ jsx("button", {
|
|
64
|
+
type: "button",
|
|
65
|
+
onClick: onAlternatives,
|
|
66
|
+
className: "text-fg-muted hover:bg-surface-2 hover:text-fg h-8 rounded-full px-3.5 text-(length:--cue-text-ui) font-medium transition-[background-color,color,scale] duration-150 active:scale-[0.96]",
|
|
67
|
+
children: "Alternatives"
|
|
68
|
+
}), /* @__PURE__ */ jsx("button", {
|
|
69
|
+
type: "button",
|
|
70
|
+
onClick: onAccept,
|
|
71
|
+
className: cn(inkButton, "flex h-8 items-center rounded-full px-3.5 text-(length:--cue-text-ui) font-medium"),
|
|
72
|
+
children: "Accept"
|
|
73
|
+
})]
|
|
74
|
+
})] }) : /* @__PURE__ */ jsxs("div", {
|
|
75
|
+
className: "cue-elements-fade-in cue-elements-animate-in text-fg-muted flex items-center gap-2 text-(length:--cue-text-ui) duration-300",
|
|
76
|
+
children: [/* @__PURE__ */ jsx(CheckIcon, { className: "size-3.5 text-ok" }), acceptedLabel]
|
|
77
|
+
}, "accepted")
|
|
78
|
+
})
|
|
79
|
+
]
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//#endregion
|
|
83
|
+
export { RecommendationCard };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/regenerate-menu.d.ts
|
|
3
|
+
/** One model the same turn could be run again on. */
|
|
4
|
+
interface RegenerateOption {
|
|
5
|
+
/** Identifies the model, and what `onPick` reports. Matching `currentId` marks the row. */
|
|
6
|
+
id: string;
|
|
7
|
+
/** The model's name. */
|
|
8
|
+
label: string;
|
|
9
|
+
/**
|
|
10
|
+
* What distinguishes it — `faster`, `deeper`, a price. Replaced by `current` on the
|
|
11
|
+
* row in use.
|
|
12
|
+
*/
|
|
13
|
+
detail: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Fork the same turn to a different model instead of rolling the same dice.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* import { RegenerateMenu } from "@cueplusplus/ui/elements";
|
|
20
|
+
*
|
|
21
|
+
* <RegenerateMenu
|
|
22
|
+
* options={options}
|
|
23
|
+
* open={open}
|
|
24
|
+
* currentId="sonnet"
|
|
25
|
+
* onOpenChange={setOpen}
|
|
26
|
+
* onPick={regenerate}
|
|
27
|
+
* />
|
|
28
|
+
*/
|
|
29
|
+
declare function RegenerateMenu({ options, open, currentId, onOpenChange, onPick, className, ...props }: Omit<ComponentProps<"div">, "children" | "options" | "open" | "currentId" | "onOpenChange" | "onPick"> & {
|
|
30
|
+
/** What the turn can be re-run with. */
|
|
31
|
+
options: readonly RegenerateOption[];
|
|
32
|
+
/** Whether the menu is showing. */
|
|
33
|
+
open: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Which option produced the answer on screen; it is labelled current instead of
|
|
36
|
+
* showing its detail.
|
|
37
|
+
*/
|
|
38
|
+
currentId: string;
|
|
39
|
+
/** Called when the trigger is toggled. */
|
|
40
|
+
onOpenChange?: (open: boolean) => void;
|
|
41
|
+
/** Called with the chosen option. */
|
|
42
|
+
onPick?: (id: string) => void;
|
|
43
|
+
}): import("react").JSX.Element;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { RegenerateMenu, RegenerateOption };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { ghostButton } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { RefreshCwIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/regenerate-menu.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Fork the same turn to a different model instead of rolling the same dice.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { RegenerateMenu } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <RegenerateMenu
|
|
14
|
+
* options={options}
|
|
15
|
+
* open={open}
|
|
16
|
+
* currentId="sonnet"
|
|
17
|
+
* onOpenChange={setOpen}
|
|
18
|
+
* onPick={regenerate}
|
|
19
|
+
* />
|
|
20
|
+
*/
|
|
21
|
+
function RegenerateMenu({ options, open, currentId, onOpenChange, onPick, className, ...props }) {
|
|
22
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
23
|
+
"data-slot": "regenerate-menu",
|
|
24
|
+
className: cn("flex w-full max-w-sm flex-col gap-2", className),
|
|
25
|
+
...props,
|
|
26
|
+
children: [/* @__PURE__ */ jsx("button", {
|
|
27
|
+
type: "button",
|
|
28
|
+
"aria-expanded": open,
|
|
29
|
+
"aria-label": "Regenerate with a different model",
|
|
30
|
+
onClick: () => onOpenChange?.(!open),
|
|
31
|
+
className: cn(ghostButton, "size-7 self-start", open && "bg-surface-2 text-fg"),
|
|
32
|
+
children: /* @__PURE__ */ jsx(RefreshCwIcon, { className: "size-3.5" })
|
|
33
|
+
}), open && /* @__PURE__ */ jsx("div", {
|
|
34
|
+
className: cn("bg-surface-2 border border-border-overlay", "cue-elements-fade-in cue-elements-zoom-in-95 cue-elements-slide-in-from-top-1 cue-elements-animate-in flex flex-col gap-0.5 rounded-(--radius-overlay) p-1.5 duration-200"),
|
|
35
|
+
children: options.map((option) => /* @__PURE__ */ jsxs("button", {
|
|
36
|
+
type: "button",
|
|
37
|
+
onClick: () => onPick?.(option.id),
|
|
38
|
+
className: "hover:bg-surface-1 flex items-baseline gap-2 rounded-(--radius-surface) px-2.5 py-1.5 text-start transition-colors",
|
|
39
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
40
|
+
className: "min-w-0 flex-1 truncate text-(length:--cue-text-body)",
|
|
41
|
+
children: option.label
|
|
42
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
43
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle shrink-0"),
|
|
44
|
+
children: option.id === currentId ? "current" : option.detail
|
|
45
|
+
})]
|
|
46
|
+
}, option.id))
|
|
47
|
+
})]
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { RegenerateMenu };
|