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