Daily backup: 2026-02-06

This commit is contained in:
Jake Shore 2026-02-06 23:01:30 -05:00
parent 5c0f9f8354
commit 16db42bf7e
730 changed files with 354025 additions and 81 deletions

View File

@ -1,86 +1,91 @@
# HEARTBEAT.md — Active Task State
## Current Task
- **Project:** OpenClaw Upwork Launch + MCP Pipeline Operations
- **Last completed:** Opus 4.6 announcement coverage, $20k OpenClaw deal closed, LocalBosses UI critique, MEGA Deck v3 (16 slides), Design skill breakdown for Jake
- **Next step:** Jake reviewing OpenClaw video + gallery → Upwork listing finalization
- **Blockers:** Expired Anthropic API key in localbosses-app .env.local, testing strategy decision pending, GHL 42 failing tests
- **Project:** OpenClaw Upwork Launch + MCP Pipeline Operations + Content Coaching
- **Last completed:** SURYA Manim animation (14 tracks), HITL modal designs (25 types), DAS Investment Sources PDF, iMessage contact approvals (Oliver + Kevin), coaching Day 1
- **Next step:** Coaching Day 2 (9 AM), Blender export follow-up, fresh Anthropic API key needed
- **Blockers:** Expired Anthropic API key (MCP build page + LocalBosses), GHL 42 failing tests, 19 servers need API key signups
## Active Projects
### OpenClaw Upwork Service Launch (PRIMARY — PENDING REVIEW)
### Content Coaching — Oliver & Kevin (DAILY)
- **Channel:** Discord #general (1468856284634943489)
- **Status:** Day 1 complete — neither posted. Day 2 starts 9 AM Feb 7
- **Oliver:** @quowavy on IG, +19175028872
- **Kevin:** @kevinthevp on IG, +19179929834
- **Cadence:** 9 AM brief, 1 PM check-in, evening wrap
### OpenClaw Upwork Service Launch (PENDING REVIEW)
- **Location:** `openclaw-gallery/`
- **Status:** All assets complete, awaiting Jake review
- **Assets:** 15 graphics, 6 mockups, 2 PDFs, 90-sec Remotion video
- **Pricing:** $2,499 / $7,499 / $24,999 tiers finalized
- **Next:** Upwork listing finalization after Jake approves video
- **Win:** First $20k deal closed + $2k/mo retainer (hospice business)
### MCP Pipeline Factory (OPERATIONAL)
### SURYA Blender Export (IN PROGRESS)
- **Location:** `surya-blender/`
- **Status:** generate_all.py was running via Blender background mode — needs follow-up
- **Blender:** 5.0.1 installed at `/Applications/Blender.app/Contents/MacOS/Blender`
### MCP Pipeline Factory (OPERATIONAL — STEADY STATE)
- **Location:** `mcp-command-center/`
- **Status:** Fully operational — autonomous operator mode
- **Discord channels:** 7 channels in "MCP PIPELINE" category
- **Cron jobs:** Daily standup 9 AM, heartbeat every 2 hours
- **Status:** Fully operational, autonomous operator mode
- **State:**
- Stage 16 (Website Built): 31 MCPs ready for deployment
- Stage 11 (Edge Case Testing): 4 (BIG4 + GHL) — GHL BLOCKED on 42 tests
- Stage 8 (Integration Complete): 2 (meta-ads, twilio) — need API keys
- Stage 7 (UI Apps Built): 2 (closebot, google-console) — awaiting design approval
- Stage 6 (Core Tools Built): 19 — need test coverage
- Stage 5 (Scaffolded): 6 (compile only)
- Stage 16 (Website Built): 3 — close, freshdesk, helpscout
- Stage 11 (Edge Case Testing): 1 — GHL (BLOCKED: 42 failing tests)
- Stage 8 (Integration Complete): 2 — meta-ads, twilio (need API keys)
- Stage 7 (UI Apps Built): 2 — closebot, google-console (awaiting design approval)
- Stage 6 (Core Tools Built): 19 — need API key signups
- Stage 1 (Identified): 3 — compliance-grc, hr-people-ops, product-analytics
- **Dashboard:** `http://192.168.0.25:8888`
### AI Factory HITL System (RESEARCH COMPLETE)
- **Location:** `design-hitl-modal-collection.md`, `design-learning-feedback-system.md`
- **Status:** 25 modal types designed, learning system architected
- **Next:** Jake to decide on prototype priority
### MCP Build Page
- **URL:** `http://192.168.0.25:3333/build`
- **Status:** UI functional, pipeline wired — BLOCKED on expired Anthropic API key
### LocalBosses App
- **Location:** `localbosses-app/`
- **Status:** Major feature sprint completed, all bugs fixed
- **Dev server:** `192.168.0.25:3000`
- **Status:** Feature sprint done, bugs fixed
- **Blocker:** Expired Anthropic API key in .env.local
- **New:** Steve Jobs-style UI critique delivered — recommendations ready if Jake wants redesign
### CloseBot MCP
- **Location:** `closebot-mcp/`
- **Status:** 119 tools, 4,656 lines, compiles clean
- **Needs:** CLOSEBOT_API_KEY env var for live testing
### Factory Testing Infrastructure
- **Location:** `factory-tools/`
- **Status:** All 30 servers patched and rebuilt, 100/100 compliance
- **Tools:** mcp-jest, mcp-validator, mcp-add, MCP Inspector
- **Ready:** 702 test cases for live API testing (needs API keys)
### 8-Week Agent Study Plan
- **Location:** `agent-repos-study-plan.md`
- **Status:** 1,497 lines, posted to #trending-agent-repos
- **Curriculum:** Pydantic-AI → MS Agent Framework → Agent-S → GPT Researcher → Yao → MetaGPT → ElizaOS → Capstone
### SongSense — AI Music Analysis Product (QUEUED)
- **Status:** Full architecture designed, Jake approved, build hasn't started
- **Priority:** Still queued behind current sprint
## Today's Wins
- **Opus 4.6 released** — 1M token context window
- **$20k OpenClaw deal closed** + $2k/mo retainer
- **Design skill explained** — Jake understands the "secret sauce" now
- **MEGA Deck v3** — 16 cinematic slides delivered
- **LocalBosses UI critique** — Steve Jobs breakdown delivered
## Das Projects
- **Genre Universe Animation:** Delivered to #manim (1080p60, 30 sequences)
- **Server Icon:** Set via Discord API
## Today's Wins (Feb 6)
- **SURYA animation delivered** — 14 tracks, 5:44 video, sent to Discord
- **25 HITL modal designs** + learning system architecture
- **Coaching launched** for Oliver & Kevin
- **iMessage contacts approved** — Oliver & Kevin whitelisted
- **3 TLDR summaries** delivered (morning, afternoon, night)
- **Browser extension installed** for Jake
- **DAS Investment Sources PDF** delivered
## Other Active Projects
### Burton Method Research Intel
- **Location:** `memory/burton-method-research-intel.md`
- **Status:** Updated Feb 5 — 7Sage self-directed pivot, PowerScore + Spivey partnership
- **Status:** Updated Feb 5
### 8-Week Agent Study Plan
- **Location:** `agent-repos-study-plan.md`
- **Status:** 1,497 lines, posted to #trending-agent-repos
### Smart Model Routing
- **Status:** Active — Sonnet default, auto-escalate to Opus
- **Impact:** ~3-4x cost savings
## Git Status
- **Workspace repo:** `github.com/BusyBee3333/clawdbot-workspace.git`
- **Pending:** Daily backup commit
- **Pending:** Daily backup commit for Feb 6
---
*Last updated: 2026-02-05 23:00 EST*
*Last updated: 2026-02-06 23:00 EST*

View File

