aws-runtime-bridge 1.9.0 → 1.9.2

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 (117) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +2 -0
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
  3. package/dist/adapter/AcodeSdkAdapter.js +84 -18
  4. package/dist/adapter/AcodeSdkAdapter.test.js +275 -13
  5. package/dist/adapter/acode-tool-names.d.ts +16 -0
  6. package/dist/adapter/acode-tool-names.d.ts.map +1 -0
  7. package/dist/adapter/acode-tool-names.js +37 -0
  8. package/dist/adapter/acode-tool-names.test.d.ts +2 -0
  9. package/dist/adapter/acode-tool-names.test.d.ts.map +1 -0
  10. package/dist/adapter/acode-tool-names.test.js +28 -0
  11. package/dist/adapter/types.d.ts +22 -3
  12. package/dist/adapter/types.d.ts.map +1 -1
  13. package/dist/adapter/types.js +2 -1
  14. package/dist/config.d.ts +0 -4
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +0 -4
  17. package/dist/index.js +1 -1
  18. package/dist/routes/ai-sources.js +18 -14
  19. package/dist/routes/git.d.ts +10 -0
  20. package/dist/routes/git.d.ts.map +1 -1
  21. package/dist/routes/git.js +37 -3
  22. package/dist/routes/git.test.js +47 -1
  23. package/dist/routes/sessions.d.ts +1 -1
  24. package/dist/routes/sessions.d.ts.map +1 -1
  25. package/dist/routes/sessions.js +11 -4
  26. package/dist/routes/sessions.test.js +3 -0
  27. package/dist/routes/terminal.d.ts +28 -8
  28. package/dist/routes/terminal.d.ts.map +1 -1
  29. package/dist/routes/terminal.js +266 -44
  30. package/dist/routes/terminal.stop-options.test.d.ts +2 -0
  31. package/dist/routes/terminal.stop-options.test.d.ts.map +1 -0
  32. package/dist/routes/terminal.stop-options.test.js +39 -0
  33. package/dist/routes/terminal.test.js +87 -4
  34. package/dist/services/auto-register.d.ts.map +1 -1
  35. package/dist/services/auto-register.js +4 -5
  36. package/dist/services/mcp-launch-binding-queue.d.ts +5 -0
  37. package/dist/services/mcp-launch-binding-queue.d.ts.map +1 -1
  38. package/dist/services/mcp-launch-binding-queue.js +17 -0
  39. package/dist/services/mcp-launch-binding-queue.test.js +16 -1
  40. package/dist/services/session-output.d.ts +5 -0
  41. package/dist/services/session-output.d.ts.map +1 -1
  42. package/package/acode/dist/built-in-file-tools.d.ts +5 -1
  43. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
  44. package/package/acode/dist/built-in-file-tools.js +14 -203
  45. package/package/acode/dist/builtins/commandArtifacts.d.ts +25 -0
  46. package/package/acode/dist/builtins/commandArtifacts.d.ts.map +1 -0
  47. package/package/acode/dist/builtins/commandArtifacts.js +77 -0
  48. package/package/acode/dist/builtins/commandOutputEvents.d.ts +21 -0
  49. package/package/acode/dist/builtins/commandOutputEvents.d.ts.map +1 -0
  50. package/package/acode/dist/builtins/commandOutputEvents.js +56 -0
  51. package/package/acode/dist/builtins/shellCommandPreparation.d.ts +15 -0
  52. package/package/acode/dist/builtins/shellCommandPreparation.d.ts.map +1 -0
  53. package/package/acode/dist/builtins/shellCommandPreparation.js +44 -0
  54. package/package/acode/dist/builtins/shellCommandResult.d.ts +30 -0
  55. package/package/acode/dist/builtins/shellCommandResult.d.ts.map +1 -0
  56. package/package/acode/dist/builtins/shellCommandResult.js +71 -0
  57. package/package/acode/dist/builtins/shellCommandRunner.d.ts +14 -0
  58. package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +1 -0
  59. package/package/acode/dist/builtins/shellCommandRunner.js +114 -0
  60. package/package/acode/dist/builtins/shellOutputDecoder.d.ts +5 -0
  61. package/package/acode/dist/builtins/shellOutputDecoder.d.ts.map +1 -0
  62. package/package/acode/dist/builtins/shellOutputDecoder.js +30 -0
  63. package/package/acode/dist/mcpToolNames.d.ts +11 -0
  64. package/package/acode/dist/mcpToolNames.d.ts.map +1 -0
  65. package/package/acode/dist/mcpToolNames.js +17 -0
  66. package/package/acode/dist/runtime.d.ts +19 -0
  67. package/package/acode/dist/runtime.d.ts.map +1 -1
  68. package/package/acode/dist/runtime.js +233 -35
  69. package/package/acode/dist/types.d.ts +1 -1
  70. package/package/acode/dist/types.d.ts.map +1 -1
  71. package/package/acode/package.json +1 -1
  72. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +20 -0
  73. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
  74. package/package/aws-client-agent-mcp/dist/agent-client.js +71 -2
  75. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
  76. package/package/aws-client-agent-mcp/dist/constants.d.ts +4 -1
  77. package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -1
  78. package/package/aws-client-agent-mcp/dist/constants.js +5 -1
  79. package/package/aws-client-agent-mcp/dist/constants.js.map +1 -1
  80. package/package/aws-client-agent-mcp/dist/http-client.d.ts +17 -1
  81. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
  82. package/package/aws-client-agent-mcp/dist/http-client.js +124 -28
  83. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
  84. package/package/aws-client-agent-mcp/dist/http-client.test.js +108 -2
  85. package/package/aws-client-agent-mcp/dist/http-client.test.js.map +1 -1
  86. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +8 -3
  87. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  88. package/package/aws-client-agent-mcp/dist/mcp-server.js +63 -10
  89. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  90. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +47 -0
  91. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  92. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +1 -36
  93. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  94. package/package/aws-client-agent-mcp/dist/mcp-tools.js +3 -169
  95. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  96. package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts +2 -0
  97. package/package/aws-client-agent-mcp/dist/mcp-tools.test.d.ts.map +1 -0
  98. package/package/aws-client-agent-mcp/dist/mcp-tools.test.js +45 -0
  99. package/package/aws-client-agent-mcp/dist/mcp-tools.test.js.map +1 -0
  100. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +11 -0
  101. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -0
  102. package/package/aws-client-agent-mcp/dist/memory-tools.js +144 -0
  103. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -0
  104. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.d.ts.map +1 -1
  105. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js +79 -28
  106. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.js.map +1 -1
  107. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js +35 -0
  108. package/package/aws-client-agent-mcp/dist/runtime-launch-binding.test.js.map +1 -1
  109. package/package/aws-client-agent-mcp/dist/types.d.ts +9 -0
  110. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  111. package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
  112. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
  113. package/package/aws-client-agent-mcp/dist/websocket-client.js +1 -0
  114. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
  115. package/package/aws-client-agent-mcp/dist/websocket-client.test.js +43 -3
  116. package/package/aws-client-agent-mcp/dist/websocket-client.test.js.map +1 -1
  117. package/package.json +1 -1
