@jx0/agency 0.2.0
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.
- package/README.md +272 -0
- package/bin/agency.js +2 -0
- package/dashboard/out/404.html +1 -0
- package/dashboard/out/_next/static/chunks/255-67e8754147461423.js +1 -0
- package/dashboard/out/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +1 -0
- package/dashboard/out/_next/static/chunks/app/_not-found/page-ad40673d821037f6.js +1 -0
- package/dashboard/out/_next/static/chunks/app/layout-056f12675e691d12.js +1 -0
- package/dashboard/out/_next/static/chunks/app/page-80f01fdbb09b43c8.js +1 -0
- package/dashboard/out/_next/static/chunks/framework-de98b93a850cfc71.js +1 -0
- package/dashboard/out/_next/static/chunks/main-1a0dcce460eb61ce.js +1 -0
- package/dashboard/out/_next/static/chunks/main-app-1d848b791b823fa6.js +1 -0
- package/dashboard/out/_next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
- package/dashboard/out/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
- package/dashboard/out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dashboard/out/_next/static/chunks/webpack-4e6bf084ac60582b.js +1 -0
- package/dashboard/out/_next/static/css/27d1ea794f04e96a.css +1 -0
- package/dashboard/out/_next/static/pU1nwWH_dNUOCI8y4nl3C/_buildManifest.js +1 -0
- package/dashboard/out/_next/static/pU1nwWH_dNUOCI8y4nl3C/_ssgManifest.js +1 -0
- package/dashboard/out/index.html +1 -0
- package/dashboard/out/index.txt +19 -0
- package/docs/images/agency_cli_ps.png +0 -0
- package/docs/images/agency_ui_ai_prodivder_settings.png +0 -0
- package/docs/images/agency_ui_aws_settings.png +0 -0
- package/docs/images/agency_ui_identity_settings.png +0 -0
- package/docs/images/agency_ui_mission_control.png +0 -0
- package/docs/images/agent_ui_agent_config.png +0 -0
- package/package.json +31 -0
- package/src/api/db/client.ts +16 -0
- package/src/api/db/migrate.ts +37 -0
- package/src/api/db/migrations/001_initial.ts +193 -0
- package/src/api/db/migrations/002_configs.ts +76 -0
- package/src/api/db/migrations/003_settings_columns.ts +13 -0
- package/src/api/db/seed.ts +142 -0
- package/src/api/db/types.ts +126 -0
- package/src/api/index.ts +73 -0
- package/src/api/lib/activity.ts +13 -0
- package/src/api/lib/fleet-sync.ts +156 -0
- package/src/api/lib/mentions.ts +59 -0
- package/src/api/lib/processes.ts +45 -0
- package/src/api/lib/resolve-agent.ts +5 -0
- package/src/api/lib/tunnels.ts +99 -0
- package/src/api/routes/activities.ts +27 -0
- package/src/api/routes/agents.ts +311 -0
- package/src/api/routes/documents.ts +41 -0
- package/src/api/routes/knowledge.ts +60 -0
- package/src/api/routes/messages.ts +54 -0
- package/src/api/routes/notifications.ts +40 -0
- package/src/api/routes/oauth.ts +171 -0
- package/src/api/routes/role-configs.ts +71 -0
- package/src/api/routes/settings.ts +94 -0
- package/src/api/routes/skills.ts +76 -0
- package/src/api/routes/tasks.ts +154 -0
- package/src/cli/commands/config.ts +42 -0
- package/src/cli/commands/daemon.ts +173 -0
- package/src/cli/commands/doc.ts +47 -0
- package/src/cli/commands/init.ts +105 -0
- package/src/cli/commands/learn.ts +51 -0
- package/src/cli/commands/logs.ts +31 -0
- package/src/cli/commands/msg.ts +18 -0
- package/src/cli/commands/ps.ts +19 -0
- package/src/cli/commands/recall.ts +18 -0
- package/src/cli/commands/skills.ts +66 -0
- package/src/cli/commands/ssh.ts +68 -0
- package/src/cli/commands/start.ts +14 -0
- package/src/cli/commands/status.ts +33 -0
- package/src/cli/commands/stop.ts +11 -0
- package/src/cli/commands/tasks.ts +150 -0
- package/src/cli/index.ts +70 -0
- package/src/cli/lib/api.ts +16 -0
- package/src/cli/lib/config.ts +5 -0
- package/src/cli/lib/find-root.ts +32 -0
- package/src/cli/lib/prompt.ts +20 -0
- package/src/daemon.ts +83 -0
- package/src/templates/implementer/agents-config.md +44 -0
- package/src/templates/implementer/agents.md +32 -0
- package/src/templates/implementer/heartbeat.md +47 -0
- package/src/templates/implementer/tools.md +33 -0
- package/src/templates/orchestrator/agents-config.md +44 -0
- package/src/templates/orchestrator/agents.md +27 -0
- package/src/templates/orchestrator/heartbeat.md +40 -0
- package/src/templates/orchestrator/tools.md +40 -0
- package/src/templates/shared/environment.md +20 -0
- package/src/templates/shared/memory.md +20 -0
- package/src/templates/shared/soul.md +26 -0
- package/src/templates/shared/user.md +12 -0
package/README.md
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
# Agency — Multi-Agent AI Development Platform
|
|
2
|
+
|
|
3
|
+
A scalable orchestrator + worker architecture for autonomous AI software development. Built on top of [OpenClaw](https://openclaw.ai/) ([GitHub](https://github.com/openclaw/openclaw)) — each deployed agent is an OpenClaw instance with full shell access, file I/O, and browser control. Agency adds the coordination layer: task assignment, inter-agent messaging, role-based configuration, and a dashboard to manage it all.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
┌──────────────┐
|
|
7
|
+
│ Human │
|
|
8
|
+
│ (dashboard) │
|
|
9
|
+
└──────┬───────┘
|
|
10
|
+
│
|
|
11
|
+
▼
|
|
12
|
+
┌───────────────────────┐
|
|
13
|
+
│ Orchestrator │
|
|
14
|
+
│ (OpenClaw agent) │
|
|
15
|
+
│ │
|
|
16
|
+
│ Investigates → Plans │
|
|
17
|
+
│ Creates tasks → Delegates
|
|
18
|
+
└───────────┬───────────┘
|
|
19
|
+
│ Tasks (via API)
|
|
20
|
+
┌───────────┼───────────┐
|
|
21
|
+
▼ ▼ ▼
|
|
22
|
+
┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
23
|
+
│ Worker A │ │ Worker B │ │ Worker C │
|
|
24
|
+
│ (OpenClaw)│ │(OpenClaw)│ │(OpenClaw)│
|
|
25
|
+
│ │ │ │ │ │
|
|
26
|
+
│ Claims → │ │ │ │ │
|
|
27
|
+
│ Codes → │ │ ... │ │ ... │
|
|
28
|
+
│ Ships │ │ │ │ │
|
|
29
|
+
└──────────┘ └──────────┘ └──────────┘
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+

|
|
33
|
+
|
|
34
|
+
## Install
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# From npm
|
|
38
|
+
bun install -g @jx0/agency
|
|
39
|
+
|
|
40
|
+
# Or from source (always uses repo version)
|
|
41
|
+
git clone https://github.com/jx0/agency.git
|
|
42
|
+
cd agency
|
|
43
|
+
bun install
|
|
44
|
+
bun link
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Quick Start
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
# Initialize a new project
|
|
51
|
+
agency init
|
|
52
|
+
|
|
53
|
+
# This creates .agency/ in your current directory, runs migrations,
|
|
54
|
+
# seeds default settings and role configs, and optionally starts the daemon.
|
|
55
|
+
|
|
56
|
+
# Start the daemon manually if you skipped it during init
|
|
57
|
+
agency daemon install
|
|
58
|
+
agency daemon start
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Dashboard and API both served at `http://localhost:3100`.
|
|
62
|
+
|
|
63
|
+
## Stack
|
|
64
|
+
|
|
65
|
+
| Component | Tech | Port |
|
|
66
|
+
|-----------|------|------|
|
|
67
|
+
| **API + Dashboard** | Hono + Kysely + SQLite (Bun) + Next.js static export | 3100 |
|
|
68
|
+
| **CLI** | TypeScript (Bun) | — |
|
|
69
|
+
|
|
70
|
+
## `.agency/` Directory
|
|
71
|
+
|
|
72
|
+
Created by `agency init`. This is the only directory Agency writes to in your project:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
.agency/
|
|
76
|
+
├── agency.db # SQLite database (all state)
|
|
77
|
+
└── fleet.json # Agent fleet config
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Everything else — settings, skills, role configs — lives in the database, editable via the dashboard or CLI.
|
|
81
|
+
|
|
82
|
+
## CLI Reference
|
|
83
|
+
|
|
84
|
+

|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
agency init Set up .agency/ in current directory
|
|
88
|
+
agency ps List agents
|
|
89
|
+
agency start <name> Start an agent
|
|
90
|
+
agency stop <name> Stop an agent
|
|
91
|
+
agency logs <name> Tail agent logs
|
|
92
|
+
agency ssh <name> SSH into agent (EC2 only)
|
|
93
|
+
agency tasks create <title> [flags] Create a task
|
|
94
|
+
agency tasks list [--status S] List tasks
|
|
95
|
+
agency tasks ready Show your assigned tasks
|
|
96
|
+
agency tasks show <id> Show task details
|
|
97
|
+
agency tasks update <id> [flags] Update a task
|
|
98
|
+
agency tasks close <id> Close a task
|
|
99
|
+
agency msg <task-id> <message> Post a task comment
|
|
100
|
+
agency learn <content> [--tags t,t] Store knowledge
|
|
101
|
+
agency recall <search> Search knowledge
|
|
102
|
+
agency doc create <title> [flags] Create a document (stdin)
|
|
103
|
+
agency doc show <id> Show a document
|
|
104
|
+
agency daemon install Install as system service
|
|
105
|
+
agency daemon uninstall Remove system service
|
|
106
|
+
agency daemon start Start the daemon
|
|
107
|
+
agency daemon stop Stop the daemon
|
|
108
|
+
agency daemon status Check daemon status
|
|
109
|
+
agency daemon logs Tail daemon logs
|
|
110
|
+
agency daemon run Run daemon in foreground
|
|
111
|
+
agency status [agent-name] Health check
|
|
112
|
+
agency config List all settings
|
|
113
|
+
agency config <key> Show a setting
|
|
114
|
+
agency config <key> <value> Set a setting
|
|
115
|
+
agency skills list List skills
|
|
116
|
+
agency skills show <id> Show a skill
|
|
117
|
+
agency skills create <name> Create a skill (stdin)
|
|
118
|
+
agency skills delete <id> Delete a skill
|
|
119
|
+
agency --version Show version
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## API Endpoints
|
|
123
|
+
|
|
124
|
+
| Method | Route | Description |
|
|
125
|
+
|--------|-------|-------------|
|
|
126
|
+
| GET | `/health` | Health check |
|
|
127
|
+
| GET/POST | `/agents` | List/create agents |
|
|
128
|
+
| GET/PATCH/DELETE | `/agents/:name` | Agent CRUD |
|
|
129
|
+
| POST | `/agents/:name/deploy` | Start an agent |
|
|
130
|
+
| POST | `/agents/:name/stop` | Stop an agent |
|
|
131
|
+
| GET | `/agents/:name/config/:type` | Get agent's role config |
|
|
132
|
+
| GET/POST | `/tasks` | List/create tasks |
|
|
133
|
+
| GET/PATCH | `/tasks/:id` | Task details/update |
|
|
134
|
+
| POST | `/tasks/:id/assign` | Assign agent |
|
|
135
|
+
| GET/POST | `/tasks/:id/messages` | Task comments |
|
|
136
|
+
| GET | `/activities` | Activity feed |
|
|
137
|
+
| GET | `/notifications/pending/:agent` | Pending notifications |
|
|
138
|
+
| GET/POST | `/knowledge` | Knowledge base |
|
|
139
|
+
| GET/POST | `/documents` | Documents |
|
|
140
|
+
| GET/PUT/DELETE | `/settings` | Settings (key-value) |
|
|
141
|
+
| GET/POST/PUT/DELETE | `/skills` | Skills (markdown docs) |
|
|
142
|
+
| GET/PUT/DELETE | `/role-configs/:role/:type` | Role configuration docs |
|
|
143
|
+
|
|
144
|
+
## Database Schema
|
|
145
|
+
|
|
146
|
+
All state lives in `.agency/agency.db` (SQLite):
|
|
147
|
+
|
|
148
|
+
- **agents** — Name, role, status, location, tokens
|
|
149
|
+
- **tasks** — Title, description, design, acceptance, priority, status, parent
|
|
150
|
+
- **task_assignees** — Agent-to-task assignments
|
|
151
|
+
- **messages** — Task comments
|
|
152
|
+
- **activities** — Event log
|
|
153
|
+
- **notifications** — Delivery queue
|
|
154
|
+
- **documents** — Task-linked documents
|
|
155
|
+
- **knowledge** — Tagged knowledge base
|
|
156
|
+
- **settings** — Key-value config (grouped by category)
|
|
157
|
+
- **skills** — Markdown skill documents
|
|
158
|
+
- **role_configs** — Role configuration documents (heartbeat, tools, agents, etc.)
|
|
159
|
+
|
|
160
|
+
## Dashboard
|
|
161
|
+
|
|
162
|
+
Five views accessible from the top nav:
|
|
163
|
+
|
|
164
|
+
- **Mission Control** — Agent roster + task kanban board + live activity feed
|
|
165
|
+
- **Agent Config** — Browse agent workspace files (served from role_configs in DB)
|
|
166
|
+
- **Settings** — Categorized editor for Identity, AI Provider, AWS, and SSH configuration
|
|
167
|
+
- **Skills** — Markdown editor for team skills
|
|
168
|
+
- **Roles** — Markdown editor for role configs (Heartbeat, Tools, Agents, etc.)
|
|
169
|
+
|
|
170
|
+

|
|
171
|
+
|
|
172
|
+
### Settings
|
|
173
|
+
|
|
174
|
+
Sensitive values (API keys, SSH keys, credentials) are masked in the API and revealed on demand in the UI. AI provider settings support both direct API key entry and Claude Max OAuth (import tokens from Claude Code with one click).
|
|
175
|
+
|
|
176
|
+
| | |
|
|
177
|
+
|---|---|
|
|
178
|
+
|  |  |
|
|
179
|
+
|  | |
|
|
180
|
+
|
|
181
|
+
## How It Works
|
|
182
|
+
|
|
183
|
+
### Agents
|
|
184
|
+
|
|
185
|
+
Every agent in Agency is an [OpenClaw](https://openclaw.ai/) instance. OpenClaw provides the core capabilities — shell access, file I/O, browser control, persistent memory, and multi-model support. Agency layers on top of that with:
|
|
186
|
+
|
|
187
|
+
- **Role configs** — each agent gets injected with role-specific prompts (Soul, Identity, Tools, Agents, Heartbeat) that define its behavior
|
|
188
|
+
- **Task coordination** — agents poll the Agency API for assigned work, post progress via task comments, and transition tasks through the workflow
|
|
189
|
+
- **Fleet management** — deploy agents locally (Bun subprocess), via Docker, or on EC2 with automatic SSH tunnels
|
|
190
|
+
|
|
191
|
+
Agents can run any model OpenClaw supports (Claude, GPT, local models), configured through the AI Provider settings.
|
|
192
|
+
|
|
193
|
+
### Deployment Modes
|
|
194
|
+
|
|
195
|
+
| Mode | How it works |
|
|
196
|
+
|------|-------------|
|
|
197
|
+
| **Local** | Spawns a Bun subprocess on the host machine. Agent talks to API at `localhost:3100` directly. |
|
|
198
|
+
| **Docker** | Runs `docker compose up` for the agent container. |
|
|
199
|
+
| **EC2** | Opens a reverse SSH tunnel from the remote instance back to the host, so the agent's `agency` CLI hits `localhost:3100` on the remote machine which tunnels back to the host API. |
|
|
200
|
+
|
|
201
|
+
#### EC2 Agent Setup
|
|
202
|
+
|
|
203
|
+
1. Configure SSH in Settings → SSH (paste your private key, set the username)
|
|
204
|
+
2. Add `host` to the agent's entry in `.agency/fleet.json`:
|
|
205
|
+
|
|
206
|
+
```json
|
|
207
|
+
{
|
|
208
|
+
"agents": {
|
|
209
|
+
"nova": { "role": "implementer", "location": "ec2", "host": "54.123.45.67" }
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
3. Click **Deploy** in the dashboard (or `agency start nova`)
|
|
215
|
+
|
|
216
|
+
The daemon opens `ssh -R 3100:localhost:3100 user@host -N` — a persistent reverse tunnel with auto-reconnect. The remote agent's CLI commands (`agency tasks list`, `agency msg`, etc.) hit `localhost:3100` which forwards through the tunnel to the host API. No agent-side configuration needed.
|
|
217
|
+
|
|
218
|
+
On stop, the tunnel is torn down. On daemon shutdown, all tunnels are cleaned up.
|
|
219
|
+
|
|
220
|
+
You can also SSH directly into any EC2 agent:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
agency ssh nova # interactive shell
|
|
224
|
+
agency ssh nova ls -la # run a command
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Task Lifecycle
|
|
228
|
+
|
|
229
|
+
```
|
|
230
|
+
inbox → assigned → in_progress → review → done
|
|
231
|
+
│
|
|
232
|
+
▼
|
|
233
|
+
needs_input
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
1. Human or orchestrator creates a task
|
|
237
|
+
2. Task is assigned to a worker agent
|
|
238
|
+
3. Worker picks it up, does the work
|
|
239
|
+
4. Worker moves to review
|
|
240
|
+
5. Orchestrator/human reviews and closes
|
|
241
|
+
|
|
242
|
+
### Knowledge Sharing
|
|
243
|
+
|
|
244
|
+
Agents build collective knowledge through the CLI and API:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
agency learn "postgres migrations need --lock-timeout 5s" --tags postgres,migrations
|
|
248
|
+
agency recall "postgres migrations"
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Development
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# From repo root
|
|
255
|
+
bun install
|
|
256
|
+
|
|
257
|
+
# Run everything (API + dashboard)
|
|
258
|
+
bun run dev
|
|
259
|
+
|
|
260
|
+
# Or run just the API
|
|
261
|
+
DATABASE_PATH=.agency/agency.db bun run src/api/index.ts
|
|
262
|
+
|
|
263
|
+
# Run migrations
|
|
264
|
+
DATABASE_PATH=.agency/agency.db bun run src/api/db/migrate.ts
|
|
265
|
+
|
|
266
|
+
# Build dashboard for production
|
|
267
|
+
bun run build
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## License
|
|
271
|
+
|
|
272
|
+
MIT
|
package/bin/agency.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!DOCTYPE html><!--pU1nwWH_dNUOCI8y4nl3C--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/27d1ea794f04e96a.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-4e6bf084ac60582b.js"/><script src="/_next/static/chunks/4bd1b696-c023c6e3521b1417.js" async=""></script><script src="/_next/static/chunks/255-67e8754147461423.js" async=""></script><script src="/_next/static/chunks/main-app-1d848b791b823fa6.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Mission Control</title><meta name="description" content="Agency AI Dashboard"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="min-h-screen"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@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:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-4e6bf084ac60582b.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[9766,[],\"\"]\n3:I[8924,[],\"\"]\n4:I[4431,[],\"OutletBoundary\"]\n6:I[5278,[],\"AsyncMetadataOutlet\"]\n8:I[4431,[],\"ViewportBoundary\"]\na:I[4431,[],\"MetadataBoundary\"]\nb:\"$Sreact.suspense\"\nd:I[7150,[],\"\"]\n:HL[\"/_next/static/css/27d1ea794f04e96a.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"pU1nwWH_dNUOCI8y4nl3C\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/27d1ea794f04e96a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"min-h-screen\",\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$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\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"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,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@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\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L4\",null,{\"children\":[\"$L5\",[\"$\",\"$L6\",null,{\"promise\":\"$@7\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],null],[\"$\",\"$La\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$b\",null,{\"fallback\":null,\"children\":\"$Lc\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n5:null\n"])</script><script>self.__next_f.push([1,"7:{\"metadata\":[[\"$\",\"title\",\"0\",{\"children\":\"Mission Control\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Agency AI Dashboard\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"c:\"$7:metadata\"\n"])</script></body></html>
|