@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,29 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/terminal-block.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Command output that streams line by line and ends with an exit status.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* import { TerminalBlock } from "@cueplusplus/ui/elements";
|
|
8
|
+
*
|
|
9
|
+
* <TerminalBlock
|
|
10
|
+
* command="pnpm test"
|
|
11
|
+
* lines={["PASS thread.test.ts", "Tests: 2 passed"]}
|
|
12
|
+
* visibleCount={2}
|
|
13
|
+
* done
|
|
14
|
+
* />
|
|
15
|
+
*/
|
|
16
|
+
declare function TerminalBlock({ command, lines, visibleCount, done, variant, className, ...props }: Omit<ComponentProps<"div">, "children" | "command" | "lines" | "visibleCount" | "done" | "variant"> & {
|
|
17
|
+
/** Command string shown in the terminal header. */
|
|
18
|
+
command: string;
|
|
19
|
+
/** Output lines available to stream into the body. */
|
|
20
|
+
lines: readonly string[];
|
|
21
|
+
/** How many output lines from the start are currently shown. */
|
|
22
|
+
visibleCount: number;
|
|
23
|
+
/** When true the header shows exit 0; otherwise a spinner keeps spinning. */
|
|
24
|
+
done: boolean;
|
|
25
|
+
/** paper matches the surrounding surfaces; ink renders the classic dark terminal slab. */
|
|
26
|
+
variant?: "paper" | "ink";
|
|
27
|
+
}): import("react").JSX.Element;
|
|
28
|
+
//#endregion
|
|
29
|
+
export { TerminalBlock };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mono, paper } from "./surfaces.js";
|
|
4
|
+
import { take } from "./range.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { CheckIcon, Loader2Icon } from "lucide-react";
|
|
7
|
+
//#region src/elements/terminal-block.tsx
|
|
8
|
+
/**
|
|
9
|
+
* Command output that streams line by line and ends with an exit status.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* import { TerminalBlock } from "@cueplusplus/ui/elements";
|
|
13
|
+
*
|
|
14
|
+
* <TerminalBlock
|
|
15
|
+
* command="pnpm test"
|
|
16
|
+
* lines={["PASS thread.test.ts", "Tests: 2 passed"]}
|
|
17
|
+
* visibleCount={2}
|
|
18
|
+
* done
|
|
19
|
+
* />
|
|
20
|
+
*/
|
|
21
|
+
function TerminalBlock({ command, lines, visibleCount, done, variant = "paper", className, ...props }) {
|
|
22
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
23
|
+
"data-slot": "terminal-block",
|
|
24
|
+
className: cn(variant === "ink" ? "bg-sunken" : paper, "w-full max-w-md overflow-hidden rounded-(--radius-overlay) font-mono text-(length:--cue-text-ui)", className),
|
|
25
|
+
...props,
|
|
26
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
27
|
+
className: "flex items-center justify-between px-4 pt-3 pb-1.5",
|
|
28
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
29
|
+
className: "text-fg",
|
|
30
|
+
children: command
|
|
31
|
+
}), done ? /* @__PURE__ */ jsxs("div", {
|
|
32
|
+
className: "flex items-center gap-1",
|
|
33
|
+
children: [/* @__PURE__ */ jsx(CheckIcon, { className: "size-3 text-ok" }), /* @__PURE__ */ jsx("span", {
|
|
34
|
+
className: cn(mono, "text-fg-subtle"),
|
|
35
|
+
children: "exit 0"
|
|
36
|
+
})]
|
|
37
|
+
}) : /* @__PURE__ */ jsx(Loader2Icon, { className: cn("size-3 animate-spin motion-reduce:animate-none", "text-fg-subtle") })]
|
|
38
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
39
|
+
className: cn("flex min-h-[8.5rem] flex-col gap-1 px-4 pt-1 pb-3.5", "text-fg-muted"),
|
|
40
|
+
children: [take(lines, visibleCount).map((line, i) => {
|
|
41
|
+
const isLast = i === lines.length - 1;
|
|
42
|
+
return /* @__PURE__ */ jsx("div", {
|
|
43
|
+
className: cn("cue-elements-fade-in cue-elements-animate-in cue-elements-fill-mode-both duration-300", isLast && "text-fg"),
|
|
44
|
+
children: line
|
|
45
|
+
}, `${i}-${line}`);
|
|
46
|
+
}), !done && /* @__PURE__ */ jsx("span", {
|
|
47
|
+
"aria-hidden": true,
|
|
48
|
+
className: "inline-block h-3 w-1.5 animate-pulse bg-stream/70 motion-reduce:animate-none"
|
|
49
|
+
})]
|
|
50
|
+
})]
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
export { TerminalBlock };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/thinking-indicator.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* A live status line that names what the agent is doing right now, with elapsed time.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* import { ThinkingIndicator } from "@cueplusplus/ui/elements";
|
|
8
|
+
*
|
|
9
|
+
* <ThinkingIndicator label="Reading thread.tsx" elapsed="12s" />
|
|
10
|
+
*/
|
|
11
|
+
declare function ThinkingIndicator({ label, elapsed, className, ...props }: Omit<ComponentProps<"div">, "children" | "label" | "elapsed"> & {
|
|
12
|
+
/** What the agent is doing right now. Swapping it replays the entrance animation. */
|
|
13
|
+
label: string;
|
|
14
|
+
/** Elapsed time rendered in mono next to the label. Omit to hide the timer. */
|
|
15
|
+
elapsed?: string;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { ThinkingIndicator };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { ShimmerLabel } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/elements/thinking-indicator.tsx
|
|
6
|
+
/**
|
|
7
|
+
* A live status line that names what the agent is doing right now, with elapsed time.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* import { ThinkingIndicator } from "@cueplusplus/ui/elements";
|
|
11
|
+
*
|
|
12
|
+
* <ThinkingIndicator label="Reading thread.tsx" elapsed="12s" />
|
|
13
|
+
*/
|
|
14
|
+
function ThinkingIndicator({ label, elapsed, className, ...props }) {
|
|
15
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
16
|
+
"data-slot": "thinking-indicator",
|
|
17
|
+
className: cn("text-fg-muted flex items-center gap-2.5 text-(length:--cue-text-body)", className),
|
|
18
|
+
...props,
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ jsx("span", {
|
|
21
|
+
"aria-hidden": true,
|
|
22
|
+
className: "size-1.5 shrink-0 animate-pulse rounded-full bg-stream motion-reduce:animate-none"
|
|
23
|
+
}),
|
|
24
|
+
/* @__PURE__ */ jsx(ShimmerLabel, {
|
|
25
|
+
className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in relative inline-block leading-none duration-300",
|
|
26
|
+
children: label
|
|
27
|
+
}, label),
|
|
28
|
+
elapsed !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
29
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle tabular-nums"),
|
|
30
|
+
children: elapsed
|
|
31
|
+
})
|
|
32
|
+
]
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { ThinkingIndicator };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/thread-list.d.ts
|
|
3
|
+
interface ThreadItem {
|
|
4
|
+
/** What the conversation is about, truncated to one line. */
|
|
5
|
+
title: string;
|
|
6
|
+
/** Pre-formatted age of the last message. The element does no date maths. */
|
|
7
|
+
time: string;
|
|
8
|
+
/** Whether the row carries the unread dot. */
|
|
9
|
+
unread?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Conversation history with unread marks and actions that wait for hover.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* import { ThreadList } from "@cueplusplus/ui/elements";
|
|
16
|
+
*
|
|
17
|
+
* <ThreadList
|
|
18
|
+
* threads={[
|
|
19
|
+
* { title: "Composer polish", time: "2m", unread: true },
|
|
20
|
+
* { title: "Runtime migration", time: "1h" },
|
|
21
|
+
* ]}
|
|
22
|
+
* activeIndex={activeIndex}
|
|
23
|
+
* onActiveIndexChange={setActiveIndex}
|
|
24
|
+
* />
|
|
25
|
+
*/
|
|
26
|
+
declare function ThreadList({ threads, activeIndex, onActiveIndexChange, className, ...props }: Omit<ComponentProps<"div">, "children" | "threads" | "activeIndex" | "onActiveIndexChange"> & {
|
|
27
|
+
/** Conversation rows with title, time, and optional unread mark. */
|
|
28
|
+
threads: readonly ThreadItem[];
|
|
29
|
+
/** Index of the currently selected thread. An index outside the list selects nothing. */
|
|
30
|
+
activeIndex: number;
|
|
31
|
+
/** Called when the user clicks a thread row. */
|
|
32
|
+
onActiveIndexChange?: (index: number) => void;
|
|
33
|
+
}): import("react").JSX.Element;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { ThreadItem, ThreadList };
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { field, mono } from "./surfaces.js";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { PencilIcon, Trash2Icon } from "lucide-react";
|
|
6
|
+
//#region src/elements/thread-list.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Conversation history with unread marks and actions that wait for hover.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { ThreadList } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <ThreadList
|
|
14
|
+
* threads={[
|
|
15
|
+
* { title: "Composer polish", time: "2m", unread: true },
|
|
16
|
+
* { title: "Runtime migration", time: "1h" },
|
|
17
|
+
* ]}
|
|
18
|
+
* activeIndex={activeIndex}
|
|
19
|
+
* onActiveIndexChange={setActiveIndex}
|
|
20
|
+
* />
|
|
21
|
+
*/
|
|
22
|
+
function ThreadList({ threads, activeIndex, onActiveIndexChange, className, ...props }) {
|
|
23
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
24
|
+
"data-slot": "thread-list",
|
|
25
|
+
className: cn("flex w-full max-w-[240px] flex-col gap-0.5", className),
|
|
26
|
+
...props,
|
|
27
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
28
|
+
className: cn(mono, "text-fg-subtle px-3 pb-1.5"),
|
|
29
|
+
children: "Today"
|
|
30
|
+
}), threads.map((thread, i) => {
|
|
31
|
+
const active = i === activeIndex;
|
|
32
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
33
|
+
type: "button",
|
|
34
|
+
"aria-current": active || void 0,
|
|
35
|
+
onClick: () => onActiveIndexChange?.(i),
|
|
36
|
+
className: cn("group flex w-full items-center justify-between gap-2 rounded-(--radius-surface) px-3 py-2 text-start text-(length:--cue-text-body) transition-colors", active ? field : "hover:bg-surface-1"),
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsx("span", {
|
|
39
|
+
className: "flex-1 truncate",
|
|
40
|
+
children: thread.title
|
|
41
|
+
}),
|
|
42
|
+
/* @__PURE__ */ jsxs("span", {
|
|
43
|
+
className: cn(mono, "text-fg-subtle flex items-center gap-1.5 tabular-nums group-hover:hidden"),
|
|
44
|
+
children: [thread.unread && !active && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
|
|
45
|
+
"aria-hidden": true,
|
|
46
|
+
className: "size-1.5 rounded-full bg-stream"
|
|
47
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
48
|
+
className: "sr-only",
|
|
49
|
+
children: "unread"
|
|
50
|
+
})] }), thread.time]
|
|
51
|
+
}),
|
|
52
|
+
/* @__PURE__ */ jsxs("span", {
|
|
53
|
+
className: "hidden items-center gap-0.5 group-hover:flex",
|
|
54
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
55
|
+
className: "text-fg-muted hover:bg-surface-2 hover:text-fg rounded-full p-1",
|
|
56
|
+
children: /* @__PURE__ */ jsx(PencilIcon, { className: "size-3" })
|
|
57
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
58
|
+
className: "text-fg-muted hover:bg-surface-2 hover:text-fg rounded-full p-1",
|
|
59
|
+
children: /* @__PURE__ */ jsx(Trash2Icon, { className: "size-3" })
|
|
60
|
+
})]
|
|
61
|
+
})
|
|
62
|
+
]
|
|
63
|
+
}, thread.title);
|
|
64
|
+
})]
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
export { ThreadList };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/thread-search.d.ts
|
|
3
|
+
interface SearchableThread {
|
|
4
|
+
/** Stable identity, compared against activeId. */
|
|
5
|
+
id: string;
|
|
6
|
+
/** Thread title. Filtering matches this and preview together. */
|
|
7
|
+
title: string;
|
|
8
|
+
/** Date bucket the thread falls into: Today, Yesterday, Earlier. */
|
|
9
|
+
group: string;
|
|
10
|
+
/** Second line under the title. */
|
|
11
|
+
preview: string;
|
|
12
|
+
/** Lifts the thread out of its date group into its own pinned section. */
|
|
13
|
+
pinned?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* History you can actually get back into: pinned first, then grouped by when.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* import { ThreadSearch } from "@cueplusplus/ui/elements";
|
|
20
|
+
*
|
|
21
|
+
* <ThreadSearch
|
|
22
|
+
* threads={threads}
|
|
23
|
+
* query={query}
|
|
24
|
+
* activeId={activeId}
|
|
25
|
+
* onQueryChange={setQuery}
|
|
26
|
+
* onSelect={setActiveId}
|
|
27
|
+
* />
|
|
28
|
+
*/
|
|
29
|
+
declare function ThreadSearch({ threads, query, activeId, onQueryChange, onSelect, className, ...props }: Omit<ComponentProps<"div">, "children" | "threads" | "query" | "activeId" | "onQueryChange" | "onSelect"> & {
|
|
30
|
+
/** All threads. Filtering matches title and preview together. */
|
|
31
|
+
threads: readonly SearchableThread[];
|
|
32
|
+
/** Current search text. */
|
|
33
|
+
query: string;
|
|
34
|
+
/** Which thread is open. */
|
|
35
|
+
activeId: string;
|
|
36
|
+
/** Called as the search is typed. */
|
|
37
|
+
onQueryChange?: (query: string) => void;
|
|
38
|
+
/** Called when a thread is opened. */
|
|
39
|
+
onSelect?: (id: string) => void;
|
|
40
|
+
}): import("react").JSX.Element;
|
|
41
|
+
//#endregion
|
|
42
|
+
export { SearchableThread, ThreadSearch };
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { field, mono, paper } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { PinIcon, SearchIcon } from "lucide-react";
|
|
6
|
+
//#region src/elements/thread-search.tsx
|
|
7
|
+
/**
|
|
8
|
+
* History you can actually get back into: pinned first, then grouped by when.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { ThreadSearch } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <ThreadSearch
|
|
14
|
+
* threads={threads}
|
|
15
|
+
* query={query}
|
|
16
|
+
* activeId={activeId}
|
|
17
|
+
* onQueryChange={setQuery}
|
|
18
|
+
* onSelect={setActiveId}
|
|
19
|
+
* />
|
|
20
|
+
*/
|
|
21
|
+
function ThreadSearch({ threads, query, activeId, onQueryChange, onSelect, className, ...props }) {
|
|
22
|
+
const matches = threads.filter((thread) => `${thread.title} ${thread.preview}`.toLowerCase().includes(query.toLowerCase()));
|
|
23
|
+
const pinned = matches.filter((thread) => thread.pinned);
|
|
24
|
+
const groups = [...new Set(matches.filter((t) => !t.pinned).map((t) => t.group))];
|
|
25
|
+
const ordered = [...pinned, ...groups.flatMap((group) => matches.filter((thread) => !thread.pinned && thread.group === group))];
|
|
26
|
+
const move = (delta) => {
|
|
27
|
+
if (ordered.length === 0) return;
|
|
28
|
+
const at = ordered.findIndex((thread) => thread.id === activeId);
|
|
29
|
+
const next = ordered[((at === -1 ? delta > 0 ? -1 : 0 : at) + delta + ordered.length) % ordered.length];
|
|
30
|
+
if (next) onSelect?.(next.id);
|
|
31
|
+
};
|
|
32
|
+
const onKeyDown = (event) => {
|
|
33
|
+
if (event.nativeEvent.isComposing) return;
|
|
34
|
+
if (event.key === "ArrowDown") {
|
|
35
|
+
event.preventDefault();
|
|
36
|
+
move(1);
|
|
37
|
+
} else if (event.key === "ArrowUp") {
|
|
38
|
+
event.preventDefault();
|
|
39
|
+
move(-1);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const row = (thread) => /* @__PURE__ */ jsxs("button", {
|
|
43
|
+
type: "button",
|
|
44
|
+
onClick: () => onSelect?.(thread.id),
|
|
45
|
+
className: cn("flex flex-col gap-0.5 rounded-(--radius-surface) px-2 py-1 text-start transition-colors", thread.id === activeId ? "bg-surface-1" : "hover:bg-surface-1"),
|
|
46
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
47
|
+
className: "flex items-center gap-1.5",
|
|
48
|
+
children: [thread.pinned && /* @__PURE__ */ jsx(PinIcon, { className: "text-fg-subtle size-2.5 shrink-0" }), /* @__PURE__ */ jsx("span", {
|
|
49
|
+
className: "min-w-0 flex-1 truncate text-(length:--cue-text-body)",
|
|
50
|
+
children: thread.title
|
|
51
|
+
})]
|
|
52
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
53
|
+
className: "text-fg-subtle truncate text-(length:--cue-text-ui)",
|
|
54
|
+
children: thread.preview
|
|
55
|
+
})]
|
|
56
|
+
}, thread.id);
|
|
57
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
58
|
+
"data-slot": "thread-search",
|
|
59
|
+
className: cn(paper, "flex w-full max-w-sm flex-col gap-1.5 rounded-(--radius-overlay) p-3", className),
|
|
60
|
+
...props,
|
|
61
|
+
children: [
|
|
62
|
+
/* @__PURE__ */ jsxs("div", {
|
|
63
|
+
className: cn(field, "flex items-center gap-2 rounded-(--radius-surface) px-2.5 py-1.5"),
|
|
64
|
+
children: [/* @__PURE__ */ jsx(SearchIcon, { className: "text-fg-subtle size-3.5 shrink-0" }), /* @__PURE__ */ jsx("input", {
|
|
65
|
+
value: query,
|
|
66
|
+
onChange: (event) => onQueryChange?.(event.target.value),
|
|
67
|
+
onKeyDown,
|
|
68
|
+
placeholder: "Search threads",
|
|
69
|
+
"aria-label": "Search threads",
|
|
70
|
+
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"
|
|
71
|
+
})]
|
|
72
|
+
}),
|
|
73
|
+
pinned.length > 0 && /* @__PURE__ */ jsxs("div", {
|
|
74
|
+
className: "flex flex-col",
|
|
75
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
76
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle px-2 pb-1"),
|
|
77
|
+
children: "pinned"
|
|
78
|
+
}), pinned.map(row)]
|
|
79
|
+
}),
|
|
80
|
+
groups.map((group) => /* @__PURE__ */ jsxs("div", {
|
|
81
|
+
className: "flex flex-col",
|
|
82
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
83
|
+
className: cn(mono, "text-fg-subtle px-2 pb-1"),
|
|
84
|
+
children: group
|
|
85
|
+
}), matches.filter((thread) => !thread.pinned && thread.group === group).map(row)]
|
|
86
|
+
}, group)),
|
|
87
|
+
matches.length === 0 && /* @__PURE__ */ jsxs("span", {
|
|
88
|
+
className: "text-fg-subtle px-2 py-4 text-center text-(length:--cue-text-ui)",
|
|
89
|
+
children: [
|
|
90
|
+
"No thread matches “",
|
|
91
|
+
query,
|
|
92
|
+
"”"
|
|
93
|
+
]
|
|
94
|
+
})
|
|
95
|
+
]
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
//#endregion
|
|
99
|
+
export { ThreadSearch };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/timeline.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Which side of now an event is on: `past`, `now`, or `future`. It decides the marker
|
|
5
|
+
* and the ink, which is what lets one list carry what happened and what is still
|
|
6
|
+
* coming.
|
|
7
|
+
*/
|
|
8
|
+
type TimelineWhen = "past" | "now" | "future";
|
|
9
|
+
/** One event on the axis: when it is, what it is, and the line under it. */
|
|
10
|
+
interface TimelineEvent {
|
|
11
|
+
/** Stable identity for the row key. */
|
|
12
|
+
id: string;
|
|
13
|
+
/** past is filled, now gets a ring, future is an outline with a lighter rail. */
|
|
14
|
+
when: TimelineWhen;
|
|
15
|
+
/** Pre-formatted timestamp in the left rail. */
|
|
16
|
+
time: string;
|
|
17
|
+
/** What happened. */
|
|
18
|
+
title: string;
|
|
19
|
+
/** Optional second line under the title. */
|
|
20
|
+
detail?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Events on a time axis, with what already happened and what is still coming.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* import { Timeline } from "@cueplusplus/ui/elements";
|
|
27
|
+
*
|
|
28
|
+
* <Timeline events={events} visibleCount={events.length} />
|
|
29
|
+
*/
|
|
30
|
+
declare function ElementsTimeline({ events, visibleCount, className, ...props }: Omit<ComponentProps<"div">, "children" | "events" | "visibleCount"> & {
|
|
31
|
+
/** Events in chronological order, past and scheduled together. */
|
|
32
|
+
events: readonly TimelineEvent[];
|
|
33
|
+
/** How many events have been resolved. */
|
|
34
|
+
visibleCount: number;
|
|
35
|
+
}): import("react").JSX.Element;
|
|
36
|
+
//#endregion
|
|
37
|
+
export { ElementsTimeline, TimelineEvent, TimelineWhen };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mono, paper } from "./surfaces.js";
|
|
4
|
+
import { take } from "./range.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
//#region src/elements/timeline.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Events on a time axis, with what already happened and what is still coming.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { Timeline } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <Timeline events={events} visibleCount={events.length} />
|
|
14
|
+
*/
|
|
15
|
+
function ElementsTimeline({ events, visibleCount, className, ...props }) {
|
|
16
|
+
return /* @__PURE__ */ jsx("div", {
|
|
17
|
+
"data-slot": "timeline",
|
|
18
|
+
className: cn(paper, "flex w-full max-w-sm flex-col rounded-(--radius-overlay) p-4", className),
|
|
19
|
+
...props,
|
|
20
|
+
children: take(events, visibleCount).map((event, i, shown) => /* @__PURE__ */ jsxs("div", {
|
|
21
|
+
className: "cue-elements-fade-in cue-elements-slide-in-from-left-1 cue-elements-animate-in cue-elements-fill-mode-both grid grid-cols-[3.5rem_1rem_minmax(0,1fr)] gap-x-2 duration-300",
|
|
22
|
+
children: [
|
|
23
|
+
/* @__PURE__ */ jsx("span", {
|
|
24
|
+
className: cn(mono, "pt-[3px] text-end tabular-nums", event.when === "future" ? "text-fg-subtle" : "text-fg-subtle"),
|
|
25
|
+
children: event.time
|
|
26
|
+
}),
|
|
27
|
+
/* @__PURE__ */ jsxs("span", {
|
|
28
|
+
className: "flex flex-col items-center",
|
|
29
|
+
children: [/* @__PURE__ */ jsx("span", { className: cn("mt-1 size-2 shrink-0 rounded-full", event.when === "now" && "bg-stream ring-stream/15", event.when === "past" && "bg-surface-3", event.when === "future" && "border-border-strong border bg-transparent") }), i < shown.length - 1 && /* @__PURE__ */ jsx("span", { className: cn("w-px flex-1", event.when === "future" ? "bg-surface-2" : "bg-surface-3") })]
|
|
30
|
+
}),
|
|
31
|
+
/* @__PURE__ */ jsxs("div", {
|
|
32
|
+
className: cn("flex flex-col gap-0.5", i < shown.length - 1 && "pb-3"),
|
|
33
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
34
|
+
className: cn("text-(length:--cue-text-body) break-words", event.when === "future" ? "text-fg-subtle" : "text-fg", event.when === "now" && "font-medium"),
|
|
35
|
+
children: event.title
|
|
36
|
+
}), event.detail && /* @__PURE__ */ jsx("span", {
|
|
37
|
+
className: "text-fg-muted text-(length:--cue-text-ui) leading-relaxed break-words",
|
|
38
|
+
children: event.detail
|
|
39
|
+
})]
|
|
40
|
+
})
|
|
41
|
+
]
|
|
42
|
+
}, event.id))
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
export { ElementsTimeline };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/todo-list.d.ts
|
|
3
|
+
/** Where one item stands: not started, being worked on, or finished. */
|
|
4
|
+
type TodoStatus = "pending" | "active" | "done";
|
|
5
|
+
/** One line of an agent's todo list. */
|
|
6
|
+
interface TodoItem {
|
|
7
|
+
/**
|
|
8
|
+
* Stable identity across revisions. Reusing an id keeps an item in place while its
|
|
9
|
+
* text or status changes.
|
|
10
|
+
*/
|
|
11
|
+
id: string;
|
|
12
|
+
/** The item as the agent phrased it. */
|
|
13
|
+
text: string;
|
|
14
|
+
/** Per-item state. More than one item may be active if the agent works in parallel. */
|
|
15
|
+
status: TodoStatus;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The agent's own working list, rewritten mid-run as it discovers what else is needed.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* import { TodoList } from "@cueplusplus/ui/elements";
|
|
22
|
+
*
|
|
23
|
+
* <TodoList
|
|
24
|
+
* items={[
|
|
25
|
+
* { id: "read", text: "Read the failing test", status: "done" },
|
|
26
|
+
* { id: "fix", text: "Fix the converter", status: "active" },
|
|
27
|
+
* { id: "verify", text: "Re-run the suite", status: "pending" },
|
|
28
|
+
* ]}
|
|
29
|
+
* revision={2}
|
|
30
|
+
* />
|
|
31
|
+
*/
|
|
32
|
+
declare function TodoList({ items, revision, className, ...props }: Omit<ComponentProps<"div">, "children" | "items" | "revision"> & {
|
|
33
|
+
/**
|
|
34
|
+
* The list as it stands right now. Each item carries its own status, so the agent
|
|
35
|
+
* can add, reorder, and complete items in any order between renders.
|
|
36
|
+
*/
|
|
37
|
+
items: readonly TodoItem[];
|
|
38
|
+
/** Which rewrite of the list this is. Omit to show a plain done/total count instead. */
|
|
39
|
+
revision?: number;
|
|
40
|
+
}): import("react").JSX.Element;
|
|
41
|
+
//#endregion
|
|
42
|
+
export { TodoItem, TodoList, TodoStatus };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mono } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { CheckIcon, Loader2Icon } from "lucide-react";
|
|
6
|
+
//#region src/elements/todo-list.tsx
|
|
7
|
+
/**
|
|
8
|
+
* The agent's own working list, rewritten mid-run as it discovers what else is needed.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { TodoList } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <TodoList
|
|
14
|
+
* items={[
|
|
15
|
+
* { id: "read", text: "Read the failing test", status: "done" },
|
|
16
|
+
* { id: "fix", text: "Fix the converter", status: "active" },
|
|
17
|
+
* { id: "verify", text: "Re-run the suite", status: "pending" },
|
|
18
|
+
* ]}
|
|
19
|
+
* revision={2}
|
|
20
|
+
* />
|
|
21
|
+
*/
|
|
22
|
+
function TodoList({ items, revision, className, ...props }) {
|
|
23
|
+
const done = items.filter((item) => item.status === "done").length;
|
|
24
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
25
|
+
"data-slot": "todo-list",
|
|
26
|
+
className: cn("flex w-full max-w-sm flex-col gap-3", className),
|
|
27
|
+
...props,
|
|
28
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
29
|
+
className: "flex items-baseline justify-between",
|
|
30
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
31
|
+
className: "text-(length:--cue-text-body) font-medium",
|
|
32
|
+
children: "Todos"
|
|
33
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
34
|
+
className: cn(mono, "text-fg-subtle tabular-nums"),
|
|
35
|
+
children: revision === void 0 ? `${done}/${items.length}` : `${done}/${items.length} · rev ${revision}`
|
|
36
|
+
})]
|
|
37
|
+
}), /* @__PURE__ */ jsx("ul", {
|
|
38
|
+
className: "flex flex-col gap-1",
|
|
39
|
+
children: items.map((item) => /* @__PURE__ */ jsxs("li", {
|
|
40
|
+
className: "cue-elements-fade-in cue-elements-slide-in-from-bottom-1 cue-elements-animate-in cue-elements-fill-mode-both flex items-start gap-2.5 py-0.5 text-(length:--cue-text-body) duration-300",
|
|
41
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
42
|
+
className: "flex size-4 h-5 shrink-0 items-center justify-center",
|
|
43
|
+
children: item.status === "done" ? /* @__PURE__ */ jsx("span", {
|
|
44
|
+
className: "border-border-strong bg-surface-2 flex size-3.5 items-center justify-center rounded-(--radius-control) border",
|
|
45
|
+
children: /* @__PURE__ */ jsx(CheckIcon, { className: "text-fg-muted size-2.5" })
|
|
46
|
+
}) : item.status === "active" ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-3.5 animate-spin text-stream motion-reduce:animate-none" }) : /* @__PURE__ */ jsx("span", {
|
|
47
|
+
"aria-hidden": true,
|
|
48
|
+
className: "border-border-strong size-3.5 rounded-(--radius-control) border"
|
|
49
|
+
})
|
|
50
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
51
|
+
className: cn("min-w-0 flex-1 leading-5 break-words", item.status === "done" && "text-fg-subtle line-through decoration-[1.5px]", item.status === "active" && "text-fg", item.status === "pending" && "text-fg-muted"),
|
|
52
|
+
children: item.text
|
|
53
|
+
})]
|
|
54
|
+
}, item.id))
|
|
55
|
+
})]
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { TodoList };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
//#region src/elements/tool-call.d.ts
|
|
2
|
+
interface ToolCallProps {
|
|
3
|
+
/** Tool name shown on the collapsed trigger row. */
|
|
4
|
+
label: string;
|
|
5
|
+
/** Verb shown with a shimmer while the tool is running, for example Searching the docs. */
|
|
6
|
+
activeLabel: string;
|
|
7
|
+
/** Short chip next to the label summarizing the call target. */
|
|
8
|
+
query: string;
|
|
9
|
+
/** Request payload shown inside the expanded disclosure. */
|
|
10
|
+
request: string;
|
|
11
|
+
/** Result payload shown once the call is no longer running. */
|
|
12
|
+
result: string;
|
|
13
|
+
/** When true a spinner replaces the success check on the trigger. */
|
|
14
|
+
running: boolean;
|
|
15
|
+
/** Whether the request and result panel is expanded. */
|
|
16
|
+
open: boolean;
|
|
17
|
+
/** Called when the user expands or collapses the call. */
|
|
18
|
+
onOpenChange: (open: boolean) => void;
|
|
19
|
+
/** Extra classes merged onto the root. */
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* One tool invocation with its request and result tucked behind a disclosure.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* import { ToolCall } from "@cueplusplus/ui/elements";
|
|
27
|
+
*
|
|
28
|
+
* <ToolCall
|
|
29
|
+
* label="Searched"
|
|
30
|
+
* activeLabel="Searching"
|
|
31
|
+
* query="composer props"
|
|
32
|
+
* request='{"q":"composer"}'
|
|
33
|
+
* result='{"hits":2}'
|
|
34
|
+
* running={false}
|
|
35
|
+
* open
|
|
36
|
+
* onOpenChange={setOpen}
|
|
37
|
+
* />
|
|
38
|
+
*/
|
|
39
|
+
declare function ToolCall({ label, activeLabel, query, request, result, running, open, onOpenChange, className }: ToolCallProps): import("react").JSX.Element;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { ToolCall, ToolCallProps };
|