@aws/lsp-codewhisperer 0.0.3

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 (100) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +19 -0
  3. package/out/client/sigv4/codewhisperer.d.ts +3 -0
  4. package/out/client/sigv4/codewhisperer.js +14 -0
  5. package/out/client/sigv4/codewhisperer.js.map +1 -0
  6. package/out/client/sigv4/service.json +346 -0
  7. package/out/client/token/bearer-token-service.json +1627 -0
  8. package/out/client/token/codewhisperer.d.ts +14 -0
  9. package/out/client/token/codewhisperer.js +23 -0
  10. package/out/client/token/codewhisperer.js.map +1 -0
  11. package/out/index.d.ts +2 -0
  12. package/out/index.js +19 -0
  13. package/out/index.js.map +1 -0
  14. package/out/language-server/auto-trigger/autoTrigger.d.ts +38 -0
  15. package/out/language-server/auto-trigger/autoTrigger.js +119 -0
  16. package/out/language-server/auto-trigger/autoTrigger.js.map +1 -0
  17. package/out/language-server/auto-trigger/autoTrigger.test.d.ts +1 -0
  18. package/out/language-server/auto-trigger/autoTrigger.test.js +82 -0
  19. package/out/language-server/auto-trigger/autoTrigger.test.js.map +1 -0
  20. package/out/language-server/auto-trigger/coefficients.json +405 -0
  21. package/out/language-server/codeWhispererSecurityScanServer.d.ts +4 -0
  22. package/out/language-server/codeWhispererSecurityScanServer.js +76 -0
  23. package/out/language-server/codeWhispererSecurityScanServer.js.map +1 -0
  24. package/out/language-server/codeWhispererServer.d.ts +7 -0
  25. package/out/language-server/codeWhispererServer.js +425 -0
  26. package/out/language-server/codeWhispererServer.js.map +1 -0
  27. package/out/language-server/codeWhispererServer.test.d.ts +1 -0
  28. package/out/language-server/codeWhispererServer.test.js +1218 -0
  29. package/out/language-server/codeWhispererServer.test.js.map +1 -0
  30. package/out/language-server/codeWhispererService.d.ts +84 -0
  31. package/out/language-server/codeWhispererService.js +168 -0
  32. package/out/language-server/codeWhispererService.js.map +1 -0
  33. package/out/language-server/dependencyGraph/commonUtil.d.ts +2 -0
  34. package/out/language-server/dependencyGraph/commonUtil.js +20 -0
  35. package/out/language-server/dependencyGraph/commonUtil.js.map +1 -0
  36. package/out/language-server/dependencyGraph/constants.d.ts +2 -0
  37. package/out/language-server/dependencyGraph/constants.js +6 -0
  38. package/out/language-server/dependencyGraph/constants.js.map +1 -0
  39. package/out/language-server/dependencyGraph/csharpDependencyGraph.d.ts +27 -0
  40. package/out/language-server/dependencyGraph/csharpDependencyGraph.js +145 -0
  41. package/out/language-server/dependencyGraph/csharpDependencyGraph.js.map +1 -0
  42. package/out/language-server/dependencyGraph/csharpDependencyGraph.test.d.ts +1 -0
  43. package/out/language-server/dependencyGraph/csharpDependencyGraph.test.js +341 -0
  44. package/out/language-server/dependencyGraph/csharpDependencyGraph.test.js.map +1 -0
  45. package/out/language-server/dependencyGraph/dependencyGraph.d.ts +125 -0
  46. package/out/language-server/dependencyGraph/dependencyGraph.js +152 -0
  47. package/out/language-server/dependencyGraph/dependencyGraph.js.map +1 -0
  48. package/out/language-server/dependencyGraph/dependencyGraphFactory.d.ts +15 -0
  49. package/out/language-server/dependencyGraph/dependencyGraphFactory.js +22 -0
  50. package/out/language-server/dependencyGraph/dependencyGraphFactory.js.map +1 -0
  51. package/out/language-server/languageDetection.d.ts +3 -0
  52. package/out/language-server/languageDetection.js +56 -0
  53. package/out/language-server/languageDetection.js.map +1 -0
  54. package/out/language-server/mergeRightUtils.d.ts +6 -0
  55. package/out/language-server/mergeRightUtils.js +37 -0
  56. package/out/language-server/mergeRightUtils.js.map +1 -0
  57. package/out/language-server/mergeRightUtils.test.d.ts +1 -0
  58. package/out/language-server/mergeRightUtils.test.js +53 -0
  59. package/out/language-server/mergeRightUtils.test.js.map +1 -0
  60. package/out/language-server/proxy-server.d.ts +2 -0
  61. package/out/language-server/proxy-server.js +35 -0
  62. package/out/language-server/proxy-server.js.map +1 -0
  63. package/out/language-server/securityScan/securityScanHandler.d.ts +17 -0
  64. package/out/language-server/securityScan/securityScanHandler.js +139 -0
  65. package/out/language-server/securityScan/securityScanHandler.js.map +1 -0
  66. package/out/language-server/securityScan/securityScanHandler.test.d.ts +1 -0
  67. package/out/language-server/securityScan/securityScanHandler.test.js +170 -0
  68. package/out/language-server/securityScan/securityScanHandler.test.js.map +1 -0
  69. package/out/language-server/securityScan/types.d.ts +49 -0
  70. package/out/language-server/securityScan/types.js +3 -0
  71. package/out/language-server/securityScan/types.js.map +1 -0
  72. package/out/language-server/session/sessionManager.d.ts +91 -0
  73. package/out/language-server/session/sessionManager.js +234 -0
  74. package/out/language-server/session/sessionManager.js.map +1 -0
  75. package/out/language-server/session/sessionManager.test.d.ts +1 -0
  76. package/out/language-server/session/sessionManager.test.js +584 -0
  77. package/out/language-server/session/sessionManager.test.js.map +1 -0
  78. package/out/language-server/telemetry/codePercentage.d.ts +17 -0
  79. package/out/language-server/telemetry/codePercentage.js +82 -0
  80. package/out/language-server/telemetry/codePercentage.js.map +1 -0
  81. package/out/language-server/telemetry/codePercentage.test.d.ts +1 -0
  82. package/out/language-server/telemetry/codePercentage.test.js +85 -0
  83. package/out/language-server/telemetry/codePercentage.test.js.map +1 -0
  84. package/out/language-server/telemetry/types.d.ts +68 -0
  85. package/out/language-server/telemetry/types.js +3 -0
  86. package/out/language-server/telemetry/types.js.map +1 -0
  87. package/out/language-server/telemetry/userTriggerDecision.test.d.ts +1 -0
  88. package/out/language-server/telemetry/userTriggerDecision.test.js +946 -0
  89. package/out/language-server/telemetry/userTriggerDecision.test.js.map +1 -0
  90. package/out/language-server/telemetry.test.d.ts +1 -0
  91. package/out/language-server/telemetry.test.js +96 -0
  92. package/out/language-server/telemetry.test.js.map +1 -0
  93. package/out/language-server/testUtils.d.ts +69 -0
  94. package/out/language-server/testUtils.js +90 -0
  95. package/out/language-server/testUtils.js.map +1 -0
  96. package/out/language-server/utils.d.ts +6 -0
  97. package/out/language-server/utils.js +31 -0
  98. package/out/language-server/utils.js.map +1 -0
  99. package/package.json +53 -0
  100. package/script/generateServiceClient.ts +242 -0
