diff --git a/packages/server/src/server/agent/providers/claude-agent.test.ts b/packages/server/src/server/agent/providers/claude-agent.test.ts index d73663c6e..839297eaa 100644 --- a/packages/server/src/server/agent/providers/claude-agent.test.ts +++ b/packages/server/src/server/agent/providers/claude-agent.test.ts @@ -13,6 +13,16 @@ import { import type { AgentStreamEventPayload } from "../../messages.js"; import type { AgentProvider, AgentSessionConfig, AgentStreamEvent, AgentTimelineItem } from "../agent-sdk-types.js"; +const claudeIntegrationEnabled = + process.env.RUN_CLAUDE_AGENT_TESTS === "1" || Boolean(process.env.ANTHROPIC_API_KEY?.trim()?.length); +const describeClaudeIntegration = claudeIntegrationEnabled ? describe : describe.skip; + +if (!claudeIntegrationEnabled) { + console.warn( + "Skipping ClaudeAgentClient integration tests. Set RUN_CLAUDE_AGENT_TESTS=1 and provide ANTHROPIC_API_KEY to enable them." + ); +} + function tmpCwd(): string { const dir = mkdtempSync(path.join(os.tmpdir(), "claude-agent-e2e-")); try { @@ -62,7 +72,7 @@ function isSleepCommandToolCall(item: ToolCallItem): boolean { return inputCommand.includes("sleep 60"); } -describe("ClaudeAgentClient (SDK integration)", () => { +describeClaudeIntegration("ClaudeAgentClient (SDK integration)", () => { test( "responds with text", async () => { @@ -583,10 +593,9 @@ describe("ClaudeAgentClient (SDK integration)", () => { editTool!, hydratedMap, (data) => - Array.isArray((data.result as any)?.files) && - ((data.result as any).files as Array<{ path?: string }>).some((entry) => - (entry.path ?? "").includes("hydrate-proof.txt") - ), + (data.result as any)?.type === "file_write" && + typeof (data.result as any)?.filePath === "string" && + ((data.result as any).filePath as string).includes("hydrate-proof.txt"), ({ live, hydrated }) => { const liveDiff = JSON.stringify(live.result ?? {}); const hydratedDiff = JSON.stringify(hydrated.result ?? {}); diff --git a/packages/server/src/server/terminal-mcp/terminal-manager.test.ts b/packages/server/src/server/terminal-mcp/terminal-manager.test.ts index 2055e94df..b9f218f69 100644 --- a/packages/server/src/server/terminal-mcp/terminal-manager.test.ts +++ b/packages/server/src/server/terminal-mcp/terminal-manager.test.ts @@ -4,6 +4,12 @@ import { findSessionByName, killSession } from "./tmux.js"; const TEST_SESSION = "test-terminal-manager"; +const ANSI_ESCAPE_REGEX = /\u001B[\[\]()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; + +function stripAnsi(value: string): string { + return value.replace(ANSI_ESCAPE_REGEX, ""); +} + describe("TerminalManager - Command Execution", () => { let manager: TerminalManager; @@ -53,10 +59,12 @@ describe("TerminalManager - Command Execution", () => { 5000 ); + const normalizedOutput = stripAnsi(result.output).toLowerCase(); + expect(result.isDead).toBe(true); expect(result.exitCode).not.toBe(0); - expect(result.output).toContain("cannot access"); - expect(result.output).toContain("nonexistent-directory-test"); + expect(normalizedOutput).toContain("nonexistent-directory-test"); + expect(normalizedOutput).toMatch(/cannot access|no such file|not found/); }); it("should handle directory changes in command", async () => { diff --git a/packages/server/test-results-after.txt b/packages/server/test-results-after.txt new file mode 100644 index 000000000..3fb37dacb --- /dev/null +++ b/packages/server/test-results-after.txt @@ -0,0 +1,16 @@ + +> @paseo/server@0.1.0 test +> vitest run + + + RUN v3.2.4 /home/moboudra/dev/voice-dev/packages/server + +stdout | src/server/agent/providers/codex-agent.test.ts > CodexAgentClient (SDK integration) > responds with text +[CodexAgentTest] Running single-turn acknowledgment test + +stdout | src/server/agent/providers/codex-agent.test.ts > CodexAgentClient (SDK integration) > emits tool or command events when writing a file +[CodexAgentTest] Streaming file creation activity + +stdout | src/server/agent/providers/codex-agent.test.ts > CodexAgentClient (SDK integration) > emits Codex tool calls that hydrate into specific UI entries +[CodexAgentTest] Streaming Codex run for tool call hydration test +