@codingame/monaco-vscode-chat-service-override 31.0.0 → 32.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/index.d.ts +1 -1
  2. package/index.js +21 -5
  3. package/package.json +5 -5
  4. package/vscode/src/vs/base/common/defaultAccount.d.ts +69 -0
  5. package/vscode/src/vs/base/common/defaultAccount.js +12 -0
  6. package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostProtocolClient.d.ts +91 -22
  7. package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostProtocolClient.js +301 -68
  8. package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostServiceImpl.d.ts +24 -5
  9. package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostServiceImpl.js +89 -16
  10. package/vscode/src/vs/platform/agentHost/browser/webSocketClientTransport.d.ts +17 -5
  11. package/vscode/src/vs/platform/agentHost/browser/webSocketClientTransport.js +73 -10
  12. package/vscode/src/vs/platform/agentHost/common/agentHostFileSystemProvider.d.ts +32 -6
  13. package/vscode/src/vs/platform/agentHost/common/agentHostFileSystemProvider.js +32 -20
  14. package/vscode/src/vs/platform/agentHost/common/agentHostPermissionService.d.ts +37 -0
  15. package/vscode/src/vs/platform/agentHost/common/agentHostPermissionService.js +15 -0
  16. package/vscode/src/vs/platform/agentHost/common/agentService.d.ts +242 -201
  17. package/vscode/src/vs/platform/agentHost/common/agentService.js +3 -1
  18. package/vscode/src/vs/platform/agentHost/common/ahpJsonlLogger.d.ts +35 -0
  19. package/vscode/src/vs/platform/agentHost/common/ahpJsonlLogger.js +106 -0
  20. package/vscode/src/vs/platform/agentHost/common/state/agentSubscription.d.ts +38 -30
  21. package/vscode/src/vs/platform/agentHost/common/state/agentSubscription.js +2 -1
  22. package/vscode/src/vs/platform/agentHost/common/state/protocol/errors.d.ts +114 -4
  23. package/vscode/src/vs/platform/agentHost/common/state/protocol/reducers.d.ts +10 -10
  24. package/vscode/src/vs/platform/agentHost/common/state/protocol/reducers.js +52 -19
  25. package/vscode/src/vs/platform/agentHost/common/state/protocol/version/registry.d.ts +42 -0
  26. package/vscode/src/vs/platform/agentHost/common/state/protocol/version/registry.js +7 -0
  27. package/vscode/src/vs/platform/agentHost/common/state/sessionActions.d.ts +42 -41
  28. package/vscode/src/vs/platform/agentHost/common/state/sessionTransport.d.ts +6 -6
  29. package/vscode/src/vs/platform/agentHost/common/transportConstants.d.ts +15 -0
  30. package/vscode/src/vs/platform/agentHost/common/transportConstants.js +6 -0
  31. package/vscode/src/vs/platform/agentPlugins/common/pluginParsers.d.ts +4 -3
  32. package/vscode/src/vs/platform/agentPlugins/common/pluginParsers.js +4 -3
  33. package/vscode/src/vs/platform/networkFilter/common/networkFilterService.d.ts +4 -2
  34. package/vscode/src/vs/platform/networkFilter/common/networkFilterService.js +15 -7
  35. package/vscode/src/vs/workbench/contrib/browserView/common/browserChatToolReferenceNames.d.ts +19 -0
  36. package/vscode/src/vs/workbench/contrib/browserView/common/browserChatToolReferenceNames.js +17 -0
  37. package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatAccessibilityService.js +2 -2
  38. package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatResponseAccessibleView.d.ts +2 -2
  39. package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatResponseAccessibleView.js +16 -16
  40. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.js +14 -10
  41. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.js +64 -59
  42. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAgentRecommendationActions.js +1 -1
  43. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.js +31 -16
  44. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.js +18 -9
  45. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.d.ts +16 -0
  46. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.js +8 -8
  47. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatDeveloperActions.js +30 -5
  48. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatFileTreeActions.js +2 -2
  49. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatForkActions.js +8 -7
  50. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatImportExport.js +3 -3
  51. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatLanguageModelActions.js +13 -13
  52. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatMoveActions.js +6 -6
  53. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatNewActions.js +12 -12
  54. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatOpenAgentDebugPanelAction.js +12 -12
  55. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatPluginActions.js +27 -18
  56. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatPromptNavigationActions.js +2 -2
  57. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQueueActions.js +11 -11
  58. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQuickInputActions.js +8 -8
  59. package/vscode/src/vs/workbench/contrib/chat/browser/actions/codeBlockOperations.js +21 -20
  60. package/vscode/src/vs/workbench/contrib/chat/browser/actions/createPluginAction.js +22 -22
  61. package/vscode/src/vs/workbench/contrib/chat/browser/actions/reviewEdits.d.ts +12 -0
  62. package/vscode/src/vs/workbench/contrib/chat/browser/actions/reviewEdits.js +171 -0
  63. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginActions.d.ts +1 -1
  64. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginActions.js +8 -8
  65. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditor.js +4 -4
  66. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditorInput.js +2 -2
  67. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginItems.d.ts +1 -1
  68. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginRepositoryService.d.ts +3 -2
  69. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginRepositoryService.js +12 -10
  70. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostPermissionUiContribution.d.ts +28 -0
  71. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostPermissionUiContribution.js +99 -0
  72. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSessionWorkingDirectoryResolver.d.ts +2 -1
  73. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSessionWorkingDirectoryResolver.js +11 -4
  74. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.contribution.js +9 -3
  75. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsActions.js +63 -53
  76. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsPicker.d.ts +2 -0
  77. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsPicker.js +10 -7
  78. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsQuickAccess.js +3 -3
  79. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjection.js +1 -1
  80. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionActions.js +4 -4
  81. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionService.js +1 -1
  82. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionsExperiments.contribution.js +5 -4
  83. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.js +25 -48
  84. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/unifiedQuickAccess.js +17 -17
  85. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/unifiedQuickAccessActions.js +4 -4
  86. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/localAgentSessionsController.js +5 -0
  87. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationDebugPanel.d.ts +8 -4
  88. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationDebugPanel.js +99 -39
  89. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationIcons.d.ts +2 -2
  90. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationIcons.js +17 -30
  91. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemsModel.d.ts +78 -0
  92. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemsModel.js +38 -0
  93. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidget.d.ts +35 -37
  94. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidget.js +347 -326
  95. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidgetUtils.d.ts +6 -2
  96. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidgetUtils.js +1 -11
  97. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.js +113 -109
  98. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.d.ts +37 -15
  99. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.js +436 -134
  100. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditorInput.js +1 -1
  101. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationWelcomePagePromptLaunchers.d.ts +2 -0
  102. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationWelcomePagePromptLaunchers.js +52 -26
  103. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationCreatorService.js +7 -1
  104. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationHarnessService.d.ts +2 -1
  105. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationHarnessService.js +13 -5
  106. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedAgentPluginDetail.d.ts +23 -0
  107. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedAgentPluginDetail.js +60 -0
  108. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedMcpServerDetail.d.ts +25 -0
  109. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedMcpServerDetail.js +93 -0
  110. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.d.ts +9 -2
  111. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.js +73 -104
  112. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/media/aiCustomizationManagement.css +272 -41
  113. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/media/aiCustomizationWelcomePromptLaunchers.css +12 -2
  114. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.d.ts +30 -1
  115. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.js +430 -185
  116. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.d.ts +5 -2
  117. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.js +44 -3
  118. package/vscode/src/vs/workbench/contrib/chat/browser/chat.contribution.js +480 -279
  119. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatCustomizationDiscoveryRenderer.js +32 -32
  120. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheDiff.d.ts +138 -0
  121. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheDiff.js +221 -0
  122. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheExplorerView.d.ts +84 -0
  123. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheExplorerView.js +1216 -0
  124. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugDetailPanel.js +6 -6
  125. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.d.ts +2 -1
  126. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.js +32 -4
  127. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditorInput.js +2 -2
  128. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventDetailRenderer.js +26 -19
  129. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventList.js +7 -7
  130. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFilters.js +4 -4
  131. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowChartView.js +7 -7
  132. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowGraph.js +28 -25
  133. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHomeView.js +13 -13
  134. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHookContentRenderer.js +17 -17
  135. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugLogsView.js +25 -24
  136. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugMessageContentRenderer.js +8 -8
  137. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugModelTurnContentRenderer.js +23 -23
  138. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugOverviewView.d.ts +2 -1
  139. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugOverviewView.js +68 -33
  140. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugToolCallContentRenderer.js +11 -11
  141. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugTypes.d.ts +3 -2
  142. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugTypes.js +1 -0
  143. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/media/chatDebug.css +650 -6
  144. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingCodeEditorIntegration.js +2 -2
  145. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorActions.d.ts +46 -0
  146. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorActions.js +533 -0
  147. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.d.ts +29 -0
  148. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.js +390 -0
  149. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationModelManager.js +3 -3
  150. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationWidget.d.ts +101 -0
  151. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationWidget.js +509 -0
  152. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedDocumentEntry.js +2 -2
  153. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.js +18 -3
  154. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.js +1 -1
  155. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl.js +11 -11
  156. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingSession.js +3 -2
  157. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/media/chatEditingEditorOverlay.css +130 -0
  158. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/media/chatEditingExplanationWidget.css +276 -0
  159. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/notebook/chatEditingNotebookEditorIntegration.js +1 -1
  160. package/vscode/src/vs/workbench/contrib/chat/browser/chatImageCarouselService.js +1 -1
  161. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagement.contribution.js +8 -7
  162. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagementEditorInput.js +2 -2
  163. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsViewModel.d.ts +1 -7
  164. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsViewModel.js +6 -87
  165. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.d.ts +1 -1
  166. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.js +116 -182
  167. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/media/chatModelsWidget.css +12 -39
  168. package/vscode/src/vs/workbench/contrib/chat/browser/chatOutputItemRenderer.js +3 -3
  169. package/vscode/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.js +31 -31
  170. package/vscode/src/vs/workbench/contrib/chat/browser/chatRepoInfo.js +2 -2
  171. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.js +61 -41
  172. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupController.js +10 -10
  173. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupGrowthSession.js +6 -6
  174. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupProviders.js +27 -27
  175. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.d.ts +2 -0
  176. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.js +16 -13
  177. package/vscode/src/vs/workbench/contrib/chat/browser/chatSlashCommands.d.ts +20 -0
  178. package/vscode/src/vs/workbench/contrib/chat/browser/chatSlashCommands.js +106 -36
  179. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.d.ts +25 -7
  180. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.js +629 -425
  181. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.d.ts +9 -1
  182. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.js +105 -29
  183. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusItemService.d.ts +1 -0
  184. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/media/chatStatus.css +175 -148
  185. package/vscode/src/vs/workbench/contrib/chat/browser/chatTipCatalog.js +20 -33
  186. package/vscode/src/vs/workbench/contrib/chat/browser/chatTipService.js +9 -2
  187. package/vscode/src/vs/workbench/contrib/chat/browser/chatWindowNotifier.js +4 -4
  188. package/vscode/src/vs/workbench/contrib/chat/browser/claudePluginRecommendations.js +2 -2
  189. package/vscode/src/vs/workbench/contrib/chat/browser/defaultModelContribution.js +4 -4
  190. package/vscode/src/vs/workbench/contrib/chat/browser/enablementActions.js +4 -4
  191. package/vscode/src/vs/workbench/contrib/chat/browser/enablementStatusWidget.js +2 -2
  192. package/vscode/src/vs/workbench/contrib/chat/browser/githubRepoFetcher.d.ts +58 -0
  193. package/vscode/src/vs/workbench/contrib/chat/browser/githubRepoFetcher.js +339 -0
  194. package/vscode/src/vs/workbench/contrib/chat/browser/languageModelsConfigurationService.js +1 -1
  195. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/media/planReviewFeedback.css +160 -0
  196. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorActions.d.ts +9 -0
  197. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorActions.js +123 -0
  198. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorContribution.d.ts +37 -0
  199. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorContribution.js +572 -0
  200. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackService.d.ts +36 -0
  201. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackService.js +167 -0
  202. package/vscode/src/vs/workbench/contrib/chat/browser/pluginGitCommandService.d.ts +49 -7
  203. package/vscode/src/vs/workbench/contrib/chat/browser/pluginGitCommandService.js +315 -19
  204. package/vscode/src/vs/workbench/contrib/chat/browser/pluginInstallService.js +45 -24
  205. package/vscode/src/vs/workbench/contrib/chat/browser/pluginSources.js +15 -15
  206. package/vscode/src/vs/workbench/contrib/chat/browser/pluginUrlHandler.js +6 -6
  207. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/chatModeActions.js +6 -6
  208. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookActions.js +44 -40
  209. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookUtils.js +5 -5
  210. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptCodingAgentActionOverlay.js +2 -2
  211. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptFileContributions.js +4 -1
  212. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptToolsCodeLensProvider.js +2 -2
  213. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptUrlHandler.js +8 -8
  214. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/runPromptAction.js +7 -7
  215. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/saveAsPromptFileActions.js +3 -3
  216. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/skillActions.js +3 -3
  217. package/vscode/src/vs/workbench/contrib/chat/browser/promptsDebugContribution.js +20 -20
  218. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsConfirmationService.js +39 -39
  219. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.d.ts +9 -1
  220. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.js +111 -52
  221. package/vscode/src/vs/workbench/contrib/chat/browser/tools/renameTool.d.ts +3 -7
  222. package/vscode/src/vs/workbench/contrib/chat/browser/tools/renameTool.js +13 -47
  223. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolHelpers.d.ts +3 -2
  224. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolHelpers.js +4 -8
  225. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolResultCompressorService.d.ts +18 -0
  226. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolResultCompressorService.js +56 -0
  227. package/vscode/src/vs/workbench/contrib/chat/browser/tools/usagesTool.d.ts +3 -7
  228. package/vscode/src/vs/workbench/contrib/chat/browser/tools/usagesTool.js +14 -52
  229. package/vscode/src/vs/workbench/contrib/chat/browser/viewsWelcome/chatViewsWelcomeHandler.js +5 -5
  230. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidgetService.d.ts +3 -1
  231. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidgetService.js +17 -2
  232. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatQueuePickerActionItem.d.ts +2 -0
  233. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatQueuePickerActionItem.js +23 -12
  234. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletions.d.ts +39 -0
  235. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletions.js +136 -0
  236. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletionsBase.d.ts +72 -0
  237. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletionsBase.js +56 -0
  238. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletionUtils.d.ts +7 -0
  239. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletionUtils.js +14 -1
  240. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletions.js +41 -26
  241. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputEditorContrib.js +30 -12
  242. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputEditorHover.js +1 -1
  243. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/chatQuick.js +1 -1
  244. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/editor/chatEditor.js +2 -5
  245. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewPane.js +25 -6
  246. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewTitleControl.js +2 -2
  247. package/vscode/src/vs/workbench/contrib/chat/common/chatDebugServiceImpl.d.ts +2 -2
  248. package/vscode/src/vs/workbench/contrib/chat/common/chatDebugServiceImpl.js +5 -4
  249. package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.d.ts +1 -0
  250. package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.js +108 -45
  251. package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceTelemetry.js +7 -3
  252. package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionOperationLog.js +3 -1
  253. package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionStore.d.ts +20 -1
  254. package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionStore.js +65 -26
  255. package/vscode/src/vs/workbench/contrib/chat/common/participants/chatSlashCommands.d.ts +5 -3
  256. package/vscode/src/vs/workbench/contrib/chat/common/participants/chatSlashCommands.js +38 -11
  257. package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.d.ts +17 -1
  258. package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.js +165 -16
  259. package/vscode/src/vs/workbench/contrib/chat/common/plugins/pluginMarketplaceService.d.ts +1 -0
  260. package/vscode/src/vs/workbench/contrib/chat/common/plugins/pluginMarketplaceService.js +62 -1
  261. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/chatPromptFilesContribution.js +18 -18
  262. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/PromptHeaderDefinitionProvider.js +2 -1
  263. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptCodeActions.js +5 -5
  264. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHeaderAutocompletion.d.ts +1 -3
  265. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHeaderAutocompletion.js +15 -21
  266. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHovers.d.ts +1 -3
  267. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHovers.js +18 -24
  268. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.d.ts +4 -2
  269. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.js +203 -180
  270. package/vscode/src/vs/workbench/contrib/chat/common/voiceChatService.js +1 -1
  271. package/vscode/src/vs/workbench/contrib/chat/common/workingDirectory.d.ts +30 -0
  272. package/vscode/src/vs/workbench/contrib/chat/common/workingDirectory.js +35 -0
  273. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/aiEditTelemetry/aiEditTelemetryServiceImpl.d.ts +2 -1
  274. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/aiEditTelemetry/aiEditTelemetryServiceImpl.js +27 -2
  275. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.d.ts +1 -1
  276. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.js +14 -49
  277. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.d.ts +0 -16
  278. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.js +35 -177
  279. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatDefaultModel.js +2 -8
  280. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatNotebook.d.ts +1 -2
  281. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatNotebook.js +2 -3
  282. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.d.ts +4 -4
  283. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.js +11 -11
  284. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpPromptArgumentPick.js +14 -14
  285. package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/chat/notebookChatUtils.js +1 -1
  286. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.js +13 -13
  287. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.js +5 -5
  288. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext.js +1 -1
  289. package/vscode/src/vs/workbench/contrib/remoteCodingAgents/browser/remoteCodingAgents.contribution.js +7 -7
  290. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatAccessibilityHelp.js +16 -16
  291. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.js +20 -20
  292. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.d.ts +29 -3
  293. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.js +129 -3
  294. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/taskHelpers.js +3 -2
  295. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/terminal.chatAgentTools.contribution.d.ts +2 -1
  296. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/terminal.chatAgentTools.contribution.js +14 -6
  297. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalLastCommandTool.js +3 -3
  298. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalOutputTool.d.ts +1 -4
  299. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalOutputTool.js +12 -38
  300. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalSelectionTool.js +3 -3
  301. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/killTerminalTool.js +4 -4
  302. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalConfirmationTool.js +2 -2
  303. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/sendToTerminalTool.d.ts +12 -7
  304. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/sendToTerminalTool.js +77 -70
  305. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/createAndRunTaskTool.js +14 -14
  306. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/getTaskOutputTool.js +7 -7
  307. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/runTaskTool.js +14 -14
  308. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/taskHelpers.js +1 -1
  309. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCompressor.d.ts +32 -0
  310. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCompressor.js +232 -0
  311. package/vscode/src/vs/workbench/services/agentHost/common/agentHostPermissionService.d.ts +83 -0
  312. package/vscode/src/vs/workbench/services/agentHost/common/agentHostPermissionService.js +243 -0
  313. package/vscode/src/vs/platform/agentHost/common/state/protocol/commands.d.ts +0 -749
  314. package/vscode/src/vs/platform/agentHost/common/state/protocol/commands.js +0 -14
  315. package/vscode/src/vs/platform/agentHost/common/state/sessionCapabilities.d.ts +0 -17
  316. package/vscode/src/vs/platform/agentHost/common/state/sessionCapabilities.js +0 -5
  317. package/vscode/src/vs/platform/agentHost/common/state/sessionProtocol.d.ts +0 -40
  318. package/vscode/src/vs/platform/agentHost/common/state/sessionProtocol.js +0 -14
  319. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.d.ts +0 -61
  320. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.js +0 -638
  321. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemSource.d.ts +0 -131
  322. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemSource.js +0 -363
  323. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/promptsServiceCustomizationItemProvider.d.ts +0 -24
  324. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/promptsServiceCustomizationItemProvider.js +0 -306
  325. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatStatusWidget.d.ts +0 -23
  326. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatStatusWidget.js +0 -97
  327. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/media/chatStatusWidget.css +0 -57
  328. package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.d.ts +0 -50
  329. package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.js +0 -29
  330. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookClaudeCompat.d.ts +0 -50
  331. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookClaudeCompat.js +0 -78
  332. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCompatibility.d.ts +0 -77
  333. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCompatibility.js +0 -120
  334. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCopilotCliCompat.d.ts +0 -10
  335. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCopilotCliCompat.js +0 -23
  336. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.d.ts +0 -242
  337. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.js +0 -1701
  338. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.d.ts +0 -191
  339. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.js +0 -728
  340. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatHistoryService.d.ts +0 -14
  341. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatHistoryService.js +0 -69
