1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
import * as vscode from "vscode";
import {
decorationManager,
showAnswerInTextEditor,
showGutterSpinner,
} from "./decorations";
import {
acceptSuggestionCommand,
rejectSuggestionCommand,
suggestionDownCommand,
suggestionUpCommand,
} from "./suggestions";
import * as bridge from "./bridge";
import { debugPanelWebview } from "./debugPanel";
import { sendTelemetryEvent, TelemetryEvent } from "./telemetry";
// Copy everything over from extension.ts
const commandsMap: { [command: string]: (...args: any) => any } = {
"continue.askQuestion": (data: any, webviewView: vscode.WebviewView) => {
if (!vscode.workspace.workspaceFolders) {
return;
}
answerQuestion(
data.question,
vscode.workspace.workspaceFolders[0].uri.fsPath,
webviewView.webview
);
},
"continue.askQuestionFromInput": () => {
vscode.window
.showInputBox({ placeHolder: "Ask away!" })
.then((question) => {
if (!question || !vscode.workspace.workspaceFolders) {
return;
}
sendTelemetryEvent(TelemetryEvent.UniversalPromptQuery, {
query: question,
});
answerQuestion(
question,
vscode.workspace.workspaceFolders[0].uri.fsPath
);
});
},
"continue.suggestionDown": suggestionDownCommand,
"continue.suggestionUp": suggestionUpCommand,
"continue.acceptSuggestion": acceptSuggestionCommand,
"continue.rejectSuggestion": rejectSuggestionCommand,
"continue.focusContinueInput": async () => {
vscode.commands.executeCommand("continue.continueGUIView.focus");
debugPanelWebview?.postMessage({
type: "focusContinueInput",
});
},
};
const textEditorCommandsMap: { [command: string]: (...args: any) => {} } = {
"continue.writeDocstring": async (editor: vscode.TextEditor, _) => {
sendTelemetryEvent(TelemetryEvent.GenerateDocstring);
let gutterSpinnerKey = showGutterSpinner(
editor,
editor.selection.active.line
);
const { lineno, docstring } = await bridge.writeDocstringForFunction(
editor.document.fileName,
editor.selection.active
);
// Can't use the edit given above after an async call
editor.edit((edit) => {
edit.insert(new vscode.Position(lineno, 0), docstring);
decorationManager.deleteDecoration(gutterSpinnerKey);
});
},
};
export function registerAllCommands(context: vscode.ExtensionContext) {
for (const [command, callback] of Object.entries(commandsMap)) {
context.subscriptions.push(
vscode.commands.registerCommand(command, callback)
);
}
for (const [command, callback] of Object.entries(textEditorCommandsMap)) {
context.subscriptions.push(
vscode.commands.registerTextEditorCommand(command, callback)
);
}
}
async function answerQuestion(
question: string,
workspacePath: string,
webview: vscode.Webview | undefined = undefined
) {
vscode.window.withProgress(
{
location: vscode.ProgressLocation.Notification,
title: "Anwering question...",
cancellable: false,
},
async (progress, token) => {
try {
let resp = await bridge.askQuestion(question, workspacePath);
// Send the answer back to the webview
if (webview) {
webview.postMessage({
type: "answerQuestion",
answer: resp.answer,
});
}
showAnswerInTextEditor(resp.filename, resp.range, resp.answer);
} catch (error: any) {
if (webview) {
webview.postMessage({
type: "answerQuestion",
answer: error,
});
}
}
}
);
}
|