Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
c4c38ba
feat: revamp global settings page and remove PR board
Annieeeee11 Jul 18, 2026
752876e
test: drop PullRequestsPage coverage from PR hydration suite
Annieeeee11 Jul 18, 2026
13701f2
fix: polish Report a problem dialog spacing and title size
Annieeeee11 Jul 18, 2026
903ec93
fix: add warning icon to Nightly updates notice
Annieeeee11 Jul 18, 2026
5f24d6f
Merge branch 'main' into feat/settings-page-revamp
Annieeeee11 Jul 18, 2026
d505908
chore: format settings UI files with Prettier
Annieeeee11 Jul 18, 2026
7361328
fix: allowlist LinkedIn company URL and extract settings social links
Annieeeee11 Jul 18, 2026
ad57041
chore: fix Prettier formatting in _shell.tsx
Annieeeee11 Jul 18, 2026
d1d4092
fix: avoid LinkedIn gitleaks false positive in settings test
Annieeeee11 Jul 18, 2026
09ef0e1
fix: allowlist settings social-link test for LinkedIn false positives
Annieeeee11 Jul 18, 2026
4b65be8
fix: address settings-revamp review on docs, telemetry, and gitleaks
Annieeeee11 Jul 19, 2026
4e0bbd3
fix: keep Windows settings sidebar clear of the titlebar
Annieeeee11 Jul 19, 2026
8d3f05c
fix: use a single sidebar toggle on Windows and Linux
Annieeeee11 Jul 19, 2026
f829765
feat: revamp feedback dialog and hide Connect with us
Annieeeee11 Jul 20, 2026
c5fecfe
test: fix feedback dialog tests after form clear-on-submit
Annieeeee11 Jul 20, 2026
4cf8ecd
fix: retune settings chrome and row surfaces
Annieeeee11 Jul 20, 2026
9de1e5a
fix: drop keyboard shortcut hint from feedback dialog footer
Annieeeee11 Jul 20, 2026
f20b044
Merge remote-tracking branch 'upstream/main' into feat/settings-page-…
Annieeeee11 Jul 20, 2026
c91824a
chore: format UpdatesSection and tokens after merge
Annieeeee11 Jul 20, 2026
58043a0
fix: tune sidebar bg token to #17181C
Annieeeee11 Jul 21, 2026
7bfc93c
chore: format sidebar bg token for Prettier
Annieeeee11 Jul 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/.gitleaks.toml
Original file line number Diff line number Diff line change
Expand Up @@ -172,11 +172,16 @@ title = "gitleaks config"
files = ['''^\.?gitleaks.toml$''',
'''(.*?)(png|jpg|gif|doc|docx|pdf|bin|xls|pyc|zip)$''',
'''(go.mod|go.sum)$''']
# Ignore false positives on the public company URL (rule matches brand name + nearby alnum).
regexes = [
'''(?i)linkedin\.com/company/agent-orchestrator''',
]
# Historical false positives from the ReverbCode rewrite graft (#2166).
# All offenders are example secret-patterns in security docs and
# secret-redaction test fixtures, living in files already deleted from
# the tree. The push-event scan walks full history, so these commits are
# allowlisted to keep `main` green without weakening detection on new code.
# Also includes settings-revamp commits that hit LinkedIn false positives.
commits = [
"15ad44633a34151e81737183e6f35889a38ffbcb",
"1efa966296178deaf161853f5bc1abf595e22223",
Expand All @@ -188,4 +193,10 @@ title = "gitleaks config"
"cb2fc088a83b394fc128235f4106bbfc88d8ede8",
"f56338cbabd2185cab706ae09e1471b0bd9b7b43",
"fc7d76ad54d6a7350de0fca298a1294ce8a1f3a2",
"c4c38ba20fc311ad2c89b7016301cabb08c3a4b9",
"45994b6d169d1004a02205b3a7ad23a4b1304ed3",
"73613281ab149c2dd4186fe83c4687c5464150fa",
"2a0c8a0f3e27ae78612b9896f07e0a79b181a431",
"d1d4092df1adfe6f9581b03484845485dfb91b76",
"423f0de6fa12d55785f2cc254e033edb94773a84",
]
21 changes: 1 addition & 20 deletions frontend/e2e/multi-pr.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { expect, test } from "@playwright/test";
// dev:web (VITE_NO_ELECTRON=1) serves lib/mock-data.ts. The api-gateway
// workspace owns a "stacked-auth" session ("auth stack") carrying three PRs:
// #41 open, #42 draft, #40 merged — the multi-PR-per-session case this suite
// guards across the inspector rail and the PR board.
// guards across the inspector rail.

