chore: format with prettier [skip ci]
This commit is contained in:
parent
bc7fc85f79
commit
22c72813c0
74
README.md
74
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
|
||||
|
||||
|
|
|
|||
|
|
@ -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<br/>(GitHub)"]
|
||||
Reaper["Reaper<br/>(Runtime liveness)"]
|
||||
Storage["Storage + CDC<br/>(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<br/>(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<br/>• Direct CLI interaction<br/>• Unix PTY integration"]
|
||||
ConptyRuntime --> ConptyFeatures["• Pty-host server<br/>• B1 binary protocol<br/>• Loopback TCP communication"]
|
||||
|
||||
|
||||
TmuxFeatures --> Common["Common Interface:<br/>ports.Runtime + ports.Attacher"]
|
||||
ConptyFeatures --> Common
|
||||
|
||||
|
||||
Common --> Session["Session Management<br/>& 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 <id>
|
||||
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 <id>
|
||||
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:<br/>ci_failed, draft, changes_requested,<br/>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.
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ graph TB
|
|||
CLI["cmd/ao<br/>CLI entrypoint"]
|
||||
Main["main.go<br/>Daemon entrypoint"]
|
||||
end
|
||||
|
||||
|
||||
subgraph CoreLayer["Core Layer"]
|
||||
Domain["domain<br/>Shared vocabulary"]
|
||||
Ports["ports<br/>Capability interfaces"]
|
||||
|
|
@ -37,7 +37,7 @@ graph TB
|
|||
SessionMgr["session_manager<br/>Internal commands"]
|
||||
Lifecycle["lifecycle<br/>Fact reducer"]
|
||||
end
|
||||
|
||||
|
||||
subgraph AdapterLayer["Adapter Layer"]
|
||||
AgentAdapters["adapters/agent/*<br/>23+ agents"]
|
||||
RuntimeAdapters["adapters/runtime/*<br/>tmux + conpty"]
|
||||
|
|
@ -45,7 +45,7 @@ graph TB
|
|||
SCMAdapters["adapters/scm/*<br/>GitHub"]
|
||||
TrackerAdapters["adapters/tracker/*<br/>GitHub"]
|
||||
end
|
||||
|
||||
|
||||
subgraph Infrastructure["Infrastructure"]
|
||||
Storage["storage/sqlite<br/>Persistence"]
|
||||
CDC["cdc<br/>Change delivery"]
|
||||
|
|
@ -55,31 +55,31 @@ graph TB
|
|||
Daemon["daemon<br/>Composition root"]
|
||||
Config["config<br/>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<br/>Unix PTY integration"]
|
||||
RunSelect -->|Windows| Conpty["conpty<br/>ConPTY + B1 protocol"]
|
||||
|
||||
|
||||
Tmux -->|implements| RuntimePort["ports.Runtime"]
|
||||
Conpty -->|implements| RuntimePort
|
||||
|
||||
|
||||
Tmux -->|uses| PtyExec["ptyexec<br/>Unix PTY spawning"]
|
||||
Conpty -->|uses| PtyHost["Pty-host server<br/>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 <id>
|
||||
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/<br/># CLI entrypoint"]
|
||||
Root --> Main["main.go<br/># Daemon entrypoint"]
|
||||
Root --> Sqlc["sqlc.yaml"]
|
||||
|
||||
|
||||
Root --> Domain["internal/domain/<br/># Shared vocabulary"]
|
||||
Root --> Ports["internal/ports/<br/># Capability interfaces"]
|
||||
|
||||
|
||||
Root --> Service["internal/service/"]
|
||||
Service --> Proj["project/<br/># Project API"]
|
||||
Service --> Sess["session/<br/># Session API"]
|
||||
Service --> PR["pr/<br/># PR service"]
|
||||
Service --> Review["review/<br/># Code review"]
|
||||
|
||||
|
||||
Root --> SessMgr["internal/session_manager/<br/># Internal commands"]
|
||||
Root --> Life["internal/lifecycle/<br/># Fact reducer"]
|
||||
|
||||
|
||||
Root --> Observe["internal/observe/"]
|
||||
Observe --> SCM["scm/<br/># GitHub observer"]
|
||||
Observe --> Reap["reaper/<br/># Liveness observer"]
|
||||
|
||||
|
||||
Root --> Store["internal/storage/sqlite/<br/># DB + stores"]
|
||||
Root --> CDC2["internal/cdc/<br/># Change delivery"]
|
||||
Root --> Term["internal/terminal/<br/># PTY protocol"]
|
||||
|
|
@ -411,7 +433,7 @@ graph TB
|
|||
Root --> CLI2["internal/cli/<br/># CLI commands"]
|
||||
Root --> Daemon2["internal/daemon/<br/># Composition"]
|
||||
Root --> Cfg["internal/config/<br/># Config"]
|
||||
|
||||
|
||||
Root --> Adapters["internal/adapters/"]
|
||||
Adapters --> Agent["agent/<br/># 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/<br/>Call service/*<br/>Update OpenAPI"]
|
||||
Choice -->|Product resource| Product["domain + service/<br/>storage + ports"]
|
||||
Choice -->|Adapter| AdapterPath["adapters/<capability>/<impl><br/>Implement ports<br/>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
|
||||
|
|
|
|||
40
package.json
40
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"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -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<FileRouteTypes>()
|
||||
ShellRoute: ShellRouteWithChildren,
|
||||
};
|
||||
export const routeTree = rootRouteImport._addFileChildren(rootRouteChildren)._addFileTypes<FileRouteTypes>();
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"]
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue