conductor-oss 0.18.0 → 0.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +222 -201
  2. package/package.json +5 -5
  3. package/web/.next/standalone/packages/web/.next/BUILD_ID +1 -1
  4. package/web/.next/standalone/packages/web/.next/build-manifest.json +2 -2
  5. package/web/.next/standalone/packages/web/.next/prerender-manifest.json +3 -3
  6. package/web/.next/standalone/packages/web/.next/server/app/_global-error.html +2 -2
  7. package/web/.next/standalone/packages/web/.next/server/app/_global-error.rsc +1 -1
  8. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/web/.next/standalone/packages/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page/server-reference-manifest.json +7 -7
  14. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  15. package/web/.next/standalone/packages/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/web/.next/standalone/packages/web/.next/server/app/_not-found.html +1 -1
  17. package/web/.next/standalone/packages/web/.next/server/app/_not-found.rsc +3 -3
  18. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  19. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  20. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  21. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  22. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  23. package/web/.next/standalone/packages/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  24. package/web/.next/standalone/packages/web/.next/server/app/page/server-reference-manifest.json +7 -7
  25. package/web/.next/standalone/packages/web/.next/server/app/page.js.nft.json +1 -1
  26. package/web/.next/standalone/packages/web/.next/server/app/page_client-reference-manifest.js +1 -1
  27. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page/server-reference-manifest.json +7 -7
  28. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
  29. package/web/.next/standalone/packages/web/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
  30. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page/server-reference-manifest.json +7 -7
  31. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page.js.nft.json +1 -1
  32. package/web/.next/standalone/packages/web/.next/server/app/sign-in/[[...sign-in]]/page_client-reference-manifest.js +1 -1
  33. package/web/.next/standalone/packages/web/.next/server/app/unlock/page/server-reference-manifest.json +7 -7
  34. package/web/.next/standalone/packages/web/.next/server/app/unlock/page.js.nft.json +1 -1
  35. package/web/.next/standalone/packages/web/.next/server/app/unlock/page_client-reference-manifest.js +1 -1
  36. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__379d412d._.js +1 -1
  37. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/[root-of-the-server]__749fe4b2._.js +1 -1
  38. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__5b5bf182._.js → [root-of-the-server]__992cdcf8._.js} +2 -2
  39. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__12bb92c8._.js → [root-of-the-server]__a565f9a3._.js} +2 -2
  40. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{[root-of-the-server]__6fcf1553._.js → [root-of-the-server]__da08a50a._.js} +2 -2
  41. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_0e1412de._.js +1 -1
  42. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_532f707d._.js +1 -1
  43. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{_6d557023._.js → _62d206cc._.js} +2 -2
  44. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_69e05fca._.js +1 -1
  45. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_80efe193._.js +1 -1
  46. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_c0f0e227._.js +1 -1
  47. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/_f36ddaa9._.js +1 -1
  48. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_adc83dc2._.js → node_modules_5646ec2d._.js} +1 -1
  49. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/{node_modules_2157a581._.js → node_modules_6d2fa1ea._.js} +1 -1
  50. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_4f296b1d._.js +3 -0
  51. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_599a1810._.js +3 -0
  52. package/web/.next/standalone/packages/web/.next/server/pages/404.html +1 -1
  53. package/web/.next/standalone/packages/web/.next/server/pages/500.html +2 -2
  54. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.js +1 -1
  55. package/web/.next/standalone/packages/web/.next/server/server-reference-manifest.json +8 -8
  56. package/web/.next/{static/chunks/9a7ec6f186a2b5ad.js → standalone/packages/web/.next/static/chunks/58a9b117e5684e7c.js} +1 -1
  57. package/web/.next/standalone/packages/web/.next/static/chunks/{697cfa8e22c0eb00.js → 8d05dc3b261207bb.js} +1 -1
  58. package/web/.next/standalone/packages/web/.next/static/chunks/a8cd591e904d769e.js +1 -0
  59. package/web/.next/standalone/packages/web/.next/static/chunks/{9d6d2b45dba0f005.js → c1e720eabb98af26.js} +1 -1
  60. package/web/.next/{standalone/packages/web/.next/static/chunks/9a7ec6f186a2b5ad.js → static/chunks/58a9b117e5684e7c.js} +1 -1
  61. package/web/.next/static/chunks/{697cfa8e22c0eb00.js → 8d05dc3b261207bb.js} +1 -1
  62. package/web/.next/static/chunks/a8cd591e904d769e.js +1 -0
  63. package/web/.next/static/chunks/{9d6d2b45dba0f005.js → c1e720eabb98af26.js} +1 -1
  64. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_06d0c313._.js +0 -3
  65. package/web/.next/standalone/packages/web/.next/server/chunks/ssr/node_modules_@clerk_nextjs_dist_esm_app-router_2fb7c4e5._.js +0 -3
  66. package/web/.next/standalone/packages/web/.next/static/chunks/031a3df658ea8a21.js +0 -1
  67. package/web/.next/static/chunks/031a3df658ea8a21.js +0 -1
  68. /package/web/.next/standalone/packages/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_buildManifest.js +0 -0
  69. /package/web/.next/standalone/packages/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_clientMiddlewareManifest.json +0 -0
  70. /package/web/.next/standalone/packages/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_ssgManifest.js +0 -0
  71. /package/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_buildManifest.js +0 -0
  72. /package/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_clientMiddlewareManifest.json +0 -0
  73. /package/web/.next/static/{Veae3TCGcp6JvqCrg2JY3 → FHjp9qazH2xWUCRt6mqg4}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Conductor OSS
