aws-runtime-bridge 1.9.40 → 1.9.41
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/AcodeSdkAdapter.d.ts +31 -4
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/AcodeSdkAdapter.js +382 -57
- package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/ClaudeSdkAdapter.js +1 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts +19 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/OpencodeSdkAdapter.js +62 -0
- package/dist/adapter/types.d.ts +21 -6
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/adapter/types.js +10 -1
- package/dist/index.js +11 -0
- package/dist/routes/ai-sources.js +4 -1
- package/dist/routes/dashboard.d.ts.map +1 -1
- package/dist/routes/dashboard.js +1 -1
- package/dist/routes/runtime-binding.d.ts.map +1 -1
- package/dist/routes/runtime-binding.js +6 -3
- package/dist/routes/sessions.js +89 -4
- package/dist/routes/sub-agents.js +15 -1
- package/dist/routes/terminal.d.ts +3 -0
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +122 -5
- package/dist/services/acode-package.d.ts +8 -1
- package/dist/services/acode-package.d.ts.map +1 -1
- package/dist/services/acode-package.js +33 -4
- package/dist/services/aws-client-agent-mcp.d.ts.map +1 -1
- package/dist/services/aws-client-agent-mcp.js +11 -4
- package/dist/services/fileSnapshotStore.js +1 -1
- package/dist/services/legacy-path-migration.d.ts +3 -0
- package/dist/services/legacy-path-migration.d.ts.map +1 -0
- package/dist/services/legacy-path-migration.js +66 -0
- package/dist/services/lifecycle-state.d.ts.map +1 -1
- package/dist/services/lifecycle-state.js +1 -1
- package/dist/services/runtime-binding.d.ts +5 -0
- package/dist/services/runtime-binding.d.ts.map +1 -1
- package/dist/services/runtime-binding.js +33 -1
- package/dist/services/session-output.d.ts +7 -1
- package/dist/services/session-output.d.ts.map +1 -1
- package/dist/services/session-output.js +16 -2
- package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
- package/package/acode/dist/built-in-file-tools.js +504 -3
- package/package/acode/dist/compaction.d.ts +43 -7
- package/package/acode/dist/compaction.d.ts.map +1 -1
- package/package/acode/dist/compaction.js +286 -31
- package/package/acode/dist/runtime.d.ts +120 -0
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +921 -71
- package/package/acode/dist/sub-agent-manager.d.ts +96 -1
- package/package/acode/dist/sub-agent-manager.d.ts.map +1 -1
- package/package/acode/dist/sub-agent-manager.js +293 -3
- package/package/acode/dist/sub-agent-store.d.ts +8 -1
- package/package/acode/dist/sub-agent-store.d.ts.map +1 -1
- package/package/acode/dist/sub-agent-store.js +55 -0
- package/package/acode/dist/sub-agent-types.d.ts +4 -0
- package/package/acode/dist/sub-agent-types.d.ts.map +1 -1
- package/package/acode/dist/types.d.ts +19 -0
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +9 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +69 -10
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.js +4 -0
- package/package/aws-client-agent-mcp/dist/config.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/constants.js +3 -1
- package/package/aws-client-agent-mcp/dist/constants.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +4 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js +6 -2
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +5 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +5 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.js +15 -1
- package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +92 -34
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +606 -208
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +151 -51
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +7 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +18 -0
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +32 -9
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +58 -19
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +3 -3
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +13 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js +23 -0
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +13 -0
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +18 -0
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +9 -0
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +34 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +146 -18
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
- package/package.json +1 -1
package/dist/routes/terminal.js
CHANGED
|
@@ -27,6 +27,56 @@ import { logger as log } from "../utils/logger.js";
|
|
|
27
27
|
export const terminalRouter = Router();
|
|
28
28
|
// 导出 SDK 会话存储,供其他模块使用(如 sessions.ts)
|
|
29
29
|
export const sdkSessions = new Map();
|
|
30
|
+
// ── 活跃状态定期刷新,防止长时间 LLM 调用期间 WebSocket 心跳超时导致 LOST ──
|
|
31
|
+
/**
|
|
32
|
+
* 状态刷新间隔(毫秒)。
|
|
33
|
+
* 服务端 WebSocket 空闲超时默认 60 秒(maxIdleTimeMs),取 45 秒作为刷新周期,
|
|
34
|
+
* 留出足够的余量防止因网络抖动或事件循环延迟导致的超时。
|
|
35
|
+
*/
|
|
36
|
+
const STATUS_REFRESH_INTERVAL_MS = 45_000;
|
|
37
|
+
/** 每个 session 的定期刷新定时器,仅在 thinking/tool_using/compacting 时运行 */
|
|
38
|
+
const statusRefreshTimers = new Map();
|
|
39
|
+
/**
|
|
40
|
+
* 启动 session 定期状态刷新。
|
|
41
|
+
* 每隔 STATUS_REFRESH_INTERVAL_MS 向服务端发送一次当前运行状态,
|
|
42
|
+
* 刷新服务端 WebSocket 会话的 lastActiveTime,避免长时间无消息导致连接断开 → LOST。
|
|
43
|
+
*/
|
|
44
|
+
function startStatusRefresh(sessionId) {
|
|
45
|
+
if (statusRefreshTimers.has(sessionId))
|
|
46
|
+
return;
|
|
47
|
+
const timer = setInterval(() => {
|
|
48
|
+
const entry = sdkSessions.get(sessionId);
|
|
49
|
+
if (!entry) {
|
|
50
|
+
stopStatusRefresh(sessionId);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const status = entry.currentRuntimeStatus;
|
|
54
|
+
// 仅活跃状态需要刷新:thinking / tool_using / compacting
|
|
55
|
+
if (status !== "thinking" && status !== "tool_using" && status !== "compacting") {
|
|
56
|
+
stopStatusRefresh(sessionId);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// 发送轻量级状态刷新(不带 actionInfo),保持 WebSocket 会话活跃
|
|
60
|
+
void sendStatus(entry.agentId, sessionId, status, undefined, // 不传 actionInfo,避免创建额外时间线条目
|
|
61
|
+
undefined, {
|
|
62
|
+
runtimeAccessToken: entry.runtimeAccessToken,
|
|
63
|
+
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
64
|
+
}).catch(() => {
|
|
65
|
+
// sendStatus 失败静默处理,不影响主流程
|
|
66
|
+
});
|
|
67
|
+
}, STATUS_REFRESH_INTERVAL_MS);
|
|
68
|
+
statusRefreshTimers.set(sessionId, timer);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 停止 session 定期状态刷新。
|
|
72
|
+
*/
|
|
73
|
+
function stopStatusRefresh(sessionId) {
|
|
74
|
+
const timer = statusRefreshTimers.get(sessionId);
|
|
75
|
+
if (timer) {
|
|
76
|
+
clearInterval(timer);
|
|
77
|
+
statusRefreshTimers.delete(sessionId);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
30
80
|
const TOOL_RESULT_PREVIEW_MAX_LENGTH = 4000;
|
|
31
81
|
const AI_REQUEST_BODY_MARKER = "\n\n请求体:\n";
|
|
32
82
|
/**
|
|
@@ -235,13 +285,23 @@ export function resolveStatusChangeUsage(actionInfo) {
|
|
|
235
285
|
const outputTokens = Number.isFinite(usage.outputTokens)
|
|
236
286
|
? usage.outputTokens
|
|
237
287
|
: 0;
|
|
238
|
-
|
|
288
|
+
// ★ 即使 input/output token 都为 0(如 session_started 初始状态),只要有任一压缩配置字段也应传出,
|
|
289
|
+
// 否则前端拿不到 compactionThreshold,压缩点竖线无法显示。
|
|
290
|
+
if (inputTokens <= 0 &&
|
|
291
|
+
outputTokens <= 0 &&
|
|
292
|
+
!usage.contextLimit &&
|
|
293
|
+
!usage.maxOutput &&
|
|
294
|
+
!usage.inputLimit &&
|
|
295
|
+
!usage.compactionThreshold) {
|
|
239
296
|
return undefined;
|
|
240
297
|
}
|
|
241
298
|
const result = {
|
|
242
299
|
inputTokens,
|
|
243
300
|
outputTokens,
|
|
244
301
|
...(usage.contextLimit ? { contextLimit: usage.contextLimit } : {}),
|
|
302
|
+
...(usage.maxOutput ? { maxOutput: usage.maxOutput } : {}),
|
|
303
|
+
...(usage.inputLimit ? { inputLimit: usage.inputLimit } : {}),
|
|
304
|
+
...(usage.compactionThreshold ? { compactionThreshold: usage.compactionThreshold } : {}),
|
|
245
305
|
};
|
|
246
306
|
return result;
|
|
247
307
|
}
|
|
@@ -1091,17 +1151,45 @@ function isWaitingInputProgressEvent(event, currentRuntimeStatus) {
|
|
|
1091
1151
|
}
|
|
1092
1152
|
return event.type === "thinking" || event.type === "text_delta";
|
|
1093
1153
|
}
|
|
1154
|
+
/**
|
|
1155
|
+
* 从事件 data 中提取 estimatedContextTokens(兼容多种字段名)。
|
|
1156
|
+
* 返回 undefined 表示无有效值,使调用方能区分"无数据"和"0"。
|
|
1157
|
+
*/
|
|
1158
|
+
function extractEstimatedContextTokens(data) {
|
|
1159
|
+
for (const key of [
|
|
1160
|
+
"estimatedContextTokens",
|
|
1161
|
+
"contextTokens",
|
|
1162
|
+
"context_tokens",
|
|
1163
|
+
"contextUsedTokens",
|
|
1164
|
+
"context_used_tokens",
|
|
1165
|
+
]) {
|
|
1166
|
+
const value = data[key];
|
|
1167
|
+
const count = Number(value);
|
|
1168
|
+
if (Number.isFinite(count) && count > 0) {
|
|
1169
|
+
return count;
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
return undefined;
|
|
1173
|
+
}
|
|
1094
1174
|
export function resolveRuntimeStatusFromProviderEvent(event, currentRuntimeStatus) {
|
|
1095
1175
|
if (isWaitingInputProgressEvent(event, currentRuntimeStatus)) {
|
|
1096
1176
|
return undefined;
|
|
1097
1177
|
}
|
|
1098
1178
|
if (event.type === "ai_request") {
|
|
1179
|
+
// ★ 从 event.data 提取 estimatedContextTokens 构建 usage,
|
|
1180
|
+
// 确保 event handler 路径也能传递 token 用量到前端。
|
|
1181
|
+
// 这对压缩后面板刷新尤为关键:压缩后 ai_request 的 estimatedContextTokens
|
|
1182
|
+
// 反映了压缩后的真实上下文大小,前端据此更新进度条。
|
|
1183
|
+
const estimatedTokens = extractEstimatedContextTokens(event.data);
|
|
1099
1184
|
return {
|
|
1100
1185
|
status: "thinking",
|
|
1101
1186
|
actionInfo: {
|
|
1102
1187
|
actionType: "ai_request",
|
|
1103
1188
|
actionLabel: "AI请求",
|
|
1104
1189
|
actionDetail: formatAiRequestDetail(event.data),
|
|
1190
|
+
...(estimatedTokens !== undefined
|
|
1191
|
+
? { usage: { inputTokens: estimatedTokens, outputTokens: 0 } }
|
|
1192
|
+
: {}),
|
|
1105
1193
|
},
|
|
1106
1194
|
};
|
|
1107
1195
|
}
|
|
@@ -1308,7 +1396,7 @@ function wireSdkAdapterEvents(adapter, definition) {
|
|
|
1308
1396
|
const entry = sdkSessions.get(event.sessionId);
|
|
1309
1397
|
if (entry) {
|
|
1310
1398
|
console.log(`[${definition.displayName} Adapter] Event: ${event.type} for session ${event.sessionId}`);
|
|
1311
|
-
// Skip sendStatus for thinking/text_delta/tool_use_start/context_compaction events — the status-change
|
|
1399
|
+
// Skip sendStatus for thinking/text_delta/tool_use_start/context_compaction/ai_request events — the status-change
|
|
1312
1400
|
// listener already emits the authoritative status with restored actionInfo,
|
|
1313
1401
|
// avoiding duplicate timeline entries in agentEventStore.
|
|
1314
1402
|
// ★ context_compaction 加入此列表:adapter 对每个压缩事件(start/phase/end)都会同时
|
|
@@ -1316,7 +1404,14 @@ function wireSdkAdapterEvents(adapter, definition) {
|
|
|
1316
1404
|
// 两条路径都会 sendStatus,导致 Bridge 收到重复事件。虽然前端 seenActionIds 会去重,
|
|
1317
1405
|
// 但异步 sendStatus 到达顺序不确定,会造成同时间戳事件顺序错乱(如 prune_end 排在 prune_start 前)。
|
|
1318
1406
|
// 只保留 status-change 路径(含完整 actionId/parentId),确保父子事件正确匹配与排序。
|
|
1319
|
-
|
|
1407
|
+
// ★ ai_request 加入此列表(修复 BUG:Agent 永久卡在 "AI请求" 状态):
|
|
1408
|
+
// ai_request 同时触发 provider event 路径和 status-change 路径两条 sendStatus,
|
|
1409
|
+
// 而 tool_use_start(编辑文件等)仅通过 status-change 路径发送。
|
|
1410
|
+
// 异步 HTTP 乱序导致 ai_request 的 provider-event sendStatus 可能晚于 tool_use_start 到达,
|
|
1411
|
+
// 覆盖前端状态为 "AI请求",而时间线正确显示 "编辑文件"。
|
|
1412
|
+
// 将 ai_request 加入 deferred 列表,使其仅通过 status-change 路径发送,
|
|
1413
|
+
// 与 tool_use_start 保持一致,消除双路径竞态。
|
|
1414
|
+
const isDeferredStatusEvent = event.type === "thinking" || event.type === "text_delta" || event.type === "tool_use_start" || event.type === "context_compaction" || event.type === "ai_request";
|
|
1320
1415
|
if (!isDeferredStatusEvent) {
|
|
1321
1416
|
// ★ 修复时序竞争:runtime_capabilities 事件缓存 actionDetail,
|
|
1322
1417
|
// 用于 session 稳定后重发(防止 "starting" 状态尚未更新 runtime_session_id
|
|
@@ -1355,6 +1450,13 @@ function wireSdkAdapterEvents(adapter, definition) {
|
|
|
1355
1450
|
adapter.on("status-change", (sessionId, status, actionInfo) => {
|
|
1356
1451
|
const entry = sdkSessions.get(sessionId);
|
|
1357
1452
|
if (entry) {
|
|
1453
|
+
// ★ 活跃状态定期刷新:防止长时间 LLM 调用期间服务端 WebSocket 空闲超时导致 LOST
|
|
1454
|
+
if (status === "thinking" || status === "tool_using" || status === "compacting") {
|
|
1455
|
+
startStatusRefresh(sessionId);
|
|
1456
|
+
}
|
|
1457
|
+
else {
|
|
1458
|
+
stopStatusRefresh(sessionId);
|
|
1459
|
+
}
|
|
1358
1460
|
const runtimeState = resolveStatusChangeRuntimeState(status, actionInfo);
|
|
1359
1461
|
entry.currentRuntimeStatus = runtimeState.status;
|
|
1360
1462
|
// 当新状态未携带动作且进入 thinking 时,保留上一个 idle 类动作(如 poll_message),
|
|
@@ -1470,7 +1572,7 @@ function wireSdkAdapterEvents(adapter, definition) {
|
|
|
1470
1572
|
void sendQuestionRequest(entry.agentId, data.sessionId, Array.isArray(data.questions) ? data.questions : [], {
|
|
1471
1573
|
runtimeAccessToken: entry.runtimeAccessToken,
|
|
1472
1574
|
schedulerBaseUrl: entry.schedulerBaseUrl,
|
|
1473
|
-
});
|
|
1575
|
+
}, data.toolCallId);
|
|
1474
1576
|
}
|
|
1475
1577
|
});
|
|
1476
1578
|
adapter.on("permission-request", (data) => {
|
|
@@ -1537,7 +1639,9 @@ async function startSdkSession(req, res) {
|
|
|
1537
1639
|
// Per-agent model override(优先于全局配置)
|
|
1538
1640
|
model: perAgentModel,
|
|
1539
1641
|
// Per-instance AI provider 覆盖(仅 ACode 消费;优先级:api > env > file > global)
|
|
1540
|
-
instanceAiConfig: perInstanceAiConfig,
|
|
1642
|
+
instanceAiConfig: perInstanceAiConfig,
|
|
1643
|
+
// Sub Agent 模型/强度覆盖(仅 ACode 消费,空值=继承主 Agent)
|
|
1644
|
+
subAgentModel: perAgentSubAgentModel, subAgentEffort: perAgentSubAgentEffort, } = req.body || {};
|
|
1541
1645
|
const _dbg = getInstanceAiConfigDebugLogger();
|
|
1542
1646
|
void _dbg.log({
|
|
1543
1647
|
level: "info",
|
|
@@ -1745,6 +1849,13 @@ async function startSdkSession(req, res) {
|
|
|
1745
1849
|
...(resolvedInstanceAiConfig
|
|
1746
1850
|
? { instanceAiConfig: resolvedInstanceAiConfig }
|
|
1747
1851
|
: {}),
|
|
1852
|
+
// Sub Agent 模型/强度覆盖(仅 ACode 消费)
|
|
1853
|
+
...(typeof perAgentSubAgentModel === "string" && perAgentSubAgentModel.trim()
|
|
1854
|
+
? { subAgentModel: perAgentSubAgentModel.trim() }
|
|
1855
|
+
: {}),
|
|
1856
|
+
...(typeof perAgentSubAgentEffort === "string" && perAgentSubAgentEffort.trim()
|
|
1857
|
+
? { subAgentEffort: perAgentSubAgentEffort.trim() }
|
|
1858
|
+
: {}),
|
|
1748
1859
|
extraMcpServers: extraMcpServers || {},
|
|
1749
1860
|
envOverrides: buildRuntimeEnv(String(agentId), String(workspacePath), process.env, effectiveEnvOverrides),
|
|
1750
1861
|
};
|
|
@@ -1799,6 +1910,7 @@ async function startSdkSession(req, res) {
|
|
|
1799
1910
|
catch (error) {
|
|
1800
1911
|
// 同步错误处理(校验失败等)
|
|
1801
1912
|
if (sessionId) {
|
|
1913
|
+
stopStatusRefresh(sessionId);
|
|
1802
1914
|
sdkSessions.delete(sessionId);
|
|
1803
1915
|
}
|
|
1804
1916
|
if (normalizedAgentId) {
|
|
@@ -1890,6 +2002,7 @@ async function startSdkSessionBg(params) {
|
|
|
1890
2002
|
}
|
|
1891
2003
|
catch (error) {
|
|
1892
2004
|
// 后台启动失败:清理本地状态 + 通知 server
|
|
2005
|
+
stopStatusRefresh(sessionId);
|
|
1893
2006
|
sdkSessions.delete(sessionId);
|
|
1894
2007
|
await removePersistedSession(sessionId);
|
|
1895
2008
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -2091,6 +2204,7 @@ terminalRouter.post("/sdk/stop", validateToken, async (req, res) => {
|
|
|
2091
2204
|
// 如果有活跃 AI 请求,先立即中止(fire-and-forget),再清理资源
|
|
2092
2205
|
adapter.abortCurrentTurn(sessionId).catch(() => { });
|
|
2093
2206
|
await adapter.terminateSession(sessionId);
|
|
2207
|
+
stopStatusRefresh(sessionId);
|
|
2094
2208
|
sdkSessions.delete(sessionId);
|
|
2095
2209
|
stopTerminalCommandProcess(sessionId);
|
|
2096
2210
|
await removePersistedSession(sessionId);
|
|
@@ -2210,6 +2324,7 @@ terminalRouter.get("/sdk/pending-questions/:sessionId", validateToken, (req, res
|
|
|
2210
2324
|
agentId: entry.agentId,
|
|
2211
2325
|
pendingQuestion: pendingQuestion
|
|
2212
2326
|
? {
|
|
2327
|
+
toolCallId: pendingQuestion.toolCallId,
|
|
2213
2328
|
questions: pendingQuestion.questions,
|
|
2214
2329
|
}
|
|
2215
2330
|
: null,
|
|
@@ -2425,6 +2540,7 @@ terminalRouter.post("/stop", validateToken, async (req, res) => {
|
|
|
2425
2540
|
// 如果有活跃 AI 请求,先立即中止(fire-and-forget),再清理资源
|
|
2426
2541
|
adapter.abortCurrentTurn(sessionId).catch(() => { });
|
|
2427
2542
|
await adapter.terminateSession(sessionId);
|
|
2543
|
+
stopStatusRefresh(sessionId);
|
|
2428
2544
|
sdkSessions.delete(sessionId);
|
|
2429
2545
|
stopTerminalCommandProcess(sessionId);
|
|
2430
2546
|
await removePersistedSession(sessionId);
|
|
@@ -2475,6 +2591,7 @@ terminalRouter.post("/stop-all", validateToken, async (_req, res) => {
|
|
|
2475
2591
|
// 如果有活跃 AI 请求,先立即中止(fire-and-forget),再清理资源
|
|
2476
2592
|
adapter.abortCurrentTurn(sessionId).catch(() => { });
|
|
2477
2593
|
await adapter.terminateSession(sessionId);
|
|
2594
|
+
stopStatusRefresh(sessionId);
|
|
2478
2595
|
sdkSessions.delete(sessionId);
|
|
2479
2596
|
stopTerminalCommandProcess(sessionId);
|
|
2480
2597
|
stoppedSdk.push(sessionId);
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 获取 ACode 入口文件路径。
|
|
3
|
+
* 本地开发模式:直接使用项目下 package/acode/dist/index.js(修改即生效,无需复制)。
|
|
4
|
+
* 部署模式:~/.aws-bridge/acode/dist/index.js。
|
|
5
|
+
*/
|
|
1
6
|
export declare function getReleasedAcodeEntryPath(): string;
|
|
2
7
|
/**
|
|
3
8
|
* 释放随 bridge 打包的内置 ACode runtime。
|
|
4
|
-
*
|
|
9
|
+
*
|
|
10
|
+
* 本地开发模式:直接使用项目下 package/acode/dist,跳过复制(修改源码后重新 build 即生效)。
|
|
11
|
+
* 部署模式:复制 dist 与 metadata 到 ~/.aws-bridge/acode,链接 bridge node_modules,
|
|
5
12
|
* 确保 ACode 无需安装即可被 Adapter 动态加载。
|
|
6
13
|
*/
|
|
7
14
|
export declare function ensureAcodePackageReleased(): string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acode-package.d.ts","sourceRoot":"","sources":["../../src/services/acode-package.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"acode-package.d.ts","sourceRoot":"","sources":["../../src/services/acode-package.ts"],"names":[],"mappings":"AAqEA;;;;GAIG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAMlD;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,GAAG,IAAI,CAgC1D"}
|
|
@@ -10,8 +10,19 @@ function getBridgePackageRoot() {
|
|
|
10
10
|
function getBundledAcodeRoot(packageRoot = getBridgePackageRoot()) {
|
|
11
11
|
return path.join(packageRoot, 'package', 'acode');
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* 判断当前是否为本地开发模式(从项目源码目录运行)。
|
|
15
|
+
* 本地开发模式下 bridge packageRoot 下存在 src/ 目录,部署产物只有 dist/。
|
|
16
|
+
*/
|
|
17
|
+
function isLocalDevMode(packageRoot = getBridgePackageRoot()) {
|
|
18
|
+
return existsSync(path.join(packageRoot, 'src'));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 部署模式下的 released 根目录:~/.aws-bridge/acode
|
|
22
|
+
* 与 aws-client-agent-mcp 的 ~/.aws-bridge/mcp 路径保持一致。
|
|
23
|
+
*/
|
|
13
24
|
function getReleasedAcodeRoot() {
|
|
14
|
-
return path.join(getRuntimeHomeDir(), '.
|
|
25
|
+
return path.join(getRuntimeHomeDir(), '.aws-bridge', 'acode');
|
|
15
26
|
}
|
|
16
27
|
function shouldReplaceNodeModulesLink(targetPath) {
|
|
17
28
|
if (!existsSync(targetPath)) {
|
|
@@ -48,12 +59,23 @@ function ensureReleasedNodeModules(packageRoot, releasedRoot) {
|
|
|
48
59
|
rmSync(releasedNodeModules, { recursive: true, force: true });
|
|
49
60
|
symlinkSync(sourceNodeModules, releasedNodeModules, process.platform === 'win32' ? 'junction' : 'dir');
|
|
50
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* 获取 ACode 入口文件路径。
|
|
64
|
+
* 本地开发模式:直接使用项目下 package/acode/dist/index.js(修改即生效,无需复制)。
|
|
65
|
+
* 部署模式:~/.aws-bridge/acode/dist/index.js。
|
|
66
|
+
*/
|
|
51
67
|
export function getReleasedAcodeEntryPath() {
|
|
68
|
+
const packageRoot = getBridgePackageRoot();
|
|
69
|
+
if (isLocalDevMode(packageRoot)) {
|
|
70
|
+
return path.join(getBundledAcodeRoot(packageRoot), 'dist', 'index.js');
|
|
71
|
+
}
|
|
52
72
|
return path.join(getReleasedAcodeRoot(), 'dist', 'index.js');
|
|
53
73
|
}
|
|
54
74
|
/**
|
|
55
75
|
* 释放随 bridge 打包的内置 ACode runtime。
|
|
56
|
-
*
|
|
76
|
+
*
|
|
77
|
+
* 本地开发模式:直接使用项目下 package/acode/dist,跳过复制(修改源码后重新 build 即生效)。
|
|
78
|
+
* 部署模式:复制 dist 与 metadata 到 ~/.aws-bridge/acode,链接 bridge node_modules,
|
|
57
79
|
* 确保 ACode 无需安装即可被 Adapter 动态加载。
|
|
58
80
|
*/
|
|
59
81
|
export function ensureAcodePackageReleased() {
|
|
@@ -65,6 +87,12 @@ export function ensureAcodePackageReleased() {
|
|
|
65
87
|
logger.warn(`[runtime-bridge] 未找到 bundled ACode dist,ACode 启动可能失败: ${bundledEntry}`);
|
|
66
88
|
return null;
|
|
67
89
|
}
|
|
90
|
+
// 本地开发模式:直接使用项目下 dist,无需复制
|
|
91
|
+
if (isLocalDevMode(packageRoot)) {
|
|
92
|
+
logger.info(`[runtime-bridge] ACode 本地开发模式,直接使用项目 dist: ${bundledEntry}`);
|
|
93
|
+
return bundledEntry;
|
|
94
|
+
}
|
|
95
|
+
// 部署模式:复制到 ~/.aws-bridge/acode
|
|
68
96
|
const releasedRoot = getReleasedAcodeRoot();
|
|
69
97
|
const releasedDist = path.join(releasedRoot, 'dist');
|
|
70
98
|
mkdirSync(releasedRoot, { recursive: true });
|
|
@@ -77,6 +105,7 @@ export function ensureAcodePackageReleased() {
|
|
|
77
105
|
}
|
|
78
106
|
}
|
|
79
107
|
ensureReleasedNodeModules(packageRoot, releasedRoot);
|
|
80
|
-
|
|
81
|
-
|
|
108
|
+
const releasedEntry = path.join(releasedDist, 'index.js');
|
|
109
|
+
logger.info(`[runtime-bridge] ACode 已准备: ${releasedEntry}`);
|
|
110
|
+
return releasedEntry;
|
|
82
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aws-client-agent-mcp.d.ts","sourceRoot":"","sources":["../../src/services/aws-client-agent-mcp.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAqB7C,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,sCAAsC;IACrD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,sCAAsC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAaD,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;CAC3C;AAuBD,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAgLD,wBAAgB,+BAA+B,CAC7C,OAAO,GAAE,sCAA2C,GACnD,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"aws-client-agent-mcp.d.ts","sourceRoot":"","sources":["../../src/services/aws-client-agent-mcp.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAqB7C,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,sCAAsC;IACrD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,sCAAsC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAaD,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;CAC3C;AAuBD,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAgLD,wBAAgB,+BAA+B,CAC7C,OAAO,GAAE,sCAA2C,GACnD,MAAM,GAAG,IAAI,CA+Df;AAgGD,wBAAgB,+BAA+B,CAC7C,OAAO,GAAE,sCAA2C,GACnD,kBAAkB,CAEpB;AAED,wBAAgB,gCAAgC,CAC9C,OAAO,GAAE,sCAA2C,GACnD,kBAAkB,CAsBpB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,uBAAuB,GAC7B,kBAAkB,CAsBpB;AAED,wBAAgB,+BAA+B,IAAI,IAAI,CAgBtD"}
|
|
@@ -172,13 +172,20 @@ function shouldRefreshReleasedMcp(releasedEntry, manifest, nextManifest) {
|
|
|
172
172
|
}
|
|
173
173
|
export function releaseBundledAwsClientAgentMcp(options = {}) {
|
|
174
174
|
const packageRoot = options.packageRoot || getPackageRoot();
|
|
175
|
-
const releasedRoot = options.releasedRoot || getReleasedMcpRoot();
|
|
176
175
|
const bundledDist = path.dirname(getBundledEntryPath(packageRoot));
|
|
177
|
-
const
|
|
178
|
-
|
|
179
|
-
if (!existsSync(path.join(bundledDist, "index.js"))) {
|
|
176
|
+
const bundledEntry = path.join(bundledDist, "index.js");
|
|
177
|
+
if (!existsSync(bundledEntry)) {
|
|
180
178
|
return null;
|
|
181
179
|
}
|
|
180
|
+
// 本地开发模式:直接使用项目下 dist,无需复制
|
|
181
|
+
if (existsSync(path.join(packageRoot, "src"))) {
|
|
182
|
+
logger.info(`[runtime-bridge] ${AWS_MCP_SERVER_NAME} MCP 本地开发模式,直接使用项目 dist: ${bundledEntry}`);
|
|
183
|
+
return bundledEntry;
|
|
184
|
+
}
|
|
185
|
+
// 部署模式:复制到 ~/.aws-bridge/mcp
|
|
186
|
+
const releasedRoot = options.releasedRoot || getReleasedMcpRoot();
|
|
187
|
+
const releasedDist = path.join(releasedRoot, "dist");
|
|
188
|
+
const releasedEntry = path.join(releasedDist, "index.js");
|
|
182
189
|
const nextManifest = {
|
|
183
190
|
bridgeVersion: getBridgeVersion(packageRoot),
|
|
184
191
|
mcpVersion: getBundledMcpVersion(packageRoot),
|
|
@@ -18,7 +18,7 @@ function resolveSnapshotRoot() {
|
|
|
18
18
|
const envRoot = String(process.env.AWS_RUNTIME_SNAPSHOT_ROOT || "").trim();
|
|
19
19
|
if (envRoot)
|
|
20
20
|
return envRoot;
|
|
21
|
-
return path.join(homedir(), ".
|
|
21
|
+
return path.join(homedir(), ".aws-bridge", "snapshots");
|
|
22
22
|
}
|
|
23
23
|
/** 快照操作超时(毫秒),默认 120s */
|
|
24
24
|
function resolveSnapshotTimeoutMs() {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-path-migration.d.ts","sourceRoot":"","sources":["../../src/services/legacy-path-migration.ts"],"names":[],"mappings":"AAwDA,sBAAsB;AACtB,wBAAgB,wBAAwB,IAAI,IAAI,CAc/C"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 旧路径迁移:将 ~/.agentswork/ 下的全局配置文件迁移到 ~/.aws-bridge/。
|
|
3
|
+
*
|
|
4
|
+
* 迁移范围:
|
|
5
|
+
* 1. binding.json、runtime-tokens.properties(由 migrateOldBindingDir 处理)
|
|
6
|
+
* 2. lifecycle-state.json
|
|
7
|
+
* 3. snapshots/ 目录
|
|
8
|
+
*
|
|
9
|
+
* 仅在旧路径存在且新路径不存在时执行,避免覆盖已有配置。
|
|
10
|
+
* 迁移后旧文件保留不动。
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, mkdirSync, copyFileSync, readdirSync } from "node:fs";
|
|
13
|
+
import path from "node:path";
|
|
14
|
+
import { getRuntimeHomeDir } from "../config.js";
|
|
15
|
+
import { createLogger } from "../utils/logger.js";
|
|
16
|
+
import { migrateOldBindingDir } from "./runtime-binding.js";
|
|
17
|
+
const log = createLogger("legacy-path-migration");
|
|
18
|
+
function oldRootDir() {
|
|
19
|
+
return path.join(getRuntimeHomeDir(), ".agentswork", "runtime-bridge");
|
|
20
|
+
}
|
|
21
|
+
function newRootDir() {
|
|
22
|
+
return path.join(getRuntimeHomeDir(), ".aws-bridge");
|
|
23
|
+
}
|
|
24
|
+
function migrateLifecycleState() {
|
|
25
|
+
const oldFile = path.join(oldRootDir(), "lifecycle-state.json");
|
|
26
|
+
const newFile = path.join(newRootDir(), "lifecycle-state.json");
|
|
27
|
+
if (existsSync(oldFile) && !existsSync(newFile)) {
|
|
28
|
+
mkdirSync(newRootDir(), { recursive: true });
|
|
29
|
+
copyFileSync(oldFile, newFile);
|
|
30
|
+
log.info(`[runtime-bridge] 已迁移 lifecycle-state.json → ${newFile}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function migrateSnapshots() {
|
|
34
|
+
const oldDir = path.join(getRuntimeHomeDir(), ".agentswork", "snapshots");
|
|
35
|
+
const newDir = path.join(newRootDir(), "snapshots");
|
|
36
|
+
if (existsSync(oldDir) && !existsSync(newDir)) {
|
|
37
|
+
mkdirSync(newDir, { recursive: true });
|
|
38
|
+
try {
|
|
39
|
+
const entries = readdirSync(oldDir);
|
|
40
|
+
for (const entry of entries) {
|
|
41
|
+
const src = path.join(oldDir, entry);
|
|
42
|
+
const dest = path.join(newDir, entry);
|
|
43
|
+
copyFileSync(src, dest);
|
|
44
|
+
}
|
|
45
|
+
log.info(`[runtime-bridge] 已迁移 snapshots/ 到 ${newDir}`);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
log.warn(`[runtime-bridge] snapshots/ 迁移失败(部分文件可能被跳过)`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** 启动时调用:迁移所有旧路径配置 */
|
|
53
|
+
export function migrateOldPathsOnStartup() {
|
|
54
|
+
// 旧目录不存在则跳过
|
|
55
|
+
const oldRoot = oldRootDir();
|
|
56
|
+
if (!existsSync(oldRoot)) {
|
|
57
|
+
const oldSnapshots = path.join(getRuntimeHomeDir(), ".agentswork", "snapshots");
|
|
58
|
+
if (!existsSync(oldSnapshots)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
log.info("[runtime-bridge] 检测到旧路径 ~/.agentswork/,正在迁移到 ~/.aws-bridge/ ...");
|
|
63
|
+
migrateOldBindingDir();
|
|
64
|
+
migrateLifecycleState();
|
|
65
|
+
migrateSnapshots();
|
|
66
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle-state.d.ts","sourceRoot":"","sources":["../../src/services/lifecycle-state.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,4BAA4B,GAAG,QAAQ,GAAG,SAAS,CAAC;AAChE,MAAM,MAAM,8BAA8B,GACtC,UAAU,GACV,SAAS,GACT,WAAW,GACX,QAAQ,GACR,mBAAmB,CAAC;AAExB,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,4BAA4B,CAAC;IAC5C,MAAM,EAAE,8BAA8B,CAAC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"lifecycle-state.d.ts","sourceRoot":"","sources":["../../src/services/lifecycle-state.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,4BAA4B,GAAG,QAAQ,GAAG,SAAS,CAAC;AAChE,MAAM,MAAM,8BAA8B,GACtC,UAAU,GACV,SAAS,GACT,WAAW,GACX,QAAQ,GACR,mBAAmB,CAAC;AAExB,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,4BAA4B,CAAC;IAC5C,MAAM,EAAE,8BAA8B,CAAC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAsCD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,aAAa,EAAE,4BAA4B,CAAC;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,8BAA8B,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,wBAAwB,CAgB3B;AAED,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,wBAAwB,GAClC,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,8BAA8B,CAClD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAKf;AAiCD;;;GAGG;AACH,wBAAsB,0CAA0C,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BhF"}
|
|
@@ -7,7 +7,7 @@ import { getRuntimeAccessToken, loadRuntimeBinding, normalizeSchedulerBaseUrl, }
|
|
|
7
7
|
import { createLogger } from "../utils/logger.js";
|
|
8
8
|
const log = createLogger("bridge-lifecycle");
|
|
9
9
|
function lifecycleStateFile() {
|
|
10
|
-
return path.join(getRuntimeHomeDir(), ".
|
|
10
|
+
return path.join(getRuntimeHomeDir(), ".aws-bridge", "lifecycle-state.json");
|
|
11
11
|
}
|
|
12
12
|
function normalizeText(value) {
|
|
13
13
|
const normalized = String(value || "").trim();
|
|
@@ -41,4 +41,9 @@ export declare function saveRuntimeBinding(input: {
|
|
|
41
41
|
schedulerBaseUrl?: string;
|
|
42
42
|
}): RuntimeBindingState;
|
|
43
43
|
export declare function clearRuntimeBinding(): void;
|
|
44
|
+
/**
|
|
45
|
+
* 将旧路径 ~/.agentswork/runtime-bridge/ 下的配置文件迁移到新路径 ~/.aws-bridge/。
|
|
46
|
+
* 仅在旧路径存在且新路径不存在时执行,避免覆盖已有配置。
|
|
47
|
+
*/
|
|
48
|
+
export declare function migrateOldBindingDir(): void;
|
|
44
49
|
//# sourceMappingURL=runtime-binding.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-binding.d.ts","sourceRoot":"","sources":["../../src/services/runtime-binding.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAmEF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAqB5E;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAiCD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,OAAO,GACrB,MAAM,CAYR;AAsCD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAWT;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,OAAO,GACrB,MAAM,GAAG,SAAS,CAUpB;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,OAAO,GACrB,OAAO,CAeT;AAcD,wBAAgB,kBAAkB,IAAI,mBAAmB,CAgBxD;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAClD,mBAAmB,EACnB,WAAW,GAAG,aAAa,CAC5B,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAWtB;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAG3C;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAcnE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,OAAO,GACtB,MAAM,GAAG,SAAS,CAyBpB;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAEjE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,mBAAmB,CAwCtB;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAkB1C"}
|
|
1
|
+
{"version":3,"file":"runtime-binding.d.ts","sourceRoot":"","sources":["../../src/services/runtime-binding.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAmEF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAqB5E;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAErD;AAiCD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,OAAO,GACrB,MAAM,CAYR;AAsCD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAWT;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,OAAO,GACrB,MAAM,GAAG,SAAS,CAUpB;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,OAAO,GACrB,OAAO,CAeT;AAcD,wBAAgB,kBAAkB,IAAI,mBAAmB,CAgBxD;AAED,wBAAgB,4BAA4B,IAAI,IAAI,CAClD,mBAAmB,EACnB,WAAW,GAAG,aAAa,CAC5B,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAWtB;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAG3C;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAcnE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,OAAO,GACtB,MAAM,GAAG,SAAS,CAyBpB;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAEjE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,mBAAmB,CAwCtB;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAkB1C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CA0B3C"}
|
|
@@ -13,7 +13,7 @@ function generatePairingCode() {
|
|
|
13
13
|
.replace(/(\d{3})(\d{3})/, "$1-$2");
|
|
14
14
|
}
|
|
15
15
|
function bindingDir() {
|
|
16
|
-
return path.join(getRuntimeHomeDir(), ".
|
|
16
|
+
return path.join(getRuntimeHomeDir(), ".aws-bridge");
|
|
17
17
|
}
|
|
18
18
|
function bindingFile() {
|
|
19
19
|
return path.join(bindingDir(), "binding.json");
|
|
@@ -331,3 +331,35 @@ export function clearRuntimeBinding() {
|
|
|
331
331
|
fs.writeFileSync(bindingFile(), `${JSON.stringify(revokedState, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
|
|
332
332
|
log.info("[runtime-bridge] runtime binding cleared");
|
|
333
333
|
}
|
|
334
|
+
/**
|
|
335
|
+
* 将旧路径 ~/.agentswork/runtime-bridge/ 下的配置文件迁移到新路径 ~/.aws-bridge/。
|
|
336
|
+
* 仅在旧路径存在且新路径不存在时执行,避免覆盖已有配置。
|
|
337
|
+
*/
|
|
338
|
+
export function migrateOldBindingDir() {
|
|
339
|
+
const homedir = getRuntimeHomeDir();
|
|
340
|
+
const oldDir = path.join(homedir, ".agentswork", "runtime-bridge");
|
|
341
|
+
const newDir = bindingDir();
|
|
342
|
+
if (oldDir === newDir)
|
|
343
|
+
return;
|
|
344
|
+
if (!fs.existsSync(oldDir))
|
|
345
|
+
return;
|
|
346
|
+
const files = ["binding.json", "runtime-tokens.properties"];
|
|
347
|
+
let migratedCount = 0;
|
|
348
|
+
for (const file of files) {
|
|
349
|
+
const oldFile = path.join(oldDir, file);
|
|
350
|
+
const newFile = path.join(newDir, file);
|
|
351
|
+
if (fs.existsSync(oldFile) && !fs.existsSync(newFile)) {
|
|
352
|
+
fs.mkdirSync(newDir, { recursive: true });
|
|
353
|
+
fs.copyFileSync(oldFile, newFile);
|
|
354
|
+
try {
|
|
355
|
+
fs.chmodSync(newFile, 0o600);
|
|
356
|
+
}
|
|
357
|
+
catch { /* ignore */ }
|
|
358
|
+
migratedCount++;
|
|
359
|
+
log.info(`[runtime-bridge] 已迁移 ${oldFile} → ${newFile}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
if (migratedCount > 0) {
|
|
363
|
+
log.info(`[runtime-bridge] 已迁移 ${migratedCount} 个配置文件从 ${oldDir} 到 ${newDir}`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
@@ -41,6 +41,7 @@ export interface BridgeEventPayload {
|
|
|
41
41
|
readonly filePath?: string;
|
|
42
42
|
readonly eventType?: string;
|
|
43
43
|
readonly size?: number;
|
|
44
|
+
readonly toolCallId?: string;
|
|
44
45
|
}
|
|
45
46
|
/** RingBufferEntry 的便捷导出 */
|
|
46
47
|
export type { RingBufferEntry, RingBufferSlice };
|
|
@@ -90,6 +91,9 @@ export declare function sendStatus(agentId: string, sessionId: string | null, st
|
|
|
90
91
|
inputTokens: number;
|
|
91
92
|
outputTokens: number;
|
|
92
93
|
contextLimit?: number;
|
|
94
|
+
maxOutput?: number;
|
|
95
|
+
inputLimit?: number;
|
|
96
|
+
compactionThreshold?: number;
|
|
93
97
|
}, authOptions?: RuntimeCallbackAuthOptions, timestamp?: number, sourceEventType?: string): Promise<AxiosResponse<unknown> | undefined>;
|
|
94
98
|
/**
|
|
95
99
|
* 发送输出到调度器
|
|
@@ -106,8 +110,10 @@ export declare function sendOutput(agentId: string, output: string, sessionId: s
|
|
|
106
110
|
* @param agentId - Agent ID
|
|
107
111
|
* @param sessionId - SDK 会话 ID
|
|
108
112
|
* @param questions - 结构化问题列表
|
|
113
|
+
* @param authOptions - 运行时鉴权选项
|
|
114
|
+
* @param toolCallId - 提问实例的唯一标识,用于前端区分同一会话内连续多次提问
|
|
109
115
|
*/
|
|
110
|
-
export declare function sendQuestionRequest(agentId: string, sessionId: string, questions: unknown[], authOptions?: RuntimeCallbackAuthOptions): Promise<void>;
|
|
116
|
+
export declare function sendQuestionRequest(agentId: string, sessionId: string, questions: unknown[], authOptions?: RuntimeCallbackAuthOptions, toolCallId?: string): Promise<void>;
|
|
111
117
|
export interface RuntimeFileChangedPayload {
|
|
112
118
|
bridgeBaseUrl?: string;
|
|
113
119
|
workspacePath: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-output.d.ts","sourceRoot":"","sources":["../../src/services/session-output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAKlD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAK3C,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAK1F;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,CAAC;AAEpF;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAI3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"session-output.d.ts","sourceRoot":"","sources":["../../src/services/session-output.ts"],"names":[],"mappings":"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"}
|
|
@@ -115,6 +115,17 @@ export async function sendStatus(agentId, sessionId, status, actionInfo, usage,
|
|
|
115
115
|
if (usage.contextLimit) {
|
|
116
116
|
payload.contextLimit = usage.contextLimit;
|
|
117
117
|
}
|
|
118
|
+
// ★ 补传 maxOutput/inputLimit/compactionThreshold,前端 AgentContextPanel 直接用
|
|
119
|
+
// compactionThreshold 显示压缩点竖线(消除前端自算公式脱节)。
|
|
120
|
+
if (usage.maxOutput) {
|
|
121
|
+
payload.maxOutput = usage.maxOutput;
|
|
122
|
+
}
|
|
123
|
+
if (usage.inputLimit) {
|
|
124
|
+
payload.inputLimit = usage.inputLimit;
|
|
125
|
+
}
|
|
126
|
+
if (usage.compactionThreshold) {
|
|
127
|
+
payload.compactionThreshold = usage.compactionThreshold;
|
|
128
|
+
}
|
|
118
129
|
}
|
|
119
130
|
// 添加来源事件类型(用于前端时间线灰度区分,如 thinking / ai_request)
|
|
120
131
|
if (sourceEventType) {
|
|
@@ -305,10 +316,12 @@ export async function sendOutput(agentId, output, sessionId, seq, metadata, auth
|
|
|
305
316
|
* @param agentId - Agent ID
|
|
306
317
|
* @param sessionId - SDK 会话 ID
|
|
307
318
|
* @param questions - 结构化问题列表
|
|
319
|
+
* @param authOptions - 运行时鉴权选项
|
|
320
|
+
* @param toolCallId - 提问实例的唯一标识,用于前端区分同一会话内连续多次提问
|
|
308
321
|
*/
|
|
309
|
-
export async function sendQuestionRequest(agentId, sessionId, questions, authOptions) {
|
|
322
|
+
export async function sendQuestionRequest(agentId, sessionId, questions, authOptions, toolCallId) {
|
|
310
323
|
const callbackBaseUrl = resolveRuntimeCallbackBaseUrl(authOptions);
|
|
311
|
-
const payload = { agentId, sessionId, questions };
|
|
324
|
+
const payload = { agentId, sessionId, questions, ...(toolCallId ? { toolCallId } : {}) };
|
|
312
325
|
try {
|
|
313
326
|
const headers = runtimeAuthHeaders(authOptions, callbackBaseUrl);
|
|
314
327
|
if (!headers) {
|
|
@@ -340,6 +353,7 @@ export async function sendQuestionRequest(agentId, sessionId, questions, authOpt
|
|
|
340
353
|
category: "question",
|
|
341
354
|
agentId,
|
|
342
355
|
sessionId,
|
|
356
|
+
...(toolCallId ? { toolCallId } : {}),
|
|
343
357
|
questions,
|
|
344
358
|
};
|
|
345
359
|
bridgeEventBuffer.append(eventPayload);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"built-in-file-tools.d.ts","sourceRoot":"","sources":["../src/built-in-file-tools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"built-in-file-tools.d.ts","sourceRoot":"","sources":["../src/built-in-file-tools.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,kCAAkC,CAAC;AAiC1C,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AACjC,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,OAAO,CACL,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,gCAAgC,GACzC,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACtC,kEAAkE;IAClE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAokCD,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,MAAM,GACf,gBAAgB,EAAE,CASpB"}
|