aws-runtime-bridge 1.9.40 → 1.9.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +31 -4
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
  3. package/dist/adapter/AcodeSdkAdapter.js +382 -57
  4. package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
  5. package/dist/adapter/ClaudeSdkAdapter.js +1 -0
  6. package/dist/adapter/OpencodeSdkAdapter.d.ts +19 -0
  7. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
  8. package/dist/adapter/OpencodeSdkAdapter.js +62 -0
  9. package/dist/adapter/types.d.ts +21 -6
  10. package/dist/adapter/types.d.ts.map +1 -1
  11. package/dist/adapter/types.js +10 -1
  12. package/dist/index.js +11 -0
  13. package/dist/routes/ai-sources.js +4 -1
  14. package/dist/routes/dashboard.d.ts.map +1 -1
  15. package/dist/routes/dashboard.js +1 -1
  16. package/dist/routes/file-browser.d.ts.map +1 -1
  17. package/dist/routes/file-browser.js +47 -1
  18. package/dist/routes/processes.d.ts.map +1 -1
  19. package/dist/routes/processes.js +7 -0
  20. package/dist/routes/runtime-binding.d.ts.map +1 -1
  21. package/dist/routes/runtime-binding.js +6 -3
  22. package/dist/routes/sessions.js +93 -5
  23. package/dist/routes/sub-agents.js +15 -1
  24. package/dist/routes/terminal.d.ts +15 -0
  25. package/dist/routes/terminal.d.ts.map +1 -1
  26. package/dist/routes/terminal.js +162 -5
  27. package/dist/services/acode-package.d.ts +8 -1
  28. package/dist/services/acode-package.d.ts.map +1 -1
  29. package/dist/services/acode-package.js +33 -4
  30. package/dist/services/aws-client-agent-mcp.d.ts.map +1 -1
  31. package/dist/services/aws-client-agent-mcp.js +11 -4
  32. package/dist/services/fileSnapshotStore.js +1 -1
  33. package/dist/services/legacy-path-migration.d.ts +3 -0
  34. package/dist/services/legacy-path-migration.d.ts.map +1 -0
  35. package/dist/services/legacy-path-migration.js +66 -0
  36. package/dist/services/lifecycle-state.d.ts.map +1 -1
  37. package/dist/services/lifecycle-state.js +1 -1
  38. package/dist/services/runtime-binding.d.ts +5 -0
  39. package/dist/services/runtime-binding.d.ts.map +1 -1
  40. package/dist/services/runtime-binding.js +33 -1
  41. package/dist/services/session-output.d.ts +7 -1
  42. package/dist/services/session-output.d.ts.map +1 -1
  43. package/dist/services/session-output.js +16 -2
  44. package/dist/services/workspace-files.d.ts +48 -0
  45. package/dist/services/workspace-files.d.ts.map +1 -1
  46. package/dist/services/workspace-files.js +285 -0
  47. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
  48. package/package/acode/dist/built-in-file-tools.js +504 -3
  49. package/package/acode/dist/compaction.d.ts +43 -7
  50. package/package/acode/dist/compaction.d.ts.map +1 -1
  51. package/package/acode/dist/compaction.js +286 -31
  52. package/package/acode/dist/runtime.d.ts +130 -0
  53. package/package/acode/dist/runtime.d.ts.map +1 -1
  54. package/package/acode/dist/runtime.js +972 -71
  55. package/package/acode/dist/sub-agent-manager.d.ts +96 -1
  56. package/package/acode/dist/sub-agent-manager.d.ts.map +1 -1
  57. package/package/acode/dist/sub-agent-manager.js +293 -3
  58. package/package/acode/dist/sub-agent-store.d.ts +8 -1
  59. package/package/acode/dist/sub-agent-store.d.ts.map +1 -1
  60. package/package/acode/dist/sub-agent-store.js +55 -0
  61. package/package/acode/dist/sub-agent-tools.d.ts.map +1 -1
  62. package/package/acode/dist/sub-agent-tools.js +5 -4
  63. package/package/acode/dist/sub-agent-types.d.ts +4 -0
  64. package/package/acode/dist/sub-agent-types.d.ts.map +1 -1
  65. package/package/acode/dist/types.d.ts +19 -0
  66. package/package/acode/dist/types.d.ts.map +1 -1
  67. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +9 -0
  68. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
  69. package/package/aws-client-agent-mcp/dist/agent-client.js +69 -10
  70. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
  71. package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -1
  72. package/package/aws-client-agent-mcp/dist/config.js +4 -0
  73. package/package/aws-client-agent-mcp/dist/config.js.map +1 -1
  74. package/package/aws-client-agent-mcp/dist/constants.d.ts +2 -0
  75. package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -1
  76. package/package/aws-client-agent-mcp/dist/constants.js +3 -1
  77. package/package/aws-client-agent-mcp/dist/constants.js.map +1 -1
  78. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +4 -1
  79. package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -1
  80. package/package/aws-client-agent-mcp/dist/context-manager.js +6 -2
  81. package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -1
  82. package/package/aws-client-agent-mcp/dist/context-manager.test.js +5 -0
  83. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
  84. package/package/aws-client-agent-mcp/dist/http-client.d.ts +5 -0
  85. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
  86. package/package/aws-client-agent-mcp/dist/http-client.js +15 -1
  87. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
  88. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +102 -34
  89. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  90. package/package/aws-client-agent-mcp/dist/mcp-server.js +637 -209
  91. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  92. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +151 -51
  93. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  94. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +7 -0
  95. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  96. package/package/aws-client-agent-mcp/dist/mcp-tools.js +18 -0
  97. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  98. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +32 -9
  99. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
  100. package/package/aws-client-agent-mcp/dist/memory-store.js +58 -19
  101. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
  102. package/package/aws-client-agent-mcp/dist/memory-tools.js +3 -3
  103. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
  104. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +21 -1
  105. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -1
  106. package/package/aws-client-agent-mcp/dist/message-buffer.js +47 -21
  107. package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -1
  108. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +13 -0
  109. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
  110. package/package/aws-client-agent-mcp/dist/server-memory-store.js +18 -0
  111. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
  112. package/package/aws-client-agent-mcp/dist/types.d.ts +9 -0
  113. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  114. package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
  115. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +34 -1
  116. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
  117. package/package/aws-client-agent-mcp/dist/websocket-client.js +146 -18
  118. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
  119. package/package.json +1 -1
