@cueplusplus/ui 0.2.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 +2250 -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/brand/_chassis.d.ts +1 -1
- package/dist/brand/cue-mark.d.ts +1 -1
- package/dist/brand/cue-mark.js +1 -1
- 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/_edge-scroller.js +12 -1
- package/dist/chrome/_tabs-scroll.d.ts +1 -1
- package/dist/chrome/_tabs-scroll.js +1 -1
- 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/_overrides.js +18 -6
- 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 +9 -7
- package/dist/index.js +3 -2
- package/dist/instruments/index.d.ts +2 -2
- package/dist/instruments/index.js +2 -2
- package/dist/instruments/table.d.ts +14 -1
- package/dist/instruments/table.js +20 -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 +34 -8
- package/dist/primitives/chip.js +97 -11
- package/dist/styles.css +11 -1
- package/dist/system/agent-skin.d.ts +27 -0
- package/dist/system/agent-skin.js +20 -0
- package/dist/system/index.d.ts +3 -3
- package/dist/system/portal.d.ts +5 -3
- package/dist/system/portal.js +36 -8
- package/dist/system/prepaint.d.ts +20 -2
- package/dist/system/prepaint.js +39 -33
- package/dist/system/theme-provider.d.ts +13 -2
- package/dist/system/theme-provider.js +107 -26
- 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 +124 -8
- package/dist/theming/contrast.d.ts +16 -4
- package/dist/theming/contrast.js +33 -6
- package/dist/theming/create-theme.d.ts +8 -4
- package/dist/theming/create-theme.js +56 -20
- package/dist/theming/serialize.d.ts +11 -2
- package/dist/theming/serialize.js +87 -9
- package/manifest/components/accordion.json +154 -0
- 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-pile.json +116 -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 +190 -0
- package/manifest/components/animated-number.json +67 -0
- package/manifest/components/app-bar.json +244 -0
- package/manifest/components/app-shell.json +383 -0
- package/manifest/components/app-window-frame.json +102 -0
- package/manifest/components/approval-card.json +106 -0
- package/manifest/components/artifact-card.json +81 -0
- package/manifest/components/ask-box.json +209 -0
- package/manifest/components/audience-icon.json +52 -0
- package/manifest/components/autocomplete.json +197 -0
- package/manifest/components/avatar-group.json +72 -0
- package/manifest/components/avatar.json +95 -0
- package/manifest/components/background-inbox.json +71 -0
- package/manifest/components/branch-picker.json +124 -0
- package/manifest/components/breadcrumb.json +74 -0
- package/manifest/components/button-group.json +74 -0
- package/manifest/components/button.json +126 -0
- package/manifest/components/calendar.json +65 -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/card.json +140 -0
- package/manifest/components/carousel.json +200 -0
- package/manifest/components/catalogue-icon.json +52 -0
- package/manifest/components/channel-beta-icon.json +52 -0
- package/manifest/components/channel-matrix.json +173 -0
- package/manifest/components/channel-released-icon.json +52 -0
- package/manifest/components/chart-container.json +111 -0
- package/manifest/components/chart-ramp.json +72 -0
- package/manifest/components/chart-swatch.json +65 -0
- package/manifest/components/chart-tooltip-content.json +114 -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/checkbox-group.json +68 -0
- package/manifest/components/checkbox.json +93 -0
- package/manifest/components/checkpoint-history.json +80 -0
- package/manifest/components/chip.json +144 -0
- 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/collapsible.json +120 -0
- package/manifest/components/color-area.json +59 -0
- package/manifest/components/color-field.json +79 -0
- package/manifest/components/color-picker.json +175 -0
- package/manifest/components/color-slider.json +75 -0
- package/manifest/components/color-swatch.json +68 -0
- package/manifest/components/colors-section.json +66 -0
- package/manifest/components/combobox.json +198 -0
- package/manifest/components/command-palette.json +177 -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/composer.json +176 -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/container.json +60 -0
- package/manifest/components/context-breakdown.json +65 -0
- package/manifest/components/context-menu.json +121 -0
- package/manifest/components/context-usage.json +85 -0
- package/manifest/components/conversation-search.json +92 -0
- package/manifest/components/copy-button.json +93 -0
- package/manifest/components/cost-meter.json +74 -0
- package/manifest/components/cue-logotype.json +96 -0
- package/manifest/components/cue-mark.json +97 -0
- package/manifest/components/cue-portal-frame.json +55 -0
- package/manifest/components/data-table-pagination.json +83 -0
- package/manifest/components/data-table-toolbar.json +104 -0
- package/manifest/components/date-field.json +80 -0
- package/manifest/components/date-picker.json +191 -0
- package/manifest/components/date-range-picker.json +191 -0
- package/manifest/components/day-separator.json +58 -0
- package/manifest/components/delegation-card.json +144 -0
- package/manifest/components/density.json +58 -0
- package/manifest/components/description-list.json +84 -0
- package/manifest/components/diagram.json +100 -0
- package/manifest/components/dialog.json +198 -0
- package/manifest/components/disclosure.json +109 -0
- package/manifest/components/dmx-bar.json +94 -0
- package/manifest/components/dmx-strip.json +101 -0
- package/manifest/components/document-reference.json +90 -0
- package/manifest/components/draft-restore.json +82 -0
- package/manifest/components/drawer.json +179 -0
- package/manifest/components/dropdown-menu.json +229 -0
- 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/empty-state.json +90 -0
- package/manifest/components/end-of-turn-summary.json +77 -0
- package/manifest/components/env-var-input.json +150 -0
- package/manifest/components/error-state.json +80 -0
- package/manifest/components/export-dialog.json +84 -0
- package/manifest/components/eyebrow.json +56 -0
- package/manifest/components/feedback-dialog.json +107 -0
- package/manifest/components/field-description.json +63 -0
- package/manifest/components/field-error.json +77 -0
- package/manifest/components/field-label.json +63 -0
- package/manifest/components/field.json +79 -0
- package/manifest/components/file-tree.json +83 -0
- package/manifest/components/file-upload.json +159 -0
- package/manifest/components/flow-background.json +50 -0
- package/manifest/components/flow-controls.json +50 -0
- package/manifest/components/flow-graph.json +75 -0
- package/manifest/components/folder-icon.json +52 -0
- package/manifest/components/footer.json +112 -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/grid.json +81 -0
- package/manifest/components/group-bar.json +102 -0
- package/manifest/components/guardrail-notice.json +91 -0
- package/manifest/components/hover-card.json +151 -0
- package/manifest/components/icon-button.json +88 -0
- package/manifest/components/image-generation.json +67 -0
- package/manifest/components/info-tip.json +98 -0
- package/manifest/components/inline-citation.json +77 -0
- package/manifest/components/input-group.json +91 -0
- package/manifest/components/input.json +89 -0
- package/manifest/components/item.json +129 -0
- package/manifest/components/job-progress.json +96 -0
- package/manifest/components/kbd.json +52 -0
- package/manifest/components/launcher-bubble.json +105 -0
- package/manifest/components/link.json +81 -0
- package/manifest/components/live-region-announcer.json +79 -0
- package/manifest/components/log-viewer.json +139 -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/menubar.json +157 -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 +100 -0
- 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/message.json +116 -0
- package/manifest/components/meter.json +114 -0
- package/manifest/components/mobile-composer.json +126 -0
- package/manifest/components/model-picker.json +76 -0
- package/manifest/components/multi-select.json +190 -0
- package/manifest/components/musical-time-input.json +113 -0
- package/manifest/components/navigation-menu.json +226 -0
- package/manifest/components/node-card.json +109 -0
- package/manifest/components/node-handle.json +69 -0
- package/manifest/components/number-field.json +107 -0
- package/manifest/components/number-ticker.json +61 -0
- package/manifest/components/onboarding.json +84 -0
- package/manifest/components/otp-field.json +128 -0
- package/manifest/components/page-shell.json +96 -0
- package/manifest/components/pagination.json +92 -0
- package/manifest/components/panel-header.json +77 -0
- package/manifest/components/panel.json +71 -0
- package/manifest/components/password-input.json +119 -0
- package/manifest/components/permission-grant.json +92 -0
- package/manifest/components/permission-scopes.json +139 -0
- package/manifest/components/piano-keyboard.json +120 -0
- package/manifest/components/plussie.json +111 -0
- package/manifest/components/popover.json +193 -0
- package/manifest/components/preset-section.json +73 -0
- package/manifest/components/progress.json +95 -0
- 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/radio-group.json +73 -0
- package/manifest/components/radio.json +80 -0
- package/manifest/components/rating.json +141 -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/resizable.json +88 -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/row.json +109 -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 +91 -0
- package/manifest/components/scrollable-tabs-list.json +83 -0
- package/manifest/components/scrub-input.json +200 -0
- package/manifest/components/seam-cell.json +75 -0
- package/manifest/components/seam-grid.json +75 -0
- package/manifest/components/seam-list.json +56 -0
- package/manifest/components/search-input.json +134 -0
- package/manifest/components/section-header.json +112 -0
- package/manifest/components/segmented-control.json +138 -0
- package/manifest/components/select.json +194 -0
- package/manifest/components/separator.json +53 -0
- package/manifest/components/settings-panel.json +118 -0
- package/manifest/components/shape-section.json +66 -0
- package/manifest/components/shared-conversation.json +89 -0
- package/manifest/components/sheet.json +186 -0
- package/manifest/components/shimmer-label.json +59 -0
- package/manifest/components/sidebar.json +198 -0
- package/manifest/components/signal-edge.json +56 -0
- package/manifest/components/skeleton.json +46 -0
- package/manifest/components/skill-icon.json +52 -0
- package/manifest/components/slider.json +89 -0
- package/manifest/components/sources.json +83 -0
- package/manifest/components/sparkline.json +76 -0
- package/manifest/components/speaker-identity.json +61 -0
- package/manifest/components/spec-sheet.json +80 -0
- package/manifest/components/spectrum-visualizer.json +115 -0
- package/manifest/components/spinner.json +61 -0
- package/manifest/components/stack-icon.json +52 -0
- package/manifest/components/stack.json +96 -0
- package/manifest/components/stacks-matrix-icon.json +52 -0
- package/manifest/components/stat.json +87 -0
- package/manifest/components/status-bar.json +58 -0
- package/manifest/components/status-dot.json +78 -0
- package/manifest/components/stepper.json +89 -0
- 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/switch.json +87 -0
- package/manifest/components/table-scroll-region.json +69 -0
- package/manifest/components/table.json +155 -0
- package/manifest/components/tabs.json +145 -0
- package/manifest/components/tags-input.json +190 -0
- package/manifest/components/tail-status.json +109 -0
- package/manifest/components/terminal-block.json +91 -0
- package/manifest/components/terminal-frame.json +119 -0
- package/manifest/components/textarea.json +76 -0
- package/manifest/components/theme-configurator.json +124 -0
- package/manifest/components/theme-provider.json +134 -0
- 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 +160 -0
- package/manifest/components/time-boundary.json +62 -0
- package/manifest/components/time-field.json +80 -0
- package/manifest/components/timeline-ruler.json +139 -0
- package/manifest/components/timeline.json +115 -0
- package/manifest/components/title-bar.json +82 -0
- package/manifest/components/toast.json +130 -0
- package/manifest/components/todo-list.json +69 -0
- package/manifest/components/toggle-group.json +106 -0
- package/manifest/components/toggle.json +109 -0
- package/manifest/components/token-editor.json +90 -0
- 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 +163 -0
- package/manifest/components/tooltip.json +164 -0
- package/manifest/components/trace-waterfall.json +74 -0
- package/manifest/components/tree-visibility-toggle.json +84 -0
- package/manifest/components/tree.json +140 -0
- package/manifest/components/turn-footer.json +105 -0
- package/manifest/components/two-step-button.json +113 -0
- package/manifest/components/typing-indicator.json +53 -0
- package/manifest/components/universe-grid.json +127 -0
- package/manifest/components/unread-divider.json +55 -0
- package/manifest/components/usage-chart.json +124 -0
- 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 +4779 -0
- package/manifest/tokens.json +159 -0
- package/package.json +54 -5
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/command-palette.d.ts
|
|
3
|
+
interface PaletteCommand {
|
|
4
|
+
/** Stable identity, compared against activeId and reported by onRun. */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Command text, and the field the query filters on. */
|
|
7
|
+
label: string;
|
|
8
|
+
/** Heading the command sits under. */
|
|
9
|
+
group: string;
|
|
10
|
+
/** Shortcut, one chip per key. */
|
|
11
|
+
keys: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Everything the app can do, one keystroke away and grouped by where it acts.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* import { CommandPalette } from "@cueplusplus/ui/elements";
|
|
18
|
+
*
|
|
19
|
+
* <CommandPalette
|
|
20
|
+
* commands={commands}
|
|
21
|
+
* query={query}
|
|
22
|
+
* activeId={activeId}
|
|
23
|
+
* onQueryChange={setQuery}
|
|
24
|
+
* onRun={run}
|
|
25
|
+
* />
|
|
26
|
+
*/
|
|
27
|
+
declare function ElementsCommandPalette({ commands, query, activeId, onQueryChange, onActiveChange, onRun, className, ...props }: Omit<ComponentProps<"div">, "children" | "commands" | "query" | "activeId" | "onQueryChange" | "onActiveChange" | "onRun"> & {
|
|
28
|
+
/** Everything runnable. Groups are derived from the entries and keep first-seen order. */
|
|
29
|
+
commands: readonly PaletteCommand[];
|
|
30
|
+
/** Current filter text. */
|
|
31
|
+
query: string;
|
|
32
|
+
/**
|
|
33
|
+
* Which row is highlighted. Arrow keys move it and Enter runs it, both handled by
|
|
34
|
+
* the element; it reports the move through onActiveChange.
|
|
35
|
+
*/
|
|
36
|
+
activeId: string;
|
|
37
|
+
/** Called as the filter is typed. */
|
|
38
|
+
onQueryChange?: (query: string) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Called as the arrow keys walk the list. The element owns the key handling and
|
|
41
|
+
* reports where it landed, so activeId stays yours to hold.
|
|
42
|
+
*/
|
|
43
|
+
onActiveChange?: (id: string) => void;
|
|
44
|
+
/** Called when a command is chosen. */
|
|
45
|
+
onRun?: (id: string) => void;
|
|
46
|
+
}): import("react").JSX.Element;
|
|
47
|
+
//#endregion
|
|
48
|
+
export { ElementsCommandPalette, PaletteCommand };
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { field, floating, mono } from "./surfaces.js";
|
|
4
|
+
import { useEffect, useId } from "react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { SearchIcon } from "lucide-react";
|
|
7
|
+
//#region src/elements/command-palette.tsx
|
|
8
|
+
/**
|
|
9
|
+
* Everything the app can do, one keystroke away and grouped by where it acts.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { CommandPalette } from "@cueplusplus/ui/elements";
|
|
13
|
+
*
|
|
14
|
+
* <CommandPalette
|
|
15
|
+
* commands={commands}
|
|
16
|
+
* query={query}
|
|
17
|
+
* activeId={activeId}
|
|
18
|
+
* onQueryChange={setQuery}
|
|
19
|
+
* onRun={run}
|
|
20
|
+
* />
|
|
21
|
+
*/
|
|
22
|
+
function ElementsCommandPalette({ commands, query, activeId, onQueryChange, onActiveChange, onRun, className, ...props }) {
|
|
23
|
+
const listId = useId();
|
|
24
|
+
const optionId = (id) => `${listId}-${id}`;
|
|
25
|
+
const matches = commands.filter((command) => command.label.toLowerCase().includes(query.toLowerCase()));
|
|
26
|
+
const groups = [...new Set(matches.map((command) => command.group))];
|
|
27
|
+
const ordered = groups.flatMap((group) => matches.filter((command) => command.group === group));
|
|
28
|
+
const move = (delta) => {
|
|
29
|
+
if (ordered.length === 0) return;
|
|
30
|
+
const at = ordered.findIndex((command) => command.id === activeId);
|
|
31
|
+
const next = ordered[((at === -1 ? delta > 0 ? -1 : 0 : at) + delta + ordered.length) % ordered.length];
|
|
32
|
+
if (next) onActiveChange?.(next.id);
|
|
33
|
+
};
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
document.getElementById(optionId(activeId))?.scrollIntoView({ block: "nearest" });
|
|
36
|
+
}, [activeId, listId]);
|
|
37
|
+
const onKeyDown = (event) => {
|
|
38
|
+
if (event.nativeEvent.isComposing) return;
|
|
39
|
+
if (event.key === "ArrowDown") {
|
|
40
|
+
event.preventDefault();
|
|
41
|
+
move(1);
|
|
42
|
+
} else if (event.key === "ArrowUp") {
|
|
43
|
+
event.preventDefault();
|
|
44
|
+
move(-1);
|
|
45
|
+
} else if (event.key === "Enter") {
|
|
46
|
+
event.preventDefault();
|
|
47
|
+
const active = ordered.find((command) => command.id === activeId);
|
|
48
|
+
if (active) onRun?.(active.id);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
52
|
+
"data-slot": "command-palette",
|
|
53
|
+
className: cn(floating, "flex w-full max-w-sm flex-col overflow-hidden rounded-(--radius-overlay)", className),
|
|
54
|
+
...props,
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ jsxs("div", {
|
|
57
|
+
className: "flex items-center gap-2.5 px-3.5 py-3",
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsx(SearchIcon, { className: "text-fg-subtle size-3.5 shrink-0" }),
|
|
60
|
+
/* @__PURE__ */ jsx("input", {
|
|
61
|
+
value: query,
|
|
62
|
+
onChange: (event) => onQueryChange?.(event.target.value),
|
|
63
|
+
onKeyDown,
|
|
64
|
+
placeholder: "Type a command",
|
|
65
|
+
"aria-label": "Type a command",
|
|
66
|
+
role: "combobox",
|
|
67
|
+
"aria-expanded": ordered.length > 0,
|
|
68
|
+
"aria-controls": listId,
|
|
69
|
+
"aria-autocomplete": "list",
|
|
70
|
+
"aria-activedescendant": ordered.some((command) => command.id === activeId) ? optionId(activeId) : void 0,
|
|
71
|
+
className: "text-fg-muted placeholder:text-fg-subtle min-w-0 flex-1 bg-transparent text-(length:--cue-text-body) outline-none focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-1 focus-visible:outline-accent"
|
|
72
|
+
}),
|
|
73
|
+
/* @__PURE__ */ jsx("span", {
|
|
74
|
+
className: cn(field, mono, "text-fg-subtle rounded-(--radius-control) px-1.5 py-0.5"),
|
|
75
|
+
children: "esc"
|
|
76
|
+
})
|
|
77
|
+
]
|
|
78
|
+
}),
|
|
79
|
+
/* @__PURE__ */ jsx("div", {
|
|
80
|
+
id: listId,
|
|
81
|
+
role: "listbox",
|
|
82
|
+
"aria-label": "Commands",
|
|
83
|
+
className: "border-border flex max-h-72 flex-col overflow-y-auto border-t p-1.5",
|
|
84
|
+
children: groups.map((group) => /* @__PURE__ */ jsxs("div", {
|
|
85
|
+
role: "group",
|
|
86
|
+
"aria-label": group,
|
|
87
|
+
className: "flex flex-col",
|
|
88
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
89
|
+
"aria-hidden": true,
|
|
90
|
+
className: cn(mono, "text-fg-subtle px-2 pt-2 pb-1"),
|
|
91
|
+
children: group
|
|
92
|
+
}), matches.filter((command) => command.group === group).map((command) => /* @__PURE__ */ jsxs("button", {
|
|
93
|
+
id: optionId(command.id),
|
|
94
|
+
type: "button",
|
|
95
|
+
role: "option",
|
|
96
|
+
tabIndex: -1,
|
|
97
|
+
"aria-selected": command.id === activeId,
|
|
98
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
99
|
+
onClick: () => onRun?.(command.id),
|
|
100
|
+
className: cn("flex items-center gap-2 rounded-(--radius-surface) px-2 py-1.5 text-start transition-colors", command.id === activeId ? "bg-surface-2" : "hover:bg-surface-1"),
|
|
101
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
102
|
+
className: "min-w-0 flex-1 truncate text-(length:--cue-text-body)",
|
|
103
|
+
children: command.label
|
|
104
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
105
|
+
className: "flex shrink-0 gap-1",
|
|
106
|
+
children: command.keys.map((key) => /* @__PURE__ */ jsx("span", {
|
|
107
|
+
className: cn(field, mono, "text-fg-subtle rounded-(--radius-control) px-1.5 py-0.5"),
|
|
108
|
+
children: key
|
|
109
|
+
}, key))
|
|
110
|
+
})]
|
|
111
|
+
}, command.id))]
|
|
112
|
+
}, group))
|
|
113
|
+
}),
|
|
114
|
+
matches.length === 0 && /* @__PURE__ */ jsx("div", {
|
|
115
|
+
className: "border-border border-t p-1.5",
|
|
116
|
+
children: /* @__PURE__ */ jsxs("span", {
|
|
117
|
+
className: "text-fg-subtle block px-2 py-4 text-center text-(length:--cue-text-ui) break-words",
|
|
118
|
+
children: [
|
|
119
|
+
"No command matches “",
|
|
120
|
+
query,
|
|
121
|
+
"”"
|
|
122
|
+
]
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
]
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//#endregion
|
|
129
|
+
export { ElementsCommandPalette };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { CompactionState } from "./vocabulary.js";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
//#region src/elements/compaction-row.d.ts
|
|
4
|
+
interface CompactionRowProps extends Omit<React.ComponentPropsWithoutRef<"div">, "children"> {
|
|
5
|
+
/** Where the compaction got to. See `COMPACTION_STATES`. */
|
|
6
|
+
state: CompactionState;
|
|
7
|
+
/** Tokens in the window before it ran. */
|
|
8
|
+
tokensBefore?: number;
|
|
9
|
+
/** Tokens after. Omit while it is running, or when it did not finish. */
|
|
10
|
+
tokensAfter?: number;
|
|
11
|
+
/** Messages in the window before it ran. */
|
|
12
|
+
messagesBefore?: number;
|
|
13
|
+
/** Messages after. Omit while it is running, or when it did not finish. */
|
|
14
|
+
messagesAfter?: number;
|
|
15
|
+
/**
|
|
16
|
+
* What the rule says, replacing the one `COMPACTION_LABELS` supplies for this
|
|
17
|
+
* state.
|
|
18
|
+
*/
|
|
19
|
+
label?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Why, for the two states that owe an answer: `context window still under
|
|
22
|
+
* 60%`, `the summariser refused`. Roo's rule — a compaction that did not
|
|
23
|
+
* happen, or that lost something, should say so in words rather than leave a
|
|
24
|
+
* reader to infer it from a number that did not move.
|
|
25
|
+
*/
|
|
26
|
+
reason?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The rule that says the conversation was compacted, and by how much.
|
|
30
|
+
*
|
|
31
|
+
* A `role="separator"` like {@link TimeBoundary}, because that is what it is:
|
|
32
|
+
* the transcript above it is not the transcript below it any more. What makes
|
|
33
|
+
* it worth a component rather than a line of prose is the pair of numbers —
|
|
34
|
+
* before and after, on both axes — since "compacted" alone tells a reader
|
|
35
|
+
* nothing they can act on, while `128k → 24k tokens · 214 → 31 messages` tells
|
|
36
|
+
* them why the model stopped remembering the thing they mentioned an hour ago.
|
|
37
|
+
*
|
|
38
|
+
* Five states, which is two more than most implementations have and exactly the
|
|
39
|
+
* two that matter: a compaction that **failed** leaves the window full, and one
|
|
40
|
+
* that was **skipped** leaves it full on purpose. Both are the states a reader
|
|
41
|
+
* meets when something is about to go wrong, and both are the states a UI that
|
|
42
|
+
* only draws the happy path renders as nothing at all.
|
|
43
|
+
*
|
|
44
|
+
* The numbers render as far as they are known. While `started`, pass the before
|
|
45
|
+
* figures and no after ones and the row reads `128k tokens · 214 messages`; the
|
|
46
|
+
* arrows arrive with the answer.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* import { CompactionRow } from "@cueplusplus/ui/elements";
|
|
50
|
+
*
|
|
51
|
+
* <CompactionRow
|
|
52
|
+
* state="completed"
|
|
53
|
+
* tokensBefore={128_000}
|
|
54
|
+
* tokensAfter={24_000}
|
|
55
|
+
* messagesBefore={214}
|
|
56
|
+
* messagesAfter={31}
|
|
57
|
+
* />
|
|
58
|
+
* @example
|
|
59
|
+
* <CompactionRow state="skipped" reason="context window still under 60%" />
|
|
60
|
+
*/
|
|
61
|
+
declare const CompactionRow: React.ForwardRefExoticComponent<CompactionRowProps & React.RefAttributes<HTMLDivElement>>;
|
|
62
|
+
//#endregion
|
|
63
|
+
export { CompactionRow, CompactionRowProps };
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mono } from "./surfaces.js";
|
|
4
|
+
import { COMPACTION_LABELS } from "./vocabulary.js";
|
|
5
|
+
import * as React from "react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { CircleAlertIcon, FoldVerticalIcon, Loader2Icon, MinusIcon, XIcon } from "lucide-react";
|
|
8
|
+
//#region src/elements/compaction-row.tsx
|
|
9
|
+
/**
|
|
10
|
+
* A count as a compaction rule says it: `214`, `1.5k`, `128k`.
|
|
11
|
+
*
|
|
12
|
+
* Thousands from four figures up, one decimal below ten thousand and none above
|
|
13
|
+
* it — `128000` is `128k` and `1500` is `1.5k`, because the first number is
|
|
14
|
+
* about a budget and the second is about a change. Anything that is not a
|
|
15
|
+
* finite, positive number is `0`.
|
|
16
|
+
*/
|
|
17
|
+
function formatCount(value) {
|
|
18
|
+
if (!Number.isFinite(value) || value <= 0) return "0";
|
|
19
|
+
if (value < 1e3) return String(Math.round(value));
|
|
20
|
+
const thousands = value / 1e3;
|
|
21
|
+
return thousands < 10 ? `${Math.round(thousands * 10) / 10}k` : `${Math.round(thousands)}k`;
|
|
22
|
+
}
|
|
23
|
+
/** `128k → 24k tokens`, or `128k tokens` when there is no after yet. */
|
|
24
|
+
function figures(before, after, unit) {
|
|
25
|
+
if (before === void 0) return null;
|
|
26
|
+
if (after === void 0) return `${formatCount(before)} ${unit}`;
|
|
27
|
+
return `${formatCount(before)} → ${formatCount(after)} ${unit}`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The rule that says the conversation was compacted, and by how much.
|
|
31
|
+
*
|
|
32
|
+
* A `role="separator"` like {@link TimeBoundary}, because that is what it is:
|
|
33
|
+
* the transcript above it is not the transcript below it any more. What makes
|
|
34
|
+
* it worth a component rather than a line of prose is the pair of numbers —
|
|
35
|
+
* before and after, on both axes — since "compacted" alone tells a reader
|
|
36
|
+
* nothing they can act on, while `128k → 24k tokens · 214 → 31 messages` tells
|
|
37
|
+
* them why the model stopped remembering the thing they mentioned an hour ago.
|
|
38
|
+
*
|
|
39
|
+
* Five states, which is two more than most implementations have and exactly the
|
|
40
|
+
* two that matter: a compaction that **failed** leaves the window full, and one
|
|
41
|
+
* that was **skipped** leaves it full on purpose. Both are the states a reader
|
|
42
|
+
* meets when something is about to go wrong, and both are the states a UI that
|
|
43
|
+
* only draws the happy path renders as nothing at all.
|
|
44
|
+
*
|
|
45
|
+
* The numbers render as far as they are known. While `started`, pass the before
|
|
46
|
+
* figures and no after ones and the row reads `128k tokens · 214 messages`; the
|
|
47
|
+
* arrows arrive with the answer.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* import { CompactionRow } from "@cueplusplus/ui/elements";
|
|
51
|
+
*
|
|
52
|
+
* <CompactionRow
|
|
53
|
+
* state="completed"
|
|
54
|
+
* tokensBefore={128_000}
|
|
55
|
+
* tokensAfter={24_000}
|
|
56
|
+
* messagesBefore={214}
|
|
57
|
+
* messagesAfter={31}
|
|
58
|
+
* />
|
|
59
|
+
* @example
|
|
60
|
+
* <CompactionRow state="skipped" reason="context window still under 60%" />
|
|
61
|
+
*/
|
|
62
|
+
const CompactionRow = React.forwardRef(function CompactionRow({ state, tokensBefore, tokensAfter, messagesBefore, messagesAfter, label, reason, className, ...elementProps }, ref) {
|
|
63
|
+
const said = label ?? COMPACTION_LABELS[state];
|
|
64
|
+
const counts = [figures(tokensBefore, tokensAfter, "tokens"), figures(messagesBefore, messagesAfter, "messages")].filter((part) => part !== null);
|
|
65
|
+
const spoken = [
|
|
66
|
+
said,
|
|
67
|
+
...counts,
|
|
68
|
+
reason
|
|
69
|
+
].filter(Boolean).join(" · ");
|
|
70
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
71
|
+
ref,
|
|
72
|
+
role: "separator",
|
|
73
|
+
"aria-label": spoken,
|
|
74
|
+
"data-slot": "compaction-row",
|
|
75
|
+
"data-state": state,
|
|
76
|
+
className: cn("flex w-full items-center gap-2.5 py-1", className),
|
|
77
|
+
...elementProps,
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ jsx("span", {
|
|
80
|
+
"aria-hidden": true,
|
|
81
|
+
className: "bg-border h-px flex-1"
|
|
82
|
+
}),
|
|
83
|
+
/* @__PURE__ */ jsxs("span", {
|
|
84
|
+
"aria-hidden": true,
|
|
85
|
+
className: "flex min-w-0 shrink items-center gap-2",
|
|
86
|
+
children: [
|
|
87
|
+
state === "started" ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-3 shrink-0 animate-spin text-stream motion-reduce:animate-none" }) : state === "failed" ? /* @__PURE__ */ jsx(CircleAlertIcon, { className: "size-3 shrink-0 text-danger" }) : state === "cancelled" ? /* @__PURE__ */ jsx(XIcon, { className: "text-fg-subtle size-3 shrink-0" }) : state === "skipped" ? /* @__PURE__ */ jsx(MinusIcon, { className: "text-fg-subtle size-3 shrink-0" }) : /* @__PURE__ */ jsx(FoldVerticalIcon, { className: "text-fg-subtle size-3 shrink-0" }),
|
|
88
|
+
/* @__PURE__ */ jsx("span", {
|
|
89
|
+
className: cn(mono, "shrink-0", state === "failed" ? "text-danger" : "text-fg-subtle"),
|
|
90
|
+
children: said
|
|
91
|
+
}),
|
|
92
|
+
counts.length === 0 ? null : /* @__PURE__ */ jsx("span", {
|
|
93
|
+
className: cn(mono, "text-fg-subtle min-w-0 truncate tabular-nums"),
|
|
94
|
+
children: counts.join(" · ")
|
|
95
|
+
}),
|
|
96
|
+
reason === void 0 ? null : /* @__PURE__ */ jsx("span", {
|
|
97
|
+
className: cn(mono, "text-fg-subtle min-w-0 truncate"),
|
|
98
|
+
children: reason
|
|
99
|
+
})
|
|
100
|
+
]
|
|
101
|
+
}),
|
|
102
|
+
/* @__PURE__ */ jsx("span", {
|
|
103
|
+
"aria-hidden": true,
|
|
104
|
+
className: "bg-border h-px flex-1"
|
|
105
|
+
})
|
|
106
|
+
]
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
//#endregion
|
|
110
|
+
export { CompactionRow };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/comparison-card.d.ts
|
|
3
|
+
/** One of the options being weighed, and how it answers each trait. */
|
|
4
|
+
interface ComparisonOption {
|
|
5
|
+
/** Stable identity, compared against recommendedId. */
|
|
6
|
+
id: string;
|
|
7
|
+
/** Option name. */
|
|
8
|
+
name: string;
|
|
9
|
+
/** One-line summary under the name. */
|
|
10
|
+
headline: string;
|
|
11
|
+
/**
|
|
12
|
+
* Positional against traitLabels. A string is what the option does; false means it
|
|
13
|
+
* lacks the trait and shows the label struck back.
|
|
14
|
+
*/
|
|
15
|
+
traits: readonly (string | false)[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Two options weighed side by side, with the pick named and argued.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* import { ComparisonCard } from "@cueplusplus/ui/elements";
|
|
22
|
+
*
|
|
23
|
+
* <ComparisonCard
|
|
24
|
+
* traitLabels={traits}
|
|
25
|
+
* options={options}
|
|
26
|
+
* recommendedId="local"
|
|
27
|
+
* reason="You already hold messages in your own store."
|
|
28
|
+
* />
|
|
29
|
+
*/
|
|
30
|
+
declare function ComparisonCard({ traitLabels, options, recommendedId, reason, className, ...props }: Omit<ComponentProps<"div">, "children" | "traitLabels" | "options" | "recommendedId" | "reason"> & {
|
|
31
|
+
/**
|
|
32
|
+
* The dimensions compared, in order. Used as the fallback label when an option lacks
|
|
33
|
+
* a trait.
|
|
34
|
+
*/
|
|
35
|
+
traitLabels: readonly string[];
|
|
36
|
+
/** Two or three options. More than that wants a table, not a comparison. */
|
|
37
|
+
options: readonly ComparisonOption[];
|
|
38
|
+
/** Which option is the pick. It is tinted and labelled rather than merely ordered first. */
|
|
39
|
+
recommendedId: string;
|
|
40
|
+
/**
|
|
41
|
+
* Why that one, in the user's terms. A comparison without a recommendation is an
|
|
42
|
+
* unanswered question.
|
|
43
|
+
*/
|
|
44
|
+
reason: string;
|
|
45
|
+
}): import("react").JSX.Element;
|
|
46
|
+
//#endregion
|
|
47
|
+
export { ComparisonCard, ComparisonOption };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { field, paper } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { CheckIcon, MinusIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/comparison-card.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Two options weighed side by side, with the pick named and argued.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { ComparisonCard } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <ComparisonCard
|
|
14
|
+
* traitLabels={traits}
|
|
15
|
+
* options={options}
|
|
16
|
+
* recommendedId="local"
|
|
17
|
+
* reason="You already hold messages in your own store."
|
|
18
|
+
* />
|
|
19
|
+
*/
|
|
20
|
+
function ComparisonCard({ traitLabels, options, recommendedId, reason, className, ...props }) {
|
|
21
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
22
|
+
"data-slot": "comparison-card",
|
|
23
|
+
className: cn(paper, "flex w-full max-w-md flex-col gap-3 rounded-(--radius-overlay) p-4", className),
|
|
24
|
+
...props,
|
|
25
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
26
|
+
className: "flex gap-2",
|
|
27
|
+
children: options.map((option) => {
|
|
28
|
+
const recommended = option.id === recommendedId;
|
|
29
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
30
|
+
className: cn("flex min-w-0 flex-1 flex-col gap-2 rounded-(--radius-surface) p-3 transition-colors", recommended ? "bg-stream/10" : field),
|
|
31
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
32
|
+
className: "flex flex-col gap-0.5",
|
|
33
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
34
|
+
className: "flex items-baseline gap-1.5",
|
|
35
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
36
|
+
className: "truncate text-(length:--cue-text-body) font-medium",
|
|
37
|
+
children: option.name
|
|
38
|
+
}), recommended && /* @__PURE__ */ jsx("span", {
|
|
39
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "shrink-0 text-stream"),
|
|
40
|
+
children: "pick"
|
|
41
|
+
})]
|
|
42
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
43
|
+
className: "text-fg-muted truncate text-(length:--cue-text-ui)",
|
|
44
|
+
children: option.headline
|
|
45
|
+
})]
|
|
46
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
47
|
+
className: "flex flex-col gap-1",
|
|
48
|
+
children: traitLabels.map((label, i) => {
|
|
49
|
+
const trait = option.traits[i];
|
|
50
|
+
const absent = !trait;
|
|
51
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
52
|
+
className: "flex items-center gap-1.5 text-(length:--cue-text-ui)",
|
|
53
|
+
children: [absent ? /* @__PURE__ */ jsx(MinusIcon, { className: "text-fg-subtle size-3 shrink-0" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "size-3 shrink-0 text-ok" }), /* @__PURE__ */ jsx("span", {
|
|
54
|
+
className: cn("min-w-0 truncate", absent ? "text-fg-subtle" : "text-fg-muted"),
|
|
55
|
+
children: absent ? label : trait
|
|
56
|
+
})]
|
|
57
|
+
}, `${i}-${label}`);
|
|
58
|
+
})
|
|
59
|
+
})]
|
|
60
|
+
}, option.id);
|
|
61
|
+
})
|
|
62
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
63
|
+
className: "text-fg-muted text-(length:--cue-text-ui) leading-relaxed",
|
|
64
|
+
children: reason
|
|
65
|
+
})]
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { ComparisonCard };
|