@codingame/monaco-vscode-chat-service-override 32.0.2 → 33.0.5
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 +15 -5
- package/package.json +5 -5
- package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostProtocolClient.d.ts +170 -24
- package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostProtocolClient.js +372 -66
- package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostServiceImpl.d.ts +18 -1
- package/vscode/src/vs/platform/agentHost/browser/remoteAgentHostServiceImpl.js +160 -31
- package/vscode/src/vs/platform/agentHost/common/agentHostFileSystemService.d.ts +8 -0
- package/vscode/src/vs/platform/agentHost/common/agentHostFileSystemService.js +19 -0
- package/vscode/src/vs/platform/agentHost/common/agentHostSchema.d.ts +134 -0
- package/vscode/src/vs/platform/agentHost/common/agentHostSchema.js +257 -0
- package/vscode/src/vs/platform/agentHost/common/agentService.d.ts +84 -3
- package/vscode/src/vs/platform/agentHost/common/agentService.js +9 -1
- package/vscode/src/vs/platform/agentHost/common/state/agentSubscription.d.ts +61 -1
- package/vscode/src/vs/platform/agentHost/common/state/agentSubscription.js +61 -1
- package/vscode/src/vs/platform/agentHost/common/state/protocol/errors.js +3 -1
- package/vscode/src/vs/platform/agentHost/common/state/protocol/reducers.js +1 -1
- package/vscode/src/vs/platform/agentHost/common/state/protocol/version/registry.d.ts +1 -1
- package/vscode/src/vs/platform/agentHost/common/state/protocol/version/registry.js +1 -1
- package/vscode/src/vs/platform/agentHost/common/state/sessionActions.d.ts +4 -4
- package/vscode/src/vs/platform/agentHost/common/state/sessionActions.js +1 -1
- package/vscode/src/vs/platform/networkFilter/common/networkFilterService.d.ts +2 -7
- package/vscode/src/vs/platform/networkFilter/common/networkFilterService.js +8 -29
- package/vscode/src/vs/workbench/contrib/chat/browser/accessibility/chatAccessibilityService.js +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 +8 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAccessibilityHelp.js +60 -60
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatAgentRecommendationActions.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCodeblockActions.js +12 -12
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatContextActions.js +8 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatCopyActions.js +7 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatDeveloperActions.js +10 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatFileTreeActions.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatForkActions.d.ts +10 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatForkActions.js +180 -174
- 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 +12 -12
- 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 +18 -18
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/createPluginAction.js +20 -20
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/exportAgentHostDebugLogsAction.d.ts +64 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/exportAgentHostDebugLogsAction.js +330 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/openCopilotCliStateFileAction.d.ts +24 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/openCopilotCliStateFileAction.js +77 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginActions.js +8 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditor.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditorInput.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginRepositoryService.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.js +13 -13
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostPermissionUiContribution.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostUntitledProvisionalSessionService.d.ts +51 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostUntitledProvisionalSessionService.js +267 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.contribution.js +4 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsActions.js +53 -53
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsPicker.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsQuickAccess.js +1 -1
- 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 +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.d.ts +5 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.js +30 -28
- 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 +26 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationIcons.js +14 -14
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidget.d.ts +7 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidget.js +150 -119
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.js +45 -44
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.d.ts +0 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.js +58 -76
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditorInput.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationWelcomePagePromptLaunchers.js +25 -25
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationGroupHeaderRenderer.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedAgentPluginDetail.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedMcpServerDetail.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.d.ts +2 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.js +88 -70
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/media/aiCustomizationManagement.css +82 -56
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/media/aiCustomizationWelcomePromptLaunchers.css +10 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.d.ts +2 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.js +89 -71
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chat.contribution.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chat.contribution.js +2 -2843
- package/vscode/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.js +2934 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatCustomizationDiscoveryRenderer.js +32 -32
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheExplorerView.js +99 -99
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugDetailPanel.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEditorInput.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventDetailRenderer.js +20 -20
- 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 +22 -22
- 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 +24 -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.js +33 -33
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugToolCallContentRenderer.js +11 -11
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingCodeEditorIntegration.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorActions.js +14 -14
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingEditorOverlay.js +7 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationModelManager.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingExplanationWidget.js +12 -12
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedDocumentEntry.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedFileEntry.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingServiceImpl.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingSession.js +1 -1
- 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 +53 -20
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagementEditorInput.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.d.ts +4 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.js +131 -61
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/media/chatModelsWidget.css +22 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatOutputItemRenderer.d.ts +23 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/chatOutputItemRenderer.js +91 -15
- package/vscode/src/vs/workbench/contrib/chat/browser/chatParticipant.contribution.js +30 -30
- package/vscode/src/vs/workbench/contrib/chat/browser/chatRepoInfo.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.js +23 -21
- 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 +29 -28
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.js +14 -14
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSlashCommands.js +19 -19
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.d.ts +15 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.js +203 -163
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.d.ts +1 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.js +31 -54
- 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 +88 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatTipCatalog.js +19 -19
- package/vscode/src/vs/workbench/contrib/chat/browser/chatTipService.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatWindowNotifier.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/claudePluginRecommendations.js +17 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/contextContrib/chatContext.contribution.d.ts +8 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/contextContrib/chatContext.contribution.js +91 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/copilotCliEventsUri.d.ts +52 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/copilotCliEventsUri.js +82 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/defaultModelContribution.d.ts +21 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/defaultModelContribution.js +55 -18
- 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/hasByokModelsContribution.d.ts +51 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/hasByokModelsContribution.js +106 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/languageModelsConfigurationService.js +4 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorActions.js +4 -4
- package/vscode/src/vs/workbench/contrib/chat/browser/planReviewFeedback/planReviewFeedbackEditorContribution.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginAutoUpdate.d.ts +38 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginAutoUpdate.js +59 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginGitCommandService.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginInstallService.js +25 -25
- 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 +27 -27
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookUtils.js +3 -3
- 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 -6
- 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 +1 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.js +38 -28
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/renameTool.js +5 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolResultCompressorService.d.ts +5 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolResultCompressorService.js +106 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/usagesTool.js +6 -8
- package/vscode/src/vs/workbench/contrib/chat/browser/utilityModelContribution.d.ts +28 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/utilityModelContribution.js +75 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/viewsWelcome/chatViewsWelcomeHandler.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/{toolInvocationParts/chatToolOutputStateCache.d.ts → chatOutputPartStateCache.d.ts} +5 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/chatContentParts/{toolInvocationParts/chatToolOutputStateCache.js → chatOutputPartStateCache.js} +19 -11
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/chatQueuePickerActionItem.js +9 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletions.js +58 -26
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletions.js +9 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputEditorContrib.js +1 -1
- 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 +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewPane.js +18 -9
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewTitleControl.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.js +13 -5
- package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceTelemetry.js +6 -2
- package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionStore.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.js +19 -18
- 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 +1 -2
- 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.js +6 -7
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHovers.js +14 -15
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.js +155 -156
- package/vscode/src/vs/workbench/contrib/chat/common/tools/copilotToolIds.d.ts +6 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/copilotToolIds.js +12 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/toolResultCompressor.d.ts +88 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/toolResultCompressor.js +25 -0
- package/vscode/src/vs/workbench/contrib/chat/common/voiceChatService.js +1 -1
- package/vscode/src/vs/workbench/contrib/imageCarousel/browser/imageCarousel.contribution.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/imageCarousel/browser/imageCarousel.contribution.js +237 -0
- package/vscode/src/vs/workbench/contrib/imageCarousel/browser/imageCarouselEditor.d.ts +66 -0
- package/vscode/src/vs/workbench/contrib/imageCarousel/browser/imageCarouselEditor.js +600 -0
- package/vscode/src/vs/workbench/contrib/imageCarousel/browser/imageCarouselEditorInput.d.ts +18 -0
- package/vscode/src/vs/workbench/contrib/imageCarousel/browser/imageCarouselEditorInput.js +47 -0
- package/vscode/src/vs/workbench/contrib/imageCarousel/browser/imageCarouselTypes.d.ts +22 -0
- package/vscode/src/vs/workbench/contrib/imageCarousel/browser/imageCarouselTypes.js +7 -0
- package/vscode/src/vs/workbench/contrib/imageCarousel/browser/media/imageCarousel.css +298 -0
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatActions.js +15 -15
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatDefaultModel.js +2 -2
- package/vscode/src/vs/workbench/contrib/inlineChat/browser/inlineChatSessionServiceImpl.js +4 -4
- 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 +10 -10
- 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.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/terminal.chatAgentTools.contribution.js +3 -3
- 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 +12 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalOutputTool.js +78 -7
- 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 +3 -3
- 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.js +15 -11
- 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 -9
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/runTaskTool.js +14 -16
- 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/terminalCommandParser.d.ts +60 -0
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalCommandParser.js +286 -0
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCache.d.ts +24 -0
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCache.js +285 -0
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCompressor.d.ts +19 -12
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCompressor.js +415 -47
- package/vscode/src/vs/workbench/services/agentHost/common/agentHostFileSystemService.d.ts +2 -7
- package/vscode/src/vs/workbench/services/agentHost/common/agentHostFileSystemService.js +1 -1
- package/vscode/src/vs/base/common/defaultAccount.d.ts +0 -69
- package/vscode/src/vs/base/common/defaultAccount.js +0 -12
- package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/aiEditTelemetry/aiEditTelemetryServiceImpl.d.ts +0 -15
- package/vscode/src/vs/workbench/contrib/editTelemetry/browser/telemetry/aiEditTelemetry/aiEditTelemetryServiceImpl.js +0 -85
|
@@ -7,7 +7,6 @@ import { localize } from '@codingame/monaco-vscode-api/vscode/vs/nls';
|
|
|
7
7
|
import { MarkerSeverity, MarkerTag } from '@codingame/monaco-vscode-api/vscode/vs/platform/markers/common/markers';
|
|
8
8
|
import { ChatMode } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/chatModes';
|
|
9
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
10
|
import { ChatModeKind } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/constants';
|
|
12
11
|
import { ILanguageModelChatMetadata } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/languageModels';
|
|
13
12
|
import { ILanguageModelsService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/languageModels.service';
|
|
@@ -64,13 +63,13 @@ let PromptValidator = class PromptValidator {
|
|
|
64
63
|
const location = this.promptsService.getAgentFileURIFromModeFile(promptAST.uri);
|
|
65
64
|
if (location && (await this.fileService.canCreateFile(location))) {
|
|
66
65
|
report(toMarker(( localize(
|
|
67
|
-
|
|
66
|
+
8013,
|
|
68
67
|
"Chat modes have been renamed to agents. Please move this file to {0}",
|
|
69
68
|
(location.toString())
|
|
70
69
|
)), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
71
70
|
} else {
|
|
72
71
|
report(toMarker(( localize(
|
|
73
|
-
|
|
72
|
+
8014,
|
|
74
73
|
"Chat modes have been renamed to agents. Please move the file to {0}",
|
|
75
74
|
AGENTS_SOURCE_FOLDER
|
|
76
75
|
)), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
@@ -83,13 +82,13 @@ let PromptValidator = class PromptValidator {
|
|
|
83
82
|
}
|
|
84
83
|
const nameAttribute = promptAST.header.getAttribute(PromptHeaderAttributes.name);
|
|
85
84
|
if (!nameAttribute) {
|
|
86
|
-
report(toMarker(( localize(
|
|
85
|
+
report(toMarker(( localize(8015, "Skill should provide a name.")), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
87
86
|
} else if (nameAttribute.value.type === "scalar") {
|
|
88
87
|
const skillName = nameAttribute.value.value.trim();
|
|
89
88
|
if (skillName.length > 0) {
|
|
90
89
|
if (!VALID_SKILL_NAME_REGEX.test(skillName)) {
|
|
91
90
|
report(toMarker(( localize(
|
|
92
|
-
|
|
91
|
+
8016,
|
|
93
92
|
"Skill name may only contain lowercase letters, numbers, and hyphens."
|
|
94
93
|
)), nameAttribute.value.range, MarkerSeverity.Error));
|
|
95
94
|
}
|
|
@@ -99,7 +98,7 @@ let PromptValidator = class PromptValidator {
|
|
|
99
98
|
const folderName = pathParts[skillIndex - 1];
|
|
100
99
|
if (folderName && skillName !== folderName) {
|
|
101
100
|
report(toMarker(( localize(
|
|
102
|
-
|
|
101
|
+
8017,
|
|
103
102
|
"The skill name '{0}' should match the folder name '{1}'.",
|
|
104
103
|
skillName,
|
|
105
104
|
folderName
|
|
@@ -110,12 +109,12 @@ let PromptValidator = class PromptValidator {
|
|
|
110
109
|
}
|
|
111
110
|
const descriptionAttribute = promptAST.header.getAttribute(PromptHeaderAttributes.description);
|
|
112
111
|
if (!descriptionAttribute) {
|
|
113
|
-
report(toMarker(( localize(
|
|
112
|
+
report(toMarker(( localize(8018, "Skill should provide a description.")), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
114
113
|
if (promptAST.header.userInvocable === false) {
|
|
115
114
|
const userInvocableAttr = promptAST.header.getAttribute(PromptHeaderAttributes.userInvocable);
|
|
116
115
|
if (userInvocableAttr) {
|
|
117
116
|
report(toMarker(( localize(
|
|
118
|
-
|
|
117
|
+
8019,
|
|
119
118
|
"A description is required when user-invocable is false, because the model needs a description to decide when to load the skill."
|
|
120
119
|
)), userInvocableAttr.value.range, MarkerSeverity.Error));
|
|
121
120
|
}
|
|
@@ -124,7 +123,7 @@ let PromptValidator = class PromptValidator {
|
|
|
124
123
|
const disableModelInvocationAttr = promptAST.header.getAttribute(PromptHeaderAttributes.disableModelInvocation);
|
|
125
124
|
if (disableModelInvocationAttr) {
|
|
126
125
|
report(toMarker(( localize(
|
|
127
|
-
|
|
126
|
+
8020,
|
|
128
127
|
"A description is required when model invocation is enabled, because the model needs a description to decide when to load the skill."
|
|
129
128
|
)), disableModelInvocationAttr.value.range, MarkerSeverity.Error));
|
|
130
129
|
}
|
|
@@ -135,7 +134,7 @@ let PromptValidator = class PromptValidator {
|
|
|
135
134
|
const skillToolEnabled = this.configurationService.getValue("github.copilot.chat.skillTool.enabled");
|
|
136
135
|
if (!skillToolEnabled) {
|
|
137
136
|
report(toMarker(( localize(
|
|
138
|
-
|
|
137
|
+
8021,
|
|
139
138
|
"The 'context: fork' attribute requires the skill tool to be enabled (github.copilot.chat.skillTool.enabled)."
|
|
140
139
|
)), contextAttribute.value.range, MarkerSeverity.Warning));
|
|
141
140
|
}
|
|
@@ -150,7 +149,7 @@ let PromptValidator = class PromptValidator {
|
|
|
150
149
|
for (const ref of body.fileReferences) {
|
|
151
150
|
const resolved = body.resolveFilePath(ref.content);
|
|
152
151
|
if (!resolved) {
|
|
153
|
-
report(toMarker(( localize(
|
|
152
|
+
report(toMarker(( localize(8022, "Invalid file reference '{0}'.", ref.content)), ref.range, MarkerSeverity.Warning));
|
|
154
153
|
continue;
|
|
155
154
|
}
|
|
156
155
|
if (promptAST.uri.scheme === resolved.scheme) {
|
|
@@ -159,7 +158,7 @@ let PromptValidator = class PromptValidator {
|
|
|
159
158
|
const exists = await this.fileService.exists(resolved);
|
|
160
159
|
if (!exists) {
|
|
161
160
|
const loc = this.labelService.getUriLabel(resolved);
|
|
162
|
-
report(toMarker(( localize(
|
|
161
|
+
report(toMarker(( localize(8023, "File '{0}' not found at '{1}'.", ref.content, loc)), ref.range, MarkerSeverity.Warning));
|
|
163
162
|
}
|
|
164
163
|
} catch (e) {
|
|
165
164
|
this.logger.warn(
|
|
@@ -182,7 +181,7 @@ let PromptValidator = class PromptValidator {
|
|
|
182
181
|
if (currentNames.size === 1) {
|
|
183
182
|
const newName = Array.from(currentNames)[0];
|
|
184
183
|
report(toMarker(( localize(
|
|
185
|
-
|
|
184
|
+
8024,
|
|
186
185
|
"Tool or toolset '{0}' has been renamed, use '{1}' instead.",
|
|
187
186
|
variable.name,
|
|
188
187
|
newName
|
|
@@ -190,7 +189,7 @@ let PromptValidator = class PromptValidator {
|
|
|
190
189
|
} else {
|
|
191
190
|
const newNames = Array.from(currentNames).sort((a, b) => a.localeCompare(b)).join(", ");
|
|
192
191
|
report(toMarker(( localize(
|
|
193
|
-
|
|
192
|
+
8025,
|
|
194
193
|
"Tool or toolset '{0}' has been renamed, use the following tools instead: {1}",
|
|
195
194
|
variable.name,
|
|
196
195
|
newNames
|
|
@@ -198,13 +197,13 @@ let PromptValidator = class PromptValidator {
|
|
|
198
197
|
}
|
|
199
198
|
}
|
|
200
199
|
} else {
|
|
201
|
-
report(toMarker(( localize(
|
|
200
|
+
report(toMarker(( localize(8026, "Unknown tool or toolset '{0}'.", variable.name)), variable.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
202
201
|
}
|
|
203
202
|
} else if (headerToolsMap) {
|
|
204
203
|
const tool = this.languageModelToolsService.getToolByFullReferenceName(variable.name);
|
|
205
204
|
if (tool && headerToolsMap.get(tool) === false) {
|
|
206
205
|
report(toMarker(( localize(
|
|
207
|
-
|
|
206
|
+
8027,
|
|
208
207
|
"Tool or toolset '{0}' also needs to be enabled in the header.",
|
|
209
208
|
variable.name
|
|
210
209
|
)), variable.range, MarkerSeverity.Warning));
|
|
@@ -227,7 +226,7 @@ let PromptValidator = class PromptValidator {
|
|
|
227
226
|
switch (promptType) {
|
|
228
227
|
case PromptsType.prompt:
|
|
229
228
|
{
|
|
230
|
-
const agent = this.validateAgent(attributes, report);
|
|
229
|
+
const agent = await this.validateAgent(attributes, report);
|
|
231
230
|
this.validateTools(attributes, agent?.kind ?? ChatModeKind.Agent, target, report);
|
|
232
231
|
this.validateModel(attributes, agent?.kind ?? ChatModeKind.Agent, report);
|
|
233
232
|
break;
|
|
@@ -278,7 +277,7 @@ let PromptValidator = class PromptValidator {
|
|
|
278
277
|
switch (promptType) {
|
|
279
278
|
case PromptsType.prompt:
|
|
280
279
|
report(toMarker(( localize(
|
|
281
|
-
|
|
280
|
+
8028,
|
|
282
281
|
"Attribute '{0}' is not supported in prompt files. Supported: {1}.",
|
|
283
282
|
attribute.key,
|
|
284
283
|
supportedNames.value
|
|
@@ -287,7 +286,7 @@ let PromptValidator = class PromptValidator {
|
|
|
287
286
|
case PromptsType.agent:
|
|
288
287
|
if (target === Target.GitHubCopilot) {
|
|
289
288
|
report(toMarker(( localize(
|
|
290
|
-
|
|
289
|
+
8029,
|
|
291
290
|
"Attribute '{0}' is not supported in custom GitHub Copilot agent files. Supported: {1}.",
|
|
292
291
|
attribute.key,
|
|
293
292
|
supportedNames.value
|
|
@@ -296,13 +295,13 @@ let PromptValidator = class PromptValidator {
|
|
|
296
295
|
; else {
|
|
297
296
|
if (( validGithubCopilotAttributeNames.value.has(attribute.key))) {
|
|
298
297
|
report(toMarker(( localize(
|
|
299
|
-
|
|
298
|
+
8030,
|
|
300
299
|
"Attribute '{0}' is ignored when running locally in VS Code.",
|
|
301
300
|
attribute.key
|
|
302
301
|
)), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
303
302
|
} else {
|
|
304
303
|
report(toMarker(( localize(
|
|
305
|
-
|
|
304
|
+
8031,
|
|
306
305
|
"Attribute '{0}' is not supported in VS Code agent files. Supported: {1}.",
|
|
307
306
|
attribute.key,
|
|
308
307
|
supportedNames.value
|
|
@@ -313,14 +312,14 @@ let PromptValidator = class PromptValidator {
|
|
|
313
312
|
case PromptsType.instructions:
|
|
314
313
|
if (target === Target.Claude) {
|
|
315
314
|
report(toMarker(( localize(
|
|
316
|
-
|
|
315
|
+
8032,
|
|
317
316
|
"Attribute '{0}' is not supported in rules files by VS Code agents. Supported: {1}.",
|
|
318
317
|
attribute.key,
|
|
319
318
|
supportedNames.value
|
|
320
319
|
)), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
321
320
|
} else {
|
|
322
321
|
report(toMarker(( localize(
|
|
323
|
-
|
|
322
|
+
8033,
|
|
324
323
|
"Attribute '{0}' is not supported in instructions files. Supported: {1}.",
|
|
325
324
|
attribute.key,
|
|
326
325
|
supportedNames.value
|
|
@@ -329,7 +328,7 @@ let PromptValidator = class PromptValidator {
|
|
|
329
328
|
break;
|
|
330
329
|
case PromptsType.skill:
|
|
331
330
|
report(toMarker(( localize(
|
|
332
|
-
|
|
331
|
+
8034,
|
|
333
332
|
"Attribute '{0}' is not supported by VS Code agents. Supported: {1}.",
|
|
334
333
|
attribute.key,
|
|
335
334
|
supportedNames.value
|
|
@@ -345,11 +344,11 @@ let PromptValidator = class PromptValidator {
|
|
|
345
344
|
return;
|
|
346
345
|
}
|
|
347
346
|
if (nameAttribute.value.type !== "scalar") {
|
|
348
|
-
report(toMarker(( localize(
|
|
347
|
+
report(toMarker(( localize(8035, "The 'name' attribute must be a string.")), nameAttribute.range, MarkerSeverity.Error));
|
|
349
348
|
return;
|
|
350
349
|
}
|
|
351
350
|
if (nameAttribute.value.value.trim().length === 0) {
|
|
352
|
-
report(toMarker(( localize(
|
|
351
|
+
report(toMarker(( localize(8036, "The 'name' attribute must not be empty.")), nameAttribute.value.range, MarkerSeverity.Error));
|
|
353
352
|
return;
|
|
354
353
|
}
|
|
355
354
|
}
|
|
@@ -359,11 +358,11 @@ let PromptValidator = class PromptValidator {
|
|
|
359
358
|
return;
|
|
360
359
|
}
|
|
361
360
|
if (descriptionAttribute.value.type !== "scalar") {
|
|
362
|
-
report(toMarker(( localize(
|
|
361
|
+
report(toMarker(( localize(8037, "The 'description' attribute must be a string.")), descriptionAttribute.range, MarkerSeverity.Error));
|
|
363
362
|
return;
|
|
364
363
|
}
|
|
365
364
|
if (descriptionAttribute.value.value.trim().length === 0) {
|
|
366
|
-
report(toMarker(( localize(
|
|
365
|
+
report(toMarker(( localize(8038, "The 'description' attribute should not be empty.")), descriptionAttribute.value.range, MarkerSeverity.Error));
|
|
367
366
|
return;
|
|
368
367
|
}
|
|
369
368
|
}
|
|
@@ -373,11 +372,11 @@ let PromptValidator = class PromptValidator {
|
|
|
373
372
|
return;
|
|
374
373
|
}
|
|
375
374
|
if (argumentHintAttribute.value.type !== "scalar") {
|
|
376
|
-
report(toMarker(( localize(
|
|
375
|
+
report(toMarker(( localize(8039, "The 'argument-hint' attribute must be a string.")), argumentHintAttribute.range, MarkerSeverity.Error));
|
|
377
376
|
return;
|
|
378
377
|
}
|
|
379
378
|
if (argumentHintAttribute.value.value.trim().length === 0) {
|
|
380
|
-
report(toMarker(( localize(
|
|
379
|
+
report(toMarker(( localize(8040, "The 'argument-hint' attribute should not be empty.")), argumentHintAttribute.value.range, MarkerSeverity.Warning));
|
|
381
380
|
return;
|
|
382
381
|
}
|
|
383
382
|
}
|
|
@@ -387,30 +386,30 @@ let PromptValidator = class PromptValidator {
|
|
|
387
386
|
return;
|
|
388
387
|
}
|
|
389
388
|
if (attribute.value.type !== "scalar" && attribute.value.type !== "sequence") {
|
|
390
|
-
report(toMarker(( localize(
|
|
389
|
+
report(toMarker(( localize(8041, "The 'model' attribute must be a string or an array of strings.")), attribute.value.range, MarkerSeverity.Error));
|
|
391
390
|
return;
|
|
392
391
|
}
|
|
393
392
|
const modelNames = [];
|
|
394
393
|
if (attribute.value.type === "scalar") {
|
|
395
394
|
const modelName = attribute.value.value.trim();
|
|
396
395
|
if (modelName.length === 0) {
|
|
397
|
-
report(toMarker(( localize(
|
|
396
|
+
report(toMarker(( localize(8042, "The 'model' attribute must be a non-empty string.")), attribute.value.range, MarkerSeverity.Error));
|
|
398
397
|
return;
|
|
399
398
|
}
|
|
400
399
|
modelNames.push([modelName, attribute.value.range]);
|
|
401
400
|
} else if (attribute.value.type === "sequence") {
|
|
402
401
|
if (attribute.value.items.length === 0) {
|
|
403
|
-
report(toMarker(( localize(
|
|
402
|
+
report(toMarker(( localize(8043, "The 'model' array must not be empty.")), attribute.value.range, MarkerSeverity.Error));
|
|
404
403
|
return;
|
|
405
404
|
}
|
|
406
405
|
for (const item of attribute.value.items) {
|
|
407
406
|
if (item.type !== "scalar") {
|
|
408
|
-
report(toMarker(( localize(
|
|
407
|
+
report(toMarker(( localize(8044, "The 'model' array must contain only strings.")), item.range, MarkerSeverity.Error));
|
|
409
408
|
return;
|
|
410
409
|
}
|
|
411
410
|
const modelName = item.value.trim();
|
|
412
411
|
if (modelName.length === 0) {
|
|
413
|
-
report(toMarker(( localize(
|
|
412
|
+
report(toMarker(( localize(8045, "Model names in the array must be non-empty strings.")), item.range, MarkerSeverity.Error));
|
|
414
413
|
return;
|
|
415
414
|
}
|
|
416
415
|
modelNames.push([modelName, item.range]);
|
|
@@ -423,9 +422,9 @@ let PromptValidator = class PromptValidator {
|
|
|
423
422
|
for (const [modelName, range] of modelNames) {
|
|
424
423
|
const modelMetadata = this.findModelByName(modelName);
|
|
425
424
|
if (!modelMetadata) {
|
|
426
|
-
report(toMarker(( localize(
|
|
425
|
+
report(toMarker(( localize(8046, "Unknown model '{0}' will be ignored.", modelName)), range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
427
426
|
} else if (agentKind === ChatModeKind.Agent && !ILanguageModelChatMetadata.suitableForAgentMode(modelMetadata)) {
|
|
428
|
-
report(toMarker(( localize(
|
|
427
|
+
report(toMarker(( localize(8047, "Model '{0}' is not suited for agent mode.", modelName)), range, MarkerSeverity.Warning));
|
|
429
428
|
}
|
|
430
429
|
}
|
|
431
430
|
}
|
|
@@ -439,13 +438,13 @@ let PromptValidator = class PromptValidator {
|
|
|
439
438
|
continue;
|
|
440
439
|
}
|
|
441
440
|
if (attribute.value.type !== "scalar") {
|
|
442
|
-
report(toMarker(( localize(
|
|
441
|
+
report(toMarker(( localize(8048, "The '{0}' attribute must be a string.", claudeAttributeName)), attribute.value.range, MarkerSeverity.Error));
|
|
443
442
|
continue;
|
|
444
443
|
} else {
|
|
445
444
|
const modelName = attribute.value.value.trim();
|
|
446
445
|
if (enumValues.every(model => model.name !== modelName)) {
|
|
447
446
|
const validValues = ( enumValues.map(model => model.name)).join(", ");
|
|
448
|
-
report(toMarker(( localize(
|
|
447
|
+
report(toMarker(( localize(8049, "Unknown value '{0}', valid: {1}.", modelName, validValues)), attribute.value.range, MarkerSeverity.Warning));
|
|
449
448
|
}
|
|
450
449
|
}
|
|
451
450
|
}
|
|
@@ -458,18 +457,18 @@ let PromptValidator = class PromptValidator {
|
|
|
458
457
|
}
|
|
459
458
|
return undefined;
|
|
460
459
|
}
|
|
461
|
-
validateAgent(attributes, report) {
|
|
460
|
+
async validateAgent(attributes, report) {
|
|
462
461
|
const agentAttribute = attributes.find(attr => attr.key === PromptHeaderAttributes.agent);
|
|
463
462
|
const modeAttribute = attributes.find(attr => attr.key === PromptHeaderAttributes.mode);
|
|
464
463
|
if (modeAttribute) {
|
|
465
464
|
if (agentAttribute) {
|
|
466
465
|
report(toMarker(( localize(
|
|
467
|
-
|
|
466
|
+
8050,
|
|
468
467
|
"The 'mode' attribute has been deprecated. The 'agent' attribute is used instead."
|
|
469
468
|
)), modeAttribute.range, MarkerSeverity.Warning, [MarkerTag.Deprecated]));
|
|
470
469
|
} else {
|
|
471
470
|
report(toMarker(( localize(
|
|
472
|
-
|
|
471
|
+
8051,
|
|
473
472
|
"The 'mode' attribute has been deprecated. Please rename it to 'agent'."
|
|
474
473
|
)), modeAttribute.range, MarkerSeverity.Warning, [MarkerTag.Deprecated]));
|
|
475
474
|
}
|
|
@@ -479,18 +478,18 @@ let PromptValidator = class PromptValidator {
|
|
|
479
478
|
return undefined;
|
|
480
479
|
}
|
|
481
480
|
if (attribute.value.type !== "scalar") {
|
|
482
|
-
report(toMarker(( localize(
|
|
481
|
+
report(toMarker(( localize(8052, "The '{0}' attribute must be a string.", attribute.key)), attribute.value.range, MarkerSeverity.Error));
|
|
483
482
|
return undefined;
|
|
484
483
|
}
|
|
485
484
|
const agentValue = attribute.value.value;
|
|
486
485
|
if (agentValue.trim().length === 0) {
|
|
487
|
-
report(toMarker(( localize(
|
|
486
|
+
report(toMarker(( localize(8053, "The '{0}' attribute must be a non-empty string.", attribute.key)), attribute.value.range, MarkerSeverity.Error));
|
|
488
487
|
return undefined;
|
|
489
488
|
}
|
|
490
|
-
return this.validateAgentValue(attribute.value, report);
|
|
489
|
+
return await this.validateAgentValue(attribute.value, report);
|
|
491
490
|
}
|
|
492
|
-
validateAgentValue(value, report) {
|
|
493
|
-
const agents = this.chatModeService.
|
|
491
|
+
async validateAgentValue(value, report) {
|
|
492
|
+
const agents = await this.chatModeService.getLocalModes();
|
|
494
493
|
const availableAgents = [];
|
|
495
494
|
for (const agent of Iterable.concat(agents.builtin, agents.custom)) {
|
|
496
495
|
if (agent.name.get() === value.value) {
|
|
@@ -499,7 +498,7 @@ let PromptValidator = class PromptValidator {
|
|
|
499
498
|
availableAgents.push(agent.name.get());
|
|
500
499
|
}
|
|
501
500
|
const errorMessage = ( localize(
|
|
502
|
-
|
|
501
|
+
8054,
|
|
503
502
|
"Unknown agent '{0}'. Available agents: {1}.",
|
|
504
503
|
value.value,
|
|
505
504
|
availableAgents.join(", ")
|
|
@@ -514,7 +513,7 @@ let PromptValidator = class PromptValidator {
|
|
|
514
513
|
}
|
|
515
514
|
if (agentKind !== ChatModeKind.Agent) {
|
|
516
515
|
report(toMarker(( localize(
|
|
517
|
-
|
|
516
|
+
8055,
|
|
518
517
|
"The 'tools' attribute is only supported when using agents. Attribute will be ignored."
|
|
519
518
|
)), attribute.range, MarkerSeverity.Warning));
|
|
520
519
|
}
|
|
@@ -524,7 +523,7 @@ let PromptValidator = class PromptValidator {
|
|
|
524
523
|
}
|
|
525
524
|
if (value.type !== "sequence") {
|
|
526
525
|
report(toMarker(( localize(
|
|
527
|
-
|
|
526
|
+
8056,
|
|
528
527
|
"The 'tools' attribute must be an array or a comma separated string."
|
|
529
528
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
530
529
|
return;
|
|
@@ -540,7 +539,7 @@ let PromptValidator = class PromptValidator {
|
|
|
540
539
|
const deprecatedNames = this.languageModelToolsService.getDeprecatedFullReferenceNames();
|
|
541
540
|
for (const item of valueItem.items) {
|
|
542
541
|
if (item.type !== "scalar") {
|
|
543
|
-
report(toMarker(( localize(
|
|
542
|
+
report(toMarker(( localize(8057, "Each tool name in the 'tools' attribute must be a string.")), item.range, MarkerSeverity.Error));
|
|
544
543
|
} else if (item.value) {
|
|
545
544
|
if (!( available.has(item.value))) {
|
|
546
545
|
const currentNames = deprecatedNames.get(item.value);
|
|
@@ -548,7 +547,7 @@ let PromptValidator = class PromptValidator {
|
|
|
548
547
|
if (currentNames?.size === 1) {
|
|
549
548
|
const newName = Array.from(currentNames)[0];
|
|
550
549
|
report(toMarker(( localize(
|
|
551
|
-
|
|
550
|
+
8058,
|
|
552
551
|
"Tool or toolset '{0}' has been renamed, use '{1}' instead.",
|
|
553
552
|
item.value,
|
|
554
553
|
newName
|
|
@@ -556,14 +555,14 @@ let PromptValidator = class PromptValidator {
|
|
|
556
555
|
} else {
|
|
557
556
|
const newNames = Array.from(currentNames).sort((a, b) => a.localeCompare(b)).join(", ");
|
|
558
557
|
report(toMarker(( localize(
|
|
559
|
-
|
|
558
|
+
8059,
|
|
560
559
|
"Tool or toolset '{0}' has been renamed, use the following tools instead: {1}",
|
|
561
560
|
item.value,
|
|
562
561
|
newNames
|
|
563
562
|
)), item.range, MarkerSeverity.Info, [MarkerTag.Deprecated]));
|
|
564
563
|
}
|
|
565
564
|
} else {
|
|
566
|
-
report(toMarker(( localize(
|
|
565
|
+
report(toMarker(( localize(8060, "Unknown tool '{0}' will be ignored.", item.value)), item.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
567
566
|
}
|
|
568
567
|
}
|
|
569
568
|
}
|
|
@@ -576,25 +575,25 @@ let PromptValidator = class PromptValidator {
|
|
|
576
575
|
return;
|
|
577
576
|
}
|
|
578
577
|
if (attribute.value.type !== "scalar") {
|
|
579
|
-
report(toMarker(( localize(
|
|
578
|
+
report(toMarker(( localize(8061, "The 'applyTo' attribute must be a string.")), attribute.value.range, MarkerSeverity.Error));
|
|
580
579
|
return;
|
|
581
580
|
}
|
|
582
581
|
const pattern = attribute.value.value;
|
|
583
582
|
try {
|
|
584
583
|
const patterns = splitGlobAware(pattern, ",");
|
|
585
584
|
if (patterns.length === 0) {
|
|
586
|
-
report(toMarker(( localize(
|
|
585
|
+
report(toMarker(( localize(8062, "The 'applyTo' attribute must be a valid glob pattern.")), attribute.value.range, MarkerSeverity.Error));
|
|
587
586
|
return;
|
|
588
587
|
}
|
|
589
588
|
for (const pattern of patterns) {
|
|
590
589
|
const globPattern = parse(pattern);
|
|
591
590
|
if (isEmptyPattern(globPattern)) {
|
|
592
|
-
report(toMarker(( localize(
|
|
591
|
+
report(toMarker(( localize(8062, "The 'applyTo' attribute must be a valid glob pattern.")), attribute.value.range, MarkerSeverity.Error));
|
|
593
592
|
return;
|
|
594
593
|
}
|
|
595
594
|
}
|
|
596
595
|
} catch (_error) {
|
|
597
|
-
report(toMarker(( localize(
|
|
596
|
+
report(toMarker(( localize(8062, "The 'applyTo' attribute must be a valid glob pattern.")), attribute.value.range, MarkerSeverity.Error));
|
|
598
597
|
}
|
|
599
598
|
}
|
|
600
599
|
validatePaths(attributes, report) {
|
|
@@ -603,26 +602,26 @@ let PromptValidator = class PromptValidator {
|
|
|
603
602
|
return;
|
|
604
603
|
}
|
|
605
604
|
if (attribute.value.type !== "sequence") {
|
|
606
|
-
report(toMarker(( localize(
|
|
605
|
+
report(toMarker(( localize(8063, "The 'paths' attribute must be an array of glob patterns.")), attribute.value.range, MarkerSeverity.Error));
|
|
607
606
|
return;
|
|
608
607
|
}
|
|
609
608
|
for (const item of attribute.value.items) {
|
|
610
609
|
if (item.type !== "scalar") {
|
|
611
|
-
report(toMarker(( localize(
|
|
610
|
+
report(toMarker(( localize(8064, "Each entry in the 'paths' attribute must be a string.")), item.range, MarkerSeverity.Error));
|
|
612
611
|
continue;
|
|
613
612
|
}
|
|
614
613
|
const pattern = item.value.trim();
|
|
615
614
|
if (pattern.length === 0) {
|
|
616
|
-
report(toMarker(( localize(
|
|
615
|
+
report(toMarker(( localize(8065, "Path entries must be non-empty glob patterns.")), item.range, MarkerSeverity.Error));
|
|
617
616
|
continue;
|
|
618
617
|
}
|
|
619
618
|
try {
|
|
620
619
|
const globPattern = parse(pattern);
|
|
621
620
|
if (isEmptyPattern(globPattern)) {
|
|
622
|
-
report(toMarker(( localize(
|
|
621
|
+
report(toMarker(( localize(8066, "'{0}' is not a valid glob pattern.", pattern)), item.range, MarkerSeverity.Error));
|
|
623
622
|
}
|
|
624
623
|
} catch (_error) {
|
|
625
|
-
report(toMarker(( localize(
|
|
624
|
+
report(toMarker(( localize(8066, "'{0}' is not a valid glob pattern.", pattern)), item.range, MarkerSeverity.Error));
|
|
626
625
|
}
|
|
627
626
|
}
|
|
628
627
|
}
|
|
@@ -632,7 +631,7 @@ let PromptValidator = class PromptValidator {
|
|
|
632
631
|
return;
|
|
633
632
|
}
|
|
634
633
|
if (attribute.value.type !== "sequence" && attribute.value.type !== "scalar") {
|
|
635
|
-
report(toMarker(( localize(
|
|
634
|
+
report(toMarker(( localize(8067, "The 'excludeAgent' attribute must be an string or array.")), attribute.value.range, MarkerSeverity.Error));
|
|
636
635
|
return;
|
|
637
636
|
}
|
|
638
637
|
}
|
|
@@ -643,7 +642,7 @@ let PromptValidator = class PromptValidator {
|
|
|
643
642
|
}
|
|
644
643
|
if (attribute.value.type !== "map") {
|
|
645
644
|
report(toMarker(( localize(
|
|
646
|
-
|
|
645
|
+
8068,
|
|
647
646
|
"The 'hooks' attribute must be a map of hook event types to command arrays."
|
|
648
647
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
649
648
|
return;
|
|
@@ -652,7 +651,7 @@ let PromptValidator = class PromptValidator {
|
|
|
652
651
|
for (const prop of attribute.value.properties) {
|
|
653
652
|
if (!( validHookNames.has(prop.key.value))) {
|
|
654
653
|
report(toMarker(( localize(
|
|
655
|
-
|
|
654
|
+
8069,
|
|
656
655
|
"Unknown hook event type '{0}'. Supported: {1}.",
|
|
657
656
|
prop.key.value,
|
|
658
657
|
Array.from(validHookNames).join(", ")
|
|
@@ -660,7 +659,7 @@ let PromptValidator = class PromptValidator {
|
|
|
660
659
|
}
|
|
661
660
|
if (prop.value.type !== "sequence") {
|
|
662
661
|
report(toMarker(( localize(
|
|
663
|
-
|
|
662
|
+
8070,
|
|
664
663
|
"Hook event '{0}' must have an array of command objects as its value.",
|
|
665
664
|
prop.key.value
|
|
666
665
|
)), prop.value.range, MarkerSeverity.Error));
|
|
@@ -673,19 +672,19 @@ let PromptValidator = class PromptValidator {
|
|
|
673
672
|
}
|
|
674
673
|
validateHookCommand(item, target, report) {
|
|
675
674
|
if (item.type !== "map") {
|
|
676
|
-
report(toMarker(( localize(
|
|
675
|
+
report(toMarker(( localize(8071, "Each hook command must be an object.")), item.range, MarkerSeverity.Error));
|
|
677
676
|
return;
|
|
678
677
|
}
|
|
679
678
|
const hooksProperty = item.properties.find(p => p.key.value === "hooks");
|
|
680
679
|
if (hooksProperty) {
|
|
681
680
|
for (const prop of item.properties) {
|
|
682
681
|
if (prop.key.value !== "hooks" && prop.key.value !== "matcher") {
|
|
683
|
-
report(toMarker(( localize(
|
|
682
|
+
report(toMarker(( localize(8072, "Unknown property '{0}' in hook matcher.", prop.key.value)), prop.key.range, MarkerSeverity.Warning));
|
|
684
683
|
}
|
|
685
684
|
}
|
|
686
685
|
if (hooksProperty.value.type !== "sequence") {
|
|
687
686
|
report(toMarker(( localize(
|
|
688
|
-
|
|
687
|
+
8073,
|
|
689
688
|
"The 'hooks' property in a matcher must be an array of command objects."
|
|
690
689
|
)), hooksProperty.value.range, MarkerSeverity.Error));
|
|
691
690
|
return;
|
|
@@ -714,37 +713,37 @@ let PromptValidator = class PromptValidator {
|
|
|
714
713
|
for (const prop of item.properties) {
|
|
715
714
|
const key = prop.key.value;
|
|
716
715
|
if (!( validProperties.has(key))) {
|
|
717
|
-
report(toMarker(( localize(
|
|
716
|
+
report(toMarker(( localize(8074, "Unknown property '{0}' in hook command.", key)), prop.key.range, MarkerSeverity.Warning));
|
|
718
717
|
}
|
|
719
718
|
if (key === "type") {
|
|
720
719
|
hasType = true;
|
|
721
720
|
if (prop.value.type !== "scalar" || prop.value.value !== "command") {
|
|
722
|
-
report(toMarker(( localize(
|
|
721
|
+
report(toMarker(( localize(8075, "The 'type' property in a hook command must be 'command'.")), prop.value.range, MarkerSeverity.Error));
|
|
723
722
|
}
|
|
724
723
|
} else if (( validCommandFields.has(key))) {
|
|
725
724
|
hasCommandField = true;
|
|
726
725
|
if (prop.value.type !== "scalar" || prop.value.value.trim().length === 0) {
|
|
727
726
|
report(toMarker(( localize(
|
|
728
|
-
|
|
727
|
+
8076,
|
|
729
728
|
"The '{0}' property in a hook command must be a non-empty string.",
|
|
730
729
|
key
|
|
731
730
|
)), prop.value.range, MarkerSeverity.Error));
|
|
732
731
|
}
|
|
733
732
|
} else if (key === "cwd") {
|
|
734
733
|
if (prop.value.type !== "scalar") {
|
|
735
|
-
report(toMarker(( localize(
|
|
734
|
+
report(toMarker(( localize(8077, "The 'cwd' property in a hook command must be a string.")), prop.value.range, MarkerSeverity.Error));
|
|
736
735
|
}
|
|
737
736
|
} else if (key === "env") {
|
|
738
737
|
if (prop.value.type !== "map") {
|
|
739
738
|
report(toMarker(( localize(
|
|
740
|
-
|
|
739
|
+
8078,
|
|
741
740
|
"The 'env' property in a hook command must be a map of string values."
|
|
742
741
|
)), prop.value.range, MarkerSeverity.Error));
|
|
743
742
|
} else {
|
|
744
743
|
for (const envProp of prop.value.properties) {
|
|
745
744
|
if (envProp.value.type !== "scalar") {
|
|
746
745
|
report(toMarker(( localize(
|
|
747
|
-
|
|
746
|
+
8079,
|
|
748
747
|
"Environment variable '{0}' must have a string value.",
|
|
749
748
|
envProp.key.value
|
|
750
749
|
)), envProp.value.range, MarkerSeverity.Error));
|
|
@@ -753,19 +752,19 @@ let PromptValidator = class PromptValidator {
|
|
|
753
752
|
}
|
|
754
753
|
} else if (key === "timeout" || key === "timeoutSec") {
|
|
755
754
|
if (prop.value.type !== "scalar" || isNaN(Number(prop.value.value))) {
|
|
756
|
-
report(toMarker(( localize(
|
|
755
|
+
report(toMarker(( localize(8080, "The '{0}' property in a hook command must be a number.", key)), prop.value.range, MarkerSeverity.Error));
|
|
757
756
|
}
|
|
758
757
|
}
|
|
759
758
|
}
|
|
760
759
|
if (!hasType) {
|
|
761
|
-
report(toMarker(( localize(
|
|
760
|
+
report(toMarker(( localize(8081, "Hook command is missing required property 'type'.")), item.range, MarkerSeverity.Error));
|
|
762
761
|
}
|
|
763
762
|
if (!hasCommandField) {
|
|
764
763
|
if (isCopilotCli) {
|
|
765
|
-
report(toMarker(( localize(
|
|
764
|
+
report(toMarker(( localize(8082, "Hook command must specify at least one of 'bash' or 'powershell'.")), item.range, MarkerSeverity.Error));
|
|
766
765
|
} else {
|
|
767
766
|
report(toMarker(( localize(
|
|
768
|
-
|
|
767
|
+
8083,
|
|
769
768
|
"Hook command must specify at least one of 'command', 'windows', 'linux', or 'osx'."
|
|
770
769
|
)), item.range, MarkerSeverity.Error));
|
|
771
770
|
}
|
|
@@ -777,14 +776,14 @@ let PromptValidator = class PromptValidator {
|
|
|
777
776
|
return;
|
|
778
777
|
}
|
|
779
778
|
if (attribute.value.type !== "sequence") {
|
|
780
|
-
report(toMarker(( localize(
|
|
779
|
+
report(toMarker(( localize(8084, "The 'handoffs' attribute must be an array.")), attribute.value.range, MarkerSeverity.Error));
|
|
781
780
|
return;
|
|
782
781
|
}
|
|
783
782
|
const seenLabels = ( new Map());
|
|
784
783
|
for (const item of attribute.value.items) {
|
|
785
784
|
if (item.type !== "map") {
|
|
786
785
|
report(toMarker(( localize(
|
|
787
|
-
|
|
786
|
+
8085,
|
|
788
787
|
"Each handoff in the 'handoffs' attribute must be an object with 'label', 'agent', 'prompt' and optional 'send'."
|
|
789
788
|
)), item.range, MarkerSeverity.Error));
|
|
790
789
|
continue;
|
|
@@ -794,44 +793,44 @@ let PromptValidator = class PromptValidator {
|
|
|
794
793
|
switch (prop.key.value) {
|
|
795
794
|
case "label":
|
|
796
795
|
if (prop.value.type !== "scalar" || prop.value.value.trim().length === 0) {
|
|
797
|
-
report(toMarker(( localize(
|
|
796
|
+
report(toMarker(( localize(8086, "The 'label' property in a handoff must be a non-empty string.")), prop.value.range, MarkerSeverity.Error));
|
|
798
797
|
} else if (!/[a-zA-Z0-9]/.test(prop.value.value)) {
|
|
799
798
|
report(toMarker(( localize(
|
|
800
|
-
|
|
799
|
+
8087,
|
|
801
800
|
"The 'label' property in a handoff must contain at least one alphanumeric character."
|
|
802
801
|
)), prop.value.range, MarkerSeverity.Error));
|
|
803
802
|
}
|
|
804
803
|
break;
|
|
805
804
|
case "agent":
|
|
806
805
|
if (prop.value.type !== "scalar" || prop.value.value.trim().length === 0) {
|
|
807
|
-
report(toMarker(( localize(
|
|
806
|
+
report(toMarker(( localize(8088, "The 'agent' property in a handoff must be a non-empty string.")), prop.value.range, MarkerSeverity.Error));
|
|
808
807
|
} else {
|
|
809
808
|
this.validateAgentValue(prop.value, report);
|
|
810
809
|
}
|
|
811
810
|
break;
|
|
812
811
|
case "prompt":
|
|
813
812
|
if (prop.value.type !== "scalar") {
|
|
814
|
-
report(toMarker(( localize(
|
|
813
|
+
report(toMarker(( localize(8089, "The 'prompt' property in a handoff must be a string.")), prop.value.range, MarkerSeverity.Error));
|
|
815
814
|
}
|
|
816
815
|
break;
|
|
817
816
|
case "send":
|
|
818
817
|
if (!isTrueOrFalse(prop.value)) {
|
|
819
|
-
report(toMarker(( localize(
|
|
818
|
+
report(toMarker(( localize(8090, "The 'send' property in a handoff must be a boolean.")), prop.value.range, MarkerSeverity.Error));
|
|
820
819
|
}
|
|
821
820
|
break;
|
|
822
821
|
case "showContinueOn":
|
|
823
822
|
if (!isTrueOrFalse(prop.value)) {
|
|
824
|
-
report(toMarker(( localize(
|
|
823
|
+
report(toMarker(( localize(8091, "The 'showContinueOn' property in a handoff must be a boolean.")), prop.value.range, MarkerSeverity.Error));
|
|
825
824
|
}
|
|
826
825
|
break;
|
|
827
826
|
case "model":
|
|
828
827
|
if (prop.value.type !== "scalar") {
|
|
829
|
-
report(toMarker(( localize(
|
|
828
|
+
report(toMarker(( localize(8092, "The 'model' property in a handoff must be a string.")), prop.value.range, MarkerSeverity.Error));
|
|
830
829
|
}
|
|
831
830
|
break;
|
|
832
831
|
default:
|
|
833
832
|
report(toMarker(( localize(
|
|
834
|
-
|
|
833
|
+
8093,
|
|
835
834
|
"Unknown property '{0}' in handoff object. Supported properties are 'label', 'agent', 'prompt' and optional 'send', 'showContinueOn', 'model'.",
|
|
836
835
|
prop.key.value
|
|
837
836
|
)), prop.value.range, MarkerSeverity.Warning));
|
|
@@ -840,7 +839,7 @@ let PromptValidator = class PromptValidator {
|
|
|
840
839
|
}
|
|
841
840
|
if (required.size > 0) {
|
|
842
841
|
report(toMarker(( localize(
|
|
843
|
-
|
|
842
|
+
8094,
|
|
844
843
|
"Missing required properties {0} in handoff object.",
|
|
845
844
|
( Array.from(required).map(s => `'${s}'`)).join(", ")
|
|
846
845
|
)), item.range, MarkerSeverity.Error));
|
|
@@ -850,7 +849,7 @@ let PromptValidator = class PromptValidator {
|
|
|
850
849
|
const normalizedLabel = labelProp.value.value.toLowerCase();
|
|
851
850
|
if (normalizedLabel && ( seenLabels.has(normalizedLabel))) {
|
|
852
851
|
report(toMarker(( localize(
|
|
853
|
-
|
|
852
|
+
8095,
|
|
854
853
|
"Duplicate handoff label '{0}'. Each handoff must have a unique label.",
|
|
855
854
|
labelProp.value.value
|
|
856
855
|
)), labelProp.value.range, MarkerSeverity.Error));
|
|
@@ -866,7 +865,7 @@ let PromptValidator = class PromptValidator {
|
|
|
866
865
|
return;
|
|
867
866
|
}
|
|
868
867
|
report(toMarker(( localize(
|
|
869
|
-
|
|
868
|
+
8096,
|
|
870
869
|
"The 'infer' attribute is deprecated in favour of 'user-invocable' and 'disable-model-invocation'."
|
|
871
870
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
872
871
|
}
|
|
@@ -876,18 +875,18 @@ let PromptValidator = class PromptValidator {
|
|
|
876
875
|
return;
|
|
877
876
|
}
|
|
878
877
|
if (attribute.value.type !== "scalar") {
|
|
879
|
-
report(toMarker(( localize(
|
|
878
|
+
report(toMarker(( localize(8097, "The 'target' attribute must be a string.")), attribute.value.range, MarkerSeverity.Error));
|
|
880
879
|
return;
|
|
881
880
|
}
|
|
882
881
|
const targetValue = attribute.value.value.trim();
|
|
883
882
|
if (targetValue.length === 0) {
|
|
884
|
-
report(toMarker(( localize(
|
|
883
|
+
report(toMarker(( localize(8098, "The 'target' attribute must be a non-empty string.")), attribute.value.range, MarkerSeverity.Error));
|
|
885
884
|
return;
|
|
886
885
|
}
|
|
887
886
|
const validTargets = ["github-copilot", "vscode"];
|
|
888
887
|
if (!validTargets.includes(targetValue)) {
|
|
889
888
|
report(toMarker(( localize(
|
|
890
|
-
|
|
889
|
+
8099,
|
|
891
890
|
"The 'target' attribute must be one of: {0}.",
|
|
892
891
|
validTargets.join(", ")
|
|
893
892
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
@@ -899,7 +898,7 @@ let PromptValidator = class PromptValidator {
|
|
|
899
898
|
return;
|
|
900
899
|
}
|
|
901
900
|
if (!isTrueOrFalse(attribute.value)) {
|
|
902
|
-
report(toMarker(( localize(
|
|
901
|
+
report(toMarker(( localize(8100, "The 'user-invocable' attribute must be 'true' or 'false'.")), attribute.value.range, MarkerSeverity.Error));
|
|
903
902
|
return;
|
|
904
903
|
}
|
|
905
904
|
}
|
|
@@ -910,7 +909,7 @@ let PromptValidator = class PromptValidator {
|
|
|
910
909
|
}
|
|
911
910
|
if (!isTrueOrFalse(attribute.value)) {
|
|
912
911
|
report(toMarker(( localize(
|
|
913
|
-
|
|
912
|
+
8101,
|
|
914
913
|
"The 'disable-model-invocation' attribute must be 'true' or 'false'."
|
|
915
914
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
916
915
|
return;
|
|
@@ -922,7 +921,7 @@ let PromptValidator = class PromptValidator {
|
|
|
922
921
|
return;
|
|
923
922
|
}
|
|
924
923
|
if (attribute.value.type !== "sequence") {
|
|
925
|
-
report(toMarker(( localize(
|
|
924
|
+
report(toMarker(( localize(8102, "The 'agents' attribute must be an array.")), attribute.value.range, MarkerSeverity.Error));
|
|
926
925
|
return;
|
|
927
926
|
}
|
|
928
927
|
const agents = (await this.promptsService.getCustomAgents(CancellationToken.None)).filter(a => a.enabled);
|
|
@@ -931,12 +930,12 @@ let PromptValidator = class PromptValidator {
|
|
|
931
930
|
const agentNames = [];
|
|
932
931
|
for (const item of attribute.value.items) {
|
|
933
932
|
if (item.type !== "scalar") {
|
|
934
|
-
report(toMarker(( localize(
|
|
933
|
+
report(toMarker(( localize(8103, "Each agent name in the 'agents' attribute must be a string.")), item.range, MarkerSeverity.Error));
|
|
935
934
|
} else if (item.value) {
|
|
936
935
|
agentNames.push(item.value);
|
|
937
936
|
if (item.value !== "*" && !( availableAgentNames.has(item.value))) {
|
|
938
937
|
report(toMarker(( localize(
|
|
939
|
-
|
|
938
|
+
8104,
|
|
940
939
|
"Unknown agent '{0}' will be ignored. Available agents: {1}.",
|
|
941
940
|
item.value,
|
|
942
941
|
Array.from(availableAgentNames).join(", ")
|
|
@@ -948,7 +947,7 @@ let PromptValidator = class PromptValidator {
|
|
|
948
947
|
const tools = header.tools;
|
|
949
948
|
if (tools && !tools.includes(SpecedToolAliases.agent)) {
|
|
950
949
|
report(toMarker(( localize(
|
|
951
|
-
|
|
950
|
+
8105,
|
|
952
951
|
"When 'agents' and 'tools' are specified, the 'agent' tool must be included in the 'tools' attribute."
|
|
953
952
|
)), attribute.value.range, MarkerSeverity.Warning));
|
|
954
953
|
}
|
|
@@ -960,20 +959,20 @@ let PromptValidator = class PromptValidator {
|
|
|
960
959
|
return;
|
|
961
960
|
}
|
|
962
961
|
if (attribute.value.type !== "map") {
|
|
963
|
-
report(toMarker(( localize(
|
|
962
|
+
report(toMarker(( localize(8106, "The 'github' attribute must be an object.")), attribute.value.range, MarkerSeverity.Error));
|
|
964
963
|
return;
|
|
965
964
|
}
|
|
966
965
|
for (const prop of attribute.value.properties) {
|
|
967
966
|
if (prop.key.value !== "permissions") {
|
|
968
967
|
report(toMarker(( localize(
|
|
969
|
-
|
|
968
|
+
8107,
|
|
970
969
|
"Unknown property '{0}' in 'github' object. Supported: 'permissions'.",
|
|
971
970
|
prop.key.value
|
|
972
971
|
)), prop.key.range, MarkerSeverity.Warning));
|
|
973
972
|
continue;
|
|
974
973
|
}
|
|
975
974
|
if (prop.value.type !== "map") {
|
|
976
|
-
report(toMarker(( localize(
|
|
975
|
+
report(toMarker(( localize(8108, "The 'permissions' property must be an object.")), prop.value.range, MarkerSeverity.Error));
|
|
977
976
|
continue;
|
|
978
977
|
}
|
|
979
978
|
for (const permProp of prop.value.properties) {
|
|
@@ -982,7 +981,7 @@ let PromptValidator = class PromptValidator {
|
|
|
982
981
|
if (!scopeInfo) {
|
|
983
982
|
const validScopes = ( Object.keys(githubPermissionScopes)).sort().join(", ");
|
|
984
983
|
report(toMarker(( localize(
|
|
985
|
-
|
|
984
|
+
8109,
|
|
986
985
|
"Unknown permission scope '{0}'. Valid scopes: {1}.",
|
|
987
986
|
scope,
|
|
988
987
|
validScopes
|
|
@@ -990,13 +989,13 @@ let PromptValidator = class PromptValidator {
|
|
|
990
989
|
continue;
|
|
991
990
|
}
|
|
992
991
|
if (permProp.value.type !== "scalar") {
|
|
993
|
-
report(toMarker(( localize(
|
|
992
|
+
report(toMarker(( localize(8110, "The permission value for '{0}' must be a string.", scope)), permProp.value.range, MarkerSeverity.Error));
|
|
994
993
|
continue;
|
|
995
994
|
}
|
|
996
995
|
const value = permProp.value.value;
|
|
997
996
|
if (!scopeInfo.allowedValues.includes(value)) {
|
|
998
997
|
report(toMarker(( localize(
|
|
999
|
-
|
|
998
|
+
8111,
|
|
1000
999
|
"Invalid permission value '{0}' for scope '{1}'. Allowed values: {2}.",
|
|
1001
1000
|
value,
|
|
1002
1001
|
scope,
|
|
@@ -1011,39 +1010,39 @@ PromptValidator = ( __decorate([( __param(0, ILanguageModelsService)), ( __param
|
|
|
1011
1010
|
const githubPermissionScopes = {
|
|
1012
1011
|
"actions": {
|
|
1013
1012
|
allowedValues: ["read", "write", "none"],
|
|
1014
|
-
description: ( localize(
|
|
1013
|
+
description: ( localize(8112, "Access to GitHub Actions workflows and runs"))
|
|
1015
1014
|
},
|
|
1016
1015
|
"checks": {
|
|
1017
1016
|
allowedValues: ["read", "none"],
|
|
1018
|
-
description: ( localize(
|
|
1017
|
+
description: ( localize(8113, "Access to check runs and statuses"))
|
|
1019
1018
|
},
|
|
1020
1019
|
"contents": {
|
|
1021
1020
|
allowedValues: ["read", "write", "none"],
|
|
1022
|
-
description: ( localize(
|
|
1021
|
+
description: ( localize(8114, "Access to repository contents (files, commits, branches)"))
|
|
1023
1022
|
},
|
|
1024
1023
|
"discussions": {
|
|
1025
1024
|
allowedValues: ["read", "write", "none"],
|
|
1026
|
-
description: ( localize(
|
|
1025
|
+
description: ( localize(8115, "Access to discussions"))
|
|
1027
1026
|
},
|
|
1028
1027
|
"issues": {
|
|
1029
1028
|
allowedValues: ["read", "write", "none"],
|
|
1030
|
-
description: ( localize(
|
|
1029
|
+
description: ( localize(8116, "Access to issues (read, create, update, comment)"))
|
|
1031
1030
|
},
|
|
1032
1031
|
"metadata": {
|
|
1033
1032
|
allowedValues: ["read"],
|
|
1034
|
-
description: ( localize(
|
|
1033
|
+
description: ( localize(8117, "Repository metadata (always read-only)"))
|
|
1035
1034
|
},
|
|
1036
1035
|
"pull-requests": {
|
|
1037
1036
|
allowedValues: ["read", "write", "none"],
|
|
1038
|
-
description: ( localize(
|
|
1037
|
+
description: ( localize(8118, "Access to pull requests (read, create, update, review)"))
|
|
1039
1038
|
},
|
|
1040
1039
|
"security-events": {
|
|
1041
1040
|
allowedValues: ["read", "none"],
|
|
1042
|
-
description: ( localize(
|
|
1041
|
+
description: ( localize(8119, "Access to security-related events"))
|
|
1043
1042
|
},
|
|
1044
1043
|
"workflows": {
|
|
1045
1044
|
allowedValues: ["write", "none"],
|
|
1046
|
-
description: ( localize(
|
|
1045
|
+
description: ( localize(8120, "Access to modify workflow files"))
|
|
1047
1046
|
}
|
|
1048
1047
|
};
|
|
1049
1048
|
function isTrueOrFalse(value) {
|
|
@@ -1131,103 +1130,103 @@ function isNonRecommendedAttribute(attributeName) {
|
|
|
1131
1130
|
}
|
|
1132
1131
|
const knownClaudeTools = [{
|
|
1133
1132
|
name: "Bash",
|
|
1134
|
-
description: ( localize(
|
|
1133
|
+
description: ( localize(8121, "Execute shell commands")),
|
|
1135
1134
|
toolEquivalent: [SpecedToolAliases.execute]
|
|
1136
1135
|
}, {
|
|
1137
1136
|
name: "Edit",
|
|
1138
|
-
description: ( localize(
|
|
1137
|
+
description: ( localize(8122, "Make targeted file edits")),
|
|
1139
1138
|
toolEquivalent: ["edit/editNotebook", "edit/editFiles"]
|
|
1140
1139
|
}, {
|
|
1141
1140
|
name: "Glob",
|
|
1142
|
-
description: ( localize(
|
|
1141
|
+
description: ( localize(8123, "Find files by pattern")),
|
|
1143
1142
|
toolEquivalent: ["search/fileSearch"]
|
|
1144
1143
|
}, {
|
|
1145
1144
|
name: "Grep",
|
|
1146
|
-
description: ( localize(
|
|
1145
|
+
description: ( localize(8124, "Search file contents with regex")),
|
|
1147
1146
|
toolEquivalent: ["search/textSearch"]
|
|
1148
1147
|
}, {
|
|
1149
1148
|
name: "Read",
|
|
1150
|
-
description: ( localize(
|
|
1149
|
+
description: ( localize(8125, "Read file contents")),
|
|
1151
1150
|
toolEquivalent: ["read/readFile", "read/getNotebookSummary"]
|
|
1152
1151
|
}, {
|
|
1153
1152
|
name: "Write",
|
|
1154
|
-
description: ( localize(
|
|
1153
|
+
description: ( localize(8126, "Create/overwrite files")),
|
|
1155
1154
|
toolEquivalent: ["edit/createDirectory", "edit/createFile", "edit/createJupyterNotebook"]
|
|
1156
1155
|
}, {
|
|
1157
1156
|
name: "WebFetch",
|
|
1158
|
-
description: ( localize(
|
|
1157
|
+
description: ( localize(8127, "Fetch URL content")),
|
|
1159
1158
|
toolEquivalent: [SpecedToolAliases.web]
|
|
1160
1159
|
}, {
|
|
1161
1160
|
name: "WebSearch",
|
|
1162
|
-
description: ( localize(
|
|
1161
|
+
description: ( localize(8128, "Perform web searches")),
|
|
1163
1162
|
toolEquivalent: [SpecedToolAliases.web]
|
|
1164
1163
|
}, {
|
|
1165
1164
|
name: "Task",
|
|
1166
|
-
description: ( localize(
|
|
1165
|
+
description: ( localize(8129, "Run subagents for complex tasks")),
|
|
1167
1166
|
toolEquivalent: [SpecedToolAliases.agent]
|
|
1168
1167
|
}, {
|
|
1169
1168
|
name: "Skill",
|
|
1170
|
-
description: ( localize(
|
|
1169
|
+
description: ( localize(8130, "Execute skills")),
|
|
1171
1170
|
toolEquivalent: []
|
|
1172
1171
|
}, {
|
|
1173
1172
|
name: "LSP",
|
|
1174
|
-
description: ( localize(
|
|
1173
|
+
description: ( localize(8131, "Code intelligence (requires plugin)")),
|
|
1175
1174
|
toolEquivalent: []
|
|
1176
1175
|
}, {
|
|
1177
1176
|
name: "NotebookEdit",
|
|
1178
|
-
description: ( localize(
|
|
1177
|
+
description: ( localize(8132, "Modify Jupyter notebooks")),
|
|
1179
1178
|
toolEquivalent: ["edit/editNotebook"]
|
|
1180
1179
|
}, {
|
|
1181
1180
|
name: "AskUserQuestion",
|
|
1182
|
-
description: ( localize(
|
|
1181
|
+
description: ( localize(8133, "Ask multiple-choice questions")),
|
|
1183
1182
|
toolEquivalent: ["vscode/askQuestions"]
|
|
1184
1183
|
}, {
|
|
1185
1184
|
name: "MCPSearch",
|
|
1186
|
-
description: ( localize(
|
|
1185
|
+
description: ( localize(8134, "Searches for MCP tools when tool search is enabled")),
|
|
1187
1186
|
toolEquivalent: []
|
|
1188
1187
|
}];
|
|
1189
1188
|
const knownClaudeModels = [{
|
|
1190
1189
|
name: "sonnet",
|
|
1191
|
-
description: ( localize(
|
|
1190
|
+
description: ( localize(8135, "Latest Claude Sonnet")),
|
|
1192
1191
|
modelEquivalent: "Claude Sonnet 4.5 (copilot)"
|
|
1193
1192
|
}, {
|
|
1194
1193
|
name: "opus",
|
|
1195
|
-
description: ( localize(
|
|
1194
|
+
description: ( localize(8136, "Latest Claude Opus")),
|
|
1196
1195
|
modelEquivalent: "Claude Opus 4.6 (copilot)"
|
|
1197
1196
|
}, {
|
|
1198
1197
|
name: "haiku",
|
|
1199
|
-
description: ( localize(
|
|
1198
|
+
description: ( localize(8137, "Latest Claude Haiku, fast for simple tasks")),
|
|
1200
1199
|
modelEquivalent: "Claude Haiku 4.5 (copilot)"
|
|
1201
1200
|
}, {
|
|
1202
1201
|
name: "inherit",
|
|
1203
|
-
description: ( localize(
|
|
1202
|
+
description: ( localize(8138, "Inherit model from parent agent or prompt")),
|
|
1204
1203
|
modelEquivalent: undefined
|
|
1205
1204
|
}];
|
|
1206
1205
|
const claudeAgentAttributes = {
|
|
1207
1206
|
"name": {
|
|
1208
1207
|
type: "scalar",
|
|
1209
|
-
description: ( localize(
|
|
1208
|
+
description: ( localize(8139, "Unique identifier using lowercase letters and hyphens (required)"))
|
|
1210
1209
|
},
|
|
1211
1210
|
"description": {
|
|
1212
1211
|
type: "scalar",
|
|
1213
|
-
description: ( localize(
|
|
1212
|
+
description: ( localize(8140, "When to delegate to this subagent (required)"))
|
|
1214
1213
|
},
|
|
1215
1214
|
"tools": {
|
|
1216
1215
|
type: "sequence",
|
|
1217
|
-
description: ( localize(
|
|
1216
|
+
description: ( localize(8141, "Array of tools the subagent can use. Inherits all tools if omitted")),
|
|
1218
1217
|
defaults: ["Read, Edit, Bash"],
|
|
1219
1218
|
items: knownClaudeTools
|
|
1220
1219
|
},
|
|
1221
1220
|
"disallowedTools": {
|
|
1222
1221
|
type: "sequence",
|
|
1223
|
-
description: ( localize(
|
|
1222
|
+
description: ( localize(8142, "Tools to deny, removed from inherited or specified list")),
|
|
1224
1223
|
defaults: ["Write, Edit, Bash"],
|
|
1225
1224
|
items: knownClaudeTools
|
|
1226
1225
|
},
|
|
1227
1226
|
"model": {
|
|
1228
1227
|
type: "scalar",
|
|
1229
1228
|
description: ( localize(
|
|
1230
|
-
|
|
1229
|
+
8143,
|
|
1231
1230
|
"Model to use: sonnet, opus, haiku, or inherit. Defaults to inherit."
|
|
1232
1231
|
)),
|
|
1233
1232
|
defaults: ["sonnet", "opus", "haiku", "inherit"],
|
|
@@ -1236,77 +1235,77 @@ const claudeAgentAttributes = {
|
|
|
1236
1235
|
"permissionMode": {
|
|
1237
1236
|
type: "scalar",
|
|
1238
1237
|
description: ( localize(
|
|
1239
|
-
|
|
1238
|
+
8144,
|
|
1240
1239
|
"Permission mode: default, acceptEdits, dontAsk, bypassPermissions, or plan."
|
|
1241
1240
|
)),
|
|
1242
1241
|
defaults: ["default", "acceptEdits", "dontAsk", "bypassPermissions", "plan"],
|
|
1243
1242
|
enums: [{
|
|
1244
1243
|
name: "default",
|
|
1245
1244
|
description: ( localize(
|
|
1246
|
-
|
|
1245
|
+
8145,
|
|
1247
1246
|
"Standard behavior: prompts for permission on first use of each tool."
|
|
1248
1247
|
))
|
|
1249
1248
|
}, {
|
|
1250
1249
|
name: "acceptEdits",
|
|
1251
|
-
description: ( localize(
|
|
1250
|
+
description: ( localize(8146, "Automatically accepts file edit permissions for the session."))
|
|
1252
1251
|
}, {
|
|
1253
1252
|
name: "plan",
|
|
1254
1253
|
description: ( localize(
|
|
1255
|
-
|
|
1254
|
+
8147,
|
|
1256
1255
|
"Plan Mode: Claude can analyze but not modify files or execute commands."
|
|
1257
1256
|
))
|
|
1258
1257
|
}, {
|
|
1259
1258
|
name: "delegate",
|
|
1260
1259
|
description: ( localize(
|
|
1261
|
-
|
|
1260
|
+
8148,
|
|
1262
1261
|
"Coordination-only mode for agent team leads. Only available when an agent team is active."
|
|
1263
1262
|
))
|
|
1264
1263
|
}, {
|
|
1265
1264
|
name: "dontAsk",
|
|
1266
1265
|
description: ( localize(
|
|
1267
|
-
|
|
1266
|
+
8149,
|
|
1268
1267
|
"Auto-denies tools unless pre-approved via /permissions or permissions.allow rules."
|
|
1269
1268
|
))
|
|
1270
1269
|
}, {
|
|
1271
1270
|
name: "bypassPermissions",
|
|
1272
1271
|
description: ( localize(
|
|
1273
|
-
|
|
1272
|
+
8150,
|
|
1274
1273
|
"Skips all permission prompts (requires safe environment like containers)."
|
|
1275
1274
|
))
|
|
1276
1275
|
}]
|
|
1277
1276
|
},
|
|
1278
1277
|
"skills": {
|
|
1279
1278
|
type: "sequence",
|
|
1280
|
-
description: ( localize(
|
|
1279
|
+
description: ( localize(8151, "Skills to load into the subagent's context at startup."))
|
|
1281
1280
|
},
|
|
1282
1281
|
"mcpServers": {
|
|
1283
1282
|
type: "sequence",
|
|
1284
|
-
description: ( localize(
|
|
1283
|
+
description: ( localize(8152, "MCP servers available to this subagent."))
|
|
1285
1284
|
},
|
|
1286
1285
|
"hooks": {
|
|
1287
1286
|
type: "object",
|
|
1288
|
-
description: ( localize(
|
|
1287
|
+
description: ( localize(8153, "Lifecycle hooks scoped to this subagent."))
|
|
1289
1288
|
},
|
|
1290
1289
|
"memory": {
|
|
1291
1290
|
type: "scalar",
|
|
1292
1291
|
description: ( localize(
|
|
1293
|
-
|
|
1292
|
+
8154,
|
|
1294
1293
|
"Persistent memory scope: user, project, or local. Enables cross-session learning."
|
|
1295
1294
|
)),
|
|
1296
1295
|
defaults: ["user", "project", "local"],
|
|
1297
1296
|
enums: [{
|
|
1298
1297
|
name: "user",
|
|
1299
|
-
description: ( localize(
|
|
1298
|
+
description: ( localize(8155, "Remember learnings across all projects."))
|
|
1300
1299
|
}, {
|
|
1301
1300
|
name: "project",
|
|
1302
1301
|
description: ( localize(
|
|
1303
|
-
|
|
1302
|
+
8156,
|
|
1304
1303
|
"The subagent's knowledge is project-specific and shareable via version control."
|
|
1305
1304
|
))
|
|
1306
1305
|
}, {
|
|
1307
1306
|
name: "local",
|
|
1308
1307
|
description: ( localize(
|
|
1309
|
-
|
|
1308
|
+
8157,
|
|
1310
1309
|
"The subagent's knowledge is project-specific but should not be checked into version control."
|
|
1311
1310
|
))
|
|
1312
1311
|
}]
|
|
@@ -1316,14 +1315,14 @@ const claudeRulesAttributes = {
|
|
|
1316
1315
|
"description": {
|
|
1317
1316
|
type: "scalar",
|
|
1318
1317
|
description: ( localize(
|
|
1319
|
-
|
|
1318
|
+
8158,
|
|
1320
1319
|
"A description of what this rule covers, used to provide context about when it applies."
|
|
1321
1320
|
))
|
|
1322
1321
|
},
|
|
1323
1322
|
"paths": {
|
|
1324
1323
|
type: "sequence",
|
|
1325
1324
|
description: ( localize(
|
|
1326
|
-
|
|
1325
|
+
8159,
|
|
1327
1326
|
"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/**']`"
|
|
1328
1327
|
))
|
|
1329
1328
|
}
|