aws-runtime-bridge 1.9.92 → 1.9.94
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/AcodeSdkAdapter.d.ts +22 -126
- package/dist/adapter/AdapterRegistry.d.ts +10 -38
- package/dist/adapter/ClaudeSdkAdapter.d.ts +21 -84
- package/dist/adapter/CodexSdkAdapter.d.ts +2 -10
- package/dist/adapter/OpencodeSdkAdapter.d.ts +6 -42
- package/dist/adapter/acode-tool-names.d.ts +3 -12
- package/dist/adapter/idle-poll-loop.d.ts +4 -16
- package/dist/adapter/index.d.ts +1 -4
- package/dist/adapter/instance-ai-config-resolver.d.ts +9 -29
- package/dist/adapter/types.d.ts +124 -242
- package/dist/adapters/cc-switch/common.d.ts +4 -14
- package/dist/adapters/cc-switch/index.d.ts +3 -11
- package/dist/adapters/cc-switch/mcp-acode.d.ts +1 -7
- package/dist/adapters/cc-switch/mcp-claude.d.ts +1 -5
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts +1 -5
- package/dist/adapters/cc-switch/mcp-codex.d.ts +1 -7
- package/dist/adapters/cc-switch/mcp-opencode.d.ts +3 -11
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts +1 -5
- package/dist/adapters/cc-switch/skill-acode.d.ts +1 -6
- package/dist/adapters/cc-switch/skill-claude.d.ts +1 -5
- package/dist/adapters/cc-switch/skill-claudecode.d.ts +1 -5
- package/dist/adapters/cc-switch/skill-opencode.d.ts +1 -5
- package/dist/adapters/cc-switch/skill-placeholder.d.ts +1 -5
- package/dist/config.d.ts +39 -57
- package/dist/index.d.ts +1 -5
- package/dist/middleware/auth.d.ts +4 -22
- package/dist/routes/acode-todos.d.ts +1 -9
- package/dist/routes/dashboard.d.ts +1 -6
- package/dist/routes/events.d.ts +1 -5
- package/dist/routes/file-browser.d.ts +2 -8
- package/dist/routes/file-diff-rollback.d.ts +13 -41
- package/dist/routes/file-snapshot.d.ts +1 -8
- package/dist/routes/git.d.ts +18 -91
- package/dist/routes/instance.d.ts +4 -15
- package/dist/routes/processes.d.ts +1 -5
- package/dist/routes/properties.d.ts +1 -5
- package/dist/routes/pty.d.ts +9 -36
- package/dist/routes/runtime-binding.d.ts +1 -4
- package/dist/routes/sessions.d.ts +2 -9
- package/dist/routes/sub-agents.d.ts +1 -12
- package/dist/routes/task-context.d.ts +1 -6
- package/dist/routes/terminal.d.ts +18 -92
- package/dist/routes/yml.d.ts +1 -5
- package/dist/services/acode-package.d.ts +2 -12
- package/dist/services/agent-event-store.d.ts +6 -26
- package/dist/services/agent-process-manager.d.ts +30 -184
- package/dist/services/ai-source-apply.d.ts +1 -3
- package/dist/services/auto-register.d.ts +29 -106
- package/dist/services/bridge-package-publish-hooks.d.ts +5 -19
- package/dist/services/cc-switch-sdk.d.ts +1 -6
- package/dist/services/cli-commands.d.ts +12 -33
- package/dist/services/cli-commands.js +6 -6
- package/dist/services/event-delta-pusher.d.ts +5 -20
- package/dist/services/fileSnapshotStore.d.ts +7 -35
- package/dist/services/instance-ai-config-service.d.ts +4 -21
- package/dist/services/instance-service.d.ts +1 -10
- package/dist/services/instance-state.d.ts +5 -30
- package/dist/services/legacy-path-migration.d.ts +1 -1
- package/dist/services/lifecycle-state.d.ts +1 -4
- package/dist/services/mcp-launch-binding-queue.d.ts +2 -8
- package/dist/services/orphan-monitor.d.ts +20 -63
- package/dist/services/panel-auth.d.ts +12 -28
- package/dist/services/process-detector.d.ts +18 -122
- package/dist/services/process-registry.d.ts +30 -150
- package/dist/services/ring-buffer.d.ts +9 -42
- package/dist/services/runtime-binding.d.ts +2 -9
- package/dist/services/runtime-lifecycle-policy.d.ts +3 -15
- package/dist/services/session-output.d.ts +14 -67
- package/dist/services/startup-config-wizard.d.ts +3 -10
- package/dist/services/system-metrics.d.ts +1 -4
- package/dist/services/terminal-persistence.d.ts +10 -53
- package/dist/services/tool-installer.d.ts +6 -18
- package/dist/services/tunnel-client.d.ts +3 -18
- package/dist/services/windows-service-manager.d.ts +1 -13
- package/dist/services/workspace-files.d.ts +17 -57
- package/dist/services/workspace-watch.d.ts +2 -6
- package/dist/services/workspaceTaskChangeWatcher.d.ts +13 -51
- package/dist/types.d.ts +2 -8
- package/dist/utils/instance-ai-config-debug-logger.d.ts +5 -20
- package/dist/utils/logger.d.ts +7 -20
- package/dist/utils/mcp-utils.d.ts +8 -44
- package/dist/utils/path-utils.d.ts +3 -15
- package/dist/utils/sdk-package-loader.d.ts +2 -8
- package/dist/utils/validation.d.ts +3 -20
- package/dist/utils/yaml-utils.d.ts +8 -56
- package/node_modules/@cc-switch/sdk/dist/index.d.ts +1 -6
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +11 -42
- package/package/acode/dist/ask-user-question-tool.d.ts +7 -20
- package/package/acode/dist/built-in-file-tools.d.ts +3 -6
- package/package/acode/dist/built-in-symbols-tool.d.ts +1 -4
- package/package/acode/dist/builtins/commandArtifacts.d.ts +1 -4
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts +3 -18
- package/package/acode/dist/commands/commandLoader.d.ts +1 -4
- package/package/acode/dist/commands/commandParser.d.ts +1 -4
- package/package/acode/dist/compaction.d.ts +38 -175
- package/package/acode/dist/config.d.ts +1 -4
- package/package/acode/dist/fs-utils.d.ts +1 -19
- package/package/acode/dist/hooks/hookBus.d.ts +1 -4
- package/package/acode/dist/mcpToolNames.d.ts +2 -8
- package/package/acode/dist/parsers/ast-cache.d.ts +7 -20
- package/package/acode/dist/parsers/language-detector.d.ts +1 -5
- package/package/acode/dist/parsers/language-queries.d.ts +1 -1
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts +4 -12
- package/package/acode/dist/parsers/types.d.ts +19 -30
- package/package/acode/dist/runtime.d.ts +47 -269
- package/package/acode/dist/skill-tool.d.ts +3 -23
- package/package/acode/dist/sub-agent-manager.d.ts +41 -206
- package/package/acode/dist/sub-agent-store.d.ts +12 -61
- package/package/acode/dist/sub-agent-tools.d.ts +9 -18
- package/package/acode/dist/sub-agent-types.d.ts +32 -38
- package/package/acode/dist/todo-store.d.ts +8 -23
- package/package/acode/dist/todo-tool.d.ts +2 -2
- package/package/acode/dist/types.d.ts +17 -38
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +44 -161
- package/package/aws-client-agent-mcp/dist/config.d.ts +4 -18
- package/package/aws-client-agent-mcp/dist/constants.d.ts +1 -3
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +25 -95
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +1 -4
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +15 -56
- package/package/aws-client-agent-mcp/dist/index.d.ts +1 -11
- package/package/aws-client-agent-mcp/dist/logger.d.ts +5 -22
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +76 -365
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +21 -83
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +15 -70
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +4 -17
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +23 -92
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts +5 -29
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +2 -9
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +17 -55
- package/package/aws-client-agent-mcp/dist/types.d.ts +66 -125
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +30 -125
- package/package/cc-switch-sdk/dist/index.d.ts +1 -6
- package/package/cc-switch-sdk/dist/sdk.d.ts +11 -42
- package/package.json +1 -1
|
@@ -2,10 +2,7 @@ import { ACodeRuntime } from "./runtime.js";
|
|
|
2
2
|
import type { ACodeRuntimeConfig } from "./types.js";
|
|
3
3
|
import { SubAgentStore } from "./sub-agent-store.js";
|
|
4
4
|
import type { SubAgentContextSnapshot, SubAgentEvent, SubAgentStatus, SubAgentType } from "./sub-agent-types.js";
|
|
5
|
-
|
|
6
|
-
* 子 agent 终态通知(供 poll_message race 使用)。
|
|
7
|
-
* 当子 agent 到达 completed/failed/cancelled 时入队,由 takeCompletedSubAgents 消费。
|
|
8
|
-
*/
|
|
5
|
+
|
|
9
6
|
export interface SubAgentCompletionNotification {
|
|
10
7
|
subId: string;
|
|
11
8
|
subagentType: SubAgentType;
|
|
@@ -15,19 +12,12 @@ export interface SubAgentCompletionNotification {
|
|
|
15
12
|
error?: string;
|
|
16
13
|
durationMs?: number;
|
|
17
14
|
}
|
|
18
|
-
|
|
19
|
-
* Sub-agent 完成一轮后由外部执行的重新检查回调。
|
|
20
|
-
* - 返回 { done: true } 表示目标已达成,sub-agent 可正常结束
|
|
21
|
-
* - 返回 { done: false, continueMessage } 表示未完成,将 continueMessage 作为下一轮 submit 注入同一 sub-agent
|
|
22
|
-
*
|
|
23
|
-
* 回调内可查询服务端真实状态(如 read_memory / get_memory_stats),
|
|
24
|
-
* 而非依赖 LLM 自报结果,提供系统级硬保证。
|
|
25
|
-
*/
|
|
15
|
+
|
|
26
16
|
export type SubAgentRecheckFn = (output: string, turn: number) => Promise<{
|
|
27
17
|
done: boolean;
|
|
28
18
|
continueMessage?: string;
|
|
29
19
|
}>;
|
|
30
|
-
|
|
20
|
+
|
|
31
21
|
export interface SubAgentSpawnOptions {
|
|
32
22
|
parentAgentId: string;
|
|
33
23
|
parentSessionId: string;
|
|
@@ -35,12 +25,12 @@ export interface SubAgentSpawnOptions {
|
|
|
35
25
|
description: string;
|
|
36
26
|
prompt: string;
|
|
37
27
|
workingDirectory: string;
|
|
38
|
-
|
|
28
|
+
|
|
39
29
|
parentConfig: ACodeRuntimeConfig;
|
|
40
|
-
|
|
30
|
+
|
|
41
31
|
silent?: boolean;
|
|
42
32
|
}
|
|
43
|
-
|
|
33
|
+
|
|
44
34
|
export interface SubAgentEntry {
|
|
45
35
|
subId: string;
|
|
46
36
|
parentAgentId: string;
|
|
@@ -57,264 +47,109 @@ export interface SubAgentEntry {
|
|
|
57
47
|
runtime: ACodeRuntime;
|
|
58
48
|
abortController: AbortController;
|
|
59
49
|
contextSnapshot: SubAgentContextSnapshot;
|
|
60
|
-
|
|
50
|
+
|
|
61
51
|
availableTools: string[];
|
|
62
|
-
|
|
52
|
+
|
|
63
53
|
completionResolve?: (result: {
|
|
64
54
|
output: string;
|
|
65
55
|
error?: string;
|
|
66
56
|
}) => void;
|
|
67
57
|
completionReject?: (err: any) => void;
|
|
68
|
-
|
|
58
|
+
|
|
69
59
|
completionPromise?: Promise<{
|
|
70
60
|
output: string;
|
|
71
61
|
error?: string;
|
|
72
62
|
}>;
|
|
73
|
-
|
|
63
|
+
|
|
74
64
|
silent?: boolean;
|
|
75
|
-
|
|
65
|
+
|
|
76
66
|
awaited?: boolean;
|
|
77
67
|
}
|
|
78
|
-
|
|
68
|
+
|
|
79
69
|
export interface SubAgentManagerOptions {
|
|
80
70
|
store: SubAgentStore;
|
|
81
|
-
|
|
71
|
+
|
|
82
72
|
maxConcurrent?: number;
|
|
83
73
|
}
|
|
84
74
|
type EventSubscriber = (event: SubAgentEvent) => void;
|
|
85
|
-
|
|
86
|
-
* SubAgentManager:管理独立 ACodeRuntime 实例池。
|
|
87
|
-
*
|
|
88
|
-
* 核心职责:
|
|
89
|
-
* 1. spawn 创建独立 ACodeRuntime 实例(避免父 agent 的 submitQueue 死锁)
|
|
90
|
-
* 2. start 异步启动子 agent(不阻塞),awaitCompletion 显式等待完成
|
|
91
|
-
* 3. abort 取消运行中的 sub-agent
|
|
92
|
-
* 4. 维护父子关系映射(parentAgentId -> subIds)
|
|
93
|
-
* 5. SSE 事件订阅(subscribe/unsubscribe)
|
|
94
|
-
* 6. 状态持久化到 SubAgentStore
|
|
95
|
-
*
|
|
96
|
-
* 线程模型:单进程 Node.js,所有 ACodeRuntime 实例共享事件循环。
|
|
97
|
-
* 非阻塞模式:spawn 后调 start 立即返回,主 agent 可继续工作;
|
|
98
|
-
* 主 agent 通过 awaitCompletion 显式阻塞等待指定 sub-agent 数组完成。
|
|
99
|
-
*
|
|
100
|
-
* 重要:ACodeRuntime.submit() 返回 Promise<void>,assistant 文本通过
|
|
101
|
-
* "event" 上的 "assistant_delta" 事件传递,turn 结束时发出 "turn_complete"。
|
|
102
|
-
* 因此 start 内部注册事件监听器累积输出文本,awaitCompletion 通过 Promise 等待。
|
|
103
|
-
*
|
|
104
|
-
* Entry 生命周期:
|
|
105
|
-
* - pending: spawn 后未 start
|
|
106
|
-
* - running: start 后运行中
|
|
107
|
-
* - completed/failed/cancelled: 终态,entry 保留在内存中 TTL=30min,
|
|
108
|
-
* 供 list/get_status 查询;超时后从内存清理(store 仍持久化)
|
|
109
|
-
*/
|
|
75
|
+
|
|
110
76
|
export declare class SubAgentManager {
|
|
111
77
|
private readonly store;
|
|
112
78
|
private readonly maxConcurrent;
|
|
113
79
|
private readonly subAgents;
|
|
114
80
|
private readonly parentToSubs;
|
|
115
81
|
private readonly subscribers;
|
|
116
|
-
|
|
82
|
+
|
|
117
83
|
private cleanupTimer;
|
|
118
|
-
|
|
119
|
-
* 终态通知队列:子 agent 到达终态时入队,takeCompletedSubAgents 消费。
|
|
120
|
-
* 供 poll_message 在 ACode 运行时层检测子 agent 完成事件。
|
|
121
|
-
*/
|
|
84
|
+
|
|
122
85
|
private readonly completionQueue;
|
|
123
|
-
|
|
124
|
-
* waitForAnyCompletion 的 resolve 回调,终态事件到达时调用。
|
|
125
|
-
* null 表示当前没有等待者。
|
|
126
|
-
*/
|
|
86
|
+
|
|
127
87
|
private completionWaiterResolve;
|
|
128
|
-
|
|
129
|
-
* 正在执行的异步终态落盘 Promise 集合。
|
|
130
|
-
*
|
|
131
|
-
* 用于:
|
|
132
|
-
* - 测试等待异步落盘完成后再读取 store 验证状态
|
|
133
|
-
* - dispose 时确保所有落盘完成后再清理(避免文件句柄占用导致目录非空)
|
|
134
|
-
*
|
|
135
|
-
* persistFinalStatus 启动时入集,resolve/reject 后出集。
|
|
136
|
-
*/
|
|
88
|
+
|
|
137
89
|
private readonly pendingPersists;
|
|
138
90
|
constructor(opts: SubAgentManagerOptions);
|
|
139
|
-
|
|
91
|
+
|
|
140
92
|
spawn(opts: SubAgentSpawnOptions): Promise<string>;
|
|
141
|
-
|
|
142
|
-
* 异步启动 sub-agent(不阻塞,立即返回)。
|
|
143
|
-
*
|
|
144
|
-
* 内部创建 completionPromise 供后续 awaitCompletion 等待。
|
|
145
|
-
* 启动后立即返回,主 agent 可继续做其他事。
|
|
146
|
-
*
|
|
147
|
-
* 同一 sub-agent 只能 start 一次;重复 start 抛错。
|
|
148
|
-
*/
|
|
93
|
+
|
|
149
94
|
start(subId: string): Promise<void>;
|
|
150
|
-
|
|
151
|
-
* 带 recheck 循环的异步启动(不阻塞,立即返回)。
|
|
152
|
-
*
|
|
153
|
-
* 与 start 的区别:每轮 submit 完成后调用 recheck 回调查询服务端真实状态。
|
|
154
|
-
* 若 recheck 返回 { done: false, continueMessage },将 continueMessage 作为
|
|
155
|
-
* 下一轮 submit 注入同一 sub-agent(保持上下文连续性),最多重试 maxRetries 次。
|
|
156
|
-
*
|
|
157
|
-
* 适用场景:memory 过期整理 / 文件变更更新 / 容量整理等需要系统级硬保证
|
|
158
|
-
* "确实完成"的场景,不依赖 LLM 自报结果。
|
|
159
|
-
*/
|
|
95
|
+
|
|
160
96
|
startWithRecheck(subId: string, recheck: SubAgentRecheckFn, maxRetries?: number): Promise<void>;
|
|
161
|
-
|
|
162
|
-
* 阻塞等待指定 sub-agent 数组全部完成(completed/failed/cancelled)。
|
|
163
|
-
*
|
|
164
|
-
* - 已完成的立即 resolve
|
|
165
|
-
* - 未 start 的会先 start(自动启动)
|
|
166
|
-
* - 返回每个 sub-agent 的最终结果
|
|
167
|
-
*
|
|
168
|
-
* 注意:本方法不取消 sub-agent,仅等待。如需取消用 abort。
|
|
169
|
-
*/
|
|
97
|
+
|
|
170
98
|
awaitCompletion(subIds: string[], timeoutMs?: number): Promise<Array<{
|
|
171
99
|
subId: string;
|
|
172
100
|
output: string;
|
|
173
101
|
error?: string;
|
|
174
102
|
status: SubAgentStatus;
|
|
175
103
|
}>>;
|
|
176
|
-
|
|
177
|
-
* 内部方法:执行 entry 直到完成。
|
|
178
|
-
*
|
|
179
|
-
* 实际 ACodeRuntime.submit() 返回 Promise<void>,assistant 文本通过
|
|
180
|
-
* assistant_delta 事件传递。本方法注册临时监听器累积输出文本,
|
|
181
|
-
* 同时检测 turn_complete 事件中的 failed 标志以处理运行时内部错误。
|
|
182
|
-
*
|
|
183
|
-
* 完成后:
|
|
184
|
-
* - 更新 entry 状态(completed/failed)
|
|
185
|
-
* - 持久化到 store
|
|
186
|
-
* - settle completionPromise
|
|
187
|
-
* - 清理 runtime 实例(释放内存)
|
|
188
|
-
* - **不删除 entry**(保留在内存供 list/get_status 查询,30min 后由定时器清理)
|
|
189
|
-
*/
|
|
104
|
+
|
|
190
105
|
private runEntryToCompletion;
|
|
191
|
-
|
|
192
|
-
* 带 recheck 循环的 entry 执行(多轮 submit)。
|
|
193
|
-
*
|
|
194
|
-
* 与 runEntryToCompletion 的区别:
|
|
195
|
-
* 1. 第一轮 submit(entry.prompt) 完成后,调用 recheck 回调查询服务端真实状态
|
|
196
|
-
* 2. 若 recheck 返回 { done: false, continueMessage },将 continueMessage 注入下一轮 submit
|
|
197
|
-
* 3. 最多重试 maxRetries 次;超过后视为完成(不再继续)
|
|
198
|
-
* 4. onEvent 监听器跨所有轮次累积 assistant_delta,最终 output 包含全部轮次的文本
|
|
199
|
-
*
|
|
200
|
-
* turnFailed 标志在每轮 submit 前重置,确保上一轮的失败状态不影响下一轮判断。
|
|
201
|
-
* recheck 自身抛错时视为 done(不阻塞 sub-agent 结束),仅记录日志。
|
|
202
|
-
*/
|
|
106
|
+
|
|
203
107
|
private runEntryToCompletionWithRecheck;
|
|
204
|
-
|
|
205
|
-
* @deprecated 兼容旧接口:spawn + 阻塞等待完成。
|
|
206
|
-
* 新代码应使用 spawn + start + awaitCompletion。
|
|
207
|
-
*/
|
|
108
|
+
|
|
208
109
|
runToCompletion(subId: string): Promise<{
|
|
209
110
|
output: string;
|
|
210
111
|
error?: string;
|
|
211
112
|
}>;
|
|
212
|
-
|
|
113
|
+
|
|
213
114
|
abort(subId: string): Promise<void>;
|
|
214
|
-
|
|
115
|
+
|
|
215
116
|
getSubAgent(subId: string): SubAgentEntry | undefined;
|
|
216
|
-
|
|
117
|
+
|
|
217
118
|
listByParent(parentAgentId: string): SubAgentEntry[];
|
|
218
|
-
|
|
219
|
-
* 列出某父 agent 下处于活跃状态(pending / running)且对用户可见的 sub-agent。
|
|
220
|
-
*
|
|
221
|
-
* 已完成/失败/取消的 entry 在内存中仍保留 TTL=30min 供查询,但不应计入
|
|
222
|
-
* "进行中" 列表。前端 "进行中" tab 与 SSE snapshot 都应使用此方法。
|
|
223
|
-
*
|
|
224
|
-
* silent 子 agent(如 memory 自动整理的后台 explore 子代理)属于系统级后台任务,
|
|
225
|
-
* 不应展示给用户,否则会导致 tag 数量多于用户实际可见的子 agent,故此处一并过滤,
|
|
226
|
-
* 与 enqueueCompletion 对 silent 的语义保持一致。并发计数 countByParent 不受影响,
|
|
227
|
-
* 仍会统计 silent 子 agent 占用的并发槽位。
|
|
228
|
-
*/
|
|
119
|
+
|
|
229
120
|
listActiveByParent(parentAgentId: string): SubAgentEntry[];
|
|
230
|
-
|
|
231
|
-
* 取走并清空终态通知队列。
|
|
232
|
-
*
|
|
233
|
-
* 主流程:返回 completionQueue 中的所有通知并清空队列。
|
|
234
|
-
* 供 ACode 运行时在 poll_message 调用前后检查子 agent 是否已完成。
|
|
235
|
-
* 每次 poll_message 调用前先调此方法,若有已完成子 agent 则直接返回,无需等待 MCP。
|
|
236
|
-
*/
|
|
121
|
+
|
|
237
122
|
takeCompletedSubAgents(): SubAgentCompletionNotification[];
|
|
238
|
-
|
|
239
|
-
* 等待任意子 agent 到达终态(completed/failed/cancelled)。
|
|
240
|
-
*
|
|
241
|
-
* 主流程:如果 completionQueue 中已有通知,立即 resolve;
|
|
242
|
-
* 否则注册一个 resolve 回调,在下次子 agent 终态事件到达时触发。
|
|
243
|
-
* 供 ACode 运行时在 poll_message 期间 race 子 agent 完成事件。
|
|
244
|
-
*
|
|
245
|
-
* 返回 { promise, cancel }:
|
|
246
|
-
* - promise: 子 agent 终态时 resolve
|
|
247
|
-
* - cancel: 取消等待(poll_message 先返回时调用,清理 resolve 回调)
|
|
248
|
-
*/
|
|
123
|
+
|
|
249
124
|
waitForAnyCompletion(): {
|
|
250
125
|
promise: Promise<SubAgentCompletionNotification>;
|
|
251
126
|
cancel: () => void;
|
|
252
127
|
};
|
|
253
|
-
|
|
128
|
+
|
|
254
129
|
subscribe(subId: string, cb: EventSubscriber): () => void;
|
|
255
|
-
|
|
130
|
+
|
|
256
131
|
dispose(): Promise<void>;
|
|
257
|
-
|
|
258
|
-
* 异步落盘终态记录(指数退避重试),不阻塞主流程。
|
|
259
|
-
*
|
|
260
|
-
* 设计要点:
|
|
261
|
-
* - 内存态已是终态(completed/failed/cancelled),落盘只做历史归档
|
|
262
|
-
* - 落盘失败不回滚内存态,前端看到的是真实终态
|
|
263
|
-
* - 重试覆盖瞬时错误:Windows fs.rename EPERM、writeChain 拥堵、磁盘瞬时不可用
|
|
264
|
-
* - 全部重试失败后仅打日志,下次 bridge 启动时 reconcileZombies 会清理残留
|
|
265
|
-
*
|
|
266
|
-
* 调用方约定:必须用 `void this.persistFinalStatus(...)` 触发,不 await。
|
|
267
|
-
* entry.completionResolve 与 enqueueCompletion 应在此调用之前完成,
|
|
268
|
-
* 保证主流程不被落盘 IO 阻塞。
|
|
269
|
-
*
|
|
270
|
-
* Promise 加入 pendingPersists 集合,供 flushPendingPersists / dispose 等待。
|
|
271
|
-
*/
|
|
132
|
+
|
|
272
133
|
private persistFinalStatus;
|
|
273
|
-
|
|
274
|
-
* 等待所有正在执行的异步终态落盘完成。
|
|
275
|
-
*
|
|
276
|
-
* 主要用途:
|
|
277
|
-
* - 测试在终态后读取 store 前调用,确保落盘已完成
|
|
278
|
-
* - dispose 前调用,避免文件句柄占用导致目录清理失败
|
|
279
|
-
*
|
|
280
|
-
* 生产环境一般不需要调用——落盘失败不影响内存态正确性。
|
|
281
|
-
*/
|
|
134
|
+
|
|
282
135
|
flushPendingPersists(): Promise<void>;
|
|
283
|
-
|
|
284
|
-
* 将子 agent 终态事件入队并通知等待者。
|
|
285
|
-
* 主流程:构建通知对象 -> 入队 completionQueue -> 若有 waitForAnyCompletion 等待者则立即 resolve。
|
|
286
|
-
*/
|
|
136
|
+
|
|
287
137
|
private enqueueCompletion;
|
|
288
138
|
private countByStatus;
|
|
289
139
|
private addToParentMap;
|
|
290
140
|
private removeFromParentMap;
|
|
291
|
-
|
|
292
|
-
* 清理已超过 TTL 的终态 entry(completed/failed/cancelled)。
|
|
293
|
-
* 释放内存,store 仍保留历史记录供查询。
|
|
294
|
-
*/
|
|
141
|
+
|
|
295
142
|
private cleanupCompletedEntries;
|
|
296
|
-
|
|
297
|
-
* 存活期僵尸回收:扫描卡在 pending / running 过久的子 agent 并标记为 failed。
|
|
298
|
-
*
|
|
299
|
-
* 背景:runEntryToCompletion* 会在启动后数秒内把状态翻成 running;若长时间保持
|
|
300
|
-
* pending,说明 startWithRecheck 抛错被调用方静默吞掉、或启动函数从未真正执行,
|
|
301
|
-
* 子 agent 成了孤儿却仍占着 runtime.pendingMemorySubAgents 的 URI 锁,导致该
|
|
302
|
-
* memory 的文件变更通知被永久抑制、永不重试(reconcileZombies 仅在 bridge 启动时跑)。
|
|
303
|
-
* running 卡死则多因 runtime.start()/submit() 挂起。
|
|
304
|
-
*
|
|
305
|
-
* 回收时复用与正常终态一致的处理(store 落盘 failed + emit failed 事件 +
|
|
306
|
-
* 释放 completion + 停 runtime)。runtime 订阅了 failed 事件,会据此清除
|
|
307
|
-
* pendingMemorySubAgents 中的 URI 并进入冷却,从而解除死锁、允许下次重新委托。
|
|
308
|
-
*/
|
|
143
|
+
|
|
309
144
|
private recoverZombieEntries;
|
|
310
|
-
|
|
145
|
+
|
|
311
146
|
private recoverZombie;
|
|
312
|
-
|
|
147
|
+
|
|
313
148
|
private findRecordInStore;
|
|
314
149
|
private handleRuntimeEvent;
|
|
315
150
|
private emitEvent;
|
|
316
151
|
private toRecord;
|
|
317
|
-
|
|
152
|
+
|
|
318
153
|
getContextSnapshot(subId: string): SubAgentContextSnapshot | undefined;
|
|
319
154
|
}
|
|
320
155
|
export {};
|
|
@@ -1,78 +1,29 @@
|
|
|
1
1
|
import type { SubAgentDocument, SubAgentEvent, SubAgentRecord } from "./sub-agent-types.js";
|
|
2
|
-
|
|
3
|
-
* Sub Agent JSON 文件存储,按 agentId 隔离。
|
|
4
|
-
*
|
|
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
|
-
* 设计要点:
|
|
12
|
-
* - 不依赖 agent 工作目录,避免 workspacePath 错误时读取失败
|
|
13
|
-
* - sub-agent 跟随 agent(agentId),不跟随项目工作区
|
|
14
|
-
* - 主记录写操作通过 Promise 链串行化,tmp + rename 原子替换
|
|
15
|
-
* (rename 在 Windows 上目标被打开时会 EPERM,使用 renameWithRetry 退避重试,
|
|
16
|
-
* 重试仍失败时 fallback 到 copyFile + unlink,彻底规避 EPERM 持续场景)
|
|
17
|
-
* - events 走独立文件,避免 tool_start/tool_end 高频落盘阻塞终态 updateStatus
|
|
18
|
-
* (历史教训:events 与 updateStatus 共用 writeChain 时,memory delegate
|
|
19
|
-
* 一次跑数十个工具调用,appendEvent 排队导致 updateStatus 超 5s 超时,
|
|
20
|
-
* 内存已翻终态但 store 仍 running,触发 "status mismatch" 兜底误报)
|
|
21
|
-
*
|
|
22
|
-
* ★ 终态一致性架构(治本方案):
|
|
23
|
-
* - 内存态(SubAgentManager)是运行态的唯一真相源
|
|
24
|
-
* - 终态写入通过 persistFinalStatus 异步重试落盘,不阻塞 completionResolve
|
|
25
|
-
* - 落盘失败不回滚内存态,前端看到的是真实终态
|
|
26
|
-
* - 列表接口不再做"磁盘 running/pending + 内存无 → 改写 failed"的兜底
|
|
27
|
-
* (该兜底是 "status mismatch" 误报的直接来源,已移除)
|
|
28
|
-
* - bridge 启动时 reconcileZombies 一次性清理上次进程残留的僵尸记录
|
|
29
|
-
*
|
|
30
|
-
* 历史保留策略:全部 sub-agent 记录都持久化(含 completed/failed/cancelled),
|
|
31
|
-
* 按 startedAt 倒序排列。dashboard 按需分页读取。
|
|
32
|
-
*/
|
|
2
|
+
|
|
33
3
|
export declare class SubAgentStore {
|
|
34
4
|
private readonly dir;
|
|
35
5
|
private writeChain;
|
|
36
6
|
constructor();
|
|
37
|
-
|
|
7
|
+
|
|
38
8
|
private filePath;
|
|
39
|
-
|
|
9
|
+
|
|
40
10
|
private eventsFilePath;
|
|
41
|
-
|
|
11
|
+
|
|
42
12
|
read(agentId: string): Promise<SubAgentDocument>;
|
|
43
|
-
|
|
13
|
+
|
|
44
14
|
get(agentId: string, subId: string): Promise<SubAgentRecord | null>;
|
|
45
|
-
|
|
15
|
+
|
|
46
16
|
write(agentId: string, subAgents: SubAgentRecord[]): Promise<void>;
|
|
47
|
-
|
|
17
|
+
|
|
48
18
|
upsert(agentId: string, record: SubAgentRecord): Promise<void>;
|
|
49
|
-
|
|
19
|
+
|
|
50
20
|
updateStatus(agentId: string, subId: string, patch: Partial<SubAgentRecord>): Promise<void>;
|
|
51
|
-
|
|
21
|
+
|
|
52
22
|
list(agentId: string): Promise<SubAgentRecord[]>;
|
|
53
|
-
|
|
54
|
-
* 追加一条事件到指定 sub-agent 的事件日志文件。
|
|
55
|
-
*
|
|
56
|
-
* 走独立 jsonl 文件(每行一个事件,append-only),不进主 writeChain:
|
|
57
|
-
* - O(1) 追加,无需 read-modify-write 全量主文件
|
|
58
|
-
* - 不阻塞终态 updateStatus(避免 status mismatch 兜底误报)
|
|
59
|
-
* - 高频 tool_start/tool_end 落盘成本恒定,与历史记录数无关
|
|
60
|
-
*
|
|
61
|
-
* 失败时仅打日志(fire-and-forget 语义),不阻断 sub-agent 运行。
|
|
62
|
-
* 调用方(sub-agent-manager.emitEvent)已用 void + catch 包装。
|
|
63
|
-
*/
|
|
23
|
+
|
|
64
24
|
appendEvent(agentId: string, subId: string, event: SubAgentEvent): Promise<void>;
|
|
65
|
-
|
|
66
|
-
* 读取指定 sub-agent 的全部历史事件(按时间顺序)。
|
|
67
|
-
*
|
|
68
|
-
* 优先读独立 jsonl 文件;不存在时回退到主记录文件中的 events 字段
|
|
69
|
-
* (向后兼容旧版本数据:旧版把 events 内嵌在 SubAgentRecord 中)。
|
|
70
|
-
* 供 SSE 路由在客户端重连时补发历史 tool 事件。
|
|
71
|
-
*/
|
|
25
|
+
|
|
72
26
|
readEvents(agentId: string, subId: string): Promise<SubAgentEvent[]>;
|
|
73
|
-
|
|
74
|
-
* 扫描所有 agent 文件,把 status="running"/"pending" 的记录修正为 "failed"。
|
|
75
|
-
* 在 bridge 启动时调用,清理上次进程异常退出留下的僵尸记录。
|
|
76
|
-
*/
|
|
27
|
+
|
|
77
28
|
reconcileZombies(): Promise<number>;
|
|
78
29
|
}
|
|
@@ -1,17 +1,8 @@
|
|
|
1
1
|
import type { ACodeBuiltInTool } from "./built-in-file-tools.js";
|
|
2
2
|
import type { SubAgentType, SubAgentStatus } from "./sub-agent-types.js";
|
|
3
|
-
|
|
4
|
-
* Sub-agent 工具集依赖(由 runtime.ts 注入 SubAgentManager 句柄)。
|
|
5
|
-
*
|
|
6
|
-
* 工具集包含 5 个工具:
|
|
7
|
-
* 1. sub_agent: 非阻塞 spawn 子 agent,立即返回 subId
|
|
8
|
-
* 2. list_sub_agents: 列出当前 agent 的所有子 agent(运行中 + 历史)
|
|
9
|
-
* 3. get_sub_agent_status: 查询某子 agent 的实时状态
|
|
10
|
-
* 4. await_sub_agents: 阻塞等待指定 sub-agent 数组完成
|
|
11
|
-
* 5. abort_sub_agent: 终止某子 agent
|
|
12
|
-
*/
|
|
3
|
+
|
|
13
4
|
export interface ACodeSubAgentToolDeps {
|
|
14
|
-
|
|
5
|
+
|
|
15
6
|
spawnSubAgent: (opts: {
|
|
16
7
|
subagentType: SubAgentType;
|
|
17
8
|
description: string;
|
|
@@ -19,24 +10,24 @@ export interface ACodeSubAgentToolDeps {
|
|
|
19
10
|
}) => Promise<{
|
|
20
11
|
subId: string;
|
|
21
12
|
}>;
|
|
22
|
-
|
|
13
|
+
|
|
23
14
|
listSubAgents: () => Promise<{
|
|
24
15
|
running: Array<SubAgentInfo>;
|
|
25
16
|
history: Array<SubAgentInfo>;
|
|
26
17
|
}>;
|
|
27
|
-
|
|
18
|
+
|
|
28
19
|
getSubAgentStatus: (subId: string) => Promise<SubAgentDetail | null>;
|
|
29
|
-
|
|
20
|
+
|
|
30
21
|
awaitSubAgents: (subIds: string[], timeoutMs?: number) => Promise<Array<{
|
|
31
22
|
subId: string;
|
|
32
23
|
output: string;
|
|
33
24
|
error?: string;
|
|
34
25
|
status: SubAgentStatus;
|
|
35
26
|
}>>;
|
|
36
|
-
|
|
27
|
+
|
|
37
28
|
abortSubAgent: (subId: string) => Promise<void>;
|
|
38
29
|
}
|
|
39
|
-
|
|
30
|
+
|
|
40
31
|
export interface SubAgentInfo {
|
|
41
32
|
subId: string;
|
|
42
33
|
subagentType: SubAgentType;
|
|
@@ -46,7 +37,7 @@ export interface SubAgentInfo {
|
|
|
46
37
|
endedAt?: number;
|
|
47
38
|
durationMs?: number;
|
|
48
39
|
}
|
|
49
|
-
|
|
40
|
+
|
|
50
41
|
export interface SubAgentDetail extends SubAgentInfo {
|
|
51
42
|
prompt: string;
|
|
52
43
|
result?: string;
|
|
@@ -67,5 +58,5 @@ export declare function createListSubAgentsTool(deps: ACodeSubAgentToolDeps): AC
|
|
|
67
58
|
export declare function createGetSubAgentStatusTool(deps: ACodeSubAgentToolDeps): ACodeBuiltInTool;
|
|
68
59
|
export declare function createAwaitSubAgentsTool(deps: ACodeSubAgentToolDeps): ACodeBuiltInTool;
|
|
69
60
|
export declare function createAbortSubAgentTool(deps: ACodeSubAgentToolDeps): ACodeBuiltInTool;
|
|
70
|
-
|
|
61
|
+
|
|
71
62
|
export declare function createSubAgentTools(deps: ACodeSubAgentToolDeps): ACodeBuiltInTool[];
|
|
@@ -1,79 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Sub agent 是由主 agent 通过 task 工具 spawn 的轻量级子代理,
|
|
5
|
-
* 拥有独立的 ACodeRuntime 实例(独立 context window)。
|
|
6
|
-
* 状态持久化到 ~/.acode/sub-agents/{agentId}.json(与 todo 同构)。
|
|
7
|
-
*/
|
|
8
|
-
/** Sub agent 类型(决定工具权限) */
|
|
1
|
+
|
|
2
|
+
|
|
9
3
|
export type SubAgentType = "general" | "explore";
|
|
10
|
-
|
|
4
|
+
|
|
11
5
|
export type SubAgentStatus = "pending" | "running" | "completed" | "failed" | "cancelled";
|
|
12
|
-
|
|
6
|
+
|
|
13
7
|
export interface SubAgentContextSnapshot {
|
|
14
|
-
|
|
8
|
+
|
|
15
9
|
currentTool?: string;
|
|
16
|
-
|
|
10
|
+
|
|
17
11
|
lastAssistantText?: string;
|
|
18
|
-
|
|
12
|
+
|
|
19
13
|
tokenUsage: {
|
|
20
14
|
input: number;
|
|
21
15
|
output: number;
|
|
22
16
|
};
|
|
23
|
-
|
|
17
|
+
|
|
24
18
|
messageCount: number;
|
|
25
|
-
|
|
19
|
+
|
|
26
20
|
updatedAt: string;
|
|
27
21
|
}
|
|
28
|
-
|
|
22
|
+
|
|
29
23
|
export interface SubAgentRecord {
|
|
30
|
-
|
|
24
|
+
|
|
31
25
|
subId: string;
|
|
32
|
-
|
|
26
|
+
|
|
33
27
|
parentAgentId: string;
|
|
34
|
-
|
|
28
|
+
|
|
35
29
|
parentSessionId: string;
|
|
36
|
-
|
|
30
|
+
|
|
37
31
|
subagentType: SubAgentType;
|
|
38
|
-
|
|
32
|
+
|
|
39
33
|
description: string;
|
|
40
|
-
|
|
34
|
+
|
|
41
35
|
prompt: string;
|
|
42
|
-
|
|
36
|
+
|
|
43
37
|
status: SubAgentStatus;
|
|
44
|
-
|
|
38
|
+
|
|
45
39
|
result?: string;
|
|
46
|
-
|
|
40
|
+
|
|
47
41
|
errorMessage?: string;
|
|
48
|
-
|
|
42
|
+
|
|
49
43
|
startedAt: number;
|
|
50
|
-
|
|
44
|
+
|
|
51
45
|
endedAt?: number;
|
|
52
|
-
|
|
46
|
+
|
|
53
47
|
durationMs?: number;
|
|
54
|
-
|
|
48
|
+
|
|
55
49
|
contextSnapshot?: SubAgentContextSnapshot;
|
|
56
|
-
|
|
50
|
+
|
|
57
51
|
events?: SubAgentEvent[];
|
|
58
|
-
|
|
52
|
+
|
|
59
53
|
availableTools?: string[];
|
|
60
54
|
}
|
|
61
|
-
|
|
55
|
+
|
|
62
56
|
export interface SubAgentDocument {
|
|
63
57
|
agentId: string;
|
|
64
58
|
updatedAt: string;
|
|
65
|
-
|
|
59
|
+
|
|
66
60
|
subAgents: SubAgentRecord[];
|
|
67
61
|
}
|
|
68
|
-
|
|
62
|
+
|
|
69
63
|
export interface SubAgentEvent {
|
|
70
|
-
|
|
64
|
+
|
|
71
65
|
type: "spawned" | "running" | "tool_start" | "tool_end" | "delta" | "progress" | "completed" | "failed" | "cancelled";
|
|
72
|
-
|
|
66
|
+
|
|
73
67
|
subId: string;
|
|
74
|
-
|
|
68
|
+
|
|
75
69
|
timestamp: string;
|
|
76
|
-
|
|
70
|
+
|
|
77
71
|
data: {
|
|
78
72
|
tool?: string;
|
|
79
73
|
text?: string;
|
|
@@ -1,42 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
2
|
export interface TodoItem {
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
content: string;
|
|
5
5
|
status: "pending" | "in_progress" | "completed" | "cancelled";
|
|
6
6
|
priority: "high" | "medium" | "low";
|
|
7
7
|
}
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
export interface TodoDocument {
|
|
10
10
|
agentId: string;
|
|
11
11
|
updatedAt: string;
|
|
12
|
-
|
|
13
|
-
* 整个 todo 列表的任务背景(必填)—— 描述该批任务的整体来源、目标、约束。
|
|
14
|
-
* 写入时由 todo_write 顶层传入,读取时一并返回,便于恢复任务上下文。
|
|
15
|
-
*/
|
|
12
|
+
|
|
16
13
|
background: string;
|
|
17
14
|
todos: TodoItem[];
|
|
18
15
|
}
|
|
19
|
-
|
|
20
|
-
* Todo JSON 文件存储,按 agentId 隔离。
|
|
21
|
-
* 文件路径:{homedir}/.acode/todos/{agentId}.json
|
|
22
|
-
*
|
|
23
|
-
* 路径与 bridge 现有 ~/.acode/cmd-dist/ 惯例一致,固定使用家目录:
|
|
24
|
-
* - 不依赖 agent 工作目录,避免 workspacePath 错误时读取失败
|
|
25
|
-
* - todo 跟随 agent(agentId),不跟随项目工作区
|
|
26
|
-
*
|
|
27
|
-
* 并发安全:同一 TodoStore 实例的写操作通过 Promise 链串行化,
|
|
28
|
-
* 避免同一 agentId 的并发 todo_write 互相覆盖。
|
|
29
|
-
* 写入采用 tmp + rename 原子替换,防止半写损坏。
|
|
30
|
-
* (rename 在 Windows 上目标被打开时会 EPERM,使用 renameWithRetry 短退避重试)
|
|
31
|
-
*/
|
|
16
|
+
|
|
32
17
|
export declare class TodoStore {
|
|
33
18
|
private readonly todosDir;
|
|
34
19
|
private writeChain;
|
|
35
20
|
constructor();
|
|
36
|
-
|
|
21
|
+
|
|
37
22
|
private filePath;
|
|
38
|
-
|
|
23
|
+
|
|
39
24
|
read(agentId: string): Promise<TodoDocument>;
|
|
40
|
-
|
|
25
|
+
|
|
41
26
|
write(agentId: string, background: string, todos: TodoItem[]): Promise<void>;
|
|
42
27
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ACodeBuiltInTool } from "./built-in-file-tools.js";
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
export declare function createTodoWriteTool(agentId: string): ACodeBuiltInTool;
|
|
4
|
-
|
|
4
|
+
|
|
5
5
|
export declare function createTodoReadTool(agentId: string): ACodeBuiltInTool;
|