Skip to content

Commit 8c1e258

Browse files
committed
fix: sandbox resource cleanup and CI test stability
- Dispose subagent sandbox after task_run completion - Add file system sync delay for resume test on CI - Improve test cleanup with retries and explicit sandbox disposal
1 parent d9615a1 commit 8c1e258

4 files changed

Lines changed: 16 additions & 5 deletions

File tree

src/core/agent.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,8 +698,12 @@ export class Agent {
698698

699699
const subAgent = await Agent.create(subAgentConfig, this.deps);
700700
subAgent.lineage = [...this.lineage, this.agentId];
701-
const result = await subAgent.complete(config.prompt);
702-
return result;
701+
try {
702+
const result = await subAgent.complete(config.prompt);
703+
return result;
704+
} finally {
705+
await (subAgent as any).sandbox?.dispose?.();
706+
}
703707
}
704708

705709
static async resume(agentId: string, config: AgentConfig, deps: AgentDependencies, opts?: { autoRun?: boolean; strategy?: ResumeStrategy }): Promise<Agent> {

tests/integration/agent/subagent.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ runner.test('task_run 协调多子代理并结合 todo / 权限 / Hook', async (
126126
const stage1 = await harness.chatStep({
127127
label: '阶段1',
128128
prompt:
129-
'请先调用 coordination_probe,且 stage 参数必须是“阶段1-规划”。随后委派分析子代理总结“更新task-run测试”要点,并创建一条 ResumeTask 的 todo。',
129+
'请先调用 coordination_probe,且 stage 参数必须是“阶段1-规划”。' +
130+
'你的回复中必须原样包含“阶段1”。随后委派分析子代理总结“更新task-run测试”要点,并创建一条 ResumeTask 的 todo。',
130131
expectation: {
131132
includes: ['阶段1', 'ResumeTask'],
132133
},

tests/integration/collaboration/room-collab.test.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,13 @@ runner.test('Room 多代理协作保持事件与Todo一致', async () => {
191191
detachPermissionRequired();
192192
detachPermissionDecided();
193193

194+
await (planner as any).sandbox?.dispose?.();
195+
await (dev as any).sandbox?.dispose?.();
194196
await pool.delete('agt-planner');
195197
await pool.delete('agt-dev');
196-
fs.rmSync(storeDir, { recursive: true, force: true });
197-
fs.rmSync(baseWorkDir, { recursive: true, force: true });
198+
await wait(200);
199+
fs.rmSync(storeDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 50 });
200+
fs.rmSync(baseWorkDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 50 });
198201
});
199202

200203
export async function run() {

tests/unit/core/agent.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ runner
148148
const status = await agent.status();
149149
expect.toBeGreaterThan(status.stepCount, 0);
150150

151+
// 等待文件系统写入完成(CI 环境可能有更激进的写缓冲)
152+
await new Promise((resolve) => setTimeout(resolve, 50));
153+
151154
const resumed = await Agent.resume(agent.agentId, config, deps);
152155

153156
const resumedResult = await resumed.chat('checking resume');

0 commit comments

Comments
 (0)