@@ -10,7 +10,7 @@ import { IInstantiationService } from '@codingame/monaco-vscode-api/vscode/vs/pl
10
10
  import { WorkbenchList } from '@codingame/monaco-vscode-api/vscode/vs/platform/list/browser/listService';
11
11
  import { ThemeIcon } from '@codingame/monaco-vscode-api/vscode/vs/base/common/themables';
12
12
  import { Codicon } from '@codingame/monaco-vscode-api/vscode/vs/base/common/codicons';
13
- import { Button } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/button/button';
13
+ import { Button, ButtonWithDropdown } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/button/button';
14
14
  import { defaultCheckboxStyles, defaultButtonStyles, defaultInputBoxStyles } from '@codingame/monaco-vscode-api/vscode/vs/platform/theme/browser/defaultStyles';
15
15
  import '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/index';
16
16
  import { IOpenerService } from '@codingame/monaco-vscode-api/vscode/vs/platform/opener/common/opener.service';
@@ -18,12 +18,12 @@ import { URI } from '@codingame/monaco-vscode-api/vscode/vs/base/common/uri';
18
18
  import { InputBox } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/inputbox/inputBox';
19
19
  import { IContextViewService, IContextMenuService } from '@codingame/monaco-vscode-api/vscode/vs/platform/contextview/browser/contextView.service';
