* feat(app): archive finished subagents together Make the track action clean up finished managed and provider-owned children as one operation while preserving running work. Managed archives remain sequential and provider-owned dismissal stays client-local. * test(app): clarify subagent archive assertions
80 lines
2.8 KiB
TypeScript
80 lines
2.8 KiB
TypeScript
import { test } from "../support/fixtures";
|
|
import { openAgentRoute } from "../support/helpers/mock-agent";
|
|
import { seedWorkspace, type SeededWorkspace } from "../support/helpers/seed-client";
|
|
import {
|
|
archiveFinishedSubagents,
|
|
expectArchiveFinishedInProgress,
|
|
expectArchiveFinishedRetry,
|
|
expectManagedSubagentArchived,
|
|
expectManagedSubagentUnarchived,
|
|
expectSubagentRowGone,
|
|
expectSubagentRowVisible,
|
|
holdManagedSubagentArchiveRequest,
|
|
openSubagentsTrack,
|
|
rejectNextManagedSubagentArchiveRequest,
|
|
seedParentWithSubagent,
|
|
} from "../support/helpers/subagents";
|
|
|
|
test.describe("Archive finished subagents", () => {
|
|
let workspace: SeededWorkspace;
|
|
|
|
test.beforeAll(async () => {
|
|
workspace = await seedWorkspace({ repoPrefix: "archive-finished-subagents-" });
|
|
});
|
|
|
|
test.afterAll(async () => {
|
|
await workspace?.cleanup();
|
|
});
|
|
|
|
test("archives a finished managed child from the track", async ({ page }) => {
|
|
const agents = await seedParentWithSubagent(workspace, {
|
|
parentTitle: "Archive parent",
|
|
childTitle: "Finished child",
|
|
});
|
|
await workspace.client.waitForAgentUpsert(
|
|
agents.child.id,
|
|
(snapshot) => snapshot.status === "idle",
|
|
);
|
|
|
|
const archiveGate = await holdManagedSubagentArchiveRequest(page, agents.child.id);
|
|
await openAgentRoute(page, { workspaceId: agents.workspaceId, agentId: agents.parent.id });
|
|
await openSubagentsTrack(page);
|
|
await expectSubagentRowVisible(page, agents.child.id);
|
|
|
|
await archiveFinishedSubagents(page);
|
|
await archiveGate.waitForRequest();
|
|
|
|
await expectSubagentRowGone(page, agents.child.id);
|
|
await expectArchiveFinishedInProgress(page, 0, 1);
|
|
await expectManagedSubagentUnarchived(workspace, agents.child.id);
|
|
archiveGate.release();
|
|
await expectManagedSubagentArchived(workspace, agents.child.id);
|
|
});
|
|
|
|
test("restores a failed child and retries the archive", async ({ page }) => {
|
|
const agents = await seedParentWithSubagent(workspace, {
|
|
parentTitle: "Retry parent",
|
|
childTitle: "Retry child",
|
|
});
|
|
await workspace.client.waitForAgentUpsert(
|
|
agents.child.id,
|
|
(snapshot) => snapshot.status === "idle",
|
|
);
|
|
|
|
const rejection = await rejectNextManagedSubagentArchiveRequest(page, agents.child.id);
|
|
await openAgentRoute(page, { workspaceId: agents.workspaceId, agentId: agents.parent.id });
|
|
await openSubagentsTrack(page);
|
|
await expectSubagentRowVisible(page, agents.child.id);
|
|
|
|
await archiveFinishedSubagents(page);
|
|
await rejection.waitForRejection();
|
|
|
|
await expectSubagentRowVisible(page, agents.child.id);
|
|
await expectArchiveFinishedRetry(page, 1, 1);
|
|
await archiveFinishedSubagents(page);
|
|
|
|
await expectSubagentRowGone(page, agents.child.id);
|
|
await expectManagedSubagentArchived(workspace, agents.child.id);
|
|
});
|
|
});
|