aws-runtime-bridge 1.9.58 → 1.9.60
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/routes/sub-agents.js +23 -4
- package/package/acode/dist/fs-utils.d.ts +12 -0
- package/package/acode/dist/fs-utils.d.ts.map +1 -0
- package/package/acode/dist/fs-utils.js +58 -0
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +67 -8
- package/package/acode/dist/sub-agent-manager.d.ts.map +1 -1
- package/package/acode/dist/sub-agent-manager.js +149 -51
- package/package/acode/dist/sub-agent-store.d.ts +35 -5
- package/package/acode/dist/sub-agent-store.d.ts.map +1 -1
- package/package/acode/dist/sub-agent-store.js +79 -16
- package/package/acode/dist/todo-store.d.ts +1 -0
- package/package/acode/dist/todo-store.d.ts.map +1 -1
- package/package/acode/dist/todo-store.js +6 -1
- package/package/acode/dist/types.d.ts +11 -0
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +21 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +105 -7
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +4 -2
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +26 -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.json +1 -1
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
import type { SubAgentDocument, SubAgentEvent, SubAgentRecord } from "./sub-agent-types.js";
|
|
2
2
|
/**
|
|
3
3
|
* Sub Agent JSON 文件存储,按 agentId 隔离。
|
|
4
|
-
* 文件路径:{homedir}/.acode/sub-agents/{agentId}.json
|
|
5
4
|
*
|
|
6
|
-
*
|
|
5
|
+
* 文件布局:
|
|
6
|
+
* - 主记录文件:{homedir}/.acode/sub-agents/{agentId}.json
|
|
7
|
+
* 存放 SubAgentRecord[](不含 events 字段,避免全量读写阻塞终态写入)
|
|
8
|
+
* - 事件日志文件:{homedir}/.acode/sub-agents/{agentId}.{subId}.events.jsonl
|
|
9
|
+
* 每行一个 SubAgentEvent,append-only,O(1) 追加,不进主 writeChain
|
|
10
|
+
*
|
|
11
|
+
* 设计要点:
|
|
7
12
|
* - 不依赖 agent 工作目录,避免 workspacePath 错误时读取失败
|
|
8
13
|
* - sub-agent 跟随 agent(agentId),不跟随项目工作区
|
|
9
|
-
* -
|
|
14
|
+
* - 主记录写操作通过 Promise 链串行化,tmp + rename 原子替换
|
|
15
|
+
* (rename 在 Windows 上目标被打开时会 EPERM,使用 renameWithRetry 短退避重试)
|
|
16
|
+
* - events 走独立文件,避免 tool_start/tool_end 高频落盘阻塞终态 updateStatus
|
|
17
|
+
* (历史教训:events 与 updateStatus 共用 writeChain 时,memory delegate
|
|
18
|
+
* 一次跑数十个工具调用,appendEvent 排队导致 updateStatus 超 5s 超时,
|
|
19
|
+
* 内存已翻终态但 store 仍 running,触发 "status mismatch" 兜底误报)
|
|
10
20
|
*
|
|
11
21
|
* 历史保留策略:全部 sub-agent 记录都持久化(含 completed/failed/cancelled),
|
|
12
22
|
* 按 startedAt 倒序排列。dashboard 按需分页读取。
|
|
@@ -15,8 +25,10 @@ export declare class SubAgentStore {
|
|
|
15
25
|
private readonly dir;
|
|
16
26
|
private writeChain;
|
|
17
27
|
constructor();
|
|
18
|
-
/**
|
|
28
|
+
/** 主记录文件路径(按 agentId 隔离,防路径穿越) */
|
|
19
29
|
private filePath;
|
|
30
|
+
/** 事件日志文件路径(按 agentId + subId 隔离,防路径穿越) */
|
|
31
|
+
private eventsFilePath;
|
|
20
32
|
/** 读取该 agentId 的完整文档。文件不存在或损坏时返回空文档。 */
|
|
21
33
|
read(agentId: string): Promise<SubAgentDocument>;
|
|
22
34
|
/** 读取单个 sub-agent 记录 */
|
|
@@ -29,8 +41,26 @@ export declare class SubAgentStore {
|
|
|
29
41
|
updateStatus(agentId: string, subId: string, patch: Partial<SubAgentRecord>): Promise<void>;
|
|
30
42
|
/** 列出该 agent 的全部 sub-agent(已按 startedAt 倒序) */
|
|
31
43
|
list(agentId: string): Promise<SubAgentRecord[]>;
|
|
32
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* 追加一条事件到指定 sub-agent 的事件日志文件。
|
|
46
|
+
*
|
|
47
|
+
* 走独立 jsonl 文件(每行一个事件,append-only),不进主 writeChain:
|
|
48
|
+
* - O(1) 追加,无需 read-modify-write 全量主文件
|
|
49
|
+
* - 不阻塞终态 updateStatus(避免 status mismatch 兜底误报)
|
|
50
|
+
* - 高频 tool_start/tool_end 落盘成本恒定,与历史记录数无关
|
|
51
|
+
*
|
|
52
|
+
* 失败时仅打日志(fire-and-forget 语义),不阻断 sub-agent 运行。
|
|
53
|
+
* 调用方(sub-agent-manager.emitEvent)已用 void + catch 包装。
|
|
54
|
+
*/
|
|
33
55
|
appendEvent(agentId: string, subId: string, event: SubAgentEvent): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* 读取指定 sub-agent 的全部历史事件(按时间顺序)。
|
|
58
|
+
*
|
|
59
|
+
* 优先读独立 jsonl 文件;不存在时回退到主记录文件中的 events 字段
|
|
60
|
+
* (向后兼容旧版本数据:旧版把 events 内嵌在 SubAgentRecord 中)。
|
|
61
|
+
* 供 SSE 路由在客户端重连时补发历史 tool 事件。
|
|
62
|
+
*/
|
|
63
|
+
readEvents(agentId: string, subId: string): Promise<SubAgentEvent[]>;
|
|
34
64
|
/**
|
|
35
65
|
* 扫描所有 agent 文件,把 status="running"/"pending" 的记录修正为 "failed"。
|
|
36
66
|
* 在 bridge 启动时调用,清理上次进程异常退出留下的僵尸记录。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sub-agent-store.d.ts","sourceRoot":"","sources":["../src/sub-agent-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"sub-agent-store.d.ts","sourceRoot":"","sources":["../src/sub-agent-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG5F;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAoC;;IAMtD,kCAAkC;IAClC,OAAO,CAAC,QAAQ;IAKhB,2CAA2C;IAC3C,OAAO,CAAC,cAAc;IAMtB,wCAAwC;IAClC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAoBtD,wBAAwB;IAClB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAKzE,oCAAoC;IAC9B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBxE,wBAAwB;IAClB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAWpE,eAAe;IACT,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC;IAQhB,+CAA+C;IACzC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAItD;;;;;;;;;;OAUG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtF;;;;;;OAMG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAyB1E;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;CAmC1C"}
|
|
@@ -1,14 +1,25 @@
|
|
|
1
1
|
import { promises as fs } from "node:fs";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
|
+
import { renameWithRetry } from "./fs-utils.js";
|
|
4
5
|
/**
|
|
5
6
|
* Sub Agent JSON 文件存储,按 agentId 隔离。
|
|
6
|
-
* 文件路径:{homedir}/.acode/sub-agents/{agentId}.json
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* 文件布局:
|
|
9
|
+
* - 主记录文件:{homedir}/.acode/sub-agents/{agentId}.json
|
|
10
|
+
* 存放 SubAgentRecord[](不含 events 字段,避免全量读写阻塞终态写入)
|
|
11
|
+
* - 事件日志文件:{homedir}/.acode/sub-agents/{agentId}.{subId}.events.jsonl
|
|
12
|
+
* 每行一个 SubAgentEvent,append-only,O(1) 追加,不进主 writeChain
|
|
13
|
+
*
|
|
14
|
+
* 设计要点:
|
|
9
15
|
* - 不依赖 agent 工作目录,避免 workspacePath 错误时读取失败
|
|
10
16
|
* - sub-agent 跟随 agent(agentId),不跟随项目工作区
|
|
11
|
-
* -
|
|
17
|
+
* - 主记录写操作通过 Promise 链串行化,tmp + rename 原子替换
|
|
18
|
+
* (rename 在 Windows 上目标被打开时会 EPERM,使用 renameWithRetry 短退避重试)
|
|
19
|
+
* - events 走独立文件,避免 tool_start/tool_end 高频落盘阻塞终态 updateStatus
|
|
20
|
+
* (历史教训:events 与 updateStatus 共用 writeChain 时,memory delegate
|
|
21
|
+
* 一次跑数十个工具调用,appendEvent 排队导致 updateStatus 超 5s 超时,
|
|
22
|
+
* 内存已翻终态但 store 仍 running,触发 "status mismatch" 兜底误报)
|
|
12
23
|
*
|
|
13
24
|
* 历史保留策略:全部 sub-agent 记录都持久化(含 completed/failed/cancelled),
|
|
14
25
|
* 按 startedAt 倒序排列。dashboard 按需分页读取。
|
|
@@ -18,11 +29,17 @@ export class SubAgentStore {
|
|
|
18
29
|
this.writeChain = Promise.resolve();
|
|
19
30
|
this.dir = path.join(os.homedir(), ".acode", "sub-agents");
|
|
20
31
|
}
|
|
21
|
-
/**
|
|
32
|
+
/** 主记录文件路径(按 agentId 隔离,防路径穿越) */
|
|
22
33
|
filePath(agentId) {
|
|
23
34
|
const safe = String(agentId).replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
24
35
|
return path.join(this.dir, `${safe}.json`);
|
|
25
36
|
}
|
|
37
|
+
/** 事件日志文件路径(按 agentId + subId 隔离,防路径穿越) */
|
|
38
|
+
eventsFilePath(agentId, subId) {
|
|
39
|
+
const safeAgent = String(agentId).replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
40
|
+
const safeSub = String(subId).replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
41
|
+
return path.join(this.dir, `${safeAgent}.${safeSub}.events.jsonl`);
|
|
42
|
+
}
|
|
26
43
|
/** 读取该 agentId 的完整文档。文件不存在或损坏时返回空文档。 */
|
|
27
44
|
async read(agentId) {
|
|
28
45
|
const empty = { agentId, updatedAt: "", subAgents: [] };
|
|
@@ -59,11 +76,19 @@ export class SubAgentStore {
|
|
|
59
76
|
const doc = {
|
|
60
77
|
agentId,
|
|
61
78
|
updatedAt: new Date().toISOString(),
|
|
62
|
-
|
|
79
|
+
// ★ 主记录文件不再存 events 字段(events 走独立 jsonl 文件)。
|
|
80
|
+
// 剥离 events 避免每次 appendEvent 都全量重写主文件,
|
|
81
|
+
// 也能显著减小主文件体积(events 是高频大字段)。
|
|
82
|
+
subAgents: subAgents
|
|
83
|
+
.map(({ events: _events, ...rest }) => rest)
|
|
84
|
+
.sort((a, b) => b.startedAt - a.startedAt),
|
|
63
85
|
};
|
|
64
86
|
const tmp = `${target}.tmp`;
|
|
65
87
|
await fs.writeFile(tmp, JSON.stringify(doc, null, 2), "utf-8");
|
|
66
|
-
|
|
88
|
+
// ★ Windows 上 fs.rename 目标被 reader 打开时会 EPERM/EBUSY/EACCES,
|
|
89
|
+
// 瞬时错误,短退避后重试通常即可成功(reader 已释放 fd)。
|
|
90
|
+
// POSIX 上 rename 原子,不会触发此类错误。
|
|
91
|
+
await renameWithRetry(tmp, target);
|
|
67
92
|
});
|
|
68
93
|
this.writeChain = run.catch(() => { });
|
|
69
94
|
await run;
|
|
@@ -93,18 +118,56 @@ export class SubAgentStore {
|
|
|
93
118
|
async list(agentId) {
|
|
94
119
|
return (await this.read(agentId)).subAgents;
|
|
95
120
|
}
|
|
96
|
-
/**
|
|
121
|
+
/**
|
|
122
|
+
* 追加一条事件到指定 sub-agent 的事件日志文件。
|
|
123
|
+
*
|
|
124
|
+
* 走独立 jsonl 文件(每行一个事件,append-only),不进主 writeChain:
|
|
125
|
+
* - O(1) 追加,无需 read-modify-write 全量主文件
|
|
126
|
+
* - 不阻塞终态 updateStatus(避免 status mismatch 兜底误报)
|
|
127
|
+
* - 高频 tool_start/tool_end 落盘成本恒定,与历史记录数无关
|
|
128
|
+
*
|
|
129
|
+
* 失败时仅打日志(fire-and-forget 语义),不阻断 sub-agent 运行。
|
|
130
|
+
* 调用方(sub-agent-manager.emitEvent)已用 void + catch 包装。
|
|
131
|
+
*/
|
|
97
132
|
async appendEvent(agentId, subId, event) {
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
133
|
+
const target = this.eventsFilePath(agentId, subId);
|
|
134
|
+
await fs.mkdir(this.dir, { recursive: true });
|
|
135
|
+
// 每行一个 JSON 事件,以 \n 结尾,便于流式读取和解析
|
|
136
|
+
await fs.appendFile(target, JSON.stringify(event) + "\n", "utf-8");
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* 读取指定 sub-agent 的全部历史事件(按时间顺序)。
|
|
140
|
+
*
|
|
141
|
+
* 优先读独立 jsonl 文件;不存在时回退到主记录文件中的 events 字段
|
|
142
|
+
* (向后兼容旧版本数据:旧版把 events 内嵌在 SubAgentRecord 中)。
|
|
143
|
+
* 供 SSE 路由在客户端重连时补发历史 tool 事件。
|
|
144
|
+
*/
|
|
145
|
+
async readEvents(agentId, subId) {
|
|
146
|
+
const jsonlPath = this.eventsFilePath(agentId, subId);
|
|
147
|
+
try {
|
|
148
|
+
const raw = await fs.readFile(jsonlPath, "utf-8");
|
|
149
|
+
const events = [];
|
|
150
|
+
for (const line of raw.split("\n")) {
|
|
151
|
+
const trimmed = line.trim();
|
|
152
|
+
if (!trimmed)
|
|
153
|
+
continue;
|
|
154
|
+
try {
|
|
155
|
+
events.push(JSON.parse(trimmed));
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
/* 跳过损坏行 */
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return events;
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
if (err && err.code === "ENOENT") {
|
|
165
|
+
// jsonl 不存在:回退到主记录文件中的 events 字段(旧版本兼容)
|
|
166
|
+
const record = await this.get(agentId, subId);
|
|
167
|
+
return Array.isArray(record?.events) ? record.events : [];
|
|
168
|
+
}
|
|
169
|
+
throw err;
|
|
105
170
|
}
|
|
106
|
-
record.events.push(event);
|
|
107
|
-
await this.write(agentId, doc.subAgents);
|
|
108
171
|
}
|
|
109
172
|
/**
|
|
110
173
|
* 扫描所有 agent 文件,把 status="running"/"pending" 的记录修正为 "failed"。
|
|
@@ -27,6 +27,7 @@ export interface TodoDocument {
|
|
|
27
27
|
* 并发安全:同一 TodoStore 实例的写操作通过 Promise 链串行化,
|
|
28
28
|
* 避免同一 agentId 的并发 todo_write 互相覆盖。
|
|
29
29
|
* 写入采用 tmp + rename 原子替换,防止半写损坏。
|
|
30
|
+
* (rename 在 Windows 上目标被打开时会 EPERM,使用 renameWithRetry 短退避重试)
|
|
30
31
|
*/
|
|
31
32
|
export declare class TodoStore {
|
|
32
33
|
private readonly todosDir;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"todo-store.d.ts","sourceRoot":"","sources":["../src/todo-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"todo-store.d.ts","sourceRoot":"","sources":["../src/todo-store.ts"],"names":[],"mappings":"AAKA,gBAAgB;AAChB,MAAM,WAAW,QAAQ;IACvB,iBAAiB;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,WAAW,CAAC;IAC9D,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACrC;AAED,qBAAqB;AACrB,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,UAAU,CAAoC;;IAMtD,yBAAyB;IACzB,OAAO,CAAC,QAAQ;IAMhB,4CAA4C;IACtC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAmBlD,8DAA8D;IACxD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAqBnF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { promises as fs } from "node:fs";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
|
+
import { renameWithRetry } from "./fs-utils.js";
|
|
4
5
|
/**
|
|
5
6
|
* Todo JSON 文件存储,按 agentId 隔离。
|
|
6
7
|
* 文件路径:{homedir}/.acode/todos/{agentId}.json
|
|
@@ -12,6 +13,7 @@ import path from "node:path";
|
|
|
12
13
|
* 并发安全:同一 TodoStore 实例的写操作通过 Promise 链串行化,
|
|
13
14
|
* 避免同一 agentId 的并发 todo_write 互相覆盖。
|
|
14
15
|
* 写入采用 tmp + rename 原子替换,防止半写损坏。
|
|
16
|
+
* (rename 在 Windows 上目标被打开时会 EPERM,使用 renameWithRetry 短退避重试)
|
|
15
17
|
*/
|
|
16
18
|
export class TodoStore {
|
|
17
19
|
constructor() {
|
|
@@ -59,7 +61,10 @@ export class TodoStore {
|
|
|
59
61
|
};
|
|
60
62
|
const tmp = `${target}.tmp`;
|
|
61
63
|
await fs.writeFile(tmp, JSON.stringify(doc, null, 2), "utf-8");
|
|
62
|
-
|
|
64
|
+
// ★ Windows 上 fs.rename 目标被 reader 打开时会 EPERM/EBUSY/EACCES,
|
|
65
|
+
// 瞬时错误,短退避后重试通常即可成功(reader 已释放 fd)。
|
|
66
|
+
// POSIX 上 rename 原子,不会触发此类错误。
|
|
67
|
+
await renameWithRetry(tmp, target);
|
|
63
68
|
});
|
|
64
69
|
// 维持链式串行,但不让单次失败阻断后续写
|
|
65
70
|
this.writeChain = run.catch(() => { });
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { SubAgentManager } from "./sub-agent-manager.js";
|
|
2
|
+
import type { SubAgentType } from "./sub-agent-types.js";
|
|
2
3
|
import type { ACodeMcpConnection } from "./runtime.js";
|
|
3
4
|
export interface ACodeMcpServerSpec {
|
|
4
5
|
type?: "stdio" | "sse" | "http";
|
|
@@ -132,6 +133,16 @@ export interface ACodeRuntimeConfig {
|
|
|
132
133
|
subAgentModel?: string;
|
|
133
134
|
/** Sub Agent 思考强度覆盖(空值=继承主 Agent 强度) */
|
|
134
135
|
subAgentEffort?: string;
|
|
136
|
+
/**
|
|
137
|
+
* Sub Agent 类型(general | explore)。
|
|
138
|
+
* - general:完整工具权限(可读写工作区文件)
|
|
139
|
+
* - explore:只读模式,过滤掉会修改工作区文件的内建工具
|
|
140
|
+
* (write_file/edit_file/delete_file/Bash),仅保留 read_file/grep/symbols
|
|
141
|
+
* 等只读工具 + memory MCP 工具。MCP 工具白名单由
|
|
142
|
+
* SUB_AGENT_ALLOWED_MCP_TOOLS 独立施加,此处不重复。
|
|
143
|
+
* 未设置时视为 general(向后兼容)。
|
|
144
|
+
*/
|
|
145
|
+
subagentType?: SubAgentType;
|
|
135
146
|
/**
|
|
136
147
|
* 可选:Agent 文件操作变更回调。
|
|
137
148
|
* 当 Agent 调用 write_file/edit_file/delete_file 工具时,
|
|
@@ -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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"}
|
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
* MCP Server 实现
|
|
3
3
|
* 提供 MCP Tools 供 AI Agent 调用
|
|
4
4
|
*/
|
|
5
|
+
/**
|
|
6
|
+
* 绑定文件的逐文件状态。
|
|
7
|
+
* - no_change: MD5 与基线一致
|
|
8
|
+
* - content_changed: 文件存在但 MD5 与基线不一致
|
|
9
|
+
* - not_found: 文件读取不到(被删除/移动)
|
|
10
|
+
* - no_baseline: 该文件无可用基线(新增绑定尚未建基线,或基线键不匹配),无法判定变更
|
|
11
|
+
*/
|
|
12
|
+
export type BoundFileStatus = 'no_change' | 'content_changed' | 'not_found' | 'no_baseline';
|
|
13
|
+
/** 单条绑定文件的路径与状态。 */
|
|
14
|
+
export interface BoundFileStatusEntry {
|
|
15
|
+
path: string;
|
|
16
|
+
status: BoundFileStatus;
|
|
17
|
+
}
|
|
5
18
|
export declare class McpServer {
|
|
6
19
|
private server;
|
|
7
20
|
private agentClient;
|
|
@@ -411,6 +424,14 @@ export declare class McpServer {
|
|
|
411
424
|
* 在 lease 有效期内不再重复 claim。
|
|
412
425
|
*/
|
|
413
426
|
private isClaimCached;
|
|
427
|
+
/**
|
|
428
|
+
* 计算某条记忆全部绑定文件的逐文件状态(纯计算,不修改任何状态)。
|
|
429
|
+
* - no_change: 文件存在且 MD5 与基线一致(或无基线时保守视为未变)
|
|
430
|
+
* - content_changed: 文件存在但 MD5 与基线不一致
|
|
431
|
+
* - not_found: 文件读取不到(被删除/移动)
|
|
432
|
+
* 注意:无基线(新增绑定文件尚未建基线)的文件保守返回 no_change,避免误报为变更。
|
|
433
|
+
*/
|
|
434
|
+
private computeBoundFileStatuses;
|
|
414
435
|
/**
|
|
415
436
|
* 检查一组 Memory 的文件变更
|
|
416
437
|
* Memory 增强功能 (v1.6.0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4EH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,yBAAyB,CAAc;IAC/C,OAAO,CAAC,qBAAqB,CAAU;IACvC,OAAO,CAAC,eAAe,CAAc;IACrC,kDAAkD;IAClD,OAAO,CAAC,WAAW,CAAkB;IACrC,sBAAsB;IACtB,OAAO,CAAC,cAAc,CAAiB;IACvC,+CAA+C;IAC/C,OAAO,CAAC,UAAU,CAAU;IAC5B;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B,CAAkC;IAErE;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB,CAAkC;IAEnE,mEAAmE;IACnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAiB;IAE1E;;;;OAIG;IACH,OAAO,CAAC,gBAAgB,CAAkD;IAE1E;;;OAGG;IACH,OAAO,CAAC,iBAAiB,CAA+C;IAExE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAM;IACpD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAU;IAEzD;;;;;OAKG;IACH,OAAO,CAAC,YAAY,CAA6B;IAEjD,kEAAkE;IAClE,OAAO,CAAC,aAAa,CAAS;IAE9B;;;;OAIG;IACH,OAAO,CAAC,2BAA2B,CAA6B;IAChE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,CAAU;IAEjE;;;OAGG;IACH,OAAO,CAAC,kBAAkB,CAAiC;IAQ3D;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAyB3B;;;;;;;OAOG;IACH,OAAO,CAAC,gCAAgC;YAU1B,kCAAkC;IAgHhD;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;;OAGG;YACW,uBAAuB;IAuBrC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;OAGG;IACH,OAAO,CAAC,0BAA0B;;IAoDlC,OAAO,CAAC,aAAa;IAwDrB;;OAEG;YACW,cAAc;
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -407,10 +407,11 @@ export class McpServer {
|
|
|
407
407
|
if (reportableResult !== null) {
|
|
408
408
|
// 正常结果:上报 toolResult + thinking(工具调用完成,回到思考状态)
|
|
409
409
|
statusReporter.reportToolResult(reportableResult);
|
|
410
|
+
statusReporter.reportThinking();
|
|
410
411
|
}
|
|
411
|
-
// 委托消息(reportableResult === null):跳过 reportToolResult
|
|
412
|
-
//
|
|
413
|
-
|
|
412
|
+
// 委托消息(reportableResult === null):跳过 reportToolResult 和 reportThinking,
|
|
413
|
+
// 保持 tool_using 状态。主 agent 仍在 poll_message 循环中等待真正的消息,
|
|
414
|
+
// 委托给子 agent 处理不应影响主 agent 的状态显示。
|
|
414
415
|
}
|
|
415
416
|
return result;
|
|
416
417
|
}
|
|
@@ -2015,6 +2016,15 @@ export class McpServer {
|
|
|
2015
2016
|
_acodeAutoDelegate: {
|
|
2016
2017
|
type: 'memory_file_change',
|
|
2017
2018
|
uris: updatingChanges.slice(0, 5).map(c => c.memoryUri),
|
|
2019
|
+
fileChanges: updatingChanges.slice(0, 5).map(c => {
|
|
2020
|
+
const memory = updatingMemories.find(m => m.id === c.memoryId);
|
|
2021
|
+
return {
|
|
2022
|
+
uri: c.memoryUri,
|
|
2023
|
+
boundFiles: memory?.bound_files ?? [],
|
|
2024
|
+
fileStatuses: c.fileStatuses,
|
|
2025
|
+
changedFiles: c.changedFiles,
|
|
2026
|
+
};
|
|
2027
|
+
}),
|
|
2018
2028
|
},
|
|
2019
2029
|
};
|
|
2020
2030
|
}
|
|
@@ -2038,6 +2048,12 @@ export class McpServer {
|
|
|
2038
2048
|
for (const m of pendingToNotify) {
|
|
2039
2049
|
this.lastUpdatePendingNotifyAt.set(m.uri, now);
|
|
2040
2050
|
}
|
|
2051
|
+
// 计算 pending(仍 updating)记忆的逐文件状态,供子 agent 在提示词中标注
|
|
2052
|
+
// (无变更/内容变更/文件找不到),避免「本次变更文件: 未知」歧义。
|
|
2053
|
+
const pendingStatuses = new Map();
|
|
2054
|
+
for (const m of pendingToNotify.slice(0, 5)) {
|
|
2055
|
+
pendingStatuses.set(m.uri, await this.computeBoundFileStatuses(m));
|
|
2056
|
+
}
|
|
2041
2057
|
const memoryList = pendingToNotify
|
|
2042
2058
|
.slice(0, 5)
|
|
2043
2059
|
.map(m => `- ${m.uri} (文件: ${m.bound_files?.join(', ') || '未知'})`)
|
|
@@ -2055,6 +2071,13 @@ export class McpServer {
|
|
|
2055
2071
|
_acodeAutoDelegate: {
|
|
2056
2072
|
type: 'memory_file_change',
|
|
2057
2073
|
uris: pendingToNotify.slice(0, 5).map(m => m.uri),
|
|
2074
|
+
// 此分支为「仍 updating」状态提醒,本轮未检测到新的文件变更,
|
|
2075
|
+
// 仅传递绑定文件清单与逐文件状态供子 agent 直接定位文件,changedFiles 留空。
|
|
2076
|
+
fileChanges: pendingToNotify.slice(0, 5).map(m => ({
|
|
2077
|
+
uri: m.uri,
|
|
2078
|
+
boundFiles: m.bound_files ?? [],
|
|
2079
|
+
fileStatuses: pendingStatuses.get(m.uri) ?? [],
|
|
2080
|
+
})),
|
|
2058
2081
|
},
|
|
2059
2082
|
};
|
|
2060
2083
|
}
|
|
@@ -2152,6 +2175,15 @@ export class McpServer {
|
|
|
2152
2175
|
_acodeAutoDelegate: {
|
|
2153
2176
|
type: 'memory_file_change',
|
|
2154
2177
|
uris: newListableChanges.map(c => c.memoryUri),
|
|
2178
|
+
fileChanges: newListableChanges.map(c => {
|
|
2179
|
+
const memory = listableMemories.find(m => m.id === c.memoryId);
|
|
2180
|
+
return {
|
|
2181
|
+
uri: c.memoryUri,
|
|
2182
|
+
boundFiles: memory?.bound_files ?? [],
|
|
2183
|
+
fileStatuses: c.fileStatuses,
|
|
2184
|
+
changedFiles: c.changedFiles,
|
|
2185
|
+
};
|
|
2186
|
+
}),
|
|
2155
2187
|
},
|
|
2156
2188
|
};
|
|
2157
2189
|
}
|
|
@@ -2255,6 +2287,15 @@ export class McpServer {
|
|
|
2255
2287
|
_acodeAutoDelegate: {
|
|
2256
2288
|
type: 'memory_file_change',
|
|
2257
2289
|
uris: claimedChanges.map(c => c.memoryUri),
|
|
2290
|
+
fileChanges: claimedChanges.map(c => {
|
|
2291
|
+
const memory = permanentList.find(m => m.id === c.memoryId);
|
|
2292
|
+
return {
|
|
2293
|
+
uri: c.memoryUri,
|
|
2294
|
+
boundFiles: memory?.bound_files ?? [],
|
|
2295
|
+
fileStatuses: c.fileStatuses,
|
|
2296
|
+
changedFiles: c.changedFiles,
|
|
2297
|
+
};
|
|
2298
|
+
}),
|
|
2258
2299
|
},
|
|
2259
2300
|
};
|
|
2260
2301
|
}
|
|
@@ -2281,6 +2322,43 @@ export class McpServer {
|
|
|
2281
2322
|
}
|
|
2282
2323
|
return true;
|
|
2283
2324
|
}
|
|
2325
|
+
/**
|
|
2326
|
+
* 计算某条记忆全部绑定文件的逐文件状态(纯计算,不修改任何状态)。
|
|
2327
|
+
* - no_change: 文件存在且 MD5 与基线一致(或无基线时保守视为未变)
|
|
2328
|
+
* - content_changed: 文件存在但 MD5 与基线不一致
|
|
2329
|
+
* - not_found: 文件读取不到(被删除/移动)
|
|
2330
|
+
* 注意:无基线(新增绑定文件尚未建基线)的文件保守返回 no_change,避免误报为变更。
|
|
2331
|
+
*/
|
|
2332
|
+
async computeBoundFileStatuses(memory) {
|
|
2333
|
+
const result = [];
|
|
2334
|
+
if (!memory.bound_files || memory.bound_files.length === 0)
|
|
2335
|
+
return result;
|
|
2336
|
+
const oldMd5Map = memory.file_md5_map || {};
|
|
2337
|
+
for (const filePath of memory.bound_files) {
|
|
2338
|
+
try {
|
|
2339
|
+
const currentMd5 = await this.calculateFileMd5(filePath);
|
|
2340
|
+
if (currentMd5 === null) {
|
|
2341
|
+
result.push({ path: filePath, status: 'not_found' });
|
|
2342
|
+
continue;
|
|
2343
|
+
}
|
|
2344
|
+
const oldMd5 = oldMd5Map[filePath];
|
|
2345
|
+
if (!oldMd5) {
|
|
2346
|
+
result.push({ path: filePath, status: 'no_change' });
|
|
2347
|
+
}
|
|
2348
|
+
else if (oldMd5 !== currentMd5) {
|
|
2349
|
+
result.push({ path: filePath, status: 'content_changed' });
|
|
2350
|
+
}
|
|
2351
|
+
else {
|
|
2352
|
+
result.push({ path: filePath, status: 'no_change' });
|
|
2353
|
+
}
|
|
2354
|
+
}
|
|
2355
|
+
catch {
|
|
2356
|
+
// MD5 计算失败:保守视为未变更,不误报
|
|
2357
|
+
result.push({ path: filePath, status: 'no_change' });
|
|
2358
|
+
}
|
|
2359
|
+
}
|
|
2360
|
+
return result;
|
|
2361
|
+
}
|
|
2284
2362
|
/**
|
|
2285
2363
|
* 检查一组 Memory 的文件变更
|
|
2286
2364
|
* Memory 增强功能 (v1.6.0)
|
|
@@ -2293,6 +2371,7 @@ export class McpServer {
|
|
|
2293
2371
|
}
|
|
2294
2372
|
try {
|
|
2295
2373
|
const changedFiles = [];
|
|
2374
|
+
const statuses = [];
|
|
2296
2375
|
const newMd5Map = {};
|
|
2297
2376
|
const oldMd5Map = memory.file_md5_map || {};
|
|
2298
2377
|
const workspacePath = process.env.AWS_WORKSPACE_PATH || process.cwd();
|
|
@@ -2309,7 +2388,8 @@ export class McpServer {
|
|
|
2309
2388
|
const oldMd5ForMissing = oldMd5Map[filePath];
|
|
2310
2389
|
if (oldMd5ForMissing) {
|
|
2311
2390
|
// 该文件曾有基线,现在读不到 -> 视为变更(文件被删除/移动)
|
|
2312
|
-
|
|
2391
|
+
statuses.push({ path: filePath, status: 'not_found' });
|
|
2392
|
+
changedFiles.push(`${filePath} (文件找不到)`);
|
|
2313
2393
|
// 收口:文件已消失,从 bound_files 移除该路径,消除悬空引用。
|
|
2314
2394
|
// 否则 listByFile/findByBoundFile 会持续命中无效记录,且文件恢复后因基线已清而变更检测失效。
|
|
2315
2395
|
// bound_files 修剪结果由调用方在变更回写分支同步持久化(见 buildMemoryFileChangeNotification)。
|
|
@@ -2317,6 +2397,10 @@ export class McpServer {
|
|
|
2317
2397
|
memory.bound_files = memory.bound_files.filter(f => f !== filePath);
|
|
2318
2398
|
}
|
|
2319
2399
|
}
|
|
2400
|
+
else {
|
|
2401
|
+
// 无该文件基线且文件不存在:标注找不到但不计入变更,避免对未知状态误报
|
|
2402
|
+
statuses.push({ path: filePath, status: 'not_found' });
|
|
2403
|
+
}
|
|
2320
2404
|
// 无该文件基线时静默跳过,避免对未知状态误报
|
|
2321
2405
|
continue;
|
|
2322
2406
|
}
|
|
@@ -2327,20 +2411,29 @@ export class McpServer {
|
|
|
2327
2411
|
// 1) 新增到 bound_files 的文件尚未建基线;
|
|
2328
2412
|
// 2) 历史 TS/Java 路径规范化不一致(如 Windows 反斜杠)导致键不匹配。
|
|
2329
2413
|
// 静默建立基线,不视为变更,避免 md5 实际未变却误报需要更新。
|
|
2414
|
+
statuses.push({ path: filePath, status: 'no_change' });
|
|
2330
2415
|
baselineRepaired = true;
|
|
2331
2416
|
logger.info(`[McpServer] 建立单文件基线: ${filePath} new=${currentMd5} (workspace=${workspacePath}, memory=${memory.uri})`);
|
|
2332
2417
|
}
|
|
2333
2418
|
else if (oldMd5 !== currentMd5) {
|
|
2334
2419
|
logger.info(`[McpServer] 文件变更: ${filePath} old=${oldMd5} new=${currentMd5} (workspace=${workspacePath})`);
|
|
2335
|
-
|
|
2420
|
+
statuses.push({ path: filePath, status: 'content_changed' });
|
|
2421
|
+
changedFiles.push(`${filePath} (内容变更)`);
|
|
2422
|
+
}
|
|
2423
|
+
else {
|
|
2424
|
+
statuses.push({ path: filePath, status: 'no_change' });
|
|
2336
2425
|
}
|
|
2337
2426
|
}
|
|
2338
2427
|
catch (error) {
|
|
2339
2428
|
logger.info(`[McpServer] 计算文件 MD5 失败: ${filePath}`, error);
|
|
2340
2429
|
const oldMd5ForError = oldMd5Map[filePath];
|
|
2341
2430
|
if (oldMd5ForError) {
|
|
2431
|
+
statuses.push({ path: filePath, status: 'content_changed' });
|
|
2342
2432
|
changedFiles.push(`${filePath} (MD5计算失败)`);
|
|
2343
2433
|
}
|
|
2434
|
+
else {
|
|
2435
|
+
statuses.push({ path: filePath, status: 'no_change' });
|
|
2436
|
+
}
|
|
2344
2437
|
}
|
|
2345
2438
|
}
|
|
2346
2439
|
// 无基线时:更新 MD5 map 到 memory 对象(供调用方回写),但不计入变更
|
|
@@ -2359,10 +2452,15 @@ export class McpServer {
|
|
|
2359
2452
|
changes.push({
|
|
2360
2453
|
memoryId: memory.id,
|
|
2361
2454
|
memoryUri: memory.uri,
|
|
2455
|
+
fileStatuses: statuses,
|
|
2362
2456
|
changedFiles,
|
|
2363
2457
|
});
|
|
2364
|
-
//
|
|
2365
|
-
|
|
2458
|
+
// ⚠️ 不要用 newMd5Map 覆盖 memory.file_md5_map!
|
|
2459
|
+
// 检测阶段只负责"发现变更并通知 agent",MD5 基线必须保留为旧值,
|
|
2460
|
+
// 让调用方把旧基线回写到 DB。否则 agent 收到变更通知后,
|
|
2461
|
+
// 重算文件 MD5 与 DB 中已被覆盖的新基线一致,会误判"文件实际未变"。
|
|
2462
|
+
// 新基线只能由 agent 主动调用 update_memory 处理完变更后重建。
|
|
2463
|
+
// 仅更新检测时间戳,记录本次检查发生过。
|
|
2366
2464
|
memory.last_check_time = new Date().toISOString();
|
|
2367
2465
|
}
|
|
2368
2466
|
}
|