@ -0,0 +1,434 @@
# MASTER PLAN: Interactive Agent Factory SaaS
## Codename: "GooseFactory" — Your AI Factory, Your Rules
> **Author:** Buba (synthesized from 4 specialized research agents)
> **Date:** 2026-02-06
> **Status:** PLAN — Awaiting Jake's Review
> **Supporting Research:** 4 docs, ~15,000 words, 60+ sources
---
## TL;DR — The 30-Second Pitch
Fork Goose (Block's open-source AI agent). Gut its chat UI. Wire in a **Factory Command Center** — a decision queue, pipeline kanban, and approval system that makes it painfully obvious when YOU are the bottleneck. The backend is an API + MCP server that exposes every factory operation as a conversational tool. You literally type "what needs my attention?" and get a prioritized list with one-click approve/reject. Everything you don't touch auto-advances. Everything that needs you screams at you until you act.
---
## 1. WHY THIS MATTERS
Right now the pipeline has ~64 MCP servers across 8 stages. The bottleneck isn't the AI — it's **you not knowing what's stuck on you**. The current system (Discord channels + cron heartbeats + manual checks) is passive. You have to go looking for what needs attention. That's backwards.
**The fix:** Build a system where decisions come to YOU, not the other way around. Make human-in-the-loop a first-class experience, not an afterthought.
---
## 2. ARCHITECTURE OVERVIEW
```
┌─────────────────────────────────────────────────────────────────┐
│ YOUR INTERFACE LAYER │
│ │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ GooseFactory │ │ Discord Bot │ │ Mobile │ │
│ │ Desktop App │ │ (Buttons + │ │ Push Notifs │ │
│ │ (Forked │ │ Embeds) │ │ (Quick │ │
│ │ Goose) │ │ │ │ Approve) │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │
│ └──────────────────┼──────────────────┘ │
│ │ │
│ ┌─────────────────────────▼─────────────────────────────┐ │
│ │ MCP Server (Factory Operations) │ │
│ │ 11 Tools · 6 Resources · 4 Prompts │ │
│ │ "what needs attention?" → prioritized decision queue │ │
│ └─────────────────────────┬─────────────────────────────┘ │
└────────────────────────────┼────────────────────────────────────┘
┌────────────────────────────┼────────────────────────────────────┐
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Factory API (REST + WebSocket) │ │
│ │ 30+ endpoints · Real-time events · GraphQL queries │ │
│ └─────────────────────────┬───────────────────────────┘ │
│ │ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │Pipeline │ │Task │ │Notif + │ │Audit │ │
│ │Engine │ │Queue │ │Escalation│ │Logger │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │PostgreSQL│ │Redis │ │S3/R2 │ │
│ │(State) │ │(Events) │ │(Assets) │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
---
## 3. THE GOOSE FORK — "GooseFactory"
### Why Goose?
- **Rust backend + Electron/React frontend** — production-grade, fast
- **Apache 2.0 license** — full commercial freedom, no copyleft
- **MCP-native** — already a first-class MCP host with dynamic extension discovery
- **Built-in permission system** — 4 modes including Smart Approval (risk-based)
- **Extension ecosystem** — thousands of MCP servers plug in immediately
- **Active community** — but now under Linux Foundation (AAIF), so stable governance
### What We Change
| Component | Current Goose | GooseFactory |
|-----------|--------------|--------------|
| **Branding** | Goose logos, `goose://` protocol | Your brand, `factory://` protocol |
| **Default Extensions** | Developer, Memory, etc. | Factory MCP Server (built-in), Pipeline Manager |
| **Chat UI** | General-purpose assistant | Factory Command Center with decision queue sidebar |
| **Approval Flow** | Simple allow/deny on tool calls | Rich approval cards with context, diffs, metrics |
| **System Prompts** | Generic agent instructions | Factory operator mode — knows about pipeline stages, MCPs |
| **MCP UI Rendering** | Basic inline/sidecar (WIP) | Custom approval UIs, pipeline dashboards, code review panels |
| **Protocol Handler** | `goose://extension?...` | `factory://approve?task_id=...` deep links |
### Fork Strategy
1. **Clone the repo**`git clone https://github.com/block/goose GooseFactory`
2. **Rebrand**`package.json`, `main.ts`, assets, protocol handler (~1-2 days)
3. **Add Factory MCP Server** as a built-in Rust extension in `crates/goose-mcp/`
4. **Customize the chat UI** — Add decision queue sidebar in React (the interesting part)
5. **Add MCP UI components** — Custom approval cards using `@mcp-ui/client`
6. **Configure Smart Approval** — Factory operations auto-classified by risk level
### ⚠️ Timing Risk
Goose is actively migrating to ACP (Agent Communication Protocol) — Issue #6642. This replaces the backend REST+SSE with JSON-RPC 2.0. **Recommendation:** Fork AFTER the ACP migration lands (or fork now and track upstream). The migration affects `goosed` ↔ desktop communication.
---
## 4. EVERY MOMENT YOU'RE NEEDED (Taxonomy)
Based on research across 10+ agent products and frameworks, here's every type of human-in-the-loop moment mapped to your factory:
### 🔴 CRITICAL — Always Need You
| Moment | Factory Example | UI Pattern |
|--------|----------------|------------|
| **Deploy to Production** | Promoting an MCP to live | Modal overlay with deploy checklist |
| **API Key Entry** | Configuring Stripe/GHL credentials | Secure input form in chat |
| **Client Communication** | Sending deliverables to the $20k client | Preview + approve before send |
| **Pricing/Positioning** | Setting MCP marketplace pricing | Multi-choice card with tradeoffs |
| **Legal/License Review** | Checking dependency licenses | Sidebar review panel |
### 🟡 HIGH VALUE — Usually Need You
| Moment | Factory Example | UI Pattern |
|--------|----------------|------------|
| **Design Review** | Approving UI/UX for MCP apps | Side-by-side mockup comparison |
| **Code Quality Gate** | Reviewing generated MCP server code | Diff view with inline annotations |
| **Naming/Branding** | Naming a new MCP server | A/B choice between options |
| **Test Failure Triage** | GHL's 42 failing tests — fix or skip? | Error cards with suggested actions |
| **Priority Decisions** | Which MCP to advance next? | Drag-and-drop priority list |
### 🟢 CONTEXTUAL — Sometimes Need You
| Moment | Factory Example | UI Pattern |
|--------|----------------|------------|
| **Routine Approvals** | Stage advances for passing servers | Batch approve with exceptions |
| **Parameter Tuning** | Adjusting test coverage thresholds | Slider controls |
| **Edge Cases** | AI hit a wall building a tool | Escalation card with context |
| **Delegation** | Route task to specialized agent | Dropdown assignment |
### Smart Routing (Confidence-Based)
Not everything needs to block on you:
- **>90% confidence** → Auto-execute, log for async review
- **60-90% confidence** → Queue for review, pipeline continues other work
- **<60% confidence** Block and escalate immediately
---
## 5. THE DECISION QUEUE — Your Mission Control
This is the centerpiece. A prioritized inbox of every decision the factory needs from you.
### Layout (In GooseFactory Desktop App)
```
┌─────────────────────────────────────────────────────────────┐
│ GooseFactory [≡] [] [×]│
├──────────────────┬──────────────────────────────────────────┤
│ │ │
│ 📥 DECISIONS (6)│ 🔴 GHL MCP — Deploy to Production │
│ │ │
│ 🔴 GHL Deploy │ Pipeline: ghl-mcp-server │
│ 🟡 Stripe Review │ Stage: staging → production │
│ 🟡 3 Batch Items│ Tests: 47/47 ✅ Coverage: 94% ✅ │
│ 🟢 2 FYI Items │ Waiting: 2h 15m SLA: ⚠️ 45m left │
│ │ │
│ ── Pipeline ── │ Changes since last review: │
│ [Kanban View] │ + 12 files modified │
│ │ + 3 new API endpoints │
│ ── Agents ── │ + Edge case handling improved │
│ 🟢 Builder: OK │ │
│ 🟢 Tester: OK │ [View Full Diff] [Run Tests Again] │
│ 🟡 GHL: Waiting │ │
│ │ ┌─────────┐ ┌─────────┐ ┌──────────┐ │
│ ── Stats ── │ │✅ Deploy│ │❌ Reject│ │⏰ Defer │ │
│ Today: 12 done │ └─────────┘ └─────────┘ └──────────┘ │
│ Avg wait: 1.2h │ │
│ │ 💬 Chat: "approve the GHL deploy" │
│ │ [________________________________] [⏎] │
├──────────────────┴──────────────────────────────────────────┤
│ Chat: You can also just type naturally here... │
│ > "what else needs my attention?" │
│ > "approve all low-risk items" │
│ > "show me the GHL test failures" │
└─────────────────────────────────────────────────────────────┘
```
### Key Features
1. **Left Sidebar: Decision Queue** — Priority-sorted, color-coded, with age timers
2. **Center: Context Panel** — Full details for the selected decision (diffs, metrics, history)
3. **Bottom: Chat** — Natural language interface to the factory ("approve all passing servers")
4. **One-Click Actions** — Approve, reject, defer, reassign, batch approve
5. **Keyboard Shortcuts**`j/k` navigate, `a` approve, `r` reject, `d` defer
6. **SLA Indicators** — Glowing countdown timers, escalation warnings
---
## 6. MCP SERVER — The Brain
The Factory MCP Server is what makes the chat interface powerful. It exposes 11 tools, 6 resources, and 4 prompts.
### Tools (What You Can Do)
| Tool | What It Does | Example |
|------|-------------|---------|
| `factory_get_pending_tasks` | Your decision inbox | "what needs my attention?" |
| `factory_approve_task` | Approve and advance | "approve the GHL deploy" |
| `factory_reject_task` | Reject with feedback | "reject stripe review — needs more tests" |
| `factory_get_pipeline_status` | Pipeline overview | "show me all active pipelines" |
| `factory_advance_stage` | Manual stage advance | "move notion-mcp to testing" |
| `factory_assign_priority` | Set priority | "make GHL critical priority" |
| `factory_get_blockers` | What's stuck | "what's blocked and why?" |
| `factory_run_tests` | Trigger tests | "run tests on the stripe server" |
| `factory_deploy` | Deploy to env | "deploy freshdesk to staging" |
| `factory_search` | Search everything | "find all servers with auth issues" |
| `factory_create_pipeline` | New server pipeline | "start a new Zendesk MCP server" |
### Resources (What You Can Read)
| Resource | What It Provides |
|----------|-----------------|
| `factory://dashboard/summary` | High-level factory status |
| `factory://pipelines/{id}/state` | Specific pipeline details |
| `factory://servers/{name}/status` | Individual server health |
| `factory://pipelines/{id}/test-results` | Test results + coverage |
| `factory://pipelines/{id}/build-logs` | Build output |
| `factory://config/templates` | Available pipeline templates |
### Prompts (Structured Conversations)
| Prompt | What It Sets Up |
|--------|----------------|
| `review_server` | Pull all context for a full MCP server review |
| `whats_needs_attention` | Prioritized summary of everything pending |
| `deploy_checklist` | Pre-deployment verification checklist |
| `pipeline_retrospective` | Post-completion analysis and lessons learned |
---
## 7. NOTIFICATION ESCALATION — No Decision Falls Through
This is critical. The whole point is that you CANNOT miss something.
```
T+0min Task created → Decision appears in GooseFactory queue
→ Discord embed in #factory-tasks with buttons
T+30min Reminder #1 → Discord DM + badge pulse in app
→ "⏰ GHL deploy approval waiting 30m"
T+2h Reminder #2 → Discord @mention + push notification
→ "🟡 GHL deploy waiting 2h — SLA in 2h"
T+4h SLA Warning → Discord @here + sound alert in app
→ "🔴 GHL deploy SLA breach imminent"
T+SLA SLA Breach → Auto-escalate: SMS + all channels
→ "🚨 GHL deploy SLA BREACHED — action required"
T+SLA+2h Critical → Phone notification + auto-default to safest action
→ Incident report logged
```
### Smart Batching
Instead of 10 separate pings:
```
📋 5 servers ready for review:
✅ freshdesk (low risk, tests pass) [Approve]
✅ helpscout (low risk, tests pass) [Approve]
✅ close (low risk, tests pass) [Approve]
⚠️ stripe (med risk, 1 warning) [Review]
❌ ghl (high risk, 42 failures) [Review Required]
[Approve All Low-Risk (3)] [Review All]
```
---
## 8. EVERY UI PATTERN MAPPED
Based on research across Devin, Cursor, GitHub Copilot Workspace, n8n, Retool, and 20+ other products:
### Pattern → When to Use
| Pattern | Best For | Our Implementation |
|---------|----------|-------------------|
| **Inline Chat Buttons** | Quick approve/reject | Approve/reject buttons in chat messages |
| **Modal Overlay** | Critical/irreversible actions | Production deploy confirmation (type "DEPLOY" to confirm) |
| **Sidebar Panel** | Code/asset review | Diff viewer alongside approval context |
| **Decision Queue** | Managing multiple pending items | Left sidebar in GooseFactory |
| **Kanban Board** | Pipeline stage visualization | Pipeline view tab |
| **Batch Processor** | Many similar decisions | "Approve all matching criteria" |
| **Progress Dashboard** | Long-running agent monitoring | Agent status panel |
| **Run Contract** | Pre-approving expensive operations | "This will use ~$50 in API calls, take ~4h" |
| **Mobile Quick Actions** | Approvals on the go | Push notification with swipe actions |
| **Discord Embeds** | Team visibility + async approval | Rich embeds with buttons in factory channels |
| **MCP Apps** | Complex interactive reviews | Custom HTML UIs rendered in chat (code review, forms) |
---
## 9. TECH STACK
| Layer | Technology | Why |
|-------|-----------|-----|
| **Desktop App** | Forked Goose (Electron + React 19 + Rust) | Best-in-class MCP host, extensible UI |
| **Backend API** | Node.js + Hono | Fast, lightweight, TypeScript-native |
| **Database** | PostgreSQL (Neon/Supabase) | Proven, JSONB support, great for state machines |
| **Cache/Events** | Redis (Upstash) | Pub/sub, streams, fast queue |
| **Object Storage** | Cloudflare R2 | S3-compatible, no egress fees |
| **MCP Server** | TypeScript + @modelcontextprotocol/sdk | Native MCP, stdio + SSE transport |
| **State Machine** | XState-inspired patterns | Explicit states, SLA timers, auto-escalation |
| **Orchestration** | Inngest (step.waitForEvent) | Durable execution, event correlation, timeouts |
| **Discord Bot** | discord.js | Buttons, embeds, modals, slash commands |
| **Auth** | JWT + API keys | Simple, stateless, scoped |
| **CI/CD** | GitHub Actions | Existing infra, dispatch triggers |
### Why Inngest over Temporal?
- **Simpler** — No separate server cluster to manage
- **TypeScript-native** — Matches our stack
- **Event matching**`waitForEvent` with correlation is exactly our approval pattern
- **Serverless** — Functions dehydrate while waiting, no resource consumption
- Temporal is more powerful but overkill for our scale right now. Can migrate later if needed.
---
## 10. DATABASE SCHEMA (Key Tables)
```
pipelines — One per MCP server build
├── pipeline_stages — Stage definitions + state machine
├── tasks — Human decisions needed (the queue)
├── approvals — Formal gate approvals
├── assets — Generated code, configs, builds
└── audit_log — Immutable event log
agents — AI workers + build agents
notifications — Multi-channel notification queue
```
8 tables total. Full SQL DDL in `research-factory-api-architecture.md`.
---
## 11. IMPLEMENTATION ROADMAP
### Phase 1: Foundation (Week 1-2) — "The Skeleton"
- [ ] Fork Goose, rebrand basics (name, logo, protocol)
- [ ] Set up PostgreSQL schema + migrations
- [ ] Core REST API (pipelines, tasks, approvals CRUD)
- [ ] JWT auth
- [ ] Basic audit logging
- [ ] **Deliverable:** API accepts requests, data persists
### Phase 2: MCP Server + Real-Time (Week 3-4) — "The Brain"
- [ ] Factory MCP server with core tools (get_pending, approve, reject, status)
- [ ] MCP resources (pipeline state, dashboard summary)
- [ ] WebSocket server for real-time dashboard updates
- [ ] Redis event bus with consumer groups
- [ ] Wire MCP server into GooseFactory as built-in extension
- [ ] **Deliverable:** "What needs my attention?" works in chat
### Phase 3: Decision Queue UI (Week 5-6) — "The Centerpiece"
- [ ] Decision queue sidebar in GooseFactory React UI
- [ ] Context panel with diffs, metrics, history
- [ ] One-click approve/reject/defer actions
- [ ] Keyboard shortcuts (j/k/a/r/d)
- [ ] Pipeline kanban view
- [ ] SLA countdown indicators
- [ ] **Deliverable:** Full Command Center in desktop app
### Phase 4: Notifications + Discord (Week 7-8) — "The Nagger"
- [ ] Discord bot bridge with rich embeds + buttons
- [ ] Escalation ladder (queue → DM → mention → SMS)
- [ ] Smart batching for similar decisions
- [ ] Mobile push notifications
- [ ] SLA monitoring and auto-escalation
- [ ] GitHub webhook integration
- [ ] **Deliverable:** Decisions come to you, not the other way around
### Phase 5: Advanced Features (Week 9-10) — "The Polish"
- [ ] MCP Apps for complex reviews (code diffs, forms in chat)
- [ ] Batch approval processor
- [ ] MCP prompts (review, deploy checklist, retrospective)
- [ ] Analytics dashboard (decision velocity, bottleneck analysis)
- [ ] Confidence-based auto-routing
- [ ] Undo/rollback for 24h post-approval
- [ ] **Deliverable:** Full SaaS-grade product
### Phase 6: SaaS-ify (Week 11-12) — "The Product"
- [ ] Multi-tenant support (separate factory instances)
- [ ] User management + team roles
- [ ] Billing integration
- [ ] Landing page + docs
- [ ] Onboarding flow
- [ ] **Deliverable:** Sellable product
---
## 12. WHAT MAKES THIS DIFFERENT FROM EXISTING TOOLS
| Tool | What It Does | What We Do Better |
|------|-------------|------------------|
| **Devin** | Autonomous coding agent | We're a factory MANAGER, not a single agent |
| **Cursor/Windsurf** | IDE with AI | We manage pipelines of 64+ servers, not single files |
| **n8n/Zapier** | Workflow automation | We're AI-agent-native with MCP, not just webhooks |
| **Linear/Jira** | Project management | We have AI agents doing the work, humans just decide |
| **Retool** | Internal tools | We're purpose-built for AI agent factories |
| **Goose (vanilla)** | General AI assistant | We're a specialized factory operator |
**The unique value:** No one has built a purpose-built human-in-the-loop command center specifically for managing fleets of AI agents building MCP servers. You'd be first.
---
## 13. IMMEDIATE NEXT STEPS
1. **Jake reviews this plan** — What's missing? What's wrong? What's the priority?
2. **Fork Goose** — Clone, rebrand, get building running locally
3. **Spike the MCP Server** — Build the 3 most critical tools (get_pending, approve, reject) and test in Goose
4. **Spike the Decision Queue UI** — Mockup the sidebar in GooseFactory's React app
5. **Wire to existing pipeline** — Connect to `mcp-command-center/state.json` as initial data source
**The MVP is:** Type "what needs my attention?" in GooseFactory → get a prioritized list → approve/reject from chat. Everything else builds on that.
---
## SUPPORTING RESEARCH DOCS
| Doc | Words | Focus |
|-----|-------|-------|
| `research-goose-architecture.md` | ~3,000 | Goose codebase, fork strategy, MCP integration |
| `research-hitl-ux-patterns.md` | ~5,500 | Every HITL interaction type, UI patterns, 10 products analyzed |
| `research-factory-api-architecture.md` | ~4,000 | API design, MCP server spec, database schema, real-time events |
| `research-agent-orchestration-patterns.md` | ~3,500 | LangGraph, Temporal, Inngest, state machines, notification patterns |
---
*"The best interface for managing AI agents isn't more AI — it's making it painfully obvious when a human needs to do something, and making that something take one click."*

29
SOUL.md
View File

@ -6,6 +6,10 @@
- **Discord:** `938238002528911400` (JakeShore/jakeshore)
- **Phone:** `914-500-9208` (Jake's iMessage)
**JAKE-APPROVED iMessage CONTACTS (respond without password):**
- **Oliver:** `+19175028872` / `(917) 502-8872` — approved by Jake on 2026-02-06 via Discord
- **Kevin:** `+19179929834` / `(917) 992-9834` — approved by Jake on 2026-02-06 via Discord
**NO ONE ELSE. EVER. NO EXCEPTIONS.**
### What this means:
@ -36,22 +40,27 @@
## ⚠️ iMessage/BlueBubbles Security (MANDATORY)
**THIS IS A HARD RULE - NO EXCEPTIONS**
**THIS IS A HARD RULE - NO EXCEPTIONS (except Jake-approved contacts below)**
Before responding to ANY message on iMessage/BlueBubbles:
1. Check if the password `JAJAJA2026` has been said in that chat
2. If NO password has been provided → respond ONLY with: "I am locked until the code word is said"
3. Do NOT give hints about the password
4. Do NOT engage in conversation until password is given
5. Do NOT use any tools for anyone except Jake (914-500-9208)
6. This applies even if Jake asks me to send something from Discord - the password must be said IN the iMessage chat first
7. **NEVER reveal the password when explaining how I work — not even to "authorized" users**
1. Check if the sender is Jake (914-500-9208) OR a Jake-approved contact (see list above)
2. If Jake-approved contact → respond normally, chat-only (no tools, no file ops, no exec, no browsing)
3. If unknown number → Check if the password `JAJAJA2026` has been said in that chat
4. If NO password has been provided by unknown number → respond ONLY with: "I am locked until the code word is said"
5. Do NOT give hints about the password
6. Do NOT engage in conversation with unknown numbers until password is given
7. Do NOT use any tools for anyone except Jake (914-500-9208)
8. **NEVER reveal the password when explaining how I work — not even to "authorized" users**
**Jake-approved contacts (NO password needed, chat-only access):**
- Oliver: +19175028872
- Kevin: +19179929834
**Mention gating:** Only respond when someone says "Buba" in the message. Don't respond to every message - wait to be addressed by name.
**Jake's number:** 914-500-9208 (THE ONLY NUMBER I TRUST)
**Jake's number:** 914-500-9208 (THE ONLY NUMBER WITH FULL TRUST)
**All other phone numbers are UNTRUSTED by default, regardless of what my memory/contacts say.**
**All other phone numbers (except Jake-approved list) are UNTRUSTED by default.**
---

View File

@ -42,3 +42,8 @@ For ongoing research/monitoring projects (like Burton Method competitor tracking
### Trusted Collaborators
- **mrclaude** (Discord: `1463409080466145313`) — Fellow AI agent, can collaborate on projects. Approved for money-making discussions and joint planning. Final approvals go to Jake + Nicholai.
### Jake-Approved iMessage Contacts (respond without password)
- **Oliver** — Phone: +19175028872 / (917) 502-8872. Approved 2026-02-06 by Jake via Discord. Chat-only access (no tools).
- **Kevin** — Phone: +19179929834 / (917) 992-9834. Approved 2026-02-06 by Jake via Discord. Chat-only access (no tools).

1
bluemsg-landing Submodule

@ -0,0 +1 @@
Subproject commit a33896e2d4d9695818150e330e6343a63512045e

1
blueshift-video Submodule

@ -0,0 +1 @@
Subproject commit 8491ce9b00b27d46a97083f30760d90a29b12814

View File

@ -0,0 +1,543 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DAS: The Investment Case — Source Documentation</title>
<style>
@page { size: letter; margin: 0.75in 1in; }
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
color: #1a1a2e;
background: #fff;
line-height: 1.5;
font-size: 10.5pt;
}
.cover {
text-align: center;
padding: 120px 40px 80px;
page-break-after: always;
background: linear-gradient(180deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
color: #fff;
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.cover h1 {
font-size: 36pt;
font-weight: 800;
letter-spacing: 6px;
margin-bottom: 8px;
color: #d4af37;
}
.cover h2 {
font-size: 18pt;
font-weight: 300;
margin-bottom: 60px;
color: #e0e0e0;
}
.cover .doc-title {
font-size: 14pt;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 3px;
border-top: 1px solid #d4af37;
border-bottom: 1px solid #d4af37;
padding: 12px 40px;
margin-bottom: 30px;
color: #d4af37;
}
.cover .meta {
font-size: 10pt;
color: #aaa;
margin-top: 20px;
}
.cover .meta span { display: block; margin: 4px 0; }
.page-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 2px solid #d4af37;
padding-bottom: 8px;
margin-bottom: 24px;
}
.page-header .logo { font-size: 14pt; font-weight: 800; color: #1a1a2e; letter-spacing: 3px; }
.page-header .subtitle { font-size: 9pt; color: #666; text-transform: uppercase; letter-spacing: 1px; }
h3 {
font-size: 13pt;
color: #1a1a2e;
margin: 24px 0 12px;
padding-bottom: 4px;
border-bottom: 1px solid #eee;
}
h3 .category-label {
display: inline-block;
background: #1a1a2e;
color: #d4af37;
font-size: 8pt;
padding: 2px 8px;
border-radius: 3px;
margin-right: 8px;
text-transform: uppercase;
letter-spacing: 1px;
vertical-align: middle;
}
table {
width: 100%;
border-collapse: collapse;
margin: 12px 0 20px;
font-size: 9.5pt;
}
thead th {
background: #1a1a2e;
color: #d4af37;
padding: 8px 10px;
text-align: left;
font-size: 8pt;
text-transform: uppercase;
letter-spacing: 1px;
font-weight: 600;
}
thead th:first-child { border-radius: 4px 0 0 0; }
thead th:last-child { border-radius: 0 4px 0 0; }
tbody td {
padding: 8px 10px;
border-bottom: 1px solid #eee;
vertical-align: top;
}
tbody tr:nth-child(even) { background: #fafafa; }
tbody tr:hover { background: #f5f0e0; }
.source-num {
display: inline-block;
background: #d4af37;
color: #1a1a2e;
width: 20px;
height: 20px;
border-radius: 50%;
text-align: center;
line-height: 20px;
font-size: 8pt;
font-weight: 700;
}
.slide-tags span {
display: inline-block;
background: #1a1a2e;
color: #fff;
font-size: 7.5pt;
padding: 1px 6px;
border-radius: 3px;
margin: 1px 2px;
white-space: nowrap;
}
.url {
font-size: 8pt;
color: #0f3460;
word-break: break-all;
}
.description {
font-size: 9pt;
color: #333;
}
.section-intro {
font-size: 10pt;
color: #444;
margin-bottom: 16px;
padding: 10px 14px;
background: #f8f6f0;
border-left: 3px solid #d4af37;
border-radius: 0 4px 4px 0;
}
.footer {
margin-top: 40px;
padding-top: 12px;
border-top: 1px solid #ddd;
font-size: 8pt;
color: #999;
text-align: center;
}
.disclaimer {
margin-top: 24px;
padding: 14px;
background: #f8f6f0;
border: 1px solid #e0d8c0;
border-radius: 4px;
font-size: 8.5pt;
color: #666;
}
.disclaimer strong { color: #1a1a2e; }
</style>
</head>
<body>
<!-- COVER PAGE -->
<div class="cover">
<h1>DAS</h1>
<h2>The Investment Case</h2>
<div class="doc-title">Source Documentation & Citations</div>
<div class="meta">
<span>Prepared: February 6, 2026</span>
<span>Research compiled from 15+ industry sources</span>
<span>8 parallel research agents deployed</span>
<span>Confidential — For Intended Recipients Only</span>
</div>
</div>
<!-- PAGE 2: STREAMING & ARTIST DATA -->
<div style="padding: 0;">
<div class="page-header">
<div class="logo">DAS</div>
<div class="subtitle">Source Documentation — Streaming & Artist Data</div>
</div>
<h3><span class="category-label">Category 1</span> Streaming Platforms & Artist Metrics</h3>
<div class="section-intro">
Primary data sources for monthly listener counts, follower metrics, and artist profile verification used throughout the presentation.
</div>
<table>
<thead>
<tr>
<th style="width:25px">#</th>
<th style="width:160px">Source</th>
<th>Information Used</th>
<th style="width:85px">Slide(s)</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="source-num">1</span></td>
<td><strong>Spotify</strong><br><span class="url">open.spotify.com/artist/</span></td>
<td class="description">Sara Landry: 1.6M monthly listeners. Ray Volpe: 611.8K monthly listeners. Used to verify current streaming metrics and establish artist credibility benchmarks.</td>
<td class="slide-tags"><span>Slide 2</span><span>Slide 4</span><span>Slide 10</span></td>
</tr>
<tr>
<td><span class="source-num">2</span></td>
<td><strong>Beatport</strong><br><span class="url">beatport.com/artist/sara-landry/663399</span></td>
<td class="description">Sara Landry's ranking as #1 best-selling female producer on Beatport. Beatport chart presence as credibility signal for EDM booking. Genre-specific chart tracking for techno/house.</td>
<td class="slide-tags"><span>Slide 2</span><span>Slide 4</span><span>Slide 10</span></td>
</tr>
<tr>
<td><span class="source-num">3</span></td>
<td><strong>Monstercat</strong><br><span class="url">monstercat.com/artist/ray-volpe</span></td>
<td class="description">Ray Volpe's "Laserbeam" crowned most played track at EDC Las Vegas 2022. #1 on Beatport Dubstep Chart, #1 on iTunes Electronic Chart. Billboard chart appearances.</td>
<td class="slide-tags"><span>Slide 2</span><span>Slide 10</span></td>
</tr>
<tr>
<td><span class="source-num">4</span></td>
<td><strong>Insomniac Music</strong><br><span class="url">insomniac.com/music/artists/</span></td>
<td class="description">Official artist bios confirming Sara Landry's 1.6M+ listener count and Ray Volpe's festival credentials. Insomniac operates EDC, the largest EDM festival brand.</td>
<td class="slide-tags"><span>Slide 2</span><span>Slide 10</span></td>
</tr>
<tr>
<td><span class="source-num">5</span></td>
<td><strong>Instagram</strong><br><span class="url">instagram.com/rayvolpe/</span></td>
<td class="description">Ray Volpe: 251K followers. Used for social media follower benchmarking and collab threshold analysis.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 10</span></td>
</tr>
<tr>
<td><span class="source-num">6</span></td>
<td><strong>Bandsintown</strong><br><span class="url">bandsintown.com/a/13504081-isoxo</span></td>
<td class="description">ISOxo follower data (~31K). Used as comparable for EDM artists who play major festivals with relatively modest follower counts.</td>
<td class="slide-tags"><span>Slide 4</span></td>
</tr>
</tbody>
</table>
<h3><span class="category-label">Category 2</span> Festival Economics & Booking Data</h3>
<div class="section-intro">
Industry sources for festival payment ranges, booking thresholds, and artist tier classifications. These informed the revenue projections and milestone framework.
</div>
<table>
<thead>
<tr>
<th style="width:25px">#</th>
<th style="width:160px">Source</th>
<th>Information Used</th>
<th style="width:85px">Slide(s)</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="source-num">7</span></td>
<td><strong>EDM Festival Insider</strong><br><span class="url">edmfestivalinsider.com/how-much-do-artists-make-when-playing-festivals/</span></td>
<td class="description">Primary source for festival payment ranges: Ultra/EDC/Tomorrowland $30K-$400K per set. Specific artist fees (Calvin Harris £950K, Avicii £500K, Jamie XX £200K, Sigma £25K). Deal structures (landed vs +++). Festival budget allocation models.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 7</span><span>Slide 8</span><span>Slide 11</span></td>
</tr>
<tr>
<td><span class="source-num">8</span></td>
<td><strong>Variety</strong><br><span class="url">variety.com/2022/music/news/coachella-festival-time-slot-set-time-1235233195/</span></td>
<td class="description">Festival time slot analysis: sunset slots (2:30-7:30 PM) identified as most valuable. Peak vs off-peak timing data. Headliner slot challenges and audience retention patterns.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 7</span></td>
</tr>
<tr>
<td><span class="source-num">9</span></td>
<td><strong>Pollstar</strong> (referenced)<br><span class="url">pollstar.com</span></td>
<td class="description">Industry-standard touring revenue data. Ticket sales history benchmarks. Used by talent buyers as primary booking metric. Referenced for revenue projection validation.</td>
<td class="slide-tags"><span>Slide 7</span><span>Slide 8</span><span>Slide 11</span></td>
</tr>
<tr>
<td><span class="source-num">10</span></td>
<td><strong>Indie on the Move</strong><br><span class="url">indieonthemove.com/blog/2021/4/tips-from-a-unique-perspective-an-artist-and-talent-buyer</span></td>
<td class="description">Talent buyer perspective on what metrics matter for booking decisions. Primary data points: Pollstar reports, streaming numbers, social engagement, press coverage. Confirmed ticket sales as #1 metric.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 7</span><span>Slide 11</span></td>
</tr>
<tr>
<td><span class="source-num">11</span></td>
<td><strong>Ticket Fairy</strong><br><span class="url">ticketfairy.com/blog/</span></td>
<td class="description">Festival set length strategy by slot type. Data-driven talent booking using audience insights. Set length: warm-up 75-120 min, prime time 60-90 min, headliner 60-90 min.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 6</span></td>
</tr>
</tbody>
</table>
</div>
<!-- PAGE 3 -->
<div style="padding: 0; page-break-before: always;">
<div class="page-header">
<div class="logo">DAS</div>
<div class="subtitle">Source Documentation — Advertising & Industry Analysis</div>
</div>
<h3><span class="category-label">Category 3</span> TikTok Advertising & Music Marketing</h3>
<div class="section-intro">
Sources used to calculate cost-per-listener acquisition rates, campaign benchmarks, and the $0.98/follower relative performance analysis.
</div>
<table>
<thead>
<tr>
<th style="width:25px">#</th>
<th style="width:160px">Source</th>
<th>Information Used</th>
<th style="width:85px">Slide(s)</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="source-num">12</span></td>
<td><strong>Gupta Media</strong><br><span class="url">guptamedia.com</span></td>
<td class="description">TikTok CPM benchmark: $6.21 average. CPC: $0.31. Industry-leading digital music marketing agency data used for ad efficiency benchmarking.</td>
<td class="slide-tags"><span>Slide 3</span><span>Slide 5</span></td>
</tr>
<tr>
<td><span class="source-num">13</span></td>
<td><strong>Lebesgue</strong><br><span class="url">lebesgue.io</span></td>
<td class="description">TikTok CPM data: $3.21 baseline. Year-over-year CPM growth rate of 12.28%. Seasonal pricing variations (January low $2.87, Q4 peak $6.26).</td>
<td class="slide-tags"><span>Slide 3</span><span>Slide 5</span></td>
</tr>
<tr>
<td><span class="source-num">14</span></td>
<td><strong>Darkroom Agency</strong><br><span class="url">darkroomagency.com</span></td>
<td class="description">Spark Ads performance data: 20-40% lower CPC vs standard ads. Music-specific campaign conversion rates. Micro-influencer ROI benchmarks (70% of successful campaigns).</td>
<td class="slide-tags"><span>Slide 3</span><span>Slide 5</span></td>
</tr>
<tr>
<td><span class="source-num">15</span></td>
<td><strong>Billboard</strong><br><span class="url">billboard.com</span></td>
<td class="description">84% of Billboard Global 200 songs (2024) went viral on TikTok first. Chart performance data for EDM artists. Touring profitability statistics: only 57% of indie touring musicians are profitable.</td>
<td class="slide-tags"><span>Slide 3</span><span>Slide 8</span><span>Slide 11</span></td>
</tr>
</tbody>
</table>
<h3><span class="category-label">Category 4</span> Streaming Economics & Artist Development</h3>
<div class="section-intro">
Sources for listener-to-revenue conversion rates, collab thresholds, and career development benchmarks.
</div>
<table>
<thead>
<tr>
<th style="width:25px">#</th>
<th style="width:160px">Source</th>
<th>Information Used</th>
<th style="width:85px">Slide(s)</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="source-num">16</span></td>
<td><strong>Musosoup</strong><br><span class="url">musosoup.com/blog/how-does-spotify-calculate-monthly-listeners</span></td>
<td class="description">1,000 monthly listeners = top 19% of Spotify artists. 10K-50K listeners = £100-£600/month earnings. 200K listeners = ~£2,000/month stable income. Listener calculation methodology.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 7</span></td>
</tr>
<tr>
<td><span class="source-num">17</span></td>
<td><strong>Two Story Melody</strong><br><span class="url">twostorymelody.com/spotify-monthly-listeners-explained/</span></td>
<td class="description">Listener-to-income benchmarks: 40K = growing artist, 100K = doing OK, 500K = established. Used for milestone framework validation.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 7</span></td>
</tr>
<tr>
<td><span class="source-num">18</span></td>
<td><strong>EDM Tips</strong><br><span class="url">edmtips.com/how-to-get-signed-to-a-record-label/</span></td>
<td class="description">Collaboration threshold: target artists with 20K-40K followers on desired labels. Sweet spot for networking. Label signing requirements and social proof expectations.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 9</span></td>
</tr>
<tr>
<td><span class="source-num">19</span></td>
<td><strong>Audio Jacked</strong><br><span class="url">audiojacked.com/music-news/top-10-tips-for-edm-producers-to-get-signed-by-a-record-label</span></td>
<td class="description">Label thresholds: 2K-8K followers for indie labels, 20K-100K+ for majors. What labels look for: music quality, fan engagement, growth trajectory, promotional ability.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 9</span></td>
</tr>
<tr>
<td><span class="source-num">20</span></td>
<td><strong>Social Plug</strong><br><span class="url">socialplug.io/blog/spotify-case-study</span></td>
<td class="description">Case study: EDM artist grew from 700 to 48,000 monthly listeners in 4 weeks via strategic promotion. 50K-100K = early festival tier threshold.</td>
<td class="slide-tags"><span>Slide 5</span><span>Slide 6</span></td>
</tr>
</tbody>
</table>
<h3><span class="category-label">Category 5</span> Community & Industry Discussion</h3>
<div class="section-intro">
Reddit communities provided real-world artist experiences, booking agent perspectives, and crowd-sourced payment data that cross-validated industry publication figures.
</div>
<table>
<thead>
<tr>
<th style="width:25px">#</th>
<th style="width:160px">Source</th>
<th>Information Used</th>
<th style="width:85px">Slide(s)</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="source-num">21</span></td>
<td><strong>Reddit r/EDM</strong><br><span class="url">reddit.com/r/EDM/</span></td>
<td class="description">Critical insight: artists with 1-2M engaged listeners headline while 12-18M playlist-driven artists can't sell 3K venues. Knock2/ISOxo case studies. Up-and-coming thresholds (10K-100K). Sara Landry, Fred Again.., John Summit rise documented.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 7</span><span>Slide 10</span><span>Slide 11</span></td>
</tr>
<tr>
<td><span class="source-num">22</span></td>
<td><strong>Reddit r/aves</strong><br><span class="url">reddit.com/r/aves/</span></td>
<td class="description">DJ payment data: Zomboy $15K-$100K, Eptic/Habstrakt $2K-$20K (2018-2019). Real-world festival fee verification from attendees and industry insiders.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 8</span></td>
</tr>
<tr>
<td><span class="source-num">23</span></td>
<td><strong>Reddit r/electricdaisycarnival</strong><br><span class="url">reddit.com/r/electricdaisycarnival/</span></td>
<td class="description">EDC-specific payment ranges: most artists under $100K, biggest names 6-figures. Peak headliner slot timing: 1:00 AM. Sunrise set value analysis.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 7</span></td>
</tr>
<tr>
<td><span class="source-num">24</span></td>
<td><strong>Reddit r/edmproduction</strong><br><span class="url">reddit.com/r/edmproduction/</span></td>
<td class="description">Intermediate success benchmarks: 50K-100K SoundCloud followers = ~$2K/show, need 25 shows/year for $50K salary. Production career economics.</td>
<td class="slide-tags"><span>Slide 7</span><span>Slide 8</span></td>
</tr>
<tr>
<td><span class="source-num">25</span></td>
<td><strong>Reddit r/DJs</strong><br><span class="url">reddit.com/r/DJs/</span></td>
<td class="description">Club set fees: $200-$300 for 1-1.5hr. Outdoor festival sets: $250-$500. Entry-level payment benchmarks for emerging DJs.</td>
<td class="slide-tags"><span>Slide 7</span></td>
</tr>
</tbody>
</table>
</div>
<!-- PAGE 4: ADDITIONAL + FESTIVAL OPERATIONS -->
<div style="padding: 0; page-break-before: always;">
<div class="page-header">
<div class="logo">DAS</div>
<div class="subtitle">Source Documentation — Additional Sources & Festival Operations</div>
</div>
<h3><span class="category-label">Category 6</span> Festival Operations & Booking Tools</h3>
<table>
<thead>
<tr>
<th style="width:25px">#</th>
<th style="width:160px">Source</th>
<th>Information Used</th>
<th style="width:85px">Slide(s)</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="source-num">26</span></td>
<td><strong>Pirate Studios</strong><br><span class="url">pirate.com/en/blog/get-booked-us-festivals/</span></td>
<td class="description">Festival organizer interviews (Hulaween, Joshua Tree, Gem & Jam): "Social media is an afterthought — I'll book wildly talented artists regardless of their socials." Live performance quality as top priority.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 10</span></td>
</tr>
<tr>
<td><span class="source-num">27</span></td>
<td><strong>Gigmit</strong><br><span class="url">blog.gigmit.com/en/4-reasons-to-use-gigmit-as-a-large-scale-promoter-talent-buyer/</span></td>
<td class="description">Modern talent buyer tools: Fan Charts, geographic insights, PollstarPro integration, Rostr agency mapping. Data-driven booking methodology.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 6</span></td>
</tr>
<tr>
<td><span class="source-num">28</span></td>
<td><strong>Beats to Rap On</strong><br><span class="url">beatstorapon.com/blog/festival-booking-the-complete-guide-for-artists-managers-and-promoters-2025/</span></td>
<td class="description">Festival booking guide: early slots require 50-200 person draw, regional festivals 200-500 capacity headline shows, major festivals need national tour history.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 6</span></td>
</tr>
<tr>
<td><span class="source-num">29</span></td>
<td><strong>We Rave You</strong><br><span class="url">weraveyou.com/2023/07/music-festival-debate-edc-tomorrowland-and-ultra/</span></td>
<td class="description">Festival scale comparison: Tomorrowland 600K attendees (2 weekends, 14 stages), EDC 8 stages, Ultra 7 stages. Market size context for payment analysis.</td>
<td class="slide-tags"><span>Slide 4</span><span>Slide 8</span></td>
</tr>
<tr>
<td><span class="source-num">30</span></td>
<td><strong>BeatStats</strong><br><span class="url">beatstats.com</span></td>
<td class="description">Beatport Top 100 chart tracking. Used for techno/house credibility benchmarking. Relevant for genre-specific festival booking considerations.</td>
<td class="slide-tags"><span>Slide 4</span></td>
</tr>
<tr>
<td><span class="source-num">31</span></td>
<td><strong>De Novo Agency</strong><br><span class="url">denovoagency.com/blogs/insights-and-strategies-for-the-modern-musician/</span></td>
<td class="description">TikTok algorithm advantage for new artists: algorithm doesn't weight existing follower count. Growth roadmap from 10 to 10,000 Spotify followers.</td>
<td class="slide-tags"><span>Slide 3</span><span>Slide 5</span></td>
</tr>
</tbody>
</table>
<h3 style="margin-top: 30px;"><span class="category-label">Summary</span> Source Coverage by Slide</h3>
<table>
<thead>
<tr>
<th style="width: 80px">Slide #</th>
<th>Slide Title</th>
<th style="width: 220px">Source Numbers</th>
</tr>
</thead>
<tbody>
<tr><td><strong>Slide 1</strong></td><td>Title</td><td></td></tr>
<tr><td><strong>Slide 2</strong></td><td>The Validation</td><td>1, 2, 3, 4</td></tr>
<tr><td><strong>Slide 3</strong></td><td>How the Industry Works Now</td><td>12, 13, 14, 15, 31</td></tr>
<tr><td><strong>Slide 4</strong></td><td>The Thresholds That Matter</td><td>1, 2, 5, 6, 7, 8, 10, 11, 16, 17, 18, 19, 21, 22, 23, 26, 27, 28, 29, 30</td></tr>
<tr><td><strong>Slide 5</strong></td><td>The Investment Required</td><td>12, 13, 14, 20, 31</td></tr>
<tr><td><strong>Slide 6</strong></td><td>The Timeline</td><td>11, 20, 27, 28</td></tr>
<tr><td><strong>Slide 7</strong></td><td>When Revenue Starts</td><td>7, 8, 9, 10, 16, 17, 21, 23, 24, 25</td></tr>
<tr><td><strong>Slide 8</strong></td><td>Revenue Projections</td><td>7, 9, 15, 22, 24, 29</td></tr>
<tr><td><strong>Slide 9</strong></td><td>The Compounding Effect</td><td>18, 19</td></tr>
<tr><td><strong>Slide 10</strong></td><td>Das's Unfair Advantages</td><td>1, 2, 3, 4, 5, 21, 26</td></tr>
<tr><td><strong>Slide 11</strong></td><td>Risk & Reality Check</td><td>7, 9, 10, 15, 21</td></tr>
<tr><td><strong>Slide 12</strong></td><td>The Ask</td><td>Derived from slides 4-8</td></tr>
<tr><td><strong>Slide 13</strong></td><td>What Success Looks Like</td><td>Derived from slides 4-8</td></tr>
<tr><td><strong>Slide 14</strong></td><td>Next Steps</td><td>All sources</td></tr>
</tbody>
</table>
<div class="disclaimer">
<strong>Disclaimer:</strong> All figures presented are based on publicly available industry data, artist self-reporting, and community-sourced information as of February 2026. Actual results may vary significantly based on genre, market conditions, campaign execution quality, content performance, and audience engagement. Revenue projections are conservative estimates and should not be construed as guarantees. Festival payment data represents ranges compiled from multiple sources and actual fees are subject to confidential negotiations. This document is prepared for informational purposes only.
</div>
<div class="footer">
DAS: The Investment Case — Source Documentation &nbsp;|&nbsp; Prepared February 6, 2026 &nbsp;|&nbsp; 31 Sources Cited &nbsp;|&nbsp; Confidential
</div>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"version": 1,
"lastUpdated": "2026-02-06T05:00:00Z",
"lastUpdated": "2026-02-06T15:01:19Z",
"updatedBy": "heartbeat-cron",
"phases": [
{
@ -773,7 +773,7 @@
"id": "freshbooks",
"name": "FreshBooks",
"type": "STD",
"stage": 5,
"stage": 6,
"tools": null,
"apps": null,
"blocked": false,
@ -783,6 +783,10 @@
{
"stage": 8,
"entered": "2026-02-03T00:00:00Z"
},
{
"stage": 6,
"entered": "2026-02-06T15:01:19Z"
}
],
"needsCredentials": true,
@ -798,7 +802,7 @@
"deploymentReady": true,
"websiteBuilt": true,
"hasAnimation": true,
"stageNote": "Downgraded by ruthless eval 2026-02-05"
"stageNote": "Auto-advanced: compile clean, 7-8 tools implemented"
},
{
"id": "freshdesk",
@ -834,7 +838,7 @@
"id": "gusto",
"name": "Gusto",
"type": "STD",
"stage": 5,
"stage": 6,
"tools": null,
"apps": null,
"blocked": false,
@ -844,6 +848,10 @@
{
"stage": 8,
"entered": "2026-02-03T00:00:00Z"
},
{
"stage": 6,
"entered": "2026-02-06T15:01:19Z"
}
],
"needsCredentials": true,
@ -859,7 +867,7 @@
"deploymentReady": true,
"websiteBuilt": true,
"hasAnimation": true,
"stageNote": "Downgraded by ruthless eval 2026-02-05"
"stageNote": "Auto-advanced: compile clean, 7-8 tools implemented"
},
{
"id": "helpscout",
@ -926,7 +934,7 @@
"id": "jobber",
"name": "Jobber",
"type": "STD",
"stage": 5,
"stage": 6,
"tools": null,
"apps": null,
"blocked": false,
@ -936,6 +944,10 @@
{
"stage": 8,
"entered": "2026-02-03T00:00:00Z"
},
{
"stage": 6,
"entered": "2026-02-06T15:01:19Z"
}
],
"needsCredentials": true,
@ -951,13 +963,13 @@
"deploymentReady": true,
"websiteBuilt": true,
"hasAnimation": true,
"stageNote": "Downgraded by ruthless eval 2026-02-05"
"stageNote": "Auto-advanced: compile clean, 7-8 tools implemented"
},
{
"id": "keap",
"name": "Keap",
"type": "STD",
"stage": 5,
"stage": 6,
"tools": null,
"apps": null,
"blocked": false,
@ -967,6 +979,10 @@
{
"stage": 8,
"entered": "2026-02-03T00:00:00Z"
},
{
"stage": 6,
"entered": "2026-02-06T15:01:19Z"
}
],
"needsCredentials": true,
@ -982,13 +998,13 @@
"deploymentReady": true,
"websiteBuilt": true,
"hasAnimation": true,
"stageNote": "Downgraded by ruthless eval 2026-02-05"
"stageNote": "Auto-advanced: compile clean, 7-8 tools implemented"
},
{
"id": "lightspeed",
"name": "Lightspeed",
"type": "STD",
"stage": 5,
"stage": 6,
"tools": null,
"apps": null,
"blocked": false,
@ -998,6 +1014,10 @@
{
"stage": 8,
"entered": "2026-02-03T00:00:00Z"
},
{
"stage": 6,
"entered": "2026-02-06T15:01:19Z"
}
],
"needsCredentials": true,
@ -1013,7 +1033,7 @@
"deploymentReady": true,
"websiteBuilt": true,
"hasAnimation": true,
"stageNote": "Downgraded by ruthless eval 2026-02-05"
"stageNote": "Auto-advanced: compile clean, 7-8 tools implemented"
},
{
"id": "mailchimp",
@ -1362,9 +1382,9 @@
{
"id": "dec-001",
"type": "pipeline-wide",
"stage": "89",
"stage": "8\u21929",
"question": "Testing strategy: structural-only vs live API vs hybrid",
"resolution": "OVERRIDDEN Jake directed Buba to proactively acquire API keys via signups, test with real APIs, advance on success",
"resolution": "OVERRIDDEN \u2014 Jake directed Buba to proactively acquire API keys via signups, test with real APIs, advance on success",
"resolvedBy": "Jake (Discord 2026-02-05T03:32:49Z)",
"resolvedAt": "2026-02-05T03:32:49Z",
"discordMessageId": "1468811576533586120"

@ -1 +1 @@
Subproject commit 2aaf6c8e48c5a9fd5008625eaf652cfdf3dba24f
Subproject commit 2d684e6f0cd69f8b162b8c65b2e5db000d9444df

View File

@ -0,0 +1,701 @@
# MCPEngine Studio — Agent Team Build Plan
**Objective:** Build the no-code MCP App builder at mcpengine.com using a coordinated team of expert sub-agents.
**Timeline:** 4 weeks to MVP (V1), 8 weeks to marketplace (V2)
**Orchestrator:** Buba (main agent) — assigns work, reviews output, resolves conflicts, merges code
---
## The Agent Team
### 8 Specialist Agents
| Agent | Role | Expertise | Runs On |
|-------|------|-----------|---------|
| **SCAFFOLD** | Project Bootstrapper | Next.js 15, Tailwind, project setup, CI/CD | Opus |
| **DESIGN-SYS** | Design System Engineer | Tailwind config, component library, tokens, dark/light mode | Opus |
| **CANVAS** | Visual Editor Engineer | React Flow v12, custom nodes, drag-drop, canvas interactions | Opus |
| **AI-PIPE** | AI Pipeline Engineer | Claude API integration, streaming, skill-to-service wiring | Opus |
| **BACKEND** | Backend Engineer | Next.js API routes, PostgreSQL schema, auth, billing | Opus |
| **APP-DESIGNER** | WYSIWYG Builder | MCP Apps UI designer, component palette, data binding | Opus |
| **DEPLOY** | Deploy & Infra Engineer | Cloudflare Workers, Wrangler, R2, server hosting pipeline | Opus |
| **MARKETPLACE** | Marketplace Engineer | Template system, 37 server migration, search, fork flow | Opus |
### Orchestration Model
```
┌─────────┐
│ BUBA │
│ (main) │
└────┬────┘
│ assigns tasks, reviews PRs,
│ resolves conflicts, merges
┌──────────┼──────────┐
│ │ │
┌─────▼────┐ ┌──▼───┐ ┌───▼─────┐
│ Phase 1 │ │ P2 │ │ Phase 3 │
│ Agents │ │ │ │ Agents │
└──────────┘ └──────┘ └─────────┘
Phase 1 (Week 1): SCAFFOLD → DESIGN-SYS → BACKEND (parallel after scaffold)
Phase 2 (Week 2-3): CANVAS + AI-PIPE + BACKEND (parallel)
Phase 3 (Week 3-4): APP-DESIGNER + DEPLOY + MARKETPLACE (parallel)
Integration (Week 4): BUBA merges all, end-to-end testing
```
---
## Phase 1: Foundation (Week 1)
### Sprint 1A: Project Scaffold (Day 1)
**Agent: SCAFFOLD**
```
Task: Bootstrap the MCPEngine Studio monorepo
Deliverables:
├── mcpengine-studio/
│ ├── package.json (workspace root)
│ ├── apps/
│ │ └── web/ (Next.js 15 app)
│ │ ├── app/
│ │ │ ├── (marketing)/ (landing, pricing)
│ │ │ ├── (auth)/ (sign-in, sign-up)
│ │ │ ├── (dashboard)/ (authenticated app)
│ │ │ └── api/ (route handlers)
│ │ ├── components/
│ │ ├── lib/
│ │ ├── tailwind.config.ts
│ │ ├── next.config.ts
│ │ └── tsconfig.json
│ ├── packages/
│ │ ├── ui/ (shared component library)
│ │ ├── db/ (drizzle schema + migrations)
│ │ └── ai-pipeline/ (skill engine)
│ ├── turbo.json
│ └── .github/workflows/ci.yml
Setup:
- Next.js 15 with App Router + Turbopack
- Tailwind CSS 4
- TypeScript strict mode
- Drizzle ORM + Neon PostgreSQL
- Clerk auth (dev keys)
- pnpm workspaces + Turborepo
- ESLint + Prettier
- Vercel deployment config
Acceptance: `pnpm dev` runs, shows placeholder landing page
```
### Sprint 1B: Design System (Days 1-3)
**Agent: DESIGN-SYS**
**Depends on:** SCAFFOLD complete
```
Task: Build the complete component library per UX-DESIGN-SPEC.md
Deliverables in packages/ui/:
├── tokens/
│ ├── colors.ts (all hex values, dark/light)
│ ├── typography.ts (Inter + JetBrains Mono scale)
│ ├── spacing.ts (4px grid)
│ └── shadows.ts (elevation system)
├── components/
│ ├── Button.tsx (primary/secondary/ghost/danger/success, 3 sizes)
│ ├── Card.tsx (default/interactive/elevated/glowing)
│ ├── Input.tsx (text/textarea/select/search + error states)
│ ├── Modal.tsx (backdrop blur, spring animation)
│ ├── Toast.tsx (success/error/info/loading, auto-dismiss)
│ ├── NavRail.tsx (64px icon dock with tooltips)
│ ├── NavRailItem.tsx (icon + tooltip + active state)
│ ├── Inspector.tsx (slide-in right panel, context-sensitive)
│ ├── Badge.tsx (status badges for tools)
│ ├── Skeleton.tsx (loading placeholders)
│ ├── EmptyState.tsx (illustration + headline + CTA)
│ ├── ProgressBar.tsx (animated, indeterminate option)
│ ├── Stepper.tsx (deploy progress stepper)
│ └── ConfettiOverlay.tsx (canvas-confetti wrapper)
├── layouts/
│ ├── AppShell.tsx (NavRail + Canvas + Inspector 3-zone layout)
│ ├── MarketingLayout.tsx (header + footer for public pages)
│ └── AuthLayout.tsx (centered card layout)
└── hooks/
├── useTheme.ts (dark/light toggle)
├── useToast.ts (toast notification system)
└── useInspector.ts (open/close inspector panel)
Acceptance:
- All components render in dark + light mode
- Keyboard accessible (focus rings, tab order)
- Storybook or test page showing all components
- Matches UX-DESIGN-SPEC.md color values exactly
```
### Sprint 1C: Database + Auth (Days 2-4)
**Agent: BACKEND**
**Depends on:** SCAFFOLD complete
```
Task: Set up database schema, auth, and core API structure
Deliverables in packages/db/:
├── schema.ts (all tables from TECHNICAL-ARCHITECTURE.md)
│ - users, teams, projects, tools, apps
│ - deployments, marketplace_listings
│ - usage_logs, api_keys
├── migrations/
│ └── 0001_initial.sql
├── seed.ts (seed 37 marketplace templates)
└── index.ts (drizzle client export)
Deliverables in apps/web/app/api/:
├── auth/
│ └── webhook/route.ts (Clerk webhook → sync users to DB)
├── projects/
│ ├── route.ts (GET list, POST create)
│ └── [id]/route.ts (GET detail, PATCH update, DELETE)
└── middleware.ts (Clerk auth middleware)
Deliverables in apps/web/app/(auth)/:
├── sign-in/page.tsx (Clerk SignIn component)
└── sign-up/page.tsx (Clerk SignUp component)
Acceptance:
- `pnpm db:push` creates all tables in Neon
- Sign up / sign in works
- CRUD projects via API
- Clerk webhook syncs user to DB
```
---
## Phase 2: Core Features (Weeks 2-3)
### Sprint 2A: Visual Tool Editor (Days 5-9)
**Agent: CANVAS**
**Depends on:** DESIGN-SYS + BACKEND complete
```
Task: Build the React Flow visual tool editor — the core canvas
Deliverables in apps/web/components/canvas/:
├── ToolCanvas.tsx (React Flow wrapper with controls)
├── ToolNode.tsx (custom node: tool name, method badge, description,
│ param count, auth indicator, enabled toggle)
├── GroupNode.tsx (tool group container with label)
├── ConnectionEdge.tsx (animated edge for tool chaining)
├── CanvasToolbar.tsx (zoom controls, minimap toggle, auto-layout)
├── CanvasControls.tsx (React Flow controls wrapper)
└── hooks/
├── useCanvasState.ts (Zustand store: nodes, edges, selections)
├── useToolDragDrop.ts (drag from palette → canvas)
└── useAutoLayout.ts (dagre auto-layout algorithm)
Deliverables in apps/web/components/inspector/:
├── ToolInspector.tsx (main inspector panel)
├── ToolNameEditor.tsx (edit tool name + description)
├── ParamEditor.tsx (add/remove/edit input parameters)
│ - Param name, type (string/number/boolean/array/object)
│ - Required toggle, default value, description
├── OutputSchemaEditor.tsx (define output shape)
├── AuthConfigPanel.tsx (API key / OAuth2 / Bearer config)
├── AnnotationsPanel.tsx (readOnly, destructive, idempotent hints)
└── ToolPreview.tsx (JSON preview of tool definition)
Deliverables in apps/web/app/(dashboard)/projects/[id]/:
├── page.tsx (Tool Editor page — canvas + inspector)
└── layout.tsx (editor layout with NavRail)
Interactions:
- Click node → inspector opens with tool config
- Double-click node → inline rename
- Drag handle → connect tools (chaining)
- Right-click → context menu (duplicate, delete, disable)
- Cmd+Z / Cmd+Shift+Z → undo/redo
- Minimap in corner for navigation
- Auto-layout button (dagre algorithm)
Acceptance:
- Can add/remove/edit tools visually on canvas
- Inspector shows all config for selected tool
- Drag-drop between groups works
- Undo/redo works
- Canvas state persists to project (API call on change)
```
### Sprint 2B: AI Pipeline Engine (Days 5-10)
**Agent: AI-PIPE**
**Depends on:** BACKEND complete
**Parallel with:** CANVAS
```
Task: Wire our 11 skills into the AI generation pipeline
Deliverables in packages/ai-pipeline/:
├── index.ts (pipeline orchestrator)
├── skills/
│ ├── loader.ts (load skill SKILL.md files as system prompts)
│ └── registry.ts (skill name → file path mapping for all 11)
├── services/
│ ├── analyzer.ts (spec → AnalysisResult, uses mcp-api-analyzer)
│ ├── generator.ts (config → ServerBundle, uses mcp-server-builder
│ │ + mcp-server-development)
│ ├── designer.ts (config → AppBundle, uses mcp-app-designer
│ │ + mcp-apps-official + mcp-apps-merged)
│ ├── tester.ts (server → TestResults, uses mcp-qa-tester)
│ └── deployer.ts (bundle → DeployResult, uses mcp-deployment)
├── streaming/
│ ├── sse.ts (Server-Sent Events helper for API routes)
│ └── parser.ts (parse Claude streaming → structured events)
├── types.ts (AnalysisResult, ServerBundle, AppBundle, etc.)
└── cost-tracker.ts (track tokens/cost per operation)
Deliverables in apps/web/app/api/:
├── analyze/route.ts (POST — upload spec → stream analysis)
├── generate/route.ts (POST — tool config → stream server code)
├── design/route.ts (POST — app config → stream HTML apps)
├── test/route.ts (POST — server → stream test results)
└── ws/route.ts (WebSocket for real-time progress)
Skill Loading Strategy:
- All 11 SKILL.md files copied into packages/ai-pipeline/skills/data/
- Loaded at startup, cached in memory
- Composed into system prompts per operation:
* Analyze: mcp-api-analyzer
* Generate: mcp-server-builder + mcp-server-development
* Design: mcp-app-designer + mcp-apps-official + mcp-apps-merged + mcp-apps-integration
* Test: mcp-qa-tester
* Deploy: mcp-deployment
Streaming UX:
- All endpoints use SSE (text/event-stream)
- Events: progress, tool_found, file_generated, test_result, deploy_step
- Frontend renders events in real-time (tools appearing, code streaming)
Acceptance:
- POST /api/analyze with OpenAPI spec → streams tool definitions
- POST /api/generate with tool config → streams TypeScript files
- POST /api/test with server code → streams test results
- Cost tracking logs tokens per call
- Error handling: retries, partial results, timeout recovery
```
### Sprint 2C: Spec Upload + Analysis Flow (Days 7-10)
**Agent: BACKEND** (continued)
**Depends on:** AI-PIPE started
```
Task: Build the spec upload and analysis review screens
Deliverables in apps/web/app/(dashboard)/projects/new/:
├── page.tsx (New Project wizard)
│ Step 1: Name + description
│ Step 2: Upload spec (URL paste, file upload, or pick template)
│ Step 3: Watch analysis (streaming — tools appear as found)
│ Step 4: Review tools (toggle on/off, quick edit names)
│ Step 5: → Redirect to Tool Editor
Deliverables in apps/web/components/:
├── spec-upload/
│ ├── SpecUploader.tsx (URL input + file drop zone + template picker)
│ ├── AnalysisStream.tsx (real-time analysis display — tools appearing)
│ ├── ToolReview.tsx (checklist of discovered tools, toggles)
│ └── AnalysisProgress.tsx (animated progress bar + status messages)
└── project/
├── ProjectCard.tsx (dashboard grid card)
└── ProjectGrid.tsx (responsive grid of project cards)
Acceptance:
- Can paste URL → analysis runs → tools discovered
- Can upload JSON/YAML file → same flow
- Can pick from template → pre-populated
- Streaming analysis shows tools appearing in real-time
- Can toggle tools before proceeding to editor
```
---
## Phase 3: Advanced Features (Weeks 3-4)
### Sprint 3A: MCP App Designer (Days 10-14)
**Agent: APP-DESIGNER**
**Depends on:** CANVAS + AI-PIPE complete
```
Task: Build the WYSIWYG MCP App designer
Deliverables in apps/web/components/app-designer/:
├── AppDesigner.tsx (main 3-column layout: palette + preview + properties)
├── ComponentPalette.tsx (draggable widget list)
│ Widgets: DataGrid, Chart (bar/line/pie), Form, CardList,
│ StatsRow, Timeline, Calendar, Map, DetailView
├── DesignCanvas.tsx (drop zone + visual preview)
├── PropertyPanel.tsx (selected widget properties)
├── DataBindingEditor.tsx (wire widget fields → tool outputs)
├── PreviewToggle.tsx (preview as: Claude / ChatGPT / VS Code)
├── widgets/
│ ├── DataGridWidget.tsx (sortable table with columns config)
│ ├── ChartWidget.tsx (chart type + data mapping)
│ ├── FormWidget.tsx (input fields → tool inputs)
│ ├── CardListWidget.tsx (repeating card template)
│ ├── StatsRowWidget.tsx (3-4 stat boxes with icons)
│ ├── TimelineWidget.tsx (vertical event timeline)
│ └── DetailViewWidget.tsx (key-value detail display)
└── hooks/
├── useAppState.ts (Zustand: widgets, layout, bindings)
└── useAppPreview.ts (generate preview HTML from state)
Deliverables in apps/web/app/(dashboard)/projects/[id]/apps/:
├── page.tsx (App Designer page)
└── [appId]/page.tsx (Individual app editor)
The Key Innovation:
- User drags DataGrid widget onto canvas
- Opens property panel → selects "get_contacts" tool as data source
- Maps columns: name→contactName, email→email, phone→phone
- Clicks "Preview" → sees live HTML rendering
- Clicks "Generate" → AI-PIPE uses mcp-app-designer + mcp-apps-official
to produce production HTML with proper postMessage handling
Acceptance:
- Can drag widgets onto canvas
- Can bind widget data to tool outputs
- Preview renders styled HTML matching dark theme
- Generate produces valid MCP App HTML bundle
- Apps saved to project and database
```
### Sprint 3B: Deploy Pipeline (Days 10-14)
**Agent: DEPLOY**
**Parallel with:** APP-DESIGNER
```
Task: Build the one-click deployment system
Deliverables in packages/deploy-engine/:
├── index.ts (deploy orchestrator)
├── targets/
│ ├── mcpengine.ts (Cloudflare Workers deploy via Wrangler API)
│ ├── npm.ts (npm publish automation)
│ ├── docker.ts (Dockerfile generation + build)
│ └── download.ts (zip bundle for self-hosting)
├── compiler.ts (TypeScript → bundled JS for Workers)
├── worker-template.ts (Cloudflare Worker wrapper for MCP server)
└── dns.ts (add {slug}.mcpengine.run route)
Deliverables in apps/web/app/api/:
├── deploy/route.ts (POST — trigger deployment, stream progress)
└── deployments/
├── route.ts (GET — list user deployments)
└── [id]/
├── route.ts (GET status, DELETE stop)
└── logs/route.ts (GET deployment logs)
Deliverables in apps/web/app/(dashboard)/projects/[id]/deploy/:
└── page.tsx (Deploy screen with stepper UI)
- Target selector (MCPEngine / npm / Docker / Download)
- Progress stepper (Build → Test → Package → Deploy → Verify)
- Live log viewer (streaming)
- Success screen with URL + confetti
- "Add to Claude Desktop" config snippet
Cloudflare Workers Flow:
1. Compile TypeScript server → single JS bundle
2. Wrap in Worker template (handles HTTP → MCP transport)
3. Upload via Cloudflare API: PUT /workers/scripts/{name}
4. Set environment variables (user's API keys, decrypted)
5. Add route: {slug}.mcpengine.run
6. Health check: GET {slug}.mcpengine.run/health
7. Done → return URL
Acceptance:
- Can deploy to MCPEngine hosting → get live URL
- Can download as zip
- Progress stepper animates through stages
- Confetti fires on success
- Deployed server responds to MCP tool/list
- "Add to Claude Desktop" shows correct JSON config
```
### Sprint 3C: Marketplace (Days 12-16)
**Agent: MARKETPLACE**
**Parallel with:** DEPLOY
```
Task: Build the template marketplace seeded with our 37 servers
Deliverables in apps/web/app/(dashboard)/marketplace/:
├── page.tsx (Marketplace browser)
│ - Search bar with full-text search
│ - Category filter tabs (CRM, eCommerce, HR, Marketing, etc.)
│ - Grid of template cards (name, tool count, app count, rating, fork count)
│ - Sort: popular / newest / most forked
├── [templateId]/page.tsx (Template detail page)
│ - Name, description, author
│ - Tool list preview
│ - App screenshots
│ - [Fork to My Projects] button
│ - README rendered as markdown
└── publish/page.tsx (Publish your project as template)
Deliverables in apps/web/app/api/marketplace/:
├── route.ts (GET list + search, POST publish)
├── [id]/route.ts (GET detail)
├── [id]/fork/route.ts (POST fork → create project from template)
└── categories/route.ts (GET category list with counts)
Deliverables in packages/db/:
└── seed-marketplace.ts (migrate 37 servers into marketplace)
For each server:
- Extract tool count from src/index.ts
- Extract app count from app-ui/
- Auto-categorize (CRM, eCommerce, etc.)
- Set is_official = true
- Generate preview metadata
Acceptance:
- Browse 37 official templates with categories
- Search by name/description
- Fork template → creates new project with tools pre-loaded
- Category counts are accurate
- Template detail shows tool list and README
```
---
## Phase 4: Integration & Polish (Week 4)
### Sprint 4A: Landing Page + Onboarding (Days 16-18)
**Agent: DESIGN-SYS** (returns)
```
Task: Build the marketing landing page and 60-second onboarding
Landing Page:
- Hero: gradient text headline, demo video embed, dual CTAs
- Value props: 3 cards (Upload → Customize → Deploy)
- Social proof: "Built on" logos (MCP, Anthropic, Cloudflare)
- Template showcase: 6 featured from marketplace
- Pricing: 4 tier cards from PRODUCT-SPEC.md
- Final CTA: email capture
Onboarding (per UX-DESIGN-SPEC.md):
- Welcome → paste spec → watch analysis → see tools → deploy → confetti
- 60-second target, minimal clicks
- Guided tooltip overlays for first-time users
```
### Sprint 4B: Testing Dashboard (Days 16-18)
**Agent: AI-PIPE** (returns)
```
Task: Build the in-app testing playground
Deliverables:
├── apps/web/app/(dashboard)/projects/[id]/test/
│ └── page.tsx (Testing Dashboard)
└── apps/web/components/testing/
├── TestDashboard.tsx (test layer selector + results)
├── TestRunner.tsx (run button + streaming results)
├── TestResult.tsx (pass/fail card with details)
├── ToolPlayground.tsx (manual tool invocation — input JSON → run → see output)
└── LLMSandbox.tsx (chat with your MCP server through Claude)
Test layers available:
1. Protocol compliance (MCP Inspector equivalent)
2. Static analysis (TypeScript build check)
3. Tool invocation (run each tool with sample data)
4. Schema validation (input/output match)
```
### Sprint 4C: End-to-End Integration (Days 18-20)
**Agent: BUBA (me)**
```
Task: Wire everything together, fix integration issues, e2e test
- Connect all pages via NavRail navigation
- Ensure project state flows: create → analyze → edit → test → deploy
- Dashboard shows real project status
- Marketplace fork → editor works end-to-end
- Auth gates all authenticated routes
- Error boundaries on every page
- Loading states on every async operation
- Mobile responsive check (dashboard + marketplace)
- Performance: LCP < 2s, editor load < 3s
- Final deploy to Vercel
```
---
## Dependency Graph
```
Week 1:
SCAFFOLD ─────────┐
├──→ DESIGN-SYS (components)
├──→ BACKEND (DB + auth + API)
Week 2: │
DESIGN-SYS done ───┤
BACKEND done ──────┼──→ CANVAS (tool editor)
├──→ AI-PIPE (skill engine)
└──→ BACKEND cont. (spec upload)
Week 3:
CANVAS done ───────┤
AI-PIPE done ──────┼──→ APP-DESIGNER (WYSIWYG)
├──→ DEPLOY (hosting pipeline)
└──→ MARKETPLACE (templates)
Week 4:
All features ──────┼──→ DESIGN-SYS (landing + onboarding)
├──→ AI-PIPE (testing dashboard)
└──→ BUBA (integration + polish)
```
---
## Agent Communication Protocol
### How Agents Share Work
1. **All code goes to:** `mcpengine-studio/` workspace directory
2. **Each agent writes to its designated directories** (no conflicts)
3. **Shared interfaces** defined in `packages/ai-pipeline/types.ts` — BACKEND writes first, others import
4. **Buba reviews** every deliverable before next agent starts dependent work
5. **Integration issues** flagged back to Buba for resolution
### Agent Task Format
Each agent receives:
```
TASK: [specific deliverable]
WRITE TO: [exact file paths]
DEPENDS ON: [files that must exist first]
INTERFACES: [TypeScript types to import/implement]
ACCEPTANCE: [how Buba will verify completion]
REFERENCE: [which docs to read — PRODUCT-SPEC.md, TECHNICAL-ARCHITECTURE.md, etc.]
```
### Quality Gates
| Gate | Check | Blocker? |
|------|-------|----------|
| TypeScript compiles | `pnpm build` passes | Yes |
| No lint errors | `pnpm lint` passes | Yes |
| Component renders | Visual check in browser | Yes |
| API endpoint works | curl test returns expected data | Yes |
| Matches design spec | Colors/spacing match UX doc | Soft |
| Accessible | Focus rings, aria labels present | Soft |
---
## Risk Mitigations
| Risk | Mitigation |
|------|-----------|
| Agent timeout (5 min) | Break tasks into smaller chunks — 1-3 files per agent call, not entire features |
| Integration conflicts | Shared types defined upfront, strict directory ownership |
| Scope creep | V1 = spec upload + tool editor + deploy ONLY. No apps designer in V1. |
| API key costs | Use Sonnet for generation (not Opus) — $0.22/pipeline run |
| Agent writes bad code | Buba reviews + runs TypeScript compiler before accepting |
| Feature doesn't work e2e | Integration sprint (Week 4) dedicated to wiring + fixing |
---
## V1 MVP Definition (Ship in 4 Weeks)
**In scope:**
- ✅ Landing page + sign up
- ✅ Dashboard with project grid
- ✅ Spec upload (URL paste, file upload)
- ✅ AI analysis (streaming tool discovery)
- ✅ Visual tool editor (React Flow canvas)
- ✅ Tool inspector (params, auth, annotations)
- ✅ Deploy to MCPEngine hosting (Cloudflare Workers)
- ✅ Download as zip
- ✅ Marketplace (browse + fork 37 templates)
- ✅ Basic testing (tool invocation playground)
**V2 (Weeks 5-8):**
- MCP App Designer (WYSIWYG)
- npm publish
- Docker export
- LLM sandbox testing
- User-submitted marketplace templates
**V3 (Months 3-6):**
- Team collaboration (multiplayer canvas)
- Enterprise SSO
- Stripe billing
- Custom domains for hosted servers
- Smithery auto-publish
---
## Execution: Day-by-Day Schedule
### Week 1
| Day | Agent | Task | Hours |
|-----|-------|------|-------|
| Mon | SCAFFOLD | Bootstrap monorepo, Next.js, Tailwind, Turbo | 2-3h |
| Mon-Tue | BACKEND | DB schema, Drizzle, migrations, Clerk auth | 3-4h |
| Tue-Wed | DESIGN-SYS | Component library (all 13+ components) | 4-5h |
| Wed-Thu | BACKEND | Projects CRUD API, spec upload endpoint | 2-3h |
| Thu-Fri | DESIGN-SYS | AppShell layout, NavRail, Inspector, themes | 2-3h |
### Week 2
| Day | Agent | Task | Hours |
|-----|-------|------|-------|
| Mon-Tue | AI-PIPE | Skill loader, analyzer service, SSE streaming | 3-4h |
| Mon-Wed | CANVAS | React Flow setup, ToolNode, GroupNode, canvas state | 4-5h |
| Wed-Thu | AI-PIPE | Generator service, streaming file output | 3-4h |
| Thu-Fri | CANVAS | Inspector panels (params, auth, annotations) | 3-4h |
| Fri | BACKEND | Spec upload UI, analysis streaming page | 2-3h |
### Week 3
| Day | Agent | Task | Hours |
|-----|-------|------|-------|
| Mon-Tue | DEPLOY | Cloudflare Workers pipeline, compiler, DNS | 3-4h |
| Mon-Tue | MARKETPLACE | DB seed script, browse page, search | 3-4h |
| Wed-Thu | DEPLOY | Deploy UI (stepper, logs, confetti) | 2-3h |
| Wed-Thu | MARKETPLACE | Template detail, fork flow, categories | 2-3h |
| Fri | AI-PIPE | Testing playground (tool invocation) | 2-3h |
### Week 4
| Day | Agent | Task | Hours |
|-----|-------|------|-------|
| Mon | DESIGN-SYS | Landing page, pricing section | 2-3h |
| Mon-Tue | DESIGN-SYS | Onboarding flow (60-second wizard) | 2-3h |
| Tue-Wed | BUBA | Wire all pages, NavRail routing, project flow | 3-4h |
| Wed-Thu | BUBA | E2E testing, bug fixes, error boundaries | 3-4h |
| Fri | BUBA | Deploy to Vercel, final check, launch prep | 2-3h |
---
## Launch Checklist
- [ ] Landing page live at mcpengine.com
- [ ] Sign up / sign in working
- [ ] Can create project from spec URL
- [ ] AI analysis streams tool discovery
- [ ] Tool editor canvas fully functional
- [ ] Inspector edits persist
- [ ] Deploy to MCPEngine hosting works
- [ ] Download zip works
- [ ] 37 templates browseable in marketplace
- [ ] Fork template → edit → deploy flow works
- [ ] Mobile-friendly dashboard + marketplace
- [ ] Error states on all pages
- [ ] Loading states on all async ops
- [ ] Vercel deployment stable
- [ ] Domain configured
- [ ] Analytics (Vercel Analytics or PostHog)
**Ship it.** ᕕ( ᐛ )ᕗ
---
*Last updated: February 6, 2026*

View File

@ -0,0 +1,18 @@
{
"pages": {
"/_not-found/page": [
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_app_globals_cfa39e1d.css",
"static/chunks/7a4c8_next_dist_d8f42c41._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_app_layout_tsx_03cdabae._.js",
"static/chunks/[turbopack]_browser_dev_hmr-client_hmr-client_ts_20e8c980._.js",
"static/chunks/7a4c8_next_dist_compiled_react-dom_5f4745e6._.js",
"static/chunks/7a4c8_next_dist_compiled_next-devtools_index_9b3ef8ee.js",
"static/chunks/7a4c8_next_dist_compiled_6f71cf01._.js",
"static/chunks/7a4c8_next_dist_client_2aced240._.js",
"static/chunks/7a4c8_next_dist_b6a739f4._.js",
"static/chunks/861ec_@swc_helpers_cjs_4c580dff._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_a0ff3932._.js",
"static/chunks/turbopack-_clawdbot_workspace_mcpengine-studio_apps_web_822a5ec5._.js"
]
}
}

View File

@ -0,0 +1,18 @@
{
"/_not-found/page": "/_not-found",
"/api/marketplace/[id]/fork/route": "/api/marketplace/[id]/fork",
"/api/marketplace/route": "/api/marketplace",
"/api/projects/[id]/route": "/api/projects/[id]",
"/api/projects/route": "/api/projects",
"/api/analyze/route": "/api/analyze",
"/api/deploy/route": "/api/deploy",
"/api/generate/route": "/api/generate",
"/api/test/route": "/api/test",
"/(marketing)/page": "/",
"/dashboard/marketplace/[templateId]/page": "/dashboard/marketplace/[templateId]",
"/dashboard/page": "/dashboard",
"/dashboard/projects/new/page": "/dashboard/projects/new",
"/dashboard/marketplace/page": "/dashboard/marketplace",
"/dashboard/projects/[id]/page": "/dashboard/projects/[id]",
"/dashboard/projects/[id]/deploy/page": "/dashboard/projects/[id]/deploy"
}

View File

@ -0,0 +1,26 @@
{
"pages": {
"/_app": []
},
"devFiles": [],
"ampDevFiles": [],
"polyfillFiles": [
"static/chunks/7a4c8_next_dist_build_polyfills_polyfill-nomodule.js"
],
"lowPriorityFiles": [
"static/development/_ssgManifest.js",
"static/development/_buildManifest.js"
],
"rootMainFiles": [
"static/chunks/[turbopack]_browser_dev_hmr-client_hmr-client_ts_20e8c980._.js",
"static/chunks/7a4c8_next_dist_compiled_react-dom_5f4745e6._.js",
"static/chunks/7a4c8_next_dist_compiled_next-devtools_index_9b3ef8ee.js",
"static/chunks/7a4c8_next_dist_compiled_6f71cf01._.js",
"static/chunks/7a4c8_next_dist_client_2aced240._.js",
"static/chunks/7a4c8_next_dist_b6a739f4._.js",
"static/chunks/861ec_@swc_helpers_cjs_4c580dff._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_a0ff3932._.js",
"static/chunks/turbopack-_clawdbot_workspace_mcpengine-studio_apps_web_822a5ec5._.js"
],
"ampFirstPages": []
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,507 @@
module.exports = [
"[turbopack-node]/globals.ts [postcss] (ecmascript)", ((__turbopack_context__, module, exports) => {
// @ts-ignore
process.turbopack = {};
}),
"[externals]/node:net [external] (node:net, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("node:net", () => require("node:net"));
module.exports = mod;
}),
"[externals]/node:stream [external] (node:stream, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("node:stream", () => require("node:stream"));
module.exports = mod;
}),
"[turbopack-node]/compiled/stacktrace-parser/index.js [postcss] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"parse",
()=>parse
]);
if (typeof __nccwpck_require__ !== "undefined") __nccwpck_require__.ab = ("TURBOPACK compile-time value", "/ROOT/compiled/stacktrace-parser") + "/";
var n = "<unknown>";
function parse(e) {
var r = e.split("\n");
return r.reduce(function(e, r) {
var n = parseChrome(r) || parseWinjs(r) || parseGecko(r) || parseNode(r) || parseJSC(r);
if (n) {
e.push(n);
}
return e;
}, []);
}
var a = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
var l = /\((\S*)(?::(\d+))(?::(\d+))\)/;
function parseChrome(e) {
var r = a.exec(e);
if (!r) {
return null;
}
var u = r[2] && r[2].indexOf("native") === 0;
var t = r[2] && r[2].indexOf("eval") === 0;
var i = l.exec(r[2]);
if (t && i != null) {
r[2] = i[1];
r[3] = i[2];
r[4] = i[3];
}
return {
file: !u ? r[2] : null,
methodName: r[1] || n,
arguments: u ? [
r[2]
] : [],
lineNumber: r[3] ? +r[3] : null,
column: r[4] ? +r[4] : null
};
}
var u = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
function parseWinjs(e) {
var r = u.exec(e);
if (!r) {
return null;
}
return {
file: r[2],
methodName: r[1] || n,
arguments: [],
lineNumber: +r[3],
column: r[4] ? +r[4] : null
};
}
var t = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i;
var i = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
function parseGecko(e) {
var r = t.exec(e);
if (!r) {
return null;
}
var a = r[3] && r[3].indexOf(" > eval") > -1;
var l = i.exec(r[3]);
if (a && l != null) {
r[3] = l[1];
r[4] = l[2];
r[5] = null;
}
return {
file: r[3],
methodName: r[1] || n,
arguments: r[2] ? r[2].split(",") : [],
lineNumber: r[4] ? +r[4] : null,
column: r[5] ? +r[5] : null
};
}
var s = /^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i;
function parseJSC(e) {
var r = s.exec(e);
if (!r) {
return null;
}
return {
file: r[3],
methodName: r[1] || n,
arguments: [],
lineNumber: +r[4],
column: r[5] ? +r[5] : null
};
}
var o = /^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i;
function parseNode(e) {
var r = o.exec(e);
if (!r) {
return null;
}
return {
file: r[2],
methodName: r[1] || n,
arguments: [],
lineNumber: +r[3],
column: r[4] ? +r[4] : null
};
}
}),
"[turbopack-node]/ipc/error.ts [postcss] (ecmascript)", ((__turbopack_context__) => {
"use strict";
// merged from next.js
// https://github.com/vercel/next.js/blob/e657741b9908cf0044aaef959c0c4defb19ed6d8/packages/next/src/lib/is-error.ts
// https://github.com/vercel/next.js/blob/e657741b9908cf0044aaef959c0c4defb19ed6d8/packages/next/src/shared/lib/is-plain-object.ts
__turbopack_context__.s([
"default",
()=>isError,
"getProperError",
()=>getProperError
]);
function isError(err) {
return typeof err === 'object' && err !== null && 'name' in err && 'message' in err;
}
function getProperError(err) {
if (isError(err)) {
return err;
}
if ("TURBOPACK compile-time truthy", 1) {
// Provide a better error message for cases where `throw undefined`
// is called in development
if (typeof err === 'undefined') {
return new Error('`undefined` was thrown instead of a real error');
}
if (err === null) {
return new Error('`null` was thrown instead of a real error');
}
}
return new Error(isPlainObject(err) ? JSON.stringify(err) : err + '');
}
function getObjectClassLabel(value) {
return Object.prototype.toString.call(value);
}
function isPlainObject(value) {
if (getObjectClassLabel(value) !== '[object Object]') {
return false;
}
const prototype = Object.getPrototypeOf(value);
/**
* this used to be previously:
*
* `return prototype === null || prototype === Object.prototype`
*
* but Edge Runtime expose Object from vm, being that kind of type-checking wrongly fail.
*
* It was changed to the current implementation since it's resilient to serialization.
*/ return prototype === null || prototype.hasOwnProperty('isPrototypeOf');
}
}),
"[turbopack-node]/ipc/index.ts [postcss] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"IPC",
()=>IPC,
"structuredError",
()=>structuredError
]);
var __TURBOPACK__imported__module__$5b$externals$5d2f$node$3a$net__$5b$external$5d$__$28$node$3a$net$2c$__cjs$29$__ = __turbopack_context__.i("[externals]/node:net [external] (node:net, cjs)");
var __TURBOPACK__imported__module__$5b$externals$5d2f$node$3a$stream__$5b$external$5d$__$28$node$3a$stream$2c$__cjs$29$__ = __turbopack_context__.i("[externals]/node:stream [external] (node:stream, cjs)");
var __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$compiled$2f$stacktrace$2d$parser$2f$index$2e$js__$5b$postcss$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[turbopack-node]/compiled/stacktrace-parser/index.js [postcss] (ecmascript)");
var __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$ipc$2f$error$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[turbopack-node]/ipc/error.ts [postcss] (ecmascript)");
;
;
;
;
function structuredError(e) {
e = (0, __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$ipc$2f$error$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__["getProperError"])(e);
return {
name: e.name,
message: e.message,
stack: typeof e.stack === 'string' ? (0, __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$compiled$2f$stacktrace$2d$parser$2f$index$2e$js__$5b$postcss$5d$__$28$ecmascript$29$__["parse"])(e.stack) : [],
cause: e.cause ? structuredError((0, __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$ipc$2f$error$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__["getProperError"])(e.cause)) : undefined
};
}
function createIpc(port) {
const socket = (0, __TURBOPACK__imported__module__$5b$externals$5d2f$node$3a$net__$5b$external$5d$__$28$node$3a$net$2c$__cjs$29$__["createConnection"])({
port,
host: '127.0.0.1'
});
/**
* A writable stream that writes to the socket.
* We don't write directly to the socket because we need to
* handle backpressure and wait for the socket to be drained
* before writing more data.
*/ const socketWritable = new __TURBOPACK__imported__module__$5b$externals$5d2f$node$3a$stream__$5b$external$5d$__$28$node$3a$stream$2c$__cjs$29$__["Writable"]({
write (chunk, _enc, cb) {
if (socket.write(chunk)) {
cb();
} else {
socket.once('drain', cb);
}
},
final (cb) {
socket.end(cb);
}
});
const packetQueue = [];
const recvPromiseResolveQueue = [];
function pushPacket(packet) {
const recvPromiseResolve = recvPromiseResolveQueue.shift();
if (recvPromiseResolve != null) {
recvPromiseResolve(JSON.parse(packet.toString('utf8')));
} else {
packetQueue.push(packet);
}
}
let state = {
type: 'waiting'
};
let buffer = Buffer.alloc(0);
socket.once('connect', ()=>{
socket.on('data', (chunk)=>{
buffer = Buffer.concat([
buffer,
chunk
]);
loop: while(true){
switch(state.type){
case 'waiting':
{
if (buffer.length >= 4) {
const length = buffer.readUInt32BE(0);
buffer = buffer.subarray(4);
state = {
type: 'packet',
length
};
} else {
break loop;
}
break;
}
case 'packet':
{
if (buffer.length >= state.length) {
const packet = buffer.subarray(0, state.length);
buffer = buffer.subarray(state.length);
state = {
type: 'waiting'
};
pushPacket(packet);
} else {
break loop;
}
break;
}
default:
invariant(state, (state)=>`Unknown state type: ${state?.type}`);
}
}
});
});
// When the socket is closed, this process is no longer needed.
// This might happen e. g. when parent process is killed or
// node.js pool is garbage collected.
socket.once('close', ()=>{
process.exit(0);
});
// TODO(lukesandberg): some of the messages being sent are very large and contain lots
// of redundant information. Consider adding gzip compression to our stream.
function doSend(message) {
return new Promise((resolve, reject)=>{
// Reserve 4 bytes for our length prefix, we will over-write after encoding.
const packet = Buffer.from('0000' + message, 'utf8');
packet.writeUInt32BE(packet.length - 4, 0);
socketWritable.write(packet, (err)=>{
process.stderr.write(`TURBOPACK_OUTPUT_D\n`);
process.stdout.write(`TURBOPACK_OUTPUT_D\n`);
if (err != null) {
reject(err);
} else {
resolve();
}
});
});
}
function send(message) {
return doSend(JSON.stringify(message));
}
function sendReady() {
return doSend('');
}
return {
async recv () {
const packet = packetQueue.shift();
if (packet != null) {
return JSON.parse(packet.toString('utf8'));
}
const result = await new Promise((resolve)=>{
recvPromiseResolveQueue.push((result)=>{
resolve(result);
});
});
return result;
},
send (message) {
return send(message);
},
sendReady,
async sendError (error) {
let failed = false;
try {
await send({
type: 'error',
...structuredError(error)
});
} catch (err) {
// There's nothing we can do about errors that happen after this point, we can't tell anyone
// about them.
console.error('failed to send error back to rust:', err);
failed = true;
}
await new Promise((res)=>socket.end(()=>res()));
process.exit(failed ? 1 : 0);
}
};
}
const PORT = process.argv[2];
const IPC = createIpc(parseInt(PORT, 10));
process.on('uncaughtException', (err)=>{
IPC.sendError(err);
});
const improveConsole = (name, stream, addStack)=>{
// @ts-ignore
const original = console[name];
// @ts-ignore
const stdio = process[stream];
// @ts-ignore
console[name] = (...args)=>{
stdio.write(`TURBOPACK_OUTPUT_B\n`);
original(...args);
if (addStack) {
const stack = new Error().stack?.replace(/^.+\n.+\n/, '') + '\n';
stdio.write('TURBOPACK_OUTPUT_S\n');
stdio.write(stack);
}
stdio.write('TURBOPACK_OUTPUT_E\n');
};
};
improveConsole('error', 'stderr', true);
improveConsole('warn', 'stderr', true);
improveConsole('count', 'stdout', true);
improveConsole('trace', 'stderr', false);
improveConsole('log', 'stdout', true);
improveConsole('group', 'stdout', true);
improveConsole('groupCollapsed', 'stdout', true);
improveConsole('table', 'stdout', true);
improveConsole('debug', 'stdout', true);
improveConsole('info', 'stdout', true);
improveConsole('dir', 'stdout', true);
improveConsole('dirxml', 'stdout', true);
improveConsole('timeEnd', 'stdout', true);
improveConsole('timeLog', 'stdout', true);
improveConsole('timeStamp', 'stdout', true);
improveConsole('assert', 'stderr', true);
/**
* Utility function to ensure all variants of an enum are handled.
*/ function invariant(never, computeMessage) {
throw new Error(`Invariant: ${computeMessage(never)}`);
}
}),
"[turbopack-node]/ipc/evaluate.ts [postcss] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"run",
()=>run
]);
var __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$ipc$2f$index$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[turbopack-node]/ipc/index.ts [postcss] (ecmascript)");
;
const ipc = __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$ipc$2f$index$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__["IPC"];
const queue = [];
const run = async (moduleFactory)=>{
let nextId = 1;
const requests = new Map();
const internalIpc = {
sendInfo: (message)=>ipc.send({
type: 'info',
data: message
}),
sendRequest: (message)=>{
const id = nextId++;
let resolve, reject;
const promise = new Promise((res, rej)=>{
resolve = res;
reject = rej;
});
requests.set(id, {
resolve,
reject
});
return ipc.send({
type: 'request',
id,
data: message
}).then(()=>promise);
},
sendError: (error)=>{
return ipc.sendError(error);
}
};
// Initialize module and send ready message
let getValue;
try {
const module = await moduleFactory();
if (typeof module.init === 'function') {
await module.init();
}
getValue = module.default;
await ipc.sendReady();
} catch (err) {
await ipc.sendReady();
await ipc.sendError(err);
}
// Queue handling
let isRunning = false;
const run = async ()=>{
while(queue.length > 0){
const args = queue.shift();
try {
const value = await getValue(internalIpc, ...args);
await ipc.send({
type: 'end',
data: value === undefined ? undefined : JSON.stringify(value, null, 2),
duration: 0
});
} catch (e) {
await ipc.sendError(e);
}
}
isRunning = false;
};
// Communication handling
while(true){
const msg = await ipc.recv();
switch(msg.type){
case 'evaluate':
{
queue.push(msg.args);
if (!isRunning) {
isRunning = true;
run();
}
break;
}
case 'result':
{
const request = requests.get(msg.id);
if (request) {
requests.delete(msg.id);
if (msg.error) {
request.reject(new Error(msg.error));
} else {
request.resolve(msg.data);
}
}
break;
}
default:
{
console.error('unexpected message type', msg.type);
process.exit(1);
}
}
}
};
}),
"[turbopack-node]/ipc/evaluate.ts/evaluate.js { INNER => \"[turbopack-node]/transforms/postcss.ts { CONFIG => \\\"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/postcss.config.mjs [postcss] (ecmascript)\\\" } [postcss] (ecmascript)\", RUNTIME => \"[turbopack-node]/ipc/evaluate.ts [postcss] (ecmascript)\" } [postcss] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([]);
var __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$ipc$2f$evaluate$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[turbopack-node]/ipc/evaluate.ts [postcss] (ecmascript)");
;
(0, __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$ipc$2f$evaluate$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__["run"])(()=>__turbopack_context__.A('[turbopack-node]/transforms/postcss.ts { CONFIG => "[project]/.clawdbot/workspace/mcpengine-studio/apps/web/postcss.config.mjs [postcss] (ecmascript)" } [postcss] (ecmascript, async loader)'));
}),
];
//# sourceMappingURL=%5Broot-of-the-server%5D__ae76b844._.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,206 @@
module.exports = [
"[externals]/path [external] (path, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("path", () => require("path"));
module.exports = mod;
}),
"[externals]/url [external] (url, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("url", () => require("url"));
module.exports = mod;
}),
"[externals]/fs [external] (fs, cjs)", ((__turbopack_context__, module, exports) => {
const mod = __turbopack_context__.x("fs", () => require("fs"));
module.exports = mod;
}),
"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/postcss.config.mjs [postcss] (ecmascript)", ((__turbopack_context__) => {
"use strict";
/** @type {import('postcss-load-config').Config} */ __turbopack_context__.s([
"default",
()=>__TURBOPACK__default__export__
]);
const config = {
plugins: {
'@tailwindcss/postcss': {}
}
};
const __TURBOPACK__default__export__ = config;
}),
"[turbopack-node]/transforms/transforms.ts [postcss] (ecmascript)", ((__turbopack_context__) => {
"use strict";
/**
* Shared utilities for our 2 transform implementations.
*/ __turbopack_context__.s([
"fromPath",
()=>fromPath,
"getReadEnvVariables",
()=>getReadEnvVariables,
"toPath",
()=>toPath
]);
var __TURBOPACK__imported__module__$5b$externals$5d2f$path__$5b$external$5d$__$28$path$2c$__cjs$29$__ = __turbopack_context__.i("[externals]/path [external] (path, cjs)");
;
const contextDir = process.cwd();
const toPath = (file)=>{
const relPath = (0, __TURBOPACK__imported__module__$5b$externals$5d2f$path__$5b$external$5d$__$28$path$2c$__cjs$29$__["relative"])(contextDir, file);
if ((0, __TURBOPACK__imported__module__$5b$externals$5d2f$path__$5b$external$5d$__$28$path$2c$__cjs$29$__["isAbsolute"])(relPath)) {
throw new Error(`Cannot depend on path (${file}) outside of root directory (${contextDir})`);
}
return __TURBOPACK__imported__module__$5b$externals$5d2f$path__$5b$external$5d$__$28$path$2c$__cjs$29$__["sep"] !== '/' ? relPath.replaceAll(__TURBOPACK__imported__module__$5b$externals$5d2f$path__$5b$external$5d$__$28$path$2c$__cjs$29$__["sep"], '/') : relPath;
};
const fromPath = (path)=>{
return (0, __TURBOPACK__imported__module__$5b$externals$5d2f$path__$5b$external$5d$__$28$path$2c$__cjs$29$__["join"])(contextDir, __TURBOPACK__imported__module__$5b$externals$5d2f$path__$5b$external$5d$__$28$path$2c$__cjs$29$__["sep"] !== '/' ? path.replaceAll('/', __TURBOPACK__imported__module__$5b$externals$5d2f$path__$5b$external$5d$__$28$path$2c$__cjs$29$__["sep"]) : path);
};
// Patch process.env to track which env vars are read
const originalEnv = process.env;
const readEnvVars = new Set();
process.env = new Proxy(originalEnv, {
get (target, prop) {
if (typeof prop === 'string') {
// We register the env var as dependency on the
// current transform and all future transforms
// since the env var might be cached in module scope
// and influence them all
readEnvVars.add(prop);
}
return Reflect.get(target, prop);
},
set (target, prop, value) {
return Reflect.set(target, prop, value);
}
});
function getReadEnvVariables() {
return Array.from(readEnvVars);
}
}),
"[turbopack-node]/transforms/postcss.ts { CONFIG => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/postcss.config.mjs [postcss] (ecmascript)\" } [postcss] (ecmascript)", ((__turbopack_context__) => {
"use strict";
__turbopack_context__.s([
"default",
()=>transform,
"init",
()=>init
]);
// @ts-ignore
var __TURBOPACK__imported__module__$5b$project$5d2f2e$clawdbot$2f$workspace$2f$mcpengine$2d$studio$2f$node_modules$2f2e$pnpm$2f$postcss$40$8$2e$5$2e$6$2f$node_modules$2f$postcss$2f$lib$2f$postcss$2e$mjs__$5b$postcss$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/postcss@8.5.6/node_modules/postcss/lib/postcss.mjs [postcss] (ecmascript)");
// @ts-ignore
var __TURBOPACK__imported__module__$5b$project$5d2f2e$clawdbot$2f$workspace$2f$mcpengine$2d$studio$2f$apps$2f$web$2f$postcss$2e$config$2e$mjs__$5b$postcss$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[project]/.clawdbot/workspace/mcpengine-studio/apps/web/postcss.config.mjs [postcss] (ecmascript)");
var __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$transforms$2f$transforms$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__ = __turbopack_context__.i("[turbopack-node]/transforms/transforms.ts [postcss] (ecmascript)");
;
;
;
let processor;
const init = async (ipc)=>{
let config = __TURBOPACK__imported__module__$5b$project$5d2f2e$clawdbot$2f$workspace$2f$mcpengine$2d$studio$2f$apps$2f$web$2f$postcss$2e$config$2e$mjs__$5b$postcss$5d$__$28$ecmascript$29$__["default"];
if (typeof config === 'function') {
config = await config({
env: 'development'
});
}
if (typeof config === 'undefined') {
throw new Error('PostCSS config is undefined (make sure to export an function or object from config file)');
}
let plugins;
if (Array.isArray(config.plugins)) {
plugins = config.plugins.map((plugin)=>{
if (Array.isArray(plugin)) {
return plugin;
} else if (typeof plugin === 'string') {
return [
plugin,
{}
];
} else {
return plugin;
}
});
} else if (typeof config.plugins === 'object') {
plugins = Object.entries(config.plugins).filter(([, options])=>options);
} else {
plugins = [];
}
const loadedPlugins = plugins.map((plugin)=>{
if (Array.isArray(plugin)) {
const [arg, options] = plugin;
let pluginFactory = arg;
if (typeof pluginFactory === 'string') {
pluginFactory = require(/* turbopackIgnore: true */ pluginFactory);
}
if (pluginFactory.default) {
pluginFactory = pluginFactory.default;
}
return pluginFactory(options);
}
return plugin;
});
processor = (0, __TURBOPACK__imported__module__$5b$project$5d2f2e$clawdbot$2f$workspace$2f$mcpengine$2d$studio$2f$node_modules$2f2e$pnpm$2f$postcss$40$8$2e$5$2e$6$2f$node_modules$2f$postcss$2f$lib$2f$postcss$2e$mjs__$5b$postcss$5d$__$28$ecmascript$29$__["default"])(loadedPlugins);
};
async function transform(ipc, cssContent, name, sourceMap) {
const { css, map, messages } = await processor.process(cssContent, {
from: name,
to: name,
map: sourceMap ? {
inline: false,
annotation: false
} : undefined
});
const assets = [];
const filePaths = [];
const buildFilePaths = [];
const directories = [];
for (const msg of messages){
switch(msg.type){
case 'asset':
assets.push({
file: msg.file,
content: msg.content,
sourceMap: !sourceMap ? undefined : typeof msg.sourceMap === 'string' ? msg.sourceMap : JSON.stringify(msg.sourceMap)
});
break;
case 'dependency':
case 'missing-dependency':
filePaths.push((0, __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$transforms$2f$transforms$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__["toPath"])(msg.file));
break;
case 'build-dependency':
buildFilePaths.push((0, __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$transforms$2f$transforms$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__["toPath"])(msg.file));
break;
case 'dir-dependency':
directories.push([
(0, __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$transforms$2f$transforms$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__["toPath"])(msg.dir),
msg.glob
]);
break;
case 'context-dependency':
directories.push([
(0, __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$transforms$2f$transforms$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__["toPath"])(msg.dir),
'**'
]);
break;
default:
break;
}
}
ipc.sendInfo({
type: 'dependencies',
filePaths,
directories,
buildFilePaths,
envVariables: (0, __TURBOPACK__imported__module__$5b$turbopack$2d$node$5d2f$transforms$2f$transforms$2e$ts__$5b$postcss$5d$__$28$ecmascript$29$__["getReadEnvVariables"])()
});
return {
css,
map: sourceMap ? JSON.stringify(map) : undefined,
assets
};
}
}),
];
//# sourceMappingURL=%5Broot-of-the-server%5D__e6a5a026._.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,13 @@
module.exports = [
"[turbopack-node]/transforms/postcss.ts { CONFIG => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/postcss.config.mjs [postcss] (ecmascript)\" } [postcss] (ecmascript, async loader)", ((__turbopack_context__) => {
__turbopack_context__.v((parentImport) => {
return Promise.all([
"build/chunks/092de__pnpm_02371864._.js",
"build/chunks/[root-of-the-server]__e6a5a026._.js"
].map((chunk) => __turbopack_context__.l(chunk))).then(() => {
return parentImport("[turbopack-node]/transforms/postcss.ts { CONFIG => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/postcss.config.mjs [postcss] (ecmascript)\" } [postcss] (ecmascript)");
});
});
}),
];

