@aws/lsp-codewhisperer 0.0.34 → 0.0.36

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 (103) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/out/client/token/bearer-token-service.json +91 -225
  3. package/out/language-server/agenticChat/agenticChatController.js +82 -29
  4. package/out/language-server/agenticChat/agenticChatController.js.map +1 -1
  5. package/out/language-server/agenticChat/agenticChatResultStream.js +3 -0
  6. package/out/language-server/agenticChat/agenticChatResultStream.js.map +1 -1
  7. package/out/language-server/agenticChat/constants.d.ts +3 -0
  8. package/out/language-server/agenticChat/constants.js +4 -1
  9. package/out/language-server/agenticChat/constants.js.map +1 -1
  10. package/out/language-server/agenticChat/context/agenticChatTriggerContext.d.ts +3 -8
  11. package/out/language-server/agenticChat/context/agenticChatTriggerContext.js +9 -2
  12. package/out/language-server/agenticChat/context/agenticChatTriggerContext.js.map +1 -1
  13. package/out/language-server/agenticChat/context/contextUtils.d.ts +20 -0
  14. package/out/language-server/agenticChat/context/contextUtils.js +107 -0
  15. package/out/language-server/agenticChat/context/contextUtils.js.map +1 -1
  16. package/out/language-server/agenticChat/errors.d.ts +2 -1
  17. package/out/language-server/agenticChat/errors.js +4 -1
  18. package/out/language-server/agenticChat/errors.js.map +1 -1
  19. package/out/language-server/agenticChat/tabBarController.js +1 -1
  20. package/out/language-server/agenticChat/tabBarController.js.map +1 -1
  21. package/out/language-server/agenticChat/tools/chatDb/chatDb.js +3 -2
  22. package/out/language-server/agenticChat/tools/chatDb/chatDb.js.map +1 -1
  23. package/out/language-server/agenticChat/tools/fileSearch.js +1 -1
  24. package/out/language-server/agenticChat/tools/fileSearch.js.map +1 -1
  25. package/out/language-server/agenticChat/tools/listDirectory.js +5 -5
  26. package/out/language-server/agenticChat/tools/listDirectory.js.map +1 -1
  27. package/out/language-server/chat/chatController.js +1 -1
  28. package/out/language-server/chat/chatController.js.map +1 -1
  29. package/out/language-server/chat/chatSessionService.d.ts +5 -0
  30. package/out/language-server/chat/chatSessionService.js +4 -1
  31. package/out/language-server/chat/chatSessionService.js.map +1 -1
  32. package/out/language-server/chat/constants.d.ts +3 -1
  33. package/out/language-server/chat/constants.js +15 -2
  34. package/out/language-server/chat/constants.js.map +1 -1
  35. package/out/language-server/chat/contexts/triggerContext.d.ts +3 -1
  36. package/out/language-server/chat/contexts/triggerContext.js +14 -1
  37. package/out/language-server/chat/contexts/triggerContext.js.map +1 -1
  38. package/out/language-server/configuration/qConfigurationServer.d.ts +8 -1
  39. package/out/language-server/configuration/qConfigurationServer.js +107 -8
  40. package/out/language-server/configuration/qConfigurationServer.js.map +1 -1
  41. package/out/language-server/inline-completion/codeWhispererServer.js +15 -2
  42. package/out/language-server/inline-completion/codeWhispererServer.js.map +1 -1
  43. package/out/language-server/netTransform/resources/SupportedProjects.js +1 -7
  44. package/out/language-server/netTransform/resources/SupportedProjects.js.map +1 -1
  45. package/out/language-server/workspaceContext/artifactManager.d.ts +44 -0
  46. package/out/language-server/workspaceContext/artifactManager.js +496 -0
  47. package/out/language-server/workspaceContext/artifactManager.js.map +1 -0
  48. package/out/language-server/workspaceContext/client.d.ts +23 -0
  49. package/out/language-server/workspaceContext/client.js +172 -0
  50. package/out/language-server/workspaceContext/client.js.map +1 -0
  51. package/out/language-server/workspaceContext/dependency/dependencyDiscoverer.d.ts +15 -0
  52. package/out/language-server/workspaceContext/dependency/dependencyDiscoverer.js +129 -0
  53. package/out/language-server/workspaceContext/dependency/dependencyDiscoverer.js.map +1 -0
  54. package/out/language-server/workspaceContext/dependency/dependencyHandler/JSTSDependencyHandler.d.ts +18 -0
  55. package/out/language-server/workspaceContext/dependency/dependencyHandler/JSTSDependencyHandler.js +204 -0
  56. package/out/language-server/workspaceContext/dependency/dependencyHandler/JSTSDependencyHandler.js.map +1 -0
  57. package/out/language-server/workspaceContext/dependency/dependencyHandler/JavaDependencyHandler.d.ts +16 -0
  58. package/out/language-server/workspaceContext/dependency/dependencyHandler/JavaDependencyHandler.js +160 -0
  59. package/out/language-server/workspaceContext/dependency/dependencyHandler/JavaDependencyHandler.js.map +1 -0
  60. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandler.d.ts +78 -0
  61. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandler.js +255 -0
  62. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandler.js.map +1 -0
  63. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandlerFactory.d.ts +7 -0
  64. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandlerFactory.js +23 -0
  65. package/out/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandlerFactory.js.map +1 -0
  66. package/out/language-server/workspaceContext/dependency/dependencyHandler/PythonDependencyHandler.d.ts +46 -0
  67. package/out/language-server/workspaceContext/dependency/dependencyHandler/PythonDependencyHandler.js +233 -0
  68. package/out/language-server/workspaceContext/dependency/dependencyHandler/PythonDependencyHandler.js.map +1 -0
  69. package/out/language-server/workspaceContext/javaManager.d.ts +92 -0
  70. package/out/language-server/workspaceContext/javaManager.js +710 -0
  71. package/out/language-server/workspaceContext/javaManager.js.map +1 -0
  72. package/out/language-server/workspaceContext/util.d.ts +10 -0
  73. package/out/language-server/workspaceContext/util.js +72 -0
  74. package/out/language-server/workspaceContext/util.js.map +1 -0
  75. package/out/language-server/workspaceContext/workspaceContextServer.d.ts +2 -0
  76. package/out/language-server/workspaceContext/workspaceContextServer.js +414 -0
  77. package/out/language-server/workspaceContext/workspaceContextServer.js.map +1 -0
  78. package/out/language-server/workspaceContext/workspaceFolderManager.d.ts +113 -0
  79. package/out/language-server/workspaceContext/workspaceFolderManager.js +827 -0
  80. package/out/language-server/workspaceContext/workspaceFolderManager.js.map +1 -0
  81. package/out/shared/amazonQServiceManager/qDeveloperProfiles.js.map +1 -1
  82. package/out/shared/codeWhispererService.d.ts +13 -0
  83. package/out/shared/codeWhispererService.js +24 -0
  84. package/out/shared/codeWhispererService.js.map +1 -1
  85. package/out/shared/languageDetection.d.ts +27 -0
  86. package/out/shared/languageDetection.js +44 -1
  87. package/out/shared/languageDetection.js.map +1 -1
  88. package/out/shared/localProjectContextController.d.ts +1 -0
  89. package/out/shared/localProjectContextController.js +7 -9
  90. package/out/shared/localProjectContextController.js.map +1 -1
  91. package/out/shared/proxy-server.d.ts +1 -0
  92. package/out/shared/proxy-server.js +3 -1
  93. package/out/shared/proxy-server.js.map +1 -1
  94. package/out/shared/supplementalContextUtil/crossFileContextUtil.d.ts +4 -3
  95. package/out/shared/supplementalContextUtil/crossFileContextUtil.js +16 -5
  96. package/out/shared/supplementalContextUtil/crossFileContextUtil.js.map +1 -1
  97. package/out/shared/supplementalContextUtil/supplementalContextUtil.d.ts +2 -1
  98. package/out/shared/supplementalContextUtil/supplementalContextUtil.js +2 -2
  99. package/out/shared/supplementalContextUtil/supplementalContextUtil.js.map +1 -1
  100. package/out/shared/utils.d.ts +1 -0
  101. package/out/shared/utils.js +15 -1
  102. package/out/shared/utils.js.map +1 -1
  103. package/package.json +9 -3
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JavaDependencyHandler = void 0;
4
+ const LanguageDependencyHandler_1 = require("./LanguageDependencyHandler");
5
+ const path = require("path");
6
+ const fs = require("fs");
7
+ const xml2js = require("xml2js");
8
+ /*
9
+ * Java Dependency Handler
10
+ *
11
+ * This handler depends on .classpath to discover dependency locations
12
+ */
13
+ class JavaDependencyHandler extends LanguageDependencyHandler_1.LanguageDependencyHandler {
14
+ javaDependencyInfos = [];
15
+ RELATIVE_PATH = 'dependencies';
16
+ /*
17
+ * It will return a boolean indicating whether it finds any dependency info.
18
+ * The JavaDependencyInfo object contains the following properties:
19
+ * - pkgDir: the package directory
20
+ * - dotClasspathPath: the path to the .classpath file
21
+ */
22
+ discover(currentDir, workspaceFolder) {
23
+ let result = null;
24
+ const dotClasspathPath = path.join(currentDir, '.classpath');
25
+ if (fs.existsSync(dotClasspathPath) && fs.statSync(dotClasspathPath).isFile()) {
26
+ this.logging.log(`Found .classpath in ${currentDir}`);
27
+ result = {
28
+ pkgDir: currentDir,
29
+ dotClasspathPath: dotClasspathPath,
30
+ workspaceFolder: workspaceFolder,
31
+ };
32
+ this.javaDependencyInfos.push(result);
33
+ }
34
+ return result !== null;
35
+ }
36
+ /*
37
+ * It will create a dependency map from the .classpath file.
38
+ * The dependency map will contain the following properties:
39
+ * - name: the name of the dependency
40
+ * - version: the version of the dependency
41
+ * - path: the path to the dependency
42
+ */
43
+ initiateDependencyMap(folders) {
44
+ // Filter out the javaDependencyInfos that are in the folders
45
+ const javaDependencyInfoToBeInitiated = this.javaDependencyInfos.filter(javaDependencyInfo => {
46
+ return folders.includes(javaDependencyInfo.workspaceFolder);
47
+ });
48
+ for (const javaDependencyInfo of javaDependencyInfoToBeInitiated) {
49
+ // TODO, check if try catch is necessary here
50
+ try {
51
+ let generatedDependencyMap = this.generateDependencyMap(javaDependencyInfo);
52
+ this.compareAndUpdateDependencyMap(javaDependencyInfo.workspaceFolder, generatedDependencyMap).catch(error => {
53
+ this.logging.warn(`Error processing Java dependencies: ${error}`);
54
+ });
55
+ // Log found dependencies
56
+ this.logging.log(`Total Java dependencies found: ${generatedDependencyMap.size} under ${javaDependencyInfo.pkgDir}`);
57
+ }
58
+ catch (error) {
59
+ this.logging.warn(`Error processing Java dependencies: ${error}`);
60
+ }
61
+ }
62
+ }
63
+ /*
64
+ * It will setup watchers for the .classpath files.
65
+ * When a change is detected, it will update the dependency map.
66
+ */
67
+ setupWatchers(folders) {
68
+ // Filter out the javaDependencyInfos that are in the folders
69
+ const javaDependencyInfoToBeWatched = this.javaDependencyInfos.filter(javaDependencyInfo => {
70
+ return folders.includes(javaDependencyInfo.workspaceFolder);
71
+ });
72
+ javaDependencyInfoToBeWatched.forEach((javaDependencyInfo) => {
73
+ const dotClasspathPath = javaDependencyInfo.dotClasspathPath;
74
+ if (this.dependencyWatchers.has(dotClasspathPath)) {
75
+ return;
76
+ }
77
+ this.logging.log(`Setting up Java dependency watcher for ${dotClasspathPath}`);
78
+ try {
79
+ const watcher = fs.watch(dotClasspathPath, async (eventType, filename) => {
80
+ if (eventType === 'change') {
81
+ this.logging.log(`Change detected in ${dotClasspathPath}`);
82
+ const updatedDependencyMap = this.generateDependencyMap(javaDependencyInfo);
83
+ let zips = await this.compareAndUpdateDependencyMap(javaDependencyInfo.workspaceFolder, updatedDependencyMap, true);
84
+ this.emitDependencyChange(javaDependencyInfo.workspaceFolder, zips);
85
+ }
86
+ });
87
+ this.dependencyWatchers.set(dotClasspathPath, watcher);
88
+ }
89
+ catch (error) {
90
+ this.logging.warn(`Error setting up watcher for ${dotClasspathPath}: ${error}`);
91
+ }
92
+ });
93
+ }
94
+ /*
95
+ * It will parse .classpath file and find location of dependency jars with version
96
+ */
97
+ generateDependencyMap(javaDependencyInfo) {
98
+ const dependencyMap = new Map();
99
+ // Read and parse .classpath XML file
100
+ const dotClasspathPath = javaDependencyInfo.dotClasspathPath;
101
+ const parser = new xml2js.Parser();
102
+ const classpathContent = fs.readFileSync(dotClasspathPath, 'utf-8');
103
+ parser.parseString(classpathContent, (err, result) => {
104
+ if (err) {
105
+ this.logging.log(`Error parsing .classpath: ${err}`);
106
+ return;
107
+ }
108
+ // Process classpathentry elements
109
+ if (result.classpath && result.classpath.classpathentry) {
110
+ result.classpath.classpathentry.forEach((entry) => {
111
+ if (entry.$ && entry.$.kind === 'lib' && entry.$.path) {
112
+ const jarPath = entry.$.path;
113
+ const jarName = path.basename(jarPath);
114
+ this.transformPathToDependency(jarName, jarPath, dependencyMap);
115
+ }
116
+ });
117
+ }
118
+ });
119
+ return dependencyMap;
120
+ }
121
+ transformPathToDependency(dependencyName, dependencyPath, dependencyMap) {
122
+ // Extract name and version from jar path
123
+ // Example path patterns:
124
+ // - lib/dependency-1.2.3.jar
125
+ // - lib/dependency-1.2.3-SNAPSHOT.jar
126
+ // - ~/.m2/repository/com/example/dependency/1.2.3/dependency-1.2.3.jar
127
+ const match = dependencyName.match(/^(.*?)(?:-([\d.]+(?:-SNAPSHOT)?))?.jar$/);
128
+ if (match) {
129
+ const name = match[1];
130
+ const version = match[2] || 'unknown';
131
+ if (fs.existsSync(dependencyPath) && path.isAbsolute(dependencyPath)) {
132
+ dependencyMap.set(name, {
133
+ name,
134
+ version,
135
+ path: dependencyPath,
136
+ size: fs.statSync(dependencyPath).size,
137
+ zipped: false,
138
+ });
139
+ }
140
+ }
141
+ }
142
+ disposeWatchers(workspaceFolder) {
143
+ this.javaDependencyInfos.forEach((javaDependencyInfo) => {
144
+ if (workspaceFolder.uri === javaDependencyInfo.workspaceFolder.uri) {
145
+ const dotClasspathPath = javaDependencyInfo.dotClasspathPath;
146
+ if (this.dependencyWatchers.has(dotClasspathPath)) {
147
+ this.logging.log(`Disposing dependency watcher for ${dotClasspathPath}`);
148
+ this.dependencyWatchers.get(dotClasspathPath)?.close();
149
+ this.dependencyWatchers.delete(dotClasspathPath);
150
+ }
151
+ }
152
+ });
153
+ }
154
+ disposeDependencyInfo(workspaceFolder) {
155
+ // Remove the dependency info for the workspace folder
156
+ this.javaDependencyInfos = this.javaDependencyInfos.filter((javaDependencyInfo) => javaDependencyInfo.workspaceFolder.uri !== workspaceFolder.uri);
157
+ }
158
+ }
159
+ exports.JavaDependencyHandler = JavaDependencyHandler;
160
+ //# sourceMappingURL=JavaDependencyHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JavaDependencyHandler.js","sourceRoot":"","sources":["../../../../../src/language-server/workspaceContext/dependency/dependencyHandler/JavaDependencyHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { Logging, Workspace, WorkspaceFolder } from '@aws/language-server-runtimes/server-interface';
2
+ import * as fs from 'fs';
3
+ import { ArtifactManager, FileMetadata } from '../../artifactManager';
4
+ import { EventEmitter } from 'events';
5
+ import { CodewhispererLanguage } from '../../../../shared/languageDetection';
6
+ export interface Dependency {
7
+ name: string;
8
+ version: string;
9
+ path: string;
10
+ size: number;
11
+ zipped: boolean;
12
+ }
13
+ export interface BaseDependencyInfo {
14
+ pkgDir: string;
15
+ workspaceFolder: WorkspaceFolder;
16
+ }
17
+ export declare abstract class LanguageDependencyHandler<T extends BaseDependencyInfo> {
18
+ language: CodewhispererLanguage;
19
+ protected workspace: Workspace;
20
+ protected logging: Logging;
21
+ protected workspaceFolders: WorkspaceFolder[];
22
+ protected dependencyMap: Map<WorkspaceFolder, Map<string, Dependency>>;
23
+ protected dependencyUploadedSize: Map<WorkspaceFolder, number>;
24
+ protected dependencyWatchers: Map<string, fs.FSWatcher>;
25
+ protected artifactManager: ArtifactManager;
26
+ protected dependenciesFolderName: string;
27
+ protected eventEmitter: EventEmitter;
28
+ protected readonly MAX_SINGLE_DEPENDENCY_SIZE: number;
29
+ protected readonly MAX_WORKSPACE_DEPENDENCY_SIZE: number;
30
+ constructor(language: CodewhispererLanguage, workspace: Workspace, logging: Logging, workspaceFolders: WorkspaceFolder[], artifactManager: ArtifactManager, dependenciesFolderName: string);
31
+ abstract discover(currentDir: string, workspaceFolder: WorkspaceFolder): boolean;
32
+ abstract initiateDependencyMap(folders: WorkspaceFolder[]): void;
33
+ abstract setupWatchers(folders: WorkspaceFolder[]): void;
34
+ /**
35
+ * Transform dependency path from LSP to dependency. Java and Python will have different logic to implement
36
+ * @param dependencyName
37
+ * @param dependencyPath
38
+ * @param dependencyMap
39
+ */
40
+ protected abstract transformPathToDependency(dependencyName: string, dependencyPath: string, dependencyMap: Map<string, Dependency>): void;
41
+ onDependencyChange(callback: (workspaceFolder: WorkspaceFolder, zips: FileMetadata[]) => void): void;
42
+ protected emitDependencyChange(workspaceFolder: WorkspaceFolder, zips: FileMetadata[]): void;
43
+ /**
44
+ * Update dependency map based on didChangeDependencyPaths LSP. Javascript and Typescript will not use LSP so no need to implement this method
45
+ * @param paths
46
+ * @param workspaceRoot
47
+ */
48
+ updateDependencyMapBasedOnLSP(paths: string[], workspaceFolder?: WorkspaceFolder): Promise<void>;
49
+ zipDependencyMap(folders: WorkspaceFolder[]): Promise<void>;
50
+ private generateFileMetadata;
51
+ private processChunk;
52
+ protected abstract generateDependencyMap(dependencyInfo: T, dependencyMap: Map<string, Dependency>): void;
53
+ protected compareAndUpdateDependencyMap(workspaceFolder: WorkspaceFolder, updatedDependencyMap: Map<string, Dependency>, zipChanges?: boolean): Promise<FileMetadata[]>;
54
+ private validateSingleDependencySize;
55
+ /**
56
+ * This validation will calculate how such of size of dependencies uploaded per workspace.
57
+ *
58
+ * This validation is only used for new dependency being uploaded.
59
+ * Existing dependencies will be uploaded as long as single size didn't exceed
60
+ *
61
+ * The dependency map doesn't get updated when dependency is deleted so that this validation may be
62
+ * false positive when large of dependencies is deleted.
63
+ * However, everytime flare server restarts, this dependency map will be initialized.
64
+ */
65
+ private validateWorkspaceDependencySize;
66
+ dispose(): void;
67
+ disposeWorkspaceFolder(workspaceFolder: WorkspaceFolder): void;
68
+ /**
69
+ * Dispose watchers for one workspace folder.
70
+ * This needs to be implemented in individual language because watcher are mapped with watched folder paths.
71
+ * @param workspaceFolder
72
+ */
73
+ abstract disposeWatchers(workspaceFolder: WorkspaceFolder): void;
74
+ abstract disposeDependencyInfo(workspaceFolder: WorkspaceFolder): void;
75
+ protected getDirectorySize(directoryPath: string): number;
76
+ protected isDependencyZipped(dependencyName: string, workspaceFolder: WorkspaceFolder): boolean | undefined;
77
+ cleanupZipFiles(zipFileMetadata: FileMetadata[]): Promise<void>;
78
+ }
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LanguageDependencyHandler = void 0;
4
+ const fs = require("fs");
5
+ const path = require("path");
6
+ const events_1 = require("events");
7
+ // Abstract base class for all language dependency handlers
8
+ class LanguageDependencyHandler {
9
+ language;
10
+ workspace;
11
+ logging;
12
+ workspaceFolders;
13
+ // key: workspaceFolder, value: {key: dependency name, value: Dependency}
14
+ dependencyMap = new Map();
15
+ dependencyUploadedSize = new Map();
16
+ dependencyWatchers = new Map();
17
+ artifactManager;
18
+ dependenciesFolderName;
19
+ eventEmitter;
20
+ MAX_SINGLE_DEPENDENCY_SIZE = 500 * 1024 * 1024; // 500 MB
21
+ MAX_WORKSPACE_DEPENDENCY_SIZE = 5 * 1024 * 1024 * 1024; //5 GB
22
+ constructor(language, workspace, logging, workspaceFolders, artifactManager, dependenciesFolderName) {
23
+ this.language = language;
24
+ this.workspace = workspace;
25
+ this.logging = logging;
26
+ this.workspaceFolders = workspaceFolders;
27
+ this.artifactManager = artifactManager;
28
+ this.dependenciesFolderName = dependenciesFolderName;
29
+ // For each language, the dependency handler initializes dependency map per workspaceSpace folder
30
+ // regardless of knowing whether the workspaceFolder has the language
31
+ // to resolve the race condition when didChangeDependencyPaths LSP and dependency discover may override the dependency map.
32
+ this.workspaceFolders.forEach(workSpaceFolder => this.dependencyMap.set(workSpaceFolder, new Map()));
33
+ this.eventEmitter = new events_1.EventEmitter();
34
+ }
35
+ onDependencyChange(callback) {
36
+ this.eventEmitter.on('dependencyChange', callback);
37
+ }
38
+ emitDependencyChange(workspaceFolder, zips) {
39
+ if (zips.length > 0) {
40
+ this.logging.log(`Emitting ${this.language} dependency change event for ${workspaceFolder.name}`);
41
+ this.eventEmitter.emit('dependencyChange', workspaceFolder, zips);
42
+ return;
43
+ }
44
+ }
45
+ /**
46
+ * Update dependency map based on didChangeDependencyPaths LSP. Javascript and Typescript will not use LSP so no need to implement this method
47
+ * @param paths
48
+ * @param workspaceRoot
49
+ */
50
+ async updateDependencyMapBasedOnLSP(paths, workspaceFolder) {
51
+ const dependencyMap = new Map();
52
+ paths.forEach((dependencyPath) => {
53
+ // basename of the path should be the dependency name
54
+ const dependencyName = path.basename(dependencyPath);
55
+ this.transformPathToDependency(dependencyName, dependencyPath, dependencyMap);
56
+ });
57
+ if (workspaceFolder) {
58
+ const zips = await this.compareAndUpdateDependencyMap(workspaceFolder, dependencyMap, true);
59
+ this.emitDependencyChange(workspaceFolder, zips);
60
+ }
61
+ }
62
+ async zipDependencyMap(folders) {
63
+ // Process each workspace folder sequentially
64
+ for (const [workspaceFolder, correspondingDependencyMap] of this.dependencyMap) {
65
+ // Check if the workspace folder is in the provided folders
66
+ if (!folders.includes(workspaceFolder)) {
67
+ continue;
68
+ }
69
+ const chunkZipFileMetadata = await this.generateFileMetadata([...correspondingDependencyMap.values()], workspaceFolder);
70
+ this.emitDependencyChange(workspaceFolder, chunkZipFileMetadata);
71
+ }
72
+ }
73
+ async generateFileMetadata(dependencyList, workspaceFolder) {
74
+ const zipFileMetadata = [];
75
+ const MAX_CHUNK_SIZE_BYTES = 100 * 1024 * 1024; // 100MB per chunk
76
+ // Process each workspace folder sequentially
77
+ let chunkIndex = 0;
78
+ let currentChunkSize = 0;
79
+ let currentChunk = [];
80
+ for (const dependency of dependencyList) {
81
+ // If adding this dependency would exceed the chunk size limit,
82
+ // process the current chunk first
83
+ if (currentChunkSize + dependency.size > MAX_CHUNK_SIZE_BYTES && currentChunk.length > 0) {
84
+ // Process current chunk
85
+ this.logging.log(`Under ${workspaceFolder.name}, #${chunkIndex} chunk containing ${this.language} dependencies with size: ${currentChunkSize} has reached chunk limit. Start to process...`);
86
+ await this.processChunk(currentChunk, workspaceFolder, zipFileMetadata, chunkIndex);
87
+ // Reset chunk
88
+ currentChunk = [];
89
+ currentChunkSize = 0;
90
+ chunkIndex++;
91
+ // Add a small delay between chunks
92
+ await new Promise(resolve => setTimeout(resolve, 100));
93
+ }
94
+ // Add dependency to current chunk. If the dependency has been zipped, skip it.
95
+ if (!this.isDependencyZipped(dependency.name, workspaceFolder)) {
96
+ if (!this.validateSingleDependencySize(workspaceFolder, dependency)) {
97
+ this.logging.warn(`Dependency ${dependency.name} size exceeds the limit.`);
98
+ continue;
99
+ }
100
+ if (!this.validateWorkspaceDependencySize(workspaceFolder)) {
101
+ this.logging.warn(`Workspace ${workspaceFolder.name} dependency size exceeds the limit.`);
102
+ break;
103
+ }
104
+ currentChunk.push(dependency);
105
+ currentChunkSize += dependency.size;
106
+ this.dependencyUploadedSize.set(workspaceFolder, (this.dependencyUploadedSize.get(workspaceFolder) || 0) + dependency.size);
107
+ // Mark this dependency that has been zipped
108
+ dependency.zipped = true;
109
+ this.dependencyMap.get(workspaceFolder)?.set(dependency.name, dependency);
110
+ }
111
+ }
112
+ // Process any remaining dependencies in the last chunk
113
+ if (currentChunk.length > 0) {
114
+ await this.processChunk(currentChunk, workspaceFolder, zipFileMetadata, chunkIndex);
115
+ }
116
+ return zipFileMetadata;
117
+ }
118
+ async processChunk(chunk, workspaceFolder, zipFileMetadata, chunkIndex) {
119
+ let fileMetadataList = [];
120
+ for (const dependency of chunk) {
121
+ try {
122
+ if (fs.existsSync(dependency.path)) {
123
+ const fileMetadata = await this.artifactManager.getFileMetadata(workspaceFolder, dependency.path, this.language, path.basename(dependency.path));
124
+ fileMetadataList.push(...fileMetadata);
125
+ }
126
+ }
127
+ catch (error) {
128
+ this.logging.warn(`Error processing dependency ${dependency.name}: ${error}`);
129
+ }
130
+ }
131
+ if (fileMetadataList.length > 0) {
132
+ try {
133
+ const singleZip = await this.artifactManager.createZipForDependencies(workspaceFolder, this.language, fileMetadataList, this.dependenciesFolderName, chunkIndex);
134
+ zipFileMetadata.push(singleZip);
135
+ const totalChunkSize = chunk.reduce((sum, dep) => sum + dep.size, 0);
136
+ // Log chunk statistics
137
+ this.logging.log(`Created zip: ${singleZip.filePath} for #${chunkIndex} chunk containing ${chunk.length} ${this.language} dependencies with total size: ${(totalChunkSize /
138
+ (1024 * 1024)).toFixed(2)}MB under ${workspaceFolder.name}`);
139
+ }
140
+ catch (error) {
141
+ this.logging.warn(`Error creating dependency zip for workspace ${workspaceFolder.uri}: ${error}`);
142
+ }
143
+ }
144
+ }
145
+ async compareAndUpdateDependencyMap(workspaceFolder, updatedDependencyMap, zipChanges = false) {
146
+ const changes = {
147
+ added: [],
148
+ updated: [],
149
+ };
150
+ let currentDependencyMap = this.dependencyMap.get(workspaceFolder);
151
+ // If the dependency map doesn't exist, create a new one
152
+ if (!currentDependencyMap) {
153
+ currentDependencyMap = new Map();
154
+ this.dependencyMap.set(workspaceFolder, currentDependencyMap);
155
+ }
156
+ // Check for added and updated dependencies
157
+ updatedDependencyMap.forEach((newDep, name) => {
158
+ const existingDependency = currentDependencyMap.get(name);
159
+ if (!existingDependency) {
160
+ changes.added.push(newDep);
161
+ }
162
+ else if (existingDependency.version !== newDep.version) {
163
+ changes.updated.push(newDep);
164
+ }
165
+ });
166
+ // log all added and updated changes
167
+ if (changes.added.length > 0) {
168
+ this.logging.log(`Added ${changes.added.length} new dependencies`);
169
+ }
170
+ if (changes.updated.length > 0) {
171
+ this.logging.log(`Updated ${changes.updated.length} dependencies`);
172
+ }
173
+ // Update the dependency map
174
+ updatedDependencyMap.forEach((newDep, name) => {
175
+ this.dependencyMap.get(workspaceFolder)?.set(name, newDep);
176
+ });
177
+ let zips = [];
178
+ if (zipChanges) {
179
+ zips = await this.generateFileMetadata([...changes.added, ...changes.updated], workspaceFolder);
180
+ }
181
+ return zips;
182
+ }
183
+ validateSingleDependencySize(workspaceFolder, dependency) {
184
+ return dependency.size < this.MAX_SINGLE_DEPENDENCY_SIZE;
185
+ }
186
+ /**
187
+ * This validation will calculate how such of size of dependencies uploaded per workspace.
188
+ *
189
+ * This validation is only used for new dependency being uploaded.
190
+ * Existing dependencies will be uploaded as long as single size didn't exceed
191
+ *
192
+ * The dependency map doesn't get updated when dependency is deleted so that this validation may be
193
+ * false positive when large of dependencies is deleted.
194
+ * However, everytime flare server restarts, this dependency map will be initialized.
195
+ */
196
+ validateWorkspaceDependencySize(workspaceFolder) {
197
+ let uploadedSize = this.dependencyUploadedSize.get(workspaceFolder);
198
+ if (uploadedSize && this.MAX_WORKSPACE_DEPENDENCY_SIZE < uploadedSize) {
199
+ return false;
200
+ }
201
+ return true;
202
+ }
203
+ dispose() {
204
+ this.dependencyMap.clear();
205
+ this.dependencyUploadedSize.clear();
206
+ this.dependencyWatchers.forEach(watcher => watcher.close());
207
+ this.dependencyWatchers.clear();
208
+ }
209
+ disposeWorkspaceFolder(workspaceFolder) {
210
+ this.dependencyMap.delete(workspaceFolder);
211
+ this.dependencyUploadedSize.delete(workspaceFolder);
212
+ this.disposeWatchers(workspaceFolder);
213
+ this.disposeDependencyInfo(workspaceFolder);
214
+ }
215
+ // For synchronous version if needed:
216
+ getDirectorySize(directoryPath) {
217
+ let totalSize = 0;
218
+ try {
219
+ const files = fs.readdirSync(directoryPath);
220
+ for (const file of files) {
221
+ const filePath = path.join(directoryPath, file);
222
+ const stats = fs.statSync(filePath);
223
+ if (stats.isDirectory()) {
224
+ totalSize += this.getDirectorySize(filePath);
225
+ }
226
+ else {
227
+ totalSize += stats.size;
228
+ }
229
+ }
230
+ return totalSize;
231
+ }
232
+ catch (error) {
233
+ throw new Error(`Error calculating directory size: ${error}`);
234
+ }
235
+ }
236
+ isDependencyZipped(dependencyName, workspaceFolder) {
237
+ return this.dependencyMap.get(workspaceFolder)?.get(dependencyName)?.zipped;
238
+ }
239
+ async cleanupZipFiles(zipFileMetadata) {
240
+ for (const zip of zipFileMetadata) {
241
+ try {
242
+ if (fs.existsSync(zip.filePath)) {
243
+ fs.unlinkSync(zip.filePath);
244
+ this.logging.log(`Cleanup zip file: ${zip.filePath}`);
245
+ }
246
+ }
247
+ catch (error) {
248
+ // Log error but don't throw to ensure other files are processed
249
+ this.logging.warn(`Error deleting zip file ${zip.filePath}: ${error}`);
250
+ }
251
+ }
252
+ }
253
+ }
254
+ exports.LanguageDependencyHandler = LanguageDependencyHandler;
255
+ //# sourceMappingURL=LanguageDependencyHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageDependencyHandler.js","sourceRoot":"","sources":["../../../../../src/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { BaseDependencyInfo, LanguageDependencyHandler } from './LanguageDependencyHandler';
2
+ import { Logging, Workspace, WorkspaceFolder } from '@aws/language-server-runtimes/server-interface';
3
+ import { ArtifactManager } from '../../artifactManager';
4
+ import { CodewhispererLanguage } from '../../../../shared/languageDetection';
5
+ export declare class DependencyHandlerFactory {
6
+ static createHandler(language: CodewhispererLanguage, workspace: Workspace, logging: Logging, workspaceFolders: WorkspaceFolder[], artifactManager: ArtifactManager): LanguageDependencyHandler<BaseDependencyInfo> | null;
7
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DependencyHandlerFactory = void 0;
4
+ const JavaDependencyHandler_1 = require("./JavaDependencyHandler");
5
+ const PythonDependencyHandler_1 = require("./PythonDependencyHandler");
6
+ const JSTSDependencyHandler_1 = require("./JSTSDependencyHandler");
7
+ class DependencyHandlerFactory {
8
+ static createHandler(language, workspace, logging, workspaceFolders, artifactManager) {
9
+ switch (language.toLowerCase()) {
10
+ case 'python':
11
+ return new PythonDependencyHandler_1.PythonDependencyHandler(language, workspace, logging, workspaceFolders, artifactManager, 'site-packages');
12
+ case 'javascript':
13
+ case 'typescript':
14
+ return new JSTSDependencyHandler_1.JSTSDependencyHandler(language, workspace, logging, workspaceFolders, artifactManager, 'node_modules');
15
+ case 'java':
16
+ return new JavaDependencyHandler_1.JavaDependencyHandler(language, workspace, logging, workspaceFolders, artifactManager, 'dependencies');
17
+ default:
18
+ return null;
19
+ }
20
+ }
21
+ }
22
+ exports.DependencyHandlerFactory = DependencyHandlerFactory;
23
+ //# sourceMappingURL=LanguageDependencyHandlerFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageDependencyHandlerFactory.js","sourceRoot":"","sources":["../../../../../src/language-server/workspaceContext/dependency/dependencyHandler/LanguageDependencyHandlerFactory.ts"],"names":[],"mappings":";;;AAAA,mEAA+D;AAC/D,uEAAmE;AACnE,mEAA+D;AAM/D,MAAa,wBAAwB;IACjC,MAAM,CAAC,aAAa,CAChB,QAA+B,EAC/B,SAAoB,EACpB,OAAgB,EAChB,gBAAmC,EACnC,eAAgC;QAEhC,QAAQ,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7B,KAAK,QAAQ;gBACT,OAAO,IAAI,iDAAuB,CAC9B,QAAQ,EACR,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,eAAe,CAClB,CAAA;YACL,KAAK,YAAY,CAAC;YAClB,KAAK,YAAY;gBACb,OAAO,IAAI,6CAAqB,CAC5B,QAAQ,EACR,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,cAAc,CACjB,CAAA;YACL,KAAK,MAAM;gBACP,OAAO,IAAI,6CAAqB,CAC5B,QAAQ,EACR,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,cAAc,CACjB,CAAA;YACL;gBACI,OAAO,IAAI,CAAA;QACnB,CAAC;IACL,CAAC;CACJ;AAzCD,4DAyCC"}
@@ -0,0 +1,46 @@
1
+ import { BaseDependencyInfo, Dependency, LanguageDependencyHandler } from './LanguageDependencyHandler';
2
+ import { WorkspaceFolder } from '@aws/language-server-runtimes/server-interface';
3
+ export interface PythonDependencyInfo extends BaseDependencyInfo {
4
+ vscCodeSettingsJsonPath: string;
5
+ sitePackagesPaths: string[];
6
+ }
7
+ export declare class PythonDependencyHandler extends LanguageDependencyHandler<PythonDependencyInfo> {
8
+ private pythonDependencyInfos;
9
+ /**
10
+ * It will return a boolean indicating whether it finds any dependency info.
11
+ * The PythonDependencyInfo object contains the following properties:
12
+ * - pkgDir: the package directory
13
+ * - vscCodeSettingsJsonPath: the path to the .vscode/settings.json file
14
+ * - sitePackagesPaths: the path to site-packages directory
15
+ */
16
+ discover(currentDir: string, workspaceFolder: WorkspaceFolder): boolean;
17
+ /**
18
+ * It will create a dependency map from the site-packages
19
+ * The dependency map will contain the following properties:
20
+ * - name: the name of the dependency
21
+ * - version: the version of the dependency
22
+ * - path: the path to the dependency
23
+ */
24
+ initiateDependencyMap(folders: WorkspaceFolder[]): void;
25
+ /**
26
+ * It will setup watchers for the .classpath files.
27
+ * When a change is detected, it will update the dependency map.
28
+ */
29
+ setupWatchers(folders: WorkspaceFolder[]): void;
30
+ /**
31
+ * It will generate a dependency map from the site-packages
32
+ * The dependency map will contain the following properties:
33
+ *
34
+ * @param pythonDependencyInfo
35
+ * @param dependencyMap
36
+ */
37
+ generateDependencyMap(pythonDependencyInfo: PythonDependencyInfo): Map<string, Dependency>;
38
+ transformPathToDependency(dependencyName: string, dependencyPath: string, dependencyMap: Map<string, Dependency>): void;
39
+ private isMetadataDirectory;
40
+ private handleMetadataChange;
41
+ private handlePackageChange;
42
+ private resolvePath;
43
+ private findSitePackagesPaths;
44
+ disposeWatchers(workspaceFolder: WorkspaceFolder): void;
45
+ disposeDependencyInfo(workspaceFolder: WorkspaceFolder): void;
46
+ }