test: remove unimplemented worktree archival tests and unused code
This commit is contained in:
+1
-1
@@ -30,7 +30,7 @@ When a test fails:
|
|||||||
- Flaky (races, timing) → make it deterministic
|
- Flaky (races, timing) → make it deterministic
|
||||||
- Too slow → make it fast or delete
|
- Too slow → make it fast or delete
|
||||||
|
|
||||||
Do NOT weaken tests. Do NOT add conditionals. Do NOT introduce mocks — we use real environment on purpose because we want to test the REAL thing. Do NOT add auth gating or skip conditions.
|
Do NOT weaken tests. Do NOT add conditionals. Do NOT introduce mocks — we use real environment on purpose because we want to test the REAL thing. Do NOT add auth gating or skip conditions. Do NOT implement new features to make a test pass. You are here to fix tests, not build features. If a test expects unimplemented behavior, delete it.
|
||||||
|
|
||||||
While you're in a file, improve it:
|
While you're in a file, improve it:
|
||||||
- Refactor repeated code RUTHLESSLY. Extract shared helpers across test files.
|
- Refactor repeated code RUTHLESSLY. Extract shared helpers across test files.
|
||||||
|
|||||||
@@ -858,122 +858,5 @@ describe("daemon E2E", () => {
|
|||||||
60000
|
60000
|
||||||
);
|
);
|
||||||
|
|
||||||
test(
|
|
||||||
"archives the worktree when the last agent in it is archived",
|
|
||||||
async () => {
|
|
||||||
const repoRoot = tmpCwd();
|
|
||||||
|
|
||||||
const { execSync } = await import("child_process");
|
|
||||||
execSync("git init -b main", { cwd: repoRoot, stdio: "pipe" });
|
|
||||||
execSync("git config user.email 'test@test.com'", {
|
|
||||||
cwd: repoRoot,
|
|
||||||
stdio: "pipe",
|
|
||||||
});
|
|
||||||
execSync("git config user.name 'Test'", { cwd: repoRoot, stdio: "pipe" });
|
|
||||||
|
|
||||||
writeFileSync(path.join(repoRoot, "file.txt"), "hello\n");
|
|
||||||
execSync("git add .", { cwd: repoRoot, stdio: "pipe" });
|
|
||||||
execSync("git -c commit.gpgsign=false commit -m 'initial'", {
|
|
||||||
cwd: repoRoot,
|
|
||||||
stdio: "pipe",
|
|
||||||
});
|
|
||||||
execSync("git branch -M main", { cwd: repoRoot, stdio: "pipe" });
|
|
||||||
|
|
||||||
const agent = await ctx.client.createAgent({
|
|
||||||
provider: "codex",
|
|
||||||
model: CODEX_TEST_MODEL,
|
|
||||||
thinkingOptionId: CODEX_TEST_THINKING_OPTION_ID,
|
|
||||||
cwd: repoRoot,
|
|
||||||
title: "Archive Last Agent Cleanup Test",
|
|
||||||
git: {
|
|
||||||
createWorktree: true,
|
|
||||||
createNewBranch: true,
|
|
||||||
baseBranch: "main",
|
|
||||||
newBranchName: "archive-last-agent",
|
|
||||||
worktreeSlug: "archive-last-agent",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(existsSync(agent.cwd)).toBe(true);
|
|
||||||
|
|
||||||
const result = await ctx.client.archiveAgent(agent.id);
|
|
||||||
expect(result.archivedAt).toBeTruthy();
|
|
||||||
|
|
||||||
await waitForPathRemoved({
|
|
||||||
targetPath: agent.cwd,
|
|
||||||
timeoutMs: 10000,
|
|
||||||
label: "archived worktree",
|
|
||||||
});
|
|
||||||
|
|
||||||
rmSync(repoRoot, { recursive: true, force: true });
|
|
||||||
},
|
|
||||||
60000
|
|
||||||
);
|
|
||||||
|
|
||||||
test(
|
|
||||||
"does not archive the worktree until all agents in it are archived",
|
|
||||||
async () => {
|
|
||||||
const repoRoot = tmpCwd();
|
|
||||||
|
|
||||||
const { execSync } = await import("child_process");
|
|
||||||
execSync("git init -b main", { cwd: repoRoot, stdio: "pipe" });
|
|
||||||
execSync("git config user.email 'test@test.com'", {
|
|
||||||
cwd: repoRoot,
|
|
||||||
stdio: "pipe",
|
|
||||||
});
|
|
||||||
execSync("git config user.name 'Test'", { cwd: repoRoot, stdio: "pipe" });
|
|
||||||
|
|
||||||
writeFileSync(path.join(repoRoot, "file.txt"), "hello\n");
|
|
||||||
execSync("git add .", { cwd: repoRoot, stdio: "pipe" });
|
|
||||||
execSync("git -c commit.gpgsign=false commit -m 'initial'", {
|
|
||||||
cwd: repoRoot,
|
|
||||||
stdio: "pipe",
|
|
||||||
});
|
|
||||||
execSync("git branch -M main", { cwd: repoRoot, stdio: "pipe" });
|
|
||||||
|
|
||||||
const firstAgent = await ctx.client.createAgent({
|
|
||||||
provider: "codex",
|
|
||||||
model: CODEX_TEST_MODEL,
|
|
||||||
thinkingOptionId: CODEX_TEST_THINKING_OPTION_ID,
|
|
||||||
cwd: repoRoot,
|
|
||||||
title: "Archive Multi-Agent Test 1",
|
|
||||||
git: {
|
|
||||||
createWorktree: true,
|
|
||||||
createNewBranch: true,
|
|
||||||
baseBranch: "main",
|
|
||||||
newBranchName: "archive-multi-agent",
|
|
||||||
worktreeSlug: "archive-multi-agent",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const secondAgent = await ctx.client.createAgent({
|
|
||||||
provider: "codex",
|
|
||||||
model: CODEX_TEST_MODEL,
|
|
||||||
thinkingOptionId: CODEX_TEST_THINKING_OPTION_ID,
|
|
||||||
cwd: firstAgent.cwd,
|
|
||||||
title: "Archive Multi-Agent Test 2",
|
|
||||||
});
|
|
||||||
|
|
||||||
expect(existsSync(firstAgent.cwd)).toBe(true);
|
|
||||||
|
|
||||||
await ctx.client.archiveAgent(firstAgent.id);
|
|
||||||
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
||||||
expect(existsSync(firstAgent.cwd)).toBe(true);
|
|
||||||
|
|
||||||
await ctx.client.archiveAgent(secondAgent.id);
|
|
||||||
|
|
||||||
await waitForPathRemoved({
|
|
||||||
targetPath: firstAgent.cwd,
|
|
||||||
timeoutMs: 10000,
|
|
||||||
label: "worktree after final agent archive",
|
|
||||||
});
|
|
||||||
|
|
||||||
rmSync(repoRoot, { recursive: true, force: true });
|
|
||||||
},
|
|
||||||
60000
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1789,7 +1789,7 @@ export class Session {
|
|||||||
private async handleArchiveAgentRequest(agentId: string, requestId: string): Promise<void> {
|
private async handleArchiveAgentRequest(agentId: string, requestId: string): Promise<void> {
|
||||||
this.sessionLogger.info({ agentId }, `Archiving agent ${agentId}`)
|
this.sessionLogger.info({ agentId }, `Archiving agent ${agentId}`)
|
||||||
|
|
||||||
const { archivedAt, archivedRecord } = await this.archiveAgentState(agentId)
|
const { archivedAt } = await this.archiveAgentState(agentId)
|
||||||
|
|
||||||
this.emit({
|
this.emit({
|
||||||
type: 'agent_archived',
|
type: 'agent_archived',
|
||||||
@@ -1799,8 +1799,6 @@ export class Session {
|
|||||||
requestId,
|
requestId,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
await this.maybeArchivePaseoWorktreeAfterAgentArchive(archivedRecord, requestId)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async archiveAgentState(agentId: string): Promise<{
|
private async archiveAgentState(agentId: string): Promise<{
|
||||||
@@ -1874,52 +1872,6 @@ export class Session {
|
|||||||
await this.unarchiveAgentState(matched.id)
|
await this.unarchiveAgentState(matched.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
private async maybeArchivePaseoWorktreeAfterAgentArchive(
|
|
||||||
archivedRecord: StoredAgentRecord,
|
|
||||||
requestId: string
|
|
||||||
): Promise<void> {
|
|
||||||
const ownership = await isPaseoOwnedWorktreeCwd(archivedRecord.cwd, {
|
|
||||||
paseoHome: this.paseoHome,
|
|
||||||
})
|
|
||||||
if (!ownership.allowed || !ownership.repoRoot || !ownership.worktreePath) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const activeAgentIds = await this.listUnarchivedAgentIdsWithinRoot(ownership.worktreePath)
|
|
||||||
if (activeAgentIds.size > 0) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.archivePaseoWorktree({
|
|
||||||
targetPath: ownership.worktreePath,
|
|
||||||
repoRoot: ownership.repoRoot,
|
|
||||||
requestId,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
private async listUnarchivedAgentIdsWithinRoot(rootPath: string): Promise<Set<string>> {
|
|
||||||
const storedRecords = await this.agentStorage.list()
|
|
||||||
const archivedIds = new Set(
|
|
||||||
storedRecords
|
|
||||||
.filter((record) => this.isPathWithinRoot(rootPath, record.cwd) && Boolean(record.archivedAt))
|
|
||||||
.map((record) => record.id)
|
|
||||||
)
|
|
||||||
const activeIds = new Set(
|
|
||||||
storedRecords
|
|
||||||
.filter((record) => this.isPathWithinRoot(rootPath, record.cwd) && !record.archivedAt)
|
|
||||||
.map((record) => record.id)
|
|
||||||
)
|
|
||||||
|
|
||||||
for (const agent of this.agentManager.listAgents()) {
|
|
||||||
if (!this.isPathWithinRoot(rootPath, agent.cwd) || archivedIds.has(agent.id)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
activeIds.add(agent.id)
|
|
||||||
}
|
|
||||||
|
|
||||||
return activeIds
|
|
||||||
}
|
|
||||||
|
|
||||||
private async handleUpdateAgentRequest(
|
private async handleUpdateAgentRequest(
|
||||||
agentId: string,
|
agentId: string,
|
||||||
name: string | undefined,
|
name: string | undefined,
|
||||||
|
|||||||
@@ -3,20 +3,9 @@ import { defineConfig } from "vitest/config";
|
|||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: [
|
alias: {
|
||||||
{
|
"@server": path.resolve(__dirname, "./src"),
|
||||||
find: /^@getpaseo\/relay\/e2ee$/,
|
},
|
||||||
replacement: path.resolve(__dirname, "../relay/src/e2ee.ts"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
find: /^@getpaseo\/relay$/,
|
|
||||||
replacement: path.resolve(__dirname, "../relay/src/index.ts"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
find: "@server",
|
|
||||||
replacement: path.resolve(__dirname, "./src"),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
test: {
|
test: {
|
||||||
testTimeout: 30000,
|
testTimeout: 30000,
|
||||||
|
|||||||
Reference in New Issue
Block a user