@nadicodeai/ui 0.1.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/AGENTS.md +114 -0
- package/README.md +211 -0
- package/dist/ai-elements.d.ts +49 -0
- package/dist/ai-elements.d.ts.map +1 -0
- package/dist/ai-elements.js +48 -0
- package/dist/components/accordion.d.ts +8 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +18 -0
- package/dist/components/action-band.d.ts +10 -0
- package/dist/components/action-band.d.ts.map +1 -0
- package/dist/components/action-band.js +33 -0
- package/dist/components/agent-chat.d.ts +20 -0
- package/dist/components/agent-chat.d.ts.map +1 -0
- package/dist/components/agent-chat.js +10 -0
- package/dist/components/agent-composer.d.ts +56 -0
- package/dist/components/agent-composer.d.ts.map +1 -0
- package/dist/components/agent-composer.js +60 -0
- package/dist/components/agent-message.d.ts +116 -0
- package/dist/components/agent-message.d.ts.map +1 -0
- package/dist/components/agent-message.js +110 -0
- package/dist/components/agent-thread.d.ts +26 -0
- package/dist/components/agent-thread.d.ts.map +1 -0
- package/dist/components/agent-thread.js +72 -0
- package/dist/components/agent-tool-approval.d.ts +32 -0
- package/dist/components/agent-tool-approval.d.ts.map +1 -0
- package/dist/components/agent-tool-approval.js +61 -0
- package/dist/components/ai-elements/agent.d.ts +27 -0
- package/dist/components/ai-elements/agent.d.ts.map +1 -0
- package/dist/components/ai-elements/agent.js +27 -0
- package/dist/components/ai-elements/artifact.d.ts +24 -0
- package/dist/components/ai-elements/artifact.d.ts.map +1 -0
- package/dist/components/ai-elements/artifact.js +20 -0
- package/dist/components/ai-elements/attachments.d.ts +55 -0
- package/dist/components/ai-elements/attachments.d.ts.map +1 -0
- package/dist/components/ai-elements/attachments.js +125 -0
- package/dist/components/ai-elements/audio-player.d.ts +30 -0
- package/dist/components/ai-elements/audio-player.d.ts.map +1 -0
- package/dist/components/ai-elements/audio-player.js +43 -0
- package/dist/components/ai-elements/canvas.d.ts +8 -0
- package/dist/components/ai-elements/canvas.d.ts.map +1 -0
- package/dist/components/ai-elements/canvas.js +5 -0
- package/dist/components/ai-elements/chain-of-thought.d.ts +30 -0
- package/dist/components/ai-elements/chain-of-thought.d.ts.map +1 -0
- package/dist/components/ai-elements/chain-of-thought.js +49 -0
- package/dist/components/ai-elements/checkpoint.d.ts +12 -0
- package/dist/components/ai-elements/checkpoint.d.ts.map +1 -0
- package/dist/components/ai-elements/checkpoint.js +10 -0
- package/dist/components/ai-elements/code-block.d.ts +46 -0
- package/dist/components/ai-elements/code-block.d.ts.map +1 -0
- package/dist/components/ai-elements/code-block.js +207 -0
- package/dist/components/ai-elements/commit.d.ts +65 -0
- package/dist/components/ai-elements/commit.d.ts.map +1 -0
- package/dist/components/ai-elements/commit.js +95 -0
- package/dist/components/ai-elements/confirmation.d.ts +50 -0
- package/dist/components/ai-elements/confirmation.d.ts.map +1 -0
- package/dist/components/ai-elements/confirmation.js +61 -0
- package/dist/components/ai-elements/connection.d.ts +6 -0
- package/dist/components/ai-elements/connection.d.ts.map +1 -0
- package/dist/components/ai-elements/connection.js +10 -0
- package/dist/components/ai-elements/context.d.ts +33 -0
- package/dist/components/ai-elements/context.d.ts.map +1 -0
- package/dist/components/ai-elements/context.js +164 -0
- package/dist/components/ai-elements/controls.d.ts +5 -0
- package/dist/components/ai-elements/controls.d.ts.map +1 -0
- package/dist/components/ai-elements/controls.js +5 -0
- package/dist/components/ai-elements/conversation.d.ts +24 -0
- package/dist/components/ai-elements/conversation.d.ts.map +1 -0
- package/dist/components/ai-elements/conversation.js +41 -0
- package/dist/components/ai-elements/edge.d.ts +6 -0
- package/dist/components/ai-elements/edge.d.ts.map +1 -0
- package/dist/components/ai-elements/edge.js +88 -0
- package/dist/components/ai-elements/environment-variables.d.ts +39 -0
- package/dist/components/ai-elements/environment-variables.d.ts.map +1 -0
- package/dist/components/ai-elements/environment-variables.js +87 -0
- package/dist/components/ai-elements/file-tree.d.ts +27 -0
- package/dist/components/ai-elements/file-tree.d.ts.map +1 -0
- package/dist/components/ai-elements/file-tree.js +71 -0
- package/dist/components/ai-elements/image.d.ts +7 -0
- package/dist/components/ai-elements/image.d.ts.map +1 -0
- package/dist/components/ai-elements/image.js +3 -0
- package/dist/components/ai-elements/inline-citation.d.ts +39 -0
- package/dist/components/ai-elements/inline-citation.d.ts.map +1 -0
- package/dist/components/ai-elements/inline-citation.js +86 -0
- package/dist/components/ai-elements/jsx-preview.d.ts +30 -0
- package/dist/components/ai-elements/jsx-preview.d.ts.map +1 -0
- package/dist/components/ai-elements/jsx-preview.js +168 -0
- package/dist/components/ai-elements/message.d.ts +38 -0
- package/dist/components/ai-elements/message.d.ts.map +1 -0
- package/dist/components/ai-elements/message.js +92 -0
- package/dist/components/ai-elements/mic-selector.d.ts +46 -0
- package/dist/components/ai-elements/mic-selector.d.ts.map +1 -0
- package/dist/components/ai-elements/mic-selector.js +184 -0
- package/dist/components/ai-elements/model-selector.d.ts +36 -0
- package/dist/components/ai-elements/model-selector.d.ts.map +1 -0
- package/dist/components/ai-elements/model-selector.js +18 -0
- package/dist/components/ai-elements/node.d.ts +22 -0
- package/dist/components/ai-elements/node.d.ts.map +1 -0
- package/dist/components/ai-elements/node.js +12 -0
- package/dist/components/ai-elements/open-in-chat.d.ts +29 -0
- package/dist/components/ai-elements/open-in-chat.d.ts.map +1 -0
- package/dist/components/ai-elements/open-in-chat.js +100 -0
- package/dist/components/ai-elements/package-info.d.ts +30 -0
- package/dist/components/ai-elements/package-info.d.ts.map +1 -0
- package/dist/components/ai-elements/package-info.js +50 -0
- package/dist/components/ai-elements/panel.d.ts +6 -0
- package/dist/components/ai-elements/panel.d.ts.map +1 -0
- package/dist/components/ai-elements/panel.js +5 -0
- package/dist/components/ai-elements/persona.d.ts +49 -0
- package/dist/components/ai-elements/persona.d.ts.map +1 -0
- package/dist/components/ai-elements/persona.js +176 -0
- package/dist/components/ai-elements/plan.d.ts +26 -0
- package/dist/components/ai-elements/plan.d.ts.map +1 -0
- package/dist/components/ai-elements/plan.js +34 -0
- package/dist/components/ai-elements/prompt-input.d.ts +149 -0
- package/dist/components/ai-elements/prompt-input.d.ts.map +1 -0
- package/dist/components/ai-elements/prompt-input.js +715 -0
- package/dist/components/ai-elements/queue.d.ts +62 -0
- package/dist/components/ai-elements/queue.d.ts.map +1 -0
- package/dist/components/ai-elements/queue.js +28 -0
- package/dist/components/ai-elements/reasoning.d.ts +27 -0
- package/dist/components/ai-elements/reasoning.d.ts.map +1 -0
- package/dist/components/ai-elements/reasoning.js +95 -0
- package/dist/components/ai-elements/sandbox.d.ts +25 -0
- package/dist/components/ai-elements/sandbox.d.ts.map +1 -0
- package/dist/components/ai-elements/sandbox.js +15 -0
- package/dist/components/ai-elements/schema-display.d.ts +56 -0
- package/dist/components/ai-elements/schema-display.d.ts.map +1 -0
- package/dist/components/ai-elements/schema-display.js +90 -0
- package/dist/components/ai-elements/shimmer.d.ts +10 -0
- package/dist/components/ai-elements/shimmer.d.ts.map +1 -0
- package/dist/components/ai-elements/shimmer.js +28 -0
- package/dist/components/ai-elements/snippet.d.ts +19 -0
- package/dist/components/ai-elements/snippet.d.ts.map +1 -0
- package/dist/components/ai-elements/snippet.js +46 -0
- package/dist/components/ai-elements/sources.d.ts +13 -0
- package/dist/components/ai-elements/sources.d.ts.map +1 -0
- package/dist/components/ai-elements/sources.js +9 -0
- package/dist/components/ai-elements/speech-input.d.ts +55 -0
- package/dist/components/ai-elements/speech-input.d.ts.map +1 -0
- package/dist/components/ai-elements/speech-input.js +187 -0
- package/dist/components/ai-elements/stack-trace.d.ts +38 -0
- package/dist/components/ai-elements/stack-trace.d.ts.map +1 -0
- package/dist/components/ai-elements/stack-trace.js +194 -0
- package/dist/components/ai-elements/suggestion.d.ts +11 -0
- package/dist/components/ai-elements/suggestion.d.ts.map +1 -0
- package/dist/components/ai-elements/suggestion.js +13 -0
- package/dist/components/ai-elements/task.d.ts +15 -0
- package/dist/components/ai-elements/task.d.ts.map +1 -0
- package/dist/components/ai-elements/task.js +10 -0
- package/dist/components/ai-elements/terminal.d.ts +28 -0
- package/dist/components/ai-elements/terminal.d.ts.map +1 -0
- package/dist/components/ai-elements/terminal.js +68 -0
- package/dist/components/ai-elements/test-results.d.ts +59 -0
- package/dist/components/ai-elements/test-results.d.ts.map +1 -0
- package/dist/components/ai-elements/test-results.js +98 -0
- package/dist/components/ai-elements/tool.d.ts +32 -0
- package/dist/components/ai-elements/tool.d.ts.map +1 -0
- package/dist/components/ai-elements/tool.js +49 -0
- package/dist/components/ai-elements/toolbar.d.ts +6 -0
- package/dist/components/ai-elements/toolbar.d.ts.map +1 -0
- package/dist/components/ai-elements/toolbar.js +5 -0
- package/dist/components/ai-elements/transcription.d.ts +17 -0
- package/dist/components/ai-elements/transcription.d.ts.map +1 -0
- package/dist/components/ai-elements/transcription.js +36 -0
- package/dist/components/ai-elements/voice-selector.d.ts +64 -0
- package/dist/components/ai-elements/voice-selector.d.ts.map +1 -0
- package/dist/components/ai-elements/voice-selector.js +224 -0
- package/dist/components/ai-elements/web-preview.d.ts +35 -0
- package/dist/components/ai-elements/web-preview.d.ts.map +1 -0
- package/dist/components/ai-elements/web-preview.js +66 -0
- package/dist/components/alert-dialog.d.ts +19 -0
- package/dist/components/alert-dialog.d.ts.map +1 -0
- package/dist/components/alert-dialog.js +42 -0
- package/dist/components/alert.d.ts +10 -0
- package/dist/components/alert.d.ts.map +1 -0
- package/dist/components/alert.js +24 -0
- package/dist/components/artifact-panel.d.ts +131 -0
- package/dist/components/artifact-panel.d.ts.map +1 -0
- package/dist/components/artifact-panel.js +189 -0
- package/dist/components/aspect-ratio.d.ts +4 -0
- package/dist/components/aspect-ratio.d.ts.map +1 -0
- package/dist/components/aspect-ratio.js +7 -0
- package/dist/components/automation-section.d.ts +76 -0
- package/dist/components/automation-section.d.ts.map +1 -0
- package/dist/components/automation-section.js +80 -0
- package/dist/components/avatar.d.ts +12 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +23 -0
- package/dist/components/badge.d.ts +10 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +25 -0
- package/dist/components/benefits-bento.d.ts +15 -0
- package/dist/components/benefits-bento.d.ts.map +1 -0
- package/dist/components/benefits-bento.js +6 -0
- package/dist/components/bento.d.ts +28 -0
- package/dist/components/bento.d.ts.map +1 -0
- package/dist/components/bento.js +48 -0
- package/dist/components/brand.d.ts +9 -0
- package/dist/components/brand.d.ts.map +1 -0
- package/dist/components/brand.js +16 -0
- package/dist/components/breadcrumb.d.ts +12 -0
- package/dist/components/breadcrumb.d.ts.map +1 -0
- package/dist/components/breadcrumb.js +28 -0
- package/dist/components/button-group.d.ts +12 -0
- package/dist/components/button-group.d.ts.map +1 -0
- package/dist/components/button-group.js +28 -0
- package/dist/components/button.d.ts +11 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +36 -0
- package/dist/components/calendar.d.ts +9 -0
- package/dist/components/calendar.d.ts.map +1 -0
- package/dist/components/calendar.js +76 -0
- package/dist/components/card-marketing.d.ts +30 -0
- package/dist/components/card-marketing.d.ts.map +1 -0
- package/dist/components/card-marketing.js +48 -0
- package/dist/components/card.d.ts +10 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +24 -0
- package/dist/components/carousel.d.ts +20 -0
- package/dist/components/carousel.d.ts.map +1 -0
- package/dist/components/carousel.js +91 -0
- package/dist/components/chart.d.ts +44 -0
- package/dist/components/chart.d.ts.map +1 -0
- package/dist/components/chart.js +132 -0
- package/dist/components/checkbox.d.ts +5 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +9 -0
- package/dist/components/code-editor-mockup.d.ts +25 -0
- package/dist/components/code-editor-mockup.d.ts.map +1 -0
- package/dist/components/code-editor-mockup.js +47 -0
- package/dist/components/collapsible.d.ts +6 -0
- package/dist/components/collapsible.d.ts.map +1 -0
- package/dist/components/collapsible.js +13 -0
- package/dist/components/combobox.d.ts +25 -0
- package/dist/components/combobox.d.ts.map +1 -0
- package/dist/components/combobox.js +58 -0
- package/dist/components/command.d.ts +19 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/command.js +34 -0
- package/dist/components/contact.d.ts +20 -0
- package/dist/components/contact.d.ts.map +1 -0
- package/dist/components/contact.js +24 -0
- package/dist/components/context-menu.d.ts +26 -0
- package/dist/components/context-menu.d.ts.map +1 -0
- package/dist/components/context-menu.js +51 -0
- package/dist/components/dashboard-shell.d.ts +24 -0
- package/dist/components/dashboard-shell.d.ts.map +1 -0
- package/dist/components/dashboard-shell.js +8 -0
- package/dist/components/demo-surface.d.ts +26 -0
- package/dist/components/demo-surface.d.ts.map +1 -0
- package/dist/components/demo-surface.js +14 -0
- package/dist/components/desktop-shell.d.ts +28 -0
- package/dist/components/desktop-shell.d.ts.map +1 -0
- package/dist/components/desktop-shell.js +8 -0
- package/dist/components/dialog.d.ts +18 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +37 -0
- package/dist/components/direction.d.ts +8 -0
- package/dist/components/direction.d.ts.map +1 -0
- package/dist/components/direction.js +8 -0
- package/dist/components/drawer.d.ts +14 -0
- package/dist/components/drawer.d.ts.map +1 -0
- package/dist/components/drawer.js +34 -0
- package/dist/components/dropdown-menu.d.ts +26 -0
- package/dist/components/dropdown-menu.d.ts.map +1 -0
- package/dist/components/dropdown-menu.js +51 -0
- package/dist/components/empty.d.ts +12 -0
- package/dist/components/empty.d.ts.map +1 -0
- package/dist/components/empty.js +33 -0
- package/dist/components/fact-cell.d.ts +21 -0
- package/dist/components/fact-cell.d.ts.map +1 -0
- package/dist/components/fact-cell.js +29 -0
- package/dist/components/faq-item.d.ts +25 -0
- package/dist/components/faq-item.d.ts.map +1 -0
- package/dist/components/faq-item.js +25 -0
- package/dist/components/faq.d.ts +16 -0
- package/dist/components/faq.d.ts.map +1 -0
- package/dist/components/faq.js +18 -0
- package/dist/components/feedback-state.d.ts +14 -0
- package/dist/components/feedback-state.d.ts.map +1 -0
- package/dist/components/feedback-state.js +70 -0
- package/dist/components/field.d.ts +25 -0
- package/dist/components/field.d.ts.map +1 -0
- package/dist/components/field.js +76 -0
- package/dist/components/files-preview.d.ts +36 -0
- package/dist/components/files-preview.d.ts.map +1 -0
- package/dist/components/files-preview.js +96 -0
- package/dist/components/footer.d.ts +32 -0
- package/dist/components/footer.d.ts.map +1 -0
- package/dist/components/footer.js +53 -0
- package/dist/components/form.d.ts +25 -0
- package/dist/components/form.d.ts.map +1 -0
- package/dist/components/form.js +59 -0
- package/dist/components/hero-split.d.ts +23 -0
- package/dist/components/hero-split.d.ts.map +1 -0
- package/dist/components/hero-split.js +34 -0
- package/dist/components/hover-card.d.ts +7 -0
- package/dist/components/hover-card.d.ts.map +1 -0
- package/dist/components/hover-card.js +14 -0
- package/dist/components/input-group.d.ts +17 -0
- package/dist/components/input-group.d.ts.map +1 -0
- package/dist/components/input-group.js +63 -0
- package/dist/components/input-otp.d.ts +12 -0
- package/dist/components/input-otp.d.ts.map +1 -0
- package/dist/components/input-otp.js +21 -0
- package/dist/components/input.d.ts +4 -0
- package/dist/components/input.d.ts.map +1 -0
- package/dist/components/input.js +6 -0
- package/dist/components/installer-shell.d.ts +25 -0
- package/dist/components/installer-shell.d.ts.map +1 -0
- package/dist/components/installer-shell.js +36 -0
- package/dist/components/item.d.ts +24 -0
- package/dist/components/item.d.ts.map +1 -0
- package/dist/components/item.js +67 -0
- package/dist/components/kbd.d.ts +4 -0
- package/dist/components/kbd.d.ts.map +1 -0
- package/dist/components/kbd.js +9 -0
- package/dist/components/label.d.ts +5 -0
- package/dist/components/label.d.ts.map +1 -0
- package/dist/components/label.js +8 -0
- package/dist/components/logo-band.d.ts +23 -0
- package/dist/components/logo-band.d.ts.map +1 -0
- package/dist/components/logo-band.js +35 -0
- package/dist/components/logo-tile.d.ts +21 -0
- package/dist/components/logo-tile.d.ts.map +1 -0
- package/dist/components/logo-tile.js +27 -0
- package/dist/components/media-mount.d.ts +13 -0
- package/dist/components/media-mount.d.ts.map +1 -0
- package/dist/components/media-mount.js +17 -0
- package/dist/components/menubar.d.ts +27 -0
- package/dist/components/menubar.d.ts.map +1 -0
- package/dist/components/menubar.js +54 -0
- package/dist/components/native-select.d.ts +8 -0
- package/dist/components/native-select.d.ts.map +1 -0
- package/dist/components/native-select.js +13 -0
- package/dist/components/nav-bar.d.ts +20 -0
- package/dist/components/nav-bar.d.ts.map +1 -0
- package/dist/components/nav-bar.js +30 -0
- package/dist/components/navigation-menu.d.ts +15 -0
- package/dist/components/navigation-menu.d.ts.map +1 -0
- package/dist/components/navigation-menu.js +32 -0
- package/dist/components/newsletter.d.ts +24 -0
- package/dist/components/newsletter.d.ts.map +1 -0
- package/dist/components/newsletter.js +31 -0
- package/dist/components/page-frame.d.ts +30 -0
- package/dist/components/page-frame.d.ts.map +1 -0
- package/dist/components/page-frame.js +30 -0
- package/dist/components/pagination.d.ts +14 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +29 -0
- package/dist/components/plugin-slot-boundary.d.ts +27 -0
- package/dist/components/plugin-slot-boundary.d.ts.map +1 -0
- package/dist/components/plugin-slot-boundary.js +24 -0
- package/dist/components/popover.d.ts +11 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +26 -0
- package/dist/components/pricing-card.d.ts +35 -0
- package/dist/components/pricing-card.d.ts.map +1 -0
- package/dist/components/pricing-card.js +55 -0
- package/dist/components/pricing.d.ts +28 -0
- package/dist/components/pricing.d.ts.map +1 -0
- package/dist/components/pricing.js +22 -0
- package/dist/components/progress.d.ts +5 -0
- package/dist/components/progress.d.ts.map +1 -0
- package/dist/components/progress.js +8 -0
- package/dist/components/proof-slot.d.ts +8 -0
- package/dist/components/proof-slot.d.ts.map +1 -0
- package/dist/components/proof-slot.js +8 -0
- package/dist/components/quote-card.d.ts +23 -0
- package/dist/components/quote-card.d.ts.map +1 -0
- package/dist/components/quote-card.js +36 -0
- package/dist/components/radio-group.d.ts +6 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +12 -0
- package/dist/components/resizable.d.ts +8 -0
- package/dist/components/resizable.d.ts.map +1 -0
- package/dist/components/resizable.js +14 -0
- package/dist/components/scroll-area.d.ts +6 -0
- package/dist/components/scroll-area.d.ts.map +1 -0
- package/dist/components/scroll-area.js +13 -0
- package/dist/components/section-intro.d.ts +18 -0
- package/dist/components/section-intro.d.ts.map +1 -0
- package/dist/components/section-intro.js +22 -0
- package/dist/components/select.d.ts +16 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +38 -0
- package/dist/components/separator.d.ts +5 -0
- package/dist/components/separator.d.ts.map +1 -0
- package/dist/components/separator.js +8 -0
- package/dist/components/settings-section.d.ts +31 -0
- package/dist/components/settings-section.d.ts.map +1 -0
- package/dist/components/settings-section.js +37 -0
- package/dist/components/sheet.d.ts +15 -0
- package/dist/components/sheet.d.ts.map +1 -0
- package/dist/components/sheet.js +40 -0
- package/dist/components/shift-band.d.ts +14 -0
- package/dist/components/shift-band.d.ts.map +1 -0
- package/dist/components/shift-band.js +10 -0
- package/dist/components/sidebar.d.ts +70 -0
- package/dist/components/sidebar.d.ts.map +1 -0
- package/dist/components/sidebar.js +212 -0
- package/dist/components/skeleton.d.ts +3 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +6 -0
- package/dist/components/slider.d.ts +5 -0
- package/dist/components/slider.d.ts.map +1 -0
- package/dist/components/slider.js +14 -0
- package/dist/components/sonner.d.ts +4 -0
- package/dist/components/sonner.d.ts.map +1 -0
- package/dist/components/sonner.js +19 -0
- package/dist/components/spinner.d.ts +3 -0
- package/dist/components/spinner.d.ts.map +1 -0
- package/dist/components/spinner.js +7 -0
- package/dist/components/stat-block.d.ts +20 -0
- package/dist/components/stat-block.d.ts.map +1 -0
- package/dist/components/stat-block.js +20 -0
- package/dist/components/stats-band.d.ts +18 -0
- package/dist/components/stats-band.d.ts.map +1 -0
- package/dist/components/stats-band.js +28 -0
- package/dist/components/switch.d.ts +7 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +8 -0
- package/dist/components/table.d.ts +11 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +28 -0
- package/dist/components/tabs.d.ts +12 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +29 -0
- package/dist/components/testimonials.d.ts +21 -0
- package/dist/components/testimonials.d.ts.map +1 -0
- package/dist/components/testimonials.js +28 -0
- package/dist/components/textarea.d.ts +4 -0
- package/dist/components/textarea.d.ts.map +1 -0
- package/dist/components/textarea.js +6 -0
- package/dist/components/toggle-group.d.ts +10 -0
- package/dist/components/toggle-group.d.ts.map +1 -0
- package/dist/components/toggle-group.js +22 -0
- package/dist/components/toggle.d.ts +10 -0
- package/dist/components/toggle.d.ts.map +1 -0
- package/dist/components/toggle.js +26 -0
- package/dist/components/tooltip.d.ts +8 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +17 -0
- package/dist/components/use-case-bento.d.ts +13 -0
- package/dist/components/use-case-bento.d.ts.map +1 -0
- package/dist/components/use-case-bento.js +9 -0
- package/dist/components/watch-it-work-band.d.ts +11 -0
- package/dist/components/watch-it-work-band.d.ts.map +1 -0
- package/dist/components/watch-it-work-band.js +8 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +16 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -0
- package/dist/lib/agent-attachment.d.ts +11 -0
- package/dist/lib/agent-attachment.d.ts.map +1 -0
- package/dist/lib/agent-attachment.js +19 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +5 -0
- package/dist/styles/globals.css +362 -0
- package/docs/agent-work-surfaces.md +98 -0
- package/docs/agents/nadicodeai-ui.md +229 -0
- package/docs/component-classification.md +44 -0
- package/docs/migration/nadia-consumer-readiness.md +85 -0
- package/docs/product-compositions.md +77 -0
- package/docs/product-sections.md +200 -0
- package/docs/terminal-tui-semantics.md +211 -0
- package/llms.txt +75 -0
- package/package.json +95 -0
- package/skills/nadicodeai-ui/SKILL.md +80 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { AtSignIcon, SlashIcon } from "lucide-react";
|
|
4
|
+
import { Attachment, AttachmentInfo, AttachmentPreview, AttachmentRemove, Attachments, } from "./ai-elements/attachments.js";
|
|
5
|
+
import { PromptInput, PromptInputBody, PromptInputFooter, PromptInputHeader, PromptInputSubmit, PromptInputTextarea, PromptInputTools, } from "./ai-elements/prompt-input.js";
|
|
6
|
+
import { Queue, QueueItem, QueueItemContent, QueueItemDescription, QueueItemIndicator, QueueList, QueueSection, QueueSectionContent, QueueSectionLabel, QueueSectionTrigger, } from "./ai-elements/queue.js";
|
|
7
|
+
import { getAgentRedactionText, } from "./artifact-panel.js";
|
|
8
|
+
import { Badge } from "./badge.js";
|
|
9
|
+
import { Button } from "./button.js";
|
|
10
|
+
import { agentAttachmentToData } from "../lib/agent-attachment.js";
|
|
11
|
+
import { cn } from "../lib/utils.js";
|
|
12
|
+
const queueStatusLabels = {
|
|
13
|
+
blocked: "Blocked",
|
|
14
|
+
complete: "Complete",
|
|
15
|
+
interrupted: "Interrupted",
|
|
16
|
+
queued: "Queued",
|
|
17
|
+
running: "Running",
|
|
18
|
+
};
|
|
19
|
+
function composerStateToChatStatus(state) {
|
|
20
|
+
if (state === "streaming") {
|
|
21
|
+
return "streaming";
|
|
22
|
+
}
|
|
23
|
+
if (state === "submitting") {
|
|
24
|
+
return "submitted";
|
|
25
|
+
}
|
|
26
|
+
if (state === "error") {
|
|
27
|
+
return "error";
|
|
28
|
+
}
|
|
29
|
+
return "ready";
|
|
30
|
+
}
|
|
31
|
+
function AgentComposerAttachments({ attachments, onRemoveAttachment, }) {
|
|
32
|
+
if (!attachments?.length) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return (_jsx(Attachments, { "data-slot": "agent-composer-attachments", variant: "list", className: "w-full", children: attachments.map((attachment) => (_jsxs(Attachment, { data: agentAttachmentToData(attachment), onRemove: onRemoveAttachment
|
|
36
|
+
? () => onRemoveAttachment(attachment)
|
|
37
|
+
: undefined, children: [_jsx(AttachmentPreview, {}), _jsx(AttachmentInfo, { showMediaType: true }), attachment.sizeLabel && (_jsx("span", { className: "text-xs text-muted-foreground", children: attachment.sizeLabel })), attachment.redaction && (_jsx("span", { className: "sr-only", children: getAgentRedactionText(attachment.redaction) })), _jsx(AttachmentRemove, {})] }, attachment.id))) }));
|
|
38
|
+
}
|
|
39
|
+
function AgentQueuePanel({ queue, actions, className, }) {
|
|
40
|
+
if (!queue.items.length) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return (_jsx(Queue, { "data-slot": "agent-queue", className: className, children: _jsxs(QueueSection, { defaultOpen: true, children: [_jsx(QueueSectionTrigger, { children: _jsx(QueueSectionLabel, { count: queue.items.length, label: queue.title ?? "queued tasks" }) }), _jsxs(QueueSectionContent, { children: [queue.description && (_jsx("p", { className: "px-3 pt-2 text-sm text-muted-foreground", children: queue.description })), _jsx(QueueList, { children: queue.items.map((item) => {
|
|
44
|
+
const status = item.status ?? "queued";
|
|
45
|
+
const completed = status === "complete";
|
|
46
|
+
return (_jsxs(QueueItem, { "data-queue-status": status, className: "gap-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(QueueItemIndicator, { completed: completed }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx(QueueItemContent, { completed: completed, children: item.redaction
|
|
47
|
+
? getAgentRedactionText(item.redaction)
|
|
48
|
+
: item.title }), item.description && (_jsx(QueueItemDescription, { completed: completed, children: item.description }))] }), _jsx(Badge, { variant: "outline", children: queueStatusLabels[status] }), actions?.[item.id]] }), _jsx(AgentComposerAttachments, { attachments: item.attachments })] }, item.id));
|
|
49
|
+
}) })] })] }) }));
|
|
50
|
+
}
|
|
51
|
+
function AgentComposer({ value, defaultValue, placeholder = "Ask Nadia to work on this...", attachments = [], queue, state = "idle", disabled = false, slashMenu, mentionMenu, tools, submitLabel = "Submit", stopLabel = "Stop", onValueChange, onSubmit, onStop, onRemoveAttachment, queueActions, footer, className, ...props }) {
|
|
52
|
+
const isDisabled = disabled || state === "disabled" || state === "submitting";
|
|
53
|
+
const isStreaming = state === "streaming";
|
|
54
|
+
return (_jsxs("div", { "data-slot": "agent-composer-shell", "data-composer-state": state, "data-disabled": isDisabled ? true : undefined, className: "grid gap-3", children: [queue && _jsx(AgentQueuePanel, { queue: queue, actions: queueActions }), _jsxs(PromptInput, { "data-slot": "agent-composer", className: cn("rounded-lg border bg-[var(--nc-composer-surface)] text-[var(--nc-composer-foreground)]", className), onSubmit: (message, event) => onSubmit?.({
|
|
55
|
+
attachments,
|
|
56
|
+
queue,
|
|
57
|
+
value: message.text,
|
|
58
|
+
}, event), ...props, children: [(attachments.length > 0 || slashMenu || mentionMenu) && (_jsxs(PromptInputHeader, { children: [_jsx(AgentComposerAttachments, { attachments: attachments, onRemoveAttachment: onRemoveAttachment }), slashMenu && (_jsx("div", { "data-slot": "agent-composer-slash-menu", children: slashMenu })), mentionMenu && (_jsx("div", { "data-slot": "agent-composer-mention-menu", children: mentionMenu }))] })), _jsx(PromptInputBody, { children: _jsx(PromptInputTextarea, { value: value, defaultValue: defaultValue, placeholder: placeholder, disabled: isDisabled || isStreaming, onChange: (event) => onValueChange?.(event.currentTarget.value) }) }), _jsxs(PromptInputFooter, { children: [_jsxs(PromptInputTools, { children: [tools, !slashMenu && (_jsxs(Button, { "aria-label": "Slash commands", title: "Slash commands", type: "button", variant: "ghost", size: "icon-sm", disabled: isDisabled, children: [_jsx(SlashIcon, { className: "size-4", "data-icon": true }), _jsx("span", { className: "sr-only", children: "Slash commands" })] })), !mentionMenu && (_jsxs(Button, { "aria-label": "Mention context", title: "Mention context", type: "button", variant: "ghost", size: "icon-sm", disabled: isDisabled, children: [_jsx(AtSignIcon, { className: "size-4", "data-icon": true }), _jsx("span", { className: "sr-only", children: "Mention context" })] }))] }), _jsx(PromptInputSubmit, { "aria-label": isStreaming ? stopLabel : submitLabel, status: composerStateToChatStatus(state), onStop: onStop, disabled: isStreaming ? !onStop : isDisabled })] })] }), footer && _jsx("div", { "data-slot": "agent-composer-footer", children: footer })] }));
|
|
59
|
+
}
|
|
60
|
+
export { AgentComposer, AgentComposerAttachments, AgentQueuePanel, };
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type AgentArtifactModel, type AgentRedactionRule } from "./artifact-panel";
|
|
3
|
+
import { type AgentApprovalChoice, type AgentToolApprovalRequest } from "./agent-tool-approval";
|
|
4
|
+
export type AgentMessageRole = "user" | "assistant" | "system";
|
|
5
|
+
export type AgentWorkState = "idle" | "empty" | "queued" | "streaming" | "interrupted" | "retryable" | "permission-denied" | "fatal";
|
|
6
|
+
export type AgentMessageSourceKind = "human" | "agent" | "system" | "tool" | "runtime";
|
|
7
|
+
export type AgentMessageSourceMetadata = {
|
|
8
|
+
kind: AgentMessageSourceKind;
|
|
9
|
+
label?: string;
|
|
10
|
+
model?: string;
|
|
11
|
+
sessionId?: string;
|
|
12
|
+
timestamp?: string;
|
|
13
|
+
};
|
|
14
|
+
export type AgentSourceReference = {
|
|
15
|
+
id: string;
|
|
16
|
+
title: string;
|
|
17
|
+
url?: string;
|
|
18
|
+
excerpt?: string;
|
|
19
|
+
kind?: "document" | "web" | "file" | "system";
|
|
20
|
+
redaction?: AgentRedactionRule;
|
|
21
|
+
};
|
|
22
|
+
export type AgentReasoningSummary = {
|
|
23
|
+
id: string;
|
|
24
|
+
title?: string;
|
|
25
|
+
summary?: string;
|
|
26
|
+
status?: "available" | "streaming" | "redacted";
|
|
27
|
+
durationSeconds?: number;
|
|
28
|
+
redaction?: AgentRedactionRule;
|
|
29
|
+
};
|
|
30
|
+
export type AgentToolCallStatus = "pending" | "running" | "success" | "error" | "denied" | "approval-requested" | "approval-responded";
|
|
31
|
+
export type AgentToolCallModel = {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
title?: string;
|
|
35
|
+
status: AgentToolCallStatus;
|
|
36
|
+
input?: unknown;
|
|
37
|
+
output?: unknown;
|
|
38
|
+
error?: string;
|
|
39
|
+
trace?: string;
|
|
40
|
+
approval?: AgentToolApprovalRequest;
|
|
41
|
+
redaction?: AgentRedactionRule;
|
|
42
|
+
};
|
|
43
|
+
export type AgentToolApprovalDecisionHandler = (choice: AgentApprovalChoice, request: AgentToolApprovalRequest, toolCall: AgentToolCallModel) => void;
|
|
44
|
+
export type AgentAttachmentModel = {
|
|
45
|
+
id: string;
|
|
46
|
+
type: "file" | "image" | "audio" | "video" | "source";
|
|
47
|
+
name: string;
|
|
48
|
+
mediaType?: string;
|
|
49
|
+
url?: string;
|
|
50
|
+
sizeLabel?: string;
|
|
51
|
+
redaction?: AgentRedactionRule;
|
|
52
|
+
};
|
|
53
|
+
export type AgentMessageTextPart = {
|
|
54
|
+
type: "text";
|
|
55
|
+
text: string;
|
|
56
|
+
redaction?: AgentRedactionRule;
|
|
57
|
+
};
|
|
58
|
+
export type AgentMessageReasoningPart = {
|
|
59
|
+
type: "reasoning";
|
|
60
|
+
reasoning: AgentReasoningSummary;
|
|
61
|
+
};
|
|
62
|
+
export type AgentMessageToolPart = {
|
|
63
|
+
type: "tool";
|
|
64
|
+
toolCall: AgentToolCallModel;
|
|
65
|
+
};
|
|
66
|
+
export type AgentMessageSourcePart = {
|
|
67
|
+
type: "source";
|
|
68
|
+
source: AgentSourceReference;
|
|
69
|
+
};
|
|
70
|
+
export type AgentMessageArtifactPart = {
|
|
71
|
+
type: "artifact";
|
|
72
|
+
artifact: AgentArtifactModel;
|
|
73
|
+
};
|
|
74
|
+
export type AgentMessageStatePart = {
|
|
75
|
+
type: "state";
|
|
76
|
+
state: Exclude<AgentWorkState, "empty" | "idle">;
|
|
77
|
+
title?: string;
|
|
78
|
+
description?: string;
|
|
79
|
+
};
|
|
80
|
+
export type AgentMessagePart = AgentMessageTextPart | AgentMessageReasoningPart | AgentMessageToolPart | AgentMessageSourcePart | AgentMessageArtifactPart | AgentMessageStatePart;
|
|
81
|
+
export type AgentMessageModel = {
|
|
82
|
+
id: string;
|
|
83
|
+
role: AgentMessageRole;
|
|
84
|
+
content?: string;
|
|
85
|
+
metadata?: AgentMessageSourceMetadata;
|
|
86
|
+
state?: Exclude<AgentWorkState, "empty">;
|
|
87
|
+
parts?: AgentMessagePart[];
|
|
88
|
+
attachments?: AgentAttachmentModel[];
|
|
89
|
+
sources?: AgentSourceReference[];
|
|
90
|
+
redaction?: AgentRedactionRule;
|
|
91
|
+
};
|
|
92
|
+
declare function AgentMessageStateNotice({ state, title, description, actions, }: {
|
|
93
|
+
state: Exclude<AgentWorkState, "empty" | "idle">;
|
|
94
|
+
title?: React.ReactNode;
|
|
95
|
+
description?: React.ReactNode;
|
|
96
|
+
actions?: React.ReactNode;
|
|
97
|
+
}): React.JSX.Element;
|
|
98
|
+
declare function AgentAttachmentsList({ attachments, }: {
|
|
99
|
+
attachments?: AgentAttachmentModel[];
|
|
100
|
+
}): React.JSX.Element | null;
|
|
101
|
+
declare function AgentSourcesList({ sources }: {
|
|
102
|
+
sources?: AgentSourceReference[];
|
|
103
|
+
}): React.JSX.Element | null;
|
|
104
|
+
declare function AgentToolCall({ toolCall, actions, onApprovalChoice, }: {
|
|
105
|
+
toolCall: AgentToolCallModel;
|
|
106
|
+
actions?: React.ReactNode;
|
|
107
|
+
onApprovalChoice?: AgentToolApprovalDecisionHandler;
|
|
108
|
+
}): React.JSX.Element;
|
|
109
|
+
declare function AgentMessage({ message, toolActions, retryAction, onToolApprovalChoice, className, ...props }: Omit<React.ComponentProps<"article">, "children"> & {
|
|
110
|
+
message: AgentMessageModel;
|
|
111
|
+
toolActions?: Record<string, React.ReactNode>;
|
|
112
|
+
retryAction?: React.ReactNode;
|
|
113
|
+
onToolApprovalChoice?: AgentToolApprovalDecisionHandler;
|
|
114
|
+
}): React.JSX.Element;
|
|
115
|
+
export { AgentAttachmentsList, AgentMessage, AgentMessageStateNotice, AgentSourcesList, AgentToolCall, };
|
|
116
|
+
//# sourceMappingURL=agent-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-message.d.ts","sourceRoot":"","sources":["../../src/components/agent-message.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { AlertTriangleIcon, BotIcon, ClockIcon, FileWarningIcon, InfoIcon, LoaderCircleIcon, RefreshCwIcon, ShieldXIcon, UserIcon, } from "lucide-react";
|
|
4
|
+
import { Attachment, AttachmentInfo, AttachmentPreview, Attachments, } from "./ai-elements/attachments.js";
|
|
5
|
+
import { Message, MessageContent, MessageResponse, } from "./ai-elements/message.js";
|
|
6
|
+
import { Reasoning, ReasoningContent, ReasoningTrigger, } from "./ai-elements/reasoning.js";
|
|
7
|
+
import { Source, Sources, SourcesContent, SourcesTrigger, } from "./ai-elements/sources.js";
|
|
8
|
+
import { Tool, ToolContent, ToolHeader, ToolInput, ToolOutput, } from "./ai-elements/tool.js";
|
|
9
|
+
import { ArtifactPanel, RedactedNotice, StackTraceDisclosure, getAgentRedactionText, } from "./artifact-panel.js";
|
|
10
|
+
import { AgentToolApproval, } from "./agent-tool-approval.js";
|
|
11
|
+
import { Badge } from "./badge.js";
|
|
12
|
+
import { agentAttachmentToData } from "../lib/agent-attachment.js";
|
|
13
|
+
import { cn } from "../lib/utils.js";
|
|
14
|
+
const roleIcons = {
|
|
15
|
+
assistant: BotIcon,
|
|
16
|
+
system: InfoIcon,
|
|
17
|
+
user: UserIcon,
|
|
18
|
+
};
|
|
19
|
+
const stateLabels = {
|
|
20
|
+
empty: "Empty",
|
|
21
|
+
fatal: "Fatal",
|
|
22
|
+
idle: "Idle",
|
|
23
|
+
interrupted: "Interrupted",
|
|
24
|
+
"permission-denied": "Permission denied",
|
|
25
|
+
queued: "Queued",
|
|
26
|
+
retryable: "Retryable",
|
|
27
|
+
streaming: "Streaming",
|
|
28
|
+
};
|
|
29
|
+
const stateIcons = {
|
|
30
|
+
fatal: FileWarningIcon,
|
|
31
|
+
interrupted: AlertTriangleIcon,
|
|
32
|
+
"permission-denied": ShieldXIcon,
|
|
33
|
+
queued: ClockIcon,
|
|
34
|
+
retryable: RefreshCwIcon,
|
|
35
|
+
streaming: LoaderCircleIcon,
|
|
36
|
+
};
|
|
37
|
+
const toolStatusToAiState = {
|
|
38
|
+
"approval-requested": "approval-requested",
|
|
39
|
+
"approval-responded": "approval-responded",
|
|
40
|
+
denied: "output-denied",
|
|
41
|
+
error: "output-error",
|
|
42
|
+
pending: "input-streaming",
|
|
43
|
+
running: "input-available",
|
|
44
|
+
success: "output-available",
|
|
45
|
+
};
|
|
46
|
+
function AgentMessageStateNotice({ state, title, description, actions, }) {
|
|
47
|
+
const Icon = stateIcons[state];
|
|
48
|
+
return (_jsxs("div", { "data-slot": "agent-message-state", "data-agent-state": state, role: state === "fatal" || state === "permission-denied" ? "alert" : "status", className: "flex flex-wrap items-center gap-3 rounded-md border bg-muted/30 px-3 py-2 text-sm", children: [_jsx(Icon, { className: cn("size-4 text-muted-foreground", state === "streaming" && "animate-spin") }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "font-medium", children: title ?? stateLabels[state] }), description && (_jsx("div", { className: "text-muted-foreground", children: description }))] }), actions] }));
|
|
49
|
+
}
|
|
50
|
+
function AgentAttachmentsList({ attachments, }) {
|
|
51
|
+
if (!attachments?.length) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return (_jsx(Attachments, { "data-slot": "agent-message-attachments", variant: "inline", className: "max-w-full", children: attachments.map((attachment) => (_jsxs(Attachment, { data: agentAttachmentToData(attachment), children: [_jsx(AttachmentPreview, {}), _jsx(AttachmentInfo, { showMediaType: true }), attachment.redaction && (_jsx("span", { className: "sr-only", children: getAgentRedactionText(attachment.redaction) }))] }, attachment.id))) }));
|
|
55
|
+
}
|
|
56
|
+
function AgentSourcesList({ sources }) {
|
|
57
|
+
if (!sources?.length) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
return (_jsxs(Sources, { "data-slot": "agent-message-sources", children: [_jsx(SourcesTrigger, { count: sources.length }), _jsx(SourcesContent, { forceMount: true, children: sources.map((source) => (_jsx(Source, { href: source.url ?? "#", title: source.redaction
|
|
61
|
+
? getAgentRedactionText(source.redaction)
|
|
62
|
+
: source.title }, source.id))) })] }));
|
|
63
|
+
}
|
|
64
|
+
function AgentReasoningBlock({ reasoning, }) {
|
|
65
|
+
return (_jsxs(Reasoning, { "data-slot": "agent-reasoning-summary", "data-reasoning-status": reasoning.status, isStreaming: reasoning.status === "streaming", defaultOpen: reasoning.status === "streaming", duration: reasoning.durationSeconds, children: [_jsx(ReasoningTrigger, { getThinkingMessage: (isStreaming) => reasoning.title ??
|
|
66
|
+
(isStreaming ? "Preparing reasoning summary" : "Reasoning summary") }), reasoning.redaction ? (_jsx("div", { className: "mt-3", children: _jsx(RedactedNotice, { redaction: reasoning.redaction }) })) : (_jsx(ReasoningContent, { children: reasoning.summary ?? "No reasoning summary supplied." }))] }));
|
|
67
|
+
}
|
|
68
|
+
function AgentToolCall({ toolCall, actions, onApprovalChoice, }) {
|
|
69
|
+
const state = toolStatusToAiState[toolCall.status];
|
|
70
|
+
return (_jsxs(Tool, { "data-slot": "agent-tool-call", "data-tool-status": toolCall.status, defaultOpen: true, children: [_jsx(ToolHeader, { type: `tool-${toolCall.name}`, state: state, title: toolCall.title ?? toolCall.name }), _jsxs(ToolContent, { children: [toolCall.approval && (_jsx(AgentToolApproval, { request: toolCall.approval, disabled: !onApprovalChoice, onChoice: onApprovalChoice
|
|
71
|
+
? (choice, request) => onApprovalChoice(choice, request, toolCall)
|
|
72
|
+
: undefined })), toolCall.redaction ? (_jsx(RedactedNotice, { redaction: toolCall.redaction })) : (_jsxs(_Fragment, { children: [toolCall.input !== undefined && (_jsx(ToolInput, { input: toolCall.input })), (toolCall.output !== undefined || toolCall.error) && (_jsx(ToolOutput, { output: toolCall.output, errorText: toolCall.error }))] })), !toolCall.redaction && toolCall.trace && (_jsx(StackTraceDisclosure, { trace: toolCall.trace })), actions] })] }));
|
|
73
|
+
}
|
|
74
|
+
function AgentMessagePartView({ part, toolActions, onToolApprovalChoice, }) {
|
|
75
|
+
if (part.type === "text") {
|
|
76
|
+
if (part.redaction) {
|
|
77
|
+
return _jsx(RedactedNotice, { redaction: part.redaction });
|
|
78
|
+
}
|
|
79
|
+
return _jsx(MessageResponse, { children: part.text });
|
|
80
|
+
}
|
|
81
|
+
if (part.type === "reasoning") {
|
|
82
|
+
return _jsx(AgentReasoningBlock, { reasoning: part.reasoning });
|
|
83
|
+
}
|
|
84
|
+
if (part.type === "tool") {
|
|
85
|
+
return (_jsx(AgentToolCall, { toolCall: part.toolCall, actions: toolActions?.[part.toolCall.id], onApprovalChoice: onToolApprovalChoice }));
|
|
86
|
+
}
|
|
87
|
+
if (part.type === "source") {
|
|
88
|
+
return _jsx(AgentSourcesList, { sources: [part.source] });
|
|
89
|
+
}
|
|
90
|
+
if (part.type === "artifact") {
|
|
91
|
+
return _jsx(ArtifactPanel, { artifact: part.artifact });
|
|
92
|
+
}
|
|
93
|
+
return (_jsx(AgentMessageStateNotice, { state: part.state, title: part.title, description: part.description }));
|
|
94
|
+
}
|
|
95
|
+
function AgentMessageMeta({ role, metadata, state, }) {
|
|
96
|
+
const Icon = roleIcons[role];
|
|
97
|
+
const label = metadata?.label ?? role;
|
|
98
|
+
return (_jsxs("div", { "data-slot": "agent-message-meta", className: "flex flex-wrap items-center gap-2 text-xs text-muted-foreground", children: [_jsx(Icon, { className: "size-3.5" }), _jsx("span", { className: "font-medium capitalize", children: label }), metadata?.model && _jsx(Badge, { variant: "outline", children: metadata.model }), metadata?.timestamp && _jsx("span", { children: metadata.timestamp }), state && state !== "idle" && (_jsx(Badge, { variant: "secondary", children: stateLabels[state] }))] }));
|
|
99
|
+
}
|
|
100
|
+
function AgentMessage({ message, toolActions, retryAction, onToolApprovalChoice, className, ...props }) {
|
|
101
|
+
const parts = message.parts ??
|
|
102
|
+
(message.content
|
|
103
|
+
? [{ text: message.content, type: "text" }]
|
|
104
|
+
: []);
|
|
105
|
+
const aiRole = message.role === "user" ? "user" : "assistant";
|
|
106
|
+
return (_jsx("article", { "data-slot": "agent-message", "data-message-role": message.role, "data-agent-state": message.state, className: className, ...props, children: _jsxs(Message, { from: aiRole, className: cn("max-w-full", message.role === "system" && "mx-auto border-y bg-muted/20 px-4 py-3"), children: [_jsx(AgentMessageMeta, { role: message.role, metadata: message.metadata, state: message.state }), _jsxs(MessageContent, { className: cn("w-full", message.role === "system" && "text-muted-foreground"), children: [_jsx(AgentAttachmentsList, { attachments: message.attachments }), message.redaction ? (_jsx(RedactedNotice, { redaction: message.redaction })) : (parts.map((part, index) => (_jsx(AgentMessagePartView, { part: part, toolActions: toolActions, onToolApprovalChoice: onToolApprovalChoice }, `${message.id}-${part.type}-${index}`)))), _jsx(AgentSourcesList, { sources: message.sources }), message.state &&
|
|
107
|
+
message.state !== "idle" &&
|
|
108
|
+
message.state !== "streaming" && (_jsx(AgentMessageStateNotice, { state: message.state, actions: message.state === "retryable" ? retryAction : undefined }))] })] }) }));
|
|
109
|
+
}
|
|
110
|
+
export { AgentAttachmentsList, AgentMessage, AgentMessageStateNotice, AgentSourcesList, AgentToolCall, };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Conversation } from "./ai-elements/conversation";
|
|
3
|
+
import { type AgentMessageModel, type AgentToolApprovalDecisionHandler, type AgentWorkState } from "./agent-message";
|
|
4
|
+
export type AgentThreadStateCopy = {
|
|
5
|
+
title?: React.ReactNode;
|
|
6
|
+
description?: React.ReactNode;
|
|
7
|
+
actions?: React.ReactNode;
|
|
8
|
+
};
|
|
9
|
+
declare function AgentThreadStateBanner({ state, title, description, actions, }: AgentThreadStateCopy & {
|
|
10
|
+
state: Exclude<AgentWorkState, "idle" | "empty">;
|
|
11
|
+
}): React.JSX.Element;
|
|
12
|
+
declare function AgentThreadEmptyState({ title, description, actions, }: AgentThreadStateCopy): React.JSX.Element;
|
|
13
|
+
declare function AgentThread({ messages, state, stateCopy, emptyState, toolActions, retryAction, onToolApprovalChoice, maxMessages, className, contentClassName, children, ...props }: Omit<React.ComponentProps<typeof Conversation>, "children"> & {
|
|
14
|
+
messages: AgentMessageModel[];
|
|
15
|
+
state?: AgentWorkState;
|
|
16
|
+
stateCopy?: Partial<Record<Exclude<AgentWorkState, "idle">, AgentThreadStateCopy>>;
|
|
17
|
+
emptyState?: AgentThreadStateCopy;
|
|
18
|
+
toolActions?: Record<string, React.ReactNode>;
|
|
19
|
+
retryAction?: React.ReactNode;
|
|
20
|
+
onToolApprovalChoice?: AgentToolApprovalDecisionHandler;
|
|
21
|
+
maxMessages?: number;
|
|
22
|
+
contentClassName?: string;
|
|
23
|
+
children?: React.ReactNode;
|
|
24
|
+
}): React.JSX.Element;
|
|
25
|
+
export { AgentThread, AgentThreadEmptyState, AgentThreadStateBanner };
|
|
26
|
+
//# sourceMappingURL=agent-thread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-thread.d.ts","sourceRoot":"","sources":["../../src/components/agent-thread.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,OAAO,EACL,YAAY,EAEb,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,gCAAgC,EACrC,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAA;AAInC,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,CAAA;AA8CD,iBAAS,sBAAsB,CAAC,EAC9B,KAAK,EACL,KAAK,EACL,WAAW,EACX,OAAO,GACR,EAAE,oBAAoB,GAAG;IACxB,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,CAAA;CACjD,qBA0BA;AAED,iBAAS,qBAAqB,CAAC,EAC7B,KAAK,EACL,WAAW,EACX,OAAO,GACR,EAAE,oBAAoB,qBAYtB;AAiBD,iBAAS,WAAW,CAAC,EACnB,QAAQ,EACR,KAAc,EACd,SAAS,EACT,UAAU,EACV,WAAW,EACX,WAAW,EACX,oBAAoB,EACpB,WAA2C,EAC3C,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC,EAAE,UAAU,CAAC,GAAG;IAC/D,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAA;IAClF,UAAU,CAAC,EAAE,oBAAoB,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IAC7C,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,oBAAoB,CAAC,EAAE,gCAAgC,CAAA;IACvD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B,qBAqDA;AAED,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { AlertTriangleIcon, ClockIcon, FileWarningIcon, LoaderCircleIcon, RefreshCwIcon, ShieldXIcon, } from "lucide-react";
|
|
4
|
+
import { Conversation, ConversationContent, } from "./ai-elements/conversation.js";
|
|
5
|
+
import { AgentMessage, } from "./agent-message.js";
|
|
6
|
+
import { FeedbackState } from "./feedback-state.js";
|
|
7
|
+
import { cn } from "../lib/utils.js";
|
|
8
|
+
const threadStateDefaults = {
|
|
9
|
+
empty: {
|
|
10
|
+
description: "Start with a prompt or queue an agent task.",
|
|
11
|
+
icon: ClockIcon,
|
|
12
|
+
title: "No agent messages",
|
|
13
|
+
},
|
|
14
|
+
fatal: {
|
|
15
|
+
description: "The consuming app should show its recovery action here.",
|
|
16
|
+
icon: FileWarningIcon,
|
|
17
|
+
title: "Unable to continue",
|
|
18
|
+
},
|
|
19
|
+
interrupted: {
|
|
20
|
+
description: "The current run stopped before the agent finished.",
|
|
21
|
+
icon: AlertTriangleIcon,
|
|
22
|
+
title: "Run interrupted",
|
|
23
|
+
},
|
|
24
|
+
"permission-denied": {
|
|
25
|
+
description: "This session cannot access the requested action or content.",
|
|
26
|
+
icon: ShieldXIcon,
|
|
27
|
+
title: "Permission denied",
|
|
28
|
+
},
|
|
29
|
+
queued: {
|
|
30
|
+
description: "The next agent step is waiting for capacity or approval.",
|
|
31
|
+
icon: ClockIcon,
|
|
32
|
+
title: "Queued",
|
|
33
|
+
},
|
|
34
|
+
retryable: {
|
|
35
|
+
description: "The run can be attempted again by the consuming app.",
|
|
36
|
+
icon: RefreshCwIcon,
|
|
37
|
+
title: "Retry available",
|
|
38
|
+
},
|
|
39
|
+
streaming: {
|
|
40
|
+
description: "The assistant is preparing a response.",
|
|
41
|
+
icon: LoaderCircleIcon,
|
|
42
|
+
title: "Streaming",
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
const defaultMaxAgentThreadMessages = 50;
|
|
46
|
+
function AgentThreadStateBanner({ state, title, description, actions, }) {
|
|
47
|
+
const fallback = threadStateDefaults[state];
|
|
48
|
+
const Icon = fallback.icon;
|
|
49
|
+
return (_jsxs("div", { "data-slot": "agent-thread-state", "data-agent-state": state, role: state === "fatal" || state === "permission-denied" ? "alert" : "status", className: "flex flex-wrap items-center gap-3 rounded-lg border bg-muted/30 px-4 py-3 text-sm", children: [_jsx(Icon, { className: cn("size-4 text-muted-foreground", state === "streaming" && "animate-spin") }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "font-medium", children: title ?? fallback.title }), _jsx("div", { className: "text-muted-foreground", children: description ?? fallback.description })] }), actions] }));
|
|
50
|
+
}
|
|
51
|
+
function AgentThreadEmptyState({ title, description, actions, }) {
|
|
52
|
+
return (_jsx(FeedbackState, { "data-slot": "agent-thread-empty-state", status: "empty", title: title ?? threadStateDefaults.empty.title, description: description ?? threadStateDefaults.empty.description, actions: actions, compact: true, className: "min-h-56 rounded-lg bg-muted/20" }));
|
|
53
|
+
}
|
|
54
|
+
function AgentThreadOverflowSummary({ omittedMessages, }) {
|
|
55
|
+
return (_jsxs("div", { "data-slot": "agent-thread-overflow-summary", className: "rounded-md border bg-muted/30 px-3 py-2 text-muted-foreground text-xs", children: [omittedMessages, " earlier messages not shown."] }));
|
|
56
|
+
}
|
|
57
|
+
function AgentThread({ messages, state = "idle", stateCopy, emptyState, toolActions, retryAction, onToolApprovalChoice, maxMessages = defaultMaxAgentThreadMessages, className, contentClassName, children, ...props }) {
|
|
58
|
+
const maxVisibleMessages = Number.isFinite(maxMessages)
|
|
59
|
+
? Math.max(0, Math.floor(maxMessages))
|
|
60
|
+
: defaultMaxAgentThreadMessages;
|
|
61
|
+
const visibleMessages = maxVisibleMessages > 0 ? messages.slice(-maxVisibleMessages) : [];
|
|
62
|
+
const omittedMessages = messages.length - visibleMessages.length;
|
|
63
|
+
const hasMessages = messages.length > 0;
|
|
64
|
+
const nonIdleState = state === "idle" ? undefined : state;
|
|
65
|
+
const stateForRender = nonIdleState && nonIdleState !== "empty" ? nonIdleState : undefined;
|
|
66
|
+
const stateProps = nonIdleState ? stateCopy?.[nonIdleState] : undefined;
|
|
67
|
+
const stateActions = stateForRender === "retryable"
|
|
68
|
+
? retryAction ?? stateProps?.actions
|
|
69
|
+
: stateProps?.actions;
|
|
70
|
+
return (_jsx(Conversation, { "data-slot": "agent-thread", "data-agent-state": state, className: cn("min-h-0 rounded-lg border bg-[var(--nc-chat-surface)]", className), ...props, children: _jsxs(ConversationContent, { className: cn("gap-4", contentClassName), children: [stateForRender && (_jsx(AgentThreadStateBanner, { state: stateForRender, actions: stateActions, title: stateProps?.title, description: stateProps?.description })), omittedMessages > 0 && (_jsx(AgentThreadOverflowSummary, { omittedMessages: omittedMessages })), !hasMessages ? (_jsx(AgentThreadEmptyState, { ...(stateProps ?? emptyState ?? {}) })) : (visibleMessages.map((message) => (_jsx(AgentMessage, { message: message, toolActions: toolActions, retryAction: retryAction, onToolApprovalChoice: onToolApprovalChoice }, message.id)))), children] }) }));
|
|
71
|
+
}
|
|
72
|
+
export { AgentThread, AgentThreadEmptyState, AgentThreadStateBanner };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Card } from "./card";
|
|
3
|
+
export type AgentApprovalChoice = "run" | "deny" | "session" | "always";
|
|
4
|
+
export type AgentApprovalAlias = "approve-once" | "reject" | "approve-session" | "approve-always";
|
|
5
|
+
export type AgentApprovalRisk = "low" | "review" | "elevated" | "blocked";
|
|
6
|
+
export type AgentToolApprovalRequest = {
|
|
7
|
+
id: string;
|
|
8
|
+
toolName: string;
|
|
9
|
+
title?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
scope?: string;
|
|
12
|
+
risk?: AgentApprovalRisk;
|
|
13
|
+
choices?: AgentApprovalChoice[];
|
|
14
|
+
};
|
|
15
|
+
export declare const agentApprovalAliases: {
|
|
16
|
+
readonly always: "approve-always";
|
|
17
|
+
readonly deny: "reject";
|
|
18
|
+
readonly run: "approve-once";
|
|
19
|
+
readonly session: "approve-session";
|
|
20
|
+
};
|
|
21
|
+
declare function AgentToolApproval({ request, title, description, choices, choiceLabels, onChoice, disabled, footer, className, ...props }: Omit<React.ComponentProps<typeof Card>, "children" | "title"> & {
|
|
22
|
+
request: AgentToolApprovalRequest;
|
|
23
|
+
title?: React.ReactNode;
|
|
24
|
+
description?: React.ReactNode;
|
|
25
|
+
choices?: AgentApprovalChoice[];
|
|
26
|
+
choiceLabels?: Partial<Record<AgentApprovalChoice, React.ReactNode>>;
|
|
27
|
+
onChoice?: (choice: AgentApprovalChoice, request: AgentToolApprovalRequest) => void;
|
|
28
|
+
disabled?: boolean;
|
|
29
|
+
footer?: React.ReactNode;
|
|
30
|
+
}): React.JSX.Element;
|
|
31
|
+
export { AgentToolApproval };
|
|
32
|
+
//# sourceMappingURL=agent-tool-approval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tool-approval.d.ts","sourceRoot":"","sources":["../../src/components/agent-tool-approval.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,OAAO,EACL,IAAI,EAML,MAAM,mBAAmB,CAAA;AAG1B,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAA;AAEvE,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,QAAQ,GACR,iBAAiB,GACjB,gBAAgB,CAAA;AAEpB,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAA;AAEzE,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACxB,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAA;CAChC,CAAA;AAED,eAAO,MAAM,oBAAoB;;;;;CAKmC,CAAA;AAgDpE,iBAAS,iBAAiB,CAAC,EACzB,OAAO,EACP,KAAK,EACL,WAAW,EACX,OAAiE,EACjE,YAAY,EACZ,QAAQ,EACR,QAAgB,EAChB,MAAM,EACN,SAAS,EACT,GAAG,KAAK,EACT,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;IACjE,OAAO,EAAE,wBAAwB,CAAA;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC7B,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAA;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAA;IACpE,QAAQ,CAAC,EAAE,CACT,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,wBAAwB,KAC9B,IAAI,CAAA;IACT,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CACzB,qBA4DA;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { BanIcon, CheckIcon, ClockIcon, ShieldCheckIcon, } from "lucide-react";
|
|
4
|
+
import { Badge } from "./badge.js";
|
|
5
|
+
import { Button } from "./button.js";
|
|
6
|
+
import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "./card.js";
|
|
7
|
+
import { cn } from "../lib/utils.js";
|
|
8
|
+
export const agentApprovalAliases = {
|
|
9
|
+
always: "approve-always",
|
|
10
|
+
deny: "reject",
|
|
11
|
+
run: "approve-once",
|
|
12
|
+
session: "approve-session",
|
|
13
|
+
};
|
|
14
|
+
const approvalChoiceDefaults = {
|
|
15
|
+
always: {
|
|
16
|
+
icon: ShieldCheckIcon,
|
|
17
|
+
label: "Always allow",
|
|
18
|
+
variant: "secondary",
|
|
19
|
+
},
|
|
20
|
+
deny: {
|
|
21
|
+
icon: BanIcon,
|
|
22
|
+
label: "Deny",
|
|
23
|
+
variant: "destructive",
|
|
24
|
+
},
|
|
25
|
+
run: {
|
|
26
|
+
icon: CheckIcon,
|
|
27
|
+
label: "Run once",
|
|
28
|
+
variant: "default",
|
|
29
|
+
},
|
|
30
|
+
session: {
|
|
31
|
+
icon: ClockIcon,
|
|
32
|
+
label: "Allow this session",
|
|
33
|
+
variant: "outline",
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
const approvalRiskLabels = {
|
|
37
|
+
blocked: "Blocked",
|
|
38
|
+
elevated: "Elevated",
|
|
39
|
+
low: "Low risk",
|
|
40
|
+
review: "Review",
|
|
41
|
+
};
|
|
42
|
+
function getApprovalChoiceClass(choice) {
|
|
43
|
+
if (choice === "run") {
|
|
44
|
+
return "data-[variant=outline]:text-[var(--nc-tool-approval-run)]";
|
|
45
|
+
}
|
|
46
|
+
if (choice === "deny") {
|
|
47
|
+
return "data-[variant=outline]:text-[var(--nc-tool-approval-deny)]";
|
|
48
|
+
}
|
|
49
|
+
if (choice === "session") {
|
|
50
|
+
return "data-[variant=outline]:text-[var(--nc-tool-approval-session)]";
|
|
51
|
+
}
|
|
52
|
+
return "data-[variant=outline]:text-[var(--nc-tool-approval-always)]";
|
|
53
|
+
}
|
|
54
|
+
function AgentToolApproval({ request, title, description, choices = request.choices ?? ["run", "deny", "session", "always"], choiceLabels, onChoice, disabled = false, footer, className, ...props }) {
|
|
55
|
+
return (_jsxs(Card, { "data-slot": "agent-tool-approval", "data-tool-name": request.toolName, "data-risk": request.risk, className: cn("gap-4 border-dashed bg-muted/20 shadow-none", className), ...props, children: [_jsxs(CardHeader, { className: "gap-2", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [request.risk && (_jsx(Badge, { variant: "outline", children: approvalRiskLabels[request.risk] })), _jsx(Badge, { variant: "secondary", children: request.toolName })] }), _jsx(CardTitle, { children: title ?? request.title ?? "Approval required" }), (description ?? request.description) && (_jsx(CardDescription, { children: description ?? request.description })), request.scope && (_jsx(CardDescription, { "data-slot": "agent-tool-approval-scope", children: request.scope }))] }), _jsx(CardContent, { children: _jsx("div", { "data-slot": "agent-tool-approval-choices", className: "flex flex-wrap gap-2", children: choices.map((choice) => {
|
|
56
|
+
const defaults = approvalChoiceDefaults[choice];
|
|
57
|
+
const Icon = defaults.icon;
|
|
58
|
+
return (_jsxs(Button, { type: "button", variant: defaults.variant, disabled: disabled, "data-approval-choice": choice, "data-approval-alias": agentApprovalAliases[choice], className: cn(getApprovalChoiceClass(choice)), onClick: () => onChoice?.(choice, request), children: [_jsx(Icon, { className: "size-4", "data-icon": true }), choiceLabels?.[choice] ?? defaults.label] }, choice));
|
|
59
|
+
}) }) }), footer && _jsx(CardFooter, { children: footer })] }));
|
|
60
|
+
}
|
|
61
|
+
export { AgentToolApproval };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Accordion, AccordionItem } from "../accordion";
|
|
2
|
+
import type { Tool } from "ai";
|
|
3
|
+
import type { ComponentProps } from "react";
|
|
4
|
+
export type AgentProps = ComponentProps<"div">;
|
|
5
|
+
export declare const Agent: import("react").MemoExoticComponent<({ className, ...props }: AgentProps) => import("react").JSX.Element>;
|
|
6
|
+
export type AgentHeaderProps = ComponentProps<"div"> & {
|
|
7
|
+
name: string;
|
|
8
|
+
model?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const AgentHeader: import("react").MemoExoticComponent<({ className, name, model, ...props }: AgentHeaderProps) => import("react").JSX.Element>;
|
|
11
|
+
export type AgentContentProps = ComponentProps<"div">;
|
|
12
|
+
export declare const AgentContent: import("react").MemoExoticComponent<({ className, ...props }: AgentContentProps) => import("react").JSX.Element>;
|
|
13
|
+
export type AgentInstructionsProps = ComponentProps<"div"> & {
|
|
14
|
+
children: string;
|
|
15
|
+
};
|
|
16
|
+
export declare const AgentInstructions: import("react").MemoExoticComponent<({ className, children, ...props }: AgentInstructionsProps) => import("react").JSX.Element>;
|
|
17
|
+
export type AgentToolsProps = ComponentProps<typeof Accordion>;
|
|
18
|
+
export declare const AgentTools: import("react").MemoExoticComponent<({ className, ...props }: AgentToolsProps) => import("react").JSX.Element>;
|
|
19
|
+
export type AgentToolProps = ComponentProps<typeof AccordionItem> & {
|
|
20
|
+
tool: Tool;
|
|
21
|
+
};
|
|
22
|
+
export declare const AgentTool: import("react").MemoExoticComponent<({ className, tool, value, ...props }: AgentToolProps) => import("react").JSX.Element>;
|
|
23
|
+
export type AgentOutputProps = ComponentProps<"div"> & {
|
|
24
|
+
schema: string;
|
|
25
|
+
};
|
|
26
|
+
export declare const AgentOutput: import("react").MemoExoticComponent<({ className, schema, ...props }: AgentOutputProps) => import("react").JSX.Element>;
|
|
27
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../../src/components/ai-elements/agent.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,SAAS,EAET,aAAa,EAEd,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAK5C,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAE/C,eAAO,MAAM,KAAK,gEAAkC,UAAU,iCAK5D,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,WAAW,6EACiB,gBAAgB,iCAmBxD,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;AAEtD,eAAO,MAAM,YAAY,gEACG,iBAAiB,iCAG5C,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG;IAC3D,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,iBAAiB,0EACQ,sBAAsB,iCAU3D,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,SAAS,CAAC,CAAC;AAE/D,eAAO,MAAM,UAAU,gEAAkC,eAAe,iCAKtE,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,aAAa,CAAC,GAAG;IAClE,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,eAAO,MAAM,SAAS,6EACmB,cAAc,iCAuBtD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG;IACrD,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,WAAW,wEACY,gBAAgB,iCAUnD,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "../accordion.js";
|
|
4
|
+
import { Badge } from "../badge.js";
|
|
5
|
+
import { cn } from "../../lib/utils.js";
|
|
6
|
+
import { BotIcon } from "lucide-react";
|
|
7
|
+
import { memo } from "react";
|
|
8
|
+
import { CodeBlock } from "./code-block.js";
|
|
9
|
+
export const Agent = memo(({ className, ...props }) => (_jsx("div", { className: cn("not-prose w-full rounded-md border", className), ...props })));
|
|
10
|
+
export const AgentHeader = memo(({ className, name, model, ...props }) => (_jsx("div", { className: cn("flex w-full items-center justify-between gap-4 p-3", className), ...props, children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(BotIcon, { className: "size-4 text-muted-foreground" }), _jsx("span", { className: "font-medium text-sm", children: name }), model && (_jsx(Badge, { className: "font-mono text-xs", variant: "secondary", children: model }))] }) })));
|
|
11
|
+
export const AgentContent = memo(({ className, ...props }) => (_jsx("div", { className: cn("flex flex-col gap-4 p-4 pt-0", className), ...props })));
|
|
12
|
+
export const AgentInstructions = memo(({ className, children, ...props }) => (_jsxs("div", { className: cn("flex flex-col gap-2", className), ...props, children: [_jsx("span", { className: "font-medium text-muted-foreground text-sm", children: "Instructions" }), _jsx("div", { className: "rounded-md bg-muted/50 p-3 text-muted-foreground text-sm", children: _jsx("p", { children: children }) })] })));
|
|
13
|
+
export const AgentTools = memo(({ className, ...props }) => (_jsxs("div", { className: cn("flex flex-col gap-2", className), children: [_jsx("span", { className: "font-medium text-muted-foreground text-sm", children: "Tools" }), _jsx(Accordion, { className: "rounded-md border", ...props })] })));
|
|
14
|
+
export const AgentTool = memo(({ className, tool, value, ...props }) => {
|
|
15
|
+
const schema = "jsonSchema" in tool && tool.jsonSchema
|
|
16
|
+
? tool.jsonSchema
|
|
17
|
+
: tool.inputSchema;
|
|
18
|
+
return (_jsxs(AccordionItem, { className: cn("border-b last:border-b-0", className), value: value, ...props, children: [_jsx(AccordionTrigger, { className: "px-3 py-2 text-sm hover:no-underline", children: tool.description ?? "No description" }), _jsx(AccordionContent, { className: "px-3 pb-3", children: _jsx("div", { className: "rounded-md bg-muted/50", children: _jsx(CodeBlock, { code: JSON.stringify(schema, null, 2), language: "json" }) }) })] }));
|
|
19
|
+
});
|
|
20
|
+
export const AgentOutput = memo(({ className, schema, ...props }) => (_jsxs("div", { className: cn("flex flex-col gap-2", className), ...props, children: [_jsx("span", { className: "font-medium text-muted-foreground text-sm", children: "Output Schema" }), _jsx("div", { className: "rounded-md bg-muted/50", children: _jsx(CodeBlock, { code: schema, language: "typescript" }) })] })));
|
|
21
|
+
Agent.displayName = "Agent";
|
|
22
|
+
AgentHeader.displayName = "AgentHeader";
|
|
23
|
+
AgentContent.displayName = "AgentContent";
|
|
24
|
+
AgentInstructions.displayName = "AgentInstructions";
|
|
25
|
+
AgentTools.displayName = "AgentTools";
|
|
26
|
+
AgentTool.displayName = "AgentTool";
|
|
27
|
+
AgentOutput.displayName = "AgentOutput";
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Button } from "../button";
|
|
2
|
+
import type { LucideIcon } from "lucide-react";
|
|
3
|
+
import type { ComponentProps, HTMLAttributes } from "react";
|
|
4
|
+
export type ArtifactProps = HTMLAttributes<HTMLDivElement>;
|
|
5
|
+
export declare const Artifact: ({ className, ...props }: ArtifactProps) => import("react").JSX.Element;
|
|
6
|
+
export type ArtifactHeaderProps = HTMLAttributes<HTMLDivElement>;
|
|
7
|
+
export declare const ArtifactHeader: ({ className, ...props }: ArtifactHeaderProps) => import("react").JSX.Element;
|
|
8
|
+
export type ArtifactCloseProps = ComponentProps<typeof Button>;
|
|
9
|
+
export declare const ArtifactClose: ({ className, children, size, variant, ...props }: ArtifactCloseProps) => import("react").JSX.Element;
|
|
10
|
+
export type ArtifactTitleProps = HTMLAttributes<HTMLParagraphElement>;
|
|
11
|
+
export declare const ArtifactTitle: ({ className, ...props }: ArtifactTitleProps) => import("react").JSX.Element;
|
|
12
|
+
export type ArtifactDescriptionProps = HTMLAttributes<HTMLParagraphElement>;
|
|
13
|
+
export declare const ArtifactDescription: ({ className, ...props }: ArtifactDescriptionProps) => import("react").JSX.Element;
|
|
14
|
+
export type ArtifactActionsProps = HTMLAttributes<HTMLDivElement>;
|
|
15
|
+
export declare const ArtifactActions: ({ className, ...props }: ArtifactActionsProps) => import("react").JSX.Element;
|
|
16
|
+
export type ArtifactActionProps = ComponentProps<typeof Button> & {
|
|
17
|
+
tooltip?: string;
|
|
18
|
+
label?: string;
|
|
19
|
+
icon?: LucideIcon;
|
|
20
|
+
};
|
|
21
|
+
export declare const ArtifactAction: ({ tooltip, label, icon: Icon, children, className, size, variant, ...props }: ArtifactActionProps) => import("react").JSX.Element;
|
|
22
|
+
export type ArtifactContentProps = HTMLAttributes<HTMLDivElement>;
|
|
23
|
+
export declare const ArtifactContent: ({ className, ...props }: ArtifactContentProps) => import("react").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=artifact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../../../src/components/ai-elements/artifact.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAQ7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAE3D,eAAO,MAAM,QAAQ,GAAI,yBAAyB,aAAa,gCAQ9D,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAEjE,eAAO,MAAM,cAAc,GAAI,yBAG5B,mBAAmB,gCAQrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,OAAO,MAAM,CAAC,CAAC;AAE/D,eAAO,MAAM,aAAa,GAAI,kDAM3B,kBAAkB,gCAcpB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,cAAc,CAAC,oBAAoB,CAAC,CAAC;AAEtE,eAAO,MAAM,aAAa,GAAI,yBAAyB,kBAAkB,gCAKxE,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,cAAc,CAAC,oBAAoB,CAAC,CAAC;AAE5E,eAAO,MAAM,mBAAmB,GAAI,yBAGjC,wBAAwB,gCAE1B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAElE,eAAO,MAAM,eAAe,GAAI,yBAG7B,oBAAoB,gCAEtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC,OAAO,MAAM,CAAC,GAAG;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,8EAS5B,mBAAmB,gCA+BrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;AAElE,eAAO,MAAM,eAAe,GAAI,yBAG7B,oBAAoB,gCAEtB,CAAC"}
|