Cut Settings from six tabs to four and stop drowning it in chrome
General (identity, mode, workspaces), Providers, Skills, and Advanced (Composio key, the operator request console, billing, migration) replace the six-tab sprawl. Card-in-card nesting and every decorative subtitle are gone; row actions - provider Check/Manage/Revoke, workspace Add, skill Import, migration Report - reveal on hover or focus instead of shouting all the time. The Composio panel loses its hardcoded org-wide toolkit grid, which the Connectors grants model had already made dead weight, and keeps only the API key. Fixing the flow also surfaced a real bug: provider policy rows remounted on a snapshot-derived key, so any refresh mid-edit wiped the operator's unsaved choices - rows now keep stable identity and edits survive. E2e follows the new layout.
This commit is contained in:
1 parent
2f95fc2f2d
commit
d64cf22feb
11 files changed
+186
-216
No files matched your search
@@ -113,19 +113,27 @@ test("onboards, hires, and creates work in the Electron shell", async () => {
|
||||
await expect(page.getByRole("button", { name: "Refresh" })).toBeVisible();
|
||||
|
||||
await page.getByRole("button", { name: "Settings" }).click();
|
||||
await expect(page.getByText("AI CEO", { exact: true })).toBeVisible();
|
||||
await page.getByRole("button", { name: "Providers" }).click();
|
||||
await page.getByLabel("OpenAI background execution").check();
|
||||
await page.getByRole("button", { name: "Save OpenAI policy" }).click();
|
||||
await expect(page.getByText("Requests", { exact: true })).toBeVisible();
|
||||
|
||||
// The operator request console lives under Advanced.
|
||||
await page.getByRole("button", { name: "Advanced" }).click();
|
||||
await expect(page.getByText("Requests", { exact: true }).first()).toBeVisible();
|
||||
await expect(page.getByLabel("Request provider")).toBeVisible();
|
||||
await expect(page.getByRole("button", { name: "Background" })).toBeVisible();
|
||||
await page.getByLabel("Request prompt").fill("Draft a provider control memo.");
|
||||
await page.getByLabel("Request instructions").fill("Use direct language.");
|
||||
await expect(page.getByLabel("Composio API key")).toBeVisible();
|
||||
|
||||
await page.getByRole("button", { name: "Providers" }).click();
|
||||
await page.getByLabel("OpenAI data policy").selectOption("zero_data_retention");
|
||||
await expect(page.getByLabel("OpenAI background execution")).not.toBeChecked();
|
||||
await page.getByLabel("OpenAI monthly request limit").fill("25");
|
||||
await page.getByRole("button", { name: "Save OpenAI policy" }).click();
|
||||
await expect(page.getByText("0 / 25").first()).toBeVisible();
|
||||
|
||||
await page.getByRole("button", { name: "Skills" }).click();
|
||||
await page.getByRole("button", { name: "Import" }).click();
|
||||
await page.getByLabel("Directory path").fill(createSkillDirectory());
|
||||
@@ -135,7 +143,7 @@ test("onboards, hires, and creates work in the Electron shell", async () => {
|
||||
await page.getByRole("button", { name: "Run tests" }).click();
|
||||
await expect(page.getByText("1/1 passed").first()).toBeVisible();
|
||||
const legacyPath = createLegacyDatabase();
|
||||
await page.getByRole("button", { name: "Migration" }).click();
|
||||
await page.getByRole("button", { name: "Advanced" }).click();
|
||||
await page.getByRole("button", { name: "Report" }).click();
|
||||
await page.getByLabel("Source database path").fill(legacyPath);
|
||||
await page.locator(".modal").getByRole("button", { name: "Create" }).click();
|
||||
@@ -150,12 +158,6 @@ test("onboards, hires, and creates work in the Electron shell", async () => {
|
||||
await page.getByRole("button", { name: "Office" }).click();
|
||||
await expect(page.locator("canvas")).toBeVisible();
|
||||
|
||||
// Composio settings panel
|
||||
await page.getByRole("button", { name: "Settings" }).click();
|
||||
await page.getByRole("button", { name: "Tools", exact: true }).click();
|
||||
await expect(page.getByText("External Tools")).toBeVisible();
|
||||
await expect(page.getByText("GitHub")).toBeVisible();
|
||||
|
||||
// @mention with canonical handle in chat
|
||||
await page.getByRole("button", { name: "Messages" }).click();
|
||||
await page.getByText("general").first().click();
|
||||
@@ -204,7 +206,7 @@ async function verifyPagesDoNotOverflow(page: Page): Promise<void> {
|
||||
await page.getByRole("button", { name: nav, exact: true }).click();
|
||||
await expectPageToFit(page);
|
||||
}
|
||||
for (const tab of ["Workspace", "Billing", "Providers", "Tools", "Skills", "Migration"]) {
|
||||
for (const tab of ["General", "Providers", "Skills", "Advanced"]) {
|
||||
await page.getByRole("button", { name: "Settings" }).click();
|
||||
await page.getByRole("button", { name: tab, exact: true }).click();
|
||||
await expectPageToFit(page);
|
||||
|
||||
@@ -50,7 +50,7 @@ test("captures every page for visual review", async () => {
|
||||
await go(page, "Settings", outDir, "17-settings");
|
||||
await go(page, "Office", outDir, "18-office");
|
||||
|
||||
for (const tab of ["Workspace", "Billing", "Skills", "Migration"]) {
|
||||
for (const tab of ["General", "Providers", "Skills", "Advanced"]) {
|
||||
await page.getByRole("button", { name: "Settings" }).click();
|
||||
await page.getByRole("button", { name: tab }).first().click();
|
||||
await snap(page, outDir, `settings-${tab.toLowerCase()}`);
|
||||
|
||||
Reference in new issue
Block a user