diff --git a/frontend/src/renderer/components/BoardEmptyState.tsx b/frontend/src/renderer/components/BoardEmptyState.tsx index 9a09fbf8df..61f4642e27 100644 --- a/frontend/src/renderer/components/BoardEmptyState.tsx +++ b/frontend/src/renderer/components/BoardEmptyState.tsx @@ -1,45 +1,108 @@ +import { Fragment, type ReactNode } from "react"; import { Plus } from "lucide-react"; - import { useShell } from "../lib/shell-context"; +import { cn } from "../lib/utils"; import aoLogo from "../assets/ao-logo.png"; import { CreateProjectFlow } from "./CreateProjectFlow"; +import { TopbarButton } from "./TopbarButton"; import { OrchestratorIcon } from "./icons"; +// The four board zones, in flow order — mirrors COLUMNS in SessionsBoard.tsx +// (label + dot color + title tint) so the welcome legend pre-teaches exactly +// what the user will see once the board has sessions. +const FLOW_LEGEND = [ + { label: "Working", dot: "var(--color-working)", titleClass: "text-working" }, + { label: "Needs you", dot: "var(--color-warning)", titleClass: "text-warning" }, + { label: "In review", dot: "var(--color-text-muted)", titleClass: "text-muted-foreground" }, + { label: "Ready to merge", dot: "var(--color-success)", titleClass: "text-success" }, +]; + +// First-launch board state (no projects registered yet): replaces the four +// empty kanban columns with orientation — what this app does, the three steps +// to a first merge, and the same create-project flow the sidebar's + runs. export function BoardWelcome() { const { createProject } = useShell(); return (
-
- -

+
+ +

Welcome to Agent Orchestrator

-

- Add a repository and describe the work. AO runs agents on isolated branches, from start to merge. +

+ Add a git repository, describe the work, and AO coordinates agent sessions on isolated branches. This kanban + board tracks each session from work through review to merge.

+
    + + Choose a local git repository and select the agents AO should use. + + + Tell the orchestrator what you want done; it creates worker sessions on isolated branches. + + + Follow each session from work to review to merge readiness: + + {FLOW_LEGEND.map((zone, index) => ( + + {index > 0 && ( + + )} + + + {zone.label} + + + ))} + + +
+ {({ choosePath, disabled, error, label }) => ( <> - - {error &&

{error}

} + + {error &&

{error}

} )}
-

Starts an orchestrator session for the project.

+

+ Adding a project starts its orchestrator — the agent you talk to. +

); } +function WelcomeStep({ n, title, children }: { n: string; title: string; children: ReactNode }) { + return ( +
  • + {n} + + {title} + {children} + +
  • + ); +} + // Project board with a registered project but no worker sessions yet: a quiet // invitation instead of four empty columns. Actions mirror the board header // (Orchestrator stays the primary, like the topbar) so the vocabulary holds. @@ -60,21 +123,20 @@ export function ProjectBoardEmpty({ }) { return (
    -
    -

    No worker sessions yet

    -

    +

    +

    No worker sessions yet

    +

    Describe a task and the orchestrator plans it, spawns worker sessions, and tracks them here from work to merge.

    - - +
    {spawnError && ( -

    +

    {spawnError}

    )} diff --git a/frontend/src/renderer/components/BrowserPanel.tsx b/frontend/src/renderer/components/BrowserPanel.tsx index 55af7485dc..24830e4c0d 100644 --- a/frontend/src/renderer/components/BrowserPanel.tsx +++ b/frontend/src/renderer/components/BrowserPanel.tsx @@ -4,6 +4,7 @@ import { useBrowserView, type BrowserViewModel } from "../hooks/useBrowserView"; import type { WorkspaceSession } from "../types/workspace"; import { Button } from "./ui/button"; import { Input } from "./ui/input"; +import { cn } from "../lib/utils"; type BrowserPanelProps = { session: WorkspaceSession; @@ -51,8 +52,14 @@ export function BrowserPanelView({ }; return ( -
    -
    +
    + -
    -