Path: blob/main/src/vs/workbench/contrib/chat/browser/promptSyntax/saveAsPromptFileActions.ts
4780 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { Schemas } from '../../../../../base/common/network.js';6import { joinPath } from '../../../../../base/common/resources.js';7import { ServicesAccessor } from '../../../../../editor/browser/editorExtensions.js';8import { ICodeEditorService } from '../../../../../editor/browser/services/codeEditorService.js';9import { ILocalizedString, localize2 } from '../../../../../nls.js';10import { ICommandActionTitle } from '../../../../../platform/action/common/action.js';11import { Action2, IAction2Options, MenuId } from '../../../../../platform/actions/common/actions.js';12import { ContextKeyExpr } from '../../../../../platform/contextkey/common/contextkey.js';13import { IFileService } from '../../../../../platform/files/common/files.js';14import { IInstantiationService } from '../../../../../platform/instantiation/common/instantiation.js';15import { ResourceContextKey } from '../../../../common/contextkeys.js';16import { ITextFileService } from '../../../../services/textfile/common/textfiles.js';17import { chatEditingWidgetFileStateContextKey, ModifiedFileEntryState } from '../../common/editing/chatEditingService.js';18import { getCleanPromptName } from '../../common/promptSyntax/config/promptFileLocations.js';19import { AGENT_LANGUAGE_ID, INSTRUCTIONS_LANGUAGE_ID, PROMPT_LANGUAGE_ID, PromptsType } from '../../common/promptSyntax/promptTypes.js';20import { CHAT_CATEGORY } from '../actions/chatActions.js';21import { askForPromptFileName } from './pickers/askForPromptName.js';22import { askForPromptSourceFolder } from './pickers/askForPromptSourceFolder.js';2324class BaseSaveAsPromptFileAction extends Action2 {25constructor(opts: Readonly<IAction2Options>, private readonly promptType: PromptsType) {26super(opts);27}2829async run(accessor: ServicesAccessor, configUri?: string): Promise<void> {30const instantiationService = accessor.get(IInstantiationService);31const codeEditorService = accessor.get(ICodeEditorService);32const textFileService = accessor.get(ITextFileService);33const fileService = accessor.get(IFileService);34const activeCodeEditor = codeEditorService.getActiveCodeEditor();35if (!activeCodeEditor) {36return;37}38const model = activeCodeEditor.getModel();39if (!model) {40return;41}42const newFolder = await instantiationService.invokeFunction(askForPromptSourceFolder, this.promptType, undefined, true);43if (!newFolder) {44return;45}46const newName = await instantiationService.invokeFunction(askForPromptFileName, this.promptType, newFolder.uri, getCleanPromptName(model.uri));47if (!newName) {48return;49}50const newFile = joinPath(newFolder.uri, newName);51if (model.uri.scheme === Schemas.untitled) {52await textFileService.saveAs(model.uri, newFile, { from: model.uri });53} else {54await fileService.copy(model.uri, newFile);55}56await codeEditorService.openCodeEditor({ resource: newFile }, activeCodeEditor);57}58}5960function createOptions(id: string, title: ICommandActionTitle, description: ILocalizedString, languageId: string): Readonly<IAction2Options> {61return {62id: id,63title: title,64metadata: {65description: description,66},67category: CHAT_CATEGORY,68f1: false,69menu: {70id: MenuId.EditorContent,71when: ContextKeyExpr.and(72ContextKeyExpr.equals(ResourceContextKey.Scheme.key, Schemas.untitled),73ContextKeyExpr.equals(ResourceContextKey.LangId.key, languageId),74ContextKeyExpr.notEquals(chatEditingWidgetFileStateContextKey.key, ModifiedFileEntryState.Modified),75)76}77};78}7980export const SAVE_AS_PROMPT_FILE_ACTION_ID = 'workbench.action.chat.save-as-prompt';8182export class SaveAsPromptFileAction extends BaseSaveAsPromptFileAction {83constructor() {84super(createOptions(SAVE_AS_PROMPT_FILE_ACTION_ID, localize2('promptfile.savePromptFile', "Save As Prompt File"), localize2('promptfile.savePromptFile.description', "Save as prompt file"), PROMPT_LANGUAGE_ID), PromptsType.prompt);85}86}8788export const SAVE_AS_AGENT_FILE_ACTION_ID = 'workbench.action.chat.save-as-agent';8990export class SaveAsAgentFileAction extends BaseSaveAsPromptFileAction {91constructor() {92super(createOptions(SAVE_AS_AGENT_FILE_ACTION_ID, localize2('promptfile.saveAgentFile', "Save As Agent File"), localize2('promptfile.saveAgentFile.description', "Save as agent file"), AGENT_LANGUAGE_ID), PromptsType.agent);93}94}9596export const SAVE_AS_INSTRUCTIONS_FILE_ACTION_ID = 'workbench.action.chat.save-as-instructions';9798export class SaveAsInstructionsFileAction extends BaseSaveAsPromptFileAction {99constructor() {100super(createOptions(SAVE_AS_INSTRUCTIONS_FILE_ACTION_ID, localize2('promptfile.saveInstructionsFile', "Save As Instructions File"), localize2('promptfile.saveInstructionsFile.description', "Save as instructions file"), INSTRUCTIONS_LANGUAGE_ID), PromptsType.instructions);101}102}103104105