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.
Files changed (134) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +22 -126
  2. package/dist/adapter/AdapterRegistry.d.ts +10 -38
  3. package/dist/adapter/ClaudeSdkAdapter.d.ts +21 -84
  4. package/dist/adapter/CodexSdkAdapter.d.ts +2 -10
  5. package/dist/adapter/OpencodeSdkAdapter.d.ts +6 -42
  6. package/dist/adapter/acode-tool-names.d.ts +3 -12
  7. package/dist/adapter/idle-poll-loop.d.ts +4 -16
  8. package/dist/adapter/index.d.ts +1 -4
  9. package/dist/adapter/instance-ai-config-resolver.d.ts +9 -29
  10. package/dist/adapter/types.d.ts +124 -242
  11. package/dist/adapters/cc-switch/common.d.ts +4 -14
  12. package/dist/adapters/cc-switch/index.d.ts +3 -11
  13. package/dist/adapters/cc-switch/mcp-acode.d.ts +1 -7
  14. package/dist/adapters/cc-switch/mcp-claude.d.ts +1 -5
  15. package/dist/adapters/cc-switch/mcp-claudecode.d.ts +1 -5
  16. package/dist/adapters/cc-switch/mcp-codex.d.ts +1 -7
  17. package/dist/adapters/cc-switch/mcp-opencode.d.ts +3 -11
  18. package/dist/adapters/cc-switch/mcp-placeholder.d.ts +1 -5
  19. package/dist/adapters/cc-switch/skill-acode.d.ts +1 -6
  20. package/dist/adapters/cc-switch/skill-claude.d.ts +1 -5
  21. package/dist/adapters/cc-switch/skill-claudecode.d.ts +1 -5
  22. package/dist/adapters/cc-switch/skill-opencode.d.ts +1 -5
  23. package/dist/adapters/cc-switch/skill-placeholder.d.ts +1 -5
  24. package/dist/config.d.ts +39 -57
  25. package/dist/index.d.ts +1 -5
  26. package/dist/middleware/auth.d.ts +4 -22
  27. package/dist/routes/acode-todos.d.ts +1 -9
  28. package/dist/routes/dashboard.d.ts +1 -6
  29. package/dist/routes/events.d.ts +1 -5
  30. package/dist/routes/file-browser.d.ts +2 -8
  31. package/dist/routes/file-diff-rollback.d.ts +13 -41
  32. package/dist/routes/file-snapshot.d.ts +1 -8
  33. package/dist/routes/git.d.ts +18 -91
  34. package/dist/routes/instance.d.ts +4 -15
  35. package/dist/routes/processes.d.ts +1 -5
  36. package/dist/routes/properties.d.ts +1 -5
  37. package/dist/routes/pty.d.ts +9 -36
  38. package/dist/routes/runtime-binding.d.ts +1 -4
  39. package/dist/routes/sessions.d.ts +2 -9
  40. package/dist/routes/sub-agents.d.ts +1 -12
  41. package/dist/routes/task-context.d.ts +1 -6
  42. package/dist/routes/terminal.d.ts +18 -92
  43. package/dist/routes/yml.d.ts +1 -5
  44. package/dist/services/acode-package.d.ts +2 -12
  45. package/dist/services/agent-event-store.d.ts +6 -26
  46. package/dist/services/agent-process-manager.d.ts +30 -184
  47. package/dist/services/ai-source-apply.d.ts +1 -3
  48. package/dist/services/auto-register.d.ts +29 -106
  49. package/dist/services/bridge-package-publish-hooks.d.ts +5 -19
  50. package/dist/services/cc-switch-sdk.d.ts +1 -6
  51. package/dist/services/cli-commands.d.ts +12 -33
  52. package/dist/services/cli-commands.js +6 -6
  53. package/dist/services/event-delta-pusher.d.ts +5 -20
  54. package/dist/services/fileSnapshotStore.d.ts +7 -35
  55. package/dist/services/instance-ai-config-service.d.ts +4 -21
  56. package/dist/services/instance-service.d.ts +1 -10
  57. package/dist/services/instance-state.d.ts +5 -30
  58. package/dist/services/legacy-path-migration.d.ts +1 -1
  59. package/dist/services/lifecycle-state.d.ts +1 -4
  60. package/dist/services/mcp-launch-binding-queue.d.ts +2 -8
  61. package/dist/services/orphan-monitor.d.ts +20 -63
  62. package/dist/services/panel-auth.d.ts +12 -28
  63. package/dist/services/process-detector.d.ts +18 -122
  64. package/dist/services/process-registry.d.ts +30 -150
  65. package/dist/services/ring-buffer.d.ts +9 -42
  66. package/dist/services/runtime-binding.d.ts +2 -9
  67. package/dist/services/runtime-lifecycle-policy.d.ts +3 -15
  68. package/dist/services/session-output.d.ts +14 -67
  69. package/dist/services/startup-config-wizard.d.ts +3 -10
  70. package/dist/services/system-metrics.d.ts +1 -4
  71. package/dist/services/terminal-persistence.d.ts +10 -53
  72. package/dist/services/tool-installer.d.ts +6 -18
  73. package/dist/services/tunnel-client.d.ts +3 -18
  74. package/dist/services/windows-service-manager.d.ts +1 -13
  75. package/dist/services/workspace-files.d.ts +17 -57
  76. package/dist/services/workspace-watch.d.ts +2 -6
  77. package/dist/services/workspaceTaskChangeWatcher.d.ts +13 -51
  78. package/dist/types.d.ts +2 -8
  79. package/dist/utils/instance-ai-config-debug-logger.d.ts +5 -20
  80. package/dist/utils/logger.d.ts +7 -20
  81. package/dist/utils/mcp-utils.d.ts +8 -44
  82. package/dist/utils/path-utils.d.ts +3 -15
  83. package/dist/utils/sdk-package-loader.d.ts +2 -8
  84. package/dist/utils/validation.d.ts +3 -20
  85. package/dist/utils/yaml-utils.d.ts +8 -56
  86. package/node_modules/@cc-switch/sdk/dist/index.d.ts +1 -6
  87. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +11 -42
  88. package/package/acode/dist/ask-user-question-tool.d.ts +7 -20
  89. package/package/acode/dist/built-in-file-tools.d.ts +3 -6
  90. package/package/acode/dist/built-in-symbols-tool.d.ts +1 -4
  91. package/package/acode/dist/builtins/commandArtifacts.d.ts +1 -4
  92. package/package/acode/dist/builtins/shellOutputDecoder.d.ts +3 -18
  93. package/package/acode/dist/commands/commandLoader.d.ts +1 -4
  94. package/package/acode/dist/commands/commandParser.d.ts +1 -4
  95. package/package/acode/dist/compaction.d.ts +38 -175
  96. package/package/acode/dist/config.d.ts +1 -4
  97. package/package/acode/dist/fs-utils.d.ts +1 -19
  98. package/package/acode/dist/hooks/hookBus.d.ts +1 -4
  99. package/package/acode/dist/mcpToolNames.d.ts +2 -8
  100. package/package/acode/dist/parsers/ast-cache.d.ts +7 -20
  101. package/package/acode/dist/parsers/language-detector.d.ts +1 -5
  102. package/package/acode/dist/parsers/language-queries.d.ts +1 -1
  103. package/package/acode/dist/parsers/tree-sitter-loader.d.ts +4 -12
  104. package/package/acode/dist/parsers/types.d.ts +19 -30
  105. package/package/acode/dist/runtime.d.ts +47 -269
  106. package/package/acode/dist/skill-tool.d.ts +3 -23
  107. package/package/acode/dist/sub-agent-manager.d.ts +41 -206
  108. package/package/acode/dist/sub-agent-store.d.ts +12 -61
  109. package/package/acode/dist/sub-agent-tools.d.ts +9 -18
  110. package/package/acode/dist/sub-agent-types.d.ts +32 -38
  111. package/package/acode/dist/todo-store.d.ts +8 -23
  112. package/package/acode/dist/todo-tool.d.ts +2 -2
  113. package/package/acode/dist/types.d.ts +17 -38
  114. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +44 -161
  115. package/package/aws-client-agent-mcp/dist/config.d.ts +4 -18
  116. package/package/aws-client-agent-mcp/dist/constants.d.ts +1 -3
  117. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +25 -95
  118. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +1 -4
  119. package/package/aws-client-agent-mcp/dist/http-client.d.ts +15 -56
  120. package/package/aws-client-agent-mcp/dist/index.d.ts +1 -11
  121. package/package/aws-client-agent-mcp/dist/logger.d.ts +5 -22
  122. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +76 -365
  123. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +21 -83
  124. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +15 -70
  125. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +4 -17
  126. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +23 -92
  127. package/package/aws-client-agent-mcp/dist/messageContent.d.ts +5 -29
  128. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +2 -9
  129. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +17 -55
  130. package/package/aws-client-agent-mcp/dist/types.d.ts +66 -125
  131. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +30 -125
  132. package/package/cc-switch-sdk/dist/index.d.ts +1 -6
  133. package/package/cc-switch-sdk/dist/sdk.d.ts +11 -42
  134. 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
