Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 22 additions & 11 deletions packages/agent-core-v2/test/agent/task/taskManager.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,14 @@ function createAgentTaskService(options: {
};
}

async function cleanupSessionDir(
sessionDir: string,
...contexts: readonly (TestAgentContext | undefined)[]
): Promise<void> {
for (const ctx of contexts) await ctx?.dispose();
await rm(sessionDir, { recursive: true, force: true, maxRetries: 10, retryDelay: 50 });
}

function registerProcess(
manager: IAgentTaskService,
proc: IHostProcess,
Expand Down Expand Up @@ -681,8 +689,8 @@ describe('AgentTaskService', () => {

it('stops appending persisted foreground output once the output limit trips', async () => {
const sessionDir = await mkdtemp(join(tmpdir(), 'pythinker-bg-limit-fg-'));
const { ctx, manager } = createAgentTaskService({ sessionDir });
try {
const { manager } = createAgentTaskService({ sessionDir });
const chunks = Array.from({ length: 20 }, () => 'x'.repeat(MiB));
const { proc } = sigtermIgnoringProcess(chunks);

Expand All @@ -701,14 +709,14 @@ describe('AgentTaskService', () => {
expect(info).toMatchObject({ status: 'killed' });
expect(output.outputSizeBytes).toBeLessThanOrEqual(LIMIT_BYTES);
} finally {
await rm(sessionDir, { recursive: true, force: true });
await cleanupSessionDir(sessionDir, ctx);
}
});

it('stops appending persisted output once the output limit trips for a detached process task', async () => {
const sessionDir = await mkdtemp(join(tmpdir(), 'pythinker-bg-limit-bg-'));
const { ctx, manager } = createAgentTaskService({ sessionDir });
try {
const { manager } = createAgentTaskService({ sessionDir });
const chunks = Array.from({ length: 20 }, () => 'x'.repeat(MiB));
const { proc } = sigtermIgnoringProcess(chunks);

Expand All @@ -727,14 +735,14 @@ describe('AgentTaskService', () => {
expect(info?.stopReason ?? '').toMatch(/output limit/i);
expect(output.outputSizeBytes).toBeLessThanOrEqual(LIMIT_BYTES);
} finally {
await rm(sessionDir, { recursive: true, force: true });
await cleanupSessionDir(sessionDir, ctx);
}
});

it('does not cap a detached subagent result larger than the process output limit', async () => {
const sessionDir = await mkdtemp(join(tmpdir(), 'pythinker-bg-limit-agent-'));
const { ctx, manager } = createAgentTaskService({ sessionDir });
try {
const { manager } = createAgentTaskService({ sessionDir });
const result = 'y'.repeat(20 * MiB);
const taskId = manager.registerTask(
agentTask(Promise.resolve({ result }), 'big subagent result'),
Expand All @@ -747,7 +755,7 @@ describe('AgentTaskService', () => {
expect(info).toMatchObject({ status: 'completed' });
expect(output.outputSizeBytes).toBe(Buffer.byteLength(result));
} finally {
await rm(sessionDir, { recursive: true, force: true });
await cleanupSessionDir(sessionDir, ctx);
}
});

Expand Down Expand Up @@ -1079,16 +1087,19 @@ describe('AgentTaskService', () => {

it('persists graceful process shutdown as killed when stop was requested', async () => {
const sessionDir = await mkdtemp(join(tmpdir(), 'pythinker-bg-stop-race-'));
const writerFixture = createAgentTaskService({ sessionDir });
const writer = writerFixture.manager;
let readerFixture: TaskServiceFixture | undefined;
try {
const writer = createAgentTaskService({ sessionDir }).manager;
const { proc, resolve } = manuallyResolvedProcess();
const taskId = registerProcess(writer, proc, 'sleep 60', 'persisted race');

const stopPromise = writer.stop(taskId, 'user requested');
resolve(0);
await stopPromise;

const reader = createAgentTaskService({ sessionDir }).manager;
readerFixture = createAgentTaskService({ sessionDir });
const reader = readerFixture.manager;
await reader.loadFromDisk();

expect(reader.getTask(taskId)).toMatchObject({
Expand All @@ -1098,7 +1109,7 @@ describe('AgentTaskService', () => {
stopReason: 'user requested',
});
} finally {
await rm(sessionDir, { recursive: true, force: true });
await cleanupSessionDir(sessionDir, writerFixture.ctx, readerFixture?.ctx);
}
});

Expand Down Expand Up @@ -1285,15 +1296,15 @@ describe('AgentTaskService', () => {

it('getTask on an unknown id does not create persisted state', async () => {
const sessionDir = await mkdtemp(join(tmpdir(), 'pythinker-bg-mgr-missing-'));
const { ctx, manager, persistence } = createAgentTaskService({ sessionDir });
try {
const { ctx, manager, persistence } = createAgentTaskService({ sessionDir });

expect(manager.getTask('bash-bogusss0')).toBeUndefined();

expect(await persistence!.listTasks()).toEqual([]);
await ctx.get(ISessionMetadata).ready;
} finally {
await rm(sessionDir, { recursive: true, force: true });
await cleanupSessionDir(sessionDir, ctx);
}
});

Expand Down
Loading