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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/index.d.ts +1 -1
  2. package/index.js +21 -5
  3. package/package.json +5 -5
  4. package/vscode/src/vs/base/common/defaultAccount.d.ts +69 -0
  5. package/vscode/src/vs/base/common/defaultAccount.js +12 -0
  6. package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostProtocolClient.d.ts +91 -22
  7. package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostProtocolClient.js +301 -68
  8. package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostServiceImpl.d.ts +24 -5
  9. package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostServiceImpl.js +89 -16
  10. package/vscode/src/vs/platform/agentHost/browser/webSocketClientTransport.d.ts +17 -5
  11. package/vscode/src/vs/platform/agentHost/browser/webSocketClientTransport.js +73 -10
  12. package/vscode/src/vs/platform/agentHost/common/agentHostFileSystemProvider.d.ts +32 -6
  13. package/vscode/src/vs/platform/agentHost/common/agentHostFileSystemProvider.js +32 -20
  14. package/vscode/src/vs/platform/agentHost/common/agentHostPermissionService.d.ts +37 -0
  15. package/vscode/src/vs/platform/agentHost/common/agentHostPermissionService.js +15 -0
  16. package/vscode/src/vs/platform/agentHost/common/agentService.d.ts +242 -201
  17. package/vscode/src/vs/platform/agentHost/common/agentService.js +3 -1
  18. package/vscode/src/vs/platform/agentHost/common/ahpJsonlLogger.d.ts +35 -0
  19. package/vscode/src/vs/platform/agentHost/common/ahpJsonlLogger.js +106 -0
  20. package/vscode/src/vs/platform/agentHost/common/state/agentSubscription.d.ts +38 -30
  21. package/vscode/src/vs/platform/agentHost/common/state/agentSubscription.js +2 -1
  22. package/vscode/src/vs/platform/agentHost/common/state/protocol/errors.d.ts +114 -4
  23. package/vscode/src/vs/platform/agentHost/common/state/protocol/reducers.d.ts +10 -10
  24. package/vscode/src/vs/platform/agentHost/common/state/protocol/reducers.js +52 -19
  25. package/vscode/src/vs/platform/agentHost/common/state/protocol/version/registry.d.ts +42 -0
  26. package/vscode/src/vs/platform/agentHost/common/state/protocol/version/registry.js +7 -0
  27. package/vscode/src/vs/platform/agentHost/common/state/sessionActions.d.ts +42 -41
  28. package/vscode/src/vs/platform/agentHost/common/state/sessionTransport.d.ts +6 -6
  29. package/vscode/src/vs/platform/agentHost/common/transportConstants.d.ts +15 -0
  30. package/vscode/src/vs/platform/agentHost/common/transportConstants.js +6 -0
  31. package/vscode/src/vs/platform/agentPlugins/common/pluginParsers.d.ts +4 -3
  32. package/vscode/src/vs/platform/agentPlugins/common/pluginParsers.js +4 -3
  33. package/vscode/src/vs/platform/networkFilter/common/networkFilterService.d.ts +4 -2
  34. package/vscode/src/vs/platform/networkFilter/common/networkFilterService.js +15 -7
  35. package/vscode/src/vs/workbench/contrib/browserView/common/browserChatToolReferenceNames.d.ts +19 -0
  36. package/vscode/src/vs/workbench/contrib/browserView/common/browserChatToolReferenceNames.js +17 -0
  37. package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatAccessibilityService.js +2 -2
  38. package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatResponseAccessibleView.d.ts +2 -2
  39. package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatResponseAccessibleView.js +16 -16
  40. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.js +14 -10
  41. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.js +64 -59
  42. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAgentRecommendationActions.js +1 -1
  43. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.js +31 -16
  44. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.js +18 -9
  45. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.d.ts +16 -0
  46. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.js +8 -8
  47. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatDeveloperActions.js +30 -5
  48. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatFileTreeActions.js +2 -2
  49. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatForkActions.js +8 -7
  50. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatImportExport.js +3 -3
  51. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatLanguageModelActions.js +13 -13
  52. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatMoveActions.js +6 -6
  53. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatNewActions.js +12 -12
  54. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatOpenAgentDebugPanelAction.js +12 -12
  55. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatPluginActions.js +27 -18
  56. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatPromptNavigationActions.js +2 -2
  57. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQueueActions.js +11 -11
  58. package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQuickInputActions.js +8 -8
  59. package/vscode/src/vs/workbench/contrib/chat/browser/actions/codeBlockOperations.js +21 -20
  60. package/vscode/src/vs/workbench/contrib/chat/browser/actions/createPluginAction.js +22 -22
  61. package/vscode/src/vs/workbench/contrib/chat/browser/actions/reviewEdits.d.ts +12 -0
  62. package/vscode/src/vs/workbench/contrib/chat/browser/actions/reviewEdits.js +171 -0
  63. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginActions.d.ts +1 -1
  64. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginActions.js +8 -8
  65. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditor.js +4 -4
  66. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditorInput.js +2 -2
  67. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginItems.d.ts +1 -1
  68. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginRepositoryService.d.ts +3 -2
  69. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginRepositoryService.js +12 -10
  70. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostPermissionUiContribution.d.ts +28 -0
  71. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostPermissionUiContribution.js +99 -0
  72. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSessionWorkingDirectoryResolver.d.ts +2 -1
  73. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSessionWorkingDirectoryResolver.js +11 -4
  74. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.contribution.js +9 -3
  75. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsActions.js +63 -53
  76. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsPicker.d.ts +2 -0
  77. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsPicker.js +10 -7
  78. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsQuickAccess.js +3 -3
  79. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjection.js +1 -1
  80. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionActions.js +4 -4
  81. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionService.js +1 -1
  82. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionsExperiments.contribution.js +5 -4
  83. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.js +25 -48
  84. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/unifiedQuickAccess.js +17 -17
  85. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/unifiedQuickAccessActions.js +4 -4
  86. package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/localAgentSessionsController.js +5 -0
  87. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationDebugPanel.d.ts +8 -4
  88. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationDebugPanel.js +99 -39
  89. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationIcons.d.ts +2 -2
  90. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationIcons.js +17 -30
  91. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemsModel.d.ts +78 -0
  92. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemsModel.js +38 -0
  93. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidget.d.ts +35 -37
  94. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidget.js +347 -326
  95. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidgetUtils.d.ts +6 -2
  96. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidgetUtils.js +1 -11
  97. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.js +113 -109
  98. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.d.ts +37 -15
  99. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.js +436 -134
  100. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditorInput.js +1 -1
  101. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationWelcomePagePromptLaunchers.d.ts +2 -0
  102. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationWelcomePagePromptLaunchers.js +52 -26
  103. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationCreatorService.js +7 -1
  104. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationHarnessService.d.ts +2 -1
  105. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationHarnessService.js +13 -5
  106. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedAgentPluginDetail.d.ts +23 -0
  107. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedAgentPluginDetail.js +60 -0
  108. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedMcpServerDetail.d.ts +25 -0
  109. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedMcpServerDetail.js +93 -0
  110. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.d.ts +9 -2
  111. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.js +73 -104
  112. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/media/aiCustomizationManagement.css +272 -41
  113. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/media/aiCustomizationWelcomePromptLaunchers.css +12 -2
  114. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.d.ts +30 -1
  115. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.js +430 -185
  116. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.d.ts +5 -2
  117. package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.js +44 -3
  118. package/vscode/src/vs/workbench/contrib/chat/browser/chat.contribution.js +480 -279
  119. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatCustomizationDiscoveryRenderer.js +32 -32
  120. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheDiff.d.ts +138 -0
  121. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheDiff.js +221 -0
  122. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheExplorerView.d.ts +84 -0
  123. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheExplorerView.js +1216 -0
  124. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugDetailPanel.js +6 -6
  125. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.d.ts +2 -1
  126. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.js +32 -4
  127. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditorInput.js +2 -2
  128. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventDetailRenderer.js +26 -19
  129. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventList.js +7 -7
  130. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFilters.js +4 -4
  131. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowChartView.js +7 -7
  132. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowGraph.js +28 -25
  133. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHomeView.js +13 -13
  134. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHookContentRenderer.js +17 -17
  135. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugLogsView.js +25 -24
  136. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugMessageContentRenderer.js +8 -8
  137. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugModelTurnContentRenderer.js +23 -23
  138. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugOverviewView.d.ts +2 -1
  139. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugOverviewView.js +68 -33
  140. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugToolCallContentRenderer.js +11 -11
  141. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugTypes.d.ts +3 -2
  142. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugTypes.js +1 -0
  143. package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/media/chatDebug.css +650 -6
  144. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingCodeEditorIntegration.js +2 -2
  145. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorActions.d.ts +46 -0
  146. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorActions.js +533 -0
  147. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.d.ts +29 -0
  148. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.js +390 -0
  149. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationModelManager.js +3 -3
  150. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationWidget.d.ts +101 -0
  151. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationWidget.js +509 -0
  152. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedDocumentEntry.js +2 -2
  153. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.js +18 -3
  154. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.js +1 -1
  155. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl.js +11 -11
  156. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingSession.js +3 -2
  157. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/media/chatEditingEditorOverlay.css +130 -0
  158. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/media/chatEditingExplanationWidget.css +276 -0
  159. package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/notebook/chatEditingNotebookEditorIntegration.js +1 -1
  160. package/vscode/src/vs/workbench/contrib/chat/browser/chatImageCarouselService.js +1 -1
  161. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagement.contribution.js +8 -7
  162. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagementEditorInput.js +2 -2
  163. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsViewModel.d.ts +1 -7
  164. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsViewModel.js +6 -87
  165. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.d.ts +1 -1
  166. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.js +116 -182
  167. package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/media/chatModelsWidget.css +12 -39
  168. package/vscode/src/vs/workbench/contrib/chat/browser/chatOutputItemRenderer.js +3 -3
  169. package/vscode/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.js +31 -31
  170. package/vscode/src/vs/workbench/contrib/chat/browser/chatRepoInfo.js +2 -2
  171. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.js +61 -41
  172. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupController.js +10 -10
  173. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupGrowthSession.js +6 -6
  174. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupProviders.js +27 -27
  175. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.d.ts +2 -0
  176. package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.js +16 -13
  177. package/vscode/src/vs/workbench/contrib/chat/browser/chatSlashCommands.d.ts +20 -0
  178. package/vscode/src/vs/workbench/contrib/chat/browser/chatSlashCommands.js +106 -36
  179. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.d.ts +25 -7
  180. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.js +629 -425
  181. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.d.ts +9 -1
  182. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.js +105 -29
  183. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusItemService.d.ts +1 -0
  184. package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/media/chatStatus.css +175 -148
  185. package/vscode/src/vs/workbench/contrib/chat/browser/chatTipCatalog.js +20 -33
  186. package/vscode/src/vs/workbench/contrib/chat/browser/chatTipService.js +9 -2
  187. package/vscode/src/vs/workbench/contrib/chat/browser/chatWindowNotifier.js +4 -4
  188. package/vscode/src/vs/workbench/contrib/chat/browser/claudePluginRecommendations.js +2 -2
  189. package/vscode/src/vs/workbench/contrib/chat/browser/defaultModelContribution.js +4 -4
  190. package/vscode/src/vs/workbench/contrib/chat/browser/enablementActions.js +4 -4
  191. package/vscode/src/vs/workbench/contrib/chat/browser/enablementStatusWidget.js +2 -2
  192. package/vscode/src/vs/workbench/contrib/chat/browser/githubRepoFetcher.d.ts +58 -0
  193. package/vscode/src/vs/workbench/contrib/chat/browser/githubRepoFetcher.js +339 -0
  194. package/vscode/src/vs/workbench/contrib/chat/browser/languageModelsConfigurationService.js +1 -1
  195. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/media/planReviewFeedback.css +160 -0
  196. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorActions.d.ts +9 -0
  197. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorActions.js +123 -0
  198. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorContribution.d.ts +37 -0
  199. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorContribution.js +572 -0
  200. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackService.d.ts +36 -0
  201. package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackService.js +167 -0
  202. package/vscode/src/vs/workbench/contrib/chat/browser/pluginGitCommandService.d.ts +49 -7
  203. package/vscode/src/vs/workbench/contrib/chat/browser/pluginGitCommandService.js +315 -19
  204. package/vscode/src/vs/workbench/contrib/chat/browser/pluginInstallService.js +45 -24
  205. package/vscode/src/vs/workbench/contrib/chat/browser/pluginSources.js +15 -15
  206. package/vscode/src/vs/workbench/contrib/chat/browser/pluginUrlHandler.js +6 -6
  207. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/chatModeActions.js +6 -6
  208. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookActions.js +44 -40
  209. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookUtils.js +5 -5
  210. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptCodingAgentActionOverlay.js +2 -2
  211. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptFileContributions.js +4 -1
  212. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptToolsCodeLensProvider.js +2 -2
  213. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptUrlHandler.js +8 -8
  214. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/runPromptAction.js +7 -7
  215. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/saveAsPromptFileActions.js +3 -3
  216. package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/skillActions.js +3 -3
  217. package/vscode/src/vs/workbench/contrib/chat/browser/promptsDebugContribution.js +20 -20
  218. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsConfirmationService.js +39 -39
  219. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.d.ts +9 -1
  220. package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.js +111 -52
  221. package/vscode/src/vs/workbench/contrib/chat/browser/tools/renameTool.d.ts +3 -7
  222. package/vscode/src/vs/workbench/contrib/chat/browser/tools/renameTool.js +13 -47
  223. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolHelpers.d.ts +3 -2
  224. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolHelpers.js +4 -8
  225. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolResultCompressorService.d.ts +18 -0
  226. package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolResultCompressorService.js +56 -0
  227. package/vscode/src/vs/workbench/contrib/chat/browser/tools/usagesTool.d.ts +3 -7
  228. package/vscode/src/vs/workbench/contrib/chat/browser/tools/usagesTool.js +14 -52
  229. package/vscode/src/vs/workbench/contrib/chat/browser/viewsWelcome/chatViewsWelcomeHandler.js +5 -5
  230. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidgetService.d.ts +3 -1
  231. package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidgetService.js +17 -2
  232. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatQueuePickerActionItem.d.ts +2 -0
  233. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatQueuePickerActionItem.js +23 -12
  234. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletions.d.ts +39 -0
  235. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletions.js +136 -0
  236. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletionsBase.d.ts +72 -0
  237. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletionsBase.js +56 -0
  238. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletionUtils.d.ts +7 -0
  239. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletionUtils.js +14 -1
  240. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletions.js +41 -26
  241. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputEditorContrib.js +30 -12
  242. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputEditorHover.js +1 -1
  243. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/chatQuick.js +1 -1
  244. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/editor/chatEditor.js +2 -5
  245. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewPane.js +25 -6
  246. package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewTitleControl.js +2 -2
  247. package/vscode/src/vs/workbench/contrib/chat/common/chatDebugServiceImpl.d.ts +2 -2
  248. package/vscode/src/vs/workbench/contrib/chat/common/chatDebugServiceImpl.js +5 -4
  249. package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.d.ts +1 -0
  250. package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.js +108 -45
  251. package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceTelemetry.js +7 -3
  252. package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionOperationLog.js +3 -1
  253. package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionStore.d.ts +20 -1
  254. package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionStore.js +65 -26
  255. package/vscode/src/vs/workbench/contrib/chat/common/participants/chatSlashCommands.d.ts +5 -3
  256. package/vscode/src/vs/workbench/contrib/chat/common/participants/chatSlashCommands.js +38 -11
  257. package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.d.ts +17 -1
  258. package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.js +165 -16
  259. package/vscode/src/vs/workbench/contrib/chat/common/plugins/pluginMarketplaceService.d.ts +1 -0
  260. package/vscode/src/vs/workbench/contrib/chat/common/plugins/pluginMarketplaceService.js +62 -1
  261. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/chatPromptFilesContribution.js +18 -18
  262. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/PromptHeaderDefinitionProvider.js +2 -1
  263. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptCodeActions.js +5 -5
  264. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHeaderAutocompletion.d.ts +1 -3
  265. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHeaderAutocompletion.js +15 -21
  266. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHovers.d.ts +1 -3
  267. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHovers.js +18 -24
  268. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.d.ts +4 -2
  269. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.js +203 -180
  270. package/vscode/src/vs/workbench/contrib/chat/common/voiceChatService.js +1 -1
  271. package/vscode/src/vs/workbench/contrib/chat/common/workingDirectory.d.ts +30 -0
  272. package/vscode/src/vs/workbench/contrib/chat/common/workingDirectory.js +35 -0
  273. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/aiEditTelemetry/aiEditTelemetryServiceImpl.d.ts +2 -1
  274. package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/aiEditTelemetry/aiEditTelemetryServiceImpl.js +27 -2
  275. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.d.ts +1 -1
  276. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.js +14 -49
  277. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.d.ts +0 -16
  278. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.js +35 -177
  279. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatDefaultModel.js +2 -8
  280. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatNotebook.d.ts +1 -2
  281. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatNotebook.js +2 -3
  282. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.d.ts +4 -4
  283. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.js +11 -11
  284. package/vscode/src/vs/workbench/contrib/mcp/browser/mcpPromptArgumentPick.js +14 -14
  285. package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/chat/notebookChatUtils.js +1 -1
  286. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.js +13 -13
  287. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.js +5 -5
  288. package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext.js +1 -1
  289. package/vscode/src/vs/workbench/contrib/remoteCodingAgents/browser/remoteCodingAgents.contribution.js +7 -7
  290. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatAccessibilityHelp.js +16 -16
  291. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.js +20 -20
  292. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.d.ts +29 -3
  293. package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.js +129 -3
  294. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/taskHelpers.js +3 -2
  295. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/terminal.chatAgentTools.contribution.d.ts +2 -1
  296. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/terminal.chatAgentTools.contribution.js +14 -6
  297. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalLastCommandTool.js +3 -3
  298. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalOutputTool.d.ts +1 -4
  299. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalOutputTool.js +12 -38
  300. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalSelectionTool.js +3 -3
  301. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/killTerminalTool.js +4 -4
  302. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalConfirmationTool.js +2 -2
  303. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/sendToTerminalTool.d.ts +12 -7
  304. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/sendToTerminalTool.js +77 -70
  305. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/createAndRunTaskTool.js +14 -14
  306. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/getTaskOutputTool.js +7 -7
  307. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/runTaskTool.js +14 -14
  308. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/taskHelpers.js +1 -1
  309. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCompressor.d.ts +32 -0
  310. package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCompressor.js +232 -0
  311. package/vscode/src/vs/workbench/services/agentHost/common/agentHostPermissionService.d.ts +83 -0
  312. package/vscode/src/vs/workbench/services/agentHost/common/agentHostPermissionService.js +243 -0
  313. package/vscode/src/vs/platform/agentHost/common/state/protocol/commands.d.ts +0 -749
  314. package/vscode/src/vs/platform/agentHost/common/state/protocol/commands.js +0 -14
  315. package/vscode/src/vs/platform/agentHost/common/state/sessionCapabilities.d.ts +0 -17
  316. package/vscode/src/vs/platform/agentHost/common/state/sessionCapabilities.js +0 -5
  317. package/vscode/src/vs/platform/agentHost/common/state/sessionProtocol.d.ts +0 -40
  318. package/vscode/src/vs/platform/agentHost/common/state/sessionProtocol.js +0 -14
  319. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.d.ts +0 -61
  320. package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.js +0 -638
  321. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemSource.d.ts +0 -131
  322. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemSource.js +0 -363
  323. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/promptsServiceCustomizationItemProvider.d.ts +0 -24
  324. package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/promptsServiceCustomizationItemProvider.js +0 -306
  325. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatStatusWidget.d.ts +0 -23
  326. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatStatusWidget.js +0 -97
  327. package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/media/chatStatusWidget.css +0 -57
  328. package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.d.ts +0 -50
  329. package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.js +0 -29
  330. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookClaudeCompat.d.ts +0 -50
  331. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookClaudeCompat.js +0 -78
  332. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCompatibility.d.ts +0 -77
  333. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCompatibility.js +0 -120
  334. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCopilotCliCompat.d.ts +0 -10
  335. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCopilotCliCompat.js +0 -23
  336. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.d.ts +0 -242
  337. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.js +0 -1701
  338. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.d.ts +0 -191
  339. package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.js +0 -728
  340. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatHistoryService.d.ts +0 -14
  341. package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatHistoryService.js +0 -69