- /** spawn 选项 */
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
- /** 父 agent 的 ACodeRuntimeConfig,子 agent 继承 model/prompt 等 */
28
+
39
29
  parentConfig: ACodeRuntimeConfig;
40
- /** 静默完成:为 true 时子 agent 到达终态后不进入 completionQueue,不通过 poll_message 通知主 agent */
30
+
41
31
  silent?: boolean;
42
32
  }
43
- /** 内存中的 sub-agent entry(含运行时实例) */
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
- /** 该 sub-agent 创建时可用的工具列表(exposedName) */
50
+
61
51
  availableTools: string[];
62
- /** 运行完成后的 Promise resolve/reject(供 awaitCompletion 等待) */
52
+
63
53
  completionResolve?: (result: {
64
54
  output: string;
65
55
  error?: string;
66
56
  }) => void;
67
57
  completionReject?: (err: any) => void;
68
- /** 运行完成 Promise(start 时创建,终态时 settle) */
58
+
69
59
  completionPromise?: Promise<{
70
60
  output: string;
71
61
  error?: string;
72
62
  }>;
73
- /** 静默完成:为 true 时不进入 completionQueue,不通过 poll_message 通知主 agent */
63
+
74
64
  silent?: boolean;
75
- /** 已通过 awaitCompletion 消费:为 true 时不进入 completionQueue,避免 poll_message 重复返回 */
65
+
76
66
  awaited?: boolean;
