aws-runtime-bridge 1.6.6 → 1.6.9
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/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/ClaudeSdkAdapter.js +2 -1
- package/dist/routes/instance.js +4 -1
- package/dist/services/tool-installer.d.ts +8 -0
- package/dist/services/tool-installer.d.ts.map +1 -1
- package/dist/services/tool-installer.js +198 -27
- package/dist/services/tool-installer.test.js +63 -4
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/sdk-package-loader.test.js +18 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeSdkAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/ClaudeSdkAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAMtC,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EAGpB,mBAAmB,EACnB,aAAa,EACd,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ClaudeSdkAdapter.d.ts","sourceRoot":"","sources":["../../src/adapter/ClaudeSdkAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import * as fs from 'fs';
|
|
|
15
15
|
import * as path from 'path';
|
|
16
16
|
import { v4 as uuidv4 } from 'uuid';
|
|
17
17
|
import { getToolActionInfo } from './types.js';
|
|
18
|
+
import { importBridgeSdkPackage } from '../utils/sdk-package-loader.js';
|
|
18
19
|
// ============ AsyncIterableQueue ============
|
|
19
20
|
/**
|
|
20
21
|
* 可排队的 AsyncIterable,用于向 SDK query() 输入流推送用户消息
|
|
@@ -567,7 +568,7 @@ export class ClaudeSdkAdapter extends EventEmitter {
|
|
|
567
568
|
async loadSdk() {
|
|
568
569
|
if (!this.sdkModule) {
|
|
569
570
|
try {
|
|
570
|
-
this.sdkModule = await
|
|
571
|
+
this.sdkModule = await importBridgeSdkPackage('@anthropic-ai/claude-agent-sdk');
|
|
571
572
|
}
|
|
572
573
|
catch (err) {
|
|
573
574
|
throw new Error(`Failed to load @anthropic-ai/claude-agent-sdk. Please install: npm install @anthropic-ai/claude-agent-sdk. Original error: ${err}`);
|
package/dist/routes/instance.js
CHANGED
|
@@ -336,7 +336,9 @@ instanceRouter.post("/cc-switch/install-tools", validateToken, async (req, res)
|
|
|
336
336
|
enabledTools,
|
|
337
337
|
toolStatus: nextToolStatus,
|
|
338
338
|
});
|
|
339
|
+
const installableToolSet = new Set(installableTools);
|
|
339
340
|
const failedTools = Object.entries(nextToolStatus)
|
|
341
|
+
.filter(([tool]) => installableToolSet.has(tool))
|
|
340
342
|
.filter(([, status]) => !status.installed)
|
|
341
343
|
.map(([tool, status]) => ({ tool, error: status.error || null }));
|
|
342
344
|
if (failedTools.length > 0) {
|
|
@@ -351,9 +353,10 @@ instanceRouter.post("/cc-switch/install-tools", validateToken, async (req, res)
|
|
|
351
353
|
toolStatus: summarizeToolStatus(nextToolStatus),
|
|
352
354
|
});
|
|
353
355
|
res.json({
|
|
354
|
-
ok:
|
|
356
|
+
ok: failedTools.length === 0,
|
|
355
357
|
agentId: String(agentId),
|
|
356
358
|
toolStatus: nextToolStatus,
|
|
359
|
+
failedTools,
|
|
357
360
|
state: savedState,
|
|
358
361
|
});
|
|
359
362
|
}
|
|
@@ -24,6 +24,14 @@ export declare function getToolCommandSpecs(tool: string, phase: "install" | "un
|
|
|
24
24
|
kind: ToolCommand["kind"];
|
|
25
25
|
}>;
|
|
26
26
|
export declare function isVoltaShimPath(commandPath: string): boolean;
|
|
27
|
+
export declare function buildSdkCliInstallStatus(tool: string, sdkResult: {
|
|
28
|
+
executable: string | null;
|
|
29
|
+
version: string | null;
|
|
30
|
+
error: string | null;
|
|
31
|
+
}, cliResult: {
|
|
32
|
+
executable: string | null;
|
|
33
|
+
error: string | null;
|
|
34
|
+
}, requiresCli: boolean): ToolInstallStatus;
|
|
27
35
|
/**
|
|
28
36
|
* 检查单个工具的 CLI 可执行状态,供实例状态展示与初始化前判断使用。
|
|
29
37
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-installer.d.ts","sourceRoot":"","sources":["../../src/services/tool-installer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"tool-installer.d.ts","sourceRoot":"","sources":["../../src/services/tool-installer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAA0C,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAiC7F,KAAK,WAAW,GACZ;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAqLN,eAAO,MAAM,2BAA2B,mBAEvC,CAAC;AAEF,eAAO,MAAM,6BAA6B,mBAIzC,CAAC;AAEF;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAO/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,GAAG,WAAW,GAC7B,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC,CAaxF;AAoDD,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAM5D;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACtF,SAAS,EAAE;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC9D,WAAW,EAAE,OAAO,GACnB,iBAAiB,CAkBnB;AAiSD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,CAAC,CAqC5B;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,CA0J5C;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAiD5C"}
|
|
@@ -18,9 +18,25 @@ function quoteCommandArg(value) {
|
|
|
18
18
|
function npmInstallIntoBridgeCommand(packages) {
|
|
19
19
|
return `npm install --prefix ${quoteCommandArg(bridgePackageRoot)} ${packages.join(" ")}`;
|
|
20
20
|
}
|
|
21
|
+
function npmInstallIntoBridgeWithOptionsCommand(packages, options) {
|
|
22
|
+
return `npm install --prefix ${quoteCommandArg(bridgePackageRoot)} ${packages.join(" ")} ${options.join(" ")}`;
|
|
23
|
+
}
|
|
24
|
+
function npmGlobalInstallCommand(packages) {
|
|
25
|
+
return `npm install -g ${packages.join(" ")}`;
|
|
26
|
+
}
|
|
21
27
|
function npmUninstallFromBridgeCommand(packages) {
|
|
22
28
|
return `npm uninstall --prefix ${quoteCommandArg(bridgePackageRoot)} ${packages.join(" ")}`;
|
|
23
29
|
}
|
|
30
|
+
function npmBridgeInstallCommand(packages, options = []) {
|
|
31
|
+
return {
|
|
32
|
+
kind: "execFile",
|
|
33
|
+
command: npmExecutableName(),
|
|
34
|
+
args: ["install", "--prefix", bridgePackageRoot, ...packages, ...options],
|
|
35
|
+
display: options.length > 0
|
|
36
|
+
? npmInstallIntoBridgeWithOptionsCommand(packages, options)
|
|
37
|
+
: npmInstallIntoBridgeCommand(packages),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
24
40
|
function npmExecutableName() {
|
|
25
41
|
return isWindows ? "npm.cmd" : "npm";
|
|
26
42
|
}
|
|
@@ -29,19 +45,39 @@ function npmExecutableName() {
|
|
|
29
45
|
* 主流程:展示层保留可读命令;执行层使用参数数组,避免 Windows shell 引号被 npm 当作路径内容。
|
|
30
46
|
*/
|
|
31
47
|
function npmBridgeCommand(action, packages) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
48
|
+
if (action === "install") {
|
|
49
|
+
return npmBridgeInstallCommand(packages);
|
|
50
|
+
}
|
|
35
51
|
return {
|
|
36
52
|
kind: "execFile",
|
|
37
53
|
command: npmExecutableName(),
|
|
38
54
|
args: [action, "--prefix", bridgePackageRoot, ...packages],
|
|
39
|
-
display,
|
|
55
|
+
display: npmUninstallFromBridgeCommand(packages),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function npmGlobalCommand(action, packages) {
|
|
59
|
+
return {
|
|
60
|
+
kind: "execFile",
|
|
61
|
+
command: npmExecutableName(),
|
|
62
|
+
args: [action, "-g", ...packages],
|
|
63
|
+
display: npmGlobalInstallCommand(packages),
|
|
40
64
|
};
|
|
41
65
|
}
|
|
42
66
|
function shellToolCommand(command) {
|
|
43
67
|
return { kind: "shell", display: command };
|
|
44
68
|
}
|
|
69
|
+
function nowIso() {
|
|
70
|
+
return new Date().toISOString();
|
|
71
|
+
}
|
|
72
|
+
function finishAttempt(attempt, updates) {
|
|
73
|
+
const finishedAt = nowIso();
|
|
74
|
+
return {
|
|
75
|
+
...attempt,
|
|
76
|
+
...updates,
|
|
77
|
+
finishedAt,
|
|
78
|
+
durationMs: Date.parse(finishedAt) - Date.parse(attempt.startedAt),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
45
81
|
const TOOL_DEFINITIONS = {
|
|
46
82
|
claude: {
|
|
47
83
|
key: "claude",
|
|
@@ -50,11 +86,23 @@ const TOOL_DEFINITIONS = {
|
|
|
50
86
|
aliases: [],
|
|
51
87
|
versionArgs: [],
|
|
52
88
|
installCommands: [
|
|
53
|
-
npmBridgeCommand("
|
|
89
|
+
npmBridgeCommand("uninstall", ["@anthropic-ai/claude-agent-sdk", "@anthropic-ai/sdk"]),
|
|
90
|
+
npmBridgeInstallCommand(["@anthropic-ai/sdk@latest"]),
|
|
91
|
+
npmBridgeInstallCommand(["@anthropic-ai/claude-agent-sdk@latest"]),
|
|
92
|
+
npmBridgeInstallCommand(["@anthropic-ai/claude-agent-sdk@latest"], ["--legacy-peer-deps"]),
|
|
93
|
+
npmGlobalCommand("install", ["@anthropic-ai/claude-code@latest"]),
|
|
54
94
|
],
|
|
55
95
|
uninstallCommands: [
|
|
56
96
|
npmBridgeCommand("uninstall", ["@anthropic-ai/claude-agent-sdk"]),
|
|
57
97
|
],
|
|
98
|
+
cliDependency: {
|
|
99
|
+
packageName: "@anthropic-ai/claude-code",
|
|
100
|
+
aliases: isWindows
|
|
101
|
+
? ["claude.cmd", "claude.exe", "claude"]
|
|
102
|
+
: ["claude"],
|
|
103
|
+
versionArgs: ["--version"],
|
|
104
|
+
installCommands: [npmGlobalCommand("install", ["@anthropic-ai/claude-code@latest"])],
|
|
105
|
+
},
|
|
58
106
|
},
|
|
59
107
|
claudecode: {
|
|
60
108
|
key: "claudecode",
|
|
@@ -63,11 +111,23 @@ const TOOL_DEFINITIONS = {
|
|
|
63
111
|
aliases: [],
|
|
64
112
|
versionArgs: [],
|
|
65
113
|
installCommands: [
|
|
66
|
-
npmBridgeCommand("
|
|
114
|
+
npmBridgeCommand("uninstall", ["@anthropic-ai/claude-agent-sdk", "@anthropic-ai/sdk"]),
|
|
115
|
+
npmBridgeInstallCommand(["@anthropic-ai/sdk@latest"]),
|
|
116
|
+
npmBridgeInstallCommand(["@anthropic-ai/claude-agent-sdk@latest"]),
|
|
117
|
+
npmBridgeInstallCommand(["@anthropic-ai/claude-agent-sdk@latest"], ["--legacy-peer-deps"]),
|
|
118
|
+
npmGlobalCommand("install", ["@anthropic-ai/claude-code@latest"]),
|
|
67
119
|
],
|
|
68
120
|
uninstallCommands: [
|
|
69
121
|
npmBridgeCommand("uninstall", ["@anthropic-ai/claude-agent-sdk"]),
|
|
70
122
|
],
|
|
123
|
+
cliDependency: {
|
|
124
|
+
packageName: "@anthropic-ai/claude-code",
|
|
125
|
+
aliases: isWindows
|
|
126
|
+
? ["claude.cmd", "claude.exe", "claude"]
|
|
127
|
+
: ["claude"],
|
|
128
|
+
versionArgs: ["--version"],
|
|
129
|
+
installCommands: [npmGlobalCommand("install", ["@anthropic-ai/claude-code@latest"])],
|
|
130
|
+
},
|
|
71
131
|
},
|
|
72
132
|
opencode: {
|
|
73
133
|
key: "opencode",
|
|
@@ -189,6 +249,24 @@ export function isVoltaShimPath(commandPath) {
|
|
|
189
249
|
.toLowerCase();
|
|
190
250
|
return /(?:^|\/)\.?volta\/bin\//.test(normalizedPath);
|
|
191
251
|
}
|
|
252
|
+
export function buildSdkCliInstallStatus(tool, sdkResult, cliResult, requiresCli) {
|
|
253
|
+
const isSdkInstalled = Boolean(sdkResult.executable);
|
|
254
|
+
const isCliInstalled = requiresCli ? Boolean(cliResult.executable) : true;
|
|
255
|
+
const errorMessages = [
|
|
256
|
+
isSdkInstalled ? null : sdkResult.error,
|
|
257
|
+
isCliInstalled ? null : cliResult.error,
|
|
258
|
+
].filter(Boolean);
|
|
259
|
+
return {
|
|
260
|
+
tool,
|
|
261
|
+
installed: isSdkInstalled && isCliInstalled,
|
|
262
|
+
executable: [sdkResult.executable, cliResult.executable]
|
|
263
|
+
.filter(Boolean)
|
|
264
|
+
.join("; ") || null,
|
|
265
|
+
version: sdkResult.version,
|
|
266
|
+
installing: false,
|
|
267
|
+
error: errorMessages.length > 0 ? errorMessages.join("; ") : null,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
192
270
|
async function isVoltaPackageInstalled(packageName) {
|
|
193
271
|
try {
|
|
194
272
|
const { stdout, stderr } = await execFileAsync("volta", ["list", "--format", "plain"], {
|
|
@@ -344,19 +422,58 @@ async function resolveSdkPackageCandidate(definition) {
|
|
|
344
422
|
};
|
|
345
423
|
}
|
|
346
424
|
}
|
|
425
|
+
/**
|
|
426
|
+
* 检测工具必需的终端 CLI 是否可执行。
|
|
427
|
+
* 主流程:SDK 负责程序化调用,CLI 负责实际 Claude Code 运行;两者都可用才算集成可用。
|
|
428
|
+
*/
|
|
429
|
+
async function resolveCliDependencyCandidate(definition) {
|
|
430
|
+
const cliDependency = definition.cliDependency;
|
|
431
|
+
if (!cliDependency) {
|
|
432
|
+
return { executable: null, version: null, error: null };
|
|
433
|
+
}
|
|
434
|
+
const cliResult = await resolveExecutableCandidate(cliDependency);
|
|
435
|
+
if (cliResult.executable) {
|
|
436
|
+
return cliResult;
|
|
437
|
+
}
|
|
438
|
+
return {
|
|
439
|
+
...cliResult,
|
|
440
|
+
error: `CLI package ${cliDependency.packageName} is not installed or command is unavailable: ${cliResult.error || "command not installed"}`,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
347
443
|
function describeCommandFailure(error) {
|
|
348
444
|
if (!error || typeof error !== "object") {
|
|
349
|
-
return {
|
|
445
|
+
return {
|
|
446
|
+
step: "install_command",
|
|
447
|
+
command: null,
|
|
448
|
+
message: String(error || "command failed"),
|
|
449
|
+
code: null,
|
|
450
|
+
signal: null,
|
|
451
|
+
stdout: "",
|
|
452
|
+
stderr: "",
|
|
453
|
+
};
|
|
350
454
|
}
|
|
351
455
|
const failure = error;
|
|
352
456
|
return {
|
|
457
|
+
step: "install_command",
|
|
458
|
+
command: null,
|
|
353
459
|
message: typeof failure.message === "string" ? failure.message : String(error),
|
|
354
|
-
code: failure.code
|
|
355
|
-
signal: failure.signal
|
|
460
|
+
code: typeof failure.code === "string" || typeof failure.code === "number" ? failure.code : null,
|
|
461
|
+
signal: typeof failure.signal === "string" ? failure.signal : null,
|
|
356
462
|
stdout: typeof failure.stdout === "string" ? failure.stdout : "",
|
|
357
463
|
stderr: typeof failure.stderr === "string" ? failure.stderr : "",
|
|
358
464
|
};
|
|
359
465
|
}
|
|
466
|
+
function buildFailureFromAttempt(attempt, fallbackMessage) {
|
|
467
|
+
return {
|
|
468
|
+
step: attempt.step,
|
|
469
|
+
command: attempt.command,
|
|
470
|
+
message: attempt.error || fallbackMessage,
|
|
471
|
+
stdout: attempt.stdout || "",
|
|
472
|
+
stderr: attempt.stderr || "",
|
|
473
|
+
code: attempt.code ?? null,
|
|
474
|
+
signal: attempt.signal ?? null,
|
|
475
|
+
};
|
|
476
|
+
}
|
|
360
477
|
async function runToolCommand(command) {
|
|
361
478
|
if (command.kind === "execFile") {
|
|
362
479
|
const needsWindowsCmdShim = isWindows && /\.(?:cmd|bat)$/i.test(command.command);
|
|
@@ -403,14 +520,8 @@ export async function detectToolInstallStatus(tool) {
|
|
|
403
520
|
}
|
|
404
521
|
const sdkResult = await resolveSdkPackageCandidate(definition);
|
|
405
522
|
if (definition.sdkPackageName) {
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
installed: Boolean(sdkResult.executable),
|
|
409
|
-
executable: sdkResult.executable,
|
|
410
|
-
version: sdkResult.version,
|
|
411
|
-
installing: false,
|
|
412
|
-
error: sdkResult.error,
|
|
413
|
-
};
|
|
523
|
+
const cliResult = await resolveCliDependencyCandidate(definition);
|
|
524
|
+
return buildSdkCliInstallStatus(normalizedTool, sdkResult, cliResult, Boolean(definition.cliDependency));
|
|
414
525
|
}
|
|
415
526
|
const result = await resolveExecutableCandidate(definition);
|
|
416
527
|
return {
|
|
@@ -448,9 +559,7 @@ export async function ensureToolsInstalled(tools) {
|
|
|
448
559
|
});
|
|
449
560
|
const initialStatuses = await detectToolStatuses(tools);
|
|
450
561
|
log.info("Initial install status detected", { statuses: initialStatuses });
|
|
451
|
-
const nextStatuses = {
|
|
452
|
-
...initialStatuses,
|
|
453
|
-
};
|
|
562
|
+
const nextStatuses = { ...initialStatuses };
|
|
454
563
|
for (const tool of Object.keys(initialStatuses)) {
|
|
455
564
|
const current = initialStatuses[tool];
|
|
456
565
|
if (current.installed) {
|
|
@@ -466,8 +575,30 @@ export async function ensureToolsInstalled(tools) {
|
|
|
466
575
|
log.warn("Skipping install because tool is unsupported", { tool, current });
|
|
467
576
|
continue;
|
|
468
577
|
}
|
|
578
|
+
const attempts = [];
|
|
579
|
+
const initialAttempt = finishAttempt({
|
|
580
|
+
step: "detect_initial",
|
|
581
|
+
label: "检测当前安装状态",
|
|
582
|
+
command: null,
|
|
583
|
+
status: "running",
|
|
584
|
+
startedAt: nowIso(),
|
|
585
|
+
}, {
|
|
586
|
+
status: current.installed ? "success" : "error",
|
|
587
|
+
error: current.installed ? null : current.error,
|
|
588
|
+
});
|
|
589
|
+
attempts.push(initialAttempt);
|
|
469
590
|
let lastError = current.error;
|
|
470
|
-
|
|
591
|
+
let lastFailure = current.installed
|
|
592
|
+
? null
|
|
593
|
+
: buildFailureFromAttempt(initialAttempt, current.error || "tool is not installed");
|
|
594
|
+
for (const [index, command] of definition.installCommands.entries()) {
|
|
595
|
+
const commandAttempt = {
|
|
596
|
+
step: `install_command_${index + 1}`,
|
|
597
|
+
label: `执行安装命令 ${index + 1}/${definition.installCommands.length}`,
|
|
598
|
+
command: command.display,
|
|
599
|
+
status: "running",
|
|
600
|
+
startedAt: nowIso(),
|
|
601
|
+
};
|
|
471
602
|
try {
|
|
472
603
|
log.info("Running install command", {
|
|
473
604
|
tool,
|
|
@@ -476,6 +607,12 @@ export async function ensureToolsInstalled(tools) {
|
|
|
476
607
|
packageName: definition.packageName,
|
|
477
608
|
});
|
|
478
609
|
const commandResult = await runToolCommand(command);
|
|
610
|
+
attempts.push(finishAttempt(commandAttempt, {
|
|
611
|
+
status: "success",
|
|
612
|
+
stdout: commandResult.stdout,
|
|
613
|
+
stderr: commandResult.stderr,
|
|
614
|
+
error: null,
|
|
615
|
+
}));
|
|
479
616
|
log.info("Install command completed", {
|
|
480
617
|
tool,
|
|
481
618
|
command: command.display,
|
|
@@ -483,24 +620,55 @@ export async function ensureToolsInstalled(tools) {
|
|
|
483
620
|
stderr: commandResult.stderr,
|
|
484
621
|
});
|
|
485
622
|
const detected = await detectToolInstallStatus(tool);
|
|
486
|
-
|
|
623
|
+
const detectAttempt = finishAttempt({
|
|
624
|
+
step: `detect_after_command_${index + 1}`,
|
|
625
|
+
label: `验证安装结果 ${index + 1}/${definition.installCommands.length}`,
|
|
626
|
+
command: null,
|
|
627
|
+
status: "running",
|
|
628
|
+
startedAt: nowIso(),
|
|
629
|
+
}, {
|
|
630
|
+
status: detected.installed ? "success" : "error",
|
|
631
|
+
error: detected.installed ? null : detected.error,
|
|
632
|
+
});
|
|
633
|
+
attempts.push(detectAttempt);
|
|
634
|
+
nextStatuses[tool] = {
|
|
635
|
+
...detected,
|
|
636
|
+
currentStep: detected.installed ? "安装完成" : detectAttempt.label,
|
|
637
|
+
attempts: [...attempts],
|
|
638
|
+
failure: detected.installed
|
|
639
|
+
? null
|
|
640
|
+
: buildFailureFromAttempt(detectAttempt, detected.error || "install verification failed"),
|
|
641
|
+
};
|
|
487
642
|
log.info("Post-install status detected", { tool, status: detected });
|
|
488
643
|
if (detected.installed) {
|
|
489
644
|
lastError = null;
|
|
645
|
+
lastFailure = null;
|
|
490
646
|
break;
|
|
491
647
|
}
|
|
492
648
|
lastError = detected.error;
|
|
649
|
+
lastFailure = buildFailureFromAttempt(detectAttempt, detected.error || "install verification failed");
|
|
493
650
|
}
|
|
494
651
|
catch (error) {
|
|
652
|
+
const failure = {
|
|
653
|
+
...describeCommandFailure(error),
|
|
654
|
+
step: commandAttempt.step,
|
|
655
|
+
command: command.display,
|
|
656
|
+
};
|
|
657
|
+
attempts.push(finishAttempt(commandAttempt, {
|
|
658
|
+
status: "error",
|
|
659
|
+
error: failure.message,
|
|
660
|
+
stdout: failure.stdout,
|
|
661
|
+
stderr: failure.stderr,
|
|
662
|
+
code: failure.code,
|
|
663
|
+
signal: failure.signal,
|
|
664
|
+
}));
|
|
495
665
|
log.error("Install command failed", {
|
|
496
666
|
tool,
|
|
497
667
|
command: command.display,
|
|
498
|
-
failure
|
|
668
|
+
failure,
|
|
499
669
|
});
|
|
500
|
-
lastError =
|
|
501
|
-
|
|
502
|
-
? error.message
|
|
503
|
-
: String(error || "install failed");
|
|
670
|
+
lastError = failure.message;
|
|
671
|
+
lastFailure = failure;
|
|
504
672
|
}
|
|
505
673
|
}
|
|
506
674
|
if (!nextStatuses[tool]?.installed) {
|
|
@@ -510,6 +678,9 @@ export async function ensureToolsInstalled(tools) {
|
|
|
510
678
|
installed: false,
|
|
511
679
|
installing: false,
|
|
512
680
|
error: lastError || "install failed",
|
|
681
|
+
currentStep: attempts.at(-1)?.label || "安装失败",
|
|
682
|
+
attempts: [...attempts],
|
|
683
|
+
failure: lastFailure,
|
|
513
684
|
};
|
|
514
685
|
log.warn("Tool SDK remains unavailable after install attempts", {
|
|
515
686
|
tool,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { SUPPORTED_INSTALLABLE_TOOLS, SUPPORTED_UNINSTALLABLE_TOOLS, detectToolInstallStatus, detectToolStatuses, getToolCommandSpecs, getToolUninstallCommands, isVoltaShimPath } from './tool-installer.js';
|
|
2
|
+
import { SUPPORTED_INSTALLABLE_TOOLS, SUPPORTED_UNINSTALLABLE_TOOLS, buildSdkCliInstallStatus, detectToolInstallStatus, detectToolStatuses, getToolCommandSpecs, 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']);
|
|
@@ -110,6 +110,63 @@ describe('tool installer service', () => {
|
|
|
110
110
|
expect(commands.some(command => command.includes('npm uninstall --prefix'))).toBe(true);
|
|
111
111
|
expect(commands.some(command => command.includes('@anthropic-ai/claude-agent-sdk'))).toBe(true);
|
|
112
112
|
});
|
|
113
|
+
it('installs Claude Code SDK and terminal CLI together', () => {
|
|
114
|
+
const commands = getToolCommandSpecs('claude', 'install');
|
|
115
|
+
expect(commands).toHaveLength(5);
|
|
116
|
+
expect(commands[0].args).toEqual([
|
|
117
|
+
'uninstall',
|
|
118
|
+
'--prefix',
|
|
119
|
+
expect.any(String),
|
|
120
|
+
'@anthropic-ai/claude-agent-sdk',
|
|
121
|
+
'@anthropic-ai/sdk'
|
|
122
|
+
]);
|
|
123
|
+
expect(commands[1].args).toEqual([
|
|
124
|
+
'install',
|
|
125
|
+
'--prefix',
|
|
126
|
+
expect.any(String),
|
|
127
|
+
'@anthropic-ai/sdk@latest'
|
|
128
|
+
]);
|
|
129
|
+
expect(commands[2].args).toEqual([
|
|
130
|
+
'install',
|
|
131
|
+
'--prefix',
|
|
132
|
+
expect.any(String),
|
|
133
|
+
'@anthropic-ai/claude-agent-sdk@latest'
|
|
134
|
+
]);
|
|
135
|
+
expect(commands[3].args).toEqual([
|
|
136
|
+
'install',
|
|
137
|
+
'--prefix',
|
|
138
|
+
expect.any(String),
|
|
139
|
+
'@anthropic-ai/claude-agent-sdk@latest',
|
|
140
|
+
'--legacy-peer-deps'
|
|
141
|
+
]);
|
|
142
|
+
expect(commands[4].args).toEqual([
|
|
143
|
+
'install',
|
|
144
|
+
'-g',
|
|
145
|
+
'@anthropic-ai/claude-code@latest'
|
|
146
|
+
]);
|
|
147
|
+
expect(commands[3].display).toContain('--legacy-peer-deps');
|
|
148
|
+
expect(commands[4].display).toBe('npm install -g @anthropic-ai/claude-code@latest');
|
|
149
|
+
});
|
|
150
|
+
it('installs Claude Code CLI for the claudecode alias too', () => {
|
|
151
|
+
const commands = getToolCommandSpecs('claudecode', 'install');
|
|
152
|
+
expect(commands.some(command => command.args.includes('@anthropic-ai/claude-agent-sdk@latest'))).toBe(true);
|
|
153
|
+
expect(commands.some(command => command.args.includes('@anthropic-ai/sdk@latest'))).toBe(true);
|
|
154
|
+
expect(commands.some(command => command.args.includes('--legacy-peer-deps'))).toBe(true);
|
|
155
|
+
expect(commands.some(command => command.args.includes('@anthropic-ai/claude-code@latest'))).toBe(true);
|
|
156
|
+
});
|
|
157
|
+
it('marks Claude unavailable when SDK exists but terminal CLI is missing', () => {
|
|
158
|
+
const status = buildSdkCliInstallStatus('claude', {
|
|
159
|
+
executable: '@anthropic-ai/claude-agent-sdk',
|
|
160
|
+
version: '0.2.87',
|
|
161
|
+
error: null
|
|
162
|
+
}, {
|
|
163
|
+
executable: null,
|
|
164
|
+
error: 'CLI package @anthropic-ai/claude-code is not installed or command is unavailable: command not installed'
|
|
165
|
+
}, true);
|
|
166
|
+
expect(status.installed).toBe(false);
|
|
167
|
+
expect(status.executable).toBe('@anthropic-ai/claude-agent-sdk');
|
|
168
|
+
expect(status.error).toContain('@anthropic-ai/claude-code');
|
|
169
|
+
});
|
|
113
170
|
it('covers bridge-local SDK uninstall path for Codex', () => {
|
|
114
171
|
const commands = getToolUninstallCommands('codex');
|
|
115
172
|
expect(commands.some(command => command.includes('npm uninstall --prefix'))).toBe(true);
|
|
@@ -124,13 +181,15 @@ describe('tool installer service', () => {
|
|
|
124
181
|
};
|
|
125
182
|
for (const [tool, packageName] of Object.entries(expectedPackagesByTool)) {
|
|
126
183
|
for (const phase of ['install', 'uninstall']) {
|
|
127
|
-
const
|
|
184
|
+
const commands = getToolCommandSpecs(tool, phase);
|
|
185
|
+
const command = commands.find(spec => spec.args.some(arg => arg.startsWith(packageName))) || commands[0];
|
|
186
|
+
const expectedCommandAction = command.args[0];
|
|
128
187
|
expect(command.kind).toBe('execFile');
|
|
129
188
|
expect(command.command).toMatch(/^npm(?:\.cmd)?$/);
|
|
130
|
-
expect(command.args.slice(0, 3)).toEqual([
|
|
189
|
+
expect(command.args.slice(0, 3)).toEqual([expectedCommandAction, '--prefix', expect.any(String)]);
|
|
131
190
|
expect(command.args[2]).not.toMatch(/^"|"$/);
|
|
132
191
|
expect(command.args.some(arg => arg.startsWith(packageName))).toBe(true);
|
|
133
|
-
expect(command.display).toContain(`npm ${
|
|
192
|
+
expect(command.display).toContain(`npm ${expectedCommandAction} --prefix`);
|
|
134
193
|
}
|
|
135
194
|
}
|
|
136
195
|
});
|
package/dist/types.d.ts
CHANGED
|
@@ -116,6 +116,32 @@ export interface ToolInstallStatus {
|
|
|
116
116
|
version: string | null;
|
|
117
117
|
installing: boolean;
|
|
118
118
|
error: string | null;
|
|
119
|
+
currentStep?: string | null;
|
|
120
|
+
attempts?: ToolInstallAttempt[];
|
|
121
|
+
failure?: ToolInstallFailure | null;
|
|
122
|
+
}
|
|
123
|
+
export interface ToolInstallAttempt {
|
|
124
|
+
step: string;
|
|
125
|
+
label: string;
|
|
126
|
+
command: string | null;
|
|
127
|
+
status: 'running' | 'success' | 'error' | 'skipped';
|
|
128
|
+
startedAt: string;
|
|
129
|
+
finishedAt?: string;
|
|
130
|
+
durationMs?: number;
|
|
131
|
+
stdout?: string;
|
|
132
|
+
stderr?: string;
|
|
133
|
+
error?: string | null;
|
|
134
|
+
code?: string | number | null;
|
|
135
|
+
signal?: string | null;
|
|
136
|
+
}
|
|
137
|
+
export interface ToolInstallFailure {
|
|
138
|
+
step: string;
|
|
139
|
+
command: string | null;
|
|
140
|
+
message: string;
|
|
141
|
+
stdout?: string;
|
|
142
|
+
stderr?: string;
|
|
143
|
+
code?: string | number | null;
|
|
144
|
+
signal?: string | null;
|
|
119
145
|
}
|
|
120
146
|
export interface InitLogEntry {
|
|
121
147
|
step: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,6 +38,24 @@ describe('sdk package loader', () => {
|
|
|
38
38
|
await writeFile(path.join(packageDirectory, 'dist', 'default.js'), 'export const ok = true;');
|
|
39
39
|
await expect(resolveBridgePackageEntryPath('default-only-sdk', packageRoot)).resolves.toBe(path.join(packageDirectory, 'dist', 'default.js'));
|
|
40
40
|
});
|
|
41
|
+
it('resolves Claude Agent SDK default export to sdk.mjs', async () => {
|
|
42
|
+
const packageRoot = await createTempPackageRoot();
|
|
43
|
+
const packageDirectory = path.join(packageRoot, 'node_modules', '@anthropic-ai', 'claude-agent-sdk');
|
|
44
|
+
await mkdir(packageDirectory, { recursive: true });
|
|
45
|
+
await writeFile(path.join(packageDirectory, 'package.json'), JSON.stringify({
|
|
46
|
+
name: '@anthropic-ai/claude-agent-sdk',
|
|
47
|
+
type: 'module',
|
|
48
|
+
main: 'sdk.mjs',
|
|
49
|
+
exports: {
|
|
50
|
+
'.': {
|
|
51
|
+
types: './sdk.d.ts',
|
|
52
|
+
default: './sdk.mjs',
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
}));
|
|
56
|
+
await writeFile(path.join(packageDirectory, 'sdk.mjs'), 'export const query = () => {};');
|
|
57
|
+
await expect(resolveBridgePackageEntryPath('@anthropic-ai/claude-agent-sdk', packageRoot)).resolves.toBe(path.join(packageDirectory, 'sdk.mjs'));
|
|
58
|
+
});
|
|
41
59
|
it('falls back to module when exports is absent', async () => {
|
|
42
60
|
const packageRoot = await createTempPackageRoot();
|
|
43
61
|
const packageDirectory = path.join(packageRoot, 'node_modules', 'module-sdk');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aws-runtime-bridge",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.9",
|
|
4
4
|
"description": "AgentsWorkStudio runtime bridge service for machine-level agent runtime integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -46,7 +46,8 @@
|
|
|
46
46
|
"test:coverage": "vitest run --coverage"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@anthropic-ai/claude-agent-sdk": "^0.
|
|
49
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.143",
|
|
50
|
+
"@anthropic-ai/sdk": "^0.96.0",
|
|
50
51
|
"@cc-switch/sdk": "file:package/cc-switch-sdk",
|
|
51
52
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
52
53
|
"@openai/codex-sdk": "^0.130.0",
|