4
4
 
5
- ### Local-first orchestration for coding-agent CLIs
5
+ ### The local-first control plane for AI coding agents
6
6
 
7
7
  **One command. Markdown-native. No cloud relay.**
8
8
 
@@ -14,61 +14,30 @@
14
14
 
15
15
  </div>
16
16
 
17
- Conductor OSS is a local-first control plane for software work driven by AI coding agents.
17
+ ---
18
18
 
19
- It turns Markdown kanban boards into dispatchable work, launches installed coding CLIs inside isolated workspaces, persists state in local files plus SQLite, and gives you a browser dashboard for live terminal access, normalized session history, preview, diff review, and recovery workflows.
19
+ Conductor OSS is a local-first orchestration platform for AI coding agents. It takes Markdown kanban boards, turns them into dispatchable work, and launches your installed coding CLIs Claude Code, Codex, Gemini, and seven others inside isolated git worktrees with full terminal access from a browser dashboard.
20
20
 
21
- If you already use tools like Claude Code, Codex, Gemini, Qwen Code, Cursor Agent, Amp, OpenCode, Copilot, or CCR, Conductor is the orchestration layer around them rather than a replacement for them.
21
+ Everything runs on your machine. State lives in local files and SQLite. Agents keep their own authentication and billing. Conductor is the operating layer around them, not a replacement.
22
22
 
23
- ## What Conductor Does
24
-
25
- - Dispatches tasks from `CONDUCTOR.md` boards into real agent sessions.
26
- - Runs agents locally in the repo or in isolated git worktrees.
27
- - Uses a terminal-first runtime so each session remains an interactive shell-backed workspace.
28
- - Streams session status into a dashboard over SSE and websocket-backed terminal connections.
29
- - Tracks retries, restores, kill/archive flows, session diffs, checks, previews, and feedback loops.
30
- - Stores state locally in `conductor.yaml`, `CONDUCTOR.md`, and `.conductor/conductor.db`.
31
- - Keeps agent authentication and billing with the upstream CLI you already installed.
32
-
33
- ## Core Workflow
34
-
35
- 1. Add a local repo or clone one into a managed workspace.
36
- 2. Create or edit tasks in `CONDUCTOR.md`.
37
- 3. Move a task into `Ready to Dispatch`.
38
- 4. Conductor launches the selected agent in an isolated workspace.
39
- 5. Follow the session from the browser:
40
- - `Terminal`: the live terminal is the primary session workspace.
41
- - `Overview`: normalized feed, runtime state, metadata, and recovery hints.
42
- - `Preview`: connect a local dev URL and interact with the app from the session page.
43
- - `Diff`: inspect changed files, workspace contents, and checks.
44
- 6. Retry, restore, send feedback, or archive the session when needed.
23
+ <div align="center">
45
24
 
46
- ## Highlights
25
+ ![Conductor full demo](docs/demo/full-demo.gif)
47
26
 
48
- - Local-first by design: no hosted relay, no repo proxy, no hosted state store.
49
- - Markdown-native planning: boards remain readable outside the app.
50
- - Multi-agent support with adapter-based discovery and launch logic.
51
- - Worktree-aware execution for parallel changes in the same repository.
52
- - Session recovery after backend restarts, including direct PTY terminal restore for live runtimes.
53
- - GitHub-aware flows for repository import, PR metadata, checks, and project syncing.
54
- - MCP server mode for integrating Conductor with external clients.
27
+ </div>
55
28
 
56
- ## Supported Agents
29
+ ## Why Conductor
57
30
 