77
67
  }
78
- /** SubAgentManager 构造配置 */
68
+
79
69
  export interface SubAgentManagerOptions {
80
70
  store: SubAgentStore;
81
- /** 并发上限,默认 5 */
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
- /** 已完成 entry 的清理定时器 */
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
- /** 创建 sub-agent(不立即运行;调 start 才执行) */
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
- /** 取消运行中的 sub-agent */
113
+
213
114
  abort(subId: string): Promise<void>;
214
- /** 获取内存中的 entry */
115
+
215
116
  getSubAgent(subId: string): SubAgentEntry | undefined;
216
- /** 列出某 agent 的全部内存中 sub-agent(含运行中和已完成未清理) */
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
- /** 订阅 sub-agent 事件(subId 或 "*" 全局) */
128
+
254
129
  subscribe(subId: string, cb: EventSubscriber): () => void;
255
- /** 清理所有运行中的 sub-agent(bridge 关闭时调用) */
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
- /** 将孤儿/卡死子 agent 标记为 failed 并走正常终态流程(不依赖 LLM 自报) */
145
+
311
146
  private recoverZombie;
312
- /** 从 store 中查找记录(entry 已从内存清理时使用) */
147
+
313
148
  private findRecordInStore;
314
149
  private handleRuntimeEvent;
315
150
  private emitEvent;
316
151
  private toRecord;
317
- /** 获取当前上下文快照(供 HTTP 路由调用) */
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
- /** 主记录文件路径(按 agentId 隔离,防路径穿越) */
7
+
38
8
  private filePath;
39
- /** 事件日志文件路径(按 agentId + subId 隔离,防路径穿越) */
9
+
40
10
  private eventsFilePath;
41
- /** 读取该 agentId 的完整文档。文件不存在或损坏时返回空文档。 */
11
+
42
12
  read(agentId: string): Promise<SubAgentDocument>;
43
- /** 读取单个 sub-agent 记录 */
13
+
44
14
  get(agentId: string, subId: string): Promise<SubAgentRecord | null>;
45
- /** 全量替换该 agentId 的文档。串行化以避免并发覆盖。 */
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
- /** 列出该 agent 的全部 sub-agent(已按 startedAt 倒序) */
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
- /** spawn 子 agent(不阻塞,不自动 start) */
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
- /** 列出当前 agent 的所有子 agent */
13
+
23
14
  listSubAgents: () => Promise<{
24
15
  running: Array<SubAgentInfo>;
25
16
  history: Array<SubAgentInfo>;
26
17
  }>;
27
- /** 查询某子 agent 的实时状态 */
18
+
28
19
  getSubAgentStatus: (subId: string) => Promise<SubAgentDetail | null>;
29
- /** 阻塞等待指定 sub-agent 数组完成 */
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
- /** 终止某子 agent */
27
+
37
28
  abortSubAgent: (subId: string) => Promise<void>;
38
29
  }