20
20
  import { ICommandService } from '@codingame/monaco-vscode-api/vscode/vs/platform/commands/common/commands.service';
21
- import { CancellationTokenSource } from '@codingame/monaco-vscode-api/vscode/vs/base/common/cancellation';
21
+ import { CancellationTokenSource, CancellationToken } from '@codingame/monaco-vscode-api/vscode/vs/base/common/cancellation';
22
22
  import { Delayer } from '@codingame/monaco-vscode-api/vscode/vs/base/common/async';
23
- import { Separator } from '@codingame/monaco-vscode-api/vscode/vs/base/common/actions';
23
+ import { Action, Separator } from '@codingame/monaco-vscode-api/vscode/vs/base/common/actions';
24
24
  import { isEqual, basename, dirname } from '@codingame/monaco-vscode-api/vscode/vs/base/common/resources';
25
- import { getDefaultHoverDelegate } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/hover/hoverDelegateFactory';
26
25
  import { IHoverService } from '@codingame/monaco-vscode-api/vscode/vs/platform/hover/browser/hover.service';
26
+ import { isWeb } from '@codingame/monaco-vscode-api/vscode/vs/base/common/platform';
27
27
  import { IAgentPluginService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/plugins/agentPluginService.service';
28
28
  import { isContributionEnabled } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/enablement';
29
29
  import { getInstalledPluginContextMenuActions } from '../agentPluginActions.js';
@@ -34,12 +34,13 @@ import { pluginIcon } from './aiCustomizationIcons.js';
34
34
  import { formatDisplayName } from './aiCustomizationListWidget.js';
35
35
  import { ILabelService } from '@codingame/monaco-vscode-api/vscode/vs/platform/label/common/label.service';
36
36
  import { CUSTOMIZATION_GROUP_HEADER_HEIGHT, CUSTOMIZATION_GROUP_HEADER_HEIGHT_WITH_SEPARATOR, CustomizationGroupHeaderRenderer } from './customizationGroupHeaderRenderer.js';
37
+ import { isPluginCustomizationItem } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/customizationHarnessService';
37
38
  import { ICustomizationHarnessService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/customizationHarnessService.service';
38
39
  import { Checkbox } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/toggle/toggle';
39
40
  import { IConfigurationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service';
40
41
  import { ChatConfiguration } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/constants';
41
- import { autorun } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/reactions/autorun';
42
42
  import { truncateToFirstLine } from './aiCustomizationListWidgetUtils.js';
43
+ import { autorun } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/reactions/autorun';
43
44
 
44
45
  registerCss(aiCustomizationManagement);
45
46
  const $ = $$1;
@@ -61,6 +62,9 @@ class PluginItemDelegate {
61
62
  if (element.type === "marketplace-item") {
62
63
  return "pluginMarketplaceItem";
63
64
  }
65
+ if (element.type === "remote-item") {
66
+ return "pluginRemoteItem";
67
+ }
64
68
  return "pluginInstalledItem";
65
69
  }
66
70
  }
@@ -77,14 +81,12 @@ class PluginInstalledItemRenderer {
77
81
  const details = append(container, $(".mcp-server-details"));
78
82
  const name = append(details, $(".mcp-server-name"));
79
83
  const description = append(details, $(".mcp-server-description"));
80
- const status = append(container, $(".mcp-server-status"));
81
84
  return {
82
85
  container,
83
86
  syncCheckboxContainer,
84
87
  typeIcon,
85
88
  name,
86
89
  description,
87
- status,
88
90
  disposables: ( new DisposableStore())
89
91
  };
90
92
  }
@@ -100,25 +102,17 @@ class PluginInstalledItemRenderer {
100
102
  templateData.disposables.add(autorun(reader => {
101
103
  const enabled = isContributionEnabled(element.item.plugin.enablement.read(reader));
102
104
  templateData.container.classList.toggle("disabled", !enabled);
103
- templateData.status.className = "mcp-server-status";
104
- if (enabled) {
105
- templateData.status.textContent = ( localize(5530, "Enabled"));
106
- templateData.status.classList.add("running");
107
- } else {
108
- templateData.status.textContent = ( localize(5531, "Disabled"));
109
- templateData.status.classList.add("disabled");
110
- }
111
105
  }));
112
106
  const syncProvider = this._harnessService.getActiveDescriptor().syncProvider;
113
107
  if (syncProvider) {
114
108
  templateData.syncCheckboxContainer.style.display = "";
115
109
  const pluginUri = element.item.plugin.uri;
116
- const synced = syncProvider.isSelected(pluginUri);
117
- const title = synced ? ( localize(5532, "Remove {0} from sync", element.item.name)) : ( localize(5533, "Add {0} to sync", element.item.name));
118
- const checkbox = templateData.disposables.add(( new Checkbox(title, synced, defaultCheckboxStyles)));
110
+ const disabled = syncProvider.isDisabled(pluginUri);
111
+ const title = disabled ? ( localize(5630, "Enable {0} for sync", element.item.name)) : ( localize(5631, "Disable {0} from sync", element.item.name));
112
+ const checkbox = templateData.disposables.add(( new Checkbox(title, !disabled, defaultCheckboxStyles)));
119
113
  templateData.syncCheckboxContainer.replaceChildren(checkbox.domNode);
120
114
  templateData.disposables.add(checkbox.onChange(() => {
121
- syncProvider.toggleUri(pluginUri);
115
+ syncProvider.setDisabled(pluginUri, !checkbox.checked);
122
116
  }));
123
117
  } else {
124
118
  templateData.syncCheckboxContainer.style.display = "none";
@@ -129,6 +123,78 @@ class PluginInstalledItemRenderer {
129
123
  templateData.disposables.dispose();
130
124
  }
131
125
  }
126
+ class PluginRemoteItemRenderer {
127
+ constructor() {
128
+ this.templateId = "pluginRemoteItem";
129
+ }
130
+ renderTemplate(container) {
131
+ container.classList.add("mcp-server-item");
132
+ const typeIcon = append(container, $(".mcp-server-icon"));
133
+ typeIcon.classList.add(...ThemeIcon.asClassNameArray(pluginIcon));
134
+ const details = append(container, $(".mcp-server-details"));
135
+ const nameRow = append(details, $(".mcp-server-name"));
136
+ const name = append(nameRow, $("span"));
137
+ const badge = append(nameRow, $(".inline-badge.item-badge"));
138
+ const description = append(details, $(".mcp-server-description"));
139
+ const status = append(container, $(".mcp-server-status"));
140
+ return {
141
+ container,
142
+ typeIcon,
143
+ name,
144
+ badge,
145
+ description,
146
+ status
147
+ };
148
+ }
149
+ renderElement(element, _index, templateData) {
150
+ templateData.name.textContent = formatDisplayName(element.item.name);
151
+ if (element.item.badge) {
152
+ templateData.badge.textContent = element.item.badge;
153
+ templateData.badge.style.display = "";
154
+ templateData.badge.title = element.item.badgeTooltip ?? "";
155
+ } else {
156
+ templateData.badge.textContent = "";
157
+ templateData.badge.style.display = "none";
158
+ templateData.badge.title = "";
159
+ }
160
+ if (element.item.description) {
161
+ templateData.description.textContent = truncateToFirstLine(element.item.description);
162
+ templateData.description.style.display = "";
163
+ } else {
164
+ templateData.description.textContent = "";
165
+ templateData.description.style.display = "none";
166
+ }
167
+ templateData.container.classList.toggle("disabled", element.item.enabled === false);
168
+ templateData.status.className = "mcp-server-status";
169
+ if (element.item.enabled === false) {
170
+ templateData.status.textContent = ( localize(5632, "Disabled"));
171
+ templateData.status.classList.add("disabled");
172
+ return;
173
+ }
174
+ switch (element.item.status) {
175
+ case "loading":
176
+ templateData.status.textContent = ( localize(5633, "Loading"));
177
+ templateData.status.classList.add("running");
178
+ break;
179
+ case "loaded":
180
+ templateData.status.textContent = ( localize(5634, "Loaded"));
181
+ templateData.status.classList.add("running");
182
+ break;
183
+ case "degraded":
184
+ templateData.status.textContent = ( localize(5635, "Warning"));
185
+ templateData.status.classList.add("disabled");
186
+ break;
187
+ case "error":
188
+ templateData.status.textContent = ( localize(5636, "Error"));
189
+ templateData.status.classList.add("disabled");
190
+ break;
191
+ default:
192
+ templateData.status.textContent = "";
193
+ break;
194
+ }
195
+ }
196
+ disposeTemplate(_templateData) {}
197
+ }
132
198
  class PluginMarketplaceItemRenderer {
133
199
  constructor(pluginInstallService, agentPluginService) {
134
200
  this.pluginInstallService = pluginInstallService;
@@ -165,7 +231,7 @@ class PluginMarketplaceItemRenderer {
165
231
  renderElement(element, _index, templateData) {
166
232
  templateData.elementDisposables.clear();
167
233
  templateData.name.textContent = element.item.name;
168
- templateData.publisher.textContent = element.item.marketplace ? ( localize(5534, "by {0}", element.item.marketplace)) : "";
234
+ templateData.publisher.textContent = element.item.marketplace ? ( localize(5637, "by {0}", element.item.marketplace)) : "";
169
235
  templateData.description.textContent = element.item.description || "";
170
236
  const installUri = this.pluginInstallService.getPluginInstallUri({
171
237
  name: element.item.name,
@@ -179,14 +245,14 @@ class PluginMarketplaceItemRenderer {
179
245
  });
180
246
  const isAlreadyInstalled = ( this.agentPluginService.plugins.get().some(p => isEqual(p.uri, installUri)));
181
247
  if (isAlreadyInstalled) {
182
- templateData.installButton.label = ( localize(5535, "Installed"));
248
+ templateData.installButton.label = ( localize(5638, "Installed"));
183
249
  templateData.installButton.enabled = false;
184
250
  return;
185
251
  }
186
- templateData.installButton.label = ( localize(5536, "Install"));
252
+ templateData.installButton.label = ( localize(5639, "Install"));
187
253
  templateData.installButton.enabled = true;
188
254
  templateData.elementDisposables.add(templateData.installButton.onDidClick(async () => {
189
- templateData.installButton.label = ( localize(5537, "Installing..."));
255
+ templateData.installButton.label = ( localize(5640, "Installing..."));
190
256
  templateData.installButton.enabled = false;
191
257
  try {
192
258
  await this.pluginInstallService.installPlugin({
@@ -200,9 +266,9 @@ class PluginMarketplaceItemRenderer {
200
266
  marketplaceType: element.item.marketplaceType,
201
267
  readmeUri: element.item.readmeUri
202
268
  });
203
- templateData.installButton.label = ( localize(5535, "Installed"));
269
+ templateData.installButton.label = ( localize(5638, "Installed"));
204
270
  } catch (_e) {
205
- templateData.installButton.label = ( localize(5536, "Install"));
271
+ templateData.installButton.label = ( localize(5639, "Install"));
206
272
  templateData.installButton.enabled = true;
207
273
  }
208
274
  }));
@@ -213,7 +279,7 @@ class PluginMarketplaceItemRenderer {
213
279
  }
214
280
  }
215
281
  function installedPluginToItem(plugin, labelService) {
216
- const name = plugin.label ?? basename(plugin.uri);
282
+ const name = plugin.label || basename(plugin.uri);
217
283
  const description = plugin.fromMarketplace?.description ?? labelService.getUriLabel(dirname(plugin.uri), {
218
284
  relative: true
219
285
  });
@@ -272,13 +338,16 @@ let PluginListWidget = class PluginListWidget extends Disposable {
272
338
  this._onDidChangeItemCount = this._register(( new Emitter()));
273
339
  this.onDidChangeItemCount = this._onDidChangeItemCount.event;
274
340
  this.disabledLinkListener = this._register(( new MutableDisposable()));
341
+ this.addDropdownActions = this._register(( new DisposableStore()));
275
342
  this.installedItems = [];
343
+ this.remoteItems = [];
276
344
  this.displayEntries = [];
277
345
  this.marketplaceItems = [];
278
346
  this.searchQuery = "";
279
347
  this.browseMode = false;
280
348
  this.lastHeight = 0;
281
349
  this.lastWidth = 0;
350
+ this._layoutDeferred = false;
282
351
  this.collapsedGroups = ( new Set());
283
352
  this.delayedFilter = ( new Delayer(200));
284
353
  this.delayedMarketplaceSearch = ( new Delayer(400));
@@ -300,7 +369,7 @@ let PluginListWidget = class PluginListWidget extends Disposable {
300
369
  this.searchAndButtonContainer = append(this.element, $(".list-search-and-button-container"));
301
370
  const searchContainer = append(this.searchAndButtonContainer, $(".list-search-container"));
302
371
  this.searchInput = this._register(( new InputBox(searchContainer, this.contextViewService, {
303
- placeholder: ( localize(5538, "Type to search...")),
372
+ placeholder: ( localize(5641, "Type to search...")),
304
373
  inputBoxStyles: defaultInputBoxStyles
305
374
  })));
306
375
  this._register(this.searchInput.onDidChange(() => {
@@ -311,68 +380,54 @@ let PluginListWidget = class PluginListWidget extends Disposable {
311
380
  this.delayedFilter.trigger(() => this.filterPlugins());
312
381
  }
313
382
  }));
314
- const buttonContainer = append(this.searchAndButtonContainer, $(".list-button-group"));
315
- const browseButtonContainer = append(buttonContainer, $(".list-add-button-container"));
383
+ this.buttonContainer = append(this.searchAndButtonContainer, $(".list-button-group"));
384
+ const browseButtonContainer = append(this.buttonContainer, $(".list-add-button-container"));
385
+ const browseMarketplaceLabel = ( localize(5642, "Browse Marketplace"));
316
386
  this.browseButton = this._register(( new Button(browseButtonContainer, {
317
387
  ...defaultButtonStyles,
318
388
  secondary: true,
319
- supportIcons: true
389
+ supportIcons: true,
390
+ title: browseMarketplaceLabel,
391
+ ariaLabel: browseMarketplaceLabel
320
392
  })));
321
- this.browseButton.label = `$(${Codicon.library.id}) ${( localize(5539, "Browse Marketplace"))}`;
322
393
  this.browseButton.element.classList.add("list-add-button");
323
- this._register(this.browseButton.onDidClick(() => {
324
- this.toggleBrowseMode(!this.browseMode);
325
- }));
326
- const installFromSourceButton = this._register(( new Button(buttonContainer, {
394
+ this._register(this.browseButton.onDidClick(() => this.runPrimaryButtonAction()));
395
+ this.addButtonContainer = append(this.buttonContainer, $(".list-add-button-container"));
396
+ const addPluginLabel = ( localize(5643, "Add Plugin"));
397
+ this.addButtonSimple = this._register(( new Button(this.addButtonContainer, {
327
398
  ...defaultButtonStyles,
328
399
  secondary: true,
329
- supportIcons: true
400
+ supportIcons: true,
401
+ title: addPluginLabel,
402
+ ariaLabel: addPluginLabel
330
403
  })));
331
- installFromSourceButton.label = `$(${Codicon.add.id})`;
332
- installFromSourceButton.setTitle(( localize(5540, "Install Plugin from Source")));
333
- installFromSourceButton.element.classList.add("list-icon-button");
334
- this._register(this.hoverService.setupManagedHover(
335
- getDefaultHoverDelegate("element"),
336
- installFromSourceButton.element,
337
- ( localize(5541, "Install Plugin from Source"))
338
- ));
339
- this._register(installFromSourceButton.onDidClick(() => {
340
- this.commandService.executeCommand("workbench.action.chat.installPluginFromSource");
341
- }));
342
- const createPluginButton = this._register(( new Button(buttonContainer, {
404
+ this.addButtonSimple.element.classList.add("list-add-button");
405
+ this._register(this.addButtonSimple.onDidClick(() => this.runPrimaryAddAction()));
406
+ this.addButton = this._register(( new ButtonWithDropdown(this.addButtonContainer, {
343
407
  ...defaultButtonStyles,
344
408
  secondary: true,
345
- supportIcons: true
409
+ supportIcons: true,
410
+ contextMenuProvider: this.contextMenuService,
411
+ addPrimaryActionToDropdown: false,
412
+ actions: {
413
+ getActions: () => this.getAddDropdownActions()
414
+ },
415
+ title: addPluginLabel,
416
+ ariaLabel: addPluginLabel
346
417
  })));
347
- createPluginButton.label = `$(${Codicon.newFile.id})`;
348
- createPluginButton.setTitle(( localize(5542, "Create Plugin")));
349
- createPluginButton.element.classList.add("list-icon-button");
350
- this._register(this.hoverService.setupManagedHover(
351
- getDefaultHoverDelegate("element"),
352
- createPluginButton.element,
353
- ( localize(5543, "Create Plugin"))
354
- ));
355
- this._register(createPluginButton.onDidClick(() => {
356
- this.commandService.executeCommand("workbench.action.chat.createPlugin");
357
- }));
358
- this.backLink = append(this.element, $(".mcp-back-link"));
359
- this.backLink.setAttribute("role", "button");
360
- this.backLink.tabIndex = 0;
361
- this.backLink.setAttribute("aria-label", ( localize(5544, "Back to installed plugins")));
362
- const backIcon = append(this.backLink, $("span"));
363
- backIcon.classList.add(...ThemeIcon.asClassNameArray(Codicon.arrowLeft));
364
- const backText = append(this.backLink, $("span"));
365
- backText.textContent = ( localize(5545, "Back to installed plugins"));
366
- this._register(addDisposableListener(this.backLink, "click", () => {
367
- this.toggleBrowseMode(false);
368
- }));
369
- this._register(addDisposableListener(this.backLink, "keydown", e => {
370
- if (e.key === "Enter" || e.key === " ") {
371
- e.preventDefault();
372
- this.toggleBrowseMode(false);
373
- }
374
- }));
375
- this.backLink.style.display = "none";
418
+ this.addButton.element.classList.add("list-add-button");
419
+ this._register(this.addButton.onDidClick(() => this.runPrimaryAddAction()));
420
+ const createPluginLabel = ( localize(5644, "Create Plugin"));
421
+ this.createPluginButton = this._register(( new Button(this.buttonContainer, {
422
+ ...defaultButtonStyles,
423
+ secondary: true,
424
+ supportIcons: true,
425
+ title: createPluginLabel,
426
+ ariaLabel: createPluginLabel
427
+ })));
428
+ this.createPluginButton.element.classList.add("list-icon-button");
429
+ this.createPluginButton.label = `$(${Codicon.newFile.id})`;
430
+ this._register(this.createPluginButton.onDidClick(() => this.runCreatePluginAction()));
376
431
  this.emptyContainer = append(this.element, $(".mcp-empty-state"));
377
432
  const emptyHeader = append(this.emptyContainer, $(".empty-state-header"));
378
433
  const emptyIcon = append(emptyHeader, $(".empty-icon"));
@@ -383,17 +438,17 @@ let PluginListWidget = class PluginListWidget extends Disposable {
383
438
  const disabledHeader = append(this.disabledContainer, $(".empty-state-header"));
384
439
  this.disabledIcon = append(disabledHeader, $(".empty-icon"));
385
440
  const disabledText = append(disabledHeader, $(".empty-text"));
386
- disabledText.textContent = ( localize(5546, "Plugins are disabled"));
441
+ disabledText.textContent = ( localize(5645, "Plugins are disabled"));
387
442
  this.disabledMessage = append(this.disabledContainer, $(".empty-subtext"));
388
443
  this.listContainer = append(this.element, $(".mcp-list-container"));
389
444
  this.sectionHeader = append(this.element, $(".section-footer"));
390
445
  this.sectionDescription = append(this.sectionHeader, $("p.section-footer-description"));
391
446
  this.sectionDescription.textContent = ( localize(
392
- 5547,
447
+ 5646,
393
448
  "Extend your AI agent with plugins that add commands, skills, agents, hooks, and MCP servers from reusable packages."
394
449
  ));
395
450
  this.sectionLink = append(this.sectionHeader, $("a.section-footer-link"));
396
- this.sectionLink.textContent = ( localize(5548, "Learn more about agent plugins"));
451
+ this.sectionLink.textContent = ( localize(5647, "Learn more about agent plugins"));
397
452
  this.sectionLink.href = "https://code.visualstudio.com/docs/copilot/customization/agent-plugins";
398
453
  this._register(addDisposableListener(this.sectionLink, "click", e => {
399
454
  e.preventDefault();
@@ -405,14 +460,15 @@ let PluginListWidget = class PluginListWidget extends Disposable {
405
460
  const delegate = ( new PluginItemDelegate());
406
461
  const groupHeaderRenderer = ( new CustomizationGroupHeaderRenderer("pluginGroupHeader", this.hoverService));
407
462
  const installedRenderer = ( new PluginInstalledItemRenderer(this.harnessService));
463
+ const remoteRenderer = ( new PluginRemoteItemRenderer());
408
464
  const marketplaceRenderer = ( new PluginMarketplaceItemRenderer(this.pluginInstallService, this.agentPluginService));
409
- this.list = this._register(this.instantiationService.createInstance(
410
- WorkbenchList,
411
- "PluginManagementList",
412
- this.listContainer,
413
- delegate,
414
- [groupHeaderRenderer, installedRenderer, marketplaceRenderer],
415
- {
465
+ this.list = this._register(
466
+ this.instantiationService.createInstance(WorkbenchList, "PluginManagementList", this.listContainer, delegate, [
467
+ groupHeaderRenderer,
468
+ installedRenderer,
469
+ remoteRenderer,
470
+ marketplaceRenderer
471
+ ], {
416
472
  multipleSelectionSupport: false,
417
473
  setRowLineHeight: false,
418
474
  horizontalScrolling: false,
@@ -420,20 +476,24 @@ let PluginListWidget = class PluginListWidget extends Disposable {
420
476
  getAriaLabel(element) {
421
477
  if (element.type === "group-header") {
422
478
  return localize(
423
- 5549,
479
+ 5648,
424
480
  "{0}, {1} items, {2}",
425
481
  element.label,
426
482
  element.count,
427
- element.collapsed ? ( localize(5550, "collapsed")) : ( localize(5551, "expanded"))
483
+ element.collapsed ? ( localize(5649, "collapsed")) : ( localize(5650, "expanded"))
428
484
  );
429
485
  }
430
- if (element.type === "marketplace-item") {
431
- return element.item.name;
486
+ const name = formatDisplayName(element.item.name);
487
+ const description = element.item.description ? truncateToFirstLine(element.item.description) : undefined;
488
+ const nameAndDesc = description ? ( localize(5651, "{0}. {1}", name, description)) : name;
489
+ if (element.type === "plugin-item") {
490
+ const enabled = isContributionEnabled(element.item.plugin.enablement.get());
491
+ return enabled ? ( localize(5652, "{0}. Enabled", nameAndDesc)) : ( localize(5653, "{0}. Disabled", nameAndDesc));
432
492
  }
433
- return element.item.name;
493
+ return nameAndDesc;
434
494
  },
435
495
  getWidgetAriaLabel() {
436
- return localize(5552, "Plugins");
496
+ return localize(5654, "Plugins");
437
497
  }
438
498
  },
439
499
  openOnSingleClick: true,
@@ -445,18 +505,22 @@ let PluginListWidget = class PluginListWidget extends Disposable {
445
505
  if (element.type === "marketplace-item") {
446
506
  return `marketplace-${element.item.marketplaceReference.canonicalId}/${element.item.source}`;
447
507
  }
508
+ if (element.type === "remote-item") {
509
+ return element.item.itemKey ?? `remote-${element.item.groupKey ?? "default"}-${( element.item.uri.toString())}`;
510
+ }
448
511
  return ( element.item.plugin.uri.toString());
449
512
  }
450
513
  }
451
- }
452
- ));
514
+ })
515
+ );
453
516
  this._register(this.list.onDidOpen(e => {
454
517
  if (e.element) {
455
518
  if (e.element.type === "group-header") {
456
519
  this.toggleGroup(e.element);
457
520
  } else if (e.element.type === "plugin-item") {
458
521
  this._onDidSelectPlugin.fire(e.element.item);
459
- } else if (e.element.type === "marketplace-item") {
522
+ } else if (e.element.type === "remote-item")
523
+ ; else if (e.element.type === "marketplace-item") {
460
524
  this._onDidSelectPlugin.fire(e.element.item);
461
525
  }
462
526
  }
@@ -468,34 +532,36 @@ let PluginListWidget = class PluginListWidget extends Disposable {
468
532
  plugin.enablement.read(reader);
469
533
  }
470
534
  if (!this.browseMode) {
471
- this.refresh();
535
+ void this.refresh();
472
536
  }
473
537
  }));
474
538
  this._register(this.pluginMarketplaceService.onDidChangeMarketplaces(() => {
475
539
  if (!this.browseMode) {
476
- this.refresh();
540
+ void this.refresh();
477
541
  }
478
542
  }));
479
543
  this._register(autorun(reader => {
480
544
  this.harnessService.activeHarness.read(reader);
545
+ this.updateToolbarActions();
481
546
  if (!this.browseMode) {
482
- this.refresh();
547
+ void this.refresh();
483
548
  }
484
549
  }));
485
- const syncChangeDisposable = this._register(( new MutableDisposable()));
550
+ const itemProviderChangeDisposable = this._register(( new MutableDisposable()));
486
551
  this._register(autorun(reader => {
487
552
  this.harnessService.activeHarness.read(reader);
488
- const syncProvider = this.harnessService.getActiveDescriptor().syncProvider;
489
- if (syncProvider) {
490
- syncChangeDisposable.value = syncProvider.onDidChange(() => {
553
+ const itemProvider = this.harnessService.getActiveDescriptor().itemProvider;
554
+ if (itemProvider) {
555
+ itemProviderChangeDisposable.value = itemProvider.onDidChange(() => {
491
556
  if (!this.browseMode) {
492
- this.refresh();
557
+ void this.refresh();
493
558
  }
494
559
  });
495
560
  } else {
496
- syncChangeDisposable.clear();
561
+ itemProviderChangeDisposable.clear();
497
562
  }
498
563
  }));
564
+ this.updateToolbarActions();
499
565
  void this.refresh();
500
566
  }
501
567
  async refresh() {
@@ -518,13 +584,13 @@ let PluginListWidget = class PluginListWidget extends Disposable {
518
584
  this.disabledLinkListener.clear();
519
585
  if (policyLocked) {
520
586
  this.disabledMessage.textContent = ( localize(
521
- 5553,
587
+ 5655,
522
588
  "Plugin integration in chat is disabled by your organization. Contact your organization administrator for more information."
523
589
  ));
524
590
  } else {
525
- this.disabledMessage.appendChild(createTextNode(( localize(5554, "Plugins are disabled in settings. "))));
591
+ this.disabledMessage.appendChild(createTextNode(( localize(5656, "Plugins are disabled in settings. "))));
526
592
  const link = append(this.disabledMessage, $("a.mcp-disabled-settings-link"));
527
- link.textContent = ( localize(5555, "Configure in settings."));
593
+ link.textContent = ( localize(5657, "Configure in settings."));
528
594
  link.href = "#";
529
595
  link.setAttribute("role", "button");
530
596
  this.disabledLinkListener.value = addDisposableListener(link, "click", e => {
@@ -534,7 +600,103 @@ let PluginListWidget = class PluginListWidget extends Disposable {
534
600
  }
535
601
  }
536
602
  }
603
+ get pluginActions() {
604
+ return this.harnessService.getActiveDescriptor().pluginActions ?? [];
605
+ }
606
+ formatActionLabel(action, iconOnly = false) {
607
+ if (!action.icon) {
608
+ return action.label;
609
+ }
610
+ return iconOnly ? `$(${action.icon.id})` : `$(${action.icon.id}) ${action.label}`;
611
+ }
612
+ updateToolbarActions() {
613
+ const browseMarketplaceAvailable = this.isBrowseMarketplaceAvailable();
614
+ if (!browseMarketplaceAvailable && this.browseMode) {
615
+ this.toggleBrowseMode(false);
616
+ }
617
+ this.browseButton.element.parentElement.style.display = this.browseMode ? "none" : "";
618
+ this.browseButton.label = `$(${Codicon.library.id}) ${( localize(5642, "Browse Marketplace"))}`;
619
+ this.browseButton.enabled = browseMarketplaceAvailable;
620
+ const browseTitle = browseMarketplaceAvailable ? ( localize(5642, "Browse Marketplace")) : ( localize(5658, "Browse Marketplace is not available in VS Code for the Web."));
621
+ this.browseButton.setTitle(browseTitle);
622
+ this.browseButton.element.setAttribute("aria-label", browseTitle);
623
+ this.updateAddButton();
624
+ this.createPluginButton.enabled = true;
625
+ }
626
+ isBrowseMarketplaceAvailable() {
627
+ return !isWeb;
628
+ }
629
+ updateAddButton() {
630
+ const actions = this.buildAddActions();
631
+ const [primary, ...dropdown] = actions;
632
+ const hasDropdown = dropdown.length > 0;
633
+ this.addButton.element.style.display = hasDropdown ? "" : "none";
634
+ this.addButtonSimple.element.style.display = hasDropdown ? "none" : "";
635
+ if (!primary) {
636
+ this.addButton.element.style.display = "none";
637
+ this.addButtonSimple.element.style.display = "none";
638
+ return;
639
+ }
640
+ if (hasDropdown) {
641
+ this.addButton.label = this.formatActionLabel(primary);
642
+ this.addButton.enabled = primary.enabled !== false;
643
+ const addPrimaryTitle = primary.tooltip ?? primary.label;
644
+ this.addButton.primaryButton.setTitle(addPrimaryTitle);
645
+ this.addButton.primaryButton.element.setAttribute("aria-label", addPrimaryTitle);
646
+ const moreLabel = ( localize(5659, "More Plugin Add Actions..."));
647
+ this.addButton.dropdownButton.setTitle(moreLabel);
648
+ this.addButton.dropdownButton.element.setAttribute("aria-label", moreLabel);
649
+ } else {
650
+ this.addButtonSimple.label = this.formatActionLabel(primary);
651
+ this.addButtonSimple.enabled = primary.enabled !== false;
652
+ const addSimpleTitle = primary.tooltip ?? primary.label;
653
+ this.addButtonSimple.setTitle(addSimpleTitle);
654
+ this.addButtonSimple.element.setAttribute("aria-label", addSimpleTitle);
655
+ }
656
+ }
657
+ buildAddActions() {
658
+ return [...this.pluginActions, {
659
+ id: "plugin.installFromSource",
660
+ label: ( localize(5660, "Install Plugin from Source")),
661
+ tooltip: ( localize(5660, "Install Plugin from Source")),
662
+ icon: Codicon.add,
663
+ run: () => this.commandService.executeCommand("workbench.action.chat.installPluginFromSource")
664
+ }];
665
+ }
666
+ getAddDropdownActions() {
667
+ this.addDropdownActions.clear();
668
+ return ( this.buildAddActions().slice(1).map((action, index) => this.addDropdownActions.add(( new Action(
669
+ `plugin_add_${index}`,
670
+ this.formatActionLabel(action),
671
+ undefined,
672
+ action.enabled !== false,
673
+ () => this.runPluginAction(action)
674
+ )))));
675
+ }
676
+ async runPrimaryButtonAction() {
677
+ if (!this.isBrowseMarketplaceAvailable()) {
678
+ return;
679
+ }
680
+ this.toggleBrowseMode(!this.browseMode);
681
+ }
682
+ async runPrimaryAddAction() {
683
+ const [primary] = this.buildAddActions();
684
+ if (primary) {
685
+ await this.runPluginAction(primary);
686
+ }
687
+ }
688
+ async runCreatePluginAction() {
689
+ await this.commandService.executeCommand("workbench.action.chat.createPlugin");
690
+ }
691
+ async runPluginAction(action) {
692
+ if (action.enabled !== false) {
693
+ await action.run();
694
+ }
695
+ }
537
696
  showBrowseMarketplace() {
697
+ if (!this.isBrowseMarketplaceAvailable()) {
698
+ return;
699
+ }
538
700
  if (!this.browseMode) {
539
701
  this.toggleBrowseMode(true);
540
702
  }
@@ -543,15 +705,14 @@ let PluginListWidget = class PluginListWidget extends Disposable {
543
705
  this.browseMode = browse;
544
706
  this.searchInput.value = "";
545
707
  this.searchQuery = "";
546
- this.backLink.style.display = browse ? "" : "none";
547
708
  this.browseButton.element.parentElement.style.display = browse ? "none" : "";
548
- this.searchInput.setPlaceHolder(browse ? ( localize(5556, "Search plugin marketplace...")) : ( localize(5538, "Type to search...")));
709
+ this.searchInput.setPlaceHolder(browse ? ( localize(5661, "Search plugin marketplace...")) : ( localize(5641, "Type to search...")));
549
710
  if (browse) {
550
711
  void this.queryMarketplace();
551
712
  } else {
552
713
  this.marketplaceCts?.dispose(true);
553
714
  this.marketplaceItems = [];
554
- this.filterPlugins();
715
+ void this.filterPlugins();
555
716
  }
556
717
  if (this.lastHeight > 0) {
557
718
  this.layout(this.lastHeight, this.lastWidth);
@@ -562,7 +723,7 @@ let PluginListWidget = class PluginListWidget extends Disposable {
562
723
  const cts = this.marketplaceCts = ( new CancellationTokenSource());
563
724
  this.emptyContainer.style.display = "flex";
564
725
  this.listContainer.style.display = "none";
565
- this.emptyText.textContent = ( localize(5557, "Loading marketplace..."));
726
+ this.emptyText.textContent = ( localize(5662, "Loading marketplace..."));
566
727
  this.emptySubtext.textContent = "";
567
728
  try {
568
729
  const plugins = await this.pluginMarketplaceService.fetchMarketplacePlugins(cts.token);
@@ -584,8 +745,8 @@ let PluginListWidget = class PluginListWidget extends Disposable {
584
745
  this.marketplaceItems = [];
585
746
  this.emptyContainer.style.display = "flex";
586
747
  this.listContainer.style.display = "none";
587
- this.emptyText.textContent = ( localize(5558, "Unable to load marketplace"));
588
- this.emptySubtext.textContent = ( localize(5559, "Check your connection and try again"));
748
+ this.emptyText.textContent = ( localize(5663, "Unable to load marketplace"));
749
+ this.emptySubtext.textContent = ( localize(5664, "Check your connection and try again"));
589
750
  }
590
751
  }
591
752
  }
@@ -594,10 +755,10 @@ let PluginListWidget = class PluginListWidget extends Disposable {
594
755
  this.emptyContainer.style.display = "flex";
595
756
  this.listContainer.style.display = "none";
596
757
  if (this.searchQuery.trim()) {
597
- this.emptyText.textContent = ( localize(5560, "No plugins match '{0}'", this.searchQuery));
598
- this.emptySubtext.textContent = ( localize(5561, "Try a different search term"));
758
+ this.emptyText.textContent = ( localize(5665, "No plugins match '{0}'", this.searchQuery));
759
+ this.emptySubtext.textContent = ( localize(5666, "Try a different search term"));
599
760
  } else {
600
- this.emptyText.textContent = ( localize(5562, "No plugins available"));
761
+ this.emptyText.textContent = ( localize(5667, "No plugins available"));
601
762
  this.emptySubtext.textContent = "";
602
763
  }
603
764
  } else {
@@ -610,21 +771,73 @@ let PluginListWidget = class PluginListWidget extends Disposable {
610
771
  })));
611
772
  this.list.splice(0, this.list.length, entries);
612
773
  }
613
- filterPlugins() {
774
+ async getRemotePluginItems(query) {
775
+ const provider = this.harnessService.getActiveDescriptor().itemProvider;
776
+ if (!provider) {
777
+ return [];
778
+ }
779
+ try {
780
+ const provided = (await provider.provideChatSessionCustomizations(CancellationToken.None)) ?? [];
781
+ return provided.filter(
782
+ item => isPluginCustomizationItem(item) && (!query || item.name.toLowerCase().includes(query) || item.description?.toLowerCase().includes(query) || item.badge?.toLowerCase().includes(query))
783
+ );
784
+ } catch {
785
+ return [];
786
+ }
787
+ }
788
+ getRemoteGroupMetadata(groupKey) {
789
+ return {
790
+ group: groupKey ?? "remote-host",
791
+ label: ( localize(5668, "Remote")),
792
+ description: ( localize(
793
+ 5669,
794
+ "Plugins configured directly on the remote agent host and available without local sync."
795
+ ))
796
+ };
797
+ }
798
+ appendGroup(entries, header, items, isFirst) {
799
+ if (items.length === 0) {
800
+ return isFirst;
801
+ }
802
+ const collapsed = ( this.collapsedGroups.has(header.group));
803
+ entries.push({
804
+ type: "group-header",
805
+ id: `plugin-group-${header.group}`,
806
+ group: header.group,
807
+ label: header.label,
808
+ icon: pluginIcon,
809
+ count: items.length,
810
+ isFirst,
811
+ description: header.description,
812
+ collapsed
813
+ });
814
+ if (!collapsed) {
815
+ entries.push(...items);
816
+ }
817
+ return false;
818
+ }
819
+ async filterPlugins() {
614
820
  const query = this.searchQuery.toLowerCase().trim();
615
821
  const allPlugins = this.agentPluginService.plugins.get();
822
+ this.remoteItems = [...(await this.getRemotePluginItems(query))];
616
823
  this.installedItems = ( allPlugins.map(p => installedPluginToItem(p, this.labelService))).filter(
617
824
  item => !query || item.name.toLowerCase().includes(query) || item.description.toLowerCase().includes(query)
618
825
  );
619
- if (this.installedItems.length === 0) {
826
+ if (this.remoteItems.length === 0 && this.installedItems.length === 0) {
620
827
  this.emptyContainer.style.display = "flex";
621
828
  this.listContainer.style.display = "none";
622
829
  if (this.searchQuery.trim()) {
623
- this.emptyText.textContent = ( localize(5563, "No plugins match '{0}'", this.searchQuery));
624
- this.emptySubtext.textContent = ( localize(5561, "Try a different search term"));
830
+ this.emptyText.textContent = ( localize(5670, "No plugins match '{0}'", this.searchQuery));
831
+ this.emptySubtext.textContent = ( localize(5666, "Try a different search term"));
832
+ } else if (this.harnessService.getActiveDescriptor().itemProvider) {
833
+ this.emptyText.textContent = ( localize(5671, "No plugins configured"));
834
+ this.emptySubtext.textContent = ( localize(
835
+ 5672,
836
+ "Use the toolbar to add remote plugins or install plugins from a source."
837
+ ));
625
838
  } else {
626
- this.emptyText.textContent = ( localize(5564, "No plugins installed"));
627
- this.emptySubtext.textContent = ( localize(5565, "Browse the marketplace to discover and install plugins"));
839
+ this.emptyText.textContent = ( localize(5673, "No plugins installed"));
840
+ this.emptySubtext.textContent = ( localize(5674, "Browse the marketplace to discover and install plugins"));
628
841
  }
629
842
  } else {
630
843
  this.emptyContainer.style.display = "none";
@@ -634,63 +847,68 @@ let PluginListWidget = class PluginListWidget extends Disposable {
634
847
  const disabledPlugins = this.installedItems.filter(item => !isContributionEnabled(item.plugin.enablement.get()));
635
848
  const entries = [];
636
849
  let isFirst = true;
850
+ const installedNames = ( new Set(( this.installedItems.map(item => item.name.toLowerCase()))));
851
+ const remoteGroups = ( new Map());
852
+ for (const item of this.remoteItems) {
853
+ const key = item.groupKey ?? "remote-host";
854
+ if (key === "remote-client") {
855
+ continue;
856
+ }
857
+ if (item.name && ( installedNames.has(item.name.toLowerCase()))) {
858
+ continue;
859
+ }
860
+ let group = remoteGroups.get(key);
861
+ if (!group) {
862
+ group = [];
863
+ remoteGroups.set(key, group);
864
+ }
865
+ group.push({
866
+ type: "remote-item",
867
+ item
868
+ });
869
+ }
870
+ for (const [groupKey, items] of remoteGroups) {
871
+ isFirst = this.appendGroup(entries, this.getRemoteGroupMetadata(groupKey), items, isFirst);
872
+ }
637
873
  if (enabledPlugins.length > 0) {
638
- const collapsed = ( this.collapsedGroups.has("enabled"));
639
- entries.push({
640
- type: "group-header",
641
- id: "plugin-group-enabled",
874
+ isFirst = this.appendGroup(entries, {
642
875
  group: "enabled",
643
- label: ( localize(5566, "Enabled")),
644
- icon: pluginIcon,
645
- count: enabledPlugins.length,
646
- isFirst,
876
+ label: ( localize(5675, "Enabled Locally")),
647
877
  description: ( localize(
648
- 5567,
649
- "Plugins that are currently active and providing commands, skills, agents, and other capabilities."
650
- )),
651
- collapsed
652
- });
653
- if (!collapsed) {
654
- for (const item of enabledPlugins) {
655
- entries.push({
656
- type: "plugin-item",
657
- item
658
- });
659
- }
660
- }
661
- isFirst = false;
878
+ 5676,
879
+ "Plugins installed in this client and available for syncing to the remote session."
880
+ ))
881
+ }, ( enabledPlugins.map(item => ({
882
+ type: "plugin-item",
883
+ item
884
+ }))), isFirst);
662
885
  }
663
886
  if (disabledPlugins.length > 0) {
664
- const collapsed = ( this.collapsedGroups.has("disabled"));
665
- entries.push({
666
- type: "group-header",
667
- id: "plugin-group-disabled",
887
+ this.appendGroup(entries, {
668
888
  group: "disabled",
669
- label: ( localize(5568, "Disabled")),
670
- icon: pluginIcon,
671
- count: disabledPlugins.length,
672
- isFirst,
673
- description: ( localize(
674
- 5569,
675
- "Plugins that are installed but currently disabled. Enable them to use their capabilities."
676
- )),
677
- collapsed
678
- });
679
- if (!collapsed) {
680
- for (const item of disabledPlugins) {
681
- entries.push({
682
- type: "plugin-item",
683
- item
684
- });
685
- }
686
- }
889
+ label: ( localize(5677, "Disabled Locally")),
890
+ description: ( localize(5678, "Plugins installed in this client but currently disabled."))
891
+ }, ( disabledPlugins.map(item => ({
892
+ type: "plugin-item",
893
+ item
894
+ }))), isFirst);
687
895
  }
688
896
  this.displayEntries = entries;
689
897
  this.list.splice(0, this.list.length, this.displayEntries);
690
898
  this._onDidChangeItemCount.fire(this.itemCount);
691
899
  }
692
900
  get itemCount() {
693
- return this.installedItems.length;
901
+ const installedNames = ( new Set(( this.installedItems.map(item => item.name.toLowerCase()))));
902
+ const uniqueRemote = this.remoteItems.filter(item => {
903
+ if (item.groupKey === "remote-client") {
904
+ return false;
905
+ }
906
+ if (item.name && ( installedNames.has(item.name.toLowerCase()))) {
907
+ return false;
908
+ }
909
+ return true;
910
+ });
911
+ return uniqueRemote.length + this.installedItems.length;
694
912
  }
695
913
  fireItemCount() {
696
914
  this._onDidChangeItemCount.fire(this.itemCount);
@@ -701,23 +919,37 @@ let PluginListWidget = class PluginListWidget extends Disposable {
701
919
  } else {
702
920
  this.collapsedGroups.add(entry.group);
703
921
  }
704
- this.filterPlugins();
922
+ void this.filterPlugins();
705
923
  }
706
924
  prependToSearchRow(element) {
707
925
  this.searchAndButtonContainer.insertBefore(element, this.searchAndButtonContainer.firstChild);
708
926
  }
927
+ isInBrowseMode() {
928
+ return this.browseMode;
929
+ }
930
+ exitBrowseMode() {
931
+ if (this.browseMode) {
932
+ this.toggleBrowseMode(false);
933
+ }
934
+ }
709
935
  layout(height, width) {
710
936
  this.lastHeight = height;
711
937
  this.lastWidth = width;
712
938
  this.element.style.height = `${height}px`;
713
939
  const searchBarHeight = this.searchAndButtonContainer.offsetHeight;
714
- if (searchBarHeight === 0) {
715
- getWindow(this.element).requestAnimationFrame(() => this.layout(this.lastHeight, this.lastWidth));
940
+ if (searchBarHeight === 0 && !this._layoutDeferred) {
941
+ this._layoutDeferred = true;
942
+ getWindow(this.element).requestAnimationFrame(() => {
943
+ try {
944
+ this.layout(this.lastHeight, this.lastWidth);
945
+ } finally {
946
+ this._layoutDeferred = false;
947
+ }
948
+ });
716
949
  return;
717
950
  }
718
951
  const footerHeight = this.sectionHeader.offsetHeight;
719
- const backLinkHeight = this.browseMode ? this.backLink.offsetHeight : 0;
720
- const listHeight = Math.max(0, height - searchBarHeight - footerHeight - backLinkHeight);
952
+ const listHeight = Math.max(0, height - searchBarHeight - footerHeight);
721
953
  this.listContainer.style.height = `${listHeight}px`;
722
954
  this.list.layout(listHeight, width);
723
955
  }
@@ -736,24 +968,37 @@ let PluginListWidget = class PluginListWidget extends Disposable {
736
968
  }
737
969
  }
738
970
  onContextMenu(e) {
739
- if (!e.element || e.element.type !== "plugin-item") {
971
+ if (!e.element || e.element.type === "group-header" || e.element.type === "marketplace-item") {
740
972
  return;
741
973
  }
742
974
  const entry = e.element;
743
975
  const disposables = ( new DisposableStore());
744
- const groups = getInstalledPluginContextMenuActions(entry.item.plugin, this.instantiationService);
745
976
  const actions = [];
746
- for (const menuActions of groups) {
747
- for (const menuAction of menuActions) {
748
- actions.push(menuAction);
749
- if (isDisposable(menuAction)) {
750
- disposables.add(menuAction);
977
+ if (entry.type === "plugin-item") {
978
+ const groups = getInstalledPluginContextMenuActions(entry.item.plugin, this.instantiationService);
979
+ for (const menuActions of groups) {
980
+ for (const menuAction of menuActions) {
981
+ actions.push(menuAction);
982
+ if (isDisposable(menuAction)) {
983
+ disposables.add(menuAction);
984
+ }
751
985
  }
986
+ actions.push(( new Separator()));
987
+ }
988
+ if (actions.length > 0 && actions[actions.length - 1] instanceof Separator) {
989
+ actions.pop();
990
+ }
991
+ } else {
992
+ const itemActions = entry.item.actions ?? [];
993
+ for (const itemAction of itemActions) {
994
+ actions.push(( new Action(
995
+ itemAction.id,
996
+ itemAction.label,
997
+ itemAction.icon ? ThemeIcon.asClassName(itemAction.icon) : undefined,
998
+ itemAction.enabled !== false,
999
+ () => itemAction.run()
1000
+ )));
752
1001
  }
753
- actions.push(( new Separator()));
754
- }
755
- if (actions.length > 0 && actions[actions.length - 1] instanceof Separator) {
756
- actions.pop();
757
1002
  }
758
1003
  this.contextMenuService.showContextMenu({
759
1004
  getAnchor: () => e.anchor,