froggo-mission-control 1.2.1 → 1.2.3
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 +85 -32
- package/next.config.js +2 -2
- package/package.json +4 -4
- package/scripts/postinstall.js +15 -1
- package/src/components/OnboardingWizard.tsx +3 -3
package/README.md
CHANGED
|
@@ -11,14 +11,16 @@
|
|
|
11
11
|
|
|
12
12
|
Mission Control is your personal AI operations center. It ships with:
|
|
13
13
|
|
|
14
|
-
- **15 agents** — Hire from the catalog: Inbox, Coder, Designer, Researcher, Clara (QA), Chief, HR, Writer, Social Manager, Finance, Growth Director, Discord Manager, Voice,
|
|
15
|
-
- **
|
|
14
|
+
- **15 agents** — Hire from the catalog: Inbox, Coder, Senior Coder, Designer, Researcher, Clara (QA), Chief, HR, Writer, Social Manager, Finance, Growth Director, Discord Manager, Voice, and the Mission Control orchestrator
|
|
15
|
+
- **Modular dashboard** — Install what you need: Kanban, Analytics, Approvals, Chat Rooms, Schedule, Gmail Inbox, Finance, Library, Projects, Voice, Writing, Meetings, and more
|
|
16
|
+
- **Task pipeline** — Full lifecycle: `todo → internal-review → in-progress → agent-review → done`, with Clara QA gates before work starts and after it completes
|
|
17
|
+
- **Projects** — Kanban boards, agent dispatch, shared chat rooms, file library — all linked
|
|
18
|
+
- **Memory vault** — Obsidian-compatible knowledge base that agents read/write across sessions, pre-seeded with platform documentation
|
|
16
19
|
- **Comms Inbox** — Gmail integration with AI-powered triage (Smart Inbox)
|
|
17
|
-
- **Google Calendar** — Today's schedule widget and full
|
|
18
|
-
- **Task system** — Full lifecycle: todo → internal-review → in-progress → review → human-review → done, with agent auto-dispatch and Clara QA gate
|
|
19
|
-
- **Projects** — Kanban boards, agent dispatch, shared chat rooms, file library
|
|
20
|
-
- **Memory vault** — Obsidian-compatible knowledge base that agents read/write across sessions
|
|
20
|
+
- **Google Calendar** — Today's schedule widget and full calendar view
|
|
21
21
|
- **Voice** — Real-time voice interface via Gemini Live
|
|
22
|
+
- **Agent trust tiers** — Mission Control runs with full trust; Clara and HR as workers; all others as apprentices with scoped permissions
|
|
23
|
+
- **OS keychain** — API keys stored securely in the system keychain (macOS Keychain / Linux Secret Service), never in plaintext
|
|
22
24
|
- **MCP servers** — Native Claude Code CLI integration for task management, memory search, and scheduling
|
|
23
25
|
|
|
24
26
|
---
|
|
@@ -29,14 +31,14 @@ Mission Control is your personal AI operations center. It ships with:
|
|
|
29
31
|
|---|---|---|
|
|
30
32
|
| **Node.js** | 20+ | [nodejs.org](https://nodejs.org) |
|
|
31
33
|
| **Claude Code CLI** | Latest | [install guide](https://docs.anthropic.com/claude-code) — requires active Claude subscription |
|
|
34
|
+
| **Obsidian** | Latest | Auto-installed via `brew install --cask obsidian`. Required for memory vault. |
|
|
32
35
|
| **Git** | Any | For cloning + updates |
|
|
33
36
|
| **macOS** or **Linux** | — | Windows not tested |
|
|
34
37
|
|
|
35
38
|
**Optional:**
|
|
36
39
|
- **Gemini API key** — Required for Voice. Free at [aistudio.google.com](https://aistudio.google.com/app/apikey)
|
|
37
40
|
- **Google Workspace** — Gmail + Calendar integration (OAuth setup in the app wizard)
|
|
38
|
-
- **QMD** — Hybrid BM25/vector memory search
|
|
39
|
-
- **Obsidian** — For browsing the memory vault (any vault reader works)
|
|
41
|
+
- **QMD** — Hybrid BM25/vector memory search. Auto-installed via `brew install profroggo/tap/qmd`. Falls back to ripgrep automatically if not installed.
|
|
40
42
|
|
|
41
43
|
---
|
|
42
44
|
|
|
@@ -45,27 +47,30 @@ Mission Control is your personal AI operations center. It ships with:
|
|
|
45
47
|
### Option A — npm (recommended)
|
|
46
48
|
|
|
47
49
|
```bash
|
|
48
|
-
# Step 1 — install the package (
|
|
50
|
+
# Step 1 — install the package (3–5 min, fully automatic)
|
|
49
51
|
npm install -g froggo-mission-control
|
|
50
52
|
|
|
51
|
-
# Step 2 — run first-time setup (
|
|
53
|
+
# Step 2 — run first-time setup (~1 min)
|
|
52
54
|
mission-control
|
|
53
55
|
```
|
|
54
56
|
|
|
55
57
|
**What `npm install -g` does automatically:**
|
|
56
58
|
- Downloads the package and all dependencies
|
|
57
59
|
- Compiles the 3 MCP servers (`mission-control-db-mcp`, `memory-mcp`, `cron-mcp`)
|
|
60
|
+
- Installs QMD memory search and Obsidian (via Homebrew on macOS)
|
|
58
61
|
- Runs `next build` — full production build of the dashboard
|
|
59
62
|
|
|
60
63
|
**What `mission-control` (first run) does automatically:**
|
|
61
64
|
1. Checks prerequisites — Node.js 20+, Claude Code CLI
|
|
62
|
-
2. Creates the `~/mission-control/` directory tree
|
|
63
|
-
3.
|
|
64
|
-
4.
|
|
65
|
-
5.
|
|
66
|
-
6.
|
|
67
|
-
7.
|
|
68
|
-
8.
|
|
65
|
+
2. Creates the full `~/mission-control/` directory tree (agents, data, library, memory, logs)
|
|
66
|
+
3. Scaffolds the complete library structure with all output folders
|
|
67
|
+
4. Bootstraps 4 core agent workspaces from catalog templates (mission-control, clara, coder, writer)
|
|
68
|
+
5. Pre-seeds `~/mission-control/memory/knowledge/` with 6 platform documentation articles
|
|
69
|
+
6. Generates `CLAUDE.md`, `.claude/settings.json`, and `.mcp.json` in `~/mission-control/`
|
|
70
|
+
7. Creates data files (`schedule.json`, `google-tokens.json`)
|
|
71
|
+
8. Writes `.env`
|
|
72
|
+
9. Installs a **LaunchAgent** (macOS) or **two systemd services** (Linux) — app + cron daemon
|
|
73
|
+
10. Starts the server and opens your browser to `http://localhost:3000/setup`
|
|
69
74
|
|
|
70
75
|
No interactive prompts. No API keys in the terminal. Everything continues in the browser.
|
|
71
76
|
|
|
@@ -83,12 +88,14 @@ cd froggo-Mission-Control
|
|
|
83
88
|
- Checks prerequisites (Node.js 20+, Claude Code CLI, Git)
|
|
84
89
|
- Installs all npm dependencies
|
|
85
90
|
- Compiles the 3 MCP servers
|
|
91
|
+
- Installs QMD and Obsidian
|
|
86
92
|
- Builds the Next.js dashboard (`next build`)
|
|
87
|
-
- Creates the full `~/mission-control/` directory tree
|
|
93
|
+
- Creates the full `~/mission-control/` directory tree and library structure
|
|
88
94
|
- Bootstraps core agent workspaces from catalog templates
|
|
95
|
+
- Pre-seeds the knowledge base
|
|
89
96
|
- Generates `.env`, `.mcp.json`, and `.claude/settings.json` configured for your machine
|
|
90
97
|
- Sets up an Obsidian-compatible memory vault skeleton
|
|
91
|
-
- Installs a **LaunchAgent** (macOS) or **systemd
|
|
98
|
+
- Installs a **LaunchAgent** (macOS) or **systemd services** (Linux) — persistent, auto-start at login, auto-restart on crash
|
|
92
99
|
- Opens `http://localhost:3000/setup` in your browser
|
|
93
100
|
|
|
94
101
|
---
|
|
@@ -98,11 +105,11 @@ cd froggo-Mission-Control
|
|
|
98
105
|
After the CLI opens your browser, the wizard walks you through 10 steps:
|
|
99
106
|
|
|
100
107
|
1. **Welcome** — what Mission Control does and what you're about to set up
|
|
101
|
-
2. **System Check** — verifies CLI, database, MCP servers, and agent files are ready
|
|
108
|
+
2. **System Check** — verifies CLI, database, MCP servers, and agent files are ready
|
|
102
109
|
3. **Agent Permissions** — review the tool permissions agents need; confirm to unlock autonomous operation
|
|
103
110
|
4. **Gemini API Key** — paste and validate (skippable — voice features won't work without it)
|
|
104
111
|
5. **Google Workspace** — connect Gmail and Calendar via OAuth (skippable)
|
|
105
|
-
6. **Obsidian
|
|
112
|
+
6. **Obsidian & Permissions** — open the memory vault in Obsidian; grant mic/camera for voice
|
|
106
113
|
7. **Agent & Module Picker** — 4 core agents pre-selected; choose optional agents and modules from the catalog
|
|
107
114
|
8. **Animated Setup Checklist** — live progress as your selected agents and modules are installed
|
|
108
115
|
9. **Interactive Tour** — guided walkthrough of every panel (re-launchable from Settings anytime)
|
|
@@ -115,25 +122,34 @@ After the CLI opens your browser, the wizard walks you through 10 steps:
|
|
|
115
122
|
```
|
|
116
123
|
~/mission-control/
|
|
117
124
|
├── data/
|
|
118
|
-
│ ├── mission-control.db # SQLite database (
|
|
125
|
+
│ ├── mission-control.db # SQLite database (tasks, agents, chat, approvals, etc.)
|
|
119
126
|
│ ├── google-tokens.json # Google OAuth tokens (auto-managed)
|
|
120
127
|
│ └── schedule.json # Cron job schedule
|
|
121
128
|
├── memory/ # Obsidian-compatible agent memory vault
|
|
129
|
+
│ ├── knowledge/ # Pre-seeded platform docs (architecture, MCP tools, task lifecycle, etc.)
|
|
122
130
|
│ ├── agents/ # Per-agent memory files
|
|
123
|
-
│ ├── knowledge/ # Knowledge base articles
|
|
124
131
|
│ ├── sessions/ # Session logs
|
|
125
|
-
│
|
|
132
|
+
│ ├── daily/ # Daily notes
|
|
133
|
+
│ └── templates/ # Note templates
|
|
126
134
|
├── library/ # All agent output files
|
|
127
135
|
│ ├── code/
|
|
128
136
|
│ ├── design/
|
|
129
|
-
│
|
|
130
|
-
├──
|
|
131
|
-
│
|
|
137
|
+
│ │ ├── ui/
|
|
138
|
+
│ │ ├── images/
|
|
139
|
+
│ │ └── media/
|
|
140
|
+
│ ├── docs/
|
|
141
|
+
│ │ ├── research/
|
|
142
|
+
│ │ ├── presentations/
|
|
143
|
+
│ │ └── strategies/
|
|
144
|
+
│ ├── campaigns/ # Per-campaign folders (auto-created)
|
|
145
|
+
│ └── projects/ # Per-project folders (auto-created)
|
|
146
|
+
├── agents/ # Per-agent workspaces (CLAUDE.md, SOUL.md, MEMORY.md, DIRECTORIES.md)
|
|
147
|
+
│ ├── mission-control/ # Orchestrator
|
|
132
148
|
│ ├── clara/ # QA review gate
|
|
133
149
|
│ ├── coder/ # Code execution
|
|
134
150
|
│ └── writer/ # Content & docs
|
|
135
151
|
├── .claude/
|
|
136
|
-
│ └── settings.json # Tool permissions + MCP server registrations
|
|
152
|
+
│ └── settings.json # Tool permissions + MCP server registrations + hooks
|
|
137
153
|
├── .mcp.json # MCP server config for Claude Code sessions
|
|
138
154
|
└── CLAUDE.md # Project context for all agent sessions
|
|
139
155
|
|
|
@@ -150,13 +166,15 @@ froggo-Mission-Control/
|
|
|
150
166
|
│ └── api/ # 100+ API endpoints
|
|
151
167
|
├── src/
|
|
152
168
|
│ ├── components/ # React UI components
|
|
153
|
-
│ ├── lib/ # Server-side logic (db, env,
|
|
169
|
+
│ ├── lib/ # Server-side logic (db, env, dispatch, keychain)
|
|
154
170
|
│ ├── modules/ # Pluggable feature modules
|
|
155
|
-
│ ├──
|
|
171
|
+
│ ├── store/ # Zustand client stores
|
|
156
172
|
│ └── types/ # TypeScript types
|
|
157
173
|
├── catalog/
|
|
158
174
|
│ ├── agents/ # Agent manifests + soul files + avatars (WebP)
|
|
159
175
|
│ └── modules/ # Module manifests
|
|
176
|
+
├── templates/
|
|
177
|
+
│ └── knowledge/ # Knowledge base articles seeded on install
|
|
160
178
|
├── tools/
|
|
161
179
|
│ ├── mission-control-db-mcp/ # MCP server: task/agent/chat DB tools
|
|
162
180
|
│ ├── memory-mcp/ # MCP server: memory vault read/write/search
|
|
@@ -164,6 +182,7 @@ froggo-Mission-Control/
|
|
|
164
182
|
│ └── hooks/ # Claude Code CLI hooks
|
|
165
183
|
├── .claude/
|
|
166
184
|
│ ├── CLAUDE.md # Platform instructions for agents
|
|
185
|
+
│ ├── agents/ # Agent definition files (trust tiers, tools, MCP)
|
|
167
186
|
│ ├── settings.json.template # Claude Code settings template
|
|
168
187
|
│ └── skills/ # Reusable skill files for agents
|
|
169
188
|
├── bin/
|
|
@@ -208,10 +227,32 @@ Agents are Claude Code CLI subprocesses spawned by Mission Control. Each agent h
|
|
|
208
227
|
- A **soul file** (`catalog/agents/{id}/soul.md`) — personality, responsibilities, output paths
|
|
209
228
|
- A **CLAUDE.md** (`catalog/agents/{id}/claude.md`) — boot sequence and MCP tool access
|
|
210
229
|
- A **manifest** (`catalog/agents/{id}/manifest.json`) — model, capabilities, required APIs/tools
|
|
230
|
+
- A **definition file** (`.claude/agents/{id}.md`) — trust tier, tools, MCP servers
|
|
211
231
|
- Access to MCP tools: `mcp__mission-control_db__*` for tasks/chat, `mcp__memory__*` for the vault
|
|
212
232
|
|
|
213
233
|
The platform dispatches tasks to agents automatically. Agents report progress via MCP, update task status, and store learnings in the memory vault.
|
|
214
234
|
|
|
235
|
+
### Agent trust tiers
|
|
236
|
+
|
|
237
|
+
| Tier | Who | Permissions |
|
|
238
|
+
|------|-----|-------------|
|
|
239
|
+
| **Trusted** | Mission Control | Full tool access, bypass permissions |
|
|
240
|
+
| **Worker** | Clara, HR | Full tool access, bypass permissions |
|
|
241
|
+
| **Apprentice** | All other agents | Default scoped permissions |
|
|
242
|
+
|
|
243
|
+
### Task pipeline
|
|
244
|
+
|
|
245
|
+
```
|
|
246
|
+
todo → internal-review → in-progress → agent-review → done
|
|
247
|
+
↕ ↕
|
|
248
|
+
human-review human-review
|
|
249
|
+
(needs human input) (external dependency)
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
- Clara reviews every task **before** work begins (internal-review gate) and **after** (agent-review gate)
|
|
253
|
+
- Agents cannot move tasks directly to `done` — only Clara can
|
|
254
|
+
- `human-review` replaces any notion of "blocked" — always has a path forward
|
|
255
|
+
|
|
215
256
|
---
|
|
216
257
|
|
|
217
258
|
## MCP servers
|
|
@@ -220,7 +261,7 @@ Three MCP servers ship with Mission Control and are auto-configured during insta
|
|
|
220
261
|
|
|
221
262
|
| Server | Tools | Purpose |
|
|
222
263
|
|---|---|---|
|
|
223
|
-
| `mission-control_db` | `task_create`, `task_update`, `task_list`, `chat_post`, `chat_read`, `approval_create` + more | Read/write the platform database |
|
|
264
|
+
| `mission-control_db` | `task_create`, `task_update`, `task_list`, `task_add_activity`, `chat_post`, `chat_read`, `approval_create` + more | Read/write the platform database |
|
|
224
265
|
| `memory` | `memory_search`, `memory_recall`, `memory_write`, `memory_read` | Hybrid BM25/vector memory vault |
|
|
225
266
|
| `cron` | `schedule_create`, `schedule_list` | Schedule recurring jobs |
|
|
226
267
|
|
|
@@ -250,14 +291,26 @@ Voice uses [Gemini Live](https://ai.google.dev/gemini-api/docs/live) for real-ti
|
|
|
250
291
|
## Memory search
|
|
251
292
|
|
|
252
293
|
Memory search uses a cascading backend:
|
|
253
|
-
1. **QMD** (preferred) — hybrid BM25/vector search.
|
|
294
|
+
1. **QMD** (preferred) — hybrid BM25/vector search. Auto-installed via `brew install profroggo/tap/qmd`
|
|
254
295
|
2. **ripgrep** — fast full-text fallback. Install: `brew install ripgrep`
|
|
255
296
|
3. **None** — shows a clear "search unavailable" message in the UI with install instructions
|
|
256
297
|
|
|
257
298
|
---
|
|
258
299
|
|
|
300
|
+
## Security
|
|
301
|
+
|
|
302
|
+
- **API keys** are stored in the OS keychain (macOS Keychain / Linux Secret Service) via `keytar`, never in plaintext SQLite
|
|
303
|
+
- **Agent permissions** are scoped by trust tier — new agents start as apprentices
|
|
304
|
+
- **External actions** (emails, deploys, tweets) require human approval before execution
|
|
305
|
+
- **Approval tiers** (0–3) gate actions from read-only to external writes
|
|
306
|
+
|
|
307
|
+
---
|
|
308
|
+
|
|
259
309
|
## Troubleshooting
|
|
260
310
|
|
|
311
|
+
**Build failed during install**
|
|
312
|
+
- Run `mission-control build` to retry the Next.js build
|
|
313
|
+
|
|
261
314
|
**Agents won't spawn**
|
|
262
315
|
- Check `CLAUDE_BIN`: `which claude` should return a path
|
|
263
316
|
- Verify Claude Code is authenticated: `claude auth login`
|
package/next.config.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/** @type {import('next').NextConfig} */
|
|
2
2
|
const nextConfig = {
|
|
3
|
-
//
|
|
4
|
-
serverExternalPackages: ['better-sqlite3'],
|
|
3
|
+
// Native Node addons must not be bundled by Turbopack — loaded at runtime
|
|
4
|
+
serverExternalPackages: ['better-sqlite3', 'keytar'],
|
|
5
5
|
// @ path alias is picked up automatically from tsconfig paths
|
|
6
6
|
|
|
7
7
|
async headers() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "froggo-mission-control",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.3",
|
|
4
4
|
"description": "Self-hosted AI agent platform for Claude Code CLI. Multi-agent orchestration, task management, Gmail, Calendar, Kanban and more.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude",
|
|
@@ -104,6 +104,9 @@
|
|
|
104
104
|
"lucide-react": "^0.303.0",
|
|
105
105
|
"next": "^16.1.6",
|
|
106
106
|
"node-gyp": "^12.2.0",
|
|
107
|
+
"postcss": "^8.4.32",
|
|
108
|
+
"autoprefixer": "^10.4.16",
|
|
109
|
+
"tailwindcss": "3.4.17",
|
|
107
110
|
"react": "^18.2.0",
|
|
108
111
|
"react-dom": "^18.2.0",
|
|
109
112
|
"react-draggable": "^4.5.0",
|
|
@@ -133,7 +136,6 @@
|
|
|
133
136
|
"@typescript-eslint/parser": "^8.0.0",
|
|
134
137
|
"@vitejs/plugin-react": "^5.1.4",
|
|
135
138
|
"@vitest/ui": "^4.0.18",
|
|
136
|
-
"autoprefixer": "^10.4.16",
|
|
137
139
|
"eslint": "^8.56.0",
|
|
138
140
|
"eslint-config-prettier": "^9.1.0",
|
|
139
141
|
"eslint-plugin-jsx-a11y": "^6.10.2",
|
|
@@ -142,9 +144,7 @@
|
|
|
142
144
|
"happy-dom": "^20.4.0",
|
|
143
145
|
"jsdom": "^27.4.0",
|
|
144
146
|
"playwright": "^1.58.0",
|
|
145
|
-
"postcss": "^8.4.32",
|
|
146
147
|
"prettier": "^3.2.0",
|
|
147
|
-
"tailwindcss": "^3.4.0",
|
|
148
148
|
"typescript": "^5.3.3",
|
|
149
149
|
"vitest": "^4.0.18",
|
|
150
150
|
"ws": "^8.19.0"
|
package/scripts/postinstall.js
CHANGED
|
@@ -133,12 +133,26 @@ function installObsidian() {
|
|
|
133
133
|
|
|
134
134
|
installObsidian();
|
|
135
135
|
|
|
136
|
+
// ── Rebuild native addons for current Node.js version ──────────────────────
|
|
137
|
+
info('Rebuilding native modules for Node.js ' + process.version + '...');
|
|
138
|
+
for (const mod of ['better-sqlite3', 'keytar']) {
|
|
139
|
+
const result = spawnSync('npm', ['rebuild', mod], {
|
|
140
|
+
cwd: ROOT, shell: true, stdio: 'pipe', encoding: 'utf-8',
|
|
141
|
+
});
|
|
142
|
+
if (result.status === 0) {
|
|
143
|
+
success(`${mod} compiled`);
|
|
144
|
+
} else {
|
|
145
|
+
warn(`${mod} rebuild failed (non-fatal): ${(result.stderr || '').slice(0, 120)}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
136
149
|
// ── Build Next.js app ──────────────────────────────────────────────────────
|
|
137
150
|
info('Building dashboard (Next.js)...');
|
|
138
151
|
process.env.NEXT_TELEMETRY_DISABLED = '1';
|
|
139
152
|
|
|
140
|
-
const buildResult = spawnSync('
|
|
153
|
+
const buildResult = spawnSync('./node_modules/.bin/next', ['build'], {
|
|
141
154
|
cwd: ROOT,
|
|
155
|
+
shell: true,
|
|
142
156
|
stdio: 'inherit',
|
|
143
157
|
env: { ...process.env, NEXT_TELEMETRY_DISABLED: '1' },
|
|
144
158
|
});
|
|
@@ -1192,6 +1192,9 @@ export default function OnboardingWizard({ onComplete, onSkip }: OnboardingWizar
|
|
|
1192
1192
|
// Block Continue on step 7 until install finishes
|
|
1193
1193
|
const installInProgress = currentStep === 7 && !installComplete;
|
|
1194
1194
|
|
|
1195
|
+
// Block Continue on step 5 until user confirms they've opened Obsidian
|
|
1196
|
+
const obsidianRequired = currentStep === 5 && !obsidianConfirmed;
|
|
1197
|
+
|
|
1195
1198
|
const canContinue = !criticalFailed && !permissionsRequired && !installInProgress && !obsidianRequired;
|
|
1196
1199
|
|
|
1197
1200
|
// Steps that allow skipping (step 5 — Obsidian — is now mandatory)
|
|
@@ -1208,9 +1211,6 @@ export default function OnboardingWizard({ onComplete, onSkip }: OnboardingWizar
|
|
|
1208
1211
|
goNext();
|
|
1209
1212
|
};
|
|
1210
1213
|
|
|
1211
|
-
// Block Continue on step 5 until user confirms they've opened Obsidian
|
|
1212
|
-
const obsidianRequired = currentStep === 5 && !obsidianConfirmed;
|
|
1213
|
-
|
|
1214
1214
|
return (
|
|
1215
1215
|
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/80">
|
|
1216
1216
|
<div className="w-full max-w-lg bg-mission-control-surface rounded-2xl shadow-2xl border border-mission-control-border overflow-hidden flex flex-col max-h-[90vh]">
|