@@ -8,6 +8,41 @@ import { loadAcodeCommands } from "./commands/commandLoader.js";
8
8
  import { ACodeCommandRegistry } from "./commands/commandRegistry.js";
9
9
  import { loadAcodeConfig, loadAcodeSkills } from "./config.js";
10
10
  import { ACodeHookBus, findDeniedHookResult } from "./hooks/hookBus.js";
11
+ import { isMcpPollingToolName } from "./mcpToolNames.js";
12
+ function cloneChatContentPart(part) {
13
+ if (part.type === "text") {
14
+ return { type: "text", text: part.text };
15
+ }
16
+ return { type: "image_url", image_url: { url: part.image_url.url } };
17
+ }
18
+ function cloneChatToolCall(toolCall) {
19
+ return {
20
+ id: toolCall.id,
21
+ type: "function",
22
+ function: {
23
+ name: toolCall.function.name,
24
+ arguments: toolCall.function.arguments,
25
+ },
26
+ };
27
+ }
28
+ function cloneChatMessage(message) {
29
+ const cloned = {
30
+ role: message.role,
31
+ content: Array.isArray(message.content)
32
+ ? message.content.map(cloneChatContentPart)
33
+ : message.content,
34
+ };
35
+ if (message.tool_call_id) {
36
+ cloned.tool_call_id = message.tool_call_id;
37
+ }
38
+ if (message.tool_calls) {
39
+ cloned.tool_calls = message.tool_calls.map(cloneChatToolCall);
40
+ }
41
+ return cloned;
42
+ }
43
+ function cloneChatConversation(conversation) {
44
+ return conversation.map(cloneChatMessage);
45
+ }
11
46
  function nowIso() {
12
47
  return new Date().toISOString();
13
48
  }
@@ -27,6 +62,7 @@ const DEFAULT_PROVIDER_REQUEST_RETRY_DELAY_MS = 1000;
27
62
  const DEFAULT_MCP_TOOL_CALL_TIMEOUT_MS = 60_000;
28
63
  const DEFAULT_MCP_POLLING_TOOL_CALL_TIMEOUT_MS = 0;
29
64
  const MCP_SDK_MAX_SAFE_TIMEOUT_MS = 2_147_483_647;
