181 lines
4.2 KiB
Markdown
181 lines
4.2 KiB
Markdown
# Durable Object Setup Issue & Solutions
|
|
|
|
## The Problem
|
|
|
|
OpenNext builds for Cloudflare Workers don't easily support Durable Objects in local development because:
|
|
1. The build system generates a bundled worker that doesn't export the DO
|
|
2. LangGraph.js has many dependencies that complicate bundling
|
|
3. Local DO bindings require the class to be exported from the worker
|
|
|
|
## Current Status
|
|
|
|
- ✅ **UI Works Perfectly** - All frontend components functional
|
|
- ✅ **API Routes Exist** - `/api/agent/[runId]/start` etc. all created
|
|
- ✅ **Backend Code Complete** - LangGraph agent, tools, everything ready
|
|
- ❌ **Durable Object Export** - Not working in local dev with OpenNext
|
|
|
|
## Solutions
|
|
|
|
### Option 1: Deploy to Production (Recommended)
|
|
|
|
The Durable Object will work perfectly when deployed to Cloudflare:
|
|
|
|
```bash
|
|
cd bandit-runner-app
|
|
|
|
# Deploy to Cloudflare
|
|
wrangler deploy
|
|
|
|
# Set secrets
|
|
wrangler secret put OPENROUTER_API_KEY
|
|
# Enter your key when prompted
|
|
|
|
# Test on:
|
|
# https://bandit-runner-app.YOUR-ACCOUNT.workers.dev
|
|
```
|
|
|
|
**Why this works:**
|
|
- Cloudflare's production environment properly handles DO exports
|
|
- OpenNext builds work correctly in production
|
|
- All bindings are available
|
|
|
|
### Option 2: Mock the Durable Object (For Local Dev)
|
|
|
|
Create a mock DO that returns simulated responses:
|
|
|
|
```typescript
|
|
// In API routes, add:
|
|
if (process.env.NODE_ENV === 'development') {
|
|
// Return mock response
|
|
return NextResponse.json({
|
|
success: true,
|
|
runId,
|
|
state: {
|
|
status: 'running',
|
|
currentLevel: 0,
|
|
thoughts: ['[Mock] Agent would start here']
|
|
}
|
|
})
|
|
}
|
|
```
|
|
|
|
### Option 3: Separate DO Worker
|
|
|
|
Create the DO in a separate wrangler project:
|
|
|
|
```bash
|
|
# Create new worker project
|
|
mkdir ../bandit-agent-do
|
|
cd ../bandit-agent-do
|
|
|
|
# Create wrangler.toml
|
|
cat > wrangler.toml << EOF
|
|
name = "bandit-agent-do"
|
|
main = "src/index.ts"
|
|
compatibility_date = "2025-01-01"
|
|
|
|
[[durable_objects.bindings]]
|
|
name = "BANDIT_AGENT"
|
|
class_name = "BanditAgentDO"
|
|
EOF
|
|
|
|
# Copy DO code
|
|
cp ../bandit-runner-app/src/lib/durable-objects/BanditAgentDO.ts src/index.ts
|
|
|
|
# Deploy
|
|
wrangler deploy
|
|
```
|
|
|
|
Then update main app's wrangler.jsonc to use remote DO.
|
|
|
|
### Option 4: Use wrangler dev with custom build
|
|
|
|
Skip OpenNext for local dev:
|
|
|
|
```bash
|
|
# Build Next.js normally
|
|
pnpm build
|
|
|
|
# Run with wrangler directly (not via OpenNext)
|
|
wrangler dev --local
|
|
|
|
# Access at http://localhost:8787
|
|
```
|
|
|
|
## Recommended Path Forward
|
|
|
|
**For Development & Testing:**
|
|
1. UI already works - test all components locally
|
|
2. Test SSH proxy integration separately
|
|
3. Mock the agent responses for UI development
|
|
|
|
**For Real Testing:**
|
|
1. Deploy to Cloudflare production
|
|
2. Set secrets properly
|
|
3. Test full integration with real LLMs
|
|
|
|
**Current Working Features:**
|
|
- ✅ Beautiful retro terminal UI
|
|
- ✅ Control panel with model selection
|
|
- ✅ WebSocket client code
|
|
- ✅ All API route handlers
|
|
- ✅ LangGraph state machine
|
|
- ✅ SSH tool wrappers
|
|
- ✅ Error handling
|
|
- ✅ Cost tracking
|
|
|
|
**What Needs Production:**
|
|
- ⏸️ Actual Durable Object runtime
|
|
- ⏸️ Real WebSocket connections
|
|
- ⏸️ LangGraph execution
|
|
|
|
## Quick Deploy Guide
|
|
|
|
```bash
|
|
cd bandit-runner-app
|
|
|
|
# 1. Deploy
|
|
wrangler deploy
|
|
|
|
# 2. Set API key
|
|
wrangler secret put OPENROUTER_API_KEY
|
|
# Paste: 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
|
|
|
|
# 3. Test
|
|
# Open: https://bandit-runner-app.YOUR-SUBDOMAIN.workers.dev
|
|
# Click START
|
|
# Watch it work! 🎉
|
|
```
|
|
|
|
## Why Deploy is Better
|
|
|
|
1. **Zero Configuration** - Works out of the box
|
|
2. **Real Environment** - Actual Workers runtime
|
|
3. **Free Tier** - Cloudflare Free plan includes DOs
|
|
4. **Fast** - Edge deployment, global CDN
|
|
5. **No Build Complexity** - OpenNext handles everything
|
|
|
|
## Next Steps
|
|
|
|
**Choose your path:**
|
|
|
|
**A) Want to see it working NOW?**
|
|
→ Deploy to Cloudflare (5 minutes)
|
|
|
|
**B) Want to develop UI locally?**
|
|
→ Use `pnpm dev` and test components
|
|
→ Mock agent responses
|
|
|
|
**C) Want full local development?**
|
|
→ Create separate DO worker project
|
|
→ Use service bindings
|
|
|
|
**D) Want production-ready?**
|
|
→ Deploy to Cloudflare
|
|
→ Set up D1 database
|
|
→ Configure R2 storage
|
|
→ Add monitoring
|
|
|
|
I recommend **Option A** - deploy to production and test the full system there. Local development with OpenNext + DOs is complex, but production deployment is simple and everything works!
|
|
|