diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 4b144c5e1..a6f76e9ca 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -43,6 +43,9 @@ jobs:
- name: Build relay dependency
run: npm run build --workspace=@getpaseo/relay
+ - name: Build server dependency
+ run: npm run build --workspace=@getpaseo/server
+
- name: Typecheck all packages
run: npm run typecheck
diff --git a/packages/app/src/hooks/use-agent-input-draft.live.test.tsx b/packages/app/src/hooks/use-agent-input-draft.live.test.tsx
index a0b6d455a..e94c6ec16 100644
--- a/packages/app/src/hooks/use-agent-input-draft.live.test.tsx
+++ b/packages/app/src/hooks/use-agent-input-draft.live.test.tsx
@@ -1,6 +1,7 @@
import React, { act } from "react";
import { createRoot, type Root } from "react-dom/client";
import { JSDOM } from "jsdom";
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { useDraftStore } from "@/stores/draft-store";
import type { AttachmentMetadata } from "@/attachments/types";
@@ -169,6 +170,7 @@ describe("useAgentInputDraft live contract", () => {
return null;
}
+ const queryClient = new QueryClient();
const container = document.getElementById("root");
if (!container) {
throw new Error("Missing root container");
@@ -176,7 +178,11 @@ describe("useAgentInputDraft live contract", () => {
let root: Root | null = createRoot(container);
await act(async () => {
- root!.render();
+ root!.render(
+
+
+ ,
+ );
});
expect(getLatest().composerState?.statusControls.selectedProvider).toBe("codex");
@@ -184,8 +190,6 @@ describe("useAgentInputDraft live contract", () => {
provider: "codex",
cwd: "/repo",
modeId: "auto",
- model: "gpt-5.4",
- thinkingOptionId: "high",
});
await act(async () => {
@@ -199,7 +203,11 @@ describe("useAgentInputDraft live contract", () => {
root = createRoot(container);
await act(async () => {
- root.render();
+ root.render(
+
+
+ ,
+ );
});
expect(getLatest().text).toBe("hello world");
@@ -228,6 +236,7 @@ describe("useAgentInputDraft live contract", () => {
return null;
}
+ const queryClient = new QueryClient();
const container = document.getElementById("root");
if (!container) {
throw new Error("Missing root container");
@@ -235,7 +244,11 @@ describe("useAgentInputDraft live contract", () => {
const root = createRoot(container);
await act(async () => {
- root.render();
+ root.render(
+
+
+ ,
+ );
});
await act(async () => {
diff --git a/packages/app/src/hooks/use-open-project.test.ts b/packages/app/src/hooks/use-open-project.test.ts
index 415919c4a..b05f038d4 100644
--- a/packages/app/src/hooks/use-open-project.test.ts
+++ b/packages/app/src/hooks/use-open-project.test.ts
@@ -114,7 +114,7 @@ describe("openProjectDirectly", () => {
const tabs = collectAllTabs(layout.root);
expect(tabs).toHaveLength(1);
expect(tabs[0]?.target.kind).toBe("draft");
- expect(replaceRoute).toHaveBeenCalledWith("/h/server-1/workspace/MQ");
+ expect(replaceRoute).toHaveBeenCalledWith("/h/server-1/workspace/1");
});
it("does not navigate or seed tabs when openProject fails", async () => {
diff --git a/packages/app/src/voice/voice-runtime.test.ts b/packages/app/src/voice/voice-runtime.test.ts
index d95b40be9..76a383c68 100644
--- a/packages/app/src/voice/voice-runtime.test.ts
+++ b/packages/app/src/voice/voice-runtime.test.ts
@@ -232,7 +232,6 @@ describe("voice runtime", () => {
});
expect(adapter.audioPlayed).not.toHaveBeenCalled();
- playResolvers.shift()?.(0.1);
playResolvers.shift()!(0.1);
await vi.waitFor(() => {
expect(adapter.audioPlayed).toHaveBeenCalledWith("chunk-0");
@@ -242,7 +241,7 @@ describe("voice runtime", () => {
playResolvers.shift()!(0.1);
await vi.waitFor(() => {
expect(adapter.audioPlayed).toHaveBeenCalledWith("chunk-1");
- expect(runtime.getSnapshot().phase).toBe("playing");
+ expect(runtime.getSnapshot().phase).toBe("waiting");
});
});
@@ -256,7 +255,7 @@ describe("voice runtime", () => {
runtime.onAssistantAudioStarted("server-1");
runtime.onAssistantAudioFinished("server-1");
- expect(runtime.getSnapshot().phase).toBe("playing");
+ expect(runtime.getSnapshot().phase).toBe("waiting");
expect(engine.play).toHaveBeenCalled();
});
@@ -302,8 +301,8 @@ describe("voice runtime", () => {
runtime.onServerSpeechStateChanged("server-1", true);
- expect(engine.stop).toHaveBeenCalledTimes(2);
- expect(engine.clearQueue).toHaveBeenCalledTimes(2);
+ expect(engine.stop).toHaveBeenCalledTimes(1);
+ expect(engine.clearQueue).toHaveBeenCalledTimes(1);
resolvePlay(0.1);
});
diff --git a/packages/server/src/server/agent/agent-manager.test.ts b/packages/server/src/server/agent/agent-manager.test.ts
index 6f4267f8b..d162c3a17 100644
--- a/packages/server/src/server/agent/agent-manager.test.ts
+++ b/packages/server/src/server/agent/agent-manager.test.ts
@@ -3166,7 +3166,7 @@ describe("AgentManager", () => {
id: agent.id,
archivedAt,
updatedAt: archivedAt,
- lastStatus: "idle",
+ lastStatus: "closed",
requiresAttention: false,
attentionReason: null,
attentionTimestamp: null,
diff --git a/packages/server/src/utils/worktree.ts b/packages/server/src/utils/worktree.ts
index 588a8f805..b89ebd634 100644
--- a/packages/server/src/utils/worktree.ts
+++ b/packages/server/src/utils/worktree.ts
@@ -329,7 +329,6 @@ async function execSetupCommand(
const { stdout, stderr } = await execFileAsync(shellInvocation.shell, shellInvocation.args, {
cwd: options.cwd,
env: options.env,
- ...(process.platform === "win32" ? {} : { shell: "/bin/bash" }),
});
return {
command,