@codingame/monaco-vscode-chat-service-override 32.0.0 → 32.0.1
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.js +1 -0
- package/package.json +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.d.ts +58 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.js +637 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostPermissionUiContribution.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessions.contribution.js +3 -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.js +22 -22
- 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/aiCustomization/aiCustomizationIcons.js +14 -14
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationListWidget.js +97 -97
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagement.contribution.js +43 -43
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.js +58 -58
- 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/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.js +50 -50
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.js +51 -51
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chat.contribution.js +229 -229
- package/vscode/src/vs/workbench/contrib/chat/browser/chat.view.contribution.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chat.view.contribution.js +5 -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 +3 -3
- 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 +7 -7
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatManagementEditorInput.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatManagement/chatModelsWidget.js +43 -43
- package/vscode/src/vs/workbench/contrib/chat/browser/chatOutputItemRenderer.js +3 -3
- 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 +16 -16
- 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 +26 -26
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.js +12 -12
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSlashCommands.js +19 -19
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusDashboard.js +57 -57
- package/vscode/src/vs/workbench/contrib/chat/browser/chatStatus/chatStatusEntry.js +13 -13
- package/vscode/src/vs/workbench/contrib/chat/browser/chatTipCatalog.js +19 -19
- package/vscode/src/vs/workbench/contrib/chat/browser/chatTipService.js +1 -1
- 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/languageModelsConfigurationService.js +1 -1
- 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/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/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.js +23 -23
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/renameTool.js +5 -5
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/usagesTool.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/browser/viewsWelcome/chatViewsWelcomeHandler.js +5 -5
- 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/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 +4 -4
- 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 +3 -3
- package/vscode/src/vs/workbench/contrib/chat/common/model/chatSessionStore.js +6 -6
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.js +12 -12
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/chatPromptFilesContribution.js +18 -18
- 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 +5 -5
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptHovers.js +12 -12
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/languageProviders/promptValidator.js +150 -150
- package/vscode/src/vs/workbench/contrib/chat/common/voiceChatService.js +1 -1
- 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.js +3 -3
- 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 +10 -10
- 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
|
@@ -64,13 +64,13 @@ let PromptValidator = class PromptValidator {
|
|
|
64
64
|
const location = this.promptsService.getAgentFileURIFromModeFile(promptAST.uri);
|
|
65
65
|
if (location && (await this.fileService.canCreateFile(location))) {
|
|
66
66
|
report(toMarker(( localize(
|
|
67
|
-
|
|
67
|
+
7928,
|
|
68
68
|
"Chat modes have been renamed to agents. Please move this file to {0}",
|
|
69
69
|
(location.toString())
|
|
70
70
|
)), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
71
71
|
} else {
|
|
72
72
|
report(toMarker(( localize(
|
|
73
|
-
|
|
73
|
+
7929,
|
|
74
74
|
"Chat modes have been renamed to agents. Please move the file to {0}",
|
|
75
75
|
AGENTS_SOURCE_FOLDER
|
|
76
76
|
)), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
@@ -83,13 +83,13 @@ let PromptValidator = class PromptValidator {
|
|
|
83
83
|
}
|
|
84
84
|
const nameAttribute = promptAST.header.getAttribute(PromptHeaderAttributes.name);
|
|
85
85
|
if (!nameAttribute) {
|
|
86
|
-
report(toMarker(( localize(
|
|
86
|
+
report(toMarker(( localize(7930, "Skill should provide a name.")), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
87
87
|
} else if (nameAttribute.value.type === "scalar") {
|
|
88
88
|
const skillName = nameAttribute.value.value.trim();
|
|
89
89
|
if (skillName.length > 0) {
|
|
90
90
|
if (!VALID_SKILL_NAME_REGEX.test(skillName)) {
|
|
91
91
|
report(toMarker(( localize(
|
|
92
|
-
|
|
92
|
+
7931,
|
|
93
93
|
"Skill name may only contain lowercase letters, numbers, and hyphens."
|
|
94
94
|
)), nameAttribute.value.range, MarkerSeverity.Error));
|
|
95
95
|
}
|
|
@@ -99,7 +99,7 @@ let PromptValidator = class PromptValidator {
|
|
|
99
99
|
const folderName = pathParts[skillIndex - 1];
|
|
100
100
|
if (folderName && skillName !== folderName) {
|
|
101
101
|
report(toMarker(( localize(
|
|
102
|
-
|
|
102
|
+
7932,
|
|
103
103
|
"The skill name '{0}' should match the folder name '{1}'.",
|
|
104
104
|
skillName,
|
|
105
105
|
folderName
|
|
@@ -110,12 +110,12 @@ let PromptValidator = class PromptValidator {
|
|
|
110
110
|
}
|
|
111
111
|
const descriptionAttribute = promptAST.header.getAttribute(PromptHeaderAttributes.description);
|
|
112
112
|
if (!descriptionAttribute) {
|
|
113
|
-
report(toMarker(( localize(
|
|
113
|
+
report(toMarker(( localize(7933, "Skill should provide a description.")), ( new Range(1, 1, 1, 4)), MarkerSeverity.Warning));
|
|
114
114
|
if (promptAST.header.userInvocable === false) {
|
|
115
115
|
const userInvocableAttr = promptAST.header.getAttribute(PromptHeaderAttributes.userInvocable);
|
|
116
116
|
if (userInvocableAttr) {
|
|
117
117
|
report(toMarker(( localize(
|
|
118
|
-
|
|
118
|
+
7934,
|
|
119
119
|
"A description is required when user-invocable is false, because the model needs a description to decide when to load the skill."
|
|
120
120
|
)), userInvocableAttr.value.range, MarkerSeverity.Error));
|
|
121
121
|
}
|
|
@@ -124,7 +124,7 @@ let PromptValidator = class PromptValidator {
|
|
|
124
124
|
const disableModelInvocationAttr = promptAST.header.getAttribute(PromptHeaderAttributes.disableModelInvocation);
|
|
125
125
|
if (disableModelInvocationAttr) {
|
|
126
126
|
report(toMarker(( localize(
|
|
127
|
-
|
|
127
|
+
7935,
|
|
128
128
|
"A description is required when model invocation is enabled, because the model needs a description to decide when to load the skill."
|
|
129
129
|
)), disableModelInvocationAttr.value.range, MarkerSeverity.Error));
|
|
130
130
|
}
|
|
@@ -135,7 +135,7 @@ let PromptValidator = class PromptValidator {
|
|
|
135
135
|
const skillToolEnabled = this.configurationService.getValue("github.copilot.chat.skillTool.enabled");
|
|
136
136
|
if (!skillToolEnabled) {
|
|
137
137
|
report(toMarker(( localize(
|
|
138
|
-
|
|
138
|
+
7936,
|
|
139
139
|
"The 'context: fork' attribute requires the skill tool to be enabled (github.copilot.chat.skillTool.enabled)."
|
|
140
140
|
)), contextAttribute.value.range, MarkerSeverity.Warning));
|
|
141
141
|
}
|
|
@@ -150,7 +150,7 @@ let PromptValidator = class PromptValidator {
|
|
|
150
150
|
for (const ref of body.fileReferences) {
|
|
151
151
|
const resolved = body.resolveFilePath(ref.content);
|
|
152
152
|
if (!resolved) {
|
|
153
|
-
report(toMarker(( localize(
|
|
153
|
+
report(toMarker(( localize(7937, "Invalid file reference '{0}'.", ref.content)), ref.range, MarkerSeverity.Warning));
|
|
154
154
|
continue;
|
|
155
155
|
}
|
|
156
156
|
if (promptAST.uri.scheme === resolved.scheme) {
|
|
@@ -159,7 +159,7 @@ let PromptValidator = class PromptValidator {
|
|
|
159
159
|
const exists = await this.fileService.exists(resolved);
|
|
160
160
|
if (!exists) {
|
|
161
161
|
const loc = this.labelService.getUriLabel(resolved);
|
|
162
|
-
report(toMarker(( localize(
|
|
162
|
+
report(toMarker(( localize(7938, "File '{0}' not found at '{1}'.", ref.content, loc)), ref.range, MarkerSeverity.Warning));
|
|
163
163
|
}
|
|
164
164
|
} catch (e) {
|
|
165
165
|
this.logger.warn(
|
|
@@ -182,7 +182,7 @@ let PromptValidator = class PromptValidator {
|
|
|
182
182
|
if (currentNames.size === 1) {
|
|
183
183
|
const newName = Array.from(currentNames)[0];
|
|
184
184
|
report(toMarker(( localize(
|
|
185
|
-
|
|
185
|
+
7939,
|
|
186
186
|
"Tool or toolset '{0}' has been renamed, use '{1}' instead.",
|
|
187
187
|
variable.name,
|
|
188
188
|
newName
|
|
@@ -190,7 +190,7 @@ let PromptValidator = class PromptValidator {
|
|
|
190
190
|
} else {
|
|
191
191
|
const newNames = Array.from(currentNames).sort((a, b) => a.localeCompare(b)).join(", ");
|
|
192
192
|
report(toMarker(( localize(
|
|
193
|
-
|
|
193
|
+
7940,
|
|
194
194
|
"Tool or toolset '{0}' has been renamed, use the following tools instead: {1}",
|
|
195
195
|
variable.name,
|
|
196
196
|
newNames
|
|
@@ -198,13 +198,13 @@ let PromptValidator = class PromptValidator {
|
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
200
|
} else {
|
|
201
|
-
report(toMarker(( localize(
|
|
201
|
+
report(toMarker(( localize(7941, "Unknown tool or toolset '{0}'.", variable.name)), variable.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
202
202
|
}
|
|
203
203
|
} else if (headerToolsMap) {
|
|
204
204
|
const tool = this.languageModelToolsService.getToolByFullReferenceName(variable.name);
|
|
205
205
|
if (tool && headerToolsMap.get(tool) === false) {
|
|
206
206
|
report(toMarker(( localize(
|
|
207
|
-
|
|
207
|
+
7942,
|
|
208
208
|
"Tool or toolset '{0}' also needs to be enabled in the header.",
|
|
209
209
|
variable.name
|
|
210
210
|
)), variable.range, MarkerSeverity.Warning));
|
|
@@ -278,7 +278,7 @@ let PromptValidator = class PromptValidator {
|
|
|
278
278
|
switch (promptType) {
|
|
279
279
|
case PromptsType.prompt:
|
|
280
280
|
report(toMarker(( localize(
|
|
281
|
-
|
|
281
|
+
7943,
|
|
282
282
|
"Attribute '{0}' is not supported in prompt files. Supported: {1}.",
|
|
283
283
|
attribute.key,
|
|
284
284
|
supportedNames.value
|
|
@@ -287,7 +287,7 @@ let PromptValidator = class PromptValidator {
|
|
|
287
287
|
case PromptsType.agent:
|
|
288
288
|
if (target === Target.GitHubCopilot) {
|
|
289
289
|
report(toMarker(( localize(
|
|
290
|
-
|
|
290
|
+
7944,
|
|
291
291
|
"Attribute '{0}' is not supported in custom GitHub Copilot agent files. Supported: {1}.",
|
|
292
292
|
attribute.key,
|
|
293
293
|
supportedNames.value
|
|
@@ -296,13 +296,13 @@ let PromptValidator = class PromptValidator {
|
|
|
296
296
|
; else {
|
|
297
297
|
if (( validGithubCopilotAttributeNames.value.has(attribute.key))) {
|
|
298
298
|
report(toMarker(( localize(
|
|
299
|
-
|
|
299
|
+
7945,
|
|
300
300
|
"Attribute '{0}' is ignored when running locally in VS Code.",
|
|
301
301
|
attribute.key
|
|
302
302
|
)), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
303
303
|
} else {
|
|
304
304
|
report(toMarker(( localize(
|
|
305
|
-
|
|
305
|
+
7946,
|
|
306
306
|
"Attribute '{0}' is not supported in VS Code agent files. Supported: {1}.",
|
|
307
307
|
attribute.key,
|
|
308
308
|
supportedNames.value
|
|
@@ -313,14 +313,14 @@ let PromptValidator = class PromptValidator {
|
|
|
313
313
|
case PromptsType.instructions:
|
|
314
314
|
if (target === Target.Claude) {
|
|
315
315
|
report(toMarker(( localize(
|
|
316
|
-
|
|
316
|
+
7947,
|
|
317
317
|
"Attribute '{0}' is not supported in rules files by VS Code agents. Supported: {1}.",
|
|
318
318
|
attribute.key,
|
|
319
319
|
supportedNames.value
|
|
320
320
|
)), attribute.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
321
321
|
} else {
|
|
322
322
|
report(toMarker(( localize(
|
|
323
|
-
|
|
323
|
+
7948,
|
|
324
324
|
"Attribute '{0}' is not supported in instructions files. Supported: {1}.",
|
|
325
325
|
attribute.key,
|
|
326
326
|
supportedNames.value
|
|
@@ -329,7 +329,7 @@ let PromptValidator = class PromptValidator {
|
|
|
329
329
|
break;
|
|
330
330
|
case PromptsType.skill:
|
|
331
331
|
report(toMarker(( localize(
|
|
332
|
-
|
|
332
|
+
7949,
|
|
333
333
|
"Attribute '{0}' is not supported by VS Code agents. Supported: {1}.",
|
|
334
334
|
attribute.key,
|
|
335
335
|
supportedNames.value
|
|
@@ -345,11 +345,11 @@ let PromptValidator = class PromptValidator {
|
|
|
345
345
|
return;
|
|
346
346
|
}
|
|
347
347
|
if (nameAttribute.value.type !== "scalar") {
|
|
348
|
-
report(toMarker(( localize(
|
|
348
|
+
report(toMarker(( localize(7950, "The 'name' attribute must be a string.")), nameAttribute.range, MarkerSeverity.Error));
|
|
349
349
|
return;
|
|
350
350
|
}
|
|
351
351
|
if (nameAttribute.value.value.trim().length === 0) {
|
|
352
|
-
report(toMarker(( localize(
|
|
352
|
+
report(toMarker(( localize(7951, "The 'name' attribute must not be empty.")), nameAttribute.value.range, MarkerSeverity.Error));
|
|
353
353
|
return;
|
|
354
354
|
}
|
|
355
355
|
}
|
|
@@ -359,11 +359,11 @@ let PromptValidator = class PromptValidator {
|
|
|
359
359
|
return;
|
|
360
360
|
}
|
|
361
361
|
if (descriptionAttribute.value.type !== "scalar") {
|
|
362
|
-
report(toMarker(( localize(
|
|
362
|
+
report(toMarker(( localize(7952, "The 'description' attribute must be a string.")), descriptionAttribute.range, MarkerSeverity.Error));
|
|
363
363
|
return;
|
|
364
364
|
}
|
|
365
365
|
if (descriptionAttribute.value.value.trim().length === 0) {
|
|
366
|
-
report(toMarker(( localize(
|
|
366
|
+
report(toMarker(( localize(7953, "The 'description' attribute should not be empty.")), descriptionAttribute.value.range, MarkerSeverity.Error));
|
|
367
367
|
return;
|
|
368
368
|
}
|
|
369
369
|
}
|
|
@@ -373,11 +373,11 @@ let PromptValidator = class PromptValidator {
|
|
|
373
373
|
return;
|
|
374
374
|
}
|
|
375
375
|
if (argumentHintAttribute.value.type !== "scalar") {
|
|
376
|
-
report(toMarker(( localize(
|
|
376
|
+
report(toMarker(( localize(7954, "The 'argument-hint' attribute must be a string.")), argumentHintAttribute.range, MarkerSeverity.Error));
|
|
377
377
|
return;
|
|
378
378
|
}
|
|
379
379
|
if (argumentHintAttribute.value.value.trim().length === 0) {
|
|
380
|
-
report(toMarker(( localize(
|
|
380
|
+
report(toMarker(( localize(7955, "The 'argument-hint' attribute should not be empty.")), argumentHintAttribute.value.range, MarkerSeverity.Warning));
|
|
381
381
|
return;
|
|
382
382
|
}
|
|
383
383
|
}
|
|
@@ -387,30 +387,30 @@ let PromptValidator = class PromptValidator {
|
|
|
387
387
|
return;
|
|
388
388
|
}
|
|
389
389
|
if (attribute.value.type !== "scalar" && attribute.value.type !== "sequence") {
|
|
390
|
-
report(toMarker(( localize(
|
|
390
|
+
report(toMarker(( localize(7956, "The 'model' attribute must be a string or an array of strings.")), attribute.value.range, MarkerSeverity.Error));
|
|
391
391
|
return;
|
|
392
392
|
}
|
|
393
393
|
const modelNames = [];
|
|
394
394
|
if (attribute.value.type === "scalar") {
|
|
395
395
|
const modelName = attribute.value.value.trim();
|
|
396
396
|
if (modelName.length === 0) {
|
|
397
|
-
report(toMarker(( localize(
|
|
397
|
+
report(toMarker(( localize(7957, "The 'model' attribute must be a non-empty string.")), attribute.value.range, MarkerSeverity.Error));
|
|
398
398
|
return;
|
|
399
399
|
}
|
|
400
400
|
modelNames.push([modelName, attribute.value.range]);
|
|
401
401
|
} else if (attribute.value.type === "sequence") {
|
|
402
402
|
if (attribute.value.items.length === 0) {
|
|
403
|
-
report(toMarker(( localize(
|
|
403
|
+
report(toMarker(( localize(7958, "The 'model' array must not be empty.")), attribute.value.range, MarkerSeverity.Error));
|
|
404
404
|
return;
|
|
405
405
|
}
|
|
406
406
|
for (const item of attribute.value.items) {
|
|
407
407
|
if (item.type !== "scalar") {
|
|
408
|
-
report(toMarker(( localize(
|
|
408
|
+
report(toMarker(( localize(7959, "The 'model' array must contain only strings.")), item.range, MarkerSeverity.Error));
|
|
409
409
|
return;
|
|
410
410
|
}
|
|
411
411
|
const modelName = item.value.trim();
|
|
412
412
|
if (modelName.length === 0) {
|
|
413
|
-
report(toMarker(( localize(
|
|
413
|
+
report(toMarker(( localize(7960, "Model names in the array must be non-empty strings.")), item.range, MarkerSeverity.Error));
|
|
414
414
|
return;
|
|
415
415
|
}
|
|
416
416
|
modelNames.push([modelName, item.range]);
|
|
@@ -423,9 +423,9 @@ let PromptValidator = class PromptValidator {
|
|
|
423
423
|
for (const [modelName, range] of modelNames) {
|
|
424
424
|
const modelMetadata = this.findModelByName(modelName);
|
|
425
425
|
if (!modelMetadata) {
|
|
426
|
-
report(toMarker(( localize(
|
|
426
|
+
report(toMarker(( localize(7961, "Unknown model '{0}' will be ignored.", modelName)), range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
427
427
|
} else if (agentKind === ChatModeKind.Agent && !ILanguageModelChatMetadata.suitableForAgentMode(modelMetadata)) {
|
|
428
|
-
report(toMarker(( localize(
|
|
428
|
+
report(toMarker(( localize(7962, "Model '{0}' is not suited for agent mode.", modelName)), range, MarkerSeverity.Warning));
|
|
429
429
|
}
|
|
430
430
|
}
|
|
431
431
|
}
|
|
@@ -439,13 +439,13 @@ let PromptValidator = class PromptValidator {
|
|
|
439
439
|
continue;
|
|
440
440
|
}
|
|
441
441
|
if (attribute.value.type !== "scalar") {
|
|
442
|
-
report(toMarker(( localize(
|
|
442
|
+
report(toMarker(( localize(7963, "The '{0}' attribute must be a string.", claudeAttributeName)), attribute.value.range, MarkerSeverity.Error));
|
|
443
443
|
continue;
|
|
444
444
|
} else {
|
|
445
445
|
const modelName = attribute.value.value.trim();
|
|
446
446
|
if (enumValues.every(model => model.name !== modelName)) {
|
|
447
447
|
const validValues = ( enumValues.map(model => model.name)).join(", ");
|
|
448
|
-
report(toMarker(( localize(
|
|
448
|
+
report(toMarker(( localize(7964, "Unknown value '{0}', valid: {1}.", modelName, validValues)), attribute.value.range, MarkerSeverity.Warning));
|
|
449
449
|
}
|
|
450
450
|
}
|
|
451
451
|
}
|
|
@@ -464,12 +464,12 @@ let PromptValidator = class PromptValidator {
|
|
|
464
464
|
if (modeAttribute) {
|
|
465
465
|
if (agentAttribute) {
|
|
466
466
|
report(toMarker(( localize(
|
|
467
|
-
|
|
467
|
+
7965,
|
|
468
468
|
"The 'mode' attribute has been deprecated. The 'agent' attribute is used instead."
|
|
469
469
|
)), modeAttribute.range, MarkerSeverity.Warning, [MarkerTag.Deprecated]));
|
|
470
470
|
} else {
|
|
471
471
|
report(toMarker(( localize(
|
|
472
|
-
|
|
472
|
+
7966,
|
|
473
473
|
"The 'mode' attribute has been deprecated. Please rename it to 'agent'."
|
|
474
474
|
)), modeAttribute.range, MarkerSeverity.Warning, [MarkerTag.Deprecated]));
|
|
475
475
|
}
|
|
@@ -479,12 +479,12 @@ let PromptValidator = class PromptValidator {
|
|
|
479
479
|
return undefined;
|
|
480
480
|
}
|
|
481
481
|
if (attribute.value.type !== "scalar") {
|
|
482
|
-
report(toMarker(( localize(
|
|
482
|
+
report(toMarker(( localize(7967, "The '{0}' attribute must be a string.", attribute.key)), attribute.value.range, MarkerSeverity.Error));
|
|
483
483
|
return undefined;
|
|
484
484
|
}
|
|
485
485
|
const agentValue = attribute.value.value;
|
|
486
486
|
if (agentValue.trim().length === 0) {
|
|
487
|
-
report(toMarker(( localize(
|
|
487
|
+
report(toMarker(( localize(7968, "The '{0}' attribute must be a non-empty string.", attribute.key)), attribute.value.range, MarkerSeverity.Error));
|
|
488
488
|
return undefined;
|
|
489
489
|
}
|
|
490
490
|
return this.validateAgentValue(attribute.value, report);
|
|
@@ -499,7 +499,7 @@ let PromptValidator = class PromptValidator {
|
|
|
499
499
|
availableAgents.push(agent.name.get());
|
|
500
500
|
}
|
|
501
501
|
const errorMessage = ( localize(
|
|
502
|
-
|
|
502
|
+
7969,
|
|
503
503
|
"Unknown agent '{0}'. Available agents: {1}.",
|
|
504
504
|
value.value,
|
|
505
505
|
availableAgents.join(", ")
|
|
@@ -514,7 +514,7 @@ let PromptValidator = class PromptValidator {
|
|
|
514
514
|
}
|
|
515
515
|
if (agentKind !== ChatModeKind.Agent) {
|
|
516
516
|
report(toMarker(( localize(
|
|
517
|
-
|
|
517
|
+
7970,
|
|
518
518
|
"The 'tools' attribute is only supported when using agents. Attribute will be ignored."
|
|
519
519
|
)), attribute.range, MarkerSeverity.Warning));
|
|
520
520
|
}
|
|
@@ -524,7 +524,7 @@ let PromptValidator = class PromptValidator {
|
|
|
524
524
|
}
|
|
525
525
|
if (value.type !== "sequence") {
|
|
526
526
|
report(toMarker(( localize(
|
|
527
|
-
|
|
527
|
+
7971,
|
|
528
528
|
"The 'tools' attribute must be an array or a comma separated string."
|
|
529
529
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
530
530
|
return;
|
|
@@ -540,7 +540,7 @@ let PromptValidator = class PromptValidator {
|
|
|
540
540
|
const deprecatedNames = this.languageModelToolsService.getDeprecatedFullReferenceNames();
|
|
541
541
|
for (const item of valueItem.items) {
|
|
542
542
|
if (item.type !== "scalar") {
|
|
543
|
-
report(toMarker(( localize(
|
|
543
|
+
report(toMarker(( localize(7972, "Each tool name in the 'tools' attribute must be a string.")), item.range, MarkerSeverity.Error));
|
|
544
544
|
} else if (item.value) {
|
|
545
545
|
if (!( available.has(item.value))) {
|
|
546
546
|
const currentNames = deprecatedNames.get(item.value);
|
|
@@ -548,7 +548,7 @@ let PromptValidator = class PromptValidator {
|
|
|
548
548
|
if (currentNames?.size === 1) {
|
|
549
549
|
const newName = Array.from(currentNames)[0];
|
|
550
550
|
report(toMarker(( localize(
|
|
551
|
-
|
|
551
|
+
7973,
|
|
552
552
|
"Tool or toolset '{0}' has been renamed, use '{1}' instead.",
|
|
553
553
|
item.value,
|
|
554
554
|
newName
|
|
@@ -556,14 +556,14 @@ let PromptValidator = class PromptValidator {
|
|
|
556
556
|
} else {
|
|
557
557
|
const newNames = Array.from(currentNames).sort((a, b) => a.localeCompare(b)).join(", ");
|
|
558
558
|
report(toMarker(( localize(
|
|
559
|
-
|
|
559
|
+
7974,
|
|
560
560
|
"Tool or toolset '{0}' has been renamed, use the following tools instead: {1}",
|
|
561
561
|
item.value,
|
|
562
562
|
newNames
|
|
563
563
|
)), item.range, MarkerSeverity.Info, [MarkerTag.Deprecated]));
|
|
564
564
|
}
|
|
565
565
|
} else {
|
|
566
|
-
report(toMarker(( localize(
|
|
566
|
+
report(toMarker(( localize(7975, "Unknown tool '{0}' will be ignored.", item.value)), item.range, MarkerSeverity.Hint, [MarkerTag.Unnecessary]));
|
|
567
567
|
}
|
|
568
568
|
}
|
|
569
569
|
}
|
|
@@ -576,25 +576,25 @@ let PromptValidator = class PromptValidator {
|
|
|
576
576
|
return;
|
|
577
577
|
}
|
|
578
578
|
if (attribute.value.type !== "scalar") {
|
|
579
|
-
report(toMarker(( localize(
|
|
579
|
+
report(toMarker(( localize(7976, "The 'applyTo' attribute must be a string.")), attribute.value.range, MarkerSeverity.Error));
|
|
580
580
|
return;
|
|
581
581
|
}
|
|
582
582
|
const pattern = attribute.value.value;
|
|
583
583
|
try {
|
|
584
584
|
const patterns = splitGlobAware(pattern, ",");
|
|
585
585
|
if (patterns.length === 0) {
|
|
586
|
-
report(toMarker(( localize(
|
|
586
|
+
report(toMarker(( localize(7977, "The 'applyTo' attribute must be a valid glob pattern.")), attribute.value.range, MarkerSeverity.Error));
|
|
587
587
|
return;
|
|
588
588
|
}
|
|
589
589
|
for (const pattern of patterns) {
|
|
590
590
|
const globPattern = parse(pattern);
|
|
591
591
|
if (isEmptyPattern(globPattern)) {
|
|
592
|
-
report(toMarker(( localize(
|
|
592
|
+
report(toMarker(( localize(7977, "The 'applyTo' attribute must be a valid glob pattern.")), attribute.value.range, MarkerSeverity.Error));
|
|
593
593
|
return;
|
|
594
594
|
}
|
|
595
595
|
}
|
|
596
596
|
} catch (_error) {
|
|
597
|
-
report(toMarker(( localize(
|
|
597
|
+
report(toMarker(( localize(7977, "The 'applyTo' attribute must be a valid glob pattern.")), attribute.value.range, MarkerSeverity.Error));
|
|
598
598
|
}
|
|
599
599
|
}
|
|
600
600
|
validatePaths(attributes, report) {
|
|
@@ -603,26 +603,26 @@ let PromptValidator = class PromptValidator {
|
|
|
603
603
|
return;
|
|
604
604
|
}
|
|
605
605
|
if (attribute.value.type !== "sequence") {
|
|
606
|
-
report(toMarker(( localize(
|
|
606
|
+
report(toMarker(( localize(7978, "The 'paths' attribute must be an array of glob patterns.")), attribute.value.range, MarkerSeverity.Error));
|
|
607
607
|
return;
|
|
608
608
|
}
|
|
609
609
|
for (const item of attribute.value.items) {
|
|
610
610
|
if (item.type !== "scalar") {
|
|
611
|
-
report(toMarker(( localize(
|
|
611
|
+
report(toMarker(( localize(7979, "Each entry in the 'paths' attribute must be a string.")), item.range, MarkerSeverity.Error));
|
|
612
612
|
continue;
|
|
613
613
|
}
|
|
614
614
|
const pattern = item.value.trim();
|
|
615
615
|
if (pattern.length === 0) {
|
|
616
|
-
report(toMarker(( localize(
|
|
616
|
+
report(toMarker(( localize(7980, "Path entries must be non-empty glob patterns.")), item.range, MarkerSeverity.Error));
|
|
617
617
|
continue;
|
|
618
618
|
}
|
|
619
619
|
try {
|
|
620
620
|
const globPattern = parse(pattern);
|
|
621
621
|
if (isEmptyPattern(globPattern)) {
|
|
622
|
-
report(toMarker(( localize(
|
|
622
|
+
report(toMarker(( localize(7981, "'{0}' is not a valid glob pattern.", pattern)), item.range, MarkerSeverity.Error));
|
|
623
623
|
}
|
|
624
624
|
} catch (_error) {
|
|
625
|
-
report(toMarker(( localize(
|
|
625
|
+
report(toMarker(( localize(7981, "'{0}' is not a valid glob pattern.", pattern)), item.range, MarkerSeverity.Error));
|
|
626
626
|
}
|
|
627
627
|
}
|
|
628
628
|
}
|
|
@@ -632,7 +632,7 @@ let PromptValidator = class PromptValidator {
|
|
|
632
632
|
return;
|
|
633
633
|
}
|
|
634
634
|
if (attribute.value.type !== "sequence" && attribute.value.type !== "scalar") {
|
|
635
|
-
report(toMarker(( localize(
|
|
635
|
+
report(toMarker(( localize(7982, "The 'excludeAgent' attribute must be an string or array.")), attribute.value.range, MarkerSeverity.Error));
|
|
636
636
|
return;
|
|
637
637
|
}
|
|
638
638
|
}
|
|
@@ -643,7 +643,7 @@ let PromptValidator = class PromptValidator {
|
|
|
643
643
|
}
|
|
644
644
|
if (attribute.value.type !== "map") {
|
|
645
645
|
report(toMarker(( localize(
|
|
646
|
-
|
|
646
|
+
7983,
|
|
647
647
|
"The 'hooks' attribute must be a map of hook event types to command arrays."
|
|
648
648
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
649
649
|
return;
|
|
@@ -652,7 +652,7 @@ let PromptValidator = class PromptValidator {
|
|
|
652
652
|
for (const prop of attribute.value.properties) {
|
|
653
653
|
if (!( validHookNames.has(prop.key.value))) {
|
|
654
654
|
report(toMarker(( localize(
|
|
655
|
-
|
|
655
|
+
7984,
|
|
656
656
|
"Unknown hook event type '{0}'. Supported: {1}.",
|
|
657
657
|
prop.key.value,
|
|
658
658
|
Array.from(validHookNames).join(", ")
|
|
@@ -660,7 +660,7 @@ let PromptValidator = class PromptValidator {
|
|
|
660
660
|
}
|
|
661
661
|
if (prop.value.type !== "sequence") {
|
|
662
662
|
report(toMarker(( localize(
|
|
663
|
-
|
|
663
|
+
7985,
|
|
664
664
|
"Hook event '{0}' must have an array of command objects as its value.",
|
|
665
665
|
prop.key.value
|
|
666
666
|
)), prop.value.range, MarkerSeverity.Error));
|
|
@@ -673,19 +673,19 @@ let PromptValidator = class PromptValidator {
|
|
|
673
673
|
}
|
|
674
674
|
validateHookCommand(item, target, report) {
|
|
675
675
|
if (item.type !== "map") {
|
|
676
|
-
report(toMarker(( localize(
|
|
676
|
+
report(toMarker(( localize(7986, "Each hook command must be an object.")), item.range, MarkerSeverity.Error));
|
|
677
677
|
return;
|
|
678
678
|
}
|
|
679
679
|
const hooksProperty = item.properties.find(p => p.key.value === "hooks");
|
|
680
680
|
if (hooksProperty) {
|
|
681
681
|
for (const prop of item.properties) {
|
|
682
682
|
if (prop.key.value !== "hooks" && prop.key.value !== "matcher") {
|
|
683
|
-
report(toMarker(( localize(
|
|
683
|
+
report(toMarker(( localize(7987, "Unknown property '{0}' in hook matcher.", prop.key.value)), prop.key.range, MarkerSeverity.Warning));
|
|
684
684
|
}
|
|
685
685
|
}
|
|
686
686
|
if (hooksProperty.value.type !== "sequence") {
|
|
687
687
|
report(toMarker(( localize(
|
|
688
|
-
|
|
688
|
+
7988,
|
|
689
689
|
"The 'hooks' property in a matcher must be an array of command objects."
|
|
690
690
|
)), hooksProperty.value.range, MarkerSeverity.Error));
|
|
691
691
|
return;
|
|
@@ -714,37 +714,37 @@ let PromptValidator = class PromptValidator {
|
|
|
714
714
|
for (const prop of item.properties) {
|
|
715
715
|
const key = prop.key.value;
|
|
716
716
|
if (!( validProperties.has(key))) {
|
|
717
|
-
report(toMarker(( localize(
|
|
717
|
+
report(toMarker(( localize(7989, "Unknown property '{0}' in hook command.", key)), prop.key.range, MarkerSeverity.Warning));
|
|
718
718
|
}
|
|
719
719
|
if (key === "type") {
|
|
720
720
|
hasType = true;
|
|
721
721
|
if (prop.value.type !== "scalar" || prop.value.value !== "command") {
|
|
722
|
-
report(toMarker(( localize(
|
|
722
|
+
report(toMarker(( localize(7990, "The 'type' property in a hook command must be 'command'.")), prop.value.range, MarkerSeverity.Error));
|
|
723
723
|
}
|
|
724
724
|
} else if (( validCommandFields.has(key))) {
|
|
725
725
|
hasCommandField = true;
|
|
726
726
|
if (prop.value.type !== "scalar" || prop.value.value.trim().length === 0) {
|
|
727
727
|
report(toMarker(( localize(
|
|
728
|
-
|
|
728
|
+
7991,
|
|
729
729
|
"The '{0}' property in a hook command must be a non-empty string.",
|
|
730
730
|
key
|
|
731
731
|
)), prop.value.range, MarkerSeverity.Error));
|
|
732
732
|
}
|
|
733
733
|
} else if (key === "cwd") {
|
|
734
734
|
if (prop.value.type !== "scalar") {
|
|
735
|
-
report(toMarker(( localize(
|
|
735
|
+
report(toMarker(( localize(7992, "The 'cwd' property in a hook command must be a string.")), prop.value.range, MarkerSeverity.Error));
|
|
736
736
|
}
|
|
737
737
|
} else if (key === "env") {
|
|
738
738
|
if (prop.value.type !== "map") {
|
|
739
739
|
report(toMarker(( localize(
|
|
740
|
-
|
|
740
|
+
7993,
|
|
741
741
|
"The 'env' property in a hook command must be a map of string values."
|
|
742
742
|
)), prop.value.range, MarkerSeverity.Error));
|
|
743
743
|
} else {
|
|
744
744
|
for (const envProp of prop.value.properties) {
|
|
745
745
|
if (envProp.value.type !== "scalar") {
|
|
746
746
|
report(toMarker(( localize(
|
|
747
|
-
|
|
747
|
+
7994,
|
|
748
748
|
"Environment variable '{0}' must have a string value.",
|
|
749
749
|
envProp.key.value
|
|
750
750
|
)), envProp.value.range, MarkerSeverity.Error));
|
|
@@ -753,19 +753,19 @@ let PromptValidator = class PromptValidator {
|
|
|
753
753
|
}
|
|
754
754
|
} else if (key === "timeout" || key === "timeoutSec") {
|
|
755
755
|
if (prop.value.type !== "scalar" || isNaN(Number(prop.value.value))) {
|
|
756
|
-
report(toMarker(( localize(
|
|
756
|
+
report(toMarker(( localize(7995, "The '{0}' property in a hook command must be a number.", key)), prop.value.range, MarkerSeverity.Error));
|
|
757
757
|
}
|
|
758
758
|
}
|
|
759
759
|
}
|
|
760
760
|
if (!hasType) {
|
|
761
|
-
report(toMarker(( localize(
|
|
761
|
+
report(toMarker(( localize(7996, "Hook command is missing required property 'type'.")), item.range, MarkerSeverity.Error));
|
|
762
762
|
}
|
|
763
763
|
if (!hasCommandField) {
|
|
764
764
|
if (isCopilotCli) {
|
|
765
|
-
report(toMarker(( localize(
|
|
765
|
+
report(toMarker(( localize(7997, "Hook command must specify at least one of 'bash' or 'powershell'.")), item.range, MarkerSeverity.Error));
|
|
766
766
|
} else {
|
|
767
767
|
report(toMarker(( localize(
|
|
768
|
-
|
|
768
|
+
7998,
|
|
769
769
|
"Hook command must specify at least one of 'command', 'windows', 'linux', or 'osx'."
|
|
770
770
|
)), item.range, MarkerSeverity.Error));
|
|
771
771
|
}
|
|
@@ -777,14 +777,14 @@ let PromptValidator = class PromptValidator {
|
|
|
777
777
|
return;
|
|
778
778
|
}
|
|
779
779
|
if (attribute.value.type !== "sequence") {
|
|
780
|
-
report(toMarker(( localize(
|
|
780
|
+
report(toMarker(( localize(7999, "The 'handoffs' attribute must be an array.")), attribute.value.range, MarkerSeverity.Error));
|
|
781
781
|
return;
|
|
782
782
|
}
|
|
783
783
|
const seenLabels = ( new Map());
|
|
784
784
|
for (const item of attribute.value.items) {
|
|
785
785
|
if (item.type !== "map") {
|
|
786
786
|
report(toMarker(( localize(
|
|
787
|
-
|
|
787
|
+
8000,
|
|
788
788
|
"Each handoff in the 'handoffs' attribute must be an object with 'label', 'agent', 'prompt' and optional 'send'."
|
|
789
789
|
)), item.range, MarkerSeverity.Error));
|
|
790
790
|
continue;
|
|
@@ -794,44 +794,44 @@ let PromptValidator = class PromptValidator {
|
|
|
794
794
|
switch (prop.key.value) {
|
|
795
795
|
case "label":
|
|
796
796
|
if (prop.value.type !== "scalar" || prop.value.value.trim().length === 0) {
|
|
797
|
-
report(toMarker(( localize(
|
|
797
|
+
report(toMarker(( localize(8001, "The 'label' property in a handoff must be a non-empty string.")), prop.value.range, MarkerSeverity.Error));
|
|
798
798
|
} else if (!/[a-zA-Z0-9]/.test(prop.value.value)) {
|
|
799
799
|
report(toMarker(( localize(
|
|
800
|
-
|
|
800
|
+
8002,
|
|
801
801
|
"The 'label' property in a handoff must contain at least one alphanumeric character."
|
|
802
802
|
)), prop.value.range, MarkerSeverity.Error));
|
|
803
803
|
}
|
|
804
804
|
break;
|
|
805
805
|
case "agent":
|
|
806
806
|
if (prop.value.type !== "scalar" || prop.value.value.trim().length === 0) {
|
|
807
|
-
report(toMarker(( localize(
|
|
807
|
+
report(toMarker(( localize(8003, "The 'agent' property in a handoff must be a non-empty string.")), prop.value.range, MarkerSeverity.Error));
|
|
808
808
|
} else {
|
|
809
809
|
this.validateAgentValue(prop.value, report);
|
|
810
810
|
}
|
|
811
811
|
break;
|
|
812
812
|
case "prompt":
|
|
813
813
|
if (prop.value.type !== "scalar") {
|
|
814
|
-
report(toMarker(( localize(
|
|
814
|
+
report(toMarker(( localize(8004, "The 'prompt' property in a handoff must be a string.")), prop.value.range, MarkerSeverity.Error));
|
|
815
815
|
}
|
|
816
816
|
break;
|
|
817
817
|
case "send":
|
|
818
818
|
if (!isTrueOrFalse(prop.value)) {
|
|
819
|
-
report(toMarker(( localize(
|
|
819
|
+
report(toMarker(( localize(8005, "The 'send' property in a handoff must be a boolean.")), prop.value.range, MarkerSeverity.Error));
|
|
820
820
|
}
|
|
821
821
|
break;
|
|
822
822
|
case "showContinueOn":
|
|
823
823
|
if (!isTrueOrFalse(prop.value)) {
|
|
824
|
-
report(toMarker(( localize(
|
|
824
|
+
report(toMarker(( localize(8006, "The 'showContinueOn' property in a handoff must be a boolean.")), prop.value.range, MarkerSeverity.Error));
|
|
825
825
|
}
|
|
826
826
|
break;
|
|
827
827
|
case "model":
|
|
828
828
|
if (prop.value.type !== "scalar") {
|
|
829
|
-
report(toMarker(( localize(
|
|
829
|
+
report(toMarker(( localize(8007, "The 'model' property in a handoff must be a string.")), prop.value.range, MarkerSeverity.Error));
|
|
830
830
|
}
|
|
831
831
|
break;
|
|
832
832
|
default:
|
|
833
833
|
report(toMarker(( localize(
|
|
834
|
-
|
|
834
|
+
8008,
|
|
835
835
|
"Unknown property '{0}' in handoff object. Supported properties are 'label', 'agent', 'prompt' and optional 'send', 'showContinueOn', 'model'.",
|
|
836
836
|
prop.key.value
|
|
837
837
|
)), prop.value.range, MarkerSeverity.Warning));
|
|
@@ -840,7 +840,7 @@ let PromptValidator = class PromptValidator {
|
|
|
840
840
|
}
|
|
841
841
|
if (required.size > 0) {
|
|
842
842
|
report(toMarker(( localize(
|
|
843
|
-
|
|
843
|
+
8009,
|
|
844
844
|
"Missing required properties {0} in handoff object.",
|
|
845
845
|
( Array.from(required).map(s => `'${s}'`)).join(", ")
|
|
846
846
|
)), item.range, MarkerSeverity.Error));
|
|
@@ -850,7 +850,7 @@ let PromptValidator = class PromptValidator {
|
|
|
850
850
|
const normalizedLabel = labelProp.value.value.toLowerCase();
|
|
851
851
|
if (normalizedLabel && ( seenLabels.has(normalizedLabel))) {
|
|
852
852
|
report(toMarker(( localize(
|
|
853
|
-
|
|
853
|
+
8010,
|
|
854
854
|
"Duplicate handoff label '{0}'. Each handoff must have a unique label.",
|
|
855
855
|
labelProp.value.value
|
|
856
856
|
)), labelProp.value.range, MarkerSeverity.Error));
|
|
@@ -866,7 +866,7 @@ let PromptValidator = class PromptValidator {
|
|
|
866
866
|
return;
|
|
867
867
|
}
|
|
868
868
|
report(toMarker(( localize(
|
|
869
|
-
|
|
869
|
+
8011,
|
|
870
870
|
"The 'infer' attribute is deprecated in favour of 'user-invocable' and 'disable-model-invocation'."
|
|
871
871
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
872
872
|
}
|
|
@@ -876,18 +876,18 @@ let PromptValidator = class PromptValidator {
|
|
|
876
876
|
return;
|
|
877
877
|
}
|
|
878
878
|
if (attribute.value.type !== "scalar") {
|
|
879
|
-
report(toMarker(( localize(
|
|
879
|
+
report(toMarker(( localize(8012, "The 'target' attribute must be a string.")), attribute.value.range, MarkerSeverity.Error));
|
|
880
880
|
return;
|
|
881
881
|
}
|
|
882
882
|
const targetValue = attribute.value.value.trim();
|
|
883
883
|
if (targetValue.length === 0) {
|
|
884
|
-
report(toMarker(( localize(
|
|
884
|
+
report(toMarker(( localize(8013, "The 'target' attribute must be a non-empty string.")), attribute.value.range, MarkerSeverity.Error));
|
|
885
885
|
return;
|
|
886
886
|
}
|
|
887
887
|
const validTargets = ["github-copilot", "vscode"];
|
|
888
888
|
if (!validTargets.includes(targetValue)) {
|
|
889
889
|
report(toMarker(( localize(
|
|
890
|
-
|
|
890
|
+
8014,
|
|
891
891
|
"The 'target' attribute must be one of: {0}.",
|
|
892
892
|
validTargets.join(", ")
|
|
893
893
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
@@ -899,7 +899,7 @@ let PromptValidator = class PromptValidator {
|
|
|
899
899
|
return;
|
|
900
900
|
}
|
|
901
901
|
if (!isTrueOrFalse(attribute.value)) {
|
|
902
|
-
report(toMarker(( localize(
|
|
902
|
+
report(toMarker(( localize(8015, "The 'user-invocable' attribute must be 'true' or 'false'.")), attribute.value.range, MarkerSeverity.Error));
|
|
903
903
|
return;
|
|
904
904
|
}
|
|
905
905
|
}
|
|
@@ -910,7 +910,7 @@ let PromptValidator = class PromptValidator {
|
|
|
910
910
|
}
|
|
911
911
|
if (!isTrueOrFalse(attribute.value)) {
|
|
912
912
|
report(toMarker(( localize(
|
|
913
|
-
|
|
913
|
+
8016,
|
|
914
914
|
"The 'disable-model-invocation' attribute must be 'true' or 'false'."
|
|
915
915
|
)), attribute.value.range, MarkerSeverity.Error));
|
|
916
916
|
return;
|
|
@@ -922,7 +922,7 @@ let PromptValidator = class PromptValidator {
|
|
|
922
922
|
return;
|
|
923
923
|
}
|
|
924
924
|
if (attribute.value.type !== "sequence") {
|
|
925
|
-
report(toMarker(( localize(
|
|
925
|
+
report(toMarker(( localize(8017, "The 'agents' attribute must be an array.")), attribute.value.range, MarkerSeverity.Error));
|
|
926
926
|
return;
|
|
927
927
|
}
|
|
928
928
|
const agents = (await this.promptsService.getCustomAgents(CancellationToken.None)).filter(a => a.enabled);
|
|
@@ -931,12 +931,12 @@ let PromptValidator = class PromptValidator {
|
|
|
931
931
|
const agentNames = [];
|
|
932
932
|
for (const item of attribute.value.items) {
|
|
933
933
|
if (item.type !== "scalar") {
|
|
934
|
-
report(toMarker(( localize(
|
|
934
|
+
report(toMarker(( localize(8018, "Each agent name in the 'agents' attribute must be a string.")), item.range, MarkerSeverity.Error));
|
|
935
935
|
} else if (item.value) {
|
|
936
936
|
agentNames.push(item.value);
|
|
937
937
|
if (item.value !== "*" && !( availableAgentNames.has(item.value))) {
|
|
938
938
|
report(toMarker(( localize(
|
|
939
|
-
|
|
939
|
+
8019,
|
|
940
940
|
"Unknown agent '{0}' will be ignored. Available agents: {1}.",
|
|
941
941
|
item.value,
|
|
942
942
|
Array.from(availableAgentNames).join(", ")
|
|
@@ -948,7 +948,7 @@ let PromptValidator = class PromptValidator {
|
|
|
948
948
|
const tools = header.tools;
|
|
949
949
|
if (tools && !tools.includes(SpecedToolAliases.agent)) {
|
|
950
950
|
report(toMarker(( localize(
|
|
951
|
-
|
|
951
|
+
8020,
|
|
952
952
|
"When 'agents' and 'tools' are specified, the 'agent' tool must be included in the 'tools' attribute."
|
|
953
953
|
)), attribute.value.range, MarkerSeverity.Warning));
|
|
954
954
|
}
|
|
@@ -960,20 +960,20 @@ let PromptValidator = class PromptValidator {
|
|
|
960
960
|
return;
|
|
961
961
|
}
|
|
962
962
|
if (attribute.value.type !== "map") {
|
|
963
|
-
report(toMarker(( localize(
|
|
963
|
+
report(toMarker(( localize(8021, "The 'github' attribute must be an object.")), attribute.value.range, MarkerSeverity.Error));
|
|
964
964
|
return;
|
|
965
965
|
}
|
|
966
966
|
for (const prop of attribute.value.properties) {
|
|
967
967
|
if (prop.key.value !== "permissions") {
|
|
968
968
|
report(toMarker(( localize(
|
|
969
|
-
|
|
969
|
+
8022,
|
|
970
970
|
"Unknown property '{0}' in 'github' object. Supported: 'permissions'.",
|
|
971
971
|
prop.key.value
|
|
972
972
|
)), prop.key.range, MarkerSeverity.Warning));
|
|
973
973
|
continue;
|
|
974
974
|
}
|
|
975
975
|
if (prop.value.type !== "map") {
|
|
976
|
-
report(toMarker(( localize(
|
|
976
|
+
report(toMarker(( localize(8023, "The 'permissions' property must be an object.")), prop.value.range, MarkerSeverity.Error));
|
|
977
977
|
continue;
|
|
978
978
|
}
|
|
979
979
|
for (const permProp of prop.value.properties) {
|
|
@@ -982,7 +982,7 @@ let PromptValidator = class PromptValidator {
|
|
|
982
982
|
if (!scopeInfo) {
|
|
983
983
|
const validScopes = ( Object.keys(githubPermissionScopes)).sort().join(", ");
|
|
984
984
|
report(toMarker(( localize(
|
|
985
|
-
|
|
985
|
+
8024,
|
|
986
986
|
"Unknown permission scope '{0}'. Valid scopes: {1}.",
|
|
987
987
|
scope,
|
|
988
988
|
validScopes
|
|
@@ -990,13 +990,13 @@ let PromptValidator = class PromptValidator {
|
|
|
990
990
|
continue;
|
|
991
991
|
}
|
|
992
992
|
if (permProp.value.type !== "scalar") {
|
|
993
|
-
report(toMarker(( localize(
|
|
993
|
+
report(toMarker(( localize(8025, "The permission value for '{0}' must be a string.", scope)), permProp.value.range, MarkerSeverity.Error));
|
|
994
994
|
continue;
|
|
995
995
|
}
|
|
996
996
|
const value = permProp.value.value;
|
|
997
997
|
if (!scopeInfo.allowedValues.includes(value)) {
|
|
998
998
|
report(toMarker(( localize(
|
|
999
|
-
|
|
999
|
+
8026,
|
|
1000
1000
|
"Invalid permission value '{0}' for scope '{1}'. Allowed values: {2}.",
|
|
1001
1001
|
value,
|
|
1002
1002
|
scope,
|
|
@@ -1011,39 +1011,39 @@ PromptValidator = ( __decorate([( __param(0, ILanguageModelsService)), ( __param
|
|
|
1011
1011
|
const githubPermissionScopes = {
|
|
1012
1012
|
"actions": {
|
|
1013
1013
|
allowedValues: ["read", "write", "none"],
|
|
1014
|
-
description: ( localize(
|
|
1014
|
+
description: ( localize(8027, "Access to GitHub Actions workflows and runs"))
|
|
1015
1015
|
},
|
|
1016
1016
|
"checks": {
|
|
1017
1017
|
allowedValues: ["read", "none"],
|
|
1018
|
-
description: ( localize(
|
|
1018
|
+
description: ( localize(8028, "Access to check runs and statuses"))
|
|
1019
1019
|
},
|
|
1020
1020
|
"contents": {
|
|
1021
1021
|
allowedValues: ["read", "write", "none"],
|
|
1022
|
-
description: ( localize(
|
|
1022
|
+
description: ( localize(8029, "Access to repository contents (files, commits, branches)"))
|
|
1023
1023
|
},
|
|
1024
1024
|
"discussions": {
|
|
1025
1025
|
allowedValues: ["read", "write", "none"],
|
|
1026
|
-
description: ( localize(
|
|
1026
|
+
description: ( localize(8030, "Access to discussions"))
|
|
1027
1027
|
},
|
|
1028
1028
|
"issues": {
|
|
1029
1029
|
allowedValues: ["read", "write", "none"],
|
|
1030
|
-
description: ( localize(
|
|
1030
|
+
description: ( localize(8031, "Access to issues (read, create, update, comment)"))
|
|
1031
1031
|
},
|
|
1032
1032
|
"metadata": {
|
|
1033
1033
|
allowedValues: ["read"],
|
|
1034
|
-
description: ( localize(
|
|
1034
|
+
description: ( localize(8032, "Repository metadata (always read-only)"))
|
|
1035
1035
|
},
|
|
1036
1036
|
"pull-requests": {
|
|
1037
1037
|
allowedValues: ["read", "write", "none"],
|
|
1038
|
-
description: ( localize(
|
|
1038
|
+
description: ( localize(8033, "Access to pull requests (read, create, update, review)"))
|
|
1039
1039
|
},
|
|
1040
1040
|
"security-events": {
|
|
1041
1041
|
allowedValues: ["read", "none"],
|
|
1042
|
-
description: ( localize(
|
|
1042
|
+
description: ( localize(8034, "Access to security-related events"))
|
|
1043
1043
|
},
|
|
1044
1044
|
"workflows": {
|
|
1045
1045
|
allowedValues: ["write", "none"],
|
|
1046
|
-
description: ( localize(
|
|
1046
|
+
description: ( localize(8035, "Access to modify workflow files"))
|
|
1047
1047
|
}
|
|
1048
1048
|
};
|
|
1049
1049
|
function isTrueOrFalse(value) {
|
|
@@ -1131,103 +1131,103 @@ function isNonRecommendedAttribute(attributeName) {
|
|
|
1131
1131
|
}
|
|
1132
1132
|
const knownClaudeTools = [{
|
|
1133
1133
|
name: "Bash",
|
|
1134
|
-
description: ( localize(
|
|
1134
|
+
description: ( localize(8036, "Execute shell commands")),
|
|
1135
1135
|
toolEquivalent: [SpecedToolAliases.execute]
|
|
1136
1136
|
}, {
|
|
1137
1137
|
name: "Edit",
|
|
1138
|
-
description: ( localize(
|
|
1138
|
+
description: ( localize(8037, "Make targeted file edits")),
|
|
1139
1139
|
toolEquivalent: ["edit/editNotebook", "edit/editFiles"]
|
|
1140
1140
|
}, {
|
|
1141
1141
|
name: "Glob",
|
|
1142
|
-
description: ( localize(
|
|
1142
|
+
description: ( localize(8038, "Find files by pattern")),
|
|
1143
1143
|
toolEquivalent: ["search/fileSearch"]
|
|
1144
1144
|
}, {
|
|
1145
1145
|
name: "Grep",
|
|
1146
|
-
description: ( localize(
|
|
1146
|
+
description: ( localize(8039, "Search file contents with regex")),
|
|
1147
1147
|
toolEquivalent: ["search/textSearch"]
|
|
1148
1148
|
}, {
|
|
1149
1149
|
name: "Read",
|
|
1150
|
-
description: ( localize(
|
|
1150
|
+
description: ( localize(8040, "Read file contents")),
|
|
1151
1151
|
toolEquivalent: ["read/readFile", "read/getNotebookSummary"]
|
|
1152
1152
|
}, {
|
|
1153
1153
|
name: "Write",
|
|
1154
|
-
description: ( localize(
|
|
1154
|
+
description: ( localize(8041, "Create/overwrite files")),
|
|
1155
1155
|
toolEquivalent: ["edit/createDirectory", "edit/createFile", "edit/createJupyterNotebook"]
|
|
1156
1156
|
}, {
|
|
1157
1157
|
name: "WebFetch",
|
|
1158
|
-
description: ( localize(
|
|
1158
|
+
description: ( localize(8042, "Fetch URL content")),
|
|
1159
1159
|
toolEquivalent: [SpecedToolAliases.web]
|
|
1160
1160
|
}, {
|
|
1161
1161
|
name: "WebSearch",
|
|
1162
|
-
description: ( localize(
|
|
1162
|
+
description: ( localize(8043, "Perform web searches")),
|
|
1163
1163
|
toolEquivalent: [SpecedToolAliases.web]
|
|
1164
1164
|
}, {
|
|
1165
1165
|
name: "Task",
|
|
1166
|
-
description: ( localize(
|
|
1166
|
+
description: ( localize(8044, "Run subagents for complex tasks")),
|
|
1167
1167
|
toolEquivalent: [SpecedToolAliases.agent]
|
|
1168
1168
|
}, {
|
|
1169
1169
|
name: "Skill",
|
|
1170
|
-
description: ( localize(
|
|
1170
|
+
description: ( localize(8045, "Execute skills")),
|
|
1171
1171
|
toolEquivalent: []
|
|
1172
1172
|
}, {
|
|
1173
1173
|
name: "LSP",
|
|
1174
|
-
description: ( localize(
|
|
1174
|
+
description: ( localize(8046, "Code intelligence (requires plugin)")),
|
|
1175
1175
|
toolEquivalent: []
|
|
1176
1176
|
}, {
|
|
1177
1177
|
name: "NotebookEdit",
|
|
1178
|
-
description: ( localize(
|
|
1178
|
+
description: ( localize(8047, "Modify Jupyter notebooks")),
|
|
1179
1179
|
toolEquivalent: ["edit/editNotebook"]
|
|
1180
1180
|
}, {
|
|
1181
1181
|
name: "AskUserQuestion",
|
|
1182
|
-
description: ( localize(
|
|
1182
|
+
description: ( localize(8048, "Ask multiple-choice questions")),
|
|
1183
1183
|
toolEquivalent: ["vscode/askQuestions"]
|
|
1184
1184
|
}, {
|
|
1185
1185
|
name: "MCPSearch",
|
|
1186
|
-
description: ( localize(
|
|
1186
|
+
description: ( localize(8049, "Searches for MCP tools when tool search is enabled")),
|
|
1187
1187
|
toolEquivalent: []
|
|
1188
1188
|
}];
|
|
1189
1189
|
const knownClaudeModels = [{
|
|
1190
1190
|
name: "sonnet",
|
|
1191
|
-
description: ( localize(
|
|
1191
|
+
description: ( localize(8050, "Latest Claude Sonnet")),
|
|
1192
1192
|
modelEquivalent: "Claude Sonnet 4.5 (copilot)"
|
|
1193
1193
|
}, {
|
|
1194
1194
|
name: "opus",
|
|
1195
|
-
description: ( localize(
|
|
1195
|
+
description: ( localize(8051, "Latest Claude Opus")),
|
|
1196
1196
|
modelEquivalent: "Claude Opus 4.6 (copilot)"
|
|
1197
1197
|
}, {
|
|
1198
1198
|
name: "haiku",
|
|
1199
|
-
description: ( localize(
|
|
1199
|
+
description: ( localize(8052, "Latest Claude Haiku, fast for simple tasks")),
|
|
1200
1200
|
modelEquivalent: "Claude Haiku 4.5 (copilot)"
|
|
1201
1201
|
}, {
|
|
1202
1202
|
name: "inherit",
|
|
1203
|
-
description: ( localize(
|
|
1203
|
+
description: ( localize(8053, "Inherit model from parent agent or prompt")),
|
|
1204
1204
|
modelEquivalent: undefined
|
|
1205
1205
|
}];
|
|
1206
1206
|
const claudeAgentAttributes = {
|
|
1207
1207
|
"name": {
|
|
1208
1208
|
type: "scalar",
|
|
1209
|
-
description: ( localize(
|
|
1209
|
+
description: ( localize(8054, "Unique identifier using lowercase letters and hyphens (required)"))
|
|
1210
1210
|
},
|
|
1211
1211
|
"description": {
|
|
1212
1212
|
type: "scalar",
|
|
1213
|
-
description: ( localize(
|
|
1213
|
+
description: ( localize(8055, "When to delegate to this subagent (required)"))
|
|
1214
1214
|
},
|
|
1215
1215
|
"tools": {
|
|
1216
1216
|
type: "sequence",
|
|
1217
|
-
description: ( localize(
|
|
1217
|
+
description: ( localize(8056, "Array of tools the subagent can use. Inherits all tools if omitted")),
|
|
1218
1218
|
defaults: ["Read, Edit, Bash"],
|
|
1219
1219
|
items: knownClaudeTools
|
|
1220
1220
|
},
|
|
1221
1221
|
"disallowedTools": {
|
|
1222
1222
|
type: "sequence",
|
|
1223
|
-
description: ( localize(
|
|
1223
|
+
description: ( localize(8057, "Tools to deny, removed from inherited or specified list")),
|
|
1224
1224
|
defaults: ["Write, Edit, Bash"],
|
|
1225
1225
|
items: knownClaudeTools
|
|
1226
1226
|
},
|
|
1227
1227
|
"model": {
|
|
1228
1228
|
type: "scalar",
|
|
1229
1229
|
description: ( localize(
|
|
1230
|
-
|
|
1230
|
+
8058,
|
|
1231
1231
|
"Model to use: sonnet, opus, haiku, or inherit. Defaults to inherit."
|
|
1232
1232
|
)),
|
|
1233
1233
|
defaults: ["sonnet", "opus", "haiku", "inherit"],
|
|
@@ -1236,77 +1236,77 @@ const claudeAgentAttributes = {
|
|
|
1236
1236
|
"permissionMode": {
|
|
1237
1237
|
type: "scalar",
|
|
1238
1238
|
description: ( localize(
|
|
1239
|
-
|
|
1239
|
+
8059,
|
|
1240
1240
|
"Permission mode: default, acceptEdits, dontAsk, bypassPermissions, or plan."
|
|
1241
1241
|
)),
|
|
1242
1242
|
defaults: ["default", "acceptEdits", "dontAsk", "bypassPermissions", "plan"],
|
|
1243
1243
|
enums: [{
|
|
1244
1244
|
name: "default",
|
|
1245
1245
|
description: ( localize(
|
|
1246
|
-
|
|
1246
|
+
8060,
|
|
1247
1247
|
"Standard behavior: prompts for permission on first use of each tool."
|
|
1248
1248
|
))
|
|
1249
1249
|
}, {
|
|
1250
1250
|
name: "acceptEdits",
|
|
1251
|
-
description: ( localize(
|
|
1251
|
+
description: ( localize(8061, "Automatically accepts file edit permissions for the session."))
|
|
1252
1252
|
}, {
|
|
1253
1253
|
name: "plan",
|
|
1254
1254
|
description: ( localize(
|
|
1255
|
-
|
|
1255
|
+
8062,
|
|
1256
1256
|
"Plan Mode: Claude can analyze but not modify files or execute commands."
|
|
1257
1257
|
))
|
|
1258
1258
|
}, {
|
|
1259
1259
|
name: "delegate",
|
|
1260
1260
|
description: ( localize(
|
|
1261
|
-
|
|
1261
|
+
8063,
|
|
1262
1262
|
"Coordination-only mode for agent team leads. Only available when an agent team is active."
|
|
1263
1263
|
))
|
|
1264
1264
|
}, {
|
|
1265
1265
|
name: "dontAsk",
|
|
1266
1266
|
description: ( localize(
|
|
1267
|
-
|
|
1267
|
+
8064,
|
|
1268
1268
|
"Auto-denies tools unless pre-approved via /permissions or permissions.allow rules."
|
|
1269
1269
|
))
|
|
1270
1270
|
}, {
|
|
1271
1271
|
name: "bypassPermissions",
|
|
1272
1272
|
description: ( localize(
|
|
1273
|
-
|
|
1273
|
+
8065,
|
|
1274
1274
|
"Skips all permission prompts (requires safe environment like containers)."
|
|
1275
1275
|
))
|
|
1276
1276
|
}]
|
|
1277
1277
|
},
|
|
1278
1278
|
"skills": {
|
|
1279
1279
|
type: "sequence",
|
|
1280
|
-
description: ( localize(
|
|
1280
|
+
description: ( localize(8066, "Skills to load into the subagent's context at startup."))
|
|
1281
1281
|
},
|
|
1282
1282
|
"mcpServers": {
|
|
1283
1283
|
type: "sequence",
|
|
1284
|
-
description: ( localize(
|
|
1284
|
+
description: ( localize(8067, "MCP servers available to this subagent."))
|
|
1285
1285
|
},
|
|
1286
1286
|
"hooks": {
|
|
1287
1287
|
type: "object",
|
|
1288
|
-
description: ( localize(
|
|
1288
|
+
description: ( localize(8068, "Lifecycle hooks scoped to this subagent."))
|
|
1289
1289
|
},
|
|
1290
1290
|
"memory": {
|
|
1291
1291
|
type: "scalar",
|
|
1292
1292
|
description: ( localize(
|
|
1293
|
-
|
|
1293
|
+
8069,
|
|
1294
1294
|
"Persistent memory scope: user, project, or local. Enables cross-session learning."
|
|
1295
1295
|
)),
|
|
1296
1296
|
defaults: ["user", "project", "local"],
|
|
1297
1297
|
enums: [{
|
|
1298
1298
|
name: "user",
|
|
1299
|
-
description: ( localize(
|
|
1299
|
+
description: ( localize(8070, "Remember learnings across all projects."))
|
|
1300
1300
|
}, {
|
|
1301
1301
|
name: "project",
|
|
1302
1302
|
description: ( localize(
|
|
1303
|
-
|
|
1303
|
+
8071,
|
|
1304
1304
|
"The subagent's knowledge is project-specific and shareable via version control."
|
|
1305
1305
|
))
|
|
1306
1306
|
}, {
|
|
1307
1307
|
name: "local",
|
|
1308
1308
|
description: ( localize(
|
|
1309
|
-
|
|
1309
|
+
8072,
|
|
1310
1310
|
"The subagent's knowledge is project-specific but should not be checked into version control."
|
|
1311
1311
|
))
|
|
1312
1312
|
}]
|
|
@@ -1316,14 +1316,14 @@ const claudeRulesAttributes = {
|
|
|
1316
1316
|
"description": {
|
|
1317
1317
|
type: "scalar",
|
|
1318
1318
|
description: ( localize(
|
|
1319
|
-
|
|
1319
|
+
8073,
|
|
1320
1320
|
"A description of what this rule covers, used to provide context about when it applies."
|
|
1321
1321
|
))
|
|
1322
1322
|
},
|
|
1323
1323
|
"paths": {
|
|
1324
1324
|
type: "sequence",
|
|
1325
1325
|
description: ( localize(
|
|
1326
|
-
|
|
1326
|
+
8074,
|
|
1327
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/**']`"
|
|
1328
1328
|
))
|
|
1329
1329
|
}
|