# agent-orchestrator status Current `main` ships a working single-user local loop: the Go daemon and the Electron/React frontend both drive a live daemon over HTTP/SSE/WebSocket. The core GitHub flow works end-to-end: add project → spawn session/orchestrator → attach terminal → observe PR → merge. This file tracks progress. For what the product _is_ and how to run it, see the top-level [`README.md`](../README.md); for the backend mental model see [`architecture.md`](architecture.md). ## Build & test The local gate is the backend Go build and race-enabled test suite: ```bash cd backend && go build ./... && go test -race ./... ``` `npm run lint` (from the repo root) runs `go test ./...` plus golangci-lint. Frontend checks live under `frontend/` (`npm run typecheck`, `npm run build`). See [`AGENTS.md`](../AGENTS.md) for the regen workflow when touching the API surface (`npm run sqlc`, `npm run api`). ## Shipped ### Backend (Go daemon) - Loopback-only HTTP daemon (chi router, CORS, per-request timeout, `/healthz` / `/readyz` / `/shutdown`). - SQLite store with goose migrations and sqlc-generated queries; DB trigger-based change-data-capture into `change_log`. - CDC poller + broadcaster feeding in-process subscribers and the SSE stream at `GET /api/v1/events` (with `Last-Event-ID` replay). - Full session lifecycle over HTTP: list, get, spawn, kill, restore, rename, rollback, cleanup, send, activity, PR claim/list. Orchestrator routes (list/spawn/get) are wired too. - Project CRUD plus per-project config (`PUT /projects/{id}/config`). - PR action engine wired into the API: `POST /prs/{id}/merge` and `/prs/{id}/resolve-comments`. - Review routes registered: `GET /reviews`, `POST /reviews/execute`, `POST /reviews/{id}/send`. - Durable dashboard notifications for `needs_input`, `ready_to_merge`, `pr_merged`, and `pr_closed_unmerged`: backend enrichment/persistence, unread list, live notification stream, and read acknowledgement API. - SCM observer (`internal/observe/scm`) wired into the daemon: GitHub provider, lazy/non-blocking auth, per-PR polling with ETag guards and semantic diffing, feeding PR facts into lifecycle, which sends agent nudges for CI failures, review feedback, and merge conflicts ([#75](https://github.com/aoagents/agent-orchestrator/issues/75), [#108](https://github.com/aoagents/agent-orchestrator/issues/108), [#109](https://github.com/aoagents/agent-orchestrator/issues/109)). - Terminal mux over WebSocket (`/mux`): per-client `zellij attach` PTY. - Lifecycle reducer plus reaper (`internal/observe/reaper`). - Agent adapter platform under `internal/adapters/agent/` (23 adapters) with a registry and `ao hooks` activity dispatch. - OpenAPI spec generated from Go DTOs; frontend TS types generated from it and drift-checked in CI. ### Frontend (Electron + React) - Electron + React 19 + TanStack Router/Query + Tailwind + shadcn primitives. - Real daemon wiring via the generated `openapi-fetch` typed client (`src/api/schema.ts`); mock data only in `VITE_NO_ELECTRON` web-preview mode. - Electron main handles daemon discovery, launch, and status reporting. - Shell: sidebar (projects + sessions, add/remove project), sessions board, session view + inspector, project settings, pull-requests page, spawn-orchestrator flow. - Desktop status and SCM summary V1: session status comes from `GET /api/v1/sessions`; visible/active PR context comes from `GET /api/v1/sessions/{sessionId}/pr`; `GET /api/v1/events` is kept open as an invalidation stream rather than a full PR payload stream. - Concise PR summaries include PR identity, CI state with failing check names and links, human reviewer IDs/counts/links for unresolved review comments, and mergeability reasons. Raw CI logs and review comment bodies are intentionally not part of the desktop V1 API/UI. - Terminal pane (xterm) over the mux WebSocket, with a live SSE events connection and port-rebind on daemon restart. - In-app notification center with unread catch-up over REST, live notification stream updates, explicit open-target actions, mark-read controls, and Electron app toasts while the app is running. ## In flight / not yet a runtime feature - **Tracker lane**: GitHub tracker adapter exists, but there is no daemon observer loop or agent-lifecycle→issue mirroring yet, so the tracker does nothing at runtime ([#112](https://github.com/aoagents/agent-orchestrator/issues/112)). - **Full raw PR/tracker fact surfacing**: the SCM observer writes facts and the desktop consumes concise PR summaries, but exposing the full raw `pr_*` / `tracker_*` CDC events to live consumers ([#110](https://github.com/aoagents/agent-orchestrator/issues/110)) and in `ao session get` ([#111](https://github.com/aoagents/agent-orchestrator/issues/111)) is still open. - **CLI parity for PR/review actions**: merge, resolve-comments, and review are HTTP-only (frontend-driven); there are no `ao pr` / `ao review` commands. Tracking milestone: [`rewrite`](https://github.com/aoagents/agent-orchestrator/milestone/1).