39
- /** 子 agent 摘要信息(列表用) */
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
- /** 子 agent 详情(含实时上下文) */
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
- /** 创建全部 5 个 sub-agent 工具(仅当注入了 SubAgentManager 时调用) */
61
+
71
62
  export declare function createSubAgentTools(deps: ACodeSubAgentToolDeps): ACodeBuiltInTool[];
@@ -1,79 +1,73 @@
1
- /**
2
- * Sub Agent 类型定义。
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
- /** Sub agent 状态机 */
4
+
11
5
  export type SubAgentStatus = "pending" | "running" | "completed" | "failed" | "cancelled";
12
- /** 实时上下文快照(供 dashboard popup 展示) */
6
+
13
7
  export interface SubAgentContextSnapshot {
14
- /** 当前正在执行的工具名(如 "read_file"),无则 undefined */
8
+
15
9
  currentTool?: string;
16
- /** 最近一条 assistant 文本(截断 500 字符) */
10
+
17
11
  lastAssistantText?: string;
18
- /** 累计 token 用量 */
12
+
19
13
  tokenUsage: {
20
14
  input: number;
21
15
  output: number;
22
16
  };
23
- /** 已产生的消息数(含 user/assistant/tool) */
17
+
24
18
  messageCount: number;
25
- /** 最后更新时间(ISO) */
19
+
26
20
  updatedAt: string;
27
21
  }
28
- /** 持久化的单条 sub-agent 记录 */
22
+
29
23
  export interface SubAgentRecord {
30
- /** sub-agent 唯一 ID(= sub-session-id) */
24
+
31
25
  subId: string;
32
- /** 父 agent.id */
26
+
33
27
  parentAgentId: string;
34
- /** 父 agent 的 runtime_session_id(用于校验归属) */
28
+
35
29
  parentSessionId: string;
36
- /** sub-agent 类型 */
30
+
37
31
  subagentType: SubAgentType;
38
- /** LLM 给的 3-5 词任务描述 */
32
+
39
33
  description: string;
40
- /** LLM 给的完整任务 prompt */
34
+
41
35
  prompt: string;
42
- /** 当前状态 */
36
+
43
37
  status: SubAgentStatus;
44
- /** 完成时的最终输出文本(tool output) */
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
- /** 最后一次上下文快照(仅 running 状态有意义,持久化时清空) */
48
+
55
49
  contextSnapshot?: SubAgentContextSnapshot;
56
- /** 工具调用事件历史(仅 tool_start/tool_end,按时间升序)。undefined 表示运行中尚未产生或旧版本记录 */
50
+
57
51
  events?: SubAgentEvent[];
58
- /** 该 sub-agent 创建时可用的工具列表(exposedName) */
52
+
59
53
  availableTools?: string[];
60
54
  }
61
- /** 持久化的 sub-agent 文档结构 */
55
+
62
56
  export interface SubAgentDocument {
63
57
  agentId: string;
64
58
  updatedAt: string;
65
- /** 全部 sub-agent 记录,按 startedAt 倒序 */
59
+
66
60
  subAgents: SubAgentRecord[];
67
61
  }
68
- /** Sub agent 运行时事件(SSE 推送) */
62
+
69
63
  export interface SubAgentEvent {
70
- /** 事件类型 */
64
+
71
65
  type: "spawned" | "running" | "tool_start" | "tool_end" | "delta" | "progress" | "completed" | "failed" | "cancelled";
72
- /** sub-agent ID */
66
+
73
67
  subId: string;
74
- /** 事件时间戳(ISO) */
68
+
75
69
  timestamp: string;
76
- /** 事件数据(按 type 不同结构不同) */
70
+
77
71
  data: {
78
72
  tool?: string;
79
73
  text?: string;
@@ -1,42 +1,27 @@
1
- /** 单条 todo 项 */
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
- /** 持久化的 todo 文档结构 */
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
- /** 文件路径(按 agentId 隔离) */
21
+
37
22
  private filePath;
38
- /** 读取该 agentId 的 todo 文档。文件不存在或损坏时返回空文档。 */
23
+
39
24
  read(agentId: string): Promise<TodoDocument>;
40
- /** 全量替换该 agentId 的 todo 文档(background + todos)。串行化以避免并发覆盖。 */
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
- /** 创建 todo_write 工具(全量替换该 agent 的 todo 列表) */
2
+
3
3
  export declare function createTodoWriteTool(agentId: string): ACodeBuiltInTool;
4
- /** 创建 todo_read 工具(读取该 agent 的 todo 列表,含整体 background) */
4
+
5
5
  export declare function createTodoReadTool(agentId: string): ACodeBuiltInTool;