diff --git a/fix-tests.sh b/fix-tests.sh index 86d1d8b78..9c4617950 100755 --- a/fix-tests.sh +++ b/fix-tests.sh @@ -30,7 +30,7 @@ When a test fails: - Flaky (races, timing) → make it deterministic - 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: - Refactor repeated code RUTHLESSLY. Extract shared helpers across test files. diff --git a/packages/server/src/server/daemon-e2e/git-operations.e2e.test.ts b/packages/server/src/server/daemon-e2e/git-operations.e2e.test.ts index 5101a0be9..f3eac5961 100644 --- a/packages/server/src/server/daemon-e2e/git-operations.e2e.test.ts +++ b/packages/server/src/server/daemon-e2e/git-operations.e2e.test.ts @@ -858,122 +858,5 @@ describe("daemon E2E", () => { 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 - ); }); - - }); diff --git a/packages/server/src/server/session.ts b/packages/server/src/server/session.ts index a9534588c..9fd79539d 100644 --- a/packages/server/src/server/session.ts +++ b/packages/server/src/server/session.ts @@ -1789,7 +1789,7 @@ export class Session { private async handleArchiveAgentRequest(agentId: string, requestId: string): Promise { this.sessionLogger.info({ agentId }, `Archiving agent ${agentId}`) - const { archivedAt, archivedRecord } = await this.archiveAgentState(agentId) + const { archivedAt } = await this.archiveAgentState(agentId) this.emit({ type: 'agent_archived', @@ -1799,8 +1799,6 @@ export class Session { requestId, }, }) - - await this.maybeArchivePaseoWorktreeAfterAgentArchive(archivedRecord, requestId) } private async archiveAgentState(agentId: string): Promise<{ @@ -1874,52 +1872,6 @@ export class Session { await this.unarchiveAgentState(matched.id) } - private async maybeArchivePaseoWorktreeAfterAgentArchive( - archivedRecord: StoredAgentRecord, - requestId: string - ): Promise { - 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> { - 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( agentId: string, name: string | undefined, diff --git a/packages/server/vitest.config.ts b/packages/server/vitest.config.ts index ca460972c..a332dbac5 100644 --- a/packages/server/vitest.config.ts +++ b/packages/server/vitest.config.ts @@ -3,20 +3,9 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ resolve: { - alias: [ - { - 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"), - }, - ], + alias: { + "@server": path.resolve(__dirname, "./src"), + }, }, test: { testTimeout: 30000,