@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.
- package/index.d.ts +1 -1
- package/index.js +21 -5
- package/package.json +5 -5
- package/vscode/src/vs/base/common/defaultAccount.d.ts +69 -0
- package/vscode/src/vs/base/common/defaultAccount.js +12 -0
- package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostProtocolClient.d.ts +91 -22
- package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostProtocolClient.js +301 -68
- package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostServiceImpl.d.ts +24 -5
- package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostServiceImpl.js +89 -16
- package/vscode/src/vs/platform/agentHost/browser/webSocketClientTransport.d.ts +17 -5
- package/vscode/src/vs/platform/agentHost/browser/webSocketClientTransport.js +73 -10
- package/vscode/src/vs/platform/agentHost/common/agentHostFileSystemProvider.d.ts +32 -6
- package/vscode/src/vs/platform/agentHost/common/agentHostFileSystemProvider.js +32 -20
- package/vscode/src/vs/platform/agentHost/common/agentHostPermissionService.d.ts +37 -0
- package/vscode/src/vs/platform/agentHost/common/agentHostPermissionService.js +15 -0
- package/vscode/src/vs/platform/agentHost/common/agentService.d.ts +242 -201
- package/vscode/src/vs/platform/agentHost/common/agentService.js +3 -1
- package/vscode/src/vs/platform/agentHost/common/ahpJsonlLogger.d.ts +35 -0
- package/vscode/src/vs/platform/agentHost/common/ahpJsonlLogger.js +106 -0
- package/vscode/src/vs/platform/agentHost/common/state/agentSubscription.d.ts +38 -30
- package/vscode/src/vs/platform/agentHost/common/state/agentSubscription.js +2 -1
- package/vscode/src/vs/platform/agentHost/common/state/protocol/errors.d.ts +114 -4
- package/vscode/src/vs/platform/agentHost/common/state/protocol/reducers.d.ts +10 -10
- package/vscode/src/vs/platform/agentHost/common/state/protocol/reducers.js +52 -19
- package/vscode/src/vs/platform/agentHost/common/state/protocol/version/registry.d.ts +42 -0
- package/vscode/src/vs/platform/agentHost/common/state/protocol/version/registry.js +7 -0
- package/vscode/src/vs/platform/agentHost/common/state/sessionActions.d.ts +42 -41
- package/vscode/src/vs/platform/agentHost/common/state/sessionTransport.d.ts +6 -6
- package/vscode/src/vs/platform/agentHost/common/transportConstants.d.ts +15 -0
- package/vscode/src/vs/platform/agentHost/common/transportConstants.js +6 -0
- package/vscode/src/vs/platform/agentPlugins/common/pluginParsers.d.ts +4 -3
- package/vscode/src/vs/platform/agentPlugins/common/pluginParsers.js +4 -3
- package/vscode/src/vs/platform/networkFilter/common/networkFilterService.d.ts +4 -2
- package/vscode/src/vs/platform/networkFilter/common/networkFilterService.js +15 -7
- package/vscode/src/vs/workbench/contrib/browserView/common/browserChatToolReferenceNames.d.ts +19 -0
- package/vscode/src/vs/workbench/contrib/browserView/common/browserChatToolReferenceNames.js +17 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatAccessibilityService.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatResponseAccessibleView.d.ts +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatResponseAccessibleView.js +16 -16
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityActions.js +14 -10
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.js +64 -59
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAgentRecommendationActions.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.js +31 -16
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.js +18 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.d.ts +16 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.js +8 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatDeveloperActions.js +30 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatFileTreeActions.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatForkActions.js +8 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatImportExport.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatLanguageModelActions.js +13 -13
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatMoveActions.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatNewActions.js +12 -12
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatOpenAgentDebugPanelAction.js +12 -12
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatPluginActions.js +27 -18
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatPromptNavigationActions.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQueueActions.js +11 -11
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatQuickInputActions.js +8 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/codeBlockOperations.js +21 -20
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/createPluginAction.js +22 -22
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/reviewEdits.d.ts +12 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/reviewEdits.js +171 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginActions.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginActions.js +8 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditor.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditorInput.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginItems.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginRepositoryService.d.ts +3 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginRepositoryService.js +12 -10
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostPermissionUiContribution.d.ts +28 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostPermissionUiContribution.js +99 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSessionWorkingDirectoryResolver.d.ts +2 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSessionWorkingDirectoryResolver.js +11 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.contribution.js +9 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsActions.js +63 -53
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsPicker.d.ts +2 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsPicker.js +10 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsQuickAccess.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjection.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionActions.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionsExperiments.contribution.js +5 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.js +25 -48
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/unifiedQuickAccess.js +17 -17
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/unifiedQuickAccessActions.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/localAgentSessionsController.js +5 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationDebugPanel.d.ts +8 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationDebugPanel.js +99 -39
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationIcons.d.ts +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationIcons.js +17 -30
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemsModel.d.ts +78 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemsModel.js +38 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidget.d.ts +35 -37
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidget.js +347 -326
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidgetUtils.d.ts +6 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidgetUtils.js +1 -11
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.js +113 -109
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.d.ts +37 -15
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.js +436 -134
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditorInput.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationWelcomePagePromptLaunchers.d.ts +2 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationWelcomePagePromptLaunchers.js +52 -26
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationCreatorService.js +7 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationHarnessService.d.ts +2 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationHarnessService.js +13 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedAgentPluginDetail.d.ts +23 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedAgentPluginDetail.js +60 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedMcpServerDetail.d.ts +25 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedMcpServerDetail.js +93 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.d.ts +9 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.js +73 -104
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/media/aiCustomizationManagement.css +272 -41
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/media/aiCustomizationWelcomePromptLaunchers.css +12 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.d.ts +30 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.js +430 -185
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.d.ts +5 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.js +44 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/chat.contribution.js +480 -279
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatCustomizationDiscoveryRenderer.js +32 -32
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheDiff.d.ts +138 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheDiff.js +221 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheExplorerView.d.ts +84 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheExplorerView.js +1216 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugDetailPanel.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.d.ts +2 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditor.js +32 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditorInput.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventDetailRenderer.js +26 -19
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventList.js +7 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFilters.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowChartView.js +7 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowGraph.js +28 -25
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHomeView.js +13 -13
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHookContentRenderer.js +17 -17
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugLogsView.js +25 -24
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugMessageContentRenderer.js +8 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugModelTurnContentRenderer.js +23 -23
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugOverviewView.d.ts +2 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugOverviewView.js +68 -33
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugToolCallContentRenderer.js +11 -11
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugTypes.d.ts +3 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugTypes.js +1 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/media/chatDebug.css +650 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingCodeEditorIntegration.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorActions.d.ts +46 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorActions.js +533 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.d.ts +29 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.js +390 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationModelManager.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationWidget.d.ts +101 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationWidget.js +509 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedDocumentEntry.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.js +18 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl.js +11 -11
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingSession.js +3 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/media/chatEditingEditorOverlay.css +130 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/media/chatEditingExplanationWidget.css +276 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/notebook/chatEditingNotebookEditorIntegration.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatImageCarouselService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagement.contribution.js +8 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagementEditorInput.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsViewModel.d.ts +1 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsViewModel.js +6 -87
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.js +116 -182
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/media/chatModelsWidget.css +12 -39
- package/vscode/src/vs/workbench/contrib/chat/browser/chatOutputItemRenderer.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.js +31 -31
- package/vscode/src/vs/workbench/contrib/chat/browser/chatRepoInfo.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.js +61 -41
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupController.js +10 -10
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupGrowthSession.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupProviders.js +27 -27
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.d.ts +2 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.js +16 -13
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSlashCommands.d.ts +20 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSlashCommands.js +106 -36
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.d.ts +25 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.js +629 -425
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.d.ts +9 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.js +105 -29
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusItemService.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/media/chatStatus.css +175 -148
- package/vscode/src/vs/workbench/contrib/chat/browser/chatTipCatalog.js +20 -33
- package/vscode/src/vs/workbench/contrib/chat/browser/chatTipService.js +9 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatWindowNotifier.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/claudePluginRecommendations.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/defaultModelContribution.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/enablementActions.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/enablementStatusWidget.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/githubRepoFetcher.d.ts +58 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/githubRepoFetcher.js +339 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/languageModelsConfigurationService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/media/planReviewFeedback.css +160 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorActions.d.ts +9 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorActions.js +123 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorContribution.d.ts +37 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorContribution.js +572 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackService.d.ts +36 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackService.js +167 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginGitCommandService.d.ts +49 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginGitCommandService.js +315 -19
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginInstallService.js +45 -24
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginSources.js +15 -15
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginUrlHandler.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/chatModeActions.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookActions.js +44 -40
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookUtils.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptCodingAgentActionOverlay.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptFileContributions.js +4 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptToolsCodeLensProvider.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/promptUrlHandler.js +8 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/runPromptAction.js +7 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/saveAsPromptFileActions.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/skillActions.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/promptsDebugContribution.js +20 -20
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsConfirmationService.js +39 -39
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.d.ts +9 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.js +111 -52
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/renameTool.d.ts +3 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/renameTool.js +13 -47
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolHelpers.d.ts +3 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolHelpers.js +4 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolResultCompressorService.d.ts +18 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolResultCompressorService.js +56 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/usagesTool.d.ts +3 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/usagesTool.js +14 -52
- package/vscode/src/vs/workbench/contrib/chat/browser/viewsWelcome/chatViewsWelcomeHandler.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidgetService.d.ts +3 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatWidgetService.js +17 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatQueuePickerActionItem.d.ts +2 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatQueuePickerActionItem.js +23 -12
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletions.d.ts +39 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletions.js +136 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletionsBase.d.ts +72 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletionsBase.js +56 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletionUtils.d.ts +7 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletionUtils.js +14 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletions.js +41 -26
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputEditorContrib.js +30 -12
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputEditorHover.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/chatQuick.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/editor/chatEditor.js +2 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewPane.js +25 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewTitleControl.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/common/chatDebugServiceImpl.d.ts +2 -2
- package/vscode/src/vs/workbench/contrib/chat/common/chatDebugServiceImpl.js +5 -4
- package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.js +108 -45
- package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceTelemetry.js +7 -3
- package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionOperationLog.js +3 -1
- package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionStore.d.ts +20 -1
- package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionStore.js +65 -26
- package/vscode/src/vs/workbench/contrib/chat/common/participants/chatSlashCommands.d.ts +5 -3
- package/vscode/src/vs/workbench/contrib/chat/common/participants/chatSlashCommands.js +38 -11
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.d.ts +17 -1
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.js +165 -16
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/pluginMarketplaceService.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/pluginMarketplaceService.js +62 -1
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/chatPromptFilesContribution.js +18 -18
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/PromptHeaderDefinitionProvider.js +2 -1
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptCodeActions.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHeaderAutocompletion.d.ts +1 -3
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHeaderAutocompletion.js +15 -21
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHovers.d.ts +1 -3
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHovers.js +18 -24
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.d.ts +4 -2
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.js +203 -180
- package/vscode/src/vs/workbench/contrib/chat/common/voiceChatService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/common/workingDirectory.d.ts +30 -0
- package/vscode/src/vs/workbench/contrib/chat/common/workingDirectory.js +35 -0
- package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/aiEditTelemetry/aiEditTelemetryServiceImpl.d.ts +2 -1
- package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/aiEditTelemetry/aiEditTelemetryServiceImpl.js +27 -2
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChat.contribution.js +14 -49
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.d.ts +0 -16
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.js +35 -177
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatDefaultModel.js +2 -8
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatNotebook.d.ts +1 -2
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatNotebook.js +2 -3
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.d.ts +4 -4
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.js +11 -11
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpPromptArgumentPick.js +14 -14
- package/vscode/src/vs/workbench/contrib/notebook/browser/contrib/chat/notebookChatUtils.js +1 -1
- package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.js +13 -13
- package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.js +5 -5
- package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/notebookChatContext.js +1 -1
- package/vscode/src/vs/workbench/contrib/remoteCodingAgents/browser/remoteCodingAgents.contribution.js +7 -7
- package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatAccessibilityHelp.js +16 -16
- package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatActions.js +20 -20
- package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.d.ts +29 -3
- package/vscode/src/vs/workbench/contrib/terminalContrib/chat/browser/terminalChatWidget.js +129 -3
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/taskHelpers.js +3 -2
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/terminal.chatAgentTools.contribution.d.ts +2 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/terminal.chatAgentTools.contribution.js +14 -6
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalLastCommandTool.js +3 -3
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalOutputTool.d.ts +1 -4
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalOutputTool.js +12 -38
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalSelectionTool.js +3 -3
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/killTerminalTool.js +4 -4
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalConfirmationTool.js +2 -2
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/sendToTerminalTool.d.ts +12 -7
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/sendToTerminalTool.js +77 -70
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/createAndRunTaskTool.js +14 -14
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/getTaskOutputTool.js +7 -7
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/runTaskTool.js +14 -14
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/taskHelpers.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCompressor.d.ts +32 -0
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCompressor.js +232 -0
- package/vscode/src/vs/workbench/services/agentHost/common/agentHostPermissionService.d.ts +83 -0
- package/vscode/src/vs/workbench/services/agentHost/common/agentHostPermissionService.js +243 -0
- package/vscode/src/vs/platform/agentHost/common/state/protocol/commands.d.ts +0 -749
- package/vscode/src/vs/platform/agentHost/common/state/protocol/commands.js +0 -14
- package/vscode/src/vs/platform/agentHost/common/state/sessionCapabilities.d.ts +0 -17
- package/vscode/src/vs/platform/agentHost/common/state/sessionCapabilities.js +0 -5
- package/vscode/src/vs/platform/agentHost/common/state/sessionProtocol.d.ts +0 -40
- package/vscode/src/vs/platform/agentHost/common/state/sessionProtocol.js +0 -14
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.d.ts +0 -61
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.js +0 -638
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemSource.d.ts +0 -131
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemSource.js +0 -363
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/promptsServiceCustomizationItemProvider.d.ts +0 -24
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/promptsServiceCustomizationItemProvider.js +0 -306
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatStatusWidget.d.ts +0 -23
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatStatusWidget.js +0 -97
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/media/chatStatusWidget.css +0 -57
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.d.ts +0 -50
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.js +0 -29
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookClaudeCompat.d.ts +0 -50
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookClaudeCompat.js +0 -78
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCompatibility.d.ts +0 -77
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCompatibility.js +0 -120
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCopilotCliCompat.d.ts +0 -10
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCopilotCliCompat.js +0 -23
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.d.ts +0 -242
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.js +0 -1701
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.d.ts +0 -191
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.js +0 -728
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatHistoryService.d.ts +0 -14
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatHistoryService.js +0 -69
|
@@ -4,10 +4,10 @@ import { splitGlobAware, parse, isEmptyPattern } from '@codingame/monaco-vscode-
|
|
|
4
4
|
import { Iterable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/iterator';
|
|
5
5
|
import { Range } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/core/range';
|
|
6
6
|
import { localize } from '@codingame/monaco-vscode-api/vscode/vs/nls';
|
|
7
|
-
import { IConfigurationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service';
|
|
8
7
|
import { MarkerSeverity, MarkerTag } from '@codingame/monaco-vscode-api/vscode/vs/platform/markers/common/markers';
|
|
9
8
|
import { ChatMode } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/chatModes';
|
|
10
9
|
import { IChatModeService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/chatModes.service';
|
|
10
|
+
import { localChatSessionType } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/chatSessionsService';
|
|
11
11
|
import { ChatModeKind } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/constants';
|
|
12
12
|
import { ILanguageModelChatMetadata } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/languageModels';
|
|
13
13
|
import { ILanguageModelsService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/languageModels.service';
|
|
@@ -16,16 +16,17 @@ import { ILanguageModelToolsService } from '@codingame/monaco-vscode-api/vscode/
|
|
|
16
16
|
import { PromptsType, Target } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/promptTypes';
|
|
17
17
|
import { PromptHeaderAttributes, parseCommaSeparatedList } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/promptFileParser';
|
|
18
18
|
import { IFileService } from '@codingame/monaco-vscode-api/vscode/vs/platform/files/common/files.service';
|
|
19
|
+
import { IConfigurationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service';
|
|
19
20
|
import { IPromptsService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/service/promptsService.service';
|
|
20
21
|
import { ILabelService } from '@codingame/monaco-vscode-api/vscode/vs/platform/label/common/label.service';
|
|
21
|
-
import { LEGACY_MODE_FILE_EXTENSION, AGENTS_SOURCE_FOLDER, VALID_SKILL_NAME_REGEX, CLAUDE_AGENTS_SOURCE_FOLDER, isInClaudeRulesFolder } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/config/promptFileLocations';
|
|
22
|
+
import { LEGACY_MODE_FILE_EXTENSION, AGENTS_SOURCE_FOLDER, VALID_SKILL_NAME_REGEX, isSkillFilename, CLAUDE_AGENTS_SOURCE_FOLDER, isInClaudeRulesFolder } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/config/promptFileLocations';
|
|
22
23
|
import { Lazy } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lazy';
|
|
23
24
|
import { CancellationToken } from '@codingame/monaco-vscode-api/vscode/vs/base/common/cancellation';
|
|
24
25
|
import { dirname } from '@codingame/monaco-vscode-api/vscode/vs/base/common/resources';
|
|
25
26
|
import { URI } from '@codingame/monaco-vscode-api/vscode/vs/base/common/uri';
|
|
26
27
|
import { HOOKS_BY_TARGET } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/hookTypes';
|
|
27
|
-
import { PromptsConfig } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/config/config';
|
|
28
28
|
import { GithubPromptHeaderAttributes } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptFileAttributes';
|
|
29
|
+
import { ILogService } from '@codingame/monaco-vscode-api/vscode/vs/platform/log/common/log.service';
|
|
29
30
|
|
|
30
31
|
const MARKERS_OWNER_ID = "prompts-diagnostics-provider";
|
|
31
32
|
let PromptValidator = class PromptValidator {
|
|
@@ -36,6 +37,7 @@ let PromptValidator = class PromptValidator {
|
|
|
36
37
|
fileService,
|
|
37
38
|
labelService,
|
|
38
39
|
promptsService,
|
|
40
|
+
logger,
|
|
39
41
|
configurationService
|
|
40
42
|
) {
|
|
41
43
|
this.languageModelsService = languageModelsService;
|
|
@@ -44,6 +46,7 @@ let PromptValidator = class PromptValidator {
|
|
|
44
46
|
this.fileService = fileService;
|
|
45
47
|
this.labelService = labelService;
|
|
46
48
|
this.promptsService = promptsService;
|
|
49
|
+
this.logger = logger;
|
|
47
50
|
this.configurationService = configurationService;
|
|
48
51
|
}
|
|
49
52
|
async validate(promptAST, promptType, report) {
|
|
@@ -61,13 +64,13 @@ let PromptValidator = class PromptValidator {
|
|
|
61
64
|
const location = this.promptsService.getAgentFileURIFromModeFile(promptAST.uri);
|
|
62
65
|
if (location && (await this.fileService.canCreateFile(location))) {
|
|
63
66
|
report(toMarker(( localize(
|
|
64
|
-
|
|
67
|
+
7917,
|
|
65
68
|
"Chat modes have been renamed to agents. Please move this file to {0}",
|
|
66
69
|
(location.toString())
|
|
67
70
|
)), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
68
71
|
} else {
|
|
69
72
|
report(toMarker(( localize(
|
|
70
|
-
|
|
73
|
+
7918,
|
|
71
74
|
"Chat modes have been renamed to agents. Please move the file to {0}",
|
|
72
75
|
AGENTS_SOURCE_FOLDER
|
|
73
76
|
)), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
@@ -75,35 +78,28 @@ let PromptValidator = class PromptValidator {
|
|
|
75
78
|
}
|
|
76
79
|
}
|
|
77
80
|
async validateSkillAttributes(promptAST, promptType, report) {
|
|
78
|
-
if (promptType !== PromptsType.skill) {
|
|
81
|
+
if (promptType !== PromptsType.skill || !promptAST.header) {
|
|
79
82
|
return;
|
|
80
83
|
}
|
|
81
|
-
const nameAttribute = promptAST.header
|
|
84
|
+
const nameAttribute = promptAST.header.getAttribute(PromptHeaderAttributes.name);
|
|
82
85
|
if (!nameAttribute) {
|
|
83
|
-
report(toMarker(( localize(
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
const descriptionAttribute = promptAST.header?.attributes.find(attr => attr.key === PromptHeaderAttributes.description);
|
|
87
|
-
if (!descriptionAttribute) {
|
|
88
|
-
report(toMarker(( localize(7605, "Skill must provide a description.")), ( new Range(1, 1, 1, 4)), MarkerSeverity.Error));
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
if (nameAttribute.value.type === "scalar") {
|
|
86
|
+
report(toMarker(( localize(7919, "Skill should provide a name.")), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
87
|
+
} else if (nameAttribute.value.type === "scalar") {
|
|
92
88
|
const skillName = nameAttribute.value.value.trim();
|
|
93
89
|
if (skillName.length > 0) {
|
|
94
90
|
if (!VALID_SKILL_NAME_REGEX.test(skillName)) {
|
|
95
91
|
report(toMarker(( localize(
|
|
96
|
-
|
|
92
|
+
7920,
|
|
97
93
|
"Skill name may only contain lowercase letters, numbers, and hyphens."
|
|
98
94
|
)), nameAttribute.value.range, MarkerSeverity.Error));
|
|
99
95
|
}
|
|
100
96
|
const pathParts = promptAST.uri.path.split("/");
|
|
101
|
-
const skillIndex = pathParts.findIndex(part => part
|
|
97
|
+
const skillIndex = pathParts.findIndex(part => isSkillFilename(part));
|
|
102
98
|
if (skillIndex > 0) {
|
|
103
99
|
const folderName = pathParts[skillIndex - 1];
|
|
104
100
|
if (folderName && skillName !== folderName) {
|
|
105
101
|
report(toMarker(( localize(
|
|
106
|
-
|
|
102
|
+
7921,
|
|
107
103
|
"The skill name '{0}' should match the folder name '{1}'.",
|
|
108
104
|
skillName,
|
|
109
105
|
folderName
|
|
@@ -112,6 +108,38 @@ let PromptValidator = class PromptValidator {
|
|
|
112
108
|
}
|
|
113
109
|
}
|
|
114
110
|
}
|
|
111
|
+
const descriptionAttribute = promptAST.header.getAttribute(PromptHeaderAttributes.description);
|
|
112
|
+
if (!descriptionAttribute) {
|
|
113
|
+
report(toMarker(( localize(7922, "Skill should provide a description.")), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
114
|
+
if (promptAST.header.userInvocable === false) {
|
|
115
|
+
const userInvocableAttr = promptAST.header.getAttribute(PromptHeaderAttributes.userInvocable);
|
|
116
|
+
if (userInvocableAttr) {
|
|
117
|
+
report(toMarker(( localize(
|
|
118
|
+
7923,
|
|
119
|
+
"A description is required when user-invocable is false, because the model needs a description to decide when to load the skill."
|
|
120
|
+
)), userInvocableAttr.value.range, MarkerSeverity.Error));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (promptAST.header.disableModelInvocation === false) {
|
|
124
|
+
const disableModelInvocationAttr = promptAST.header.getAttribute(PromptHeaderAttributes.disableModelInvocation);
|
|
125
|
+
if (disableModelInvocationAttr) {
|
|
126
|
+
report(toMarker(( localize(
|
|
127
|
+
7924,
|
|
128
|
+
"A description is required when model invocation is enabled, because the model needs a description to decide when to load the skill."
|
|
129
|
+
)), disableModelInvocationAttr.value.range, MarkerSeverity.Error));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const contextAttribute = promptAST.header?.getAttribute(PromptHeaderAttributes.context);
|
|
134
|
+
if (contextAttribute && contextAttribute.value.type === "scalar" && contextAttribute.value.value.trim() === "fork") {
|
|
135
|
+
const skillToolEnabled = this.configurationService.getValue("github.copilot.chat.skillTool.enabled");
|
|
136
|
+
if (!skillToolEnabled) {
|
|
137
|
+
report(toMarker(( localize(
|
|
138
|
+
7925,
|
|
139
|
+
"The 'context: fork' attribute requires the skill tool to be enabled (github.copilot.chat.skillTool.enabled)."
|
|
140
|
+
)), contextAttribute.value.range, MarkerSeverity.Warning));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
115
143
|
}
|
|
116
144
|
async validateBody(promptAST, target, report) {
|
|
117
145
|
const body = promptAST.body;
|
|
@@ -122,19 +150,22 @@ let PromptValidator = class PromptValidator {
|
|
|
122
150
|
for (const ref of body.fileReferences) {
|
|
123
151
|
const resolved = body.resolveFilePath(ref.content);
|
|
124
152
|
if (!resolved) {
|
|
125
|
-
report(toMarker(( localize(
|
|
153
|
+
report(toMarker(( localize(7926, "Invalid file reference '{0}'.", ref.content)), ref.range, MarkerSeverity.Warning));
|
|
126
154
|
continue;
|
|
127
155
|
}
|
|
128
156
|
if (promptAST.uri.scheme === resolved.scheme) {
|
|
129
157
|
fileReferenceChecks.push((async () => {
|
|
130
158
|
try {
|
|
131
159
|
const exists = await this.fileService.exists(resolved);
|
|
132
|
-
if (exists) {
|
|
133
|
-
|
|
160
|
+
if (!exists) {
|
|
161
|
+
const loc = this.labelService.getUriLabel(resolved);
|
|
162
|
+
report(toMarker(( localize(7927, "File '{0}' not found at '{1}'.", ref.content, loc)), ref.range, MarkerSeverity.Warning));
|
|
134
163
|
}
|
|
135
|
-
} catch {
|
|
136
|
-
|
|
137
|
-
|
|
164
|
+
} catch (e) {
|
|
165
|
+
this.logger.warn(
|
|
166
|
+
`Error checking existence of file reference '${ref.content}' resolved to '${( resolved.toString())}' in prompt file '${( promptAST.uri.toString())}': ${e.message}`
|
|
167
|
+
);
|
|
168
|
+
}
|
|
138
169
|
})());
|
|
139
170
|
}
|
|
140
171
|
}
|
|
@@ -151,7 +182,7 @@ let PromptValidator = class PromptValidator {
|
|
|
151
182
|
if (currentNames.size === 1) {
|
|
152
183
|
const newName = Array.from(currentNames)[0];
|
|
153
184
|
report(toMarker(( localize(
|
|
154
|
-
|
|
185
|
+
7928,
|
|
155
186
|
"Tool or toolset '{0}' has been renamed, use '{1}' instead.",
|
|
156
187
|
variable.name,
|
|
157
188
|
newName
|
|
@@ -159,7 +190,7 @@ let PromptValidator = class PromptValidator {
|
|
|
159
190
|
} else {
|
|
160
191
|
const newNames = Array.from(currentNames).sort((a, b) => a.localeCompare(b)).join(", ");
|
|
161
192
|
report(toMarker(( localize(
|
|
162
|
-
|
|
193
|
+
7929,
|
|
163
194
|
"Tool or toolset '{0}' has been renamed, use the following tools instead: {1}",
|
|
164
195
|
variable.name,
|
|
165
196
|
newNames
|
|
@@ -167,13 +198,13 @@ let PromptValidator = class PromptValidator {
|
|
|
167
198
|
}
|
|
168
199
|
}
|
|
169
200
|
} else {
|
|
170
|
-
report(toMarker(( localize(
|
|
201
|
+
report(toMarker(( localize(7930, "Unknown tool or toolset '{0}'.", variable.name)), variable.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
171
202
|
}
|
|
172
203
|
} else if (headerToolsMap) {
|
|
173
204
|
const tool = this.languageModelToolsService.getToolByFullReferenceName(variable.name);
|
|
174
205
|
if (tool && headerToolsMap.get(tool) === false) {
|
|
175
206
|
report(toMarker(( localize(
|
|
176
|
-
|
|
207
|
+
7931,
|
|
177
208
|
"Tool or toolset '{0}' also needs to be enabled in the header.",
|
|
178
209
|
variable.name
|
|
179
210
|
)), variable.range, MarkerSeverity.Warning));
|
|
@@ -216,9 +247,7 @@ let PromptValidator = class PromptValidator {
|
|
|
216
247
|
this.validateUserInvocable(attributes, report);
|
|
217
248
|
this.validateDisableModelInvocation(attributes, report);
|
|
218
249
|
this.validateTools(attributes, ChatModeKind.Agent, target, report);
|
|
219
|
-
|
|
220
|
-
this.validateHooks(attributes, target, report);
|
|
221
|
-
}
|
|
250
|
+
this.validateHooks(attributes, target, report);
|
|
222
251
|
if (isVSCodeOrDefaultTarget(target)) {
|
|
223
252
|
this.validateModel(attributes, ChatModeKind.Agent, report);
|
|
224
253
|
this.validateHandoffs(attributes, report);
|
|
@@ -238,25 +267,18 @@ let PromptValidator = class PromptValidator {
|
|
|
238
267
|
}
|
|
239
268
|
}
|
|
240
269
|
checkForInvalidArguments(attributes, promptType, target, report) {
|
|
241
|
-
|
|
242
|
-
if (!this.configurationService.getValue(PromptsConfig.USE_CUSTOM_AGENT_HOOKS)) {
|
|
243
|
-
validAttributeNames = validAttributeNames.filter(name => name !== PromptHeaderAttributes.hooks);
|
|
244
|
-
}
|
|
245
|
-
const useCustomAgentHooks = this.configurationService.getValue(PromptsConfig.USE_CUSTOM_AGENT_HOOKS);
|
|
270
|
+
const validAttributeNames = getValidAttributeNames(promptType, true, target);
|
|
246
271
|
const validGithubCopilotAttributeNames = ( new Lazy(() => ( new Set(getValidAttributeNames(promptType, false, Target.GitHubCopilot)))));
|
|
247
272
|
for (const attribute of attributes) {
|
|
248
273
|
if (!validAttributeNames.includes(attribute.key)) {
|
|
249
274
|
const supportedNames = ( new Lazy(() => {
|
|
250
|
-
|
|
251
|
-
if (!useCustomAgentHooks) {
|
|
252
|
-
names = names.filter(name => name !== PromptHeaderAttributes.hooks);
|
|
253
|
-
}
|
|
275
|
+
const names = getValidAttributeNames(promptType, false, target);
|
|
254
276
|
return names.sort().join(", ");
|
|
255
277
|
}));
|
|
256
278
|
switch (promptType) {
|
|
257
279
|
case PromptsType.prompt:
|
|
258
280
|
report(toMarker(( localize(
|
|
259
|
-
|
|
281
|
+
7932,
|
|
260
282
|
"Attribute '{0}' is not supported in prompt files. Supported: {1}.",
|
|
261
283
|
attribute.key,
|
|
262
284
|
supportedNames.value
|
|
@@ -265,7 +287,7 @@ let PromptValidator = class PromptValidator {
|
|
|
265
287
|
case PromptsType.agent:
|
|
266
288
|
if (target === Target.GitHubCopilot) {
|
|
267
289
|
report(toMarker(( localize(
|
|
268
|
-
|
|
290
|
+
7933,
|
|
269
291
|
"Attribute '{0}' is not supported in custom GitHub Copilot agent files. Supported: {1}.",
|
|
270
292
|
attribute.key,
|
|
271
293
|
supportedNames.value
|
|
@@ -274,13 +296,13 @@ let PromptValidator = class PromptValidator {
|
|
|
274
296
|
; else {
|
|
275
297
|
if (( validGithubCopilotAttributeNames.value.has(attribute.key))) {
|
|
276
298
|
report(toMarker(( localize(
|
|
277
|
-
|
|
299
|
+
7934,
|
|
278
300
|
"Attribute '{0}' is ignored when running locally in VS Code.",
|
|
279
301
|
attribute.key
|
|
280
302
|
)), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
281
303
|
} else {
|
|
282
304
|
report(toMarker(( localize(
|
|
283
|
-
|
|
305
|
+
7935,
|
|
284
306
|
"Attribute '{0}' is not supported in VS Code agent files. Supported: {1}.",
|
|
285
307
|
attribute.key,
|
|
286
308
|
supportedNames.value
|
|
@@ -291,14 +313,14 @@ let PromptValidator = class PromptValidator {
|
|
|
291
313
|
case PromptsType.instructions:
|
|
292
314
|
if (target === Target.Claude) {
|
|
293
315
|
report(toMarker(( localize(
|
|
294
|
-
|
|
316
|
+
7936,
|
|
295
317
|
"Attribute '{0}' is not supported in rules files by VS Code agents. Supported: {1}.",
|
|
296
318
|
attribute.key,
|
|
297
319
|
supportedNames.value
|
|
298
320
|
)), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
299
321
|
} else {
|
|
300
322
|
report(toMarker(( localize(
|
|
301
|
-
|
|
323
|
+
7937,
|
|
302
324
|
"Attribute '{0}' is not supported in instructions files. Supported: {1}.",
|
|
303
325
|
attribute.key,
|
|
304
326
|
supportedNames.value
|
|
@@ -307,7 +329,7 @@ let PromptValidator = class PromptValidator {
|
|
|
307
329
|
break;
|
|
308
330
|
case PromptsType.skill:
|
|
309
331
|
report(toMarker(( localize(
|
|
310
|
-
|
|
332
|
+
7938,
|
|
311
333
|
"Attribute '{0}' is not supported by VS Code agents. Supported: {1}.",
|
|
312
334
|
attribute.key,
|
|
313
335
|
supportedNames.value
|
|
@@ -323,11 +345,11 @@ let PromptValidator = class PromptValidator {
|
|
|
323
345
|
return;
|
|
324
346
|
}
|
|
325
347
|
if (nameAttribute.value.type !== "scalar") {
|
|
326
|
-
report(toMarker(( localize(
|
|
348
|
+
report(toMarker(( localize(7939, "The 'name' attribute must be a string.")), nameAttribute.range, MarkerSeverity.Error));
|
|
327
349
|
return;
|
|
328
350
|
}
|
|
329
351
|
if (nameAttribute.value.value.trim().length === 0) {
|
|
330
|
-
report(toMarker(( localize(
|
|
352
|
+
report(toMarker(( localize(7940, "The 'name' attribute must not be empty.")), nameAttribute.value.range, MarkerSeverity.Error));
|
|
331
353
|
return;
|
|
332
354
|
}
|
|
333
355
|
}
|
|
@@ -337,11 +359,11 @@ let PromptValidator = class PromptValidator {
|
|
|
337
359
|
return;
|
|
338
360
|
}
|
|
339
361
|
if (descriptionAttribute.value.type !== "scalar") {
|
|
340
|
-
report(toMarker(( localize(
|
|
362
|
+
report(toMarker(( localize(7941, "The 'description' attribute must be a string.")), descriptionAttribute.range, MarkerSeverity.Error));
|
|
341
363
|
return;
|
|
342
364
|
}
|
|
343
365
|
if (descriptionAttribute.value.value.trim().length === 0) {
|
|
344
|
-
report(toMarker(( localize(
|
|
366
|
+
report(toMarker(( localize(7942, "The 'description' attribute should not be empty.")), descriptionAttribute.value.range, MarkerSeverity.Error));
|
|
345
367
|
return;
|
|
346
368
|
}
|
|
347
369
|
}
|
|
@@ -351,11 +373,11 @@ let PromptValidator = class PromptValidator {
|
|
|
351
373
|
return;
|
|
352
374
|
}
|
|
353
375
|
if (argumentHintAttribute.value.type !== "scalar") {
|
|
354
|
-
report(toMarker(( localize(
|
|
376
|
+
report(toMarker(( localize(7943, "The 'argument-hint' attribute must be a string.")), argumentHintAttribute.range, MarkerSeverity.Error));
|
|
355
377
|
return;
|
|
356
378
|
}
|
|
357
379
|
if (argumentHintAttribute.value.value.trim().length === 0) {
|
|
358
|
-
report(toMarker(( localize(
|
|
380
|
+
report(toMarker(( localize(7944, "The 'argument-hint' attribute should not be empty.")), argumentHintAttribute.value.range, MarkerSeverity.Warning));
|
|
359
381
|
return;
|
|
360
382
|
}
|
|
361
383
|
}
|
|
@@ -365,30 +387,30 @@ let PromptValidator = class PromptValidator {
|
|
|
365
387
|
return;
|
|
366
388
|
}
|
|
367
389
|
if (attribute.value.type !== "scalar" && attribute.value.type !== "sequence") {
|
|
368
|
-
report(toMarker(( localize(
|
|
390
|
+
report(toMarker(( localize(7945, "The 'model' attribute must be a string or an array of strings.")), attribute.value.range, MarkerSeverity.Error));
|
|
369
391
|
return;
|
|
370
392
|
}
|
|
371
393
|
const modelNames = [];
|
|
372
394
|
if (attribute.value.type === "scalar") {
|
|
373
395
|
const modelName = attribute.value.value.trim();
|
|
374
396
|
if (modelName.length === 0) {
|
|
375
|
-
report(toMarker(( localize(
|
|
397
|
+
report(toMarker(( localize(7946, "The 'model' attribute must be a non-empty string.")), attribute.value.range, MarkerSeverity.Error));
|
|
376
398
|
return;
|
|
377
399
|
}
|
|
378
400
|
modelNames.push([modelName, attribute.value.range]);
|
|
379
401
|
} else if (attribute.value.type === "sequence") {
|
|
380
402
|
if (attribute.value.items.length === 0) {
|
|
381
|
-
report(toMarker(( localize(
|
|
403
|
+
report(toMarker(( localize(7947, "The 'model' array must not be empty.")), attribute.value.range, MarkerSeverity.Error));
|
|
382
404
|
return;
|
|
383
405
|
}
|
|
384
406
|
for (const item of attribute.value.items) {
|
|
385
407
|
if (item.type !== "scalar") {
|
|
386
|
-
report(toMarker(( localize(
|
|
408
|
+
report(toMarker(( localize(7948, "The 'model' array must contain only strings.")), item.range, MarkerSeverity.Error));
|
|
387
409
|
return;
|
|
388
410
|
}
|
|
389
411
|
const modelName = item.value.trim();
|
|
390
412
|
if (modelName.length === 0) {
|
|
391
|
-
report(toMarker(( localize(
|
|
413
|
+
report(toMarker(( localize(7949, "Model names in the array must be non-empty strings.")), item.range, MarkerSeverity.Error));
|
|
392
414
|
return;
|
|
393
415
|
}
|
|
394
416
|
modelNames.push([modelName, item.range]);
|
|
@@ -401,9 +423,9 @@ let PromptValidator = class PromptValidator {
|
|
|
401
423
|
for (const [modelName, range] of modelNames) {
|
|
402
424
|
const modelMetadata = this.findModelByName(modelName);
|
|
403
425
|
if (!modelMetadata) {
|
|
404
|
-
report(toMarker(( localize(
|
|
426
|
+
report(toMarker(( localize(7950, "Unknown model '{0}' will be ignored.", modelName)), range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
405
427
|
} else if (agentKind === ChatModeKind.Agent && !ILanguageModelChatMetadata.suitableForAgentMode(modelMetadata)) {
|
|
406
|
-
report(toMarker(( localize(
|
|
428
|
+
report(toMarker(( localize(7951, "Model '{0}' is not suited for agent mode.", modelName)), range, MarkerSeverity.Warning));
|
|
407
429
|
}
|
|
408
430
|
}
|
|
409
431
|
}
|
|
@@ -417,13 +439,13 @@ let PromptValidator = class PromptValidator {
|
|
|
417
439
|
continue;
|
|
418
440
|
}
|
|
419
441
|
if (attribute.value.type !== "scalar") {
|
|
420
|
-
report(toMarker(( localize(
|
|
442
|
+
report(toMarker(( localize(7952, "The '{0}' attribute must be a string.", claudeAttributeName)), attribute.value.range, MarkerSeverity.Error));
|
|
421
443
|
continue;
|
|
422
444
|
} else {
|
|
423
445
|
const modelName = attribute.value.value.trim();
|
|
424
446
|
if (enumValues.every(model => model.name !== modelName)) {
|
|
425
447
|
const validValues = ( enumValues.map(model => model.name)).join(", ");
|
|
426
|
-
report(toMarker(( localize(
|
|
448
|
+
report(toMarker(( localize(7953, "Unknown value '{0}', valid: {1}.", modelName, validValues)), attribute.value.range, MarkerSeverity.Warning));
|
|
427
449
|
}
|
|
428
450
|
}
|
|
429
451
|
}
|
|
@@ -442,12 +464,12 @@ let PromptValidator = class PromptValidator {
|
|
|
442
464
|
if (modeAttribute) {
|
|
443
465
|
if (agentAttribute) {
|
|
444
466
|
report(toMarker(( localize(
|
|
445
|
-
|
|
467
|
+
7954,
|
|
446
468
|
"The 'mode' attribute has been deprecated. The 'agent' attribute is used instead."
|
|
447
469
|
)), modeAttribute.range, MarkerSeverity.Warning, [MarkerTag.Deprecated]));
|
|
448
470
|
} else {
|
|
449
471
|
report(toMarker(( localize(
|
|
450
|
-
|
|
472
|
+
7955,
|
|
451
473
|
"The 'mode' attribute has been deprecated. Please rename it to 'agent'."
|
|
452
474
|
)), modeAttribute.range, MarkerSeverity.Warning, [MarkerTag.Deprecated]));
|
|
453
475
|
}
|
|
@@ -457,18 +479,18 @@ let PromptValidator = class PromptValidator {
|
|
|
457
479
|
return undefined;
|
|
458
480
|
}
|
|
459
481
|
if (attribute.value.type !== "scalar") {
|
|
460
|
-
report(toMarker(( localize(
|
|
482
|
+
report(toMarker(( localize(7956, "The '{0}' attribute must be a string.", attribute.key)), attribute.value.range, MarkerSeverity.Error));
|
|
461
483
|
return undefined;
|
|
462
484
|
}
|
|
463
485
|
const agentValue = attribute.value.value;
|
|
464
486
|
if (agentValue.trim().length === 0) {
|
|
465
|
-
report(toMarker(( localize(
|
|
487
|
+
report(toMarker(( localize(7957, "The '{0}' attribute must be a non-empty string.", attribute.key)), attribute.value.range, MarkerSeverity.Error));
|
|
466
488
|
return undefined;
|
|
467
489
|
}
|
|
468
490
|
return this.validateAgentValue(attribute.value, report);
|
|
469
491
|
}
|
|
470
492
|
validateAgentValue(value, report) {
|
|
471
|
-
const agents = this.chatModeService.getModes();
|
|
493
|
+
const agents = this.chatModeService.getModes(localChatSessionType);
|
|
472
494
|
const availableAgents = [];
|
|
473
495
|
for (const agent of Iterable.concat(agents.builtin, agents.custom)) {
|
|
474
496
|
if (agent.name.get() === value.value) {
|
|
@@ -477,7 +499,7 @@ let PromptValidator = class PromptValidator {
|
|
|
477
499
|
availableAgents.push(agent.name.get());
|
|
478
500
|
}
|
|
479
501
|
const errorMessage = ( localize(
|
|
480
|
-
|
|
502
|
+
7958,
|
|
481
503
|
"Unknown agent '{0}'. Available agents: {1}.",
|
|
482
504
|
value.value,
|
|
483
505
|
availableAgents.join(", ")
|
|
@@ -492,7 +514,7 @@ let PromptValidator = class PromptValidator {
|
|
|
492
514
|
}
|
|
493
515
|
if (agentKind !== ChatModeKind.Agent) {
|
|
494
516
|
report(toMarker(( localize(
|
|
495
|
-
|
|
517
|
+
7959,
|
|
496
518
|
"The 'tools' attribute is only supported when using agents. Attribute will be ignored."
|
|
497
519
|
)), attribute.range, MarkerSeverity.Warning));
|
|
498
520
|
}
|
|
@@ -502,7 +524,7 @@ let PromptValidator = class PromptValidator {
|
|
|
502
524
|
}
|
|
503
525
|
if (value.type !== "sequence") {
|
|
504
526
|
report(toMarker(( localize(
|
|
505
|
-
|
|
527
|
+
7960,
|
|
506
528
|
"The 'tools' attribute must be an array or a comma separated string."
|
|
507
529
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
508
530
|
return;
|
|
@@ -518,7 +540,7 @@ let PromptValidator = class PromptValidator {
|
|
|
518
540
|
const deprecatedNames = this.languageModelToolsService.getDeprecatedFullReferenceNames();
|
|
519
541
|
for (const item of valueItem.items) {
|
|
520
542
|
if (item.type !== "scalar") {
|
|
521
|
-
report(toMarker(( localize(
|
|
543
|
+
report(toMarker(( localize(7961, "Each tool name in the 'tools' attribute must be a string.")), item.range, MarkerSeverity.Error));
|
|
522
544
|
} else if (item.value) {
|
|
523
545
|
if (!( available.has(item.value))) {
|
|
524
546
|
const currentNames = deprecatedNames.get(item.value);
|
|
@@ -526,7 +548,7 @@ let PromptValidator = class PromptValidator {
|
|
|
526
548
|
if (currentNames?.size === 1) {
|
|
527
549
|
const newName = Array.from(currentNames)[0];
|
|
528
550
|
report(toMarker(( localize(
|
|
529
|
-
|
|
551
|
+
7962,
|
|
530
552
|
"Tool or toolset '{0}' has been renamed, use '{1}' instead.",
|
|
531
553
|
item.value,
|
|
532
554
|
newName
|
|
@@ -534,14 +556,14 @@ let PromptValidator = class PromptValidator {
|
|
|
534
556
|
} else {
|
|
535
557
|
const newNames = Array.from(currentNames).sort((a, b) => a.localeCompare(b)).join(", ");
|
|
536
558
|
report(toMarker(( localize(
|
|
537
|
-
|
|
559
|
+
7963,
|
|
538
560
|
"Tool or toolset '{0}' has been renamed, use the following tools instead: {1}",
|
|
539
561
|
item.value,
|
|
540
562
|
newNames
|
|
541
563
|
)), item.range, MarkerSeverity.Info, [MarkerTag.Deprecated]));
|
|
542
564
|
}
|
|
543
565
|
} else {
|
|
544
|
-
report(toMarker(( localize(
|
|
566
|
+
report(toMarker(( localize(7964, "Unknown tool '{0}' will be ignored.", item.value)), item.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
545
567
|
}
|
|
546
568
|
}
|
|
547
569
|
}
|
|
@@ -554,25 +576,25 @@ let PromptValidator = class PromptValidator {
|
|
|
554
576
|
return;
|
|
555
577
|
}
|
|
556
578
|
if (attribute.value.type !== "scalar") {
|
|
557
|
-
report(toMarker(( localize(
|
|
579
|
+
report(toMarker(( localize(7965, "The 'applyTo' attribute must be a string.")), attribute.value.range, MarkerSeverity.Error));
|
|
558
580
|
return;
|
|
559
581
|
}
|
|
560
582
|
const pattern = attribute.value.value;
|
|
561
583
|
try {
|
|
562
584
|
const patterns = splitGlobAware(pattern, ",");
|
|
563
585
|
if (patterns.length === 0) {
|
|
564
|
-
report(toMarker(( localize(
|
|
586
|
+
report(toMarker(( localize(7966, "The 'applyTo' attribute must be a valid glob pattern.")), attribute.value.range, MarkerSeverity.Error));
|
|
565
587
|
return;
|
|
566
588
|
}
|
|
567
589
|
for (const pattern of patterns) {
|
|
568
590
|
const globPattern = parse(pattern);
|
|
569
591
|
if (isEmptyPattern(globPattern)) {
|
|
570
|
-
report(toMarker(( localize(
|
|
592
|
+
report(toMarker(( localize(7966, "The 'applyTo' attribute must be a valid glob pattern.")), attribute.value.range, MarkerSeverity.Error));
|
|
571
593
|
return;
|
|
572
594
|
}
|
|
573
595
|
}
|
|
574
596
|
} catch (_error) {
|
|
575
|
-
report(toMarker(( localize(
|
|
597
|
+
report(toMarker(( localize(7966, "The 'applyTo' attribute must be a valid glob pattern.")), attribute.value.range, MarkerSeverity.Error));
|
|
576
598
|
}
|
|
577
599
|
}
|
|
578
600
|
validatePaths(attributes, report) {
|
|
@@ -581,26 +603,26 @@ let PromptValidator = class PromptValidator {
|
|
|
581
603
|
return;
|
|
582
604
|
}
|
|
583
605
|
if (attribute.value.type !== "sequence") {
|
|
584
|
-
report(toMarker(( localize(
|
|
606
|
+
report(toMarker(( localize(7967, "The 'paths' attribute must be an array of glob patterns.")), attribute.value.range, MarkerSeverity.Error));
|
|
585
607
|
return;
|
|
586
608
|
}
|
|
587
609
|
for (const item of attribute.value.items) {
|
|
588
610
|
if (item.type !== "scalar") {
|
|
589
|
-
report(toMarker(( localize(
|
|
611
|
+
report(toMarker(( localize(7968, "Each entry in the 'paths' attribute must be a string.")), item.range, MarkerSeverity.Error));
|
|
590
612
|
continue;
|
|
591
613
|
}
|
|
592
614
|
const pattern = item.value.trim();
|
|
593
615
|
if (pattern.length === 0) {
|
|
594
|
-
report(toMarker(( localize(
|
|
616
|
+
report(toMarker(( localize(7969, "Path entries must be non-empty glob patterns.")), item.range, MarkerSeverity.Error));
|
|
595
617
|
continue;
|
|
596
618
|
}
|
|
597
619
|
try {
|
|
598
620
|
const globPattern = parse(pattern);
|
|
599
621
|
if (isEmptyPattern(globPattern)) {
|
|
600
|
-
report(toMarker(( localize(
|
|
622
|
+
report(toMarker(( localize(7970, "'{0}' is not a valid glob pattern.", pattern)), item.range, MarkerSeverity.Error));
|
|
601
623
|
}
|
|
602
624
|
} catch (_error) {
|
|
603
|
-
report(toMarker(( localize(
|
|
625
|
+
report(toMarker(( localize(7970, "'{0}' is not a valid glob pattern.", pattern)), item.range, MarkerSeverity.Error));
|
|
604
626
|
}
|
|
605
627
|
}
|
|
606
628
|
}
|
|
@@ -610,7 +632,7 @@ let PromptValidator = class PromptValidator {
|
|
|
610
632
|
return;
|
|
611
633
|
}
|
|
612
634
|
if (attribute.value.type !== "sequence" && attribute.value.type !== "scalar") {
|
|
613
|
-
report(toMarker(( localize(
|
|
635
|
+
report(toMarker(( localize(7971, "The 'excludeAgent' attribute must be an string or array.")), attribute.value.range, MarkerSeverity.Error));
|
|
614
636
|
return;
|
|
615
637
|
}
|
|
616
638
|
}
|
|
@@ -621,7 +643,7 @@ let PromptValidator = class PromptValidator {
|
|
|
621
643
|
}
|
|
622
644
|
if (attribute.value.type !== "map") {
|
|
623
645
|
report(toMarker(( localize(
|
|
624
|
-
|
|
646
|
+
7972,
|
|
625
647
|
"The 'hooks' attribute must be a map of hook event types to command arrays."
|
|
626
648
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
627
649
|
return;
|
|
@@ -630,7 +652,7 @@ let PromptValidator = class PromptValidator {
|
|
|
630
652
|
for (const prop of attribute.value.properties) {
|
|
631
653
|
if (!( validHookNames.has(prop.key.value))) {
|
|
632
654
|
report(toMarker(( localize(
|
|
633
|
-
|
|
655
|
+
7973,
|
|
634
656
|
"Unknown hook event type '{0}'. Supported: {1}.",
|
|
635
657
|
prop.key.value,
|
|
636
658
|
Array.from(validHookNames).join(", ")
|
|
@@ -638,7 +660,7 @@ let PromptValidator = class PromptValidator {
|
|
|
638
660
|
}
|
|
639
661
|
if (prop.value.type !== "sequence") {
|
|
640
662
|
report(toMarker(( localize(
|
|
641
|
-
|
|
663
|
+
7974,
|
|
642
664
|
"Hook event '{0}' must have an array of command objects as its value.",
|
|
643
665
|
prop.key.value
|
|
644
666
|
)), prop.value.range, MarkerSeverity.Error));
|
|
@@ -651,19 +673,19 @@ let PromptValidator = class PromptValidator {
|
|
|
651
673
|
}
|
|
652
674
|
validateHookCommand(item, target, report) {
|
|
653
675
|
if (item.type !== "map") {
|
|
654
|
-
report(toMarker(( localize(
|
|
676
|
+
report(toMarker(( localize(7975, "Each hook command must be an object.")), item.range, MarkerSeverity.Error));
|
|
655
677
|
return;
|
|
656
678
|
}
|
|
657
679
|
const hooksProperty = item.properties.find(p => p.key.value === "hooks");
|
|
658
680
|
if (hooksProperty) {
|
|
659
681
|
for (const prop of item.properties) {
|
|
660
682
|
if (prop.key.value !== "hooks" && prop.key.value !== "matcher") {
|
|
661
|
-
report(toMarker(( localize(
|
|
683
|
+
report(toMarker(( localize(7976, "Unknown property '{0}' in hook matcher.", prop.key.value)), prop.key.range, MarkerSeverity.Warning));
|
|
662
684
|
}
|
|
663
685
|
}
|
|
664
686
|
if (hooksProperty.value.type !== "sequence") {
|
|
665
687
|
report(toMarker(( localize(
|
|
666
|
-
|
|
688
|
+
7977,
|
|
667
689
|
"The 'hooks' property in a matcher must be an array of command objects."
|
|
668
690
|
)), hooksProperty.value.range, MarkerSeverity.Error));
|
|
669
691
|
return;
|
|
@@ -692,37 +714,37 @@ let PromptValidator = class PromptValidator {
|
|
|
692
714
|
for (const prop of item.properties) {
|
|
693
715
|
const key = prop.key.value;
|
|
694
716
|
if (!( validProperties.has(key))) {
|
|
695
|
-
report(toMarker(( localize(
|
|
717
|
+
report(toMarker(( localize(7978, "Unknown property '{0}' in hook command.", key)), prop.key.range, MarkerSeverity.Warning));
|
|
696
718
|
}
|
|
697
719
|
if (key === "type") {
|
|
698
720
|
hasType = true;
|
|
699
721
|
if (prop.value.type !== "scalar" || prop.value.value !== "command") {
|
|
700
|
-
report(toMarker(( localize(
|
|
722
|
+
report(toMarker(( localize(7979, "The 'type' property in a hook command must be 'command'.")), prop.value.range, MarkerSeverity.Error));
|
|
701
723
|
}
|
|
702
724
|
} else if (( validCommandFields.has(key))) {
|
|
703
725
|
hasCommandField = true;
|
|
704
726
|
if (prop.value.type !== "scalar" || prop.value.value.trim().length === 0) {
|
|
705
727
|
report(toMarker(( localize(
|
|
706
|
-
|
|
728
|
+
7980,
|
|
707
729
|
"The '{0}' property in a hook command must be a non-empty string.",
|
|
708
730
|
key
|
|
709
731
|
)), prop.value.range, MarkerSeverity.Error));
|
|
710
732
|
}
|
|
711
733
|
} else if (key === "cwd") {
|
|
712
734
|
if (prop.value.type !== "scalar") {
|
|
713
|
-
report(toMarker(( localize(
|
|
735
|
+
report(toMarker(( localize(7981, "The 'cwd' property in a hook command must be a string.")), prop.value.range, MarkerSeverity.Error));
|
|
714
736
|
}
|
|
715
737
|
} else if (key === "env") {
|
|
716
738
|
if (prop.value.type !== "map") {
|
|
717
739
|
report(toMarker(( localize(
|
|
718
|
-
|
|
740
|
+
7982,
|
|
719
741
|
"The 'env' property in a hook command must be a map of string values."
|
|
720
742
|
)), prop.value.range, MarkerSeverity.Error));
|
|
721
743
|
} else {
|
|
722
744
|
for (const envProp of prop.value.properties) {
|
|
723
745
|
if (envProp.value.type !== "scalar") {
|
|
724
746
|
report(toMarker(( localize(
|
|
725
|
-
|
|
747
|
+
7983,
|
|
726
748
|
"Environment variable '{0}' must have a string value.",
|
|
727
749
|
envProp.key.value
|
|
728
750
|
)), envProp.value.range, MarkerSeverity.Error));
|
|
@@ -731,19 +753,19 @@ let PromptValidator = class PromptValidator {
|
|
|
731
753
|
}
|
|
732
754
|
} else if (key === "timeout" || key === "timeoutSec") {
|
|
733
755
|
if (prop.value.type !== "scalar" || isNaN(Number(prop.value.value))) {
|
|
734
|
-
report(toMarker(( localize(
|
|
756
|
+
report(toMarker(( localize(7984, "The '{0}' property in a hook command must be a number.", key)), prop.value.range, MarkerSeverity.Error));
|
|
735
757
|
}
|
|
736
758
|
}
|
|
737
759
|
}
|
|
738
760
|
if (!hasType) {
|
|
739
|
-
report(toMarker(( localize(
|
|
761
|
+
report(toMarker(( localize(7985, "Hook command is missing required property 'type'.")), item.range, MarkerSeverity.Error));
|
|
740
762
|
}
|
|
741
763
|
if (!hasCommandField) {
|
|
742
764
|
if (isCopilotCli) {
|
|
743
|
-
report(toMarker(( localize(
|
|
765
|
+
report(toMarker(( localize(7986, "Hook command must specify at least one of 'bash' or 'powershell'.")), item.range, MarkerSeverity.Error));
|
|
744
766
|
} else {
|
|
745
767
|
report(toMarker(( localize(
|
|
746
|
-
|
|
768
|
+
7987,
|
|
747
769
|
"Hook command must specify at least one of 'command', 'windows', 'linux', or 'osx'."
|
|
748
770
|
)), item.range, MarkerSeverity.Error));
|
|
749
771
|
}
|
|
@@ -755,14 +777,14 @@ let PromptValidator = class PromptValidator {
|
|
|
755
777
|
return;
|
|
756
778
|
}
|
|
757
779
|
if (attribute.value.type !== "sequence") {
|
|
758
|
-
report(toMarker(( localize(
|
|
780
|
+
report(toMarker(( localize(7988, "The 'handoffs' attribute must be an array.")), attribute.value.range, MarkerSeverity.Error));
|
|
759
781
|
return;
|
|
760
782
|
}
|
|
761
783
|
const seenLabels = ( new Map());
|
|
762
784
|
for (const item of attribute.value.items) {
|
|
763
785
|
if (item.type !== "map") {
|
|
764
786
|
report(toMarker(( localize(
|
|
765
|
-
|
|
787
|
+
7989,
|
|
766
788
|
"Each handoff in the 'handoffs' attribute must be an object with 'label', 'agent', 'prompt' and optional 'send'."
|
|
767
789
|
)), item.range, MarkerSeverity.Error));
|
|
768
790
|
continue;
|
|
@@ -772,44 +794,44 @@ let PromptValidator = class PromptValidator {
|
|
|
772
794
|
switch (prop.key.value) {
|
|
773
795
|
case "label":
|
|
774
796
|
if (prop.value.type !== "scalar" || prop.value.value.trim().length === 0) {
|
|
775
|
-
report(toMarker(( localize(
|
|
797
|
+
report(toMarker(( localize(7990, "The 'label' property in a handoff must be a non-empty string.")), prop.value.range, MarkerSeverity.Error));
|
|
776
798
|
} else if (!/[a-zA-Z0-9]/.test(prop.value.value)) {
|
|
777
799
|
report(toMarker(( localize(
|
|
778
|
-
|
|
800
|
+
7991,
|
|
779
801
|
"The 'label' property in a handoff must contain at least one alphanumeric character."
|
|
780
802
|
)), prop.value.range, MarkerSeverity.Error));
|
|
781
803
|
}
|
|
782
804
|
break;
|
|
783
805
|
case "agent":
|
|
784
806
|
if (prop.value.type !== "scalar" || prop.value.value.trim().length === 0) {
|
|
785
|
-
report(toMarker(( localize(
|
|
807
|
+
report(toMarker(( localize(7992, "The 'agent' property in a handoff must be a non-empty string.")), prop.value.range, MarkerSeverity.Error));
|
|
786
808
|
} else {
|
|
787
809
|
this.validateAgentValue(prop.value, report);
|
|
788
810
|
}
|
|
789
811
|
break;
|
|
790
812
|
case "prompt":
|
|
791
813
|
if (prop.value.type !== "scalar") {
|
|
792
|
-
report(toMarker(( localize(
|
|
814
|
+
report(toMarker(( localize(7993, "The 'prompt' property in a handoff must be a string.")), prop.value.range, MarkerSeverity.Error));
|
|
793
815
|
}
|
|
794
816
|
break;
|
|
795
817
|
case "send":
|
|
796
818
|
if (!isTrueOrFalse(prop.value)) {
|
|
797
|
-
report(toMarker(( localize(
|
|
819
|
+
report(toMarker(( localize(7994, "The 'send' property in a handoff must be a boolean.")), prop.value.range, MarkerSeverity.Error));
|
|
798
820
|
}
|
|
799
821
|
break;
|
|
800
822
|
case "showContinueOn":
|
|
801
823
|
if (!isTrueOrFalse(prop.value)) {
|
|
802
|
-
report(toMarker(( localize(
|
|
824
|
+
report(toMarker(( localize(7995, "The 'showContinueOn' property in a handoff must be a boolean.")), prop.value.range, MarkerSeverity.Error));
|
|
803
825
|
}
|
|
804
826
|
break;
|
|
805
827
|
case "model":
|
|
806
828
|
if (prop.value.type !== "scalar") {
|
|
807
|
-
report(toMarker(( localize(
|
|
829
|
+
report(toMarker(( localize(7996, "The 'model' property in a handoff must be a string.")), prop.value.range, MarkerSeverity.Error));
|
|
808
830
|
}
|
|
809
831
|
break;
|
|
810
832
|
default:
|
|
811
833
|
report(toMarker(( localize(
|
|
812
|
-
|
|
834
|
+
7997,
|
|
813
835
|
"Unknown property '{0}' in handoff object. Supported properties are 'label', 'agent', 'prompt' and optional 'send', 'showContinueOn', 'model'.",
|
|
814
836
|
prop.key.value
|
|
815
837
|
)), prop.value.range, MarkerSeverity.Warning));
|
|
@@ -818,7 +840,7 @@ let PromptValidator = class PromptValidator {
|
|
|
818
840
|
}
|
|
819
841
|
if (required.size > 0) {
|
|
820
842
|
report(toMarker(( localize(
|
|
821
|
-
|
|
843
|
+
7998,
|
|
822
844
|
"Missing required properties {0} in handoff object.",
|
|
823
845
|
( Array.from(required).map(s => `'${s}'`)).join(", ")
|
|
824
846
|
)), item.range, MarkerSeverity.Error));
|
|
@@ -828,7 +850,7 @@ let PromptValidator = class PromptValidator {
|
|
|
828
850
|
const normalizedLabel = labelProp.value.value.toLowerCase();
|
|
829
851
|
if (normalizedLabel && ( seenLabels.has(normalizedLabel))) {
|
|
830
852
|
report(toMarker(( localize(
|
|
831
|
-
|
|
853
|
+
7999,
|
|
832
854
|
"Duplicate handoff label '{0}'. Each handoff must have a unique label.",
|
|
833
855
|
labelProp.value.value
|
|
834
856
|
)), labelProp.value.range, MarkerSeverity.Error));
|
|
@@ -844,7 +866,7 @@ let PromptValidator = class PromptValidator {
|
|
|
844
866
|
return;
|
|
845
867
|
}
|
|
846
868
|
report(toMarker(( localize(
|
|
847
|
-
|
|
869
|
+
8000,
|
|
848
870
|
"The 'infer' attribute is deprecated in favour of 'user-invocable' and 'disable-model-invocation'."
|
|
849
871
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
850
872
|
}
|
|
@@ -854,18 +876,18 @@ let PromptValidator = class PromptValidator {
|
|
|
854
876
|
return;
|
|
855
877
|
}
|
|
856
878
|
if (attribute.value.type !== "scalar") {
|
|
857
|
-
report(toMarker(( localize(
|
|
879
|
+
report(toMarker(( localize(8001, "The 'target' attribute must be a string.")), attribute.value.range, MarkerSeverity.Error));
|
|
858
880
|
return;
|
|
859
881
|
}
|
|
860
882
|
const targetValue = attribute.value.value.trim();
|
|
861
883
|
if (targetValue.length === 0) {
|
|
862
|
-
report(toMarker(( localize(
|
|
884
|
+
report(toMarker(( localize(8002, "The 'target' attribute must be a non-empty string.")), attribute.value.range, MarkerSeverity.Error));
|
|
863
885
|
return;
|
|
864
886
|
}
|
|
865
887
|
const validTargets = ["github-copilot", "vscode"];
|
|
866
888
|
if (!validTargets.includes(targetValue)) {
|
|
867
889
|
report(toMarker(( localize(
|
|
868
|
-
|
|
890
|
+
8003,
|
|
869
891
|
"The 'target' attribute must be one of: {0}.",
|
|
870
892
|
validTargets.join(", ")
|
|
871
893
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
@@ -877,7 +899,7 @@ let PromptValidator = class PromptValidator {
|
|
|
877
899
|
return;
|
|
878
900
|
}
|
|
879
901
|
if (!isTrueOrFalse(attribute.value)) {
|
|
880
|
-
report(toMarker(( localize(
|
|
902
|
+
report(toMarker(( localize(8004, "The 'user-invocable' attribute must be 'true' or 'false'.")), attribute.value.range, MarkerSeverity.Error));
|
|
881
903
|
return;
|
|
882
904
|
}
|
|
883
905
|
}
|
|
@@ -888,7 +910,7 @@ let PromptValidator = class PromptValidator {
|
|
|
888
910
|
}
|
|
889
911
|
if (!isTrueOrFalse(attribute.value)) {
|
|
890
912
|
report(toMarker(( localize(
|
|
891
|
-
|
|
913
|
+
8005,
|
|
892
914
|
"The 'disable-model-invocation' attribute must be 'true' or 'false'."
|
|
893
915
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
894
916
|
return;
|
|
@@ -900,21 +922,21 @@ let PromptValidator = class PromptValidator {
|
|
|
900
922
|
return;
|
|
901
923
|
}
|
|
902
924
|
if (attribute.value.type !== "sequence") {
|
|
903
|
-
report(toMarker(( localize(
|
|
925
|
+
report(toMarker(( localize(8006, "The 'agents' attribute must be an array.")), attribute.value.range, MarkerSeverity.Error));
|
|
904
926
|
return;
|
|
905
927
|
}
|
|
906
|
-
const agents = await this.promptsService.getCustomAgents(CancellationToken.None);
|
|
928
|
+
const agents = (await this.promptsService.getCustomAgents(CancellationToken.None)).filter(a => a.enabled);
|
|
907
929
|
const availableAgentNames = ( new Set(( agents.map(agent => agent.name))));
|
|
908
930
|
availableAgentNames.add(ChatMode.Agent.name.get());
|
|
909
931
|
const agentNames = [];
|
|
910
932
|
for (const item of attribute.value.items) {
|
|
911
933
|
if (item.type !== "scalar") {
|
|
912
|
-
report(toMarker(( localize(
|
|
934
|
+
report(toMarker(( localize(8007, "Each agent name in the 'agents' attribute must be a string.")), item.range, MarkerSeverity.Error));
|
|
913
935
|
} else if (item.value) {
|
|
914
936
|
agentNames.push(item.value);
|
|
915
937
|
if (item.value !== "*" && !( availableAgentNames.has(item.value))) {
|
|
916
938
|
report(toMarker(( localize(
|
|
917
|
-
|
|
939
|
+
8008,
|
|
918
940
|
"Unknown agent '{0}' will be ignored. Available agents: {1}.",
|
|
919
941
|
item.value,
|
|
920
942
|
Array.from(availableAgentNames).join(", ")
|
|
@@ -926,7 +948,7 @@ let PromptValidator = class PromptValidator {
|
|
|
926
948
|
const tools = header.tools;
|
|
927
949
|
if (tools && !tools.includes(SpecedToolAliases.agent)) {
|
|
928
950
|
report(toMarker(( localize(
|
|
929
|
-
|
|
951
|
+
8009,
|
|
930
952
|
"When 'agents' and 'tools' are specified, the 'agent' tool must be included in the 'tools' attribute."
|
|
931
953
|
)), attribute.value.range, MarkerSeverity.Warning));
|
|
932
954
|
}
|
|
@@ -938,20 +960,20 @@ let PromptValidator = class PromptValidator {
|
|
|
938
960
|
return;
|
|
939
961
|
}
|
|
940
962
|
if (attribute.value.type !== "map") {
|
|
941
|
-
report(toMarker(( localize(
|
|
963
|
+
report(toMarker(( localize(8010, "The 'github' attribute must be an object.")), attribute.value.range, MarkerSeverity.Error));
|
|
942
964
|
return;
|
|
943
965
|
}
|
|
944
966
|
for (const prop of attribute.value.properties) {
|
|
945
967
|
if (prop.key.value !== "permissions") {
|
|
946
968
|
report(toMarker(( localize(
|
|
947
|
-
|
|
969
|
+
8011,
|
|
948
970
|
"Unknown property '{0}' in 'github' object. Supported: 'permissions'.",
|
|
949
971
|
prop.key.value
|
|
950
972
|
)), prop.key.range, MarkerSeverity.Warning));
|
|
951
973
|
continue;
|
|
952
974
|
}
|
|
953
975
|
if (prop.value.type !== "map") {
|
|
954
|
-
report(toMarker(( localize(
|
|
976
|
+
report(toMarker(( localize(8012, "The 'permissions' property must be an object.")), prop.value.range, MarkerSeverity.Error));
|
|
955
977
|
continue;
|
|
956
978
|
}
|
|
957
979
|
for (const permProp of prop.value.properties) {
|
|
@@ -960,7 +982,7 @@ let PromptValidator = class PromptValidator {
|
|
|
960
982
|
if (!scopeInfo) {
|
|
961
983
|
const validScopes = ( Object.keys(githubPermissionScopes)).sort().join(", ");
|
|
962
984
|
report(toMarker(( localize(
|
|
963
|
-
|
|
985
|
+
8013,
|
|
964
986
|
"Unknown permission scope '{0}'. Valid scopes: {1}.",
|
|
965
987
|
scope,
|
|
966
988
|
validScopes
|
|
@@ -968,13 +990,13 @@ let PromptValidator = class PromptValidator {
|
|
|
968
990
|
continue;
|
|
969
991
|
}
|
|
970
992
|
if (permProp.value.type !== "scalar") {
|
|
971
|
-
report(toMarker(( localize(
|
|
993
|
+
report(toMarker(( localize(8014, "The permission value for '{0}' must be a string.", scope)), permProp.value.range, MarkerSeverity.Error));
|
|
972
994
|
continue;
|
|
973
995
|
}
|
|
974
996
|
const value = permProp.value.value;
|
|
975
997
|
if (!scopeInfo.allowedValues.includes(value)) {
|
|
976
998
|
report(toMarker(( localize(
|
|
977
|
-
|
|
999
|
+
8015,
|
|
978
1000
|
"Invalid permission value '{0}' for scope '{1}'. Allowed values: {2}.",
|
|
979
1001
|
value,
|
|
980
1002
|
scope,
|
|
@@ -985,43 +1007,43 @@ let PromptValidator = class PromptValidator {
|
|
|
985
1007
|
}
|
|
986
1008
|
}
|
|
987
1009
|
};
|
|
988
|
-
PromptValidator = ( __decorate([( __param(0, ILanguageModelsService)), ( __param(1, ILanguageModelToolsService)), ( __param(2, IChatModeService)), ( __param(3, IFileService)), ( __param(4, ILabelService)), ( __param(5, IPromptsService)), ( __param(6, IConfigurationService))], PromptValidator));
|
|
1010
|
+
PromptValidator = ( __decorate([( __param(0, ILanguageModelsService)), ( __param(1, ILanguageModelToolsService)), ( __param(2, IChatModeService)), ( __param(3, IFileService)), ( __param(4, ILabelService)), ( __param(5, IPromptsService)), ( __param(6, ILogService)), ( __param(7, IConfigurationService))], PromptValidator));
|
|
989
1011
|
const githubPermissionScopes = {
|
|
990
1012
|
"actions": {
|
|
991
1013
|
allowedValues: ["read", "write", "none"],
|
|
992
|
-
description: ( localize(
|
|
1014
|
+
description: ( localize(8016, "Access to GitHub Actions workflows and runs"))
|
|
993
1015
|
},
|
|
994
1016
|
"checks": {
|
|
995
1017
|
allowedValues: ["read", "none"],
|
|
996
|
-
description: ( localize(
|
|
1018
|
+
description: ( localize(8017, "Access to check runs and statuses"))
|
|
997
1019
|
},
|
|
998
1020
|
"contents": {
|
|
999
1021
|
allowedValues: ["read", "write", "none"],
|
|
1000
|
-
description: ( localize(
|
|
1022
|
+
description: ( localize(8018, "Access to repository contents (files, commits, branches)"))
|
|
1001
1023
|
},
|
|
1002
1024
|
"discussions": {
|
|
1003
1025
|
allowedValues: ["read", "write", "none"],
|
|
1004
|
-
description: ( localize(
|
|
1026
|
+
description: ( localize(8019, "Access to discussions"))
|
|
1005
1027
|
},
|
|
1006
1028
|
"issues": {
|
|
1007
1029
|
allowedValues: ["read", "write", "none"],
|
|
1008
|
-
description: ( localize(
|
|
1030
|
+
description: ( localize(8020, "Access to issues (read, create, update, comment)"))
|
|
1009
1031
|
},
|
|
1010
1032
|
"metadata": {
|
|
1011
1033
|
allowedValues: ["read"],
|
|
1012
|
-
description: ( localize(
|
|
1034
|
+
description: ( localize(8021, "Repository metadata (always read-only)"))
|
|
1013
1035
|
},
|
|
1014
1036
|
"pull-requests": {
|
|
1015
1037
|
allowedValues: ["read", "write", "none"],
|
|
1016
|
-
description: ( localize(
|
|
1038
|
+
description: ( localize(8022, "Access to pull requests (read, create, update, review)"))
|
|
1017
1039
|
},
|
|
1018
1040
|
"security-events": {
|
|
1019
1041
|
allowedValues: ["read", "none"],
|
|
1020
|
-
description: ( localize(
|
|
1042
|
+
description: ( localize(8023, "Access to security-related events"))
|
|
1021
1043
|
},
|
|
1022
1044
|
"workflows": {
|
|
1023
1045
|
allowedValues: ["write", "none"],
|
|
1024
|
-
description: ( localize(
|
|
1046
|
+
description: ( localize(8024, "Access to modify workflow files"))
|
|
1025
1047
|
}
|
|
1026
1048
|
};
|
|
1027
1049
|
function isTrueOrFalse(value) {
|
|
@@ -1070,7 +1092,8 @@ const allAttributeNames = {
|
|
|
1070
1092
|
PromptHeaderAttributes.metadata,
|
|
1071
1093
|
PromptHeaderAttributes.argumentHint,
|
|
1072
1094
|
PromptHeaderAttributes.userInvocable,
|
|
1073
|
-
PromptHeaderAttributes.disableModelInvocation
|
|
1095
|
+
PromptHeaderAttributes.disableModelInvocation,
|
|
1096
|
+
PromptHeaderAttributes.context
|
|
1074
1097
|
],
|
|
1075
1098
|
[PromptsType.hook]: []
|
|
1076
1099
|
};
|
|
@@ -1108,103 +1131,103 @@ function isNonRecommendedAttribute(attributeName) {
|
|
|
1108
1131
|
}
|
|
1109
1132
|
const knownClaudeTools = [{
|
|
1110
1133
|
name: "Bash",
|
|
1111
|
-
description: ( localize(
|
|
1134
|
+
description: ( localize(8025, "Execute shell commands")),
|
|
1112
1135
|
toolEquivalent: [SpecedToolAliases.execute]
|
|
1113
1136
|
}, {
|
|
1114
1137
|
name: "Edit",
|
|
1115
|
-
description: ( localize(
|
|
1138
|
+
description: ( localize(8026, "Make targeted file edits")),
|
|
1116
1139
|
toolEquivalent: ["edit/editNotebook", "edit/editFiles"]
|
|
1117
1140
|
}, {
|
|
1118
1141
|
name: "Glob",
|
|
1119
|
-
description: ( localize(
|
|
1142
|
+
description: ( localize(8027, "Find files by pattern")),
|
|
1120
1143
|
toolEquivalent: ["search/fileSearch"]
|
|
1121
1144
|
}, {
|
|
1122
1145
|
name: "Grep",
|
|
1123
|
-
description: ( localize(
|
|
1146
|
+
description: ( localize(8028, "Search file contents with regex")),
|
|
1124
1147
|
toolEquivalent: ["search/textSearch"]
|
|
1125
1148
|
}, {
|
|
1126
1149
|
name: "Read",
|
|
1127
|
-
description: ( localize(
|
|
1150
|
+
description: ( localize(8029, "Read file contents")),
|
|
1128
1151
|
toolEquivalent: ["read/readFile", "read/getNotebookSummary"]
|
|
1129
1152
|
}, {
|
|
1130
1153
|
name: "Write",
|
|
1131
|
-
description: ( localize(
|
|
1154
|
+
description: ( localize(8030, "Create/overwrite files")),
|
|
1132
1155
|
toolEquivalent: ["edit/createDirectory", "edit/createFile", "edit/createJupyterNotebook"]
|
|
1133
1156
|
}, {
|
|
1134
1157
|
name: "WebFetch",
|
|
1135
|
-
description: ( localize(
|
|
1158
|
+
description: ( localize(8031, "Fetch URL content")),
|
|
1136
1159
|
toolEquivalent: [SpecedToolAliases.web]
|
|
1137
1160
|
}, {
|
|
1138
1161
|
name: "WebSearch",
|
|
1139
|
-
description: ( localize(
|
|
1162
|
+
description: ( localize(8032, "Perform web searches")),
|
|
1140
1163
|
toolEquivalent: [SpecedToolAliases.web]
|
|
1141
1164
|
}, {
|
|
1142
1165
|
name: "Task",
|
|
1143
|
-
description: ( localize(
|
|
1166
|
+
description: ( localize(8033, "Run subagents for complex tasks")),
|
|
1144
1167
|
toolEquivalent: [SpecedToolAliases.agent]
|
|
1145
1168
|
}, {
|
|
1146
1169
|
name: "Skill",
|
|
1147
|
-
description: ( localize(
|
|
1170
|
+
description: ( localize(8034, "Execute skills")),
|
|
1148
1171
|
toolEquivalent: []
|
|
1149
1172
|
}, {
|
|
1150
1173
|
name: "LSP",
|
|
1151
|
-
description: ( localize(
|
|
1174
|
+
description: ( localize(8035, "Code intelligence (requires plugin)")),
|
|
1152
1175
|
toolEquivalent: []
|
|
1153
1176
|
}, {
|
|
1154
1177
|
name: "NotebookEdit",
|
|
1155
|
-
description: ( localize(
|
|
1178
|
+
description: ( localize(8036, "Modify Jupyter notebooks")),
|
|
1156
1179
|
toolEquivalent: ["edit/editNotebook"]
|
|
1157
1180
|
}, {
|
|
1158
1181
|
name: "AskUserQuestion",
|
|
1159
|
-
description: ( localize(
|
|
1182
|
+
description: ( localize(8037, "Ask multiple-choice questions")),
|
|
1160
1183
|
toolEquivalent: ["vscode/askQuestions"]
|
|
1161
1184
|
}, {
|
|
1162
1185
|
name: "MCPSearch",
|
|
1163
|
-
description: ( localize(
|
|
1186
|
+
description: ( localize(8038, "Searches for MCP tools when tool search is enabled")),
|
|
1164
1187
|
toolEquivalent: []
|
|
1165
1188
|
}];
|
|
1166
1189
|
const knownClaudeModels = [{
|
|
1167
1190
|
name: "sonnet",
|
|
1168
|
-
description: ( localize(
|
|
1191
|
+
description: ( localize(8039, "Latest Claude Sonnet")),
|
|
1169
1192
|
modelEquivalent: "Claude Sonnet 4.5 (copilot)"
|
|
1170
1193
|
}, {
|
|
1171
1194
|
name: "opus",
|
|
1172
|
-
description: ( localize(
|
|
1195
|
+
description: ( localize(8040, "Latest Claude Opus")),
|
|
1173
1196
|
modelEquivalent: "Claude Opus 4.6 (copilot)"
|
|
1174
1197
|
}, {
|
|
1175
1198
|
name: "haiku",
|
|
1176
|
-
description: ( localize(
|
|
1199
|
+
description: ( localize(8041, "Latest Claude Haiku, fast for simple tasks")),
|
|
1177
1200
|
modelEquivalent: "Claude Haiku 4.5 (copilot)"
|
|
1178
1201
|
}, {
|
|
1179
1202
|
name: "inherit",
|
|
1180
|
-
description: ( localize(
|
|
1203
|
+
description: ( localize(8042, "Inherit model from parent agent or prompt")),
|
|
1181
1204
|
modelEquivalent: undefined
|
|
1182
1205
|
}];
|
|
1183
1206
|
const claudeAgentAttributes = {
|
|
1184
1207
|
"name": {
|
|
1185
1208
|
type: "scalar",
|
|
1186
|
-
description: ( localize(
|
|
1209
|
+
description: ( localize(8043, "Unique identifier using lowercase letters and hyphens (required)"))
|
|
1187
1210
|
},
|
|
1188
1211
|
"description": {
|
|
1189
1212
|
type: "scalar",
|
|
1190
|
-
description: ( localize(
|
|
1213
|
+
description: ( localize(8044, "When to delegate to this subagent (required)"))
|
|
1191
1214
|
},
|
|
1192
1215
|
"tools": {
|
|
1193
1216
|
type: "sequence",
|
|
1194
|
-
description: ( localize(
|
|
1217
|
+
description: ( localize(8045, "Array of tools the subagent can use. Inherits all tools if omitted")),
|
|
1195
1218
|
defaults: ["Read, Edit, Bash"],
|
|
1196
1219
|
items: knownClaudeTools
|
|
1197
1220
|
},
|
|
1198
1221
|
"disallowedTools": {
|
|
1199
1222
|
type: "sequence",
|
|
1200
|
-
description: ( localize(
|
|
1223
|
+
description: ( localize(8046, "Tools to deny, removed from inherited or specified list")),
|
|
1201
1224
|
defaults: ["Write, Edit, Bash"],
|
|
1202
1225
|
items: knownClaudeTools
|
|
1203
1226
|
},
|
|
1204
1227
|
"model": {
|
|
1205
1228
|
type: "scalar",
|
|
1206
1229
|
description: ( localize(
|
|
1207
|
-
|
|
1230
|
+
8047,
|
|
1208
1231
|
"Model to use: sonnet, opus, haiku, or inherit. Defaults to inherit."
|
|
1209
1232
|
)),
|
|
1210
1233
|
defaults: ["sonnet", "opus", "haiku", "inherit"],
|
|
@@ -1213,77 +1236,77 @@ const claudeAgentAttributes = {
|
|
|
1213
1236
|
"permissionMode": {
|
|
1214
1237
|
type: "scalar",
|
|
1215
1238
|
description: ( localize(
|
|
1216
|
-
|
|
1239
|
+
8048,
|
|
1217
1240
|
"Permission mode: default, acceptEdits, dontAsk, bypassPermissions, or plan."
|
|
1218
1241
|
)),
|
|
1219
1242
|
defaults: ["default", "acceptEdits", "dontAsk", "bypassPermissions", "plan"],
|
|
1220
1243
|
enums: [{
|
|
1221
1244
|
name: "default",
|
|
1222
1245
|
description: ( localize(
|
|
1223
|
-
|
|
1246
|
+
8049,
|
|
1224
1247
|
"Standard behavior: prompts for permission on first use of each tool."
|
|
1225
1248
|
))
|
|
1226
1249
|
}, {
|
|
1227
1250
|
name: "acceptEdits",
|
|
1228
|
-
description: ( localize(
|
|
1251
|
+
description: ( localize(8050, "Automatically accepts file edit permissions for the session."))
|
|
1229
1252
|
}, {
|
|
1230
1253
|
name: "plan",
|
|
1231
1254
|
description: ( localize(
|
|
1232
|
-
|
|
1255
|
+
8051,
|
|
1233
1256
|
"Plan Mode: Claude can analyze but not modify files or execute commands."
|
|
1234
1257
|
))
|
|
1235
1258
|
}, {
|
|
1236
1259
|
name: "delegate",
|
|
1237
1260
|
description: ( localize(
|
|
1238
|
-
|
|
1261
|
+
8052,
|
|
1239
1262
|
"Coordination-only mode for agent team leads. Only available when an agent team is active."
|
|
1240
1263
|
))
|
|
1241
1264
|
}, {
|
|
1242
1265
|
name: "dontAsk",
|
|
1243
1266
|
description: ( localize(
|
|
1244
|
-
|
|
1267
|
+
8053,
|
|
1245
1268
|
"Auto-denies tools unless pre-approved via /permissions or permissions.allow rules."
|
|
1246
1269
|
))
|
|
1247
1270
|
}, {
|
|
1248
1271
|
name: "bypassPermissions",
|
|
1249
1272
|
description: ( localize(
|
|
1250
|
-
|
|
1273
|
+
8054,
|
|
1251
1274
|
"Skips all permission prompts (requires safe environment like containers)."
|
|
1252
1275
|
))
|
|
1253
1276
|
}]
|
|
1254
1277
|
},
|
|
1255
1278
|
"skills": {
|
|
1256
1279
|
type: "sequence",
|
|
1257
|
-
description: ( localize(
|
|
1280
|
+
description: ( localize(8055, "Skills to load into the subagent's context at startup."))
|
|
1258
1281
|
},
|
|
1259
1282
|
"mcpServers": {
|
|
1260
1283
|
type: "sequence",
|
|
1261
|
-
description: ( localize(
|
|
1284
|
+
description: ( localize(8056, "MCP servers available to this subagent."))
|
|
1262
1285
|
},
|
|
1263
1286
|
"hooks": {
|
|
1264
1287
|
type: "object",
|
|
1265
|
-
description: ( localize(
|
|
1288
|
+
description: ( localize(8057, "Lifecycle hooks scoped to this subagent."))
|
|
1266
1289
|
},
|
|
1267
1290
|
"memory": {
|
|
1268
1291
|
type: "scalar",
|
|
1269
1292
|
description: ( localize(
|
|
1270
|
-
|
|
1293
|
+
8058,
|
|
1271
1294
|
"Persistent memory scope: user, project, or local. Enables cross-session learning."
|
|
1272
1295
|
)),
|
|
1273
1296
|
defaults: ["user", "project", "local"],
|
|
1274
1297
|
enums: [{
|
|
1275
1298
|
name: "user",
|
|
1276
|
-
description: ( localize(
|
|
1299
|
+
description: ( localize(8059, "Remember learnings across all projects."))
|
|
1277
1300
|
}, {
|
|
1278
1301
|
name: "project",
|
|
1279
1302
|
description: ( localize(
|
|
1280
|
-
|
|
1303
|
+
8060,
|
|
1281
1304
|
"The subagent's knowledge is project-specific and shareable via version control."
|
|
1282
1305
|
))
|
|
1283
1306
|
}, {
|
|
1284
1307
|
name: "local",
|
|
1285
1308
|
description: ( localize(
|
|
1286
|
-
|
|
1309
|
+
8061,
|
|
1287
1310
|
"The subagent's knowledge is project-specific but should not be checked into version control."
|
|
1288
1311
|
))
|
|
1289
1312
|
}]
|
|
@@ -1293,14 +1316,14 @@ const claudeRulesAttributes = {
|
|
|
1293
1316
|
"description": {
|
|
1294
1317
|
type: "scalar",
|
|
1295
1318
|
description: ( localize(
|
|
1296
|
-
|
|
1319
|
+
8062,
|
|
1297
1320
|
"A description of what this rule covers, used to provide context about when it applies."
|
|
1298
1321
|
))
|
|
1299
1322
|
},
|
|
1300
1323
|
"paths": {
|
|
1301
1324
|
type: "sequence",
|
|
1302
1325
|
description: ( localize(
|
|
1303
|
-
|
|
1326
|
+
8063,
|
|
1304
1327
|
"Array of glob patterns that describe for which files the rule applies. Based on these patterns, the file is automatically included in the prompt when the context contains a file that matches.\nExample: `['src/**/*.ts', 'test/**']`"
|
|
1305
1328
|
))
|
|
1306
1329
|
}
|