@codingame/monaco-vscode-chat-service-override 28.4.0 → 29.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 (339) hide show
  1. package/index.js +18 -12
  2. package/package.json +5 -5
  3. package/vscode/src/vs/platform/agentHost/common/agentService.d.ts +300 -0
  4. package/vscode/src/vs/platform/agentHost/common/agentService.js +31 -0
  5. package/vscode/src/vs/platform/agentHost/common/agentService.service.d.ts +84 -0
  6. package/vscode/src/vs/platform/agentHost/common/state/protocol/action-origin.generated.d.ts +16 -0
  7. package/vscode/src/vs/platform/agentHost/common/state/protocol/actions.d.ts +488 -0
  8. package/vscode/src/vs/platform/agentHost/common/state/protocol/commands.d.ts +424 -0
  9. package/vscode/src/vs/platform/agentHost/common/state/protocol/errors.d.ts +50 -0
  10. package/vscode/src/vs/platform/agentHost/common/state/protocol/messages.d.ts +202 -0
  11. package/vscode/src/vs/platform/agentHost/common/state/protocol/notifications.d.ts +114 -0
  12. package/vscode/src/vs/platform/agentHost/common/state/protocol/state.d.ts +723 -0
  13. package/vscode/src/vs/platform/agentHost/common/state/sessionActions.d.ts +33 -0
  14. package/vscode/src/vs/platform/agentHost/common/state/sessionProtocol.d.ts +40 -0
  15. package/vscode/src/vs/platform/agentHost/common/state/sessionState.d.ts +22 -0
  16. package/vscode/src/vs/platform/browserElements/common/browserElements.d.ts +13 -0
  17. package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatAccessibilityService.js +2 -2
  18. package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatResponseAccessibleView.d.ts +2 -2
  19. package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatResponseAccessibleView.js +29 -15
  20. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.js +8 -8
  21. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.js +59 -59
  22. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAgentRecommendationActions.js +1 -1
  23. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.js +12 -12
  24. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.js +8 -8
  25. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.js +3 -3
  26. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatDeveloperActions.js +4 -4
  27. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatFileTreeActions.js +2 -2
  28. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatForkActions.js +76 -10
  29. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatImportExport.js +3 -3
  30. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatLanguageModelActions.js +13 -13
  31. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatMoveActions.js +6 -6
  32. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatNewActions.js +11 -11
  33. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatOpenAgentDebugPanelAction.d.ts +1 -1
  34. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatOpenAgentDebugPanelAction.js +162 -4
  35. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatPluginActions.js +167 -4
  36. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatPromptNavigationActions.js +2 -2
  37. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQueueActions.d.ts +1 -1
  38. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQueueActions.js +52 -20
  39. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQuickInputActions.js +8 -8
  40. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolActions.js +11 -11
  41. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatToolPicker.js +13 -13
  42. package/vscode/src/vs/workbench/contrib/chat/browser/actions/codeBlockOperations.js +19 -19
  43. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginActions.d.ts +82 -0
  44. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginActions.js +195 -0
  45. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditor.d.ts +5 -1
  46. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditor.js +97 -88
  47. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditorInput.js +3 -3
  48. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginItems.d.ts +4 -1
  49. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginRepositoryService.d.ts +5 -3
  50. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginRepositoryService.js +78 -35
  51. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.d.ts +7 -1
  52. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.js +174 -170
  53. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.contribution.js +7 -4
  54. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsActions.d.ts +12 -0
  55. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsActions.js +118 -52
  56. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsPicker.js +7 -7
  57. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsQuickAccess.js +1 -1
  58. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsService.d.ts +5 -1
  59. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsService.js +13 -2
  60. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjection.js +1 -1
  61. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionActions.d.ts +0 -3
  62. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionActions.js +5 -10
  63. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionService.js +1 -1
  64. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionsExperiments.contribution.js +9 -10
  65. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.d.ts +23 -25
  66. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.js +341 -196
  67. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/media/agenttitlebarstatuswidget.css +79 -7
  68. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/unifiedQuickAccess.js +17 -17
  69. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/unifiedQuickAccessActions.js +4 -4
  70. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/localAgentSessionsController.d.ts +5 -4
  71. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/localAgentSessionsController.js +22 -10
  72. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationDebugPanel.d.ts +1 -1
  73. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationDebugPanel.js +2 -2
  74. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationIcons.d.ts +4 -0
  75. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationIcons.js +15 -14
  76. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidget.d.ts +85 -5
  77. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidget.js +668 -214
  78. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidgetUtils.d.ts +10 -0
  79. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidgetUtils.js +18 -0
  80. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.js +306 -39
  81. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.d.ts +84 -4
  82. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.js +651 -81
  83. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditorInput.d.ts +2 -1
  84. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditorInput.js +6 -2
  85. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationWorkspaceService.d.ts +31 -1
  86. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationWorkspaceService.js +9 -20
  87. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationCreatorService.d.ts +11 -1
  88. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationCreatorService.js +7 -142
  89. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationGroupHeaderRenderer.d.ts +43 -0
  90. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationGroupHeaderRenderer.js +63 -0
  91. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationHarnessService.d.ts +11 -0
  92. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationHarnessService.js +44 -0
  93. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.d.ts +25 -1
  94. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.js +297 -123
  95. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/media/aiCustomizationManagement.css +153 -31
  96. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.d.ts +17 -1
  97. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.js +111 -171
  98. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.d.ts +1 -3
  99. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.js +5 -30
  100. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/simpleBrowserEditorOverlay.js +19 -19
  101. package/vscode/src/vs/workbench/contrib/chat/browser/chat.contribution.js +277 -186
  102. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatCustomizationDiscoveryRenderer.d.ts +4 -2
  103. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatCustomizationDiscoveryRenderer.js +31 -23
  104. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCollapsible.d.ts +3 -7
  105. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCollapsible.js +4 -16
  106. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugDetailPanel.d.ts +18 -2
  107. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugDetailPanel.js +112 -17
  108. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.d.ts +3 -3
  109. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.js +16 -27
  110. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditorInput.js +2 -2
  111. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventDetailRenderer.d.ts +1 -1
  112. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventDetailRenderer.js +41 -19
  113. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventList.d.ts +7 -1
  114. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventList.js +35 -23
  115. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFilters.d.ts +1 -8
  116. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFilters.js +8 -51
  117. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowChartView.d.ts +1 -0
  118. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowChartView.js +13 -8
  119. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowGraph.d.ts +1 -1
  120. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowGraph.js +29 -36
  121. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowLayout.js +14 -7
  122. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHomeView.d.ts +5 -1
  123. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHomeView.js +79 -26
  124. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHookContentRenderer.d.ts +19 -0
  125. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHookContentRenderer.js +125 -0
  126. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugLogsView.d.ts +11 -4
  127. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugLogsView.js +113 -82
  128. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugMessageContentRenderer.d.ts +18 -7
  129. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugMessageContentRenderer.js +54 -15
  130. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugModelTurnContentRenderer.d.ts +8 -3
  131. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugModelTurnContentRenderer.js +103 -28
  132. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugOverviewView.d.ts +2 -0
  133. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugOverviewView.js +48 -37
  134. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugToolCallContentRenderer.d.ts +28 -2
  135. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugToolCallContentRenderer.js +62 -20
  136. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/media/chatDebug.css +21 -37
  137. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingCodeEditorIntegration.js +1 -1
  138. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingDeletedFileEntry.js +2 -1
  139. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationModelManager.js +3 -3
  140. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedDocumentEntry.js +4 -3
  141. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.d.ts +1 -1
  142. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.js +1 -1
  143. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.d.ts +1 -0
  144. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.js +17 -4
  145. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl.js +5 -5
  146. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingSession.d.ts +4 -1
  147. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingSession.js +43 -5
  148. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/notebook/chatEditingNotebookEditorIntegration.js +1 -1
  149. package/vscode/src/vs/workbench/contrib/chat/browser/chatImageCarouselService.d.ts +59 -0
  150. package/vscode/src/vs/workbench/contrib/chat/browser/chatImageCarouselService.js +194 -0
  151. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagement.contribution.js +9 -10
  152. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagementEditor.js +13 -13
  153. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagementEditorInput.d.ts +2 -1
  154. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagementEditorInput.js +8 -4
  155. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsViewModel.js +2 -2
  156. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.d.ts +11 -0
  157. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.js +81 -50
  158. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatUsageWidget.js +11 -11
  159. package/vscode/src/vs/workbench/contrib/chat/browser/chatOutputItemRenderer.js +4 -4
  160. package/vscode/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.js +32 -32
  161. package/vscode/src/vs/workbench/contrib/chat/browser/chatRepoInfo.js +2 -2
  162. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetup.js +1 -1
  163. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.js +23 -18
  164. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupController.js +10 -10
  165. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupGrowthSession.d.ts +2 -2
  166. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupGrowthSession.js +9 -7
  167. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupProviders.js +29 -26
  168. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.d.ts +0 -2
  169. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.js +19 -27
  170. package/vscode/src/vs/workbench/contrib/chat/browser/chatSlashCommands.d.ts +2 -4
  171. package/vscode/src/vs/workbench/contrib/chat/browser/chatSlashCommands.js +105 -172
  172. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.d.ts +1 -0
  173. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.js +80 -65
  174. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.js +12 -12
  175. package/vscode/src/vs/workbench/contrib/chat/browser/chatTipCatalog.js +56 -27
  176. package/vscode/src/vs/workbench/contrib/chat/browser/chatTipService.js +1 -1
  177. package/vscode/src/vs/workbench/contrib/chat/browser/chatWindowNotifier.js +4 -4
  178. package/vscode/src/vs/workbench/contrib/chat/browser/claudePluginRecommendations.d.ts +16 -0
  179. package/vscode/src/vs/workbench/contrib/chat/browser/claudePluginRecommendations.js +70 -0
  180. package/vscode/src/vs/workbench/contrib/chat/browser/defaultModelContribution.js +4 -4
  181. package/vscode/src/vs/workbench/contrib/chat/browser/enablementActions.d.ts +20 -0
  182. package/vscode/src/vs/workbench/contrib/chat/browser/enablementActions.js +40 -0
  183. package/vscode/src/vs/workbench/contrib/chat/browser/enablementStatusWidget.d.ts +31 -0
  184. package/vscode/src/vs/workbench/contrib/chat/browser/enablementStatusWidget.js +53 -0
  185. package/vscode/src/vs/workbench/contrib/chat/browser/languageModelsConfigurationService.js +33 -2
  186. package/vscode/src/vs/workbench/contrib/chat/browser/pluginInstallService.d.ts +21 -2
  187. package/vscode/src/vs/workbench/contrib/chat/browser/pluginInstallService.js +362 -18
  188. package/vscode/src/vs/workbench/contrib/chat/browser/pluginSources.d.ts +15 -4
  189. package/vscode/src/vs/workbench/contrib/chat/browser/pluginSources.js +90 -43
  190. package/vscode/src/vs/workbench/contrib/chat/browser/pluginUrlHandler.d.ts +35 -0
  191. package/vscode/src/vs/workbench/contrib/chat/browser/pluginUrlHandler.js +146 -0
  192. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/chatModeActions.js +6 -6
  193. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookActions.js +26 -26
  194. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookUtils.js +3 -3
  195. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptCodingAgentActionOverlay.js +2 -2
  196. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptToolsCodeLensProvider.js +2 -2
  197. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptUrlHandler.js +10 -9
  198. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/runPromptAction.js +7 -7
  199. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/saveAsPromptFileActions.js +3 -3
  200. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/skillActions.js +3 -3
  201. package/vscode/src/vs/workbench/contrib/chat/browser/promptsDebugContribution.d.ts +1 -1
  202. package/vscode/src/vs/workbench/contrib/chat/browser/promptsDebugContribution.js +33 -5
  203. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsConfirmationService.d.ts +3 -0
  204. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsConfirmationService.js +200 -55
  205. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.d.ts +7 -0
  206. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.js +90 -45
  207. package/vscode/src/vs/workbench/contrib/chat/browser/tools/renameTool.d.ts +4 -2
  208. package/vscode/src/vs/workbench/contrib/chat/browser/tools/renameTool.js +21 -10
  209. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolSetsContribution.js +22 -16
  210. package/vscode/src/vs/workbench/contrib/chat/browser/tools/usagesTool.d.ts +4 -2
  211. package/vscode/src/vs/workbench/contrib/chat/browser/tools/usagesTool.js +28 -13
  212. package/vscode/src/vs/workbench/contrib/chat/browser/viewsWelcome/chatViewsWelcomeHandler.js +5 -5
  213. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatQueuePickerActionItem.js +9 -9
  214. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatStatusWidget.js +6 -6
  215. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletions.js +20 -16
  216. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputEditorContrib.js +68 -5
  217. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputEditorHover.js +1 -1
  218. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/chatQuick.js +1 -1
  219. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/editor/chatEditor.js +1 -1
  220. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewPane.d.ts +1 -0
  221. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewPane.js +57 -20
  222. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewTitleControl.js +2 -2
  223. package/vscode/src/vs/workbench/contrib/chat/common/chatDebugServiceImpl.d.ts +21 -5
  224. package/vscode/src/vs/workbench/contrib/chat/common/chatDebugServiceImpl.js +171 -57
  225. package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.d.ts +7 -5
  226. package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.js +206 -35
  227. package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionOperationLog.js +4 -3
  228. package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionStore.js +7 -7
  229. package/vscode/src/vs/workbench/contrib/chat/common/participants/chatSlashCommands.d.ts +7 -1
  230. package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.d.ts +11 -3
  231. package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.d.ts +44 -22
  232. package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.js +450 -301
  233. package/vscode/src/vs/workbench/contrib/chat/common/plugins/marketplaceReference.d.ts +23 -0
  234. package/vscode/src/vs/workbench/contrib/chat/common/plugins/marketplaceReference.js +165 -0
  235. package/vscode/src/vs/workbench/contrib/chat/common/plugins/pluginMarketplaceService.d.ts +34 -20
  236. package/vscode/src/vs/workbench/contrib/chat/common/plugins/pluginMarketplaceService.js +209 -144
  237. package/vscode/src/vs/workbench/contrib/chat/common/plugins/workspacePluginSettingsService.d.ts +20 -0
  238. package/vscode/src/vs/workbench/contrib/chat/common/plugins/workspacePluginSettingsService.js +205 -0
  239. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/chatPromptFilesContribution.js +17 -17
  240. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/internalCustomizations/internalCustomizations.d.ts +33 -0
  241. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/internalCustomizations/internalCustomizations.js +47 -0
  242. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/internalCustomizations/internalSkill.d.ts +30 -0
  243. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptCodeActions.js +5 -5
  244. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHeaderAutocompletion.js +5 -5
  245. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHovers.js +12 -12
  246. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.d.ts +1 -1
  247. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.js +191 -159
  248. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.d.ts +6 -7
  249. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.js +210 -233
  250. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.d.ts +19 -26
  251. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.js +183 -193
  252. package/vscode/src/vs/workbench/contrib/chat/common/tools/chatArtifactsService.d.ts +24 -0
  253. package/vscode/src/vs/workbench/contrib/chat/common/tools/chatArtifactsService.js +75 -0
  254. package/vscode/src/vs/workbench/contrib/chat/common/voiceChatService.js +1 -1
  255. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.js +8 -5
  256. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.d.ts +8 -0
  257. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.js +97 -35
  258. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatDefaultModel.js +2 -2
  259. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatHistoryService.d.ts +16 -0
  260. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatHistoryService.js +67 -0
  261. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.d.ts +2 -2
  262. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.js +62 -23
  263. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpPromptArgumentPick.js +14 -14
  264. package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/chat/notebookChatUtils.js +1 -1
  265. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.js +10 -10
  266. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.js +5 -5
  267. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext.js +1 -1
  268. package/vscode/src/vs/workbench/contrib/remoteCodingAgents/browser/remoteCodingAgents.contribution.js +8 -8
  269. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatAccessibilityHelp.js +16 -16
  270. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.js +20 -20
  271. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.js +2 -2
  272. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/basicExecuteStrategy.d.ts +3 -1
  273. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/basicExecuteStrategy.js +23 -9
  274. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/executeStrategy.d.ts +1 -1
  275. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/executeStrategy.js +2 -2
  276. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/noneExecuteStrategy.d.ts +3 -1
  277. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/noneExecuteStrategy.js +50 -9
  278. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/richExecuteStrategy.d.ts +3 -1
  279. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/richExecuteStrategy.js +21 -7
  280. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/strategyHelpers.d.ts +20 -1
  281. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/executeStrategy/strategyHelpers.js +124 -1
  282. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/outputHelpers.js +20 -5
  283. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/runInTerminalHelpers.d.ts +5 -0
  284. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/runInTerminalHelpers.js +10 -7
  285. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/taskHelpers.d.ts +2 -1
  286. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/taskHelpers.js +46 -31
  287. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/terminal.chatAgentTools.contribution.d.ts +18 -1
  288. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/terminal.chatAgentTools.contribution.js +74 -37
  289. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/awaitTerminalTool.js +3 -3
  290. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/autoApprove/npmScriptAutoApprover.js +1 -1
  291. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineAnalyzer.d.ts +1 -0
  292. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineAutoApproveAnalyzer.js +24 -14
  293. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineFileWriteAnalyzer.js +2 -2
  294. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineAnalyzer/commandLineSandboxAnalyzer.js +1 -1
  295. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLinePresenter/sandboxedCommandLinePresenter.d.ts +3 -2
  296. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLinePresenter/sandboxedCommandLinePresenter.js +1 -1
  297. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLineRewriter.d.ts +2 -0
  298. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/commandLineRewriter/commandLineSandboxRewriter.js +5 -1
  299. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalLastCommandTool.js +3 -3
  300. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalOutputTool.js +3 -3
  301. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalSelectionTool.js +3 -3
  302. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/killTerminalTool.js +3 -3
  303. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/outputMonitor.d.ts +1 -2
  304. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/monitoring/outputMonitor.js +66 -64
  305. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/outputAnalyzer.d.ts +1 -0
  306. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalConfirmationTool.d.ts +1 -0
  307. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalConfirmationTool.js +5 -2
  308. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalTool.d.ts +32 -2
  309. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalTool.js +390 -114
  310. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/sandboxOutputAnalyzer.d.ts +14 -0
  311. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/sandboxOutputAnalyzer.js +21 -11
  312. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/createAndRunTaskTool.js +70 -51
  313. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/getTaskOutputTool.js +61 -51
  314. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/runTaskTool.js +94 -76
  315. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/taskHelpers.js +1 -1
  316. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/common/terminalSandboxService.d.ts +19 -1
  317. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/common/terminalSandboxService.js +112 -21
  318. package/vscode/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackService.d.ts +0 -53
  319. package/vscode/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackService.js +0 -219
  320. package/vscode/src/vs/sessions/contrib/chat/browser/aiCustomizationWorkspaceService.d.ts +0 -89
  321. package/vscode/src/vs/sessions/contrib/chat/browser/aiCustomizationWorkspaceService.js +0 -251
  322. package/vscode/src/vs/sessions/contrib/chat/browser/newSession.d.ts +0 -123
  323. package/vscode/src/vs/sessions/contrib/chat/browser/newSession.js +0 -278
  324. package/vscode/src/vs/sessions/contrib/chat/browser/sessionsConfigurationService.d.ts +0 -76
  325. package/vscode/src/vs/sessions/contrib/chat/browser/sessionsConfigurationService.js +0 -299
  326. package/vscode/src/vs/sessions/contrib/fileTreeView/browser/githubFileSystemProvider.d.ts +0 -67
  327. package/vscode/src/vs/sessions/contrib/fileTreeView/browser/githubFileSystemProvider.js +0 -263
  328. package/vscode/src/vs/sessions/contrib/sessions/browser/sessionsManagementService.d.ts +0 -85
  329. package/vscode/src/vs/sessions/contrib/sessions/browser/sessionsManagementService.js +0 -397
  330. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.d.ts +0 -56
  331. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.js +0 -26
  332. package/vscode/src/vs/workbench/contrib/chat/browser/sessionResourceMatching.d.ts +0 -5
  333. package/vscode/src/vs/workbench/contrib/chat/browser/sessionResourceMatching.js +0 -30
  334. package/vscode/src/vs/workbench/contrib/chat/common/aiCustomizationWorkspaceService.d.ts +0 -40
  335. package/vscode/src/vs/workbench/contrib/chat/common/aiCustomizationWorkspaceService.js +0 -28
  336. package/vscode/src/vs/workbench/contrib/chat/common/chatDebugService.d.ts +0 -190
  337. package/vscode/src/vs/workbench/contrib/chat/common/chatDebugService.js +0 -11
  338. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionService.d.ts +0 -16
  339. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionService.js +0 -20
