@theia/ai-terminal 1.72.0-next.50 → 1.72.0-next.59
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.
- package/lib/browser/shell-execution-tool.d.ts +7 -1
- package/lib/browser/shell-execution-tool.d.ts.map +1 -1
- package/lib/browser/shell-execution-tool.js +41 -7
- package/lib/browser/shell-execution-tool.js.map +1 -1
- package/lib/common/shell-execution-server.d.ts +1 -3
- package/lib/common/shell-execution-server.d.ts.map +1 -1
- package/lib/common/shell-execution-server.js.map +1 -1
- package/lib/node/shell-execution-server-impl.d.ts +0 -1
- package/lib/node/shell-execution-server-impl.d.ts.map +1 -1
- package/lib/node/shell-execution-server-impl.js +12 -21
- package/lib/node/shell-execution-server-impl.js.map +1 -1
- package/package.json +8 -8
- package/src/browser/shell-execution-tool.ts +54 -9
- package/src/common/shell-execution-server.ts +1 -3
- package/src/node/shell-execution-server-impl.ts +14 -23
|
@@ -12,7 +12,13 @@ export declare class ShellExecutionTool implements ToolProvider {
|
|
|
12
12
|
isExecutionRunning(toolCallId: string): boolean;
|
|
13
13
|
getTool(): ToolRequest;
|
|
14
14
|
protected executeCommand(argString: string, ctx?: unknown): Promise<ShellExecutionToolResult | ShellExecutionCanceledResult>;
|
|
15
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Resolves a cwd value to an absolute filesystem path.
|
|
17
|
+
* Handles: undefined (falls back to workspace root), absolute paths (pass-through),
|
|
18
|
+
* root-relative paths (<rootName>/...), and bare root names.
|
|
19
|
+
*/
|
|
20
|
+
private resolveCwd;
|
|
21
|
+
protected extractToolCallId(ctx?: unknown): string | undefined;
|
|
16
22
|
protected extractCancellationToken(ctx: unknown): CancellationToken | undefined;
|
|
17
23
|
protected combineAndTruncate(stdout: string, stderr: string): string;
|
|
18
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-execution-tool.d.ts","sourceRoot":"","sources":["../../src/browser/shell-execution-tool.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAoB,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAEH,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,EAE/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"shell-execution-tool.d.ts","sourceRoot":"","sources":["../../src/browser/shell-execution-tool.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAoB,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAEH,oBAAoB,EACpB,wBAAwB,EACxB,4BAA4B,EAE/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAsB,MAAM,aAAa,CAAC;AAEpE,qBACa,kBAAmB,YAAW,YAAY;IAGnD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAGrD,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAGtD,SAAS,CAAC,QAAQ,CAAC,6BAA6B,EAAE,6BAA6B,CAAC;IAEhF,SAAS,CAAC,QAAQ,CAAC,iBAAiB,sBAA6B;IAE3D,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY3D,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI/C,OAAO,IAAI,WAAW;cA2GN,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,wBAAwB,GAAG,4BAA4B,CAAC;IA2DlI;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAyClB,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS;IAO9D,SAAS,CAAC,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS;IAa/E,SAAS,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;CAGvE"}
|
|
@@ -112,7 +112,10 @@ TIMEOUT: Default 2 minutes, max 10 minutes. Specify higher timeout for longer co
|
|
|
112
112
|
},
|
|
113
113
|
cwd: {
|
|
114
114
|
type: 'string',
|
|
115
|
-
description: 'Working directory for command execution.
|
|
115
|
+
description: 'Working directory for command execution. ' +
|
|
116
|
+
'Use a workspace-relative path (e.g., "backend", "frontend/src") ' +
|
|
117
|
+
'or an absolute filesystem path. ' +
|
|
118
|
+
'If omitted, defaults to the workspace root (single-root workspaces only).'
|
|
116
119
|
},
|
|
117
120
|
timeout: {
|
|
118
121
|
type: 'number',
|
|
@@ -145,9 +148,7 @@ TIMEOUT: Default 2 minutes, max 10 minutes. Specify higher timeout for longer co
|
|
|
145
148
|
}
|
|
146
149
|
async executeCommand(argString, ctx) {
|
|
147
150
|
const args = JSON.parse(argString);
|
|
148
|
-
|
|
149
|
-
const rootUri = this.workspaceService.getWorkspaceRootUri(undefined);
|
|
150
|
-
const workspaceRoot = rootUri?.path.fsPath();
|
|
151
|
+
const resolvedCwd = this.resolveCwd(args.cwd);
|
|
151
152
|
// Generate execution ID and get tool call ID from context
|
|
152
153
|
const executionId = (0, core_1.generateUuid)();
|
|
153
154
|
const toolCallId = this.extractToolCallId(ctx);
|
|
@@ -160,11 +161,9 @@ TIMEOUT: Default 2 minutes, max 10 minutes. Specify higher timeout for longer co
|
|
|
160
161
|
this.shellServer.cancel(executionId);
|
|
161
162
|
});
|
|
162
163
|
try {
|
|
163
|
-
// Call the backend service (path resolution happens on the backend)
|
|
164
164
|
const result = await this.shellServer.execute({
|
|
165
165
|
command: args.command,
|
|
166
|
-
cwd:
|
|
167
|
-
workspaceRoot,
|
|
166
|
+
cwd: resolvedCwd,
|
|
168
167
|
timeout: args.timeout,
|
|
169
168
|
executionId,
|
|
170
169
|
});
|
|
@@ -194,6 +193,41 @@ TIMEOUT: Default 2 minutes, max 10 minutes. Specify higher timeout for longer co
|
|
|
194
193
|
}
|
|
195
194
|
}
|
|
196
195
|
}
|
|
196
|
+
/**
|
|
197
|
+
* Resolves a cwd value to an absolute filesystem path.
|
|
198
|
+
* Handles: undefined (falls back to workspace root), absolute paths (pass-through),
|
|
199
|
+
* root-relative paths (<rootName>/...), and bare root names.
|
|
200
|
+
*/
|
|
201
|
+
resolveCwd(cwd) {
|
|
202
|
+
const roots = this.workspaceService.tryGetRoots();
|
|
203
|
+
const rootNames = roots.map(r => r.resource.path.base);
|
|
204
|
+
if (!cwd) {
|
|
205
|
+
if (roots.length === 1) {
|
|
206
|
+
return roots[0].resource.path.fsPath();
|
|
207
|
+
}
|
|
208
|
+
throw new Error('A working directory (cwd) is required in a multi-root workspace. ' +
|
|
209
|
+
`Available workspace roots: ${rootNames.join(', ')}. ` +
|
|
210
|
+
'Provide one as cwd (e.g., "backend") or use a sub-path (e.g., "backend/src").');
|
|
211
|
+
}
|
|
212
|
+
const normalized = core_1.Path.normalizePathSeparator(cwd);
|
|
213
|
+
if (new core_1.Path(normalized).isAbsolute) {
|
|
214
|
+
return normalized;
|
|
215
|
+
}
|
|
216
|
+
const segments = normalized.split('/');
|
|
217
|
+
for (const root of roots) {
|
|
218
|
+
if (root.resource.path.base === segments[0]) {
|
|
219
|
+
const rest = segments.slice(1).join('/');
|
|
220
|
+
const resolved = rest ? root.resource.resolve(rest) : root.resource;
|
|
221
|
+
return resolved.path.fsPath();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (roots.length === 1) {
|
|
225
|
+
return roots[0].resource.resolve(normalized).path.fsPath();
|
|
226
|
+
}
|
|
227
|
+
throw new Error(`Could not resolve working directory '${cwd}' to a workspace root. ` +
|
|
228
|
+
'In a multi-root workspace, prefix paths with the workspace root name ' +
|
|
229
|
+
`(e.g., '${rootNames[0]}/path'). Available roots: ${rootNames.join(', ')}.`);
|
|
230
|
+
}
|
|
197
231
|
extractToolCallId(ctx) {
|
|
198
232
|
if (ctx && typeof ctx === 'object' && 'toolCallId' in ctx) {
|
|
199
233
|
return ctx.toolCallId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-execution-tool.js","sourceRoot":"","sources":["../../src/browser/shell-execution-tool.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAAkE;AAElE,yFAAmF;AACnF,0DAAgE;AAChE,6EAM0C;AAC1C,
|
|
1
|
+
{"version":3,"file":"shell-execution-tool.js","sourceRoot":"","sources":["../../src/browser/shell-execution-tool.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAAkE;AAElE,yFAAmF;AACnF,0DAAgE;AAChE,6EAM0C;AAC1C,sCAAoE;AAG7D,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAAxB;QAWgB,sBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IA6PrE,CAAC;IA3PG,KAAK,CAAC,eAAe,CAAC,UAAkB;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3D,IAAI,WAAW,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAC5D,IAAI,QAAQ,EAAE,CAAC;gBACX,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,QAAQ,CAAC;QACpB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,kBAAkB,CAAC,UAAkB;QACjC,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;IAED,OAAO;QACH,OAAO;YACH,EAAE,EAAE,oDAA2B;YAC/B,IAAI,EAAE,oDAA2B;YACjC,YAAY,EAAE,aAAa;YAC3B,kBAAkB,EAAE,gEAAgE;gBAChF,mEAAmE;YACvE,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wFAgC+D;YAC5E,UAAU,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACR,OAAO,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,iFAAiF;qBACjG;oBACD,WAAW,EAAE;wBACT,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,4DAA4D;4BACrE,kEAAkE;4BAClE,4CAA4C;4BAC5C,+CAA+C;4BAC/C,kEAAkE;4BAClE,iEAAiE;4BACjE,kEAAkE;4BAClE,qEAAqE;4BACrE,mFAAmF;4BACnF,mDAAmD;4BACnD,wDAAwD;4BACxD,4CAA4C;4BAC5C,oFAAoF;4BACpF,iGAAiG;4BACjG,sFAAsF;4BACtF,qGAAqG;4BACrG,sIAAsI;4BACtI,uEAAuE;4BACvE,2EAA2E;4BAC3E,gFAAgF;qBACvF;oBACD,GAAG,EAAE;wBACD,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,2CAA2C;4BACpD,kEAAkE;4BAClE,kCAAkC;4BAClC,2EAA2E;qBAClF;oBACD,OAAO,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,iFAAiF;qBACjG;iBACJ;gBACD,QAAQ,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;aACvC;YACD,OAAO,EAAE,CAAC,SAAiB,EAAE,GAAa,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC;YAClF,eAAe,EAAE,CAAC,SAAiB,EAAgC,EAAE;gBACjE,IAAI,CAAC;oBACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;oBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,6BAA6B,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAE7E,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;wBAC7B,OAAO;4BACH,MAAM,EAAE,MAAM;4BACd,MAAM,EAAE,mDAAmD,MAAM,CAAC,cAAc,EAAE;yBACrF,CAAC;oBACN,CAAC;oBACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;oBAC/B,CAAC;oBACD,OAAO,SAAS,CAAC,CAAC,uBAAuB;gBAC7C,CAAC;gBAAC,MAAM,CAAC;oBACL,OAAO,SAAS,CAAC,CAAC,uBAAuB;gBAC7C,CAAC;YACL,CAAC;SACJ,CAAC;IACN,CAAC;IAES,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,GAAa;QAC3D,MAAM,IAAI,GAIN,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAE1B,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE9C,0DAA0D;QAC1D,MAAM,WAAW,GAAG,IAAA,mBAAY,GAAE,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAE7D,uBAAuB;QACvB,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,oBAAoB,GAAG,iBAAiB,EAAE,uBAAuB,CAAC,GAAG,EAAE;YACzE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;gBAC1C,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG,EAAE,WAAW;gBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW;aACd,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO;oBACH,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS;oBAC1E,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC5B,CAAC;YACN,CAAC;YAED,8CAA8C;YAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAE7E,OAAO;gBACH,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,GAAG,EAAE,MAAM,CAAC,WAAW;aAC1B,CAAC;QACN,CAAC;gBAAS,CAAC;YACP,WAAW;YACX,oBAAoB,EAAE,OAAO,EAAE,CAAC;YAChC,IAAI,UAAU,EAAE,CAAC;gBACb,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;IACL,CAAC;IAED;;;;OAIG;IACK,UAAU,CAAC,GAAuB;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QAElD,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3C,CAAC;YACD,MAAM,IAAI,KAAK,CACX,mEAAmE;gBACnE,8BAA8B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;gBACtD,+EAA+E,CAClF,CAAC;QACN,CAAC;QAED,MAAM,UAAU,GAAG,WAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAEpD,IAAI,IAAI,WAAI,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,CAAC;YAClC,OAAO,UAAU,CAAC;QACtB,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACpE,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAClC,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/D,CAAC;QAED,MAAM,IAAI,KAAK,CACX,wCAAwC,GAAG,yBAAyB;YACpE,uEAAuE;YACvE,WAAW,SAAS,CAAC,CAAC,CAAC,6BAA6B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC9E,CAAC;IACN,CAAC;IAES,iBAAiB,CAAC,GAAa;QACrC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,YAAY,IAAI,GAAG,EAAE,CAAC;YACxD,OAAQ,GAA+B,CAAC,UAAU,CAAC;QACvD,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAES,wBAAwB,CAAC,GAAY;QAC3C,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACjC,2EAA2E;YAC3E,IAAI,UAAU,IAAI,GAAG,EAAE,CAAC;gBACpB,MAAM,QAAQ,GAAI,GAAgE,CAAC,QAAQ,CAAC;gBAC5F,IAAI,QAAQ,EAAE,iBAAiB,EAAE,CAAC;oBAC9B,OAAO,QAAQ,CAAC,iBAAiB,CAAC;gBACtC,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAES,kBAAkB,CAAC,MAAc,EAAE,MAAc;QACvD,OAAO,IAAA,2CAAkB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;CACJ,CAAA;AAxQY,gDAAkB;AAGR;IADlB,IAAA,kBAAM,EAAC,6CAAoB,CAAC;;uDACwB;AAGlC;IADlB,IAAA,kBAAM,EAAC,0BAAgB,CAAC;sCACY,0BAAgB;4DAAC;AAGnC;IADlB,IAAA,kBAAM,EAAC,gEAA6B,CAAC;sCACY,gEAA6B;yEAAC;6BATvE,kBAAkB;IAD9B,IAAA,sBAAU,GAAE;GACA,kBAAkB,CAwQ9B"}
|
|
@@ -3,10 +3,8 @@ export declare const ShellExecutionServer: unique symbol;
|
|
|
3
3
|
export declare const shellExecutionPath = "/services/shell-execution";
|
|
4
4
|
export interface ShellExecutionRequest {
|
|
5
5
|
command: string;
|
|
6
|
-
/** Working directory.
|
|
6
|
+
/** Working directory. Resolved to an absolute path on the frontend before sending to the backend. */
|
|
7
7
|
cwd?: string;
|
|
8
|
-
/** Workspace root path for resolving relative cwd paths */
|
|
9
|
-
workspaceRoot?: string;
|
|
10
8
|
timeout?: number;
|
|
11
9
|
/** Unique ID for this execution, used for cancellation */
|
|
12
10
|
executionId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-execution-server.d.ts","sourceRoot":"","sources":["../../src/common/shell-execution-server.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAE1D,eAAO,MAAM,oBAAoB,eAAiC,CAAC;AACnE,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,
|
|
1
|
+
{"version":3,"file":"shell-execution-server.d.ts","sourceRoot":"","sources":["../../src/common/shell-execution-server.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,2BAA2B,iBAAiB,CAAC;AAE1D,eAAO,MAAM,oBAAoB,eAAiC,CAAC;AACnE,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,qGAAqG;IACrG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACjC,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACvE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,4BAA4B;IACzC,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yBAAiB,wBAAwB,CAAC;IACtC,SAAgB,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,wBAAwB,CAIhE;CACJ;AAED,yBAAiB,4BAA4B,CAAC;IAC1C,SAAgB,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,4BAA4B,CAGpE;CACJ;AAED,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOjD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA0BzE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-execution-server.js","sourceRoot":"","sources":["../../src/common/shell-execution-server.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;
|
|
1
|
+
{"version":3,"file":"shell-execution-server.js","sourceRoot":"","sources":["../../src/common/shell-execution-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,5 @@ export declare class ShellExecutionServerImpl implements ShellExecutionServer {
|
|
|
6
6
|
execute(request: ShellExecutionRequest): Promise<ShellExecutionResult>;
|
|
7
7
|
cancel(executionId: string): Promise<boolean>;
|
|
8
8
|
protected killProcessTree(childProcess: ChildProcess): void;
|
|
9
|
-
protected resolveCwd(requestedCwd: string | undefined, workspaceRoot: string | undefined): string | undefined;
|
|
10
9
|
}
|
|
11
10
|
//# sourceMappingURL=shell-execution-server-impl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-execution-server-impl.d.ts","sourceRoot":"","sources":["../../src/node/shell-execution-server-impl.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shell-execution-server-impl.d.ts","sourceRoot":"","sources":["../../src/node/shell-execution-server-impl.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAS,YAAY,EAAY,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAMrH,qBACa,wBAAyB,YAAW,oBAAoB;IAEjE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,4BAAmC;IACtE,SAAS,CAAC,QAAQ,CAAC,kBAAkB,cAAqB;IAEpD,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA2HtE,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWnD,SAAS,CAAC,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;CAmB9D"}
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.ShellExecutionServerImpl = void 0;
|
|
19
19
|
const tslib_1 = require("tslib");
|
|
20
|
+
const path = require("path");
|
|
20
21
|
const inversify_1 = require("@theia/core/shared/inversify");
|
|
21
22
|
const child_process_1 = require("child_process");
|
|
22
|
-
const path = require("path");
|
|
23
23
|
const DEFAULT_TIMEOUT = 120000; // 2 minutes
|
|
24
24
|
const MAX_TIMEOUT = 600000; // 10 minutes
|
|
25
25
|
const MAX_OUTPUT_SIZE = 1024 * 1024; // 1MB
|
|
@@ -29,16 +29,19 @@ let ShellExecutionServerImpl = class ShellExecutionServerImpl {
|
|
|
29
29
|
this.canceledExecutions = new Set();
|
|
30
30
|
}
|
|
31
31
|
async execute(request) {
|
|
32
|
-
const { command, cwd,
|
|
32
|
+
const { command, cwd, timeout, executionId } = request;
|
|
33
|
+
if (cwd && !path.isAbsolute(cwd)) {
|
|
34
|
+
throw new Error(`Shell execution backend received a non-absolute cwd: '${cwd}'. ` +
|
|
35
|
+
'The frontend must resolve cwd to an absolute path before sending it to the backend.');
|
|
36
|
+
}
|
|
33
37
|
const effectiveTimeout = Math.min(timeout ?? DEFAULT_TIMEOUT, MAX_TIMEOUT);
|
|
34
38
|
const startTime = Date.now();
|
|
35
|
-
const resolvedCwd = this.resolveCwd(cwd, workspaceRoot);
|
|
36
39
|
return new Promise(resolve => {
|
|
37
40
|
let stdout = '';
|
|
38
41
|
let stderr = '';
|
|
39
42
|
let killed = false;
|
|
40
43
|
const childProcess = (0, child_process_1.spawn)(command, [], {
|
|
41
|
-
cwd
|
|
44
|
+
cwd,
|
|
42
45
|
shell: true,
|
|
43
46
|
detached: process.platform !== 'win32',
|
|
44
47
|
windowsHide: true,
|
|
@@ -81,7 +84,7 @@ let ShellExecutionServerImpl = class ShellExecutionServerImpl {
|
|
|
81
84
|
error: 'Command canceled by user',
|
|
82
85
|
duration,
|
|
83
86
|
canceled: true,
|
|
84
|
-
resolvedCwd,
|
|
87
|
+
resolvedCwd: cwd,
|
|
85
88
|
});
|
|
86
89
|
}
|
|
87
90
|
else {
|
|
@@ -92,7 +95,7 @@ let ShellExecutionServerImpl = class ShellExecutionServerImpl {
|
|
|
92
95
|
stderr,
|
|
93
96
|
error: `Command timed out after ${effectiveTimeout}ms`,
|
|
94
97
|
duration,
|
|
95
|
-
resolvedCwd,
|
|
98
|
+
resolvedCwd: cwd,
|
|
96
99
|
});
|
|
97
100
|
}
|
|
98
101
|
}
|
|
@@ -103,7 +106,7 @@ let ShellExecutionServerImpl = class ShellExecutionServerImpl {
|
|
|
103
106
|
stdout,
|
|
104
107
|
stderr,
|
|
105
108
|
duration,
|
|
106
|
-
resolvedCwd,
|
|
109
|
+
resolvedCwd: cwd,
|
|
107
110
|
});
|
|
108
111
|
}
|
|
109
112
|
else {
|
|
@@ -113,7 +116,7 @@ let ShellExecutionServerImpl = class ShellExecutionServerImpl {
|
|
|
113
116
|
stdout,
|
|
114
117
|
stderr,
|
|
115
118
|
duration,
|
|
116
|
-
resolvedCwd,
|
|
119
|
+
resolvedCwd: cwd,
|
|
117
120
|
});
|
|
118
121
|
}
|
|
119
122
|
});
|
|
@@ -130,7 +133,7 @@ let ShellExecutionServerImpl = class ShellExecutionServerImpl {
|
|
|
130
133
|
stderr,
|
|
131
134
|
error: error.message,
|
|
132
135
|
duration: Date.now() - startTime,
|
|
133
|
-
resolvedCwd,
|
|
136
|
+
resolvedCwd: cwd,
|
|
134
137
|
});
|
|
135
138
|
});
|
|
136
139
|
});
|
|
@@ -166,18 +169,6 @@ let ShellExecutionServerImpl = class ShellExecutionServerImpl {
|
|
|
166
169
|
}
|
|
167
170
|
}
|
|
168
171
|
}
|
|
169
|
-
resolveCwd(requestedCwd, workspaceRoot) {
|
|
170
|
-
if (!requestedCwd) {
|
|
171
|
-
return workspaceRoot;
|
|
172
|
-
}
|
|
173
|
-
if (path.isAbsolute(requestedCwd)) {
|
|
174
|
-
return requestedCwd;
|
|
175
|
-
}
|
|
176
|
-
if (workspaceRoot) {
|
|
177
|
-
return path.resolve(workspaceRoot, requestedCwd);
|
|
178
|
-
}
|
|
179
|
-
return requestedCwd;
|
|
180
|
-
}
|
|
181
172
|
};
|
|
182
173
|
exports.ShellExecutionServerImpl = ShellExecutionServerImpl;
|
|
183
174
|
exports.ShellExecutionServerImpl = ShellExecutionServerImpl = tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-execution-server-impl.js","sourceRoot":"","sources":["../../src/node/shell-execution-server-impl.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAA0D;AAC1D,iDAA8D;
|
|
1
|
+
{"version":3,"file":"shell-execution-server-impl.js","sourceRoot":"","sources":["../../src/node/shell-execution-server-impl.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-terminal",
|
|
3
|
-
"version": "1.72.0-next.
|
|
3
|
+
"version": "1.72.0-next.59+044f7bfc5",
|
|
4
4
|
"description": "Theia - AI Terminal Extension",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/ai-chat": "1.72.0-next.
|
|
7
|
-
"@theia/ai-chat-ui": "1.72.0-next.
|
|
8
|
-
"@theia/ai-core": "1.72.0-next.
|
|
9
|
-
"@theia/core": "1.72.0-next.
|
|
10
|
-
"@theia/terminal": "1.72.0-next.
|
|
11
|
-
"@theia/workspace": "1.72.0-next.
|
|
6
|
+
"@theia/ai-chat": "1.72.0-next.59+044f7bfc5",
|
|
7
|
+
"@theia/ai-chat-ui": "1.72.0-next.59+044f7bfc5",
|
|
8
|
+
"@theia/ai-core": "1.72.0-next.59+044f7bfc5",
|
|
9
|
+
"@theia/core": "1.72.0-next.59+044f7bfc5",
|
|
10
|
+
"@theia/terminal": "1.72.0-next.59+044f7bfc5",
|
|
11
|
+
"@theia/workspace": "1.72.0-next.59+044f7bfc5",
|
|
12
12
|
"zod": "^4.4.3"
|
|
13
13
|
},
|
|
14
14
|
"publishConfig": {
|
|
@@ -50,5 +50,5 @@
|
|
|
50
50
|
"nyc": {
|
|
51
51
|
"extends": "../../configs/nyc.json"
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "044f7bfc503932372f324434beabbf5422dc583f"
|
|
54
54
|
}
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
ShellExecutionCanceledResult,
|
|
26
26
|
combineAndTruncate
|
|
27
27
|
} from '../common/shell-execution-server';
|
|
28
|
-
import { CancellationToken, generateUuid } from '@theia/core';
|
|
28
|
+
import { CancellationToken, generateUuid, Path } from '@theia/core';
|
|
29
29
|
|
|
30
30
|
@injectable()
|
|
31
31
|
export class ShellExecutionTool implements ToolProvider {
|
|
@@ -129,7 +129,10 @@ TIMEOUT: Default 2 minutes, max 10 minutes. Specify higher timeout for longer co
|
|
|
129
129
|
},
|
|
130
130
|
cwd: {
|
|
131
131
|
type: 'string',
|
|
132
|
-
description: 'Working directory for command execution.
|
|
132
|
+
description: 'Working directory for command execution. ' +
|
|
133
|
+
'Use a workspace-relative path (e.g., "backend", "frontend/src") ' +
|
|
134
|
+
'or an absolute filesystem path. ' +
|
|
135
|
+
'If omitted, defaults to the workspace root (single-root workspaces only).'
|
|
133
136
|
},
|
|
134
137
|
timeout: {
|
|
135
138
|
type: 'number',
|
|
@@ -168,9 +171,7 @@ TIMEOUT: Default 2 minutes, max 10 minutes. Specify higher timeout for longer co
|
|
|
168
171
|
timeout?: number;
|
|
169
172
|
} = JSON.parse(argString);
|
|
170
173
|
|
|
171
|
-
|
|
172
|
-
const rootUri = this.workspaceService.getWorkspaceRootUri(undefined);
|
|
173
|
-
const workspaceRoot = rootUri?.path.fsPath();
|
|
174
|
+
const resolvedCwd = this.resolveCwd(args.cwd);
|
|
174
175
|
|
|
175
176
|
// Generate execution ID and get tool call ID from context
|
|
176
177
|
const executionId = generateUuid();
|
|
@@ -187,11 +188,9 @@ TIMEOUT: Default 2 minutes, max 10 minutes. Specify higher timeout for longer co
|
|
|
187
188
|
});
|
|
188
189
|
|
|
189
190
|
try {
|
|
190
|
-
// Call the backend service (path resolution happens on the backend)
|
|
191
191
|
const result = await this.shellServer.execute({
|
|
192
192
|
command: args.command,
|
|
193
|
-
cwd:
|
|
194
|
-
workspaceRoot,
|
|
193
|
+
cwd: resolvedCwd,
|
|
195
194
|
timeout: args.timeout,
|
|
196
195
|
executionId,
|
|
197
196
|
});
|
|
@@ -224,7 +223,53 @@ TIMEOUT: Default 2 minutes, max 10 minutes. Specify higher timeout for longer co
|
|
|
224
223
|
}
|
|
225
224
|
}
|
|
226
225
|
|
|
227
|
-
|
|
226
|
+
/**
|
|
227
|
+
* Resolves a cwd value to an absolute filesystem path.
|
|
228
|
+
* Handles: undefined (falls back to workspace root), absolute paths (pass-through),
|
|
229
|
+
* root-relative paths (<rootName>/...), and bare root names.
|
|
230
|
+
*/
|
|
231
|
+
private resolveCwd(cwd: string | undefined): string {
|
|
232
|
+
const roots = this.workspaceService.tryGetRoots();
|
|
233
|
+
|
|
234
|
+
const rootNames = roots.map(r => r.resource.path.base);
|
|
235
|
+
if (!cwd) {
|
|
236
|
+
if (roots.length === 1) {
|
|
237
|
+
return roots[0].resource.path.fsPath();
|
|
238
|
+
}
|
|
239
|
+
throw new Error(
|
|
240
|
+
'A working directory (cwd) is required in a multi-root workspace. ' +
|
|
241
|
+
`Available workspace roots: ${rootNames.join(', ')}. ` +
|
|
242
|
+
'Provide one as cwd (e.g., "backend") or use a sub-path (e.g., "backend/src").'
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const normalized = Path.normalizePathSeparator(cwd);
|
|
247
|
+
|
|
248
|
+
if (new Path(normalized).isAbsolute) {
|
|
249
|
+
return normalized;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const segments = normalized.split('/');
|
|
253
|
+
for (const root of roots) {
|
|
254
|
+
if (root.resource.path.base === segments[0]) {
|
|
255
|
+
const rest = segments.slice(1).join('/');
|
|
256
|
+
const resolved = rest ? root.resource.resolve(rest) : root.resource;
|
|
257
|
+
return resolved.path.fsPath();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (roots.length === 1) {
|
|
262
|
+
return roots[0].resource.resolve(normalized).path.fsPath();
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
throw new Error(
|
|
266
|
+
`Could not resolve working directory '${cwd}' to a workspace root. ` +
|
|
267
|
+
'In a multi-root workspace, prefix paths with the workspace root name ' +
|
|
268
|
+
`(e.g., '${rootNames[0]}/path'). Available roots: ${rootNames.join(', ')}.`
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
protected extractToolCallId(ctx?: unknown): string | undefined {
|
|
228
273
|
if (ctx && typeof ctx === 'object' && 'toolCallId' in ctx) {
|
|
229
274
|
return (ctx as { toolCallId?: string }).toolCallId;
|
|
230
275
|
}
|
|
@@ -21,10 +21,8 @@ export const shellExecutionPath = '/services/shell-execution';
|
|
|
21
21
|
|
|
22
22
|
export interface ShellExecutionRequest {
|
|
23
23
|
command: string;
|
|
24
|
-
/** Working directory.
|
|
24
|
+
/** Working directory. Resolved to an absolute path on the frontend before sending to the backend. */
|
|
25
25
|
cwd?: string;
|
|
26
|
-
/** Workspace root path for resolving relative cwd paths */
|
|
27
|
-
workspaceRoot?: string;
|
|
28
26
|
timeout?: number; // milliseconds
|
|
29
27
|
/** Unique ID for this execution, used for cancellation */
|
|
30
28
|
executionId?: string;
|
|
@@ -14,9 +14,9 @@
|
|
|
14
14
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
|
+
import * as path from 'path';
|
|
17
18
|
import { injectable } from '@theia/core/shared/inversify';
|
|
18
19
|
import { spawn, ChildProcess, execSync } from 'child_process';
|
|
19
|
-
import * as path from 'path';
|
|
20
20
|
import { ShellExecutionServer, ShellExecutionRequest, ShellExecutionResult } from '../common/shell-execution-server';
|
|
21
21
|
|
|
22
22
|
const DEFAULT_TIMEOUT = 120000; // 2 minutes
|
|
@@ -30,19 +30,23 @@ export class ShellExecutionServerImpl implements ShellExecutionServer {
|
|
|
30
30
|
protected readonly canceledExecutions = new Set<string>();
|
|
31
31
|
|
|
32
32
|
async execute(request: ShellExecutionRequest): Promise<ShellExecutionResult> {
|
|
33
|
-
const { command, cwd,
|
|
33
|
+
const { command, cwd, timeout, executionId } = request;
|
|
34
|
+
if (cwd && !path.isAbsolute(cwd)) {
|
|
35
|
+
throw new Error(
|
|
36
|
+
`Shell execution backend received a non-absolute cwd: '${cwd}'. ` +
|
|
37
|
+
'The frontend must resolve cwd to an absolute path before sending it to the backend.'
|
|
38
|
+
);
|
|
39
|
+
}
|
|
34
40
|
const effectiveTimeout = Math.min(timeout ?? DEFAULT_TIMEOUT, MAX_TIMEOUT);
|
|
35
41
|
const startTime = Date.now();
|
|
36
42
|
|
|
37
|
-
const resolvedCwd = this.resolveCwd(cwd, workspaceRoot);
|
|
38
|
-
|
|
39
43
|
return new Promise<ShellExecutionResult>(resolve => {
|
|
40
44
|
let stdout = '';
|
|
41
45
|
let stderr = '';
|
|
42
46
|
let killed = false;
|
|
43
47
|
|
|
44
48
|
const childProcess = spawn(command, [], {
|
|
45
|
-
cwd
|
|
49
|
+
cwd,
|
|
46
50
|
shell: true,
|
|
47
51
|
detached: process.platform !== 'win32',
|
|
48
52
|
windowsHide: true,
|
|
@@ -93,7 +97,7 @@ export class ShellExecutionServerImpl implements ShellExecutionServer {
|
|
|
93
97
|
error: 'Command canceled by user',
|
|
94
98
|
duration,
|
|
95
99
|
canceled: true,
|
|
96
|
-
resolvedCwd,
|
|
100
|
+
resolvedCwd: cwd,
|
|
97
101
|
});
|
|
98
102
|
} else {
|
|
99
103
|
resolve({
|
|
@@ -103,7 +107,7 @@ export class ShellExecutionServerImpl implements ShellExecutionServer {
|
|
|
103
107
|
stderr,
|
|
104
108
|
error: `Command timed out after ${effectiveTimeout}ms`,
|
|
105
109
|
duration,
|
|
106
|
-
resolvedCwd,
|
|
110
|
+
resolvedCwd: cwd,
|
|
107
111
|
});
|
|
108
112
|
}
|
|
109
113
|
} else if (code === 0) {
|
|
@@ -113,7 +117,7 @@ export class ShellExecutionServerImpl implements ShellExecutionServer {
|
|
|
113
117
|
stdout,
|
|
114
118
|
stderr,
|
|
115
119
|
duration,
|
|
116
|
-
resolvedCwd,
|
|
120
|
+
resolvedCwd: cwd,
|
|
117
121
|
});
|
|
118
122
|
} else {
|
|
119
123
|
resolve({
|
|
@@ -122,7 +126,7 @@ export class ShellExecutionServerImpl implements ShellExecutionServer {
|
|
|
122
126
|
stdout,
|
|
123
127
|
stderr,
|
|
124
128
|
duration,
|
|
125
|
-
resolvedCwd,
|
|
129
|
+
resolvedCwd: cwd,
|
|
126
130
|
});
|
|
127
131
|
}
|
|
128
132
|
});
|
|
@@ -142,7 +146,7 @@ export class ShellExecutionServerImpl implements ShellExecutionServer {
|
|
|
142
146
|
stderr,
|
|
143
147
|
error: error.message,
|
|
144
148
|
duration: Date.now() - startTime,
|
|
145
|
-
resolvedCwd,
|
|
149
|
+
resolvedCwd: cwd,
|
|
146
150
|
});
|
|
147
151
|
});
|
|
148
152
|
});
|
|
@@ -178,17 +182,4 @@ export class ShellExecutionServerImpl implements ShellExecutionServer {
|
|
|
178
182
|
}
|
|
179
183
|
}
|
|
180
184
|
}
|
|
181
|
-
|
|
182
|
-
protected resolveCwd(requestedCwd: string | undefined, workspaceRoot: string | undefined): string | undefined {
|
|
183
|
-
if (!requestedCwd) {
|
|
184
|
-
return workspaceRoot;
|
|
185
|
-
}
|
|
186
|
-
if (path.isAbsolute(requestedCwd)) {
|
|
187
|
-
return requestedCwd;
|
|
188
|
-
}
|
|
189
|
-
if (workspaceRoot) {
|
|
190
|
-
return path.resolve(workspaceRoot, requestedCwd);
|
|
191
|
-
}
|
|
192
|
-
return requestedCwd;
|
|
193
|
-
}
|
|
194
185
|
}
|