test("the inspector rail stacks every PR a session owns, actionable-first", async ({ page }) => {
await page.goto("/");
Expand All @@ -22,22 +22,3 @@ test("the inspector rail stacks every PR a session owns, actionable-first", asyn
const cards = prSection.locator("text=/^PR #\\d+$/");
await expect(cards).toHaveText(["PR #41", "PR #42", "PR #40"]);
});

test("the PR board lists one row per attributed PR, actionable PRs first", async ({ page }) => {
await page.goto("/#/prs");

await expect(page.getByRole("heading", { name: "Pull requests" })).toBeVisible();

// stacked-auth's three PRs keep actionable-first order across the whole board:
// open #41 before draft #42, and the lone merged PR (#40) sinks to the bottom.
const numbers = await page.locator("tbody tr td:first-child").allTextContents();
expect(numbers.indexOf("#41")).toBeLessThan(numbers.indexOf("#42"));
expect(numbers.indexOf("#42")).toBeLessThan(numbers.indexOf("#40"));
expect(numbers.indexOf("#40")).toBe(numbers.length - 1);

// Open/draft rows are actionable; the merged row is not.
const mergedRow = page.locator("tbody tr", { hasText: "#40" });
await expect(mergedRow.getByRole("button", { name: "Merge" })).toHaveCount(0);
const openRow = page.locator("tbody tr", { hasText: "#41" });
await expect(openRow.getByRole("button", { name: "Merge" })).toBeVisible();
});
17 changes: 4 additions & 13 deletions frontend/src/landing/content/docs/dashboard.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -54,18 +54,9 @@ Keep this change limited to the API route. Do not refactor the shared client.

## Review PRs

Open `/prs` to see every PR created by AO-managed sessions.
PR status lives on the session board and session detail pages. Cards move into **Review** or **Merge** when a linked PR needs attention, and the session detail view shows size, CI state, review decision, and unresolved threads.

The PR page lets you filter by:

| Tab | Shows |
| ---------- | ---------------------------- |
| **All** | Open, merged, and closed PRs |
| **Open** | PRs still in progress |
| **Merged** | Completed PRs |
| **Closed** | Closed but unmerged PRs |

Each PR shows its size, CI state, review decision, and unresolved threads. Use this page when you want a repository-level review queue instead of a session-by-session view.
Use the board when you want a queue of sessions that need review; open a session when you need the full PR context.

## Manage Projects

Expand Down Expand Up @@ -94,7 +85,7 @@ The terminal reconnects automatically when the WebSocket drops. If terminal outp

On smaller screens, the dashboard switches to a mobile layout:

- A bottom tab bar links to Dashboard, PRs, and Orchestrator.
- A bottom tab bar links to Dashboard and Orchestrator.
- Sessions are ordered by urgency: Respond, Merge, Review, Pending, Working.
- Tapping a card opens a bottom sheet with quick actions.
- The terminal opens in a compact full-screen style.
Expand Down Expand Up @@ -124,7 +115,7 @@ The favicon and document title also change when sessions need attention, so you
| `/` | Project overview or current project board |
| `/projects/{projectId}` | One project's board |
| `/projects/{projectId}/settings` | Project behavior settings |
| `/prs` | PR review queue |
| `/settings` | Global app settings |
| `/sessions/{id}` | Session detail and terminal |
| `/projects/{projectId}/sessions/{id}` | Project-scoped session detail |
| `/orchestrators?project={projectId}` | Pick or start an orchestrator session |
Expand Down
20 changes: 3 additions & 17 deletions frontend/src/renderer/__tests__/integration/pr-hydration.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@ import { render, screen } from "@testing-library/react";
import { beforeEach, describe, expect, it, vi } from "vitest";
import type { ReactNode } from "react";

// Drives the real useWorkspaceQuery + real Board / PR-page consumers end to end
// for a normal project, mocking only the HTTP client and the router. Proves PR
// facts carried on the session list flow through the shared workspace cache into
// every consumer.
// Drives the real useWorkspaceQuery + SessionsBoard end to end for a normal
// project, mocking only the HTTP client and the router. Proves PR facts carried
// on the session list flow through the shared workspace cache into the board.
const { getMock, navigateMock } = vi.hoisted(() => ({ getMock: vi.fn(), navigateMock: vi.fn() }));

vi.mock("../../lib/api-client", () => ({
Expand All @@ -21,7 +20,6 @@ vi.mock("@tanstack/react-router", async (importOriginal) => {
});

import { SessionsBoard } from "../../components/SessionsBoard";
import { PullRequestsPage } from "../../components/PullRequestsPage";

// One ordinary project with one worker session that has multiple PRs.
function respondWithProjectAndPRs() {
Expand Down Expand Up @@ -258,16 +256,4 @@ describe("PR hydration for a normal project (#251)", () => {
expect(screen.queryByText("changes requested")).not.toBeInTheDocument();
expect(screen.queryByRole("link", { name: "conflicts" })).not.toBeInTheDocument();
});

it("lists every session PR on the PR page instead of being empty", async () => {
renderWithProviders(<PullRequestsPage />);

expect(await screen.findByText("#278")).toBeInTheDocument();
expect(screen.getByText("#279")).toBeInTheDocument();
expect(screen.getByText("#280")).toBeInTheDocument();
expect(screen.getByText("#281")).toBeInTheDocument();
expect(screen.getByText("#282")).toBeInTheDocument();
expect(screen.queryByText("No open pull requests.")).not.toBeInTheDocument();
expect(screen.getAllByText("fix the bug")).toHaveLength(5);
});
});
2 changes: 1 addition & 1 deletion frontend/src/renderer/components/ConfirmDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ export function ConfirmDialog({
return (
<Dialog.Root open={open} onOpenChange={onOpenChange}>
<Dialog.Portal>
<Dialog.Overlay className="fixed inset-0 z-50 bg-black/50" />
<Dialog.Overlay className="dialog-overlay" />
<Dialog.Content className="fixed left-1/2 top-1/2 z-50 w-125 -translate-x-1/2 -translate-y-1/2 rounded-lg border border-border bg-surface p-4 shadow-lg">
<div className="flex gap-2">
<div className="min-w-0 flex-1">
Expand Down
Loading
Loading