@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.
Files changed (85) hide show
  1. package/README.md +272 -0
  2. package/bin/agency.js +2 -0
  3. package/dashboard/out/404.html +1 -0
  4. package/dashboard/out/_next/static/chunks/255-67e8754147461423.js +1 -0
  5. package/dashboard/out/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +1 -0
  6. package/dashboard/out/_next/static/chunks/app/_not-found/page-ad40673d821037f6.js +1 -0
  7. package/dashboard/out/_next/static/chunks/app/layout-056f12675e691d12.js +1 -0
  8. package/dashboard/out/_next/static/chunks/app/page-80f01fdbb09b43c8.js +1 -0
  9. package/dashboard/out/_next/static/chunks/framework-de98b93a850cfc71.js +1 -0
  10. package/dashboard/out/_next/static/chunks/main-1a0dcce460eb61ce.js +1 -0
  11. package/dashboard/out/_next/static/chunks/main-app-1d848b791b823fa6.js +1 -0
  12. package/dashboard/out/_next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
  13. package/dashboard/out/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
  14. package/dashboard/out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  15. package/dashboard/out/_next/static/chunks/webpack-4e6bf084ac60582b.js +1 -0
  16. package/dashboard/out/_next/static/css/27d1ea794f04e96a.css +1 -0
  17. package/dashboard/out/_next/static/pU1nwWH_dNUOCI8y4nl3C/_buildManifest.js +1 -0
  18. package/dashboard/out/_next/static/pU1nwWH_dNUOCI8y4nl3C/_ssgManifest.js +1 -0
  19. package/dashboard/out/index.html +1 -0
  20. package/dashboard/out/index.txt +19 -0
  21. package/docs/images/agency_cli_ps.png +0 -0
  22. package/docs/images/agency_ui_ai_prodivder_settings.png +0 -0
  23. package/docs/images/agency_ui_aws_settings.png +0 -0
  24. package/docs/images/agency_ui_identity_settings.png +0 -0
  25. package/docs/images/agency_ui_mission_control.png +0 -0
  26. package/docs/images/agent_ui_agent_config.png +0 -0
  27. package/package.json +31 -0
  28. package/src/api/db/client.ts +16 -0
  29. package/src/api/db/migrate.ts +37 -0
  30. package/src/api/db/migrations/001_initial.ts +193 -0
  31. package/src/api/db/migrations/002_configs.ts +76 -0
  32. package/src/api/db/migrations/003_settings_columns.ts +13 -0
  33. package/src/api/db/seed.ts +142 -0
  34. package/src/api/db/types.ts +126 -0
  35. package/src/api/index.ts +73 -0
  36. package/src/api/lib/activity.ts +13 -0
  37. package/src/api/lib/fleet-sync.ts +156 -0
  38. package/src/api/lib/mentions.ts +59 -0
  39. package/src/api/lib/processes.ts +45 -0
  40. package/src/api/lib/resolve-agent.ts +5 -0
  41. package/src/api/lib/tunnels.ts +99 -0
  42. package/src/api/routes/activities.ts +27 -0
  43. package/src/api/routes/agents.ts +311 -0
  44. package/src/api/routes/documents.ts +41 -0
  45. package/src/api/routes/knowledge.ts +60 -0
  46. package/src/api/routes/messages.ts +54 -0
  47. package/src/api/routes/notifications.ts +40 -0
  48. package/src/api/routes/oauth.ts +171 -0
  49. package/src/api/routes/role-configs.ts +71 -0
  50. package/src/api/routes/settings.ts +94 -0
  51. package/src/api/routes/skills.ts +76 -0
  52. package/src/api/routes/tasks.ts +154 -0
  53. package/src/cli/commands/config.ts +42 -0
  54. package/src/cli/commands/daemon.ts +173 -0
  55. package/src/cli/commands/doc.ts +47 -0
  56. package/src/cli/commands/init.ts +105 -0
  57. package/src/cli/commands/learn.ts +51 -0
  58. package/src/cli/commands/logs.ts +31 -0
  59. package/src/cli/commands/msg.ts +18 -0
  60. package/src/cli/commands/ps.ts +19 -0
  61. package/src/cli/commands/recall.ts +18 -0
  62. package/src/cli/commands/skills.ts +66 -0
  63. package/src/cli/commands/ssh.ts +68 -0
  64. package/src/cli/commands/start.ts +14 -0
  65. package/src/cli/commands/status.ts +33 -0
  66. package/src/cli/commands/stop.ts +11 -0
  67. package/src/cli/commands/tasks.ts +150 -0
  68. package/src/cli/index.ts +70 -0
  69. package/src/cli/lib/api.ts +16 -0
  70. package/src/cli/lib/config.ts +5 -0
  71. package/src/cli/lib/find-root.ts +32 -0
  72. package/src/cli/lib/prompt.ts +20 -0
  73. package/src/daemon.ts +83 -0
  74. package/src/templates/implementer/agents-config.md +44 -0
  75. package/src/templates/implementer/agents.md +32 -0
  76. package/src/templates/implementer/heartbeat.md +47 -0
  77. package/src/templates/implementer/tools.md +33 -0
  78. package/src/templates/orchestrator/agents-config.md +44 -0
  79. package/src/templates/orchestrator/agents.md +27 -0
  80. package/src/templates/orchestrator/heartbeat.md +40 -0
  81. package/src/templates/orchestrator/tools.md +40 -0
  82. package/src/templates/shared/environment.md +20 -0
  83. package/src/templates/shared/memory.md +20 -0
  84. package/src/templates/shared/soul.md +26 -0
  85. 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
+ ![Mission Control](docs/images/agency_ui_mission_control.png)
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
+ ![agency ps](docs/images/agency_cli_ps.png)
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
+ ![Agent Config](docs/images/agent_ui_agent_config.png)
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
+ | ![Identity](docs/images/agency_ui_identity_settings.png) | ![AI Provider](docs/images/agency_ui_ai_prodivder_settings.png) |
179
+ | ![AWS](docs/images/agency_ui_aws_settings.png) | |
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,2 @@
1
+ #!/usr/bin/env bun
2
+ import("../src/cli/index.ts");
@@ -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,&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>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>