@agent-native/toolkit 0.228.0-nightly-20261111212500 → 0.228.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/agent-native.eject.json +2 -0
- package/dist/app/agentkit/react/approval-card.d.ts.map +1 -1
- package/dist/app/agentkit/react/approval-card.js +5 -3
- package/dist/app/agentkit/react/approval-card.js.map +1 -1
- package/dist/app/agentkit/react/code-block.d.ts +32 -0
- package/dist/app/agentkit/react/code-block.d.ts.map +1 -0
- package/dist/app/agentkit/react/code-block.js +125 -0
- package/dist/app/agentkit/react/code-block.js.map +1 -0
- package/dist/app/agentkit/react/components.d.ts +33 -14
- package/dist/app/agentkit/react/components.d.ts.map +1 -1
- package/dist/app/agentkit/react/components.js +843 -168
- package/dist/app/agentkit/react/components.js.map +1 -1
- package/dist/app/agentkit/react/context-usage.d.ts +45 -0
- package/dist/app/agentkit/react/context-usage.d.ts.map +1 -0
- package/dist/app/agentkit/react/context-usage.js +93 -0
- package/dist/app/agentkit/react/context-usage.js.map +1 -0
- package/dist/app/agentkit/react/context.d.ts +42 -3
- package/dist/app/agentkit/react/context.d.ts.map +1 -1
- package/dist/app/agentkit/react/context.js +46 -1
- package/dist/app/agentkit/react/context.js.map +1 -1
- package/dist/app/agentkit/react/disclosure-content.d.ts +12 -0
- package/dist/app/agentkit/react/disclosure-content.d.ts.map +1 -0
- package/dist/app/agentkit/react/disclosure-content.js +33 -0
- package/dist/app/agentkit/react/disclosure-content.js.map +1 -0
- package/dist/app/agentkit/react/duration.d.ts +6 -0
- package/dist/app/agentkit/react/duration.d.ts.map +1 -0
- package/dist/app/agentkit/react/duration.js +21 -0
- package/dist/app/agentkit/react/duration.js.map +1 -0
- package/dist/app/agentkit/react/file-change.d.ts +33 -0
- package/dist/app/agentkit/react/file-change.d.ts.map +1 -0
- package/dist/app/agentkit/react/file-change.js +83 -0
- package/dist/app/agentkit/react/file-change.js.map +1 -0
- package/dist/app/agentkit/react/file-diff.d.ts +17 -0
- package/dist/app/agentkit/react/file-diff.d.ts.map +1 -0
- package/dist/app/agentkit/react/file-diff.js +94 -0
- package/dist/app/agentkit/react/file-diff.js.map +1 -0
- package/dist/app/agentkit/react/index.d.ts +7 -0
- package/dist/app/agentkit/react/index.d.ts.map +1 -1
- package/dist/app/agentkit/react/index.js +7 -0
- package/dist/app/agentkit/react/index.js.map +1 -1
- package/dist/app/agentkit/react/question-card.d.ts +67 -0
- package/dist/app/agentkit/react/question-card.d.ts.map +1 -0
- package/dist/app/agentkit/react/question-card.js +198 -0
- package/dist/app/agentkit/react/question-card.js.map +1 -0
- package/dist/app/agentkit/react/root.d.ts +3 -2
- package/dist/app/agentkit/react/root.d.ts.map +1 -1
- package/dist/app/agentkit/react/root.js +2 -2
- package/dist/app/agentkit/react/root.js.map +1 -1
- package/dist/app/agentkit/react/roving-focus.d.ts +4 -0
- package/dist/app/agentkit/react/roving-focus.d.ts.map +1 -0
- package/dist/app/agentkit/react/roving-focus.js +75 -0
- package/dist/app/agentkit/react/roving-focus.js.map +1 -0
- package/dist/app/agentkit/react/stack-trace.d.ts +34 -0
- package/dist/app/agentkit/react/stack-trace.d.ts.map +1 -0
- package/dist/app/agentkit/react/stack-trace.js +121 -0
- package/dist/app/agentkit/react/stack-trace.js.map +1 -0
- package/dist/app/agentkit/react/stop-button.d.ts.map +1 -1
- package/dist/app/agentkit/react/stop-button.js +22 -6
- package/dist/app/agentkit/react/stop-button.js.map +1 -1
- package/dist/app/agentkit/react/styles.css +1306 -395
- package/dist/app/agentkit/react/terminal.d.ts +28 -0
- package/dist/app/agentkit/react/terminal.d.ts.map +1 -0
- package/dist/app/agentkit/react/terminal.js +84 -0
- package/dist/app/agentkit/react/terminal.js.map +1 -0
- package/dist/app/agentkit/react/trace.d.ts +31 -0
- package/dist/app/agentkit/react/trace.d.ts.map +1 -0
- package/dist/app/agentkit/react/trace.js +73 -0
- package/dist/app/agentkit/react/trace.js.map +1 -0
- package/dist/app/blocks/library/HighlightedCode.d.ts +2 -1
- package/dist/app/blocks/library/HighlightedCode.d.ts.map +1 -1
- package/dist/app/blocks/library/HighlightedCode.js +8 -111
- package/dist/app/blocks/library/HighlightedCode.js.map +1 -1
- package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
- package/dist/app/chat/AgentKitAssistantChat.js +23 -245
- package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
- package/dist/app/chat/agentkit-chat/guided-questions.d.ts +15 -1
- package/dist/app/chat/agentkit-chat/guided-questions.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/guided-questions.js +142 -2
- package/dist/app/chat/agentkit-chat/guided-questions.js.map +1 -1
- package/dist/app/chat/agentkit-chat/history.js +1 -1
- package/dist/app/chat/agentkit-chat/history.js.map +1 -1
- package/dist/app/chat/agentkit-chat/index.d.ts +1 -1
- package/dist/app/chat/agentkit-chat/index.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/index.js +1 -1
- package/dist/app/chat/agentkit-chat/index.js.map +1 -1
- package/dist/app/chat/agentkit-chat/labels.d.ts +5 -0
- package/dist/app/chat/agentkit-chat/labels.d.ts.map +1 -0
- package/dist/app/chat/agentkit-chat/labels.js +245 -0
- package/dist/app/chat/agentkit-chat/labels.js.map +1 -0
- package/dist/app/chat/agentkit-chat/questions.d.ts +1 -1
- package/dist/app/chat/agentkit-chat/questions.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/questions.js +1 -1
- package/dist/app/chat/agentkit-chat/questions.js.map +1 -1
- package/dist/app/chat/agentkit-chat/root.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/root.js +5 -64
- package/dist/app/chat/agentkit-chat/root.js.map +1 -1
- package/dist/app/chat/agentkit-chat/work-step-labels.d.ts +2 -0
- package/dist/app/chat/agentkit-chat/work-step-labels.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/work-step-labels.js +31 -0
- package/dist/app/chat/agentkit-chat/work-step-labels.js.map +1 -1
- package/dist/app/chat/chat/markdown-renderer.d.ts +2 -12
- package/dist/app/chat/chat/markdown-renderer.d.ts.map +1 -1
- package/dist/app/chat/chat/markdown-renderer.js +2 -41
- package/dist/app/chat/chat/markdown-renderer.js.map +1 -1
- package/dist/app/chat/chat/tool-call-display.d.ts.map +1 -1
- package/dist/app/chat/chat/tool-call-display.js +2 -2
- package/dist/app/chat/chat/tool-call-display.js.map +1 -1
- package/dist/app/chat/conversation/AgentConversation.d.ts.map +1 -1
- package/dist/app/chat/conversation/AgentConversation.js +2 -37
- package/dist/app/chat/conversation/AgentConversation.js.map +1 -1
- package/dist/app/chat/tool-cells/BashCell.d.ts +3 -1
- package/dist/app/chat/tool-cells/BashCell.d.ts.map +1 -1
- package/dist/app/chat/tool-cells/BashCell.js +4 -40
- package/dist/app/chat/tool-cells/BashCell.js.map +1 -1
- package/dist/app/chat/tool-cells/EditCell.d.ts.map +1 -1
- package/dist/app/chat/tool-cells/EditCell.js +5 -108
- package/dist/app/chat/tool-cells/EditCell.js.map +1 -1
- package/dist/app/chat/tool-cells/FilesChangedSummary.d.ts.map +1 -1
- package/dist/app/chat/tool-cells/FilesChangedSummary.js +23 -81
- package/dist/app/chat/tool-cells/FilesChangedSummary.js.map +1 -1
- package/dist/app/chat/tool-cells/WriteCell.d.ts.map +1 -1
- package/dist/app/chat/tool-cells/WriteCell.js +5 -24
- package/dist/app/chat/tool-cells/WriteCell.js.map +1 -1
- package/dist/app/code-highlighter.d.ts +11 -0
- package/dist/app/code-highlighter.d.ts.map +1 -0
- package/dist/app/code-highlighter.js +122 -0
- package/dist/app/code-highlighter.js.map +1 -0
- package/dist/app/context-xray/ThreadContextRing.js +3 -3
- package/dist/app/context-xray/ThreadContextRing.js.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.js +22 -0
- package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.js +22 -0
- package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
- package/dist/app/i18n/catalogs/en-US.d.ts +22 -0
- package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/en-US.js +22 -0
- package/dist/app/i18n/catalogs/en-US.js.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.js +22 -0
- package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.js +22 -0
- package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.js +22 -0
- package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.js +22 -0
- package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.js +22 -0
- package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.js +22 -0
- package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.js +22 -0
- package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.js +22 -0
- package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
- package/dist/app/onboarding/first-run-first-paint.d.ts +10 -0
- package/dist/app/onboarding/first-run-first-paint.d.ts.map +1 -0
- package/dist/app/onboarding/first-run-first-paint.js +22 -0
- package/dist/app/onboarding/first-run-first-paint.js.map +1 -0
- package/dist/app/onboarding/first-run-startup-gate.d.ts +3 -1
- package/dist/app/onboarding/first-run-startup-gate.d.ts.map +1 -1
- package/dist/app/onboarding/first-run-startup-gate.js +30 -6
- package/dist/app/onboarding/first-run-startup-gate.js.map +1 -1
- package/dist/app/providers/AppProviders.d.ts.map +1 -1
- package/dist/app/providers/AppProviders.js +9 -2
- package/dist/app/providers/AppProviders.js.map +1 -1
- package/dist/app/providers/BuilderSignupActivation.d.ts +2 -1
- package/dist/app/providers/BuilderSignupActivation.d.ts.map +1 -1
- package/dist/app/providers/BuilderSignupActivation.js +6 -3
- package/dist/app/providers/BuilderSignupActivation.js.map +1 -1
- package/dist/app/shared/AppShellSkeleton.d.ts.map +1 -1
- package/dist/app/shared/AppShellSkeleton.js +11 -1
- package/dist/app/shared/AppShellSkeleton.js.map +1 -1
- package/dist/app/styles/agent-native.css +2 -2
- package/dist/app/styles/tokens/agent-kit.css +20 -3
- package/dist/composer/AgentSuggestionBar.d.ts.map +1 -1
- package/dist/composer/AgentSuggestionBar.js +2 -2
- package/dist/composer/AgentSuggestionBar.js.map +1 -1
- package/dist/composer/ComposerContextMenu.js +4 -4
- package/dist/composer/ComposerContextMenu.js.map +1 -1
- package/dist/composer/ComposerContextPicker.d.ts.map +1 -1
- package/dist/composer/ComposerContextPicker.js +2 -2
- package/dist/composer/ComposerContextPicker.js.map +1 -1
- package/dist/composer/ComposerContextPickerDialog.d.ts.map +1 -1
- package/dist/composer/ComposerContextPickerDialog.js +2 -2
- package/dist/composer/ComposerContextPickerDialog.js.map +1 -1
- package/dist/composer/ComposerModePicker.d.ts.map +1 -1
- package/dist/composer/ComposerModePicker.js +2 -1
- package/dist/composer/ComposerModePicker.js.map +1 -1
- package/dist/composer/ComposerPlusMenu.js +1 -1
- package/dist/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/composer/MentionChip.js +1 -1
- package/dist/composer/MentionChip.js.map +1 -1
- package/dist/composer/MentionPopover.d.ts +3 -0
- package/dist/composer/MentionPopover.d.ts.map +1 -1
- package/dist/composer/MentionPopover.js +34 -15
- package/dist/composer/MentionPopover.js.map +1 -1
- package/dist/composer/MessageQueueDrawer.d.ts.map +1 -1
- package/dist/composer/MessageQueueDrawer.js +14 -9
- package/dist/composer/MessageQueueDrawer.js.map +1 -1
- package/dist/composer/PastedTextChip.d.ts.map +1 -1
- package/dist/composer/PastedTextChip.js +14 -18
- package/dist/composer/PastedTextChip.js.map +1 -1
- package/dist/composer/PromptBar.js +1 -1
- package/dist/composer/PromptBar.js.map +1 -1
- package/dist/composer/PromptComposer.d.ts.map +1 -1
- package/dist/composer/PromptComposer.js +11 -9
- package/dist/composer/PromptComposer.js.map +1 -1
- package/dist/composer/RealtimeVoiceMode.js +2 -2
- package/dist/composer/RealtimeVoiceMode.js.map +1 -1
- package/dist/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/composer/TiptapComposer.js +52 -89
- package/dist/composer/TiptapComposer.js.map +1 -1
- package/dist/composer/VoiceButton.d.ts +3 -1
- package/dist/composer/VoiceButton.d.ts.map +1 -1
- package/dist/composer/VoiceButton.js +10 -8
- package/dist/composer/VoiceButton.js.map +1 -1
- package/dist/composer/composer-notice.js +3 -3
- package/dist/composer/composer-notice.js.map +1 -1
- package/dist/composer/extensions/FileReference.js +1 -1
- package/dist/composer/extensions/FileReference.js.map +1 -1
- package/dist/composer/extensions/SkillReference.js +1 -1
- package/dist/composer/extensions/SkillReference.js.map +1 -1
- package/dist/composer/popover-surface.d.ts +1 -1
- package/dist/composer/popover-surface.d.ts.map +1 -1
- package/dist/composer/popover-surface.js +1 -1
- package/dist/composer/popover-surface.js.map +1 -1
- package/dist/context-ui/ContextUsageRing.d.ts +1 -45
- package/dist/context-ui/ContextUsageRing.d.ts.map +1 -1
- package/dist/context-ui/ContextUsageRing.js +2 -87
- package/dist/context-ui/ContextUsageRing.js.map +1 -1
- package/dist/context-ui/index.d.ts +2 -2
- package/dist/context-ui/index.d.ts.map +1 -1
- package/dist/context-ui/index.js +2 -2
- package/dist/context-ui/index.js.map +1 -1
- package/package.json +4 -4
- package/src/app/agentkit/react/approval-card.tsx +14 -2
- package/src/app/agentkit/react/code-block.spec.tsx +154 -0
- package/src/app/agentkit/react/code-block.tsx +317 -0
- package/src/app/agentkit/react/components.interaction.spec.tsx +7 -0
- package/src/app/agentkit/react/components.papercuts.spec.tsx +143 -2
- package/src/app/agentkit/react/components.spec.tsx +40 -47
- package/src/app/agentkit/react/components.tsx +1533 -413
- package/src/app/agentkit/react/composer-context.spec.tsx +35 -0
- package/src/app/agentkit/react/context-usage.tsx +353 -0
- package/src/app/agentkit/react/context.tsx +93 -1
- package/src/app/agentkit/react/disclosure-content.ts +42 -0
- package/src/app/agentkit/react/disclosures.spec.tsx +62 -4
- package/src/app/agentkit/react/duration.ts +22 -0
- package/src/app/agentkit/react/file-change.spec.tsx +124 -0
- package/src/app/agentkit/react/file-change.tsx +228 -0
- package/src/app/agentkit/react/file-diff.ts +110 -0
- package/src/app/agentkit/react/index.ts +7 -0
- package/src/app/agentkit/react/lifecycle.spec.tsx +565 -20
- package/src/app/agentkit/react/markdown.spec.tsx +18 -8
- package/src/app/agentkit/react/message-actions.spec.tsx +55 -1
- package/src/app/agentkit/react/notices.spec.tsx +4 -4
- package/src/app/agentkit/react/optimistic-send.spec.tsx +43 -0
- package/src/app/agentkit/react/question-card.spec.tsx +276 -0
- package/src/app/agentkit/react/question-card.tsx +533 -0
- package/src/app/agentkit/react/root.tsx +4 -0
- package/src/app/agentkit/react/roving-focus.spec.tsx +114 -0
- package/src/app/agentkit/react/roving-focus.ts +82 -0
- package/src/app/agentkit/react/stack-trace.spec.tsx +177 -0
- package/src/app/agentkit/react/stack-trace.tsx +281 -0
- package/src/app/agentkit/react/stop-button.spec.tsx +40 -0
- package/src/app/agentkit/react/stop-button.tsx +22 -5
- package/src/app/agentkit/react/styles.css +1306 -395
- package/src/app/agentkit/react/subagent-step.spec.tsx +554 -0
- package/src/app/agentkit/react/terminal.spec.tsx +228 -0
- package/src/app/agentkit/react/terminal.tsx +228 -0
- package/src/app/agentkit/react/trace.spec.tsx +120 -0
- package/src/app/agentkit/react/trace.tsx +239 -0
- package/src/app/blocks/library/HighlightedCode.tsx +14 -126
- package/src/app/chat/AgentKitAssistantChat.spec.tsx +28 -12
- package/src/app/chat/AgentKitAssistantChat.tsx +27 -253
- package/src/app/chat/agentkit-chat/approval-card.spec.tsx +1 -0
- package/src/app/chat/agentkit-chat/guided-questions.flow.spec.tsx +381 -0
- package/src/app/chat/agentkit-chat/guided-questions.tsx +236 -3
- package/src/app/chat/agentkit-chat/history.tsx +1 -1
- package/src/app/chat/agentkit-chat/index.ts +2 -0
- package/src/app/chat/agentkit-chat/labels.ts +259 -0
- package/src/app/chat/agentkit-chat/questions.ts +2 -0
- package/src/app/chat/agentkit-chat/root.spec.tsx +18 -0
- package/src/app/chat/agentkit-chat/root.tsx +5 -64
- package/src/app/chat/agentkit-chat/work-step-labels.ts +42 -0
- package/src/app/chat/chat/markdown-renderer.tsx +2 -59
- package/src/app/chat/chat/tool-call-display.spec.tsx +26 -14
- package/src/app/chat/chat/tool-call-display.tsx +2 -1
- package/src/app/chat/conversation/AgentConversation.tsx +2 -50
- package/src/app/chat/tool-cells/BashCell.tsx +14 -136
- package/src/app/chat/tool-cells/EditCell.tsx +11 -248
- package/src/app/chat/tool-cells/FilesChangedSummary.spec.tsx +62 -5
- package/src/app/chat/tool-cells/FilesChangedSummary.tsx +31 -162
- package/src/app/chat/tool-cells/WriteCell.tsx +11 -121
- package/src/app/code-highlighter.ts +131 -0
- package/src/app/context-xray/ThreadContextRing.tsx +7 -7
- package/src/app/i18n/catalogs/ar-SA.ts +22 -0
- package/src/app/i18n/catalogs/de-DE.ts +22 -0
- package/src/app/i18n/catalogs/en-US.ts +22 -0
- package/src/app/i18n/catalogs/es-ES.ts +22 -0
- package/src/app/i18n/catalogs/fr-FR.ts +22 -0
- package/src/app/i18n/catalogs/hi-IN.ts +22 -0
- package/src/app/i18n/catalogs/ja-JP.ts +22 -0
- package/src/app/i18n/catalogs/ko-KR.ts +22 -0
- package/src/app/i18n/catalogs/pt-BR.ts +22 -0
- package/src/app/i18n/catalogs/zh-CN.ts +22 -0
- package/src/app/i18n/catalogs/zh-TW.ts +22 -0
- package/src/app/onboarding/first-run-first-paint.spec.ts +39 -0
- package/src/app/onboarding/first-run-first-paint.ts +24 -0
- package/src/app/onboarding/first-run-startup-gate.spec.tsx +125 -13
- package/src/app/onboarding/first-run-startup-gate.tsx +48 -5
- package/src/app/providers/AppProviders.tsx +18 -0
- package/src/app/providers/BuilderSignupActivation.tsx +8 -2
- package/src/app/shared/AppShellSkeleton.spec.tsx +60 -1
- package/src/app/shared/AppShellSkeleton.tsx +31 -1
- package/src/app/styles/agent-native.css +2 -2
- package/src/app/styles/agent-native.spec.ts +2 -2
- package/src/app/styles/tokens/agent-kit.css +20 -3
- package/src/composer/AgentSuggestionBar.spec.tsx +3 -1
- package/src/composer/AgentSuggestionBar.tsx +5 -2
- package/src/composer/ComposerContextMenu.tsx +4 -4
- package/src/composer/ComposerContextPicker.tsx +8 -2
- package/src/composer/ComposerContextPickerDialog.tsx +5 -2
- package/src/composer/ComposerModePicker.tsx +2 -1
- package/src/composer/ComposerPlusMenu.tsx +1 -1
- package/src/composer/MentionChip.tsx +1 -1
- package/src/composer/MentionPopover.spec.tsx +108 -2
- package/src/composer/MentionPopover.tsx +93 -17
- package/src/composer/MessageQueueDrawer.spec.tsx +5 -5
- package/src/composer/MessageQueueDrawer.tsx +19 -12
- package/src/composer/PastedTextChip.spec.tsx +36 -0
- package/src/composer/PastedTextChip.tsx +52 -58
- package/src/composer/PromptBar.tsx +1 -1
- package/src/composer/PromptComposer.context.spec.tsx +2 -2
- package/src/composer/PromptComposer.submission.spec.tsx +27 -0
- package/src/composer/PromptComposer.tsx +17 -9
- package/src/composer/RealtimeVoiceMode.tsx +2 -2
- package/src/composer/TiptapComposer.model-picker.spec.tsx +23 -82
- package/src/composer/TiptapComposer.tsx +68 -145
- package/src/composer/VoiceButton.tsx +12 -7
- package/src/composer/composer-notice.tsx +3 -3
- package/src/composer/extensions/FileReference.tsx +1 -1
- package/src/composer/extensions/SkillReference.tsx +1 -1
- package/src/composer/popover-surface.ts +1 -1
- package/src/context-ui/ContextUsageRing.spec.tsx +33 -8
- package/src/context-ui/ContextUsageRing.tsx +13 -348
- package/src/context-ui/index.ts +7 -1
- package/dist/composer/ModelPickerParts.d.ts +0 -20
- package/dist/composer/ModelPickerParts.d.ts.map +0 -1
- package/dist/composer/ModelPickerParts.js +0 -77
- package/dist/composer/ModelPickerParts.js.map +0 -1
- package/src/composer/ModelPickerParts.tsx +0 -188
|
@@ -5,9 +5,10 @@ import { act } from "react";
|
|
|
5
5
|
import { createRoot } from "react-dom/client";
|
|
6
6
|
import { renderToStaticMarkup } from "react-dom/server";
|
|
7
7
|
import { MemoryRouter } from "react-router";
|
|
8
|
-
import { describe, expect, it } from "vitest";
|
|
8
|
+
import { afterEach, describe, expect, it } from "vitest";
|
|
9
9
|
|
|
10
10
|
import { consumeFirstPaintPromptDraft } from "../../app-shell/first-paint-prompt-draft.js";
|
|
11
|
+
import { FIRST_RUN_PENDING_ATTRIBUTE } from "../onboarding/first-run-first-paint.js";
|
|
11
12
|
import { AppShellSkeleton } from "./AppShellSkeleton.js";
|
|
12
13
|
import type { AppShellFirstPaintHome } from "./AppShellSkeleton.js";
|
|
13
14
|
|
|
@@ -21,6 +22,64 @@ function render(layout: Parameters<typeof AppShellSkeleton>[0]["layout"]) {
|
|
|
21
22
|
)!;
|
|
22
23
|
}
|
|
23
24
|
|
|
25
|
+
function firstPaintFixture(): AppShellFirstPaintHome {
|
|
26
|
+
return {
|
|
27
|
+
appId: "slides",
|
|
28
|
+
appName: "Slides",
|
|
29
|
+
pageTitle: "Decks",
|
|
30
|
+
promptTitle: "Let's create your first presentation",
|
|
31
|
+
promptPlaceholder: "Describe your presentation",
|
|
32
|
+
suggestedPromptsLabel: "Suggested prompts",
|
|
33
|
+
sidebarItems: [{ label: "Decks", to: "/home", icon: IconHome }],
|
|
34
|
+
templatesLabel: "Templates",
|
|
35
|
+
recentLabel: "Recent",
|
|
36
|
+
browseAllLabel: "Browse all",
|
|
37
|
+
skipPromptLabel: "Skip prompt",
|
|
38
|
+
promptDraftScope: "slides:new:viewer-a:org-a",
|
|
39
|
+
promptHandoffScope: "viewer-a:org-a",
|
|
40
|
+
suggestions: [],
|
|
41
|
+
renderComposer: (props) => <textarea aria-label={props.ariaLabel} />,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
describe("AppShellSkeleton first-paint home before first run", () => {
|
|
46
|
+
afterEach(() => {
|
|
47
|
+
document.documentElement.removeAttribute(FIRST_RUN_PENDING_ATTRIBUTE);
|
|
48
|
+
document.body.innerHTML = "";
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
function paint() {
|
|
52
|
+
document.body.innerHTML = renderToStaticMarkup(
|
|
53
|
+
<MemoryRouter>
|
|
54
|
+
<AppShellSkeleton
|
|
55
|
+
layout="prompt-library"
|
|
56
|
+
firstPaintHome={firstPaintFixture()}
|
|
57
|
+
/>
|
|
58
|
+
</MemoryRouter>,
|
|
59
|
+
);
|
|
60
|
+
const display = (selector: string) =>
|
|
61
|
+
getComputedStyle(document.querySelector<HTMLElement>(selector)!).display;
|
|
62
|
+
return {
|
|
63
|
+
home: display("[data-agent-native-first-paint-home]"),
|
|
64
|
+
skeleton: display("[data-agent-native-first-run-skeleton]"),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
it("paints the home when first run is not pending", () => {
|
|
69
|
+
expect(paint()).toEqual({ home: "contents", skeleton: "none" });
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("paints the plain skeleton instead of the home while first run is pending", () => {
|
|
73
|
+
document.documentElement.setAttribute(FIRST_RUN_PENDING_ATTRIBUTE, "");
|
|
74
|
+
expect(paint()).toEqual({ home: "none", skeleton: "contents" });
|
|
75
|
+
expect(
|
|
76
|
+
document.querySelector(
|
|
77
|
+
"[data-agent-native-first-run-skeleton] .agent-prompt-home-hero",
|
|
78
|
+
),
|
|
79
|
+
).toBeNull();
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
|
|
24
83
|
describe("AppShellSkeleton home layout", () => {
|
|
25
84
|
it("paints the home hero and resource footer beside the sidebar, with no header row", () => {
|
|
26
85
|
const shell = render("home");
|
|
@@ -15,6 +15,7 @@ import { AgentSuggestionBar } from "../../composer/AgentSuggestionBar.js";
|
|
|
15
15
|
import type { PromptComposerProps } from "../../composer/index.js";
|
|
16
16
|
import type { TiptapComposerHandle } from "../../composer/TiptapComposer.js";
|
|
17
17
|
import { Button } from "../../ui/button.js";
|
|
18
|
+
import { FIRST_RUN_PENDING_ATTRIBUTE } from "../onboarding/first-run-first-paint.js";
|
|
18
19
|
import { AppSidebar, AppSidebarFooter } from "./AppSidebar.js";
|
|
19
20
|
import { ClientOnly } from "./ClientOnly.js";
|
|
20
21
|
|
|
@@ -1598,7 +1599,30 @@ export function AppShellSkeleton({
|
|
|
1598
1599
|
),
|
|
1599
1600
|
welcome: <WelcomeLayout />,
|
|
1600
1601
|
};
|
|
1601
|
-
const
|
|
1602
|
+
const layoutContent = layout ? layouts[layout] : null;
|
|
1603
|
+
// A first-paint home is the app's real home. When first run may start, the
|
|
1604
|
+
// role question comes next, so the plain skeleton stands in for it.
|
|
1605
|
+
const content =
|
|
1606
|
+
firstPaintHome && layout === "prompt-library" ? (
|
|
1607
|
+
<>
|
|
1608
|
+
<div
|
|
1609
|
+
data-agent-native-first-paint-home=""
|
|
1610
|
+
style={{ display: "contents" }}
|
|
1611
|
+
>
|
|
1612
|
+
{layoutContent}
|
|
1613
|
+
</div>
|
|
1614
|
+
<div
|
|
1615
|
+
data-agent-native-first-run-skeleton=""
|
|
1616
|
+
role="status"
|
|
1617
|
+
aria-label={ariaLabel}
|
|
1618
|
+
style={{ display: "none" }}
|
|
1619
|
+
>
|
|
1620
|
+
<PromptLibraryLayout />
|
|
1621
|
+
</div>
|
|
1622
|
+
</>
|
|
1623
|
+
) : (
|
|
1624
|
+
layoutContent
|
|
1625
|
+
);
|
|
1602
1626
|
|
|
1603
1627
|
return (
|
|
1604
1628
|
<div
|
|
@@ -1619,6 +1643,12 @@ export function AppShellSkeleton({
|
|
|
1619
1643
|
html[${MCP_APP_WIDGET_EMBED_ATTRIBUTE}] [data-agent-native-app-skeleton] > :not(style) {
|
|
1620
1644
|
display: none !important;
|
|
1621
1645
|
}
|
|
1646
|
+
html[${FIRST_RUN_PENDING_ATTRIBUTE}] [data-agent-native-first-paint-home] {
|
|
1647
|
+
display: none !important;
|
|
1648
|
+
}
|
|
1649
|
+
html[${FIRST_RUN_PENDING_ATTRIBUTE}] [data-agent-native-first-run-skeleton] {
|
|
1650
|
+
display: contents !important;
|
|
1651
|
+
}
|
|
1622
1652
|
[data-agent-native-skeleton-block] {
|
|
1623
1653
|
animation: an-app-shell-skeleton-pulse 1.2s ease-in-out infinite;
|
|
1624
1654
|
}
|
|
@@ -1471,12 +1471,12 @@
|
|
|
1471
1471
|
--agentkit-composer-primary-control-size,
|
|
1472
1472
|
var(--agent-kit-composer-control-size)
|
|
1473
1473
|
);
|
|
1474
|
-
border-radius:
|
|
1474
|
+
border-radius: var(--agent-kit-radius-sm, 0.5rem);
|
|
1475
1475
|
}
|
|
1476
1476
|
|
|
1477
1477
|
.agent-composer-root:not(.agent-composer-root--hero)
|
|
1478
1478
|
.agent-composer-send-button {
|
|
1479
|
-
border-radius:
|
|
1479
|
+
border-radius: var(--agent-kit-radius-sm, 0.5rem);
|
|
1480
1480
|
}
|
|
1481
1481
|
|
|
1482
1482
|
/* 12px text: plain muted-foreground misses 4.5:1 on dark composer surfaces. */
|
|
@@ -231,10 +231,10 @@ describe("agent-native shell surface tokens", () => {
|
|
|
231
231
|
);
|
|
232
232
|
|
|
233
233
|
expect(tokens).toMatch(
|
|
234
|
-
/:root\s*\{[\s\S]*?--agent-kit-composer-surface: var\(--agent-kit-raised-surface\);[\s\S]*?--agent-kit-composer-border-mix: 82%;[\s\S]*?--agent-kit-composer-focus-ring-mix:
|
|
234
|
+
/:root\s*\{[\s\S]*?--agent-kit-composer-surface: var\(--agent-kit-raised-surface\);[\s\S]*?--agent-kit-composer-border-mix: 82%;[\s\S]*?--agent-kit-composer-focus-ring-mix: 70%;[\s\S]*?--agent-kit-composer-border-color: color-mix\([\s\S]*?--agent-kit-composer-focus-border-color: color-mix\(/s,
|
|
235
235
|
);
|
|
236
236
|
expect(tokens).toMatch(
|
|
237
|
-
/:is\(\.dark, :root\[data-theme="dark"\]:not\(\.light\)\)\s*\{[\s\S]*?--agent-kit-composer-surface: var\(--agent-kit-subtle-surface\);[\s\S]*?--agent-kit-composer-border-mix: 80%;[\s\S]*?--agent-kit-composer-focus-ring-mix:
|
|
237
|
+
/:is\(\.dark, :root\[data-theme="dark"\]:not\(\.light\)\)\s*\{[\s\S]*?--agent-kit-composer-surface: var\(--agent-kit-subtle-surface\);[\s\S]*?--agent-kit-composer-border-mix: 80%;[\s\S]*?--agent-kit-composer-focus-ring-mix: 70%;[\s\S]*?--agent-kit-composer-border-color: color-mix\([\s\S]*?--agent-kit-composer-focus-border-color: color-mix\(/s,
|
|
238
238
|
);
|
|
239
239
|
expect(css).toMatch(
|
|
240
240
|
/background:\s*var\(\s*--agent-kit-composer-surface,\s*var\(--agent-kit-raised-surface\)\s*\);/,
|
|
@@ -14,10 +14,20 @@
|
|
|
14
14
|
--agent-kit-accent: hsl(var(--primary));
|
|
15
15
|
--agent-kit-accent-text: hsl(var(--primary-foreground));
|
|
16
16
|
--agent-kit-danger: hsl(var(--destructive));
|
|
17
|
+
/* Themes size --destructive as a fill; as text it can sit under 3:1. */
|
|
18
|
+
--agent-kit-danger-text: color-mix(
|
|
19
|
+
in srgb,
|
|
20
|
+
hsl(var(--destructive)) 60%,
|
|
21
|
+
hsl(var(--foreground))
|
|
22
|
+
);
|
|
17
23
|
--agent-kit-success: hsl(var(--success, var(--primary)));
|
|
18
24
|
--agent-kit-warning-color: hsl(var(--agent-kit-warning));
|
|
19
25
|
--agent-kit-focus: hsl(var(--ring));
|
|
26
|
+
--agent-kit-progress-color: hsl(217 91% 60%);
|
|
27
|
+
--agent-kit-diff-added-color: hsl(var(--agent-kit-positive));
|
|
28
|
+
--agent-kit-diff-removed-color: hsl(var(--destructive));
|
|
20
29
|
|
|
30
|
+
--agent-kit-body-font-size: 0.875rem;
|
|
21
31
|
--agent-kit-density-font-size: 0.8125rem;
|
|
22
32
|
--agent-kit-density-line-height: 1.25rem;
|
|
23
33
|
--agent-kit-supporting-font-size: 0.75rem;
|
|
@@ -43,10 +53,16 @@
|
|
|
43
53
|
--agent-kit-composer-block-padding-start: 0.5rem;
|
|
44
54
|
--agent-kit-composer-block-padding-end: 1rem;
|
|
45
55
|
--agent-kit-composer-min-height: 4.75rem;
|
|
46
|
-
|
|
56
|
+
/* agentkit/react/styles.css maps elements onto this scale. */
|
|
57
|
+
--agent-kit-radius-xs: 0.25rem;
|
|
58
|
+
--agent-kit-radius-sm: 0.5rem;
|
|
59
|
+
--agent-kit-radius-md: 0.75rem;
|
|
60
|
+
--agent-kit-radius-lg: 1rem;
|
|
61
|
+
--agent-kit-composer-radius: var(--agent-kit-radius-lg);
|
|
47
62
|
--agent-kit-composer-surface: var(--agent-kit-raised-surface);
|
|
48
63
|
--agent-kit-composer-border-mix: 82%;
|
|
49
|
-
|
|
64
|
+
/* Keeps the focus border at 3:1+; the editor has no other focus indicator. */
|
|
65
|
+
--agent-kit-composer-focus-ring-mix: 70%;
|
|
50
66
|
--agent-kit-composer-border-color: color-mix(
|
|
51
67
|
in srgb,
|
|
52
68
|
hsl(var(--border)) var(--agent-kit-composer-border-mix),
|
|
@@ -104,9 +120,10 @@
|
|
|
104
120
|
}
|
|
105
121
|
|
|
106
122
|
:is(.dark, :root[data-theme="dark"]:not(.light)) {
|
|
123
|
+
--agent-kit-progress-color: hsl(213 94% 68%);
|
|
107
124
|
--agent-kit-composer-surface: var(--agent-kit-subtle-surface);
|
|
108
125
|
--agent-kit-composer-border-mix: 80%;
|
|
109
|
-
--agent-kit-composer-focus-ring-mix:
|
|
126
|
+
--agent-kit-composer-focus-ring-mix: 70%;
|
|
110
127
|
--agent-kit-composer-border-color: color-mix(
|
|
111
128
|
in srgb,
|
|
112
129
|
hsl(var(--border)) var(--agent-kit-composer-border-mix),
|
|
@@ -68,7 +68,9 @@ describe("AgentSuggestionBar", () => {
|
|
|
68
68
|
expect(buttons).toHaveLength(2);
|
|
69
69
|
expect(bar?.className).toContain("py-2");
|
|
70
70
|
expect(bar?.className).toContain("min-w-0");
|
|
71
|
-
expect(buttons[0]?.className).toContain(
|
|
71
|
+
expect(buttons[0]?.className).toContain(
|
|
72
|
+
"rounded-[var(--agent-kit-radius-xs,0.25rem)]",
|
|
73
|
+
);
|
|
72
74
|
expect(buttons[0]?.className).toContain("whitespace-nowrap");
|
|
73
75
|
expect(buttons[0]?.className).not.toContain("max-w-");
|
|
74
76
|
expect(buttons[0]?.className).toContain("text-foreground");
|
|
@@ -224,7 +224,10 @@ export function AgentSuggestionBar({
|
|
|
224
224
|
key={index}
|
|
225
225
|
aria-hidden="true"
|
|
226
226
|
data-agent-suggestion-placeholder="true"
|
|
227
|
-
className={cn(
|
|
227
|
+
className={cn(
|
|
228
|
+
"h-6 shrink-0 rounded-[var(--agent-kit-radius-xs,0.25rem)]",
|
|
229
|
+
width,
|
|
230
|
+
)}
|
|
228
231
|
/>
|
|
229
232
|
))
|
|
230
233
|
: items.map((suggestion, index) => (
|
|
@@ -252,7 +255,7 @@ export function AgentSuggestionBar({
|
|
|
252
255
|
data-agent-suggestion-position={index + 1}
|
|
253
256
|
// The scroller clips overflow, so the focus ring sits inside.
|
|
254
257
|
className={cn(
|
|
255
|
-
"agent-kit-caption-copy snap-start inline-flex h-6 shrink-0 items-center justify-center rounded-
|
|
258
|
+
"agent-kit-caption-copy snap-start inline-flex h-6 shrink-0 items-center justify-center rounded-[var(--agent-kit-radius-xs,0.25rem)] border border-border bg-transparent px-2.5 py-0 text-center font-normal text-foreground shadow-none hover:bg-accent hover:text-accent-foreground focus-visible:ring-inset focus-visible:ring-offset-0 whitespace-nowrap",
|
|
256
259
|
size === "comfortable" && "h-8 px-3 text-sm",
|
|
257
260
|
)}
|
|
258
261
|
>
|
|
@@ -828,7 +828,7 @@ export function ComposerContextMenu({
|
|
|
828
828
|
type="button"
|
|
829
829
|
variant="ghost"
|
|
830
830
|
size="icon"
|
|
831
|
-
className="size-[var(--agentkit-composer-toolbar-control-size,1.5rem)] shrink-0 rounded-[var(--agentkit-composer-control-radius,var(--radius-
|
|
831
|
+
className="size-[var(--agentkit-composer-toolbar-control-size,1.5rem)] shrink-0 rounded-[var(--agentkit-composer-control-radius,var(--agent-kit-radius-xs,0.25rem))] text-muted-foreground hover:text-foreground aria-expanded:bg-accent aria-expanded:text-accent-foreground"
|
|
832
832
|
data-agent-composer-slot="plus-button"
|
|
833
833
|
disabled={disabled}
|
|
834
834
|
aria-label={label}
|
|
@@ -924,7 +924,7 @@ export function ComposerContextMenu({
|
|
|
924
924
|
<div
|
|
925
925
|
role="presentation"
|
|
926
926
|
aria-hidden="true"
|
|
927
|
-
className="px-2 py-1 text-sm
|
|
927
|
+
className="px-2 py-1 text-sm agent-kit-tone-warning"
|
|
928
928
|
>
|
|
929
929
|
{searchError}
|
|
930
930
|
</div>
|
|
@@ -973,7 +973,7 @@ export function ComposerContextMenu({
|
|
|
973
973
|
<div
|
|
974
974
|
role="presentation"
|
|
975
975
|
aria-hidden="true"
|
|
976
|
-
className="px-2 py-1 text-sm
|
|
976
|
+
className="px-2 py-1 text-sm agent-kit-tone-warning"
|
|
977
977
|
>
|
|
978
978
|
{integrationStatus.error}
|
|
979
979
|
</div>
|
|
@@ -1050,7 +1050,7 @@ export function ComposerContextMenu({
|
|
|
1050
1050
|
/>
|
|
1051
1051
|
)}
|
|
1052
1052
|
{error && (
|
|
1053
|
-
<span role="alert" className="text-xs
|
|
1053
|
+
<span role="alert" className="text-xs agent-kit-tone-warning">
|
|
1054
1054
|
{error}
|
|
1055
1055
|
</span>
|
|
1056
1056
|
)}
|
|
@@ -104,7 +104,10 @@ export function ComposerContextPicker({
|
|
|
104
104
|
<>
|
|
105
105
|
{actionError && (
|
|
106
106
|
<>
|
|
107
|
-
<div
|
|
107
|
+
<div
|
|
108
|
+
role="alert"
|
|
109
|
+
className="p-3 text-sm agent-kit-tone-warning"
|
|
110
|
+
>
|
|
108
111
|
{actionError.message}
|
|
109
112
|
</div>
|
|
110
113
|
{actionError.retry && (
|
|
@@ -133,7 +136,10 @@ export function ComposerContextPicker({
|
|
|
133
136
|
<>
|
|
134
137
|
{error ? (
|
|
135
138
|
<>
|
|
136
|
-
<div
|
|
139
|
+
<div
|
|
140
|
+
role="alert"
|
|
141
|
+
className="p-3 text-sm agent-kit-tone-warning"
|
|
142
|
+
>
|
|
137
143
|
{error}
|
|
138
144
|
</div>
|
|
139
145
|
{retry && (
|
|
@@ -164,7 +164,7 @@ export function ComposerContextPickerDialog({
|
|
|
164
164
|
</div>
|
|
165
165
|
<CommandList aria-label={title}>
|
|
166
166
|
{loading || searchPending ? null : error ? (
|
|
167
|
-
<div role="alert" className="p-3
|
|
167
|
+
<div role="alert" className="p-3 agent-kit-tone-warning">
|
|
168
168
|
{error}
|
|
169
169
|
</div>
|
|
170
170
|
) : !items.length ? null : (
|
|
@@ -289,7 +289,10 @@ export function ComposerContextPickerDialog({
|
|
|
289
289
|
}}
|
|
290
290
|
/>
|
|
291
291
|
{validation && (
|
|
292
|
-
<p
|
|
292
|
+
<p
|
|
293
|
+
id={`${id}-validation`}
|
|
294
|
+
className="text-sm agent-kit-tone-warning"
|
|
295
|
+
>
|
|
293
296
|
{validation}
|
|
294
297
|
</p>
|
|
295
298
|
)}
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
TooltipTrigger,
|
|
16
16
|
} from "../ui/tooltip.js";
|
|
17
17
|
import { cn } from "../utils.js";
|
|
18
|
+
import { COMPOSER_POPOVER_SURFACE_CLASS } from "./popover-surface.js";
|
|
18
19
|
|
|
19
20
|
export interface ComposerModeOption {
|
|
20
21
|
/** Stable host-defined mode identifier. */
|
|
@@ -75,7 +76,7 @@ export function ComposerModePicker({
|
|
|
75
76
|
side="top"
|
|
76
77
|
align="start"
|
|
77
78
|
collisionPadding={8}
|
|
78
|
-
className=
|
|
79
|
+
className={`agent-composer-mode-picker-menu min-w-48 ${COMPOSER_POPOVER_SURFACE_CLASS}`}
|
|
79
80
|
>
|
|
80
81
|
{/* Hosts may render this picker outside a TooltipProvider. */}
|
|
81
82
|
<TooltipProvider>
|
|
@@ -30,7 +30,7 @@ export function MentionChip({
|
|
|
30
30
|
<span
|
|
31
31
|
{...props}
|
|
32
32
|
className={cn(
|
|
33
|
-
"mx-
|
|
33
|
+
"mx-1 inline-flex max-w-[200px] items-center h-5 gap-1 rounded-[var(--agent-kit-radius-xs,0.25rem)] border border-border bg-muted/50 px-2 text-xs leading-4 font-medium text-foreground align-middle",
|
|
34
34
|
className,
|
|
35
35
|
)}
|
|
36
36
|
>
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
// @vitest-environment happy-dom
|
|
2
2
|
|
|
3
|
-
import { act } from "react";
|
|
3
|
+
import { act, createRef } from "react";
|
|
4
4
|
import { createRoot, type Root } from "react-dom/client";
|
|
5
5
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
6
6
|
|
|
7
|
-
import { MentionPopover } from "./MentionPopover.js";
|
|
7
|
+
import { MentionPopover, type MentionPopoverRef } from "./MentionPopover.js";
|
|
8
|
+
import { ComposerRuntimeAdaptersProvider } from "./runtime-adapters.js";
|
|
8
9
|
import type { MentionItem } from "./types.js";
|
|
9
10
|
|
|
10
11
|
let container: HTMLDivElement;
|
|
@@ -74,3 +75,108 @@ describe("mention sections", () => {
|
|
|
74
75
|
expect(rowLabels(true)).toEqual(["Alice", "Claude Haiku 5.5"]);
|
|
75
76
|
});
|
|
76
77
|
});
|
|
78
|
+
|
|
79
|
+
describe("listbox semantics", () => {
|
|
80
|
+
it("exposes the rows as options and reports the highlighted one", () => {
|
|
81
|
+
const popover = createRef<MentionPopoverRef>();
|
|
82
|
+
const onActiveOptionChange = vi.fn();
|
|
83
|
+
act(() => {
|
|
84
|
+
root.render(
|
|
85
|
+
<MentionPopover
|
|
86
|
+
ref={popover}
|
|
87
|
+
type="@"
|
|
88
|
+
position={{ top: 400, left: 0, width: 320 }}
|
|
89
|
+
mentionItems={items}
|
|
90
|
+
skills={[]}
|
|
91
|
+
isLoading={false}
|
|
92
|
+
query=""
|
|
93
|
+
onSelectMention={() => undefined}
|
|
94
|
+
onSelectSkill={() => undefined}
|
|
95
|
+
onClose={() => undefined}
|
|
96
|
+
listboxId="mentions"
|
|
97
|
+
onActiveOptionChange={onActiveOptionChange}
|
|
98
|
+
/>,
|
|
99
|
+
);
|
|
100
|
+
});
|
|
101
|
+
const listbox = document.getElementById("mentions");
|
|
102
|
+
expect(listbox?.getAttribute("role")).toBe("listbox");
|
|
103
|
+
expect(listbox?.getAttribute("aria-label")).toBe("Add context");
|
|
104
|
+
const options = [...document.querySelectorAll('[role="option"]')];
|
|
105
|
+
expect(options.map((option) => option.id)).toEqual([
|
|
106
|
+
"mentions-option-0",
|
|
107
|
+
"mentions-option-1",
|
|
108
|
+
]);
|
|
109
|
+
expect(
|
|
110
|
+
options.map((option) => option.getAttribute("aria-selected")),
|
|
111
|
+
).toEqual(["true", "false"]);
|
|
112
|
+
const group = options[0]?.closest('[role="group"]');
|
|
113
|
+
expect(
|
|
114
|
+
document.getElementById(group?.getAttribute("aria-labelledby") ?? "")
|
|
115
|
+
?.textContent,
|
|
116
|
+
).toBe("Agents");
|
|
117
|
+
expect(onActiveOptionChange).toHaveBeenLastCalledWith("mentions-option-0");
|
|
118
|
+
|
|
119
|
+
act(() => popover.current?.moveDown());
|
|
120
|
+
expect(onActiveOptionChange).toHaveBeenLastCalledWith("mentions-option-1");
|
|
121
|
+
expect(
|
|
122
|
+
document
|
|
123
|
+
.getElementById("mentions-option-1")
|
|
124
|
+
?.getAttribute("aria-selected"),
|
|
125
|
+
).toBe("true");
|
|
126
|
+
|
|
127
|
+
act(() => root.render(<></>));
|
|
128
|
+
expect(onActiveOptionChange).toHaveBeenLastCalledWith(undefined);
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
describe("provider section names", () => {
|
|
133
|
+
it("translates a provider label that is a catalog key and keeps a plain one", () => {
|
|
134
|
+
const providerItems: MentionItem[] = [
|
|
135
|
+
{
|
|
136
|
+
id: "chat:1",
|
|
137
|
+
label: "Planning chat",
|
|
138
|
+
source: "chats",
|
|
139
|
+
refType: "chat",
|
|
140
|
+
section: "composerSources.group",
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
id: "mail:1",
|
|
144
|
+
label: "Weekly digest",
|
|
145
|
+
source: "mail",
|
|
146
|
+
refType: "email",
|
|
147
|
+
section: "Emails",
|
|
148
|
+
},
|
|
149
|
+
];
|
|
150
|
+
act(() => {
|
|
151
|
+
root.render(
|
|
152
|
+
<ComposerRuntimeAdaptersProvider
|
|
153
|
+
adapters={{
|
|
154
|
+
translate: (key, options) =>
|
|
155
|
+
key === "composerSources.group"
|
|
156
|
+
? "Conversations"
|
|
157
|
+
: String(options?.defaultValue ?? key),
|
|
158
|
+
}}
|
|
159
|
+
>
|
|
160
|
+
<MentionPopover
|
|
161
|
+
type="@"
|
|
162
|
+
position={{ top: 400, left: 0, width: 320 }}
|
|
163
|
+
mentionItems={providerItems}
|
|
164
|
+
skills={[]}
|
|
165
|
+
isLoading={false}
|
|
166
|
+
query=""
|
|
167
|
+
onSelectMention={() => undefined}
|
|
168
|
+
onSelectSkill={() => undefined}
|
|
169
|
+
onClose={() => undefined}
|
|
170
|
+
keepSectionOrder
|
|
171
|
+
/>
|
|
172
|
+
</ComposerRuntimeAdaptersProvider>,
|
|
173
|
+
);
|
|
174
|
+
});
|
|
175
|
+
const headers = [...document.querySelectorAll('[role="group"]')].map(
|
|
176
|
+
(group) =>
|
|
177
|
+
document.getElementById(group.getAttribute("aria-labelledby") ?? "")
|
|
178
|
+
?.textContent,
|
|
179
|
+
);
|
|
180
|
+
expect(headers).toEqual(["Conversations", "Emails"]);
|
|
181
|
+
});
|
|
182
|
+
});
|