58
- Built-in adapters currently exist for:
31
+ Running one agent in one terminal works fine for a single task. When you want to queue multiple tasks across multiple repos, dispatch them to different agents, watch them run in parallel, retry failures, review diffs, and coordinate it all from one place — you need an orchestration layer.
59
32
 
60
- - Claude Code
61
- - Codex
62
- - Gemini
63
- - Qwen Code
64
- - Amp
65
- - Cursor Agent
66
- - OpenCode
67
- - Droid
68
- - GitHub Copilot
69
- - CCR
33
+ Conductor adds:
70
34
 
71
- Availability still depends on what is installed and authenticated on your machine.
35
+ - **Planning** Markdown kanban boards that work in Obsidian and in the browser
36
+ - **Dispatch** — Automated task-to-agent assignment with queue management
37
+ - **Isolation** — Git worktree-per-session so agents never step on each other
38
+ - **Visibility** — Live terminal streaming, session feeds, and diff inspection
39
+ - **Recovery** — Session restore after backend restarts, retries, and feedback loops
40
+ - **Review** — PR creation, CI check monitoring, and code diff tools built in
72
41
 
73
42
  ## Quick Start
74
43
 
@@ -76,234 +45,286 @@ Availability still depends on what is installed and authenticated on your machin
76
45
 
77
46
  - Node.js `>= 18`
78
47
  - `git`
79
- - at least one supported coding-agent CLI installed and authenticated
48
+ - At least one supported coding agent CLI installed and authenticated
80
49
 
81
- ### Launch Conductor
50
+ ### Launch
82
51
 
83
52
  ```bash
84
53
  npx conductor-oss@latest
85
54
  ```
86
55
 
87
- The npm launcher defaults to `co start --open`, which starts the local stack and opens the dashboard.
56
+ This starts the Rust backend and Next.js dashboard, then opens the browser. Default ports:
88
57
 
89
- ### Native Launch Experience
58
+ - Dashboard: `http://127.0.0.1:4747`
59
+ - Backend: `http://127.0.0.1:4748`
90
60
 
91
- Conductor launches agents into their native terminal UIs instead of replacing them with a synthetic chat shell.
61
+ ### Initialize an existing repo
92
62
 
93
- - Claude Code launches into the full Claude Code terminal workspace.
94
- - Codex launches into the full Codex terminal app and keeps the native review and tool flow intact.
95
- - Gemini launches into the full Gemini CLI terminal UI, including its native multi-step workflow.
63
+ ```bash
64
+ npx conductor-oss@latest init
65
+ npx conductor-oss@latest start --workspace .
66
+ ```
96
67
 
97
- The dashboard terminal is a live viewer and input surface over the backend-owned session, so reconnecting or switching sessions preserves the real agent experience instead of rebuilding a frontend-only shell.
68
+ This scaffolds `conductor.yaml`, `CONDUCTOR.md`, and `.conductor/conductor.db` in the current directory.
98
69
 
99
- Agent launch surface:
70
+ ### Global install
100
71
 
101
- ![Conductor agent picker](docs/screenshots/launch-agent-picker.png)
72
+ ```bash
73
+ npm install -g conductor-oss
74
+ co
75
+ ```
102
76
 
103
- Claude Code session:
77
+ The launcher registers three aliases: `conductor-oss`, `conductor`, and `co`.
104
78
 
105
- ![Claude Code native terminal in Conductor](docs/screenshots/launch-claude-native.png)
79
+ ## Supported Agents
106
80
 
107
- Codex session:
81
+ Conductor ships with adapters for 10 coding agent CLIs. Each adapter handles binary detection, launch commands, process monitoring, and prompt delivery.
108
82
 
109
- ![Codex native terminal in Conductor](docs/screenshots/launch-codex-native.png)
83
+ | Agent | CLI |
84
+ |-------|-----|
85
+ | Claude Code | `claude` |
86
+ | Codex | `codex` |
87
+ | Gemini | `gemini` |
88
+ | Qwen Code | `qwen` |
89
+ | Amp | `amp` |
90
+ | Cursor Agent | `cursor-agent` |
91
+ | OpenCode | `opencode` |
92
+ | Droid | `droid` |
93
+ | GitHub Copilot | `gh copilot` |
94
+ | CCR | `ccr` |
110
95
 
111
- Gemini session:
96
+ Agents appear in the dashboard picker based on what is installed and authenticated on your machine.
112
97
 
113
- ![Gemini native terminal in Conductor](docs/screenshots/launch-gemini-native.png)
98
+ ## Native Terminal Experience
114
99
 
115
- Launcher defaults:
100
+ Conductor launches agents into their real terminal UIs — not a synthetic chat shell. Claude Code runs as Claude Code. Codex runs as Codex. The dashboard terminal is a live viewer over the backend-owned PTY session using the TTyD binary protocol, so reconnecting or switching sessions preserves the native agent experience.
116
101
 