@@ -3,13 +3,16 @@ import { registerCss } from '@codingame/monaco-vscode-api/css';
3
3
  import { __decorate, __param } from '@codingame/monaco-vscode-api/external/tslib/tslib.es6';
4
4
  import * as aiCustomizationManagement from './media/aiCustomizationManagement.css';
5
5
  import { $ as $$1, append, Dimension, addDisposableListener } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/dom';
6
+ import { RunOnceScheduler } from '@codingame/monaco-vscode-api/vscode/vs/base/common/async';
6
7
  import { CancellationToken } from '@codingame/monaco-vscode-api/vscode/vs/base/common/cancellation';
8
+ import { VSBuffer } from '@codingame/monaco-vscode-api/vscode/vs/base/common/buffer';
9
+ import { onUnexpectedError } from '@codingame/monaco-vscode-api/vscode/vs/base/common/errors';
7
10
  import { DisposableStore, toDisposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
8
- import { Delayer } from '@codingame/monaco-vscode-api/vscode/vs/base/common/async';
9
11
  import { Event } from '@codingame/monaco-vscode-api/vscode/vs/base/common/event';
10
12
  import '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/index';
11
13
  import { SplitView, Sizing } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/splitview/splitview';
12
14
  import { localize } from '@codingame/monaco-vscode-api/vscode/vs/nls';
15
+ import { generateUuid } from '@codingame/monaco-vscode-api/vscode/vs/base/common/uuid';
13
16
  import { StorageScope, StorageTarget } from '@codingame/monaco-vscode-api/vscode/vs/platform/storage/common/storage';
14
17
  import { IStorageService } from '@codingame/monaco-vscode-api/vscode/vs/platform/storage/common/storage.service';
15
18
  import { ITelemetryService } from '@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetry.service';
@@ -21,7 +24,7 @@ import { WorkbenchList } from '@codingame/monaco-vscode-api/vscode/vs/platform/l
21
24
  import { ThemeIcon } from '@codingame/monaco-vscode-api/vscode/vs/base/common/themables';
22
25
  import { Codicon } from '@codingame/monaco-vscode-api/vscode/vs/base/common/codicons';
23
26
  import { IOpenerService } from '@codingame/monaco-vscode-api/vscode/vs/platform/opener/common/opener.service';
24
- import { basename, isEqual } from '@codingame/monaco-vscode-api/vscode/vs/base/common/resources';
27
+ import { basename, isEqualOrParent, isEqual, dirname } from '@codingame/monaco-vscode-api/vscode/vs/base/common/resources';
25
28
  import { URI } from '@codingame/monaco-vscode-api/vscode/vs/base/common/uri';
26
29
  import { registerColor } from '@codingame/monaco-vscode-api/vscode/vs/platform/theme/common/colorUtils';
27
30
  import '@codingame/monaco-vscode-api/vscode/vs/platform/theme/common/colors/baseColors';
@@ -38,39 +41,49 @@ import { PANEL_BORDER } from '@codingame/monaco-vscode-api/vscode/vs/workbench/c
38
41
  import { AICustomizationListWidget } from './aiCustomizationListWidget.js';
39
42
  import { McpListWidget } from './mcpListWidget.js';
40
43
  import { PluginListWidget } from './pluginListWidget.js';
41
- import { AI_CUSTOMIZATION_MANAGEMENT_EDITOR_ID, CONTEXT_AI_CUSTOMIZATION_MANAGEMENT_EDITOR, CONTEXT_AI_CUSTOMIZATION_MANAGEMENT_SECTION, AI_CUSTOMIZATION_MANAGEMENT_SELECTED_SECTION_KEY, AI_CUSTOMIZATION_MANAGEMENT_SIDEBAR_WIDTH_KEY, SIDEBAR_DEFAULT_WIDTH, SIDEBAR_MAX_WIDTH, SIDEBAR_MIN_WIDTH, CONTENT_MIN_WIDTH } from './aiCustomizationManagement.js';
44
+ import { AI_CUSTOMIZATION_MANAGEMENT_EDITOR_ID, CONTEXT_AI_CUSTOMIZATION_MANAGEMENT_EDITOR, CONTEXT_AI_CUSTOMIZATION_MANAGEMENT_SECTION, AI_CUSTOMIZATION_MANAGEMENT_SELECTED_SECTION_KEY, AI_CUSTOMIZATION_MANAGEMENT_SIDEBAR_WIDTH_KEY, SIDEBAR_DEFAULT_WIDTH, SIDEBAR_MAX_WIDTH, SIDEBAR_MIN_WIDTH, CONTENT_MIN_WIDTH } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement';
42
45
  import { pluginIcon, hookIcon, promptIcon, instructionsIcon, skillIcon, agentIcon } from './aiCustomizationIcons.js';
43
46
  import { ChatModelsWidget } from '../chatManagement/chatModelsWidget.js';
44
47
  import { PromptsType, Target } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/promptTypes';
45
48
  import { PromptsStorage } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/service/promptsService';
46
49
  import { IPromptsService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/service/promptsService.service';
50
+ import { AGENT_MD_FILENAME } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/config/promptFileLocations';
47
51
  import { NEW_SKILL_COMMAND_ID, NEW_AGENT_COMMAND_ID, NEW_INSTRUCTIONS_COMMAND_ID, NEW_PROMPT_COMMAND_ID } from '@codingame/monaco-vscode-xterm-addons-common/vscode/vs/workbench/contrib/chat/browser/promptSyntax/newPromptFileActions';
48
52
  import { showConfigureHooksQuickPick } from '../promptSyntax/hookActions.js';
49
53
  import { resolveWorkspaceTargetDirectory, resolveUserTargetDirectory } from './customizationCreatorService.js';
50
54
  import { ICommandService } from '@codingame/monaco-vscode-api/vscode/vs/platform/commands/common/commands.service';
51
55
  import { IAICustomizationWorkspaceService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/aiCustomizationWorkspaceService.service';
52
56
  import { CodeEditorWidget } from '@codingame/monaco-vscode-api/vscode/vs/editor/browser/widget/codeEditor/codeEditorWidget';
57
+ import { createTextBufferFactoryFromSnapshot } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/model/textModel';
58
+ import { IModelService } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/services/model.service';
53
59
  import { ITextModelService } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/services/resolverService.service';
54
60
  import { IConfigurationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service';
55
61
  import { getSimpleEditorOptions } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions';
56
62
  import { IWorkingCopyService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/workingCopy/common/workingCopyService.service';
57
- import { ITextFileService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/textfile/common/textfiles.service';
58
63
  import { IFileDialogService } from '@codingame/monaco-vscode-api/vscode/vs/platform/dialogs/common/dialogs.service';
59
64
  import { IHoverService } from '@codingame/monaco-vscode-api/vscode/vs/platform/hover/browser/hover.service';
65
+ import { IFileService } from '@codingame/monaco-vscode-api/vscode/vs/platform/files/common/files.service';
66
+ import { INotificationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/notification/common/notification.service';
67
+ import { IQuickInputService } from '@codingame/monaco-vscode-api/vscode/vs/platform/quickinput/common/quickInput.service';
68
+ import { IContextMenuService } from '@codingame/monaco-vscode-api/vscode/vs/platform/contextview/browser/contextView.service';
69
+ import { Action } from '@codingame/monaco-vscode-api/vscode/vs/base/common/actions';
60
70
  import { McpServerEditorInput } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/browser/mcpServerEditorInput';
61
71
  import { McpServerEditor } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/browser/mcpServerEditor';
62
72
  import { getDefaultHoverDelegate } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/hover/hoverDelegateFactory';
63
73
  import { AgentPluginEditor } from '../agentPluginEditor/agentPluginEditor.js';
64
74
  import { AgentPluginEditorInput } from '../agentPluginEditor/agentPluginEditorInput.js';
65
- import { AICustomizationManagementSection } from '../../common/aiCustomizationWorkspaceService.js';
66
- import { Orientation } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/sash/sash';
75
+ import { CustomizationHarness, matchesWorkspaceSubpath } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/customizationHarnessService';
76
+ import { ICustomizationHarnessService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/customizationHarnessService.service';
77
+ import { ChatConfiguration } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/constants';
78
+ import { AICustomizationManagementSection, BUILTIN_STORAGE } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/aiCustomizationWorkspaceService';
67
79
  import { autorun } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/reactions/autorun';
80
+ import { Orientation } from '@codingame/monaco-vscode-api/vscode/vs/base/browser/ui/sash/sash';
68
81
 
69
82
  var AICustomizationManagementEditor_1;
70
83
  registerCss(aiCustomizationManagement);
71
84
  const $ = $$1;
72
85
  const aiCustomizationManagementSashBorder = registerColor("aiCustomizationManagement.sashBorder", PANEL_BORDER, ( localize(
73
- 5294,
86
+ 5361,
74
87
  "The color of the Chat Customization Management editor splitview sash border."
75
88
  )));
76
89
  class SectionItemDelegate {
@@ -89,16 +102,25 @@ class SectionItemRenderer {
89
102
  container.classList.add("section-list-item");
90
103
  const icon = append(container, $(".section-icon"));
91
104
  const label = append(container, $(".section-label"));
105
+ const count = append(container, $(".section-count"));
92
106
  return {
93
107
  container,
94
108
  icon,
95
- label
109
+ label,
110
+ count
96
111
  };
97
112
  }
98
113
  renderElement(element, index, templateData) {
99
114
  templateData.icon.className = "section-icon";
100
115
  templateData.icon.classList.add(...ThemeIcon.asClassNameArray(element.icon));
101
116
  templateData.label.textContent = element.label;
117
+ if (element.count > 0) {
118
+ templateData.count.textContent = String(element.count);
119
+ templateData.count.style.display = "";
120
+ } else {
121
+ templateData.count.textContent = "";
122
+ templateData.count.style.display = "none";
123
+ }
102
124
  }
103
125
  disposeTemplate() {}
104
126
  }
@@ -123,9 +145,14 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
123
145
  textModelService,
124
146
  configurationService,
125
147
  workingCopyService,
126
- textFileService,
127
148
  fileDialogService,
128
- hoverService
149
+ hoverService,
150
+ modelService,
151
+ quickInputService,
152
+ contextMenuService,
153
+ fileService,
154
+ notificationService,
155
+ harnessService
129
156
  ) {
130
157
  super(
131
158
  AICustomizationManagementEditor_1.ID,
@@ -143,16 +170,25 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
143
170
  this.textModelService = textModelService;
144
171
  this.configurationService = configurationService;
145
172
  this.workingCopyService = workingCopyService;
146
- this.textFileService = textFileService;
147
173
  this.fileDialogService = fileDialogService;
148
174
  this.hoverService = hoverService;
175
+ this.modelService = modelService;
176
+ this.quickInputService = quickInputService;
177
+ this.contextMenuService = contextMenuService;
178
+ this.fileService = fileService;
179
+ this.notificationService = notificationService;
180
+ this.harnessService = harnessService;
181
+ this.editorActionButtonInProgress = false;
149
182
  this.editorModelChangeDisposables = this._register(( new DisposableStore()));
183
+ this.builtinEditingSessions = ( new Map());
150
184
  this.viewMode = "list";
151
185
  this.mcpDetailDisposables = this._register(( new DisposableStore()));
152
186
  this.pluginDetailDisposables = this._register(( new DisposableStore()));
153
187
  this.sections = [];
188
+ this.allSections = [];
154
189
  this.selectedSection = AICustomizationManagementSection.Agents;
155
190
  this.editorDisposables = this._register(( new DisposableStore()));
191
+ this.promptsSectionCountScheduler = this._register(( new RunOnceScheduler(() => this._doRefreshAllPromptsSectionCounts(), 100)));
156
192
  this._editorContentChanged = false;
157
193
  this.inEditorContextKey = CONTEXT_AI_CUSTOMIZATION_MANAGEMENT_EDITOR.bindTo(contextKeyService);
158
194
  this.sectionContextKey = CONTEXT_AI_CUSTOMIZATION_MANAGEMENT_SECTION.bindTo(contextKeyService);
@@ -166,49 +202,52 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
166
202
  this.currentModelRef?.dispose();
167
203
  this.currentModelRef = undefined;
168
204
  }));
205
+ this._register(toDisposable(() => this.disposeBuiltinEditingSessions()));
169
206
  const sectionInfo = {
170
207
  [AICustomizationManagementSection.Agents]: {
171
- label: ( localize(5295, "Agents")),
208
+ label: ( localize(5362, "Agents")),
172
209
  icon: agentIcon
173
210
  },
174
211
  [AICustomizationManagementSection.Skills]: {
175
- label: ( localize(5296, "Skills")),
212
+ label: ( localize(5363, "Skills")),
176
213
  icon: skillIcon
177
214
  },
178
215
  [AICustomizationManagementSection.Instructions]: {
179
- label: ( localize(5297, "Instructions")),
216
+ label: ( localize(5364, "Instructions")),
180
217
  icon: instructionsIcon
181
218
  },
182
219
  [AICustomizationManagementSection.Prompts]: {
183
- label: ( localize(5298, "Prompts")),
220
+ label: ( localize(5365, "Prompts")),
184
221
  icon: promptIcon
185
222
  },
186
223
  [AICustomizationManagementSection.Hooks]: {
187
- label: ( localize(5299, "Hooks")),
224
+ label: ( localize(5366, "Hooks")),
188
225
  icon: hookIcon
189
226
  },
190
227
  [AICustomizationManagementSection.McpServers]: {
191
- label: ( localize(5300, "MCP Servers")),
228
+ label: ( localize(5367, "MCP Servers")),
192
229
  icon: Codicon.server
193
230
  },
194
231
  [AICustomizationManagementSection.Plugins]: {
195
- label: ( localize(5301, "Plugins")),
232
+ label: ( localize(5368, "Plugins")),
196
233
  icon: pluginIcon
197
234
  },
198
235
  [AICustomizationManagementSection.Models]: {
199
- label: ( localize(5302, "Models")),
236
+ label: ( localize(5369, "Models")),
200
237
  icon: Codicon.vm
201
238
  }
202
239
  };
203
240
  for (const id of this.workspaceService.managementSections) {
204
241
  const info = sectionInfo[id];
205
242
  if (info) {
206
- this.sections.push({
243
+ this.allSections.push({
207
244
  id,
208
- ...info
245
+ ...info,
246
+ count: 0
209
247
  });
210
248
  }
211
249
  }
250
+ this.rebuildVisibleSections();
212
251
  const savedSection = this.storageService.get(AI_CUSTOMIZATION_MANAGEMENT_SELECTED_SECTION_KEY, StorageScope.PROFILE);
213
252
  if (savedSection && ( this.sections.some(s => s.id === savedSection))) {
214
253
  this.selectedSection = savedSection;
@@ -298,8 +337,36 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
298
337
  this.splitView.resizeView(1, totalWidth - SIDEBAR_DEFAULT_WIDTH);
299
338
  }));
300
339
  }
340
+ get isHarnessSelectorEnabled() {
341
+ return this.configurationService.getValue(ChatConfiguration.ChatCustomizationHarnessSelectorEnabled) !== false;
342
+ }
343
+ rebuildVisibleSections() {
344
+ let hidden;
345
+ if (this.isHarnessSelectorEnabled) {
346
+ const activeId = this.harnessService.activeHarness.get();
347
+ const descriptor = this.harnessService.availableHarnesses.get().find(h => h.id === activeId);
348
+ hidden = ( new Set(descriptor?.hiddenSections ?? []));
349
+ } else {
350
+ hidden = ( new Set());
351
+ }
352
+ this.sections.length = 0;
353
+ for (const s of this.allSections) {
354
+ if (!( hidden.has(s.id))) {
355
+ this.sections.push(s);
356
+ }
357
+ }
358
+ if (this.sectionsList) {
359
+ this.sectionsList.splice(0, this.sectionsList.length, this.sections);
360
+ }
361
+ if (!( this.sections.some(s => s.id === this.selectedSection)) && this.sections.length > 0) {
362
+ this.selectSection(this.sections[0].id);
363
+ } else {
364
+ this.ensureSectionsListReflectsActiveSection();
365
+ }
366
+ }
301
367
  createSidebar() {
302
368
  const sidebarContent = append(this.sidebarContainer, $(".sidebar-content"));
369
+ this.createHarnessDropdown(sidebarContent);
303
370
  const sectionsListContainer = append(sidebarContent, $(".sidebar-sections-list"));
304
371
  this.sectionsList = this.editorDisposables.add(this.instantiationService.createInstance(
305
372
  WorkbenchList,
@@ -313,7 +380,7 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
313
380
  horizontalScrolling: false,
314
381
  accessibilityProvider: {
315
382
  getAriaLabel: item => item.label,
316
- getWidgetAriaLabel: () => ( localize(5303, "Chat Customization Sections"))
383
+ getWidgetAriaLabel: () => ( localize(5370, "Chat Customization Sections"))
317
384
  },
318
385
  openOnSingleClick: true,
319
386
  identityProvider: {
@@ -322,28 +389,100 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
322
389
  }
323
390
  ));
324
391
  this.sectionsList.splice(0, this.sectionsList.length, this.sections);
325
- const selectedIndex = this.sections.findIndex(s => s.id === this.selectedSection);
326
- if (selectedIndex >= 0) {
327
- this.sectionsList.setSelection([selectedIndex]);
328
- }
392
+ this.ensureSectionsListReflectsActiveSection();
329
393
  this.editorDisposables.add(this.sectionsList.onDidChangeSelection(e => {
330
- if (e.elements.length > 0) {
331
- this.selectSection(e.elements[0].id);
394
+ if (e.elements.length === 0) {
395
+ this.ensureSectionsListReflectsActiveSection();
396
+ return;
397
+ }
398
+ this.selectSection(e.elements[0].id);
399
+ }));
400
+ this.editorDisposables.add(autorun(reader => {
401
+ const available = this.harnessService.availableHarnesses.read(reader);
402
+ const activeId = this.harnessService.activeHarness.read(reader);
403
+ if (!( available.some(h => h.id === activeId)) && available.length > 0) {
404
+ this.harnessService.setActiveHarness(available[0].id);
405
+ return;
406
+ }
407
+ this.rebuildVisibleSections();
408
+ this.updateHarnessDropdown();
409
+ this.refreshAllPromptsSectionCounts();
410
+ }));
411
+ if (!this.isHarnessSelectorEnabled) {
412
+ this.harnessService.setActiveHarness(CustomizationHarness.VSCode);
413
+ }
414
+ this.editorDisposables.add(this.configurationService.onDidChangeConfiguration(e => {
415
+ if (e.affectsConfiguration(ChatConfiguration.ChatCustomizationHarnessSelectorEnabled)) {
416
+ if (!this.isHarnessSelectorEnabled) {
417
+ this.harnessService.setActiveHarness(CustomizationHarness.VSCode);
418
+ }
332
419
  }
333
420
  }));
334
421
  if (this.workspaceService.isSessionsWindow) {
335
422
  this.createFolderPicker(sidebarContent);
336
423
  }
337
424
  }
425
+ createHarnessDropdown(sidebarContent) {
426
+ if (!this.isHarnessSelectorEnabled) {
427
+ return;
428
+ }
429
+ const container = this.harnessDropdownContainer = append(sidebarContent, $(".sidebar-harness-dropdown"));
430
+ this.harnessDropdownButton = append(container, $("button.harness-dropdown-button"));
431
+ this.harnessDropdownButton.setAttribute("aria-label", ( localize(5371, "Select customization target")));
432
+ this.harnessDropdownButton.setAttribute("aria-haspopup", "listbox");
433
+ this.harnessDropdownIcon = append(this.harnessDropdownButton, $("span.harness-dropdown-icon"));
434
+ this.harnessDropdownLabel = append(this.harnessDropdownButton, $("span.harness-dropdown-label"));
435
+ append(
436
+ this.harnessDropdownButton,
437
+ $("span.harness-dropdown-chevron.codicon.codicon-chevron-down")
438
+ );
439
+ this.updateHarnessDropdown();
440
+ this.editorDisposables.add(addDisposableListener(this.harnessDropdownButton, "click", () => {
441
+ this.showHarnessMenu();
442
+ }));
443
+ }
444
+ updateHarnessDropdown() {
445
+ if (!this.harnessDropdownContainer || !this.harnessDropdownIcon || !this.harnessDropdownLabel) {
446
+ return;
447
+ }
448
+ const harnesses = this.harnessService.availableHarnesses.get();
449
+ this.harnessDropdownContainer.style.display = harnesses.length <= 1 ? "none" : "";
450
+ const activeId = this.harnessService.activeHarness.get();
451
+ const descriptor = harnesses.find(h => h.id === activeId);
452
+ if (descriptor) {
453
+ this.harnessDropdownIcon.className = "harness-dropdown-icon";
454
+ this.harnessDropdownIcon.classList.add(...ThemeIcon.asClassNameArray(descriptor.icon));
455
+ this.harnessDropdownLabel.textContent = descriptor.label;
456
+ }
457
+ }
458
+ showHarnessMenu() {
459
+ if (!this.harnessDropdownButton) {
460
+ return;
461
+ }
462
+ const harnesses = this.harnessService.availableHarnesses.get();
463
+ const activeId = this.harnessService.activeHarness.get();
464
+ const actions = ( harnesses.map(h => {
465
+ const action = ( new Action(h.id, h.label, ThemeIcon.asClassName(h.icon), true, () => {
466
+ this.harnessService.setActiveHarness(h.id);
467
+ }));
468
+ action.checked = h.id === activeId;
469
+ return action;
470
+ }));
471
+ this.contextMenuService.showContextMenu({
472
+ getAnchor: () => this.harnessDropdownButton,
473
+ getActions: () => actions,
474
+ getCheckedActionsRepresentation: () => "radio"
475
+ });
476
+ }
338
477
  createFolderPicker(sidebarContent) {
339
478
  const footer = this.folderPickerContainer = append(sidebarContent, $(".sidebar-folder-picker"));
340
479
  const button = append(footer, $("button.folder-picker-button"));
341
- button.setAttribute("aria-label", ( localize(5304, "Browse folder")));
480
+ button.setAttribute("aria-label", ( localize(5372, "Browse folder")));
342
481
  const folderIcon = append(button, $(`.codicon.codicon-${Codicon.folder.id}`));
343
482
  folderIcon.classList.add("folder-picker-icon");
344
483
  this.folderPickerLabel = append(button, $("span.folder-picker-label"));
345
484
  this.folderPickerClearButton = append(footer, $("button.folder-picker-clear"));
346
- this.folderPickerClearButton.setAttribute("aria-label", ( localize(5305, "Reset to session folder")));
485
+ this.folderPickerClearButton.setAttribute("aria-label", ( localize(5373, "Reset to session folder")));
347
486
  append(this.folderPickerClearButton, $(`.codicon.codicon-${Codicon.close.id}`));
348
487
  this.editorDisposables.add(addDisposableListener(button, "click", () => {
349
488
  this.browseForFolder();
@@ -365,7 +504,7 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
365
504
  }
366
505
  updateFolderPickerLabel(root, hasOverride) {
367
506
  if (this.folderPickerLabel) {
368
- this.folderPickerLabel.textContent = root ? basename(root) : ( localize(5306, "No folder"));
507
+ this.folderPickerLabel.textContent = root ? basename(root) : ( localize(5374, "No folder"));
369
508
  }
370
509
  if (this.folderPickerClearButton) {
371
510
  this.folderPickerClearButton.style.display = hasOverride ? "" : "none";
@@ -376,7 +515,7 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
376
515
  canSelectFolders: true,
377
516
  canSelectFiles: false,
378
517
  canSelectMany: false,
379
- title: ( localize(5307, "Select Folder to Explore")),
518
+ title: ( localize(5375, "Select Folder to Explore")),
380
519
  defaultUri: this.workspaceService.getActiveProjectRoot()
381
520
  });
382
521
  if (result?.[0]) {
@@ -389,9 +528,21 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
389
528
  this.listWidget = this.editorDisposables.add(this.instantiationService.createInstance(AICustomizationListWidget));
390
529
  this.promptsContentContainer.appendChild(this.listWidget.element);
391
530
  this.editorDisposables.add(this.listWidget.onDidSelectItem(item => {
531
+ this.telemetryService.publicLog2("chatCustomizationEditor.itemSelected", {
532
+ section: this.selectedSection,
533
+ promptType: item.promptType,
534
+ storage: item.storage
535
+ });
392
536
  const isWorkspaceFile = item.storage === PromptsStorage.local;
393
- const isReadOnly = item.storage === PromptsStorage.extension || item.storage === PromptsStorage.plugin;
394
- this.showEmbeddedEditor(item.uri, item.name, isWorkspaceFile, isReadOnly);
537
+ const isReadOnly = item.storage === PromptsStorage.extension || item.storage === PromptsStorage.plugin || item.storage === BUILTIN_STORAGE;
538
+ this.showEmbeddedEditor(
539
+ item.uri,
540
+ item.name,
541
+ item.promptType,
542
+ item.storage,
543
+ isWorkspaceFile,
544
+ isReadOnly
545
+ );
395
546
  }));
396
547
  this.editorDisposables.add(this.listWidget.onDidRequestCreate(promptType => {
397
548
  this.createNewItemWithAI(promptType);
@@ -399,10 +550,11 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
399
550
  this.editorDisposables.add(this.listWidget.onDidRequestCreateManual((
400
551
  {
401
552
  type,
402
- target
553
+ target,
554
+ rootFileName
403
555
  }
404
556
  ) => {
405
- this.createNewItemManual(type, target);
557
+ this.createNewItemManual(type, target, rootFileName);
406
558
  }));
407
559
  const hasSections = ( new Set(this.workspaceService.managementSections));
408
560
  if (( hasSections.has(AICustomizationManagementSection.Models))) {
@@ -412,11 +564,11 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
412
564
  this.modelsFooterElement = append(this.modelsContentContainer, $(".section-footer"));
413
565
  const modelsDescription = append(this.modelsFooterElement, $("p.section-footer-description"));
414
566
  modelsDescription.textContent = ( localize(
415
- 5308,
567
+ 5376,
416
568
  "Browse and manage language models from different providers. Select models for use in chat, code completion, and other AI features."
417
569
  ));
418
570
  const modelsLink = append(this.modelsFooterElement, $("a.section-footer-link"));
419
- modelsLink.textContent = ( localize(5309, "Learn more about language models"));
571
+ modelsLink.textContent = ( localize(5377, "Learn more about language models"));
420
572
  modelsLink.href = "https://code.visualstudio.com/docs/copilot/customization/language-models";
421
573
  this.editorDisposables.add(addDisposableListener(modelsLink, "click", e => {
422
574
  e.preventDefault();
@@ -432,6 +584,9 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
432
584
  this.editorDisposables.add(this.mcpListWidget.onDidSelectServer(server => {
433
585
  this.showEmbeddedMcpDetail(server);
434
586
  }));
587
+ this.editorDisposables.add(this.mcpListWidget.onDidRequestShowPlugin(item => {
588
+ this.showPluginDetail(item);
589
+ }));
435
590
  }
436
591
  if (( hasSections.has(AICustomizationManagementSection.Plugins))) {
437
592
  this.pluginContentContainer = append(contentInner, $(".plugin-content-container"));
@@ -440,12 +595,49 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
440
595
  this.pluginDetailContainer = append(contentInner, $(".plugin-detail-container"));
441
596
  this.createEmbeddedPluginDetail();
442
597
  this.editorDisposables.add(this.pluginListWidget.onDidSelectPlugin(item => {
598
+ this.pluginDetailReturnSection = undefined;
443
599
  this.showEmbeddedPluginDetail(item);
444
600
  }));
445
601
  }
446
602
  this.editorContentContainer = append(contentInner, $(".editor-content-container"));
447
603
  this.createEmbeddedEditor();
448
604
  this.updateContentVisibility();
605
+ this.editorDisposables.add(this.listWidget.onDidChangeItemCount(count => {
606
+ if (this.isPromptsSection(this.selectedSection)) {
607
+ this.updateSectionCount(this.selectedSection, count);
608
+ }
609
+ }));
610
+ if (this.mcpListWidget) {
611
+ this.editorDisposables.add(this.mcpListWidget.onDidChangeItemCount(count => {
612
+ this.updateSectionCount(AICustomizationManagementSection.McpServers, count);
613
+ }));
614
+ this.mcpListWidget.fireItemCount();
615
+ }
616
+ if (this.pluginListWidget) {
617
+ this.editorDisposables.add(this.pluginListWidget.onDidChangeItemCount(count => {
618
+ this.updateSectionCount(AICustomizationManagementSection.Plugins, count);
619
+ }));
620
+ this.pluginListWidget.fireItemCount();
621
+ }
622
+ if (this.modelsWidget) {
623
+ this.editorDisposables.add(this.modelsWidget.onDidChangeItemCount(count => {
624
+ this.updateSectionCount(AICustomizationManagementSection.Models, count);
625
+ }));
626
+ this.modelsWidget.fireItemCount();
627
+ }
628
+ this.editorDisposables.add(
629
+ this.promptsService.onDidChangeCustomAgents(() => this.refreshAllPromptsSectionCounts())
630
+ );
631
+ this.editorDisposables.add(
632
+ this.promptsService.onDidChangeSkills(() => this.refreshAllPromptsSectionCounts())
633
+ );
634
+ this.editorDisposables.add(
635
+ this.promptsService.onDidChangeInstructions(() => this.refreshAllPromptsSectionCounts())
636
+ );
637
+ this.editorDisposables.add(
638
+ this.promptsService.onDidChangeSlashCommands(() => this.refreshAllPromptsSectionCounts())
639
+ );
640
+ this.refreshAllPromptsSectionCounts();
449
641
  if (this.isPromptsSection(this.selectedSection)) {
450
642
  void this.listWidget.setSection(this.selectedSection);
451
643
  }
@@ -453,10 +645,35 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
453
645
  isPromptsSection(section) {
454
646
  return section === AICustomizationManagementSection.Agents || section === AICustomizationManagementSection.Skills || section === AICustomizationManagementSection.Instructions || section === AICustomizationManagementSection.Prompts || section === AICustomizationManagementSection.Hooks;
455
647
  }
648
+ updateSectionCount(sectionId, count) {
649
+ const section = this.sections.find(s => s.id === sectionId);
650
+ if (!section || section.count === count) {
651
+ return;
652
+ }
653
+ section.count = count;
654
+ this.sectionsList.splice(0, this.sectionsList.length, this.sections);
655
+ this.ensureSectionsListReflectsActiveSection();
656
+ }
657
+ refreshAllPromptsSectionCounts() {
658
+ this.promptsSectionCountScheduler.schedule();
659
+ }
660
+ _doRefreshAllPromptsSectionCounts() {
661
+ for (const section of this.sections) {
662
+ if (this.isPromptsSection(section.id)) {
663
+ this.listWidget.computeItemCountForSection(section.id).then(count => {
664
+ this.updateSectionCount(section.id, count);
665
+ }, onUnexpectedError);
666
+ }
667
+ }
668
+ }
456
669
  selectSection(section) {
457
670
  if (this.selectedSection === section) {
671
+ this.ensureSectionsListReflectsActiveSection(section);
458
672
  return;
459
673
  }
674
+ this.telemetryService.publicLog2("chatCustomizationEditor.sectionChanged", {
675
+ section
676
+ });
460
677
  if (this.viewMode === "editor") {
461
678
  this.goBackToList();
462
679
  }
@@ -478,6 +695,24 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
478
695
  if (this.isPromptsSection(section)) {
479
696
  void this.listWidget.setSection(section);
480
697
  }
698
+ this.ensureSectionsListReflectsActiveSection(section);
699
+ }
700
+ ensureSectionsListReflectsActiveSection(section = this.selectedSection) {
701
+ if (!this.sectionsList) {
702
+ return;
703
+ }
704
+ const index = this.sections.findIndex(s => s.id === section);
705
+ if (index < 0) {
706
+ return;
707
+ }
708
+ const selection = this.sectionsList.getSelection();
709
+ if (selection.length !== 1 || selection[0] !== index) {
710
+ this.sectionsList.setSelection([index]);
711
+ }
712
+ const focus = this.sectionsList.getFocus();
713
+ if (focus.length !== 1 || focus[0] !== index) {
714
+ this.sectionsList.setFocus([index]);
715
+ }
481
716
  }
482
717
  updateContentVisibility() {
483
718
  const isEditorMode = this.viewMode === "editor";
@@ -488,7 +723,9 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
488
723
  const isModelsSection = this.selectedSection === AICustomizationManagementSection.Models;
489
724
  const isMcpSection = this.selectedSection === AICustomizationManagementSection.McpServers;
490
725
  const isPluginsSection = this.selectedSection === AICustomizationManagementSection.Plugins;
491
- this.promptsContentContainer.style.display = !isEditorMode && !isDetailMode && isPromptsSection ? "" : "none";
726
+ if (this.promptsContentContainer) {
727
+ this.promptsContentContainer.style.display = !isEditorMode && !isDetailMode && isPromptsSection ? "" : "none";
728
+ }
492
729
  if (this.modelsContentContainer) {
493
730
  this.modelsContentContainer.style.display = !isEditorMode && !isDetailMode && isModelsSection ? "" : "none";
494
731
  }
@@ -515,17 +752,46 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
515
752
  }
516
753
  }
517
754
  async createNewItemWithAI(type) {
755
+ this.telemetryService.publicLog2("chatCustomizationEditor.createItem", {
756
+ section: this.selectedSection,
757
+ promptType: type,
758
+ creationMode: "ai",
759
+ target: "workspace"
760
+ });
518
761
  if (this.input) {
519
762
  this.group.closeEditor(this.input);
520
763
  }
521
764
  await this.workspaceService.generateCustomization(type);
522
765
  }
523
- async createNewItemManual(type, target) {
766
+ async createNewItemManual(type, target, rootFileName) {
767
+ this.telemetryService.publicLog2("chatCustomizationEditor.createItem", {
768
+ section: this.selectedSection,
769
+ promptType: type,
770
+ creationMode: "manual",
771
+ target: target === "workspace-root" ? "workspace" : target
772
+ });
773
+ if (target === "workspace-root") {
774
+ const projectRoot = this.workspaceService.getActiveProjectRoot();
775
+ if (!projectRoot) {
776
+ return;
777
+ }
778
+ const override = this.harnessService.getActiveDescriptor().sectionOverrides?.get(this.selectedSection);
779
+ const fileName = rootFileName ?? override?.rootFile ?? AGENT_MD_FILENAME;
780
+ const fileUri = URI.joinPath(projectRoot, fileName);
781
+ if (await this.fileService.exists(fileUri)) {
782
+ await this.showEmbeddedEditor(fileUri, fileName, PromptsType.instructions, PromptsStorage.local, true);
783
+ } else {
784
+ await this.fileService.createFile(fileUri);
785
+ await this.showEmbeddedEditor(fileUri, fileName, PromptsType.instructions, PromptsStorage.local, true);
786
+ }
787
+ void this.listWidget.refresh();
788
+ return;
789
+ }
524
790
  if (type === PromptsType.hook) {
525
791
  if (this.workspaceService.isSessionsWindow) {
526
792
  await this.instantiationService.invokeFunction(showConfigureHooksQuickPick, {
527
793
  openEditor: async resource => {
528
- await this.showEmbeddedEditor(resource, basename(resource), true);
794
+ await this.showEmbeddedEditor(resource, basename(resource), PromptsType.hook, PromptsStorage.local, true);
529
795
  return;
530
796
  },
531
797
  target: Target.GitHubCopilot
@@ -533,20 +799,31 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
533
799
  } else {
534
800
  await this.instantiationService.invokeFunction(showConfigureHooksQuickPick, {
535
801
  openEditor: async resource => {
536
- await this.showEmbeddedEditor(resource, basename(resource), true);
802
+ await this.showEmbeddedEditor(resource, basename(resource), PromptsType.hook, PromptsStorage.local, true);
537
803
  return;
538
804
  }
539
805
  });
540
806
  }
541
807
  return;
542
808
  }
543
- const targetDir = target === "workspace" ? resolveWorkspaceTargetDirectory(this.workspaceService, type) : await resolveUserTargetDirectory(this.promptsService, type);
809
+ const targetDir = await this.resolveTargetDirectoryWithPicker(type, target);
810
+ if (targetDir === null) {
811
+ return;
812
+ }
813
+ const override = this.harnessService.getActiveDescriptor().sectionOverrides?.get(this.selectedSection);
544
814
  const options = {
545
815
  targetFolder: targetDir,
546
816
  targetStorage: target === "user" ? PromptsStorage.user : PromptsStorage.local,
817
+ fileExtension: override?.fileExtension,
547
818
  openFile: async uri => {
548
819
  const isWorkspace = target === "workspace";
549
- await this.showEmbeddedEditor(uri, basename(uri), isWorkspace);
820
+ await this.showEmbeddedEditor(
821
+ uri,
822
+ basename(uri),
823
+ type,
824
+ target === "user" ? PromptsStorage.user : PromptsStorage.local,
825
+ isWorkspace
826
+ );
550
827
  return this.embeddedEditor;
551
828
  }
552
829
  };
@@ -570,6 +847,55 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
570
847
  await this.commandService.executeCommand(commandId, options);
571
848
  void this.listWidget.refresh();
572
849
  }
850
+ async resolveTargetDirectoryWithPicker(type, target) {
851
+ const allFolders = await this.promptsService.getSourceFolders(type);
852
+ const projectRoot = this.workspaceService.getActiveProjectRoot();
853
+ const descriptor = this.harnessService.getActiveDescriptor();
854
+ const subpaths = descriptor.workspaceSubpaths;
855
+ let matchingFolders;
856
+ if (target === "workspace") {
857
+ matchingFolders = projectRoot ? allFolders.filter(f => {
858
+ if (!isEqualOrParent(f.uri, projectRoot)) {
859
+ return false;
860
+ }
861
+ if (subpaths) {
862
+ return matchesWorkspaceSubpath(f.uri.path, subpaths);
863
+ }
864
+ return true;
865
+ }) : [];
866
+ } else {
867
+ matchingFolders = projectRoot ? allFolders.filter(f => !isEqualOrParent(f.uri, projectRoot)) : allFolders;
868
+ const filter = this.harnessService.getStorageSourceFilter(type);
869
+ if (filter.includedUserFileRoots) {
870
+ const roots = filter.includedUserFileRoots;
871
+ matchingFolders = matchingFolders.filter(f => ( roots.some(root => isEqualOrParent(f.uri, root))));
872
+ }
873
+ }
874
+ const seen = ( new Set());
875
+ matchingFolders = matchingFolders.filter(f => {
876
+ const key = ( f.uri.toString());
877
+ if (( seen.has(key))) {
878
+ return false;
879
+ }
880
+ seen.add(key);
881
+ return true;
882
+ });
883
+ if (matchingFolders.length === 0) {
884
+ return undefined;
885
+ }
886
+ if (matchingFolders.length === 1) {
887
+ return matchingFolders[0].uri;
888
+ }
889
+ const items = ( matchingFolders.map(folder => ({
890
+ label: this.promptsService.getPromptLocationLabel(folder),
891
+ description: folder.uri.fsPath,
892
+ uri: folder.uri
893
+ })));
894
+ const picked = await this.quickInputService.pick(items, {
895
+ placeHolder: ( localize(5378, "Select a directory for the new customization file"))
896
+ });
897
+ return picked?.uri ?? null;
898
+ }
573
899
  updateStyles() {
574
900
  const borderColor = this.theme.getColor(aiCustomizationManagementSashBorder);
575
901
  if (borderColor) {
@@ -582,6 +908,9 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
582
908
  this.workspaceService.clearOverrideProjectRoot();
583
909
  this.inEditorContextKey.set(true);
584
910
  this.sectionContextKey.set(this.selectedSection);
911
+ this.telemetryService.publicLog2("chatCustomizationEditor.opened", {
912
+ section: this.selectedSection
913
+ });
585
914
  await super.setInput(input, options, context, token);
586
915
  if (this.dimension) {
587
916
  this.layout(this.dimension);
@@ -599,6 +928,7 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
599
928
  this.goBackFromPluginDetail();
600
929
  }
601
930
  this.workspaceService.clearOverrideProjectRoot();
931
+ this.disposeBuiltinEditingSessions();
602
932
  super.clearInput();
603
933
  }
604
934
  layout(dimension) {
@@ -648,8 +978,7 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
648
978
  if (this.isPromptsSection(sectionId)) {
649
979
  void this.listWidget.setSection(sectionId);
650
980
  }
651
- this.sectionsList.setFocus([index]);
652
- this.sectionsList.setSelection([index]);
981
+ this.ensureSectionsListReflectsActiveSection(sectionId);
653
982
  }
654
983
  }
655
984
  refreshList() {
@@ -663,12 +992,18 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
663
992
  return;
664
993
  }
665
994
  const editorHeader = append(this.editorContentContainer, $(".editor-header"));
666
- const backButton = append(editorHeader, $("button.editor-back-button"));
667
- backButton.setAttribute("aria-label", ( localize(5310, "Back to list")));
668
- const backIcon = append(backButton, $(`.codicon.codicon-${Codicon.arrowLeft.id}`));
669
- backIcon.setAttribute("aria-hidden", "true");
670
- this.editorDisposables.add(addDisposableListener(backButton, "click", () => {
671
- this.goBackToList();
995
+ this.editorActionButton = append(editorHeader, $("button.editor-back-button"));
996
+ this.editorActionButton.setAttribute("aria-label", ( localize(5379, "Back to list")));
997
+ this.editorActionButtonIcon = append(
998
+ this.editorActionButton,
999
+ $(`.codicon.codicon-${Codicon.arrowLeft.id}.editor-action-button-icon`)
1000
+ );
1001
+ this.editorActionButtonIcon.setAttribute("aria-hidden", "true");
1002
+ this.editorDisposables.add(addDisposableListener(this.editorActionButton, "click", () => {
1003
+ void this.handleEditorActionButton().catch(error => {
1004
+ console.error("Failed to handle editor back action:", error);
1005
+ this.notificationService.error(( localize(5380, "Failed to finish the prompt action.")));
1006
+ });
672
1007
  }));
673
1008
  const itemInfo = append(editorHeader, $(".editor-item-info"));
674
1009
  this.editorItemNameElement = append(itemInfo, $(".editor-item-name"));
@@ -703,16 +1038,50 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
703
1038
  })
704
1039
  );
705
1040
  }
706
- async showEmbeddedEditor(uri, displayName, isWorkspaceFile = false, isReadOnly = false) {
1041
+ async showEmbeddedEditor(
1042
+ uri,
1043
+ displayName,
1044
+ promptType,
1045
+ storage,
1046
+ isWorkspaceFile = false,
1047
+ isReadOnly = false
1048
+ ) {
707
1049
  this.currentModelRef?.dispose();
708
1050
  this.currentModelRef = undefined;
1051
+ this.editorModelChangeDisposables.clear();
709
1052
  this.currentEditingUri = uri;
710
1053
  this.currentEditingProjectRoot = isWorkspaceFile ? this.workspaceService.getActiveProjectRoot() : undefined;
1054
+ this.currentEditingStorage = storage;
1055
+ this.currentEditingPromptType = promptType;
711
1056
  this.viewMode = "editor";
712
1057
  this.editorItemNameElement.textContent = displayName;
713
1058
  this.editorItemPathElement.textContent = basename(uri);
1059
+ this._editorContentChanged = false;
1060
+ this.resetEditorSaveIndicator();
1061
+ this.updateEditorActionButton();
714
1062
  this.updateContentVisibility();
715
1063
  try {
1064
+ if (storage === BUILTIN_STORAGE && (promptType === PromptsType.prompt || promptType === PromptsType.skill)) {
1065
+ const session = await this.getOrCreateBuiltinEditingSession(uri);
1066
+ if (!isEqual(this.currentEditingUri, uri)) {
1067
+ return;
1068
+ }
1069
+ this.embeddedEditor.setModel(session.model);
1070
+ this.embeddedEditor.updateOptions({
1071
+ readOnly: false
1072
+ });
1073
+ this._editorContentChanged = session.model.getValue() !== session.originalContent;
1074
+ this.updateEditorActionButton();
1075
+ if (this.dimension) {
1076
+ this.layout(this.dimension);
1077
+ }
1078
+ this.embeddedEditor.focus();
1079
+ this.editorModelChangeDisposables.add(session.model.onDidChangeContent(() => {
1080
+ this._editorContentChanged = session.model.getValue() !== session.originalContent;
1081
+ this.updateEditorActionButton();
1082
+ }));
1083
+ return;
1084
+ }
716
1085
  const ref = await this.textModelService.createModelReference(uri);
717
1086
  if (!isEqual(this.currentEditingUri, uri)) {
718
1087
  ref.dispose();
@@ -727,30 +1096,17 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
727
1096
  this.layout(this.dimension);
728
1097
  }
729
1098
  this.embeddedEditor.focus();
730
- this.editorModelChangeDisposables.clear();
731
- this._editorContentChanged = false;
732
- const saveDelayer = this.editorModelChangeDisposables.add(( new Delayer(500)));
1099
+ this._editorContentChanged = this.workingCopyService.isDirty(uri);
733
1100
  this.editorModelChangeDisposables.add(ref.object.textEditorModel.onDidChangeContent(() => {
734
1101
  this._editorContentChanged = true;
735
- this.editorSaveIndicator.className = "editor-save-indicator visible";
736
- this.editorSaveIndicator.classList.add(...ThemeIcon.asClassNameArray(Codicon.loading), "codicon-modifier-spin");
737
- this.editorSaveIndicator.title = ( localize(5311, "Saving..."));
738
- saveDelayer.trigger(async () => {
739
- try {
740
- await this.textFileService.save(uri);
741
- } catch (error) {
742
- console.error("Failed to save AI customization file:", error);
743
- this.editorSaveIndicator.className = "editor-save-indicator visible error";
744
- this.editorSaveIndicator.classList.add(...ThemeIcon.asClassNameArray(Codicon.error));
745
- this.editorSaveIndicator.title = ( localize(5312, "Save Failed"));
746
- }
747
- });
1102
+ this.resetEditorSaveIndicator();
748
1103
  }));
749
1104
  this.editorModelChangeDisposables.add(this.workingCopyService.onDidSave(e => {
750
1105
  if (isEqual(e.workingCopy.resource, uri)) {
1106
+ this._editorContentChanged = this.workingCopyService.isDirty(uri);
751
1107
  this.editorSaveIndicator.className = "editor-save-indicator visible saved";
752
1108
  this.editorSaveIndicator.classList.add(...ThemeIcon.asClassNameArray(Codicon.check));
753
- this.editorSaveIndicator.title = ( localize(5313, "Saved"));
1109
+ this.editorSaveIndicator.title = ( localize(5381, "Saved"));
754
1110
  }
755
1111
  }));
756
1112
  } catch (error) {
@@ -762,17 +1118,27 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
762
1118
  }
763
1119
  goBackToList() {
764
1120
  const fileUri = this.currentEditingUri;
765
- const projectRoot = this.currentEditingProjectRoot;
766
- if (fileUri && projectRoot && this._editorContentChanged) {
767
- this.workspaceService.commitFiles(projectRoot, [fileUri]);
1121
+ const backgroundSaveRequest = this.createExistingCustomizationSaveRequest();
1122
+ if (backgroundSaveRequest) {
1123
+ this.telemetryService.publicLog2("chatCustomizationEditor.saveItem", {
1124
+ promptType: this.currentEditingPromptType ?? "",
1125
+ storage: String(this.currentEditingStorage ?? ""),
1126
+ saveTarget: "existing"
1127
+ });
1128
+ }
1129
+ if (fileUri && this.currentEditingStorage === BUILTIN_STORAGE) {
1130
+ this.disposeBuiltinEditingSession(fileUri);
768
1131
  }
769
1132
  this.currentModelRef?.dispose();
770
1133
  this.currentModelRef = undefined;
771
1134
  this.currentEditingUri = undefined;
772
1135
  this.currentEditingProjectRoot = undefined;
1136
+ this.currentEditingStorage = undefined;
1137
+ this.currentEditingPromptType = undefined;
1138
+ this._editorContentChanged = false;
773
1139
  this.editorModelChangeDisposables.clear();
774
- this.editorSaveIndicator.className = "editor-save-indicator";
775
- this.editorSaveIndicator.title = "";
1140
+ this.resetEditorSaveIndicator();
1141
+ this.updateEditorActionButton();
776
1142
  this.embeddedEditor?.setModel(null);
777
1143
  this.viewMode = "list";
778
1144
  this.updateContentVisibility();
@@ -781,6 +1147,196 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
781
1147
  this.layout(this.dimension);
782
1148
  }
783
1149
  this.listWidget?.focusSearch();
1150
+ if (backgroundSaveRequest) {
1151
+ const saveRequest = backgroundSaveRequest;
1152
+ void this.saveExistingCustomization(saveRequest).catch(error => {
1153
+ console.error("Failed to save customization changes on exit:", error);
1154
+ this.notificationService.warn(( localize(5382, "Could not save changes to {0}.", basename(saveRequest.fileUri))));
1155
+ });
1156
+ }
1157
+ }
1158
+ async getOrCreateBuiltinEditingSession(uri) {
1159
+ const key = ( uri.toString());
1160
+ const existing = this.builtinEditingSessions.get(key);
1161
+ if (existing && !existing.model.isDisposed()) {
1162
+ return existing;
1163
+ }
1164
+ const ref = await this.textModelService.createModelReference(uri);
1165
+ try {
1166
+ const session = {
1167
+ model: this.modelService.createModel(
1168
+ createTextBufferFactoryFromSnapshot(ref.object.textEditorModel.createSnapshot()),
1169
+ {
1170
+ languageId: ref.object.textEditorModel.getLanguageId(),
1171
+ onDidChange: Event.None
1172
+ },
1173
+ ( URI.from({
1174
+ scheme: "ai-customization-builtin",
1175
+ path: uri.path,
1176
+ query: generateUuid()
1177
+ })),
1178
+ false
1179
+ ),
1180
+ originalContent: ref.object.textEditorModel.getValue()
1181
+ };
1182
+ this.builtinEditingSessions.set(key, session);
1183
+ return session;
1184
+ } finally {
1185
+ ref.dispose();
1186
+ }
1187
+ }
1188
+ createBuiltinPromptSaveRequest(target) {
1189
+ const sourceUri = this.currentEditingUri;
1190
+ const promptType = this.currentEditingPromptType;
1191
+ if (!sourceUri || this.currentEditingStorage !== BUILTIN_STORAGE || (promptType !== PromptsType.prompt && promptType !== PromptsType.skill) || !target.folder || target.target === "cancel") {
1192
+ return;
1193
+ }
1194
+ const session = this.builtinEditingSessions.get(( sourceUri.toString()));
1195
+ if (!session || !this._editorContentChanged) {
1196
+ return;
1197
+ }
1198
+ return {
1199
+ target: target.target,
1200
+ folder: target.folder,
1201
+ sourceUri,
1202
+ content: session.model.getValue(),
1203
+ promptType,
1204
+ projectRoot: target.target === "workspace" ? this.workspaceService.getActiveProjectRoot() : undefined
1205
+ };
1206
+ }
1207
+ createExistingCustomizationSaveRequest() {
1208
+ if (!this._editorContentChanged || this.currentEditingStorage === BUILTIN_STORAGE || !this.currentEditingUri) {
1209
+ return undefined;
1210
+ }
1211
+ const model = this.currentModelRef?.object.textEditorModel;
1212
+ if (!model) {
1213
+ return undefined;
1214
+ }
1215
+ return {
1216
+ fileUri: this.currentEditingUri,
1217
+ content: model.getValue(),
1218
+ projectRoot: this.currentEditingProjectRoot
1219
+ };
1220
+ }
1221
+ async saveBuiltinPromptCopy(request) {
1222
+ let targetUri;
1223
+ if (request.promptType === PromptsType.skill) {
1224
+ const skillFolderName = basename(dirname(request.sourceUri));
1225
+ targetUri = URI.joinPath(request.folder, skillFolderName, basename(request.sourceUri));
1226
+ } else {
1227
+ targetUri = URI.joinPath(request.folder, basename(request.sourceUri));
1228
+ }
1229
+ await this.fileService.createFolder(dirname(targetUri));
1230
+ await this.fileService.writeFile(targetUri, VSBuffer.fromString(request.content));
1231
+ if (request.target === "workspace" && request.projectRoot) {
1232
+ await this.workspaceService.commitFiles(request.projectRoot, [targetUri]);
1233
+ }
1234
+ }
1235
+ async saveExistingCustomization(request) {
1236
+ await this.fileService.writeFile(request.fileUri, VSBuffer.fromString(request.content));
1237
+ if (request.projectRoot) {
1238
+ await this.workspaceService.commitFiles(request.projectRoot, [request.fileUri]);
1239
+ }
1240
+ }
1241
+ async pickBuiltinPromptSaveTarget() {
1242
+ const items = [];
1243
+ const promptType = this.currentEditingPromptType ?? PromptsType.prompt;
1244
+ const workspaceFolder = resolveWorkspaceTargetDirectory(this.workspaceService, promptType);
1245
+ if (workspaceFolder) {
1246
+ items.push({
1247
+ label: ( localize(5383, "Workspace")),
1248
+ description: workspaceFolder.fsPath,
1249
+ target: "workspace",
1250
+ folder: workspaceFolder
1251
+ });
1252
+ }
1253
+ const userFolder = await resolveUserTargetDirectory(this.promptsService, promptType);
1254
+ if (userFolder) {
1255
+ items.push({
1256
+ label: ( localize(5384, "User")),
1257
+ description: userFolder.fsPath,
1258
+ target: "user",
1259
+ folder: userFolder
1260
+ });
1261
+ }
1262
+ items.push({
1263
+ label: ( localize(5385, "Cancel")),
1264
+ target: "cancel"
1265
+ });
1266
+ return this.quickInputService.pick(items, {
1267
+ canPickMany: false,
1268
+ placeHolder: ( localize(5386, "Select Workspace, User, or Cancel")),
1269
+ matchOnDescription: true
1270
+ });
1271
+ }
1272
+ async handleEditorActionButton() {
1273
+ if (this.editorActionButtonInProgress) {
1274
+ return;
1275
+ }
1276
+ this.editorActionButtonInProgress = true;
1277
+ this.updateEditorActionButton();
1278
+ let backgroundSaveRequest;
1279
+ try {
1280
+ if (this.shouldShowBuiltinSaveAction()) {
1281
+ const selection = await this.pickBuiltinPromptSaveTarget();
1282
+ if (!selection || selection.target === "cancel") {
1283
+ return;
1284
+ }
1285
+ backgroundSaveRequest = this.createBuiltinPromptSaveRequest(selection);
1286
+ if (backgroundSaveRequest) {
1287
+ this.telemetryService.publicLog2("chatCustomizationEditor.saveItem", {
1288
+ promptType: this.currentEditingPromptType ?? "",
1289
+ storage: String(this.currentEditingStorage ?? ""),
1290
+ saveTarget: selection.target
1291
+ });
1292
+ }
1293
+ }
1294
+ this.goBackToList();
1295
+ if (backgroundSaveRequest) {
1296
+ const saveRequest = backgroundSaveRequest;
1297
+ void this.saveBuiltinPromptCopy(saveRequest).then(() => {
1298
+ void this.listWidget?.refresh();
1299
+ }, error => {
1300
+ console.error("Failed to save built-in override:", error);
1301
+ this.notificationService.warn(saveRequest.target === "workspace" ? ( localize(5387, "Could not save the override to the workspace.")) : ( localize(5388, "Could not save the override to your user folder.")));
1302
+ });
1303
+ }
1304
+ } finally {
1305
+ this.editorActionButtonInProgress = false;
1306
+ this.updateEditorActionButton();
1307
+ }
1308
+ }
1309
+ updateEditorActionButton() {
1310
+ if (!this.editorActionButton || !this.editorActionButtonIcon) {
1311
+ return;
1312
+ }
1313
+ const shouldShowBuiltinSaveAction = this.shouldShowBuiltinSaveAction();
1314
+ this.editorActionButtonIcon.className = `codicon codicon-${shouldShowBuiltinSaveAction ? Codicon.save.id : Codicon.arrowLeft.id} editor-action-button-icon`;
1315
+ this.editorActionButton.disabled = this.editorActionButtonInProgress;
1316
+ this.editorActionButton.setAttribute("aria-label", shouldShowBuiltinSaveAction ? ( localize(5389, "Save override")) : ( localize(5379, "Back to list")));
1317
+ this.editorActionButton.title = shouldShowBuiltinSaveAction ? ( localize(5390, "Save override (choose Workspace, User, or Cancel)")) : ( localize(5379, "Back to list"));
1318
+ }
1319
+ shouldShowBuiltinSaveAction() {
1320
+ return this._editorContentChanged && this.currentEditingStorage === BUILTIN_STORAGE && (this.currentEditingPromptType === PromptsType.prompt || this.currentEditingPromptType === PromptsType.skill);
1321
+ }
1322
+ resetEditorSaveIndicator() {
1323
+ this.editorSaveIndicator.className = "editor-save-indicator";
1324
+ this.editorSaveIndicator.title = "";
1325
+ }
1326
+ disposeBuiltinEditingSessions() {
1327
+ for (const session of ( this.builtinEditingSessions.values())) {
1328
+ session.model.dispose();
1329
+ }
1330
+ this.builtinEditingSessions.clear();
1331
+ }
1332
+ disposeBuiltinEditingSession(uri) {
1333
+ const key = ( uri.toString());
1334
+ const session = this.builtinEditingSessions.get(key);
1335
+ if (!session) {
1336
+ return;
1337
+ }
1338
+ session.model.dispose();
1339
+ this.builtinEditingSessions.delete(key);
784
1340
  }
785
1341
  createEmbeddedMcpDetail() {
786
1342
  if (!this.mcpDetailContainer) {
@@ -788,7 +1344,7 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
788
1344
  }
789
1345
  const detailHeader = append(this.mcpDetailContainer, $(".editor-header"));
790
1346
  const backButton = append(detailHeader, $("button.editor-back-button"));
791
- backButton.setAttribute("aria-label", ( localize(5314, "Back to MCP servers")));
1347
+ backButton.setAttribute("aria-label", ( localize(5391, "Back to MCP servers")));
792
1348
  const backIconEl = append(backButton, $(`.codicon.codicon-${Codicon.arrowLeft.id}`));
793
1349
  backIconEl.setAttribute("aria-hidden", "true");
794
1350
  this.editorDisposables.add(addDisposableListener(backButton, "click", () => {
@@ -833,7 +1389,7 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
833
1389
  }
834
1390
  const detailHeader = append(this.pluginDetailContainer, $(".editor-header"));
835
1391
  const backButton = append(detailHeader, $("button.editor-back-button"));
836
- backButton.setAttribute("aria-label", ( localize(5315, "Back to plugins")));
1392
+ backButton.setAttribute("aria-label", ( localize(5392, "Back to plugins")));
837
1393
  const backIconEl = append(backButton, $(`.codicon.codicon-${Codicon.arrowLeft.id}`));
838
1394
  backIconEl.setAttribute("aria-hidden", "true");
839
1395
  this.editorDisposables.add(addDisposableListener(backButton, "click", () => {
@@ -862,17 +1418,31 @@ let AICustomizationManagementEditor = class AICustomizationManagementEditor exte
862
1418
  this.layout(this.dimension);
863
1419
  }
864
1420
  }
1421
+ async showPluginDetail(item) {
1422
+ if (this.selectedSection !== AICustomizationManagementSection.Plugins) {
1423
+ this.pluginDetailReturnSection = this.selectedSection;
1424
+ }
1425
+ await this.showEmbeddedPluginDetail(item);
1426
+ }
865
1427
  goBackFromPluginDetail() {
866
1428
  this.pluginDetailDisposables.clear();
867
1429
  this.embeddedPluginEditor?.clearInput();
868
- this.viewMode = "list";
869
- this.updateContentVisibility();
1430
+ const returnSection = this.pluginDetailReturnSection;
1431
+ this.pluginDetailReturnSection = undefined;
1432
+ if (returnSection) {
1433
+ this.viewMode = "list";
1434
+ this.updateContentVisibility();
1435
+ this.selectSection(returnSection);
1436
+ } else {
1437
+ this.viewMode = "list";
1438
+ this.updateContentVisibility();
1439
+ this.pluginListWidget?.focusSearch();
1440
+ }
870
1441
  if (this.dimension) {
871
1442
  this.layout(this.dimension);
872
1443
  }
873
- this.pluginListWidget?.focusSearch();
874
1444
  }
875
1445
  };
876
- AICustomizationManagementEditor = AICustomizationManagementEditor_1 = ( __decorate([( __param(1, ITelemetryService)), ( __param(2, IThemeService)), ( __param(3, IStorageService)), ( __param(4, IInstantiationService)), ( __param(5, IContextKeyService)), ( __param(6, IOpenerService)), ( __param(7, ICommandService)), ( __param(8, IAICustomizationWorkspaceService)), ( __param(9, IPromptsService)), ( __param(10, ITextModelService)), ( __param(11, IConfigurationService)), ( __param(12, IWorkingCopyService)), ( __param(13, ITextFileService)), ( __param(14, IFileDialogService)), ( __param(15, IHoverService))], AICustomizationManagementEditor));
1446
+ AICustomizationManagementEditor = AICustomizationManagementEditor_1 = ( __decorate([( __param(1, ITelemetryService)), ( __param(2, IThemeService)), ( __param(3, IStorageService)), ( __param(4, IInstantiationService)), ( __param(5, IContextKeyService)), ( __param(6, IOpenerService)), ( __param(7, ICommandService)), ( __param(8, IAICustomizationWorkspaceService)), ( __param(9, IPromptsService)), ( __param(10, ITextModelService)), ( __param(11, IConfigurationService)), ( __param(12, IWorkingCopyService)), ( __param(13, IFileDialogService)), ( __param(14, IHoverService)), ( __param(15, IModelService)), ( __param(16, IQuickInputService)), ( __param(17, IContextMenuService)), ( __param(18, IFileService)), ( __param(19, INotificationService)), ( __param(20, ICustomizationHarnessService))], AICustomizationManagementEditor));
877
1447
 
878
1448
  export { AICustomizationManagementEditor, aiCustomizationManagementSashBorder };