@@ -0,0 +1,49 @@
1
+ export interface RecommendationDescription {
2
+ text: string;
3
+ markdown: string;
4
+ }
5
+ export interface Recommendation {
6
+ text: string;
7
+ url: string;
8
+ }
9
+ export interface SuggestedFix {
10
+ description: string;
11
+ code: string;
12
+ }
13
+ export interface Remediation {
14
+ recommendation: Recommendation;
15
+ suggestedFixes: SuggestedFix[];
16
+ }
17
+ export interface RawCodeScanIssue {
18
+ filePath: string;
19
+ startLine: number;
20
+ endLine: number;
21
+ title: string;
22
+ description: RecommendationDescription;
23
+ detectorId: string;
24
+ detectorName: string;
25
+ findingId: string;
26
+ ruleId?: string;
27
+ relatedVulnerabilities: string[];
28
+ severity: string;
29
+ remediation: Remediation;
30
+ }
31
+ export interface CodeScanIssue {
32
+ startLine: number;
33
+ endLine: number;
34
+ comment: string;
35
+ title: string;
36
+ description: RecommendationDescription;
37
+ detectorId: string;
38
+ detectorName: string;
39
+ findingId: string;
40
+ ruleId?: string;
41
+ relatedVulnerabilities: string[];
42
+ severity: string;
43
+ recommendation: Recommendation;
44
+ suggestedFixes: SuggestedFix[];
45
+ }
46
+ export interface AggregatedCodeScanIssue {
47
+ filePath: string;
48
+ issues: CodeScanIssue[];
49
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/language-server/securityScan/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import { InlineCompletionStates } from '@aws/language-server-runtimes/out/features/lsp/inline-completions/protocolExtensions';
2
+ import { Position } from 'vscode-languageserver';
3
+ import { CodewhispererAutomatedTriggerType, CodewhispererTriggerType } from '../auto-trigger/autoTrigger';
4
+ import { GenerateSuggestionsRequest, ResponseContext, Suggestion } from '../codeWhispererService';
5
+ import { CodewhispererLanguage } from '../languageDetection';
6
+ type SessionState = 'REQUESTING' | 'ACTIVE' | 'CLOSED' | 'ERROR' | 'DISCARD';
7
+ export type UserDecision = 'Empty' | 'Filter' | 'Discard' | 'Accept' | 'Ignore' | 'Reject' | 'Unseen';
8
+ type UserTriggerDecision = 'Accept' | 'Reject' | 'Empty' | 'Discard';
9
+ export interface SessionData {
10
+ startPosition: Position;
11
+ triggerType: CodewhispererTriggerType;
12
+ autoTriggerType?: CodewhispererAutomatedTriggerType;
13
+ triggerCharacter?: string;
14
+ classifierResult?: number;
15
+ classifierThreshold?: number;
16
+ language: CodewhispererLanguage;
17
+ requestContext: GenerateSuggestionsRequest;
18
+ credentialStartUrl?: string;
19
+ }
20
+ export declare class CodeWhispererSession {
21
+ id: string;
22
+ startTime: number;
23
+ closeTime?: number;
24
+ state: SessionState;
25
+ codewhispererSessionId?: string;
26
+ startPosition: Position;
27
+ suggestions: Suggestion[];
28
+ suggestionsStates: Map<string, UserDecision>;
29
+ acceptedSuggestionId?: string;
30
+ responseContext?: ResponseContext;
31
+ triggerType: CodewhispererTriggerType;
32
+ autoTriggerType?: CodewhispererAutomatedTriggerType;
33
+ triggerCharacter?: string;
34
+ classifierResult?: number;
35
+ classifierThreshold?: number;
36
+ language: CodewhispererLanguage;
37
+ requestContext: GenerateSuggestionsRequest;
38
+ timeToFirstRecommendation: number;
39
+ credentialStartUrl?: string;
40
+ completionSessionResult?: {
41
+ [itemId: string]: InlineCompletionStates;
42
+ };
43
+ firstCompletionDisplayLatency?: number;
44
+ totalSessionDisplayTime?: number;
45
+ typeaheadLength?: number;
46
+ previousTriggerDecision?: UserTriggerDecision;
47
+ previousTriggerDecisionTime?: number;
48
+ reportedUserDecision: boolean;
49
+ constructor(data: SessionData);
50
+ generateSessionId(): string;
51
+ get lastSuggestionIndex(): number;
52
+ activate(): void;
53
+ close(): void;
54
+ discard(): void;
55
+ setClientResultData(completionSessionResult: {
56
+ [itemId: string]: InlineCompletionStates;
57
+ }, firstCompletionDisplayLatency?: number, totalSessionDisplayTime?: number, typeaheadLength?: number): void;
58
+ setSuggestionState(id: string, state: UserDecision): void;
59
+ getSuggestionState(id: string): UserDecision | undefined;
60
+ /**
61
+ * Aggregate recommendation level user decision to trigger level user decision based on the following rule
62
+ * - Accept if there is an Accept
63
+ * - Reject if there is a Reject
64
+ * - Empty if all decisions are Empty
65
+ * - Discard otherwise
66
+ */
67
+ getAggregatedUserTriggerDecision(): UserTriggerDecision | undefined;
68
+ }
69
+ export declare class SessionManager {
70
+ private static _instance?;
71
+ private currentSession?;
72
+ private sessionsLog;
73
+ private maxHistorySize;
74
+ private constructor();
75
+ /**
76
+ * Singleton SessionManager class
77
+ */
78
+ static getInstance(): SessionManager;
79
+ static reset(): void;
80
+ createSession(data: SessionData): CodeWhispererSession;
81
+ closeCurrentSession(): void;
82
+ closeSession(session: CodeWhispererSession): void;
83
+ discardSession(session: CodeWhispererSession): void;
84
+ getCurrentSession(): CodeWhispererSession | undefined;
85
+ getActiveSession(): CodeWhispererSession | undefined;
86
+ getPreviousSession(): CodeWhispererSession | undefined;
87
+ getSessionsLog(): CodeWhispererSession[];
88
+ getSessionById(id: string): CodeWhispererSession | undefined;
89
+ activateSession(session: CodeWhispererSession): void;
90
+ }
91
+ export {};
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionManager = exports.CodeWhispererSession = void 0;
4
+ const uuid_1 = require("uuid");
5
+ class CodeWhispererSession {
6
+ constructor(data) {
7
+ // Time when Session was closed and final state of user decisions is recorded in suggestionsStates
8
+ this.closeTime = 0;
9
+ this.startPosition = {
10
+ line: 0,
11
+ character: 0,
12
+ };
13
+ this.suggestions = [];
14
+ this.suggestionsStates = new Map();
15
+ this.acceptedSuggestionId = undefined;
16
+ this.timeToFirstRecommendation = 0;
17
+ this.reportedUserDecision = false;
18
+ this.id = this.generateSessionId();
19
+ this.credentialStartUrl = data.credentialStartUrl;
20
+ this.startPosition = data.startPosition;
21
+ this.triggerType = data.triggerType;
22
+ this.language = data.language;
23
+ this.requestContext = data.requestContext;
24
+ this.autoTriggerType = data.autoTriggerType || undefined;
25
+ this.triggerCharacter = data.triggerCharacter;
26
+ this.classifierResult = data.classifierResult;
27
+ this.classifierThreshold = data.classifierThreshold;
28
+ this.state = 'REQUESTING';
29
+ this.startTime = new Date().getTime();
30
+ }
31
+ // This function makes it possible to stub uuidv4 calls in tests
32
+ generateSessionId() {
33
+ return (0, uuid_1.v4)();
34
+ }
35
+ get lastSuggestionIndex() {
36
+ return this.suggestions.length - 1;
37
+ }
38
+ activate() {
39
+ if (this.state !== 'CLOSED' && this.state !== 'DISCARD') {
40
+ this.state = 'ACTIVE';
41
+ }
42
+ }
43
+ close() {
44
+ if (this.state === 'CLOSED' || this.state === 'DISCARD') {
45
+ return;
46
+ }
47
+ // If completionSessionResult are not set when session is closing, assume all suggestions were discarder by default.
48
+ // We can't assume if they were seen or not to use Unseen state until completionSessionResult are provided.
49
+ // In this implementation session will not wait for result request to close itself
50
+ // and will record Trigger Decision only based on server known states.
51
+ if (!this.completionSessionResult) {
52
+ for (const suggestion of this.suggestions) {
53
+ if (!this.suggestionsStates.has(suggestion.itemId)) {
54
+ this.suggestionsStates.set(suggestion.itemId, 'Discard');
55
+ }
56
+ }
57
+ }
58
+ this.closeTime = new Date().getTime();
59
+ this.state = 'CLOSED';
60
+ }
61
+ discard() {
62
+ if (this.state === 'DISCARD') {
63
+ return;
64
+ }
65
+ // Force Discard trigger decision on every suggestion, if available
66
+ for (const suggestion of this.suggestions) {
67
+ this.suggestionsStates.set(suggestion.itemId, 'Discard');
68
+ }
69
+ this.closeTime = new Date().getTime();
70
+ this.state = 'DISCARD';
71
+ }
72
+ setClientResultData(completionSessionResult, firstCompletionDisplayLatency, totalSessionDisplayTime, typeaheadLength) {
73
+ // Skip if session results were already recorded for session of session is closed
74
+ if (this.state === 'CLOSED' || this.state === 'DISCARD' || this.completionSessionResult) {
75
+ return;
76
+ }
77
+ this.completionSessionResult = completionSessionResult;
78
+ let hasAcceptedSuggestion = false;
79
+ const sessionResults = Object.entries(completionSessionResult);
80
+ for (let [itemId, states] of sessionResults) {
81
+ if (states.accepted) {
82
+ this.acceptedSuggestionId = itemId;
83
+ hasAcceptedSuggestion = true;
84
+ continue;
85
+ }
86
+ }
87
+ const validSuggestionIds = this.suggestions.map(s => s.itemId);
88
+ for (let itemId in completionSessionResult) {
89
+ // Skip suggestion ids that were not recorded for this session
90
+ if (!validSuggestionIds.includes(itemId)) {
91
+ continue;
92
+ }
93
+ // Compute sugestion state based on fields.
94
+ // State flags represent suggestions state in client UI at the moment when user made a decision about this siggestions
95
+ const states = completionSessionResult[itemId];
96
+ if (states.discarded) {
97
+ this.setSuggestionState(itemId, 'Discard');
98
+ }
99
+ else if (!states.seen) {
100
+ this.setSuggestionState(itemId, 'Unseen');
101
+ // Seen suggestions:
102
+ }
103
+ else if (states.accepted) {
104
+ this.setSuggestionState(itemId, 'Accept');
105
+ }
106
+ else if (hasAcceptedSuggestion && this.acceptedSuggestionId !== itemId) {
107
+ // User accepted different suggestion
108
+ this.setSuggestionState(itemId, 'Ignore');
109
+ }
110
+ else {
111
+ // No recommendation was accepted, but user have seen this suggestion
112
+ this.setSuggestionState(itemId, 'Reject');
113
+ }
114
+ }
115
+ this.firstCompletionDisplayLatency = firstCompletionDisplayLatency;
116
+ this.totalSessionDisplayTime = totalSessionDisplayTime;
117
+ this.typeaheadLength = typeaheadLength;
118
+ }
119
+ setSuggestionState(id, state) {
120
+ this.suggestionsStates.set(id, state);
121
+ }
122
+ getSuggestionState(id) {
123
+ return this.suggestionsStates.get(id);
124
+ }
125
+ /**
126
+ * Aggregate recommendation level user decision to trigger level user decision based on the following rule
127
+ * - Accept if there is an Accept
128
+ * - Reject if there is a Reject
129
+ * - Empty if all decisions are Empty
130
+ * - Discard otherwise
131
+ */
132
+ getAggregatedUserTriggerDecision() {
133
+ // Force Discard trigger decision when session was explicitly discarded by server
134
+ if (this.state === 'DISCARD') {
135
+ return 'Discard';
136
+ }
137
+ // Can't report trigger decision until session is marked as closed
138
+ if (this.state !== 'CLOSED') {
139
+ return;
140
+ }
141
+ let isEmpty = true;
142
+ for (const state of this.suggestionsStates.values()) {
143
+ if (state === 'Accept') {
144
+ return 'Accept';
145
+ }
146
+ else if (state === 'Reject') {
147
+ return 'Reject';
148
+ }
149
+ else if (state !== 'Empty') {
150
+ isEmpty = false;
151
+ }
152
+ }
153
+ return isEmpty ? 'Empty' : 'Discard';
154
+ }
155
+ }
156
+ exports.CodeWhispererSession = CodeWhispererSession;
157
+ class SessionManager {
158
+ // TODO, for user decision telemetry: accepted suggestions (not necessarily the full corresponding session) should be stored for 5 minutes
159
+ constructor() {
160
+ this.sessionsLog = [];
161
+ this.maxHistorySize = 5;
162
+ }
163
+ /**
164
+ * Singleton SessionManager class
165
+ */
166
+ static getInstance() {
167
+ if (!SessionManager._instance) {
168
+ SessionManager._instance = new SessionManager();
169
+ }
170
+ return SessionManager._instance;
171
+ }
172
+ // For unit tests
173
+ static reset() {
174
+ SessionManager._instance = undefined;
175
+ }
176
+ createSession(data) {
177
+ this.closeCurrentSession();
178
+ // Remove oldest session from log
179
+ if (this.sessionsLog.length > this.maxHistorySize) {
180
+ this.sessionsLog.shift();
181
+ }
182
+ // Create new session
183
+ const session = new CodeWhispererSession(data);
184
+ const previousSession = this.getPreviousSession();
185
+ if (previousSession) {
186
+ session.previousTriggerDecision = previousSession.getAggregatedUserTriggerDecision();
187
+ session.previousTriggerDecisionTime = previousSession.closeTime;
188
+ }
189
+ this.currentSession = session;
190
+ this.sessionsLog.push(session);
191
+ return session;
192
+ }
193
+ closeCurrentSession() {
194
+ if (this.currentSession) {
195
+ this.closeSession(this.currentSession);
196
+ }
197
+ }
198
+ closeSession(session) {
199
+ session.close();
200
+ }
201
+ discardSession(session) {
202
+ session.discard();
203
+ }
204
+ getCurrentSession() {
205
+ return this.currentSession;
206
+ }
207
+ getActiveSession() {
208
+ if (this.currentSession && this.currentSession.state == 'ACTIVE')
209
+ return this.currentSession;
210
+ }
211
+ getPreviousSession() {
212
+ if (this.sessionsLog.length > 0)
213
+ return this.sessionsLog.at(-1);
214
+ }
215
+ getSessionsLog() {
216
+ return this.sessionsLog;
217
+ }
218
+ getSessionById(id) {
219
+ if (this.currentSession?.id === id)
220
+ return this.currentSession;
221
+ for (const session of this.sessionsLog) {
222
+ if (session.id === id)
223
+ return session;
224
+ }
225
+ }
226
+ // If the session to be activated is the current session, activate it
227
+ activateSession(session) {
228
+ if (this.currentSession === session) {
229
+ this.currentSession.activate();
230
+ }
231
+ }
232
+ }
233
+ exports.SessionManager = SessionManager;
234
+ //# sourceMappingURL=sessionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionManager.js","sourceRoot":"","sources":["../../../src/language-server/session/sessionManager.ts"],"names":[],"mappings":"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"}