@@ -1,1701 +0,0 @@
1
-
2
- import { __decorate, __param } from '@codingame/monaco-vscode-api/external/tslib/tslib.es6';
3
- import { CancellationToken } from '@codingame/monaco-vscode-api/vscode/vs/base/common/cancellation';
4
- import { CancellationError } from '@codingame/monaco-vscode-api/vscode/vs/base/common/errors';
5
- import { Emitter, Event } from '@codingame/monaco-vscode-api/vscode/vs/base/common/event';
6
- import { parse } from '@codingame/monaco-vscode-api/vscode/vs/base/common/json';
7
- import { Disposable, DisposableStore } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
8
- import { StopWatch } from '@codingame/monaco-vscode-api/vscode/vs/base/common/stopwatch';
9
- import '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/index';
10
- import { ResourceMap, ResourceSet } from '@codingame/monaco-vscode-api/vscode/vs/base/common/map';
11
- import { isEqual, dirname, basename } from '@codingame/monaco-vscode-api/vscode/vs/base/common/resources';
12
- import { URI } from '@codingame/monaco-vscode-api/vscode/vs/base/common/uri';
13
- import { OffsetRange } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/core/ranges/offsetRange';
14
- import { IModelService } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/services/model.service';
15
- import { localize } from '@codingame/monaco-vscode-api/vscode/vs/nls';
16
- import { IConfigurationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service';
17
- import { FileOperationError, FileOperationResult } from '@codingame/monaco-vscode-api/vscode/vs/platform/files/common/files';
18
- import { IFileService } from '@codingame/monaco-vscode-api/vscode/vs/platform/files/common/files.service';
19
- import { IExtensionService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/extensions/common/extensions.service';
20
- import { IInstantiationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation';
21
- import { ILabelService } from '@codingame/monaco-vscode-api/vscode/vs/platform/label/common/label.service';
22
- import { ILogService } from '@codingame/monaco-vscode-api/vscode/vs/platform/log/common/log.service';
23
- import { IFilesConfigurationService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/filesConfiguration/common/filesConfigurationService.service';
24
- import { StorageScope, StorageTarget } from '@codingame/monaco-vscode-api/vscode/vs/platform/storage/common/storage';
25
- import { IStorageService } from '@codingame/monaco-vscode-api/vscode/vs/platform/storage/common/storage.service';
26
- import { ITelemetryService } from '@codingame/monaco-vscode-api/vscode/vs/platform/telemetry/common/telemetry.service';
27
- import { IUserDataProfileService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/userDataProfile/common/userDataProfile.service';
28
- import { PromptsConfig } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/config/config';
29
- import { getCleanPromptName, AGENT_MD_FILENAME, CLAUDE_MD_FILENAME, CLAUDE_LOCAL_MD_FILENAME, CLAUDE_CONFIG_FOLDER, COPILOT_CUSTOM_INSTRUCTIONS_FILENAME, GITHUB_CONFIG_FOLDER, getSkillFolderName, isInClaudeRulesFolder } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/config/promptFileLocations';
30
- import { PromptsType, PromptFileSource, PROMPT_LANGUAGE_ID, Target, getPromptsTypeForLanguageId } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/promptTypes';
31
- import { PromptFilesLocator } from '../utils/promptFilesLocator.js';
32
- import { PromptFileParser, PromptHeaderAttributes, evaluateApplyToPattern } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/promptFileParser';
33
- import { PromptsStorage, SKILL_PROVIDER_ACTIVATION_EVENT, PROMPT_FILE_PROVIDER_ACTIVATION_EVENT, INSTRUCTIONS_PROVIDER_ACTIVATION_EVENT, CUSTOM_AGENT_PROVIDER_ACTIVATION_EVENT, isExtensionPromptPath, AgentInstructionFileType } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/service/promptsService';
34
- import { Delayer } from '@codingame/monaco-vscode-api/vscode/vs/base/common/async';
35
- import { Schemas } from '@codingame/monaco-vscode-api/vscode/vs/base/common/network';
36
- import { parseSubagentHooksFromYaml } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/hookSchema';
37
- import { parseHooksFromFile, HookSourceFormat } from '../hookCompatibility.js';
38
- import { IWorkspaceContextService } from '@codingame/monaco-vscode-api/vscode/vs/platform/workspace/common/workspace.service';
39
- import { IWorkspaceTrustManagementService } from '@codingame/monaco-vscode-api/vscode/vs/platform/workspace/common/workspaceTrust.service';
40
- import { IPathService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/path/common/pathService.service';
41
- import { getTarget, mapClaudeModels, mapClaudeTools } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptFileAttributes';
42
- import { ContextKeyExpr } from '@codingame/monaco-vscode-api/vscode/vs/platform/contextkey/common/contextkey';
43
- import { IContextKeyService } from '@codingame/monaco-vscode-api/vscode/vs/platform/contextkey/common/contextkey.service';
44
- import { getCanonicalPluginCommandId } from '../../plugins/agentPluginService.js';
45
- import { IAgentPluginService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/plugins/agentPluginService.service';
46
- import { isContributionEnabled } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/enablement';
47
- import { assertNever } from '@codingame/monaco-vscode-api/vscode/vs/base/common/assert';
48
- import { autorun } from '@codingame/monaco-vscode-api/vscode/vs/base/common/observableInternal/reactions/autorun';
49
-
50
- class SkillMissingNameError extends Error {
51
- constructor(uri) {
52
- super("Skill file must have a name attribute");
53
- this.uri = uri;
54
- }
55
- }
56
- class SkillMissingDescriptionError extends Error {
57
- constructor(uri) {
58
- super("Skill file must have a description attribute");
59
- this.uri = uri;
60
- }
61
- }
62
- class SkillNameMismatchError extends Error {
63
- constructor(uri, skillName, folderName) {
64
- super(
65
- `Skill name must match folder name: expected "${folderName}" but got "${skillName}"`
66
- );
67
- this.uri = uri;
68
- this.skillName = skillName;
69
- this.folderName = folderName;
70
- }
71
- }
72
- let PromptsService = class PromptsService extends Disposable {
73
- constructor(
74
- logger,
75
- labelService,
76
- modelService,
77
- instantiationService,
78
- userDataService,
79
- configurationService,
80
- fileService,
81
- filesConfigService,
82
- storageService,
83
- extensionService,
84
- telemetryService,
85
- workspaceService,
86
- pathService,
87
- contextKeyService,
88
- agentPluginService,
89
- workspaceTrustService
90
- ) {
91
- super();
92
- this.logger = logger;
93
- this.labelService = labelService;
94
- this.modelService = modelService;
95
- this.instantiationService = instantiationService;
96
- this.userDataService = userDataService;
97
- this.configurationService = configurationService;
98
- this.fileService = fileService;
99
- this.filesConfigService = filesConfigService;
100
- this.storageService = storageService;
101
- this.extensionService = extensionService;
102
- this.telemetryService = telemetryService;
103
- this.workspaceService = workspaceService;
104
- this.pathService = pathService;
105
- this.contextKeyService = contextKeyService;
106
- this.agentPluginService = agentPluginService;
107
- this.workspaceTrustService = workspaceTrustService;
108
- this.cachedParsedPromptFromModels = ( new ResourceMap());
109
- this.cachedFileLocations = {};
110
- this.fileLocatorEvents = {};
111
- this.contributedFiles = {
112
- [PromptsType.prompt]: ( new ResourceMap()),
113
- [PromptsType.instructions]: ( new ResourceMap()),
114
- [PromptsType.agent]: ( new ResourceMap()),
115
- [PromptsType.skill]: ( new ResourceMap()),
116
- [PromptsType.hook]: ( new ResourceMap())
117
- };
118
- this._contributedWhenKeys = ( new Set());
119
- this._contributedWhenClauses = ( new Map());
120
- this._providerWhenClauses = ( new Map());
121
- this._onDidContributedWhenChange = this._register(( new Emitter()));
122
- this._onDidChangeInstructions = this._register(( new Emitter()));
123
- this._onDidPluginPromptFilesChange = this._register(( new Emitter()));
124
- this._onDidPluginHooksChange = this._register(( new Emitter()));
125
- this._pluginPromptFilesByType = ( new Map());
126
- this._pendingReadonlyUris = [];
127
- this._pendingReadonlyFlush = false;
128
- this.promptFileProviders = [];
129
- this.disabledPromptsStorageKeyPrefix = "chat.disabledPromptFiles.";
130
- this.fileLocator = this.createPromptFilesLocator();
131
- this._register(this.modelService.onModelRemoved(model => {
132
- this.cachedParsedPromptFromModels.delete(model.uri);
133
- }));
134
- this._register(this.contextKeyService.onDidChangeContext(e => {
135
- if (e.affectsSome(this._contributedWhenKeys)) {
136
- for (const type of ( Object.keys(this.cachedFileLocations))) {
137
- this.cachedFileLocations[type] = undefined;
138
- }
139
- this._onDidContributedWhenChange.fire();
140
- }
141
- }));
142
- const modelChangeEvent = this._register(( new ModelChangeTracker(this.modelService))).onDidPromptChange;
143
- this.cachedCustomAgents = this._register(( new CachedPromise(token => this.computeAgentDiscoveryInfo(token), () => Event.any(
144
- this.getFileLocatorEvent(PromptsType.agent),
145
- Event.filter(modelChangeEvent, e => e.promptType === PromptsType.agent),
146
- this._onDidContributedWhenChange.event,
147
- Event.filter(
148
- this.configurationService.onDidChangeConfiguration,
149
- e => e.affectsConfiguration(PromptsConfig.USE_CUSTOM_AGENT_HOOKS)
150
- ),
151
- this._onDidPluginPromptFilesChange.event
152
- ))));
153
- this.cachedSlashCommands = this._register(( new CachedPromise(token => this.computeSlashCommandDiscoveryInfo(token), () => Event.any(
154
- this.getFileLocatorEvent(PromptsType.prompt),
155
- this.getFileLocatorEvent(PromptsType.skill),
156
- Event.filter(modelChangeEvent, e => e.promptType === PromptsType.prompt),
157
- Event.filter(modelChangeEvent, e => e.promptType === PromptsType.skill),
158
- this._onDidContributedWhenChange.event,
159
- this._onDidPluginPromptFilesChange.event
160
- ))));
161
- this.cachedSkills = this._register(( new CachedPromise(token => this.computeSkillDiscovery(token), () => Event.any(
162
- this.getFileLocatorEvent(PromptsType.skill),
163
- Event.filter(modelChangeEvent, e => e.promptType === PromptsType.skill),
164
- this._onDidContributedWhenChange.event,
165
- this._onDidPluginPromptFilesChange.event
166
- ))));
167
- this.cachedHooks = this._register(( new CachedPromise(
168
- token => this.computeHooks(token),
169
- () => Event.any(this.getFileLocatorEvent(PromptsType.hook), Event.filter(
170
- this.configurationService.onDidChangeConfiguration,
171
- e => e.affectsConfiguration(PromptsConfig.USE_CHAT_HOOKS) || e.affectsConfiguration(PromptsConfig.USE_CLAUDE_HOOKS)
172
- ), this._onDidPluginHooksChange.event, this.workspaceTrustService.onDidChangeTrust)
173
- )));
174
- this.cachedInstructions = this._register(( new CachedPromise(token => this.computeInstructionFiles(token), () => Event.any(
175
- this.getFileLocatorEvent(PromptsType.instructions),
176
- this._onDidContributedWhenChange.event,
177
- this._onDidChangeInstructions.event,
178
- this._onDidPluginPromptFilesChange.event
179
- ))));
180
- this._register(
181
- this.watchPluginPromptFilesForType(PromptsType.prompt, (plugin, reader) => plugin.commands.read(reader))
182
- );
183
- this._register(
184
- this.watchPluginPromptFilesForType(PromptsType.skill, (plugin, reader) => plugin.skills.read(reader))
185
- );
186
- this._register(
187
- this.watchPluginPromptFilesForType(PromptsType.agent, (plugin, reader) => plugin.agents.read(reader))
188
- );
189
- this._register(this.watchPluginPromptFilesForType(
190
- PromptsType.instructions,
191
- (plugin, reader) => plugin.instructions.read(reader)
192
- ));
193
- this._register(autorun(reader => {
194
- const plugins = this.agentPluginService.plugins.read(reader);
195
- const hookFiles = [];
196
- for (const plugin of plugins) {
197
- if (isContributionEnabled(plugin.enablement.read(reader))) {
198
- for (const hook of plugin.hooks.read(reader)) {
199
- hookFiles.push({
200
- uri: hook.uri,
201
- storage: PromptsStorage.plugin,
202
- type: PromptsType.hook,
203
- name: getCanonicalPluginCommandId(plugin, hook.originalId),
204
- pluginUri: plugin.uri,
205
- source: PromptFileSource.Plugin
206
- });
207
- }
208
- }
209
- }
210
- this._pluginPromptFilesByType.set(PromptsType.hook, hookFiles);
211
- this.cachedFileLocations[PromptsType.hook] = undefined;
212
- this._onDidPluginHooksChange.fire();
213
- }));
214
- }
215
- watchPluginPromptFilesForType(type, getItems) {
216
- return autorun(reader => {
217
- const plugins = this.agentPluginService.plugins.read(reader);
218
- const nextFiles = [];
219
- for (const plugin of plugins) {
220
- if (!isContributionEnabled(plugin.enablement.read(reader))) {
221
- continue;
222
- }
223
- for (const item of getItems(plugin, reader)) {
224
- nextFiles.push({
225
- uri: item.uri,
226
- storage: PromptsStorage.plugin,
227
- type,
228
- name: getCanonicalPluginCommandId(plugin, item.name),
229
- pluginUri: plugin.uri,
230
- source: PromptFileSource.Plugin
231
- });
232
- }
233
- }
234
- nextFiles.sort((a, b) => `${a.name ?? ""}|${( a.uri.toString())}`.localeCompare(`${b.name ?? ""}|${( b.uri.toString())}`));
235
- this._pluginPromptFilesByType.set(type, nextFiles);
236
- this.cachedFileLocations[type] = undefined;
237
- this._onDidPluginPromptFilesChange.fire();
238
- });
239
- }
240
- createPromptFilesLocator() {
241
- return this.instantiationService.createInstance(PromptFilesLocator);
242
- }
243
- getFileLocatorEvent(type) {
244
- let event = this.fileLocatorEvents[type];
245
- if (!event) {
246
- event = this.fileLocatorEvents[type] = this._register(this.fileLocator.createFilesUpdatedEvent(type)).event;
247
- this._register(event(() => {
248
- this.cachedFileLocations[type] = undefined;
249
- }));
250
- }
251
- return event;
252
- }
253
- getParsedPromptFile(textModel) {
254
- const cached = this.cachedParsedPromptFromModels.get(textModel.uri);
255
- if (cached && cached[0] === textModel.getVersionId()) {
256
- return cached[1];
257
- }
258
- const ast = ( new PromptFileParser()).parse(textModel.uri, textModel.getValue());
259
- if (!cached || cached[0] < textModel.getVersionId()) {
260
- this.cachedParsedPromptFromModels.set(textModel.uri, [textModel.getVersionId(), ast]);
261
- }
262
- return ast;
263
- }
264
- async listPromptFiles(type, token) {
265
- let listPromise = this.cachedFileLocations[type];
266
- if (!listPromise) {
267
- listPromise = this.computeListPromptFiles(type, token);
268
- if (!this.fileLocatorEvents[type]) {
269
- return listPromise;
270
- }
271
- this.cachedFileLocations[type] = listPromise;
272
- return listPromise;
273
- }
274
- return listPromise;
275
- }
276
- async computeListPromptFiles(type, token) {
277
- const prompts = await Promise.all([
278
- this.fileLocator.listFiles(type, PromptsStorage.user, token).then(uris => ( uris.map(uri => ({
279
- uri,
280
- storage: PromptsStorage.user,
281
- type
282
- })))),
283
- this.fileLocator.listFiles(type, PromptsStorage.local, token).then(uris => ( uris.map(uri => ({
284
- uri,
285
- storage: PromptsStorage.local,
286
- type
287
- })))),
288
- this.getExtensionPromptFiles(type, token),
289
- this._pluginPromptFilesByType.get(type) ?? []
290
- ]);
291
- return prompts.flat();
292
- }
293
- async _collectSourceFolderDiagnostics(type) {
294
- const resolvedFolders = await this.fileLocator.getSourceFoldersInDiscoveryOrder(type);
295
- return ( resolvedFolders.map(folder => ({
296
- uri: folder.uri,
297
- storage: folder.storage
298
- })));
299
- }
300
- registerPromptFileProvider(extension, type, provider) {
301
- const providerEntry = {
302
- extension,
303
- type,
304
- ...provider
305
- };
306
- this.promptFileProviders.push(providerEntry);
307
- const disposables = ( new DisposableStore());
308
- if (provider.onDidChangePromptFiles) {
309
- disposables.add(provider.onDidChangePromptFiles(() => {
310
- this.invalidatePromptFileCache(type);
311
- }));
312
- }
313
- this.invalidatePromptFileCache(type);
314
- disposables.add({
315
- dispose: () => {
316
- const index = this.promptFileProviders.findIndex(p => p === providerEntry);
317
- if (index >= 0) {
318
- this.promptFileProviders.splice(index, 1);
319
- this._providerWhenClauses.delete(providerEntry);
320
- this._updateContributedWhenKeys();
321
- this.invalidatePromptFileCache(type);
322
- }
323
- }
324
- });
325
- return disposables;
326
- }
327
- invalidatePromptFileCache(type) {
328
- if (type === PromptsType.agent) {
329
- this.cachedFileLocations[PromptsType.agent] = undefined;
330
- this.cachedCustomAgents.refresh();
331
- } else if (type === PromptsType.instructions) {
332
- this.cachedFileLocations[PromptsType.instructions] = undefined;
333
- this._onDidChangeInstructions.fire();
334
- } else if (type === PromptsType.prompt) {
335
- this.cachedFileLocations[PromptsType.prompt] = undefined;
336
- this.cachedSlashCommands.refresh();
337
- } else if (type === PromptsType.skill) {
338
- this.cachedFileLocations[PromptsType.skill] = undefined;
339
- this.cachedSkills.refresh();
340
- this.cachedSlashCommands.refresh();
341
- }
342
- }
343
- async listFromProviders(type, activationEvent, token) {
344
- const result = [];
345
- const readonlyUris = [];
346
- await this.extensionService.activateByEvent(activationEvent);
347
- const providers = this.promptFileProviders.filter(p => p.type === type);
348
- if (providers.length === 0) {
349
- return result;
350
- }
351
- for (const providerEntry of providers) {
352
- try {
353
- const files = await providerEntry.providePromptFiles({}, token);
354
- this._providerWhenClauses.set(providerEntry, files?.flatMap(file => file.when ? [file.when] : []) ?? []);
355
- this._updateContributedWhenKeys();
356
- if (!files || token.isCancellationRequested) {
357
- continue;
358
- }
359
- for (const file of files) {
360
- readonlyUris.push(file.uri);
361
- result.push({
362
- uri: file.uri,
363
- storage: PromptsStorage.extension,
364
- type,
365
- extension: providerEntry.extension,
366
- source: PromptFileSource.ExtensionAPI,
367
- name: file.name,
368
- description: file.description,
369
- when: file.when,
370
- sessionTypes: file.sessionTypes
371
- });
372
- }
373
- } catch (e) {
374
- this.logger.error(
375
- `[listFromProviders] Failed to get ${type} files from provider`,
376
- e instanceof Error ? e.message : String(e)
377
- );
378
- }
379
- }
380
- void this.filesConfigService.updateReadonly(readonlyUris, true);
381
- return result;
382
- }
383
- async listPromptFilesForStorage(type, storage, token) {
384
- let promptPaths;
385
- switch (storage) {
386
- case PromptsStorage.extension:
387
- promptPaths = await this.getExtensionPromptFiles(type, token);
388
- break;
389
- case PromptsStorage.local:
390
- promptPaths = await this.fileLocator.listFiles(type, PromptsStorage.local, token).then(uris => ( uris.map(uri => ({
391
- uri,
392
- storage: PromptsStorage.local,
393
- type
394
- }))));
395
- break;
396
- case PromptsStorage.user:
397
- promptPaths = await this.fileLocator.listFiles(type, PromptsStorage.user, token).then(uris => ( uris.map(uri => ({
398
- uri,
399
- storage: PromptsStorage.user,
400
- type
401
- }))));
402
- break;
403
- case PromptsStorage.plugin:
404
- promptPaths = this._pluginPromptFilesByType.get(type) ?? [];
405
- break;
406
- default:
407
- throw ( new Error(`[listPromptFilesForStorage] Unsupported prompt storage type: ${storage}`));
408
- }
409
- return promptPaths;
410
- }
411
- async getExtensionPromptFiles(type, token) {
412
- await this.extensionService.whenInstalledExtensionsRegistered();
413
- const settledResults = await Promise.allSettled(( this.contributedFiles[type].values()));
414
- const contributedFiles = ( settledResults.filter(result => result.status === "fulfilled").map(result => result.value));
415
- const activationEvent = this.getProviderActivationEvent(type);
416
- const providerFiles = activationEvent ? await this.listFromProviders(type, activationEvent, token) : [];
417
- return [...contributedFiles, ...providerFiles].filter(file => {
418
- if (!file.when) {
419
- return true;
420
- }
421
- const when = ContextKeyExpr.deserialize(file.when);
422
- if (!when) {
423
- this.logger.warn(
424
- `[getExtensionPromptFiles] Ignoring contributed prompt file with invalid when clause: ${file.when}`
425
- );
426
- return false;
427
- }
428
- return this.contextKeyService.contextMatchesRules(when);
429
- });
430
- }
431
- getProviderActivationEvent(type) {
432
- switch (type) {
433
- case PromptsType.agent:
434
- return CUSTOM_AGENT_PROVIDER_ACTIVATION_EVENT;
435
- case PromptsType.instructions:
436
- return INSTRUCTIONS_PROVIDER_ACTIVATION_EVENT;
437
- case PromptsType.prompt:
438
- return PROMPT_FILE_PROVIDER_ACTIVATION_EVENT;
439
- case PromptsType.skill:
440
- return SKILL_PROVIDER_ACTIVATION_EVENT;
441
- case PromptsType.hook:
442
- return undefined;
443
- }
444
- }
445
- async getSourceFolders(type) {
446
- const result = [];
447
- if (type === PromptsType.hook) {
448
- const hooksFolders = await this.fileLocator.getHookSourceFolders();
449
- for (const uri of hooksFolders) {
450
- result.push({
451
- uri,
452
- storage: PromptsStorage.local,
453
- type
454
- });
455
- }
456
- } else {
457
- for (const uri of await this.fileLocator.getConfigBasedSourceFolders(type)) {
458
- result.push({
459
- uri,
460
- storage: PromptsStorage.local,
461
- type
462
- });
463
- }
464
- }
465
- if (type !== PromptsType.skill && type !== PromptsType.hook) {
466
- const userHome = this.userDataService.currentProfile.promptsHome;
467
- result.push({
468
- uri: userHome,
469
- storage: PromptsStorage.user,
470
- type
471
- });
472
- }
473
- return result;
474
- }
475
- async getResolvedSourceFolders(type) {
476
- return this.fileLocator.getResolvedSourceFolders(type);
477
- }
478
- get onDidChangeSlashCommands() {
479
- return this.cachedSlashCommands.onDidChangePromise;
480
- }
481
- async getPromptSlashCommands(token) {
482
- const discoveryInfo = await this.cachedSlashCommands.get(token);
483
- const result = this.slashCommandsFromDiscoveryInfo(discoveryInfo);
484
- return result;
485
- }
486
- async computeSlashCommandDiscoveryInfo(token) {
487
- const stopWatch = StopWatch.create(true);
488
- const promptFiles = await this.listPromptFiles(PromptsType.prompt, token);
489
- const useAgentSkills = this.configurationService.getValue(PromptsConfig.USE_AGENT_SKILLS);
490
- const skills = useAgentSkills ? await this.listPromptFiles(PromptsType.skill, token) : [];
491
- const disabledSkills = this.getDisabledPromptFiles(PromptsType.skill);
492
- const slashCommandFiles = [...promptFiles, ...skills.filter(s => !( disabledSkills.has(s.uri)))];
493
- const parseResults = await Promise.all(( slashCommandFiles.map(async promptPath => {
494
- try {
495
- const parsedPromptFile = await this.parseNew(promptPath.uri, token);
496
- const rawName = parsedPromptFile?.header?.name ?? promptPath.name ?? getCleanPromptName(promptPath.uri);
497
- const name = promptPath.source === PromptFileSource.Plugin && promptPath.pluginUri ? getCanonicalPluginCommandId({
498
- uri: promptPath.pluginUri
499
- }, rawName) : rawName;
500
- const description = parsedPromptFile?.header?.description ?? promptPath.description;
501
- const argumentHint = parsedPromptFile?.header?.argumentHint;
502
- const userInvocable = parsedPromptFile?.header?.userInvocable;
503
- return {
504
- status: "loaded",
505
- promptPath: this.withPromptPathMetadata(promptPath, name, description),
506
- argumentHint,
507
- userInvocable
508
- };
509
- } catch (e) {
510
- this.logger.error(
511
- `[computeSlashCommandDiscoveryInfo] Failed to parse prompt file for slash command: ${promptPath.uri}`,
512
- e instanceof Error ? e.message : String(e)
513
- );
514
- return {
515
- status: "skipped",
516
- skipReason: "parse-error",
517
- errorMessage: e instanceof Error ? e.message : String(e),
518
- promptPath
519
- };
520
- }
521
- })));
522
- const files = parseResults;
523
- const promptSourceFolders = await this._collectSourceFolderDiagnostics(PromptsType.prompt);
524
- const sourceFolders = [...promptSourceFolders];
525
- if (useAgentSkills) {
526
- const skillSourceFolders = await this._collectSourceFolderDiagnostics(PromptsType.skill);
527
- sourceFolders.push(...skillSourceFolders);
528
- }
529
- return {
530
- type: PromptsType.prompt,
531
- files,
532
- sourceFolders,
533
- durationInMillis: stopWatch.elapsed()
534
- };
535
- }
536
- slashCommandsFromDiscoveryInfo(discoveryInfo) {
537
- const result = [];
538
- const seen = ( new ResourceSet());
539
- for (const file of discoveryInfo.files) {
540
- if (file.status === "loaded") {
541
- result.push(
542
- this.asChatPromptSlashCommand(file.argumentHint, file.userInvocable, file.promptPath)
543
- );
544
- seen.add(file.promptPath.uri);
545
- }
546
- }
547
- for (const model of this.modelService.getModels()) {
548
- if (model.getLanguageId() === PROMPT_LANGUAGE_ID && model.uri.scheme === Schemas.untitled && !( seen.has(model.uri))) {
549
- const parsedPromptFile = this.getParsedPromptFile(model);
550
- const name = parsedPromptFile?.header?.name ?? getCleanPromptName(model.uri);
551
- const description = parsedPromptFile?.header?.description;
552
- result.push(this.asChatPromptSlashCommand(
553
- parsedPromptFile?.header?.argumentHint,
554
- parsedPromptFile?.header?.userInvocable,
555
- {
556
- uri: model.uri,
557
- storage: PromptsStorage.local,
558
- type: PromptsType.prompt,
559
- name,
560
- description
561
- }
562
- ));
563
- }
564
- }
565
- return result;
566
- }
567
- isValidSlashCommandName(command) {
568
- return command.match(/^[\p{L}\d_\-\.:]+$/u) !== null;
569
- }
570
- async resolvePromptSlashCommand(name, token) {
571
- const commands = await this.getPromptSlashCommands(token);
572
- const command = commands.find(cmd => cmd.name === name);
573
- if (command) {
574
- return {
575
- ...command,
576
- parsedPromptFile: await this.parseNew(command.uri, token)
577
- };
578
- }
579
- return undefined;
580
- }
581
- asChatPromptSlashCommand(argumentHint, userInvocable, promptPath) {
582
- let name = promptPath.name ?? getCleanPromptName(promptPath.uri);
583
- name = name.replace(/[^\p{L}\d_\-\.:]+/gu, "-");
584
- const when = isExtensionPromptPath(promptPath) && promptPath.when ? ContextKeyExpr.deserialize(promptPath.when) ?? undefined : undefined;
585
- return {
586
- uri: promptPath.uri,
587
- name: name,
588
- source: promptPath.source,
589
- storage: promptPath.storage,
590
- type: promptPath.type,
591
- extension: promptPath.extension,
592
- pluginUri: promptPath.pluginUri,
593
- description: promptPath.description,
594
- argumentHint: argumentHint,
595
- userInvocable: userInvocable ?? true,
596
- when,
597
- sessionTypes: promptPath.sessionTypes
598
- };
599
- }
600
- async getPromptSlashCommandName(uri, token) {
601
- const slashCommands = await this.getPromptSlashCommands(token);
602
- const slashCommand = slashCommands.find(c => isEqual(c.uri, uri));
603
- if (!slashCommand) {
604
- return getCleanPromptName(uri);
605
- }
606
- return slashCommand.name;
607
- }
608
- get onDidChangeCustomAgents() {
609
- return this.cachedCustomAgents.onDidChangePromise;
610
- }
611
- get onDidChangeInstructions() {
612
- return this.cachedInstructions.onDidChangePromise;
613
- }
614
- async getCustomAgents(token) {
615
- const discoveryInfo = await this.cachedCustomAgents.get(token);
616
- const result = this.agentsFromDiscoveryInfo(discoveryInfo);
617
- return result;
618
- }
619
- agentsFromDiscoveryInfo(discoveryInfo) {
620
- const result = [];
621
- for (const file of discoveryInfo.files) {
622
- if (file.status === "loaded" && file.agent) {
623
- result.push(file.agent);
624
- }
625
- }
626
- return result;
627
- }
628
- async computeAgentDiscoveryInfo(token) {
629
- const stopWatch = StopWatch.create(true);
630
- const allAgentFiles = await this.listPromptFiles(PromptsType.agent, token);
631
- const disabledAgents = this.getDisabledPromptFiles(PromptsType.agent);
632
- const userHomeUri = await this.pathService.userHome();
633
- const userHome = userHomeUri.scheme === Schemas.file ? userHomeUri.fsPath : userHomeUri.path;
634
- const defaultFolder = this.workspaceService.getWorkspace().folders[0];
635
- const files = await Promise.all(( allAgentFiles.map(async promptPath => {
636
- const uri = promptPath.uri;
637
- if (( disabledAgents.has(uri))) {
638
- return {
639
- status: "skipped",
640
- skipReason: "disabled",
641
- promptPath
642
- };
643
- }
644
- try {
645
- const ast = await this.parseNew(uri, token);
646
- let metadata;
647
- if (ast.header) {
648
- const advanced = ast.header.getAttribute(PromptHeaderAttributes.advancedOptions);
649
- if (advanced && advanced.value.type === "map") {
650
- metadata = {};
651
- for (const [key, value] of Object.entries(advanced.value)) {
652
- if (value.type === "scalar") {
653
- metadata[key] = value;
654
- }
655
- }
656
- }
657
- }
658
- const toolReferences = [];
659
- if (ast.body) {
660
- const bodyOffset = ast.body.offset;
661
- const bodyVarRefs = ast.body.variableReferences;
662
- for (let i = bodyVarRefs.length - 1; i >= 0; i--) {
663
- const {
664
- name,
665
- offset,
666
- fullLength
667
- } = bodyVarRefs[i];
668
- const range = ( new OffsetRange(offset - bodyOffset, offset - bodyOffset + fullLength));
669
- toolReferences.push({
670
- name,
671
- range
672
- });
673
- }
674
- }
675
- const agentInstructions = {
676
- content: ast.body?.getContent() ?? "",
677
- toolReferences,
678
- metadata
679
- };
680
- const name = ast.header?.name ?? promptPath.name ?? getCleanPromptName(uri);
681
- const description = ast.header?.description ?? promptPath.description;
682
- const target = getTarget(PromptsType.agent, ast.header ?? uri);
683
- const source = IAgentSource.fromPromptPath(promptPath);
684
- const when = isExtensionPromptPath(promptPath) && promptPath.when ? ContextKeyExpr.deserialize(promptPath.when) ?? undefined : undefined;
685
- if (!ast.header) {
686
- const agent = {
687
- uri,
688
- name,
689
- agentInstructions,
690
- source,
691
- target,
692
- visibility: {
693
- userInvocable: true,
694
- agentInvocable: true
695
- },
696
- sessionTypes: promptPath.sessionTypes,
697
- ...(when !== undefined ? {
698
- when
699
- } : undefined)
700
- };
701
- return {
702
- status: "loaded",
703
- promptPath: this.withPromptPathMetadata(promptPath, name, description),
704
- agent
705
- };
706
- }
707
- const visibility = {
708
- userInvocable: ast.header.userInvocable !== false,
709
- agentInvocable: ast.header.infer !== undefined ? ast.header.infer === true : ast.header.disableModelInvocation !== true
710
- };
711
- let model = ast.header.model;
712
- if (target === Target.Claude && model) {
713
- model = mapClaudeModels(model);
714
- }
715
- let {
716
- tools,
717
- handOffs,
718
- argumentHint,
719
- agents
720
- } = ast.header;
721
- if (target === Target.Claude && tools) {
722
- tools = mapClaudeTools(tools);
723
- }
724
- let hooks;
725
- const useCustomAgentHooks = this.configurationService.getValue(PromptsConfig.USE_CUSTOM_AGENT_HOOKS);
726
- const hooksRaw = ast.header.hooksRaw;
727
- if (useCustomAgentHooks && hooksRaw) {
728
- const hookWorkspaceFolder = this.workspaceService.getWorkspaceFolder(uri) ?? defaultFolder;
729
- const workspaceRootUri = hookWorkspaceFolder?.uri;
730
- hooks = parseSubagentHooksFromYaml(hooksRaw, workspaceRootUri, userHome, target);
731
- }
732
- const agent = {
733
- uri,
734
- name,
735
- description,
736
- model,
737
- tools,
738
- handOffs,
739
- argumentHint,
740
- target,
741
- visibility,
742
- agents,
743
- hooks,
744
- agentInstructions,
745
- source,
746
- sessionTypes: promptPath.sessionTypes,
747
- ...(when !== undefined ? {
748
- when
749
- } : undefined)
750
- };
751
- return {
752
- status: "loaded",
753
- promptPath: this.withPromptPathMetadata(promptPath, name, description),
754
- agent
755
- };
756
- } catch (e) {
757
- const error = e instanceof Error ? e : ( new Error(String(e)));
758
- if (error instanceof FileOperationError && error.fileOperationResult === FileOperationResult.FILE_NOT_FOUND) {
759
- this.logger.warn(
760
- `[computeAgentDiscoveryInfo] Skipping agent file that does not exist: ${uri}`,
761
- error.message
762
- );
763
- } else {
764
- this.logger.error(`[computeAgentDiscoveryInfo] Failed to parse agent file: ${uri}`, error);
765
- }
766
- return {
767
- status: "skipped",
768
- skipReason: "parse-error",
769
- errorMessage: error.message,
770
- promptPath
771
- };
772
- }
773
- })));
774
- const sourceFolders = await this._collectSourceFolderDiagnostics(PromptsType.agent);
775
- return {
776
- type: PromptsType.agent,
777
- files,
778
- sourceFolders,
779
- durationInMillis: stopWatch.elapsed()
780
- };
781
- }
782
- async parseNew(uri, token) {
783
- const model = this.modelService.getModel(uri);
784
- if (model) {
785
- return this.getParsedPromptFile(model);
786
- }
787
- const fileContent = await this.fileService.readFile(uri);
788
- if (token.isCancellationRequested) {
789
- throw ( new CancellationError());
790
- }
791
- return ( new PromptFileParser()).parse(uri, ( fileContent.value.toString()));
792
- }
793
- registerContributedFile(type, uri, extension, name, description, when, sessionTypes) {
794
- const bucket = this.contributedFiles[type];
795
- if (( bucket.has(uri))) {
796
- return Disposable.None;
797
- }
798
- const entryPromise = (async () => {
799
- if (type === PromptsType.skill) {
800
- try {
801
- const validated = await this.validateAndSanitizeSkillFile(uri, CancellationToken.None);
802
- name = validated.name;
803
- description = validated.description;
804
- } catch (e) {
805
- const msg = e instanceof Error ? e.message : String(e);
806
- this.logger.error(
807
- `[registerContributedFile] Extension '${extension.identifier.value}' failed to validate skill file: ${uri}`,
808
- msg
809
- );
810
- throw e;
811
- }
812
- }
813
- return {
814
- uri,
815
- name,
816
- description,
817
- when,
818
- sessionTypes,
819
- storage: PromptsStorage.extension,
820
- type,
821
- extension,
822
- source: PromptFileSource.ExtensionContribution
823
- };
824
- })();
825
- bucket.set(uri, entryPromise);
826
- this._enqueueReadonlyUpdate(uri);
827
- if (when) {
828
- this._contributedWhenClauses.set(`${type}/${( uri.toString())}`, when);
829
- }
830
- const flushCachesIfRequired = () => {
831
- this._updateContributedWhenKeys();
832
- this.cachedFileLocations[type] = undefined;
833
- switch (type) {
834
- case PromptsType.agent:
835
- this.cachedCustomAgents.refresh();
836
- break;
837
- case PromptsType.prompt:
838
- this.cachedSlashCommands.refresh();
839
- break;
840
- case PromptsType.skill:
841
- this.cachedSkills.refresh();
842
- this.cachedSlashCommands.refresh();
843
- break;
844
- }
845
- };
846
- flushCachesIfRequired();
847
- return {
848
- dispose: () => {
849
- bucket.delete(uri);
850
- this._contributedWhenClauses.delete(`${type}/${( uri.toString())}`);
851
- flushCachesIfRequired();
852
- }
853
- };
854
- }
855
- _enqueueReadonlyUpdate(uri) {
856
- this._pendingReadonlyUris.push(uri);
857
- if (!this._pendingReadonlyFlush) {
858
- this._pendingReadonlyFlush = true;
859
- queueMicrotask(() => {
860
- const uris = this._pendingReadonlyUris;
861
- this._pendingReadonlyUris = [];
862
- this._pendingReadonlyFlush = false;
863
- void this.filesConfigService.updateReadonly(uris, true);
864
- });
865
- }
866
- }
867
- _updateContributedWhenKeys() {
868
- this._contributedWhenKeys.clear();
869
- for (const whenClause of ( this._contributedWhenClauses.values())) {
870
- const expr = ContextKeyExpr.deserialize(whenClause);
871
- for (const key of expr?.keys() ?? []) {
872
- this._contributedWhenKeys.add(key);
873
- }
874
- }
875
- for (const whenClauses of ( this._providerWhenClauses.values())) {
876
- for (const whenClause of whenClauses) {
877
- const expr = ContextKeyExpr.deserialize(whenClause);
878
- for (const key of expr?.keys() ?? []) {
879
- this._contributedWhenKeys.add(key);
880
- }
881
- }
882
- }
883
- }
884
- getPromptLocationLabel(promptPath) {
885
- switch (promptPath.storage) {
886
- case PromptsStorage.local:
887
- return this.labelService.getUriLabel(dirname(promptPath.uri), {
888
- relative: true
889
- });
890
- case PromptsStorage.user:
891
- return localize(7746, "User Data");
892
- case PromptsStorage.extension:
893
- {
894
- return localize(
895
- 7747,
896
- "Extension: {0}",
897
- promptPath.extension.displayName ?? promptPath.extension.id
898
- );
899
- }
900
- case PromptsStorage.plugin:
901
- return localize(7748, "Plugin");
902
- default:
903
- assertNever(promptPath, "Unknown prompt storage type");
904
- }
905
- }
906
- async listNestedAgentMDs(token) {
907
- const useAgentMD = this.configurationService.getValue(PromptsConfig.USE_AGENT_MD);
908
- if (!useAgentMD) {
909
- return [];
910
- }
911
- const useNestedAgentMD = this.configurationService.getValue(PromptsConfig.USE_NESTED_AGENT_MD);
912
- if (useNestedAgentMD) {
913
- return await this.fileLocator.findAgentMDsInWorkspace(token);
914
- }
915
- return [];
916
- }
917
- async listAgentInstructions(token, logger) {
918
- const resolvedAgentFiles = [];
919
- const promises = [];
920
- const includeParents = this.configurationService.getValue(PromptsConfig.USE_CUSTOMIZATIONS_IN_PARENT_REPOS) === true;
921
- const rootFolders = await this.fileLocator.getWorkspaceFolderRoots(includeParents, logger);
922
- const rootFiles = [];
923
- const useAgentMD = this.configurationService.getValue(PromptsConfig.USE_AGENT_MD);
924
- if (!useAgentMD) {
925
- logger?.logInfo("Agent MD files are disabled via configuration.");
926
- } else {
927
- rootFiles.push({
928
- fileName: AGENT_MD_FILENAME,
929
- type: AgentInstructionFileType.agentsMd
930
- });
931
- }
932
- const useClaudeMD = this.configurationService.getValue(PromptsConfig.USE_CLAUDE_MD);
933
- if (!useClaudeMD) {
934
- logger?.logInfo("Claude MD files are disabled via configuration.");
935
- } else {
936
- const claudeMdFile = {
937
- fileName: CLAUDE_MD_FILENAME,
938
- type: AgentInstructionFileType.claudeMd
939
- };
940
- rootFiles.push(claudeMdFile);
941
- rootFiles.push({
942
- fileName: CLAUDE_LOCAL_MD_FILENAME,
943
- type: AgentInstructionFileType.claudeMd
944
- });
945
- promises.push(this.fileLocator.findFilesInRoots(
946
- rootFolders,
947
- CLAUDE_CONFIG_FOLDER,
948
- [claudeMdFile],
949
- token,
950
- resolvedAgentFiles
951
- ));
952
- promises.push(this.fileLocator.findFilesInRoots(
953
- [await this.pathService.userHome()],
954
- CLAUDE_CONFIG_FOLDER,
955
- [claudeMdFile],
956
- token,
957
- resolvedAgentFiles
958
- ));
959
- }
960
- const useCopilotInstructionsFiles = this.configurationService.getValue(PromptsConfig.USE_COPILOT_INSTRUCTION_FILES);
961
- if (!useCopilotInstructionsFiles) {
962
- logger?.logInfo("Copilot instructions files are disabled via configuration.");
963
- } else {
964
- const githubConfigFiles = [{
965
- fileName: COPILOT_CUSTOM_INSTRUCTIONS_FILENAME,
966
- type: AgentInstructionFileType.copilotInstructionsMd
967
- }];
968
- promises.push(this.fileLocator.findFilesInRoots(
969
- rootFolders,
970
- GITHUB_CONFIG_FOLDER,
971
- githubConfigFiles,
972
- token,
973
- resolvedAgentFiles
974
- ));
975
- }
976
- promises.push(
977
- this.fileLocator.findFilesInRoots(rootFolders, undefined, rootFiles, token, resolvedAgentFiles)
978
- );
979
- await Promise.all(promises);
980
- if (token.isCancellationRequested) {
981
- return [];
982
- }
983
- const seenFileURI = ( new ResourceSet());
984
- const symlinks = [];
985
- const result = [];
986
- const add = file => {
987
- if (file.realPath) {
988
- symlinks.push(file);
989
- } else {
990
- result.push(file);
991
- seenFileURI.add(file.uri);
992
- }
993
- return true;
994
- };
995
- resolvedAgentFiles.forEach(add);
996
- for (const symlink of symlinks) {
997
- if (( seenFileURI.has(symlink.realPath))) {
998
- logger?.logInfo(
999
- `Skipping symlinked agent instructions file ${symlink.uri} as target already included: ${symlink.realPath}`
1000
- );
1001
- } else {
1002
- result.push(symlink);
1003
- seenFileURI.add(symlink.realPath);
1004
- }
1005
- }
1006
- return result.sort((a, b) => ( a.uri.toString()).localeCompare(( b.uri.toString())));
1007
- }
1008
- getAgentFileURIFromModeFile(oldURI) {
1009
- return this.fileLocator.getAgentFileURIFromModeFile(oldURI);
1010
- }
1011
- getDisabledPromptFiles(type) {
1012
- const disabledKey = this.disabledPromptsStorageKeyPrefix + type;
1013
- const value = this.storageService.get(disabledKey, StorageScope.PROFILE, "[]");
1014
- const result = ( new ResourceSet());
1015
- try {
1016
- const arr = JSON.parse(value);
1017
- if (Array.isArray(arr)) {
1018
- for (const s of arr) {
1019
- try {
1020
- result.add(URI.revive(s));
1021
- } catch {}
1022
- }
1023
- }
1024
- } catch {}
1025
- return result;
1026
- }
1027
- setDisabledPromptFiles(type, uris) {
1028
- const disabled = ( Array.from(uris).map(uri => uri.toJSON()));
1029
- this.storageService.store(
1030
- this.disabledPromptsStorageKeyPrefix + type,
1031
- JSON.stringify(disabled),
1032
- StorageScope.PROFILE,
1033
- StorageTarget.USER
1034
- );
1035
- if (type === PromptsType.agent) {
1036
- this.cachedCustomAgents.refresh();
1037
- } else if (type === PromptsType.skill) {
1038
- this.cachedSkills.refresh();
1039
- this.cachedSlashCommands.refresh();
1040
- }
1041
- }
1042
- sanitizeAgentSkillText(text) {
1043
- return text.replace(/<[^>]+>/g, "");
1044
- }
1045
- async validateAndSanitizeSkillFile(uri, token) {
1046
- const parsedFile = await this.parseNew(uri, token);
1047
- const name = parsedFile.header?.name;
1048
- if (!name) {
1049
- this.logger.error(
1050
- `[validateAndSanitizeSkillFile] Agent skill file missing name attribute: ${uri}`
1051
- );
1052
- throw ( new SkillMissingNameError(uri));
1053
- }
1054
- const description = parsedFile.header?.description;
1055
- if (!description) {
1056
- this.logger.error(
1057
- `[validateAndSanitizeSkillFile] Agent skill file missing description attribute: ${uri}`
1058
- );
1059
- throw ( new SkillMissingDescriptionError(uri));
1060
- }
1061
- const sanitizedName = this.truncateAgentSkillName(name, uri);
1062
- const folderName = getSkillFolderName(uri);
1063
- if (sanitizedName !== folderName) {
1064
- this.logger.error(
1065
- `[validateAndSanitizeSkillFile] Agent skill name "${sanitizedName}" does not match folder name "${folderName}": ${uri}`
1066
- );
1067
- throw ( new SkillNameMismatchError(uri, sanitizedName, folderName));
1068
- }
1069
- const sanitizedDescription = this.truncateAgentSkillDescription(parsedFile.header?.description, uri);
1070
- return {
1071
- name: sanitizedName,
1072
- description: sanitizedDescription
1073
- };
1074
- }
1075
- truncateAgentSkillName(name, uri) {
1076
- const MAX_NAME_LENGTH = 64;
1077
- const sanitized = this.sanitizeAgentSkillText(name);
1078
- if (sanitized !== name) {
1079
- this.logger.debug(`[findAgentSkills] Agent skill name contains XML tags, removed: ${uri}`);
1080
- }
1081
- if (sanitized.length > MAX_NAME_LENGTH) {
1082
- this.logger.debug(
1083
- `[findAgentSkills] Agent skill name exceeds ${MAX_NAME_LENGTH} characters, truncated: ${uri}`
1084
- );
1085
- return sanitized.substring(0, MAX_NAME_LENGTH);
1086
- }
1087
- return sanitized;
1088
- }
1089
- truncateAgentSkillDescription(description, uri) {
1090
- if (!description) {
1091
- return undefined;
1092
- }
1093
- const MAX_DESCRIPTION_LENGTH = 1024;
1094
- const sanitized = this.sanitizeAgentSkillText(description);
1095
- if (sanitized !== description) {
1096
- this.logger.debug(
1097
- `[findAgentSkills] Agent skill description contains XML tags, removed: ${uri}`
1098
- );
1099
- }
1100
- if (sanitized.length > MAX_DESCRIPTION_LENGTH) {
1101
- this.logger.debug(
1102
- `[findAgentSkills] Agent skill description exceeds ${MAX_DESCRIPTION_LENGTH} characters, truncated: ${uri}`
1103
- );
1104
- return sanitized.substring(0, MAX_DESCRIPTION_LENGTH);
1105
- }
1106
- return sanitized;
1107
- }
1108
- get onDidChangeSkills() {
1109
- return this.cachedSkills.onDidChangePromise;
1110
- }
1111
- get onDidChangeHooks() {
1112
- return this.cachedHooks.onDidChangePromise;
1113
- }
1114
- async findAgentSkills(token) {
1115
- const useAgentSkills = this.configurationService.getValue(PromptsConfig.USE_AGENT_SKILLS);
1116
- if (!useAgentSkills) {
1117
- return undefined;
1118
- }
1119
- const discoveryInfo = await this.cachedSkills.get(token);
1120
- const result = this.skillsFromDiscoveryInfo(discoveryInfo);
1121
- return result;
1122
- }
1123
- skillsFromDiscoveryInfo(discoveryInfo) {
1124
- const result = [];
1125
- for (const file of discoveryInfo.files) {
1126
- if (file.status === "loaded" && file.promptPath.name) {
1127
- const sanitizedDescription = this.truncateAgentSkillDescription(file.promptPath.description, file.promptPath.uri);
1128
- const when = isExtensionPromptPath(file.promptPath) && file.promptPath.when ? ContextKeyExpr.deserialize(file.promptPath.when) ?? undefined : undefined;
1129
- result.push({
1130
- uri: file.promptPath.uri,
1131
- storage: file.promptPath.storage,
1132
- name: file.promptPath.name,
1133
- description: sanitizedDescription,
1134
- disableModelInvocation: file.disableModelInvocation ?? false,
1135
- userInvocable: file.userInvocable ?? true,
1136
- when,
1137
- pluginUri: file.promptPath.pluginUri,
1138
- extension: file.promptPath.extension,
1139
- sessionTypes: file.promptPath.sessionTypes
1140
- });
1141
- }
1142
- }
1143
- return result;
1144
- }
1145
- async computeSkillDiscovery(token) {
1146
- const stopWatch = StopWatch.create(true);
1147
- const files = await this.computeSkillDiscoveryInfo(token);
1148
- const sourceFolders = await this._collectSourceFolderDiagnostics(PromptsType.skill);
1149
- const skillsBySource = ( new Map());
1150
- for (const file of files) {
1151
- if (file.status === "loaded" && file.promptPath.name) {
1152
- const source = file.promptPath.source;
1153
- if (source) {
1154
- skillsBySource.set(source, (skillsBySource.get(source) || 0) + 1);
1155
- }
1156
- }
1157
- }
1158
- let skippedMissingName = 0;
1159
- let skippedMissingDescription = 0;
1160
- let skippedDuplicateName = 0;
1161
- let skippedParseFailed = 0;
1162
- let skippedNameMismatch = 0;
1163
- for (const file of files) {
1164
- if (file.status === "skipped") {
1165
- switch (file.skipReason) {
1166
- case "missing-name":
1167
- skippedMissingName++;
1168
- break;
1169
- case "missing-description":
1170
- skippedMissingDescription++;
1171
- break;
1172
- case "duplicate-name":
1173
- skippedDuplicateName++;
1174
- break;
1175
- case "name-mismatch":
1176
- skippedNameMismatch++;
1177
- break;
1178
- case "parse-error":
1179
- skippedParseFailed++;
1180
- break;
1181
- }
1182
- }
1183
- }
1184
- const totalSkillsFound = files.filter(f => f.status === "loaded" && f.promptPath.name).length;
1185
- this.telemetryService.publicLog2("agentSkillsFound", {
1186
- totalSkillsFound,
1187
- claudePersonal: skillsBySource.get(PromptFileSource.ClaudePersonal) ?? 0,
1188
- claudeWorkspace: skillsBySource.get(PromptFileSource.ClaudeWorkspace) ?? 0,
1189
- copilotPersonal: skillsBySource.get(PromptFileSource.CopilotPersonal) ?? 0,
1190
- githubWorkspace: skillsBySource.get(PromptFileSource.GitHubWorkspace) ?? 0,
1191
- agentsPersonal: skillsBySource.get(PromptFileSource.AgentsPersonal) ?? 0,
1192
- agentsWorkspace: skillsBySource.get(PromptFileSource.AgentsWorkspace) ?? 0,
1193
- configWorkspace: skillsBySource.get(PromptFileSource.ConfigWorkspace) ?? 0,
1194
- configPersonal: skillsBySource.get(PromptFileSource.ConfigPersonal) ?? 0,
1195
- extensionContribution: skillsBySource.get(PromptFileSource.ExtensionContribution) ?? 0,
1196
- extensionAPI: skillsBySource.get(PromptFileSource.ExtensionAPI) ?? 0,
1197
- plugin: skillsBySource.get(PromptFileSource.Plugin) ?? 0,
1198
- skippedDuplicateName,
1199
- skippedMissingName,
1200
- skippedMissingDescription,
1201
- skippedNameMismatch,
1202
- skippedParseFailed
1203
- });
1204
- return {
1205
- type: PromptsType.skill,
1206
- files,
1207
- sourceFolders,
1208
- durationInMillis: stopWatch.elapsed()
1209
- };
1210
- }
1211
- async getHooks(token) {
1212
- const discoveryInfo = await this.cachedHooks.get(token);
1213
- const result = discoveryInfo.hooksInfo;
1214
- return result;
1215
- }
1216
- async getDiscoveryInfo(type, token) {
1217
- switch (type) {
1218
- case PromptsType.instructions:
1219
- return this.cachedInstructions.get(token);
1220
- case PromptsType.prompt:
1221
- return this.cachedSlashCommands.get(token);
1222
- case PromptsType.agent:
1223
- return this.cachedCustomAgents.get(token);
1224
- case PromptsType.skill:
1225
- return this.cachedSkills.get(token);
1226
- case PromptsType.hook:
1227
- return this.cachedHooks.get(token);
1228
- }
1229
- }
1230
- async getInstructionFiles(token) {
1231
- const discoveryInfo = await this.cachedInstructions.get(token);
1232
- const result = this.instructionsFromDiscoveryInfo(discoveryInfo);
1233
- return result;
1234
- }
1235
- instructionsFromDiscoveryInfo(discoveryInfo) {
1236
- const result = [];
1237
- for (const file of discoveryInfo.files) {
1238
- if (file.status === "loaded" && file.promptPath.name) {
1239
- const when = isExtensionPromptPath(file.promptPath) && file.promptPath.when ? ContextKeyExpr.deserialize(file.promptPath.when) ?? undefined : undefined;
1240
- result.push({
1241
- uri: file.promptPath.uri,
1242
- storage: file.promptPath.storage,
1243
- extension: file.promptPath.extension,
1244
- pluginUri: file.promptPath.pluginUri,
1245
- source: file.promptPath.source,
1246
- name: file.promptPath.name,
1247
- description: file.promptPath.description,
1248
- pattern: file.pattern,
1249
- when,
1250
- sessionTypes: file.promptPath.sessionTypes
1251
- });
1252
- }
1253
- }
1254
- return result;
1255
- }
1256
- withPromptPathMetadata(promptPath, name, description) {
1257
- return {
1258
- ...promptPath,
1259
- name,
1260
- description
1261
- };
1262
- }
1263
- async computeInstructionFiles(token) {
1264
- return await this.getInstructionsDiscoveryInfo(token);
1265
- }
1266
- async computeHooks(token) {
1267
- const stopWatch = StopWatch.create(true);
1268
- const useChatHooks = this.configurationService.getValue(PromptsConfig.USE_CHAT_HOOKS);
1269
- if (!useChatHooks || !this.workspaceTrustService.isWorkspaceTrusted()) {
1270
- const hookFiles = await this.listPromptFiles(PromptsType.hook, token);
1271
- const skipReason = !useChatHooks ? "disabled" : "workspace-untrusted";
1272
- const files = ( hookFiles.map(promptPath => ({
1273
- status: "skipped",
1274
- skipReason,
1275
- promptPath: this.withPromptPathMetadata(promptPath, basename(promptPath.uri), promptPath.description)
1276
- })));
1277
- const sourceFolders = await this._collectSourceFolderDiagnostics(PromptsType.hook);
1278
- return {
1279
- type: PromptsType.hook,
1280
- files,
1281
- sourceFolders,
1282
- hooksInfo: undefined,
1283
- durationInMillis: stopWatch.elapsed()
1284
- };
1285
- }
1286
- const useClaudeHooks = this.configurationService.getValue(PromptsConfig.USE_CLAUDE_HOOKS);
1287
- const hookFiles = await this.listPromptFiles(PromptsType.hook, token);
1288
- this.logger.trace(`[PromptsService] Found ${hookFiles.length} hook file(s).`);
1289
- const userHomeUri = await this.pathService.userHome();
1290
- const userHome = userHomeUri.scheme === Schemas.file ? userHomeUri.fsPath : userHomeUri.path;
1291
- const defaultFolder = this.workspaceService.getWorkspace().folders[0];
1292
- const fileResults = await Promise.all(( hookFiles.map(async hookFile => {
1293
- const name = basename(hookFile.uri);
1294
- if (hookFile.storage === PromptsStorage.plugin) {
1295
- return {
1296
- file: {
1297
- status: "loaded",
1298
- promptPath: this.withPromptPathMetadata(hookFile, name, hookFile.description)
1299
- }
1300
- };
1301
- }
1302
- try {
1303
- const content = await this.fileService.readFile(hookFile.uri);
1304
- const json = parse(( content.value.toString()));
1305
- if (!json || typeof json !== "object") {
1306
- return {
1307
- file: {
1308
- status: "skipped",
1309
- skipReason: "parse-error",
1310
- errorMessage: "Invalid hooks file: must be a JSON object",
1311
- promptPath: this.withPromptPathMetadata(hookFile, name, hookFile.description)
1312
- }
1313
- };
1314
- }
1315
- const hookWorkspaceFolder = this.workspaceService.getWorkspaceFolder(hookFile.uri) ?? defaultFolder;
1316
- const workspaceRootUri = hookWorkspaceFolder?.uri;
1317
- const {
1318
- format,
1319
- hooks: parsedHooks,
1320
- disabledAllHooks
1321
- } = parseHooksFromFile(hookFile.uri, json, workspaceRootUri, userHome);
1322
- if (disabledAllHooks) {
1323
- this.logger.trace(
1324
- `[PromptsService] Skipping hook file with disableAllHooks: ${hookFile.uri}`
1325
- );
1326
- return {
1327
- file: {
1328
- status: "skipped",
1329
- skipReason: "all-hooks-disabled",
1330
- promptPath: this.withPromptPathMetadata(hookFile, name, hookFile.description)
1331
- }
1332
- };
1333
- }
1334
- if (format === HookSourceFormat.Claude && useClaudeHooks === false) {
1335
- const hasAnyCommands = ( [...( parsedHooks.values())].some((
1336
- {
1337
- hooks: cmds
1338
- }
1339
- ) => cmds.length > 0));
1340
- this.logger.trace(
1341
- `[PromptsService] Skipping Claude hook file (disabled via setting): ${hookFile.uri}`
1342
- );
1343
- return {
1344
- file: {
1345
- status: "skipped",
1346
- skipReason: "claude-hooks-disabled",
1347
- promptPath: this.withPromptPathMetadata(hookFile, name, hookFile.description)
1348
- },
1349
- hasDisabledClaudeHooks: hasAnyCommands
1350
- };
1351
- }
1352
- const hooks = ( new Map());
1353
- for (const [hookType, {
1354
- hooks: commands
1355
- }] of parsedHooks) {
1356
- for (const command of commands) {
1357
- let bucket = hooks.get(hookType);
1358
- if (!bucket) {
1359
- bucket = [];
1360
- hooks.set(hookType, bucket);
1361
- }
1362
- bucket.push(command);
1363
- this.logger.trace(
1364
- `[PromptsService] Collected ${hookType} hook from ${hookFile.uri} (format: ${format})`
1365
- );
1366
- }
1367
- }
1368
- return {
1369
- file: {
1370
- status: "loaded",
1371
- promptPath: this.withPromptPathMetadata(hookFile, name, hookFile.description)
1372
- },
1373
- hooks,
1374
- sourceUri: hookFile.uri
1375
- };
1376
- } catch (error) {
1377
- const msg = error instanceof Error ? error.message : String(error);
1378
- this.logger.warn(`[PromptsService] Failed to parse hook file: ${hookFile.uri}`, error);
1379
- return {
1380
- file: {
1381
- status: "skipped",
1382
- skipReason: "parse-error",
1383
- errorMessage: msg,
1384
- promptPath: this.withPromptPathMetadata(hookFile, name, hookFile.description)
1385
- }
1386
- };
1387
- }
1388
- })));
1389
- const files = [];
1390
- let hasDisabledClaudeHooks = false;
1391
- const collectedHooks = ( new Map());
1392
- for (const {
1393
- file,
1394
- hooks,
1395
- sourceUri,
1396
- hasDisabledClaudeHooks: disabled
1397
- } of fileResults) {
1398
- if (file) {
1399
- files.push(file);
1400
- }
1401
- if (disabled) {
1402
- hasDisabledClaudeHooks = true;
1403
- }
1404
- if (hooks && sourceUri) {
1405
- for (const [hookType, commands] of hooks) {
1406
- let bucket = collectedHooks.get(hookType);
1407
- if (!bucket) {
1408
- bucket = [];
1409
- collectedHooks.set(hookType, bucket);
1410
- }
1411
- for (const command of commands) {
1412
- bucket.push({
1413
- ...command,
1414
- sourceUri
1415
- });
1416
- }
1417
- }
1418
- }
1419
- }
1420
- const plugins = this.agentPluginService.plugins.get();
1421
- for (const plugin of plugins) {
1422
- if (!isContributionEnabled(plugin.enablement.get())) {
1423
- continue;
1424
- }
1425
- for (const hook of plugin.hooks.get()) {
1426
- let bucket = collectedHooks.get(hook.type);
1427
- if (!bucket) {
1428
- bucket = [];
1429
- collectedHooks.set(hook.type, bucket);
1430
- }
1431
- for (const command of hook.hooks) {
1432
- bucket.push({
1433
- ...command,
1434
- sourceUri: hook.uri
1435
- });
1436
- }
1437
- }
1438
- }
1439
- const sourceFolders = await this._collectSourceFolderDiagnostics(PromptsType.hook);
1440
- if (collectedHooks.size === 0) {
1441
- this.logger.trace("[PromptsService] No valid hooks collected.");
1442
- return {
1443
- type: PromptsType.hook,
1444
- files,
1445
- sourceFolders,
1446
- hooksInfo: undefined,
1447
- durationInMillis: stopWatch.elapsed()
1448
- };
1449
- }
1450
- const result = Object.fromEntries(collectedHooks);
1451
- this.logger.trace(`[PromptsService] Collected hooks: ${JSON.stringify(( Object.keys(result)))}`);
1452
- return {
1453
- type: PromptsType.hook,
1454
- files,
1455
- sourceFolders,
1456
- hooksInfo: {
1457
- hooks: result,
1458
- hasDisabledClaudeHooks
1459
- },
1460
- durationInMillis: stopWatch.elapsed()
1461
- };
1462
- }
1463
- async computeSkillDiscoveryInfo(token) {
1464
- const files = [];
1465
- const seenNames = ( new Set());
1466
- const nameToUri = ( new Map());
1467
- const allSkills = [];
1468
- const discoveredSkills = await this.fileLocator.findAgentSkills(token);
1469
- const extensionSkills = await this.getExtensionPromptFiles(PromptsType.skill, token);
1470
- const pluginSkills = this._pluginPromptFilesByType.get(PromptsType.skill) ?? [];
1471
- allSkills.push(...discoveredSkills, ...extensionSkills, ...pluginSkills);
1472
- const getPriority = skill => {
1473
- if (skill.storage === PromptsStorage.local) {
1474
- return 0;
1475
- }
1476
- if (skill.storage === PromptsStorage.user) {
1477
- return 1;
1478
- }
1479
- if (skill.storage === PromptsStorage.plugin) {
1480
- return 2;
1481
- }
1482
- if (skill.source === PromptFileSource.ExtensionAPI) {
1483
- return 3;
1484
- }
1485
- if (skill.source === PromptFileSource.ExtensionContribution) {
1486
- return 4;
1487
- }
1488
- return 5;
1489
- };
1490
- allSkills.sort((a, b) => getPriority(a) - getPriority(b));
1491
- for (const skill of allSkills) {
1492
- const uri = skill.uri;
1493
- const promptPath = skill;
1494
- try {
1495
- const parsedFile = await this.parseNew(uri, token);
1496
- const folderName = getSkillFolderName(uri);
1497
- let name = parsedFile.header?.name;
1498
- const description = parsedFile.header?.description;
1499
- if (!name) {
1500
- this.logger.debug(
1501
- `[computeSkillDiscoveryInfo] Agent skill file missing name attribute, using folder name "${folderName}": ${uri}`
1502
- );
1503
- name = folderName;
1504
- }
1505
- let sanitizedName = this.truncateAgentSkillName(name, uri);
1506
- if (sanitizedName !== folderName) {
1507
- this.logger.debug(
1508
- `[computeSkillDiscoveryInfo] Agent skill name "${sanitizedName}" does not match folder name "${folderName}", using folder name: ${uri}`
1509
- );
1510
- sanitizedName = folderName;
1511
- }
1512
- if (( seenNames.has(sanitizedName))) {
1513
- this.logger.debug(
1514
- `[computeSkillDiscoveryInfo] Skipping duplicate agent skill name: ${sanitizedName} at ${uri}`
1515
- );
1516
- files.push({
1517
- status: "skipped",
1518
- skipReason: "duplicate-name",
1519
- duplicateOf: nameToUri.get(sanitizedName),
1520
- promptPath: this.withPromptPathMetadata(promptPath, sanitizedName, description)
1521
- });
1522
- continue;
1523
- }
1524
- seenNames.add(sanitizedName);
1525
- nameToUri.set(sanitizedName, uri);
1526
- const disableModelInvocation = parsedFile.header?.disableModelInvocation === true;
1527
- const userInvocable = parsedFile.header?.userInvocable !== false;
1528
- files.push({
1529
- status: "loaded",
1530
- promptPath: this.withPromptPathMetadata(promptPath, sanitizedName, description),
1531
- disableModelInvocation,
1532
- userInvocable
1533
- });
1534
- } catch (e) {
1535
- const msg = e instanceof Error ? e.message : String(e);
1536
- this.logger.error(
1537
- `[computeSkillDiscoveryInfo] Failed to validate Agent skill file: ${uri}`,
1538
- msg
1539
- );
1540
- files.push({
1541
- status: "skipped",
1542
- skipReason: "parse-error",
1543
- errorMessage: msg,
1544
- promptPath
1545
- });
1546
- }
1547
- }
1548
- return files;
1549
- }
1550
- async getInstructionsDiscoveryInfo(token) {
1551
- const stopWatch = StopWatch.create(true);
1552
- const files = [];
1553
- const instructionsFiles = await this.listPromptFiles(PromptsType.instructions, token);
1554
- for (const promptPath of instructionsFiles) {
1555
- const uri = promptPath.uri;
1556
- try {
1557
- const parsedPromptFile = await this.parseNew(uri, token);
1558
- const name = parsedPromptFile?.header?.name ?? promptPath.name ?? getCleanPromptName(uri);
1559
- const description = parsedPromptFile?.header?.description ?? promptPath.description;
1560
- const pattern = evaluateApplyToPattern(parsedPromptFile.header, isInClaudeRulesFolder(uri));
1561
- files.push({
1562
- status: "loaded",
1563
- pattern,
1564
- promptPath: this.withPromptPathMetadata(promptPath, name, description)
1565
- });
1566
- } catch (e) {
1567
- files.push({
1568
- status: "skipped",
1569
- skipReason: "parse-error",
1570
- errorMessage: e instanceof Error ? e.message : String(e),
1571
- promptPath
1572
- });
1573
- }
1574
- }
1575
- const sourceFolders = await this._collectSourceFolderDiagnostics(PromptsType.instructions);
1576
- return {
1577
- type: PromptsType.instructions,
1578
- files,
1579
- sourceFolders,
1580
- durationInMillis: stopWatch.elapsed()
1581
- };
1582
- }
1583
- };
1584
- PromptsService = ( __decorate([( __param(0, ILogService)), ( __param(1, ILabelService)), ( __param(2, IModelService)), ( __param(3, IInstantiationService)), ( __param(4, IUserDataProfileService)), ( __param(5, IConfigurationService)), ( __param(6, IFileService)), ( __param(7, IFilesConfigurationService)), ( __param(8, IStorageService)), ( __param(9, IExtensionService)), ( __param(10, ITelemetryService)), ( __param(11, IWorkspaceContextService)), ( __param(12, IPathService)), ( __param(13, IContextKeyService)), ( __param(14, IAgentPluginService)), ( __param(15, IWorkspaceTrustManagementService))], PromptsService));
1585
- class CachedPromise extends Disposable {
1586
- constructor(computeFn, getEvent, delay = 0) {
1587
- super();
1588
- this.computeFn = computeFn;
1589
- this.getEvent = getEvent;
1590
- this.delay = delay;
1591
- this.cachedPromise = undefined;
1592
- this.onDidUpdatePromiseEmitter = this._register(( new Emitter()));
1593
- const delayer = this._register(( new Delayer(this.delay)));
1594
- this._register(this.getEvent()(() => {
1595
- this.cachedPromise = undefined;
1596
- delayer.trigger(() => this.onDidUpdatePromiseEmitter.fire());
1597
- }));
1598
- }
1599
- get onDidChangePromise() {
1600
- return this.onDidUpdatePromiseEmitter.event;
1601
- }
1602
- get(token) {
1603
- if (this.cachedPromise !== undefined) {
1604
- return this.cachedPromise;
1605
- }
1606
- const promise = this.computeFn(token).catch(err => {
1607
- if (this.cachedPromise === promise) {
1608
- this.cachedPromise = undefined;
1609
- }
1610
- throw err;
1611
- });
1612
- this.cachedPromise = promise;
1613
- return promise;
1614
- }
1615
- refresh() {
1616
- this.cachedPromise = undefined;
1617
- this.onDidUpdatePromiseEmitter?.fire();
1618
- }
1619
- }
1620
- class ModelChangeTracker extends Disposable {
1621
- get onDidPromptChange() {
1622
- return this.onDidPromptModelChange.event;
1623
- }
1624
- constructor(modelService) {
1625
- super();
1626
- this.listeners = ( new ResourceMap());
1627
- this.onDidPromptModelChange = this._register(( new Emitter()));
1628
- const onAdd = model => {
1629
- const promptType = getPromptsTypeForLanguageId(model.getLanguageId());
1630
- if (promptType !== undefined) {
1631
- this.listeners.set(
1632
- model.uri,
1633
- model.onDidChangeContent(() => this.onDidPromptModelChange.fire({
1634
- uri: model.uri,
1635
- promptType
1636
- }))
1637
- );
1638
- }
1639
- return promptType;
1640
- };
1641
- const onRemove = (languageId, uri) => {
1642
- const promptType = getPromptsTypeForLanguageId(languageId);
1643
- if (promptType !== undefined) {
1644
- this.listeners.get(uri)?.dispose();
1645
- this.listeners.delete(uri);
1646
- }
1647
- return promptType;
1648
- };
1649
- this._register(modelService.onModelAdded(model => onAdd(model)));
1650
- this._register(modelService.onModelLanguageChanged(e => {
1651
- const removedPromptType = onRemove(e.oldLanguageId, e.model.uri);
1652
- const addedPromptType = onAdd(e.model);
1653
- if (removedPromptType !== addedPromptType) {
1654
- if (removedPromptType) {
1655
- this.onDidPromptModelChange.fire({
1656
- uri: e.model.uri,
1657
- promptType: removedPromptType
1658
- });
1659
- }
1660
- if (addedPromptType) {
1661
- this.onDidPromptModelChange.fire({
1662
- uri: e.model.uri,
1663
- promptType: addedPromptType
1664
- });
1665
- }
1666
- }
1667
- }));
1668
- this._register(
1669
- modelService.onModelRemoved(model => onRemove(model.getLanguageId(), model.uri))
1670
- );
1671
- }
1672
- dispose() {
1673
- super.dispose();
1674
- this.listeners.forEach(listener => listener.dispose());
1675
- this.listeners.clear();
1676
- }
1677
- }
1678
- var IAgentSource;
1679
- (function(IAgentSource) {
1680
- function fromPromptPath(promptPath) {
1681
- if (promptPath.storage === PromptsStorage.extension) {
1682
- return {
1683
- storage: PromptsStorage.extension,
1684
- extensionId: promptPath.extension.identifier,
1685
- type: promptPath.source
1686
- };
1687
- } else if (promptPath.storage === PromptsStorage.plugin) {
1688
- return {
1689
- storage: PromptsStorage.plugin,
1690
- pluginUri: promptPath.pluginUri
1691
- };
1692
- } else {
1693
- return {
1694
- storage: promptPath.storage
1695
- };
1696
- }
1697
- }
1698
- IAgentSource.fromPromptPath = fromPromptPath;
1699
- })(IAgentSource || (IAgentSource = {}));
1700
-
1701
- export { PromptsService, SkillMissingDescriptionError, SkillMissingNameError, SkillNameMismatchError };