@theia/ai-code-completion 1.63.0-next.0 → 1.63.0-next.52
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/lib/browser/ai-code-completion-frontend-module.d.ts.map +1 -1
- package/lib/browser/ai-code-completion-frontend-module.js +6 -4
- package/lib/browser/ai-code-completion-frontend-module.js.map +1 -1
- package/lib/browser/ai-code-completion-preference.d.ts +1 -0
- package/lib/browser/ai-code-completion-preference.d.ts.map +1 -1
- package/lib/browser/ai-code-completion-preference.js +10 -1
- package/lib/browser/ai-code-completion-preference.js.map +1 -1
- package/lib/browser/ai-code-frontend-application-contribution.d.ts +1 -0
- package/lib/browser/ai-code-frontend-application-contribution.d.ts.map +1 -1
- package/lib/browser/ai-code-frontend-application-contribution.js +18 -2
- package/lib/browser/ai-code-frontend-application-contribution.js.map +1 -1
- package/lib/browser/code-completion-agent.d.ts +0 -3
- package/lib/browser/code-completion-agent.d.ts.map +1 -1
- package/lib/browser/code-completion-agent.js +7 -45
- package/lib/browser/code-completion-agent.js.map +1 -1
- package/lib/browser/code-completion-cache.d.ts +40 -0
- package/lib/browser/code-completion-cache.d.ts.map +1 -0
- package/lib/browser/code-completion-cache.js +116 -0
- package/lib/browser/code-completion-cache.js.map +1 -0
- package/lib/browser/code-completion-prompt-template.d.ts.map +1 -1
- package/lib/browser/code-completion-prompt-template.js +41 -6
- package/lib/browser/code-completion-prompt-template.js.map +1 -1
- package/lib/browser/code-completion-variable-context.d.ts +11 -0
- package/lib/browser/code-completion-variable-context.d.ts.map +1 -0
- package/lib/browser/code-completion-variable-context.js +26 -0
- package/lib/browser/code-completion-variable-context.js.map +1 -0
- package/lib/browser/code-completion-variable-contribution.d.ts +16 -0
- package/lib/browser/code-completion-variable-contribution.d.ts.map +1 -0
- package/lib/browser/code-completion-variable-contribution.js +127 -0
- package/lib/browser/code-completion-variable-contribution.js.map +1 -0
- package/lib/browser/code-completion-variable-contribution.spec.d.ts +2 -0
- package/lib/browser/code-completion-variable-contribution.spec.d.ts.map +1 -0
- package/lib/browser/code-completion-variable-contribution.spec.js +143 -0
- package/lib/browser/code-completion-variable-contribution.spec.js.map +1 -0
- package/lib/browser/code-completion-variables.d.ts +6 -0
- package/lib/browser/code-completion-variables.d.ts.map +1 -0
- package/lib/browser/code-completion-variables.js +39 -0
- package/lib/browser/code-completion-variables.js.map +1 -0
- package/package.json +7 -7
- package/src/browser/ai-code-completion-frontend-module.ts +6 -4
- package/src/browser/ai-code-completion-preference.ts +10 -0
- package/src/browser/ai-code-frontend-application-contribution.ts +25 -3
- package/src/browser/code-completion-agent.ts +8 -57
- package/src/browser/code-completion-cache.ts +131 -0
- package/src/browser/code-completion-prompt-template.ts +41 -6
- package/src/browser/code-completion-variable-context.ts +30 -0
- package/src/browser/code-completion-variable-contribution.spec.ts +160 -0
- package/src/browser/code-completion-variable-contribution.ts +145 -0
- package/src/browser/code-completion-variables.ts +41 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2025 Lonti.com Pty Ltd.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.CodeCompletionVariableContext = void 0;
|
|
19
|
+
var CodeCompletionVariableContext;
|
|
20
|
+
(function (CodeCompletionVariableContext) {
|
|
21
|
+
function is(context) {
|
|
22
|
+
return !!context && 'model' in context && 'position' in context && 'context' in context;
|
|
23
|
+
}
|
|
24
|
+
CodeCompletionVariableContext.is = is;
|
|
25
|
+
})(CodeCompletionVariableContext || (exports.CodeCompletionVariableContext = CodeCompletionVariableContext = {}));
|
|
26
|
+
//# sourceMappingURL=code-completion-variable-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-completion-variable-context.js","sourceRoot":"","sources":["../../src/browser/code-completion-variable-context.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,wCAAwC;AACxC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAWhF,IAAiB,6BAA6B,CAI7C;AAJD,WAAiB,6BAA6B;IAC1C,SAAgB,EAAE,CAAC,OAA0B;QACzC,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,IAAI,OAAO,IAAI,UAAU,IAAI,OAAO,IAAI,SAAS,IAAI,OAAO,CAAC;IAC5F,CAAC;IAFe,gCAAE,KAEjB,CAAA;AACL,CAAC,EAJgB,6BAA6B,6CAA7B,6BAA6B,QAI7C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AIVariableContext, AIVariableResolutionRequest, AIVariableResolver, ResolvedAIVariable } from '@theia/ai-core';
|
|
2
|
+
import { FrontendVariableContribution, FrontendVariableService } from '@theia/ai-core/lib/browser';
|
|
3
|
+
import { MaybePromise } from '@theia/core';
|
|
4
|
+
import { PreferenceService } from '@theia/core/lib/browser/preferences/preference-service';
|
|
5
|
+
import { CodeCompletionVariableContext } from './code-completion-variable-context';
|
|
6
|
+
export declare class CodeCompletionVariableContribution implements FrontendVariableContribution, AIVariableResolver {
|
|
7
|
+
protected preferences: PreferenceService;
|
|
8
|
+
registerVariables(service: FrontendVariableService): void;
|
|
9
|
+
canResolve(_request: AIVariableResolutionRequest, context: AIVariableContext): MaybePromise<number>;
|
|
10
|
+
resolve(request: AIVariableResolutionRequest, context: AIVariableContext): Promise<ResolvedAIVariable | undefined>;
|
|
11
|
+
protected resolvePrefix(context: CodeCompletionVariableContext): ResolvedAIVariable | undefined;
|
|
12
|
+
protected resolveSuffix(context: CodeCompletionVariableContext): ResolvedAIVariable | undefined;
|
|
13
|
+
protected resolveLanguage(context: CodeCompletionVariableContext): ResolvedAIVariable | undefined;
|
|
14
|
+
protected resolveFile(context: CodeCompletionVariableContext): ResolvedAIVariable | undefined;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=code-completion-variable-contribution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-completion-variable-contribution.d.ts","sourceRoot":"","sources":["../../src/browser/code-completion-variable-contribution.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACxH,OAAO,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACnG,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wDAAwD,CAAC;AAG3F,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAGnF,qBACa,kCAAmC,YAAW,4BAA4B,EAAE,kBAAkB;IAEvG,SAAS,CAAC,WAAW,EAAE,iBAAiB,CAAC;IAEzC,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAWzD,UAAU,CAAC,QAAQ,EAAE,2BAA2B,EAAE,OAAO,EAAE,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAAC;IAI7F,OAAO,CAAC,OAAO,EAAE,2BAA2B,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAmBxH,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,6BAA6B,GAAG,kBAAkB,GAAG,SAAS;IAkC/F,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,6BAA6B,GAAG,kBAAkB,GAAG,SAAS;IAgC/F,SAAS,CAAC,eAAe,CAAC,OAAO,EAAE,6BAA6B,GAAG,kBAAkB,GAAG,SAAS;IAOjG,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,6BAA6B,GAAG,kBAAkB,GAAG,SAAS;CAOhG"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2025 Lonti.com Pty Ltd.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.CodeCompletionVariableContribution = void 0;
|
|
19
|
+
const tslib_1 = require("tslib");
|
|
20
|
+
const preference_service_1 = require("@theia/core/lib/browser/preferences/preference-service");
|
|
21
|
+
const inversify_1 = require("@theia/core/shared/inversify");
|
|
22
|
+
const ai_code_completion_preference_1 = require("./ai-code-completion-preference");
|
|
23
|
+
const code_completion_variable_context_1 = require("./code-completion-variable-context");
|
|
24
|
+
const code_completion_variables_1 = require("./code-completion-variables");
|
|
25
|
+
let CodeCompletionVariableContribution = class CodeCompletionVariableContribution {
|
|
26
|
+
registerVariables(service) {
|
|
27
|
+
[
|
|
28
|
+
code_completion_variables_1.FILE,
|
|
29
|
+
code_completion_variables_1.PREFIX,
|
|
30
|
+
code_completion_variables_1.SUFFIX,
|
|
31
|
+
code_completion_variables_1.LANGUAGE
|
|
32
|
+
].forEach(variable => {
|
|
33
|
+
service.registerResolver(variable, this);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
canResolve(_request, context) {
|
|
37
|
+
return code_completion_variable_context_1.CodeCompletionVariableContext.is(context) ? 1 : 0;
|
|
38
|
+
}
|
|
39
|
+
async resolve(request, context) {
|
|
40
|
+
if (!code_completion_variable_context_1.CodeCompletionVariableContext.is(context)) {
|
|
41
|
+
return Promise.resolve(undefined);
|
|
42
|
+
}
|
|
43
|
+
switch (request.variable.id) {
|
|
44
|
+
case code_completion_variables_1.FILE.id:
|
|
45
|
+
return this.resolveFile(context);
|
|
46
|
+
case code_completion_variables_1.LANGUAGE.id:
|
|
47
|
+
return this.resolveLanguage(context);
|
|
48
|
+
case code_completion_variables_1.PREFIX.id:
|
|
49
|
+
return this.resolvePrefix(context);
|
|
50
|
+
case code_completion_variables_1.SUFFIX.id:
|
|
51
|
+
return this.resolveSuffix(context);
|
|
52
|
+
default:
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
resolvePrefix(context) {
|
|
57
|
+
const position = context.position;
|
|
58
|
+
const model = context.model;
|
|
59
|
+
const maxContextLines = this.preferences.get(ai_code_completion_preference_1.PREF_AI_INLINE_COMPLETION_MAX_CONTEXT_LINES, -1);
|
|
60
|
+
let prefixStartLine = 1;
|
|
61
|
+
if (maxContextLines === 0) {
|
|
62
|
+
// Only the cursor line
|
|
63
|
+
prefixStartLine = position.lineNumber;
|
|
64
|
+
}
|
|
65
|
+
else if (maxContextLines > 0) {
|
|
66
|
+
const linesBeforeCursor = position.lineNumber - 1;
|
|
67
|
+
// Allocate one more line to the prefix in case of an odd maxContextLines
|
|
68
|
+
const prefixLines = Math.min(Math.ceil(maxContextLines / 2), linesBeforeCursor);
|
|
69
|
+
prefixStartLine = Math.max(1, position.lineNumber - prefixLines);
|
|
70
|
+
}
|
|
71
|
+
const prefix = model.getValueInRange({
|
|
72
|
+
startLineNumber: prefixStartLine,
|
|
73
|
+
startColumn: 1,
|
|
74
|
+
endLineNumber: position.lineNumber,
|
|
75
|
+
endColumn: position.column,
|
|
76
|
+
});
|
|
77
|
+
return {
|
|
78
|
+
variable: code_completion_variables_1.PREFIX,
|
|
79
|
+
value: prefix
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
resolveSuffix(context) {
|
|
83
|
+
const position = context.position;
|
|
84
|
+
const model = context.model;
|
|
85
|
+
const maxContextLines = this.preferences.get(ai_code_completion_preference_1.PREF_AI_INLINE_COMPLETION_MAX_CONTEXT_LINES, -1);
|
|
86
|
+
let suffixEndLine = model.getLineCount();
|
|
87
|
+
if (maxContextLines === 0) {
|
|
88
|
+
suffixEndLine = position.lineNumber;
|
|
89
|
+
}
|
|
90
|
+
else if (maxContextLines > 0) {
|
|
91
|
+
const linesAfterCursor = model.getLineCount() - position.lineNumber;
|
|
92
|
+
const suffixLines = Math.min(Math.floor(maxContextLines / 2), linesAfterCursor);
|
|
93
|
+
suffixEndLine = Math.min(model.getLineCount(), position.lineNumber + suffixLines);
|
|
94
|
+
}
|
|
95
|
+
const suffix = model.getValueInRange({
|
|
96
|
+
startLineNumber: position.lineNumber,
|
|
97
|
+
startColumn: position.column,
|
|
98
|
+
endLineNumber: suffixEndLine,
|
|
99
|
+
endColumn: model.getLineMaxColumn(suffixEndLine),
|
|
100
|
+
});
|
|
101
|
+
return {
|
|
102
|
+
variable: code_completion_variables_1.SUFFIX,
|
|
103
|
+
value: suffix
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
resolveLanguage(context) {
|
|
107
|
+
return {
|
|
108
|
+
variable: code_completion_variables_1.LANGUAGE,
|
|
109
|
+
value: context.model.getLanguageId()
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
resolveFile(context) {
|
|
113
|
+
return {
|
|
114
|
+
variable: code_completion_variables_1.FILE,
|
|
115
|
+
value: context.model.uri.toString(false)
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
exports.CodeCompletionVariableContribution = CodeCompletionVariableContribution;
|
|
120
|
+
tslib_1.__decorate([
|
|
121
|
+
(0, inversify_1.inject)(preference_service_1.PreferenceService),
|
|
122
|
+
tslib_1.__metadata("design:type", Object)
|
|
123
|
+
], CodeCompletionVariableContribution.prototype, "preferences", void 0);
|
|
124
|
+
exports.CodeCompletionVariableContribution = CodeCompletionVariableContribution = tslib_1.__decorate([
|
|
125
|
+
(0, inversify_1.injectable)()
|
|
126
|
+
], CodeCompletionVariableContribution);
|
|
127
|
+
//# sourceMappingURL=code-completion-variable-contribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-completion-variable-contribution.js","sourceRoot":"","sources":["../../src/browser/code-completion-variable-contribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-completion-variable-contribution.spec.d.ts","sourceRoot":"","sources":["../../src/browser/code-completion-variable-contribution.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2025 Lonti.com Pty Ltd.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const frontend_application_config_provider_1 = require("@theia/core/lib/browser/frontend-application-config-provider");
|
|
19
|
+
const jsdom_1 = require("@theia/core/lib/browser/test/jsdom");
|
|
20
|
+
let disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
21
|
+
frontend_application_config_provider_1.FrontendApplicationConfigProvider.set({});
|
|
22
|
+
const browser_1 = require("@theia/core/lib/browser");
|
|
23
|
+
const inversify_1 = require("@theia/core/shared/inversify");
|
|
24
|
+
const editor_api_1 = require("@theia/monaco-editor-core/esm/vs/editor/editor.api");
|
|
25
|
+
const chai_1 = require("chai");
|
|
26
|
+
const sinon = require("sinon");
|
|
27
|
+
const code_completion_variable_contribution_1 = require("./code-completion-variable-contribution");
|
|
28
|
+
const code_completion_variables_1 = require("./code-completion-variables");
|
|
29
|
+
disableJSDOM();
|
|
30
|
+
describe('CodeCompletionVariableContribution', () => {
|
|
31
|
+
let contribution;
|
|
32
|
+
let model;
|
|
33
|
+
before(() => {
|
|
34
|
+
disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
35
|
+
const container = new inversify_1.Container();
|
|
36
|
+
container.bind(browser_1.PreferenceService).toConstantValue({
|
|
37
|
+
get: () => 1000,
|
|
38
|
+
});
|
|
39
|
+
container.bind(code_completion_variable_contribution_1.CodeCompletionVariableContribution).toSelf().inSingletonScope();
|
|
40
|
+
contribution = container.get(code_completion_variable_contribution_1.CodeCompletionVariableContribution);
|
|
41
|
+
});
|
|
42
|
+
beforeEach(() => {
|
|
43
|
+
model = editor_api_1.editor.createModel('//line 1\nconsole.\n//line 2', 'javascript', editor_api_1.Uri.file('/home/user/workspace/test.js'));
|
|
44
|
+
sinon.stub(model, 'getLanguageId').returns('javascript');
|
|
45
|
+
});
|
|
46
|
+
afterEach(() => {
|
|
47
|
+
model.dispose();
|
|
48
|
+
});
|
|
49
|
+
after(() => {
|
|
50
|
+
// Disable JSDOM after all tests
|
|
51
|
+
disableJSDOM();
|
|
52
|
+
model.dispose();
|
|
53
|
+
});
|
|
54
|
+
describe('canResolve', () => {
|
|
55
|
+
it('should be able to resolve the file from the CodeCompletionVariableContext', () => {
|
|
56
|
+
const context = {
|
|
57
|
+
model,
|
|
58
|
+
position: model.getPositionAt(8),
|
|
59
|
+
context: {
|
|
60
|
+
triggerKind: editor_api_1.languages.InlineCompletionTriggerKind.Automatic,
|
|
61
|
+
selectedSuggestionInfo: undefined,
|
|
62
|
+
includeInlineEdits: false,
|
|
63
|
+
includeInlineCompletions: false
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
(0, chai_1.expect)(contribution.canResolve({ variable: code_completion_variables_1.FILE }, context)).to.equal(1);
|
|
67
|
+
});
|
|
68
|
+
it('should not be able to resolve the file from unknown context', () => {
|
|
69
|
+
(0, chai_1.expect)(contribution.canResolve({ variable: code_completion_variables_1.FILE }, {})).to.equal(0);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('resolve', () => {
|
|
73
|
+
it('should resolve the file variable', async () => {
|
|
74
|
+
const context = {
|
|
75
|
+
model,
|
|
76
|
+
position: model.getPositionAt(17),
|
|
77
|
+
context: {
|
|
78
|
+
triggerKind: editor_api_1.languages.InlineCompletionTriggerKind.Automatic,
|
|
79
|
+
selectedSuggestionInfo: undefined,
|
|
80
|
+
includeInlineEdits: false,
|
|
81
|
+
includeInlineCompletions: false
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
const resolved = await contribution.resolve({ variable: code_completion_variables_1.FILE }, context);
|
|
85
|
+
(0, chai_1.expect)(resolved).to.deep.equal({
|
|
86
|
+
variable: code_completion_variables_1.FILE,
|
|
87
|
+
value: 'file:///home/user/workspace/test.js'
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
it('should resolve the language variable', async () => {
|
|
91
|
+
const context = {
|
|
92
|
+
model,
|
|
93
|
+
position: model.getPositionAt(17),
|
|
94
|
+
context: {
|
|
95
|
+
triggerKind: editor_api_1.languages.InlineCompletionTriggerKind.Automatic,
|
|
96
|
+
selectedSuggestionInfo: undefined,
|
|
97
|
+
includeInlineEdits: false,
|
|
98
|
+
includeInlineCompletions: false
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const resolved = await contribution.resolve({ variable: code_completion_variables_1.LANGUAGE }, context);
|
|
102
|
+
(0, chai_1.expect)(resolved).to.deep.equal({
|
|
103
|
+
variable: code_completion_variables_1.LANGUAGE,
|
|
104
|
+
value: 'javascript'
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
it('should resolve the prefix variable', async () => {
|
|
108
|
+
const context = {
|
|
109
|
+
model,
|
|
110
|
+
position: model.getPositionAt(17),
|
|
111
|
+
context: {
|
|
112
|
+
triggerKind: editor_api_1.languages.InlineCompletionTriggerKind.Automatic,
|
|
113
|
+
selectedSuggestionInfo: undefined,
|
|
114
|
+
includeInlineEdits: false,
|
|
115
|
+
includeInlineCompletions: false
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const resolved = await contribution.resolve({ variable: code_completion_variables_1.PREFIX }, context);
|
|
119
|
+
(0, chai_1.expect)(resolved).to.deep.equal({
|
|
120
|
+
variable: code_completion_variables_1.PREFIX,
|
|
121
|
+
value: '//line 1\nconsole.'
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
it('should resolve the suffix variable', async () => {
|
|
125
|
+
const context = {
|
|
126
|
+
model,
|
|
127
|
+
position: model.getPositionAt(17),
|
|
128
|
+
context: {
|
|
129
|
+
triggerKind: editor_api_1.languages.InlineCompletionTriggerKind.Automatic,
|
|
130
|
+
selectedSuggestionInfo: undefined,
|
|
131
|
+
includeInlineEdits: false,
|
|
132
|
+
includeInlineCompletions: false
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
const resolved = await contribution.resolve({ variable: code_completion_variables_1.SUFFIX }, context);
|
|
136
|
+
(0, chai_1.expect)(resolved).to.deep.equal({
|
|
137
|
+
variable: code_completion_variables_1.SUFFIX,
|
|
138
|
+
value: '\n//line 2'
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=code-completion-variable-contribution.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-completion-variable-contribution.spec.js","sourceRoot":"","sources":["../../src/browser/code-completion-variable-contribution.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { AIVariable } from '@theia/ai-core/lib/common/variable-service';
|
|
2
|
+
export declare const FILE: AIVariable;
|
|
3
|
+
export declare const PREFIX: AIVariable;
|
|
4
|
+
export declare const SUFFIX: AIVariable;
|
|
5
|
+
export declare const LANGUAGE: AIVariable;
|
|
6
|
+
//# sourceMappingURL=code-completion-variables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-completion-variables.d.ts","sourceRoot":"","sources":["../../src/browser/code-completion-variables.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAExE,eAAO,MAAM,IAAI,EAAE,UAIlB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,UAIpB,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,UAIpB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,UAItB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2025 Lonti.com Pty Ltd.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.LANGUAGE = exports.SUFFIX = exports.PREFIX = exports.FILE = void 0;
|
|
19
|
+
exports.FILE = {
|
|
20
|
+
id: 'codeCompletionFile',
|
|
21
|
+
name: 'codeCompletionFile',
|
|
22
|
+
description: 'The uri of the file being edited.',
|
|
23
|
+
};
|
|
24
|
+
exports.PREFIX = {
|
|
25
|
+
id: 'codeCompletionPrefix',
|
|
26
|
+
name: 'codeCompletionPrefix',
|
|
27
|
+
description: 'The code before the current position of the cursor.',
|
|
28
|
+
};
|
|
29
|
+
exports.SUFFIX = {
|
|
30
|
+
id: 'codeCompletionSuffix',
|
|
31
|
+
name: 'codeCompletionSuffix',
|
|
32
|
+
description: 'The code after the current position of the cursor.',
|
|
33
|
+
};
|
|
34
|
+
exports.LANGUAGE = {
|
|
35
|
+
id: 'codeCompletionLanguage',
|
|
36
|
+
name: 'codeCompletionLanguage',
|
|
37
|
+
description: 'The languageId of the file being edited.',
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=code-completion-variables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-completion-variables.js","sourceRoot":"","sources":["../../src/browser/code-completion-variables.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,wCAAwC;AACxC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAInE,QAAA,IAAI,GAAe;IAC5B,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,mCAAmC;CACnD,CAAC;AAEW,QAAA,MAAM,GAAe;IAC9B,EAAE,EAAE,sBAAsB;IAC1B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,qDAAqD;CACrE,CAAC;AAEW,QAAA,MAAM,GAAe;IAC9B,EAAE,EAAE,sBAAsB;IAC1B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,oDAAoD;CACpE,CAAC;AAEW,QAAA,QAAQ,GAAe;IAChC,EAAE,EAAE,wBAAwB;IAC5B,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,0CAA0C;CAC1D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-code-completion",
|
|
3
|
-
"version": "1.63.0-next.
|
|
3
|
+
"version": "1.63.0-next.52+176018e53",
|
|
4
4
|
"description": "Theia - AI Core",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/ai-core": "1.63.0-next.
|
|
7
|
-
"@theia/core": "1.63.0-next.
|
|
8
|
-
"@theia/filesystem": "1.63.0-next.
|
|
6
|
+
"@theia/ai-core": "1.63.0-next.52+176018e53",
|
|
7
|
+
"@theia/core": "1.63.0-next.52+176018e53",
|
|
8
|
+
"@theia/filesystem": "1.63.0-next.52+176018e53",
|
|
9
9
|
"@theia/monaco-editor-core": "1.96.302",
|
|
10
|
-
"@theia/output": "1.63.0-next.
|
|
11
|
-
"@theia/workspace": "1.63.0-next.
|
|
10
|
+
"@theia/output": "1.63.0-next.52+176018e53",
|
|
11
|
+
"@theia/workspace": "1.63.0-next.52+176018e53",
|
|
12
12
|
"minimatch": "^5.1.0",
|
|
13
13
|
"tslib": "^2.6.2"
|
|
14
14
|
},
|
|
@@ -51,5 +51,5 @@
|
|
|
51
51
|
"nyc": {
|
|
52
52
|
"extends": "../../configs/nyc.json"
|
|
53
53
|
},
|
|
54
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "176018e53e62cafec9b25b23ac9f0b4826b6d0f7"
|
|
55
55
|
}
|
|
@@ -14,14 +14,15 @@
|
|
|
14
14
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
import { CodeCompletionAgent, CodeCompletionAgentImpl } from './code-completion-agent';
|
|
19
|
-
import { AIFrontendApplicationContribution } from './ai-code-frontend-application-contribution';
|
|
17
|
+
import { Agent, AIVariableContribution } from '@theia/ai-core';
|
|
20
18
|
import { FrontendApplicationContribution, KeybindingContribution, PreferenceContribution } from '@theia/core/lib/browser';
|
|
21
|
-
import {
|
|
19
|
+
import { ContainerModule } from '@theia/core/shared/inversify';
|
|
22
20
|
import { AICodeCompletionPreferencesSchema } from './ai-code-completion-preference';
|
|
21
|
+
import { AIFrontendApplicationContribution } from './ai-code-frontend-application-contribution';
|
|
23
22
|
import { AICodeInlineCompletionsProvider } from './ai-code-inline-completion-provider';
|
|
23
|
+
import { CodeCompletionAgent, CodeCompletionAgentImpl } from './code-completion-agent';
|
|
24
24
|
import { CodeCompletionPostProcessor, DefaultCodeCompletionPostProcessor } from './code-completion-postprocessor';
|
|
25
|
+
import { CodeCompletionVariableContribution } from './code-completion-variable-contribution';
|
|
25
26
|
|
|
26
27
|
export default new ContainerModule(bind => {
|
|
27
28
|
bind(CodeCompletionAgentImpl).toSelf().inSingletonScope();
|
|
@@ -33,4 +34,5 @@ export default new ContainerModule(bind => {
|
|
|
33
34
|
bind(KeybindingContribution).toService(AIFrontendApplicationContribution);
|
|
34
35
|
bind(PreferenceContribution).toConstantValue({ schema: AICodeCompletionPreferencesSchema });
|
|
35
36
|
bind(CodeCompletionPostProcessor).to(DefaultCodeCompletionPostProcessor).inSingletonScope();
|
|
37
|
+
bind(AIVariableContribution).to(CodeCompletionVariableContribution).inSingletonScope();
|
|
36
38
|
});
|
|
@@ -23,6 +23,7 @@ export const PREF_AI_INLINE_COMPLETION_DEBOUNCE_DELAY = 'ai-features.codeComplet
|
|
|
23
23
|
export const PREF_AI_INLINE_COMPLETION_EXCLUDED_EXTENSIONS = 'ai-features.codeCompletion.excludedFileExtensions';
|
|
24
24
|
export const PREF_AI_INLINE_COMPLETION_MAX_CONTEXT_LINES = 'ai-features.codeCompletion.maxContextLines';
|
|
25
25
|
export const PREF_AI_INLINE_COMPLETION_STRIP_BACKTICKS = 'ai-features.codeCompletion.stripBackticks';
|
|
26
|
+
export const PREF_AI_INLINE_COMPLETION_CACHE_CAPACITY = 'ai-features.codeCompletion.cacheCapacity';
|
|
26
27
|
|
|
27
28
|
export const AICodeCompletionPreferencesSchema: PreferenceSchema = {
|
|
28
29
|
type: 'object',
|
|
@@ -69,6 +70,15 @@ export const AICodeCompletionPreferencesSchema: PreferenceSchema = {
|
|
|
69
70
|
'Remove surrounding backticks from the code returned by some LLMs. If a backtick is detected, all content after the closing\
|
|
70
71
|
backtick is stripped as well. This setting helps ensure plain code is returned when language models use markdown-like formatting.'),
|
|
71
72
|
default: true
|
|
73
|
+
},
|
|
74
|
+
[PREF_AI_INLINE_COMPLETION_CACHE_CAPACITY]: {
|
|
75
|
+
title: nls.localize('theia/ai/completion/cacheCapacity/title', 'Code Completion Cache Capacity'),
|
|
76
|
+
type: 'number',
|
|
77
|
+
description: nls.localize('theia/ai/completion/cacheCapacity/description',
|
|
78
|
+
'Maximum number of code completions to store in the cache. A higher number can improve performance but will consume more memory.\
|
|
79
|
+
Minimum value is 10, recommended range is between 50-200.'),
|
|
80
|
+
default: 100,
|
|
81
|
+
minimum: 10
|
|
72
82
|
}
|
|
73
83
|
}
|
|
74
84
|
};
|
|
@@ -24,10 +24,12 @@ import { InlineCompletionTriggerKind } from '@theia/monaco-editor-core/esm/vs/ed
|
|
|
24
24
|
import {
|
|
25
25
|
PREF_AI_INLINE_COMPLETION_AUTOMATIC_ENABLE,
|
|
26
26
|
PREF_AI_INLINE_COMPLETION_DEBOUNCE_DELAY,
|
|
27
|
-
PREF_AI_INLINE_COMPLETION_EXCLUDED_EXTENSIONS
|
|
27
|
+
PREF_AI_INLINE_COMPLETION_EXCLUDED_EXTENSIONS,
|
|
28
|
+
PREF_AI_INLINE_COMPLETION_CACHE_CAPACITY
|
|
28
29
|
} from './ai-code-completion-preference';
|
|
29
30
|
import { AICodeInlineCompletionsProvider } from './ai-code-inline-completion-provider';
|
|
30
31
|
import { InlineCompletionDebouncer } from './code-completion-debouncer';
|
|
32
|
+
import { CodeCompletionCache } from './code-completion-cache';
|
|
31
33
|
|
|
32
34
|
@injectable()
|
|
33
35
|
export class AIFrontendApplicationContribution implements FrontendApplicationContribution, KeybindingContribution {
|
|
@@ -40,6 +42,7 @@ export class AIFrontendApplicationContribution implements FrontendApplicationCon
|
|
|
40
42
|
@inject(AIActivationService)
|
|
41
43
|
protected readonly activationService: AIActivationService;
|
|
42
44
|
|
|
45
|
+
private completionCache = new CodeCompletionCache();
|
|
43
46
|
private debouncer = new InlineCompletionDebouncer();
|
|
44
47
|
private debounceDelay: number;
|
|
45
48
|
|
|
@@ -58,6 +61,9 @@ export class AIFrontendApplicationContribution implements FrontendApplicationCon
|
|
|
58
61
|
|
|
59
62
|
this.debounceDelay = this.preferenceService.get<number>(PREF_AI_INLINE_COMPLETION_DEBOUNCE_DELAY, 300);
|
|
60
63
|
|
|
64
|
+
const cacheCapacity = this.preferenceService.get<number>(PREF_AI_INLINE_COMPLETION_CACHE_CAPACITY, 100);
|
|
65
|
+
this.completionCache.setMaxSize(cacheCapacity);
|
|
66
|
+
|
|
61
67
|
this.preferenceService.onPreferenceChanged(event => {
|
|
62
68
|
if (event.preferenceName === PREF_AI_INLINE_COMPLETION_AUTOMATIC_ENABLE
|
|
63
69
|
|| event.preferenceName === PREF_AI_INLINE_COMPLETION_EXCLUDED_EXTENSIONS) {
|
|
@@ -67,6 +73,9 @@ export class AIFrontendApplicationContribution implements FrontendApplicationCon
|
|
|
67
73
|
if (event.preferenceName === PREF_AI_INLINE_COMPLETION_DEBOUNCE_DELAY) {
|
|
68
74
|
this.debounceDelay = event.newValue;
|
|
69
75
|
}
|
|
76
|
+
if (event.preferenceName === PREF_AI_INLINE_COMPLETION_CACHE_CAPACITY) {
|
|
77
|
+
this.completionCache.setMaxSize(event.newValue);
|
|
78
|
+
}
|
|
70
79
|
});
|
|
71
80
|
|
|
72
81
|
this.activationService.onDidChangeActiveStatus(change => {
|
|
@@ -102,14 +111,27 @@ export class AIFrontendApplicationContribution implements FrontendApplicationCon
|
|
|
102
111
|
return { items: [] };
|
|
103
112
|
}
|
|
104
113
|
|
|
105
|
-
const completionHandler = () => {
|
|
114
|
+
const completionHandler = async () => {
|
|
106
115
|
try {
|
|
107
|
-
|
|
116
|
+
const cacheKey = this.completionCache.generateKey(fileName, model, position);
|
|
117
|
+
const cachedCompletion = this.completionCache.get(cacheKey);
|
|
118
|
+
|
|
119
|
+
if (cachedCompletion) {
|
|
120
|
+
return cachedCompletion;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const completion = await this.inlineCodeCompletionProvider.provideInlineCompletions(
|
|
108
124
|
model,
|
|
109
125
|
position,
|
|
110
126
|
context,
|
|
111
127
|
token
|
|
112
128
|
);
|
|
129
|
+
|
|
130
|
+
if (completion && completion.items.length > 0) {
|
|
131
|
+
this.completionCache.put(cacheKey, completion);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return completion;
|
|
113
135
|
} catch (error) {
|
|
114
136
|
console.error('Error providing inline completions:', error);
|
|
115
137
|
return { items: [] };
|