@codingame/monaco-vscode-katex-common 34.1.2 → 35.0.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/package.json +2 -2
- package/vscode/src/vs/base/browser/animationSync.d.ts +36 -0
- package/vscode/src/vs/base/browser/animationSync.js +23 -0
- package/vscode/src/vs/base/browser/ui/pixelSpinner/pixelSpinner.js +23 -2
- package/vscode/src/vs/platform/actions/browser/buttonbar.js +3 -2
- package/vscode/src/vs/platform/agentHost/common/claudeSessionConfigKeys.d.ts +5 -5
- package/vscode/src/vs/platform/agentHost/common/fileEditDiff.d.ts +32 -0
- package/vscode/src/vs/platform/agentHost/common/fileEditDiff.js +33 -0
- package/vscode/src/vs/platform/agentHost/common/meta/agentFeedbackAnnotations.d.ts +90 -0
- package/vscode/src/vs/platform/agentHost/common/meta/agentFeedbackAttachments.d.ts +30 -0
- package/vscode/src/vs/platform/agentHost/common/meta/agentToolCallMeta.d.ts +65 -0
- package/vscode/src/vs/platform/agentHost/common/sessionConfigKeys.d.ts +16 -5
- package/vscode/src/vs/platform/agentHost/common/sessionConfigKeys.js +3 -2
- package/vscode/src/vs/platform/agentHost/common/state/protocol/channels-resource-watch/reducer.d.ts +21 -0
- package/vscode/src/vs/platform/agentHost/common/state/protocol/reducers.d.ts +8 -0
- package/vscode/src/vs/platform/agentHost/common/state/sessionReducers.d.ts +9 -0
- package/vscode/src/vs/platform/mcp/common/modelContextProtocolApps.d.ts +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatAccessibilityProvider.js +16 -16
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContinueInAction.d.ts +29 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContinueInAction.js +105 -28
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatElicitationActions.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.d.ts +15 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.js +74 -44
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.js +10 -10
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolActions.js +11 -11
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolPicker.d.ts +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolPicker.js +98 -24
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostChatInputPicker.contribution.d.ts +8 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostChatInputPicker.contribution.js +31 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostChatInputPicker.d.ts +45 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostChatInputPicker.js +163 -37
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostFolderPickerActionItem.d.ts +47 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostFolderPickerActionItem.js +172 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostGenericConfigChips.d.ts +3 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostGenericConfigChips.js +7 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSessionReferenceAttachment.d.ts +12 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSnapshotController.d.ts +116 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSnapshotController.js +348 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/media/agentHostChatInputPicker.css +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/stateToProgressAdapter.d.ts +211 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/stateToProgressAdapter.js +64 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionApprovalModel.d.ts +18 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionApprovalModel.js +13 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionHoverWidget.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionHoverWidget.js +30 -18
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.d.ts +4 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.js +29 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsFilter.js +9 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsOpener.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.d.ts +24 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.js +119 -41
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/media/agentsessionsviewer.css +27 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/sessionTypeAvailability.d.ts +63 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/sessionTypeAvailability.js +97 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentWidgets.d.ts +5 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentWidgets.js +105 -88
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/implicitContextAttachment.js +13 -13
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.js +46 -48
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingTextModelContentProviders.d.ts +28 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingTextModelContentProviders.js +98 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/chatSessionPickerActionItem.d.ts +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/chatSessionPickerActionItem.js +9 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/media/chatTurnPills.css +162 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/chatToolRiskAssessmentService.d.ts +9 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/chatToolRiskAssessmentService.js +95 -24
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolSetsContribution.d.ts +22 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolSetsContribution.js +151 -20
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatAgentHover.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatArtifactsWidget.js +10 -10
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentMarkdownRenderer.js +20 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAgentCommandContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAnonymousRateLimitedPart.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAttachmentsContentPart.d.ts +5 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAttachmentsContentPart.js +61 -17
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAutoModeResolutionContentPart.d.ts +20 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAutoModeResolutionContentPart.js +55 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatChangesSummaryPart.d.ts +6 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatChangesSummaryPart.js +81 -30
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatCodeCitationContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatCommandContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatConfirmationContentPart.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatConfirmationWidget.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatDisabledClaudeHooksContentPart.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatEditPillElement.d.ts +11 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatEditPillElement.js +13 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatElicitationContentPart.js +9 -33
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatExtensionsContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatExternalEditContentPart.d.ts +6 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatExternalEditContentPart.js +21 -11
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatHookContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatInlineAnchorWidget.js +13 -13
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownContentPart.d.ts +6 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownContentPart.js +40 -19
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpAuthenticationContentPart.d.ts +35 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpAuthenticationContentPart.js +140 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpServersInteractionContentPart.js +8 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpServersStartingContentPart.d.ts +24 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpServersStartingContentPart.js +58 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMultiDiffContentPart.d.ts +3 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMultiDiffContentPart.js +29 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatPlanReviewPart.js +30 -30
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatProgressContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.js +44 -44
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuotaExceededPart.d.ts +1 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuotaExceededPart.js +12 -66
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatReferencesContentPart.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatResourceGroupWidget.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSubagentContentPart.d.ts +39 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSubagentContentPart.js +167 -43
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSuggestNextWidget.d.ts +1 -15
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSuggestNextWidget.js +9 -86
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSystemNotificationContentPart.d.ts +12 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSystemNotificationContentPart.js +23 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTextEditContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.d.ts +9 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.js +141 -72
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTipContentPart.js +9 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTodoListWidget.js +17 -17
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatToolInputOutputContentPart.d.ts +2 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatToolInputOutputContentPart.js +17 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTreeContentPart.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTurnPillsPart.d.ts +29 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTurnPillsPart.js +110 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatWorkspaceEditContentPart.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/codeBlockPart.js +14 -14
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatAgentFeedbackReviewConfirmation.css +133 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatAutoModeResolution.css +30 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatCodeBlockPill.css +4 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatConfirmationWidget.css +18 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatPlanReview.css +23 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatQuestionCarousel.css +33 -18
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatSubagentContent.css +23 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTerminalToolProgressPart.css +44 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatThinkingContent.css +2 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatToolConfirmationCarousel.css +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/abstractToolConfirmationSubPart.d.ts +9 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/abstractToolConfirmationSubPart.js +21 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatAgentFeedbackReviewConfirmationSubPart.d.ts +48 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatAgentFeedbackReviewConfirmationSubPart.js +279 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatExtensionsInstallToolSubPart.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppModel.d.ts +43 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppModel.js +53 -15
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppSubPart.d.ts +7 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppSubPart.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatModifiedFilesConfirmationSubPart.d.ts +4 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatModifiedFilesConfirmationSubPart.js +24 -10
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/{chatMissingSandboxDepsConfirmationSubPart.d.ts → chatSandboxPrerequisiteConfirmationSubPart.d.ts} +3 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/{chatMissingSandboxDepsConfirmationSubPart.js → chatSandboxPrerequisiteConfirmationSubPart.js} +14 -10
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.d.ts +0 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.js +30 -59
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.d.ts +2 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.js +41 -29
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationCarouselPart.js +8 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationSubPart.d.ts +2 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationSubPart.js +12 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolInvocationPart.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolInvocationPart.js +43 -35
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolOutputPart.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolPartUtilities.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolPostExecuteConfirmationPart.d.ts +2 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolPostExecuteConfirmationPart.js +11 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/toolRiskBadgeHelper.d.ts +18 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/toolRiskBadgeHelper.js +51 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/toolRiskBadgeWidget.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatDragAndDrop.js +11 -11
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.d.ts +18 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.js +266 -98
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListWidget.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListWidget.js +8 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatRestoreCheckpointActionViewItem.d.ts +32 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatRestoreCheckpointActionViewItem.js +135 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatTurnPills.d.ts +85 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatTurnPills.js +275 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidget.d.ts +18 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidget.js +84 -37
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatFollowups.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatGoalBannerWidget.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputNotificationService.d.ts +14 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputNotificationWidget.d.ts +6 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputNotificationWidget.js +52 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.d.ts +187 -13
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.js +435 -139
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputStatePersistence.d.ts +6 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputStatePersistence.js +21 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelConfigurationLogic.d.ts +50 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelConfigurationLogic.js +49 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelConfigurationStore.d.ts +79 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelConfigurationStore.js +127 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelPicker.d.ts +84 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelPicker.js +658 -430
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelSelectionLogic.d.ts +72 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelSelectionLogic.js +82 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatPhoneInputPresenter.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatSelectedTools.d.ts +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatSelectedTools.js +6 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/delegationSessionPickerActionItem.d.ts +2 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/delegationSessionPickerActionItem.js +23 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/media/chatGoalBannerWidget.css +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/media/chatInputNotificationWidget.css +28 -12
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modePickerActionItem.d.ts +3 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modePickerActionItem.js +15 -14
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modelPickerActionItem.d.ts +60 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modelPickerActionItem.js +18 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/permissionPickerActionItem.d.ts +49 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/permissionPickerActionItem.js +141 -81
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/sessionTargetPickerActionItem.d.ts +7 -15
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/sessionTargetPickerActionItem.js +30 -47
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/workspacePickerActionItem.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/workspacePickerInputActionItem.d.ts +20 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/workspacePickerInputActionItem.js +18 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/media/chat.css +469 -148
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageDetails.d.ts +11 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageDetails.js +79 -28
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageWidget.d.ts +71 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageWidget.js +107 -45
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/media/chatContextUsageDetails.css +20 -0
- package/vscode/src/vs/workbench/contrib/chat/common/chatErrorMessages.d.ts +110 -0
- package/vscode/src/vs/workbench/contrib/chat/common/chatErrorMessages.js +37 -0
- package/vscode/src/vs/workbench/contrib/chat/common/chatImageExtraction.d.ts +4 -1
- package/vscode/src/vs/workbench/contrib/chat/common/chatImageExtraction.js +13 -11
- package/vscode/src/vs/workbench/contrib/chat/common/chatPermissionWarnings.d.ts +8 -1
- package/vscode/src/vs/workbench/contrib/chat/common/chatPermissionWarnings.js +57 -21
- package/vscode/src/vs/workbench/contrib/chat/common/widget/chatColors.js +18 -18
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.js +4 -4
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.js +5 -5
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.js +1 -1
- package/vscode/src/vs/workbench/contrib/inlineChat/common/inlineChat.js +30 -30
- package/vscode/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.js +3 -3
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpToolCallUI.d.ts +39 -8
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpToolCallUI.js +168 -72
- package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.js +7 -7
- package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.js +2 -2
- package/vscode/src/vs/workbench/contrib/notebook/browser/controller/cellOperations.js +2 -2
- package/vscode/src/vs/workbench/contrib/notebook/browser/controller/insertCellActions.js +24 -24
- package/vscode/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.js +3 -3
- package/vscode/src/vs/workbench/contrib/notebook/browser/diff/diffElementOutputs.js +7 -7
- package/vscode/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor.js +1 -1
- package/vscode/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser.js +5 -5
- package/vscode/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffList.js +1 -1
- package/vscode/src/vs/workbench/contrib/replNotebook/browser/replEditor.js +1 -1
- package/vscode/src/vs/workbench/contrib/replNotebook/browser/replEditorInput.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputStatusActionViewItem.d.ts +0 -30
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputStatusActionViewItem.js +0 -147
|
@@ -2,17 +2,21 @@
|
|
|
2
2
|
import { __decorate, __param } from '@codingame/monaco-vscode-api/external/tslib/tslib.es6';
|
|
3
3
|
import { append, $, addDisposableGenericMouseDownListener, EventHelper, addDisposableListener, EventType, getActiveElement, isHTMLElement, isHTMLInputElement, reset } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/dom';
|
|
4
4
|
import { StandardKeyboardEvent } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/keyboardEvent';
|
|
5
|
-
import { renderMarkdown } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/markdownRenderer';
|
|
6
5
|
import { renderIcon } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/iconLabel/iconLabels';
|
|
6
|
+
import { Button } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/button/button';
|
|
7
7
|
import { getBaseLayerHoverDelegate } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/hover/hoverDelegate2';
|
|
8
8
|
import { getDefaultHoverDelegate } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/hover/hoverDelegateFactory';
|
|
9
|
+
import { defaultButtonStyles } from '@codingame/monaco-vscode-api/vscode/vs/platform/theme/browser/defaultStyles';
|
|
9
10
|
import { toAction } from '@codingame/monaco-vscode-api/vscode/vs/base/common/actions';
|
|
10
11
|
import { Codicon } from '@codingame/monaco-vscode-api/vscode/vs/base/common/codicons';
|
|
11
12
|
import { Emitter } from '@codingame/monaco-vscode-api/vscode/vs/base/common/event';
|
|
12
13
|
import { MarkdownString } from '@codingame/monaco-vscode-api/vscode/vs/base/common/htmlContent';
|
|
14
|
+
import { renderMarkdown } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/markdownRenderer';
|
|
13
15
|
import { KeyCode } from '@codingame/monaco-vscode-api/vscode/vs/base/common/keyCodes';
|
|
14
|
-
import { Disposable, DisposableStore } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
|
|
16
|
+
import { Disposable, MutableDisposable, DisposableStore } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
|
|
17
|
+
import { disposableTimeout } from '@codingame/monaco-vscode-api/vscode/vs/base/common/async';
|
|
15
18
|
import '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/index';
|
|
19
|
+
import { formatTokenCount } from '@codingame/monaco-vscode-api/vscode/vs/base/common/numbers';
|
|
16
20
|
import { ThemeIcon } from '@codingame/monaco-vscode-api/vscode/vs/base/common/themables';
|
|
17
21
|
import { URI } from '@codingame/monaco-vscode-api/vscode/vs/base/common/uri';
|
|
18
22
|
import { localize } from '@codingame/monaco-vscode-api/vscode/vs/nls';
|
|
@@ -22,17 +26,22 @@ import { ICommandService } from '@codingame/monaco-vscode-api/vscode/vs/platform
|
|
|
22
26
|
import { IOpenerService } from '@codingame/monaco-vscode-api/vscode/vs/platform/opener/common/opener.service';
|
|
23
27
|
import { IProductService } from '@codingame/monaco-vscode-api/vscode/vs/platform/product/common/productService.service';
|
|
24
28
|
import { ITelemetryService } from '@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetry.service';
|
|
29
|
+
import { StorageScope, StorageTarget } from '@codingame/monaco-vscode-api/vscode/vs/platform/storage/common/storage';
|
|
30
|
+
import { IStorageService } from '@codingame/monaco-vscode-api/vscode/vs/platform/storage/common/storage.service';
|
|
25
31
|
import { TelemetryTrustedValue } from '@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetryUtils';
|
|
26
32
|
import { MANAGE_CHAT_COMMAND_ID } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/constants';
|
|
27
33
|
import { ILanguageModelsService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/languageModels.service';
|
|
28
|
-
import { isProUser, ChatEntitlement } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/chat/common/chatEntitlementService';
|
|
34
|
+
import { isProUser, ChatEntitlement, chatRequiresSetup } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/chat/common/chatEntitlementService';
|
|
29
35
|
import { IChatEntitlementService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/chat/common/chatEntitlementService.service';
|
|
30
36
|
import { semverExports } from '@codingame/monaco-vscode-api/_virtual/semver';
|
|
37
|
+
import { getModelPickerUnavailableReason, ModelPickerUnavailableReason } from './chatModelSelectionLogic.js';
|
|
38
|
+
import { CHAT_SETUP_ACTION_ID } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/browser/actions/chatActions';
|
|
31
39
|
import { IUriIdentityService } from '@codingame/monaco-vscode-api/vscode/vs/platform/uriIdentity/common/uriIdentity.service';
|
|
32
40
|
import { GitHubPaths } from '@codingame/monaco-vscode-api/vscode/vs/platform/defaultAccount/common/defaultAccount';
|
|
33
41
|
import { IDefaultAccountService } from '@codingame/monaco-vscode-api/vscode/vs/platform/defaultAccount/common/defaultAccount.service';
|
|
34
42
|
import { StateType } from '@codingame/monaco-vscode-api/vscode/vs/platform/update/common/update';
|
|
35
43
|
import { IUpdateService } from '@codingame/monaco-vscode-api/vscode/vs/platform/update/common/update.service';
|
|
44
|
+
import { IWorkspaceTrustManagementService, IWorkspaceTrustRequestService } from '@codingame/monaco-vscode-api/vscode/vs/platform/workspace/common/workspaceTrust.service';
|
|
36
45
|
import { autorun } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/reactions/autorun';
|
|
37
46
|
|
|
38
47
|
function isVersionAtLeast(current, required) {
|
|
@@ -50,20 +59,20 @@ function getUpdateHoverContent(updateState) {
|
|
|
50
59
|
switch (updateState) {
|
|
51
60
|
case StateType.AvailableForDownload:
|
|
52
61
|
hoverContent.appendMarkdown(( localize(
|
|
53
|
-
|
|
62
|
+
8255,
|
|
54
63
|
"This model requires a newer version of VS Code. [Download Update](command:update.downloadUpdate) to access it."
|
|
55
64
|
)));
|
|
56
65
|
break;
|
|
57
66
|
case StateType.Downloaded:
|
|
58
67
|
case StateType.Ready:
|
|
59
68
|
hoverContent.appendMarkdown(( localize(
|
|
60
|
-
|
|
69
|
+
8256,
|
|
61
70
|
"This model requires a newer version of VS Code. [Restart to Update](command:update.restartToUpdate) to access it."
|
|
62
71
|
)));
|
|
63
72
|
break;
|
|
64
73
|
default:
|
|
65
74
|
hoverContent.appendMarkdown(( localize(
|
|
66
|
-
|
|
75
|
+
8257,
|
|
67
76
|
"This model requires a newer version of VS Code. [Update VS Code](command:update.checkForUpdate) to access it."
|
|
68
77
|
)));
|
|
69
78
|
break;
|
|
@@ -76,7 +85,14 @@ function getControlModelsForEntitlement(manifest, entitlement) {
|
|
|
76
85
|
const ModelPickerSection = {
|
|
77
86
|
Other: "other"
|
|
78
87
|
};
|
|
88
|
+
const RESTRICTED_MODE_TRUST_ACTION_ID = "restrictedModeTrust";
|
|
89
|
+
const SETUP_REQUIRED_SIGN_IN_ACTION_ID = "setupRequiredSignIn";
|
|
90
|
+
const PICKER_COMMAND_ACTION_IDS = ( new Set([RESTRICTED_MODE_TRUST_ACTION_ID, SETUP_REQUIRED_SIGN_IN_ACTION_ID]));
|
|
91
|
+
const CACHE_BREAK_HINT_DISMISSED_STORAGE_KEY = "chat.cacheBreakHintDismissed";
|
|
79
92
|
function getVendorDisplayName(languageModelsService, vendor) {
|
|
93
|
+
if (vendor === "copilotcli") {
|
|
94
|
+
return localize(8258, "Copilot");
|
|
95
|
+
}
|
|
80
96
|
const descriptor = languageModelsService.getVendors().find(v => v.vendor === vendor);
|
|
81
97
|
if (descriptor?.displayName) {
|
|
82
98
|
return descriptor.displayName;
|
|
@@ -103,6 +119,12 @@ function buildModelToProviderGroupMap(languageModelsService) {
|
|
|
103
119
|
return map;
|
|
104
120
|
}
|
|
105
121
|
function getProviderGroupForModel(model, modelToGroup, languageModelsService) {
|
|
122
|
+
if (model.metadata.modelGroup) {
|
|
123
|
+
return {
|
|
124
|
+
vendor: model.metadata.vendor,
|
|
125
|
+
groupName: getVendorDisplayName(languageModelsService, model.metadata.modelGroup.id)
|
|
126
|
+
};
|
|
127
|
+
}
|
|
106
128
|
const info = modelToGroup.get(model.identifier);
|
|
107
129
|
if (info) {
|
|
108
130
|
return info;
|
|
@@ -122,9 +144,15 @@ function createModelItem(
|
|
|
122
144
|
vendorLabel,
|
|
123
145
|
isUBB,
|
|
124
146
|
ariaDescription,
|
|
125
|
-
pinAction
|
|
147
|
+
pinAction,
|
|
148
|
+
onConfigure
|
|
126
149
|
) {
|
|
127
|
-
const hover = model && openerService ? getModelHoverContent(
|
|
150
|
+
const hover = model && openerService ? getModelHoverContent(
|
|
151
|
+
model,
|
|
152
|
+
isUBB,
|
|
153
|
+
onConfigure ? group => onConfigure(model, group) : undefined,
|
|
154
|
+
openerService
|
|
155
|
+
) : undefined;
|
|
128
156
|
return {
|
|
129
157
|
item: action,
|
|
130
158
|
kind: ActionListItemKind.Action,
|
|
@@ -151,22 +179,22 @@ function createModelItem(
|
|
|
151
179
|
function createPinAction(modelIdentifier, isPinned, onTogglePin) {
|
|
152
180
|
return toAction({
|
|
153
181
|
id: `pin.${modelIdentifier}`,
|
|
154
|
-
label: isPinned ? ( localize(
|
|
182
|
+
label: isPinned ? ( localize(8259, "Unpin Model")) : ( localize(8260, "Pin Model")),
|
|
155
183
|
class: ThemeIcon.asClassName(isPinned ? Codicon.pinned : Codicon.pin),
|
|
156
184
|
run: () => onTogglePin(modelIdentifier, !isPinned)
|
|
157
185
|
});
|
|
158
186
|
}
|
|
159
|
-
function resolveConfigProperty(model, group,
|
|
187
|
+
function resolveConfigProperty(model, group, configAccess) {
|
|
160
188
|
const schema = model.metadata.configurationSchema;
|
|
161
189
|
if (!schema?.properties) {
|
|
162
190
|
return undefined;
|
|
163
191
|
}
|
|
164
|
-
const currentConfig =
|
|
192
|
+
const currentConfig = configAccess.getModelConfiguration(model.identifier) ?? {};
|
|
165
193
|
for (const [key, propSchema] of Object.entries(schema.properties)) {
|
|
166
194
|
if (propSchema.group !== group) {
|
|
167
195
|
continue;
|
|
168
196
|
}
|
|
169
|
-
if (!propSchema.enum || propSchema.enum.length <
|
|
197
|
+
if (!propSchema.enum || propSchema.enum.length < 1) {
|
|
170
198
|
continue;
|
|
171
199
|
}
|
|
172
200
|
const value = currentConfig[key] ?? propSchema.default;
|
|
@@ -184,61 +212,45 @@ function getPriceCategoryLabel(priceCategory) {
|
|
|
184
212
|
case "":
|
|
185
213
|
return undefined;
|
|
186
214
|
case "low":
|
|
187
|
-
return localize(
|
|
215
|
+
return localize(8261, "Low cost");
|
|
188
216
|
case "medium":
|
|
189
|
-
return localize(
|
|
217
|
+
return localize(8262, "Medium cost");
|
|
190
218
|
case "high":
|
|
191
|
-
return localize(
|
|
219
|
+
return localize(8263, "High cost");
|
|
192
220
|
case "very_high":
|
|
193
|
-
return localize(
|
|
221
|
+
return localize(8264, "Very high cost");
|
|
194
222
|
default:
|
|
195
223
|
return localize(
|
|
196
|
-
|
|
224
|
+
8265,
|
|
197
225
|
"{0} cost",
|
|
198
226
|
priceCategory.charAt(0).toUpperCase() + priceCategory.slice(1)
|
|
199
227
|
);
|
|
200
228
|
}
|
|
201
229
|
}
|
|
202
|
-
function
|
|
203
|
-
|
|
204
|
-
|
|
230
|
+
function isHighCostCategory(priceCategory) {
|
|
231
|
+
return priceCategory === "high" || priceCategory === "very_high";
|
|
232
|
+
}
|
|
233
|
+
function getCategoryLabel(category) {
|
|
234
|
+
switch (category) {
|
|
235
|
+
case undefined:
|
|
236
|
+
case "":
|
|
205
237
|
return undefined;
|
|
238
|
+
case "lightweight":
|
|
239
|
+
return localize(8266, "Lightweight");
|
|
240
|
+
case "versatile":
|
|
241
|
+
return localize(8267, "Versatile");
|
|
242
|
+
case "powerful":
|
|
243
|
+
return localize(8268, "Powerful");
|
|
244
|
+
default:
|
|
245
|
+
return typeof category === "string" ? category.charAt(0).toUpperCase() + category.slice(1) : undefined;
|
|
206
246
|
}
|
|
207
|
-
const currentConfig = languageModelsService.getModelConfiguration(model.identifier) ?? {};
|
|
208
|
-
const parts = [];
|
|
209
|
-
for (const [key, propSchema] of Object.entries(schema.properties)) {
|
|
210
|
-
if (propSchema.group !== "navigation") {
|
|
211
|
-
continue;
|
|
212
|
-
}
|
|
213
|
-
if (!propSchema.enum || propSchema.enum.length < 2) {
|
|
214
|
-
continue;
|
|
215
|
-
}
|
|
216
|
-
const value = currentConfig[key] ?? propSchema.default;
|
|
217
|
-
if (value === undefined) {
|
|
218
|
-
continue;
|
|
219
|
-
}
|
|
220
|
-
const enumIndex = propSchema.enum?.indexOf(value) ?? -1;
|
|
221
|
-
const label = propSchema.enumItemLabels?.[enumIndex] ?? String(value);
|
|
222
|
-
parts.push(label);
|
|
223
|
-
}
|
|
224
|
-
return parts.length > 0 ? parts.join(", ") : undefined;
|
|
225
247
|
}
|
|
226
|
-
function createModelAction(
|
|
227
|
-
model,
|
|
228
|
-
selectedModelId,
|
|
229
|
-
onSelect,
|
|
230
|
-
languageModelsService,
|
|
231
|
-
section,
|
|
232
|
-
suppressVendorInDetail,
|
|
233
|
-
isUBB
|
|
234
|
-
) {
|
|
248
|
+
function createModelAction(model, selectedModelId, onSelect, section, suppressVendorInDetail) {
|
|
235
249
|
const pricingForDescription = isMultiplierPricing(model) ? model.metadata.pricing : undefined;
|
|
236
|
-
const priceCategoryLabel =
|
|
237
|
-
const configDescription = !isUBB ? getModelConfigurationDescription(model, languageModelsService) : undefined;
|
|
250
|
+
const priceCategoryLabel = getPriceCategoryLabel(model.metadata.priceCategory);
|
|
238
251
|
const detail = suppressVendorInDetail ? undefined : model.metadata.detail;
|
|
239
|
-
const textParts = [
|
|
252
|
+
const textParts = [detail, pricingForDescription].filter(Boolean);
|
|
240
253
|
const textDescription = textParts.length > 0 ? textParts.join(" · ") : undefined;
|
|
241
|
-
const toolbarActions = !isUBB ? languageModelsService.getModelConfigurationActions(model.identifier) : undefined;
|
|
242
254
|
const action = {
|
|
243
255
|
id: model.identifier,
|
|
244
256
|
enabled: true,
|
|
@@ -249,7 +261,6 @@ function createModelAction(
|
|
|
249
261
|
tooltip: model.metadata.name,
|
|
250
262
|
label: model.metadata.name,
|
|
251
263
|
section,
|
|
252
|
-
toolbarActions: toolbarActions && toolbarActions.length > 0 ? toolbarActions : undefined,
|
|
253
264
|
run: () => onSelect(model)
|
|
254
265
|
};
|
|
255
266
|
const ariaDescription = priceCategoryLabel ? (textDescription ? textDescription + " · " + priceCategoryLabel : priceCategoryLabel) : undefined;
|
|
@@ -267,8 +278,8 @@ function createManageModelsAction(commandService) {
|
|
|
267
278
|
enabled: true,
|
|
268
279
|
checked: false,
|
|
269
280
|
class: ThemeIcon.asClassName(Codicon.gear),
|
|
270
|
-
tooltip: ( localize(
|
|
271
|
-
label: ( localize(
|
|
281
|
+
tooltip: ( localize(8269, "Manage Language Models")),
|
|
282
|
+
label: ( localize(8270, "Manage Models...")),
|
|
272
283
|
run: () => {
|
|
273
284
|
commandService.executeCommand(MANAGE_CHAT_COMMAND_ID);
|
|
274
285
|
}
|
|
@@ -292,19 +303,120 @@ function buildModelPickerItems(
|
|
|
292
303
|
showFeatured,
|
|
293
304
|
languageModelsService,
|
|
294
305
|
openerService,
|
|
295
|
-
|
|
306
|
+
showAutoModel = false,
|
|
307
|
+
onConfigure,
|
|
308
|
+
restrictedMode = false,
|
|
309
|
+
onRequestTrust,
|
|
310
|
+
setupRequired = false,
|
|
311
|
+
onRequestSetup,
|
|
312
|
+
isUBB = false
|
|
296
313
|
) {
|
|
297
314
|
const items = [];
|
|
315
|
+
if (restrictedMode) {
|
|
316
|
+
items.push({
|
|
317
|
+
kind: ActionListItemKind.Header,
|
|
318
|
+
label: ( localize(8271, "Models unavailable while in Restricted mode"))
|
|
319
|
+
});
|
|
320
|
+
items.push({
|
|
321
|
+
item: {
|
|
322
|
+
id: RESTRICTED_MODE_TRUST_ACTION_ID,
|
|
323
|
+
enabled: !!onRequestTrust,
|
|
324
|
+
checked: false,
|
|
325
|
+
class: undefined,
|
|
326
|
+
tooltip: ( localize(8272, "Trust the workspace to enable models.")),
|
|
327
|
+
label: ( localize(8273, "Trust Workspace to enable models...")),
|
|
328
|
+
run: () => onRequestTrust?.()
|
|
329
|
+
},
|
|
330
|
+
kind: ActionListItemKind.Action,
|
|
331
|
+
label: ( localize(8273, "Trust Workspace to enable models...")),
|
|
332
|
+
group: {
|
|
333
|
+
title: "",
|
|
334
|
+
icon: ThemeIcon.fromId(Codicon.workspaceTrusted.id)
|
|
335
|
+
},
|
|
336
|
+
disabled: !onRequestTrust,
|
|
337
|
+
hideIcon: false
|
|
338
|
+
});
|
|
339
|
+
return items;
|
|
340
|
+
}
|
|
341
|
+
if (setupRequired) {
|
|
342
|
+
items.push({
|
|
343
|
+
kind: ActionListItemKind.Header,
|
|
344
|
+
label: ( localize(8274, "Sign in to use Copilot"))
|
|
345
|
+
});
|
|
346
|
+
items.push({
|
|
347
|
+
item: {
|
|
348
|
+
id: SETUP_REQUIRED_SIGN_IN_ACTION_ID,
|
|
349
|
+
enabled: !!onRequestSetup,
|
|
350
|
+
checked: false,
|
|
351
|
+
class: undefined,
|
|
352
|
+
tooltip: ( localize(8275, "Sign in to GitHub Copilot to choose a model.")),
|
|
353
|
+
label: ( localize(8276, "Sign in to use Copilot...")),
|
|
354
|
+
run: () => onRequestSetup?.()
|
|
355
|
+
},
|
|
356
|
+
kind: ActionListItemKind.Action,
|
|
357
|
+
label: ( localize(8276, "Sign in to use Copilot...")),
|
|
358
|
+
group: {
|
|
359
|
+
title: "",
|
|
360
|
+
icon: ThemeIcon.fromId(Codicon.signIn.id)
|
|
361
|
+
},
|
|
362
|
+
disabled: !onRequestSetup,
|
|
363
|
+
hideIcon: false
|
|
364
|
+
});
|
|
365
|
+
return items;
|
|
366
|
+
}
|
|
298
367
|
if (models.length === 0) {
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
368
|
+
if (!showAutoModel) {
|
|
369
|
+
const entitlement = chatEntitlementService.entitlement;
|
|
370
|
+
const canUpgrade = entitlement === ChatEntitlement.Free || entitlement === ChatEntitlement.EDU;
|
|
371
|
+
const description = canUpgrade ? ( new MarkdownString(( localize(8277, "[Upgrade](command:workbench.action.chat.upgradePlan \" \")")), {
|
|
372
|
+
isTrusted: true
|
|
373
|
+
})) : undefined;
|
|
374
|
+
let hover;
|
|
375
|
+
if (canUpgrade) {
|
|
376
|
+
hover = ( new MarkdownString("", {
|
|
377
|
+
isTrusted: true,
|
|
378
|
+
supportThemeIcons: true
|
|
379
|
+
}));
|
|
380
|
+
hover.appendMarkdown(( localize(
|
|
381
|
+
8278,
|
|
382
|
+
"[Upgrade to GitHub Copilot Pro](command:workbench.action.chat.upgradePlan \" \") to use the best models."
|
|
383
|
+
)));
|
|
384
|
+
}
|
|
385
|
+
items.push({
|
|
386
|
+
item: {
|
|
387
|
+
id: "noModels",
|
|
388
|
+
enabled: false,
|
|
389
|
+
checked: false,
|
|
390
|
+
class: undefined,
|
|
391
|
+
tooltip: ( localize(8279, "No models available")),
|
|
392
|
+
label: ( localize(8279, "No models available")),
|
|
393
|
+
run: () => {}
|
|
394
|
+
},
|
|
395
|
+
kind: ActionListItemKind.Action,
|
|
396
|
+
label: ( localize(8279, "No models available")),
|
|
397
|
+
description,
|
|
398
|
+
group: {
|
|
399
|
+
title: "",
|
|
400
|
+
icon: ThemeIcon.fromId(Codicon.blank.id)
|
|
401
|
+
},
|
|
402
|
+
disabled: true,
|
|
403
|
+
hideIcon: false,
|
|
404
|
+
hover: hover ? {
|
|
405
|
+
content: hover
|
|
406
|
+
} : undefined
|
|
407
|
+
});
|
|
408
|
+
return items;
|
|
409
|
+
} else {
|
|
410
|
+
items.push(createModelItem({
|
|
411
|
+
id: "auto",
|
|
412
|
+
enabled: true,
|
|
413
|
+
checked: true,
|
|
414
|
+
class: undefined,
|
|
415
|
+
tooltip: ( localize(8280, "Auto")),
|
|
416
|
+
label: ( localize(8280, "Auto")),
|
|
417
|
+
run: () => {}
|
|
418
|
+
}));
|
|
419
|
+
}
|
|
308
420
|
}
|
|
309
421
|
if (useGroupedModelPicker) {
|
|
310
422
|
let otherModels = [];
|
|
@@ -340,15 +452,7 @@ function buildModelPickerItems(
|
|
|
340
452
|
const {
|
|
341
453
|
action: autoAction,
|
|
342
454
|
ariaDescription: autoAriaDesc
|
|
343
|
-
} = createModelAction(
|
|
344
|
-
autoModel,
|
|
345
|
-
selectedModelId,
|
|
346
|
-
onSelect,
|
|
347
|
-
languageModelsService,
|
|
348
|
-
undefined,
|
|
349
|
-
undefined,
|
|
350
|
-
isUBB
|
|
351
|
-
);
|
|
455
|
+
} = createModelAction(autoModel, selectedModelId, onSelect);
|
|
352
456
|
items.push(
|
|
353
457
|
createModelItem(autoAction, autoModel, openerService, undefined, isUBB, autoAriaDesc)
|
|
354
458
|
);
|
|
@@ -374,22 +478,14 @@ function buildModelPickerItems(
|
|
|
374
478
|
if (pinnedModels.length > 0) {
|
|
375
479
|
items.push({
|
|
376
480
|
kind: ActionListItemKind.Separator,
|
|
377
|
-
label: ( localize(
|
|
481
|
+
label: ( localize(8281, "Pinned"))
|
|
378
482
|
});
|
|
379
483
|
for (const model of pinnedModels) {
|
|
380
484
|
const groupLabel = showGroupLabel ? getProviderGroupForModel(model, modelToGroup, languageModelsService).groupName : undefined;
|
|
381
485
|
const {
|
|
382
486
|
action: pinnedAction,
|
|
383
487
|
ariaDescription: pinnedAriaDesc
|
|
384
|
-
} = createModelAction(
|
|
385
|
-
model,
|
|
386
|
-
selectedModelId,
|
|
387
|
-
onSelect,
|
|
388
|
-
languageModelsService,
|
|
389
|
-
undefined,
|
|
390
|
-
showGroupLabel,
|
|
391
|
-
isUBB
|
|
392
|
-
);
|
|
488
|
+
} = createModelAction(model, selectedModelId, onSelect, undefined, showGroupLabel);
|
|
393
489
|
items.push(createModelItem(
|
|
394
490
|
pinnedAction,
|
|
395
491
|
model,
|
|
@@ -397,7 +493,8 @@ function buildModelPickerItems(
|
|
|
397
493
|
groupLabel,
|
|
398
494
|
isUBB,
|
|
399
495
|
pinnedAriaDesc,
|
|
400
|
-
makePinAction(model)
|
|
496
|
+
makePinAction(model),
|
|
497
|
+
onConfigure
|
|
401
498
|
));
|
|
402
499
|
}
|
|
403
500
|
}
|
|
@@ -506,15 +603,7 @@ function buildModelPickerItems(
|
|
|
506
603
|
const {
|
|
507
604
|
action: promotedAction,
|
|
508
605
|
ariaDescription: promotedAriaDesc
|
|
509
|
-
} = createModelAction(
|
|
510
|
-
item.model,
|
|
511
|
-
selectedModelId,
|
|
512
|
-
onSelect,
|
|
513
|
-
languageModelsService,
|
|
514
|
-
undefined,
|
|
515
|
-
showGroupLabel,
|
|
516
|
-
isUBB
|
|
517
|
-
);
|
|
606
|
+
} = createModelAction(item.model, selectedModelId, onSelect, undefined, showGroupLabel);
|
|
518
607
|
items.push(createModelItem(
|
|
519
608
|
promotedAction,
|
|
520
609
|
item.model,
|
|
@@ -522,7 +611,8 @@ function buildModelPickerItems(
|
|
|
522
611
|
groupLabel,
|
|
523
612
|
isUBB,
|
|
524
613
|
promotedAriaDesc,
|
|
525
|
-
makePinAction(item.model)
|
|
614
|
+
makePinAction(item.model),
|
|
615
|
+
onConfigure
|
|
526
616
|
));
|
|
527
617
|
} else {
|
|
528
618
|
items.push(createUnavailableModelItem(
|
|
@@ -555,12 +645,12 @@ function buildModelPickerItems(
|
|
|
555
645
|
enabled: true,
|
|
556
646
|
checked: false,
|
|
557
647
|
class: undefined,
|
|
558
|
-
tooltip: ( localize(
|
|
559
|
-
label: ( localize(
|
|
648
|
+
tooltip: ( localize(8282, "Other Models")),
|
|
649
|
+
label: ( localize(8282, "Other Models")),
|
|
560
650
|
run: () => {}
|
|
561
651
|
},
|
|
562
652
|
kind: ActionListItemKind.Action,
|
|
563
|
-
label: ( localize(
|
|
653
|
+
label: ( localize(8282, "Other Models")),
|
|
564
654
|
group: {
|
|
565
655
|
title: "",
|
|
566
656
|
icon: Codicon.chevronDown
|
|
@@ -634,10 +724,8 @@ function buildModelPickerItems(
|
|
|
634
724
|
model,
|
|
635
725
|
selectedModelId,
|
|
636
726
|
onSelect,
|
|
637
|
-
languageModelsService,
|
|
638
727
|
ModelPickerSection.Other,
|
|
639
|
-
showGroupHeaders
|
|
640
|
-
isUBB
|
|
728
|
+
showGroupHeaders
|
|
641
729
|
);
|
|
642
730
|
items.push(createModelItem(
|
|
643
731
|
bucketAction,
|
|
@@ -646,7 +734,8 @@ function buildModelPickerItems(
|
|
|
646
734
|
undefined,
|
|
647
735
|
isUBB,
|
|
648
736
|
bucketAriaDesc,
|
|
649
|
-
makePinAction(model)
|
|
737
|
+
makePinAction(model),
|
|
738
|
+
onConfigure
|
|
650
739
|
));
|
|
651
740
|
}
|
|
652
741
|
}
|
|
@@ -675,15 +764,7 @@ function buildModelPickerItems(
|
|
|
675
764
|
const {
|
|
676
765
|
action: flatAutoAction,
|
|
677
766
|
ariaDescription: flatAutoAriaDesc
|
|
678
|
-
} = createModelAction(
|
|
679
|
-
autoModel,
|
|
680
|
-
selectedModelId,
|
|
681
|
-
onSelect,
|
|
682
|
-
languageModelsService,
|
|
683
|
-
undefined,
|
|
684
|
-
undefined,
|
|
685
|
-
isUBB
|
|
686
|
-
);
|
|
767
|
+
} = createModelAction(autoModel, selectedModelId, onSelect);
|
|
687
768
|
items.push(createModelItem(
|
|
688
769
|
flatAutoAction,
|
|
689
770
|
autoModel,
|
|
@@ -701,18 +782,17 @@ function buildModelPickerItems(
|
|
|
701
782
|
const {
|
|
702
783
|
action: flatAction,
|
|
703
784
|
ariaDescription: flatAriaDesc
|
|
704
|
-
} = createModelAction(
|
|
785
|
+
} = createModelAction(model, selectedModelId, onSelect);
|
|
786
|
+
items.push(createModelItem(
|
|
787
|
+
flatAction,
|
|
705
788
|
model,
|
|
706
|
-
|
|
707
|
-
onSelect,
|
|
708
|
-
languageModelsService,
|
|
789
|
+
openerService,
|
|
709
790
|
undefined,
|
|
791
|
+
isUBB,
|
|
792
|
+
flatAriaDesc,
|
|
710
793
|
undefined,
|
|
711
|
-
|
|
712
|
-
);
|
|
713
|
-
items.push(
|
|
714
|
-
createModelItem(flatAction, model, openerService, undefined, isUBB, flatAriaDesc)
|
|
715
|
-
);
|
|
794
|
+
onConfigure
|
|
795
|
+
));
|
|
716
796
|
}
|
|
717
797
|
}
|
|
718
798
|
return items;
|
|
@@ -730,7 +810,10 @@ function getModelPickerAccessibilityProvider() {
|
|
|
730
810
|
if (element.isSectionToggle) {
|
|
731
811
|
return undefined;
|
|
732
812
|
}
|
|
733
|
-
|
|
813
|
+
if (element.kind === ActionListItemKind.Action && !(element.item?.id && ( PICKER_COMMAND_ACTION_IDS.has(element.item.id)))) {
|
|
814
|
+
return !!element?.item?.checked;
|
|
815
|
+
}
|
|
816
|
+
return undefined;
|
|
734
817
|
},
|
|
735
818
|
getRole: element => {
|
|
736
819
|
if (element.isSectionToggle) {
|
|
@@ -738,7 +821,7 @@ function getModelPickerAccessibilityProvider() {
|
|
|
738
821
|
}
|
|
739
822
|
switch (element.kind) {
|
|
740
823
|
case ActionListItemKind.Action:
|
|
741
|
-
return "menuitemradio";
|
|
824
|
+
return element.item?.id && ( PICKER_COMMAND_ACTION_IDS.has(element.item.id)) ? "menuitem" : "menuitemradio";
|
|
742
825
|
case ActionListItemKind.Separator:
|
|
743
826
|
return "separator";
|
|
744
827
|
default:
|
|
@@ -759,15 +842,15 @@ function createUnavailableModelItem(
|
|
|
759
842
|
) {
|
|
760
843
|
let description;
|
|
761
844
|
if (reason === "upgrade") {
|
|
762
|
-
description = ( new MarkdownString(( localize(
|
|
845
|
+
description = ( new MarkdownString(( localize(8277, "[Upgrade](command:workbench.action.chat.upgradePlan \" \")")), {
|
|
763
846
|
isTrusted: true
|
|
764
847
|
}));
|
|
765
848
|
} else if (reason === "update") {
|
|
766
|
-
description = ( localize(
|
|
849
|
+
description = ( localize(8283, "Update VS Code"));
|
|
767
850
|
} else {
|
|
768
|
-
description = manageSettingsUrl ? ( new MarkdownString(( localize(
|
|
851
|
+
description = manageSettingsUrl ? ( new MarkdownString(( localize(8284, "[Contact your admin]({0})", manageSettingsUrl)), {
|
|
769
852
|
isTrusted: true
|
|
770
|
-
})) : ( localize(
|
|
853
|
+
})) : ( localize(8285, "Contact your admin"));
|
|
771
854
|
}
|
|
772
855
|
let hoverContent;
|
|
773
856
|
if (reason === "upgrade") {
|
|
@@ -777,12 +860,12 @@ function createUnavailableModelItem(
|
|
|
777
860
|
}));
|
|
778
861
|
if (chatEntitlementService.entitlement === ChatEntitlement.Pro) {
|
|
779
862
|
hoverContent.appendMarkdown(( localize(
|
|
780
|
-
|
|
863
|
+
8286,
|
|
781
864
|
"[Upgrade to GitHub Copilot Pro+](command:workbench.action.chat.upgradePlan \" \") to use the best models."
|
|
782
865
|
)));
|
|
783
866
|
} else {
|
|
784
867
|
hoverContent.appendMarkdown(( localize(
|
|
785
|
-
|
|
868
|
+
8278,
|
|
786
869
|
"[Upgrade to GitHub Copilot Pro](command:workbench.action.chat.upgradePlan \" \") to use the best models."
|
|
787
870
|
)));
|
|
788
871
|
}
|
|
@@ -794,7 +877,7 @@ function createUnavailableModelItem(
|
|
|
794
877
|
supportThemeIcons: true
|
|
795
878
|
}));
|
|
796
879
|
hoverContent.appendMarkdown(( localize(
|
|
797
|
-
|
|
880
|
+
8287,
|
|
798
881
|
"This model is not available. Contact your administrator to enable it."
|
|
799
882
|
)));
|
|
800
883
|
}
|
|
@@ -846,7 +929,10 @@ let ModelPickerWidget = class ModelPickerWidget extends Disposable {
|
|
|
846
929
|
_entitlementService,
|
|
847
930
|
_updateService,
|
|
848
931
|
_uriIdentityService,
|
|
849
|
-
_defaultAccountService
|
|
932
|
+
_defaultAccountService,
|
|
933
|
+
_workspaceTrustManagementService,
|
|
934
|
+
_workspaceTrustRequestService,
|
|
935
|
+
_storageService
|
|
850
936
|
) {
|
|
851
937
|
super();
|
|
852
938
|
this._delegate = _delegate;
|
|
@@ -860,14 +946,50 @@ let ModelPickerWidget = class ModelPickerWidget extends Disposable {
|
|
|
860
946
|
this._updateService = _updateService;
|
|
861
947
|
this._uriIdentityService = _uriIdentityService;
|
|
862
948
|
this._defaultAccountService = _defaultAccountService;
|
|
949
|
+
this._workspaceTrustManagementService = _workspaceTrustManagementService;
|
|
950
|
+
this._workspaceTrustRequestService = _workspaceTrustRequestService;
|
|
951
|
+
this._storageService = _storageService;
|
|
863
952
|
this._onDidChangeSelection = this._register(( new Emitter()));
|
|
864
953
|
this.onDidChangeSelection = this._onDidChangeSelection.event;
|
|
954
|
+
this._workspaceTrustInitialized = false;
|
|
955
|
+
this._activatingAfterTrust = false;
|
|
956
|
+
this._activatingTimer = this._register(( new MutableDisposable()));
|
|
865
957
|
this._register(this._languageModelsService.onDidChangeLanguageModels(() => {
|
|
958
|
+
if (this._activatingAfterTrust && this._delegate.getModels().length > 0) {
|
|
959
|
+
this._clearActivating();
|
|
960
|
+
}
|
|
961
|
+
this._renderLabel();
|
|
962
|
+
}));
|
|
963
|
+
this._register(this._workspaceTrustManagementService.onDidChangeTrust(trusted => {
|
|
964
|
+
if (trusted && (this._delegate.showAutoModel?.() ?? false) && this._delegate.getModels().length === 0) {
|
|
965
|
+
this._activatingAfterTrust = true;
|
|
966
|
+
this._activatingTimer.value = disposableTimeout(() => {
|
|
967
|
+
this._activatingAfterTrust = false;
|
|
968
|
+
this._renderLabel();
|
|
969
|
+
}, 15000);
|
|
970
|
+
} else {
|
|
971
|
+
this._clearActivating();
|
|
972
|
+
}
|
|
866
973
|
this._renderLabel();
|
|
867
974
|
}));
|
|
975
|
+
this._workspaceTrustManagementService.workspaceTrustInitialized.then(() => {
|
|
976
|
+
if (this._store.isDisposed) {
|
|
977
|
+
return;
|
|
978
|
+
}
|
|
979
|
+
this._workspaceTrustInitialized = true;
|
|
980
|
+
this._renderLabel();
|
|
981
|
+
});
|
|
868
982
|
this._register(this._entitlementService.onDidChangeUsageBasedBilling(() => {
|
|
869
983
|
this._renderLabel();
|
|
870
984
|
}));
|
|
985
|
+
this._register(this._entitlementService.onDidChangeEntitlement(() => this._renderLabel()));
|
|
986
|
+
this._register(this._entitlementService.onDidChangeSentiment(() => this._renderLabel()));
|
|
987
|
+
this._register(this._entitlementService.onDidChangeAnonymous(() => this._renderLabel()));
|
|
988
|
+
if (this._delegate.modelConfiguration?.onDidChange) {
|
|
989
|
+
this._register(this._delegate.modelConfiguration.onDidChange(() => {
|
|
990
|
+
this._renderLabel();
|
|
991
|
+
}));
|
|
992
|
+
}
|
|
871
993
|
}
|
|
872
994
|
setCompact(compact) {
|
|
873
995
|
this._compact = compact;
|
|
@@ -893,9 +1015,48 @@ let ModelPickerWidget = class ModelPickerWidget extends Disposable {
|
|
|
893
1015
|
this._badge = badge;
|
|
894
1016
|
this._updateBadge();
|
|
895
1017
|
}
|
|
1018
|
+
_unavailableReason() {
|
|
1019
|
+
return getModelPickerUnavailableReason({
|
|
1020
|
+
trustInitialized: this._workspaceTrustInitialized,
|
|
1021
|
+
trusted: this._workspaceTrustManagementService.isWorkspaceTrusted(),
|
|
1022
|
+
pickerModels: this._delegate.getModels(),
|
|
1023
|
+
liveModelIds: this._languageModelsService.getLanguageModelIds(),
|
|
1024
|
+
requiresSetup: this._requiresSetup()
|
|
1025
|
+
});
|
|
1026
|
+
}
|
|
1027
|
+
_requiresSetup() {
|
|
1028
|
+
const sentiment = this._entitlementService.sentiment;
|
|
1029
|
+
return chatRequiresSetup({
|
|
1030
|
+
completed: !!sentiment.completed,
|
|
1031
|
+
disabled: !!sentiment.disabled,
|
|
1032
|
+
untrusted: false,
|
|
1033
|
+
entitlement: this._entitlementService.entitlement,
|
|
1034
|
+
anonymous: this._entitlementService.anonymous,
|
|
1035
|
+
hasByokModels: this._entitlementService.hasByokModels
|
|
1036
|
+
});
|
|
1037
|
+
}
|
|
1038
|
+
isRestrictedMode() {
|
|
1039
|
+
return this._unavailableReason() === ModelPickerUnavailableReason.Restricted;
|
|
1040
|
+
}
|
|
1041
|
+
isSetupRequired() {
|
|
1042
|
+
return this._unavailableReason() === ModelPickerUnavailableReason.SetupRequired;
|
|
1043
|
+
}
|
|
1044
|
+
_clearActivating() {
|
|
1045
|
+
this._activatingAfterTrust = false;
|
|
1046
|
+
this._activatingTimer.clear();
|
|
1047
|
+
}
|
|
1048
|
+
async _requestWorkspaceTrust() {
|
|
1049
|
+
await this._workspaceTrustRequestService.requestWorkspaceTrust({
|
|
1050
|
+
message: ( localize(8288, "Trusting this workspace enables AI models and chat features."))
|
|
1051
|
+
});
|
|
1052
|
+
}
|
|
1053
|
+
_requestSetup() {
|
|
1054
|
+
this._commandService.executeCommand(CHAT_SETUP_ACTION_ID);
|
|
1055
|
+
}
|
|
896
1056
|
render(container) {
|
|
897
1057
|
this._domNode = append(container, $("div.action-label.model-picker-split"));
|
|
898
1058
|
this._domNode.setAttribute("role", "group");
|
|
1059
|
+
this._domNode.tabIndex = -1;
|
|
899
1060
|
if (this._compact?.get()) {
|
|
900
1061
|
this._domNode.classList.toggle("compact", true);
|
|
901
1062
|
}
|
|
@@ -904,29 +1065,19 @@ let ModelPickerWidget = class ModelPickerWidget extends Disposable {
|
|
|
904
1065
|
this._nameButton.setAttribute("role", "button");
|
|
905
1066
|
this._nameButton.setAttribute("aria-haspopup", "true");
|
|
906
1067
|
this._nameButton.setAttribute("aria-expanded", "false");
|
|
907
|
-
this.
|
|
908
|
-
this.
|
|
909
|
-
this.
|
|
910
|
-
this.
|
|
911
|
-
this.
|
|
912
|
-
this.
|
|
913
|
-
this._tokensButton = append(this._domNode, $("a.model-picker-section.model-picker-tokens"));
|
|
914
|
-
this._tokensButton.tabIndex = 0;
|
|
915
|
-
this._tokensButton.setAttribute("role", "button");
|
|
916
|
-
this._tokensButton.setAttribute("aria-haspopup", "true");
|
|
917
|
-
this._tokensButton.setAttribute("aria-expanded", "false");
|
|
918
|
-
this._tokensButton.style.display = "none";
|
|
1068
|
+
this._configButton = append(this._domNode, $("a.model-picker-section.model-picker-config"));
|
|
1069
|
+
this._configButton.tabIndex = 0;
|
|
1070
|
+
this._configButton.setAttribute("role", "button");
|
|
1071
|
+
this._configButton.setAttribute("aria-haspopup", "true");
|
|
1072
|
+
this._configButton.setAttribute("aria-expanded", "false");
|
|
1073
|
+
this._configButton.style.display = "none";
|
|
919
1074
|
this._badgeIcon = $("span.model-picker-badge");
|
|
920
1075
|
this._updateBadge();
|
|
921
1076
|
this._renderLabel();
|
|
922
1077
|
this._registerButtonAction(this._nameButton, () => this.show());
|
|
923
|
-
this._registerButtonAction(this.
|
|
924
|
-
this._registerButtonAction(this._tokensButton, () => this._showTokensPicker());
|
|
1078
|
+
this._registerButtonAction(this._configButton, () => this._showConfigPicker());
|
|
925
1079
|
this._register(
|
|
926
|
-
getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate("mouse"), this.
|
|
927
|
-
);
|
|
928
|
-
this._register(
|
|
929
|
-
getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate("mouse"), this._tokensButton, ( localize(7714, "Set Context Size")))
|
|
1080
|
+
getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate("mouse"), this._configButton, ( localize(8289, "Configure Model")))
|
|
930
1081
|
);
|
|
931
1082
|
}
|
|
932
1083
|
_registerButtonAction(element, action) {
|
|
@@ -945,6 +1096,36 @@ let ModelPickerWidget = class ModelPickerWidget extends Disposable {
|
|
|
945
1096
|
}
|
|
946
1097
|
}));
|
|
947
1098
|
}
|
|
1099
|
+
getCacheBreakLearnMoreLink() {
|
|
1100
|
+
const url = this._productService.defaultChatAgent?.optimizeUsageDocumentationUrl;
|
|
1101
|
+
return url ? {
|
|
1102
|
+
label: ( localize(8290, "Learn more")),
|
|
1103
|
+
uri: ( URI.parse(url))
|
|
1104
|
+
} : undefined;
|
|
1105
|
+
}
|
|
1106
|
+
isCacheBreakHintDismissed() {
|
|
1107
|
+
return this._storageService.getBoolean(CACHE_BREAK_HINT_DISMISSED_STORAGE_KEY, StorageScope.APPLICATION, false);
|
|
1108
|
+
}
|
|
1109
|
+
dismissCacheBreakHint() {
|
|
1110
|
+
this._storageService.store(
|
|
1111
|
+
CACHE_BREAK_HINT_DISMISSED_STORAGE_KEY,
|
|
1112
|
+
true,
|
|
1113
|
+
StorageScope.APPLICATION,
|
|
1114
|
+
StorageTarget.USER
|
|
1115
|
+
);
|
|
1116
|
+
}
|
|
1117
|
+
shouldShowCacheBreakHint(excludeAutoModel) {
|
|
1118
|
+
if (this.isCacheBreakHintDismissed()) {
|
|
1119
|
+
return false;
|
|
1120
|
+
}
|
|
1121
|
+
if (!(this._delegate.isCacheWarm?.() ?? false)) {
|
|
1122
|
+
return false;
|
|
1123
|
+
}
|
|
1124
|
+
if (excludeAutoModel && !!this._selectedModel && isAutoModel(this._selectedModel)) {
|
|
1125
|
+
return false;
|
|
1126
|
+
}
|
|
1127
|
+
return true;
|
|
1128
|
+
}
|
|
948
1129
|
show(anchor) {
|
|
949
1130
|
const anchorElement = anchor ?? this._domNode;
|
|
950
1131
|
if (!anchorElement || this._domNode?.classList.contains("disabled")) {
|
|
@@ -954,14 +1135,19 @@ let ModelPickerWidget = class ModelPickerWidget extends Disposable {
|
|
|
954
1135
|
const onSelect = model => {
|
|
955
1136
|
this._telemetryService.publicLog2("chat.modelChange", {
|
|
956
1137
|
fromModel: previousModel?.metadata.vendor === "copilot" ? ( new TelemetryTrustedValue(previousModel.identifier)) : "unknown",
|
|
957
|
-
toModel: model.metadata.vendor === "copilot" ? ( new TelemetryTrustedValue(model.identifier)) : "unknown"
|
|
1138
|
+
toModel: model.metadata.vendor === "copilot" ? ( new TelemetryTrustedValue(model.identifier)) : "unknown",
|
|
1139
|
+
chatSessionId: this._delegate.getChatSessionId?.()
|
|
958
1140
|
});
|
|
959
1141
|
this._selectedModel = model;
|
|
960
1142
|
this._renderLabel();
|
|
961
1143
|
this._onDidChangeSelection.fire(model);
|
|
962
1144
|
};
|
|
1145
|
+
const onConfigure = (model, group) => {
|
|
1146
|
+
onSelect(model);
|
|
1147
|
+
this._actionWidgetService.hide();
|
|
1148
|
+
this._showConfigPicker(group);
|
|
1149
|
+
};
|
|
963
1150
|
const models = this._delegate.getModels();
|
|
964
|
-
const isUBB = !!this._entitlementService.quotas.usageBasedBilling;
|
|
965
1151
|
const isSignedOut = this._entitlementService.entitlement === ChatEntitlement.Unknown;
|
|
966
1152
|
const manifest = this._languageModelsService.getModelsControlManifest();
|
|
967
1153
|
const controlModelsForTier = isSignedOut ? {} : getControlModelsForEntitlement(manifest, this._entitlementService.entitlement);
|
|
@@ -994,13 +1180,23 @@ let ModelPickerWidget = class ModelPickerWidget extends Disposable {
|
|
|
994
1180
|
onTogglePin,
|
|
995
1181
|
manageSettingsUrl,
|
|
996
1182
|
this._delegate.useGroupedModelPicker(),
|
|
997
|
-
|
|
1183
|
+
manageModelsAction,
|
|
998
1184
|
this._entitlementService,
|
|
999
1185
|
this._delegate.showUnavailableFeatured(),
|
|
1000
1186
|
this._delegate.showFeatured(),
|
|
1001
1187
|
this._languageModelsService,
|
|
1002
1188
|
this._openerService,
|
|
1003
|
-
|
|
1189
|
+
this._delegate.showAutoModel?.() ?? false,
|
|
1190
|
+
onConfigure,
|
|
1191
|
+
this.isRestrictedMode(),
|
|
1192
|
+
() => {
|
|
1193
|
+
void this._requestWorkspaceTrust();
|
|
1194
|
+
},
|
|
1195
|
+
this.isSetupRequired(),
|
|
1196
|
+
() => {
|
|
1197
|
+
this._requestSetup();
|
|
1198
|
+
},
|
|
1199
|
+
!!this._entitlementService.quotas.usageBasedBilling
|
|
1004
1200
|
);
|
|
1005
1201
|
const hoverDisposables = ( new DisposableStore());
|
|
1006
1202
|
for (const item of items) {
|
|
@@ -1008,10 +1204,18 @@ let ModelPickerWidget = class ModelPickerWidget extends Disposable {
|
|
|
1008
1204
|
hoverDisposables.add(item.hover.disposable);
|
|
1009
1205
|
}
|
|
1010
1206
|
}
|
|
1207
|
+
const unavailable = this.isRestrictedMode() || this.isSetupRequired();
|
|
1208
|
+
const showCacheBreakHint = this.shouldShowCacheBreakHint( true);
|
|
1011
1209
|
const listOptions = {
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1210
|
+
headerText: showCacheBreakHint ? ( localize(
|
|
1211
|
+
8291,
|
|
1212
|
+
"Switching models mid-session resets the prompt cache and may increase cost."
|
|
1213
|
+
)) : undefined,
|
|
1214
|
+
headerIcon: showCacheBreakHint ? Codicon.info : undefined,
|
|
1215
|
+
headerLink: showCacheBreakHint ? this.getCacheBreakLearnMoreLink() : undefined,
|
|
1216
|
+
headerDismiss: showCacheBreakHint ? () => this.dismissCacheBreakHint() : undefined,
|
|
1217
|
+
showFilter: !unavailable,
|
|
1218
|
+
filterPlaceholder: ( localize(8292, "Search models")),
|
|
1015
1219
|
focusFilterOnOpen: true,
|
|
1016
1220
|
collapsedByDefault: ( new Set([ModelPickerSection.Other])),
|
|
1017
1221
|
onDidToggleSection: (section, collapsed) => {
|
|
@@ -1083,327 +1287,348 @@ let ModelPickerWidget = class ModelPickerWidget extends Disposable {
|
|
|
1083
1287
|
name,
|
|
1084
1288
|
statusIcon
|
|
1085
1289
|
} = this._selectedModel?.metadata || {};
|
|
1290
|
+
const restrictedMode = this.isRestrictedMode();
|
|
1291
|
+
const setupRequired = this.isSetupRequired();
|
|
1292
|
+
const unavailable = restrictedMode || setupRequired;
|
|
1293
|
+
const activating = !unavailable && this._activatingAfterTrust && this._delegate.getModels().length === 0;
|
|
1294
|
+
const genericNoModels = !unavailable && !activating && !(this._delegate.showAutoModel?.() ?? false) && this._delegate.getModels().length === 0;
|
|
1295
|
+
const noModelsAvailable = unavailable || activating || genericNoModels;
|
|
1086
1296
|
const nameChildren = [];
|
|
1087
|
-
if (statusIcon) {
|
|
1297
|
+
if (statusIcon && !noModelsAvailable) {
|
|
1088
1298
|
nameChildren.push(renderIcon(statusIcon));
|
|
1089
1299
|
}
|
|
1090
|
-
const modelLabel = name ?? ( localize(
|
|
1091
|
-
|
|
1092
|
-
const configDescription = !isUBB && this._selectedModel ? getModelConfigurationDescription(this._selectedModel, this._languageModelsService) : undefined;
|
|
1093
|
-
const fullLabel = configDescription ? `${modelLabel} · ${configDescription}` : modelLabel;
|
|
1094
|
-
nameChildren.push($("span.chat-input-picker-label", undefined, fullLabel));
|
|
1300
|
+
const modelLabel = unavailable ? ( localize(8293, "Models")) : activating ? ( localize(8294, "Activating...")) : genericNoModels ? ( localize(8279, "No models available")) : (name ?? ( localize(8280, "Auto")));
|
|
1301
|
+
nameChildren.push($("span.chat-input-picker-label", undefined, modelLabel));
|
|
1095
1302
|
if (this._badgeIcon) {
|
|
1096
1303
|
nameChildren.push(this._badgeIcon);
|
|
1097
1304
|
}
|
|
1098
1305
|
reset(this._nameButton, ...nameChildren);
|
|
1099
|
-
const effortConfig =
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1306
|
+
const effortConfig = this._getConfigProperty("navigation");
|
|
1307
|
+
const tokensConfig = this._getConfigProperty("tokens");
|
|
1308
|
+
if (this._configButton) {
|
|
1309
|
+
if (this._selectedModel && !noModelsAvailable && (effortConfig || tokensConfig)) {
|
|
1310
|
+
const labelParts = [];
|
|
1311
|
+
const ariaParts = [];
|
|
1312
|
+
if (effortConfig) {
|
|
1313
|
+
const enumIndex = effortConfig.schema.enum?.indexOf(effortConfig.value) ?? -1;
|
|
1314
|
+
const effortLabel = enumIndex >= 0 && effortConfig.schema.enumItemLabels?.[enumIndex] ? effortConfig.schema.enumItemLabels[enumIndex] : String(effortConfig.value);
|
|
1315
|
+
labelParts.push(effortLabel);
|
|
1316
|
+
ariaParts.push(( localize(8295, "Thinking Effort: {0}", effortLabel)));
|
|
1317
|
+
}
|
|
1318
|
+
if (tokensConfig) {
|
|
1319
|
+
const idx = tokensConfig.schema.enum?.indexOf(tokensConfig.value) ?? -1;
|
|
1320
|
+
const tokensLabel = idx >= 0 && tokensConfig.schema.enumItemLabels?.[idx] ? tokensConfig.schema.enumItemLabels[idx] : formatTokenCount(Number(tokensConfig.value));
|
|
1321
|
+
labelParts.push(tokensLabel);
|
|
1322
|
+
ariaParts.push(( localize(8296, "Context Size: {0}", tokensLabel)));
|
|
1323
|
+
}
|
|
1324
|
+
reset(
|
|
1325
|
+
this._configButton,
|
|
1326
|
+
$("span.chat-input-picker-label", undefined, labelParts.join(" "))
|
|
1327
|
+
);
|
|
1328
|
+
this._configButton.style.display = "";
|
|
1329
|
+
this._configButton.ariaLabel = ariaParts.join(", ");
|
|
1330
|
+
} else {
|
|
1331
|
+
this._configButton.style.display = "none";
|
|
1332
|
+
}
|
|
1124
1333
|
}
|
|
1125
|
-
this._domNode.ariaLabel = ( localize(
|
|
1334
|
+
this._domNode.ariaLabel = restrictedMode ? ( localize(8297, "Models, unavailable while in Restricted mode")) : setupRequired ? ( localize(8298, "Models, sign in to use Copilot")) : ( localize(8299, "Models, {0}", modelLabel));
|
|
1335
|
+
}
|
|
1336
|
+
get _modelConfiguration() {
|
|
1337
|
+
return this._delegate.modelConfiguration ?? this._languageModelsService;
|
|
1126
1338
|
}
|
|
1127
1339
|
_getConfigProperty(group) {
|
|
1128
1340
|
if (!this._selectedModel) {
|
|
1129
1341
|
return undefined;
|
|
1130
1342
|
}
|
|
1131
|
-
return resolveConfigProperty(this._selectedModel, group, this.
|
|
1343
|
+
return resolveConfigProperty(this._selectedModel, group, this._modelConfiguration);
|
|
1132
1344
|
}
|
|
1133
|
-
|
|
1134
|
-
if (this.
|
|
1135
|
-
return;
|
|
1136
|
-
}
|
|
1137
|
-
const config = this._getConfigProperty("navigation");
|
|
1138
|
-
if (!config || !this._effortButton || !this._selectedModel) {
|
|
1139
|
-
return;
|
|
1345
|
+
_buildConfigItems() {
|
|
1346
|
+
if (!this._selectedModel) {
|
|
1347
|
+
return [];
|
|
1140
1348
|
}
|
|
1141
1349
|
const modelIdentifier = this._selectedModel.identifier;
|
|
1142
|
-
const
|
|
1143
|
-
const
|
|
1144
|
-
const
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
const
|
|
1151
|
-
const
|
|
1152
|
-
|
|
1153
|
-
|
|
1350
|
+
const items = [];
|
|
1351
|
+
const defaultLabel = ( localize(8300, "Default"));
|
|
1352
|
+
const appendConfigSection = (group, headerLabel, formatValueLabel, logChange) => {
|
|
1353
|
+
const config = this._getConfigProperty(group);
|
|
1354
|
+
if (!config) {
|
|
1355
|
+
return;
|
|
1356
|
+
}
|
|
1357
|
+
const previousValue = String(config.value ?? "");
|
|
1358
|
+
const enumValues = config.schema.enum ?? [];
|
|
1359
|
+
const enumItemLabels = config.schema.enumItemLabels;
|
|
1360
|
+
if (items.length) {
|
|
1361
|
+
items.push({
|
|
1362
|
+
kind: ActionListItemKind.Separator
|
|
1363
|
+
});
|
|
1364
|
+
}
|
|
1154
1365
|
items.push({
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
enabled: true,
|
|
1158
|
-
checked: config.value === value,
|
|
1159
|
-
class: undefined,
|
|
1160
|
-
tooltip: config.schema.enumDescriptions?.[index] ?? "",
|
|
1161
|
-
label: displayLabel,
|
|
1162
|
-
run: () => {
|
|
1163
|
-
this._telemetryService.publicLog2("chat.thinkingEffortChange", {
|
|
1164
|
-
model: this._selectedModel?.metadata.vendor === "copilot" ? ( new TelemetryTrustedValue(modelIdentifier)) : "unknown",
|
|
1165
|
-
fromValue: previousEffortValue,
|
|
1166
|
-
toValue: String(value)
|
|
1167
|
-
});
|
|
1168
|
-
this._languageModelsService.setModelConfiguration(modelIdentifier, {
|
|
1169
|
-
[config.key]: value
|
|
1170
|
-
});
|
|
1171
|
-
}
|
|
1172
|
-
},
|
|
1173
|
-
kind: ActionListItemKind.Action,
|
|
1174
|
-
label: displayLabel,
|
|
1175
|
-
description: config.schema.enumDescriptions?.[index],
|
|
1176
|
-
group: {
|
|
1177
|
-
title: "",
|
|
1178
|
-
icon: ThemeIcon.fromId(config.value === value ? Codicon.check.id : Codicon.blank.id)
|
|
1179
|
-
},
|
|
1180
|
-
hideIcon: false
|
|
1366
|
+
kind: ActionListItemKind.Header,
|
|
1367
|
+
label: headerLabel
|
|
1181
1368
|
});
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
if (isHTMLElement(previouslyFocusedElement)) {
|
|
1192
|
-
previouslyFocusedElement.focus();
|
|
1369
|
+
for (let index = 0; index < enumValues.length; index++) {
|
|
1370
|
+
const value = enumValues[index];
|
|
1371
|
+
const isDefault = value === config.schema.default;
|
|
1372
|
+
const displayLabel = formatValueLabel(value, enumItemLabels?.[index]);
|
|
1373
|
+
const enumDescription = config.schema.enumDescriptions?.[index];
|
|
1374
|
+
const description = isDefault ? defaultLabel : undefined;
|
|
1375
|
+
const ariaDescriptionParts = [];
|
|
1376
|
+
if (isDefault) {
|
|
1377
|
+
ariaDescriptionParts.push(defaultLabel);
|
|
1193
1378
|
}
|
|
1379
|
+
if (enumDescription) {
|
|
1380
|
+
ariaDescriptionParts.push(enumDescription);
|
|
1381
|
+
}
|
|
1382
|
+
const ariaDescription = ariaDescriptionParts.length ? ariaDescriptionParts.join(", ") : undefined;
|
|
1383
|
+
const checked = config.value === value;
|
|
1384
|
+
items.push({
|
|
1385
|
+
item: {
|
|
1386
|
+
id: `${group}.${value}`,
|
|
1387
|
+
enabled: true,
|
|
1388
|
+
checked,
|
|
1389
|
+
class: undefined,
|
|
1390
|
+
tooltip: enumDescription ?? "",
|
|
1391
|
+
label: displayLabel,
|
|
1392
|
+
run: () => {
|
|
1393
|
+
logChange(value, previousValue);
|
|
1394
|
+
return this._modelConfiguration.setModelConfiguration(modelIdentifier, {
|
|
1395
|
+
[config.key]: value
|
|
1396
|
+
});
|
|
1397
|
+
}
|
|
1398
|
+
},
|
|
1399
|
+
kind: ActionListItemKind.Action,
|
|
1400
|
+
label: displayLabel,
|
|
1401
|
+
description,
|
|
1402
|
+
ariaDescription,
|
|
1403
|
+
hover: enumDescription ? {
|
|
1404
|
+
content: enumDescription
|
|
1405
|
+
} : undefined,
|
|
1406
|
+
group: {
|
|
1407
|
+
title: "",
|
|
1408
|
+
icon: ThemeIcon.fromId(checked ? Codicon.check.id : Codicon.blank.id)
|
|
1409
|
+
},
|
|
1410
|
+
hideIcon: false
|
|
1411
|
+
});
|
|
1194
1412
|
}
|
|
1195
1413
|
};
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
},
|
|
1212
|
-
{
|
|
1213
|
-
footerText: ( localize(7721, "Higher levels of thinking may increase costs"))
|
|
1214
|
-
}
|
|
1215
|
-
);
|
|
1414
|
+
appendConfigSection("navigation", ( localize(8301, "Thinking Effort")), (value, enumLabel) => enumLabel ?? String(value), (value, previousValue) => {
|
|
1415
|
+
this._telemetryService.publicLog2("chat.thinkingEffortChange", {
|
|
1416
|
+
model: this._selectedModel?.metadata.vendor === "copilot" ? ( new TelemetryTrustedValue(modelIdentifier)) : "unknown",
|
|
1417
|
+
fromValue: previousValue,
|
|
1418
|
+
toValue: String(value)
|
|
1419
|
+
});
|
|
1420
|
+
});
|
|
1421
|
+
appendConfigSection("tokens", ( localize(8302, "Context Size")), (value, enumLabel) => enumLabel ?? formatTokenCount(Number(value)), (value, previousValue) => {
|
|
1422
|
+
this._telemetryService.publicLog2("chat.contextSizeChange", {
|
|
1423
|
+
model: this._selectedModel?.metadata.vendor === "copilot" ? ( new TelemetryTrustedValue(modelIdentifier)) : "unknown",
|
|
1424
|
+
fromValue: previousValue,
|
|
1425
|
+
toValue: String(value)
|
|
1426
|
+
});
|
|
1427
|
+
});
|
|
1428
|
+
return items;
|
|
1216
1429
|
}
|
|
1217
|
-
|
|
1218
|
-
if (this._domNode?.classList.contains("disabled")) {
|
|
1430
|
+
_showConfigPicker(focusGroup) {
|
|
1431
|
+
if (this._domNode?.classList.contains("disabled") || !this._configButton || !this._selectedModel) {
|
|
1219
1432
|
return;
|
|
1220
1433
|
}
|
|
1221
|
-
const
|
|
1222
|
-
if (!
|
|
1434
|
+
const items = this._buildConfigItems();
|
|
1435
|
+
if (!items.length) {
|
|
1223
1436
|
return;
|
|
1224
1437
|
}
|
|
1225
|
-
const modelIdentifier = this._selectedModel.identifier;
|
|
1226
|
-
const previousTokensValue = String(config.value ?? "");
|
|
1227
|
-
const enumValues = config.schema.enum ?? [];
|
|
1228
|
-
const enumItemLabels = config.schema.enumItemLabels;
|
|
1229
|
-
const items = [{
|
|
1230
|
-
kind: ActionListItemKind.Header,
|
|
1231
|
-
label: ( localize(7722, "Context Size"))
|
|
1232
|
-
}];
|
|
1233
|
-
for (let index = 0; index < enumValues.length; index++) {
|
|
1234
|
-
const value = enumValues[index];
|
|
1235
|
-
const label = enumItemLabels?.[index] ?? formatTokenCount(Number(value));
|
|
1236
|
-
const displayLabel = label;
|
|
1237
|
-
const description = config.schema.enumDescriptions?.[index];
|
|
1238
|
-
items.push({
|
|
1239
|
-
item: {
|
|
1240
|
-
id: `tokens.${value}`,
|
|
1241
|
-
enabled: true,
|
|
1242
|
-
checked: config.value === value,
|
|
1243
|
-
class: undefined,
|
|
1244
|
-
tooltip: description ?? "",
|
|
1245
|
-
label: displayLabel,
|
|
1246
|
-
run: () => {
|
|
1247
|
-
this._telemetryService.publicLog2("chat.contextSizeChange", {
|
|
1248
|
-
model: this._selectedModel?.metadata.vendor === "copilot" ? ( new TelemetryTrustedValue(modelIdentifier)) : "unknown",
|
|
1249
|
-
fromValue: previousTokensValue,
|
|
1250
|
-
toValue: String(value)
|
|
1251
|
-
});
|
|
1252
|
-
this._languageModelsService.setModelConfiguration(modelIdentifier, {
|
|
1253
|
-
[config.key]: value
|
|
1254
|
-
});
|
|
1255
|
-
}
|
|
1256
|
-
},
|
|
1257
|
-
kind: ActionListItemKind.Action,
|
|
1258
|
-
label: displayLabel,
|
|
1259
|
-
description,
|
|
1260
|
-
group: {
|
|
1261
|
-
title: "",
|
|
1262
|
-
icon: ThemeIcon.fromId(config.value === value ? Codicon.check.id : Codicon.blank.id)
|
|
1263
|
-
},
|
|
1264
|
-
hideIcon: false
|
|
1265
|
-
});
|
|
1266
|
-
}
|
|
1267
1438
|
const previouslyFocusedElement = getActiveElement();
|
|
1268
1439
|
const delegate = {
|
|
1269
|
-
onSelect: action => {
|
|
1270
|
-
this._actionWidgetService.
|
|
1271
|
-
action.run();
|
|
1440
|
+
onSelect: async action => {
|
|
1441
|
+
this._actionWidgetService.focusItemById(action.id);
|
|
1442
|
+
await action.run();
|
|
1443
|
+
this._actionWidgetService.updateItems(this._buildConfigItems(), action.id);
|
|
1272
1444
|
},
|
|
1273
1445
|
onHide: () => {
|
|
1274
|
-
this.
|
|
1446
|
+
this._configButton?.setAttribute("aria-expanded", "false");
|
|
1275
1447
|
if (isHTMLElement(previouslyFocusedElement)) {
|
|
1276
1448
|
previouslyFocusedElement.focus();
|
|
1277
1449
|
}
|
|
1278
1450
|
}
|
|
1279
1451
|
};
|
|
1280
|
-
this.
|
|
1452
|
+
this._configButton.setAttribute("aria-expanded", "true");
|
|
1453
|
+
const showCacheBreakHint = this.shouldShowCacheBreakHint( false);
|
|
1281
1454
|
this._actionWidgetService.show(
|
|
1282
|
-
"
|
|
1455
|
+
"ChatModelConfigPicker",
|
|
1283
1456
|
false,
|
|
1284
1457
|
items,
|
|
1285
1458
|
delegate,
|
|
1286
|
-
this.
|
|
1459
|
+
this._configButton,
|
|
1287
1460
|
undefined,
|
|
1288
1461
|
[],
|
|
1289
1462
|
{
|
|
1290
1463
|
isChecked(element) {
|
|
1291
1464
|
return element.kind === ActionListItemKind.Action ? !!element?.item?.checked : undefined;
|
|
1292
1465
|
},
|
|
1293
|
-
getRole:
|
|
1466
|
+
getRole: element => element.kind === ActionListItemKind.Action ? "menuitemradio" : "separator",
|
|
1294
1467
|
getWidgetRole: () => "menu"
|
|
1295
1468
|
},
|
|
1296
1469
|
{
|
|
1297
|
-
|
|
1470
|
+
headerText: showCacheBreakHint ? ( localize(
|
|
1471
|
+
8303,
|
|
1472
|
+
"Changing these options mid-session resets the prompt cache and may increase cost."
|
|
1473
|
+
)) : undefined,
|
|
1474
|
+
headerIcon: showCacheBreakHint ? Codicon.info : undefined,
|
|
1475
|
+
headerLink: showCacheBreakHint ? this.getCacheBreakLearnMoreLink() : undefined,
|
|
1476
|
+
headerDismiss: showCacheBreakHint ? () => this.dismissCacheBreakHint() : undefined
|
|
1298
1477
|
}
|
|
1299
1478
|
);
|
|
1479
|
+
if (focusGroup) {
|
|
1480
|
+
const groupItem = items.find(
|
|
1481
|
+
item => item.kind === ActionListItemKind.Action && item.item?.id?.startsWith(`${focusGroup}.`)
|
|
1482
|
+
);
|
|
1483
|
+
if (groupItem?.kind === ActionListItemKind.Action && groupItem.item) {
|
|
1484
|
+
this._actionWidgetService.focusItemById(groupItem.item.id);
|
|
1485
|
+
}
|
|
1486
|
+
}
|
|
1300
1487
|
}
|
|
1301
1488
|
};
|
|
1302
|
-
ModelPickerWidget = ( __decorate([( __param(1, IActionWidgetService)), ( __param(2, ICommandService)), ( __param(3, IOpenerService)), ( __param(4, ITelemetryService)), ( __param(5, ILanguageModelsService)), ( __param(6, IProductService)), ( __param(7, IChatEntitlementService)), ( __param(8, IUpdateService)), ( __param(9, IUriIdentityService)), ( __param(10, IDefaultAccountService))], ModelPickerWidget));
|
|
1303
|
-
|
|
1489
|
+
ModelPickerWidget = ( __decorate([( __param(1, IActionWidgetService)), ( __param(2, ICommandService)), ( __param(3, IOpenerService)), ( __param(4, ITelemetryService)), ( __param(5, ILanguageModelsService)), ( __param(6, IProductService)), ( __param(7, IChatEntitlementService)), ( __param(8, IUpdateService)), ( __param(9, IUriIdentityService)), ( __param(10, IDefaultAccountService)), ( __param(11, IWorkspaceTrustManagementService)), ( __param(12, IWorkspaceTrustRequestService)), ( __param(13, IStorageService))], ModelPickerWidget));
|
|
1490
|
+
const SUPPORTED_CONFIG_GROUPS = ["navigation", "tokens"];
|
|
1491
|
+
function getModelHoverContent(model, isUBB, onConfigure, openerService) {
|
|
1304
1492
|
const isAuto = isAutoModel(model);
|
|
1305
1493
|
const container = $(".chat-model-hover");
|
|
1306
1494
|
const disposables = ( new DisposableStore());
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1495
|
+
const titleRow = $(".chat-model-hover-title-row");
|
|
1496
|
+
titleRow.appendChild($(".chat-model-hover-name", undefined, model.metadata.name));
|
|
1497
|
+
const tags = $(".chat-model-hover-title-tags");
|
|
1498
|
+
const categoryLabel = !isAuto ? getCategoryLabel(model.metadata.category) : undefined;
|
|
1499
|
+
if (categoryLabel) {
|
|
1500
|
+
tags.appendChild($("span.chat-model-hover-category", undefined, categoryLabel));
|
|
1501
|
+
}
|
|
1502
|
+
const priceCategoryLabel = !isAuto ? getPriceCategoryLabel(model.metadata.priceCategory) : undefined;
|
|
1503
|
+
const badgeLabel = isAuto ? model.metadata.detail : priceCategoryLabel;
|
|
1504
|
+
if (badgeLabel) {
|
|
1505
|
+
const badge = $("span.chat-model-hover-price-badge", undefined, badgeLabel);
|
|
1506
|
+
if (!isAuto && isHighCostCategory(model.metadata.priceCategory)) {
|
|
1507
|
+
badge.classList.add("high-cost");
|
|
1508
|
+
}
|
|
1509
|
+
tags.appendChild(badge);
|
|
1510
|
+
}
|
|
1511
|
+
if (tags.childElementCount > 0) {
|
|
1512
|
+
titleRow.appendChild(tags);
|
|
1513
|
+
}
|
|
1514
|
+
container.appendChild(titleRow);
|
|
1515
|
+
if (!isAuto && model.metadata.warningText) {
|
|
1516
|
+
const warningMessages = ( Object.values(model.metadata.warningText));
|
|
1517
|
+
for (const message of warningMessages) {
|
|
1518
|
+
const warningContainer = $(".chat-model-hover-warning-text");
|
|
1519
|
+
warningContainer.appendChild(renderIcon(Codicon.warning));
|
|
1520
|
+
const warningMd = ( new MarkdownString(message, {
|
|
1521
|
+
isTrusted: false,
|
|
1522
|
+
supportThemeIcons: true
|
|
1523
|
+
}));
|
|
1524
|
+
const rendered = disposables.add(renderMarkdown(warningMd, {
|
|
1525
|
+
actionHandler: link => {
|
|
1526
|
+
void openerService.open(link, {
|
|
1527
|
+
allowCommands: false,
|
|
1528
|
+
fromUserGesture: true
|
|
1529
|
+
});
|
|
1530
|
+
}
|
|
1531
|
+
}));
|
|
1532
|
+
warningContainer.appendChild(rendered.element);
|
|
1533
|
+
container.appendChild(warningContainer);
|
|
1317
1534
|
}
|
|
1318
|
-
md.appendMarkdown(model.metadata.tooltip);
|
|
1319
|
-
const rendered = renderMarkdown(md, {
|
|
1320
|
-
actionHandler: url => {
|
|
1321
|
-
openerService.open(( URI.parse(url)), {
|
|
1322
|
-
allowCommands: true
|
|
1323
|
-
});
|
|
1324
|
-
}
|
|
1325
|
-
});
|
|
1326
|
-
disposables.add(rendered);
|
|
1327
|
-
descriptionContainer.appendChild(rendered.element);
|
|
1328
|
-
container.appendChild(descriptionContainer);
|
|
1329
1535
|
}
|
|
1536
|
+
let costInfoRendered = false;
|
|
1537
|
+
let costTableRendered = false;
|
|
1330
1538
|
if (!isAuto && isUBB) {
|
|
1331
|
-
const
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1539
|
+
const metrics = [{
|
|
1540
|
+
label: ( localize(8304, "Input")),
|
|
1541
|
+
def: model.metadata.inputCost,
|
|
1542
|
+
long: model.metadata.longContextInputCost
|
|
1543
|
+
}, {
|
|
1544
|
+
label: ( localize(8305, "Output")),
|
|
1545
|
+
def: model.metadata.outputCost,
|
|
1546
|
+
long: model.metadata.longContextOutputCost
|
|
1547
|
+
}, {
|
|
1548
|
+
label: ( localize(8306, "Cache Read")),
|
|
1549
|
+
def: model.metadata.cacheCost,
|
|
1550
|
+
long: model.metadata.longContextCacheCost
|
|
1551
|
+
}, {
|
|
1552
|
+
label: ( localize(8307, "Cache Write")),
|
|
1553
|
+
def: model.metadata.cacheWriteCost,
|
|
1554
|
+
long: model.metadata.longContextCacheWriteCost
|
|
1555
|
+
}].filter(m => m.def !== undefined || m.long !== undefined);
|
|
1556
|
+
if (metrics.length > 0) {
|
|
1557
|
+
const hasLongContext = ( metrics.some(m => m.long !== undefined));
|
|
1558
|
+
const table = $(".chat-model-hover-cost-table");
|
|
1559
|
+
if (hasLongContext) {
|
|
1560
|
+
container.classList.add("has-long-context");
|
|
1561
|
+
table.classList.add("has-long-context");
|
|
1353
1562
|
}
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
titleRow.appendChild($("span.chat-model-hover-cost-tag", undefined, categoryLabel));
|
|
1362
|
-
}
|
|
1363
|
-
section.appendChild(titleRow);
|
|
1364
|
-
for (const line of lines) {
|
|
1365
|
-
section.appendChild($(
|
|
1366
|
-
".chat-model-hover-cost-line",
|
|
1563
|
+
const appendValueCell = (row, cost) => {
|
|
1564
|
+
if (cost === undefined) {
|
|
1565
|
+
row.appendChild($("span.chat-model-hover-cost-value.empty"));
|
|
1566
|
+
return;
|
|
1567
|
+
}
|
|
1568
|
+
row.appendChild($("span.chat-model-hover-cost-value", undefined, $(
|
|
1569
|
+
"span.chat-model-hover-cost-number",
|
|
1367
1570
|
undefined,
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1571
|
+
typeof cost === "number" ? String(cost) : ( localize(8308, "Unknown"))
|
|
1572
|
+
)));
|
|
1573
|
+
};
|
|
1574
|
+
const headerRow = $(".chat-model-hover-cost-row.header");
|
|
1575
|
+
headerRow.appendChild($("span.chat-model-hover-cost-heading", undefined, ( localize(8309, "Credits Per 1M Tokens"))));
|
|
1576
|
+
if (hasLongContext) {
|
|
1577
|
+
headerRow.appendChild(
|
|
1578
|
+
$("span.chat-model-hover-cost-value.subheader", undefined, ( localize(8310, "Default")))
|
|
1579
|
+
);
|
|
1580
|
+
headerRow.appendChild(
|
|
1581
|
+
$("span.chat-model-hover-cost-value.subheader", undefined, ( localize(8311, "Long Context")))
|
|
1582
|
+
);
|
|
1583
|
+
} else {
|
|
1584
|
+
headerRow.appendChild($("span.chat-model-hover-cost-value.subheader"));
|
|
1371
1585
|
}
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
model.metadata.longContextInputCost,
|
|
1384
|
-
model.metadata.longContextCacheCost,
|
|
1385
|
-
model.metadata.longContextOutputCost
|
|
1386
|
-
);
|
|
1387
|
-
if (longContextCostLines.length > 0) {
|
|
1388
|
-
appendCostSection(container, ( localize(7730, "Long context cost (per 1M tokens)")), longContextCostLines);
|
|
1586
|
+
table.appendChild(headerRow);
|
|
1587
|
+
for (const metric of metrics) {
|
|
1588
|
+
const row = $(".chat-model-hover-cost-row");
|
|
1589
|
+
const labelCell = $(".chat-model-hover-cost-label");
|
|
1590
|
+
labelCell.appendChild($("span.chat-model-hover-cost-label-text", undefined, metric.label));
|
|
1591
|
+
row.appendChild(labelCell);
|
|
1592
|
+
appendValueCell(row, metric.def);
|
|
1593
|
+
if (hasLongContext) {
|
|
1594
|
+
appendValueCell(row, metric.long);
|
|
1595
|
+
}
|
|
1596
|
+
table.appendChild(row);
|
|
1389
1597
|
}
|
|
1390
|
-
|
|
1598
|
+
container.appendChild(table);
|
|
1599
|
+
costTableRendered = true;
|
|
1600
|
+
costInfoRendered = true;
|
|
1601
|
+
} else if (model.metadata.pricing && (isMultiplierPricing(model) || !priceCategoryLabel)) {
|
|
1391
1602
|
const costSection = $(".chat-model-hover-cost");
|
|
1392
|
-
|
|
1393
|
-
titleRow.appendChild($(".chat-model-hover-cost-title", undefined, ( localize(7731, "Cost"))));
|
|
1394
|
-
titleRow.appendChild($("span.chat-model-hover-cost-tag", undefined, priceCategoryLabel));
|
|
1395
|
-
costSection.appendChild(titleRow);
|
|
1396
|
-
container.appendChild(costSection);
|
|
1397
|
-
} else if (model.metadata.pricing && !isMultiplierPricing(model)) {
|
|
1398
|
-
const costSection = $(".chat-model-hover-cost");
|
|
1399
|
-
costSection.appendChild($("span", undefined, ( localize(7732, "Cost: {0}", model.metadata.pricing))));
|
|
1603
|
+
costSection.appendChild($("span", undefined, ( localize(8312, "Cost: {0}", model.metadata.pricing))));
|
|
1400
1604
|
container.appendChild(costSection);
|
|
1605
|
+
costInfoRendered = true;
|
|
1401
1606
|
}
|
|
1607
|
+
} else if (!isAuto && model.metadata.pricing) {
|
|
1608
|
+
const costSection = $(".chat-model-hover-cost");
|
|
1609
|
+
costSection.appendChild($("span", undefined, ( localize(8312, "Cost: {0}", model.metadata.pricing))));
|
|
1610
|
+
container.appendChild(costSection);
|
|
1611
|
+
costInfoRendered = true;
|
|
1402
1612
|
}
|
|
1403
|
-
if (!
|
|
1613
|
+
if (!costInfoRendered && model.metadata.tooltip) {
|
|
1614
|
+
const descriptionMd = ( new MarkdownString(model.metadata.tooltip, {
|
|
1615
|
+
supportThemeIcons: true
|
|
1616
|
+
}));
|
|
1617
|
+
const rendered = disposables.add(renderMarkdown(descriptionMd, {
|
|
1618
|
+
actionHandler: link => {
|
|
1619
|
+
void openerService.open(link, {
|
|
1620
|
+
allowCommands: false,
|
|
1621
|
+
fromUserGesture: true
|
|
1622
|
+
});
|
|
1623
|
+
}
|
|
1624
|
+
}));
|
|
1625
|
+
rendered.element.classList.add("chat-model-hover-description");
|
|
1626
|
+
container.appendChild(rendered.element);
|
|
1627
|
+
}
|
|
1628
|
+
if (!isAuto && !costTableRendered && (model.metadata.maxInputTokens || model.metadata.maxOutputTokens)) {
|
|
1404
1629
|
const totalTokens = (model.metadata.maxInputTokens ?? 0) + (model.metadata.maxOutputTokens ?? 0);
|
|
1405
1630
|
const contextSection = $(".chat-model-hover-context");
|
|
1406
|
-
contextSection.appendChild($(".chat-model-hover-context-label", undefined, ( localize(
|
|
1631
|
+
contextSection.appendChild($(".chat-model-hover-context-label", undefined, ( localize(8313, "Max context"))));
|
|
1407
1632
|
contextSection.appendChild($(
|
|
1408
1633
|
".chat-model-hover-context-value",
|
|
1409
1634
|
undefined,
|
|
@@ -1411,25 +1636,40 @@ function getModelHoverContent(model, openerService, isUBB) {
|
|
|
1411
1636
|
));
|
|
1412
1637
|
container.appendChild(contextSection);
|
|
1413
1638
|
}
|
|
1414
|
-
if (!isAuto &&
|
|
1415
|
-
const
|
|
1639
|
+
if (!isAuto && model.metadata.configurationSchema?.properties) {
|
|
1640
|
+
const configButtons = [];
|
|
1641
|
+
const seenGroups = ( new Set());
|
|
1416
1642
|
for (const [, propSchema] of Object.entries(model.metadata.configurationSchema.properties)) {
|
|
1417
|
-
if (propSchema.enum && propSchema.enum.length >= 2) {
|
|
1643
|
+
if (propSchema.enum && propSchema.enum.length >= 2 && propSchema.group && SUPPORTED_CONFIG_GROUPS.includes(propSchema.group) && !( seenGroups.has(propSchema.group))) {
|
|
1418
1644
|
const label = propSchema.title ?? propSchema.description;
|
|
1419
1645
|
if (label) {
|
|
1420
|
-
|
|
1646
|
+
seenGroups.add(propSchema.group);
|
|
1647
|
+
configButtons.push({
|
|
1648
|
+
group: propSchema.group,
|
|
1649
|
+
label
|
|
1650
|
+
});
|
|
1421
1651
|
}
|
|
1422
1652
|
}
|
|
1423
1653
|
}
|
|
1424
|
-
if (
|
|
1425
|
-
container.appendChild($(".chat-model-hover-separator"));
|
|
1654
|
+
if (configButtons.length > 0) {
|
|
1426
1655
|
const configRow = $(".chat-model-hover-configurable");
|
|
1427
1656
|
configRow.appendChild(
|
|
1428
|
-
$("span.chat-model-hover-configurable-label", undefined, ( localize(
|
|
1657
|
+
$("span.chat-model-hover-configurable-label", undefined, ( localize(8314, "Configurable")))
|
|
1429
1658
|
);
|
|
1430
|
-
|
|
1431
|
-
|
|
1659
|
+
const buttonsContainer = $(".chat-model-hover-configurable-buttons");
|
|
1660
|
+
for (const {
|
|
1661
|
+
group,
|
|
1662
|
+
label
|
|
1663
|
+
} of configButtons) {
|
|
1664
|
+
const button = disposables.add(( new Button(buttonsContainer, {
|
|
1665
|
+
...defaultButtonStyles,
|
|
1666
|
+
secondary: true,
|
|
1667
|
+
title: label
|
|
1668
|
+
})));
|
|
1669
|
+
button.label = label;
|
|
1670
|
+
disposables.add(button.onDidClick(() => onConfigure?.(group)));
|
|
1432
1671
|
}
|
|
1672
|
+
configRow.appendChild(buttonsContainer);
|
|
1433
1673
|
container.appendChild(configRow);
|
|
1434
1674
|
}
|
|
1435
1675
|
}
|
|
@@ -1438,20 +1678,8 @@ function getModelHoverContent(model, openerService, isUBB) {
|
|
|
1438
1678
|
disposable: disposables
|
|
1439
1679
|
} : undefined;
|
|
1440
1680
|
}
|
|
1441
|
-
function formatTokenCount(count) {
|
|
1442
|
-
if (count >= 1_000_000) {
|
|
1443
|
-
const value = count / 1_000_000;
|
|
1444
|
-
const floored = Math.floor(value * 10) / 10;
|
|
1445
|
-
return floored % 1 === 0 ? `${floored.toFixed(0)}M` : `${floored.toFixed(1)}M`;
|
|
1446
|
-
} else if (count > 900_000) {
|
|
1447
|
-
return "1M";
|
|
1448
|
-
} else if (count >= 1000) {
|
|
1449
|
-
return `${Math.round(count / 1000)}K`;
|
|
1450
|
-
}
|
|
1451
|
-
return ( count.toString());
|
|
1452
|
-
}
|
|
1453
1681
|
function isAutoModel(model) {
|
|
1454
|
-
return model.metadata.id === "auto"
|
|
1682
|
+
return model.metadata.id === "auto";
|
|
1455
1683
|
}
|
|
1456
1684
|
|
|
1457
|
-
export { ModelPickerWidget, buildModelPickerItems,
|
|
1685
|
+
export { ModelPickerWidget, buildModelPickerItems, getControlModelsForEntitlement, getModelHoverContent, getModelPickerAccessibilityProvider };
|