117
- - dashboard: `http://127.0.0.1:4747`
118
- - Rust backend: `http://127.0.0.1:4748`
102
+ <div align="center">
119
103
 
120
- ### Initialize an existing repo
104
+ | Agent Picker | Claude Code Session |
105
+ |:---:|:---:|
106
+ | ![Agent picker](docs/screenshots/launch-agent-picker.png) | ![Claude Code terminal](docs/screenshots/launch-claude-native.png) |
121
107
 
122
- ```bash
123
- npx conductor-oss@latest init
124
- npx conductor-oss@latest start --workspace .
125
- ```
108
+ | Codex Session | Gemini Session |
109
+ |:---:|:---:|
110
+ | ![Codex terminal](docs/screenshots/launch-codex-native.png) | ![Gemini terminal](docs/screenshots/launch-gemini-native.png) |
126
111
 
127
- That scaffolds:
112
+ </div>
128
113
 
129
- - `conductor.yaml`
130
- - `CONDUCTOR.md`
131
- - `.conductor/conductor.db`
114
+ ## How It Works
132
115
 
133
- If you prefer a global install:
116
+ ### Task Lifecycle
134
117
 
135
- ```bash
136
- npm install -g conductor-oss
137
- co
118
+ ```
119
+ Inbox Ready to Dispatch → Dispatching → In Progress → Review → Done
138
120
  ```
139
121
 
140
- The launcher exposes `conductor-oss`, `conductor`, and `co`.
141
-
142
- ## CLI Overview
143
-
144
- The npm launcher is the main user-facing CLI. Run `co --help` for the full surface.
145
-
146
- Common launcher commands:
147
-
148
- - `co start` - start the Rust backend and web dashboard
149
- - `co dashboard` - open the dashboard
150
- - `co init` - scaffold `conductor.yaml` and `CONDUCTOR.md`
151
- - `co setup` - guided first-run setup
152
- - `co doctor` - diagnose backend and runtime issues
153
- - `co spawn` - create a session
154
- - `co list` - list sessions
155
- - `co status` - summarize session state
156
- - `co send` - send a follow-up to a session
157
- - `co attach` - legacy command kept only to explain the direct-terminal migration
158
- - `co restore` - restore an exited session
159
- - `co retry` - create a new attempt from an earlier task or session
160
- - `co kill` - terminate a session
161
- - `co cleanup` - reclaim resources from completed sessions
162
- - `co feedback` - send reviewer feedback back into a session
163
- - `co task` - task graph helpers
164
- - `co mcp-server` - run Conductor as an MCP server over stdio
165
-
166
- There is also a native Rust CLI in `crates/conductor-cli` used by the launcher and source development. Its command set is intentionally smaller and lower-level than the npm launcher.
122
+ 1. **Create tasks** in `CONDUCTOR.md` a Markdown kanban board compatible with Obsidian
123
+ 2. **Move tasks** to "Ready to Dispatch" (or let the automation promote them)
124
+ 3. **Conductor dispatches** — picks up queued tasks, selects an agent, prepares the workspace
125
+ 4. **Agent executes** — launched in an isolated git worktree with a compiled task prompt
126
+ 5. **Monitor live** terminal streaming, normalized session feed, and runtime metadata in the dashboard
127
+ 6. **Review output** — inspect diffs, browse changed files, view CI checks, create PRs
128
+ 7. **Iterate** — retry, restore, send feedback, or archive
167
129
 
168
- ## Configuration and Local Data
130
+ ### Dashboard Surfaces
169
131
 
170
- Conductor uses a small set of local files:
132
+ Each session page provides:
171
133
 
172
- - `conductor.yaml`
173
- Workspace and project configuration, agent defaults, access settings, and runtime preferences.
174
- - `CONDUCTOR.md`
175
- Markdown kanban board used for planning and dispatch.
176
- - `.conductor/conductor.db`
177
- SQLite persistence for sessions, metadata, and runtime state.
178
- - `.conductor/rust-backend/detached/`
179
- Runtime artifacts for direct PTY-backed sessions.
180
- - `attachments/...`
181
- Uploaded session files and generated artifacts.
134
+ - **Terminal** — live interactive terminal over the agent's PTY session
135
+ - **Overview** normalized conversation feed, runtime state, metadata, and recovery actions
136
+ - **Preview** — connect a local dev URL and interact with the running app
137
+ - **Diff** file-level change inspection and workspace file browser
182
138
 
183
- ## Application Surfaces
139
+ <div align="center">
184
140
 
185
- ### Dashboard
141
+ | Dashboard Overview | Session Detail |
142
+ |:---:|:---:|
143
+ | ![Dashboard](docs/screenshots/01-dashboard-overview.png) | ![Session](docs/screenshots/07-session-detail.png) |
186
144
 
187
- The Next.js dashboard is the main UI for:
145
+ </div>
188
146
 
189
- - project and repository management
190
- - board editing and task comments
191
- - session monitoring
192
- - terminal access
193
- - preview browser controls
194
- - diff and file inspection
195
- - PR and check visibility
196
- - app update notices and runtime health
147
+ ## CLI Reference
197
148
 
198
- ### Rust Backend
149
+ The npm launcher (`co`) is the primary CLI. Run `co --help` for the full command list.
199
150
 
200
- The Rust backend is the orchestration core. It handles:
151
+ | Command | Description |
152
+ |---------|-------------|
153
+ | `co start` | Start the backend and dashboard |
154
+ | `co init` | Scaffold `conductor.yaml` and `CONDUCTOR.md` |
155
+ | `co setup` | Guided first-run configuration |
156
+ | `co doctor` | Diagnose backend and runtime issues |
157
+ | `co spawn` | Create a new session |
158
+ | `co list` | List all sessions |
159
+ | `co status` | Summarize workspace and session state |
160
+ | `co send` | Send a follow-up message to a running session |
161
+ | `co feedback` | Send reviewer feedback into a session |
162
+ | `co retry` | Create a new attempt from a prior task or session |
163
+ | `co restore` | Restore an exited session |
164
+ | `co kill` | Terminate a session |
165
+ | `co cleanup` | Reclaim resources from completed sessions |
166
+ | `co dashboard` | Open the dashboard in a browser |
167
+ | `co mcp-server` | Run Conductor as an MCP server over stdio |
201
168
 
202
- - session lifecycle and spawn queueing
203
- - executor discovery and agent adapters
204
- - direct PTY runtime management
205
- - workspace and worktree preparation
206
- - SQLite persistence
207
- - SSE event streaming
208
- - terminal websocket transport
209
- - board automation and filesystem watching
210
- - GitHub and notification integrations
169
+ A lower-level Rust CLI also exists in `crates/conductor-cli` for direct backend interaction during development.
211
170
 
212
- ### Terminal-First Sessions
171
+ ## Configuration
213
172
 
214
- The live terminal is now the primary session workspace. The dashboard still provides a normalized feed and metadata, but interactive work is expected to happen through the terminal surface, not a synthetic chat-only shell.
173
+ Conductor uses three local files:
215
174
 
216
- ### Terminal Validation And Rollout
175
+ | File | Purpose |
176
+ |------|---------|
177
+ | `conductor.yaml` | Workspace config, project definitions, agent defaults, runtime preferences |
178
+ | `CONDUCTOR.md` | Markdown kanban board for planning and dispatch |
179
+ | `.conductor/conductor.db` | SQLite database for sessions, metadata, and runtime state |
217
180
 
218
- Phase 2 terminal validation now has explicit operator guidance:
181
+ Additional runtime artifacts:
219
182
 
220
- - [Terminal rollout notes](docs/terminal-rollout.md) cover benchmark hooks, acceptance targets, merge gates, and failure signals to capture.
221
- - [Terminal QA checklist](docs/terminal-qa-checklist.md) covers desktop, phone, and private-remote manual verification.
222
- - [Terminal QA matrix](docs/terminal-qa-matrix.md) is the sign-off sheet for recorded timings and pass/fail status.
223
- - `bun run bench:terminal -- <session-id>` runs the lightweight terminal benchmark sweep through the dashboard endpoints.
183
+ - `.conductor/rust-backend/detached/` PTY session data for terminal restore
184
+ - `attachments/` Uploaded files and generated session artifacts
224
185
 
225
186
  ## Architecture
226
187
 
227
- User-facing stack:
188
+ ```
189
+ ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
190
+ │ npm launcher │ │ Next.js 16 UI │ │ Rust backend │
191
+ │ packages/cli │ │ packages/web │ │ conductor- │
192
+ │ │ │ │ │ server │
193
+ │ start, spawn, │───▶│ Dashboard, │◀──▶│ HTTP + SSE + │
194
+ │ init, doctor │ │ Terminal, │ │ WebSocket │
195
+ │ │ │ Diff, Preview │ │ │
196
+ └─────────────────┘ └──────────────────┘ └────────┬────────┘
197
+
198
+ ┌───────────────────────────────────┤
199
+ │ │
200
+ ┌────────▼────────┐ ┌──────────▼──────────┐
201
+ │ conductor-core │ │ conductor-executors │
202
+ │ Types, config, │ │ 10 agent adapters, │
203
+ │ board parsing │ │ process management │
204
+ └─────────────────┘ └──────────────────────┘
205
+ │ │
206
+ ┌────────▼────────┐ ┌──────────▼──────────┐
207
+ │ conductor-db │ │ conductor-git │
208
+ │ SQLite via sqlx │ │ Worktree isolation │
209
+ └─────────────────┘ └──────────────────────┘
210
+ ```
228
211
 
229
- - npm launcher in `packages/cli`
230
- - Next.js dashboard in `packages/web`
231
- - Rust backend in `crates/conductor-server`
212
+ ### Rust Crates
232
213
 
233
- Rust workspace crates:
214
+ | Crate | Purpose |
215
+ |-------|---------|
216
+ | `conductor-server` | Axum HTTP server — 24 route modules, session manager, PTY runtime, SSE streaming |
217
+ | `conductor-core` | Shared types, board parser, configuration, task and session models |
218
+ | `conductor-executors` | 10 agent adapters — binary detection, launch commands, prompt delivery |
219
+ | `conductor-db` | SQLite persistence via sqlx with compile-time checked queries |
220
+ | `conductor-git` | Git operations and worktree lifecycle management |
221
+ | `conductor-watcher` | Filesystem watcher for `CONDUCTOR.md` changes |
222
+ | `conductor-cli` | Low-level Rust CLI binary |
234
223
 
235
- - `crates/conductor-cli`
236
- - `crates/conductor-core`
237
- - `crates/conductor-db`
238
- - `crates/conductor-executors`
239
- - `crates/conductor-git`
240
- - `crates/conductor-server`
241
- - `crates/conductor-watcher`
224
+ ### TypeScript Packages
242
225
 
243
- Key runtime properties:
226
+ | Package | Purpose |
227
+ |---------|---------|
228
+ | `packages/cli` | npm launcher — user-facing CLI, binary management, process orchestration |
229
+ | `packages/web` | Next.js 16 dashboard — session UI, terminal viewer, board editor, diff tools |
230
+ | `packages/core` | Shared TypeScript types and Zod schemas |
244
231
 
245
- - local-first
246
- - SQLite-only persistence
247
- - direct PTY-backed interactive sessions
248
- - agent-agnostic execution
249
- - Markdown-native board state
232
+ ### Key Design Decisions
233
+
234
+ - **Local-first** no cloud relay, no credential proxying, all state on disk
235
+ - **SQLite-only** — single-file database, no external DB dependency
236
+ - **Direct PTY** — shell-backed sessions via `portable-pty`, not synthetic chat shells
237
+ - **Agent-agnostic** — Conductor orchestrates; each agent keeps its own auth and billing
238
+ - **Markdown-native** — boards live in `CONDUCTOR.md`, readable in any editor or Obsidian
239
+ - **Worktree isolation** — each session gets its own git worktree to prevent conflicts
240
+ - **TTyD protocol** — binary WebSocket framing for efficient terminal streaming
250
241
 
251
242
  ## Develop From Source
252
243
 
253
- Requirements:
244
+ ### Prerequisites
254
245
 
246
+ - Rust stable toolchain
255
247
  - Bun `>= 1.2`
256
248
  - Node.js `>= 18`
257
- - Rust toolchain
258
- Install dependencies:
249
+ - `git`
250
+
251
+ ### Setup
259
252
 
260
253
  ```bash
