@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,498 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { Chip } from "../primitives/chip.js";
|
|
4
|
+
import { IconButton } from "../primitives/icon-button.js";
|
|
5
|
+
import { Slider } from "../forms/slider.js";
|
|
6
|
+
import { usePrefersReducedMotion } from "../instruments/_motion.js";
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
//#region src/elements/replay.tsx
|
|
10
|
+
/** Every state, in the order a run normally passes through them. */
|
|
11
|
+
const REPLAY_STATES = [
|
|
12
|
+
"queued",
|
|
13
|
+
"thinking",
|
|
14
|
+
"tool-call",
|
|
15
|
+
"awaiting-approval",
|
|
16
|
+
"streaming",
|
|
17
|
+
"cancelled",
|
|
18
|
+
"done"
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* The slowest and fastest the transport will run.
|
|
22
|
+
*
|
|
23
|
+
* A rate of zero is a paused player that still burns a frame callback, and a
|
|
24
|
+
* negative one is a question nobody asked; both are clamped rather than
|
|
25
|
+
* rejected, because a rate arrives from a control, not from a contract.
|
|
26
|
+
*/
|
|
27
|
+
const MIN_RATE = .1;
|
|
28
|
+
const MAX_RATE = 8;
|
|
29
|
+
/** The rates the player's rate control cycles through when it is not given a list. */
|
|
30
|
+
const DEFAULT_RATES = [
|
|
31
|
+
1,
|
|
32
|
+
2,
|
|
33
|
+
4,
|
|
34
|
+
.5
|
|
35
|
+
];
|
|
36
|
+
/**
|
|
37
|
+
* One reading of the monotonic clock.
|
|
38
|
+
*
|
|
39
|
+
* `performance.now()` rather than `Date.now()`: it is monotonic by
|
|
40
|
+
* specification, it does not jump when the system clock is corrected, and it is
|
|
41
|
+
* what a media transport is measured against everywhere else. `Date.now()` is
|
|
42
|
+
* the fallback for a runtime without it, which in practice means an old
|
|
43
|
+
* non-browser environment — a server render never reaches this code at all.
|
|
44
|
+
*/
|
|
45
|
+
function now() {
|
|
46
|
+
return typeof performance !== "undefined" && typeof performance.now === "function" ? performance.now() : Date.now();
|
|
47
|
+
}
|
|
48
|
+
/** Where each frame starts on the script's own clock, in milliseconds. */
|
|
49
|
+
function startsOf(frames) {
|
|
50
|
+
const starts = [];
|
|
51
|
+
let at = 0;
|
|
52
|
+
for (const frame of frames) {
|
|
53
|
+
starts.push(at);
|
|
54
|
+
at += Math.max(0, frame.hold);
|
|
55
|
+
}
|
|
56
|
+
return starts;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The last frame whose start has passed — binary search over the offsets.
|
|
60
|
+
*
|
|
61
|
+
* "Last" rather than "the one whose span contains it" is what makes a
|
|
62
|
+
* zero-hold frame legal: playback steps straight over it while a scrub and a
|
|
63
|
+
* step can still land on it.
|
|
64
|
+
*/
|
|
65
|
+
function frameAt(starts, elapsed) {
|
|
66
|
+
let low = 0;
|
|
67
|
+
let high = starts.length - 1;
|
|
68
|
+
while (low < high) {
|
|
69
|
+
const middle = low + high + 1 >> 1;
|
|
70
|
+
if (starts[middle] <= elapsed) low = middle;
|
|
71
|
+
else high = middle - 1;
|
|
72
|
+
}
|
|
73
|
+
return Math.max(0, low);
|
|
74
|
+
}
|
|
75
|
+
/** Clamp an index into a script that may be empty. */
|
|
76
|
+
function clamp(value, last) {
|
|
77
|
+
if (!Number.isFinite(value)) return 0;
|
|
78
|
+
return Math.min(Math.max(Math.round(value), 0), Math.max(0, last));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* A filmstrip, a clock and a set of controls — without the controls.
|
|
82
|
+
*
|
|
83
|
+
* This is {@link ReplayPlayer} with its chrome removed, for a page that wants
|
|
84
|
+
* to draw its own transport (a state timeline, a keyboard shortcut, a play
|
|
85
|
+
* button somewhere else on the page) or to render the scene itself rather than
|
|
86
|
+
* from `frame.scene`.
|
|
87
|
+
*
|
|
88
|
+
* **One clock, not a chain of timeouts.** Every existing player in this
|
|
89
|
+
* repository schedules the next frame with `setTimeout(step, hold)`, which
|
|
90
|
+
* makes pause impossible: the time already spent inside the in-flight timeout
|
|
91
|
+
* is unrecoverable, so a resume can only start the hold again. Here the
|
|
92
|
+
* playhead is a number of *script* milliseconds and wall time reaches it
|
|
93
|
+
* through one origin — `base + (now() - origin) * rate` — so pausing is
|
|
94
|
+
* "write down the playhead", resuming is "take a new origin", and the unspent
|
|
95
|
+
* 380 ms of a 400 ms hold is still 380 ms on the other side of the pause. The
|
|
96
|
+
* same identity is what makes the rate multiplier exact rather than
|
|
97
|
+
* approximate, and what makes a seek and a play land on the same frame.
|
|
98
|
+
*
|
|
99
|
+
* **Reduced motion is a mode, not a fallback.** Under
|
|
100
|
+
* `prefers-reduced-motion: reduce` no frame is ever scheduled — not scheduled
|
|
101
|
+
* and hidden, not scheduled at speed, not scheduled at all — and the transport
|
|
102
|
+
* opens on the resting frame instead. Every control except play and rate keeps
|
|
103
|
+
* working, so a reader who has asked for stillness can still step through the
|
|
104
|
+
* run one frame at a time and read every state it passes through. That is
|
|
105
|
+
* strictly more than the two older players in this library offer, which show
|
|
106
|
+
* the end and stop.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* const { frame, index, playing, toggle, seek } = useReplay(SCRIPT);
|
|
110
|
+
* return <Thread messages={MESSAGES[index]!} onClick={toggle} />;
|
|
111
|
+
* @example
|
|
112
|
+
* // Deep-linked at a frame, paused, and half speed.
|
|
113
|
+
* const replay = useReplay(SCRIPT, { startAt: 17, autoPlay: false, rate: 0.5 });
|
|
114
|
+
*/
|
|
115
|
+
function useReplay(script, options = {}) {
|
|
116
|
+
const { autoPlay = true, startAt, rate: initialRate = 1 } = options;
|
|
117
|
+
const { frames } = script;
|
|
118
|
+
const count = frames.length;
|
|
119
|
+
const last = count - 1;
|
|
120
|
+
const starts = React.useMemo(() => startsOf(frames), [frames]);
|
|
121
|
+
const duration = starts[Math.max(0, last)] ?? 0;
|
|
122
|
+
const reduced = usePrefersReducedMotion();
|
|
123
|
+
const seat = clamp(startAt ?? 0, last);
|
|
124
|
+
const playable = count > 1 && duration > 0;
|
|
125
|
+
const [index, setIndex] = React.useState(() => seat);
|
|
126
|
+
const [playing, setPlaying] = React.useState(() => autoPlay && playable);
|
|
127
|
+
const [rate, setRateState] = React.useState(() => Math.min(MAX_RATE, Math.max(MIN_RATE, initialRate)));
|
|
128
|
+
const clock = React.useRef({
|
|
129
|
+
base: starts[seat] ?? 0,
|
|
130
|
+
origin: 0,
|
|
131
|
+
rate,
|
|
132
|
+
running: autoPlay && playable
|
|
133
|
+
});
|
|
134
|
+
/** The playhead right now, whether or not the clock is running. */
|
|
135
|
+
const elapsed = React.useCallback(() => {
|
|
136
|
+
const state = clock.current;
|
|
137
|
+
if (!state.running) return state.base;
|
|
138
|
+
return Math.min(duration, state.base + (now() - state.origin) * state.rate);
|
|
139
|
+
}, [duration]);
|
|
140
|
+
const seek = React.useCallback((to) => {
|
|
141
|
+
const next = clamp(to, last);
|
|
142
|
+
clock.current.base = starts[next] ?? 0;
|
|
143
|
+
clock.current.origin = now();
|
|
144
|
+
setIndex(next);
|
|
145
|
+
}, [last, starts]);
|
|
146
|
+
const pause = React.useCallback(() => {
|
|
147
|
+
const state = clock.current;
|
|
148
|
+
if (!state.running) return;
|
|
149
|
+
state.base = elapsed();
|
|
150
|
+
state.running = false;
|
|
151
|
+
setPlaying(false);
|
|
152
|
+
}, [elapsed]);
|
|
153
|
+
const play = React.useCallback(() => {
|
|
154
|
+
const state = clock.current;
|
|
155
|
+
if (state.running || !playable) return;
|
|
156
|
+
if (state.base >= duration) {
|
|
157
|
+
state.base = 0;
|
|
158
|
+
setIndex(0);
|
|
159
|
+
}
|
|
160
|
+
state.origin = now();
|
|
161
|
+
state.running = true;
|
|
162
|
+
setPlaying(true);
|
|
163
|
+
}, [duration, playable]);
|
|
164
|
+
const step = React.useCallback((delta = 1) => {
|
|
165
|
+
pause();
|
|
166
|
+
seek(index + delta);
|
|
167
|
+
}, [
|
|
168
|
+
index,
|
|
169
|
+
pause,
|
|
170
|
+
seek
|
|
171
|
+
]);
|
|
172
|
+
const restart = React.useCallback(() => {
|
|
173
|
+
seek(0);
|
|
174
|
+
if (!reduced && playable) {
|
|
175
|
+
clock.current.origin = now();
|
|
176
|
+
clock.current.running = true;
|
|
177
|
+
setPlaying(true);
|
|
178
|
+
}
|
|
179
|
+
}, [
|
|
180
|
+
playable,
|
|
181
|
+
reduced,
|
|
182
|
+
seek
|
|
183
|
+
]);
|
|
184
|
+
const setRate = React.useCallback((next) => {
|
|
185
|
+
const state = clock.current;
|
|
186
|
+
const clamped = Math.min(MAX_RATE, Math.max(MIN_RATE, next));
|
|
187
|
+
state.base = elapsed();
|
|
188
|
+
state.origin = now();
|
|
189
|
+
state.rate = clamped;
|
|
190
|
+
setRateState(clamped);
|
|
191
|
+
}, [elapsed]);
|
|
192
|
+
const toggle = React.useCallback(() => {
|
|
193
|
+
if (clock.current.running) pause();
|
|
194
|
+
else play();
|
|
195
|
+
}, [pause, play]);
|
|
196
|
+
const prior = React.useRef({
|
|
197
|
+
script,
|
|
198
|
+
seat
|
|
199
|
+
});
|
|
200
|
+
React.useEffect(() => {
|
|
201
|
+
if (prior.current.script === script && prior.current.seat === seat) return;
|
|
202
|
+
const fresh = prior.current.script !== script;
|
|
203
|
+
prior.current = {
|
|
204
|
+
script,
|
|
205
|
+
seat
|
|
206
|
+
};
|
|
207
|
+
const next = fresh && reduced && startAt === void 0 ? Math.max(0, last) : clamp(seat, last);
|
|
208
|
+
clock.current.base = (fresh && reduced && startAt === void 0 ? duration : starts[next]) ?? 0;
|
|
209
|
+
clock.current.origin = now();
|
|
210
|
+
setIndex(next);
|
|
211
|
+
if (fresh) {
|
|
212
|
+
const running = autoPlay && playable && !reduced;
|
|
213
|
+
clock.current.running = running;
|
|
214
|
+
setPlaying(running);
|
|
215
|
+
}
|
|
216
|
+
}, [
|
|
217
|
+
autoPlay,
|
|
218
|
+
duration,
|
|
219
|
+
last,
|
|
220
|
+
playable,
|
|
221
|
+
reduced,
|
|
222
|
+
script,
|
|
223
|
+
seat,
|
|
224
|
+
starts,
|
|
225
|
+
startAt
|
|
226
|
+
]);
|
|
227
|
+
React.useEffect(() => {
|
|
228
|
+
if (!reduced) return;
|
|
229
|
+
clock.current.running = false;
|
|
230
|
+
setPlaying(false);
|
|
231
|
+
if (startAt === void 0 && count > 0) {
|
|
232
|
+
clock.current.base = duration;
|
|
233
|
+
setIndex(count - 1);
|
|
234
|
+
}
|
|
235
|
+
}, [
|
|
236
|
+
count,
|
|
237
|
+
duration,
|
|
238
|
+
reduced,
|
|
239
|
+
startAt
|
|
240
|
+
]);
|
|
241
|
+
React.useEffect(() => {
|
|
242
|
+
if (!playing || reduced || duration <= 0) return;
|
|
243
|
+
if (typeof requestAnimationFrame !== "function") return;
|
|
244
|
+
clock.current.origin = now();
|
|
245
|
+
let frameId = requestAnimationFrame(function tick() {
|
|
246
|
+
const at = clock.current.base + (now() - clock.current.origin) * clock.current.rate;
|
|
247
|
+
if (at >= duration) {
|
|
248
|
+
clock.current.base = duration;
|
|
249
|
+
clock.current.running = false;
|
|
250
|
+
setIndex(Math.max(0, last));
|
|
251
|
+
setPlaying(false);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
setIndex(frameAt(starts, at));
|
|
255
|
+
frameId = requestAnimationFrame(tick);
|
|
256
|
+
});
|
|
257
|
+
return () => cancelAnimationFrame(frameId);
|
|
258
|
+
}, [
|
|
259
|
+
duration,
|
|
260
|
+
last,
|
|
261
|
+
playing,
|
|
262
|
+
reduced,
|
|
263
|
+
starts
|
|
264
|
+
]);
|
|
265
|
+
const frame = frames[index];
|
|
266
|
+
return {
|
|
267
|
+
frame,
|
|
268
|
+
index,
|
|
269
|
+
count,
|
|
270
|
+
duration,
|
|
271
|
+
state: frame?.label ?? "queued",
|
|
272
|
+
playing,
|
|
273
|
+
reduced,
|
|
274
|
+
rate,
|
|
275
|
+
play,
|
|
276
|
+
pause,
|
|
277
|
+
toggle,
|
|
278
|
+
step,
|
|
279
|
+
seek,
|
|
280
|
+
restart,
|
|
281
|
+
setRate
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* The five transport glyphs, drawn here.
|
|
286
|
+
*
|
|
287
|
+
* `lucide-react` is an optional peer of `./elements` and this subpath has none
|
|
288
|
+
* at all: a player is chrome, and chrome that drags an icon set in behind it is
|
|
289
|
+
* a dependency nobody chose. Five paths at 16px cost less than the import line.
|
|
290
|
+
*/
|
|
291
|
+
function Glyph({ children, ...props }) {
|
|
292
|
+
return /* @__PURE__ */ jsx("svg", {
|
|
293
|
+
viewBox: "0 0 16 16",
|
|
294
|
+
fill: "none",
|
|
295
|
+
stroke: "currentColor",
|
|
296
|
+
strokeWidth: "1.4",
|
|
297
|
+
strokeLinecap: "round",
|
|
298
|
+
strokeLinejoin: "round",
|
|
299
|
+
...props,
|
|
300
|
+
children
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
const PlayGlyph = (props) => /* @__PURE__ */ jsx(Glyph, {
|
|
304
|
+
...props,
|
|
305
|
+
children: /* @__PURE__ */ jsx("path", {
|
|
306
|
+
d: "M5 3.2 12.6 8 5 12.8Z",
|
|
307
|
+
fill: "currentColor",
|
|
308
|
+
stroke: "none"
|
|
309
|
+
})
|
|
310
|
+
});
|
|
311
|
+
const PauseGlyph = (props) => /* @__PURE__ */ jsx(Glyph, {
|
|
312
|
+
...props,
|
|
313
|
+
children: /* @__PURE__ */ jsx("path", { d: "M5.5 3.5v9M10.5 3.5v9" })
|
|
314
|
+
});
|
|
315
|
+
const StepBackGlyph = (props) => /* @__PURE__ */ jsxs(Glyph, {
|
|
316
|
+
...props,
|
|
317
|
+
children: [/* @__PURE__ */ jsx("path", { d: "M4 3.5v9" }), /* @__PURE__ */ jsx("path", {
|
|
318
|
+
d: "M12 3.7 5.8 8 12 12.3Z",
|
|
319
|
+
fill: "currentColor",
|
|
320
|
+
stroke: "none"
|
|
321
|
+
})]
|
|
322
|
+
});
|
|
323
|
+
const StepForwardGlyph = (props) => /* @__PURE__ */ jsxs(Glyph, {
|
|
324
|
+
...props,
|
|
325
|
+
children: [/* @__PURE__ */ jsx("path", { d: "M12 3.5v9" }), /* @__PURE__ */ jsx("path", {
|
|
326
|
+
d: "M4 3.7 10.2 8 4 12.3Z",
|
|
327
|
+
fill: "currentColor",
|
|
328
|
+
stroke: "none"
|
|
329
|
+
})]
|
|
330
|
+
});
|
|
331
|
+
const RestartGlyph = (props) => /* @__PURE__ */ jsxs(Glyph, {
|
|
332
|
+
...props,
|
|
333
|
+
children: [/* @__PURE__ */ jsx("path", { d: "M13 8a5 5 0 1 1-1.6-3.7" }), /* @__PURE__ */ jsx("path", { d: "M13 2.6V5.4h-2.8" })]
|
|
334
|
+
});
|
|
335
|
+
/**
|
|
336
|
+
* The tone each state speaks in.
|
|
337
|
+
*
|
|
338
|
+
* Six of the seven take a tone from the shared status vocabulary, so a replay
|
|
339
|
+
* chip, a `StatusDot` and a `Meter` agree about what "warn" looks like.
|
|
340
|
+
* `streaming` is the seventh and takes `--cue-stream` instead — the hue this
|
|
341
|
+
* family added to the token contract for exactly one meaning, "text is arriving
|
|
342
|
+
* right now" — because none of the seven tones means that.
|
|
343
|
+
*/
|
|
344
|
+
const STATE_TONES = {
|
|
345
|
+
queued: "neutral",
|
|
346
|
+
thinking: "busy",
|
|
347
|
+
"tool-call": "accent",
|
|
348
|
+
"awaiting-approval": "warn",
|
|
349
|
+
streaming: "neutral",
|
|
350
|
+
cancelled: "danger",
|
|
351
|
+
done: "ok"
|
|
352
|
+
};
|
|
353
|
+
/** How the state chip is painted when its tone is not enough — the streaming hue. */
|
|
354
|
+
const STREAM_CLASS = "border-stream/35 text-stream";
|
|
355
|
+
/**
|
|
356
|
+
* A scripted run, with a transport: play, pause, step, scrub, restart, rate.
|
|
357
|
+
*
|
|
358
|
+
* The player is a controller over a filmstrip rather than an animation of its
|
|
359
|
+
* own. Every frame of a {@link ReplayScript} carries the whole scene, so the
|
|
360
|
+
* component's entire rendering rule is `frames[index].scene` — which is what
|
|
361
|
+
* makes the position controls honest: frame 12 reached by scrubbing is the same
|
|
362
|
+
* DOM as frame 12 reached by watching, because there is no accumulated state
|
|
363
|
+
* for the two paths to disagree about.
|
|
364
|
+
*
|
|
365
|
+
* The transport is assembled from shipped cue components — `IconButton`s, a
|
|
366
|
+
* `Slider` for the scrubber, a `Chip` for the state — and painted with cue's
|
|
367
|
+
* own metrics even when the scene inside it is an `AgentSurface` island at
|
|
368
|
+
* upstream fidelity. That is deliberate: the chrome belongs to the console
|
|
369
|
+
* showing the run, not to the run.
|
|
370
|
+
*
|
|
371
|
+
* The playback state is legible from outside, the way `TerminalFrame` publishes
|
|
372
|
+
* `data-simulating`: `data-replay-state` carries the current frame's authored
|
|
373
|
+
* label, `data-replay-playing` says whether the clock is running, and
|
|
374
|
+
* `data-replay-frame` is the index — enough for a stylesheet, a screenshot
|
|
375
|
+
* harness or a test to say "show me the awaiting-approval frame" without
|
|
376
|
+
* reaching into React.
|
|
377
|
+
*
|
|
378
|
+
* Under `prefers-reduced-motion: reduce` the player opens on the resting frame
|
|
379
|
+
* and schedules nothing, but the step and scrub controls keep working: play and
|
|
380
|
+
* rate are the only two affordances that go away, because they are the only two
|
|
381
|
+
* that mean "move on their own".
|
|
382
|
+
*
|
|
383
|
+
* @example
|
|
384
|
+
* const SCRIPT: ReplayScript = {
|
|
385
|
+
* title: "Patching universe 3",
|
|
386
|
+
* frames: [
|
|
387
|
+
* { scene: <ToolCall label="Reading the plot" running />, hold: 600, label: "tool-call" },
|
|
388
|
+
* { scene: <StreamingText segments={ANSWER} />, hold: 400, label: "streaming" },
|
|
389
|
+
* { scene: <StreamingText segments={ANSWER} settled />, hold: 0, label: "done" },
|
|
390
|
+
* ],
|
|
391
|
+
* };
|
|
392
|
+
* <ReplayPlayer script={SCRIPT} />
|
|
393
|
+
* @example
|
|
394
|
+
* // Opened at a frame from the URL, paused, at half speed.
|
|
395
|
+
* <ReplayPlayer script={SCRIPT} startAt={17} autoPlay={false} rate={0.5} />
|
|
396
|
+
*/
|
|
397
|
+
const ReplayPlayer = React.forwardRef(function ReplayPlayer({ className, script, autoPlay = true, startAt, rate: initialRate = 1, rates = DEFAULT_RATES, label, ...elementProps }, ref) {
|
|
398
|
+
const replay = useReplay(script, {
|
|
399
|
+
autoPlay,
|
|
400
|
+
startAt,
|
|
401
|
+
rate: initialRate
|
|
402
|
+
});
|
|
403
|
+
const { count, duration, frame, index, playing, rate, reduced, state } = replay;
|
|
404
|
+
const last = Math.max(0, count - 1);
|
|
405
|
+
const name = label ?? script.title ?? "Replay";
|
|
406
|
+
const cycleRate = () => {
|
|
407
|
+
const ladder = rates.length > 0 ? rates : DEFAULT_RATES;
|
|
408
|
+
const at = ladder.indexOf(rate);
|
|
409
|
+
replay.setRate(ladder[(at + 1) % ladder.length] ?? 1);
|
|
410
|
+
};
|
|
411
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
412
|
+
ref,
|
|
413
|
+
"data-slot": "replay-player",
|
|
414
|
+
"data-replay-state": count === 0 ? void 0 : state,
|
|
415
|
+
"data-replay-playing": String(playing),
|
|
416
|
+
"data-replay-frame": String(index),
|
|
417
|
+
className: cn("flex min-w-0 flex-col gap-(--cue-space-4)", className),
|
|
418
|
+
...elementProps,
|
|
419
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
420
|
+
"data-slot": "replay-stage",
|
|
421
|
+
className: "min-w-0",
|
|
422
|
+
children: frame?.scene
|
|
423
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
424
|
+
"data-slot": "replay-transport",
|
|
425
|
+
role: "group",
|
|
426
|
+
"aria-label": name,
|
|
427
|
+
className: "flex flex-wrap items-center gap-(--cue-space-3) border-t border-border pt-(--cue-space-3)",
|
|
428
|
+
children: [
|
|
429
|
+
/* @__PURE__ */ jsx(IconButton, {
|
|
430
|
+
"aria-label": "Restart",
|
|
431
|
+
icon: RestartGlyph,
|
|
432
|
+
size: "sm",
|
|
433
|
+
onClick: replay.restart,
|
|
434
|
+
disabled: count === 0
|
|
435
|
+
}),
|
|
436
|
+
/* @__PURE__ */ jsx(IconButton, {
|
|
437
|
+
"aria-label": "Previous frame",
|
|
438
|
+
icon: StepBackGlyph,
|
|
439
|
+
size: "sm",
|
|
440
|
+
onClick: () => replay.step(-1),
|
|
441
|
+
disabled: index === 0
|
|
442
|
+
}),
|
|
443
|
+
reduced ? null : /* @__PURE__ */ jsx(IconButton, {
|
|
444
|
+
"aria-label": playing ? "Pause" : "Play",
|
|
445
|
+
icon: playing ? PauseGlyph : PlayGlyph,
|
|
446
|
+
size: "sm",
|
|
447
|
+
variant: "outline",
|
|
448
|
+
onClick: replay.toggle,
|
|
449
|
+
disabled: count < 2 || duration <= 0
|
|
450
|
+
}),
|
|
451
|
+
/* @__PURE__ */ jsx(IconButton, {
|
|
452
|
+
"aria-label": "Next frame",
|
|
453
|
+
icon: StepForwardGlyph,
|
|
454
|
+
size: "sm",
|
|
455
|
+
onClick: () => replay.step(1),
|
|
456
|
+
disabled: index >= last
|
|
457
|
+
}),
|
|
458
|
+
/* @__PURE__ */ jsx(Slider, {
|
|
459
|
+
"aria-label": "Frame",
|
|
460
|
+
className: "min-w-[8rem] flex-1",
|
|
461
|
+
min: 0,
|
|
462
|
+
max: last,
|
|
463
|
+
step: 1,
|
|
464
|
+
value: index,
|
|
465
|
+
disabled: count < 2,
|
|
466
|
+
onValueChange: (next) => replay.seek(typeof next === "number" ? next : next[0] ?? 0)
|
|
467
|
+
}),
|
|
468
|
+
/* @__PURE__ */ jsx("span", {
|
|
469
|
+
"data-slot": "replay-position",
|
|
470
|
+
className: "font-mono text-(length:--cue-text-label) tabular-nums text-fg-muted",
|
|
471
|
+
children: count === 0 ? "0 / 0" : `${index + 1} / ${count}`
|
|
472
|
+
}),
|
|
473
|
+
/* @__PURE__ */ jsx(Chip, {
|
|
474
|
+
"data-slot": "replay-state",
|
|
475
|
+
variant: "tag",
|
|
476
|
+
tone: STATE_TONES[state],
|
|
477
|
+
className: state === "streaming" ? STREAM_CLASS : void 0,
|
|
478
|
+
children: state
|
|
479
|
+
}),
|
|
480
|
+
reduced ? null : /* @__PURE__ */ jsxs(Chip, {
|
|
481
|
+
"data-slot": "replay-rate",
|
|
482
|
+
variant: "tag",
|
|
483
|
+
interactive: true,
|
|
484
|
+
"aria-label": `Playback rate, ${rate}×`,
|
|
485
|
+
onClick: cycleRate,
|
|
486
|
+
children: [rate, "×"]
|
|
487
|
+
}),
|
|
488
|
+
frame?.caption === void 0 ? null : /* @__PURE__ */ jsx("span", {
|
|
489
|
+
"data-slot": "replay-caption",
|
|
490
|
+
className: "min-w-0 basis-full truncate font-mono text-(length:--cue-text-label) text-fg-muted",
|
|
491
|
+
children: frame.caption
|
|
492
|
+
})
|
|
493
|
+
]
|
|
494
|
+
})]
|
|
495
|
+
});
|
|
496
|
+
});
|
|
497
|
+
//#endregion
|
|
498
|
+
export { REPLAY_STATES, ReplayPlayer, useReplay };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/research-report.d.ts
|
|
3
|
+
/** Where one section of the report stands: `pending`, `writing`, or `done`. */
|
|
4
|
+
type SectionState = "pending" | "writing" | "done";
|
|
5
|
+
/** One heading of the outline, with its state and the sources behind it. */
|
|
6
|
+
interface ReportSection {
|
|
7
|
+
/** Stable identity for the row key. */
|
|
8
|
+
id: string;
|
|
9
|
+
/** Section title, shown before any prose exists. */
|
|
10
|
+
heading: string;
|
|
11
|
+
/** Only one section is usually writing; pending sections stay visible but dim. */
|
|
12
|
+
state: SectionState;
|
|
13
|
+
/** How many sources back this section. Hidden at zero. */
|
|
14
|
+
sources: number;
|
|
15
|
+
/** First lines of the written section, shown once there is something to show. */
|
|
16
|
+
preview?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* An outline that fills in section by section, each carrying the sources behind it.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* import { ResearchReport } from "@cueplusplus/ui/elements";
|
|
23
|
+
*
|
|
24
|
+
* <ResearchReport title="Draft ownership in 0.14" sections={sections} sourcesRead={12} />
|
|
25
|
+
*/
|
|
26
|
+
declare function ResearchReport({ title, sections, sourcesRead, className, ...props }: Omit<ComponentProps<"div">, "children" | "title" | "sections" | "sourcesRead"> & {
|
|
27
|
+
/** What the report is about. */
|
|
28
|
+
title: string;
|
|
29
|
+
/**
|
|
30
|
+
* The outline. It exists from the start and fills in, so the shape is legible before
|
|
31
|
+
* the prose lands.
|
|
32
|
+
*/
|
|
33
|
+
sections: readonly ReportSection[];
|
|
34
|
+
/** Running count of sources consumed. */
|
|
35
|
+
sourcesRead: number;
|
|
36
|
+
}): import("react").JSX.Element;
|
|
37
|
+
//#endregion
|
|
38
|
+
export { ReportSection, ResearchReport, SectionState };
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn } from "../lib/cn.js";
|
|
3
|
+
import { mono, paper } from "./surfaces.js";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { CheckIcon, Loader2Icon } from "lucide-react";
|
|
6
|
+
//#region src/elements/research-report.tsx
|
|
7
|
+
/**
|
|
8
|
+
* An outline that fills in section by section, each carrying the sources behind it.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* import { ResearchReport } from "@cueplusplus/ui/elements";
|
|
12
|
+
*
|
|
13
|
+
* <ResearchReport title="Draft ownership in 0.14" sections={sections} sourcesRead={12} />
|
|
14
|
+
*/
|
|
15
|
+
function ResearchReport({ title, sections, sourcesRead, className, ...props }) {
|
|
16
|
+
const done = sections.filter((section) => section.state === "done").length;
|
|
17
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
18
|
+
"data-slot": "research-report",
|
|
19
|
+
className: cn(paper, "flex w-full max-w-sm flex-col gap-3 rounded-(--radius-overlay) p-4", className),
|
|
20
|
+
...props,
|
|
21
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
22
|
+
className: "flex flex-col gap-1",
|
|
23
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
24
|
+
className: "text-(length:--cue-text-body) font-medium",
|
|
25
|
+
children: title
|
|
26
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
27
|
+
className: cn(mono, "text-fg-subtle tabular-nums"),
|
|
28
|
+
children: [
|
|
29
|
+
done,
|
|
30
|
+
"/",
|
|
31
|
+
sections.length,
|
|
32
|
+
" sections · ",
|
|
33
|
+
sourcesRead,
|
|
34
|
+
" sources read"
|
|
35
|
+
]
|
|
36
|
+
})]
|
|
37
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
38
|
+
className: "flex flex-col",
|
|
39
|
+
children: sections.map((section) => /* @__PURE__ */ jsxs("div", {
|
|
40
|
+
className: "border-border flex flex-col gap-1 border-t py-2 first:border-t-0 first:pt-0",
|
|
41
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
42
|
+
className: "flex items-center gap-2",
|
|
43
|
+
children: [
|
|
44
|
+
/* @__PURE__ */ jsx("span", {
|
|
45
|
+
className: "flex size-3.5 shrink-0 items-center justify-center",
|
|
46
|
+
children: section.state === "done" ? /* @__PURE__ */ jsx(CheckIcon, { className: "text-fg-subtle size-3" }) : section.state === "writing" ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-3 animate-spin text-stream motion-reduce:animate-none" }) : /* @__PURE__ */ jsx("span", {
|
|
47
|
+
"aria-hidden": true,
|
|
48
|
+
className: "bg-surface-3 size-1.5 rounded-full"
|
|
49
|
+
})
|
|
50
|
+
}),
|
|
51
|
+
/* @__PURE__ */ jsx("span", {
|
|
52
|
+
className: cn("min-w-0 flex-1 truncate text-(length:--cue-text-body)", section.state === "pending" ? "text-fg-subtle" : "text-fg-muted"),
|
|
53
|
+
children: section.heading
|
|
54
|
+
}),
|
|
55
|
+
section.sources > 0 && /* @__PURE__ */ jsxs("span", {
|
|
56
|
+
className: cn("font-mono text-(length:--cue-text-label) tracking-tight", "text-fg-subtle shrink-0"),
|
|
57
|
+
children: [section.sources, " src"]
|
|
58
|
+
})
|
|
59
|
+
]
|
|
60
|
+
}), section.preview && /* @__PURE__ */ jsx("p", {
|
|
61
|
+
className: "text-fg-muted cue-elements-fade-in cue-elements-animate-in ps-5.5 text-(length:--cue-text-ui) leading-relaxed duration-300",
|
|
62
|
+
children: section.preview
|
|
63
|
+
})]
|
|
64
|
+
}, section.id))
|
|
65
|
+
})]
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
export { ResearchReport };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { ComponentProps } from "react";
|
|
2
|
+
//#region src/elements/retrieval-chunks.d.ts
|
|
3
|
+
/** One retrieved passage: where it came from, what it says, and how well it scored. */
|
|
4
|
+
interface RetrievalChunk {
|
|
5
|
+
/** Stable identity for the list key. */
|
|
6
|
+
id: string;
|
|
7
|
+
/** Where the passage came from: a file, a document, a record. */
|
|
8
|
+
source: string;
|
|
9
|
+
/** Where inside the source the passage sits: a section, a line range, a page. */
|
|
10
|
+
locator: string;
|
|
11
|
+
/**
|
|
12
|
+
* Similarity from 0 to 1. Drives both the printed value and the bar, and turns green
|
|
13
|
+
* at 0.8.
|
|
14
|
+
*/
|
|
15
|
+
score: number;
|
|
16
|
+
/** The passage itself, clamped to two lines. */
|
|
17
|
+
text: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The passages a retrieval answer stands on, scored, before the answer itself arrives.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* import { RetrievalChunks } from "@cueplusplus/ui/elements";
|
|
24
|
+
*
|
|
25
|
+
* <RetrievalChunks
|
|
26
|
+
* query="how does draft restore work"
|
|
27
|
+
* chunks={chunks}
|
|
28
|
+
* visibleCount={3}
|
|
29
|
+
* searching={false}
|
|
30
|
+
* />
|
|
31
|
+
*/
|
|
32
|
+
declare function RetrievalChunks({ query, chunks, visibleCount, searching, className, ...props }: Omit<ComponentProps<"div">, "children" | "query" | "chunks" | "visibleCount" | "searching"> & {
|
|
33
|
+
/** The text that was embedded and searched. */
|
|
34
|
+
query: string;
|
|
35
|
+
/** Passages returned above the threshold, already sorted by score. */
|
|
36
|
+
chunks: readonly RetrievalChunk[];
|
|
37
|
+
/** How many passages have landed so far. */
|
|
38
|
+
visibleCount: number;
|
|
39
|
+
/** Shimmers the status line while the index is still being queried. */
|
|
40
|
+
searching: boolean;
|
|
41
|
+
}): import("react").JSX.Element;
|
|
42
|
+
//#endregion
|
|
43
|
+
export { RetrievalChunk, RetrievalChunks };
|