centaurus-cli 2.4.0 → 2.5.0

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 (153) hide show
  1. package/README.md +151 -1
  2. package/dist/cli-adapter.d.ts +41 -2
  3. package/dist/cli-adapter.d.ts.map +1 -1
  4. package/dist/cli-adapter.js +407 -79
  5. package/dist/cli-adapter.js.map +1 -1
  6. package/dist/config/types.d.ts +23 -0
  7. package/dist/config/types.d.ts.map +1 -1
  8. package/dist/config/types.js +20 -0
  9. package/dist/config/types.js.map +1 -1
  10. package/dist/context/__tests__/command-detector.test.d.ts +14 -0
  11. package/dist/context/__tests__/command-detector.test.d.ts.map +1 -0
  12. package/dist/context/__tests__/command-detector.test.js +318 -0
  13. package/dist/context/__tests__/command-detector.test.js.map +1 -0
  14. package/dist/context/__tests__/context-manager.test.d.ts +16 -0
  15. package/dist/context/__tests__/context-manager.test.d.ts.map +1 -0
  16. package/dist/context/__tests__/context-manager.test.js +375 -0
  17. package/dist/context/__tests__/context-manager.test.js.map +1 -0
  18. package/dist/context/__tests__/error-handling.test.d.ts +15 -0
  19. package/dist/context/__tests__/error-handling.test.d.ts.map +1 -0
  20. package/dist/context/__tests__/error-handling.test.js +447 -0
  21. package/dist/context/__tests__/error-handling.test.js.map +1 -0
  22. package/dist/context/command-detector.d.ts +50 -0
  23. package/dist/context/command-detector.d.ts.map +1 -0
  24. package/dist/context/command-detector.js +72 -0
  25. package/dist/context/command-detector.js.map +1 -0
  26. package/dist/context/context-manager.d.ts +144 -0
  27. package/dist/context/context-manager.d.ts.map +1 -0
  28. package/dist/context/context-manager.js +487 -0
  29. package/dist/context/context-manager.js.map +1 -0
  30. package/dist/context/handlers/__tests__/docker-handler.test.d.ts +13 -0
  31. package/dist/context/handlers/__tests__/docker-handler.test.d.ts.map +1 -0
  32. package/dist/context/handlers/__tests__/docker-handler.test.js +285 -0
  33. package/dist/context/handlers/__tests__/docker-handler.test.js.map +1 -0
  34. package/dist/context/handlers/__tests__/ssh-handler.test.d.ts +13 -0
  35. package/dist/context/handlers/__tests__/ssh-handler.test.d.ts.map +1 -0
  36. package/dist/context/handlers/__tests__/ssh-handler.test.js +251 -0
  37. package/dist/context/handlers/__tests__/ssh-handler.test.js.map +1 -0
  38. package/dist/context/handlers/__tests__/wsl-handler.test.d.ts +7 -0
  39. package/dist/context/handlers/__tests__/wsl-handler.test.d.ts.map +1 -0
  40. package/dist/context/handlers/__tests__/wsl-handler.test.js +331 -0
  41. package/dist/context/handlers/__tests__/wsl-handler.test.js.map +1 -0
  42. package/dist/context/handlers/docker-handler.d.ts +111 -0
  43. package/dist/context/handlers/docker-handler.d.ts.map +1 -0
  44. package/dist/context/handlers/docker-handler.js +439 -0
  45. package/dist/context/handlers/docker-handler.js.map +1 -0
  46. package/dist/context/handlers/ssh-handler.d.ts +120 -0
  47. package/dist/context/handlers/ssh-handler.d.ts.map +1 -0
  48. package/dist/context/handlers/ssh-handler.js +523 -0
  49. package/dist/context/handlers/ssh-handler.js.map +1 -0
  50. package/dist/context/handlers/wsl-handler.d.ts +128 -0
  51. package/dist/context/handlers/wsl-handler.d.ts.map +1 -0
  52. package/dist/context/handlers/wsl-handler.js +590 -0
  53. package/dist/context/handlers/wsl-handler.js.map +1 -0
  54. package/dist/context/index.d.ts +8 -0
  55. package/dist/context/index.d.ts.map +1 -0
  56. package/dist/context/index.js +7 -0
  57. package/dist/context/index.js.map +1 -0
  58. package/dist/context/subshell-handler.d.ts +130 -0
  59. package/dist/context/subshell-handler.d.ts.map +1 -0
  60. package/dist/context/subshell-handler.js +5 -0
  61. package/dist/context/subshell-handler.js.map +1 -0
  62. package/dist/context/types.d.ts +70 -0
  63. package/dist/context/types.d.ts.map +1 -0
  64. package/dist/context/types.js +34 -0
  65. package/dist/context/types.js.map +1 -0
  66. package/dist/index.js +6 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/services/__tests__/ai-context-injector.test.d.ts +15 -0
  69. package/dist/services/__tests__/ai-context-injector.test.d.ts.map +1 -0
  70. package/dist/services/__tests__/ai-context-injector.test.js +326 -0
  71. package/dist/services/__tests__/ai-context-injector.test.js.map +1 -0
  72. package/dist/services/ai-context-injector.d.ts +41 -0
  73. package/dist/services/ai-context-injector.d.ts.map +1 -0
  74. package/dist/services/ai-context-injector.js +97 -0
  75. package/dist/services/ai-context-injector.js.map +1 -0
  76. package/dist/services/ai-service-client.d.ts +4 -1
  77. package/dist/services/ai-service-client.d.ts.map +1 -1
  78. package/dist/services/ai-service-client.js +5 -1
  79. package/dist/services/ai-service-client.js.map +1 -1
  80. package/dist/src/context/types.js +27 -0
  81. package/dist/src/services/ai-context-injector.js +96 -0
  82. package/dist/src/services/ai-service-client.js +270 -0
  83. package/dist/src/services/api-client.js +349 -0
  84. package/dist/src/tools/types.js +1 -0
  85. package/dist/src/types/index.js +1 -0
  86. package/dist/test/context/types.js +27 -0
  87. package/dist/test/services/__tests__/ai-context-injector.test.js +325 -0
  88. package/dist/test/services/ai-context-injector.js +96 -0
  89. package/dist/test/services/ai-service-client.js +270 -0
  90. package/dist/test/services/api-client.js +349 -0
  91. package/dist/test/tools/types.js +1 -0
  92. package/dist/test/types/index.js +1 -0
  93. package/dist/test-ai-context-injector.js +97 -0
  94. package/dist/test-ssh-handler.d.ts +8 -0
  95. package/dist/test-ssh-handler.d.ts.map +1 -0
  96. package/dist/test-ssh-handler.js +198 -0
  97. package/dist/test-ssh-handler.js.map +1 -0
  98. package/dist/tools/command.d.ts.map +1 -1
  99. package/dist/tools/command.js +123 -46
  100. package/dist/tools/command.js.map +1 -1
  101. package/dist/tools/file-ops.d.ts.map +1 -1
  102. package/dist/tools/file-ops.js +115 -48
  103. package/dist/tools/file-ops.js.map +1 -1
  104. package/dist/tools/types.d.ts +1 -0
  105. package/dist/tools/types.d.ts.map +1 -1
  106. package/dist/types/index.d.ts +41 -0
  107. package/dist/types/index.d.ts.map +1 -1
  108. package/dist/ui/components/App.d.ts +3 -0
  109. package/dist/ui/components/App.d.ts.map +1 -1
  110. package/dist/ui/components/App.js +213 -46
  111. package/dist/ui/components/App.js.map +1 -1
  112. package/dist/ui/components/Breadcrumbs.d.ts +12 -0
  113. package/dist/ui/components/Breadcrumbs.d.ts.map +1 -0
  114. package/dist/ui/components/Breadcrumbs.js +62 -0
  115. package/dist/ui/components/Breadcrumbs.js.map +1 -0
  116. package/dist/ui/components/CodeBlock.js +1 -1
  117. package/dist/ui/components/CodeBlock.js.map +1 -1
  118. package/dist/ui/components/DiffViewer.js +1 -1
  119. package/dist/ui/components/DiffViewer.js.map +1 -1
  120. package/dist/ui/components/FileViewerScreen.d.ts +14 -0
  121. package/dist/ui/components/FileViewerScreen.d.ts.map +1 -0
  122. package/dist/ui/components/FileViewerScreen.js +74 -0
  123. package/dist/ui/components/FileViewerScreen.js.map +1 -0
  124. package/dist/ui/components/InputBox.d.ts +2 -0
  125. package/dist/ui/components/InputBox.d.ts.map +1 -1
  126. package/dist/ui/components/InputBox.js +85 -41
  127. package/dist/ui/components/InputBox.js.map +1 -1
  128. package/dist/ui/components/MessageDisplay.d.ts.map +1 -1
  129. package/dist/ui/components/MessageDisplay.js +3 -28
  130. package/dist/ui/components/MessageDisplay.js.map +1 -1
  131. package/dist/ui/components/PasswordPrompt.d.ts +9 -0
  132. package/dist/ui/components/PasswordPrompt.d.ts.map +1 -0
  133. package/dist/ui/components/PasswordPrompt.js +20 -0
  134. package/dist/ui/components/PasswordPrompt.js.map +1 -0
  135. package/dist/ui/components/StatusBar.d.ts +2 -0
  136. package/dist/ui/components/StatusBar.d.ts.map +1 -1
  137. package/dist/ui/components/StatusBar.js +36 -1
  138. package/dist/ui/components/StatusBar.js.map +1 -1
  139. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  140. package/dist/ui/components/ToolExecutionMessage.js +13 -24
  141. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  142. package/dist/ui/components/VersionUpdatePrompt.d.ts +10 -0
  143. package/dist/ui/components/VersionUpdatePrompt.d.ts.map +1 -0
  144. package/dist/ui/components/VersionUpdatePrompt.js +41 -0
  145. package/dist/ui/components/VersionUpdatePrompt.js.map +1 -0
  146. package/dist/utils/shell.d.ts.map +1 -1
  147. package/dist/utils/shell.js +38 -10
  148. package/dist/utils/shell.js.map +1 -1
  149. package/dist/utils/version-checker.d.ts +14 -0
  150. package/dist/utils/version-checker.d.ts.map +1 -0
  151. package/dist/utils/version-checker.js +63 -0
  152. package/dist/utils/version-checker.js.map +1 -0
  153. package/package.json +71 -69
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Integration tests for Docker Handler
3
+ *
4
+ * Note: These tests require Docker to be installed and running for full integration testing.
5
+ * This file provides unit tests for the Docker Handler implementation.
6
+ *
7
+ * To run with a test framework, install jest or mocha:
8
+ * npm install --save-dev jest @types/jest ts-jest
9
+ *
10
+ * For now, this file serves as documentation and can be used with a test framework later.
11
+ */
12
+ import { DockerHandler } from '../docker-handler';
13
+ import { SubshellConnectionError, SubshellExecutionError } from '../../types';
14
+ // Test suite for Docker Handler
15
+ // These tests would run with jest/mocha when configured
16
+ export function testDockerHandler() {
17
+ let handler;
18
+ beforeEach(() => {
19
+ handler = new DockerHandler();
20
+ });
21
+ afterEach(async () => {
22
+ if (handler) {
23
+ await handler.disconnect();
24
+ }
25
+ });
26
+ describe('detect', () => {
27
+ it('should detect basic docker exec command', () => {
28
+ expect(handler.detect('docker exec container_name bash')).toBe(true);
29
+ });
30
+ it('should detect docker exec command with -it flags', () => {
31
+ expect(handler.detect('docker exec -it container_name bash')).toBe(true);
32
+ });
33
+ it('should not detect non-docker commands', () => {
34
+ expect(handler.detect('ls -la')).toBe(false);
35
+ expect(handler.detect('docker ps')).toBe(false);
36
+ expect(handler.detect('docker run ubuntu')).toBe(false);
37
+ });
38
+ });
39
+ describe('parseDockerCommand', () => {
40
+ it('should parse basic docker exec command', () => {
41
+ const config = handler.parseDockerCommand('docker exec mycontainer bash');
42
+ expect(config.containerId).toBe('mycontainer');
43
+ });
44
+ it('should parse docker exec command with -it flags', () => {
45
+ const config = handler.parseDockerCommand('docker exec -it mycontainer bash');
46
+ expect(config.containerId).toBe('mycontainer');
47
+ });
48
+ it('should parse docker exec command with environment variables', () => {
49
+ const config = handler.parseDockerCommand('docker exec -e VAR=value mycontainer bash');
50
+ expect(config.containerId).toBe('mycontainer');
51
+ });
52
+ it('should parse docker exec command with working directory', () => {
53
+ const config = handler.parseDockerCommand('docker exec -w /app mycontainer bash');
54
+ expect(config.containerId).toBe('mycontainer');
55
+ });
56
+ it('should parse docker exec command with user', () => {
57
+ const config = handler.parseDockerCommand('docker exec -u root mycontainer bash');
58
+ expect(config.containerId).toBe('mycontainer');
59
+ });
60
+ it('should throw error for invalid command', () => {
61
+ expect(() => {
62
+ handler.parseDockerCommand('docker exec');
63
+ }).toThrow();
64
+ });
65
+ });
66
+ describe('getBreadcrumbs', () => {
67
+ it('should return empty array when not connected', () => {
68
+ const breadcrumbs = handler.getBreadcrumbs();
69
+ expect(breadcrumbs).toEqual([]);
70
+ });
71
+ it('should return breadcrumbs with container ID', () => {
72
+ // Simulate config being set
73
+ handler.config = {
74
+ containerId: 'abc123def456',
75
+ };
76
+ const breadcrumbs = handler.getBreadcrumbs();
77
+ expect(breadcrumbs).toHaveLength(2);
78
+ expect(breadcrumbs[0].label).toBe('docker');
79
+ expect(breadcrumbs[0].color).toBe('blue');
80
+ expect(breadcrumbs[1].label).toBe('abc123def456');
81
+ expect(breadcrumbs[1].color).toBe('blue');
82
+ });
83
+ it('should return breadcrumbs with container name', () => {
84
+ // Simulate config being set with name
85
+ handler.config = {
86
+ containerId: 'abc123def456',
87
+ containerName: 'my-app',
88
+ };
89
+ const breadcrumbs = handler.getBreadcrumbs();
90
+ expect(breadcrumbs).toHaveLength(2);
91
+ expect(breadcrumbs[0].label).toBe('docker');
92
+ expect(breadcrumbs[1].label).toBe('my-app');
93
+ });
94
+ });
95
+ describe('resolveAbsolutePath', () => {
96
+ beforeEach(() => {
97
+ handler.currentWorkingDirectory = '/app';
98
+ });
99
+ it('should return absolute paths unchanged', () => {
100
+ const path = handler.resolveAbsolutePath('/etc/hosts');
101
+ expect(path).toBe('/etc/hosts');
102
+ });
103
+ it('should return home paths unchanged', () => {
104
+ const path = handler.resolveAbsolutePath('~/documents');
105
+ expect(path).toBe('~/documents');
106
+ });
107
+ it('should resolve relative paths', () => {
108
+ const path = handler.resolveAbsolutePath('src/index.js');
109
+ expect(path).toBe('/app/src/index.js');
110
+ });
111
+ });
112
+ describe('buildDockerCommand', () => {
113
+ beforeEach(() => {
114
+ handler.config = {
115
+ containerId: 'mycontainer',
116
+ };
117
+ handler.currentWorkingDirectory = '/app';
118
+ });
119
+ it('should build docker exec command with working directory', () => {
120
+ const command = handler.buildDockerCommand('ls -la');
121
+ expect(command).toContain('docker exec');
122
+ expect(command).toContain('-w "/app"');
123
+ expect(command).toContain('mycontainer');
124
+ expect(command).toContain('ls -la');
125
+ });
126
+ it('should include pwd tracking', () => {
127
+ const command = handler.buildDockerCommand('cd /tmp');
128
+ expect(command).toContain('__CENTAURUS_PWD__');
129
+ });
130
+ });
131
+ describe('parseDirectoryListing', () => {
132
+ it('should parse ls -la output', () => {
133
+ const output = `total 12
134
+ drwxr-xr-x 3 root root 4096 Jan 1 12:00 .
135
+ drwxr-xr-x 5 root root 4096 Jan 1 12:00 ..
136
+ -rw-r--r-- 1 root root 100 Jan 1 12:00 file.txt
137
+ drwxr-xr-x 2 root root 4096 Jan 1 12:00 subdir`;
138
+ const entries = handler.parseDirectoryListing(output);
139
+ expect(entries).toHaveLength(2);
140
+ expect(entries[0].name).toBe('file.txt');
141
+ expect(entries[0].type).toBe('file');
142
+ expect(entries[1].name).toBe('subdir');
143
+ expect(entries[1].type).toBe('directory');
144
+ });
145
+ it('should handle empty directory', () => {
146
+ const output = `total 0
147
+ drwxr-xr-x 2 root root 4096 Jan 1 12:00 .
148
+ drwxr-xr-x 5 root root 4096 Jan 1 12:00 ..`;
149
+ const entries = handler.parseDirectoryListing(output);
150
+ expect(entries).toHaveLength(0);
151
+ });
152
+ });
153
+ describe('parseSearchResults', () => {
154
+ it('should parse grep output', () => {
155
+ const output = `/app/file1.txt:10:search term found here
156
+ /app/file2.txt:25:another search term
157
+ /app/subdir/file3.txt:5:search term in subdirectory`;
158
+ const results = handler.parseSearchResults(output);
159
+ expect(results).toHaveLength(3);
160
+ expect(results[0].file).toBe('/app/file1.txt');
161
+ expect(results[0].line).toBe(10);
162
+ expect(results[0].content).toBe('search term found here');
163
+ });
164
+ it('should handle empty search results', () => {
165
+ const output = '';
166
+ const results = handler.parseSearchResults(output);
167
+ expect(results).toHaveLength(0);
168
+ });
169
+ });
170
+ // Note: The following tests require Docker to be installed and running
171
+ // They are skipped by default but can be enabled for integration testing
172
+ describe.skip('Docker Connection (requires Docker)', () => {
173
+ const TEST_CONTAINER = process.env.TEST_DOCKER_CONTAINER || 'test-container';
174
+ beforeAll(async () => {
175
+ // Create a test container if it doesn't exist
176
+ try {
177
+ await execAsync(`docker run -d --name ${TEST_CONTAINER} alpine sleep 3600`);
178
+ }
179
+ catch (error) {
180
+ // Container might already exist
181
+ console.log('Test container may already exist');
182
+ }
183
+ });
184
+ afterAll(async () => {
185
+ // Clean up test container
186
+ try {
187
+ await execAsync(`docker rm -f ${TEST_CONTAINER}`);
188
+ }
189
+ catch (error) {
190
+ console.log('Failed to clean up test container');
191
+ }
192
+ });
193
+ it('should connect to Docker container', async () => {
194
+ const context = await handler.connect(`docker exec -it ${TEST_CONTAINER} sh`, '/tmp');
195
+ expect(context.type).toBe('docker');
196
+ expect(context.connectionState).toBe('connected');
197
+ expect(context.metadata.containerId).toBe(TEST_CONTAINER);
198
+ });
199
+ it('should execute commands', async () => {
200
+ await handler.connect(`docker exec -it ${TEST_CONTAINER} sh`, '/tmp');
201
+ const result = await handler.executeCommand('echo "Hello World"');
202
+ expect(result.exitCode).toBe(0);
203
+ expect(result.stdout).toContain('Hello World');
204
+ });
205
+ it('should track working directory changes', async () => {
206
+ await handler.connect(`docker exec -it ${TEST_CONTAINER} sh`, '/tmp');
207
+ await handler.executeCommand('cd /tmp');
208
+ const cwd = await handler.getCurrentWorkingDirectory();
209
+ expect(cwd).toBe('/tmp');
210
+ });
211
+ it('should handle command errors', async () => {
212
+ await handler.connect(`docker exec -it ${TEST_CONTAINER} sh`, '/tmp');
213
+ const result = await handler.executeCommand('nonexistentcommand');
214
+ expect(result.exitCode).not.toBe(0);
215
+ expect(result.stderr).toBeTruthy();
216
+ });
217
+ it('should read files', async () => {
218
+ await handler.connect(`docker exec -it ${TEST_CONTAINER} sh`, '/tmp');
219
+ // Create a test file first
220
+ await handler.executeCommand('echo "test content" > /tmp/test-file.txt');
221
+ const content = await handler.readFile('/tmp/test-file.txt');
222
+ expect(content).toContain('test content');
223
+ // Cleanup
224
+ await handler.executeCommand('rm /tmp/test-file.txt');
225
+ });
226
+ it('should write files', async () => {
227
+ await handler.connect(`docker exec -it ${TEST_CONTAINER} sh`, '/tmp');
228
+ await handler.writeFile('/tmp/test-write.txt', 'written content');
229
+ const result = await handler.executeCommand('cat /tmp/test-write.txt');
230
+ expect(result.stdout).toContain('written content');
231
+ // Cleanup
232
+ await handler.executeCommand('rm /tmp/test-write.txt');
233
+ });
234
+ it('should list directory contents', async () => {
235
+ await handler.connect(`docker exec -it ${TEST_CONTAINER} sh`, '/tmp');
236
+ const entries = await handler.listDirectory('/tmp');
237
+ expect(Array.isArray(entries)).toBe(true);
238
+ });
239
+ it('should search files', async () => {
240
+ await handler.connect(`docker exec -it ${TEST_CONTAINER} sh`, '/tmp');
241
+ // Create test files
242
+ await handler.executeCommand('echo "search term" > /tmp/search-test.txt');
243
+ const results = await handler.searchFiles('search term', '/tmp');
244
+ expect(results.length).toBeGreaterThan(0);
245
+ expect(results[0]).toHaveProperty('file');
246
+ expect(results[0]).toHaveProperty('line');
247
+ expect(results[0]).toHaveProperty('content');
248
+ // Cleanup
249
+ await handler.executeCommand('rm /tmp/search-test.txt');
250
+ });
251
+ it('should disconnect cleanly', async () => {
252
+ await handler.connect(`docker exec -it ${TEST_CONTAINER} sh`, '/tmp');
253
+ await handler.disconnect();
254
+ // Verify we can't execute commands after disconnect
255
+ await expect(handler.executeCommand('echo test')).rejects.toThrow();
256
+ });
257
+ it('should detect container state', async () => {
258
+ await handler.connect(`docker exec -it ${TEST_CONTAINER} sh`, '/tmp');
259
+ // Container should be running
260
+ const context = await handler.connect(`docker exec -it ${TEST_CONTAINER} sh`, '/tmp');
261
+ expect(context.connectionState).toBe('connected');
262
+ });
263
+ });
264
+ describe('Error Handling', () => {
265
+ it('should throw SubshellConnectionError for non-existent container', async () => {
266
+ await expect(handler.connect('docker exec -it nonexistent-container-12345 sh', '/tmp')).rejects.toThrow(SubshellConnectionError);
267
+ });
268
+ it('should throw SubshellExecutionError when not connected', async () => {
269
+ await expect(handler.executeCommand('echo test')).rejects.toThrow(SubshellExecutionError);
270
+ });
271
+ it('should handle command timeout', async () => {
272
+ // This test would require a mock or a command that actually times out
273
+ // Skipping for now as it would take 30+ seconds
274
+ }, 35000);
275
+ it('should handle stopped container', async () => {
276
+ // This would require stopping a container and trying to connect
277
+ // Skipping for integration testing
278
+ });
279
+ });
280
+ }
281
+ // Helper function for async exec (used in integration tests)
282
+ import { exec } from 'child_process';
283
+ import { promisify } from 'util';
284
+ const execAsync = promisify(exec);
285
+ //# sourceMappingURL=docker-handler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-handler.test.js","sourceRoot":"","sources":["../../../../src/context/handlers/__tests__/docker-handler.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Integration tests for SSH Handler
3
+ *
4
+ * Note: These tests require a running SSH server for full integration testing.
5
+ * This file provides unit tests for the SSH Handler implementation.
6
+ *
7
+ * To run with a test framework, install jest or mocha:
8
+ * npm install --save-dev jest @types/jest ts-jest
9
+ *
10
+ * For now, this file serves as documentation and can be used with a test framework later.
11
+ */
12
+ export declare function testSSHHandler(): void;
13
+ //# sourceMappingURL=ssh-handler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-handler.test.d.ts","sourceRoot":"","sources":["../../../../src/context/handlers/__tests__/ssh-handler.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,wBAAgB,cAAc,SAqU7B"}
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Integration tests for SSH Handler
3
+ *
4
+ * Note: These tests require a running SSH server for full integration testing.
5
+ * This file provides unit tests for the SSH Handler implementation.
6
+ *
7
+ * To run with a test framework, install jest or mocha:
8
+ * npm install --save-dev jest @types/jest ts-jest
9
+ *
10
+ * For now, this file serves as documentation and can be used with a test framework later.
11
+ */
12
+ import { SSHHandler } from '../ssh-handler';
13
+ import { SubshellConnectionError, SubshellExecutionError } from '../../types';
14
+ // Test suite for SSH Handler
15
+ // These tests would run with jest/mocha when configured
16
+ export function testSSHHandler() {
17
+ let handler;
18
+ beforeEach(() => {
19
+ handler = new SSHHandler();
20
+ });
21
+ afterEach(async () => {
22
+ if (handler) {
23
+ await handler.disconnect();
24
+ }
25
+ });
26
+ describe('detect', () => {
27
+ it('should detect basic ssh command', () => {
28
+ expect(handler.detect('ssh user@host')).toBe(true);
29
+ });
30
+ it('should detect ssh command with flags', () => {
31
+ expect(handler.detect('ssh -p 2222 user@host')).toBe(true);
32
+ });
33
+ it('should not detect non-ssh commands', () => {
34
+ expect(handler.detect('ls -la')).toBe(false);
35
+ expect(handler.detect('cd /home')).toBe(false);
36
+ });
37
+ });
38
+ describe('parseSSHCommand', () => {
39
+ it('should parse basic ssh command', () => {
40
+ const config = handler.parseSSHCommand('ssh user@example.com');
41
+ expect(config.host).toBe('example.com');
42
+ expect(config.username).toBe('user');
43
+ expect(config.port).toBe(22);
44
+ });
45
+ it('should parse ssh command with custom port', () => {
46
+ const config = handler.parseSSHCommand('ssh -p 2222 user@example.com');
47
+ expect(config.host).toBe('example.com');
48
+ expect(config.username).toBe('user');
49
+ expect(config.port).toBe(2222);
50
+ });
51
+ it('should parse ssh command without username', () => {
52
+ const config = handler.parseSSHCommand('ssh example.com');
53
+ expect(config.host).toBe('example.com');
54
+ expect(config.username).toBeTruthy(); // Should default to current user
55
+ expect(config.port).toBe(22);
56
+ });
57
+ it('should throw error for invalid command', () => {
58
+ expect(() => {
59
+ handler.parseSSHCommand('ssh');
60
+ }).toThrow();
61
+ });
62
+ });
63
+ describe('getBreadcrumbs', () => {
64
+ it('should return empty array when not connected', () => {
65
+ const breadcrumbs = handler.getBreadcrumbs();
66
+ expect(breadcrumbs).toEqual([]);
67
+ });
68
+ it('should return breadcrumbs after parsing config', () => {
69
+ // Simulate config being set
70
+ handler.config = {
71
+ host: 'example.com',
72
+ username: 'testuser',
73
+ port: 22,
74
+ };
75
+ const breadcrumbs = handler.getBreadcrumbs();
76
+ expect(breadcrumbs).toHaveLength(2);
77
+ expect(breadcrumbs[0].label).toBe('ssh');
78
+ expect(breadcrumbs[0].color).toBe('cyan');
79
+ expect(breadcrumbs[1].label).toBe('testuser@example.com');
80
+ expect(breadcrumbs[1].color).toBe('cyan');
81
+ });
82
+ });
83
+ describe('resolveAbsolutePath', () => {
84
+ beforeEach(() => {
85
+ handler.currentWorkingDirectory = '/home/user';
86
+ });
87
+ it('should return absolute paths unchanged', () => {
88
+ const path = handler.resolveAbsolutePath('/etc/hosts');
89
+ expect(path).toBe('/etc/hosts');
90
+ });
91
+ it('should return home paths unchanged', () => {
92
+ const path = handler.resolveAbsolutePath('~/documents');
93
+ expect(path).toBe('~/documents');
94
+ });
95
+ it('should resolve relative paths', () => {
96
+ const path = handler.resolveAbsolutePath('documents/file.txt');
97
+ expect(path).toBe('/home/user/documents/file.txt');
98
+ });
99
+ });
100
+ describe('getShellIntegrationScript', () => {
101
+ it('should generate bash integration script', () => {
102
+ handler.shellType = 'bash';
103
+ handler.sessionId = 'test-session-id';
104
+ const script = handler.getShellIntegrationScript();
105
+ expect(script).toContain('CENTAURUS_SUBSHELL=1');
106
+ expect(script).toContain('CENTAURUS_SESSION_ID="test-session-id"');
107
+ expect(script).toContain('PROMPT_COMMAND');
108
+ });
109
+ it('should generate zsh integration script', () => {
110
+ handler.shellType = 'zsh';
111
+ handler.sessionId = 'test-session-id';
112
+ const script = handler.getShellIntegrationScript();
113
+ expect(script).toContain('CENTAURUS_SUBSHELL=1');
114
+ expect(script).toContain('CENTAURUS_SESSION_ID="test-session-id"');
115
+ expect(script).toContain('precmd_functions');
116
+ });
117
+ it('should generate fish integration script', () => {
118
+ handler.shellType = 'fish';
119
+ handler.sessionId = 'test-session-id';
120
+ const script = handler.getShellIntegrationScript();
121
+ expect(script).toContain('CENTAURUS_SUBSHELL 1');
122
+ expect(script).toContain('CENTAURUS_SESSION_ID "test-session-id"');
123
+ expect(script).toContain('fish_prompt');
124
+ });
125
+ });
126
+ // Note: The following tests require an actual SSH server
127
+ // They are skipped by default but can be enabled for integration testing
128
+ describe.skip('SSH Connection (requires SSH server)', () => {
129
+ const TEST_SSH_HOST = process.env.TEST_SSH_HOST || 'localhost';
130
+ const TEST_SSH_USER = process.env.TEST_SSH_USER || 'testuser';
131
+ const TEST_SSH_PASSWORD = process.env.TEST_SSH_PASSWORD;
132
+ it('should connect to SSH server', async () => {
133
+ if (!TEST_SSH_PASSWORD) {
134
+ console.log('Skipping: TEST_SSH_PASSWORD not set');
135
+ return;
136
+ }
137
+ const context = await handler.connect(`ssh ${TEST_SSH_USER}@${TEST_SSH_HOST}`, '/tmp');
138
+ expect(context.type).toBe('ssh');
139
+ expect(context.connectionState).toBe('connected');
140
+ expect(context.metadata.hostname).toBe(TEST_SSH_HOST);
141
+ expect(context.metadata.username).toBe(TEST_SSH_USER);
142
+ });
143
+ it('should execute commands', async () => {
144
+ if (!TEST_SSH_PASSWORD) {
145
+ console.log('Skipping: TEST_SSH_PASSWORD not set');
146
+ return;
147
+ }
148
+ await handler.connect(`ssh ${TEST_SSH_USER}@${TEST_SSH_HOST}`, '/tmp');
149
+ const result = await handler.executeCommand('echo "Hello World"');
150
+ expect(result.exitCode).toBe(0);
151
+ expect(result.stdout).toContain('Hello World');
152
+ });
153
+ it('should track working directory changes', async () => {
154
+ if (!TEST_SSH_PASSWORD) {
155
+ console.log('Skipping: TEST_SSH_PASSWORD not set');
156
+ return;
157
+ }
158
+ await handler.connect(`ssh ${TEST_SSH_USER}@${TEST_SSH_HOST}`, '/tmp');
159
+ await handler.executeCommand('cd /tmp');
160
+ const cwd = await handler.getCurrentWorkingDirectory();
161
+ expect(cwd).toBe('/tmp');
162
+ });
163
+ it('should handle command errors', async () => {
164
+ if (!TEST_SSH_PASSWORD) {
165
+ console.log('Skipping: TEST_SSH_PASSWORD not set');
166
+ return;
167
+ }
168
+ await handler.connect(`ssh ${TEST_SSH_USER}@${TEST_SSH_HOST}`, '/tmp');
169
+ const result = await handler.executeCommand('nonexistentcommand');
170
+ expect(result.exitCode).not.toBe(0);
171
+ expect(result.stderr).toBeTruthy();
172
+ });
173
+ it('should read files via SFTP', async () => {
174
+ if (!TEST_SSH_PASSWORD) {
175
+ console.log('Skipping: TEST_SSH_PASSWORD not set');
176
+ return;
177
+ }
178
+ await handler.connect(`ssh ${TEST_SSH_USER}@${TEST_SSH_HOST}`, '/tmp');
179
+ // Create a test file first
180
+ await handler.executeCommand('echo "test content" > /tmp/test-file.txt');
181
+ const content = await handler.readFile('/tmp/test-file.txt');
182
+ expect(content).toContain('test content');
183
+ // Cleanup
184
+ await handler.executeCommand('rm /tmp/test-file.txt');
185
+ });
186
+ it('should write files via SFTP', async () => {
187
+ if (!TEST_SSH_PASSWORD) {
188
+ console.log('Skipping: TEST_SSH_PASSWORD not set');
189
+ return;
190
+ }
191
+ await handler.connect(`ssh ${TEST_SSH_USER}@${TEST_SSH_HOST}`, '/tmp');
192
+ await handler.writeFile('/tmp/test-write.txt', 'written content');
193
+ const result = await handler.executeCommand('cat /tmp/test-write.txt');
194
+ expect(result.stdout).toContain('written content');
195
+ // Cleanup
196
+ await handler.executeCommand('rm /tmp/test-write.txt');
197
+ });
198
+ it('should list directory contents', async () => {
199
+ if (!TEST_SSH_PASSWORD) {
200
+ console.log('Skipping: TEST_SSH_PASSWORD not set');
201
+ return;
202
+ }
203
+ await handler.connect(`ssh ${TEST_SSH_USER}@${TEST_SSH_HOST}`, '/tmp');
204
+ const entries = await handler.listDirectory('/tmp');
205
+ expect(Array.isArray(entries)).toBe(true);
206
+ expect(entries.length).toBeGreaterThan(0);
207
+ expect(entries[0]).toHaveProperty('name');
208
+ expect(entries[0]).toHaveProperty('type');
209
+ });
210
+ it('should search files', async () => {
211
+ if (!TEST_SSH_PASSWORD) {
212
+ console.log('Skipping: TEST_SSH_PASSWORD not set');
213
+ return;
214
+ }
215
+ await handler.connect(`ssh ${TEST_SSH_USER}@${TEST_SSH_HOST}`, '/tmp');
216
+ // Create test files
217
+ await handler.executeCommand('echo "search term" > /tmp/search-test.txt');
218
+ const results = await handler.searchFiles('search term', '/tmp');
219
+ expect(results.length).toBeGreaterThan(0);
220
+ expect(results[0]).toHaveProperty('file');
221
+ expect(results[0]).toHaveProperty('line');
222
+ expect(results[0]).toHaveProperty('content');
223
+ // Cleanup
224
+ await handler.executeCommand('rm /tmp/search-test.txt');
225
+ });
226
+ it('should disconnect cleanly', async () => {
227
+ if (!TEST_SSH_PASSWORD) {
228
+ console.log('Skipping: TEST_SSH_PASSWORD not set');
229
+ return;
230
+ }
231
+ await handler.connect(`ssh ${TEST_SSH_USER}@${TEST_SSH_HOST}`, '/tmp');
232
+ await handler.disconnect();
233
+ // Verify we can't execute commands after disconnect
234
+ await expect(handler.executeCommand('echo test')).rejects.toThrow();
235
+ });
236
+ });
237
+ describe('Error Handling', () => {
238
+ it('should throw SubshellConnectionError on connection failure', async () => {
239
+ await expect(handler.connect('ssh nonexistent@invalid-host-12345.com', '/tmp')).rejects.toThrow(SubshellConnectionError);
240
+ });
241
+ it('should throw SubshellExecutionError when not connected', async () => {
242
+ await expect(handler.executeCommand('echo test')).rejects.toThrow(SubshellExecutionError);
243
+ });
244
+ it('should handle command timeout', async () => {
245
+ // This test would require a mock or a command that actually times out
246
+ // Skipping for now as it would take 30+ seconds
247
+ }, 35000);
248
+ });
249
+ }
250
+ ;
251
+ //# sourceMappingURL=ssh-handler.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-handler.test.js","sourceRoot":"","sources":["../../../../src/context/handlers/__tests__/ssh-handler.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE9E,6BAA6B;AAC7B,wDAAwD;AACxD,MAAM,UAAU,cAAc;IAC5B,IAAI,OAAmB,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAI,OAAe,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC;YACxE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAI,OAAe,CAAC,eAAe,CAAC,8BAA8B,CAAC,CAAC;YAChF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAI,OAAe,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,iCAAiC;YACvE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,GAAG,EAAE;gBACT,OAAe,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,4BAA4B;YAC3B,OAAe,CAAC,MAAM,GAAG;gBACxB,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,UAAU;gBACpB,IAAI,EAAE,EAAE;aACT,CAAC;YAEF,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,UAAU,CAAC,GAAG,EAAE;YACb,OAAe,CAAC,uBAAuB,GAAG,YAAY,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,IAAI,GAAI,OAAe,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;YAChE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,IAAI,GAAI,OAAe,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,IAAI,GAAI,OAAe,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YAChD,OAAe,CAAC,SAAS,GAAG,MAAM,CAAC;YACnC,OAAe,CAAC,SAAS,GAAG,iBAAiB,CAAC;YAE/C,MAAM,MAAM,GAAI,OAAe,CAAC,yBAAyB,EAAE,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAC/C,OAAe,CAAC,SAAS,GAAG,KAAK,CAAC;YAClC,OAAe,CAAC,SAAS,GAAG,iBAAiB,CAAC;YAE/C,MAAM,MAAM,GAAI,OAAe,CAAC,yBAAyB,EAAE,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YAChD,OAAe,CAAC,SAAS,GAAG,MAAM,CAAC;YACnC,OAAe,CAAC,SAAS,GAAG,iBAAiB,CAAC;YAE/C,MAAM,MAAM,GAAI,OAAe,CAAC,yBAAyB,EAAE,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,wCAAwC,CAAC,CAAC;YACnE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,yDAAyD;IACzD,yEAAyE;IAEzE,QAAQ,CAAC,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QACzD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,WAAW,CAAC;QAC/D,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,UAAU,CAAC;QAC9D,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QAExD,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CACnC,OAAO,aAAa,IAAI,aAAa,EAAE,EACvC,MAAM,CACP,CAAC;YAEF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAClD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACtD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,OAAO,CACnB,OAAO,aAAa,IAAI,aAAa,EAAE,EACvC,MAAM,CACP,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,OAAO,CACnB,OAAO,aAAa,IAAI,aAAa,EAAE,EACvC,MAAM,CACP,CAAC;YAEF,MAAM,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,0BAA0B,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,OAAO,CACnB,OAAO,aAAa,IAAI,aAAa,EAAE,EACvC,MAAM,CACP,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,OAAO,CACnB,OAAO,aAAa,IAAI,aAAa,EAAE,EACvC,MAAM,CACP,CAAC;YAEF,2BAA2B;YAC3B,MAAM,OAAO,CAAC,cAAc,CAAC,0CAA0C,CAAC,CAAC;YAEzE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;YAC7D,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAE1C,UAAU;YACV,MAAM,OAAO,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,OAAO,CACnB,OAAO,aAAa,IAAI,aAAa,EAAE,EACvC,MAAM,CACP,CAAC;YAEF,MAAM,OAAO,CAAC,SAAS,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,CAAC;YAElE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,yBAAyB,CAAC,CAAC;YACvE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;YAEnD,UAAU;YACV,MAAM,OAAO,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,OAAO,CACnB,OAAO,aAAa,IAAI,aAAa,EAAE,EACvC,MAAM,CACP,CAAC;YAEF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;YACnC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,OAAO,CACnB,OAAO,aAAa,IAAI,aAAa,EAAE,EACvC,MAAM,CACP,CAAC;YAEF,oBAAoB;YACpB,MAAM,OAAO,CAAC,cAAc,CAAC,2CAA2C,CAAC,CAAC;YAE1E,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACjE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAE7C,UAAU;YACV,MAAM,OAAO,CAAC,cAAc,CAAC,yBAAyB,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;YACzC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,MAAM,OAAO,CAAC,OAAO,CACnB,OAAO,aAAa,IAAI,aAAa,EAAE,EACvC,MAAM,CACP,CAAC;YAEF,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAE3B,oDAAoD;YACpD,MAAM,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC1E,MAAM,MAAM,CACV,OAAO,CAAC,OAAO,CAAC,wCAAwC,EAAE,MAAM,CAAC,CAClE,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,MAAM,CACV,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CACpC,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,sEAAsE;YACtE,gDAAgD;QAClD,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC;AAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Integration tests for WSL Handler
3
+ *
4
+ * Note: These tests require Windows with WSL installed
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=wsl-handler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsl-handler.test.d.ts","sourceRoot":"","sources":["../../../../src/context/handlers/__tests__/wsl-handler.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}