@codingame/monaco-vscode-chat-service-override 37.1.0 → 37.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +15 -5
- package/package.json +5 -5
- package/vscode/src/vs/platform/agentHost/browser/agentHostEnablementService.js +1 -1
- package/vscode/src/vs/workbench/api/browser/mainThreadChatAgents2.d.ts +104 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatAgents2.js +827 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatCodeMapper.d.ts +15 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatCodeMapper.js +71 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatContext.d.ts +16 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatContext.js +95 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatDebug.d.ts +22 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatDebug.js +286 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatInputNotification.d.ts +10 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatInputNotification.js +38 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatQuota.d.ts +9 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatQuota.js +22 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatSessions.d.ts +130 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatSessions.js +907 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatStatus.d.ts +10 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadChatStatus.js +28 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModelTools.d.ts +27 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModelTools.js +167 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModels.d.ts +46 -0
- package/vscode/src/vs/workbench/api/browser/mainThreadLanguageModels.js +356 -0
- package/vscode/src/vs/workbench/contrib/agentsVoice/browser/agentsVoiceWidgetBinding.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatOpenAgentDebugPanelAction.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/chatPluginActions.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/actions/exportAgentHostDebugLogsAction.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginEditor.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginEditor/agentPluginItems.d.ts +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginRepositoryService.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginRepositoryService.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/agentPluginsView.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentCustomizationContentExpander.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentCustomizationItemProvider.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentCustomizationSyncProvider.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostActiveClientService.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostExistingSessionHarnessPickerEnablement.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostLocalCustomizations.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostPermissionUiContribution.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostPromptCacheNotification.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSessionHandler.js +5 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSettings.contribution.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentHostSignedOutModelsNotification.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/agentSessionSettings.contribution.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentHost/openSessionLinkOpener.contribution.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsActions.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsActions.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsPicker.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsPicker.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsService.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionActions.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionActions.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentSessionProjectionService.d.ts +1 -1
- 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 +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/agentSessions/localAgentSessionsController.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemSource.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemSource.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationItemsModel.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationManagementEditor.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/aiCustomizationPresentation.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationHarnessService.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationHarnessService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationMigration.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/customizationMigrationCategories.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/embeddedAgentPluginDetail.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/mcpListWidget.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/pluginListWidget.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/aiCustomization/promptsServiceCustomizationItemProvider.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/attachments/chatAttachmentResolveService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chat.shared.contribution.js +12 -12
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/agentHostChatDebugProvider.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/agentHostChatDebugProvider.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatCustomizationDiscoveryRenderer.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugCacheExplorerView.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugDetailPanel.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventDetailRenderer.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventList.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugEventList.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugFlowGraph.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHookContentRenderer.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugHookContentRenderer.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugLogsView.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugMessageContentRenderer.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugModelTurnContentRenderer.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugOverviewView.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatDebug/chatDebugToolCallContentRenderer.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/chatEditingModifiedNotebookEntry.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/notebook/chatEditingModifiedNotebookSnapshot.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatEditing/notebook/chatEditingNotebookCellEntry.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatImageCarouselService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatPromoNotification.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatQuotaNotification.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/chatSessionDescription.d.ts +2 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSessions/chatSessionDescription.js +57 -0
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupContributions.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupController.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupController.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupGrowthSession.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupProviders.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatSetup/chatSetupRunner.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/chatTipService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/expNotification/chatExpNotificationConfig.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/expNotification/chatExpNotificationConfig.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/expNotification/chatExpNotificationContribution.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginInstallService.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginInstallService.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginSources.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginSources.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/pluginUrlHandler.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookActions.js +3 -3
- package/vscode/src/vs/workbench/contrib/chat/browser/promptSyntax/hookUtils.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/promptsDebugContribution.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/languageModelToolsService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/renameTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/toolHelpers.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/tools/usagesTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/agentHostInputCompletions.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCommandArgumentHint.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputCompletions.js +2 -2
- 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 +10 -2
- package/vscode/src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputReferenceDecorations.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/browser/widgetHosts/viewPane/chatViewPane.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/common/chatDebugEvents.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/common/chatDebugService.d.ts +253 -0
- package/vscode/src/vs/workbench/contrib/chat/common/chatDebugService.js +20 -0
- package/vscode/src/vs/workbench/contrib/chat/common/chatDebugServiceImpl.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/common/chatDebugServiceImpl.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/common/chatService/chatServiceImpl.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/common/customizationHarnessService.d.ts +300 -0
- package/vscode/src/vs/workbench/contrib/chat/common/customizationHarnessService.js +272 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginEnablement.d.ts +25 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginEnablement.js +178 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.d.ts +78 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginService.js +51 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.d.ts +2 -2
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/agentPluginServiceImpl.js +2 -2
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/fileBackedInstalledPluginsStore.d.ts +67 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/fileBackedInstalledPluginsStore.js +195 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/marketplaceReference.d.ts +67 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/marketplaceReference.js +294 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/pluginMarketplaceService.d.ts +212 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/pluginMarketplaceService.js +955 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/strictKnownMarketplaces.d.ts +31 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/strictKnownMarketplaces.js +122 -0
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/workspacePluginSettingsService.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/chat/common/plugins/workspacePluginSettingsService.js +1 -1
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/computeAutomaticInstructions.d.ts +65 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/computeAutomaticInstructions.js +698 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookClaudeCompat.d.ts +50 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookClaudeCompat.js +78 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCompatibility.d.ts +77 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCompatibility.js +120 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCopilotCliCompat.d.ts +10 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/hookCopilotCliCompat.js +23 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/extensionPromptFileService.d.ts +92 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/extensionPromptFileService.js +335 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.d.ts +235 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/service/promptsServiceImpl.js +1673 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.d.ts +202 -0
- package/vscode/src/vs/workbench/contrib/chat/common/promptSyntax/utils/promptFilesLocator.js +872 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/confirmationTool.d.ts +36 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/confirmationTool.js +239 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/editFileTool.d.ts +21 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/editFileTool.js +143 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/manageTodoListTool.d.ts +24 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/manageTodoListTool.js +298 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/reviewPlanTool.d.ts +25 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/reviewPlanTool.js +177 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/runSubagentTool.d.ts +73 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/runSubagentTool.js +577 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/setArtifactRulesTool.d.ts +11 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/setArtifactRulesTool.js +90 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/setArtifactsTool.d.ts +16 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/setArtifactsTool.js +130 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/taskCompleteTool.d.ts +12 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/taskCompleteTool.js +53 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/toolHelpers.d.ts +5 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/toolHelpers.js +12 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/tools.d.ts +10 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/builtinTools/tools.js +91 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/languageModelToolsContribution.d.ts +38 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/languageModelToolsContribution.js +518 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/languageModelToolsParametersSchema.d.ts +6 -0
- package/vscode/src/vs/workbench/contrib/chat/common/tools/languageModelToolsParametersSchema.js +231 -0
- package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/cellChatActions.js +1 -1
- package/vscode/src/vs/workbench/contrib/notebook/browser/controller/chat/notebook.chat.contribution.js +4 -4
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalLastCommandTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalOutputTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/getTerminalSelectionTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/killTerminalTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalConfirmationTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/runInTerminalTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/sendToTerminalTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/createAndRunTaskTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/getTaskOutputTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/task/runTaskTool.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCache.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCache.js +1 -1
- package/vscode/src/vs/workbench/contrib/terminalContrib/chatAgentTools/browser/tools/terminalOutputCompressor.js +1 -1
|
@@ -0,0 +1,872 @@
|
|
|
1
|
+
|
|
2
|
+
import { __decorate, __param } from '@codingame/monaco-vscode-api/external/tslib/tslib.es6';
|
|
3
|
+
import { URI } from '@codingame/monaco-vscode-api/vscode/vs/base/common/uri';
|
|
4
|
+
import { isAbsolute } from '@codingame/monaco-vscode-api/vscode/vs/base/common/path';
|
|
5
|
+
import { ResourceSet } from '@codingame/monaco-vscode-api/vscode/vs/base/common/map';
|
|
6
|
+
import { localize } from '@codingame/monaco-vscode-api/vscode/vs/nls';
|
|
7
|
+
import { FileOperation, FileOperationError, FileOperationResult } from '@codingame/monaco-vscode-api/vscode/vs/platform/files/common/files';
|
|
8
|
+
import { IFileService } from '@codingame/monaco-vscode-api/vscode/vs/platform/files/common/files.service';
|
|
9
|
+
import { PromptsConfig, getPromptFileLocationsConfigKey, isTildePath } from '@codingame/monaco-vscode-katex-common/vscode/vs/workbench/contrib/chat/common/promptSyntax/config/config';
|
|
10
|
+
import { joinPath, dirname, isEqual, isEqualOrParent, basename } from '@codingame/monaco-vscode-api/vscode/vs/base/common/resources';
|
|
11
|
+
import { IWorkspaceContextService } from '@codingame/monaco-vscode-api/vscode/vs/platform/workspace/common/workspace.service';
|
|
12
|
+
import { IConfigurationService } from '@codingame/monaco-vscode-api/vscode/vs/platform/configuration/common/configuration.service';
|
|
13
|
+
import { getPromptFileDefaultLocations, getPromptFileType, CLAUDE_CONFIG_FOLDER, GITHUB_CONFIG_FOLDER, COPILOT_CONFIG_FOLDER, getPromptFileExtension, LEGACY_MODE_FILE_EXTENSION, AGENTS_SOURCE_FOLDER, getCleanPromptName, AGENT_FILE_EXTENSION, SKILL_FILENAME } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/config/promptFileLocations';
|
|
14
|
+
import { PromptFileSource, PromptsType } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/promptTypes';
|
|
15
|
+
import { IWorkbenchEnvironmentService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/environment/common/environmentService.service';
|
|
16
|
+
import { Schemas } from '@codingame/monaco-vscode-api/vscode/vs/base/common/network';
|
|
17
|
+
import { getExcludes, QueryType } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/search/common/search';
|
|
18
|
+
import { ISearchService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/search/common/search.service';
|
|
19
|
+
import { CancellationTokenSource } from '@codingame/monaco-vscode-api/vscode/vs/base/common/cancellation';
|
|
20
|
+
import { isCancellationError } from '@codingame/monaco-vscode-api/vscode/vs/base/common/errors';
|
|
21
|
+
import { PromptsStorage, AgentInstructionFileType } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/common/promptSyntax/service/promptsService';
|
|
22
|
+
import { IUserDataProfileService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/userDataProfile/common/userDataProfile.service';
|
|
23
|
+
import { Event, Emitter } from '@codingame/monaco-vscode-api/vscode/vs/base/common/event';
|
|
24
|
+
import { DisposableStore, toDisposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
|
|
25
|
+
import { ILogService } from '@codingame/monaco-vscode-api/vscode/vs/platform/log/common/log.service';
|
|
26
|
+
import { IPathService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/path/common/pathService.service';
|
|
27
|
+
import { equalsIgnoreCase } from '@codingame/monaco-vscode-api/vscode/vs/base/common/strings';
|
|
28
|
+
import { IWorkspaceTrustManagementService } from '@codingame/monaco-vscode-api/vscode/vs/platform/workspace/common/workspaceTrust.service';
|
|
29
|
+
import { AGENT_HOST_SCHEME } from '@codingame/monaco-vscode-api/vscode/vs/platform/agentHost/common/agentHostUri';
|
|
30
|
+
|
|
31
|
+
const MAX_INSTRUCTIONS_RECURSION_DEPTH = 5;
|
|
32
|
+
let PromptFilesLocator = class PromptFilesLocator {
|
|
33
|
+
constructor(
|
|
34
|
+
fileService,
|
|
35
|
+
configService,
|
|
36
|
+
workspaceService,
|
|
37
|
+
environmentService,
|
|
38
|
+
searchService,
|
|
39
|
+
userDataService,
|
|
40
|
+
logService,
|
|
41
|
+
pathService,
|
|
42
|
+
workspaceTrustManagementService
|
|
43
|
+
) {
|
|
44
|
+
this.fileService = fileService;
|
|
45
|
+
this.configService = configService;
|
|
46
|
+
this.workspaceService = workspaceService;
|
|
47
|
+
this.environmentService = environmentService;
|
|
48
|
+
this.searchService = searchService;
|
|
49
|
+
this.userDataService = userDataService;
|
|
50
|
+
this.logService = logService;
|
|
51
|
+
this.pathService = pathService;
|
|
52
|
+
this.workspaceTrustManagementService = workspaceTrustManagementService;
|
|
53
|
+
const userDataPromptsHome = this.userDataService.currentProfile.promptsHome;
|
|
54
|
+
this.userDataFolder = {
|
|
55
|
+
uri: userDataPromptsHome,
|
|
56
|
+
searchRoot: userDataPromptsHome,
|
|
57
|
+
filePattern: undefined,
|
|
58
|
+
source: PromptFileSource.UserData,
|
|
59
|
+
storage: PromptsStorage.user,
|
|
60
|
+
displayPath: ( localize(10857, "User Data")),
|
|
61
|
+
isDefault: true
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
getWorkspaceFolders() {
|
|
65
|
+
return this.workspaceService.getWorkspace().folders.filter(f => f.uri.scheme !== AGENT_HOST_SCHEME);
|
|
66
|
+
}
|
|
67
|
+
getWorkspaceFolder(resource) {
|
|
68
|
+
return this.workspaceService.getWorkspaceFolder(resource) ?? undefined;
|
|
69
|
+
}
|
|
70
|
+
onDidChangeWorkspaceFolders() {
|
|
71
|
+
return ( Event.map(this.workspaceService.onDidChangeWorkspaceFolders, () => undefined));
|
|
72
|
+
}
|
|
73
|
+
getPromptSourceFolders(type) {
|
|
74
|
+
return PromptsConfig.promptSourceFolders(this.configService, type);
|
|
75
|
+
}
|
|
76
|
+
getDefaultSourceFolders(type) {
|
|
77
|
+
return getPromptFileDefaultLocations(type);
|
|
78
|
+
}
|
|
79
|
+
async getWorkspaceFolderRoots(includeParents, logger, root) {
|
|
80
|
+
const workspaceFolders = root ? root.scheme === AGENT_HOST_SCHEME ? [] : [{
|
|
81
|
+
uri: root
|
|
82
|
+
}] : this.getWorkspaceFolders();
|
|
83
|
+
if (includeParents) {
|
|
84
|
+
const roots = ( new ResourceSet());
|
|
85
|
+
const userHome = await this.pathService.userHome();
|
|
86
|
+
for (const workspaceFolder of workspaceFolders) {
|
|
87
|
+
roots.add(workspaceFolder.uri);
|
|
88
|
+
const parents = await this.findParentRepoFolders(workspaceFolder.uri, userHome, roots, logger);
|
|
89
|
+
for (const parent of parents) {
|
|
90
|
+
roots.add(parent);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return [...roots];
|
|
94
|
+
}
|
|
95
|
+
return ( workspaceFolders.map(f => f.uri));
|
|
96
|
+
}
|
|
97
|
+
async findParentRepoFolders(folderUri, userHome, seen, logger) {
|
|
98
|
+
const candidates = [];
|
|
99
|
+
let current = folderUri;
|
|
100
|
+
while (true) {
|
|
101
|
+
try {
|
|
102
|
+
const gitStat = await this.fileService.stat(joinPath(current, ".git")).then(stat => stat, () => undefined);
|
|
103
|
+
const isRepoRoot = gitStat?.isDirectory === true;
|
|
104
|
+
if (isRepoRoot) {
|
|
105
|
+
if ((await this.workspaceTrustManagementService.getUriTrustInfo(current)).trusted) {
|
|
106
|
+
candidates.push(current);
|
|
107
|
+
return candidates;
|
|
108
|
+
}
|
|
109
|
+
logger?.logInfo(`Repository root found at ${( current.toString())}, but it is not trusted. Skipping parent folder inclusion for this workspace folder.`);
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
} catch (e) {
|
|
113
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
114
|
+
logger?.logInfo(`No repository root found for folder ${( folderUri.toString())}. Error accessing ${joinPath(current, ".git")}: ${msg}.`);
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
candidates.push(current);
|
|
118
|
+
const parent = dirname(current);
|
|
119
|
+
if (isEqual(current, parent) || current.path === "/" || isEqual(userHome, parent) || ( seen.has(parent))) {
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
current = parent;
|
|
123
|
+
}
|
|
124
|
+
logger?.logInfo(`No repository root found for folder ${( folderUri.toString())}.`);
|
|
125
|
+
return [];
|
|
126
|
+
}
|
|
127
|
+
async listFiles(type, storage, token, root) {
|
|
128
|
+
const files = await this.listFilesWithSource(type, storage, token, root);
|
|
129
|
+
return ( files.map(file => file.uri));
|
|
130
|
+
}
|
|
131
|
+
async listFilesWithSource(type, storage, token, root) {
|
|
132
|
+
if (storage !== PromptsStorage.user && storage !== PromptsStorage.local) {
|
|
133
|
+
throw ( new Error(`Unsupported prompt file storage: ${storage}`));
|
|
134
|
+
}
|
|
135
|
+
const configuredLocations = this.getPromptSourceFolders(type);
|
|
136
|
+
const localRoot = storage === PromptsStorage.local ? root : undefined;
|
|
137
|
+
const absoluteLocations = await this.toAbsoluteLocations(
|
|
138
|
+
type,
|
|
139
|
+
configuredLocations.filter(location => location.storage === storage),
|
|
140
|
+
undefined,
|
|
141
|
+
localRoot
|
|
142
|
+
);
|
|
143
|
+
if (storage === PromptsStorage.user && this.isUserDataPromptType(type)) {
|
|
144
|
+
const localLocations = await this.toAbsoluteLocations(
|
|
145
|
+
type,
|
|
146
|
+
configuredLocations.filter(location => location.storage === PromptsStorage.local)
|
|
147
|
+
);
|
|
148
|
+
absoluteLocations.push(
|
|
149
|
+
...localLocations.filter(location => this.sourceFolderOverlapsUserData(type, location.searchRoot))
|
|
150
|
+
);
|
|
151
|
+
absoluteLocations.push(this.userDataFolder);
|
|
152
|
+
}
|
|
153
|
+
const paths = ( new ResourceSet());
|
|
154
|
+
const result = [];
|
|
155
|
+
for (const {
|
|
156
|
+
searchRoot,
|
|
157
|
+
filePattern,
|
|
158
|
+
source,
|
|
159
|
+
storage: sourceStorage
|
|
160
|
+
} of absoluteLocations) {
|
|
161
|
+
const files = (filePattern === undefined) ?
|
|
162
|
+
await this.resolveFilesAtLocation(searchRoot, type, token, 0, localRoot) : await this.searchFilesInLocation(searchRoot, filePattern, token);
|
|
163
|
+
for (const file of files) {
|
|
164
|
+
if (getPromptFileType(file) !== type || ( paths.has(file))) {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
const isUserDataFile = this.isUserDataPromptFile(type, file);
|
|
168
|
+
if ((isUserDataFile && storage !== PromptsStorage.user) || (!isUserDataFile && sourceStorage !== storage)) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
paths.add(file);
|
|
172
|
+
result.push({
|
|
173
|
+
uri: file,
|
|
174
|
+
source: isUserDataFile ? PromptFileSource.UserData : source
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
if (token.isCancellationRequested) {
|
|
178
|
+
return [];
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
isUserDataPromptType(type) {
|
|
184
|
+
return type === PromptsType.agent || type === PromptsType.instructions || type === PromptsType.prompt;
|
|
185
|
+
}
|
|
186
|
+
isUserDataPromptFile(type, resource) {
|
|
187
|
+
return this.isUserDataPromptType(type) && isEqualOrParent(resource, this.userDataFolder.uri);
|
|
188
|
+
}
|
|
189
|
+
sourceFolderOverlapsUserData(type, searchRoot) {
|
|
190
|
+
return this.isUserDataPromptType(type) && (isEqualOrParent(searchRoot, this.userDataFolder.uri) || isEqualOrParent(this.userDataFolder.uri, searchRoot));
|
|
191
|
+
}
|
|
192
|
+
createFilesUpdatedEvent(type) {
|
|
193
|
+
const disposables = ( new DisposableStore());
|
|
194
|
+
const eventEmitter = disposables.add(( new Emitter()));
|
|
195
|
+
const token = disposables.add(( new CancellationTokenSource())).token;
|
|
196
|
+
const externalFolderWatchers = disposables.add(( new DisposableStore()));
|
|
197
|
+
const key = getPromptFileLocationsConfigKey(type);
|
|
198
|
+
const userDataFolder = this.userDataService.currentProfile.promptsHome;
|
|
199
|
+
let parentFolders = [];
|
|
200
|
+
const updateExternalFolderWatchers = () => {
|
|
201
|
+
externalFolderWatchers.clear();
|
|
202
|
+
for (const folder of parentFolders) {
|
|
203
|
+
if (!this.getWorkspaceFolder(folder.searchRoot)) {
|
|
204
|
+
const recursive = folder.filePattern !== undefined || type === PromptsType.instructions;
|
|
205
|
+
externalFolderWatchers.add(this.fileService.watch(folder.searchRoot, {
|
|
206
|
+
recursive,
|
|
207
|
+
excludes: []
|
|
208
|
+
}));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
const update = async () => {
|
|
213
|
+
try {
|
|
214
|
+
const configuredLocations = this.getPromptSourceFolders(type);
|
|
215
|
+
parentFolders = await this.toAbsoluteLocations(type, configuredLocations, undefined);
|
|
216
|
+
if (token.isCancellationRequested) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
updateExternalFolderWatchers();
|
|
220
|
+
} catch (err) {
|
|
221
|
+
this.logService.error(`Error updating prompt file watchers after config change:`, err);
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
disposables.add(this.configService.onDidChangeConfiguration(e => {
|
|
225
|
+
if (e.affectsConfiguration(key) || e.affectsConfiguration(PromptsConfig.USE_CUSTOMIZATIONS_IN_PARENT_REPOS)) {
|
|
226
|
+
void update();
|
|
227
|
+
eventEmitter.fire();
|
|
228
|
+
}
|
|
229
|
+
}));
|
|
230
|
+
disposables.add(this.onDidChangeWorkspaceFolders()(() => {
|
|
231
|
+
void update();
|
|
232
|
+
eventEmitter.fire();
|
|
233
|
+
}));
|
|
234
|
+
disposables.add(this.workspaceTrustManagementService.onDidChangeTrustedFolders(() => {
|
|
235
|
+
void update();
|
|
236
|
+
eventEmitter.fire();
|
|
237
|
+
}));
|
|
238
|
+
disposables.add(this.fileService.onDidFilesChange(e => {
|
|
239
|
+
if (e.affects(userDataFolder)) {
|
|
240
|
+
eventEmitter.fire();
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (( parentFolders.some(folder => e.affects(folder.searchRoot)))) {
|
|
244
|
+
eventEmitter.fire();
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
}));
|
|
248
|
+
disposables.add(this.fileService.watch(userDataFolder));
|
|
249
|
+
void update();
|
|
250
|
+
return {
|
|
251
|
+
event: eventEmitter.event,
|
|
252
|
+
dispose: () => disposables.dispose()
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
createAgentInstructionsUpdatedEvent() {
|
|
256
|
+
const disposables = ( new DisposableStore());
|
|
257
|
+
const eventEmitter = disposables.add(( new Emitter()));
|
|
258
|
+
const cts = ( new CancellationTokenSource());
|
|
259
|
+
disposables.add(toDisposable(() => cts.dispose(true)));
|
|
260
|
+
const token = cts.token;
|
|
261
|
+
const watchers = disposables.add(( new DisposableStore()));
|
|
262
|
+
const watchedRoots = ( new ResourceSet());
|
|
263
|
+
const addWatch = resource => {
|
|
264
|
+
if (token.isCancellationRequested) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
if (( watchedRoots.has(resource))) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
watchedRoots.add(resource);
|
|
271
|
+
watchers.add(this.fileService.watch(resource));
|
|
272
|
+
};
|
|
273
|
+
const updateWatchers = async () => {
|
|
274
|
+
watchers.clear();
|
|
275
|
+
watchedRoots.clear();
|
|
276
|
+
const watchWorkspaceRoots = this.configService.getValue(PromptsConfig.USE_AGENT_MD) || this.configService.getValue(PromptsConfig.USE_CLAUDE_MD);
|
|
277
|
+
const watchClaudeFolders = this.configService.getValue(PromptsConfig.USE_CLAUDE_MD);
|
|
278
|
+
const watchCopilotFolders = this.configService.getValue(PromptsConfig.USE_COPILOT_INSTRUCTION_FILES);
|
|
279
|
+
const includeParents = this.configService.getValue(PromptsConfig.USE_CUSTOMIZATIONS_IN_PARENT_REPOS) === true;
|
|
280
|
+
const workspaceRoots = await this.getWorkspaceFolderRoots(includeParents);
|
|
281
|
+
if (token.isCancellationRequested) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
const userHome = await this.pathService.userHome();
|
|
285
|
+
if (token.isCancellationRequested) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
for (const workspaceRoot of workspaceRoots) {
|
|
289
|
+
if (watchWorkspaceRoots) {
|
|
290
|
+
addWatch(workspaceRoot);
|
|
291
|
+
}
|
|
292
|
+
if (watchClaudeFolders) {
|
|
293
|
+
addWatch(joinPath(workspaceRoot, CLAUDE_CONFIG_FOLDER));
|
|
294
|
+
}
|
|
295
|
+
if (watchCopilotFolders) {
|
|
296
|
+
addWatch(joinPath(workspaceRoot, GITHUB_CONFIG_FOLDER));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (watchClaudeFolders) {
|
|
300
|
+
addWatch(joinPath(userHome, CLAUDE_CONFIG_FOLDER));
|
|
301
|
+
}
|
|
302
|
+
if (watchCopilotFolders) {
|
|
303
|
+
addWatch(joinPath(userHome, COPILOT_CONFIG_FOLDER));
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
const refresh = () => {
|
|
307
|
+
void updateWatchers();
|
|
308
|
+
eventEmitter.fire();
|
|
309
|
+
};
|
|
310
|
+
disposables.add(this.configService.onDidChangeConfiguration(e => {
|
|
311
|
+
if (e.affectsConfiguration(PromptsConfig.USE_AGENT_MD) || e.affectsConfiguration(PromptsConfig.USE_CLAUDE_MD) || e.affectsConfiguration(PromptsConfig.USE_COPILOT_INSTRUCTION_FILES) || e.affectsConfiguration(PromptsConfig.USE_CUSTOMIZATIONS_IN_PARENT_REPOS)) {
|
|
312
|
+
refresh();
|
|
313
|
+
}
|
|
314
|
+
}));
|
|
315
|
+
disposables.add(this.onDidChangeWorkspaceFolders()(() => {
|
|
316
|
+
refresh();
|
|
317
|
+
}));
|
|
318
|
+
disposables.add(this.workspaceTrustManagementService.onDidChangeTrustedFolders(() => {
|
|
319
|
+
refresh();
|
|
320
|
+
}));
|
|
321
|
+
disposables.add(this.fileService.onDidFilesChange(e => {
|
|
322
|
+
for (const watchedRoot of watchedRoots) {
|
|
323
|
+
if (e.affects(watchedRoot)) {
|
|
324
|
+
eventEmitter.fire();
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}));
|
|
329
|
+
disposables.add(this.fileService.onDidRunOperation(e => {
|
|
330
|
+
for (const watchedRoot of watchedRoots) {
|
|
331
|
+
if (isEqualOrParent(e.resource, watchedRoot)) {
|
|
332
|
+
eventEmitter.fire();
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (e.isOperation(FileOperation.CREATE) || e.isOperation(FileOperation.MOVE) || e.isOperation(FileOperation.COPY)) {
|
|
336
|
+
if (isEqualOrParent(e.target.resource, watchedRoot)) {
|
|
337
|
+
eventEmitter.fire();
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}));
|
|
343
|
+
void updateWatchers();
|
|
344
|
+
return {
|
|
345
|
+
event: eventEmitter.event,
|
|
346
|
+
dispose: () => disposables.dispose()
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
async getHookSourceFolders() {
|
|
350
|
+
const configuredLocations = this.getPromptSourceFolders(PromptsType.hook);
|
|
351
|
+
const allowedHookFolders = configuredLocations.filter(loc => !loc.path.startsWith(".claude/") && !loc.path.includes("/.claude/"));
|
|
352
|
+
const absoluteLocations = await this.toAbsoluteLocations(PromptsType.hook, allowedHookFolders);
|
|
353
|
+
const seen = ( new ResourceSet());
|
|
354
|
+
const result = [];
|
|
355
|
+
for (const location of absoluteLocations) {
|
|
356
|
+
if (!( seen.has(location.searchRoot))) {
|
|
357
|
+
seen.add(location.searchRoot);
|
|
358
|
+
result.push({
|
|
359
|
+
...location,
|
|
360
|
+
uri: location.searchRoot,
|
|
361
|
+
filePattern: undefined
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return result;
|
|
366
|
+
}
|
|
367
|
+
async getConfigBasedSourceFolders(type) {
|
|
368
|
+
const configuredLocations = this.getPromptSourceFolders(type);
|
|
369
|
+
const absoluteLocations = await this.toAbsoluteLocations(type, configuredLocations);
|
|
370
|
+
if (type !== PromptsType.prompt && type !== PromptsType.instructions) {
|
|
371
|
+
return ( absoluteLocations.map(l => l.uri));
|
|
372
|
+
}
|
|
373
|
+
const result = ( new ResourceSet());
|
|
374
|
+
for (const absoluteLocation of absoluteLocations) {
|
|
375
|
+
let location = absoluteLocation.uri;
|
|
376
|
+
const baseName = basename(location);
|
|
377
|
+
const filePatterns = ["*.md", `*${getPromptFileExtension(type)}`];
|
|
378
|
+
for (const filePattern of filePatterns) {
|
|
379
|
+
if (baseName === filePattern) {
|
|
380
|
+
location = dirname(location);
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
if (baseName === "*") {
|
|
385
|
+
location = dirname(location);
|
|
386
|
+
}
|
|
387
|
+
if (isValidGlob(location.path) === true) {
|
|
388
|
+
continue;
|
|
389
|
+
}
|
|
390
|
+
result.add(location);
|
|
391
|
+
}
|
|
392
|
+
return [...result];
|
|
393
|
+
}
|
|
394
|
+
async getResolvedSourceFolders(type) {
|
|
395
|
+
const absoluteLocations = await this.getLocalStorageFolders(type);
|
|
396
|
+
const localFolders = absoluteLocations.filter(loc => loc.storage === PromptsStorage.local);
|
|
397
|
+
const userFolders = absoluteLocations.filter(loc => loc.storage === PromptsStorage.user);
|
|
398
|
+
return this.dedupeSourceFolders([...localFolders, ...userFolders]);
|
|
399
|
+
}
|
|
400
|
+
async getSourceFoldersInDiscoveryOrder(type) {
|
|
401
|
+
const absoluteLocations = await this.getLocalStorageFolders(type);
|
|
402
|
+
const userFolders = absoluteLocations.filter(loc => loc.storage === PromptsStorage.user);
|
|
403
|
+
const localFolders = absoluteLocations.filter(loc => loc.storage === PromptsStorage.local);
|
|
404
|
+
return this.dedupeSourceFolders([...userFolders, ...localFolders]);
|
|
405
|
+
}
|
|
406
|
+
async getLocalStorageFolders(type) {
|
|
407
|
+
const configuredLocations = this.getPromptSourceFolders(type);
|
|
408
|
+
const defaultFolders = this.getDefaultSourceFolders(type);
|
|
409
|
+
const isConfigured = PromptsConfig.getLocationsValue(this.configService, type) !== undefined;
|
|
410
|
+
const allFolders = isConfigured ? configuredLocations : defaultFolders;
|
|
411
|
+
const absoluteLocations = await this.toAbsoluteLocations(type, allFolders, defaultFolders);
|
|
412
|
+
if (type === PromptsType.agent || type === PromptsType.instructions || type === PromptsType.prompt) {
|
|
413
|
+
absoluteLocations.push(this.userDataFolder);
|
|
414
|
+
}
|
|
415
|
+
return absoluteLocations;
|
|
416
|
+
}
|
|
417
|
+
dedupeSourceFolders(folders) {
|
|
418
|
+
const seen = ( new ResourceSet());
|
|
419
|
+
const result = [];
|
|
420
|
+
for (const folder of folders) {
|
|
421
|
+
if (!( seen.has(folder.uri))) {
|
|
422
|
+
seen.add(folder.uri);
|
|
423
|
+
result.push(folder);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
return result;
|
|
427
|
+
}
|
|
428
|
+
async toAbsoluteLocations(type, configuredLocations, defaultLocations, root) {
|
|
429
|
+
const result = [];
|
|
430
|
+
const seen = ( new ResourceSet());
|
|
431
|
+
const userHome = await this.pathService.userHome();
|
|
432
|
+
const rootFolders = await this.getWorkspaceFolderRoots(
|
|
433
|
+
this.configService.getValue(PromptsConfig.USE_CUSTOMIZATIONS_IN_PARENT_REPOS) === true,
|
|
434
|
+
undefined,
|
|
435
|
+
root
|
|
436
|
+
);
|
|
437
|
+
const defaultPaths = ( new Set(defaultLocations?.map(loc => loc.path)));
|
|
438
|
+
const validLocations = configuredLocations.filter(sourceFolder => {
|
|
439
|
+
if (type === PromptsType.instructions || type === PromptsType.prompt) {
|
|
440
|
+
const path = sourceFolder.path;
|
|
441
|
+
if (hasGlobPattern(path)) {
|
|
442
|
+
if (type === PromptsType.prompt) {
|
|
443
|
+
this.logService.warn(
|
|
444
|
+
`[Deprecated] Glob patterns (* and **) in prompt file locations are deprecated: "${path}". Consider using explicit paths instead.`
|
|
445
|
+
);
|
|
446
|
+
} else if (type === PromptsType.instructions) {
|
|
447
|
+
this.logService.info(
|
|
448
|
+
`Glob patterns (* and **) detected in instruction file location: "${path}". Consider using explicit paths for better performance.`
|
|
449
|
+
);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
return true;
|
|
453
|
+
}
|
|
454
|
+
const configuredLocation = sourceFolder.path;
|
|
455
|
+
if (!isValidPromptFolderPath(configuredLocation)) {
|
|
456
|
+
this.logService.warn(
|
|
457
|
+
`Skipping invalid path (glob patterns and absolute paths not supported): ${configuredLocation}`
|
|
458
|
+
);
|
|
459
|
+
return false;
|
|
460
|
+
}
|
|
461
|
+
return true;
|
|
462
|
+
});
|
|
463
|
+
for (const sourceFolder of validLocations) {
|
|
464
|
+
const configuredLocation = sourceFolder.path;
|
|
465
|
+
const isDefault = defaultPaths?.has(configuredLocation);
|
|
466
|
+
try {
|
|
467
|
+
if (isTildePath(configuredLocation)) {
|
|
468
|
+
const uri = joinPath(userHome, configuredLocation.substring(2));
|
|
469
|
+
if (!( seen.has(uri))) {
|
|
470
|
+
seen.add(uri);
|
|
471
|
+
const {
|
|
472
|
+
searchRoot,
|
|
473
|
+
filePattern
|
|
474
|
+
} = resolveSearchLocation(type, uri);
|
|
475
|
+
result.push({
|
|
476
|
+
uri,
|
|
477
|
+
searchRoot: searchRoot,
|
|
478
|
+
filePattern,
|
|
479
|
+
source: sourceFolder.source,
|
|
480
|
+
storage: sourceFolder.storage,
|
|
481
|
+
displayPath: configuredLocation,
|
|
482
|
+
isDefault
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
if (isAbsolute(configuredLocation)) {
|
|
488
|
+
let uri = URI.file(configuredLocation);
|
|
489
|
+
const remoteAuthority = this.environmentService.remoteAuthority;
|
|
490
|
+
if (remoteAuthority) {
|
|
491
|
+
uri = uri.with({
|
|
492
|
+
scheme: Schemas.vscodeRemote,
|
|
493
|
+
authority: remoteAuthority
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
if (!( seen.has(uri))) {
|
|
497
|
+
seen.add(uri);
|
|
498
|
+
const {
|
|
499
|
+
searchRoot,
|
|
500
|
+
filePattern
|
|
501
|
+
} = resolveSearchLocation(type, uri);
|
|
502
|
+
result.push({
|
|
503
|
+
uri,
|
|
504
|
+
searchRoot: searchRoot,
|
|
505
|
+
filePattern,
|
|
506
|
+
source: sourceFolder.source,
|
|
507
|
+
storage: sourceFolder.storage,
|
|
508
|
+
displayPath: configuredLocation,
|
|
509
|
+
isDefault
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
} else {
|
|
513
|
+
for (const folder of rootFolders) {
|
|
514
|
+
const absolutePath = joinPath(folder, configuredLocation);
|
|
515
|
+
if (!( seen.has(absolutePath))) {
|
|
516
|
+
seen.add(absolutePath);
|
|
517
|
+
const {
|
|
518
|
+
searchRoot,
|
|
519
|
+
filePattern
|
|
520
|
+
} = resolveSearchLocation(type, absolutePath);
|
|
521
|
+
result.push({
|
|
522
|
+
uri: absolutePath,
|
|
523
|
+
searchRoot: searchRoot,
|
|
524
|
+
filePattern,
|
|
525
|
+
source: sourceFolder.source,
|
|
526
|
+
storage: sourceFolder.storage,
|
|
527
|
+
displayPath: configuredLocation,
|
|
528
|
+
isDefault
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
} catch (error) {
|
|
534
|
+
this.logService.error(`Failed to resolve prompt file location: ${configuredLocation}`, error);
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
return result;
|
|
538
|
+
}
|
|
539
|
+
async resolveFilesAtLocation(location, type, token, depth = 0, root) {
|
|
540
|
+
if (type === PromptsType.skill) {
|
|
541
|
+
return this.findAgentSkillsInFolder(location, token);
|
|
542
|
+
}
|
|
543
|
+
const isWorkspaceRoot = depth === 0 && (root ? isEqual(root, location) : ( this.getWorkspaceFolders().some(f => isEqual(f.uri, location))));
|
|
544
|
+
const recursive = type === PromptsType.instructions && !isWorkspaceRoot && !hasGlobPattern(location.path) && depth < MAX_INSTRUCTIONS_RECURSION_DEPTH;
|
|
545
|
+
try {
|
|
546
|
+
const info = await this.fileService.resolve(location);
|
|
547
|
+
if (token.isCancellationRequested) {
|
|
548
|
+
return [];
|
|
549
|
+
}
|
|
550
|
+
if (info.isFile) {
|
|
551
|
+
return [info.resource];
|
|
552
|
+
} else if (info.isDirectory && info.children) {
|
|
553
|
+
const result = [];
|
|
554
|
+
for (const child of info.children) {
|
|
555
|
+
if (child.isFile) {
|
|
556
|
+
result.push(child.resource);
|
|
557
|
+
} else if (recursive && child.isDirectory) {
|
|
558
|
+
const subFiles = await this.resolveFilesAtLocation(child.resource, type, token, depth + 1, root);
|
|
559
|
+
result.push(...subFiles);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
return result;
|
|
563
|
+
}
|
|
564
|
+
} catch (e) {
|
|
565
|
+
if (e instanceof FileOperationError && e.fileOperationResult === FileOperationResult.FILE_NOT_FOUND)
|
|
566
|
+
; else {
|
|
567
|
+
this.logService.error(`Failed to resolve files at location: ${( location.toString())}`, e);
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
return [];
|
|
571
|
+
}
|
|
572
|
+
async searchFilesInLocation(folder, filePattern, token) {
|
|
573
|
+
if (!this.searchService.schemeHasFileSearchProvider(folder.scheme)) {
|
|
574
|
+
this.logService.warn(
|
|
575
|
+
`[PromptFilesLocator] No FileSearchProvider available for scheme '${folder.scheme}'. Cannot search for pattern '${filePattern}' in ${( folder.toString())}`
|
|
576
|
+
);
|
|
577
|
+
return [];
|
|
578
|
+
}
|
|
579
|
+
const disregardIgnoreFiles = this.configService.getValue("explorer.excludeGitIgnore");
|
|
580
|
+
const workspaceRoot = this.getWorkspaceFolder(folder);
|
|
581
|
+
const getExcludePattern = folder => getExcludes(this.configService.getValue({
|
|
582
|
+
resource: folder
|
|
583
|
+
})) || {};
|
|
584
|
+
const searchOptions = {
|
|
585
|
+
folderQueries: [{
|
|
586
|
+
folder,
|
|
587
|
+
disregardIgnoreFiles
|
|
588
|
+
}],
|
|
589
|
+
type: QueryType.File,
|
|
590
|
+
shouldGlobMatchFilePattern: true,
|
|
591
|
+
excludePattern: workspaceRoot ? getExcludePattern(workspaceRoot.uri) : undefined,
|
|
592
|
+
ignoreGlobCase: true,
|
|
593
|
+
sortByScore: true,
|
|
594
|
+
filePattern
|
|
595
|
+
};
|
|
596
|
+
try {
|
|
597
|
+
const searchResult = await this.searchService.fileSearch(searchOptions, token);
|
|
598
|
+
if (token.isCancellationRequested) {
|
|
599
|
+
return [];
|
|
600
|
+
}
|
|
601
|
+
return ( searchResult.results.map(r => r.resource));
|
|
602
|
+
} catch (e) {
|
|
603
|
+
if (!isCancellationError(e)) {
|
|
604
|
+
throw e;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
return [];
|
|
608
|
+
}
|
|
609
|
+
async findAgentMDsInWorkspace(token) {
|
|
610
|
+
const result = await Promise.all(( this.getWorkspaceFolders().map(folder => this.findAgentMDsInFolder(folder.uri, token))));
|
|
611
|
+
return result.flat(1);
|
|
612
|
+
}
|
|
613
|
+
async findAgentMDsInFolder(folder, token) {
|
|
614
|
+
if (this.searchService.schemeHasFileSearchProvider(folder.scheme)) {
|
|
615
|
+
const disregardIgnoreFiles = this.configService.getValue("explorer.excludeGitIgnore");
|
|
616
|
+
const getExcludePattern = folder => getExcludes(this.configService.getValue({
|
|
617
|
+
resource: folder
|
|
618
|
+
})) || {};
|
|
619
|
+
const searchOptions = {
|
|
620
|
+
folderQueries: [{
|
|
621
|
+
folder,
|
|
622
|
+
disregardIgnoreFiles
|
|
623
|
+
}],
|
|
624
|
+
type: QueryType.File,
|
|
625
|
+
shouldGlobMatchFilePattern: true,
|
|
626
|
+
excludePattern: getExcludePattern(folder),
|
|
627
|
+
filePattern: "**/AGENTS.md",
|
|
628
|
+
ignoreGlobCase: true
|
|
629
|
+
};
|
|
630
|
+
try {
|
|
631
|
+
const searchResult = await this.searchService.fileSearch(searchOptions, token);
|
|
632
|
+
if (token.isCancellationRequested) {
|
|
633
|
+
return [];
|
|
634
|
+
}
|
|
635
|
+
const results = [];
|
|
636
|
+
for (const r of searchResult.results) {
|
|
637
|
+
const realPath = undefined;
|
|
638
|
+
results.push({
|
|
639
|
+
uri: r.resource,
|
|
640
|
+
realPath,
|
|
641
|
+
type: AgentInstructionFileType.agentsMd
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
return results;
|
|
645
|
+
} catch (e) {
|
|
646
|
+
if (!isCancellationError(e)) {
|
|
647
|
+
throw e;
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
return [];
|
|
651
|
+
} else {
|
|
652
|
+
return this.findAgentMDsUsingFileService(folder, token);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
async findAgentMDsUsingFileService(folder, token) {
|
|
656
|
+
const result = [];
|
|
657
|
+
const agentsMdFileName = "agents.md";
|
|
658
|
+
const traverse = async uri => {
|
|
659
|
+
if (token.isCancellationRequested) {
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
try {
|
|
663
|
+
const stat = await this.fileService.resolve(uri);
|
|
664
|
+
if (stat.isFile && stat.name.toLowerCase() === agentsMdFileName) {
|
|
665
|
+
const realPath = stat.isSymbolicLink ? await this.fileService.realpath(stat.resource) : undefined;
|
|
666
|
+
result.push({
|
|
667
|
+
uri: stat.resource,
|
|
668
|
+
realPath,
|
|
669
|
+
type: AgentInstructionFileType.agentsMd
|
|
670
|
+
});
|
|
671
|
+
} else if (stat.isDirectory && stat.children) {
|
|
672
|
+
for (const child of stat.children) {
|
|
673
|
+
await traverse(child.resource);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
} catch (error) {
|
|
677
|
+
this.logService.trace(`[PromptFilesLocator] Error traversing ${( uri.toString())}: ${error}`);
|
|
678
|
+
}
|
|
679
|
+
};
|
|
680
|
+
await traverse(folder);
|
|
681
|
+
return result;
|
|
682
|
+
}
|
|
683
|
+
async findFilesInRoots(roots, folder, paths, token, result = []) {
|
|
684
|
+
const toResolve = ( roots.map(root => ({
|
|
685
|
+
resource: folder !== undefined ? joinPath(root, folder) : root
|
|
686
|
+
})));
|
|
687
|
+
const resolvedRoots = await this.fileService.resolveAll(toResolve);
|
|
688
|
+
if (token.isCancellationRequested) {
|
|
689
|
+
return result;
|
|
690
|
+
}
|
|
691
|
+
for (const root of resolvedRoots) {
|
|
692
|
+
if (root.success && root.stat?.children) {
|
|
693
|
+
for (const child of root.stat.children) {
|
|
694
|
+
if (child.isFile) {
|
|
695
|
+
const matchingPath = paths.find(p => equalsIgnoreCase(p.fileName, child.name));
|
|
696
|
+
if (matchingPath) {
|
|
697
|
+
const realPath = child.isSymbolicLink ? await this.fileService.realpath(child.resource) : undefined;
|
|
698
|
+
result.push({
|
|
699
|
+
uri: child.resource,
|
|
700
|
+
realPath,
|
|
701
|
+
type: matchingPath.type
|
|
702
|
+
});
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
return result;
|
|
709
|
+
}
|
|
710
|
+
getAgentFileURIFromModeFile(oldURI) {
|
|
711
|
+
if (oldURI.path.endsWith(LEGACY_MODE_FILE_EXTENSION)) {
|
|
712
|
+
let newLocation;
|
|
713
|
+
const workspaceFolder = this.getWorkspaceFolder(oldURI);
|
|
714
|
+
if (workspaceFolder) {
|
|
715
|
+
newLocation = joinPath(
|
|
716
|
+
workspaceFolder.uri,
|
|
717
|
+
AGENTS_SOURCE_FOLDER,
|
|
718
|
+
getCleanPromptName(oldURI) + AGENT_FILE_EXTENSION
|
|
719
|
+
);
|
|
720
|
+
} else if (isEqualOrParent(oldURI, this.userDataService.currentProfile.promptsHome)) {
|
|
721
|
+
newLocation = joinPath(
|
|
722
|
+
this.userDataService.currentProfile.promptsHome,
|
|
723
|
+
getCleanPromptName(oldURI) + AGENT_FILE_EXTENSION
|
|
724
|
+
);
|
|
725
|
+
}
|
|
726
|
+
return newLocation;
|
|
727
|
+
}
|
|
728
|
+
return undefined;
|
|
729
|
+
}
|
|
730
|
+
async findAgentSkillsInFolder(uri, token) {
|
|
731
|
+
try {
|
|
732
|
+
const result = [];
|
|
733
|
+
const stat = await this.fileService.resolve(uri);
|
|
734
|
+
if (stat.isDirectory && stat.children) {
|
|
735
|
+
for (const child of stat.children) {
|
|
736
|
+
try {
|
|
737
|
+
if (token.isCancellationRequested) {
|
|
738
|
+
return [];
|
|
739
|
+
}
|
|
740
|
+
if (child.isDirectory) {
|
|
741
|
+
const skillFile = joinPath(child.resource, SKILL_FILENAME);
|
|
742
|
+
const skillStat = await this.fileService.resolve(skillFile);
|
|
743
|
+
if (skillStat.isFile) {
|
|
744
|
+
result.push(skillStat.resource);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
} catch (error) {}
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
return result;
|
|
751
|
+
} catch (e) {
|
|
752
|
+
if (!isCancellationError(e)) {
|
|
753
|
+
this.logService.trace(`[PromptFilesLocator] Error searching for skills in ${( uri.toString())}: ${e}`);
|
|
754
|
+
}
|
|
755
|
+
return [];
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
async findAgentSkills(token) {
|
|
759
|
+
const configuredLocations = this.getPromptSourceFolders(PromptsType.skill);
|
|
760
|
+
const absoluteLocations = await this.toAbsoluteLocations(PromptsType.skill, configuredLocations);
|
|
761
|
+
const allResults = [];
|
|
762
|
+
for (const {
|
|
763
|
+
uri,
|
|
764
|
+
source,
|
|
765
|
+
storage
|
|
766
|
+
} of absoluteLocations) {
|
|
767
|
+
if (token.isCancellationRequested) {
|
|
768
|
+
return [];
|
|
769
|
+
}
|
|
770
|
+
const results = await this.findAgentSkillsInFolder(uri, token);
|
|
771
|
+
for (const skillUri of results) {
|
|
772
|
+
allResults.push({
|
|
773
|
+
uri: skillUri,
|
|
774
|
+
source,
|
|
775
|
+
storage,
|
|
776
|
+
type: PromptsType.skill
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
return allResults;
|
|
781
|
+
}
|
|
782
|
+
};
|
|
783
|
+
PromptFilesLocator = ( __decorate([( __param(0, IFileService)), ( __param(1, IConfigurationService)), ( __param(2, IWorkspaceContextService)), ( __param(3, IWorkbenchEnvironmentService)), ( __param(4, ISearchService)), ( __param(5, IUserDataProfileService)), ( __param(6, ILogService)), ( __param(7, IPathService)), ( __param(8, IWorkspaceTrustManagementService))], PromptFilesLocator));
|
|
784
|
+
function hasGlobPattern(path) {
|
|
785
|
+
return path.includes("*");
|
|
786
|
+
}
|
|
787
|
+
function isValidGlob(pattern) {
|
|
788
|
+
let squareBrackets = false;
|
|
789
|
+
let squareBracketsCount = 0;
|
|
790
|
+
let curlyBrackets = false;
|
|
791
|
+
let curlyBracketsCount = 0;
|
|
792
|
+
let previousCharacter;
|
|
793
|
+
for (const char of pattern) {
|
|
794
|
+
if (previousCharacter === "\\") {
|
|
795
|
+
previousCharacter = char;
|
|
796
|
+
continue;
|
|
797
|
+
}
|
|
798
|
+
if (char === "*") {
|
|
799
|
+
return true;
|
|
800
|
+
}
|
|
801
|
+
if (char === "?") {
|
|
802
|
+
return true;
|
|
803
|
+
}
|
|
804
|
+
if (char === "[") {
|
|
805
|
+
squareBrackets = true;
|
|
806
|
+
squareBracketsCount++;
|
|
807
|
+
previousCharacter = char;
|
|
808
|
+
continue;
|
|
809
|
+
}
|
|
810
|
+
if (char === "]") {
|
|
811
|
+
squareBrackets = true;
|
|
812
|
+
squareBracketsCount--;
|
|
813
|
+
previousCharacter = char;
|
|
814
|
+
continue;
|
|
815
|
+
}
|
|
816
|
+
if (char === "{") {
|
|
817
|
+
curlyBrackets = true;
|
|
818
|
+
curlyBracketsCount++;
|
|
819
|
+
continue;
|
|
820
|
+
}
|
|
821
|
+
if (char === "}") {
|
|
822
|
+
curlyBrackets = true;
|
|
823
|
+
curlyBracketsCount--;
|
|
824
|
+
previousCharacter = char;
|
|
825
|
+
continue;
|
|
826
|
+
}
|
|
827
|
+
previousCharacter = char;
|
|
828
|
+
}
|
|
829
|
+
if (squareBrackets && (squareBracketsCount === 0)) {
|
|
830
|
+
return true;
|
|
831
|
+
}
|
|
832
|
+
if (curlyBrackets && (curlyBracketsCount === 0)) {
|
|
833
|
+
return true;
|
|
834
|
+
}
|
|
835
|
+
return false;
|
|
836
|
+
}
|
|
837
|
+
function resolveSearchLocation(type, location) {
|
|
838
|
+
if (type !== PromptsType.instructions && type !== PromptsType.prompt) {
|
|
839
|
+
return {
|
|
840
|
+
searchRoot: location
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
const segments = location.path.split("/");
|
|
844
|
+
let i = 0;
|
|
845
|
+
while (i < segments.length && isValidGlob(segments[i]) === false) {
|
|
846
|
+
i++;
|
|
847
|
+
}
|
|
848
|
+
if (i === segments.length) {
|
|
849
|
+
return {
|
|
850
|
+
searchRoot: location
|
|
851
|
+
};
|
|
852
|
+
}
|
|
853
|
+
const parent = location.with({
|
|
854
|
+
path: segments.slice(0, i).join("/")
|
|
855
|
+
});
|
|
856
|
+
if (i === segments.length - 1 && segments[i] === "*" || segments[i] === ``) {
|
|
857
|
+
return {
|
|
858
|
+
searchRoot: parent
|
|
859
|
+
};
|
|
860
|
+
}
|
|
861
|
+
return {
|
|
862
|
+
searchRoot: parent,
|
|
863
|
+
filePattern: segments.slice(i).join("/")
|
|
864
|
+
};
|
|
865
|
+
}
|
|
866
|
+
const VALID_PROMPT_FOLDER_PATTERN = "^(?![A-Za-z]:[\\\\/])(?!/)(?!~(?!/))(?!.*\\\\)(?!.*[*?\\[\\]{}]).*\\S.*$";
|
|
867
|
+
const VALID_PROMPT_FOLDER_REGEX = ( new RegExp(VALID_PROMPT_FOLDER_PATTERN));
|
|
868
|
+
function isValidPromptFolderPath(path) {
|
|
869
|
+
return VALID_PROMPT_FOLDER_REGEX.test(path);
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
export { PromptFilesLocator, VALID_PROMPT_FOLDER_PATTERN, hasGlobPattern, isValidGlob, isValidPromptFolderPath };
|