@codingame/monaco-vscode-katex-common 34.1.3 → 35.0.1

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.
Files changed (244) hide show
  1. package/package.json +2 -2
  2. package/vscode/src/vs/base/browser/animationSync.d.ts +36 -0
  3. package/vscode/src/vs/base/browser/animationSync.js +23 -0
  4. package/vscode/src/vs/base/browser/ui/pixelSpinner/pixelSpinner.js +23 -2
  5. package/vscode/src/vs/platform/actions/browser/buttonbar.js +3 -2
  6. package/vscode/src/vs/platform/agentHost/common/claudeSessionConfigKeys.d.ts +5 -5
  7. package/vscode/src/vs/platform/agentHost/common/fileEditDiff.d.ts +32 -0
  8. package/vscode/src/vs/platform/agentHost/common/fileEditDiff.js +33 -0
  9. package/vscode/src/vs/platform/agentHost/common/meta/agentFeedbackAnnotations.d.ts +90 -0
  10. package/vscode/src/vs/platform/agentHost/common/meta/agentFeedbackAttachments.d.ts +30 -0
  11. package/vscode/src/vs/platform/agentHost/common/meta/agentToolCallMeta.d.ts +65 -0
  12. package/vscode/src/vs/platform/agentHost/common/sessionConfigKeys.d.ts +16 -5
  13. package/vscode/src/vs/platform/agentHost/common/sessionConfigKeys.js +3 -2
  14. package/vscode/src/vs/platform/agentHost/common/state/protocol/channels-resource-watch/reducer.d.ts +21 -0
  15. package/vscode/src/vs/platform/agentHost/common/state/protocol/reducers.d.ts +8 -0
  16. package/vscode/src/vs/platform/agentHost/common/state/sessionReducers.d.ts +9 -0
  17. package/vscode/src/vs/platform/mcp/common/modelContextProtocolApps.d.ts +2 -2
  18. package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatAccessibilityProvider.js +16 -16
  19. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContinueInAction.d.ts +29 -0
  20. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContinueInAction.js +105 -28
  21. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatElicitationActions.js +1 -1
  22. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.d.ts +15 -1
  23. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatExecuteActions.js +74 -44
  24. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatTitleActions.js +10 -10
  25. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolActions.js +11 -11
  26. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolPicker.d.ts +2 -2
  27. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolPicker.js +98 -24
  28. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostChatInputPicker.contribution.d.ts +8 -0
  29. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostChatInputPicker.contribution.js +31 -4
  30. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostChatInputPicker.d.ts +45 -4
  31. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostChatInputPicker.js +163 -37
  32. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostFolderPickerActionItem.d.ts +47 -0
  33. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostFolderPickerActionItem.js +172 -0
  34. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostGenericConfigChips.d.ts +3 -1
  35. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostGenericConfigChips.js +7 -4
  36. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSessionReferenceAttachment.d.ts +12 -0
  37. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSnapshotController.d.ts +116 -0
  38. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSnapshotController.js +348 -0
  39. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/media/agentHostChatInputPicker.css +1 -1
  40. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/stateToProgressAdapter.d.ts +211 -0
  41. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/stateToProgressAdapter.js +64 -0
  42. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionApprovalModel.d.ts +18 -0
  43. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionApprovalModel.js +13 -2
  44. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionHoverWidget.d.ts +1 -1
  45. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionHoverWidget.js +30 -18
  46. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.d.ts +4 -1
  47. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsControl.js +29 -4
  48. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsFilter.js +9 -9
  49. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsOpener.js +1 -1
  50. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.d.ts +24 -1
  51. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.js +119 -41
  52. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/media/agentsessionsviewer.css +27 -0
  53. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/sessionTypeAvailability.d.ts +63 -0
  54. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/sessionTypeAvailability.js +97 -0
  55. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentWidgets.d.ts +5 -6
  56. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentWidgets.js +105 -88
  57. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/implicitContextAttachment.js +13 -13
  58. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.d.ts +1 -0
  59. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingActions.js +46 -48
  60. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingTextModelContentProviders.d.ts +28 -0
  61. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingTextModelContentProviders.js +98 -0
  62. package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/chatSessionPickerActionItem.d.ts +3 -3
  63. package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/chatSessionPickerActionItem.js +9 -7
  64. package/vscode/src/vs/workbench/contrib/chat/browser/media/chatTurnPills.css +162 -0
  65. package/vscode/src/vs/workbench/contrib/chat/browser/tools/chatToolRiskAssessmentService.d.ts +9 -2
  66. package/vscode/src/vs/workbench/contrib/chat/browser/tools/chatToolRiskAssessmentService.js +95 -24
  67. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolSetsContribution.d.ts +22 -1
  68. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolSetsContribution.js +151 -20
  69. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatAgentHover.js +2 -2
  70. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatArtifactsWidget.js +10 -10
  71. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentMarkdownRenderer.js +20 -2
  72. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAgentCommandContentPart.js +1 -1
  73. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAnonymousRateLimitedPart.js +2 -2
  74. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAttachmentsContentPart.d.ts +5 -0
  75. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAttachmentsContentPart.js +61 -17
  76. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAutoModeResolutionContentPart.d.ts +20 -0
  77. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatAutoModeResolutionContentPart.js +55 -0
  78. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatChangesSummaryPart.d.ts +6 -2
  79. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatChangesSummaryPart.js +81 -30
  80. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatCodeCitationContentPart.js +1 -1
  81. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatCommandContentPart.js +1 -1
  82. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatConfirmationContentPart.js +2 -2
  83. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatConfirmationWidget.js +2 -2
  84. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatDisabledClaudeHooksContentPart.js +3 -3
  85. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatEditPillElement.d.ts +11 -0
  86. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatEditPillElement.js +13 -1
  87. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatElicitationContentPart.js +9 -33
  88. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatExtensionsContentPart.js +1 -1
  89. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatExternalEditContentPart.d.ts +6 -2
  90. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatExternalEditContentPart.js +21 -11
  91. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatHookContentPart.js +1 -1
  92. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatInlineAnchorWidget.js +13 -13
  93. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownContentPart.d.ts +6 -2
  94. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMarkdownContentPart.js +40 -19
  95. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpAuthenticationContentPart.d.ts +35 -0
  96. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpAuthenticationContentPart.js +140 -0
  97. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpServersInteractionContentPart.js +8 -8
  98. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpServersStartingContentPart.d.ts +24 -0
  99. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMcpServersStartingContentPart.js +58 -0
  100. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMultiDiffContentPart.d.ts +3 -1
  101. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatMultiDiffContentPart.js +29 -8
  102. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatPlanReviewPart.js +30 -30
  103. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatProgressContentPart.js +1 -1
  104. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.js +44 -44
  105. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuotaExceededPart.d.ts +1 -2
  106. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuotaExceededPart.js +12 -66
  107. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatReferencesContentPart.js +6 -6
  108. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatResourceGroupWidget.js +5 -5
  109. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSubagentContentPart.d.ts +39 -0
  110. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSubagentContentPart.js +167 -43
  111. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSuggestNextWidget.d.ts +1 -15
  112. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSuggestNextWidget.js +9 -86
  113. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSystemNotificationContentPart.d.ts +12 -0
  114. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatSystemNotificationContentPart.js +23 -0
  115. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTextEditContentPart.js +1 -1
  116. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.d.ts +9 -1
  117. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatThinkingContentPart.js +141 -72
  118. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTipContentPart.js +9 -9
  119. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTodoListWidget.js +17 -17
  120. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatToolInputOutputContentPart.d.ts +2 -0
  121. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatToolInputOutputContentPart.js +17 -3
  122. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTreeContentPart.js +1 -1
  123. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTurnPillsPart.d.ts +29 -0
  124. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatTurnPillsPart.js +110 -0
  125. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatWorkspaceEditContentPart.js +3 -3
  126. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/codeBlockPart.js +14 -14
  127. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatAgentFeedbackReviewConfirmation.css +133 -0
  128. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatAutoModeResolution.css +30 -0
  129. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatCodeBlockPill.css +4 -0
  130. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatConfirmationWidget.css +18 -8
  131. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatPlanReview.css +23 -7
  132. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatQuestionCarousel.css +33 -18
  133. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatSubagentContent.css +23 -0
  134. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatTerminalToolProgressPart.css +44 -0
  135. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatThinkingContent.css +2 -0
  136. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatToolConfirmationCarousel.css +1 -1
  137. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/abstractToolConfirmationSubPart.d.ts +9 -1
  138. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/abstractToolConfirmationSubPart.js +21 -4
  139. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatAgentFeedbackReviewConfirmationSubPart.d.ts +48 -0
  140. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatAgentFeedbackReviewConfirmationSubPart.js +279 -0
  141. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatExtensionsInstallToolSubPart.js +4 -4
  142. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppModel.d.ts +43 -1
  143. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppModel.js +53 -15
  144. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppSubPart.d.ts +7 -9
  145. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatMcpAppSubPart.js +3 -3
  146. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatModifiedFilesConfirmationSubPart.d.ts +4 -1
  147. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatModifiedFilesConfirmationSubPart.js +24 -10
  148. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/{chatMissingSandboxDepsConfirmationSubPart.d.ts → chatSandboxPrerequisiteConfirmationSubPart.d.ts} +3 -2
  149. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/{chatMissingSandboxDepsConfirmationSubPart.js → chatSandboxPrerequisiteConfirmationSubPart.js} +14 -10
  150. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.d.ts +0 -1
  151. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolConfirmationSubPart.js +30 -59
  152. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.d.ts +2 -1
  153. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatTerminalToolProgressPart.js +41 -29
  154. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationCarouselPart.js +8 -8
  155. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationSubPart.d.ts +2 -1
  156. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolConfirmationSubPart.js +12 -9
  157. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolInvocationPart.d.ts +1 -1
  158. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolInvocationPart.js +43 -35
  159. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolOutputPart.js +2 -2
  160. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolPartUtilities.js +5 -5
  161. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolPostExecuteConfirmationPart.d.ts +2 -1
  162. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/chatToolPostExecuteConfirmationPart.js +11 -8
  163. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/toolRiskBadgeHelper.d.ts +18 -0
  164. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/toolRiskBadgeHelper.js +51 -0
  165. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/toolInvocationParts/toolRiskBadgeWidget.js +4 -4
  166. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatDragAndDrop.js +11 -11
  167. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.d.ts +18 -3
  168. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListRenderer.js +266 -98
  169. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListWidget.d.ts +1 -0
  170. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatListWidget.js +8 -3
  171. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatRestoreCheckpointActionViewItem.d.ts +32 -0
  172. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatRestoreCheckpointActionViewItem.js +135 -0
  173. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatTurnPills.d.ts +85 -0
  174. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatTurnPills.js +275 -0
  175. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidget.d.ts +18 -1
  176. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidget.js +84 -37
  177. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatFollowups.js +1 -1
  178. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatGoalBannerWidget.js +4 -4
  179. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputNotificationService.d.ts +14 -0
  180. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputNotificationWidget.d.ts +6 -1
  181. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputNotificationWidget.js +52 -4
  182. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.d.ts +187 -13
  183. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.js +435 -139
  184. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputStatePersistence.d.ts +6 -0
  185. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputStatePersistence.js +21 -0
  186. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelConfigurationLogic.d.ts +50 -0
  187. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelConfigurationLogic.js +49 -0
  188. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelConfigurationStore.d.ts +79 -0
  189. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelConfigurationStore.js +127 -0
  190. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelPicker.d.ts +84 -8
  191. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelPicker.js +658 -430
  192. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelSelectionLogic.d.ts +72 -8
  193. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatModelSelectionLogic.js +82 -7
  194. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatPhoneInputPresenter.js +2 -2
  195. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatSelectedTools.d.ts +3 -3
  196. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatSelectedTools.js +6 -3
  197. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/delegationSessionPickerActionItem.d.ts +2 -1
  198. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/delegationSessionPickerActionItem.js +23 -9
  199. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/media/chatGoalBannerWidget.css +2 -2
  200. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/media/chatInputNotificationWidget.css +28 -12
  201. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modePickerActionItem.d.ts +3 -0
  202. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modePickerActionItem.js +15 -14
  203. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modelPickerActionItem.d.ts +60 -0
  204. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/modelPickerActionItem.js +18 -7
  205. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/permissionPickerActionItem.d.ts +49 -1
  206. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/permissionPickerActionItem.js +141 -81
  207. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/sessionTargetPickerActionItem.d.ts +7 -15
  208. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/sessionTargetPickerActionItem.js +30 -47
  209. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/workspacePickerActionItem.js +3 -3
  210. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/workspacePickerInputActionItem.d.ts +20 -0
  211. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/workspacePickerInputActionItem.js +18 -0
  212. package/vscode/src/vs/workbench/contrib/chat/browser/widget/media/chat.css +469 -148
  213. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageDetails.d.ts +11 -2
  214. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageDetails.js +79 -28
  215. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageWidget.d.ts +71 -2
  216. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatContextUsageWidget.js +107 -45
  217. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/media/chatContextUsageDetails.css +20 -0
  218. package/vscode/src/vs/workbench/contrib/chat/common/chatErrorMessages.d.ts +110 -0
  219. package/vscode/src/vs/workbench/contrib/chat/common/chatErrorMessages.js +37 -0
  220. package/vscode/src/vs/workbench/contrib/chat/common/chatImageExtraction.d.ts +4 -1
  221. package/vscode/src/vs/workbench/contrib/chat/common/chatImageExtraction.js +13 -11
  222. package/vscode/src/vs/workbench/contrib/chat/common/chatPermissionWarnings.d.ts +8 -1
  223. package/vscode/src/vs/workbench/contrib/chat/common/chatPermissionWarnings.js +57 -21
  224. package/vscode/src/vs/workbench/contrib/chat/common/widget/chatColors.js +18 -18
  225. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatController.js +4 -4
  226. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatWidget.js +5 -5
  227. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatZoneWidget.js +1 -1
  228. package/vscode/src/vs/workbench/contrib/inlineChat/common/inlineChat.js +30 -30
  229. package/vscode/src/vs/workbench/contrib/interactive/browser/replInputHintContentWidget.js +3 -3
  230. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpToolCallUI.d.ts +39 -8
  231. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpToolCallUI.js +168 -72
  232. package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/cellStatusBar/executionStatusBarItemController.js +7 -7
  233. package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/find/notebookFindWidget.js +2 -2
  234. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/cellOperations.js +2 -2
  235. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/insertCellActions.js +24 -24
  236. package/vscode/src/vs/workbench/contrib/notebook/browser/diff/diffComponents.js +3 -3
  237. package/vscode/src/vs/workbench/contrib/notebook/browser/diff/diffElementOutputs.js +7 -7
  238. package/vscode/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditor.js +1 -1
  239. package/vscode/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffEditorBrowser.js +5 -5
  240. package/vscode/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffList.js +1 -1
  241. package/vscode/src/vs/workbench/contrib/replNotebook/browser/replEditor.js +1 -1
  242. package/vscode/src/vs/workbench/contrib/replNotebook/browser/replEditorInput.js +1 -1
  243. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatInputStatusActionViewItem.d.ts +0 -30
  244. 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
