@copilotkit/vue 2.0.0-rc.2 → 2.0.0-rc.21
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/PARITY.md +3 -3
- package/dist/hooks/use-copilot-action.d.ts.map +1 -1
- package/dist/hooks/use-frontend-tool.d.ts +1 -1
- package/dist/hooks/use-frontend-tool.d.ts.map +1 -1
- package/dist/hooks/zod-parameters.d.ts +14 -0
- package/dist/hooks/zod-parameters.d.ts.map +1 -0
- package/dist/index.cjs +1 -73
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +365 -16920
- package/dist/index.mjs.map +1 -1
- package/dist/use-render-activity-message-BAhbpSDh.js +16200 -0
- package/dist/use-render-activity-message-BAhbpSDh.js.map +1 -0
- package/dist/use-render-activity-message-DJ6q1qHV.cjs +114 -0
- package/dist/use-render-activity-message-DJ6q1qHV.cjs.map +1 -0
- package/dist/v2/components/A2UIMessageRenderer.d.ts +14 -0
- package/dist/v2/components/A2UIMessageRenderer.d.ts.map +1 -1
- package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts +10 -3
- package/dist/v2/components/A2UISurfaceActivityRenderer.vue.d.ts.map +1 -1
- package/dist/v2/components/CopilotKitInspector.vue.d.ts +5 -1
- package/dist/v2/components/CopilotKitInspector.vue.d.ts.map +1 -1
- package/dist/v2/components/InlineFeatureWarning.vue.d.ts.map +1 -1
- package/dist/v2/components/LicenseWarningBanner.vue.d.ts +2 -2
- package/dist/v2/components/LicenseWarningBanner.vue.d.ts.map +1 -1
- package/dist/v2/components/MCPAppsActivityRenderer.d.ts.map +1 -1
- package/dist/v2/components/OpenGenerativeUIRenderer.d.ts +13 -59
- package/dist/v2/components/OpenGenerativeUIRenderer.d.ts.map +1 -1
- package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts +0 -5
- package/dist/v2/components/a2ui/A2UIBuiltInToolCallRenderer.d.ts.map +1 -1
- package/dist/v2/components/a2ui/A2UICatalogContext.d.ts +10 -15
- package/dist/v2/components/a2ui/A2UICatalogContext.d.ts.map +1 -1
- package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts +14 -130
- package/dist/v2/components/a2ui/A2UIRecoveryStates.d.ts.map +1 -1
- package/dist/v2/components/a2ui/catalog.d.ts.map +1 -1
- package/dist/v2/components/a2ui/utils.d.ts +3 -15
- package/dist/v2/components/a2ui/utils.d.ts.map +1 -1
- package/dist/v2/components/a2ui.d.ts +9 -8
- package/dist/v2/components/a2ui.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChat.vue.d.ts +2 -2
- package/dist/v2/components/chat/CopilotChat.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatAssistantMessage.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatAttachmentQueue.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatAttachmentRenderer.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts +4 -8
- package/dist/v2/components/chat/CopilotChatAudioRecorder.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts +1 -1
- package/dist/v2/components/chat/CopilotChatFeedbackCommentPopover.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatInput.vue.d.ts +6 -270
- package/dist/v2/components/chat/CopilotChatInput.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatInspectorButton.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatLightbox.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts +1 -1
- package/dist/v2/components/chat/CopilotChatMessageView.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatReasoningMessage.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts +1 -1
- package/dist/v2/components/chat/CopilotChatToolCallGroup.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatToolCallItem.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts +1 -1
- package/dist/v2/components/chat/CopilotChatToolCallsView.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatUserMessage.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatView.vue.d.ts +3 -3
- package/dist/v2/components/chat/CopilotChatView.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotChatWorkSummary.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotModalHeader.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotPopup.vue.d.ts +8 -3
- package/dist/v2/components/chat/CopilotPopup.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotPopupView.vue.d.ts +5 -3
- package/dist/v2/components/chat/CopilotPopupView.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts +5 -3
- package/dist/v2/components/chat/CopilotPopupViewInternal.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotSidebar.vue.d.ts +8 -3
- package/dist/v2/components/chat/CopilotSidebar.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts +6 -4
- package/dist/v2/components/chat/CopilotSidebarView.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts +6 -4
- package/dist/v2/components/chat/CopilotSidebarViewInternal.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/CopilotThreadsDrawer.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts +1 -0
- package/dist/v2/components/chat/StreamingMarkdownDefault.vue.d.ts.map +1 -1
- package/dist/v2/components/chat/audioRecorder.d.ts +3 -4
- package/dist/v2/components/chat/audioRecorder.d.ts.map +1 -1
- package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts +3 -3
- package/dist/v2/components/chat/copilotChatToolCallItemRender.d.ts.map +1 -1
- package/dist/v2/components/chat/forwarded-slots.d.ts +12 -0
- package/dist/v2/components/chat/forwarded-slots.d.ts.map +1 -0
- package/dist/v2/components/chat/index.d.ts +34 -31
- package/dist/v2/components/chat/index.d.ts.map +1 -1
- package/dist/v2/components/chat/inspector-shortcuts.d.ts +2 -1
- package/dist/v2/components/chat/inspector-shortcuts.d.ts.map +1 -1
- package/dist/v2/components/chat/message-feedback.d.ts +18 -49
- package/dist/v2/components/chat/message-feedback.d.ts.map +1 -1
- package/dist/v2/components/chat/tool-call-display-context.d.ts +4 -19
- package/dist/v2/components/chat/tool-call-display-context.d.ts.map +1 -1
- package/dist/v2/components/chat/tool-call-group-parts.d.ts +7 -20
- package/dist/v2/components/chat/tool-call-group-parts.d.ts.map +1 -1
- package/dist/v2/components/chat/turn-work.d.ts +0 -2
- package/dist/v2/components/chat/turn-work.d.ts.map +1 -1
- package/dist/v2/components/chat/types.d.ts +9 -4
- package/dist/v2/components/chat/types.d.ts.map +1 -1
- package/dist/v2/components/chat/use-chat-labels.d.ts +8 -0
- package/dist/v2/components/chat/use-chat-labels.d.ts.map +1 -0
- package/dist/v2/components/chat/use-copy-feedback.d.ts +11 -0
- package/dist/v2/components/chat/use-copy-feedback.d.ts.map +1 -0
- package/dist/v2/components/chat/use-lightbox.d.ts.map +1 -1
- package/dist/v2/components/icons/index.d.ts +968 -1
- package/dist/v2/components/icons/index.d.ts.map +1 -1
- package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts +1 -1
- package/dist/v2/components/ui/CopilotDropdownMenuContent.vue.d.ts.map +1 -1
- package/dist/v2/hooks/use-agent-context.d.ts +2 -3
- package/dist/v2/hooks/use-agent-context.d.ts.map +1 -1
- package/dist/v2/hooks/use-agent.d.ts +4 -1
- package/dist/v2/hooks/use-agent.d.ts.map +1 -1
- package/dist/v2/hooks/use-attachments.d.ts +7 -0
- package/dist/v2/hooks/use-attachments.d.ts.map +1 -1
- package/dist/v2/hooks/use-capabilities.d.ts.map +1 -1
- package/dist/v2/hooks/use-component.d.ts +1 -0
- package/dist/v2/hooks/use-component.d.ts.map +1 -1
- package/dist/v2/hooks/use-configure-suggestions.d.ts +4 -9
- package/dist/v2/hooks/use-configure-suggestions.d.ts.map +1 -1
- package/dist/v2/hooks/use-default-render-tool.d.ts.map +1 -1
- package/dist/v2/hooks/use-frontend-tool.d.ts +5 -0
- package/dist/v2/hooks/use-frontend-tool.d.ts.map +1 -1
- package/dist/v2/hooks/use-human-in-the-loop.d.ts +2 -1
- package/dist/v2/hooks/use-human-in-the-loop.d.ts.map +1 -1
- package/dist/v2/hooks/use-interrupt.d.ts +0 -1
- package/dist/v2/hooks/use-interrupt.d.ts.map +1 -1
- package/dist/v2/hooks/use-keyboard-height.d.ts +1 -1
- package/dist/v2/hooks/use-keyboard-height.d.ts.map +1 -1
- package/dist/v2/hooks/use-pin-to-send.d.ts +4 -12
- package/dist/v2/hooks/use-pin-to-send.d.ts.map +1 -1
- package/dist/v2/hooks/use-render-activity-message.d.ts +13 -9
- package/dist/v2/hooks/use-render-activity-message.d.ts.map +1 -1
- package/dist/v2/hooks/use-render-custom-messages.d.ts +5 -7
- package/dist/v2/hooks/use-render-custom-messages.d.ts.map +1 -1
- package/dist/v2/hooks/use-suggestions.d.ts.map +1 -1
- package/dist/v2/hooks/use-threads.d.ts +0 -8
- package/dist/v2/hooks/use-threads.d.ts.map +1 -1
- package/dist/v2/index.cjs +1 -1
- package/dist/v2/index.mjs +197 -200
- package/dist/v2/index.mjs.map +1 -1
- package/dist/v2/lib/processPartialHtml.d.ts +1 -2
- package/dist/v2/lib/processPartialHtml.d.ts.map +1 -1
- package/dist/v2/lib/shallow-stable.d.ts.map +1 -1
- package/dist/v2/lib/vue-core.d.ts +12 -12
- package/dist/v2/lib/vue-core.d.ts.map +1 -1
- package/dist/v2/providers/CopilotChatConfigurationProvider.vue.d.ts.map +1 -1
- package/dist/v2/providers/CopilotKitProvider.types.d.ts +9 -129
- package/dist/v2/providers/CopilotKitProvider.types.d.ts.map +1 -1
- package/dist/v2/providers/CopilotKitProvider.vue.d.ts +9 -10
- package/dist/v2/providers/CopilotKitProvider.vue.d.ts.map +1 -1
- package/dist/v2/providers/chat-configuration-store-key.d.ts +8 -0
- package/dist/v2/providers/chat-configuration-store-key.d.ts.map +1 -0
- package/dist/v2/providers/markdown-renderer.d.ts +4 -2
- package/dist/v2/providers/markdown-renderer.d.ts.map +1 -1
- package/dist/v2/providers/types.d.ts +3 -46
- package/dist/v2/providers/types.d.ts.map +1 -1
- package/dist/v2/providers/use-inspector-thread-override.d.ts +5 -0
- package/dist/v2/providers/use-inspector-thread-override.d.ts.map +1 -1
- package/dist/v2/types/human-in-the-loop.d.ts +8 -29
- package/dist/v2/types/human-in-the-loop.d.ts.map +1 -1
- package/dist/v2/types/interrupt.d.ts +1 -22
- package/dist/v2/types/interrupt.d.ts.map +1 -1
- package/dist/v2/types/vue-activity-message-renderer.d.ts +16 -15
- package/dist/v2/types/vue-activity-message-renderer.d.ts.map +1 -1
- package/dist/v2/types/vue-custom-message-renderer.d.ts +7 -16
- package/dist/v2/types/vue-custom-message-renderer.d.ts.map +1 -1
- package/dist/v2/types/vue-tool-call-renderer.d.ts +16 -35
- package/dist/v2/types/vue-tool-call-renderer.d.ts.map +1 -1
- package/package.json +10 -11
- package/src/__tests__/build-entries.test.ts +27 -0
- package/src/hooks/__tests__/zod-parameters.test.ts +520 -0
- package/src/hooks/use-copilot-action.ts +2 -1
- package/src/hooks/use-frontend-tool.ts +3 -6
- package/src/hooks/zod-parameters.ts +162 -0
- package/src/v2/__tests__/exports.test.ts +10 -0
- package/src/v2/__tests__/mocks/web-inspector.ts +6 -0
- package/src/v2/__tests__/utils/test-helpers.ts +34 -4
- package/src/v2/components/A2UIMessageRenderer.ts +98 -68
- package/src/v2/components/A2UISurfaceActivityRenderer.vue +68 -103
- package/src/v2/components/CopilotKitInspector.vue +104 -51
- package/src/v2/components/InlineFeatureWarning.vue +20 -21
- package/src/v2/components/LicenseWarningBanner.vue +27 -135
- package/src/v2/components/MCPAppsActivityRenderer.ts +75 -201
- package/src/v2/components/OpenGenerativeUIRenderer.ts +122 -446
- package/src/v2/components/__tests__/A2UIMessageRenderer.test.ts +171 -8
- package/src/v2/components/__tests__/CopilotKitInspector.test.ts +42 -0
- package/src/v2/components/__tests__/LicenseWarningBanner.test.ts +60 -0
- package/src/v2/components/__tests__/OpenGenerativeUIRenderer.test.ts +64 -8
- package/src/v2/components/__tests__/OpenGenerativeUIToolRenderer.test.ts +38 -0
- package/src/v2/components/a2ui/A2UIBuiltInToolCallRenderer.ts +2 -7
- package/src/v2/components/a2ui/A2UICatalogContext.ts +27 -185
- package/src/v2/components/a2ui/A2UIRecoveryStates.ts +127 -327
- package/src/v2/components/a2ui/catalog.ts +3 -3
- package/src/v2/components/a2ui/utils.ts +13 -65
- package/src/v2/components/a2ui.ts +15 -22
- package/src/v2/components/chat/CopilotChat.vue +147 -356
- package/src/v2/components/chat/CopilotChatAssistantMessage.vue +19 -43
- package/src/v2/components/chat/CopilotChatAttachmentQueue.vue +36 -55
- package/src/v2/components/chat/CopilotChatAttachmentRenderer.vue +14 -6
- package/src/v2/components/chat/CopilotChatAudioRecorder.vue +19 -246
- package/src/v2/components/chat/CopilotChatFeedbackCommentPopover.vue +2 -2
- package/src/v2/components/chat/CopilotChatInput.vue +108 -436
- package/src/v2/components/chat/CopilotChatInspectorButton.vue +45 -108
- package/src/v2/components/chat/CopilotChatLightbox.vue +10 -31
- package/src/v2/components/chat/CopilotChatMessageView.vue +82 -210
- package/src/v2/components/chat/CopilotChatReasoningMessage.vue +7 -15
- package/src/v2/components/chat/CopilotChatToolCallGroup.vue +63 -71
- package/src/v2/components/chat/CopilotChatToolCallItem.vue +8 -6
- package/src/v2/components/chat/CopilotChatToolCallsView.vue +31 -32
- package/src/v2/components/chat/CopilotChatUserMessage.vue +24 -112
- package/src/v2/components/chat/CopilotChatView.vue +33 -28
- package/src/v2/components/chat/CopilotChatWorkSummary.vue +26 -36
- package/src/v2/components/chat/CopilotModalHeader.vue +11 -23
- package/src/v2/components/chat/CopilotPopup.vue +23 -25
- package/src/v2/components/chat/CopilotPopupView.vue +10 -39
- package/src/v2/components/chat/CopilotPopupViewInternal.vue +35 -131
- package/src/v2/components/chat/CopilotSidebar.vue +23 -25
- package/src/v2/components/chat/CopilotSidebarView.vue +10 -39
- package/src/v2/components/chat/CopilotSidebarViewInternal.vue +38 -59
- package/src/v2/components/chat/CopilotThreadsDrawer.vue +37 -102
- package/src/v2/components/chat/StreamingMarkdownDefault.vue +15 -28
- package/src/v2/components/chat/__tests__/CopilotChat.labels.test.ts +19 -4
- package/src/v2/components/chat/__tests__/CopilotChat.test.ts +12 -10
- package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.ts +26 -9
- package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.learningFeedback.test.ts +5 -5
- package/src/v2/components/chat/__tests__/CopilotChatAttachmentQueue.test.ts +28 -0
- package/src/v2/components/chat/__tests__/CopilotChatInput.test.ts +89 -1
- package/src/v2/components/chat/__tests__/CopilotChatMessageView.test.ts +247 -403
- package/src/v2/components/chat/__tests__/CopilotChatMessageView.toolCallDisplay.test.ts +1 -99
- package/src/v2/components/chat/__tests__/CopilotPopup.test.ts +90 -1
- package/src/v2/components/chat/__tests__/CopilotPopupView.test.ts +19 -0
- package/src/v2/components/chat/__tests__/CopilotSidebar.test.ts +90 -1
- package/src/v2/components/chat/__tests__/CopilotSidebarView.position.test.ts +32 -8
- package/src/v2/components/chat/__tests__/CopilotSidebarView.test.ts +2 -1
- package/src/v2/components/chat/__tests__/StreamingMarkdownDefault.test.ts +54 -0
- package/src/v2/components/chat/audioRecorder.ts +4 -7
- package/src/v2/components/chat/copilotChatToolCallItemRender.ts +24 -89
- package/src/v2/components/chat/forwarded-slots.ts +17 -0
- package/src/v2/components/chat/index.ts +0 -1
- package/src/v2/components/chat/inspector-shortcuts.ts +10 -16
- package/src/v2/components/chat/message-feedback.ts +62 -197
- package/src/v2/components/chat/tool-call-display-context.ts +6 -22
- package/src/v2/components/chat/tool-call-group-parts.ts +47 -108
- package/src/v2/components/chat/turn-work.ts +0 -9
- package/src/v2/components/chat/types.ts +12 -4
- package/src/v2/components/chat/use-chat-labels.ts +16 -0
- package/src/v2/components/chat/use-copy-feedback.ts +21 -0
- package/src/v2/components/chat/use-lightbox.ts +15 -33
- package/src/v2/components/icons/__tests__/icons.test.ts +72 -68
- package/src/v2/components/icons/index.ts +109 -27
- package/src/v2/hooks/__tests__/use-agent-error-state.test.ts +5 -3
- package/src/v2/hooks/__tests__/use-agent-stability.test.ts +25 -4
- package/src/v2/hooks/__tests__/use-agent-throttle.test.ts +5 -1
- package/src/v2/hooks/__tests__/use-agent.test.ts +6 -3
- package/src/v2/hooks/__tests__/use-component.test.ts +21 -0
- package/src/v2/hooks/__tests__/use-configure-suggestions.test.ts +30 -1
- package/src/v2/hooks/__tests__/use-default-render-tool.test.ts +10 -10
- package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.ts +66 -1
- package/src/v2/hooks/__tests__/use-human-in-the-loop.e2e.test.ts +6 -1
- package/src/v2/hooks/__tests__/use-human-in-the-loop.test.ts +187 -12
- package/src/v2/hooks/__tests__/use-interrupt.test.ts +97 -0
- package/src/v2/hooks/__tests__/use-render-activity-message.test.ts +106 -0
- package/src/v2/hooks/__tests__/use-render-tool.test.ts +3 -6
- package/src/v2/hooks/__tests__/use-threads.test.ts +48 -6
- package/src/v2/hooks/__tests__/zod-regression.test.ts +5 -4
- package/src/v2/hooks/use-agent-context.ts +4 -10
- package/src/v2/hooks/use-agent.ts +86 -290
- package/src/v2/hooks/use-attachments.ts +48 -168
- package/src/v2/hooks/use-capabilities.ts +2 -7
- package/src/v2/hooks/use-component.ts +7 -4
- package/src/v2/hooks/use-configure-suggestions.ts +28 -218
- package/src/v2/hooks/use-default-render-tool.ts +34 -94
- package/src/v2/hooks/use-frontend-tool.ts +10 -10
- package/src/v2/hooks/use-human-in-the-loop.ts +11 -80
- package/src/v2/hooks/use-interrupt.ts +29 -308
- package/src/v2/hooks/use-keyboard-height.ts +17 -40
- package/src/v2/hooks/use-pin-to-send.ts +15 -99
- package/src/v2/hooks/use-render-activity-message.ts +31 -55
- package/src/v2/hooks/use-render-custom-messages.ts +24 -88
- package/src/v2/hooks/use-suggestions.ts +9 -33
- package/src/v2/hooks/use-threads.ts +43 -273
- package/src/v2/lib/__tests__/shallow-stable.test.ts +54 -0
- package/src/v2/lib/__tests__/vue-core-renderers.test.ts +42 -0
- package/src/v2/lib/processPartialHtml.ts +6 -21
- package/src/v2/lib/shallow-stable.ts +2 -16
- package/src/v2/lib/vue-core.ts +69 -78
- package/src/v2/providers/CopilotChatConfigurationProvider.vue +48 -186
- package/src/v2/providers/CopilotKitProvider.types.ts +12 -132
- package/src/v2/providers/CopilotKitProvider.vue +237 -510
- package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.test.ts +22 -2
- package/src/v2/providers/__tests__/CopilotKitProvider.a2ui.test.ts +20 -2
- package/src/v2/providers/__tests__/CopilotKitProvider.config.test.ts +124 -0
- package/src/v2/providers/__tests__/CopilotKitProvider.headersAtSendTime.test.ts +3 -3
- package/src/v2/providers/__tests__/CopilotKitProvider.learning.test.ts +3 -1
- package/src/v2/providers/__tests__/CopilotKitProvider.sandboxFunctions.test.ts +4 -1
- package/src/v2/providers/__tests__/CopilotKitProvider.test.ts +53 -26
- package/src/v2/providers/chat-configuration-store-key.ts +9 -0
- package/src/v2/providers/markdown-renderer.ts +8 -2
- package/src/v2/providers/types.ts +3 -49
- package/src/v2/providers/use-inspector-thread-override.ts +22 -80
- package/src/v2/types/__tests__/defineToolCallRenderer.test.ts +28 -33
- package/src/v2/types/defineToolCallRenderer.ts +5 -4
- package/src/v2/types/human-in-the-loop.ts +8 -32
- package/src/v2/types/interrupt.ts +7 -31
- package/src/v2/types/vue-activity-message-renderer.ts +24 -15
- package/src/v2/types/vue-custom-message-renderer.ts +12 -16
- package/src/v2/types/vue-tool-call-renderer.ts +23 -38
- package/tsconfig.json +0 -1
- package/vite.config.ts +8 -5
- package/vitest.config.ts +12 -7
- package/dist/v2/components/chat/BasicMarkdown.vue.d.ts +0 -9
- package/dist/v2/components/chat/BasicMarkdown.vue.d.ts.map +0 -1
- package/dist/v2/components/chat/normalize-auto-scroll.d.ts +0 -3
- package/dist/v2/components/chat/normalize-auto-scroll.d.ts.map +0 -1
- package/dist/v2/components/chat/tool-call-layout.d.ts +0 -115
- package/dist/v2/components/chat/tool-call-layout.d.ts.map +0 -1
- package/dist/v2/lib/is-mobile-viewport.d.ts +0 -15
- package/dist/v2/lib/is-mobile-viewport.d.ts.map +0 -1
- package/dist/v2/lib/message-feedback.d.ts +0 -33
- package/dist/v2/lib/message-feedback.d.ts.map +0 -1
- package/dist/v2/lib/transcription-client.d.ts +0 -19
- package/dist/v2/lib/transcription-client.d.ts.map +0 -1
- package/src/v2/components/__tests__/A2UICatalogContext.test.ts +0 -63
- package/src/v2/components/a2ui/__tests__/A2UIRecoveryStates.test.ts +0 -175
- package/src/v2/components/chat/BasicMarkdown.vue +0 -160
- package/src/v2/components/chat/__tests__/BasicMarkdown.test.ts +0 -69
- package/src/v2/components/chat/__tests__/normalize-auto-scroll.test.ts +0 -39
- package/src/v2/components/chat/normalize-auto-scroll.ts +0 -17
- package/src/v2/components/chat/tool-call-layout.ts +0 -304
- package/src/v2/lib/__tests__/is-mobile-viewport.test.ts +0 -48
- package/src/v2/lib/__tests__/message-feedback.test.ts +0 -152
- package/src/v2/lib/__tests__/processPartialHtml.test.ts +0 -84
- package/src/v2/lib/__tests__/transcription-client.test.ts +0 -67
- package/src/v2/lib/is-mobile-viewport.ts +0 -23
- package/src/v2/lib/message-feedback.ts +0 -120
- package/src/v2/lib/transcription-client.ts +0 -151
|
@@ -5,11 +5,20 @@ import {
|
|
|
5
5
|
onBeforeUnmount,
|
|
6
6
|
onMounted,
|
|
7
7
|
ref,
|
|
8
|
+
shallowRef,
|
|
8
9
|
useAttrs,
|
|
9
10
|
watch,
|
|
10
11
|
} from "vue";
|
|
11
|
-
import {
|
|
12
|
-
|
|
12
|
+
import {
|
|
13
|
+
ɵclampSlashIndex,
|
|
14
|
+
ɵcomposerButtonState,
|
|
15
|
+
ɵcreateComposerAutosize,
|
|
16
|
+
ɵfilterCommands,
|
|
17
|
+
ɵflattenCommandItems,
|
|
18
|
+
ɵparseSlashQuery,
|
|
19
|
+
ɵresolveComposerKey,
|
|
20
|
+
ɵresolveSlashKey,
|
|
21
|
+
} from "@copilotkit/core";
|
|
13
22
|
import {
|
|
14
23
|
IconArrowUp,
|
|
15
24
|
IconCheck,
|
|
@@ -29,6 +38,7 @@ import type {
|
|
|
29
38
|
import { useCopilotId } from "../ui/use-id";
|
|
30
39
|
import type { CopilotChatAudioRecorderRef } from "./audioRecorder";
|
|
31
40
|
import type { CopilotChatInputMode, ToolsMenuItem } from "./types";
|
|
41
|
+
import { useChatLabels } from "./use-chat-labels";
|
|
32
42
|
|
|
33
43
|
defineOptions({ inheritAttrs: false });
|
|
34
44
|
|
|
@@ -107,7 +117,6 @@ const emit = defineEmits<{
|
|
|
107
117
|
}>();
|
|
108
118
|
|
|
109
119
|
const attrs = useAttrs();
|
|
110
|
-
const config = useCopilotChatConfiguration();
|
|
111
120
|
const shellRef = ref<HTMLElement | null>(null);
|
|
112
121
|
const textareaRef = ref<HTMLTextAreaElement | null>(null);
|
|
113
122
|
const gridRef = ref<HTMLElement | null>(null);
|
|
@@ -117,7 +126,20 @@ const slashMenuRef = ref<HTMLElement | null>(null);
|
|
|
117
126
|
const audioRecorderRef = ref<CopilotChatAudioRecorderRef | null>(null);
|
|
118
127
|
const localValue = ref(props.modelValue ?? "");
|
|
119
128
|
const isComposing = ref(false);
|
|
120
|
-
|
|
129
|
+
// Sizes the text box and picks the compact or expanded layout.
|
|
130
|
+
const autosize = ɵcreateComposerAutosize({
|
|
131
|
+
getElements: () => ({
|
|
132
|
+
textarea: textareaRef.value,
|
|
133
|
+
grid: gridRef.value,
|
|
134
|
+
start: addButtonContainerRef.value,
|
|
135
|
+
actions: actionsContainerRef.value,
|
|
136
|
+
}),
|
|
137
|
+
maxRows: props.maxRows,
|
|
138
|
+
});
|
|
139
|
+
const layout = shallowRef(autosize.getSnapshot());
|
|
140
|
+
autosize.subscribe(() => {
|
|
141
|
+
layout.value = autosize.getSnapshot();
|
|
142
|
+
});
|
|
121
143
|
const commandQuery = ref<string | null>(null);
|
|
122
144
|
const slashHighlightIndex = ref(0);
|
|
123
145
|
const previousCommandQuery = ref<string | null>(null);
|
|
@@ -128,36 +150,18 @@ const addMenuInitialFocus = ref<"first" | "last" | "content">("content");
|
|
|
128
150
|
const addMenuAnchor = ref<HTMLElement | null>(null);
|
|
129
151
|
const addMenuId = useCopilotId("cpk-add-menu");
|
|
130
152
|
const addMenuTriggerId = `${addMenuId}-trigger`;
|
|
131
|
-
const measurements = ref({
|
|
132
|
-
singleLineHeight: 0,
|
|
133
|
-
maxHeight: 0,
|
|
134
|
-
paddingLeft: 0,
|
|
135
|
-
paddingRight: 0,
|
|
136
|
-
});
|
|
137
|
-
const resizeEvaluationRafRef = ref<number | null>(null);
|
|
138
|
-
const ignoreResizeRef = ref(false);
|
|
139
|
-
const measurementCanvasRef = ref<HTMLCanvasElement | null>(null);
|
|
140
|
-
const containerCacheRef = ref<{
|
|
141
|
-
compactWidth: number;
|
|
142
|
-
} | null>(null);
|
|
143
|
-
const didWarnMissingFontRef = ref(false);
|
|
144
|
-
const didWarnMissingCanvasContextRef = ref(false);
|
|
145
|
-
let resizeObserver: ResizeObserver | null = null;
|
|
146
153
|
|
|
147
154
|
const isControlled = computed(() => props.modelValue !== undefined);
|
|
148
155
|
const inputValue = computed(() =>
|
|
149
156
|
isControlled.value ? (props.modelValue ?? "") : localValue.value,
|
|
150
157
|
);
|
|
151
|
-
const labels =
|
|
158
|
+
const labels = useChatLabels();
|
|
152
159
|
const resolvedPlaceholder = computed(
|
|
153
160
|
() => props.placeholder ?? labels.value.chatInputPlaceholder,
|
|
154
161
|
);
|
|
155
162
|
const isExpanded = computed(
|
|
156
163
|
() => props.mode === "input" && layout.value === "expanded",
|
|
157
164
|
);
|
|
158
|
-
const isProcessing = computed(
|
|
159
|
-
() => props.mode !== "transcribe" && props.isRunning,
|
|
160
|
-
);
|
|
161
165
|
const shouldShowDisclaimer = computed(
|
|
162
166
|
() => props.showDisclaimer ?? props.positioning === "absolute",
|
|
163
167
|
);
|
|
@@ -177,16 +181,20 @@ const hasFinishTranscribeAction = computed(
|
|
|
177
181
|
typeof props.onFinishTranscribe === "function" ||
|
|
178
182
|
typeof props.onFinishTranscribeWithAudio === "function",
|
|
179
183
|
);
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
184
|
+
const composerInput = computed(() => ({
|
|
185
|
+
mode: props.mode,
|
|
186
|
+
isRunning: props.isRunning,
|
|
187
|
+
value: inputValue.value,
|
|
188
|
+
canSubmit: hasSubmitAction.value,
|
|
189
|
+
canStop: hasStopAction.value,
|
|
190
|
+
disabled: props.disabled,
|
|
191
|
+
}));
|
|
192
|
+
const composerButton = computed(() =>
|
|
193
|
+
ɵcomposerButtonState(composerInput.value),
|
|
189
194
|
);
|
|
195
|
+
const isProcessing = computed(() => composerButton.value.isProcessing);
|
|
196
|
+
const sendDisabled = computed(() => composerButton.value.disabled);
|
|
197
|
+
const showsStop = computed(() => composerButton.value.action === "stop");
|
|
190
198
|
|
|
191
199
|
const containerClass = computed(() => [
|
|
192
200
|
"cpk-chat-input",
|
|
@@ -251,35 +259,7 @@ function normalizeMenuItems() {
|
|
|
251
259
|
const menuItems = computed(() => normalizeMenuItems());
|
|
252
260
|
const hasMenuItems = computed(() => menuItems.value.length > 0);
|
|
253
261
|
|
|
254
|
-
|
|
255
|
-
const seen = new Set<string>();
|
|
256
|
-
const commands: ToolsMenuItem[] = [];
|
|
257
|
-
|
|
258
|
-
const walk = (entryList: MenuEntry[]) => {
|
|
259
|
-
for (const entry of entryList) {
|
|
260
|
-
if (entry === "-") {
|
|
261
|
-
continue;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
if (isMenuGroup(entry) && entry.items.length > 0) {
|
|
265
|
-
walk(entry.items);
|
|
266
|
-
continue;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
if (!entry.action || seen.has(entry.label)) {
|
|
270
|
-
continue;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
seen.add(entry.label);
|
|
274
|
-
commands.push(entry);
|
|
275
|
-
}
|
|
276
|
-
};
|
|
277
|
-
|
|
278
|
-
walk(items);
|
|
279
|
-
return commands;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
const commandItems = computed(() => flattenMenuForCommands(menuItems.value));
|
|
262
|
+
const commandItems = computed(() => ɵflattenCommandItems(menuItems.value));
|
|
283
263
|
|
|
284
264
|
function flattenMenuDisplay(items: MenuEntry[], depth = 0, prefix = "root") {
|
|
285
265
|
const entries: MenuDisplayEntry[] = [];
|
|
@@ -314,32 +294,9 @@ function flattenMenuDisplay(items: MenuEntry[], depth = 0, prefix = "root") {
|
|
|
314
294
|
|
|
315
295
|
const menuDisplayItems = computed(() => flattenMenuDisplay(menuItems.value));
|
|
316
296
|
|
|
317
|
-
const filteredCommands = computed(() =>
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
const normalized = commandQuery.value.trim().toLowerCase();
|
|
323
|
-
if (normalized.length === 0) {
|
|
324
|
-
return commandItems.value;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
const startsWith: ToolsMenuItem[] = [];
|
|
328
|
-
const contains: ToolsMenuItem[] = [];
|
|
329
|
-
|
|
330
|
-
for (const command of commandItems.value) {
|
|
331
|
-
const label = command.label.toLowerCase();
|
|
332
|
-
if (label.startsWith(normalized)) {
|
|
333
|
-
startsWith.push(command);
|
|
334
|
-
continue;
|
|
335
|
-
}
|
|
336
|
-
if (label.includes(normalized)) {
|
|
337
|
-
contains.push(command);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
return [...startsWith, ...contains];
|
|
342
|
-
});
|
|
297
|
+
const filteredCommands = computed(() =>
|
|
298
|
+
ɵfilterCommands(commandItems.value, commandQuery.value),
|
|
299
|
+
);
|
|
343
300
|
|
|
344
301
|
const slashMenuVisible = computed(
|
|
345
302
|
() => commandQuery.value !== null && commandItems.value.length > 0,
|
|
@@ -357,18 +314,7 @@ function clearInputValue() {
|
|
|
357
314
|
}
|
|
358
315
|
|
|
359
316
|
function updateSlashState(value: string) {
|
|
360
|
-
|
|
361
|
-
commandQuery.value = null;
|
|
362
|
-
return;
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
if (value.startsWith("/")) {
|
|
366
|
-
const firstLine = value.split(/\r?\n/, 1)[0] ?? "";
|
|
367
|
-
commandQuery.value = firstLine.slice(1);
|
|
368
|
-
return;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
commandQuery.value = null;
|
|
317
|
+
commandQuery.value = ɵparseSlashQuery(value, commandItems.value.length > 0);
|
|
372
318
|
}
|
|
373
319
|
|
|
374
320
|
function runCommand(command: ToolsMenuItem) {
|
|
@@ -408,14 +354,16 @@ function handleInput(event: Event) {
|
|
|
408
354
|
updateSlashState(nextValue);
|
|
409
355
|
}
|
|
410
356
|
|
|
357
|
+
// The button stops a run whatever the input holds. Enter differs: see
|
|
358
|
+
// handleKeydown.
|
|
411
359
|
function handleSendButtonClick() {
|
|
412
|
-
if (
|
|
413
|
-
|
|
414
|
-
emit("stop");
|
|
415
|
-
}
|
|
360
|
+
if (showsStop.value) {
|
|
361
|
+
emit("stop");
|
|
416
362
|
return;
|
|
417
363
|
}
|
|
418
|
-
|
|
364
|
+
if (!isProcessing.value) {
|
|
365
|
+
submit();
|
|
366
|
+
}
|
|
419
367
|
}
|
|
420
368
|
|
|
421
369
|
function handleKeydown(event: KeyboardEvent) {
|
|
@@ -427,61 +375,43 @@ function handleKeydown(event: KeyboardEvent) {
|
|
|
427
375
|
return;
|
|
428
376
|
}
|
|
429
377
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
378
|
+
const slash = ɵresolveSlashKey(event, {
|
|
379
|
+
query: props.mode === "input" ? commandQuery.value : null,
|
|
380
|
+
commands: filteredCommands.value,
|
|
381
|
+
highlightIndex: slashHighlightIndex.value,
|
|
382
|
+
});
|
|
383
|
+
if (slash.type !== "none") event.preventDefault();
|
|
384
|
+
switch (slash.type) {
|
|
385
|
+
case "highlight":
|
|
386
|
+
slashHighlightIndex.value = slash.index;
|
|
439
387
|
return;
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
if (event.key === "ArrowUp") {
|
|
443
|
-
if (filteredCommands.value.length > 0) {
|
|
444
|
-
event.preventDefault();
|
|
445
|
-
if (slashHighlightIndex.value < 0) {
|
|
446
|
-
slashHighlightIndex.value = filteredCommands.value.length - 1;
|
|
447
|
-
} else {
|
|
448
|
-
slashHighlightIndex.value =
|
|
449
|
-
slashHighlightIndex.value <= 0
|
|
450
|
-
? filteredCommands.value.length - 1
|
|
451
|
-
: slashHighlightIndex.value - 1;
|
|
452
|
-
}
|
|
453
|
-
}
|
|
388
|
+
case "run":
|
|
389
|
+
runCommand(slash.command);
|
|
454
390
|
return;
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
if (event.key === "Enter") {
|
|
458
|
-
const selected =
|
|
459
|
-
slashHighlightIndex.value >= 0
|
|
460
|
-
? filteredCommands.value[slashHighlightIndex.value]
|
|
461
|
-
: undefined;
|
|
462
|
-
if (selected) {
|
|
463
|
-
event.preventDefault();
|
|
464
|
-
runCommand(selected);
|
|
465
|
-
return;
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
if (event.key === "Escape") {
|
|
470
|
-
event.preventDefault();
|
|
391
|
+
case "close":
|
|
471
392
|
commandQuery.value = null;
|
|
472
393
|
return;
|
|
473
|
-
|
|
394
|
+
case "none":
|
|
395
|
+
break;
|
|
474
396
|
}
|
|
475
397
|
|
|
476
|
-
if (
|
|
398
|
+
if (props.mode !== "input") {
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Enter with text sends, also while a run is going. Enter in an empty input
|
|
403
|
+
// stops the run. Read the textarea: a controlled modelValue can lag a tick.
|
|
404
|
+
const action = ɵresolveComposerKey(event, {
|
|
405
|
+
...composerInput.value,
|
|
406
|
+
value: textareaRef.value?.value ?? inputValue.value,
|
|
407
|
+
});
|
|
408
|
+
if (event.key === "Enter" && !event.shiftKey) {
|
|
477
409
|
event.preventDefault();
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
emit("stop");
|
|
481
|
-
}
|
|
482
|
-
return;
|
|
483
|
-
}
|
|
410
|
+
}
|
|
411
|
+
if (action === "send") {
|
|
484
412
|
submit();
|
|
413
|
+
} else if (action === "stop") {
|
|
414
|
+
emit("stop");
|
|
485
415
|
}
|
|
486
416
|
}
|
|
487
417
|
|
|
@@ -593,240 +523,6 @@ function handleContainerClick(event: MouseEvent) {
|
|
|
593
523
|
textareaRef.value?.focus();
|
|
594
524
|
}
|
|
595
525
|
|
|
596
|
-
function ensureMeasurements() {
|
|
597
|
-
const textarea = textareaRef.value;
|
|
598
|
-
if (!textarea || isComposing.value) {
|
|
599
|
-
return;
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
const previousValue = textarea.value;
|
|
603
|
-
const previousHeight = textarea.style.height;
|
|
604
|
-
textarea.style.height = "auto";
|
|
605
|
-
|
|
606
|
-
const computedStyle = window.getComputedStyle(textarea);
|
|
607
|
-
const paddingLeft = parseFloat(computedStyle.paddingLeft) || 0;
|
|
608
|
-
const paddingRight = parseFloat(computedStyle.paddingRight) || 0;
|
|
609
|
-
const paddingTop = parseFloat(computedStyle.paddingTop) || 0;
|
|
610
|
-
const paddingBottom = parseFloat(computedStyle.paddingBottom) || 0;
|
|
611
|
-
|
|
612
|
-
textarea.value = "";
|
|
613
|
-
const singleLineHeight = textarea.scrollHeight;
|
|
614
|
-
textarea.value = previousValue;
|
|
615
|
-
|
|
616
|
-
const contentHeight = singleLineHeight - paddingTop - paddingBottom;
|
|
617
|
-
const maxHeight = contentHeight * props.maxRows + paddingTop + paddingBottom;
|
|
618
|
-
|
|
619
|
-
measurements.value = {
|
|
620
|
-
singleLineHeight,
|
|
621
|
-
maxHeight,
|
|
622
|
-
paddingLeft,
|
|
623
|
-
paddingRight,
|
|
624
|
-
};
|
|
625
|
-
|
|
626
|
-
textarea.style.height = previousHeight;
|
|
627
|
-
textarea.style.maxHeight = `${maxHeight}px`;
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
function adjustTextareaHeight() {
|
|
631
|
-
const textarea = textareaRef.value;
|
|
632
|
-
if (!textarea) {
|
|
633
|
-
return 0;
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
if (measurements.value.singleLineHeight === 0) {
|
|
637
|
-
ensureMeasurements();
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
const { maxHeight } = measurements.value;
|
|
641
|
-
if (maxHeight) {
|
|
642
|
-
textarea.style.maxHeight = `${maxHeight}px`;
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
textarea.style.height = "auto";
|
|
646
|
-
const scrollHeight = textarea.scrollHeight;
|
|
647
|
-
textarea.style.height = `${maxHeight ? Math.min(scrollHeight, maxHeight) : scrollHeight}px`;
|
|
648
|
-
return scrollHeight;
|
|
649
|
-
}
|
|
650
|
-
|
|
651
|
-
function updateLayout(nextLayout: "compact" | "expanded") {
|
|
652
|
-
if (layout.value === nextLayout) {
|
|
653
|
-
return;
|
|
654
|
-
}
|
|
655
|
-
ignoreResizeRef.value = true;
|
|
656
|
-
layout.value = nextLayout;
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
function resolveTextareaFont(textarea: HTMLTextAreaElement): string | null {
|
|
660
|
-
const textareaStyles = window.getComputedStyle(textarea);
|
|
661
|
-
if (textareaStyles.font?.trim()) {
|
|
662
|
-
return textareaStyles.font;
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
if (textareaStyles.fontSize && textareaStyles.fontFamily) {
|
|
666
|
-
const fallbackFont =
|
|
667
|
-
`${textareaStyles.fontStyle} ${textareaStyles.fontVariant} ` +
|
|
668
|
-
`${textareaStyles.fontWeight} ${textareaStyles.fontSize}/${textareaStyles.lineHeight} ` +
|
|
669
|
-
`${textareaStyles.fontFamily}`;
|
|
670
|
-
if (fallbackFont.trim()) {
|
|
671
|
-
return fallbackFont;
|
|
672
|
-
}
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
if (process.env.NODE_ENV !== "production" && !didWarnMissingFontRef.value) {
|
|
676
|
-
didWarnMissingFontRef.value = true;
|
|
677
|
-
console.warn(
|
|
678
|
-
"[CopilotChatInput] Could not resolve textarea font for layout measurement. " +
|
|
679
|
-
"Text-width-based expansion will be skipped until the next container resize.",
|
|
680
|
-
);
|
|
681
|
-
}
|
|
682
|
-
return null;
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
function updateContainerCache() {
|
|
686
|
-
const grid = gridRef.value;
|
|
687
|
-
const addContainer = addButtonContainerRef.value;
|
|
688
|
-
const actionsContainer = actionsContainerRef.value;
|
|
689
|
-
if (!grid || !addContainer || !actionsContainer) {
|
|
690
|
-
containerCacheRef.value = null;
|
|
691
|
-
return null;
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
const gridStyles = window.getComputedStyle(grid);
|
|
695
|
-
const paddingLeft = parseFloat(gridStyles.paddingLeft) || 0;
|
|
696
|
-
const paddingRight = parseFloat(gridStyles.paddingRight) || 0;
|
|
697
|
-
const columnGap = parseFloat(gridStyles.columnGap) || 0;
|
|
698
|
-
const gridAvailableWidth = grid.clientWidth - paddingLeft - paddingRight;
|
|
699
|
-
if (gridAvailableWidth <= 0) {
|
|
700
|
-
containerCacheRef.value = null;
|
|
701
|
-
return null;
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
const addWidth = addContainer.getBoundingClientRect().width;
|
|
705
|
-
const actionsWidth = actionsContainer.getBoundingClientRect().width;
|
|
706
|
-
const compactWidth = Math.max(
|
|
707
|
-
gridAvailableWidth - addWidth - actionsWidth - columnGap * 2,
|
|
708
|
-
0,
|
|
709
|
-
);
|
|
710
|
-
if (compactWidth <= 0) {
|
|
711
|
-
containerCacheRef.value = null;
|
|
712
|
-
return null;
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
const cache = { compactWidth };
|
|
716
|
-
containerCacheRef.value = cache;
|
|
717
|
-
return cache;
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
function evaluateLayout() {
|
|
721
|
-
if (props.mode !== "input") {
|
|
722
|
-
updateLayout("compact");
|
|
723
|
-
return;
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
if (
|
|
727
|
-
typeof window.matchMedia === "function" &&
|
|
728
|
-
window.matchMedia("(max-width: 767px)").matches
|
|
729
|
-
) {
|
|
730
|
-
ensureMeasurements();
|
|
731
|
-
adjustTextareaHeight();
|
|
732
|
-
updateLayout("expanded");
|
|
733
|
-
return;
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
const textarea = textareaRef.value;
|
|
737
|
-
if (
|
|
738
|
-
!textarea ||
|
|
739
|
-
!gridRef.value ||
|
|
740
|
-
!addButtonContainerRef.value ||
|
|
741
|
-
!actionsContainerRef.value
|
|
742
|
-
) {
|
|
743
|
-
return;
|
|
744
|
-
}
|
|
745
|
-
|
|
746
|
-
if (measurements.value.singleLineHeight === 0) {
|
|
747
|
-
ensureMeasurements();
|
|
748
|
-
}
|
|
749
|
-
|
|
750
|
-
const scrollHeight = adjustTextareaHeight();
|
|
751
|
-
const baseline = measurements.value.singleLineHeight;
|
|
752
|
-
const hasExplicitBreak = inputValue.value.includes("\n");
|
|
753
|
-
const renderedMultiline = baseline > 0 ? scrollHeight > baseline + 1 : false;
|
|
754
|
-
let shouldExpand = hasExplicitBreak || renderedMultiline;
|
|
755
|
-
|
|
756
|
-
if (!shouldExpand) {
|
|
757
|
-
const cache = containerCacheRef.value ?? updateContainerCache();
|
|
758
|
-
if (cache && cache.compactWidth > 0) {
|
|
759
|
-
const compactInnerWidth = Math.max(
|
|
760
|
-
cache.compactWidth -
|
|
761
|
-
measurements.value.paddingLeft -
|
|
762
|
-
measurements.value.paddingRight,
|
|
763
|
-
0,
|
|
764
|
-
);
|
|
765
|
-
|
|
766
|
-
if (compactInnerWidth > 0) {
|
|
767
|
-
const canvas =
|
|
768
|
-
measurementCanvasRef.value ?? document.createElement("canvas");
|
|
769
|
-
if (!measurementCanvasRef.value) {
|
|
770
|
-
measurementCanvasRef.value = canvas;
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
const context = canvas.getContext("2d");
|
|
774
|
-
if (context) {
|
|
775
|
-
const resolvedFont = resolveTextareaFont(textarea);
|
|
776
|
-
if (resolvedFont) {
|
|
777
|
-
context.font = resolvedFont;
|
|
778
|
-
const lines =
|
|
779
|
-
inputValue.value.length > 0 ? inputValue.value.split("\n") : [""];
|
|
780
|
-
let longestLine = 0;
|
|
781
|
-
for (const line of lines) {
|
|
782
|
-
const width = context.measureText(line || " ").width;
|
|
783
|
-
if (width > longestLine) {
|
|
784
|
-
longestLine = width;
|
|
785
|
-
}
|
|
786
|
-
}
|
|
787
|
-
if (longestLine > compactInnerWidth) {
|
|
788
|
-
shouldExpand = true;
|
|
789
|
-
}
|
|
790
|
-
}
|
|
791
|
-
} else if (
|
|
792
|
-
process.env.NODE_ENV !== "production" &&
|
|
793
|
-
!didWarnMissingCanvasContextRef.value
|
|
794
|
-
) {
|
|
795
|
-
didWarnMissingCanvasContextRef.value = true;
|
|
796
|
-
console.warn(
|
|
797
|
-
"[CopilotChatInput] canvas.getContext('2d') returned null. " +
|
|
798
|
-
"Text-width-based expansion will be skipped.",
|
|
799
|
-
);
|
|
800
|
-
}
|
|
801
|
-
}
|
|
802
|
-
}
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
updateLayout(shouldExpand ? "expanded" : "compact");
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
function scheduleLayoutEvaluation(invalidateCache: boolean) {
|
|
809
|
-
if (ignoreResizeRef.value) {
|
|
810
|
-
ignoreResizeRef.value = false;
|
|
811
|
-
return;
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
if (invalidateCache) {
|
|
815
|
-
containerCacheRef.value = null;
|
|
816
|
-
didWarnMissingFontRef.value = false;
|
|
817
|
-
didWarnMissingCanvasContextRef.value = false;
|
|
818
|
-
}
|
|
819
|
-
|
|
820
|
-
if (resizeEvaluationRafRef.value !== null) {
|
|
821
|
-
cancelAnimationFrame(resizeEvaluationRafRef.value);
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
resizeEvaluationRafRef.value = requestAnimationFrame(() => {
|
|
825
|
-
resizeEvaluationRafRef.value = null;
|
|
826
|
-
evaluateLayout();
|
|
827
|
-
});
|
|
828
|
-
}
|
|
829
|
-
|
|
830
526
|
watch(
|
|
831
527
|
() => props.modelValue,
|
|
832
528
|
(next) => {
|
|
@@ -838,13 +534,25 @@ watch(
|
|
|
838
534
|
|
|
839
535
|
watch(inputValue, (value) => {
|
|
840
536
|
updateSlashState(value);
|
|
841
|
-
evaluateLayout();
|
|
842
537
|
});
|
|
843
538
|
|
|
539
|
+
watch(
|
|
540
|
+
[inputValue, () => props.mode],
|
|
541
|
+
([value, mode]) => {
|
|
542
|
+
autosize.evaluate(value, mode);
|
|
543
|
+
},
|
|
544
|
+
{ flush: "post" },
|
|
545
|
+
);
|
|
546
|
+
|
|
547
|
+
watch(
|
|
548
|
+
() => props.maxRows,
|
|
549
|
+
(maxRows) => {
|
|
550
|
+
autosize.setMaxRows(maxRows);
|
|
551
|
+
},
|
|
552
|
+
);
|
|
553
|
+
|
|
844
554
|
watch(commandItems, () => {
|
|
845
|
-
|
|
846
|
-
commandQuery.value = null;
|
|
847
|
-
}
|
|
555
|
+
updateSlashState(inputValue.value);
|
|
848
556
|
});
|
|
849
557
|
|
|
850
558
|
watch(
|
|
@@ -866,20 +574,13 @@ watch(
|
|
|
866
574
|
watch(
|
|
867
575
|
[commandQuery, filteredCommands],
|
|
868
576
|
() => {
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
}
|
|
877
|
-
if (
|
|
878
|
-
slashHighlightIndex.value < 0 ||
|
|
879
|
-
slashHighlightIndex.value >= filteredCommands.value.length
|
|
880
|
-
) {
|
|
881
|
-
slashHighlightIndex.value = 0;
|
|
882
|
-
}
|
|
577
|
+
slashHighlightIndex.value =
|
|
578
|
+
commandQuery.value === null
|
|
579
|
+
? 0
|
|
580
|
+
: ɵclampSlashIndex(
|
|
581
|
+
slashHighlightIndex.value,
|
|
582
|
+
filteredCommands.value.length,
|
|
583
|
+
);
|
|
883
584
|
},
|
|
884
585
|
{ immediate: true },
|
|
885
586
|
);
|
|
@@ -888,7 +589,6 @@ watch(
|
|
|
888
589
|
() => props.mode,
|
|
889
590
|
async (mode) => {
|
|
890
591
|
if (mode !== "input") {
|
|
891
|
-
layout.value = "compact";
|
|
892
592
|
commandQuery.value = null;
|
|
893
593
|
closeAddMenu();
|
|
894
594
|
}
|
|
@@ -960,39 +660,11 @@ onMounted(() => {
|
|
|
960
660
|
textareaRef.value?.focus();
|
|
961
661
|
}
|
|
962
662
|
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
if (typeof ResizeObserver !== "undefined") {
|
|
966
|
-
const containerTargets = new Set<HTMLElement>();
|
|
967
|
-
if (gridRef.value) containerTargets.add(gridRef.value);
|
|
968
|
-
if (addButtonContainerRef.value)
|
|
969
|
-
containerTargets.add(addButtonContainerRef.value);
|
|
970
|
-
if (actionsContainerRef.value)
|
|
971
|
-
containerTargets.add(actionsContainerRef.value);
|
|
972
|
-
|
|
973
|
-
resizeObserver = new ResizeObserver((entries) => {
|
|
974
|
-
const shouldInvalidate = entries.some((entry) =>
|
|
975
|
-
containerTargets.has(entry.target as HTMLElement),
|
|
976
|
-
);
|
|
977
|
-
scheduleLayoutEvaluation(shouldInvalidate);
|
|
978
|
-
});
|
|
979
|
-
|
|
980
|
-
if (gridRef.value) resizeObserver.observe(gridRef.value);
|
|
981
|
-
if (addButtonContainerRef.value)
|
|
982
|
-
resizeObserver.observe(addButtonContainerRef.value);
|
|
983
|
-
if (actionsContainerRef.value)
|
|
984
|
-
resizeObserver.observe(actionsContainerRef.value);
|
|
985
|
-
if (textareaRef.value) resizeObserver.observe(textareaRef.value);
|
|
986
|
-
}
|
|
663
|
+
autosize.evaluate(inputValue.value, props.mode);
|
|
987
664
|
});
|
|
988
665
|
|
|
989
666
|
onBeforeUnmount(() => {
|
|
990
|
-
|
|
991
|
-
resizeObserver = null;
|
|
992
|
-
if (resizeEvaluationRafRef.value !== null) {
|
|
993
|
-
cancelAnimationFrame(resizeEvaluationRafRef.value);
|
|
994
|
-
resizeEvaluationRafRef.value = null;
|
|
995
|
-
}
|
|
667
|
+
autosize.dispose();
|
|
996
668
|
});
|
|
997
669
|
</script>
|
|
998
670
|
|
|
@@ -1295,7 +967,7 @@ onBeforeUnmount(() => {
|
|
|
1295
967
|
type="button"
|
|
1296
968
|
data-testid="copilot-chat-input-send"
|
|
1297
969
|
:aria-label="
|
|
1298
|
-
|
|
970
|
+
showsStop
|
|
1299
971
|
? labels.chatInputToolbarStopButtonLabel
|
|
1300
972
|
: labels.chatInputToolbarSendButtonLabel
|
|
1301
973
|
"
|
|
@@ -1304,7 +976,7 @@ onBeforeUnmount(() => {
|
|
|
1304
976
|
@click="handleSendButtonClick"
|
|
1305
977
|
>
|
|
1306
978
|
<IconSquare
|
|
1307
|
-
v-if="
|
|
979
|
+
v-if="showsStop"
|
|
1308
980
|
class="cpk-chat-input-stop-icon"
|
|
1309
981
|
/>
|
|
1310
982
|
<IconArrowUp v-else class="cpk-chat-input-send-icon" />
|