65
+ const DEFAULT_BASH_BUILT_IN_TOOL_TIMEOUT_MS = 10 * 60_000 + 2000;
30
66
  const DEFAULT_RUNTIME_SHUTDOWN_TIMEOUT_MS = 10_000;
31
67
  const MAX_INLINE_IMAGE_BYTES = 10 * 1024 * 1024;
32
68
  const MAX_REQUEST_BODY_BYTES = 800 * 1024;
@@ -111,12 +147,6 @@ function estimateContextTokens(systemPrompt, exposedTools) {
111
147
  async function delay(ms) {
112
148
  await new Promise((resolve) => setTimeout(resolve, ms));
113
149
  }
114
- function isMcpPollingToolName(toolName) {
115
- const normalized = toolName.trim().toLowerCase();
116
- return (normalized === "poll_message" ||
117
- normalized === "get_message" ||
118
- normalized.includes("poll_message"));
119
- }
120
150
  function isBoolean(value) {
121
151
  return typeof value === "boolean";
122
152
  }
@@ -509,7 +539,7 @@ function getBuiltInToolTimeoutMs(tool, args, fallbackTimeoutMs) {
509
539
  ? Number(rawTimeout)
510
540
  : NaN;
511
541
  if (!Number.isFinite(numericTimeout) || numericTimeout <= 0) {
512
- return fallbackTimeoutMs;
542
+ return Math.max(fallbackTimeoutMs, DEFAULT_BASH_BUILT_IN_TOOL_TIMEOUT_MS);
513
543
  }
514
544
  return Math.min(Math.floor(numericTimeout), 10 * 60_000) + 2000;
515
545
  }
@@ -749,6 +779,24 @@ function buildRequestHeaders(provider) {
749
779
  }
750
780
  return headers;
751
781
  }