- 7691,
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
- 7692,
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
- 7693,
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(model, openerService, isUBB) : undefined;
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(7694, "Unpin Model")) : ( localize(7695, "Pin Model")),
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, languageModelsService) {
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 = languageModelsService.getModelConfiguration(model.identifier) ?? {};
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 < 2) {
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(7696, "Low cost");
215
+ return localize(8261, "Low cost");
188
216
  case "medium":
189
- return localize(7697, "Medium cost");
217
+ return localize(8262, "Medium cost");
190
218
  case "high":
191
- return localize(7698, "High cost");
219
+ return localize(8263, "High cost");
192
220
  case "very_high":
193
- return localize(7699, "Very high cost");
221
+ return localize(8264, "Very high cost");
194
222
  default:
195
223
  return localize(
196
- 7700,
224
+ 8265,
197
225
  "{0} cost",
198
226
  priceCategory.charAt(0).toUpperCase() + priceCategory.slice(1)
199
227
  );
200
228
  }
201
229
  }
202
- function getModelConfigurationDescription(model, languageModelsService) {
203
- const schema = model.metadata.configurationSchema;
204
- if (!schema?.properties) {
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 = isUBB ? getPriceCategoryLabel(model.metadata.priceCategory) : undefined;
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 = [configDescription, detail, pricingForDescription].filter(Boolean);
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(7701, "Manage Language Models")),
271
- label: ( localize(7702, "Manage Models...")),
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
- isUBB
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
- items.push(createModelItem({
300
- id: "auto",
301
- enabled: true,
302
- checked: true,
303
- class: undefined,
304
- tooltip: ( localize(7703, "Auto")),
305
- label: ( localize(7703, "Auto")),
306
- run: () => {}
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(7704, "Pinned"))
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(7705, "Other Models")),
559
- label: ( localize(7705, "Other Models")),
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(7705, "Other Models")),
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
- selectedModelId,
707
- onSelect,
708
- languageModelsService,
789
+ openerService,
709
790
  undefined,
791
+ isUBB,
792
+ flatAriaDesc,
710
793
  undefined,
711
- isUBB
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
- return element.kind === ActionListItemKind.Action ? !!element?.item?.checked : undefined;
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(7706, "[Upgrade](command:workbench.action.chat.upgradePlan \" \")")), {
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(7707, "Update VS Code"));
849
+ description = ( localize(8283, "Update VS Code"));
767
850
  } else {
768
- description = manageSettingsUrl ? ( new MarkdownString(( localize(7708, "[Contact your admin]({0})", manageSettingsUrl)), {
851
+ description = manageSettingsUrl ? ( new MarkdownString(( localize(8284, "[Contact your admin]({0})", manageSettingsUrl)), {
769
852
  isTrusted: true
770
- })) : ( localize(7709, "Contact your admin"));
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
- 7710,
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
- 7711,
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
- 7712,
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._effortButton = append(this._domNode, $("a.model-picker-section.model-picker-effort"));
908
- this._effortButton.tabIndex = 0;
909
- this._effortButton.setAttribute("role", "button");
910
- this._effortButton.setAttribute("aria-haspopup", "true");
911
- this._effortButton.setAttribute("aria-expanded", "false");
912
- this._effortButton.style.display = "none";
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._effortButton, () => this._showEffortPicker());
924
- this._registerButtonAction(this._tokensButton, () => this._showTokensPicker());
1078
+ this._registerButtonAction(this._configButton, () => this._showConfigPicker());
925
1079
  this._register(
926
- getBaseLayerHoverDelegate().setupManagedHover(getDefaultHoverDelegate("mouse"), this._effortButton, ( localize(7713, "Set Thinking Effort")))
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
- isUBB ? manageModelsAction : undefined,
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
- isUBB
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
- showFilter: true,
1013
- filterPlaceholder: ( localize(7715, "Search models")),
1014
- filterActions: !isUBB && manageModelsAction ? [manageModelsAction] : undefined,
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(7703, "Auto"));
1091
- const isUBB = !!this._entitlementService.quotas.usageBasedBilling;
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 = isUBB ? this._getConfigProperty("navigation") : undefined;
1100
- if (effortConfig && this._effortButton) {
1101
- const enumIndex = effortConfig.schema.enum?.indexOf(effortConfig.value) ?? -1;
1102
- const effortLabel = enumIndex >= 0 && effortConfig.schema.enumItemLabels?.[enumIndex] ? effortConfig.schema.enumItemLabels[enumIndex] : String(effortConfig.value);
1103
- reset(
1104
- this._effortButton,
1105
- $("span.chat-input-picker-label", undefined, effortLabel)
1106
- );
1107
- this._effortButton.style.display = "";
1108
- this._effortButton.ariaLabel = ( localize(7716, "Thinking Effort: {0}", effortLabel));
1109
- } else if (this._effortButton) {
1110
- this._effortButton.style.display = "none";
1111
- }
1112
- const tokensConfig = isUBB ? this._getConfigProperty("tokens") : undefined;
1113
- if (tokensConfig && this._tokensButton) {
1114
- const idx = tokensConfig.schema.enum?.indexOf(tokensConfig.value) ?? -1;
1115
- const tokensLabel = idx >= 0 && tokensConfig.schema.enumItemLabels?.[idx] ? tokensConfig.schema.enumItemLabels[idx] : formatTokenCount(Number(tokensConfig.value));
1116
- reset(
1117
- this._tokensButton,
1118
- $("span.chat-input-picker-label", undefined, tokensLabel)
1119
- );
1120
- this._tokensButton.style.display = "";
1121
- this._tokensButton.ariaLabel = ( localize(7717, "Context Size: {0}", tokensLabel));
1122
- } else if (this._tokensButton) {
1123
- this._tokensButton.style.display = "none";
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(7718, "Pick Model, {0}", fullLabel));
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._languageModelsService);
1343
+ return resolveConfigProperty(this._selectedModel, group, this._modelConfiguration);
1132
1344
  }
1133
- _showEffortPicker() {
1134
- if (this._domNode?.classList.contains("disabled")) {
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 previousEffortValue = String(config.value ?? "");
1143
- const enumValues = config.schema.enum ?? [];
1144
- const enumItemLabels = config.schema.enumItemLabels;
1145
- const items = [{
1146
- kind: ActionListItemKind.Header,
1147
- label: ( localize(7719, "Thinking Effort"))
1148
- }];
1149
- for (let index = 0; index < enumValues.length; index++) {
1150
- const value = enumValues[index];
1151
- const label = enumItemLabels?.[index] ?? String(value);
1152
- const isDefault = value === config.schema.default;
1153
- const displayLabel = isDefault ? ( localize(7720, "{0} (default)", label)) : label;
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
- item: {
1156
- id: `effort.${value}`,
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
- const previouslyFocusedElement = getActiveElement();
1184
- const delegate = {
1185
- onSelect: action => {
1186
- this._actionWidgetService.hide();
1187
- action.run();
1188
- },
1189
- onHide: () => {
1190
- this._effortButton?.setAttribute("aria-expanded", "false");
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
- this._effortButton.setAttribute("aria-expanded", "true");
1197
- this._actionWidgetService.show(
1198
- "ChatModelEffortPicker",
1199
- false,
1200
- items,
1201
- delegate,
1202
- this._effortButton,
1203
- undefined,
1204
- [],
1205
- {
1206
- isChecked(element) {
1207
- return element.kind === ActionListItemKind.Action ? !!element?.item?.checked : undefined;
1208
- },
1209
- getRole: () => "menuitemradio",
1210
- getWidgetRole: () => "menu"
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
- _showTokensPicker() {
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 config = this._getConfigProperty("tokens");
1222
- if (!config || !this._tokensButton || !this._selectedModel) {
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.hide();
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._tokensButton?.setAttribute("aria-expanded", "false");
1446
+ this._configButton?.setAttribute("aria-expanded", "false");
1275
1447
  if (isHTMLElement(previouslyFocusedElement)) {
1276
1448
  previouslyFocusedElement.focus();
1277
1449
  }
1278
1450
  }
1279
1451
  };
1280
- this._tokensButton.setAttribute("aria-expanded", "true");
1452
+ this._configButton.setAttribute("aria-expanded", "true");
1453
+ const showCacheBreakHint = this.shouldShowCacheBreakHint( false);
1281
1454
  this._actionWidgetService.show(
1282
- "ChatModelTokensPicker",
1455
+ "ChatModelConfigPicker",
1283
1456
  false,
1284
1457
  items,
1285
1458
  delegate,
1286
- this._tokensButton,
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: () => "menuitemradio",
1466
+ getRole: element => element.kind === ActionListItemKind.Action ? "menuitemradio" : "separator",
1294
1467
  getWidgetRole: () => "menu"
1295
1468
  },
1296
1469
  {
1297
- footerText: ( localize(7723, "Larger context may increase cost"))
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
- function getModelHoverContent(model, openerService, isUBB) {
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
- container.appendChild($(".chat-model-hover-name", undefined, model.metadata.name));
1308
- if (model.metadata.tooltip) {
1309
- container.appendChild($(".chat-model-hover-separator"));
1310
- const descriptionContainer = $(".chat-model-hover-description");
1311
- const md = ( new MarkdownString("", {
1312
- isTrusted: true,
1313
- supportThemeIcons: true
1314
- }));
1315
- if (model.metadata.statusIcon) {
1316
- md.appendMarkdown(`$(${model.metadata.statusIcon.id})&nbsp;`);
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 formatCostValue = cost => {
1332
- return cost === 1 ? ( localize(7724, "{0} credit", cost)) : ( localize(7725, "{0} credits", cost));
1333
- };
1334
- const buildCostLines = (input, cache, output) => {
1335
- const lines = [];
1336
- if (input !== undefined) {
1337
- lines.push({
1338
- label: ( localize(7726, "Input")),
1339
- value: formatCostValue(input)
1340
- });
1341
- }
1342
- if (cache !== undefined) {
1343
- lines.push({
1344
- label: ( localize(7727, "Cached input")),
1345
- value: formatCostValue(cache)
1346
- });
1347
- }
1348
- if (output !== undefined) {
1349
- lines.push({
1350
- label: ( localize(7728, "Output")),
1351
- value: formatCostValue(output)
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
- return lines;
1355
- };
1356
- const appendCostSection = (parent, title, lines, categoryLabel) => {
1357
- const section = $(".chat-model-hover-cost");
1358
- const titleRow = $(".chat-model-hover-cost-title-row");
1359
- titleRow.appendChild($(".chat-model-hover-cost-title", undefined, title));
1360
- if (categoryLabel) {
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
- $("span.chat-model-hover-cost-line-label", undefined, `${line.label}: `),
1369
- $("span", undefined, line.value)
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
- parent.appendChild(section);
1373
- };
1374
- const costLines = buildCostLines(
1375
- model.metadata.inputCost,
1376
- model.metadata.cacheCost,
1377
- model.metadata.outputCost
1378
- );
1379
- const priceCategoryLabel = getPriceCategoryLabel(model.metadata.priceCategory);
1380
- if (costLines.length > 0) {
1381
- appendCostSection(container, ( localize(7729, "Cost (per 1M tokens)")), costLines, priceCategoryLabel);
1382
- const longContextCostLines = buildCostLines(
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
- } else if (priceCategoryLabel) {
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
- const titleRow = $(".chat-model-hover-cost-title-row");
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 (!isAuto && (model.metadata.maxInputTokens || model.metadata.maxOutputTokens)) {
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(7733, "Max context"))));
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 && isUBB && model.metadata.configurationSchema?.properties) {
1415
- const configurableLabels = [];
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
- configurableLabels.push(label);
1646
+ seenGroups.add(propSchema.group);
1647
+ configButtons.push({
1648
+ group: propSchema.group,
1649
+ label
1650
+ });
1421
1651
  }
1422
1652
  }
1423
1653
  }
1424
- if (configurableLabels.length > 0) {
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(7734, "Configurable:")))
1657
+ $("span.chat-model-hover-configurable-label", undefined, ( localize(8314, "Configurable")))
1429
1658
  );
1430
- for (const label of configurableLabels) {
1431
- configRow.appendChild($("span.chat-model-hover-configurable-tag", undefined, label));
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" && (model.metadata.vendor === "copilot" || model.metadata.vendor === "copilotcli");
1682
+ return model.metadata.id === "auto";
1455
1683
  }
1456
1684
 
1457
- export { ModelPickerWidget, buildModelPickerItems, formatTokenCount, getControlModelsForEntitlement, getModelHoverContent, getModelPickerAccessibilityProvider };
1685
+ export { ModelPickerWidget, buildModelPickerItems, getControlModelsForEntitlement, getModelHoverContent, getModelPickerAccessibilityProvider };