aws-runtime-bridge 1.9.41 → 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.
@@ -114,6 +114,12 @@ const DEFAULT_RUNTIME_SHUTDOWN_TIMEOUT_MS = 10_000;
114
114
  * 导致 while(true) 无延迟重 poll,引发状态快速跳动(思考→MCP→跳过)最终连接丢失。
115
115
  */
116
116
  const DELEGATE_REPOLL_DELAY_MS = 5_000;
117
+ /**
118
+ * 子 agent 完成(completed/failed/cancelled)后,对应 memory URI 的委托冷却窗口。
119
+ * 在此期间即使 memory 仍处 updating / 过期 / 容量超限,运行层也不会再次 spawn 子任务,
120
+ * 仅保留巡检。用于切断「委托完成(但 memory 未真正处理)→ 下一轮 poll 又 spawn 相同子任务」的循环。
121
+ */
122
+ const MEMORY_DELEGATE_COOLDOWN_MS = 10 * 60 * 1000;
117
123
  const MAX_INLINE_IMAGE_BYTES = 10 * 1024 * 1024;
118
124
  const MAX_REQUEST_BODY_BYTES = 800 * 1024;
119
125
  /**
@@ -1001,6 +1007,14 @@ export class ACodeRuntime extends EventEmitter {
1001
1007
  * 子 agent 完成后通过 SubAgentManager 事件回调移除对应 URI。
1002
1008
  */
1003
1009
  this.pendingMemorySubAgents = new Map();
1010
+ /**
1011
+ * memory 委托冷却表(「已解决/已处理」守卫,区别于 pendingMemorySubAgents 的「进行中」守卫)。
1012
+ * key = memory URI,value = 冷却到期时间戳(ms)。
1013
+ * 子 agent 进入终态时写入;冷却期内即使 memory 仍待处理也不再 spawn 新子任务。
1014
+ * 这是切断「委托完成→复发」循环的关键:原实现只有进行中守卫,子 agent 一结束 URI 立即释放,
1015
+ * 导致下一轮 poll 对 sticky 的 updating memory 再次委托。
1016
+ */
1017
+ this.memoryDelegateCooldownUntil = new Map();
1004
1018
  this.submitQueue = Promise.resolve();
1005
1019
  this.activeTurn = false;
1006
1020
  this.abortRequested = false;
@@ -2817,14 +2831,22 @@ export class ACodeRuntime extends EventEmitter {
2817
2831
  }
2818
2832
  catch (err) {
2819
2833
  runtimeDebugLog(`[ACodeRuntime] recheckMemoryDelegate failed (type=${type}, turn=${turn}): ` +
2820
- `${err instanceof Error ? err.message : String(err)}, treating as done`);
2821
- return { done: true };
2834
+ `${err instanceof Error ? err.message : String(err)}, treating as NOT done (retry via recheck loop)`);
2835
+ // 校验异常(读取失败/超时/服务端错误)一律判「未完成」,由 startWithRecheck
2836
+ // 重试循环(最多 3 次)兜底;既不提前释放 URI,也不会因一次抖动就把子 agent 判为完成。
2837
+ return {
2838
+ done: false,
2839
+ continueMessage: `经检查,无法确认以下 memory 是否已处理(校验异常:${err instanceof Error ? err.message : String(err)})。` +
2840
+ `请重新执行验证步骤(read_memory / get_memory_stats)确认真实状态后再继续。`,
2841
+ };
2822
2842
  }
2823
2843
  }
2824
2844
  /**
2825
2845
  * 通过 MCP read_memory 工具读取单条 memory 记录。
2826
2846
  * 注入 _aws_sub_agent=true 避免状态上报污染父 agent 时间线。
2827
- * 返回 null 表示 memory 不存在或读取失败。
2847
+ * 返回 null 表示 memory 明确不存在(服务端返回 null/undefined 或非对象)。
2848
+ * 读取/解析异常(网络抖动、超时、服务端错误)会向上抛出,交由 recheckMemoryDelegate
2849
+ * 统一判定为「未完成」,避免被误当作「已处理」。
2828
2850
  */