@@ -46,6 +46,7 @@ subAgentsRouter.get("/sub-agents/:agentId", validateToken, async (req, res) => {
46
46
  status: e.status,
47
47
  startedAt: e.startedAt,
48
48
  contextSnapshot: e.contextSnapshot,
49
+ availableTools: e.availableTools,
49
50
  }));
50
51
  const history = allRecords.filter((r) => !runningIds.has(r.subId));
51
52
  const doc = await subAgentStore.read(agentId);
@@ -163,6 +164,7 @@ subAgentsRouter.get("/sub-agents/:agentId/:subId", validateToken, async (req, re
163
164
  status: entry.status,
164
165
  startedAt: entry.startedAt,
165
166
  contextSnapshot: entry.contextSnapshot,
167
+ availableTools: entry.availableTools,
166
168
  },
167
169
  });
168
170
  return;
@@ -201,7 +203,18 @@ subAgentsRouter.get("/sub-agents/:agentId/:subId/events", validateToken, async (
201
203
  "X-Accel-Buffering": "no", // nginx 关闭缓冲
202
204
  });
203
205
  res.write(": connected\n\n");
204
- // 发送当前状态(如果已存在)
206
+ // 1. 补发历史 tool 事件(从 store 读取,按时间升序)
207
+ try {
208
+ const record = await subAgentStore.get(agentId, subId);
209
+ const historyEvents = record?.events ?? [];
210
+ for (const ev of historyEvents) {
211
+ res.write(`data: ${JSON.stringify(ev)}\n\n`);
212
+ }
213
+ }
214
+ catch (err) {
215
+ log.error("[sub-agents] 补发历史事件失败: %s", err.message);
216
+ }
217
+ // 2. 发送当前状态(如果 entry 仍在内存中)
205
218
  const entry = subAgentManager.getSubAgent(subId);
206
219
  if (entry) {
207
220
  res.write(`data: ${JSON.stringify({
@@ -211,6 +224,7 @@ subAgentsRouter.get("/sub-agents/:agentId/:subId/events", validateToken, async (
211
224
  data: { snapshot: entry.contextSnapshot },
212
225
  })}\n\n`);
213
226
  }
227
+ // 3. 实时订阅
214
228
  const unsubscribe = subAgentManager.subscribe(subId, (event) => {
215
229
  res.write(`data: ${JSON.stringify(event)}\n\n`);
216
230
  });