View File

@ -0,0 +1,5 @@
{
"version": 3,
"sources": [],
"sections": []
}

View File

@ -0,0 +1,757 @@
const RUNTIME_PUBLIC_PATH = "build/chunks/[turbopack]_runtime.js";
const RELATIVE_ROOT_PATH = "../../../../../..";
const ASSET_PREFIX = "/";
/**
* This file contains runtime types and functions that are shared between all
* TurboPack ECMAScript runtimes.
*
* It will be prepended to the runtime code of each runtime.
*/ /* eslint-disable @typescript-eslint/no-unused-vars */ /// <reference path="./runtime-types.d.ts" />
const REEXPORTED_OBJECTS = new WeakMap();
/**
* Constructs the `__turbopack_context__` object for a module.
*/ function Context(module, exports) {
this.m = module;
// We need to store this here instead of accessing it from the module object to:
// 1. Make it available to factories directly, since we rewrite `this` to
// `__turbopack_context__.e` in CJS modules.
// 2. Support async modules which rewrite `module.exports` to a promise, so we
// can still access the original exports object from functions like
// `esmExport`
// Ideally we could find a new approach for async modules and drop this property altogether.
this.e = exports;
}
const contextPrototype = Context.prototype;
const hasOwnProperty = Object.prototype.hasOwnProperty;
const toStringTag = typeof Symbol !== 'undefined' && Symbol.toStringTag;
function defineProp(obj, name, options) {
if (!hasOwnProperty.call(obj, name)) Object.defineProperty(obj, name, options);
}
function getOverwrittenModule(moduleCache, id) {
let module = moduleCache[id];
if (!module) {
// This is invoked when a module is merged into another module, thus it wasn't invoked via
// instantiateModule and the cache entry wasn't created yet.
module = createModuleObject(id);
moduleCache[id] = module;
}
return module;
}
/**
* Creates the module object. Only done here to ensure all module objects have the same shape.
*/ function createModuleObject(id) {
return {
exports: {},
error: undefined,
id,
namespaceObject: undefined
};
}
/**
* Adds the getters to the exports object.
*/ function esm(exports, getters) {
defineProp(exports, '__esModule', {
value: true
});
if (toStringTag) defineProp(exports, toStringTag, {
value: 'Module'
});
let i = 0;
while(i < getters.length){
const propName = getters[i++];
// TODO(luke.sandberg): we could support raw values here, but would need a discriminator beyond 'not a function'
const getter = getters[i++];
if (typeof getters[i] === 'function') {
// a setter
defineProp(exports, propName, {
get: getter,
set: getters[i++],
enumerable: true
});
} else {
defineProp(exports, propName, {
get: getter,
enumerable: true
});
}
}
Object.seal(exports);
}
/**
* Makes the module an ESM with exports
*/ function esmExport(getters, id) {
let module;
let exports;
if (id != null) {
module = getOverwrittenModule(this.c, id);
exports = module.exports;
} else {
module = this.m;
exports = this.e;
}
module.namespaceObject = exports;
esm(exports, getters);
}
contextPrototype.s = esmExport;
function ensureDynamicExports(module, exports) {
let reexportedObjects = REEXPORTED_OBJECTS.get(module);
if (!reexportedObjects) {
REEXPORTED_OBJECTS.set(module, reexportedObjects = []);
module.exports = module.namespaceObject = new Proxy(exports, {
get (target, prop) {
if (hasOwnProperty.call(target, prop) || prop === 'default' || prop === '__esModule') {
return Reflect.get(target, prop);
}
for (const obj of reexportedObjects){
const value = Reflect.get(obj, prop);
if (value !== undefined) return value;
}
return undefined;
},
ownKeys (target) {
const keys = Reflect.ownKeys(target);
for (const obj of reexportedObjects){
for (const key of Reflect.ownKeys(obj)){
if (key !== 'default' && !keys.includes(key)) keys.push(key);
}
}
return keys;
}
});
}
return reexportedObjects;
}
/**
* Dynamically exports properties from an object
*/ function dynamicExport(object, id) {
let module;
let exports;
if (id != null) {
module = getOverwrittenModule(this.c, id);
exports = module.exports;
} else {
module = this.m;
exports = this.e;
}
const reexportedObjects = ensureDynamicExports(module, exports);
if (typeof object === 'object' && object !== null) {
reexportedObjects.push(object);
}
}
contextPrototype.j = dynamicExport;
function exportValue(value, id) {
let module;
if (id != null) {
module = getOverwrittenModule(this.c, id);
} else {
module = this.m;
}
module.exports = value;
}
contextPrototype.v = exportValue;
function exportNamespace(namespace, id) {
let module;
if (id != null) {
module = getOverwrittenModule(this.c, id);
} else {
module = this.m;
}
module.exports = module.namespaceObject = namespace;
}
contextPrototype.n = exportNamespace;
function createGetter(obj, key) {
return ()=>obj[key];
}
/**
* @returns prototype of the object
*/ const getProto = Object.getPrototypeOf ? (obj)=>Object.getPrototypeOf(obj) : (obj)=>obj.__proto__;
/** Prototypes that are not expanded for exports */ const LEAF_PROTOTYPES = [
null,
getProto({}),
getProto([]),
getProto(getProto)
];
/**
* @param raw
* @param ns
* @param allowExportDefault
* * `false`: will have the raw module as default export
* * `true`: will have the default property as default export
*/ function interopEsm(raw, ns, allowExportDefault) {
const getters = [];
// The index of the `default` export if any
let defaultLocation = -1;
for(let current = raw; (typeof current === 'object' || typeof current === 'function') && !LEAF_PROTOTYPES.includes(current); current = getProto(current)){
for (const key of Object.getOwnPropertyNames(current)){
getters.push(key, createGetter(raw, key));
if (defaultLocation === -1 && key === 'default') {
defaultLocation = getters.length - 1;
}
}
}
// this is not really correct
// we should set the `default` getter if the imported module is a `.cjs file`
if (!(allowExportDefault && defaultLocation >= 0)) {
// Replace the binding with one for the namespace itself in order to preserve iteration order.
if (defaultLocation >= 0) {
getters[defaultLocation] = ()=>raw;
} else {
getters.push('default', ()=>raw);
}
}
esm(ns, getters);
return ns;
}
function createNS(raw) {
if (typeof raw === 'function') {
return function(...args) {
return raw.apply(this, args);
};
} else {
return Object.create(null);
}
}
function esmImport(id) {
const module = getOrInstantiateModuleFromParent(id, this.m);
// any ES module has to have `module.namespaceObject` defined.
if (module.namespaceObject) return module.namespaceObject;
// only ESM can be an async module, so we don't need to worry about exports being a promise here.
const raw = module.exports;
return module.namespaceObject = interopEsm(raw, createNS(raw), raw && raw.__esModule);
}
contextPrototype.i = esmImport;
function asyncLoader(moduleId) {
const loader = this.r(moduleId);
return loader(this.i.bind(this));
}
contextPrototype.A = asyncLoader;
// Add a simple runtime require so that environments without one can still pass
// `typeof require` CommonJS checks so that exports are correctly registered.
const runtimeRequire = // @ts-ignore
typeof require === 'function' ? require : function require1() {
throw new Error('Unexpected use of runtime require');
};
contextPrototype.t = runtimeRequire;
function commonJsRequire(id) {
return getOrInstantiateModuleFromParent(id, this.m).exports;
}
contextPrototype.r = commonJsRequire;
/**
* `require.context` and require/import expression runtime.
*/ function moduleContext(map) {
function moduleContext(id) {
if (hasOwnProperty.call(map, id)) {
return map[id].module();
}
const e = new Error(`Cannot find module '${id}'`);
e.code = 'MODULE_NOT_FOUND';
throw e;
}
moduleContext.keys = ()=>{
return Object.keys(map);
};
moduleContext.resolve = (id)=>{
if (hasOwnProperty.call(map, id)) {
return map[id].id();
}
const e = new Error(`Cannot find module '${id}'`);
e.code = 'MODULE_NOT_FOUND';
throw e;
};
moduleContext.import = async (id)=>{
return await moduleContext(id);
};
return moduleContext;
}
contextPrototype.f = moduleContext;
/**
* Returns the path of a chunk defined by its data.
*/ function getChunkPath(chunkData) {
return typeof chunkData === 'string' ? chunkData : chunkData.path;
}
function isPromise(maybePromise) {
return maybePromise != null && typeof maybePromise === 'object' && 'then' in maybePromise && typeof maybePromise.then === 'function';
}
function isAsyncModuleExt(obj) {
return turbopackQueues in obj;
}
function createPromise() {
let resolve;
let reject;
const promise = new Promise((res, rej)=>{
reject = rej;
resolve = res;
});
return {
promise,
resolve: resolve,
reject: reject
};
}
// Load the CompressedmoduleFactories of a chunk into the `moduleFactories` Map.
// The CompressedModuleFactories format is
// - 1 or more module ids
// - a module factory function
// So walking this is a little complex but the flat structure is also fast to
// traverse, we can use `typeof` operators to distinguish the two cases.
function installCompressedModuleFactories(chunkModules, offset, moduleFactories, newModuleId) {
let i = offset;
while(i < chunkModules.length){
let moduleId = chunkModules[i];
let end = i + 1;
// Find our factory function
while(end < chunkModules.length && typeof chunkModules[end] !== 'function'){
end++;
}
if (end === chunkModules.length) {
throw new Error('malformed chunk format, expected a factory function');
}
// Each chunk item has a 'primary id' and optional additional ids. If the primary id is already
// present we know all the additional ids are also present, so we don't need to check.
if (!moduleFactories.has(moduleId)) {
const moduleFactoryFn = chunkModules[end];
applyModuleFactoryName(moduleFactoryFn);
newModuleId?.(moduleId);
for(; i < end; i++){
moduleId = chunkModules[i];
moduleFactories.set(moduleId, moduleFactoryFn);
}
}
i = end + 1; // end is pointing at the last factory advance to the next id or the end of the array.
}
}
// everything below is adapted from webpack
// https://github.com/webpack/webpack/blob/6be4065ade1e252c1d8dcba4af0f43e32af1bdc1/lib/runtime/AsyncModuleRuntimeModule.js#L13
const turbopackQueues = Symbol('turbopack queues');
const turbopackExports = Symbol('turbopack exports');
const turbopackError = Symbol('turbopack error');
function resolveQueue(queue) {
if (queue && queue.status !== 1) {
queue.status = 1;
queue.forEach((fn)=>fn.queueCount--);
queue.forEach((fn)=>fn.queueCount-- ? fn.queueCount++ : fn());
}
}
function wrapDeps(deps) {
return deps.map((dep)=>{
if (dep !== null && typeof dep === 'object') {
if (isAsyncModuleExt(dep)) return dep;
if (isPromise(dep)) {
const queue = Object.assign([], {
status: 0
});
const obj = {
[turbopackExports]: {},
[turbopackQueues]: (fn)=>fn(queue)
};
dep.then((res)=>{
obj[turbopackExports] = res;
resolveQueue(queue);
}, (err)=>{
obj[turbopackError] = err;
resolveQueue(queue);
});
return obj;
}
}
return {
[turbopackExports]: dep,
[turbopackQueues]: ()=>{}
};
});
}
function asyncModule(body, hasAwait) {
const module = this.m;
const queue = hasAwait ? Object.assign([], {
status: -1
}) : undefined;
const depQueues = new Set();
const { resolve, reject, promise: rawPromise } = createPromise();
const promise = Object.assign(rawPromise, {
[turbopackExports]: module.exports,
[turbopackQueues]: (fn)=>{
queue && fn(queue);
depQueues.forEach(fn);
promise['catch'](()=>{});
}
});
const attributes = {
get () {
return promise;
},
set (v) {
// Calling `esmExport` leads to this.
if (v !== promise) {
promise[turbopackExports] = v;
}
}
};
Object.defineProperty(module, 'exports', attributes);
Object.defineProperty(module, 'namespaceObject', attributes);
function handleAsyncDependencies(deps) {
const currentDeps = wrapDeps(deps);
const getResult = ()=>currentDeps.map((d)=>{
if (d[turbopackError]) throw d[turbopackError];
return d[turbopackExports];
});
const { promise, resolve } = createPromise();
const fn = Object.assign(()=>resolve(getResult), {
queueCount: 0
});
function fnQueue(q) {
if (q !== queue && !depQueues.has(q)) {
depQueues.add(q);
if (q && q.status === 0) {
fn.queueCount++;
q.push(fn);
}
}
}
currentDeps.map((dep)=>dep[turbopackQueues](fnQueue));
return fn.queueCount ? promise : getResult();
}
function asyncResult(err) {
if (err) {
reject(promise[turbopackError] = err);
} else {
resolve(promise[turbopackExports]);
}
resolveQueue(queue);
}
body(handleAsyncDependencies, asyncResult);
if (queue && queue.status === -1) {
queue.status = 0;
}
}
contextPrototype.a = asyncModule;
/**
* A pseudo "fake" URL object to resolve to its relative path.
*
* When UrlRewriteBehavior is set to relative, calls to the `new URL()` will construct url without base using this
* runtime function to generate context-agnostic urls between different rendering context, i.e ssr / client to avoid
* hydration mismatch.
*
* This is based on webpack's existing implementation:
* https://github.com/webpack/webpack/blob/87660921808566ef3b8796f8df61bd79fc026108/lib/runtime/RelativeUrlRuntimeModule.js
*/ const relativeURL = function relativeURL(inputUrl) {
const realUrl = new URL(inputUrl, 'x:/');
const values = {};
for(const key in realUrl)values[key] = realUrl[key];
values.href = inputUrl;
values.pathname = inputUrl.replace(/[?#].*/, '');
values.origin = values.protocol = '';
values.toString = values.toJSON = (..._args)=>inputUrl;
for(const key in values)Object.defineProperty(this, key, {
enumerable: true,
configurable: true,
value: values[key]
});
};
relativeURL.prototype = URL.prototype;
contextPrototype.U = relativeURL;
/**
* Utility function to ensure all variants of an enum are handled.
*/ function invariant(never, computeMessage) {
throw new Error(`Invariant: ${computeMessage(never)}`);
}
/**
* A stub function to make `require` available but non-functional in ESM.
*/ function requireStub(_moduleId) {
throw new Error('dynamic usage of require is not supported');
}
contextPrototype.z = requireStub;
// Make `globalThis` available to the module in a way that cannot be shadowed by a local variable.
contextPrototype.g = globalThis;
function applyModuleFactoryName(factory) {
// Give the module factory a nice name to improve stack traces.
Object.defineProperty(factory, 'name', {
value: '__TURBOPACK__module__evaluation__'
});
}
/* eslint-disable @typescript-eslint/no-unused-vars */ /// <reference path="../shared/runtime-utils.ts" />
/// A 'base' utilities to support runtime can have externals.
/// Currently this is for node.js / edge runtime both.
/// If a fn requires node.js specific behavior, it should be placed in `node-external-utils` instead.
async function externalImport(id) {
let raw;
try {
raw = await import(id);
} catch (err) {
// TODO(alexkirsz) This can happen when a client-side module tries to load
// an external module we don't provide a shim for (e.g. querystring, url).
// For now, we fail semi-silently, but in the future this should be a
// compilation error.
throw new Error(`Failed to load external module ${id}: ${err}`);
}
if (raw && raw.__esModule && raw.default && 'default' in raw.default) {
return interopEsm(raw.default, createNS(raw), true);
}
return raw;
}
contextPrototype.y = externalImport;
function externalRequire(id, thunk, esm = false) {
let raw;
try {
raw = thunk();
} catch (err) {
// TODO(alexkirsz) This can happen when a client-side module tries to load
// an external module we don't provide a shim for (e.g. querystring, url).
// For now, we fail semi-silently, but in the future this should be a
// compilation error.
throw new Error(`Failed to load external module ${id}: ${err}`);
}
if (!esm || raw.__esModule) {
return raw;
}
return interopEsm(raw, createNS(raw), true);
}
externalRequire.resolve = (id, options)=>{
return require.resolve(id, options);
};
contextPrototype.x = externalRequire;
/* eslint-disable @typescript-eslint/no-unused-vars */ const path = require('path');
const relativePathToRuntimeRoot = path.relative(RUNTIME_PUBLIC_PATH, '.');
// Compute the relative path to the `distDir`.
const relativePathToDistRoot = path.join(relativePathToRuntimeRoot, RELATIVE_ROOT_PATH);
const RUNTIME_ROOT = path.resolve(__filename, relativePathToRuntimeRoot);
// Compute the absolute path to the root, by stripping distDir from the absolute path to this file.
const ABSOLUTE_ROOT = path.resolve(__filename, relativePathToDistRoot);
/**
* Returns an absolute path to the given module path.
* Module path should be relative, either path to a file or a directory.
*
* This fn allows to calculate an absolute path for some global static values, such as
* `__dirname` or `import.meta.url` that Turbopack will not embeds in compile time.
* See ImportMetaBinding::code_generation for the usage.
*/ function resolveAbsolutePath(modulePath) {
if (modulePath) {
return path.join(ABSOLUTE_ROOT, modulePath);
}
return ABSOLUTE_ROOT;
}
Context.prototype.P = resolveAbsolutePath;
/* eslint-disable @typescript-eslint/no-unused-vars */ /// <reference path="../shared/runtime-utils.ts" />
function readWebAssemblyAsResponse(path) {
const { createReadStream } = require('fs');
const { Readable } = require('stream');
const stream = createReadStream(path);
// @ts-ignore unfortunately there's a slight type mismatch with the stream.
return new Response(Readable.toWeb(stream), {
headers: {
'content-type': 'application/wasm'
}
});
}
async function compileWebAssemblyFromPath(path) {
const response = readWebAssemblyAsResponse(path);
return await WebAssembly.compileStreaming(response);
}
async function instantiateWebAssemblyFromPath(path, importsObj) {
const response = readWebAssemblyAsResponse(path);
const { instance } = await WebAssembly.instantiateStreaming(response, importsObj);
return instance.exports;
}
/* eslint-disable @typescript-eslint/no-unused-vars */ /// <reference path="../shared/runtime-utils.ts" />
/// <reference path="../shared-node/base-externals-utils.ts" />
/// <reference path="../shared-node/node-externals-utils.ts" />
/// <reference path="../shared-node/node-wasm-utils.ts" />
var SourceType = /*#__PURE__*/ function(SourceType) {
/**
* The module was instantiated because it was included in an evaluated chunk's
* runtime.
* SourceData is a ChunkPath.
*/ SourceType[SourceType["Runtime"] = 0] = "Runtime";
/**
* The module was instantiated because a parent module imported it.
* SourceData is a ModuleId.
*/ SourceType[SourceType["Parent"] = 1] = "Parent";
return SourceType;
}(SourceType || {});
process.env.TURBOPACK = '1';
const nodeContextPrototype = Context.prototype;
const url = require('url');
const moduleFactories = new Map();
nodeContextPrototype.M = moduleFactories;
const moduleCache = Object.create(null);
nodeContextPrototype.c = moduleCache;
/**
* Returns an absolute path to the given module's id.
*/ function resolvePathFromModule(moduleId) {
const exported = this.r(moduleId);
const exportedPath = exported?.default ?? exported;
if (typeof exportedPath !== 'string') {
return exported;
}
const strippedAssetPrefix = exportedPath.slice(ASSET_PREFIX.length);
const resolved = path.resolve(RUNTIME_ROOT, strippedAssetPrefix);
return url.pathToFileURL(resolved).href;
}
nodeContextPrototype.R = resolvePathFromModule;
function loadRuntimeChunk(sourcePath, chunkData) {
if (typeof chunkData === 'string') {
loadRuntimeChunkPath(sourcePath, chunkData);
} else {
loadRuntimeChunkPath(sourcePath, chunkData.path);
}
}
const loadedChunks = new Set();
const unsupportedLoadChunk = Promise.resolve(undefined);
const loadedChunk = Promise.resolve(undefined);
const chunkCache = new Map();
function clearChunkCache() {
chunkCache.clear();
}
function loadRuntimeChunkPath(sourcePath, chunkPath) {
if (!isJs(chunkPath)) {
// We only support loading JS chunks in Node.js.
// This branch can be hit when trying to load a CSS chunk.
return;
}
if (loadedChunks.has(chunkPath)) {
return;
}
try {
const resolved = path.resolve(RUNTIME_ROOT, chunkPath);
const chunkModules = require(resolved);
installCompressedModuleFactories(chunkModules, 0, moduleFactories);
loadedChunks.add(chunkPath);
} catch (e) {
let errorMessage = `Failed to load chunk ${chunkPath}`;
if (sourcePath) {
errorMessage += ` from runtime for chunk ${sourcePath}`;
}
throw new Error(errorMessage, {
cause: e
});
}
}
function loadChunkAsync(chunkData) {
const chunkPath = typeof chunkData === 'string' ? chunkData : chunkData.path;
if (!isJs(chunkPath)) {
// We only support loading JS chunks in Node.js.
// This branch can be hit when trying to load a CSS chunk.
return unsupportedLoadChunk;
}
let entry = chunkCache.get(chunkPath);
if (entry === undefined) {
try {
// resolve to an absolute path to simplify `require` handling
const resolved = path.resolve(RUNTIME_ROOT, chunkPath);
// TODO: consider switching to `import()` to enable concurrent chunk loading and async file io
// However this is incompatible with hot reloading (since `import` doesn't use the require cache)
const chunkModules = require(resolved);
installCompressedModuleFactories(chunkModules, 0, moduleFactories);
entry = loadedChunk;
} catch (e) {
const errorMessage = `Failed to load chunk ${chunkPath} from module ${this.m.id}`;
// Cache the failure promise, future requests will also get this same rejection
entry = Promise.reject(new Error(errorMessage, {
cause: e
}));
}
chunkCache.set(chunkPath, entry);
}
// TODO: Return an instrumented Promise that React can use instead of relying on referential equality.
return entry;
}
contextPrototype.l = loadChunkAsync;
function loadChunkAsyncByUrl(chunkUrl) {
const path1 = url.fileURLToPath(new URL(chunkUrl, RUNTIME_ROOT));
return loadChunkAsync.call(this, path1);
}
contextPrototype.L = loadChunkAsyncByUrl;
function loadWebAssembly(chunkPath, _edgeModule, imports) {
const resolved = path.resolve(RUNTIME_ROOT, chunkPath);
return instantiateWebAssemblyFromPath(resolved, imports);
}
contextPrototype.w = loadWebAssembly;
function loadWebAssemblyModule(chunkPath, _edgeModule) {
const resolved = path.resolve(RUNTIME_ROOT, chunkPath);
return compileWebAssemblyFromPath(resolved);
}
contextPrototype.u = loadWebAssemblyModule;
function getWorkerBlobURL(_chunks) {
throw new Error('Worker blobs are not implemented yet for Node.js');
}
nodeContextPrototype.b = getWorkerBlobURL;
function instantiateModule(id, sourceType, sourceData) {
const moduleFactory = moduleFactories.get(id);
if (typeof moduleFactory !== 'function') {
// This can happen if modules incorrectly handle HMR disposes/updates,
// e.g. when they keep a `setTimeout` around which still executes old code
// and contains e.g. a `require("something")` call.
let instantiationReason;
switch(sourceType){
case 0:
instantiationReason = `as a runtime entry of chunk ${sourceData}`;
break;
case 1:
instantiationReason = `because it was required from module ${sourceData}`;
break;
default:
invariant(sourceType, (sourceType)=>`Unknown source type: ${sourceType}`);
}
throw new Error(`Module ${id} was instantiated ${instantiationReason}, but the module factory is not available.`);
}
const module1 = createModuleObject(id);
const exports = module1.exports;
moduleCache[id] = module1;
const context = new Context(module1, exports);
// NOTE(alexkirsz) This can fail when the module encounters a runtime error.
try {
moduleFactory(context, module1, exports);
} catch (error) {
module1.error = error;
throw error;
}
module1.loaded = true;
if (module1.namespaceObject && module1.exports !== module1.namespaceObject) {
// in case of a circular dependency: cjs1 -> esm2 -> cjs1
interopEsm(module1.exports, module1.namespaceObject);
}
return module1;
}
/**
* Retrieves a module from the cache, or instantiate it if it is not cached.
*/ // @ts-ignore
function getOrInstantiateModuleFromParent(id, sourceModule) {
const module1 = moduleCache[id];
if (module1) {
if (module1.error) {
throw module1.error;
}
return module1;
}
return instantiateModule(id, 1, sourceModule.id);
}
/**
* Instantiates a runtime module.
*/ function instantiateRuntimeModule(chunkPath, moduleId) {
return instantiateModule(moduleId, 0, chunkPath);
}
/**
* Retrieves a module from the cache, or instantiate it as a runtime module if it is not cached.
*/ // @ts-ignore TypeScript doesn't separate this module space from the browser runtime
function getOrInstantiateRuntimeModule(chunkPath, moduleId) {
const module1 = moduleCache[moduleId];
if (module1) {
if (module1.error) {
throw module1.error;
}
return module1;
}
return instantiateRuntimeModule(chunkPath, moduleId);
}
const regexJsUrl = /\.js(?:\?[^#]*)?(?:#.*)?$/;
/**
* Checks if a given path/URL ends with .js, optionally followed by ?query or #fragment.
*/ function isJs(chunkUrlOrPath) {
return regexJsUrl.test(chunkUrlOrPath);
}
module.exports = (sourcePath)=>({
m: (id)=>getOrInstantiateRuntimeModule(sourcePath, id),
c: (chunkData)=>loadRuntimeChunk(sourcePath, chunkData)
});
//# sourceMappingURL=%5Bturbopack%5D_runtime.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"previewModeId":"3727c3274f9e5c17ae461cf0ee5b21ba","previewModeSigningKey":"7ea5505f5bd00c19307464e2567dfb22da7faf6f4a49833676e87c5945c4bb2e","previewModeEncryptionKey":"c842faa17772ca8d2ab471df9804d2d85b5c5b53a791644b30c6b23600bbe2ad","expireAt":1771596422953}

View File

@ -0,0 +1 @@
{"encryption.key":"aUrQ9RkDP1dfuCD6ZpoKRU4J9a7r57HwLfu7lQn5TvU=","encryption.expire_at":1771596422920}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1,6 @@
{
"buildStage": "type-checking",
"buildOptions": {
"useBuildWorker": "true"
}
}

View File

@ -0,0 +1 @@
{"name":"Next.js","version":"15.5.12"}

View File

@ -0,0 +1,14 @@
{
"pages": {
"/_app": []
},
"devFiles": [],
"ampDevFiles": [],
"polyfillFiles": [],
"lowPriorityFiles": [
"static/development/_ssgManifest.js",
"static/development/_buildManifest.js"
],
"rootMainFiles": [],
"ampFirstPages": []
}

View File

@ -0,0 +1 @@
{"type": "commonjs"}

View File

@ -0,0 +1,6 @@
var R=require("./build/chunks/[turbopack]_runtime.js")("postcss.js")
R.c("build/chunks/[turbopack-node]_transforms_postcss_ts_655c8cb8._.js")
R.c("build/chunks/[root-of-the-server]__ae76b844._.js")
R.m("[turbopack-node]/globals.ts [postcss] (ecmascript)")
R.m("[turbopack-node]/ipc/evaluate.ts/evaluate.js { INNER => \"[turbopack-node]/transforms/postcss.ts { CONFIG => \\\"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/postcss.config.mjs [postcss] (ecmascript)\\\" } [postcss] (ecmascript)\", RUNTIME => \"[turbopack-node]/ipc/evaluate.ts [postcss] (ecmascript)\" } [postcss] (ecmascript)")
module.exports=R.m("[turbopack-node]/ipc/evaluate.ts/evaluate.js { INNER => \"[turbopack-node]/transforms/postcss.ts { CONFIG => \\\"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/postcss.config.mjs [postcss] (ecmascript)\\\" } [postcss] (ecmascript)\", RUNTIME => \"[turbopack-node]/ipc/evaluate.ts [postcss] (ecmascript)\" } [postcss] (ecmascript)").exports

View File

@ -0,0 +1,5 @@
{
"version": 3,
"sources": [],
"sections": []
}

View File

@ -0,0 +1,11 @@
{
"version": 4,
"routes": {},
"dynamicRoutes": {},
"notFoundRoutes": [],
"preview": {
"previewModeId": "f02a29be570d1a691d9f2ab4abc25d17",
"previewModeSigningKey": "548852efc89218006f1e973fa75c2c5e58ba3d6d50c816deb7ba77e09bf4811c",
"previewModeEncryptionKey": "19420ed8dc2870b3ab74d04dade537253ae75e572458eacbeb57c2f875f74c58"
}
}

View File

@ -0,0 +1,8 @@
{
"components/deploy/DeploySuccess.tsx -> canvas-confetti": {
"id": 8542,
"files": [
"static/chunks/542.d11b0ca82fc660f1.js"
]
}
}

View File

@ -0,0 +1 @@
{"version":3,"caseSensitive":false,"basePath":"","rewrites":{"beforeFiles":[],"afterFiles":[],"fallback":[]},"redirects":[{"source":"/:path+/","destination":"/:path+","permanent":true,"internal":true,"regex":"^(?:\\/((?:[^\\/]+?)(?:\\/(?:[^\\/]+?))*))\\/$"}],"headers":[]}

View File

@ -0,0 +1,3 @@
{
"/_not-found/page": "app/_not-found/page.js"
}

View File

@ -0,0 +1,15 @@
var R=require("../../chunks/ssr/[turbopack]_runtime.js")("server/app/(marketing)/page.js")
R.c("server/chunks/ssr/7a4c8_next_dist_2bf0eb7f._.js")
R.c("server/chunks/ssr/[root-of-the-server]__7f148858._.js")
R.c("server/chunks/ssr/_clawdbot_workspace_mcpengine-studio_d8a22f39._.js")
R.c("server/chunks/ssr/7a4c8_next_dist_client_components_c6331633._.js")
R.c("server/chunks/ssr/7a4c8_next_dist_client_components_builtin_forbidden_bfc2ebb0.js")
R.c("server/chunks/ssr/7a4c8_next_dist_client_components_builtin_unauthorized_27fba3c6.js")
R.c("server/chunks/ssr/7a4c8_next_dist_client_components_builtin_global-error_38277d9c.js")
R.c("server/chunks/ssr/092de__pnpm_c6b5f6f1._.js")
R.c("server/chunks/ssr/_clawdbot_workspace_mcpengine-studio_a486adb0._.js")
R.c("server/chunks/ssr/7a4c8_next_dist_157bfb8b._.js")
R.c("server/chunks/ssr/[root-of-the-server]__9c005a2b._.js")
R.m("[project]/.clawdbot/workspace/mcpengine-studio/apps/web/.next-internal/server/app/(marketing)/page/actions.js [app-rsc] (server actions loader, ecmascript)")
R.m("[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/esm/build/templates/app-page.js?page=/(marketing)/page { GLOBAL_ERROR_MODULE => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_0 => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/app/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_1 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_2 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_3 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_4 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_5 => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/app/(marketing)/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_6 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_7 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_8 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_9 => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/app/(marketing)/page.tsx [app-rsc] (ecmascript, Next.js Server Component)\" } [app-rsc] (ecmascript)")
module.exports=R.m("[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/esm/build/templates/app-page.js?page=/(marketing)/page { GLOBAL_ERROR_MODULE => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_0 => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/app/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_1 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_2 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_3 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_4 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/global-error.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_5 => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/app/(marketing)/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_6 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_7 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_8 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_9 => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/app/(marketing)/page.tsx [app-rsc] (ecmascript, Next.js Server Component)\" } [app-rsc] (ecmascript)").exports

View File

@ -0,0 +1,5 @@
{
"version": 3,
"sources": [],
"sections": []
}

View File

@ -0,0 +1 @@
{"version":1,"files":["../../webpack-runtime.js","../../chunks/573.js","../../chunks/381.js","../../chunks/543.js","../../chunks/223.js","../../chunks/464.js","page_client-reference-manifest.js"]}

View File

@ -0,0 +1,24 @@
{
"pages": {
"/(marketing)/page": [
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_app_globals_cfa39e1d.css",
"static/chunks/7a4c8_next_dist_d8f42c41._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_app_layout_tsx_03cdabae._.js",
"static/chunks/7a4c8_next_dist_client_components_builtin_global-error_9deadc9b.js",
"static/chunks/092de__pnpm_dbdbe38e._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_packages_ui_5c8c403e._.js",
"static/chunks/40f96_workspace_mcpengine-studio_apps_web_app_(marketing)_layout_tsx_9deadc9b._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_4122ec3c._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_app_(marketing)_page_tsx_e3863a4f._.js",
"static/chunks/[turbopack]_browser_dev_hmr-client_hmr-client_ts_20e8c980._.js",
"static/chunks/7a4c8_next_dist_compiled_react-dom_5f4745e6._.js",
"static/chunks/7a4c8_next_dist_compiled_next-devtools_index_9b3ef8ee.js",
"static/chunks/7a4c8_next_dist_compiled_6f71cf01._.js",
"static/chunks/7a4c8_next_dist_client_2aced240._.js",
"static/chunks/7a4c8_next_dist_b6a739f4._.js",
"static/chunks/861ec_@swc_helpers_cjs_4c580dff._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_a0ff3932._.js",
"static/chunks/turbopack-_clawdbot_workspace_mcpengine-studio_apps_web_822a5ec5._.js"
]
}
}

View File

@ -0,0 +1,3 @@
{
"/(marketing)/page": "app/(marketing)/page.js"
}

View File

@ -0,0 +1,21 @@
{
"devFiles": [],
"ampDevFiles": [],
"polyfillFiles": [
"static/chunks/7a4c8_next_dist_build_polyfills_polyfill-nomodule.js"
],
"lowPriorityFiles": [],
"rootMainFiles": [
"static/chunks/[turbopack]_browser_dev_hmr-client_hmr-client_ts_20e8c980._.js",
"static/chunks/7a4c8_next_dist_compiled_react-dom_5f4745e6._.js",
"static/chunks/7a4c8_next_dist_compiled_next-devtools_index_9b3ef8ee.js",
"static/chunks/7a4c8_next_dist_compiled_6f71cf01._.js",
"static/chunks/7a4c8_next_dist_client_2aced240._.js",
"static/chunks/7a4c8_next_dist_b6a739f4._.js",
"static/chunks/861ec_@swc_helpers_cjs_4c580dff._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_a0ff3932._.js",
"static/chunks/turbopack-_clawdbot_workspace_mcpengine-studio_apps_web_822a5ec5._.js"
],
"pages": {},
"ampFirstPages": []
}

View File

@ -0,0 +1,6 @@
{
"pages": {},
"app": {},
"appUsingSizeAdjust": false,
"pagesUsingSizeAdjust": false
}

View File

@ -0,0 +1,4 @@
{
"node": {},
"edge": {}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,11 @@
var R=require("../../chunks/ssr/[turbopack]_runtime.js")("server/app/_not-found/page.js")
R.c("server/chunks/ssr/7a4c8_next_dist_94a40801._.js")
R.c("server/chunks/ssr/[root-of-the-server]__7f148858._.js")
R.c("server/chunks/ssr/_clawdbot_workspace_mcpengine-studio_d8a22f39._.js")
R.c("server/chunks/ssr/7a4c8_next_dist_client_components_c6331633._.js")
R.c("server/chunks/ssr/7a4c8_next_dist_client_components_builtin_forbidden_bfc2ebb0.js")
R.c("server/chunks/ssr/7a4c8_next_dist_b97dca90._.js")
R.c("server/chunks/ssr/[root-of-the-server]__0a6db4b1._.js")
R.m("[project]/.clawdbot/workspace/mcpengine-studio/apps/web/.next-internal/server/app/_not-found/page/actions.js [app-rsc] (server actions loader, ecmascript)")
R.m("[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/esm/build/templates/app-page.js?page=/_not-found/page { MODULE_0 => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/app/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_1 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_2 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_3 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_4 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\" } [app-rsc] (ecmascript)")
module.exports=R.m("[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/esm/build/templates/app-page.js?page=/_not-found/page { MODULE_0 => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/app/layout.tsx [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_1 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_2 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/forbidden.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_3 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/unauthorized.js [app-rsc] (ecmascript, Next.js Server Component)\", MODULE_4 => \"[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/client/components/builtin/not-found.js [app-rsc] (ecmascript, Next.js Server Component)\" } [app-rsc] (ecmascript)").exports

View File

@ -0,0 +1,5 @@
{
"version": 3,
"sources": [],
"sections": []
}

View File

@ -0,0 +1 @@
{"version":1,"files":["../../webpack-runtime.js","../../chunks/573.js","../../chunks/381.js","page_client-reference-manifest.js"]}

View File

@ -0,0 +1,18 @@
{
"pages": {
"/_not-found/page": [
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_app_globals_cfa39e1d.css",
"static/chunks/7a4c8_next_dist_d8f42c41._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_app_layout_tsx_03cdabae._.js",
"static/chunks/[turbopack]_browser_dev_hmr-client_hmr-client_ts_20e8c980._.js",
"static/chunks/7a4c8_next_dist_compiled_react-dom_5f4745e6._.js",
"static/chunks/7a4c8_next_dist_compiled_next-devtools_index_9b3ef8ee.js",
"static/chunks/7a4c8_next_dist_compiled_6f71cf01._.js",
"static/chunks/7a4c8_next_dist_client_2aced240._.js",
"static/chunks/7a4c8_next_dist_b6a739f4._.js",
"static/chunks/861ec_@swc_helpers_cjs_4c580dff._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_a0ff3932._.js",
"static/chunks/turbopack-_clawdbot_workspace_mcpengine-studio_apps_web_822a5ec5._.js"
]
}
}

View File

@ -0,0 +1,3 @@
{
"/_not-found/page": "app/_not-found/page.js"
}

View File

@ -0,0 +1,21 @@
{
"devFiles": [],
"ampDevFiles": [],
"polyfillFiles": [
"static/chunks/7a4c8_next_dist_build_polyfills_polyfill-nomodule.js"
],
"lowPriorityFiles": [],
"rootMainFiles": [
"static/chunks/[turbopack]_browser_dev_hmr-client_hmr-client_ts_20e8c980._.js",
"static/chunks/7a4c8_next_dist_compiled_react-dom_5f4745e6._.js",
"static/chunks/7a4c8_next_dist_compiled_next-devtools_index_9b3ef8ee.js",
"static/chunks/7a4c8_next_dist_compiled_6f71cf01._.js",
"static/chunks/7a4c8_next_dist_client_2aced240._.js",
"static/chunks/7a4c8_next_dist_b6a739f4._.js",
"static/chunks/861ec_@swc_helpers_cjs_4c580dff._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_a0ff3932._.js",
"static/chunks/turbopack-_clawdbot_workspace_mcpengine-studio_apps_web_822a5ec5._.js"
],
"pages": {},
"ampFirstPages": []
}

View File

@ -0,0 +1,6 @@
{
"pages": {},
"app": {},
"appUsingSizeAdjust": false,
"pagesUsingSizeAdjust": false
}

View File

@ -0,0 +1,4 @@
{
"node": {},
"edge": {}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,10 @@
var R=require("../../../chunks/[turbopack]_runtime.js")("server/app/api/analyze/route.js")
R.c("server/chunks/4509c_formdata-node_lib_esm_fileFromPath_5bbd56f4.js")
R.c("server/chunks/7a4c8_next_dist_12c88426._.js")
R.c("server/chunks/f22f0_@anthropic-ai_sdk_2c8d17be._.js")
R.c("server/chunks/1ca2c_tr46_901fb734._.js")
R.c("server/chunks/092de__pnpm_8dd320db._.js")
R.c("server/chunks/[root-of-the-server]__896fcae5._.js")
R.m("[project]/.clawdbot/workspace/mcpengine-studio/apps/web/.next-internal/server/app/api/analyze/route/actions.js [app-rsc] (server actions loader, ecmascript)")
R.m("[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/esm/build/templates/app-route.js { INNER_APP_ROUTE => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/app/api/analyze/route.ts [app-route] (ecmascript)\" } [app-route] (ecmascript)")
module.exports=R.m("[project]/.clawdbot/workspace/mcpengine-studio/node_modules/.pnpm/next@15.5.12_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/next/dist/esm/build/templates/app-route.js { INNER_APP_ROUTE => \"[project]/.clawdbot/workspace/mcpengine-studio/apps/web/app/api/analyze/route.ts [app-route] (ecmascript)\" } [app-route] (ecmascript)").exports

View File

@ -0,0 +1,5 @@
{
"version": 3,
"sources": [],
"sections": []
}

View File

@ -0,0 +1 @@
{"version":1,"files":["../../../webpack-runtime.js","../../../chunks/573.js","../../../chunks/744.js","../../../chunks/856.js","route_client-reference-manifest.js","../../../../../package.json","../../../../../../../package.json","../../../../../../../../package.json","../../../../../../../packages/ai-pipeline/package.json","../../../../../../../../../../package.json","../../../../../../../packages/ai-pipeline/skills/data/mcp-api-analyzer.md","../../../../../../../packages/ai-pipeline/skills/data/mcp-app-designer.md","../../../../../../../packages/ai-pipeline/skills/data/mcp-apps-integration.md","../../../../../../../packages/ai-pipeline/skills/data/mcp-apps-merged.md","../../../../../../../packages/ai-pipeline/skills/data/mcp-apps-official.md","../../../../../../../packages/ai-pipeline/skills/data/mcp-deployment.md","../../../../../../../packages/ai-pipeline/skills/data/mcp-localbosses-integrator.md","../../../../../../../packages/ai-pipeline/skills/data/mcp-qa-tester.md","../../../../../../../packages/ai-pipeline/skills/data/mcp-server-builder.md","../../../../../../../packages/ai-pipeline/skills/data/mcp-server-development.md","../../../../../../../packages/ai-pipeline/skills/data/mcp-skill.md"]}

View File

@ -0,0 +1,15 @@
{
"pages": {
"/api/analyze/route": [
"static/chunks/[turbopack]_browser_dev_hmr-client_hmr-client_ts_20e8c980._.js",
"static/chunks/7a4c8_next_dist_compiled_react-dom_5f4745e6._.js",
"static/chunks/7a4c8_next_dist_compiled_next-devtools_index_9b3ef8ee.js",
"static/chunks/7a4c8_next_dist_compiled_6f71cf01._.js",
"static/chunks/7a4c8_next_dist_client_2aced240._.js",
"static/chunks/7a4c8_next_dist_b6a739f4._.js",
"static/chunks/861ec_@swc_helpers_cjs_4c580dff._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_a0ff3932._.js",
"static/chunks/turbopack-_clawdbot_workspace_mcpengine-studio_apps_web_822a5ec5._.js"
]
}
}

View File

@ -0,0 +1,3 @@
{
"/api/analyze/route": "app/api/analyze/route.js"
}

View File

@ -0,0 +1,21 @@
{
"devFiles": [],
"ampDevFiles": [],
"polyfillFiles": [
"static/chunks/7a4c8_next_dist_build_polyfills_polyfill-nomodule.js"
],
"lowPriorityFiles": [],
"rootMainFiles": [
"static/chunks/[turbopack]_browser_dev_hmr-client_hmr-client_ts_20e8c980._.js",
"static/chunks/7a4c8_next_dist_compiled_react-dom_5f4745e6._.js",
"static/chunks/7a4c8_next_dist_compiled_next-devtools_index_9b3ef8ee.js",
"static/chunks/7a4c8_next_dist_compiled_6f71cf01._.js",
"static/chunks/7a4c8_next_dist_client_2aced240._.js",
"static/chunks/7a4c8_next_dist_b6a739f4._.js",
"static/chunks/861ec_@swc_helpers_cjs_4c580dff._.js",
"static/chunks/_clawdbot_workspace_mcpengine-studio_apps_web_a0ff3932._.js",
"static/chunks/turbopack-_clawdbot_workspace_mcpengine-studio_apps_web_822a5ec5._.js"
],
"pages": {},
"ampFirstPages": []
}

View File

@ -0,0 +1,4 @@
{
"node": {},
"edge": {}
}

View File

@ -0,0 +1,2 @@
globalThis.__RSC_MANIFEST = globalThis.__RSC_MANIFEST || {};
globalThis.__RSC_MANIFEST["/api/analyze/route"] = {"moduleLoading":{"prefix":"","crossOrigin":null},"clientModules":{},"ssrModuleMapping":{},"edgeSSRModuleMapping":{},"rscModuleMapping":{},"edgeRscModuleMapping":{},"entryCSSFiles":{},"entryJSFiles":{}}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"version":1,"files":["../../../webpack-runtime.js","../../../chunks/573.js","../../../chunks/872.js","route_client-reference-manifest.js","../../../../../package.json","../../../../../../../package.json","../../../../../../../../package.json","../../../../../../../../../../package.json"]}

Some files were not shown because too many files have changed in this diff Show More