261
254
  bun install
262
255
  ```
263
256
 
264
- Run the full dev stack:
257
+ ### Commands
265
258
 
266
259
  ```bash
267
- bun run dev:full
260
+ bun run dev:full # Dashboard (port 3000) + Rust backend (port 4749)
261
+ bun run dev # Dashboard only
262
+ bun run dev:backend # Backend only (or: cargo run --bin conductor-server)
263
+ bun run build # Full production build
264
+ bun run typecheck # TypeScript type checking
265
+
266
+ cargo test --workspace # Rust tests
267
+ cargo clippy --workspace -- -D warnings # Rust linting
268
268
  ```
269
269
 
270
- Source-dev defaults:
270
+ ### Dev Ports
271
271
 
272
- - dashboard: `http://localhost:3000`
273
- - Rust backend: `http://127.0.0.1:4749`
272
+ | Service | Port |
273
+ |---------|------|
274
+ | Dashboard (dev) | `http://localhost:3000` |
275
+ | Dashboard (prod) | `http://127.0.0.1:4747` |
276
+ | Rust backend | `http://127.0.0.1:4749` |
274
277
 
275
- Useful commands:
278
+ ## Demos
276
279
 
277
- ```bash
278
- bun run dev
279
- bun run dev:backend
280
- bun run dev:full
281
- bun run build
282
- cargo test --workspace
283
- cargo clippy --workspace -- -D warnings
284
- bun run typecheck
285
- ```
280
+ <div align="center">
286
281
 
