diff --git a/README.md b/README.md
index de751b3a5..e583ad177 100644
--- a/README.md
+++ b/README.md
@@ -49,17 +49,17 @@ An Agentic IDE that supervises parallel AI coding agents in isolated workspaces,
## Features
-| Feature | Description |
-| :--- | :--- |
-| **Agent-Agnostic Platform** | 23+ agent adapters including [Claude Code](https://code.claude.com/docs/en/overview), [OpenAI Codex](https://openai.com/), [Cursor](https://cursor.com/), [OpenCode](https://opencode.ai/), [Aider](https://aider.chat/), [Amp](https://ampcode.com/manual), [Goose](https://goose-docs.ai/), [GitHub Copilot](https://github.com/features/copilot), [Grok](https://x.ai/grok), [Qwen Code](https://github.com/QwenLM/qwen-code), [Kimi Code](https://www.kimi.com/code), [Cline](https://cline.bot/), [Continue](https://www.continue.dev/), [Kiro](https://kiro.dev/), and more |
-| **Isolated Workspaces** | Each session spawns into its own git worktree with dedicated runtime |
-| **Platform-Native Runtimes** | tmux on Darwin/Linux, conpty on Windows for optimal performance |
-| **Live PR Observation** | Provider-neutral SCM observer with automatic feedback routing |
-| **Automatic Feedback Routing** | CI failures, review comments, and merge conflicts routed to the owning agent |
-| **Durable Facts Storage** | SQLite persists immutable facts with display status derived at read time |
-| **CDC Broadcasting** | DB triggers append changes to change_log, broadcasted via SSE |
-| **Desktop Experience** | Native Electron app with React UI and live terminal streaming |
-| **Loopback-Only Daemon** | HTTP control over 127.0.0.1 with no auth, CORS, or TLS by design |
+| Feature | Description |
+| :----------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Agent-Agnostic Platform** | 23+ agent adapters including [Claude Code](https://code.claude.com/docs/en/overview), [OpenAI Codex](https://openai.com/), [Cursor](https://cursor.com/), [OpenCode](https://opencode.ai/), [Aider](https://aider.chat/), [Amp](https://ampcode.com/manual), [Goose](https://goose-docs.ai/), [GitHub Copilot](https://github.com/features/copilot), [Grok](https://x.ai/grok), [Qwen Code](https://github.com/QwenLM/qwen-code), [Kimi Code](https://www.kimi.com/code), [Cline](https://cline.bot/), [Continue](https://www.continue.dev/), [Kiro](https://kiro.dev/), and more |
+| **Isolated Workspaces** | Each session spawns into its own git worktree with dedicated runtime |
+| **Platform-Native Runtimes** | tmux on Darwin/Linux, conpty on Windows for optimal performance |
+| **Live PR Observation** | Provider-neutral SCM observer with automatic feedback routing |
+| **Automatic Feedback Routing** | CI failures, review comments, and merge conflicts routed to the owning agent |
+| **Durable Facts Storage** | SQLite persists immutable facts with display status derived at read time |
+| **CDC Broadcasting** | DB triggers append changes to change_log, broadcasted via SSE |
+| **Desktop Experience** | Native Electron app with React UI and live terminal streaming |
+| **Loopback-Only Daemon** | HTTP control over 127.0.0.1 with no auth, CORS, or TLS by design |
### Supported Agents
@@ -74,13 +74,14 @@ Works with 23+ CLI-based coding agents including Claude Code, OpenAI Codex, Curs
### Prerequisites
| Requirement | Minimum | Recommended |
-|-------------|---------|-------------|
-| Go | 1.25+ | Latest |
-| Node.js | 20+ | Latest LTS |
-| Git | Any | Latest |
-| pnpm | Any | Latest |
+| ----------- | ------- | ----------- |
+| Go | 1.25+ | Latest |
+| Node.js | 20+ | Latest LTS |
+| Git | Any | Latest |
+| pnpm | Any | Latest |
**Optional:**
+
- `tmux` (Darwin/Linux) - For Unix runtime
- `gh` (GitHub CLI) - For authenticated GitHub API calls
@@ -88,11 +89,11 @@ Works with 23+ CLI-based coding agents including Claude Code, OpenAI Codex, Curs
Download the latest release for your platform:
-| Platform | Download |
-|----------|----------|
-| **Windows** | [Setup.exe](https://github.com/AgentWrapper/agent-orchestrator/releases/latest) |
-| **macOS** | [Agent Orchestrator.dmg](https://github.com/AgentWrapper/agent-orchestrator/releases/latest) |
-| **Linux** | [Agent Orchestrator.AppImage](https://github.com/AgentWrapper/agent-orchestrator/releases/latest) |
+| Platform | Download |
+| ----------- | ------------------------------------------------------------------------------------------------- |
+| **Windows** | [Setup.exe](https://github.com/AgentWrapper/agent-orchestrator/releases/latest) |
+| **macOS** | [Agent Orchestrator.dmg](https://github.com/AgentWrapper/agent-orchestrator/releases/latest) |
+| **Linux** | [Agent Orchestrator.AppImage](https://github.com/AgentWrapper/agent-orchestrator/releases/latest) |
**Direct Download:** [Latest Release](https://github.com/AgentWrapper/agent-orchestrator/releases/latest)
@@ -105,6 +106,7 @@ Agent Orchestrator is a long-running Go daemon built around **inbound/outbound p
**Core mental model:** OBSERVE external facts → UPDATE durable facts → DERIVE display status / ACT
**Key components:**
+
- **Frontend** - Electron + React UI with TanStack Router/Query and shadcn/ui
- **Backend Daemon** - Go-based HTTP server with controllers, services, and adapters
- **Runtime** - Platform-specific: `tmux` on Darwin/Linux, `conpty` on Windows
@@ -117,12 +119,12 @@ For detailed architecture diagrams, data flows, and load-bearing rules, see [arc
## Documentation
-| Document | Description |
-|----------|-------------|
-| [Architecture](docs/architecture.md) | System architecture, data flows, and load-bearing rules |
-| [Backend Code Structure](docs/backend-code-structure.md) | Package-by-package ownership and dependency rules |
-| [AGENTS.md](AGENTS.md) | Contributor and worker-agent contract |
-| [Agent Adapter Contract](docs/agent/README.md) | Agent adapter interface and hook behavior |
+| Document | Description |
+| -------------------------------------------------------- | ------------------------------------------------------- |
+| [Architecture](docs/architecture.md) | System architecture, data flows, and load-bearing rules |
+| [Backend Code Structure](docs/backend-code-structure.md) | Package-by-package ownership and dependency rules |
+| [AGENTS.md](AGENTS.md) | Contributor and worker-agent contract |
+| [Agent Adapter Contract](docs/agent/README.md) | Agent adapter interface and hook behavior |
---
@@ -147,15 +149,15 @@ npx @redwoodjs/agent-ci run --all
All configuration is environment-driven. The daemon takes no config file.
-| Variable | Default | Purpose |
-|----------|---------|---------|
-| `AO_PORT` | `3001` | HTTP bind port |
-| `AO_REQUEST_TIMEOUT` | `60s` | Per-request timeout |
-| `AO_SHUTDOWN_TIMEOUT` | `10s` | Graceful shutdown cap |
-| `AO_RUN_FILE` | `~/.ao/running.json` | PID/port handshake |
-| `AO_DATA_DIR` | `~/.ao/data` | SQLite data directory |
-| `AO_AGENT` | `claude-code` | Compatibility agent adapter |
-| `GITHUB_TOKEN` | - | GitHub auth token |
+| Variable | Default | Purpose |
+| --------------------- | -------------------- | --------------------------- |
+| `AO_PORT` | `3001` | HTTP bind port |
+| `AO_REQUEST_TIMEOUT` | `60s` | Per-request timeout |
+| `AO_SHUTDOWN_TIMEOUT` | `10s` | Graceful shutdown cap |
+| `AO_RUN_FILE` | `~/.ao/running.json` | PID/port handshake |
+| `AO_DATA_DIR` | `~/.ao/data` | SQLite data directory |
+| `AO_AGENT` | `claude-code` | Compatibility agent adapter |
+| `GITHUB_TOKEN` | - | GitHub auth token |
### Health Checks
diff --git a/docs/architecture.md b/docs/architecture.md
index 1a38332f5..ee1b231c0 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -26,12 +26,12 @@ graph TB
EMain["Electron Main Process"]
React["React 19 UI (renderer)"]
TanStack["TanStack Router/Query + shadcn/ui"]
-
+
EMain --> HTTP["HTTP (REST + SSE + WebSocket)"]
React --> HTTP
TanStack --> HTTP
end
-
+
subgraph Backend["Backend Go Daemon"]
HTTP2["HTTP Layer (Controllers)"]
CLI["CLI Layer (Cobra cmd)"]
@@ -44,24 +44,24 @@ graph TB
SCM["SCM Observer
(GitHub)"]
Reaper["Reaper
(Runtime liveness)"]
Storage["Storage + CDC
(SQLite with triggers)"]
-
+
CLI --> Service
HTTP2 --> Service
Service --> SessionMgr
SessionMgr --> RuntimeSelect
-
+
RuntimeSelect -->|Darwin/Linux| Tmux
RuntimeSelect -->|Windows| Conpty
-
+
SessionMgr --> Lifecycle
Tmux --> Lifecycle
Conpty --> Lifecycle
-
+
Lifecycle --> Storage
SCM --> Lifecycle
Reaper --> Lifecycle
end
-
+
HTTP -->|"Loopback Only
(127.0.0.1)"| HTTP2
```
@@ -76,13 +76,13 @@ graph LR
AO["Agent Orchestrator"] --> RuntimeCheck{"Platform Check"}
RuntimeCheck -->|Darwin/Linux| TmuxRuntime["tmux Runtime"]
RuntimeCheck -->|Windows| ConptyRuntime["conpty Runtime"]
-
+
TmuxRuntime --> TmuxFeatures["• tmux sessions
• Direct CLI interaction
• Unix PTY integration"]
ConptyRuntime --> ConptyFeatures["• Pty-host server
• B1 binary protocol
• Loopback TCP communication"]
-
+
TmuxFeatures --> Common["Common Interface:
ports.Runtime + ports.Attacher"]
ConptyFeatures --> Common
-
+
Common --> Session["Session Management
& Terminal Streaming"]
```
@@ -118,6 +118,7 @@ sequenceDiagram
```
**Key Features:**
+
- Creates detached tmux sessions with hidden status bar
- Direct tmux CLI interaction for session management
- `tmux send-keys` for input delivery
@@ -141,7 +142,7 @@ sequenceDiagram
Host->>Agent: Execute agent in ConPTY
Agent->>Host: Terminal output
Host->>Host: Store in ring buffer
-
+
Note over AO,Host: Attach Phase
AO->>Host: Dial loopback TCP
Host-->>AO: Scrollback replay (MsgTerminalData)
@@ -149,6 +150,7 @@ sequenceDiagram
```
**Key Features:**
+
- Detached pty-host process with ConPTY
- Custom B1 binary protocol over loopback TCP
- Ring buffer for scrollback storage
@@ -179,43 +181,43 @@ backend/internal/config daemon env/default config
Swappable implementations for each port:
-| Port | Darwin/Linux | Windows | Purpose |
-|------|--------------|---------|---------|
-| **Runtime** | tmux | conpty | Terminal multiplexing and session isolation |
-| **Workspace** | git worktree | git worktree | Isolated working directories |
-| **Agent** | claude-code, codex, etc. | claude-code, codex, etc. | AI coding agent execution |
-| **SCM** | GitHub | GitHub | Pull request observation |
-| **Tracker** | GitHub | GitHub | Issue tracking |
-| **Reviewer** | claude-code | claude-code | Code review execution |
-| **Notifier** | desktop, slack, discord, webhook | desktop, slack, discord, webhook | Notification delivery |
+| Port | Darwin/Linux | Windows | Purpose |
+| ------------- | -------------------------------- | -------------------------------- | ------------------------------------------- |
+| **Runtime** | tmux | conpty | Terminal multiplexing and session isolation |
+| **Workspace** | git worktree | git worktree | Isolated working directories |
+| **Agent** | claude-code, codex, etc. | claude-code, codex, etc. | AI coding agent execution |
+| **SCM** | GitHub | GitHub | Pull request observation |
+| **Tracker** | GitHub | GitHub | Issue tracking |
+| **Reviewer** | claude-code | claude-code | Code review execution |
+| **Notifier** | desktop, slack, discord, webhook | desktop, slack, discord, webhook | Notification delivery |
## Session Lifecycle
```mermaid
stateDiagram-v2
[*] --> Creating: POST /api/v1/sessions
-
+
Creating --> WorkspaceCreated: Create git worktree
WorkspaceCreated --> RuntimeCreated: Create tmux/conpty session
RuntimeCreated --> Launching: Execute agent command
Launching --> Spawned: Agent running
-
+
Spawned --> Active: Agent reports activity
Spawned --> Idle: Agent waiting
Spawned --> WaitingInput: Agent needs input
Spawned --> Terminated: Agent exits
-
+
Active --> Idle: Agent finishes task
Active --> WaitingInput: Agent needs input
Active --> Terminated: Agent exits
-
+
Idle --> Active: Agent starts new task
Idle --> WaitingInput: Agent needs input
Idle --> Terminated: Agent exits
-
+
WaitingInput --> Active: User provides input
WaitingInput --> Terminated: Session killed
-
+
Terminated --> [*]: Session cleaned up
```
@@ -240,24 +242,24 @@ sequenceDiagram
CLI->>HTTP: POST /api/v1/sessions
HTTP->>Service: service.Session.Spawn()
Service->>SessionMgr: session_manager.Spawn()
-
+
SessionMgr->>SQLite: Create session row (seed state)
SessionMgr->>Workspace: Workspace.Create()
Workspace-->>SessionMgr: git worktree created
SessionMgr->>Runtime: Runtime.Create()
-
+
alt Darwin/Linux
Runtime->>Runtime: tmux new-session -d -s
else Windows
Runtime->>Runtime: Spawn pty-host + ConPTY
end
-
+
Runtime-->>SessionMgr: Session handle
SessionMgr->>Agent: Get launch command
Agent-->>SessionMgr: Command
Runtime->>Agent: Execute in tmux/ConPTY
Agent->>Lifecycle: Report spawn complete
-
+
Lifecycle->>SQLite: Update session (spawned state)
SQLite->>CDC: Trigger change_log
CDC->>Frontend: SSE session_created event
@@ -276,7 +278,7 @@ sequenceDiagram
Frontend->>HTTP: WebSocket upgrade /api/v1/sessions/{id}/terminal
HTTP->>TerminalMgr: Create terminal session
TerminalMgr->>Runtime: Runtime.Attach(handle, rows, cols)
-
+
alt tmux (Darwin/Linux)
Runtime->>Runtime: tmux attach-session -t
Runtime-->>TerminalMgr: PTY stream
@@ -286,9 +288,9 @@ sequenceDiagram
Runtime->>Runtime: MsgTerminalData (scrollback)
Runtime-->>TerminalMgr: TCP stream
end
-
+
TerminalMgr-->>Frontend: WebSocket terminal stream
-
+
Note over Frontend,Runtime: Bidirectional terminal I/O
```
@@ -301,22 +303,22 @@ graph TD
Start["Session Status Check"] --> Check1{"is_terminated?"}
Check1 -->|Yes| Merged{"Merged PR?"}
Check1 -->|No| Check2{"activity_state = waiting_input?"}
-
+
Merged -->|Yes| Status1["Status: merged"]
Merged -->|No| Status2["Status: terminated"]
-
+
Check2 -->|Yes| Status3["Status: needs_input"]
Check2 -->|No| Check3{"Open PR Facts?"}
-
+
Check3 -->|Yes| PRStatus["PR Pipeline Status:
ci_failed, draft, changes_requested,
mergeable, approved, review_pending, pr_open"]
Check3 -->|No| Check4{"activity_state = active?"}
-
+
Check4 -->|Yes| Status4["Status: working"]
Check4 -->|No| Check5{"Signal capable + <90s grace?"}
-
+
Check5 -->|Yes| Status5["Status: no_signal"]
Check5 -->|No| Status6["Status: idle"]
-
+
PRStatus --> Final["Display Status"]
Status1 --> Final
Status2 --> Final
@@ -340,12 +342,12 @@ graph TD
`session_manager.Manager` performs internal session mutations:
-| Operation | Description |
-|-----------|-------------|
-| **Spawn** | Create row → create workspace → create runtime → execute agent → report spawned |
-| **Kill** | Mark terminated → destroy runtime → destroy workspace |
+| Operation | Description |
+| ----------- | -------------------------------------------------------------------------------------- |
+| **Spawn** | Create row → create workspace → create runtime → execute agent → report spawned |
+| **Kill** | Mark terminated → destroy runtime → destroy workspace |
| **Restore** | Check terminated → restore workspace → create runtime → execute agent → report spawned |
-| **Cleanup** | Reclaim terminated session workspaces |
+| **Cleanup** | Reclaim terminated session workspaces |
### PR Manager
@@ -385,6 +387,7 @@ graph LR
```
**Tables:**
+
- `projects` — Registered repos with soft-delete
- `sessions` — Session facts (activity_state, is_terminated, runtime metadata)
- `pr` — PR facts (state, ci_state, review_decision, mergeability)
@@ -403,15 +406,15 @@ claude-code, codex, aider, cursor, opencode, cline, copilot, grok, droid, amp, a
All configuration via environment variables:
-| Variable | Default | Purpose |
-|----------|---------|---------|
-| `AO_PORT` | `3001` | HTTP bind port |
-| `AO_REQUEST_TIMEOUT` | `60s` | Per-request timeout |
-| `AO_SHUTDOWN_TIMEOUT` | `10s` | Graceful shutdown cap |
-| `AO_RUN_FILE` | `~/.ao/running.json` | PID/port handshake |
-| `AO_DATA_DIR` | `~/.ao/data` | SQLite data directory |
-| `AO_AGENT` | `claude-code` | Compatibility agent |
-| `GITHUB_TOKEN` | — | GitHub auth token |
+| Variable | Default | Purpose |
+| --------------------- | -------------------- | --------------------- |
+| `AO_PORT` | `3001` | HTTP bind port |
+| `AO_REQUEST_TIMEOUT` | `60s` | Per-request timeout |
+| `AO_SHUTDOWN_TIMEOUT` | `10s` | Graceful shutdown cap |
+| `AO_RUN_FILE` | `~/.ao/running.json` | PID/port handshake |
+| `AO_DATA_DIR` | `~/.ao/data` | SQLite data directory |
+| `AO_AGENT` | `claude-code` | Compatibility agent |
+| `GITHUB_TOKEN` | — | GitHub auth token |
**Runtime selection is automatic** based on platform — no configuration needed.
diff --git a/docs/backend-code-structure.md b/docs/backend-code-structure.md
index a53ea3d1f..8383eb24f 100644
--- a/docs/backend-code-structure.md
+++ b/docs/backend-code-structure.md
@@ -29,7 +29,7 @@ graph TB
CLI["cmd/ao
CLI entrypoint"]
Main["main.go
Daemon entrypoint"]
end
-
+
subgraph CoreLayer["Core Layer"]
Domain["domain
Shared vocabulary"]
Ports["ports
Capability interfaces"]
@@ -37,7 +37,7 @@ graph TB
SessionMgr["session_manager
Internal commands"]
Lifecycle["lifecycle
Fact reducer"]
end
-
+
subgraph AdapterLayer["Adapter Layer"]
AgentAdapters["adapters/agent/*
23+ agents"]
RuntimeAdapters["adapters/runtime/*
tmux + conpty"]
@@ -45,7 +45,7 @@ graph TB
SCMAdapters["adapters/scm/*
GitHub"]
TrackerAdapters["adapters/tracker/*
GitHub"]
end
-
+
subgraph Infrastructure["Infrastructure"]
Storage["storage/sqlite
Persistence"]
CDC["cdc
Change delivery"]
@@ -55,31 +55,31 @@ graph TB
Daemon["daemon
Composition root"]
Config["config
Configuration"]
end
-
+
CLI --> CLI2
Main --> Daemon
-
+
Daemon --> Services
Daemon --> AdapterLayer
Daemon --> Infrastructure
-
+
Services --> Domain
Services --> Ports
Services --> SessionMgr
-
+
SessionMgr --> Ports
SessionMgr --> Lifecycle
-
+
AdapterLayer --> Ports
AdapterLayer --> Domain
-
+
HTTPD --> Services
CLI2 --> HTTPD
-
+
Services --> Storage
Lifecycle --> Storage
Storage --> CDC
-
+
Terminal --> RuntimeAdapters
HTTPD --> Terminal
```
@@ -90,18 +90,18 @@ graph TB
graph LR
Controllers["httpd/controllers"] -->|calls| Services["service/*"]
Controllers2["cli commands"] -->|calls| HTTP["httpd"]
-
+
Services -->|orchestrates| SessionMgr["session_manager"]
Services -->|queries| Storage["storage/sqlite"]
-
+
SessionMgr -->|uses| Runtime["ports.Runtime"]
SessionMgr -->|uses| Workspace["ports.Workspace"]
SessionMgr -->|uses| Agent["ports.Agent"]
SessionMgr -->|reports to| Lifecycle["lifecycle"]
-
+
Runtime -->|implemented by| Tmux["adapters/runtime/tmux"]
Runtime -->|implemented by| Conpty["adapters/runtime/conpty"]
-
+
Lifecycle -->|persists to| Storage
Storage -->|triggers| CDC["cdc"]
CDC -->|broadcasts to| Frontend["Frontend subscribers"]
@@ -114,12 +114,14 @@ graph LR
`domain` is AO's shared product language. Keep it stable and free of infrastructure imports.
**Belongs here:**
+
- Shared IDs: `ProjectID`, `SessionID`, `IssueID`
- Shared enums and status vocabulary
- Durable fact records that multiple packages must agree on
- PR, tracker, project, and session vocabulary (not transport-specific)
**Does not belong here:**
+
- HTTP request/response DTOs
- CLI output shapes
- OpenAPI wrapper/envelope types
@@ -134,6 +136,7 @@ graph LR
`service` packages are the controller-facing application boundary.
**Belongs here:**
+
- Resource use cases called by HTTP controllers and CLI-backed API flows
- Resource read models and command/result types
- Display-model assembly (session status derived from session and PR facts)
@@ -141,6 +144,7 @@ graph LR
- Small store interfaces consumed by the service
**Does not belong here:**
+
- Low-level runtime/workspace/agent process control
- Raw sqlc generated rows as public service results
- HTTP routing, path parsing, status-code decisions, or OpenAPI generation
@@ -151,12 +155,14 @@ graph LR
`session_manager` owns internal session commands: spawn, restore, kill, cleanup, and send-related orchestration over runtime, workspace, agent, storage, messenger, and lifecycle dependencies.
**Belongs here:**
+
- Multi-step session mutations
- Rollback/cleanup sequencing when spawn partially succeeds
- Resource teardown safety
- Internal errors (not found, terminated, not restorable)
**Does not belong here:**
+
- HTTP request decoding
- CLI formatting
- Controller-facing list/get read-model assembly
@@ -169,11 +175,13 @@ The split is intentional: `service/session` is the product/API boundary; `sessio
`lifecycle` is the canonical write path for durable session lifecycle facts. It reduces runtime observations, activity signals, spawn completion, termination, and PR observations into small persisted facts.
**Belongs here:**
+
- Updates to lifecycle-owned session facts
- Guardrails around runtime/activity observations
- Lifecycle-triggered agent nudges for actionable PR facts
**Does not belong here:**
+
- Display status persistence
- HTTP/CLI DTOs
- Direct adapter implementation details
@@ -184,6 +192,7 @@ The split is intentional: `service/session` is the product/API boundary; `sessio
`ports` contains narrow capability interfaces and shared adapter-facing structs. It connects core code to replaceable systems.
**Capability interfaces:**
+
- `Runtime` — Create/Destroy/IsAlive for tmux/conpty sessions
- `Workspace` — Git worktree creation/destruction
- `Agent` — Agent launch, restore, hooks, session info
@@ -193,11 +202,13 @@ The split is intentional: `service/session` is the product/API boundary; `sessio
- `AgentMessenger` — Message delivery to agents
**Belongs here:**
+
- Interfaces consumed by core packages and implemented by adapters
- Capability structs: `RuntimeConfig`, `WorkspaceConfig`, `SpawnConfig`
- Vocabulary needed at the boundary between core orchestration and adapters
**Does not belong here:**
+
- Resource read models (project/session API responses)
- HTTP request/response DTOs
- sqlc rows
@@ -214,15 +225,16 @@ Adapters are concrete implementations of external systems. They should be leaves
graph LR
RunSelect["runtimeselect"] -->|Darwin/Linux| Tmux["tmux
Unix PTY integration"]
RunSelect -->|Windows| Conpty["conpty
ConPTY + B1 protocol"]
-
+
Tmux -->|implements| RuntimePort["ports.Runtime"]
Conpty -->|implements| RuntimePort
-
+
Tmux -->|uses| PtyExec["ptyexec
Unix PTY spawning"]
Conpty -->|uses| PtyHost["Pty-host server
Ring buffer + Registry"]
```
**Current adapters:**
+
```txt
internal/adapters/agent/claudecode
internal/adapters/agent/codex
@@ -238,6 +250,7 @@ internal/adapters/reviewer/claudecode
```
**Good dependencies:**
+
```
session_manager → ports.Runtime
adapters/runtime/tmux → ports + domain
@@ -246,6 +259,7 @@ daemon → adapters + services + storage
```
**Avoid:**
+
```
domain → adapters
service/session → adapters/runtime/tmux
@@ -258,6 +272,7 @@ adapters/* → httpd
`storage/sqlite` owns SQLite setup, migrations, sqlc generated code, and store implementations.
**Belongs here:**
+
- Connection setup and PRAGMAs
- Goose migrations
- sqlc queries and generated code
@@ -265,6 +280,7 @@ adapters/* → httpd
- Transactions and CDC-triggered persistence behavior
**Does not belong here:**
+
- HTTP response types
- CLI output formatting
- Product display status rules
@@ -277,11 +293,13 @@ Generated sqlc types should stay behind store methods. Services and lifecycle co
`cdc` owns `change_log` polling and event broadcasting. SQLite triggers append durable events to `change_log`; the poller tails that table and fans events out to subscribers.
**Belongs here:**
+
- Event type definitions for the CDC stream
- Poller and broadcaster logic
- Subscriber fan-out behavior
**Does not belong here:**
+
- Terminal byte streams
- Product workflow decisions
- Database schema ownership
@@ -300,7 +318,7 @@ sequenceDiagram
WS->>Mux: WebSocket upgrade
Mux->>Term: Create attach session
Term->>Runtime: Runtime.Attach(handle, rows, cols)
-
+
alt tmux (Darwin/Linux)
Runtime->>Runtime: tmux attach-session -t
Runtime->>Runtime: PTY stream via ptyexec
@@ -309,13 +327,14 @@ sequenceDiagram
Runtime->>Runtime: B1 protocol handshake
Runtime->>Runtime: MsgTerminalData (scrollback)
end
-
+
Runtime-->>Term: Stream
Term-->>Mux: Framed protocol
Mux-->>WS: WebSocket messages
```
**Belongs here:**
+
- Per-client attachment lifecycle (liveness gating, re-attach backoff)
- Input/output framing independent of HTTP
- PTY-backed attach handling and terminal protocol tests
@@ -325,6 +344,7 @@ sequenceDiagram
`httpd` is the HTTP protocol adapter.
**Belongs here:**
+
- Routing and middleware
- HTTP request decoding and response encoding
- Path/query parameter handling
@@ -362,19 +382,21 @@ graph TD
Daemon --> Terminal["terminal"]
Daemon --> Services["service/*"]
Daemon --> HTTPD["httpd"]
-
+
Config -->|"env vars"| Daemon
Storage -->|"triggers"| CDC
CDC -->|"events"| HTTPD
```
**Belongs here:**
+
- Production dependency construction
- Adapter registration
- Startup/shutdown sequencing
- Cross-component wiring
**Does not belong here:**
+
- Business logic that should be testable in service, lifecycle, or manager packages
- Adapter implementation details
@@ -383,27 +405,27 @@ graph TD
```mermaid
graph TB
Root["backend/"]
-
+
Root --> Cmd["cmd/ao/
# CLI entrypoint"]
Root --> Main["main.go
# Daemon entrypoint"]
Root --> Sqlc["sqlc.yaml"]
-
+
Root --> Domain["internal/domain/
# Shared vocabulary"]
Root --> Ports["internal/ports/
# Capability interfaces"]
-
+
Root --> Service["internal/service/"]
Service --> Proj["project/
# Project API"]
Service --> Sess["session/
# Session API"]
Service --> PR["pr/
# PR service"]
Service --> Review["review/
# Code review"]
-
+
Root --> SessMgr["internal/session_manager/
# Internal commands"]
Root --> Life["internal/lifecycle/
# Fact reducer"]
-
+
Root --> Observe["internal/observe/"]
Observe --> SCM["scm/
# GitHub observer"]
Observe --> Reap["reaper/
# Liveness observer"]
-
+
Root --> Store["internal/storage/sqlite/
# DB + stores"]
Root --> CDC2["internal/cdc/
# Change delivery"]
Root --> Term["internal/terminal/
# PTY protocol"]
@@ -411,7 +433,7 @@ graph TB
Root --> CLI2["internal/cli/
# CLI commands"]
Root --> Daemon2["internal/daemon/
# Composition"]
Root --> Cfg["internal/config/
# Config"]
-
+
Root --> Adapters["internal/adapters/"]
Adapters --> Agent["agent/
# 23+ agents"]
Adapters --> Runtime2["runtime/"]
@@ -441,7 +463,7 @@ Use these defaults:
```mermaid
graph LR
NewCode["New Code"] --> Choice{"What type?"}
-
+
Choice -->|HTTP route| HTTPRoute["Add to httpd/
Call service/*
Update OpenAPI"]
Choice -->|Product resource| Product["domain + service/
storage + ports"]
Choice -->|Adapter| AdapterPath["adapters//
Implement ports
Wire in daemon"]
@@ -459,6 +481,7 @@ Project-owned concepts live in `internal/service/project`:
- The `Manager` contract consumed by HTTP controllers
`internal/httpd/controllers` remains responsible for:
+
- Route registration
- JSON decoding/encoding
- HTTP status codes and error envelopes
@@ -476,7 +499,7 @@ graph LR
Adapters["adapters/*"] -->|✓| Ports
Adapters -->|✓| Domain["domain"]
end
-
+
subgraph Avoid["Avoid Dependencies"]
Services2["service/*"] -.->|✗| Adapters2["adapters/*"]
Domain2["domain"] -.->|✗| Adapters2
@@ -486,6 +509,7 @@ graph LR
```
**Key rules:**
+
- Controllers call services, not storage directly
- Services call session manager, not adapters directly
- Adapters implement ports, don't depend on HTTP/storage
diff --git a/package.json b/package.json
index f4ab94df7..4cfab1cc4 100644
--- a/package.json
+++ b/package.json
@@ -1,22 +1,22 @@
{
- "name": "agent-orchestrator",
- "version": "0.0.0",
- "private": true,
- "workspaces": [
- "packages/*"
- ],
- "scripts": {
- "api": "run-s api:spec api:ts",
- "api:spec": "cd backend && go generate ./internal/httpd/apispec/...",
- "api:ts": "npx openapi-typescript@7.4.4 backend/internal/httpd/apispec/openapi.yaml -o packages/shared/src/api/schema.ts",
- "lint": "npm run lint:backend && npm run lint:frontend",
- "lint:backend": "cd backend && go test ./... && golangci-lint run",
- "lint:frontend": "cd packages/desktop && npm run typecheck",
- "build:shared": "cd packages/shared && npm run build",
- "build:desktop": "cd packages/desktop && npm run build",
- "build:mobile": "cd packages/mobile && npm run build"
- },
- "devDependencies": {
- "npm-run-all": "^4.1.5"
- }
+ "name": "agent-orchestrator",
+ "version": "0.0.0",
+ "private": true,
+ "workspaces": [
+ "packages/*"
+ ],
+ "scripts": {
+ "api": "run-s api:spec api:ts",
+ "api:spec": "cd backend && go generate ./internal/httpd/apispec/...",
+ "api:ts": "npx openapi-typescript@7.4.4 backend/internal/httpd/apispec/openapi.yaml -o packages/shared/src/api/schema.ts",
+ "lint": "npm run lint:backend && npm run lint:frontend",
+ "lint:backend": "cd backend && go test ./... && golangci-lint run",
+ "lint:frontend": "cd packages/desktop && npm run typecheck",
+ "build:shared": "cd packages/shared && npm run build",
+ "build:desktop": "cd packages/desktop && npm run build",
+ "build:mobile": "cd packages/mobile && npm run build"
+ },
+ "devDependencies": {
+ "npm-run-all": "^4.1.5"
+ }
}
diff --git a/packages/desktop/src/api/schema.ts b/packages/desktop/src/api/schema.ts
index a7f68302d..e2dc8703f 100644
--- a/packages/desktop/src/api/schema.ts
+++ b/packages/desktop/src/api/schema.ts
@@ -4,2611 +4,2647 @@
*/
export interface paths {
- "/api/v1/events": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** Stream CDC events with durable replay */
- get: operations["streamEvents"];
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/notifications": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** List unread notifications */
- get: operations["listNotifications"];
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/notifications/{id}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- /** Mark a notification read */
- patch: operations["markNotificationRead"];
- trace?: never;
- };
- "/api/v1/notifications/read-all": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Mark all unread notifications read */
- post: operations["markAllNotificationsRead"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/notifications/stream": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** Stream created notifications */
- get: operations["streamNotifications"];
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/orchestrators": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** List orchestrator sessions across projects */
- get: operations["listOrchestrators"];
- put?: never;
- /** Spawn an orchestrator session */
- post: operations["spawnOrchestrator"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/orchestrators/{id}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** Fetch one orchestrator session */
- get: operations["getOrchestrator"];
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/projects": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** List all registered projects (active + degraded) */
- get: operations["listProjects"];
- put?: never;
- /** Register a new project from a git repository path */
- post: operations["addProject"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/projects/{id}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** Fetch one project; discriminates ok vs degraded */
- get: operations["getProject"];
- put?: never;
- post?: never;
- /** Remove a project; stops sessions, cleans workspaces, unregisters */
- delete: operations["removeProject"];
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/projects/{id}/config": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- /** Replace a project's per-project config */
- put: operations["setProjectConfig"];
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/prs/{id}/merge": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Squash-merge a pull request */
- post: operations["mergePR"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/prs/{id}/resolve-comments": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Resolve review threads on a pull request */
- post: operations["resolveComments"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** List sessions */
- get: operations["listSessions"];
- put?: never;
- /** Spawn a new agent session */
- post: operations["spawnSession"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** Fetch one session */
- get: operations["getSession"];
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- /** Rename a session display name */
- patch: operations["renameSession"];
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/activity": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Report an agent activity-state signal for a session */
- post: operations["setSessionActivity"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/kill": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Mark a session terminated and tear down runtime/workspace resources */
- post: operations["killSession"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/pr": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** List pull requests owned by a session */
- get: operations["listSessionPRs"];
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/pr/claim": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Claim an existing pull request for a session */
- post: operations["claimSessionPR"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/preview": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** Discover a browser preview URL for a session workspace */
- get: operations["getSessionPreview"];
- put?: never;
- /** Set (or autodetect) the browser preview URL for a session */
- post: operations["setSessionPreview"];
- /** Clear the browser preview URL for a session */
- delete: operations["clearSessionPreview"];
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/preview/files/*": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** Serve a static browser preview file from a session workspace */
- get: operations["getSessionPreviewFile"];
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/restore": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Restore a terminated session */
- post: operations["restoreSession"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/reviews": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- /** List a worker's code-review runs */
- get: operations["listReviews"];
- put?: never;
- post?: never;
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/reviews/submit": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Record a reviewer's result for a worker's PR */
- post: operations["submitReview"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/reviews/trigger": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Trigger a code review of a worker's PR */
- post: operations["triggerReview"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/rollback": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Undo a partially-completed spawn (delete seed row, or kill if spawn output exists) */
- post: operations["rollbackSession"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/{sessionId}/send": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Send a message to a running session's agent */
- post: operations["sendSessionMessage"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
- "/api/v1/sessions/cleanup": {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- get?: never;
- put?: never;
- /** Clean up terminated session workspaces */
- post: operations["cleanupSessions"];
- delete?: never;
- options?: never;
- head?: never;
- patch?: never;
- trace?: never;
- };
+ "/api/v1/events": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** Stream CDC events with durable replay */
+ get: operations["streamEvents"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/notifications": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** List unread notifications */
+ get: operations["listNotifications"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/notifications/{id}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ /** Mark a notification read */
+ patch: operations["markNotificationRead"];
+ trace?: never;
+ };
+ "/api/v1/notifications/read-all": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Mark all unread notifications read */
+ post: operations["markAllNotificationsRead"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/notifications/stream": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** Stream created notifications */
+ get: operations["streamNotifications"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/orchestrators": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** List orchestrator sessions across projects */
+ get: operations["listOrchestrators"];
+ put?: never;
+ /** Spawn an orchestrator session */
+ post: operations["spawnOrchestrator"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/orchestrators/{id}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** Fetch one orchestrator session */
+ get: operations["getOrchestrator"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/projects": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** List all registered projects (active + degraded) */
+ get: operations["listProjects"];
+ put?: never;
+ /** Register a new project from a git repository path */
+ post: operations["addProject"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/projects/{id}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** Fetch one project; discriminates ok vs degraded */
+ get: operations["getProject"];
+ put?: never;
+ post?: never;
+ /** Remove a project; stops sessions, cleans workspaces, unregisters */
+ delete: operations["removeProject"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/projects/{id}/config": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ /** Replace a project's per-project config */
+ put: operations["setProjectConfig"];
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/prs/{id}/merge": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Squash-merge a pull request */
+ post: operations["mergePR"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/prs/{id}/resolve-comments": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Resolve review threads on a pull request */
+ post: operations["resolveComments"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** List sessions */
+ get: operations["listSessions"];
+ put?: never;
+ /** Spawn a new agent session */
+ post: operations["spawnSession"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** Fetch one session */
+ get: operations["getSession"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ /** Rename a session display name */
+ patch: operations["renameSession"];
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/activity": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Report an agent activity-state signal for a session */
+ post: operations["setSessionActivity"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/kill": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Mark a session terminated and tear down runtime/workspace resources */
+ post: operations["killSession"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/pr": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** List pull requests owned by a session */
+ get: operations["listSessionPRs"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/pr/claim": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Claim an existing pull request for a session */
+ post: operations["claimSessionPR"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/preview": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** Discover a browser preview URL for a session workspace */
+ get: operations["getSessionPreview"];
+ put?: never;
+ /** Set (or autodetect) the browser preview URL for a session */
+ post: operations["setSessionPreview"];
+ /** Clear the browser preview URL for a session */
+ delete: operations["clearSessionPreview"];
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/preview/files/*": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** Serve a static browser preview file from a session workspace */
+ get: operations["getSessionPreviewFile"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/restore": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Restore a terminated session */
+ post: operations["restoreSession"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/reviews": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ /** List a worker's code-review runs */
+ get: operations["listReviews"];
+ put?: never;
+ post?: never;
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/reviews/submit": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Record a reviewer's result for a worker's PR */
+ post: operations["submitReview"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/reviews/trigger": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Trigger a code review of a worker's PR */
+ post: operations["triggerReview"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/rollback": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Undo a partially-completed spawn (delete seed row, or kill if spawn output exists) */
+ post: operations["rollbackSession"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/{sessionId}/send": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Send a message to a running session's agent */
+ post: operations["sendSessionMessage"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
+ "/api/v1/sessions/cleanup": {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ get?: never;
+ put?: never;
+ /** Clean up terminated session workspaces */
+ post: operations["cleanupSessions"];
+ delete?: never;
+ options?: never;
+ head?: never;
+ patch?: never;
+ trace?: never;
+ };
}
export type webhooks = Record;
export interface components {
- schemas: {
- APIError: {
- code: string;
- details?: {
- [key: string]: unknown;
- };
- error: string;
- message: string;
- requestId?: string;
- };
- AddProjectInput: {
- asWorkspace?: boolean;
- config?: components["schemas"]["ProjectConfig"];
- name?: null | string;
- path: string;
- projectId?: null | string;
- };
- AgentConfig: {
- model?: string;
- permissions?: string;
- };
- ClaimPRRequest: {
- allowTakeover?: null | boolean;
- pr: string;
- };
- ClaimPRResponse: {
- branchChanged: boolean;
- ok: boolean;
- prs: components["schemas"]["SessionPRFacts"][];
- sessionId: string;
- takenOverFrom: string[];
- };
- CleanupSessionsResponse: {
- cleaned: string[];
- ok: boolean;
- skipped: components["schemas"]["CleanupSkippedSession"][];
- };
- CleanupSkippedSession: {
- reason: string;
- sessionId: string;
- };
- ControllersSessionView: {
- activity: components["schemas"]["DomainActivity"];
- branch?: string;
- /** Format: date-time */
- createdAt: string;
- displayName?: string;
- harness?: string;
- id: string;
- isTerminated: boolean;
- issueId?: string;
- kind: string;
- /** Format: int64 */
- previewRevision?: number;
- previewUrl?: string;
- projectId: string;
- prs: components["schemas"]["SessionPRFacts"][];
- /** @enum {string} */
- status: "working" | "pr_open" | "draft" | "ci_failed" | "review_pending" | "changes_requested" | "approved" | "mergeable" | "merged" | "needs_input" | "idle" | "terminated" | "no_signal";
- terminalHandleId?: string;
- /** Format: date-time */
- updatedAt: string;
- };
- DegradedProject: {
- id: string;
- kind: string;
- name: string;
- path: string;
- resolveError: string;
- };
- DomainActivity: {
- /** Format: date-time */
- lastActivityAt: string;
- state: string;
- };
- DomainReviewerConfig: {
- harness: string;
- };
- KillSessionResponse: {
- freed?: boolean;
- ok: boolean;
- sessionId: string;
- };
- ListNotificationsResponse: {
- notifications: components["schemas"]["NotificationResponse"][];
- };
- ListProjectsResponse: {
- projects: components["schemas"]["ProjectSummary"][];
- };
- ListReviewsResponse: {
- reviewerHandleId: string;
- reviews: components["schemas"]["ReviewRun"][];
- };
- ListSessionPRsResponse: {
- prs: components["schemas"]["SessionPRSummary"][];
- sessionId: string;
- };
- ListSessionsResponse: {
- sessions: components["schemas"]["ControllersSessionView"][];
- };
- MarkAllNotificationsReadResponse: {
- notifications: components["schemas"]["NotificationResponse"][];
- };
- MarkNotificationReadRequest: {
- /**
- * @description V1 supports only marking an unread notification read.
- * @enum {string}
- */
- status: "read";
- };
- MergePRResponse: {
- method: string;
- ok: boolean;
- prNumber: number;
- };
- NotificationEnvelope: {
- notification: components["schemas"]["NotificationResponse"];
- };
- NotificationResponse: {
- body: string;
- /** Format: date-time */
- createdAt: string;
- id: string;
- prUrl: string;
- projectId: string;
- sessionId: string;
- /** @enum {string} */
- status: "unread" | "read";
- target: components["schemas"]["NotificationTarget"];
- title: string;
- /** @enum {string} */
- type: "needs_input" | "ready_to_merge" | "pr_merged" | "pr_closed_unmerged";
- };
- NotificationTarget: {
- /** @enum {string} */
- kind: "session" | "pr";
- prUrl?: string;
- sessionId: string;
- };
- OrchestratorResponse: {
- id: string;
- projectId: string;
- projectName?: string;
- };
- Project: {
- agent?: string;
- config?: components["schemas"]["ProjectConfig"];
- defaultBranch: string;
- id: string;
- kind: string;
- name: string;
- path: string;
- repo: string;
- workspaceRepos?: components["schemas"]["WorkspaceRepo"][];
- };
- ProjectConfig: {
- agentConfig?: components["schemas"]["AgentConfig"];
- defaultBranch?: string;
- env?: {
- [key: string]: string;
- };
- orchestrator?: components["schemas"]["RoleOverride"];
- postCreate?: string[];
- reviewers?: components["schemas"]["DomainReviewerConfig"][];
- sessionPrefix?: string;
- symlinks?: string[];
- worker?: components["schemas"]["RoleOverride"];
- };
- ProjectGetResponse: {
- project: components["schemas"]["ProjectOrDegraded"];
- /** @enum {string} */
- status: "ok" | "degraded";
- };
- ProjectOrDegraded: components["schemas"]["Project"] | components["schemas"]["DegradedProject"];
- ProjectResponse: {
- project: components["schemas"]["Project"];
- };
- ProjectSummary: {
- id: string;
- kind: string;
- name: string;
- path: string;
- resolveError?: string;
- sessionPrefix: string;
- };
- RemoveProjectResult: {
- projectId: string;
- removedStorageDir: boolean;
- };
- RenameSessionRequest: {
- displayName: string;
- };
- RenameSessionResponse: {
- displayName: string;
- ok: boolean;
- sessionId: string;
- };
- ResolveCommentsResponse: {
- ok: boolean;
- resolved: number;
- };
- RestoreSessionResponse: {
- ok: boolean;
- session: components["schemas"]["ControllersSessionView"];
- sessionId: string;
- };
- ReviewRun: {
- body: string;
- /** Format: date-time */
- createdAt: string;
- /** Format: date-time */
- deliveredAt?: null | string;
- githubReviewId: string;
- harness: string;
- id: string;
- prUrl: string;
- reviewId: string;
- sessionId: string;
- status: string;
- targetSha: string;
- verdict: string;
- };
- ReviewRunResponse: {
- review: components["schemas"]["ReviewRun"];
- reviewerHandleId: string;
- };
- RoleOverride: {
- agent?: string;
- agentConfig?: components["schemas"]["AgentConfig"];
- };
- RollbackSessionResponse: {
- deleted?: boolean;
- killed?: boolean;
- ok: boolean;
- sessionId: string;
- };
- SendSessionMessageRequest: {
- message: string;
- };
- SendSessionMessageResponse: {
- message: string;
- ok: boolean;
- sessionId: string;
- };
- SessionPRCISummary: {
- failingChecks: components["schemas"]["SessionPRFailingCheck"][];
- /** @enum {string} */
- state: "unknown" | "pending" | "passing" | "failing";
- };
- SessionPRConflictFile: {
- path: string;
- url?: string;
- };
- SessionPRFacts: {
- /** @enum {string} */
- ci: "unknown" | "pending" | "passing" | "failing";
- /** @enum {string} */
- mergeability: "unknown" | "mergeable" | "conflicting" | "blocked" | "unstable";
- number: number;
- /** @enum {string} */
- review: "none" | "approved" | "changes_requested" | "review_required";
- reviewComments: boolean;
- /** @enum {string} */
- state: "draft" | "open" | "merged" | "closed";
- /** Format: date-time */
- updatedAt: string;
- url: string;
- };
- SessionPRFailingCheck: {
- conclusion: string;
- name: string;
- /** @enum {string} */
- status: "failed" | "cancelled";
- url?: string;
- };
- SessionPRMergeabilitySummary: {
- conflictFiles?: components["schemas"]["SessionPRConflictFile"][];
- prUrl: string;
- reasons: string[];
- /** @enum {string} */
- state: "unknown" | "mergeable" | "conflicting" | "blocked" | "unstable";
- };
- SessionPRReviewCommentLink: {
- file?: string;
- line?: number;
- url?: string;
- };
- SessionPRReviewSummary: {
- /** @enum {string} */
- decision: "none" | "approved" | "changes_requested" | "review_required";
- hasUnresolvedHumanComments: boolean;
- unresolvedBy: components["schemas"]["SessionPRUnresolvedReviewer"][];
- };
- SessionPRSummary: {
- additions: number;
- author: string;
- changedFiles: number;
- ci: components["schemas"]["SessionPRCISummary"];
- /** Format: date-time */
- ciObservedAt?: string;
- deletions: number;
- headSha: string;
- htmlUrl?: string;
- mergeability: components["schemas"]["SessionPRMergeabilitySummary"];
- number: number;
- /** Format: date-time */
- observedAt?: string;
- /** @enum {string} */
- provider: "github";
- repo: string;
- review: components["schemas"]["SessionPRReviewSummary"];
- /** Format: date-time */
- reviewObservedAt?: string;
- sourceBranch: string;
- /** @enum {string} */
- state: "draft" | "open" | "merged" | "closed";
- targetBranch: string;
- title: string;
- /** Format: date-time */
- updatedAt: string;
- url: string;
- };
- SessionPRUnresolvedReviewer: {
- count: number;
- links: components["schemas"]["SessionPRReviewCommentLink"][];
- reviewerId: string;
- };
- SessionPreviewResponse: {
- entry?: string;
- previewUrl?: string;
- sessionId: string;
- };
- SessionResponse: {
- session: components["schemas"]["ControllersSessionView"];
- };
- SetActivityRequest: {
- /**
- * @description Agent activity state reported by an agent hook.
- * @enum {string}
- */
- state: "active" | "idle" | "waiting_input" | "exited";
- };
- SetActivityResponse: {
- ok: boolean;
- sessionId: string;
- state: string;
- };
- SetProjectConfigInput: {
- config: components["schemas"]["ProjectConfig"];
- };
- SetSessionPreviewRequest: {
- /** @description Preview target URL. When empty, the daemon autodetects a static entry point in the session workspace. */
- url?: string;
- };
- SpawnOrchestratorRequest: {
- clean?: boolean;
- projectId: string;
- };
- SpawnOrchestratorResponse: {
- orchestrator: components["schemas"]["OrchestratorResponse"];
- };
- SpawnSessionRequest: {
- branch?: string;
- /** @enum {string} */
- harness?: "claude-code" | "codex" | "aider" | "opencode" | "grok" | "droid" | "amp" | "agy" | "crush" | "cursor" | "qwen" | "copilot" | "goose" | "auggie" | "continue" | "devin" | "cline" | "kimi" | "kiro" | "kilocode" | "vibe" | "pi" | "autohand";
- issueId?: string;
- /** @enum {string} */
- kind?: "worker" | "orchestrator";
- projectId: string;
- prompt?: string;
- };
- SubmitReviewInput: {
- /** @description Review body recorded by AO. Required for changes_requested. */
- body: string;
- /** @description Id of the GitHub PR review the reviewer posted, if any. */
- githubReviewId: string;
- /** @description Review run id being completed. */
- runId: string;
- /** @description Review verdict: approved or changes_requested. */
- verdict: string;
- };
- WorkspaceRepo: {
- name: string;
- relativePath: string;
- repo: string;
- };
- };
- responses: never;
- parameters: never;
- requestBodies: never;
- headers: never;
- pathItems: never;
+ schemas: {
+ APIError: {
+ code: string;
+ details?: {
+ [key: string]: unknown;
+ };
+ error: string;
+ message: string;
+ requestId?: string;
+ };
+ AddProjectInput: {
+ asWorkspace?: boolean;
+ config?: components["schemas"]["ProjectConfig"];
+ name?: null | string;
+ path: string;
+ projectId?: null | string;
+ };
+ AgentConfig: {
+ model?: string;
+ permissions?: string;
+ };
+ ClaimPRRequest: {
+ allowTakeover?: null | boolean;
+ pr: string;
+ };
+ ClaimPRResponse: {
+ branchChanged: boolean;
+ ok: boolean;
+ prs: components["schemas"]["SessionPRFacts"][];
+ sessionId: string;
+ takenOverFrom: string[];
+ };
+ CleanupSessionsResponse: {
+ cleaned: string[];
+ ok: boolean;
+ skipped: components["schemas"]["CleanupSkippedSession"][];
+ };
+ CleanupSkippedSession: {
+ reason: string;
+ sessionId: string;
+ };
+ ControllersSessionView: {
+ activity: components["schemas"]["DomainActivity"];
+ branch?: string;
+ /** Format: date-time */
+ createdAt: string;
+ displayName?: string;
+ harness?: string;
+ id: string;
+ isTerminated: boolean;
+ issueId?: string;
+ kind: string;
+ /** Format: int64 */
+ previewRevision?: number;
+ previewUrl?: string;
+ projectId: string;
+ prs: components["schemas"]["SessionPRFacts"][];
+ /** @enum {string} */
+ status:
+ | "working"
+ | "pr_open"
+ | "draft"
+ | "ci_failed"
+ | "review_pending"
+ | "changes_requested"
+ | "approved"
+ | "mergeable"
+ | "merged"
+ | "needs_input"
+ | "idle"
+ | "terminated"
+ | "no_signal";
+ terminalHandleId?: string;
+ /** Format: date-time */
+ updatedAt: string;
+ };
+ DegradedProject: {
+ id: string;
+ kind: string;
+ name: string;
+ path: string;
+ resolveError: string;
+ };
+ DomainActivity: {
+ /** Format: date-time */
+ lastActivityAt: string;
+ state: string;
+ };
+ DomainReviewerConfig: {
+ harness: string;
+ };
+ KillSessionResponse: {
+ freed?: boolean;
+ ok: boolean;
+ sessionId: string;
+ };
+ ListNotificationsResponse: {
+ notifications: components["schemas"]["NotificationResponse"][];
+ };
+ ListProjectsResponse: {
+ projects: components["schemas"]["ProjectSummary"][];
+ };
+ ListReviewsResponse: {
+ reviewerHandleId: string;
+ reviews: components["schemas"]["ReviewRun"][];
+ };
+ ListSessionPRsResponse: {
+ prs: components["schemas"]["SessionPRSummary"][];
+ sessionId: string;
+ };
+ ListSessionsResponse: {
+ sessions: components["schemas"]["ControllersSessionView"][];
+ };
+ MarkAllNotificationsReadResponse: {
+ notifications: components["schemas"]["NotificationResponse"][];
+ };
+ MarkNotificationReadRequest: {
+ /**
+ * @description V1 supports only marking an unread notification read.
+ * @enum {string}
+ */
+ status: "read";
+ };
+ MergePRResponse: {
+ method: string;
+ ok: boolean;
+ prNumber: number;
+ };
+ NotificationEnvelope: {
+ notification: components["schemas"]["NotificationResponse"];
+ };
+ NotificationResponse: {
+ body: string;
+ /** Format: date-time */
+ createdAt: string;
+ id: string;
+ prUrl: string;
+ projectId: string;
+ sessionId: string;
+ /** @enum {string} */
+ status: "unread" | "read";
+ target: components["schemas"]["NotificationTarget"];
+ title: string;
+ /** @enum {string} */
+ type: "needs_input" | "ready_to_merge" | "pr_merged" | "pr_closed_unmerged";
+ };
+ NotificationTarget: {
+ /** @enum {string} */
+ kind: "session" | "pr";
+ prUrl?: string;
+ sessionId: string;
+ };
+ OrchestratorResponse: {
+ id: string;
+ projectId: string;
+ projectName?: string;
+ };
+ Project: {
+ agent?: string;
+ config?: components["schemas"]["ProjectConfig"];
+ defaultBranch: string;
+ id: string;
+ kind: string;
+ name: string;
+ path: string;
+ repo: string;
+ workspaceRepos?: components["schemas"]["WorkspaceRepo"][];
+ };
+ ProjectConfig: {
+ agentConfig?: components["schemas"]["AgentConfig"];
+ defaultBranch?: string;
+ env?: {
+ [key: string]: string;
+ };
+ orchestrator?: components["schemas"]["RoleOverride"];
+ postCreate?: string[];
+ reviewers?: components["schemas"]["DomainReviewerConfig"][];
+ sessionPrefix?: string;
+ symlinks?: string[];
+ worker?: components["schemas"]["RoleOverride"];
+ };
+ ProjectGetResponse: {
+ project: components["schemas"]["ProjectOrDegraded"];
+ /** @enum {string} */
+ status: "ok" | "degraded";
+ };
+ ProjectOrDegraded: components["schemas"]["Project"] | components["schemas"]["DegradedProject"];
+ ProjectResponse: {
+ project: components["schemas"]["Project"];
+ };
+ ProjectSummary: {
+ id: string;
+ kind: string;
+ name: string;
+ path: string;
+ resolveError?: string;
+ sessionPrefix: string;
+ };
+ RemoveProjectResult: {
+ projectId: string;
+ removedStorageDir: boolean;
+ };
+ RenameSessionRequest: {
+ displayName: string;
+ };
+ RenameSessionResponse: {
+ displayName: string;
+ ok: boolean;
+ sessionId: string;
+ };
+ ResolveCommentsResponse: {
+ ok: boolean;
+ resolved: number;
+ };
+ RestoreSessionResponse: {
+ ok: boolean;
+ session: components["schemas"]["ControllersSessionView"];
+ sessionId: string;
+ };
+ ReviewRun: {
+ body: string;
+ /** Format: date-time */
+ createdAt: string;
+ /** Format: date-time */
+ deliveredAt?: null | string;
+ githubReviewId: string;
+ harness: string;
+ id: string;
+ prUrl: string;
+ reviewId: string;
+ sessionId: string;
+ status: string;
+ targetSha: string;
+ verdict: string;
+ };
+ ReviewRunResponse: {
+ review: components["schemas"]["ReviewRun"];
+ reviewerHandleId: string;
+ };
+ RoleOverride: {
+ agent?: string;
+ agentConfig?: components["schemas"]["AgentConfig"];
+ };
+ RollbackSessionResponse: {
+ deleted?: boolean;
+ killed?: boolean;
+ ok: boolean;
+ sessionId: string;
+ };
+ SendSessionMessageRequest: {
+ message: string;
+ };
+ SendSessionMessageResponse: {
+ message: string;
+ ok: boolean;
+ sessionId: string;
+ };
+ SessionPRCISummary: {
+ failingChecks: components["schemas"]["SessionPRFailingCheck"][];
+ /** @enum {string} */
+ state: "unknown" | "pending" | "passing" | "failing";
+ };
+ SessionPRConflictFile: {
+ path: string;
+ url?: string;
+ };
+ SessionPRFacts: {
+ /** @enum {string} */
+ ci: "unknown" | "pending" | "passing" | "failing";
+ /** @enum {string} */
+ mergeability: "unknown" | "mergeable" | "conflicting" | "blocked" | "unstable";
+ number: number;
+ /** @enum {string} */
+ review: "none" | "approved" | "changes_requested" | "review_required";
+ reviewComments: boolean;
+ /** @enum {string} */
+ state: "draft" | "open" | "merged" | "closed";
+ /** Format: date-time */
+ updatedAt: string;
+ url: string;
+ };
+ SessionPRFailingCheck: {
+ conclusion: string;
+ name: string;
+ /** @enum {string} */
+ status: "failed" | "cancelled";
+ url?: string;
+ };
+ SessionPRMergeabilitySummary: {
+ conflictFiles?: components["schemas"]["SessionPRConflictFile"][];
+ prUrl: string;
+ reasons: string[];
+ /** @enum {string} */
+ state: "unknown" | "mergeable" | "conflicting" | "blocked" | "unstable";
+ };
+ SessionPRReviewCommentLink: {
+ file?: string;
+ line?: number;
+ url?: string;
+ };
+ SessionPRReviewSummary: {
+ /** @enum {string} */
+ decision: "none" | "approved" | "changes_requested" | "review_required";
+ hasUnresolvedHumanComments: boolean;
+ unresolvedBy: components["schemas"]["SessionPRUnresolvedReviewer"][];
+ };
+ SessionPRSummary: {
+ additions: number;
+ author: string;
+ changedFiles: number;
+ ci: components["schemas"]["SessionPRCISummary"];
+ /** Format: date-time */
+ ciObservedAt?: string;
+ deletions: number;
+ headSha: string;
+ htmlUrl?: string;
+ mergeability: components["schemas"]["SessionPRMergeabilitySummary"];
+ number: number;
+ /** Format: date-time */
+ observedAt?: string;
+ /** @enum {string} */
+ provider: "github";
+ repo: string;
+ review: components["schemas"]["SessionPRReviewSummary"];
+ /** Format: date-time */
+ reviewObservedAt?: string;
+ sourceBranch: string;
+ /** @enum {string} */
+ state: "draft" | "open" | "merged" | "closed";
+ targetBranch: string;
+ title: string;
+ /** Format: date-time */
+ updatedAt: string;
+ url: string;
+ };
+ SessionPRUnresolvedReviewer: {
+ count: number;
+ links: components["schemas"]["SessionPRReviewCommentLink"][];
+ reviewerId: string;
+ };
+ SessionPreviewResponse: {
+ entry?: string;
+ previewUrl?: string;
+ sessionId: string;
+ };
+ SessionResponse: {
+ session: components["schemas"]["ControllersSessionView"];
+ };
+ SetActivityRequest: {
+ /**
+ * @description Agent activity state reported by an agent hook.
+ * @enum {string}
+ */
+ state: "active" | "idle" | "waiting_input" | "exited";
+ };
+ SetActivityResponse: {
+ ok: boolean;
+ sessionId: string;
+ state: string;
+ };
+ SetProjectConfigInput: {
+ config: components["schemas"]["ProjectConfig"];
+ };
+ SetSessionPreviewRequest: {
+ /** @description Preview target URL. When empty, the daemon autodetects a static entry point in the session workspace. */
+ url?: string;
+ };
+ SpawnOrchestratorRequest: {
+ clean?: boolean;
+ projectId: string;
+ };
+ SpawnOrchestratorResponse: {
+ orchestrator: components["schemas"]["OrchestratorResponse"];
+ };
+ SpawnSessionRequest: {
+ branch?: string;
+ /** @enum {string} */
+ harness?:
+ | "claude-code"
+ | "codex"
+ | "aider"
+ | "opencode"
+ | "grok"
+ | "droid"
+ | "amp"
+ | "agy"
+ | "crush"
+ | "cursor"
+ | "qwen"
+ | "copilot"
+ | "goose"
+ | "auggie"
+ | "continue"
+ | "devin"
+ | "cline"
+ | "kimi"
+ | "kiro"
+ | "kilocode"
+ | "vibe"
+ | "pi"
+ | "autohand";
+ issueId?: string;
+ /** @enum {string} */
+ kind?: "worker" | "orchestrator";
+ projectId: string;
+ prompt?: string;
+ };
+ SubmitReviewInput: {
+ /** @description Review body recorded by AO. Required for changes_requested. */
+ body: string;
+ /** @description Id of the GitHub PR review the reviewer posted, if any. */
+ githubReviewId: string;
+ /** @description Review run id being completed. */
+ runId: string;
+ /** @description Review verdict: approved or changes_requested. */
+ verdict: string;
+ };
+ WorkspaceRepo: {
+ name: string;
+ relativePath: string;
+ repo: string;
+ };
+ };
+ responses: never;
+ parameters: never;
+ requestBodies: never;
+ headers: never;
+ pathItems: never;
}
export type $defs = Record;
export interface operations {
- streamEvents: {
- parameters: {
- query?: {
- /** @description Replay events with seq greater than this cursor. When omitted, clients may send Last-Event-ID instead. */
- after?: null | number;
- };
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "text/event-stream": string;
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- listNotifications: {
- parameters: {
- query?: {
- /** @description Notification status filter. V1 supports only unread. */
- status?: "unread";
- /** @description Maximum notifications to return. Defaults to 50; capped at 100. */
- limit?: number;
- };
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ListNotificationsResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- markNotificationRead: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Notification identifier. */
- id: string;
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["MarkNotificationReadRequest"];
- };
- };
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["NotificationEnvelope"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- markAllNotificationsRead: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["MarkAllNotificationsReadResponse"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- streamNotifications: {
- parameters: {
- query?: {
- /** @description Optional project id filter for live notifications. */
- projectId?: string;
- };
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "text/event-stream": string;
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- listOrchestrators: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ListSessionsResponse"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- spawnOrchestrator: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["SpawnOrchestratorRequest"];
- };
- };
- responses: {
- /** @description Created */
- 201: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SpawnOrchestratorResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- getOrchestrator: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Orchestrator session identifier, e.g. project-orchestrator. */
- id: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SessionResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- listProjects: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ListProjectsResponse"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- addProject: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["AddProjectInput"];
- };
- };
- responses: {
- /** @description Created */
- 201: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ProjectResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Conflict */
- 409: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- getProject: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Project identifier (registry key). */
- id: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ProjectGetResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- removeProject: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Project identifier (registry key). */
- id: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["RemoveProjectResult"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- setProjectConfig: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Project identifier (registry key). */
- id: string;
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["SetProjectConfigInput"];
- };
- };
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ProjectResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- mergePR: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description PR number. */
- id: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["MergePRResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Conflict */
- 409: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Unprocessable Entity */
- 422: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- resolveComments: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description PR number. */
- id: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ResolveCommentsResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Unprocessable Entity */
- 422: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- listSessions: {
- parameters: {
- query?: {
- /** @description Project id filter. */
- project?: string;
- /** @description When true, return non-terminated sessions; when false, return terminated sessions. */
- active?: null | boolean;
- /** @description When true, return only orchestrator sessions. */
- orchestratorOnly?: null | boolean;
- /** @description When true, return only fresh non-terminated sessions. */
- fresh?: null | boolean;
- };
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ListSessionsResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- spawnSession: {
- parameters: {
- query?: never;
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["SpawnSessionRequest"];
- };
- };
- responses: {
- /** @description Created */
- 201: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SessionResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- getSession: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SessionResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- renameSession: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["RenameSessionRequest"];
- };
- };
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["RenameSessionResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- setSessionActivity: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["SetActivityRequest"];
- };
- };
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SetActivityResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- killSession: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["KillSessionResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Conflict */
- 409: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- listSessionPRs: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ListSessionPRsResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- claimSessionPR: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["ClaimPRRequest"];
- };
- };
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ClaimPRResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Conflict */
- 409: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Unprocessable Entity */
- 422: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Service Unavailable */
- 503: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- getSessionPreview: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SessionPreviewResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- setSessionPreview: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["SetSessionPreviewRequest"];
- };
- };
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SessionResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- clearSessionPreview: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SessionResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- getSessionPreviewFile: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "text/html": string;
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- restoreSession: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["RestoreSessionResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Conflict */
- 409: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- listReviews: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ListReviewsResponse"];
- };
- };
- /** @description Unprocessable Entity */
- 422: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- submitReview: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["SubmitReviewInput"];
- };
- };
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ReviewRunResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Unprocessable Entity */
- 422: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- triggerReview: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ReviewRunResponse"];
- };
- };
- /** @description Created */
- 201: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["ReviewRunResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Unprocessable Entity */
- 422: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- rollbackSession: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["RollbackSessionResponse"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Conflict */
- 409: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- sendSessionMessage: {
- parameters: {
- query?: never;
- header?: never;
- path: {
- /** @description Session identifier, e.g. project-1. */
- sessionId: string;
- };
- cookie?: never;
- };
- requestBody: {
- content: {
- "application/json": components["schemas"]["SendSessionMessageRequest"];
- };
- };
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["SendSessionMessageResponse"];
- };
- };
- /** @description Bad Request */
- 400: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Found */
- 404: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
- cleanupSessions: {
- parameters: {
- query?: {
- /** @description Project id filter. When omitted, clean terminated sessions across all projects. */
- project?: string;
- };
- header?: never;
- path?: never;
- cookie?: never;
- };
- requestBody?: never;
- responses: {
- /** @description OK */
- 200: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["CleanupSessionsResponse"];
- };
- };
- /** @description Internal Server Error */
- 500: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- /** @description Not Implemented */
- 501: {
- headers: {
- [name: string]: unknown;
- };
- content: {
- "application/json": components["schemas"]["APIError"];
- };
- };
- };
- };
+ streamEvents: {
+ parameters: {
+ query?: {
+ /** @description Replay events with seq greater than this cursor. When omitted, clients may send Last-Event-ID instead. */
+ after?: null | number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "text/event-stream": string;
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ listNotifications: {
+ parameters: {
+ query?: {
+ /** @description Notification status filter. V1 supports only unread. */
+ status?: "unread";
+ /** @description Maximum notifications to return. Defaults to 50; capped at 100. */
+ limit?: number;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ListNotificationsResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ markNotificationRead: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Notification identifier. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["MarkNotificationReadRequest"];
+ };
+ };
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["NotificationEnvelope"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ markAllNotificationsRead: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["MarkAllNotificationsReadResponse"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ streamNotifications: {
+ parameters: {
+ query?: {
+ /** @description Optional project id filter for live notifications. */
+ projectId?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "text/event-stream": string;
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ listOrchestrators: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ListSessionsResponse"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ spawnOrchestrator: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["SpawnOrchestratorRequest"];
+ };
+ };
+ responses: {
+ /** @description Created */
+ 201: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SpawnOrchestratorResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ getOrchestrator: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Orchestrator session identifier, e.g. project-orchestrator. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SessionResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ listProjects: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ListProjectsResponse"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ addProject: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["AddProjectInput"];
+ };
+ };
+ responses: {
+ /** @description Created */
+ 201: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ProjectResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Conflict */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ getProject: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Project identifier (registry key). */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ProjectGetResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ removeProject: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Project identifier (registry key). */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RemoveProjectResult"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ setProjectConfig: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Project identifier (registry key). */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["SetProjectConfigInput"];
+ };
+ };
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ProjectResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ mergePR: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description PR number. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["MergePRResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Conflict */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Unprocessable Entity */
+ 422: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ resolveComments: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description PR number. */
+ id: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ResolveCommentsResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Unprocessable Entity */
+ 422: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ listSessions: {
+ parameters: {
+ query?: {
+ /** @description Project id filter. */
+ project?: string;
+ /** @description When true, return non-terminated sessions; when false, return terminated sessions. */
+ active?: null | boolean;
+ /** @description When true, return only orchestrator sessions. */
+ orchestratorOnly?: null | boolean;
+ /** @description When true, return only fresh non-terminated sessions. */
+ fresh?: null | boolean;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ListSessionsResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ spawnSession: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["SpawnSessionRequest"];
+ };
+ };
+ responses: {
+ /** @description Created */
+ 201: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SessionResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ getSession: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SessionResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ renameSession: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["RenameSessionRequest"];
+ };
+ };
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RenameSessionResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ setSessionActivity: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["SetActivityRequest"];
+ };
+ };
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SetActivityResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ killSession: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["KillSessionResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Conflict */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ listSessionPRs: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ListSessionPRsResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ claimSessionPR: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["ClaimPRRequest"];
+ };
+ };
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ClaimPRResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Conflict */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Unprocessable Entity */
+ 422: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Service Unavailable */
+ 503: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ getSessionPreview: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SessionPreviewResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ setSessionPreview: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["SetSessionPreviewRequest"];
+ };
+ };
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SessionResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ clearSessionPreview: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SessionResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ getSessionPreviewFile: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "text/html": string;
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ restoreSession: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RestoreSessionResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Conflict */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ listReviews: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ListReviewsResponse"];
+ };
+ };
+ /** @description Unprocessable Entity */
+ 422: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ submitReview: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["SubmitReviewInput"];
+ };
+ };
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ReviewRunResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Unprocessable Entity */
+ 422: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ triggerReview: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ReviewRunResponse"];
+ };
+ };
+ /** @description Created */
+ 201: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["ReviewRunResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Unprocessable Entity */
+ 422: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ rollbackSession: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["RollbackSessionResponse"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Conflict */
+ 409: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ sendSessionMessage: {
+ parameters: {
+ query?: never;
+ header?: never;
+ path: {
+ /** @description Session identifier, e.g. project-1. */
+ sessionId: string;
+ };
+ cookie?: never;
+ };
+ requestBody: {
+ content: {
+ "application/json": components["schemas"]["SendSessionMessageRequest"];
+ };
+ };
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["SendSessionMessageResponse"];
+ };
+ };
+ /** @description Bad Request */
+ 400: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Found */
+ 404: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
+ cleanupSessions: {
+ parameters: {
+ query?: {
+ /** @description Project id filter. When omitted, clean terminated sessions across all projects. */
+ project?: string;
+ };
+ header?: never;
+ path?: never;
+ cookie?: never;
+ };
+ requestBody?: never;
+ responses: {
+ /** @description OK */
+ 200: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["CleanupSessionsResponse"];
+ };
+ };
+ /** @description Internal Server Error */
+ 500: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ /** @description Not Implemented */
+ 501: {
+ headers: {
+ [name: string]: unknown;
+ };
+ content: {
+ "application/json": components["schemas"]["APIError"];
+ };
+ };
+ };
+ };
}
diff --git a/packages/desktop/src/renderer/routeTree.gen.ts b/packages/desktop/src/renderer/routeTree.gen.ts
index 6a13a2dee..ffe4cdc41 100644
--- a/packages/desktop/src/renderer/routeTree.gen.ts
+++ b/packages/desktop/src/renderer/routeTree.gen.ts
@@ -8,188 +8,183 @@
// You should NOT make any changes in this file as it will be overwritten.
// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
-import { Route as rootRouteImport } from './routes/__root'
-import { Route as ShellRouteImport } from './routes/_shell'
-import { Route as ShellIndexRouteImport } from './routes/_shell.index'
-import { Route as ShellPrsRouteImport } from './routes/_shell.prs'
-import { Route as ShellSessionsSessionIdRouteImport } from './routes/_shell.sessions.$sessionId'
-import { Route as ShellProjectsProjectIdRouteImport } from './routes/_shell.projects.$projectId'
-import { Route as ShellProjectsProjectIdSettingsRouteImport } from './routes/_shell.projects.$projectId_.settings'
-import { Route as ShellProjectsProjectIdSessionsSessionIdRouteImport } from './routes/_shell.projects.$projectId_.sessions.$sessionId'
+import { Route as rootRouteImport } from "./routes/__root";
+import { Route as ShellRouteImport } from "./routes/_shell";
+import { Route as ShellIndexRouteImport } from "./routes/_shell.index";
+import { Route as ShellPrsRouteImport } from "./routes/_shell.prs";
+import { Route as ShellSessionsSessionIdRouteImport } from "./routes/_shell.sessions.$sessionId";
+import { Route as ShellProjectsProjectIdRouteImport } from "./routes/_shell.projects.$projectId";
+import { Route as ShellProjectsProjectIdSettingsRouteImport } from "./routes/_shell.projects.$projectId_.settings";
+import { Route as ShellProjectsProjectIdSessionsSessionIdRouteImport } from "./routes/_shell.projects.$projectId_.sessions.$sessionId";
const ShellRoute = ShellRouteImport.update({
- id: '/_shell',
- getParentRoute: () => rootRouteImport,
-} as any)
+ id: "/_shell",
+ getParentRoute: () => rootRouteImport,
+} as any);
const ShellIndexRoute = ShellIndexRouteImport.update({
- id: '/',
- path: '/',
- getParentRoute: () => ShellRoute,
-} as any)
+ id: "/",
+ path: "/",
+ getParentRoute: () => ShellRoute,
+} as any);
const ShellPrsRoute = ShellPrsRouteImport.update({
- id: '/prs',
- path: '/prs',
- getParentRoute: () => ShellRoute,
-} as any)
+ id: "/prs",
+ path: "/prs",
+ getParentRoute: () => ShellRoute,
+} as any);
const ShellSessionsSessionIdRoute = ShellSessionsSessionIdRouteImport.update({
- id: '/sessions/$sessionId',
- path: '/sessions/$sessionId',
- getParentRoute: () => ShellRoute,
-} as any)
+ id: "/sessions/$sessionId",
+ path: "/sessions/$sessionId",
+ getParentRoute: () => ShellRoute,
+} as any);
const ShellProjectsProjectIdRoute = ShellProjectsProjectIdRouteImport.update({
- id: '/projects/$projectId',
- path: '/projects/$projectId',
- getParentRoute: () => ShellRoute,
-} as any)
-const ShellProjectsProjectIdSettingsRoute =
- ShellProjectsProjectIdSettingsRouteImport.update({
- id: '/projects/$projectId_/settings',
- path: '/projects/$projectId/settings',
- getParentRoute: () => ShellRoute,
- } as any)
-const ShellProjectsProjectIdSessionsSessionIdRoute =
- ShellProjectsProjectIdSessionsSessionIdRouteImport.update({
- id: '/projects/$projectId_/sessions/$sessionId',
- path: '/projects/$projectId/sessions/$sessionId',
- getParentRoute: () => ShellRoute,
- } as any)
+ id: "/projects/$projectId",
+ path: "/projects/$projectId",
+ getParentRoute: () => ShellRoute,
+} as any);
+const ShellProjectsProjectIdSettingsRoute = ShellProjectsProjectIdSettingsRouteImport.update({
+ id: "/projects/$projectId_/settings",
+ path: "/projects/$projectId/settings",
+ getParentRoute: () => ShellRoute,
+} as any);
+const ShellProjectsProjectIdSessionsSessionIdRoute = ShellProjectsProjectIdSessionsSessionIdRouteImport.update({
+ id: "/projects/$projectId_/sessions/$sessionId",
+ path: "/projects/$projectId/sessions/$sessionId",
+ getParentRoute: () => ShellRoute,
+} as any);
export interface FileRoutesByFullPath {
- '/': typeof ShellIndexRoute
- '/prs': typeof ShellPrsRoute
- '/projects/$projectId': typeof ShellProjectsProjectIdRoute
- '/sessions/$sessionId': typeof ShellSessionsSessionIdRoute
- '/projects/$projectId/settings': typeof ShellProjectsProjectIdSettingsRoute
- '/projects/$projectId/sessions/$sessionId': typeof ShellProjectsProjectIdSessionsSessionIdRoute
+ "/": typeof ShellIndexRoute;
+ "/prs": typeof ShellPrsRoute;
+ "/projects/$projectId": typeof ShellProjectsProjectIdRoute;
+ "/sessions/$sessionId": typeof ShellSessionsSessionIdRoute;
+ "/projects/$projectId/settings": typeof ShellProjectsProjectIdSettingsRoute;
+ "/projects/$projectId/sessions/$sessionId": typeof ShellProjectsProjectIdSessionsSessionIdRoute;
}
export interface FileRoutesByTo {
- '/prs': typeof ShellPrsRoute
- '/': typeof ShellIndexRoute
- '/projects/$projectId': typeof ShellProjectsProjectIdRoute
- '/sessions/$sessionId': typeof ShellSessionsSessionIdRoute
- '/projects/$projectId/settings': typeof ShellProjectsProjectIdSettingsRoute
- '/projects/$projectId/sessions/$sessionId': typeof ShellProjectsProjectIdSessionsSessionIdRoute
+ "/prs": typeof ShellPrsRoute;
+ "/": typeof ShellIndexRoute;
+ "/projects/$projectId": typeof ShellProjectsProjectIdRoute;
+ "/sessions/$sessionId": typeof ShellSessionsSessionIdRoute;
+ "/projects/$projectId/settings": typeof ShellProjectsProjectIdSettingsRoute;
+ "/projects/$projectId/sessions/$sessionId": typeof ShellProjectsProjectIdSessionsSessionIdRoute;
}
export interface FileRoutesById {
- __root__: typeof rootRouteImport
- '/_shell': typeof ShellRouteWithChildren
- '/_shell/prs': typeof ShellPrsRoute
- '/_shell/': typeof ShellIndexRoute
- '/_shell/projects/$projectId': typeof ShellProjectsProjectIdRoute
- '/_shell/sessions/$sessionId': typeof ShellSessionsSessionIdRoute
- '/_shell/projects/$projectId_/settings': typeof ShellProjectsProjectIdSettingsRoute
- '/_shell/projects/$projectId_/sessions/$sessionId': typeof ShellProjectsProjectIdSessionsSessionIdRoute
+ __root__: typeof rootRouteImport;
+ "/_shell": typeof ShellRouteWithChildren;
+ "/_shell/prs": typeof ShellPrsRoute;
+ "/_shell/": typeof ShellIndexRoute;
+ "/_shell/projects/$projectId": typeof ShellProjectsProjectIdRoute;
+ "/_shell/sessions/$sessionId": typeof ShellSessionsSessionIdRoute;
+ "/_shell/projects/$projectId_/settings": typeof ShellProjectsProjectIdSettingsRoute;
+ "/_shell/projects/$projectId_/sessions/$sessionId": typeof ShellProjectsProjectIdSessionsSessionIdRoute;
}
export interface FileRouteTypes {
- fileRoutesByFullPath: FileRoutesByFullPath
- fullPaths:
- | '/'
- | '/prs'
- | '/projects/$projectId'
- | '/sessions/$sessionId'
- | '/projects/$projectId/settings'
- | '/projects/$projectId/sessions/$sessionId'
- fileRoutesByTo: FileRoutesByTo
- to:
- | '/prs'
- | '/'
- | '/projects/$projectId'
- | '/sessions/$sessionId'
- | '/projects/$projectId/settings'
- | '/projects/$projectId/sessions/$sessionId'
- id:
- | '__root__'
- | '/_shell'
- | '/_shell/prs'
- | '/_shell/'
- | '/_shell/projects/$projectId'
- | '/_shell/sessions/$sessionId'
- | '/_shell/projects/$projectId_/settings'
- | '/_shell/projects/$projectId_/sessions/$sessionId'
- fileRoutesById: FileRoutesById
+ fileRoutesByFullPath: FileRoutesByFullPath;
+ fullPaths:
+ | "/"
+ | "/prs"
+ | "/projects/$projectId"
+ | "/sessions/$sessionId"
+ | "/projects/$projectId/settings"
+ | "/projects/$projectId/sessions/$sessionId";
+ fileRoutesByTo: FileRoutesByTo;
+ to:
+ | "/prs"
+ | "/"
+ | "/projects/$projectId"
+ | "/sessions/$sessionId"
+ | "/projects/$projectId/settings"
+ | "/projects/$projectId/sessions/$sessionId";
+ id:
+ | "__root__"
+ | "/_shell"
+ | "/_shell/prs"
+ | "/_shell/"
+ | "/_shell/projects/$projectId"
+ | "/_shell/sessions/$sessionId"
+ | "/_shell/projects/$projectId_/settings"
+ | "/_shell/projects/$projectId_/sessions/$sessionId";
+ fileRoutesById: FileRoutesById;
}
export interface RootRouteChildren {
- ShellRoute: typeof ShellRouteWithChildren
+ ShellRoute: typeof ShellRouteWithChildren;
}
-declare module '@tanstack/react-router' {
- interface FileRoutesByPath {
- '/_shell': {
- id: '/_shell'
- path: ''
- fullPath: '/'
- preLoaderRoute: typeof ShellRouteImport
- parentRoute: typeof rootRouteImport
- }
- '/_shell/': {
- id: '/_shell/'
- path: '/'
- fullPath: '/'
- preLoaderRoute: typeof ShellIndexRouteImport
- parentRoute: typeof ShellRoute
- }
- '/_shell/prs': {
- id: '/_shell/prs'
- path: '/prs'
- fullPath: '/prs'
- preLoaderRoute: typeof ShellPrsRouteImport
- parentRoute: typeof ShellRoute
- }
- '/_shell/sessions/$sessionId': {
- id: '/_shell/sessions/$sessionId'
- path: '/sessions/$sessionId'
- fullPath: '/sessions/$sessionId'
- preLoaderRoute: typeof ShellSessionsSessionIdRouteImport
- parentRoute: typeof ShellRoute
- }
- '/_shell/projects/$projectId': {
- id: '/_shell/projects/$projectId'
- path: '/projects/$projectId'
- fullPath: '/projects/$projectId'
- preLoaderRoute: typeof ShellProjectsProjectIdRouteImport
- parentRoute: typeof ShellRoute
- }
- '/_shell/projects/$projectId_/settings': {
- id: '/_shell/projects/$projectId_/settings'
- path: '/projects/$projectId/settings'
- fullPath: '/projects/$projectId/settings'
- preLoaderRoute: typeof ShellProjectsProjectIdSettingsRouteImport
- parentRoute: typeof ShellRoute
- }
- '/_shell/projects/$projectId_/sessions/$sessionId': {
- id: '/_shell/projects/$projectId_/sessions/$sessionId'
- path: '/projects/$projectId/sessions/$sessionId'
- fullPath: '/projects/$projectId/sessions/$sessionId'
- preLoaderRoute: typeof ShellProjectsProjectIdSessionsSessionIdRouteImport
- parentRoute: typeof ShellRoute
- }
- }
+declare module "@tanstack/react-router" {
+ interface FileRoutesByPath {
+ "/_shell": {
+ id: "/_shell";
+ path: "";
+ fullPath: "/";
+ preLoaderRoute: typeof ShellRouteImport;
+ parentRoute: typeof rootRouteImport;
+ };
+ "/_shell/": {
+ id: "/_shell/";
+ path: "/";
+ fullPath: "/";
+ preLoaderRoute: typeof ShellIndexRouteImport;
+ parentRoute: typeof ShellRoute;
+ };
+ "/_shell/prs": {
+ id: "/_shell/prs";
+ path: "/prs";
+ fullPath: "/prs";
+ preLoaderRoute: typeof ShellPrsRouteImport;
+ parentRoute: typeof ShellRoute;
+ };
+ "/_shell/sessions/$sessionId": {
+ id: "/_shell/sessions/$sessionId";
+ path: "/sessions/$sessionId";
+ fullPath: "/sessions/$sessionId";
+ preLoaderRoute: typeof ShellSessionsSessionIdRouteImport;
+ parentRoute: typeof ShellRoute;
+ };
+ "/_shell/projects/$projectId": {
+ id: "/_shell/projects/$projectId";
+ path: "/projects/$projectId";
+ fullPath: "/projects/$projectId";
+ preLoaderRoute: typeof ShellProjectsProjectIdRouteImport;
+ parentRoute: typeof ShellRoute;
+ };
+ "/_shell/projects/$projectId_/settings": {
+ id: "/_shell/projects/$projectId_/settings";
+ path: "/projects/$projectId/settings";
+ fullPath: "/projects/$projectId/settings";
+ preLoaderRoute: typeof ShellProjectsProjectIdSettingsRouteImport;
+ parentRoute: typeof ShellRoute;
+ };
+ "/_shell/projects/$projectId_/sessions/$sessionId": {
+ id: "/_shell/projects/$projectId_/sessions/$sessionId";
+ path: "/projects/$projectId/sessions/$sessionId";
+ fullPath: "/projects/$projectId/sessions/$sessionId";
+ preLoaderRoute: typeof ShellProjectsProjectIdSessionsSessionIdRouteImport;
+ parentRoute: typeof ShellRoute;
+ };
+ }
}
interface ShellRouteChildren {
- ShellPrsRoute: typeof ShellPrsRoute
- ShellIndexRoute: typeof ShellIndexRoute
- ShellProjectsProjectIdRoute: typeof ShellProjectsProjectIdRoute
- ShellSessionsSessionIdRoute: typeof ShellSessionsSessionIdRoute
- ShellProjectsProjectIdSettingsRoute: typeof ShellProjectsProjectIdSettingsRoute
- ShellProjectsProjectIdSessionsSessionIdRoute: typeof ShellProjectsProjectIdSessionsSessionIdRoute
+ ShellPrsRoute: typeof ShellPrsRoute;
+ ShellIndexRoute: typeof ShellIndexRoute;
+ ShellProjectsProjectIdRoute: typeof ShellProjectsProjectIdRoute;
+ ShellSessionsSessionIdRoute: typeof ShellSessionsSessionIdRoute;
+ ShellProjectsProjectIdSettingsRoute: typeof ShellProjectsProjectIdSettingsRoute;
+ ShellProjectsProjectIdSessionsSessionIdRoute: typeof ShellProjectsProjectIdSessionsSessionIdRoute;
}
const ShellRouteChildren: ShellRouteChildren = {
- ShellPrsRoute: ShellPrsRoute,
- ShellIndexRoute: ShellIndexRoute,
- ShellProjectsProjectIdRoute: ShellProjectsProjectIdRoute,
- ShellSessionsSessionIdRoute: ShellSessionsSessionIdRoute,
- ShellProjectsProjectIdSettingsRoute: ShellProjectsProjectIdSettingsRoute,
- ShellProjectsProjectIdSessionsSessionIdRoute:
- ShellProjectsProjectIdSessionsSessionIdRoute,
-}
+ ShellPrsRoute: ShellPrsRoute,
+ ShellIndexRoute: ShellIndexRoute,
+ ShellProjectsProjectIdRoute: ShellProjectsProjectIdRoute,
+ ShellSessionsSessionIdRoute: ShellSessionsSessionIdRoute,
+ ShellProjectsProjectIdSettingsRoute: ShellProjectsProjectIdSettingsRoute,
+ ShellProjectsProjectIdSessionsSessionIdRoute: ShellProjectsProjectIdSessionsSessionIdRoute,
+};
-const ShellRouteWithChildren = ShellRoute._addFileChildren(ShellRouteChildren)
+const ShellRouteWithChildren = ShellRoute._addFileChildren(ShellRouteChildren);
const rootRouteChildren: RootRouteChildren = {
- ShellRoute: ShellRouteWithChildren,
-}
-export const routeTree = rootRouteImport
- ._addFileChildren(rootRouteChildren)
- ._addFileTypes()
+ ShellRoute: ShellRouteWithChildren,
+};
+export const routeTree = rootRouteImport._addFileChildren(rootRouteChildren)._addFileTypes();
diff --git a/packages/shared/package.json b/packages/shared/package.json
index b0f927612..c07398b72 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -1,27 +1,27 @@
{
- "name": "@agent-orchestrator/shared",
- "version": "0.0.0",
- "private": true,
- "main": "./dist/index.js",
- "types": "./dist/index.d.ts",
- "scripts": {
- "build": "tsc",
- "typecheck": "tsc --noEmit",
- "test": "jest"
- },
- "dependencies": {
- "@tanstack/react-query": "^5.0.0",
- "@types/event-source": "^3.0.0",
- "event-source": "^2.0.0",
- "zustand": "^4.0.0"
- },
- "devDependencies": {
- "@types/jest": "^29.0.0",
- "@types/react": "^18.0.0",
- "jest": "^29.0.0",
- "typescript": "^5.0.0"
- },
- "peerDependencies": {
- "react": "^18.0.0"
- }
+ "name": "@agent-orchestrator/shared",
+ "version": "0.0.0",
+ "private": true,
+ "main": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "scripts": {
+ "build": "tsc",
+ "typecheck": "tsc --noEmit",
+ "test": "jest"
+ },
+ "dependencies": {
+ "@tanstack/react-query": "^5.0.0",
+ "@types/event-source": "^3.0.0",
+ "event-source": "^2.0.0",
+ "zustand": "^4.0.0"
+ },
+ "devDependencies": {
+ "@types/jest": "^29.0.0",
+ "@types/react": "^18.0.0",
+ "jest": "^29.0.0",
+ "typescript": "^5.0.0"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
}
diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json
index 5944f7e71..5e21d37bb 100644
--- a/packages/shared/tsconfig.json
+++ b/packages/shared/tsconfig.json
@@ -1,19 +1,19 @@
{
- "compilerOptions": {
- "target": "ES2020",
- "module": "ESNext",
- "lib": ["ES2020", "DOM"],
- "moduleResolution": "bundler",
- "jsx": "react-jsx",
- "strict": true,
- "esModuleInterop": true,
- "skipLibCheck": true,
- "forceConsistentCasingInFileNames": true,
- "resolveJsonModule": true,
- "declaration": true,
- "outDir": "./dist",
- "rootDir": "./src"
- },
- "include": ["src/**/*"],
- "exclude": ["node_modules", "dist", "**/*.test.ts"]
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "ESNext",
+ "lib": ["ES2020", "DOM"],
+ "moduleResolution": "bundler",
+ "jsx": "react-jsx",
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "declaration": true,
+ "outDir": "./dist",
+ "rootDir": "./src"
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist", "**/*.test.ts"]
}