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,144 @@
1
+ /**
2
+ * Context Manager - Central orchestrator for subshell state management
3
+ */
4
+ import { SubshellContext, ConnectionState } from './types.js';
5
+ import { SubshellHandler, CommandResult, DirectoryEntry, SearchResult } from './subshell-handler.js';
6
+ /**
7
+ * Callback type for context change notifications
8
+ */
9
+ export type ContextChangeCallback = (context: SubshellContext) => void;
10
+ /**
11
+ * Callback type for user notifications
12
+ */
13
+ export type UserNotificationCallback = (message: string, type: 'info' | 'warning' | 'error') => void;
14
+ /**
15
+ * Context Manager manages the execution context stack and routes commands
16
+ * to the appropriate handler (local or subshell)
17
+ */
18
+ export declare class ContextManager {
19
+ private initialCwd;
20
+ private platform;
21
+ private contextStack;
22
+ private handlers;
23
+ private contextChangeCallbacks;
24
+ private userNotificationCallbacks;
25
+ constructor(initialCwd: string, platform: NodeJS.Platform);
26
+ /**
27
+ * Create a local context
28
+ */
29
+ private createLocalContext;
30
+ /**
31
+ * Detect the local shell type
32
+ */
33
+ private detectLocalShell;
34
+ /**
35
+ * Detect the local operating system
36
+ */
37
+ private detectLocalOS;
38
+ /**
39
+ * Get the current execution context
40
+ */
41
+ getCurrentContext(): SubshellContext;
42
+ /**
43
+ * Push a new context onto the stack
44
+ */
45
+ pushContext(context: SubshellContext): void;
46
+ /**
47
+ * Pop the current context from the stack
48
+ * @returns The popped context, or null if only local context remains
49
+ */
50
+ popContext(): SubshellContext | null;
51
+ /**
52
+ * Register a subshell handler
53
+ */
54
+ registerHandler(type: string, handler: SubshellHandler): void;
55
+ /**
56
+ * Get a registered handler by type
57
+ */
58
+ getHandler(type: string): SubshellHandler | undefined;
59
+ /**
60
+ * Get all registered handlers
61
+ */
62
+ getAllHandlers(): SubshellHandler[];
63
+ /**
64
+ * Update the working directory of the current context
65
+ */
66
+ updateWorkingDirectory(path: string): void;
67
+ /**
68
+ * Update the connection state of the current context
69
+ */
70
+ updateConnectionState(state: ConnectionState): void;
71
+ /**
72
+ * Register a callback for context changes
73
+ */
74
+ onContextChange(callback: ContextChangeCallback): void;
75
+ /**
76
+ * Register a callback for user notifications
77
+ */
78
+ onUserNotification(callback: UserNotificationCallback): void;
79
+ /**
80
+ * Notify all registered callbacks of a context change
81
+ */
82
+ private notifyContextChange;
83
+ /**
84
+ * Notify user with a message
85
+ */
86
+ private notifyUser;
87
+ /**
88
+ * Execute a command in the current context with timeout
89
+ */
90
+ executeCommand(command: string, timeoutMs?: number): Promise<CommandResult>;
91
+ /**
92
+ * Execute a command locally
93
+ */
94
+ private executeLocalCommand;
95
+ /**
96
+ * Read a file in the current context with timeout
97
+ */
98
+ readFile(path: string, timeoutMs?: number): Promise<string>;
99
+ /**
100
+ * Write a file in the current context with timeout
101
+ */
102
+ writeFile(path: string, content: string, timeoutMs?: number): Promise<void>;
103
+ /**
104
+ * List directory contents in the current context with timeout
105
+ */
106
+ listDirectory(path: string, timeoutMs?: number): Promise<DirectoryEntry[]>;
107
+ /**
108
+ * Search for files in the current context with timeout
109
+ */
110
+ searchFiles(pattern: string, directory: string, timeoutMs?: number): Promise<SearchResult[]>;
111
+ /**
112
+ * Parse grep output into SearchResult array
113
+ */
114
+ private parseGrepOutput;
115
+ /**
116
+ * Connect to a subshell with error handling
117
+ */
118
+ connectToSubshell(handler: SubshellHandler, command: string): Promise<void>;
119
+ /**
120
+ * Restore local context after connection failure
121
+ */
122
+ private restoreLocalContext;
123
+ /**
124
+ * Attempt to reconnect to a subshell
125
+ */
126
+ attemptReconnection(handler: SubshellHandler, command: string, maxAttempts?: number): Promise<void>;
127
+ /**
128
+ * Utility method to sleep for a specified duration
129
+ */
130
+ private sleep;
131
+ /**
132
+ * Execute an operation with a timeout
133
+ */
134
+ executeWithTimeout<T>(operation: () => Promise<T>, timeoutMs: number, operationName: string): Promise<T>;
135
+ /**
136
+ * Reset to local context (for error recovery)
137
+ */
138
+ resetToLocal(): void;
139
+ /**
140
+ * Handle connection loss and attempt recovery
141
+ */
142
+ handleConnectionLoss(error: Error): Promise<void>;
143
+ }
144
+ //# sourceMappingURL=context-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.d.ts","sourceRoot":"","sources":["../../src/context/context-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,487 @@
1
+ /**
2
+ * Context Manager - Central orchestrator for subshell state management
3
+ */
4
+ import { randomUUID } from 'crypto';
5
+ import { SubshellConnectionError, SubshellExecutionError, } from './types.js';
6
+ /**
7
+ * Context Manager manages the execution context stack and routes commands
8
+ * to the appropriate handler (local or subshell)
9
+ */
10
+ export class ContextManager {
11
+ initialCwd;
12
+ platform;
13
+ contextStack = [];
14
+ handlers = new Map();
15
+ contextChangeCallbacks = [];
16
+ userNotificationCallbacks = [];
17
+ constructor(initialCwd, platform) {
18
+ this.initialCwd = initialCwd;
19
+ this.platform = platform;
20
+ // Initialize with local context
21
+ this.contextStack.push(this.createLocalContext(initialCwd));
22
+ }
23
+ /**
24
+ * Create a local context
25
+ */
26
+ createLocalContext(cwd) {
27
+ return {
28
+ type: 'local',
29
+ metadata: {
30
+ workingDirectory: cwd,
31
+ shell: this.detectLocalShell(),
32
+ os: this.detectLocalOS(),
33
+ },
34
+ connectionState: 'connected',
35
+ sessionId: randomUUID(),
36
+ };
37
+ }
38
+ /**
39
+ * Detect the local shell type
40
+ */
41
+ detectLocalShell() {
42
+ const shell = process.env.SHELL || process.env.ComSpec || 'unknown';
43
+ if (shell.includes('bash'))
44
+ return 'bash';
45
+ if (shell.includes('zsh'))
46
+ return 'zsh';
47
+ if (shell.includes('fish'))
48
+ return 'fish';
49
+ if (shell.includes('cmd'))
50
+ return 'cmd';
51
+ if (shell.includes('powershell') || shell.includes('pwsh'))
52
+ return 'powershell';
53
+ return 'unknown';
54
+ }
55
+ /**
56
+ * Detect the local operating system
57
+ */
58
+ detectLocalOS() {
59
+ switch (this.platform) {
60
+ case 'win32':
61
+ return 'windows';
62
+ case 'darwin':
63
+ return 'macos';
64
+ default:
65
+ return 'linux';
66
+ }
67
+ }
68
+ /**
69
+ * Get the current execution context
70
+ */
71
+ getCurrentContext() {
72
+ return this.contextStack[this.contextStack.length - 1];
73
+ }
74
+ /**
75
+ * Push a new context onto the stack
76
+ */
77
+ pushContext(context) {
78
+ this.contextStack.push(context);
79
+ this.notifyContextChange();
80
+ }
81
+ /**
82
+ * Pop the current context from the stack
83
+ * @returns The popped context, or null if only local context remains
84
+ */
85
+ popContext() {
86
+ if (this.contextStack.length <= 1) {
87
+ // Don't pop the local context
88
+ return null;
89
+ }
90
+ const popped = this.contextStack.pop();
91
+ this.notifyContextChange();
92
+ return popped;
93
+ }
94
+ /**
95
+ * Register a subshell handler
96
+ */
97
+ registerHandler(type, handler) {
98
+ this.handlers.set(type, handler);
99
+ }
100
+ /**
101
+ * Get a registered handler by type
102
+ */
103
+ getHandler(type) {
104
+ return this.handlers.get(type);
105
+ }
106
+ /**
107
+ * Get all registered handlers
108
+ */
109
+ getAllHandlers() {
110
+ return Array.from(this.handlers.values());
111
+ }
112
+ /**
113
+ * Update the working directory of the current context
114
+ */
115
+ updateWorkingDirectory(path) {
116
+ const current = this.getCurrentContext();
117
+ current.metadata.workingDirectory = path;
118
+ this.notifyContextChange();
119
+ }
120
+ /**
121
+ * Update the connection state of the current context
122
+ */
123
+ updateConnectionState(state) {
124
+ const current = this.getCurrentContext();
125
+ current.connectionState = state;
126
+ this.notifyContextChange();
127
+ }
128
+ /**
129
+ * Register a callback for context changes
130
+ */
131
+ onContextChange(callback) {
132
+ this.contextChangeCallbacks.push(callback);
133
+ }
134
+ /**
135
+ * Register a callback for user notifications
136
+ */
137
+ onUserNotification(callback) {
138
+ this.userNotificationCallbacks.push(callback);
139
+ }
140
+ /**
141
+ * Notify all registered callbacks of a context change
142
+ */
143
+ notifyContextChange() {
144
+ const current = this.getCurrentContext();
145
+ this.contextChangeCallbacks.forEach(callback => {
146
+ try {
147
+ callback(current);
148
+ }
149
+ catch (error) {
150
+ console.error('Error in context change callback:', error);
151
+ }
152
+ });
153
+ }
154
+ /**
155
+ * Notify user with a message
156
+ */
157
+ notifyUser(message, type = 'info') {
158
+ this.userNotificationCallbacks.forEach(callback => {
159
+ try {
160
+ callback(message, type);
161
+ }
162
+ catch (error) {
163
+ console.error('Error in user notification callback:', error);
164
+ }
165
+ });
166
+ // Fallback to console if no callbacks registered
167
+ if (this.userNotificationCallbacks.length === 0) {
168
+ const prefix = type === 'error' ? '❌' : type === 'warning' ? '⚠️' : 'ℹ️';
169
+ console.log(`${prefix} ${message}`);
170
+ }
171
+ }
172
+ /**
173
+ * Execute a command in the current context with timeout
174
+ */
175
+ async executeCommand(command, timeoutMs = 30000) {
176
+ const context = this.getCurrentContext();
177
+ const startTime = Date.now();
178
+ try {
179
+ let result;
180
+ if (context.type === 'local') {
181
+ // Execute locally using Node.js child_process
182
+ result = await this.executeWithTimeout(() => this.executeLocalCommand(command, context.metadata.workingDirectory), timeoutMs, 'Command execution');
183
+ }
184
+ else {
185
+ // Execute in subshell
186
+ if (!context.handler) {
187
+ throw new SubshellExecutionError(command, 'No handler available for current context', 1);
188
+ }
189
+ result = await this.executeWithTimeout(() => context.handler.executeCommand(command), timeoutMs, 'Command execution');
190
+ // Update working directory after command execution
191
+ const newCwd = await context.handler.getCurrentWorkingDirectory();
192
+ if (newCwd !== context.metadata.workingDirectory) {
193
+ context.metadata.workingDirectory = newCwd;
194
+ this.notifyContextChange();
195
+ }
196
+ }
197
+ // Check for latency warning
198
+ const executionTime = Date.now() - startTime;
199
+ if (executionTime > 2000) {
200
+ this.notifyUser(`Command took ${(executionTime / 1000).toFixed(1)}s to execute (high latency detected)`, 'warning');
201
+ }
202
+ return result;
203
+ }
204
+ catch (error) {
205
+ if (error instanceof Error && error.message.includes('timed out')) {
206
+ this.notifyUser(`Command timed out after ${timeoutMs / 1000}s`, 'error');
207
+ throw new SubshellExecutionError(command, `Command timed out after ${timeoutMs / 1000}s`, 124 // Standard timeout exit code
208
+ );
209
+ }
210
+ throw new SubshellExecutionError(command, error instanceof Error ? error.message : String(error), 1);
211
+ }
212
+ }
213
+ /**
214
+ * Execute a command locally
215
+ */
216
+ async executeLocalCommand(command, cwd) {
217
+ const { exec } = await import('child_process');
218
+ const { promisify } = await import('util');
219
+ const execAsync = promisify(exec);
220
+ try {
221
+ const { stdout, stderr } = await execAsync(command, { cwd });
222
+ return {
223
+ stdout: stdout || '',
224
+ stderr: stderr || '',
225
+ exitCode: 0,
226
+ };
227
+ }
228
+ catch (error) {
229
+ return {
230
+ stdout: error.stdout || '',
231
+ stderr: error.stderr || error.message || '',
232
+ exitCode: error.code || 1,
233
+ };
234
+ }
235
+ }
236
+ /**
237
+ * Read a file in the current context with timeout
238
+ */
239
+ async readFile(path, timeoutMs = 10000) {
240
+ const context = this.getCurrentContext();
241
+ try {
242
+ if (context.type === 'local') {
243
+ const fs = await import('fs/promises');
244
+ return await this.executeWithTimeout(() => fs.readFile(path, 'utf-8'), timeoutMs, 'File read');
245
+ }
246
+ if (!context.handler) {
247
+ throw new Error('No handler available for current context');
248
+ }
249
+ return await this.executeWithTimeout(() => context.handler.readFile(path), timeoutMs, 'File read');
250
+ }
251
+ catch (error) {
252
+ if (error instanceof Error && error.message.includes('timed out')) {
253
+ this.notifyUser(`File read timed out after ${timeoutMs / 1000}s`, 'error');
254
+ }
255
+ throw error;
256
+ }
257
+ }
258
+ /**
259
+ * Write a file in the current context with timeout
260
+ */
261
+ async writeFile(path, content, timeoutMs = 10000) {
262
+ const context = this.getCurrentContext();
263
+ try {
264
+ if (context.type === 'local') {
265
+ const fs = await import('fs/promises');
266
+ await this.executeWithTimeout(() => fs.writeFile(path, content, 'utf-8'), timeoutMs, 'File write');
267
+ return;
268
+ }
269
+ if (!context.handler) {
270
+ throw new Error('No handler available for current context');
271
+ }
272
+ await this.executeWithTimeout(() => context.handler.writeFile(path, content), timeoutMs, 'File write');
273
+ }
274
+ catch (error) {
275
+ if (error instanceof Error && error.message.includes('timed out')) {
276
+ this.notifyUser(`File write timed out after ${timeoutMs / 1000}s`, 'error');
277
+ }
278
+ throw error;
279
+ }
280
+ }
281
+ /**
282
+ * List directory contents in the current context with timeout
283
+ */
284
+ async listDirectory(path, timeoutMs = 10000) {
285
+ const context = this.getCurrentContext();
286
+ try {
287
+ if (context.type === 'local') {
288
+ const fs = await import('fs/promises');
289
+ return await this.executeWithTimeout(async () => {
290
+ const entries = await fs.readdir(path, { withFileTypes: true });
291
+ return entries.map(entry => ({
292
+ name: entry.name,
293
+ type: entry.isDirectory() ? 'directory' : 'file',
294
+ }));
295
+ }, timeoutMs, 'Directory listing');
296
+ }
297
+ if (!context.handler) {
298
+ throw new Error('No handler available for current context');
299
+ }
300
+ return await this.executeWithTimeout(() => context.handler.listDirectory(path), timeoutMs, 'Directory listing');
301
+ }
302
+ catch (error) {
303
+ if (error instanceof Error && error.message.includes('timed out')) {
304
+ this.notifyUser(`Directory listing timed out after ${timeoutMs / 1000}s`, 'error');
305
+ }
306
+ throw error;
307
+ }
308
+ }
309
+ /**
310
+ * Search for files in the current context with timeout
311
+ */
312
+ async searchFiles(pattern, directory, timeoutMs = 30000) {
313
+ const context = this.getCurrentContext();
314
+ try {
315
+ if (context.type === 'local') {
316
+ // For local, we'll use grep via command execution
317
+ const result = await this.executeWithTimeout(() => this.executeLocalCommand(`grep -rn "${pattern}" "${directory}" 2>/dev/null || true`, context.metadata.workingDirectory), timeoutMs, 'File search');
318
+ return this.parseGrepOutput(result.stdout);
319
+ }
320
+ if (!context.handler) {
321
+ throw new Error('No handler available for current context');
322
+ }
323
+ return await this.executeWithTimeout(() => context.handler.searchFiles(pattern, directory), timeoutMs, 'File search');
324
+ }
325
+ catch (error) {
326
+ if (error instanceof Error && error.message.includes('timed out')) {
327
+ this.notifyUser(`File search timed out after ${timeoutMs / 1000}s`, 'error');
328
+ }
329
+ throw error;
330
+ }
331
+ }
332
+ /**
333
+ * Parse grep output into SearchResult array
334
+ */
335
+ parseGrepOutput(output) {
336
+ const results = [];
337
+ const lines = output.split('\n').filter(line => line.trim());
338
+ for (const line of lines) {
339
+ const match = line.match(/^([^:]+):(\d+):(.*)$/);
340
+ if (match) {
341
+ results.push({
342
+ file: match[1],
343
+ line: parseInt(match[2], 10),
344
+ content: match[3],
345
+ });
346
+ }
347
+ }
348
+ return results;
349
+ }
350
+ /**
351
+ * Connect to a subshell with error handling
352
+ */
353
+ async connectToSubshell(handler, command) {
354
+ try {
355
+ this.updateConnectionState('connecting');
356
+ this.notifyUser(`Connecting to ${handler.type}...`, 'info');
357
+ const cwd = this.getCurrentContext().metadata.workingDirectory;
358
+ const context = await handler.connect(command, cwd);
359
+ this.pushContext(context);
360
+ this.updateConnectionState('connected');
361
+ this.notifyUser(`Connected to ${handler.type} successfully`, 'info');
362
+ }
363
+ catch (error) {
364
+ this.updateConnectionState('error');
365
+ const errorMessage = error instanceof Error ? error.message : String(error);
366
+ this.notifyUser(`Failed to connect: ${errorMessage}`, 'error');
367
+ // Check if error is recoverable
368
+ if (error instanceof SubshellConnectionError && error.recoverable) {
369
+ this.notifyUser('Attempting to reconnect...', 'info');
370
+ try {
371
+ await this.attemptReconnection(handler, command);
372
+ }
373
+ catch (reconnectError) {
374
+ const reconnectMsg = reconnectError instanceof Error ? reconnectError.message : String(reconnectError);
375
+ this.notifyUser(`Reconnection failed: ${reconnectMsg}`, 'error');
376
+ this.restoreLocalContext();
377
+ }
378
+ }
379
+ else {
380
+ // Non-recoverable error, restore local context
381
+ this.restoreLocalContext();
382
+ }
383
+ throw error;
384
+ }
385
+ }
386
+ /**
387
+ * Restore local context after connection failure
388
+ */
389
+ restoreLocalContext() {
390
+ // Pop all subshell contexts and return to local
391
+ while (this.contextStack.length > 1) {
392
+ const context = this.contextStack.pop();
393
+ if (context?.handler) {
394
+ context.handler.disconnect().catch((err) => {
395
+ console.error('Error disconnecting handler:', err);
396
+ });
397
+ }
398
+ }
399
+ this.updateConnectionState('connected');
400
+ this.notifyUser('Restored local context', 'info');
401
+ }
402
+ /**
403
+ * Attempt to reconnect to a subshell
404
+ */
405
+ async attemptReconnection(handler, command, maxAttempts = 3) {
406
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
407
+ const delay = Math.min(1000 * Math.pow(2, attempt - 1), 8000);
408
+ this.notifyUser(`Reconnection attempt ${attempt}/${maxAttempts}...`, 'info');
409
+ await this.sleep(delay);
410
+ try {
411
+ const cwd = this.getCurrentContext().metadata.workingDirectory;
412
+ const context = await handler.connect(command, cwd);
413
+ this.pushContext(context);
414
+ this.updateConnectionState('connected');
415
+ this.notifyUser('Reconnected successfully', 'info');
416
+ return;
417
+ }
418
+ catch (error) {
419
+ if (attempt === maxAttempts) {
420
+ throw new SubshellConnectionError(handler.type, 'Reconnection failed after maximum attempts', false);
421
+ }
422
+ }
423
+ }
424
+ }
425
+ /**
426
+ * Utility method to sleep for a specified duration
427
+ */
428
+ sleep(ms) {
429
+ return new Promise(resolve => setTimeout(resolve, ms));
430
+ }
431
+ /**
432
+ * Execute an operation with a timeout
433
+ */
434
+ async executeWithTimeout(operation, timeoutMs, operationName) {
435
+ return Promise.race([
436
+ operation(),
437
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`${operationName} timed out after ${timeoutMs}ms`)), timeoutMs)),
438
+ ]);
439
+ }
440
+ /**
441
+ * Reset to local context (for error recovery)
442
+ */
443
+ resetToLocal() {
444
+ // Disconnect all subshells
445
+ const handlers = this.contextStack
446
+ .filter(ctx => ctx.handler)
447
+ .map(ctx => ctx.handler);
448
+ // Clear stack except local context
449
+ this.contextStack = [this.contextStack[0]];
450
+ // Disconnect handlers asynchronously
451
+ handlers.forEach(handler => {
452
+ handler.disconnect().catch((err) => {
453
+ console.error('Error disconnecting handler:', err);
454
+ });
455
+ });
456
+ this.notifyContextChange();
457
+ }
458
+ /**
459
+ * Handle connection loss and attempt recovery
460
+ */
461
+ async handleConnectionLoss(error) {
462
+ const context = this.getCurrentContext();
463
+ if (context.type === 'local') {
464
+ // Already in local context, nothing to do
465
+ return;
466
+ }
467
+ this.updateConnectionState('error');
468
+ this.notifyUser(`Connection lost: ${error.message}`, 'error');
469
+ // Try to reconnect if handler is available
470
+ if (context.handler) {
471
+ try {
472
+ this.notifyUser('Attempting to reconnect...', 'info');
473
+ // We need the original command to reconnect, but we don't have it stored
474
+ // For now, we'll just restore local context
475
+ this.restoreLocalContext();
476
+ }
477
+ catch (reconnectError) {
478
+ this.notifyUser('Reconnection failed, restoring local context', 'error');
479
+ this.restoreLocalContext();
480
+ }
481
+ }
482
+ else {
483
+ this.restoreLocalContext();
484
+ }
485
+ }
486
+ }
487
+ //# sourceMappingURL=context-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/context/context-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
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
+ export declare function testDockerHandler(): void;
13
+ //# sourceMappingURL=docker-handler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-handler.test.d.ts","sourceRoot":"","sources":["../../../../src/context/handlers/__tests__/docker-handler.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,wBAAgB,iBAAiB,SA4WhC"}