287
- ## Current Constraints
282
+ | Add a task | Auto-dispatch |
283
+ |:---:|:---:|
284
+ | ![Add task](docs/demo/01-add-task.gif) | ![Auto dispatch](docs/demo/02-auto-dispatch.gif) |
288
285
 
289
- - The interactive runtime is direct PTY-backed; old tmux sessions are treated as legacy compatibility data.
290
- - Agent behavior and output quality depend on the upstream CLI you install.
291
- - GitHub-heavy flows work best with `gh` installed and authenticated.
292
- - Preview tooling is strongest when a repo exposes a local dev server or preview URL.
293
- - Public tunnel-style remote access was removed; protected remote setups should use your own network or proxy layer.
286
+ | Live terminal | PR creation |
287
+ |:---:|:---:|
288
+ | ![Live terminal](docs/demo/03-live-terminal.gif) | ![PR creation](docs/demo/05-pr-creation.gif) |
294
289
 
295
- ## Why Conductor Exists
290
+ </div>
291
+
292
+ ## Project Structure
293
+
294
+ ```
295
+ conductor-oss/
296
+ ├── crates/
297
+ │ ├── conductor-server/ # Axum HTTP server, routes, state, SSE
298
+ │ ├── conductor-core/ # Types, config, board parsing
299
+ │ ├── conductor-executors/ # Agent adapters (10 agents)
300
+ │ ├── conductor-db/ # SQLite persistence
301
+ │ ├── conductor-git/ # Git/worktree operations
302
+ │ ├── conductor-watcher/ # Filesystem watcher
303
+ │ ├── conductor-cli/ # Rust CLI binary
304
+ │ └── notify-rust/ # Desktop notifications
305
+ ├── packages/
306
+ │ ├── cli/ # npm launcher
307
+ │ ├── web/ # Next.js dashboard
308
+ │ └── core/ # Shared TypeScript types
309
+ ├── docs/
310
+ │ ├── screenshots/ # Dashboard and session screenshots
311
+ │ ├── demo/ # Workflow demo GIFs
312
+ │ └── terminal-*.md # Terminal protocol and QA docs
313
+ ├── .github/workflows/ # CI, release, security, PR checks
314
+ ├── Cargo.toml # Rust workspace
315
+ ├── package.json # Bun workspace
316
+ ├── conductor.yaml # Workspace config (user-created)
317
+ ├── CONDUCTOR.md # Kanban board (user-created)
318
+ └── LICENSE # MIT
319
+ ```
296
320
 
