* fix(app): make default send a dropdown Keep the compact three-choice setting behind one anchored control while preserving the selected behavior and persistence flow. * test(app): select default send behavior from its menu The agent-message submission coverage configures send behavior through Settings, so it follows the dropdown interaction rather than the removed segmented buttons.
151 lines
5.1 KiB
TypeScript
151 lines
5.1 KiB
TypeScript
import { buildHostAgentDetailRoute, buildHostWorkspaceRoute } from "@/utils/host-routes";
|
|
import { expect, test } from "../support/fixtures";
|
|
import { createIdleAgent, openWorkspaceWithAgents } from "../support/helpers/archive-tab";
|
|
import { waitForTabBar, expectAgentTabActive } from "../support/helpers/launcher";
|
|
import { seedWorkspace } from "../support/helpers/seed-client";
|
|
import { getServerId } from "../support/helpers/server-id";
|
|
|
|
async function pressSettingsToggleShortcut(page: import("@playwright/test").Page) {
|
|
const modifier = process.platform === "darwin" ? "Meta" : "Control";
|
|
await page.keyboard.press(`${modifier}+Comma`);
|
|
}
|
|
|
|
async function expectSendBehavior(
|
|
page: import("@playwright/test").Page,
|
|
expected: "interrupt" | "queue" | "steer",
|
|
) {
|
|
await expect
|
|
.poll(async () => {
|
|
const raw = await page.evaluate(() => localStorage.getItem("@paseo:app-settings"));
|
|
if (!raw) {
|
|
return null;
|
|
}
|
|
return (JSON.parse(raw) as { sendBehavior?: string }).sendBehavior ?? null;
|
|
})
|
|
.toBe(expected);
|
|
}
|
|
|
|
async function openAgentRouteAndExpectFocused(input: {
|
|
page: import("@playwright/test").Page;
|
|
serverId: string;
|
|
workspaceId: string;
|
|
agentId: string;
|
|
}) {
|
|
await input.page.goto(
|
|
buildHostAgentDetailRoute(input.serverId, input.agentId, input.workspaceId),
|
|
);
|
|
await input.page.waitForURL(
|
|
(url) => url.pathname.includes("/workspace/") && !url.searchParams.has("open"),
|
|
{ timeout: 60_000 },
|
|
);
|
|
await waitForTabBar(input.page);
|
|
await expectAgentTabActive(input.page, input.agentId);
|
|
}
|
|
|
|
test.describe("Settings toggle tab regression", () => {
|
|
test.describe.configure({ timeout: 180_000 });
|
|
|
|
test("toggling settings after changing a setting returns to the same workspace tab", async ({
|
|
page,
|
|
}) => {
|
|
const serverId = getServerId();
|
|
const workspace = await seedWorkspace({ repoPrefix: "settings-toggle-tab-" });
|
|
|
|
try {
|
|
const firstAgent = await createIdleAgent(workspace.client, {
|
|
cwd: workspace.repoPath,
|
|
workspaceId: workspace.workspaceId,
|
|
title: `settings-toggle-a-${Date.now()}`,
|
|
});
|
|
const secondAgent = await createIdleAgent(workspace.client, {
|
|
cwd: workspace.repoPath,
|
|
workspaceId: workspace.workspaceId,
|
|
title: `settings-toggle-b-${Date.now()}`,
|
|
});
|
|
|
|
await openWorkspaceWithAgents(page, [firstAgent, secondAgent]);
|
|
await waitForTabBar(page);
|
|
await expectAgentTabActive(page, secondAgent.id);
|
|
|
|
await pressSettingsToggleShortcut(page);
|
|
await expect(page).toHaveURL(/\/settings\/general$/);
|
|
|
|
const defaultSendTrigger = page.getByRole("button", {
|
|
name: "Default send: Steer",
|
|
exact: true,
|
|
});
|
|
await expect(defaultSendTrigger).toBeVisible();
|
|
await expect(page.getByRole("menuitem", { name: "Queue", exact: true })).toHaveCount(0);
|
|
|
|
await defaultSendTrigger.click();
|
|
await expect(page.getByRole("menuitem", { name: "Steer", exact: true })).toHaveAttribute(
|
|
"aria-checked",
|
|
"true",
|
|
);
|
|
await page.getByRole("menuitem", { name: "Queue", exact: true }).click();
|
|
await expectSendBehavior(page, "queue");
|
|
const queuedDefaultSendTrigger = page.getByRole("button", {
|
|
name: "Default send: Queue",
|
|
exact: true,
|
|
});
|
|
await expect(queuedDefaultSendTrigger).toBeVisible();
|
|
|
|
await queuedDefaultSendTrigger.click();
|
|
await page.getByRole("menuitem", { name: "Interrupt", exact: true }).click();
|
|
await expectSendBehavior(page, "interrupt");
|
|
|
|
await pressSettingsToggleShortcut(page);
|
|
await expect(page).toHaveURL(buildHostWorkspaceRoute(serverId, workspace.workspaceId));
|
|
await waitForTabBar(page);
|
|
await expectAgentTabActive(page, secondAgent.id);
|
|
|
|
await page.reload();
|
|
await waitForTabBar(page);
|
|
await expectAgentTabActive(page, secondAgent.id);
|
|
} finally {
|
|
await workspace.cleanup();
|
|
}
|
|
});
|
|
|
|
test("refresh after navigating between agent routes keeps the latest agent focused", async ({
|
|
page,
|
|
}) => {
|
|
const serverId = getServerId();
|
|
const workspace = await seedWorkspace({ repoPrefix: "agent-route-refresh-" });
|
|
|
|
try {
|
|
const firstAgent = await createIdleAgent(workspace.client, {
|
|
cwd: workspace.repoPath,
|
|
workspaceId: workspace.workspaceId,
|
|
title: `agent-route-refresh-a-${Date.now()}`,
|
|
});
|
|
const secondAgent = await createIdleAgent(workspace.client, {
|
|
cwd: workspace.repoPath,
|
|
workspaceId: workspace.workspaceId,
|
|
title: `agent-route-refresh-b-${Date.now()}`,
|
|
});
|
|
|
|
await openAgentRouteAndExpectFocused({
|
|
page,
|
|
serverId,
|
|
workspaceId: workspace.workspaceId,
|
|
agentId: firstAgent.id,
|
|
});
|
|
await openAgentRouteAndExpectFocused({
|
|
page,
|
|
serverId,
|
|
workspaceId: workspace.workspaceId,
|
|
agentId: secondAgent.id,
|
|
});
|
|
|
|
for (let attempt = 0; attempt < 5; attempt += 1) {
|
|
await page.reload();
|
|
await waitForTabBar(page);
|
|
await expectAgentTabActive(page, secondAgent.id);
|
|
}
|
|
} finally {
|
|
await workspace.cleanup();
|
|
}
|
|
});
|
|
});
|