@@ -59,6 +59,9 @@ export declare function resolveStatusChangeUsage(actionInfo?: RuntimeStatusActio
59
59
  inputTokens: number;
60
60
  outputTokens: number;
61
61
  contextLimit?: number;
62
+ maxOutput?: number;
63
+ inputLimit?: number;
64
+ compactionThreshold?: number;
62
65
  } | undefined;
63
66
  export declare function resolveStatusChangeRuntimeState(status: string, actionInfo?: RuntimeStatusActionInfo): {
64
67
  status: string;
@@ -114,6 +117,18 @@ export interface PersistedSessionReuseDecision {
114
117
  * Main flow: require a live PID, then reject in-process providers whose adapter control channel cannot be restored.
115
118
  */
116
119
  export declare function evaluatePersistedSessionReuse(session: Pick<PersistedSession, "pid"> & Partial<Pick<PersistedSession, "command">>, isPidRunning?: (pid: number) => boolean): PersistedSessionReuseDecision;
120
+ /**
121
+ * 根据 agentId 清理 SDK 会话的所有内存状态。
122
+ *
123
+ * 用于强制停止(force-kill)场景:当进程已被外部/强制手段终止后,
124
+ * 此函数清理 bridge 内部的内存残留(sdkSessions、statusRefreshTimers、
125
+ * startingAgents、terminalCommandStates),防止下次启动时
126
+ * findActiveSdkSessionByAgentId 命中旧条目导致「无法上线」。
127
+ *
128
+ * @param agentId - 要清理的 Agent ID
129
+ * @returns 如果找到并清理了会话则返回 sessionId,否则返回 undefined
130
+ */
131
+ export declare function cleanupSdkSessionByAgentId(agentId: string): string | undefined;
117
132
  /**
118
133
  * 生成显示在终端输出流中的工作目录提示符。
119
134
  */
@@ -1 +1 @@
1
- {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.ts"],"names":[],"mappings":"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"}
@@ -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
- if (inputTokens <= 0 && outputTokens <= 0 && !usage.contextLimit) {
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
  }
@@ -491,6 +551,46 @@ export function evaluatePersistedSessionReuse(session, isPidRunning = isProcessR
491
551
  }
492
552
  return { reusable: true, reason: "active-pid" };
493
553
  }
554
+ /**
555
+ * 根据 agentId 清理 SDK 会话的所有内存状态。
556
+ *
557
+ * 用于强制停止(force-kill)场景:当进程已被外部/强制手段终止后,
558
+ * 此函数清理 bridge 内部的内存残留(sdkSessions、statusRefreshTimers、
559
+ * startingAgents、terminalCommandStates),防止下次启动时
560
+ * findActiveSdkSessionByAgentId 命中旧条目导致「无法上线」。
561
+ *
562
+ * @param agentId - 要清理的 Agent ID
563
+ * @returns 如果找到并清理了会话则返回 sessionId,否则返回 undefined
564
+ */
565
+ export function cleanupSdkSessionByAgentId(agentId) {
566
+ // 1. 从 sdkSessions 查找该 agentId 的会话
567
+ const entry = findActiveSdkSessionByAgentId(agentId);
568
+ if (!entry) {
569
+ // 可能不在 sdkSessions 中但还在 other 状态缓存里,继续清理
570
+ log.info(`[cleanupSdkSessionByAgentId] No active SDK session found for agentId=${agentId}, cleaning residual state anyway`);
571
+ }
572
+ else {
573
+ const sessionId = entry.sessionId;
574
+ log.info(`[cleanupSdkSessionByAgentId] Cleaning up SDK session for agentId=${agentId}, sessionId=${sessionId}`);
575
+ // 2. 停止状态刷新定时器
576
+ stopStatusRefresh(sessionId);
577
+ // 3. 从 sdkSessions 中移除
578
+ sdkSessions.delete(sessionId);
579
+ // 4. 清理终端命令进程
580
+ stopTerminalCommandProcess(sessionId);
581
+ // 5. 清理持久化会话
582
+ removePersistedSession(sessionId).catch((err) => {
583
+ log.warn(`[cleanupSdkSessionByAgentId] Failed to remove persisted session for agentId=${agentId}: ${err}`);
584
+ });
585
+ return sessionId;
586
+ }
587
+ // 6. 确保 startingAgents 锁也被释放(防止 Phase 1 锁定后进程被杀导致锁残留)
588
+ if (startingAgents.has(agentId)) {
589
+ startingAgents.delete(agentId);
590
+ log.info(`[cleanupSdkSessionByAgentId] Released startingAgents lock for agentId=${agentId}`);
591
+ }
592
+ return undefined;
593
+ }
494
594
  function stopTerminalCommandProcess(sessionId) {
495
595
  const state = terminalCommandStates.get(sessionId);
496
596
  if (!state?.runningProcess) {
@@ -1091,17 +1191,45 @@ function isWaitingInputProgressEvent(event, currentRuntimeStatus) {
1091
1191
  }
1092
1192
  return event.type === "thinking" || event.type === "text_delta";
1093
1193
  }
1194
+ /**
1195
+ * 从事件 data 中提取 estimatedContextTokens(兼容多种字段名)。
1196
+ * 返回 undefined 表示无有效值,使调用方能区分"无数据"和"0"。
1197
+ */
1198
+ function extractEstimatedContextTokens(data) {
1199
+ for (const key of [
1200
+ "estimatedContextTokens",
1201
+ "contextTokens",
1202
+ "context_tokens",
1203
+ "contextUsedTokens",
1204
+ "context_used_tokens",
1205
+ ]) {
1206
+ const value = data[key];
1207
+ const count = Number(value);
1208
+ if (Number.isFinite(count) && count > 0) {
1209
+ return count;
1210
+ }
1211
+ }
1212
+ return undefined;
1213
+ }
1094
1214
  export function resolveRuntimeStatusFromProviderEvent(event, currentRuntimeStatus) {
1095
1215
  if (isWaitingInputProgressEvent(event, currentRuntimeStatus)) {
1096
1216
  return undefined;
1097
1217
  }
1098
1218
  if (event.type === "ai_request") {
1219
+ // ★ 从 event.data 提取 estimatedContextTokens 构建 usage,
1220
+ // 确保 event handler 路径也能传递 token 用量到前端。
1221
+ // 这对压缩后面板刷新尤为关键:压缩后 ai_request 的 estimatedContextTokens
1222
+ // 反映了压缩后的真实上下文大小,前端据此更新进度条。
1223
+ const estimatedTokens = extractEstimatedContextTokens(event.data);
1099
1224
  return {
1100
1225
  status: "thinking",
1101
1226
  actionInfo: {
1102
1227
  actionType: "ai_request",
1103
1228
  actionLabel: "AI请求",
1104
1229
  actionDetail: formatAiRequestDetail(event.data),
1230
+ ...(estimatedTokens !== undefined
1231
+ ? { usage: { inputTokens: estimatedTokens, outputTokens: 0 } }
1232
+ : {}),
1105
1233
  },
1106
1234
  };
1107
1235
  }
@@ -1308,7 +1436,7 @@ function wireSdkAdapterEvents(adapter, definition) {
1308
1436
  const entry = sdkSessions.get(event.sessionId);
1309
1437
  if (entry) {
1310
1438
  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
1439
+ // Skip sendStatus for thinking/text_delta/tool_use_start/context_compaction/ai_request events — the status-change
1312
1440
  // listener already emits the authoritative status with restored actionInfo,
1313
1441
  // avoiding duplicate timeline entries in agentEventStore.
1314
1442
  // ★ context_compaction 加入此列表:adapter 对每个压缩事件(start/phase/end)都会同时
@@ -1316,7 +1444,14 @@ function wireSdkAdapterEvents(adapter, definition) {
1316
1444
  // 两条路径都会 sendStatus,导致 Bridge 收到重复事件。虽然前端 seenActionIds 会去重,
1317
1445
  // 但异步 sendStatus 到达顺序不确定,会造成同时间戳事件顺序错乱(如 prune_end 排在 prune_start 前)。
1318
1446
  // 只保留 status-change 路径(含完整 actionId/parentId),确保父子事件正确匹配与排序。
1319
- const isDeferredStatusEvent = event.type === "thinking" || event.type === "text_delta" || event.type === "tool_use_start" || event.type === "context_compaction";
1447
+ // ai_request 加入此列表(修复 BUG:Agent 永久卡在 "AI请求" 状态):
1448
+ // ai_request 同时触发 provider event 路径和 status-change 路径两条 sendStatus,
1449
+ // 而 tool_use_start(编辑文件等)仅通过 status-change 路径发送。
1450
+ // 异步 HTTP 乱序导致 ai_request 的 provider-event sendStatus 可能晚于 tool_use_start 到达,
1451
+ // 覆盖前端状态为 "AI请求",而时间线正确显示 "编辑文件"。
1452
+ // 将 ai_request 加入 deferred 列表,使其仅通过 status-change 路径发送,
1453
+ // 与 tool_use_start 保持一致,消除双路径竞态。
1454
+ const isDeferredStatusEvent = event.type === "thinking" || event.type === "text_delta" || event.type === "tool_use_start" || event.type === "context_compaction" || event.type === "ai_request";
1320
1455
  if (!isDeferredStatusEvent) {
1321
1456
  // ★ 修复时序竞争:runtime_capabilities 事件缓存 actionDetail,
1322
1457
  // 用于 session 稳定后重发(防止 "starting" 状态尚未更新 runtime_session_id
@@ -1355,6 +1490,13 @@ function wireSdkAdapterEvents(adapter, definition) {
1355
1490
  adapter.on("status-change", (sessionId, status, actionInfo) => {
1356
1491
  const entry = sdkSessions.get(sessionId);
1357
1492
  if (entry) {
1493
+ // ★ 活跃状态定期刷新:防止长时间 LLM 调用期间服务端 WebSocket 空闲超时导致 LOST
1494
+ if (status === "thinking" || status === "tool_using" || status === "compacting") {
1495
+ startStatusRefresh(sessionId);
1496
+ }
1497
+ else {
1498
+ stopStatusRefresh(sessionId);
1499
+ }
1358
1500
  const runtimeState = resolveStatusChangeRuntimeState(status, actionInfo);
1359
1501
  entry.currentRuntimeStatus = runtimeState.status;
1360
1502
  // 当新状态未携带动作且进入 thinking 时,保留上一个 idle 类动作(如 poll_message),
@@ -1470,7 +1612,7 @@ function wireSdkAdapterEvents(adapter, definition) {
1470
1612
  void sendQuestionRequest(entry.agentId, data.sessionId, Array.isArray(data.questions) ? data.questions : [], {
1471
1613
  runtimeAccessToken: entry.runtimeAccessToken,
1472
1614
  schedulerBaseUrl: entry.schedulerBaseUrl,
1473
- });
1615
+ }, data.toolCallId);
1474
1616
  }
1475
1617
  });
1476
1618
  adapter.on("permission-request", (data) => {
@@ -1537,7 +1679,9 @@ async function startSdkSession(req, res) {
1537
1679
  // Per-agent model override(优先于全局配置)
1538
1680
  model: perAgentModel,
1539
1681
  // Per-instance AI provider 覆盖(仅 ACode 消费;优先级:api > env > file > global)
1540
- instanceAiConfig: perInstanceAiConfig, } = req.body || {};
1682
+ instanceAiConfig: perInstanceAiConfig,
1683
+ // Sub Agent 模型/强度覆盖(仅 ACode 消费,空值=继承主 Agent)
1684
+ subAgentModel: perAgentSubAgentModel, subAgentEffort: perAgentSubAgentEffort, } = req.body || {};
1541
1685
  const _dbg = getInstanceAiConfigDebugLogger();
1542
1686
  void _dbg.log({
1543
1687
  level: "info",
@@ -1745,6 +1889,13 @@ async function startSdkSession(req, res) {
1745
1889
  ...(resolvedInstanceAiConfig
1746
1890
  ? { instanceAiConfig: resolvedInstanceAiConfig }
1747
1891
  : {}),
1892
+ // Sub Agent 模型/强度覆盖(仅 ACode 消费)
1893
+ ...(typeof perAgentSubAgentModel === "string" && perAgentSubAgentModel.trim()
1894
+ ? { subAgentModel: perAgentSubAgentModel.trim() }
1895
+ : {}),
1896
+ ...(typeof perAgentSubAgentEffort === "string" && perAgentSubAgentEffort.trim()
1897
+ ? { subAgentEffort: perAgentSubAgentEffort.trim() }
1898
+ : {}),
1748
1899
  extraMcpServers: extraMcpServers || {},
1749
1900
  envOverrides: buildRuntimeEnv(String(agentId), String(workspacePath), process.env, effectiveEnvOverrides),
1750
1901
  };
@@ -1799,6 +1950,7 @@ async function startSdkSession(req, res) {
1799
1950
  catch (error) {
1800
1951
  // 同步错误处理(校验失败等)
1801
1952
  if (sessionId) {
1953
+ stopStatusRefresh(sessionId);
1802
1954
  sdkSessions.delete(sessionId);
1803
1955
  }
1804
1956
  if (normalizedAgentId) {
@@ -1890,6 +2042,7 @@ async function startSdkSessionBg(params) {
1890
2042
  }
1891
2043
  catch (error) {
1892
2044
  // 后台启动失败:清理本地状态 + 通知 server
2045
+ stopStatusRefresh(sessionId);
1893
2046
  sdkSessions.delete(sessionId);
1894
2047
  await removePersistedSession(sessionId);
1895
2048
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -2091,6 +2244,7 @@ terminalRouter.post("/sdk/stop", validateToken, async (req, res) => {
2091
2244
  // 如果有活跃 AI 请求,先立即中止(fire-and-forget),再清理资源
2092
2245
  adapter.abortCurrentTurn(sessionId).catch(() => { });
2093
2246
  await adapter.terminateSession(sessionId);
2247
+ stopStatusRefresh(sessionId);
2094
2248
  sdkSessions.delete(sessionId);
2095
2249
  stopTerminalCommandProcess(sessionId);
2096
2250
  await removePersistedSession(sessionId);
@@ -2210,6 +2364,7 @@ terminalRouter.get("/sdk/pending-questions/:sessionId", validateToken, (req, res
2210
2364
  agentId: entry.agentId,
2211
2365
  pendingQuestion: pendingQuestion
2212
2366
  ? {
2367
+ toolCallId: pendingQuestion.toolCallId,
2213
2368
  questions: pendingQuestion.questions,
2214
2369
  }
2215
2370
  : null,
@@ -2425,6 +2580,7 @@ terminalRouter.post("/stop", validateToken, async (req, res) => {
2425
2580
  // 如果有活跃 AI 请求,先立即中止(fire-and-forget),再清理资源
2426
2581
  adapter.abortCurrentTurn(sessionId).catch(() => { });
2427
2582
  await adapter.terminateSession(sessionId);
2583
+ stopStatusRefresh(sessionId);
2428
2584
  sdkSessions.delete(sessionId);
2429
2585
  stopTerminalCommandProcess(sessionId);
2430
2586
  await removePersistedSession(sessionId);
@@ -2475,6 +2631,7 @@ terminalRouter.post("/stop-all", validateToken, async (_req, res) => {
2475
2631
  // 如果有活跃 AI 请求,先立即中止(fire-and-forget),再清理资源
2476
2632
  adapter.abortCurrentTurn(sessionId).catch(() => { });
2477
2633
  await adapter.terminateSession(sessionId);
2634
+ stopStatusRefresh(sessionId);
2478
2635
  sdkSessions.delete(sessionId);
2479
2636
  stopTerminalCommandProcess(sessionId);
2480
2637
  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
- * 主流程:检查 bundled dist -> 复制 dist 与 metadata -> 链接 bridge node_modules,
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":"AAyDA,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,GAAG,IAAI,CAwB1D"}
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(), '.agentswork', 'runtime-bridge', 'packages', 'acode');
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
- * 主流程:检查 bundled dist -> 复制 dist 与 metadata -> 链接 bridge node_modules,
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
- logger.info(`[runtime-bridge] ACode 已准备: ${getReleasedAcodeEntryPath()}`);
81
- return getReleasedAcodeEntryPath();
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,CAoDf;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"}
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 releasedDist = path.join(releasedRoot, "dist");
178
- const releasedEntry = path.join(releasedDist, "index.js");
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(), ".agentswork", "snapshots");
21
+ return path.join(homedir(), ".aws-bridge", "snapshots");
22
22
  }
23
23
  /** 快照操作超时(毫秒),默认 120s */
24
24
  function resolveSnapshotTimeoutMs() {
@@ -0,0 +1,3 @@
1
+ /** 启动时调用:迁移所有旧路径配置 */
2
+ export declare function migrateOldPathsOnStartup(): void;
3
+ //# sourceMappingURL=legacy-path-migration.d.ts.map
@@ -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;AAuCD,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"}
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(), ".agentswork", "runtime-bridge", "lifecycle-state.json");
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"}