297
- Single-agent terminals are useful for one task at a time. Conductor adds the operating layer around them:
321
+ ## Known Constraints
298
322
 
299
- - queueing
300
- - planning
301
- - isolation
302
- - visibility
303
- - retries
304
- - recovery
305
- - review
306
- - browser-based coordination
323
+ - Agent output quality depends entirely on the upstream CLI you install — Conductor orchestrates, it does not modify agent behavior
324
+ - GitHub-integrated flows (PR creation, check monitoring) work best with `gh` installed and authenticated
325
+ - Preview tooling requires a repo that exposes a local dev server URL
326
+ - Remote access was intentionally removed — use your own network or proxy layer for remote setups
327
+ - The runtime is direct PTY-only; legacy tmux sessions are treated as compatibility data
307
328
 
308
329
  ## Links
309
330
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conductor-oss",
3
- "version": "0.18.0",
3
+ "version": "0.18.2",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "dist/launcher.js",
@@ -33,7 +33,7 @@
33
33
  "directory": "packages/cli"
34
34
  },
35
35
  "dependencies": {
36
- "@conductor-oss/core": "0.18.0",
36
+ "@conductor-oss/core": "0.18.2",
37
37
  "chalk": "^5.6.2",
38
38
  "commander": "^14.0.3",
39
39
  "ora": "^9.3.0",
@@ -71,9 +71,9 @@
71
71
  "tailwind-merge": "^3.5.0"
72
72
  },
73
73
  "optionalDependencies": {
74
- "conductor-oss-native-darwin-universal": "0.18.0",
75
- "conductor-oss-native-linux-x64": "0.18.0",
76
- "conductor-oss-native-win32-x64": "0.18.0"
74
+ "conductor-oss-native-darwin-universal": "0.18.2",
75
+ "conductor-oss-native-linux-x64": "0.18.2",
76
+ "conductor-oss-native-win32-x64": "0.18.2"
77
77
  },