782
+ function redactRequestHeaders(headers) {
783
+ return Object.fromEntries(Object.entries(headers).map(([name, value]) => [
784
+ name,
785
+ isSensitiveRequestHeader(name) ? redactRequestHeaderValue(value) : value,
786
+ ]));
787
+ }
788
+ function isSensitiveRequestHeader(name) {
789
+ const normalized = name.trim().toLowerCase();
790
+ return (normalized === "authorization" ||
791
+ normalized === "api-key" ||
792
+ normalized === "x-api-key" ||
793
+ normalized === "openai-api-key");
794
+ }
795
+ function redactRequestHeaderValue(value) {
796
+ return value.trim().toLowerCase().startsWith("bearer ")
797
+ ? "Bearer ***"
798
+ : "***";
799
+ }
752
800
  function parseSseDataLines(chunk) {
753
801
  return chunk
754
802
  .split(/\r?\n/)
@@ -784,6 +832,7 @@ export class ACodeRuntime extends EventEmitter {
784
832
  constructor(config) {
785
833
  super();
786
834
  this.config = config;
835
+ this.initialConversation = [];
787
836
  this.state = {
788
837
  started: false,
789
838
  terminated: false,
@@ -810,6 +859,8 @@ export class ACodeRuntime extends EventEmitter {
810
859
  this.activeTurn = false;
811
860
  this.abortRequested = false;
812
861
  this.sessionCompleteEmitted = false;
862
+ this.contextVersion = 0;
863
+ this.stopWaiters = new Set();
813
864
  this.hookBus = new ACodeHookBus({
814
865
  sessionId: config.sessionId,
815
866
  onError: (event, error) => {
@@ -856,6 +907,10 @@ export class ACodeRuntime extends EventEmitter {
856
907
  .map((item) => item?.trim())
857
908
  .filter((item) => Boolean(item))
858
909
  .join("\n\n");
910
+ const initialConversation = systemPrompt
911
+ ? [{ role: "system", content: systemPrompt }]
912
+ : [];
913
+ this.initialConversation = cloneChatConversation(initialConversation);
859
914
  this.state = {
860
915
  started: true,
861
916
  terminated: false,
@@ -867,9 +922,7 @@ export class ACodeRuntime extends EventEmitter {
867
922
  exposedTools,
868
923
  commands,
869
924
  commandRegistry,
870
- conversation: systemPrompt
871
- ? [{ role: "system", content: systemPrompt }]
872
- : [],
925
+ conversation: cloneChatConversation(initialConversation),
873
926
  };
874
927
  await this.hookBus.dispatch("SessionStart", {
875
928
  workingDirectory: this.config.workingDirectory,
@@ -926,11 +979,29 @@ export class ACodeRuntime extends EventEmitter {
926
979
  * MCP tool call 则执行工具并继续同一轮,最后输出 assistant 文本与 usage。
927
980
  */
928
981
  async submit(message) {
929
- const queued = this.submitQueue.then(() => this.executeSubmit(message));
982
+ const contextVersion = this.contextVersion;
983
+ const queued = this.submitQueue.then(() => this.executeSubmit(message, contextVersion));
930
984
  this.submitQueue = queued.catch(() => undefined);
931
985
  return queued;
932
986
  }
933
- async executeSubmit(message) {
987
+ /**
988
+ * Reset only the conversation context while keeping the live ACode session,
989
+ * MCP connections, exposed tools, commands, and hooks available.
990
+ */
991
+ async resetContext() {
992
+ if (!this.state.started || this.state.terminated) {
993
+ throw new Error("ACode runtime is not active");
994
+ }
995
+ this.contextVersion += 1;
996
+ this.abortRequested = this.activeTurn;
997
+ this.abortController?.abort();
998
+ this.abortController = null;
999
+ this.state.conversation = cloneChatConversation(this.initialConversation);
1000
+ }
1001
+ isTurnSuperseded(contextVersion) {
1002
+ return contextVersion !== this.contextVersion;
1003
+ }
1004
+ async executeSubmit(message, contextVersion) {
934
1005
  if (!this.state.started || this.state.terminated) {
935
1006
  throw new Error("ACode runtime is not active");
936
1007
  }
@@ -939,6 +1010,9 @@ export class ACodeRuntime extends EventEmitter {
939
1010
  const originalPrompt = message.trim();
940
1011
  try {
941
1012
  const promptHookResults = await this.hookBus.dispatch("UserPromptSubmit", { prompt: originalPrompt });
1013
+ if (this.isTurnSuperseded(contextVersion)) {
1014
+ return;
1015
+ }
942
1016
  const promptDeny = findDeniedHookResult(promptHookResults);
943
1017
  if (promptDeny) {
944
1018
  this.emitAcodeEvent("error", {
@@ -971,8 +1045,14 @@ export class ACodeRuntime extends EventEmitter {
971
1045
  throw new Error("ACode provider/model is not configured for image input. Enable provider.default.models[model].modalities.input including 'image' or options.supportsImageInput=true.");
972
1046
  }
973
1047
  const userContent = await materializeImageContent(parsedContent.content);
1048
+ if (this.isTurnSuperseded(contextVersion)) {
1049
+ return;
1050
+ }
974
1051
  this.state.conversation.push({ role: "user", content: userContent });
975
- const result = await this.runModelTurn(commandAllowedTools);
1052
+ const result = await this.runModelTurn(commandAllowedTools, contextVersion);
1053
+ if (this.isTurnSuperseded(contextVersion)) {
1054
+ return;
1055
+ }
976
1056
  if (result.text && !this.state.provider.stream) {
977
1057
  this.emitAcodeEvent("assistant_delta", { text: result.text });
978
1058
  }
@@ -986,6 +1066,9 @@ export class ACodeRuntime extends EventEmitter {
986
1066
  });
987
1067
  }
988
1068
  catch (error) {
1069
+ if (this.isTurnSuperseded(contextVersion)) {
1070
+ return;
1071
+ }
989
1072
  if (this.abortRequested) {
990
1073
  this.emitAcodeEvent("turn_complete", { aborted: true });
991
1074
  return;
@@ -1012,6 +1095,7 @@ export class ACodeRuntime extends EventEmitter {
1012
1095
  return;
1013
1096
  }
1014
1097
  this.state.terminated = true;
1098
+ this.notifyRuntimeStop();
1015
1099
  this.abortRequested = this.activeTurn;
1016
1100
  this.abortController?.abort();
1017
1101
  this.abortController = null;
@@ -1038,13 +1122,19 @@ export class ACodeRuntime extends EventEmitter {
1038
1122
  ...new Set(configured.map((directory) => directory.trim()).filter(Boolean)),
1039
1123
  ];
1040
1124
  }
1041
- async runModelTurn(commandAllowedTools) {
1125
+ async runModelTurn(commandAllowedTools, contextVersion = this.contextVersion) {
1042
1126
  let finalText = "";
1043
1127
  let finalUsage;
1044
1128
  let finalResponseBody;
1045
1129
  let finalFinishReason;
1046
1130
  for (let step = 0; step < 5; step += 1) {
1131
+ if (this.isTurnSuperseded(contextVersion)) {
1132
+ return { text: "" };
1133
+ }
1047
1134
  const response = await this.requestChatCompletion(commandAllowedTools);
1135
+ if (this.isTurnSuperseded(contextVersion)) {
1136
+ return { text: "" };
1137
+ }
1048
1138
  if (this.state.terminated) {
1049
1139
  throw new Error("ACode runtime was stopped during the active turn");
1050
1140
  }
@@ -1086,7 +1176,10 @@ export class ACodeRuntime extends EventEmitter {
1086
1176
  finishReason: finalFinishReason,
1087
1177
  };
1088
1178
  }
1089
- await this.handleToolCalls(toolCalls, commandAllowedTools);
1179
+ await this.handleToolCalls(toolCalls, commandAllowedTools, contextVersion);
1180
+ if (this.isTurnSuperseded(contextVersion)) {
1181
+ return { text: "" };
1182
+ }
1090
1183
  }
1091
1184
  return {
1092
1185
  text: finalText || "ACode 已达到本轮 MCP 工具调用上限。",
@@ -1120,11 +1213,18 @@ export class ACodeRuntime extends EventEmitter {
1120
1213
  }
1121
1214
  return body;
1122
1215
  };
1216
+ const requestMethod = "POST";
1217
+ const requestUrl = summarizeProviderUrl(baseURL);
1218
+ const requestHeaders = buildRequestHeaders(provider);
1219
+ const redactedRequestHeaders = redactRequestHeaders(requestHeaders);
1123
1220
  const emitAiRequest = (body) => {
1124
1221
  const requestBody = JSON.stringify(body, null, 2);
1125
1222
  this.emitAcodeEvent("ai_request", {
1126
1223
  model: provider.model,
1127
- endpoint: summarizeProviderUrl(baseURL),
1224
+ endpoint: requestUrl,
1225
+ requestMethod,
1226
+ requestUrl,
1227
+ requestHeaders: redactedRequestHeaders,
1128
1228
  stream: provider.stream,
1129
1229
  messageCount: this.state.conversation.length,
1130
1230
  toolCount: allowedTools.length,
@@ -1138,18 +1238,19 @@ export class ACodeRuntime extends EventEmitter {
1138
1238
  const maxAttempts = provider.requestRetryCount + 1;
1139
1239
  let contextOverflowCompacted = false;
1140
1240
  for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
1141
- this.abortController = new AbortController();
1241
+ const requestAbortController = new AbortController();
1242
+ this.abortController = requestAbortController;
1142
1243
  let timedOut = false;
1143
1244
  try {
1144
1245
  return await withTimeout((async () => {
1145
1246
  const response = await withTimeout(fetch(normalizeChatCompletionsUrl(baseURL), {
1146
- method: "POST",
1147
- headers: buildRequestHeaders(provider),
1247
+ method: requestMethod,
1248
+ headers: requestHeaders,
1148
1249
  body: JSON.stringify(body),
1149
- signal: this.abortController?.signal,
1250
+ signal: requestAbortController.signal,
1150
1251
  }), provider.requestTimeoutMs, "ACode provider request", () => {
1151
1252
  timedOut = true;
1152
- this.abortController?.abort();
1253
+ requestAbortController.abort();
1153
1254
  });
1154
1255
  if (!response.ok) {
1155
1256
  throw new Error(`ACode provider request failed: ${response.status} ${await response.text()}`);
@@ -1157,11 +1258,11 @@ export class ACodeRuntime extends EventEmitter {
1157
1258
  const contentType = response.headers?.get?.("content-type") || "";
1158
1259
  if (provider.stream &&
1159
1260
  contentType.toLowerCase().includes("text/event-stream")) {
1160
- return await this.readChatCompletionStream(response, provider.requestTimeoutMs);
1261
+ return await this.readChatCompletionStream(response, provider.requestTimeoutMs, requestAbortController);
1161
1262
  }
1162
1263
  const payload = (await withTimeout(response.json(), provider.requestTimeoutMs, "ACode provider response body", () => {
1163
1264
  timedOut = true;
1164
- this.abortController?.abort();
1265
+ requestAbortController.abort();
1165
1266
  }));
1166
1267
  return isRecord(payload) ? payload : {};
1167
1268
  })(), 0, "ACode provider request");
@@ -1207,12 +1308,14 @@ export class ACodeRuntime extends EventEmitter {
1207
1308
  await delay(DEFAULT_PROVIDER_REQUEST_RETRY_DELAY_MS * attempt);
1208
1309
  }
1209
1310
  finally {
1210
- this.abortController = null;
1311
+ if (this.abortController === requestAbortController) {
1312
+ this.abortController = null;
1313
+ }
1211
1314
  }
1212
1315
  }
1213
1316
  throw new Error("ACode provider request failed after all retries");
1214
1317
  }
1215
- async readChatCompletionStream(response, idleTimeoutMs) {
1318
+ async readChatCompletionStream(response, idleTimeoutMs, requestAbortController) {
1216
1319
  if (!response.body) {
1217
1320
  throw new Error("ACode provider stream response has no body");
1218
1321
  }
@@ -1250,7 +1353,7 @@ export class ACodeRuntime extends EventEmitter {
1250
1353
  }
1251
1354
  };
1252
1355
  while (true) {
1253
- const { done, value } = await withTimeout(reader.read(), idleTimeoutMs, "ACode provider stream idle", () => this.abortController?.abort());
1356
+ const { done, value } = await withTimeout(reader.read(), idleTimeoutMs, "ACode provider stream idle", () => requestAbortController?.abort());
1254
1357
  if (done) {
1255
1358
  break;
1256
1359
  }
@@ -1276,8 +1379,11 @@ export class ACodeRuntime extends EventEmitter {
1276
1379
  ],
1277
1380
  };
1278
1381
  }
1279
- async handleToolCalls(toolCalls, commandAllowedTools) {
1382
+ async handleToolCalls(toolCalls, commandAllowedTools, contextVersion = this.contextVersion) {
1280
1383
  for (const toolCall of toolCalls) {
1384
+ if (this.isTurnSuperseded(contextVersion)) {
1385
+ return;
1386
+ }
1281
1387
  const tool = this.state.exposedTools.find((item) => item.exposedName === toolCall.function.name);
1282
1388
  if (!tool) {
1283
1389
  this.state.conversation.push({
@@ -1297,6 +1403,9 @@ export class ACodeRuntime extends EventEmitter {
1297
1403
  exposedName: tool.exposedName,
1298
1404
  arguments: toolArguments,
1299
1405
  });
1406
+ if (this.isTurnSuperseded(contextVersion)) {
1407
+ return;
1408
+ }
1300
1409
  const denied = findDeniedHookResult(preResults);
1301
1410
  if (denied) {
1302
1411
  throw new Error(denied.message ||
@@ -1311,13 +1420,36 @@ export class ACodeRuntime extends EventEmitter {
1311
1420
  arguments: toolArguments,
1312
1421
  argumentsPreview: summarizeToolArguments(toolArguments),
1313
1422
  });
1314
- const result = await withTimeout(tool.execute(toolArguments), getBuiltInToolTimeoutMs(tool, toolArguments, this.state.provider.mcpToolTimeoutMs), `ACode built-in tool ${tool.toolName}`);
1423
+ const result = await withTimeout(tool.execute(toolArguments, {
1424
+ onOutput: (outputEvent) => {
1425
+ this.emitAcodeEvent("command_output", {
1426
+ server: "builtin",
1427
+ tool: tool.toolName,
1428
+ exposedName: tool.exposedName,
1429
+ toolUseId: toolCall.id,
1430
+ stream: outputEvent.stream,
1431
+ text: outputEvent.text,
1432
+ sequence: outputEvent.sequence,
1433
+ cwd: outputEvent.cwd,
1434
+ commandLineCount: outputEvent.commandLineCount,
1435
+ ...(outputEvent.commandFilePath
1436
+ ? { commandFilePath: outputEvent.commandFilePath }
1437
+ : {}),
1438
+ });
1439
+ },
1440
+ }), getBuiltInToolTimeoutMs(tool, toolArguments, this.state.provider.mcpToolTimeoutMs), `ACode built-in tool ${tool.toolName}`);
1441
+ if (this.isTurnSuperseded(contextVersion)) {
1442
+ return;
1443
+ }
1315
1444
  await this.hookBus.dispatch("PostToolUse", {
1316
1445
  source: "builtin",
1317
1446
  toolName: tool.toolName,
1318
1447
  exposedName: tool.exposedName,
1319
1448
  result: toToolResultText(result),
1320
1449
  });
1450
+ if (this.isTurnSuperseded(contextVersion)) {
1451
+ return;
1452
+ }
1321
1453
  const resultText = toToolResultText(result);
1322
1454
  this.emitAcodeEvent("mcp_status", {
1323
1455
  action: "tool_result",
@@ -1330,7 +1462,7 @@ export class ACodeRuntime extends EventEmitter {
1330
1462
  tool_call_id: toolCall.id,
1331
1463
  content: resultText,
1332
1464
  });
1333
- await this.appendSyntheticMultimodalUserMessage(resultText);
1465
+ await this.appendSyntheticMultimodalUserMessage(resultText, contextVersion);
1334
1466
  continue;
1335
1467
  }
1336
1468
  const connection = this.state.mcpConnections.find((item) => item.serverName === tool.serverName);
@@ -1351,6 +1483,9 @@ export class ACodeRuntime extends EventEmitter {
1351
1483
  exposedName: tool.exposedName,
1352
1484
  arguments: toolArguments,
1353
1485
  });
1486
+ if (this.isTurnSuperseded(contextVersion)) {
1487
+ return;
1488
+ }
1354
1489
  const denied = findDeniedHookResult(preResults);
1355
1490
  if (denied) {
1356
1491
  throw new Error(denied.message || `ACode tool denied by hook: ${tool.exposedName}`);
@@ -1369,6 +1504,9 @@ export class ACodeRuntime extends EventEmitter {
1369
1504
  ? this.state.provider.mcpPollingToolTimeoutMs
1370
1505
  : this.state.provider.mcpToolTimeoutMs;
1371
1506
  const result = await this.callMcpToolWithTimeout(connection, tool, toolArguments, toolTimeoutMs, isPollingTool);
1507
+ if (this.isTurnSuperseded(contextVersion)) {
1508
+ return;
1509
+ }
1372
1510
  await this.hookBus.dispatch("PostToolUse", {
1373
1511
  source: "mcp",
1374
1512
  serverName: tool.serverName,
@@ -1376,6 +1514,9 @@ export class ACodeRuntime extends EventEmitter {
1376
1514
  exposedName: tool.exposedName,
1377
1515
  result: toToolResultText(result),
1378
1516
  });
1517
+ if (this.isTurnSuperseded(contextVersion)) {
1518
+ return;
1519
+ }
1379
1520
  const resultText = toToolResultText(result);
1380
1521
  this.emitAcodeEvent("mcp_status", {
1381
1522
  action: "tool_result",
@@ -1388,9 +1529,15 @@ export class ACodeRuntime extends EventEmitter {
1388
1529
  tool_call_id: toolCall.id,
1389
1530
  content: resultText,
1390
1531
  });
1391
- await this.appendSyntheticMultimodalUserMessage(resultText);
1532
+ await this.appendSyntheticMultimodalUserMessage(resultText, contextVersion);
1392
1533
  }
1393
1534
  catch (error) {
1535
+ if (this.isTurnSuperseded(contextVersion)) {
1536
+ return;
1537
+ }
1538
+ if (this.abortRequested || this.state.terminated) {
1539
+ throw error instanceof Error ? error : new Error(String(error));
1540
+ }
1394
1541
  this.appendToolFailureResult(toolCall, tool, error);
1395
1542
  }
1396
1543
  }
@@ -1398,11 +1545,15 @@ export class ACodeRuntime extends EventEmitter {
1398
1545
  async callMcpToolWithTimeout(connection, tool, toolArguments, timeoutMs, retrySdkTimeout) {
1399
1546
  const sdkTimeout = timeoutMs > 0 ? timeoutMs : MCP_SDK_MAX_SAFE_TIMEOUT_MS;
1400
1547
  while (true) {
1548
+ const stopWaiter = this.createRuntimeStopWaiter(`ACode MCP tool ${tool.serverName}/${tool.toolName}`);
1401
1549
  try {
1402
- return await withTimeout(connection.client.callTool({
1403
- name: tool.toolName,
1404
- arguments: toolArguments,
1405
- }, undefined, { timeout: sdkTimeout }), timeoutMs, `ACode MCP tool ${tool.serverName}/${tool.toolName}`);
1550
+ return await withTimeout(Promise.race([
1551
+ connection.client.callTool({
1552
+ name: tool.toolName,
1553
+ arguments: toolArguments,
1554
+ }, undefined, { timeout: sdkTimeout }),
1555
+ stopWaiter.promise,
1556
+ ]), timeoutMs, `ACode MCP tool ${tool.serverName}/${tool.toolName}`);
1406
1557
  }
1407
1558
  catch (error) {
1408
1559
  if (!retrySdkTimeout ||
@@ -1414,9 +1565,53 @@ export class ACodeRuntime extends EventEmitter {
1414
1565
  message: `ACode MCP polling tool ${tool.serverName}/${tool.toolName} reached the MCP SDK timeout window and will continue polling.`,
1415
1566
  });
1416
1567
  }
1568
+ finally {
1569
+ stopWaiter.cancel();
1570
+ }
1417
1571
  }
1418
1572
  }
1419
- async appendSyntheticMultimodalUserMessage(toolResultText) {
1573
+ /**
1574
+ * Build a one-shot waiter that rejects long-running MCP calls when the runtime stops.
1575
+ * Main flow: register a stop callback -> race it with the SDK call -> remove it after either side settles.
1576
+ */
1577
+ createRuntimeStopWaiter(label) {
1578
+ if (this.state.terminated) {
1579
+ return {
1580
+ promise: Promise.reject(new Error(`${label} interrupted because ACode runtime stopped`)),
1581
+ cancel: () => undefined,
1582
+ };
1583
+ }
1584
+ let notifyStop;
1585
+ const promise = new Promise((_resolve, reject) => {
1586
+ notifyStop = () => {
1587
+ reject(new Error(`${label} interrupted because ACode runtime stopped`));
1588
+ };
1589
+ });
1590
+ if (!notifyStop) {
1591
+ return { promise, cancel: () => undefined };
1592
+ }
1593
+ this.stopWaiters.add(notifyStop);
1594
+ return {
1595
+ promise,
1596
+ cancel: () => {
1597
+ if (notifyStop) {
1598
+ this.stopWaiters.delete(notifyStop);
1599
+ }
1600
+ },
1601
+ };
1602
+ }
1603
+ /**
1604
+ * Notify and clear every pending runtime-stop waiter.
1605
+ * Main flow: snapshot callbacks -> clear the set -> reject each pending MCP race exactly once.
1606
+ */
1607
+ notifyRuntimeStop() {
1608
+ const waiters = [...this.stopWaiters];
1609
+ this.stopWaiters.clear();
1610
+ for (const notifyStop of waiters) {
1611
+ notifyStop();
1612
+ }
1613
+ }
1614
+ async appendSyntheticMultimodalUserMessage(toolResultText, contextVersion = this.contextVersion) {
1420
1615
  const parsedContent = parseAttachmentMessage(toolResultText);
1421
1616
  if (!parsedContent.hasImages) {
1422
1617
  return;
@@ -1428,6 +1623,9 @@ export class ACodeRuntime extends EventEmitter {
1428
1623
  return;
1429
1624
  }
1430
1625
  const content = await materializeImageContent(parsedContent.content);
1626
+ if (this.isTurnSuperseded(contextVersion)) {
1627
+ return;
1628
+ }
1431
1629
  this.state.conversation.push({ role: "user", content });
1432
1630
  }
1433
1631
  appendToolFailureResult(toolCall, tool, error) {
@@ -45,7 +45,7 @@ export interface ACodeSkillMetadata {
45
45
  description?: string;
46
46
  directory: string;
47
47
  }
48
- export type ACodeEventType = "session_started" | "ai_request" | "thinking_delta" | "assistant_delta" | "command_status" | "mcp_status" | "skill_status" | "warning" | "turn_complete" | "session_complete" | "error";
48
+ export type ACodeEventType = "session_started" | "ai_request" | "thinking_delta" | "assistant_delta" | "command_output" | "command_status" | "mcp_status" | "skill_status" | "warning" | "turn_complete" | "session_complete" | "error";
49
49
  export interface ACodeEvent {
50
50
  type: ACodeEventType;
51
51
  sessionId: string;
@@ -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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"}
@@ -9,7 +9,7 @@
9
9
  },
10
10
  "scripts": {
11
11
  "build": "tsc -p tsconfig.json",
12
- "test": "tsx --test src/runtime.test.ts src/commands/commandParser.test.ts",
12
+ "test": "tsx --test src/runtime.test.ts src/mcpToolNames.test.ts src/commands/commandParser.test.ts src/builtins/shellCommandRunner.test.ts",
13
13
  "typecheck": "tsc -p tsconfig.json --noEmit"
14
14
  },
15
15
  "dependencies": {
@@ -15,6 +15,7 @@ export declare class AgentClient {
15
15
  private displayName;
16
16
  private projectName;
17
17
  private isRunning;
18
+ private isDegradedMode;
18
19
  private messageHandler;
19
20
  private profileHandler;
20
21
  private pollTimer;
@@ -194,6 +195,25 @@ export declare class AgentClient {
194
195
  };
195
196
  getAgentConfig(): AgentConfig;
196
197
  reloadConfig(): void;
198
+ /**
199
+ * 进入降级模式
200
+ * 当注册失败时,Agent 可以降级运行,等待后续重试注册
201
+ */
202
+ enterDegradedMode(): void;
203
+ /**
204
+ * 退出降级模式
205
+ * 当重连成功时,退出降级模式
206
+ */
207
+ exitDegradedMode(): void;
208
+ /**
209
+ * 是否处于降级模式
210
+ */
211
+ isInDegradedMode(): boolean;
212
+ /**
213
+ * 降级模式下重试注册
214
+ * 在后台持续尝试重新注册到调度中心
215
+ */
216
+ retryRegistrationInBackground(retryIntervalMs: number, maxRetries: number): Promise<void>;
197
217
  /**
198
218
  * 初始化状态报告器
199
219
  */
@@ -1 +1 @@
1
- {"version":3,"file":"agent-client.d.ts","sourceRoot":"","sources":["../src/agent-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-client.d.ts","sourceRoot":"","sources":["../src/agent-client.ts"],"names":[],"mappings":"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"}