2829
2851
  async readMemoryViaMcp(connection, uri) {
2830
2852
  try {
@@ -2840,8 +2862,11 @@ export class ACodeRuntime extends EventEmitter {
2840
2862
  return null;
2841
2863
  return parsed;
2842
2864
  }
2843
- catch {
2844
- return null;
2865
+ catch (err) {
2866
+ // 读取/解析异常(网络抖动、超时、服务端错误)应向上传播,交由 recheckMemoryDelegate
2867
+ // 统一判定为「未完成」(done:false),而非被误当作「memory 不存在 = 已处理」。
2868
+ // 仅当服务端正返回明确的 null/undefined 时才表示 memory 不存在。
2869
+ throw err;
2845
2870
  }
2846
2871
  }
2847
2872
  /** recheck memory_file_change:检查 memory_status 是否仍为 updating */
@@ -2907,8 +2932,12 @@ export class ACodeRuntime extends EventEmitter {
2907
2932
  stats = JSON.parse(text);
2908
2933
  }
2909
2934
  catch {
2910
- // stats 查询失败 → 视为完成
2911
- return { done: true };
2935
+ // stats 查询失败 → 保守判为「未完成」,避免一次抖动就把清理判为完成并释放 URI。
2936
+ // 交由 startWithRecheck 的重试循环兜底;与 recheckMemoryDelegate 中央 catch 行为一致。
2937
+ return {
2938
+ done: false,
2939
+ continueMessage: 'get_memory_stats 查询失败,无法确认容量是否已达标,请重新验证后再继续。',
2940
+ };
2912
2941
  }
2913
2942
  const byType = (stats.by_type ?? {});
2914
2943
  const stillExceeded = [];
@@ -3046,11 +3075,22 @@ ${urisText}
3046
3075
  const delegate = msg._acodeAutoDelegate;
3047
3076
  if (delegate && (delegate.type === 'memory_expiration' || delegate.type === 'memory_file_change' || delegate.type === 'memory_cleanup')) {
3048
3077
  delegateEncountered++;
3049
- // 过滤掉已在处理中的 URI
3050
- const newUris = delegate.uris.filter(uri => !this.pendingMemorySubAgents.has(uri));
3078
+ // 过滤掉:① 正在处理中的 URI;② 处于冷却期内的 URI(子 agent 刚结束,尚未到重新委托时机)
3079
+ const nowForFilter = Date.now();
3080
+ const inProgressCount = delegate.uris.filter(uri => this.pendingMemorySubAgents.has(uri)).length;
3081
+ const cooledCount = delegate.uris.filter(uri => {
3082
+ const until = this.memoryDelegateCooldownUntil.get(uri);
3083
+ return until !== undefined && nowForFilter < until;
3084
+ }).length;
3085
+ const newUris = delegate.uris.filter(uri => {
3086
+ if (this.pendingMemorySubAgents.has(uri))
3087
+ return false;
3088
+ const until = this.memoryDelegateCooldownUntil.get(uri);
3089
+ return !(until !== undefined && nowForFilter < until);
3090
+ });
3051
3091
  if (newUris.length === 0) {
3052
- // 所有 URI 都在处理中,跳过此通知(不委托也不返回给主 agent)
3053
- runtimeDebugLog(`[ACodeRuntime] Memory ${delegate.type} skipped: all ${delegate.uris.length} URIs already being processed by sub-agents`);
3092
+ // 所有 URI 都在处理中或冷却中,跳过此通知(不委托也不返回给主 agent)
3093
+ runtimeDebugLog(`[ACodeRuntime] Memory ${delegate.type} skipped: ${inProgressCount} in-progress, ${cooledCount} in cooldown (total ${delegate.uris.length} URIs)`);
3054
3094
  continue;
3055
3095
  }
3056
3096
  // 用过滤后的 URI 构造 prompt
@@ -3081,11 +3121,22 @@ ${urisText}
3081
3121
  manager.subscribe(subId, () => {
3082
3122
  const entry = manager.getSubAgent(subId);
3083
3123
  if (entry && (entry.status === 'completed' || entry.status === 'failed' || entry.status === 'cancelled')) {
3124
+ const finishTs = Date.now();
3084
3125
  for (const uri of uriSet) {
3085
3126
  if (this.pendingMemorySubAgents.get(uri) === subId) {
3086
3127
  this.pendingMemorySubAgents.delete(uri);
3087
3128
  }
3129
+ // 写入冷却窗口:子 agent 终态后一段时间内不再重新委托,切断「完成→复发」循环。
3130
+ // 即使 memory 仍处 updating/过期/超限,冷却期内也仅保留巡检,不 spawn 新子任务。
3131
+ this.memoryDelegateCooldownUntil.set(uri, finishTs + MEMORY_DELEGATE_COOLDOWN_MS);
3132
+ }
3133
+ // 惰性清理过期的冷却条目,避免内存堆积
3134
+ for (const [uri, until] of this.memoryDelegateCooldownUntil) {
3135
+ if (until <= finishTs) {
3136
+ this.memoryDelegateCooldownUntil.delete(uri);
3137
+ }
3088
3138
  }
3139
+ runtimeDebugLog(`[ACodeRuntime] Memory delegate sub-agent ${subId} finished (${entry.status}), ${uriSet.size} URI(s) entered ${MEMORY_DELEGATE_COOLDOWN_MS}ms cooldown`);
3089
3140
  }
3090
3141
  });
3091
3142
  // 使用带 recheck 循环的启动方式:
@@ -1 +1 @@
1
- {"version":3,"file":"sub-agent-tools.d.ts","sourceRoot":"","sources":["../src/sub-agent-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAc,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEzE;;;;;;;;;GASG;AACH,MAAM,WAAW,qBAAqB;IACpC,mCAAmC;IACnC,aAAa,EAAE,CAAC,IAAI,EAAE;QACpB,YAAY,EAAE,YAAY,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEjC,4BAA4B;IAC5B,aAAa,EAAE,MAAM,OAAO,CAAC;QAC3B,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAC7B,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;KAC9B,CAAC,CAAC;IAEH,uBAAuB;IACvB,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAErE,4BAA4B;IAC5B,cAAc,EAAE,CACd,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,CAAC,EAAE,MAAM,KACf,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC,CAAC;IAE/F,iBAAiB;IACjB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,wBAAwB;AACxB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yBAAyB;AACzB,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,UAAU,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9C,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AA4BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAsEhF;AAeD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAsDrF;AAiBD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAoGzF;AAsBD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAsFtF;AAcD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CA2CrF;AAID,uDAAuD;AACvD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,EAAE,CAQnF"}
1
+ {"version":3,"file":"sub-agent-tools.d.ts","sourceRoot":"","sources":["../src/sub-agent-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAc,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEzE;;;;;;;;;GASG;AACH,MAAM,WAAW,qBAAqB;IACpC,mCAAmC;IACnC,aAAa,EAAE,CAAC,IAAI,EAAE;QACpB,YAAY,EAAE,YAAY,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEjC,4BAA4B;IAC5B,aAAa,EAAE,MAAM,OAAO,CAAC;QAC3B,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAC7B,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;KAC9B,CAAC,CAAC;IAEH,uBAAuB;IACvB,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAErE,4BAA4B;IAC5B,cAAc,EAAE,CACd,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,CAAC,EAAE,MAAM,KACf,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC,CAAC;IAE/F,iBAAiB;IACjB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,wBAAwB;AACxB,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,yBAAyB;AACzB,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,UAAU,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9C,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AA4BD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAuEhF;AAeD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAsDrF;AAiBD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAoGzF;AAsBD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CAsFtF;AAcD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,CA2CrF;AAID,uDAAuD;AACvD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,qBAAqB,GAAG,gBAAgB,EAAE,CAQnF"}
@@ -7,8 +7,8 @@ Use this tool to:
7
7
  3. Keep the main context window focused by offloading detailed work
8
8
 
9
9
  Available subagent types:
10
+ - "explore" (default): Read-only agent for codebase exploration (grep, glob, read, bash, web search)
10
11
  - "general": Full-featured agent for executing multi-step tasks (file ops, bash, etc.)
11
- - "explore": Read-only agent for codebase exploration (grep, glob, read, bash, web search)
12
12
 
13
13
  This tool is NON-BLOCKING: it returns immediately with a subId after spawn.
14
14
  The sub-agent starts automatically and runs in the background.
@@ -42,15 +42,16 @@ export function createSubAgentTool(deps) {
42
42
  subagent_type: {
43
43
  type: "string",
44
44
  enum: ["general", "explore"],
45
- description: "Type of specialized agent: 'general' for multi-step tasks, 'explore' for read-only codebase exploration.",
45
+ description: "Type of specialized agent: 'explore' (default) for read-only codebase exploration, 'general' for multi-step tasks (file ops, bash, etc.). When in doubt, use 'explore'.",
46
+ default: "explore",
46
47
  },
47
48
  },
48
- required: ["description", "prompt", "subagent_type"],
49
+ required: ["description", "prompt"],
49
50
  },
50
51
  async execute(args) {
51
52
  const description = typeof args.description === "string" ? args.description.trim() : "";
52
53
  const prompt = typeof args.prompt === "string" ? args.prompt.trim() : "";
53
- const subagentType = args.subagent_type;
54
+ const subagentType = args.subagent_type || "explore";
54
55
  if (!description) {
55
56
  return {
56
57
  title: "sub_agent validation error",
@@ -24,6 +24,16 @@ export declare class McpServer {
24
24
  * 进程重启后自动清空(届时重新检测)。
25
25
  */
26
26
  private notifiedFileChangeMemoryIds;
27
+ /**
28
+ * Step1「memory 仍处于 updating 状态」提醒的冷却时间戳表。
29
+ * key = memory URI,value = 上次发送「请继续更新」提醒的时间戳。
30
+ * 用于避免 buildMemoryFileChangeNotification 在 polling 周期内对 sticky 的 updating
31
+ * memory 每轮都裸发 _acodeAutoDelegate(进而导致运行层反复 spawn 相同子任务)。
32
+ * 冷却窗口内不再发出该提醒;窗口到期后若 memory 仍未处理,才会重新委托。
33
+ */
34
+ private lastUpdatePendingNotifyAt;
35
+ /** Step1「仍 updating」提醒的冷却窗口(5 分钟)。冷却期内不重复裸发 _acodeAutoDelegate。 */
36
+ private static readonly UPDATE_PENDING_NOTIFY_COOLDOWN_MS;
27
37
  /**
28
38
  * 本地缓存 listable 记忆(recently_memory/agent_memory)的文件 MD5 map。
29
39
  * 服务端(Java 后端)不持久化 file_md5_map 字段,listByType 返回的记录该字段为 undefined。
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -57,6 +57,16 @@ export class McpServer {
57
57
  * 进程重启后自动清空(届时重新检测)。
58
58
  */
59
59
  notifiedFileChangeMemoryIds = new Map();
60
+ /**
61
+ * Step1「memory 仍处于 updating 状态」提醒的冷却时间戳表。
62
+ * key = memory URI,value = 上次发送「请继续更新」提醒的时间戳。
63
+ * 用于避免 buildMemoryFileChangeNotification 在 polling 周期内对 sticky 的 updating
64
+ * memory 每轮都裸发 _acodeAutoDelegate(进而导致运行层反复 spawn 相同子任务)。
65
+ * 冷却窗口内不再发出该提醒;窗口到期后若 memory 仍未处理,才会重新委托。
66
+ */
67
+ lastUpdatePendingNotifyAt = new Map();
68
+ /** Step1「仍 updating」提醒的冷却窗口(5 分钟)。冷却期内不重复裸发 _acodeAutoDelegate。 */
69
+ static UPDATE_PENDING_NOTIFY_COOLDOWN_MS = 5 * 60 * 1000;
60
70
  /**
61
71
  * 本地缓存 listable 记忆(recently_memory/agent_memory)的文件 MD5 map。
62
72
  * 服务端(Java 后端)不持久化 file_md5_map 字段,listByType 返回的记录该字段为 undefined。
@@ -1902,11 +1912,31 @@ export class McpServer {
1902
1912
  },
1903
1913
  };
1904
1914
  }
1905
- const memoryList = updatingMemories
1915
+ // Step1「仍 updating」提醒去重:sticky 的 updating memory 若不在冷却窗口内才发提醒,
1916
+ // 否则本轮直接返回 null,避免每轮 poll 都裸发 _acodeAutoDelegate 触发运行层反复 spawn 子任务。
1917
+ const now = Date.now();
1918
+ const pendingToNotify = updatingMemories.filter(m => {
1919
+ const last = this.lastUpdatePendingNotifyAt.get(m.uri) ?? 0;
1920
+ return now - last >= McpServer.UPDATE_PENDING_NOTIFY_COOLDOWN_MS;
1921
+ });
1922
+ // 清理已不在 updating 列表中的过期冷却记录
1923
+ for (const uri of this.lastUpdatePendingNotifyAt.keys()) {
1924
+ if (!updatingMemories.some(m => m.uri === uri)) {
1925
+ this.lastUpdatePendingNotifyAt.delete(uri);
1926
+ }
1927
+ }
1928
+ if (pendingToNotify.length === 0) {
1929
+ logger.info(`[McpServer] 文件变更检测 Step1: ${updatingMemories.length} 个 updating memory 均处于冷却窗口内,跳过提醒`);
1930
+ return null;
1931
+ }
1932
+ for (const m of pendingToNotify) {
1933
+ this.lastUpdatePendingNotifyAt.set(m.uri, now);
1934
+ }
1935
+ const memoryList = pendingToNotify
1906
1936
  .slice(0, 5)
1907
1937
  .map(m => `- ${m.uri} (文件: ${m.bound_files?.join(', ') || '未知'})`)
1908
1938
  .join('\n');
1909
- logger.info(`[McpServer] 文件变更检测 Step1: ${updatingMemories.length} 个 updating memory 待更新,租约已续期`);
1939
+ logger.info(`[McpServer] 文件变更检测 Step1: ${pendingToNotify.length}/${updatingMemories.length} 个 updating memory 待更新(其余冷却中),租约已续期`);
1910
1940
  return {
1911
1941
  msgId: `memory-update-pending-${Date.now()}`,
1912
1942
  senderId: "MCP-System",
@@ -1918,7 +1948,7 @@ export class McpServer {
1918
1948
  timestamp: new Date().toISOString(),
1919
1949
  _acodeAutoDelegate: {
1920
1950
  type: 'memory_file_change',
1921
- uris: updatingMemories.slice(0, 5).map(m => m.uri),
1951
+ uris: pendingToNotify.slice(0, 5).map(m => m.uri),
1922
1952
  },
1923
1953
  };
1924
1954
  }