78
78
  "files": [
79
79
  "dist/",
@@ -1 +1 @@
1
- Veae3TCGcp6JvqCrg2JY3
1
+ FHjp9qazH2xWUCRt6mqg4
@@ -7,8 +7,8 @@
7
7
  "static/chunks/a6dad97d9634a72d.js"
8
8
  ],
9
9
  "lowPriorityFiles": [
10
- "static/Veae3TCGcp6JvqCrg2JY3/_ssgManifest.js",
11
- "static/Veae3TCGcp6JvqCrg2JY3/_buildManifest.js"
10
+ "static/FHjp9qazH2xWUCRt6mqg4/_ssgManifest.js",
11
+ "static/FHjp9qazH2xWUCRt6mqg4/_buildManifest.js"
12
12
  ],
13
13
  "rootMainFiles": [
14
14
  "static/chunks/723acbe92d3f9e7e.js",
@@ -83,8 +83,8 @@
83
83
  "dynamicRoutes": {},
84
84
  "notFoundRoutes": [],
85
85
  "preview": {
86
- "previewModeId": "17a17691d8d78a7c7f92347b497e4a2b",
87
- "previewModeSigningKey": "97b2bece67aed868ba7706ea9af76dab11906cb7a5ef21375cd172af13131755",
88
- "previewModeEncryptionKey": "9159bfdb987c8fab42c6df47a8a8032d9a62990966ae27ff09f1a067bde16734"
86
+ "previewModeId": "cd843150be9c66c1676a4916a107fdf2",
87
+ "previewModeSigningKey": "c4a90eb970448dc4eec39fdde6f67807f5de2d72ab66df65b456b17c53cc3f8e",
88
+ "previewModeEncryptionKey": "f144929a66edbb09da9d721e2a0b898aa227b0d367715d44558e68071ac91f50"
89
89
  }
90
90
  }
@@ -1,2 +1,2 @@
1
- <!DOCTYPE html><!--Veae3TCGcp6JvqCrg2JY3--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/723acbe92d3f9e7e.js"/><script src="/_next/static/chunks/81e3cea43881b17d.js" async=""></script><script src="/_next/static/chunks/fadfecf0d2ea625f.js" async=""></script><script src="/_next/static/chunks/640c112d1b9a4643.js" async=""></script><script src="/_next/static/chunks/3770166bed1577ce.js" async=""></script><script src="/_next/static/chunks/turbopack-9809b4096e86149a.js" async=""></script><script src="/_next/static/chunks/3350ec1a9ca0dab5.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
- @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/723acbe92d3f9e7e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"ViewportBoundary\"]\n9:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"MetadataBoundary\"]\nb:I[68027,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Veae3TCGcp6JvqCrg2JY3\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/3350ec1a9ca0dab5.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><!--FHjp9qazH2xWUCRt6mqg4--><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/723acbe92d3f9e7e.js"/><script src="/_next/static/chunks/81e3cea43881b17d.js" async=""></script><script src="/_next/static/chunks/fadfecf0d2ea625f.js" async=""></script><script src="/_next/static/chunks/640c112d1b9a4643.js" async=""></script><script src="/_next/static/chunks/3770166bed1577ce.js" async=""></script><script src="/_next/static/chunks/turbopack-9809b4096e86149a.js" async=""></script><script src="/_next/static/chunks/3350ec1a9ca0dab5.js" async=""></script><meta name="next-size-adjust" content=""/><title>500: Internal Server Error.</title><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
2
+ @media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/723acbe92d3f9e7e.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[39756,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n3:I[37457,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n4:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n7:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"ViewportBoundary\"]\n9:I[97367,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"MetadataBoundary\"]\nb:I[68027,[\"/_next/static/chunks/3350ec1a9ca0dab5.js\"],\"default\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"FHjp9qazH2xWUCRt6mqg4\",\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"__PAGE__\",{}]}],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[\"$\",\"title\",null,{\"children\":\"500: Internal Server Error.\"}]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"lineHeight\":\"48px\"},\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}\\n@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"paddingRight\":23,\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\"},\"children\":\"500\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"28px\"},\"children\":\"Internal Server Error.\"}]}]]}]}]}]]}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/3350ec1a9ca0dab5.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L7\",null,{\"children\":\"$L8\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$La\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$b\",\"$undefined\"],\"S\":true}\n"])</script><script>self.__next_f.push([1,"8:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"6:null\na:[]\n"])</script></body></html>