@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.
Files changed (49) hide show
  1. package/lib/browser/ai-code-completion-frontend-module.d.ts.map +1 -1
  2. package/lib/browser/ai-code-completion-frontend-module.js +6 -4
  3. package/lib/browser/ai-code-completion-frontend-module.js.map +1 -1
  4. package/lib/browser/ai-code-completion-preference.d.ts +1 -0
  5. package/lib/browser/ai-code-completion-preference.d.ts.map +1 -1
  6. package/lib/browser/ai-code-completion-preference.js +10 -1
  7. package/lib/browser/ai-code-completion-preference.js.map +1 -1
  8. package/lib/browser/ai-code-frontend-application-contribution.d.ts +1 -0
  9. package/lib/browser/ai-code-frontend-application-contribution.d.ts.map +1 -1
  10. package/lib/browser/ai-code-frontend-application-contribution.js +18 -2
  11. package/lib/browser/ai-code-frontend-application-contribution.js.map +1 -1
  12. package/lib/browser/code-completion-agent.d.ts +0 -3
  13. package/lib/browser/code-completion-agent.d.ts.map +1 -1
  14. package/lib/browser/code-completion-agent.js +7 -45
  15. package/lib/browser/code-completion-agent.js.map +1 -1
  16. package/lib/browser/code-completion-cache.d.ts +40 -0
  17. package/lib/browser/code-completion-cache.d.ts.map +1 -0
  18. package/lib/browser/code-completion-cache.js +116 -0
  19. package/lib/browser/code-completion-cache.js.map +1 -0
  20. package/lib/browser/code-completion-prompt-template.d.ts.map +1 -1
  21. package/lib/browser/code-completion-prompt-template.js +41 -6
  22. package/lib/browser/code-completion-prompt-template.js.map +1 -1
  23. package/lib/browser/code-completion-variable-context.d.ts +11 -0
  24. package/lib/browser/code-completion-variable-context.d.ts.map +1 -0
  25. package/lib/browser/code-completion-variable-context.js +26 -0
  26. package/lib/browser/code-completion-variable-context.js.map +1 -0
  27. package/lib/browser/code-completion-variable-contribution.d.ts +16 -0
  28. package/lib/browser/code-completion-variable-contribution.d.ts.map +1 -0
  29. package/lib/browser/code-completion-variable-contribution.js +127 -0
  30. package/lib/browser/code-completion-variable-contribution.js.map +1 -0
  31. package/lib/browser/code-completion-variable-contribution.spec.d.ts +2 -0
  32. package/lib/browser/code-completion-variable-contribution.spec.d.ts.map +1 -0
  33. package/lib/browser/code-completion-variable-contribution.spec.js +143 -0
  34. package/lib/browser/code-completion-variable-contribution.spec.js.map +1 -0
  35. package/lib/browser/code-completion-variables.d.ts +6 -0
  36. package/lib/browser/code-completion-variables.d.ts.map +1 -0
  37. package/lib/browser/code-completion-variables.js +39 -0
  38. package/lib/browser/code-completion-variables.js.map +1 -0
  39. package/package.json +7 -7
  40. package/src/browser/ai-code-completion-frontend-module.ts +6 -4
  41. package/src/browser/ai-code-completion-preference.ts +10 -0
  42. package/src/browser/ai-code-frontend-application-contribution.ts +25 -3
  43. package/src/browser/code-completion-agent.ts +8 -57
  44. package/src/browser/code-completion-cache.ts +131 -0
  45. package/src/browser/code-completion-prompt-template.ts +41 -6
  46. package/src/browser/code-completion-variable-context.ts +30 -0
  47. package/src/browser/code-completion-variable-contribution.spec.ts +160 -0
  48. package/src/browser/code-completion-variable-contribution.ts +145 -0
  49. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=code-completion-variable-contribution.spec.d.ts.map
@@ -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.0+c02e6a4f5",
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.0+c02e6a4f5",
7
- "@theia/core": "1.63.0-next.0+c02e6a4f5",
8
- "@theia/filesystem": "1.63.0-next.0+c02e6a4f5",
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.0+c02e6a4f5",
11
- "@theia/workspace": "1.63.0-next.0+c02e6a4f5",
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": "c02e6a4f58728b4067cbd267d598550192abb249"
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 { ContainerModule } from '@theia/core/shared/inversify';
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 { Agent } from '@theia/ai-core';
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
- return this.inlineCodeCompletionProvider.provideInlineCompletions(
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: [] };