aws-runtime-bridge 1.5.0 → 1.6.1
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/README.md +1 -1
- package/dist/adapter/AdapterRegistry.d.ts +1 -1
- package/dist/adapter/AdapterRegistry.d.ts.map +1 -1
- package/dist/adapter/AdapterRegistry.js +0 -2
- package/dist/adapter/ClaudeSdkAdapter.d.ts +4 -0
- package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/ClaudeSdkAdapter.js +11 -2
- package/dist/adapter/CodexSdkAdapter.js +1 -1
- package/dist/adapter/OpencodeSdkAdapter.js +2 -2
- package/dist/adapter/types.d.ts +10 -0
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/index.js +14 -43
- package/dist/middleware/auth.d.ts +5 -0
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +9 -1
- package/dist/routes/file-browser.d.ts.map +1 -1
- package/dist/routes/file-browser.js +21 -1
- package/dist/routes/file-browser.test.js +9 -0
- package/dist/routes/instance.d.ts +10 -0
- package/dist/routes/instance.d.ts.map +1 -1
- package/dist/routes/instance.js +93 -2
- package/dist/routes/instance.test.js +50 -0
- package/dist/routes/pty.d.ts +106 -0
- package/dist/routes/pty.d.ts.map +1 -0
- package/dist/routes/pty.js +526 -0
- package/dist/routes/pty.test.d.ts +2 -0
- package/dist/routes/pty.test.d.ts.map +1 -0
- package/dist/routes/pty.test.js +73 -0
- package/dist/routes/sessions.d.ts +1 -1
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +32 -213
- package/dist/routes/terminal.d.ts +32 -3
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +411 -243
- package/dist/routes/terminal.test.js +105 -29
- package/dist/services/agent-process-manager.d.ts +2 -2
- package/dist/services/agent-process-manager.d.ts.map +1 -1
- package/dist/services/agent-process-manager.js +3 -3
- package/dist/services/process-detector.d.ts +2 -4
- package/dist/services/process-detector.d.ts.map +1 -1
- package/dist/services/process-detector.js +9 -16
- package/dist/services/process-registry.d.ts +2 -2
- package/dist/services/process-registry.d.ts.map +1 -1
- package/dist/services/process-registry.js +1 -1
- package/dist/services/session-output.d.ts +15 -5
- package/dist/services/session-output.d.ts.map +1 -1
- package/dist/services/session-output.js +33 -3
- package/dist/services/session-output.test.js +43 -29
- package/dist/services/terminal-persistence.d.ts +9 -0
- package/dist/services/terminal-persistence.d.ts.map +1 -1
- package/dist/services/terminal-persistence.js +20 -0
- package/dist/services/tool-installer.d.ts +10 -0
- package/dist/services/tool-installer.d.ts.map +1 -1
- package/dist/services/tool-installer.js +126 -5
- package/dist/services/tool-installer.test.js +32 -1
- package/dist/services/workspace-files.d.ts +14 -0
- package/dist/services/workspace-files.d.ts.map +1 -1
- package/dist/services/workspace-files.js +52 -0
- package/dist/services/workspace-files.test.js +85 -1
- package/dist/types.d.ts +8 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -80,6 +80,26 @@ export async function upsertPersistedSession(session) {
|
|
|
80
80
|
return runningSessions;
|
|
81
81
|
});
|
|
82
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* 更新指定 Agent 的持久化自动命令配置。
|
|
85
|
+
*
|
|
86
|
+
* 主流程:加载 running 会话 -> 命中 agentId 时只替换自动命令字段,保留原 command/workspace/pid。
|
|
87
|
+
*/
|
|
88
|
+
export async function updatePersistedSessionAutoCommands(agentId, commands) {
|
|
89
|
+
let updated = false;
|
|
90
|
+
await updatePersistedSessions((sessions) => sessions.map((session) => {
|
|
91
|
+
if (session.agentId !== agentId) {
|
|
92
|
+
return session;
|
|
93
|
+
}
|
|
94
|
+
updated = true;
|
|
95
|
+
return {
|
|
96
|
+
...session,
|
|
97
|
+
idleInputAutoCommand: commands.idleInputAutoCommand,
|
|
98
|
+
nonInputAutoCommand: commands.nonInputAutoCommand,
|
|
99
|
+
};
|
|
100
|
+
}));
|
|
101
|
+
return updated;
|
|
102
|
+
}
|
|
83
103
|
/**
|
|
84
104
|
* 移除持久化会话(从完整文件中删除,包括 stopped 状态的)
|
|
85
105
|
*
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import type { ToolInstallStatus } from "../types.js";
|
|
2
2
|
export declare const SUPPORTED_INSTALLABLE_TOOLS: readonly string[];
|
|
3
|
+
export declare const SUPPORTED_UNINSTALLABLE_TOOLS: readonly string[];
|
|
4
|
+
/**
|
|
5
|
+
* 返回工具对应的全局卸载命令副本,用于诊断与测试卸载覆盖范围。
|
|
6
|
+
*/
|
|
7
|
+
export declare function getToolUninstallCommands(tool: string): string[];
|
|
8
|
+
export declare function isVoltaShimPath(commandPath: string): boolean;
|
|
3
9
|
/**
|
|
4
10
|
* 检查单个工具的 CLI 可执行状态,供实例状态展示与初始化前判断使用。
|
|
5
11
|
*/
|
|
@@ -12,4 +18,8 @@ export declare function detectToolStatuses(tools: string[]): Promise<Record<stri
|
|
|
12
18
|
* 根据勾选工具自动安装缺失 CLI,安装后重新检测状态并返回。
|
|
13
19
|
*/
|
|
14
20
|
export declare function ensureToolsInstalled(tools: string[]): Promise<Record<string, ToolInstallStatus>>;
|
|
21
|
+
/**
|
|
22
|
+
* 按工具定义执行全局卸载命令,随后重新检测并返回最新安装状态。
|
|
23
|
+
*/
|
|
24
|
+
export declare function uninstallTools(tools: string[]): Promise<Record<string, ToolInstallStatus>>;
|
|
15
25
|
//# sourceMappingURL=tool-installer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-installer.d.ts","sourceRoot":"","sources":["../../src/services/tool-installer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-installer.d.ts","sourceRoot":"","sources":["../../src/services/tool-installer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AA8GrD,eAAO,MAAM,2BAA2B,mBAEvC,CAAC;AAEF,eAAO,MAAM,6BAA6B,mBAIzC,CAAC;AAEF;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK/D;AAoDD,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAM5D;AAqJD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,CAAC,CAyB5B;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAkB5C;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CA+C5C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAiD5C"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { access } from "node:fs/promises";
|
|
1
3
|
import os from "node:os";
|
|
2
4
|
import path from "node:path";
|
|
3
|
-
import { access } from "node:fs/promises";
|
|
4
|
-
import { execFile } from "node:child_process";
|
|
5
5
|
import { promisify } from "node:util";
|
|
6
6
|
const execFileAsync = promisify(execFile);
|
|
7
7
|
const isWindows = process.platform === "win32";
|
|
8
8
|
const TOOL_DEFINITIONS = {
|
|
9
9
|
claude: {
|
|
10
10
|
key: "claude",
|
|
11
|
+
packageName: "@anthropic-ai/claude-code",
|
|
11
12
|
aliases: isWindows ? ["claude.cmd", "claude.exe", "claude"] : ["claude"],
|
|
12
13
|
versionArgs: ["--version"],
|
|
13
14
|
installCommands: isWindows
|
|
@@ -16,9 +17,20 @@ const TOOL_DEFINITIONS = {
|
|
|
16
17
|
"curl -fsSL https://claude.ai/install.sh | bash",
|
|
17
18
|
"npm install -g @anthropic-ai/claude-code@latest",
|
|
18
19
|
],
|
|
20
|
+
uninstallCommands: isWindows
|
|
21
|
+
? [
|
|
22
|
+
"npm uninstall -g @anthropic-ai/claude-code",
|
|
23
|
+
"volta uninstall @anthropic-ai/claude-code",
|
|
24
|
+
]
|
|
25
|
+
: [
|
|
26
|
+
"npm uninstall -g @anthropic-ai/claude-code",
|
|
27
|
+
"volta uninstall @anthropic-ai/claude-code",
|
|
28
|
+
"rm -f ~/.local/bin/claude",
|
|
29
|
+
],
|
|
19
30
|
},
|
|
20
31
|
claudecode: {
|
|
21
32
|
key: "claudecode",
|
|
33
|
+
packageName: "@anthropic-ai/claude-code",
|
|
22
34
|
aliases: isWindows ? ["claude.cmd", "claude.exe", "claude"] : ["claude"],
|
|
23
35
|
versionArgs: ["--version"],
|
|
24
36
|
installCommands: isWindows
|
|
@@ -27,9 +39,20 @@ const TOOL_DEFINITIONS = {
|
|
|
27
39
|
"curl -fsSL https://claude.ai/install.sh | bash",
|
|
28
40
|
"npm install -g @anthropic-ai/claude-code@latest",
|
|
29
41
|
],
|
|
42
|
+
uninstallCommands: isWindows
|
|
43
|
+
? [
|
|
44
|
+
"npm uninstall -g @anthropic-ai/claude-code",
|
|
45
|
+
"volta uninstall @anthropic-ai/claude-code",
|
|
46
|
+
]
|
|
47
|
+
: [
|
|
48
|
+
"npm uninstall -g @anthropic-ai/claude-code",
|
|
49
|
+
"volta uninstall @anthropic-ai/claude-code",
|
|
50
|
+
"rm -f ~/.local/bin/claude",
|
|
51
|
+
],
|
|
30
52
|
},
|
|
31
53
|
opencode: {
|
|
32
54
|
key: "opencode",
|
|
55
|
+
packageName: "opencode-ai",
|
|
33
56
|
aliases: isWindows
|
|
34
57
|
? ["opencode.cmd", "opencode.exe", "opencode"]
|
|
35
58
|
: ["opencode"],
|
|
@@ -40,6 +63,18 @@ const TOOL_DEFINITIONS = {
|
|
|
40
63
|
"curl -fsSL https://opencode.ai/install | bash",
|
|
41
64
|
"npm install -g opencode-ai@latest",
|
|
42
65
|
],
|
|
66
|
+
uninstallCommands: isWindows
|
|
67
|
+
? [
|
|
68
|
+
"opencode uninstall --force",
|
|
69
|
+
"npm uninstall -g opencode-ai",
|
|
70
|
+
"volta uninstall opencode-ai",
|
|
71
|
+
]
|
|
72
|
+
: [
|
|
73
|
+
"opencode uninstall --force",
|
|
74
|
+
"npm uninstall -g opencode-ai",
|
|
75
|
+
"volta uninstall opencode-ai",
|
|
76
|
+
"rm -f ~/.opencode/bin/opencode",
|
|
77
|
+
],
|
|
43
78
|
extraSearchPaths: () => {
|
|
44
79
|
const home = os.homedir();
|
|
45
80
|
return [
|
|
@@ -53,12 +88,27 @@ const TOOL_DEFINITIONS = {
|
|
|
53
88
|
},
|
|
54
89
|
codex: {
|
|
55
90
|
key: "codex",
|
|
91
|
+
packageName: "@openai/codex",
|
|
56
92
|
aliases: isWindows ? ["codex.cmd", "codex.exe", "codex"] : ["codex"],
|
|
57
93
|
versionArgs: ["--version"],
|
|
58
94
|
installCommands: ["npm install -g @openai/codex@latest"],
|
|
95
|
+
uninstallCommands: [
|
|
96
|
+
"npm uninstall -g @openai/codex",
|
|
97
|
+
"volta uninstall @openai/codex",
|
|
98
|
+
],
|
|
59
99
|
},
|
|
60
100
|
};
|
|
61
101
|
export const SUPPORTED_INSTALLABLE_TOOLS = Object.freeze(Object.keys(TOOL_DEFINITIONS));
|
|
102
|
+
export const SUPPORTED_UNINSTALLABLE_TOOLS = Object.freeze(Object.keys(TOOL_DEFINITIONS).filter((tool) => TOOL_DEFINITIONS[tool].uninstallCommands.length > 0));
|
|
103
|
+
/**
|
|
104
|
+
* 返回工具对应的全局卸载命令副本,用于诊断与测试卸载覆盖范围。
|
|
105
|
+
*/
|
|
106
|
+
export function getToolUninstallCommands(tool) {
|
|
107
|
+
const normalizedTool = String(tool || "")
|
|
108
|
+
.trim()
|
|
109
|
+
.toLowerCase();
|
|
110
|
+
return [...(TOOL_DEFINITIONS[normalizedTool]?.uninstallCommands || [])];
|
|
111
|
+
}
|
|
62
112
|
function parseVersion(output) {
|
|
63
113
|
const normalized = String(output || "").trim();
|
|
64
114
|
if (!normalized) {
|
|
@@ -103,6 +153,26 @@ function describeExecError(error) {
|
|
|
103
153
|
}
|
|
104
154
|
return message || "command execution failed";
|
|
105
155
|
}
|
|
156
|
+
export function isVoltaShimPath(commandPath) {
|
|
157
|
+
const normalizedPath = path
|
|
158
|
+
.normalize(commandPath)
|
|
159
|
+
.replaceAll("\\", "/")
|
|
160
|
+
.toLowerCase();
|
|
161
|
+
return /(?:^|\/)\.?volta\/bin\//.test(normalizedPath);
|
|
162
|
+
}
|
|
163
|
+
async function isVoltaPackageInstalled(packageName) {
|
|
164
|
+
try {
|
|
165
|
+
const { stdout, stderr } = await execFileAsync("volta", ["list", "--format", "plain"], {
|
|
166
|
+
timeout: 20_000,
|
|
167
|
+
});
|
|
168
|
+
const output = `${stdout || ""}\n${stderr || ""}`;
|
|
169
|
+
const escapedPackageName = packageName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
170
|
+
return new RegExp(`^package\\s+${escapedPackageName}(?:@|\\s)`, "im").test(output);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
106
176
|
/**
|
|
107
177
|
* 在 Windows 上执行命令(处理 .cmd/.bat 文件)
|
|
108
178
|
* 在 Unix 系统上直接执行
|
|
@@ -151,7 +221,7 @@ async function resolveExecutableCandidate(definition) {
|
|
|
151
221
|
}
|
|
152
222
|
catch (error) {
|
|
153
223
|
executionFailureMessage = describeExecError(error);
|
|
154
|
-
if (executionFailureMessage !== "command not found in PATH") {
|
|
224
|
+
if (!isWindows && executionFailureMessage !== "command not found in PATH") {
|
|
155
225
|
return {
|
|
156
226
|
executable: alias,
|
|
157
227
|
version: null,
|
|
@@ -164,6 +234,11 @@ async function resolveExecutableCandidate(definition) {
|
|
|
164
234
|
try {
|
|
165
235
|
await access(absolutePath);
|
|
166
236
|
foundCommandPath = absolutePath;
|
|
237
|
+
if (isVoltaShimPath(absolutePath) &&
|
|
238
|
+
!(await isVoltaPackageInstalled(definition.packageName))) {
|
|
239
|
+
foundCommandPath = null;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
167
242
|
const { stdout, stderr } = await executeVersionCommand(absolutePath, definition.versionArgs);
|
|
168
243
|
const version = parseVersion(`${stdout || ""}\n${stderr || ""}`);
|
|
169
244
|
if (!version) {
|
|
@@ -196,7 +271,7 @@ async function resolveExecutableCandidate(definition) {
|
|
|
196
271
|
}
|
|
197
272
|
return { executable: null, version: null, error: "command not installed" };
|
|
198
273
|
}
|
|
199
|
-
async function
|
|
274
|
+
async function runToolCommand(command) {
|
|
200
275
|
if (isWindows) {
|
|
201
276
|
await execFileAsync("cmd.exe", ["/d", "/s", "/c", command], {
|
|
202
277
|
timeout: 10 * 60 * 1000,
|
|
@@ -267,7 +342,7 @@ export async function ensureToolsInstalled(tools) {
|
|
|
267
342
|
let lastError = current.error;
|
|
268
343
|
for (const command of definition.installCommands) {
|
|
269
344
|
try {
|
|
270
|
-
await
|
|
345
|
+
await runToolCommand(command);
|
|
271
346
|
const detected = await detectToolInstallStatus(tool);
|
|
272
347
|
nextStatuses[tool] = detected;
|
|
273
348
|
if (detected.installed) {
|
|
@@ -295,3 +370,49 @@ export async function ensureToolsInstalled(tools) {
|
|
|
295
370
|
}
|
|
296
371
|
return nextStatuses;
|
|
297
372
|
}
|
|
373
|
+
/**
|
|
374
|
+
* 按工具定义执行全局卸载命令,随后重新检测并返回最新安装状态。
|
|
375
|
+
*/
|
|
376
|
+
export async function uninstallTools(tools) {
|
|
377
|
+
const normalizedTools = [
|
|
378
|
+
...new Set((Array.isArray(tools) ? tools : [])
|
|
379
|
+
.map((item) => String(item || "")
|
|
380
|
+
.trim()
|
|
381
|
+
.toLowerCase())
|
|
382
|
+
.filter(Boolean)),
|
|
383
|
+
];
|
|
384
|
+
const nextStatuses = {};
|
|
385
|
+
for (const tool of normalizedTools) {
|
|
386
|
+
const definition = TOOL_DEFINITIONS[tool];
|
|
387
|
+
if (!definition) {
|
|
388
|
+
nextStatuses[tool] = await detectToolInstallStatus(tool);
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
let lastError = null;
|
|
392
|
+
for (const command of definition.uninstallCommands) {
|
|
393
|
+
try {
|
|
394
|
+
await runToolCommand(command);
|
|
395
|
+
lastError = null;
|
|
396
|
+
const detectedAfterCommand = await detectToolInstallStatus(tool);
|
|
397
|
+
if (!detectedAfterCommand.installed) {
|
|
398
|
+
nextStatuses[tool] = detectedAfterCommand;
|
|
399
|
+
break;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
catch (error) {
|
|
403
|
+
lastError =
|
|
404
|
+
error instanceof Error
|
|
405
|
+
? error.message
|
|
406
|
+
: String(error || "uninstall failed");
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
const detected = await detectToolInstallStatus(tool);
|
|
410
|
+
nextStatuses[tool] = {
|
|
411
|
+
...detected,
|
|
412
|
+
error: detected.installed
|
|
413
|
+
? lastError || detected.error || "uninstall completed but command is still available"
|
|
414
|
+
: detected.error,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
return nextStatuses;
|
|
418
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { detectToolStatuses,
|
|
2
|
+
import { detectToolInstallStatus, SUPPORTED_INSTALLABLE_TOOLS, SUPPORTED_UNINSTALLABLE_TOOLS, detectToolStatuses, getToolUninstallCommands, isVoltaShimPath } from './tool-installer.js';
|
|
3
3
|
describe('tool installer service', () => {
|
|
4
4
|
it('returns structured status for supported tools', async () => {
|
|
5
5
|
const statuses = await detectToolStatuses(['claude', 'opencode', 'codex']);
|
|
@@ -76,6 +76,37 @@ describe('tool installer service', () => {
|
|
|
76
76
|
expect(typeof status.installed).toBe('boolean');
|
|
77
77
|
expect(status.error).not.toBe('unsupported tool');
|
|
78
78
|
});
|
|
79
|
+
it('supports all panel tools as uninstallable tools', () => {
|
|
80
|
+
expect(SUPPORTED_UNINSTALLABLE_TOOLS).toEqual(expect.arrayContaining(['claude', 'opencode', 'codex']));
|
|
81
|
+
});
|
|
82
|
+
it('covers npm and native installer uninstall paths for OpenCode', () => {
|
|
83
|
+
const commands = getToolUninstallCommands('opencode');
|
|
84
|
+
expect(commands).toContain('npm uninstall -g opencode-ai');
|
|
85
|
+
expect(commands).toContain('volta uninstall opencode-ai');
|
|
86
|
+
if (process.platform !== 'win32') {
|
|
87
|
+
expect(commands).toContain('opencode uninstall --force');
|
|
88
|
+
expect(commands).toContain('rm -f ~/.opencode/bin/opencode');
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
it('covers npm and native installer uninstall paths for Claude Code on Unix', () => {
|
|
92
|
+
const commands = getToolUninstallCommands('claude');
|
|
93
|
+
expect(commands).toContain('npm uninstall -g @anthropic-ai/claude-code');
|
|
94
|
+
expect(commands).toContain('volta uninstall @anthropic-ai/claude-code');
|
|
95
|
+
if (process.platform !== 'win32') {
|
|
96
|
+
expect(commands).toContain('rm -f ~/.local/bin/claude');
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
it('covers Volta package uninstall for Codex', () => {
|
|
100
|
+
const commands = getToolUninstallCommands('codex');
|
|
101
|
+
expect(commands).toContain('npm uninstall -g @openai/codex');
|
|
102
|
+
expect(commands).toContain('volta uninstall @openai/codex');
|
|
103
|
+
});
|
|
104
|
+
it('recognizes Volta shim paths for package-manager-aware detection', () => {
|
|
105
|
+
expect(isVoltaShimPath('C:\\Users\\tester\\AppData\\Local\\Volta\\bin\\codex.cmd')).toBe(true);
|
|
106
|
+
expect(isVoltaShimPath('/home/tester/.volta/bin/codex')).toBe(true);
|
|
107
|
+
expect(isVoltaShimPath('/Users/tester/.volta/bin/claude')).toBe(true);
|
|
108
|
+
expect(isVoltaShimPath('/usr/local/bin/codex')).toBe(false);
|
|
109
|
+
});
|
|
79
110
|
it('detectToolStatuses returns status for all requested tools', async () => {
|
|
80
111
|
const tools = ['claude', 'opencode', 'unknown-tool'];
|
|
81
112
|
const statuses = await detectToolStatuses(tools);
|
|
@@ -67,6 +67,10 @@ interface RenameWorkspaceEntryParams extends WorkspacePathParams {
|
|
|
67
67
|
targetPath: string;
|
|
68
68
|
newName: string;
|
|
69
69
|
}
|
|
70
|
+
interface MoveWorkspaceEntryParams extends WorkspacePathParams {
|
|
71
|
+
targetPath: string;
|
|
72
|
+
destinationPath: string;
|
|
73
|
+
}
|
|
70
74
|
interface DeleteWorkspaceEntryParams extends WorkspacePathParams {
|
|
71
75
|
targetPath: string;
|
|
72
76
|
}
|
|
@@ -119,6 +123,16 @@ export declare function renameWorkspaceEntry(params: RenameWorkspaceEntryParams)
|
|
|
119
123
|
sourcePath: string;
|
|
120
124
|
targetPath: string;
|
|
121
125
|
}>;
|
|
126
|
+
/**
|
|
127
|
+
* 将工作区内文件或目录移动到另一个工作区目录,保持原文件名不变。
|
|
128
|
+
*/
|
|
129
|
+
export declare function moveWorkspaceEntry(params: MoveWorkspaceEntryParams): Promise<{
|
|
130
|
+
ok: true;
|
|
131
|
+
workspacePath: string;
|
|
132
|
+
sourcePath: string;
|
|
133
|
+
targetPath: string;
|
|
134
|
+
destinationPath: string;
|
|
135
|
+
}>;
|
|
122
136
|
/**
|
|
123
137
|
* 删除工作区内的文件或目录,并阻止误删工作区根目录。
|
|
124
138
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-files.d.ts","sourceRoot":"","sources":["../../src/services/workspace-files.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"workspace-files.d.ts","sourceRoot":"","sources":["../../src/services/workspace-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -487,6 +487,55 @@ export async function renameWorkspaceEntry(params) {
|
|
|
487
487
|
targetPath: toDisplayPath(renamedPath)
|
|
488
488
|
};
|
|
489
489
|
}
|
|
490
|
+
/**
|
|
491
|
+
* 将工作区内文件或目录移动到另一个工作区目录,保持原文件名不变。
|
|
492
|
+
*/
|
|
493
|
+
export async function moveWorkspaceEntry(params) {
|
|
494
|
+
const { workspaceRoot, resolvedTargetPath } = await resolveEntryTarget(params);
|
|
495
|
+
const destination = await resolveDirectoryTarget({
|
|
496
|
+
workspacePath: params.workspacePath,
|
|
497
|
+
targetPath: params.destinationPath,
|
|
498
|
+
});
|
|
499
|
+
const destinationStat = await fs.stat(destination.resolvedTargetPath);
|
|
500
|
+
if (!destinationStat.isDirectory()) {
|
|
501
|
+
throw new Error(`Destination is not a directory: ${destination.resolvedTargetPath}`);
|
|
502
|
+
}
|
|
503
|
+
const targetStat = await fs.stat(resolvedTargetPath);
|
|
504
|
+
if (targetStat.isDirectory()) {
|
|
505
|
+
const relativeDestination = path.relative(resolvedTargetPath, destination.resolvedTargetPath);
|
|
506
|
+
if (relativeDestination === '' || (!relativeDestination.startsWith('..') && !path.isAbsolute(relativeDestination))) {
|
|
507
|
+
throw new Error('Cannot move a directory into itself or its descendant');
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
const movedPath = ensureInsideWorkspace(workspaceRoot, path.join(destination.resolvedTargetPath, path.basename(resolvedTargetPath)));
|
|
511
|
+
if (movedPath === resolvedTargetPath) {
|
|
512
|
+
return {
|
|
513
|
+
ok: true,
|
|
514
|
+
workspacePath: toDisplayPath(workspaceRoot),
|
|
515
|
+
sourcePath: toDisplayPath(resolvedTargetPath),
|
|
516
|
+
targetPath: toDisplayPath(movedPath),
|
|
517
|
+
destinationPath: toDisplayPath(destination.resolvedTargetPath),
|
|
518
|
+
};
|
|
519
|
+
}
|
|
520
|
+
try {
|
|
521
|
+
await fs.access(movedPath);
|
|
522
|
+
throw new Error(`Path already exists: ${movedPath}`);
|
|
523
|
+
}
|
|
524
|
+
catch (error) {
|
|
525
|
+
const errorCode = typeof error === 'object' && error !== null ? Reflect.get(error, 'code') : undefined;
|
|
526
|
+
if (errorCode !== 'ENOENT') {
|
|
527
|
+
throw error;
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
await fs.rename(resolvedTargetPath, movedPath);
|
|
531
|
+
return {
|
|
532
|
+
ok: true,
|
|
533
|
+
workspacePath: toDisplayPath(workspaceRoot),
|
|
534
|
+
sourcePath: toDisplayPath(resolvedTargetPath),
|
|
535
|
+
targetPath: toDisplayPath(movedPath),
|
|
536
|
+
destinationPath: toDisplayPath(destination.resolvedTargetPath),
|
|
537
|
+
};
|
|
538
|
+
}
|
|
490
539
|
/**
|
|
491
540
|
* 删除工作区内的文件或目录,并阻止误删工作区根目录。
|
|
492
541
|
*/
|
|
@@ -639,6 +688,9 @@ async function extractTarArchive(archivePath, outputRoot, gzip, meter) {
|
|
|
639
688
|
if (entryType === 'symboliclink' || entryType === 'link') {
|
|
640
689
|
throw new Error(`Archive links are not supported: ${entryPath}`);
|
|
641
690
|
}
|
|
691
|
+
if (entryType !== 'file' && entryType !== 'oldfile' && entryType !== 'contiguousfile' && entryType !== 'directory') {
|
|
692
|
+
throw new Error(`Unsupported archive entry type: ${entryPath}`);
|
|
693
|
+
}
|
|
642
694
|
if (typeof entry.size === 'number') {
|
|
643
695
|
trackArchiveBytes(meter, entry.size);
|
|
644
696
|
}
|
|
@@ -3,7 +3,7 @@ import os from 'node:os';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import * as tar from 'tar';
|
|
5
5
|
import { afterAll, beforeAll, describe, expect, it } from 'vitest';
|
|
6
|
-
import { createWorkspaceEntry, deleteWorkspaceEntry, extractWorkspaceArchive, listWorkspaceDirectory, previewWorkspaceDocument, readWorkspaceFile, renameWorkspaceEntry, resolveWorkspaceDownloadTarget, streamWorkspaceDirectoryZip, uploadWorkspaceFiles, writeWorkspaceFile, } from './workspace-files.js';
|
|
6
|
+
import { createWorkspaceEntry, deleteWorkspaceEntry, extractWorkspaceArchive, listWorkspaceDirectory, moveWorkspaceEntry, previewWorkspaceDocument, readWorkspaceFile, renameWorkspaceEntry, resolveWorkspaceDownloadTarget, streamWorkspaceDirectoryZip, uploadWorkspaceFiles, writeWorkspaceFile, } from './workspace-files.js';
|
|
7
7
|
const { ZipArchive } = await import('archiver');
|
|
8
8
|
function crc32(input) {
|
|
9
9
|
let crc = 0xffffffff;
|
|
@@ -70,6 +70,27 @@ async function writeStoredZipWithNameBytes(filePath, nameBytes, content) {
|
|
|
70
70
|
endRecord
|
|
71
71
|
]));
|
|
72
72
|
}
|
|
73
|
+
async function writeTarHeaderOnlyEntry(filePath, entryName, typeFlag) {
|
|
74
|
+
const header = Buffer.alloc(512, 0);
|
|
75
|
+
header.write(entryName, 0, Math.min(Buffer.byteLength(entryName), 100), 'utf-8');
|
|
76
|
+
header.write('0000644\0', 100, 'ascii');
|
|
77
|
+
header.write('0000000\0', 108, 'ascii');
|
|
78
|
+
header.write('0000000\0', 116, 'ascii');
|
|
79
|
+
header.write('00000000000\0', 124, 'ascii');
|
|
80
|
+
header.write('00000000000\0', 136, 'ascii');
|
|
81
|
+
header.fill(0x20, 148, 156);
|
|
82
|
+
header.write(typeFlag, 156, 'ascii');
|
|
83
|
+
header.write('ustar\0', 257, 'ascii');
|
|
84
|
+
header.write('00', 263, 'ascii');
|
|
85
|
+
let checksum = 0;
|
|
86
|
+
for (const byte of header) {
|
|
87
|
+
checksum += byte;
|
|
88
|
+
}
|
|
89
|
+
header.write(checksum.toString(8).padStart(6, '0'), 148, 'ascii');
|
|
90
|
+
header[154] = 0;
|
|
91
|
+
header[155] = 0x20;
|
|
92
|
+
await fs.writeFile(filePath, Buffer.concat([header, Buffer.alloc(1024, 0)]));
|
|
93
|
+
}
|
|
73
94
|
describe('workspace file service', () => {
|
|
74
95
|
const tempRoot = path.join(os.tmpdir(), `aws-workspace-files-${Date.now()}`);
|
|
75
96
|
const workspacePath = path.join(tempRoot, 'workspace');
|
|
@@ -201,6 +222,60 @@ describe('workspace file service', () => {
|
|
|
201
222
|
targetPath: workspacePath
|
|
202
223
|
})).rejects.toThrow(/Workspace root cannot be modified/);
|
|
203
224
|
});
|
|
225
|
+
it('moves files and rejects moving directories into themselves', async () => {
|
|
226
|
+
const moveSourceDir = path.join(workspacePath, 'move-source');
|
|
227
|
+
const moveDestinationDir = path.join(workspacePath, 'move-destination');
|
|
228
|
+
const fileToMove = path.join(moveSourceDir, 'move-me.txt');
|
|
229
|
+
await fs.mkdir(moveSourceDir, { recursive: true });
|
|
230
|
+
await fs.mkdir(moveDestinationDir, { recursive: true });
|
|
231
|
+
await fs.writeFile(fileToMove, 'move me', 'utf-8');
|
|
232
|
+
const result = await moveWorkspaceEntry({
|
|
233
|
+
workspacePath,
|
|
234
|
+
targetPath: fileToMove,
|
|
235
|
+
destinationPath: moveDestinationDir,
|
|
236
|
+
});
|
|
237
|
+
const movedPath = path.join(moveDestinationDir, 'move-me.txt');
|
|
238
|
+
expect(result.sourcePath).toBe(fileToMove.replace(/\\/g, '/'));
|
|
239
|
+
expect(result.targetPath).toBe((await fs.realpath(movedPath)).replace(/\\/g, '/'));
|
|
240
|
+
await expect(fs.access(fileToMove)).rejects.toThrow();
|
|
241
|
+
await expect(fs.readFile(movedPath, 'utf-8')).resolves.toBe('move me');
|
|
242
|
+
const childDestination = path.join(moveSourceDir, 'child');
|
|
243
|
+
await fs.mkdir(childDestination, { recursive: true });
|
|
244
|
+
await expect(moveWorkspaceEntry({
|
|
245
|
+
workspacePath,
|
|
246
|
+
targetPath: moveSourceDir,
|
|
247
|
+
destinationPath: childDestination,
|
|
248
|
+
})).rejects.toThrow(/itself or its descendant/);
|
|
249
|
+
});
|
|
250
|
+
it('rejects unsafe workspace move targets', async () => {
|
|
251
|
+
const moveSafetyDir = path.join(workspacePath, 'move-safety');
|
|
252
|
+
const moveSafetyFile = path.join(moveSafetyDir, 'safe.txt');
|
|
253
|
+
const moveSafetyDestination = path.join(workspacePath, 'move-safety-dest');
|
|
254
|
+
await fs.mkdir(moveSafetyDir, { recursive: true });
|
|
255
|
+
await fs.mkdir(moveSafetyDestination, { recursive: true });
|
|
256
|
+
await fs.writeFile(moveSafetyFile, 'safe', 'utf-8');
|
|
257
|
+
await fs.writeFile(path.join(moveSafetyDestination, 'safe.txt'), 'exists', 'utf-8');
|
|
258
|
+
await expect(moveWorkspaceEntry({
|
|
259
|
+
workspacePath,
|
|
260
|
+
targetPath: workspacePath,
|
|
261
|
+
destinationPath: moveSafetyDestination,
|
|
262
|
+
})).rejects.toThrow(/Workspace root cannot be modified/);
|
|
263
|
+
await expect(moveWorkspaceEntry({
|
|
264
|
+
workspacePath,
|
|
265
|
+
targetPath: path.join(tempRoot, 'outside.txt'),
|
|
266
|
+
destinationPath: moveSafetyDestination,
|
|
267
|
+
})).rejects.toThrow(/outside workspace/);
|
|
268
|
+
await expect(moveWorkspaceEntry({
|
|
269
|
+
workspacePath,
|
|
270
|
+
targetPath: moveSafetyFile,
|
|
271
|
+
destinationPath: tempRoot,
|
|
272
|
+
})).rejects.toThrow(/outside workspace/);
|
|
273
|
+
await expect(moveWorkspaceEntry({
|
|
274
|
+
workspacePath,
|
|
275
|
+
targetPath: moveSafetyFile,
|
|
276
|
+
destinationPath: moveSafetyDestination,
|
|
277
|
+
})).rejects.toThrow(/Path already exists/);
|
|
278
|
+
});
|
|
204
279
|
it('uploads files to a selected workspace directory', async () => {
|
|
205
280
|
const uploadSource = path.join(tempRoot, 'upload-source.txt');
|
|
206
281
|
const uploadTargetDir = path.join(workspacePath, 'uploads');
|
|
@@ -490,4 +565,13 @@ describe('workspace file service', () => {
|
|
|
490
565
|
outputPath: workspacePath
|
|
491
566
|
})).rejects.toThrow(/links are not supported/);
|
|
492
567
|
});
|
|
568
|
+
it('rejects tar archives with unsupported special entries', async () => {
|
|
569
|
+
const archivePath = path.join(workspacePath, 'special-entry.tar');
|
|
570
|
+
await writeTarHeaderOnlyEntry(archivePath, 'special-device', '3');
|
|
571
|
+
await expect(extractWorkspaceArchive({
|
|
572
|
+
workspacePath,
|
|
573
|
+
archivePath,
|
|
574
|
+
outputPath: workspacePath
|
|
575
|
+
})).rejects.toThrow(/Unsupported archive entry type/);
|
|
576
|
+
});
|
|
493
577
|
});
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type { Request, Response, NextFunction } from 'express';
|
|
2
|
-
import type { IPty } from 'node-pty';
|
|
3
1
|
import type { AppFlags } from '@cc-switch/sdk';
|
|
2
|
+
import type { Request, Response, NextFunction } from 'express';
|
|
4
3
|
export type { McpServerSpec, AppFlags } from '@cc-switch/sdk';
|
|
5
4
|
/**
|
|
6
5
|
* MCP 服务器创建输入类型
|
|
@@ -25,7 +24,6 @@ export interface UpdateMcpServerInput {
|
|
|
25
24
|
export interface Session {
|
|
26
25
|
agentId: string;
|
|
27
26
|
workspacePath: string;
|
|
28
|
-
ptyProcess: IPty;
|
|
29
27
|
outputBuffer: string;
|
|
30
28
|
flushTimer: NodeJS.Timeout | null;
|
|
31
29
|
flushInFlight: Promise<void> | null;
|
|
@@ -208,7 +206,9 @@ export interface PersistedSession {
|
|
|
208
206
|
status: 'running' | 'stopped';
|
|
209
207
|
pid?: number;
|
|
210
208
|
providerSessionId?: string;
|
|
211
|
-
mode?: '
|
|
209
|
+
mode?: 'sdk';
|
|
210
|
+
idleInputAutoCommand?: string;
|
|
211
|
+
nonInputAutoCommand?: string;
|
|
212
212
|
}
|
|
213
213
|
export interface SessionsListResponse {
|
|
214
214
|
ok: boolean;
|
|
@@ -225,6 +225,8 @@ export interface RecoverSessionRequest {
|
|
|
225
225
|
agentId: string;
|
|
226
226
|
workspacePath?: string;
|
|
227
227
|
command?: string;
|
|
228
|
+
idleInputAutoCommand?: string;
|
|
229
|
+
nonInputAutoCommand?: string;
|
|
228
230
|
}
|
|
229
231
|
export interface RecoverSessionResult {
|
|
230
232
|
ok: boolean;
|
|
@@ -234,5 +236,7 @@ export interface RecoverSessionResult {
|
|
|
234
236
|
command: string;
|
|
235
237
|
status: string;
|
|
236
238
|
recovered: boolean;
|
|
239
|
+
mode?: 'sdk';
|
|
240
|
+
message?: string;
|
|
237
241
|
}
|
|
238
242
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aws-runtime-bridge",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.1",
|
|
4
4
|
"description": "AgentsWorkStudio runtime bridge service for machine-level agent runtime integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -86,6 +86,7 @@
|
|
|
86
86
|
"@types/multer": "^2.1.0",
|
|
87
87
|
"@types/node": "^20.17.0",
|
|
88
88
|
"@types/unzipper": "^0.10.11",
|
|
89
|
+
"@types/ws": "^8.18.1",
|
|
89
90
|
"@vitest/coverage-v8": "^2.0.0",
|
|
90
91
|
"eslint": "^9.0.0",
|
|
91
92
|
"eslint-plugin-import": "^2.29.0",
|