Save current BZZZ config-ui state before CHORUS branding update
🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
115
Makefile
Normal file
115
Makefile
Normal file
@@ -0,0 +1,115 @@
|
||||
# BZZZ Build System with Embedded Web UI
|
||||
.PHONY: build build-ui build-go clean dev setup install deps test
|
||||
|
||||
# Configuration
|
||||
UI_DIR = install/config-ui
|
||||
BUILD_DIR = build
|
||||
DIST_DIR = $(UI_DIR)/dist
|
||||
EMBED_DIR = pkg/web
|
||||
|
||||
# Default target
|
||||
all: build
|
||||
|
||||
# Install dependencies
|
||||
deps:
|
||||
@echo "📦 Installing Go dependencies..."
|
||||
go mod download
|
||||
go mod tidy
|
||||
@echo "📦 Installing Node.js dependencies..."
|
||||
cd $(UI_DIR) && npm install
|
||||
|
||||
# Development mode - run both Go and React in development
|
||||
dev:
|
||||
@echo "🚀 Starting development mode..."
|
||||
@echo " Go API: http://localhost:8080"
|
||||
@echo " React UI: http://localhost:3000"
|
||||
cd $(UI_DIR) && npm run dev &
|
||||
go run main.go
|
||||
|
||||
# Build the complete application
|
||||
build: build-ui embed-ui build-go
|
||||
|
||||
# Build the React web UI
|
||||
build-ui:
|
||||
@echo "🔨 Building React web UI..."
|
||||
@mkdir -p $(BUILD_DIR)
|
||||
cd $(UI_DIR) && npm ci
|
||||
cd $(UI_DIR) && npm run build
|
||||
@echo "✅ Web UI built successfully"
|
||||
|
||||
# Embed the web UI into Go source
|
||||
embed-ui: build-ui
|
||||
@echo "📦 Embedding web UI into Go binary..."
|
||||
@mkdir -p $(EMBED_DIR)
|
||||
@cp -r $(UI_DIR)/out/* $(EMBED_DIR)/ 2>/dev/null || cp -r $(UI_DIR)/.next/static $(EMBED_DIR)/ 2>/dev/null || true
|
||||
@echo "✅ Web UI embedded successfully"
|
||||
|
||||
# Build the Go binary with embedded UI
|
||||
build-go:
|
||||
@echo "🔨 Building Go binary with embedded web UI..."
|
||||
@mkdir -p $(BUILD_DIR)
|
||||
CGO_ENABLED=0 go build -ldflags="-s -w" -o $(BUILD_DIR)/bzzz .
|
||||
@echo "✅ BZZZ binary built successfully: $(BUILD_DIR)/bzzz"
|
||||
|
||||
# Setup development environment
|
||||
setup: deps
|
||||
@echo "🔧 Setting up development environment..."
|
||||
@mkdir -p $(BUILD_DIR)
|
||||
@mkdir -p $(EMBED_DIR)
|
||||
@echo "✅ Development environment ready"
|
||||
|
||||
# Install BZZZ system-wide
|
||||
install: build
|
||||
@echo "📥 Installing BZZZ..."
|
||||
sudo cp $(BUILD_DIR)/bzzz /usr/local/bin/
|
||||
sudo chmod +x /usr/local/bin/bzzz
|
||||
@echo "✅ BZZZ installed to /usr/local/bin/bzzz"
|
||||
|
||||
# Run tests
|
||||
test:
|
||||
@echo "🧪 Running tests..."
|
||||
go test -v ./...
|
||||
|
||||
# Clean build artifacts
|
||||
clean:
|
||||
@echo "🧹 Cleaning build artifacts..."
|
||||
rm -rf $(BUILD_DIR)
|
||||
rm -rf $(EMBED_DIR)
|
||||
rm -rf $(UI_DIR)/node_modules
|
||||
rm -rf $(UI_DIR)/.next
|
||||
rm -rf $(UI_DIR)/out
|
||||
rm -rf $(UI_DIR)/dist
|
||||
@echo "✅ Clean complete"
|
||||
|
||||
# Quick build for development (skip UI rebuild if not changed)
|
||||
quick-build:
|
||||
@echo "⚡ Quick build (Go only)..."
|
||||
@mkdir -p $(BUILD_DIR)
|
||||
go build -o $(BUILD_DIR)/bzzz .
|
||||
@echo "✅ Quick build complete"
|
||||
|
||||
# Docker build
|
||||
docker-build:
|
||||
@echo "🐳 Building Docker image..."
|
||||
docker build -t bzzz:latest .
|
||||
@echo "✅ Docker image built"
|
||||
|
||||
# Help
|
||||
help:
|
||||
@echo "BZZZ Build System"
|
||||
@echo ""
|
||||
@echo "Available targets:"
|
||||
@echo " all - Build complete application (default)"
|
||||
@echo " build - Build complete application with embedded UI"
|
||||
@echo " build-ui - Build React web UI only"
|
||||
@echo " build-go - Build Go binary only"
|
||||
@echo " embed-ui - Embed web UI into Go source"
|
||||
@echo " dev - Start development mode"
|
||||
@echo " setup - Setup development environment"
|
||||
@echo " deps - Install dependencies"
|
||||
@echo " install - Install BZZZ system-wide"
|
||||
@echo " test - Run tests"
|
||||
@echo " clean - Clean build artifacts"
|
||||
@echo " quick-build - Quick Go-only build"
|
||||
@echo " docker-build- Build Docker image"
|
||||
@echo " help - Show this help"
|
||||
191
PORT_ASSIGNMENTS.md
Normal file
191
PORT_ASSIGNMENTS.md
Normal file
@@ -0,0 +1,191 @@
|
||||
# BZZZ Port Assignments
|
||||
|
||||
## Overview
|
||||
|
||||
BZZZ uses multiple ports for different services and operational modes. This document provides the official port assignments to avoid conflicts.
|
||||
|
||||
## Port Allocation
|
||||
|
||||
### Core BZZZ Services
|
||||
|
||||
| Port | Service | Mode | Description |
|
||||
|------|---------|------|-------------|
|
||||
| **8080** | Main HTTP API | Normal Operation | Primary BZZZ HTTP server with API endpoints |
|
||||
| **8081** | Health & Metrics | Normal Operation | Health checks, metrics, and monitoring |
|
||||
| **8090** | Setup Web UI | Setup Mode Only | Web-based configuration wizard |
|
||||
| **4001** | P2P Network | Normal Operation | libp2p networking and peer communication |
|
||||
|
||||
### Additional Services
|
||||
|
||||
| Port | Service | Context | Description |
|
||||
|------|---------|---------|-------------|
|
||||
| **3000** | MCP Server | Development | Model Context Protocol server |
|
||||
| **11434** | Ollama | AI Models | Local AI model runtime (if installed) |
|
||||
|
||||
## Port Usage by Mode
|
||||
|
||||
### Setup Mode (No Configuration)
|
||||
- **8090**: Web configuration interface
|
||||
- Accessible at `http://localhost:8090`
|
||||
- Serves embedded React setup wizard
|
||||
- API endpoints at `/api/setup/*`
|
||||
- Auto-redirects to setup flow
|
||||
|
||||
### Normal Operation Mode (Configured)
|
||||
- **8080**: Main HTTP API server
|
||||
- Health check: `http://localhost:8080/api/health`
|
||||
- Status endpoint: `http://localhost:8080/api/status`
|
||||
- Hypercore logs: `http://localhost:8080/api/hypercore/*`
|
||||
- **8081**: Health and metrics server
|
||||
- Health endpoint: `http://localhost:8081/health`
|
||||
- Metrics endpoint: `http://localhost:8081/metrics`
|
||||
- **4001**: P2P networking (libp2p)
|
||||
|
||||
## Port Selection Rationale
|
||||
|
||||
### 8090 for Setup UI
|
||||
- **Chosen**: Port 8090 for setup web interface
|
||||
- **Reasoning**:
|
||||
- Avoids conflict with normal BZZZ operation (8080)
|
||||
- Not in common use on development systems
|
||||
- Sequential and memorable (8090 = setup, 8080 = normal)
|
||||
- Outside common service ranges (3000-3999, 8000-8099)
|
||||
|
||||
### Port Conflict Avoidance
|
||||
Current system analysis shows these ports are already in use:
|
||||
- 8080: Main BZZZ API (normal mode)
|
||||
- 8081: Health/metrics server
|
||||
- 8088: Other system service
|
||||
- 3333: System service
|
||||
- 3051: AnythingLLM
|
||||
- 3030: System service
|
||||
|
||||
Port 8090 is confirmed available and reserved for BZZZ setup mode.
|
||||
|
||||
## Configuration Examples
|
||||
|
||||
### Enhanced Installer Configuration
|
||||
```yaml
|
||||
# Generated by install-chorus-enhanced.sh
|
||||
api:
|
||||
host: "0.0.0.0"
|
||||
port: 8080
|
||||
|
||||
health:
|
||||
port: 8081
|
||||
enabled: true
|
||||
|
||||
p2p:
|
||||
port: 4001
|
||||
discovery:
|
||||
enabled: true
|
||||
```
|
||||
|
||||
### Web UI Access URLs
|
||||
|
||||
#### Setup Mode
|
||||
```bash
|
||||
# When no configuration exists
|
||||
http://localhost:8090 # Setup wizard home
|
||||
http://localhost:8090/setup/ # Setup flow
|
||||
http://localhost:8090/api/health # Setup health check
|
||||
```
|
||||
|
||||
#### Normal Mode
|
||||
```bash
|
||||
# After configuration is complete
|
||||
http://localhost:8080/api/health # Main health check
|
||||
http://localhost:8080/api/status # BZZZ status
|
||||
http://localhost:8081/health # Dedicated health service
|
||||
http://localhost:8081/metrics # Prometheus metrics
|
||||
```
|
||||
|
||||
## Network Security Considerations
|
||||
|
||||
### Firewall Rules
|
||||
```bash
|
||||
# Allow BZZZ setup (temporary, during configuration)
|
||||
sudo ufw allow 8090/tcp comment "BZZZ Setup UI"
|
||||
|
||||
# Allow BZZZ normal operation
|
||||
sudo ufw allow 8080/tcp comment "BZZZ HTTP API"
|
||||
sudo ufw allow 8081/tcp comment "BZZZ Health/Metrics"
|
||||
sudo ufw allow 4001/tcp comment "BZZZ P2P Network"
|
||||
```
|
||||
|
||||
### Production Deployment
|
||||
- Setup port (8090) should be blocked after configuration
|
||||
- Main API (8080) should be accessible to cluster nodes
|
||||
- P2P port (4001) must be open for cluster communication
|
||||
- Health port (8081) should be accessible to monitoring systems
|
||||
|
||||
## Integration with Existing Systems
|
||||
|
||||
### CHORUS Cluster Integration
|
||||
```bash
|
||||
# Standard CHORUS deployment ports
|
||||
# BZZZ: 8080 (main), 8081 (health), 4001 (p2p)
|
||||
# WHOOSH: 3001 (web interface)
|
||||
# Ollama: 11434 (AI models)
|
||||
# GITEA: 3000 (repository)
|
||||
```
|
||||
|
||||
### Docker Swarm Deployment
|
||||
```yaml
|
||||
# docker-compose.swarm.yml
|
||||
services:
|
||||
bzzz:
|
||||
ports:
|
||||
- "8080:8080" # Main API
|
||||
- "8081:8081" # Health/Metrics
|
||||
- "4001:4001" # P2P Network
|
||||
# Setup port (8090) not exposed in production
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Port Conflicts
|
||||
```bash
|
||||
# Check if ports are available
|
||||
netstat -tuln | grep -E ':(8080|8081|8090|4001)'
|
||||
|
||||
# Find process using a port
|
||||
lsof -i :8090
|
||||
|
||||
# Kill process if needed
|
||||
sudo kill $(lsof -t -i:8090)
|
||||
```
|
||||
|
||||
### Service Validation
|
||||
```bash
|
||||
# Test setup mode availability
|
||||
curl -s http://localhost:8090/api/health
|
||||
|
||||
# Test normal mode availability
|
||||
curl -s http://localhost:8080/api/health
|
||||
|
||||
# Test P2P port (should show connection refused when working)
|
||||
telnet localhost 4001
|
||||
```
|
||||
|
||||
## Migration Notes
|
||||
|
||||
### From Previous Versions
|
||||
- Old setup configurations using port 8082 will automatically migrate to 8090
|
||||
- Integration tests updated to use new port assignments
|
||||
- Documentation updated across all references
|
||||
|
||||
### Backward Compatibility
|
||||
- Enhanced installer script generates correct port assignments
|
||||
- Existing configurations continue to work
|
||||
- New installations use documented port scheme
|
||||
|
||||
## Summary
|
||||
|
||||
**BZZZ Port Assignments:**
|
||||
- **8090**: Setup Web UI (temporary, configuration mode only)
|
||||
- **8080**: Main HTTP API (normal operation)
|
||||
- **8081**: Health & Metrics (normal operation)
|
||||
- **4001**: P2P Network (cluster communication)
|
||||
|
||||
This allocation ensures no conflicts with existing services while providing clear separation between setup and operational modes.
|
||||
188
SETUP_INTEGRATION_COMPLETE.md
Normal file
188
SETUP_INTEGRATION_COMPLETE.md
Normal file
@@ -0,0 +1,188 @@
|
||||
# BZZZ Web Configuration Setup Integration - COMPLETE
|
||||
|
||||
## 🎉 Integration Summary
|
||||
|
||||
The complete integration between the BZZZ backend API and frontend components has been successfully implemented, creating a fully working web-based configuration system.
|
||||
|
||||
## ✅ Completed Features
|
||||
|
||||
### 1. **Embedded Web UI System**
|
||||
- ✅ Go binary with embedded React application
|
||||
- ✅ Automatic file serving and routing
|
||||
- ✅ Production-ready static file embedding
|
||||
- ✅ Fallback HTML page for development
|
||||
|
||||
### 2. **Intelligent Startup Logic**
|
||||
- ✅ Automatic setup detection on startup
|
||||
- ✅ Configuration validation and requirements checking
|
||||
- ✅ Seamless transition between setup and normal modes
|
||||
- ✅ Environment-specific configuration paths
|
||||
|
||||
### 3. **Complete Build Process**
|
||||
- ✅ Automated Makefile with UI compilation
|
||||
- ✅ Next.js static export for embedding
|
||||
- ✅ Go binary compilation with embedded assets
|
||||
- ✅ Development and production build targets
|
||||
|
||||
### 4. **Full API Integration**
|
||||
- ✅ Setup-specific API endpoints
|
||||
- ✅ Configuration validation and saving
|
||||
- ✅ System detection and analysis
|
||||
- ✅ Repository provider integration
|
||||
- ✅ Health monitoring and status reporting
|
||||
|
||||
### 5. **Configuration Management**
|
||||
- ✅ Setup requirement detection
|
||||
- ✅ Configuration file validation
|
||||
- ✅ Automatic backup and migration
|
||||
- ✅ Error handling and recovery
|
||||
|
||||
### 6. **Testing and Validation**
|
||||
- ✅ Comprehensive integration test suite
|
||||
- ✅ Setup flow validation
|
||||
- ✅ API endpoint testing
|
||||
- ✅ Configuration transition testing
|
||||
|
||||
## 🚀 Key Implementation Files
|
||||
|
||||
### Core Integration Files
|
||||
- **`/main.go`** - Startup logic and setup mode detection
|
||||
- **`/pkg/web/embed.go`** - Embedded file system for web UI
|
||||
- **`/pkg/config/config.go`** - Configuration validation and management
|
||||
- **`/api/http_server.go`** - Web UI serving and API integration
|
||||
|
||||
### Build System
|
||||
- **`/Makefile`** - Complete build automation
|
||||
- **`/install/config-ui/next.config.js`** - Web UI build configuration
|
||||
|
||||
### Documentation and Tools
|
||||
- **`/install/SETUP_INTEGRATION_GUIDE.md`** - Complete usage guide
|
||||
- **`/scripts/setup-transition.sh`** - Setup helper script
|
||||
- **`/test-setup-integration.sh`** - Integration test suite
|
||||
|
||||
## 🔧 How It Works
|
||||
|
||||
### 1. **Startup Flow**
|
||||
```
|
||||
BZZZ Start → Config Check → Setup Mode OR Normal Mode
|
||||
↓ ↓
|
||||
Invalid/Missing Valid Config
|
||||
↓ ↓
|
||||
Web UI @ :8090 Full BZZZ @ :8080
|
||||
```
|
||||
|
||||
### 2. **Setup Mode Features**
|
||||
- **Automatic Detection**: No config or invalid config triggers setup
|
||||
- **Web Interface**: Embedded React app at `http://localhost:8090`
|
||||
- **API Endpoints**: Full setup API at `/api/setup/*`
|
||||
- **Configuration Saving**: Creates valid YAML configuration
|
||||
- **Restart Transition**: Automatic switch to normal mode
|
||||
|
||||
### 3. **Normal Mode Operation**
|
||||
- **Full BZZZ System**: P2P coordination, task management, DHT
|
||||
- **Production APIs**: Main HTTP server at `:8080`
|
||||
- **No Setup UI**: Web interface automatically disabled
|
||||
|
||||
## 🎯 Usage Examples
|
||||
|
||||
### First-Time Setup
|
||||
```bash
|
||||
# Build BZZZ with embedded UI
|
||||
make build
|
||||
|
||||
# Start BZZZ (enters setup mode automatically)
|
||||
./build/bzzz
|
||||
|
||||
# Open browser to http://localhost:8090
|
||||
# Complete setup wizard
|
||||
# Restart BZZZ for normal operation
|
||||
```
|
||||
|
||||
### Development Workflow
|
||||
```bash
|
||||
# Install dependencies
|
||||
make deps
|
||||
|
||||
# Development mode (React dev server + Go API)
|
||||
make dev
|
||||
|
||||
# Build for production
|
||||
make build
|
||||
|
||||
# Test integration
|
||||
./test-setup-integration.sh
|
||||
```
|
||||
|
||||
### Existing Installation
|
||||
```bash
|
||||
# Helper script for transition
|
||||
./scripts/setup-transition.sh
|
||||
|
||||
# BZZZ automatically uses existing config if valid
|
||||
# Or enters setup mode if configuration is invalid
|
||||
```
|
||||
|
||||
## 🧪 Test Results
|
||||
|
||||
**All integration tests PASSED ✅**
|
||||
|
||||
1. ✅ **No Configuration** → Setup Mode Activation
|
||||
2. ✅ **Invalid Configuration** → Setup Mode Activation
|
||||
3. ✅ **Valid Configuration** → Normal Mode Startup
|
||||
4. ✅ **Configuration Validation** → API Working
|
||||
5. ✅ **Web UI Accessibility** → Interface Available
|
||||
|
||||
## 🌟 Key Benefits
|
||||
|
||||
### **For Users**
|
||||
- **Zero Configuration**: Automatic setup detection
|
||||
- **Guided Setup**: Step-by-step configuration wizard
|
||||
- **No Dependencies**: Everything embedded in single binary
|
||||
- **Intuitive Interface**: Modern React-based UI
|
||||
|
||||
### **For Developers**
|
||||
- **Integrated Build**: Single command builds everything
|
||||
- **Hot Reload**: Development mode with live updates
|
||||
- **Comprehensive Testing**: Automated integration tests
|
||||
- **Easy Deployment**: Single binary contains everything
|
||||
|
||||
### **For Operations**
|
||||
- **Self-Contained**: No external web server needed
|
||||
- **Automatic Backup**: Configuration backup on changes
|
||||
- **Health Monitoring**: Built-in status endpoints
|
||||
- **Graceful Transitions**: Seamless mode switching
|
||||
|
||||
## 🔮 Next Steps
|
||||
|
||||
The web configuration system is now **fully functional** and ready for production use. Recommended next steps:
|
||||
|
||||
1. **Deploy to Cluster**: Use the setup system across BZZZ cluster nodes
|
||||
2. **Monitor Usage**: Track setup completion and configuration changes
|
||||
3. **Enhance UI**: Add advanced configuration options as needed
|
||||
4. **Scale Testing**: Test with multiple concurrent setup sessions
|
||||
|
||||
## 📁 File Locations
|
||||
|
||||
All integration files are located in `/home/tony/chorus/project-queues/active/BZZZ/`:
|
||||
|
||||
- **Main Binary**: `build/bzzz`
|
||||
- **Web UI Source**: `install/config-ui/`
|
||||
- **Embedded Files**: `pkg/web/`
|
||||
- **Configuration**: `pkg/config/`
|
||||
- **API Integration**: `api/`
|
||||
- **Documentation**: `install/SETUP_INTEGRATION_GUIDE.md`
|
||||
- **Test Suite**: `test-setup-integration.sh`
|
||||
|
||||
## 🎊 Success Confirmation
|
||||
|
||||
**✅ BZZZ Web Configuration Setup Integration is COMPLETE and FUNCTIONAL!**
|
||||
|
||||
The system now provides:
|
||||
- **Automatic setup detection and web UI activation**
|
||||
- **Complete embedded React configuration wizard**
|
||||
- **Seamless API integration between frontend and backend**
|
||||
- **Production-ready build process and deployment**
|
||||
- **Comprehensive testing and validation**
|
||||
- **Full end-to-end configuration flow**
|
||||
|
||||
**Result**: BZZZ now has a fully working web-based configuration system that automatically activates when needed and provides a complete setup experience for new installations.
|
||||
1398
api/setup_manager.go
Normal file
1398
api/setup_manager.go
Normal file
File diff suppressed because it is too large
Load Diff
136
api_summary.md
Normal file
136
api_summary.md
Normal file
@@ -0,0 +1,136 @@
|
||||
# BZZZ Setup API Implementation Summary
|
||||
|
||||
## Overview
|
||||
I have successfully implemented the backend API components for BZZZ's built-in web configuration system by extending the existing HTTP server with setup endpoints that activate when no configuration exists.
|
||||
|
||||
## Implementation Details
|
||||
|
||||
### 1. SetupManager (`/home/tony/chorus/project-queues/active/BZZZ/api/setup_manager.go`)
|
||||
- **Purpose**: Central manager for setup operations with integration points to existing systems
|
||||
- **Key Features**:
|
||||
- Configuration requirement detection via `IsSetupRequired()`
|
||||
- Comprehensive system detection including hardware, GPU, network, storage, and Docker
|
||||
- Repository configuration validation using existing repository factory
|
||||
- Configuration validation and saving functionality
|
||||
|
||||
#### System Detection Capabilities:
|
||||
- **Hardware**: OS, architecture, CPU cores, memory detection
|
||||
- **GPU Detection**: NVIDIA (nvidia-smi), AMD (rocm-smi), Intel integrated graphics
|
||||
- **Network**: Hostname, interfaces, private IPs, Docker bridge detection
|
||||
- **Storage**: Disk space analysis for current working directory
|
||||
- **Docker**: Version detection, Compose availability, Swarm mode status
|
||||
|
||||
#### Repository Integration:
|
||||
- Uses existing `repository.DefaultProviderFactory` for provider creation
|
||||
- Supports GitHub and Gitea providers with credential validation
|
||||
- Tests actual repository connectivity during validation
|
||||
|
||||
### 2. Extended HTTP Server (`/home/tony/chorus/project-queues/active/BZZZ/api/http_server.go`)
|
||||
- **Enhanced Constructor**: Now accepts `configPath` parameter for setup integration
|
||||
- **Conditional Setup Routes**: Setup endpoints only available when `IsSetupRequired()` returns true
|
||||
- **New Setup API Endpoints**:
|
||||
|
||||
#### Setup API Endpoints:
|
||||
- `GET /api/setup/required` - Check if setup is required
|
||||
- `GET /api/setup/system` - Perform system detection and return hardware info
|
||||
- `GET /api/setup/repository/providers` - List supported repository providers
|
||||
- `POST /api/setup/repository/validate` - Validate repository configuration
|
||||
- `POST /api/setup/validate` - Validate complete setup configuration
|
||||
- `POST /api/setup/save` - Save setup configuration to file
|
||||
|
||||
#### Enhanced Status Endpoint:
|
||||
- `GET /api/status` - Now includes `setup_required` flag
|
||||
|
||||
### 3. Integration with Existing Systems
|
||||
- **Config System**: Uses existing `config.LoadConfig()` and `config.SaveConfig()`
|
||||
- **Repository Factory**: Leverages existing `repository.ProviderFactory` interface
|
||||
- **HTTP Server**: Extends existing server without breaking changes
|
||||
- **Main Application**: Updated to pass `configPath` to HTTP server constructor
|
||||
|
||||
### 4. Configuration Flow
|
||||
1. **Detection**: `IsSetupRequired()` checks for existing valid configuration
|
||||
2. **System Analysis**: Hardware detection provides environment-specific recommendations
|
||||
3. **Repository Setup**: Validates credentials and connectivity to GitHub/Gitea
|
||||
4. **Configuration Generation**: Creates complete BZZZ configuration with validated settings
|
||||
5. **Persistence**: Saves configuration using existing YAML format
|
||||
|
||||
## API Usage Examples
|
||||
|
||||
### Check Setup Requirement
|
||||
```bash
|
||||
curl http://localhost:8080/api/setup/required
|
||||
# Returns: {"setup_required": true, "timestamp": 1692382800}
|
||||
```
|
||||
|
||||
### System Detection
|
||||
```bash
|
||||
curl http://localhost:8080/api/setup/system
|
||||
# Returns comprehensive system information including GPUs, network, storage
|
||||
```
|
||||
|
||||
### Repository Validation
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/setup/repository/validate \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"provider": "github",
|
||||
"access_token": "ghp_...",
|
||||
"owner": "myorg",
|
||||
"repository": "myrepo"
|
||||
}'
|
||||
```
|
||||
|
||||
### Save Configuration
|
||||
```bash
|
||||
curl -X POST http://localhost:8080/api/setup/save \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{
|
||||
"agent_id": "my-agent-001",
|
||||
"capabilities": ["general", "reasoning"],
|
||||
"models": ["phi3", "llama3.1"],
|
||||
"repository": {
|
||||
"provider": "github",
|
||||
"access_token": "ghp_...",
|
||||
"owner": "myorg",
|
||||
"repository": "myrepo"
|
||||
}
|
||||
}'
|
||||
```
|
||||
|
||||
## Key Integration Points
|
||||
|
||||
### With Existing Config System:
|
||||
- Respects existing configuration format and validation
|
||||
- Uses existing default values and environment variable overrides
|
||||
- Maintains backward compatibility with current config loading
|
||||
|
||||
### With Repository System:
|
||||
- Uses existing `repository.ProviderFactory` for GitHub/Gitea support
|
||||
- Validates actual repository connectivity using existing client implementations
|
||||
- Maintains existing task provider interface compatibility
|
||||
|
||||
### With HTTP Server:
|
||||
- Extends existing API server without breaking changes
|
||||
- Maintains existing CORS configuration and middleware
|
||||
- Preserves existing logging and hypercore endpoints
|
||||
|
||||
## Security Considerations
|
||||
- Setup endpoints only available when no valid configuration exists
|
||||
- Repository credentials validated before storage
|
||||
- Configuration validation prevents invalid states
|
||||
- Graceful handling of system detection failures
|
||||
|
||||
## Testing and Validation
|
||||
- Build verification completed successfully
|
||||
- API endpoint structure validated
|
||||
- Integration with existing systems verified
|
||||
- No breaking changes to existing functionality
|
||||
|
||||
## Next Steps for Frontend Integration
|
||||
The API provides comprehensive endpoints for a web-based setup wizard:
|
||||
1. System detection provides hardware-specific recommendations
|
||||
2. Repository validation enables real-time credential verification
|
||||
3. Configuration validation provides immediate feedback
|
||||
4. Save endpoint completes setup with restart indication
|
||||
|
||||
This backend implementation provides a solid foundation for the web configuration UI, integrating seamlessly with existing BZZZ systems while providing the comprehensive setup capabilities needed for initial system configuration.
|
||||
@@ -162,8 +162,9 @@ func (c *Client) verifyAccess() error {
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return fmt.Errorf("cannot access repository %s/%s: HTTP %d",
|
||||
c.config.Owner, c.config.Repository, resp.StatusCode)
|
||||
body, _ := io.ReadAll(resp.Body)
|
||||
return fmt.Errorf("cannot access repository %s/%s: HTTP %d - %s (URL: %s)",
|
||||
c.config.Owner, c.config.Repository, resp.StatusCode, string(body), url)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
504
install/BZZZ_WEB_UI_PLAN.md
Normal file
504
install/BZZZ_WEB_UI_PLAN.md
Normal file
@@ -0,0 +1,504 @@
|
||||
# BZZZ Built-in Web Configuration UI Development Plan
|
||||
|
||||
## Clear Separation of Responsibilities
|
||||
|
||||
### chorus.services (Installer Host)
|
||||
- ✅ **Already Complete**: Hosts `install-chorus-enhanced.sh`
|
||||
- ✅ **Single Purpose**: One-line installation script download
|
||||
- ✅ **Working**: `curl -fsSL https://chorus.services/install.sh | sh`
|
||||
|
||||
### BZZZ (This Plan)
|
||||
- 🔄 **To Implement**: Built-in web UI for cluster configuration
|
||||
- 🎯 **Purpose**: Post-installation setup wizard when no config exists
|
||||
- 🌐 **Location**: Served by BZZZ itself at `:8080/setup`
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
The BZZZ binary will serve its own web UI for configuration when:
|
||||
1. No configuration file exists (first run)
|
||||
2. User explicitly accesses `:8080/setup`
|
||||
3. Configuration is incomplete or invalid
|
||||
|
||||
## Implementation Strategy
|
||||
|
||||
### Phase 1: Integrate Web UI into BZZZ Binary
|
||||
|
||||
#### 1.1 Embed Web UI in Go Binary
|
||||
**File**: `main.go` and new `pkg/webui/`
|
||||
|
||||
```go
|
||||
//go:embed web-ui/dist/*
|
||||
var webUIFiles embed.FS
|
||||
|
||||
func main() {
|
||||
// Check if configuration exists
|
||||
if !configExists() {
|
||||
log.Println("🌐 No configuration found, starting setup wizard...")
|
||||
startWebUI()
|
||||
}
|
||||
|
||||
// Normal BZZZ startup
|
||||
startBZZZServices()
|
||||
}
|
||||
|
||||
func startWebUI() {
|
||||
// Serve embedded web UI
|
||||
// Start configuration wizard
|
||||
// Block until configuration is complete
|
||||
}
|
||||
```
|
||||
|
||||
#### 1.2 Extend Existing HTTP Server
|
||||
**File**: `api/http_server.go`
|
||||
|
||||
Add setup routes to existing server:
|
||||
```go
|
||||
func (h *HTTPServer) setupRoutes(router *mux.Router) {
|
||||
// Existing API routes
|
||||
api := router.PathPrefix("/api").Subrouter()
|
||||
// ... existing routes ...
|
||||
|
||||
// Setup wizard routes (only if no config exists)
|
||||
if !h.hasValidConfig() {
|
||||
h.setupWizardRoutes(router)
|
||||
}
|
||||
}
|
||||
|
||||
func (h *HTTPServer) setupWizardRoutes(router *mux.Router) {
|
||||
// Serve static web UI files
|
||||
router.PathPrefix("/setup").Handler(http.StripPrefix("/setup",
|
||||
http.FileServer(http.FS(webUIFiles))))
|
||||
|
||||
// Setup API endpoints
|
||||
setup := router.PathPrefix("/api/setup").Subrouter()
|
||||
setup.HandleFunc("/system", h.handleSystemDetection).Methods("GET")
|
||||
setup.HandleFunc("/repository", h.handleRepositoryConfig).Methods("GET", "POST")
|
||||
setup.HandleFunc("/cluster", h.handleClusterConfig).Methods("GET", "POST")
|
||||
setup.HandleFunc("/validate", h.handleValidateConfig).Methods("POST")
|
||||
setup.HandleFunc("/save", h.handleSaveConfig).Methods("POST")
|
||||
}
|
||||
```
|
||||
|
||||
### Phase 2: Configuration Management Integration
|
||||
|
||||
#### 2.1 Leverage Existing Config System
|
||||
**File**: `pkg/config/setup.go` (new)
|
||||
|
||||
```go
|
||||
type SetupManager struct {
|
||||
configPath string
|
||||
systemInfo *SystemInfo
|
||||
repoFactory *repository.DefaultProviderFactory
|
||||
taskCoordinator *coordinator.TaskCoordinator
|
||||
}
|
||||
|
||||
func (s *SetupManager) DetectSystem() (*SystemInfo, error) {
|
||||
// Hardware detection (GPU, CPU, memory)
|
||||
// Network interface discovery
|
||||
// Software prerequisites check
|
||||
return systemInfo, nil
|
||||
}
|
||||
|
||||
func (s *SetupManager) ValidateRepositoryConfig(config RepositoryConfig) error {
|
||||
// Use existing repository factory
|
||||
provider, err := s.repoFactory.CreateProvider(ctx, &repository.Config{
|
||||
Provider: config.Provider,
|
||||
BaseURL: config.BaseURL,
|
||||
AccessToken: config.Token,
|
||||
// ...
|
||||
})
|
||||
|
||||
// Test connectivity
|
||||
return provider.ListAvailableTasks()
|
||||
}
|
||||
|
||||
func (s *SetupManager) SaveConfiguration(config *SetupConfig) error {
|
||||
// Convert to existing config.Config format
|
||||
bzzzConfig := &config.Config{
|
||||
Node: config.NodeConfig,
|
||||
Repository: config.RepositoryConfig,
|
||||
Agent: config.AgentConfig,
|
||||
// ...
|
||||
}
|
||||
|
||||
// Save to YAML file
|
||||
return bzzzConfig.SaveToFile(s.configPath)
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2 Repository Integration
|
||||
**File**: `api/setup_repository.go` (new)
|
||||
|
||||
```go
|
||||
func (h *HTTPServer) handleRepositoryConfig(w http.ResponseWriter, r *http.Request) {
|
||||
if r.Method == "GET" {
|
||||
// Return current repository configuration
|
||||
config := h.setupManager.GetRepositoryConfig()
|
||||
json.NewEncoder(w).Encode(config)
|
||||
return
|
||||
}
|
||||
|
||||
// POST: Validate and save repository configuration
|
||||
var repoConfig RepositoryConfig
|
||||
if err := json.NewDecoder(r.Body).Decode(&repoConfig); err != nil {
|
||||
http.Error(w, "Invalid JSON", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
// Validate using existing repository factory
|
||||
if err := h.setupManager.ValidateRepositoryConfig(repoConfig); err != nil {
|
||||
http.Error(w, fmt.Sprintf("Repository validation failed: %v", err), http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
// Save configuration
|
||||
h.setupManager.SaveRepositoryConfig(repoConfig)
|
||||
json.NewEncoder(w).Encode(map[string]string{"status": "success"})
|
||||
}
|
||||
```
|
||||
|
||||
### Phase 3: Enhanced Web UI Components
|
||||
|
||||
#### 3.1 Complete Existing Components
|
||||
The config-ui framework exists but needs implementation:
|
||||
|
||||
**SystemDetection.tsx**:
|
||||
```typescript
|
||||
const SystemDetection = ({ onComplete, onBack }) => {
|
||||
const [systemInfo, setSystemInfo] = useState(null);
|
||||
const [loading, setLoading] = useState(true);
|
||||
|
||||
useEffect(() => {
|
||||
fetch('/api/setup/system')
|
||||
.then(res => res.json())
|
||||
.then(data => {
|
||||
setSystemInfo(data);
|
||||
setLoading(false);
|
||||
});
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h3>System Detection Results</h3>
|
||||
{systemInfo && (
|
||||
<div>
|
||||
<div>OS: {systemInfo.os}</div>
|
||||
<div>Architecture: {systemInfo.arch}</div>
|
||||
<div>GPUs: {systemInfo.gpus?.length || 0}</div>
|
||||
<div>Memory: {systemInfo.memory}</div>
|
||||
{systemInfo.gpus?.length > 1 && (
|
||||
<div className="alert alert-info">
|
||||
💡 Multi-GPU detected! Consider Parallama for optimal performance.
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
<button onClick={() => onComplete(systemInfo)}>Continue</button>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
**RepositoryConfiguration.tsx**:
|
||||
```typescript
|
||||
const RepositoryConfiguration = ({ onComplete, onBack, configData }) => {
|
||||
const [provider, setProvider] = useState('gitea');
|
||||
const [config, setConfig] = useState({
|
||||
provider: 'gitea',
|
||||
baseURL: 'http://ironwood:3000',
|
||||
owner: '',
|
||||
repository: '',
|
||||
token: ''
|
||||
});
|
||||
const [validating, setValidating] = useState(false);
|
||||
|
||||
const validateConfig = async () => {
|
||||
setValidating(true);
|
||||
try {
|
||||
const response = await fetch('/api/setup/repository', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(config)
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
onComplete(config);
|
||||
} else {
|
||||
const error = await response.text();
|
||||
alert(`Validation failed: ${error}`);
|
||||
}
|
||||
} catch (error) {
|
||||
alert(`Connection failed: ${error.message}`);
|
||||
}
|
||||
setValidating(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<h3>Repository Configuration</h3>
|
||||
<form onSubmit={(e) => { e.preventDefault(); validateConfig(); }}>
|
||||
<div>
|
||||
<label>Provider:</label>
|
||||
<select value={provider} onChange={(e) => setProvider(e.target.value)}>
|
||||
<option value="gitea">GITEA (Self-hosted)</option>
|
||||
<option value="github">GitHub</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
{provider === 'gitea' && (
|
||||
<div>
|
||||
<label>GITEA URL:</label>
|
||||
<input
|
||||
value={config.baseURL}
|
||||
onChange={(e) => setConfig({...config, baseURL: e.target.value})}
|
||||
placeholder="http://ironwood:3000"
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div>
|
||||
<label>Repository Owner:</label>
|
||||
<input
|
||||
value={config.owner}
|
||||
onChange={(e) => setConfig({...config, owner: e.target.value})}
|
||||
placeholder="username or organization"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label>Repository Name:</label>
|
||||
<input
|
||||
value={config.repository}
|
||||
onChange={(e) => setConfig({...config, repository: e.target.value})}
|
||||
placeholder="repository name"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label>Access Token:</label>
|
||||
<input
|
||||
type="password"
|
||||
value={config.token}
|
||||
onChange={(e) => setConfig({...config, token: e.target.value})}
|
||||
placeholder="access token"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<button type="button" onClick={onBack}>Back</button>
|
||||
<button type="submit" disabled={validating}>
|
||||
{validating ? 'Validating...' : 'Validate & Continue'}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
```
|
||||
|
||||
### Phase 4: Build Process Integration
|
||||
|
||||
#### 4.1 Web UI Build Integration
|
||||
**File**: `Makefile` or build script
|
||||
|
||||
```bash
|
||||
build-web-ui:
|
||||
cd install/config-ui && npm install && npm run build
|
||||
mkdir -p web-ui/dist
|
||||
cp -r install/config-ui/.next/static web-ui/dist/
|
||||
cp -r install/config-ui/out/* web-ui/dist/ 2>/dev/null || true
|
||||
|
||||
build-bzzz: build-web-ui
|
||||
go build -o bzzz main.go
|
||||
```
|
||||
|
||||
#### 4.2 Embed Files in Binary
|
||||
**File**: `pkg/webui/embed.go`
|
||||
|
||||
```go
|
||||
package webui
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"io/fs"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
//go:embed dist/*
|
||||
var webUIFiles embed.FS
|
||||
|
||||
func GetWebUIHandler() http.Handler {
|
||||
// Get the web-ui subdirectory
|
||||
webUIFS, err := fs.Sub(webUIFiles, "dist")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return http.FileServer(http.FS(webUIFS))
|
||||
}
|
||||
```
|
||||
|
||||
### Phase 5: Configuration Flow Integration
|
||||
|
||||
#### 5.1 Startup Logic
|
||||
**File**: `main.go`
|
||||
|
||||
```go
|
||||
func main() {
|
||||
configPath := getConfigPath()
|
||||
|
||||
// Check if configuration exists and is valid
|
||||
config, err := loadConfig(configPath)
|
||||
if err != nil || !isValidConfig(config) {
|
||||
fmt.Println("🌐 Starting BZZZ setup wizard...")
|
||||
fmt.Printf("📱 Open your browser to: http://localhost:8080/setup\n")
|
||||
|
||||
// Start HTTP server in setup mode
|
||||
startSetupMode(configPath)
|
||||
|
||||
// Wait for configuration to be saved
|
||||
waitForConfiguration(configPath)
|
||||
|
||||
// Reload configuration
|
||||
config, err = loadConfig(configPath)
|
||||
if err != nil {
|
||||
log.Fatal("Failed to load configuration after setup:", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Normal BZZZ startup with configuration
|
||||
fmt.Println("🚀 Starting BZZZ with configuration...")
|
||||
startNormalMode(config)
|
||||
}
|
||||
|
||||
func startSetupMode(configPath string) {
|
||||
// Start HTTP server in setup mode
|
||||
setupManager := NewSetupManager(configPath)
|
||||
httpServer := api.NewHTTPServer(8080, nil, nil)
|
||||
httpServer.SetSetupManager(setupManager)
|
||||
|
||||
go func() {
|
||||
if err := httpServer.Start(); err != nil {
|
||||
log.Fatal("Failed to start setup server:", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func waitForConfiguration(configPath string) {
|
||||
ticker := time.NewTicker(1 * time.Second)
|
||||
defer ticker.Stop()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ticker.C:
|
||||
if fileExists(configPath) {
|
||||
if config, err := loadConfig(configPath); err == nil && isValidConfig(config) {
|
||||
fmt.Println("✅ Configuration saved successfully!")
|
||||
return
|
||||
}
|
||||
}
|
||||
case <-time.After(30 * time.Minute):
|
||||
log.Fatal("Setup timeout - no configuration provided within 30 minutes")
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 5.2 Configuration Validation
|
||||
**File**: `pkg/config/validation.go`
|
||||
|
||||
```go
|
||||
func isValidConfig(config *Config) bool {
|
||||
// Check required fields
|
||||
if config.Node.ID == "" || config.Node.Role == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
// Check repository configuration
|
||||
if config.Repository.Provider == "" || config.Repository.Config.Owner == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
// Check agent configuration
|
||||
if config.Agent.ID == "" || len(config.Agent.Expertise) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
```
|
||||
|
||||
## Integration with Existing Systems
|
||||
|
||||
### ✅ **Leverage Without Changes**
|
||||
1. **HTTP Server** (`api/http_server.go`) - Extend with setup routes
|
||||
2. **Configuration System** (`pkg/config/`) - Use existing YAML structure
|
||||
3. **Repository Factory** (`repository/factory.go`) - Validate credentials
|
||||
4. **Task Coordinator** (`coordinator/task_coordinator.go`) - Agent management
|
||||
|
||||
### 🔧 **Minimal Extensions**
|
||||
1. **Setup Manager** - New component using existing systems
|
||||
2. **Web UI Routes** - Add to existing HTTP server
|
||||
3. **Embedded Files** - Add web UI to binary
|
||||
4. **Startup Logic** - Add configuration check to main.go
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
/home/tony/chorus/project-queues/active/BZZZ/
|
||||
├── main.go # Enhanced startup logic
|
||||
├── api/
|
||||
│ ├── http_server.go # Extended with setup routes
|
||||
│ ├── setup_handlers.go # New setup API handlers
|
||||
│ └── setup_repository.go # Repository configuration API
|
||||
├── pkg/
|
||||
│ ├── config/
|
||||
│ │ ├── config.go # Existing
|
||||
│ │ ├── setup.go # New setup manager
|
||||
│ │ └── validation.go # New validation logic
|
||||
│ └── webui/
|
||||
│ └── embed.go # New embedded web UI
|
||||
├── install/config-ui/ # Existing React app
|
||||
│ ├── app/setup/page.tsx # Existing wizard framework
|
||||
│ ├── app/setup/components/ # Complete component implementations
|
||||
│ └── package.json # Existing
|
||||
└── web-ui/ # Build output (embedded)
|
||||
└── dist/ # Generated by build process
|
||||
```
|
||||
|
||||
## Implementation Timeline
|
||||
|
||||
### Week 1: Core Integration
|
||||
- **Day 1**: Setup manager and configuration validation
|
||||
- **Day 2**: Extend HTTP server with setup routes
|
||||
- **Day 3**: Repository configuration API integration
|
||||
- **Day 4**: System detection and hardware profiling
|
||||
- **Day 5**: Build process and file embedding
|
||||
|
||||
### Week 2: Web UI Implementation
|
||||
- **Day 1-2**: Complete SystemDetection and RepositoryConfiguration components
|
||||
- **Day 3-4**: Cluster formation and validation components
|
||||
- **Day 5**: UI polish and error handling
|
||||
|
||||
### Week 3: Integration and Testing
|
||||
- **Day 1-2**: End-to-end configuration flow testing
|
||||
- **Day 3-4**: Multi-node cluster testing
|
||||
- **Day 5**: Documentation and deployment
|
||||
|
||||
## Success Criteria
|
||||
|
||||
### Technical
|
||||
- [ ] BZZZ binary serves web UI when no config exists
|
||||
- [ ] Complete 8-step setup wizard functional
|
||||
- [ ] Repository integration with GITEA/GitHub validation
|
||||
- [ ] Configuration saves to existing YAML format
|
||||
- [ ] Seamless transition from setup to normal operation
|
||||
|
||||
### User Experience
|
||||
- [ ] Zero-config startup launches web wizard
|
||||
- [ ] Intuitive setup flow with validation
|
||||
- [ ] Professional UI matching BZZZ branding
|
||||
- [ ] Clear error messages and recovery options
|
||||
- [ ] Mobile-responsive design
|
||||
|
||||
This plan keeps the clear separation between the chorus.services installer (already working) and BZZZ's built-in configuration system (to be implemented).
|
||||
251
install/ENHANCED_VS_VISION_COMPARISON.md
Normal file
251
install/ENHANCED_VS_VISION_COMPARISON.md
Normal file
@@ -0,0 +1,251 @@
|
||||
# Enhanced Installer vs INSTALLATION_SYSTEM Vision Comparison
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Our enhanced installer (`install-chorus-enhanced.sh`) addresses the **repository integration gap** but falls significantly short of the comprehensive **INSTALLATION_SYSTEM.md** vision. While we delivered immediate functionality, we missed the sophisticated multi-phase setup system with web UI that was originally planned.
|
||||
|
||||
## Detailed Feature Comparison
|
||||
|
||||
### ✅ **What We Successfully Delivered**
|
||||
|
||||
| Feature | Enhanced Installer | Original Vision | Status |
|
||||
|---------|-------------------|-----------------|--------|
|
||||
| One-command install | ✅ `curl \| sh` | ✅ `curl \| sh` | **MATCH** |
|
||||
| System detection | ✅ OS, arch, packages | ✅ Hardware, GPU, network | **PARTIAL** |
|
||||
| Binary installation | ✅ Architecture-specific | ✅ `/opt/bzzz/` structure | **BASIC** |
|
||||
| Service management | ✅ SystemD integration | ✅ SystemD + monitoring | **PARTIAL** |
|
||||
| Configuration generation | ✅ YAML config files | ✅ Web-based wizard | **SIMPLIFIED** |
|
||||
| Repository integration | ✅ GITEA/GitHub setup | ❌ Not specified | **EXCEEDED** |
|
||||
|
||||
### 🔴 **Critical Missing Components**
|
||||
|
||||
#### 1. Web-Based Configuration Interface
|
||||
**Vision**: React-based setup wizard at `:8080/setup`
|
||||
```
|
||||
🚀 8-Step Configuration Wizard:
|
||||
1. System Detection & Validation
|
||||
2. Network Configuration
|
||||
3. Security Setup
|
||||
4. AI Integration
|
||||
5. Resource Allocation
|
||||
6. Service Deployment
|
||||
7. Cluster Formation
|
||||
8. Testing & Validation
|
||||
```
|
||||
|
||||
**Our Implementation**: Command-line prompts only
|
||||
- ❌ No web UI
|
||||
- ❌ No beautiful React interface
|
||||
- ❌ No progressive setup wizard
|
||||
- ❌ No real-time validation
|
||||
|
||||
#### 2. GPU Detection & Parallama Integration
|
||||
**Vision**: Intelligent multi-GPU detection
|
||||
```bash
|
||||
🚀 Multi-GPU Setup Detected (4 NVIDIA GPUs)
|
||||
Parallama is RECOMMENDED for optimal multi-GPU performance!
|
||||
|
||||
Options:
|
||||
1. Install Parallama (recommended for GPU setups)
|
||||
2. Install standard Ollama
|
||||
3. Skip Ollama installation (configure later)
|
||||
```
|
||||
|
||||
**Our Implementation**: Basic Ollama installation
|
||||
- ❌ No GPU detection
|
||||
- ❌ No Parallama recommendation
|
||||
- ❌ No multi-GPU optimization
|
||||
- ✅ Basic Ollama model installation
|
||||
|
||||
#### 3. Advanced System Detection
|
||||
**Vision**: Comprehensive hardware analysis
|
||||
- CPU cores and model detection
|
||||
- GPU configuration (NVIDIA/AMD)
|
||||
- Memory and storage analysis
|
||||
- Network interface detection
|
||||
|
||||
**Our Implementation**: Basic OS detection
|
||||
- ✅ OS and architecture detection
|
||||
- ✅ Package manager detection
|
||||
- ❌ No hardware profiling
|
||||
- ❌ No GPU analysis
|
||||
|
||||
#### 4. Security Configuration
|
||||
**Vision**: Enterprise-grade security setup
|
||||
- SSH key generation/management
|
||||
- TLS/SSL certificate configuration
|
||||
- Authentication method selection (token, OAuth2, LDAP)
|
||||
- Security policy configuration
|
||||
|
||||
**Our Implementation**: Basic token storage
|
||||
- ✅ Repository token management
|
||||
- ✅ Secure file permissions
|
||||
- ❌ No SSH key management
|
||||
- ❌ No TLS configuration
|
||||
- ❌ No enterprise authentication
|
||||
|
||||
#### 5. Resource Management Interface
|
||||
**Vision**: Interactive resource allocation
|
||||
- CPU/Memory allocation sliders
|
||||
- Storage path configuration
|
||||
- GPU assignment for Parallama
|
||||
- Resource monitoring setup
|
||||
|
||||
**Our Implementation**: Static configuration
|
||||
- ✅ Basic resource settings in YAML
|
||||
- ❌ No interactive allocation
|
||||
- ❌ No resource monitoring
|
||||
- ❌ No GPU management
|
||||
|
||||
#### 6. Professional Installation Experience
|
||||
**Vision**: Modern, branded installation
|
||||
```bash
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
🔥 BZZZ Distributed AI Coordination Platform
|
||||
Installer v1.0
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
[INFO] Detected OS: Ubuntu 22.04
|
||||
[SUCCESS] System requirements check passed
|
||||
[SUCCESS] BZZZ binaries installed successfully
|
||||
```
|
||||
|
||||
**Our Implementation**: Basic colored output
|
||||
- ✅ Colored logging functions
|
||||
- ✅ ASCII banner
|
||||
- ❌ No professional progress indicators
|
||||
- ❌ No detailed installation steps
|
||||
|
||||
## Architecture Philosophy Differences
|
||||
|
||||
### Original INSTALLATION_SYSTEM Vision
|
||||
- **Web-First**: React-based configuration interface
|
||||
- **GPU-Optimized**: Parallama multi-GPU support
|
||||
- **Enterprise-Ready**: LDAP, TLS, advanced security
|
||||
- **Production-Grade**: Comprehensive monitoring and validation
|
||||
- **User-Friendly**: Beautiful UI with real-time feedback
|
||||
|
||||
### Our Enhanced Installer Implementation
|
||||
- **CLI-First**: Command-line configuration
|
||||
- **Repository-Focused**: Git-based task coordination
|
||||
- **Functional-Minimal**: Working system with basic features
|
||||
- **Manual-Friendly**: Interactive prompts and text output
|
||||
- **Gap-Solving**: Addresses immediate deployment needs
|
||||
|
||||
## Feature Gap Analysis
|
||||
|
||||
### 🔴 **HIGH PRIORITY MISSING**
|
||||
|
||||
1. **Web Configuration UI** (`/setup` interface)
|
||||
- Impact: No user-friendly setup experience
|
||||
- Effort: High (full React app)
|
||||
- Priority: Critical for adoption
|
||||
|
||||
2. **GPU Detection & Parallama**
|
||||
- Impact: Suboptimal multi-GPU performance
|
||||
- Effort: Medium (hardware detection)
|
||||
- Priority: High for AI workloads
|
||||
|
||||
3. **Advanced System Detection**
|
||||
- Impact: Manual configuration required
|
||||
- Effort: Medium (system introspection)
|
||||
- Priority: Medium for automation
|
||||
|
||||
### 🟡 **MEDIUM PRIORITY MISSING**
|
||||
|
||||
4. **SSH Key Management**
|
||||
- Impact: Manual cluster deployment
|
||||
- Effort: Medium (key generation/distribution)
|
||||
- Priority: Medium for scaling
|
||||
|
||||
5. **Resource Allocation Interface**
|
||||
- Impact: Static resource assignment
|
||||
- Effort: High (interactive UI)
|
||||
- Priority: Medium for optimization
|
||||
|
||||
6. **TLS/SSL Configuration**
|
||||
- Impact: Insecure communications
|
||||
- Effort: Medium (cert management)
|
||||
- Priority: Medium for production
|
||||
|
||||
### 🟢 **LOW PRIORITY MISSING**
|
||||
|
||||
7. **LDAP/Enterprise Auth**
|
||||
- Impact: Basic authentication only
|
||||
- Effort: High (enterprise integration)
|
||||
- Priority: Low for initial deployment
|
||||
|
||||
8. **Advanced Monitoring**
|
||||
- Impact: Basic health checking
|
||||
- Effort: Medium (monitoring stack)
|
||||
- Priority: Low for MVP
|
||||
|
||||
## What We Actually Built vs Vision
|
||||
|
||||
### Our Enhanced Installer Strengths
|
||||
✅ **Repository Integration**: Complete GITEA/GitHub setup
|
||||
✅ **Working System**: Functional task coordination immediately
|
||||
✅ **Simple Deployment**: Single command installation
|
||||
✅ **Documentation**: Comprehensive setup guide
|
||||
✅ **Token Management**: Secure credential handling
|
||||
|
||||
### Vision's Comprehensive Approach
|
||||
🔴 **Missing Web UI**: No React-based setup wizard
|
||||
🔴 **Missing GPU Optimization**: No Parallama integration
|
||||
🔴 **Missing Enterprise Features**: No LDAP, TLS, advanced security
|
||||
🔴 **Missing Resource Management**: No interactive allocation
|
||||
🔴 **Missing Professional UX**: No modern installation experience
|
||||
|
||||
## Implementation Recommendations
|
||||
|
||||
### Immediate (Address Critical Gaps)
|
||||
1. **Create Web UI** - Implement basic `/setup` interface
|
||||
2. **Add GPU Detection** - Basic hardware profiling
|
||||
3. **Improve Installation UX** - Better progress indicators
|
||||
|
||||
### Medium-term (Professional Features)
|
||||
1. **Parallama Integration** - Multi-GPU optimization
|
||||
2. **SSH Key Management** - Automated cluster deployment
|
||||
3. **Resource Allocation** - Interactive configuration
|
||||
|
||||
### Long-term (Enterprise Grade)
|
||||
1. **Advanced Security** - TLS, LDAP, enterprise auth
|
||||
2. **Monitoring Stack** - Comprehensive system monitoring
|
||||
3. **Professional UI** - Full React setup wizard
|
||||
|
||||
## Strategic Decision Points
|
||||
|
||||
### Current State Assessment
|
||||
- ✅ **Functional**: System works for task coordination
|
||||
- ✅ **Deployable**: Can install and run immediately
|
||||
- ❌ **Professional**: Lacks enterprise-grade UX
|
||||
- ❌ **Optimized**: Missing GPU and resource optimization
|
||||
- ❌ **Scalable**: No automated cluster deployment
|
||||
|
||||
### Path Forward Options
|
||||
|
||||
#### Option A: Enhance Current Approach
|
||||
- Add web UI to existing installer
|
||||
- Maintain CLI-first philosophy
|
||||
- Gradual feature addition
|
||||
|
||||
#### Option B: Rebuild to Vision
|
||||
- Implement full INSTALLATION_SYSTEM design
|
||||
- Web-first configuration experience
|
||||
- Complete feature parity
|
||||
|
||||
#### Option C: Hybrid Approach
|
||||
- Keep working CLI installer
|
||||
- Build parallel web UI system
|
||||
- Allow both installation methods
|
||||
|
||||
## Conclusion
|
||||
|
||||
Our enhanced installer successfully **solved the immediate repository integration problem** but represents a **significant simplification** of the original comprehensive vision.
|
||||
|
||||
**Current Achievement**: ✅ Working repository-integrated task coordination system
|
||||
**Original Vision**: 🔴 Professional, GPU-optimized, web-based installation platform
|
||||
|
||||
The implementation prioritizes **immediate functionality** over **comprehensive user experience**. While this enables rapid deployment and testing, it means we're missing the professional installation experience that would make BZZZ competitive with enterprise platforms.
|
||||
|
||||
**Strategic Recommendation**: Implement the web UI (`/setup` interface) as the next major milestone to bridge the gap between our functional system and the original professional vision.
|
||||
245
install/PLAN_COMPARISON.md
Normal file
245
install/PLAN_COMPARISON.md
Normal file
@@ -0,0 +1,245 @@
|
||||
# BZZZ Installer: Plan vs Implementation Comparison
|
||||
|
||||
## Executive Summary
|
||||
|
||||
Our enhanced installer (`install-chorus-enhanced.sh`) addresses **Phase 1: Initial Node Setup** but diverges significantly from the original comprehensive deployment plan. The implementation prioritizes immediate functionality over the sophisticated multi-phase security architecture originally envisioned.
|
||||
|
||||
## Phase-by-Phase Analysis
|
||||
|
||||
### ✅ Phase 1: Initial Node Setup & Key Generation
|
||||
|
||||
**Original Plan:**
|
||||
- Web UI at `:8080/setup` for configuration
|
||||
- Master key generation with ONCE-ONLY display
|
||||
- Shamir's Secret Sharing for admin keys
|
||||
- Security-first design with complex key management
|
||||
|
||||
**Our Implementation:**
|
||||
- ✅ Single-command installation (`curl | sh`)
|
||||
- ✅ System detection and validation
|
||||
- ✅ BZZZ binary installation
|
||||
- ✅ Interactive configuration prompts
|
||||
- ❌ **MAJOR GAP**: No web UI setup interface
|
||||
- ❌ **CRITICAL MISSING**: No master key generation
|
||||
- ❌ **SECURITY GAP**: No Shamir's Secret Sharing
|
||||
- ❌ **SIMPLIFICATION**: Basic YAML config instead of sophisticated key management
|
||||
|
||||
**Gap Assessment:** 🔴 **SIGNIFICANT DEVIATION**
|
||||
The enhanced installer implements a simplified approach focused on repository integration rather than the security-first cryptographic design.
|
||||
|
||||
### ❌ Phase 2: SSH Cluster Deployment
|
||||
|
||||
**Original Plan:**
|
||||
- Web UI for manual IP entry
|
||||
- SSH-based remote installation across cluster
|
||||
- Automated deployment to multiple nodes
|
||||
- Cluster coordination through central web interface
|
||||
|
||||
**Our Implementation:**
|
||||
- ✅ Manual installation per node (user runs script on each machine)
|
||||
- ✅ Repository configuration with credentials
|
||||
- ❌ **MISSING**: No SSH-based remote deployment
|
||||
- ❌ **MISSING**: No centralized cluster management
|
||||
- ❌ **MANUAL PROCESS**: User must run installer on each node individually
|
||||
|
||||
**Gap Assessment:** 🔴 **NOT IMPLEMENTED**
|
||||
Current approach requires manual installation on each node. No automated cluster deployment.
|
||||
|
||||
### ❌ Phase 3: P2P Network Formation & Capability Discovery
|
||||
|
||||
**Original Plan:**
|
||||
- Automatic P2P network bootstrap
|
||||
- Capability announcement (GPU, CPU, memory, storage)
|
||||
- Dynamic network topology optimization
|
||||
- Shamir share distribution across peers
|
||||
|
||||
**Our Implementation:**
|
||||
- ✅ P2P network components exist in codebase
|
||||
- ✅ Node capability configuration in YAML
|
||||
- ❌ **MISSING**: No automatic capability discovery
|
||||
- ❌ **MISSING**: No dynamic network formation
|
||||
- ❌ **MISSING**: No Shamir share distribution
|
||||
|
||||
**Gap Assessment:** 🔴 **FOUNDATIONAL MISSING**
|
||||
P2P capabilities exist but installer doesn't configure automatic network formation.
|
||||
|
||||
### ❌ Phase 4: Leader Election & SLURP Responsibilities
|
||||
|
||||
**Original Plan:**
|
||||
- Sophisticated leader election with weighted scoring
|
||||
- SLURP (Service Layer Unified Resource Protocol) coordination
|
||||
- Leader handles resource orchestration and model distribution
|
||||
- Clear separation between Leader (operations) and Admin (oversight)
|
||||
|
||||
**Our Implementation:**
|
||||
- ✅ Election code exists in codebase (`pkg/election/`)
|
||||
- ✅ SLURP architecture implemented
|
||||
- ❌ **MISSING**: No automatic leader election setup
|
||||
- ❌ **MISSING**: No SLURP coordination configuration
|
||||
- ❌ **CONFIGURATION GAP**: Manual role assignment only
|
||||
|
||||
**Gap Assessment:** 🔴 **ADVANCED FEATURES MISSING**
|
||||
Infrastructure exists but not activated by installer.
|
||||
|
||||
### ❌ Phase 5: Business Configuration & DHT Storage
|
||||
|
||||
**Original Plan:**
|
||||
- DHT network for distributed business data storage
|
||||
- UCXL addressing for configuration data
|
||||
- Migration from local to distributed storage
|
||||
- Encrypted business data in DHT
|
||||
|
||||
**Our Implementation:**
|
||||
- ✅ DHT code exists (`pkg/dht/`)
|
||||
- ✅ UCXL addressing implemented
|
||||
- ❌ **MISSING**: No DHT network activation
|
||||
- ❌ **MISSING**: No business data migration
|
||||
- ❌ **BASIC CONFIG**: Simple local YAML files only
|
||||
|
||||
**Gap Assessment:** 🔴 **DISTRIBUTED STORAGE UNUSED**
|
||||
Sophisticated storage architecture exists but installer uses basic local configs.
|
||||
|
||||
### ❌ Phase 6: Model Distribution & Synchronization
|
||||
|
||||
**Original Plan:**
|
||||
- P2P model distribution based on VRAM capacity
|
||||
- Automatic model replication and redundancy
|
||||
- Load balancing and geographic distribution
|
||||
- Version synchronization (marked as TODO in plan)
|
||||
|
||||
**Our Implementation:**
|
||||
- ✅ Ollama integration for model management
|
||||
- ✅ Model installation via command line flags
|
||||
- ❌ **MISSING**: No P2P model distribution
|
||||
- ❌ **MISSING**: No automatic model replication
|
||||
- ❌ **SIMPLE**: Local Ollama model installation only
|
||||
|
||||
**Gap Assessment:** 🔴 **BASIC MODEL MANAGEMENT**
|
||||
Individual node model installation, no cluster-wide distribution.
|
||||
|
||||
### ❌ Phase 7: Role-Based Key Generation
|
||||
|
||||
**Original Plan:**
|
||||
- Dynamic role definition via web UI
|
||||
- Admin key reconstruction for role signing
|
||||
- Role-based access control deployment
|
||||
- Sophisticated permission management
|
||||
|
||||
**Our Implementation:**
|
||||
- ✅ Repository-based role assignment (basic)
|
||||
- ✅ Agent role configuration in YAML
|
||||
- ❌ **MISSING**: No dynamic role creation
|
||||
- ❌ **MISSING**: No key-based role management
|
||||
- ❌ **BASIC**: Simple string-based role assignment
|
||||
|
||||
**Gap Assessment:** 🔴 **ENTERPRISE FEATURES MISSING**
|
||||
Basic role strings instead of cryptographic role management.
|
||||
|
||||
## Implementation Philosophy Divergence
|
||||
|
||||
### Original Plan Philosophy
|
||||
- **Security-First**: Complex cryptographic key management
|
||||
- **Enterprise-Grade**: Sophisticated multi-phase deployment
|
||||
- **Centralized Management**: Web UI for cluster coordination
|
||||
- **Automated Operations**: SSH-based remote deployment
|
||||
- **Distributed Architecture**: DHT storage, P2P model distribution
|
||||
|
||||
### Our Implementation Philosophy
|
||||
- **Simplicity-First**: Get working system quickly
|
||||
- **Repository-Centric**: Focus on task coordination via Git
|
||||
- **Manual-Friendly**: User-driven installation per node
|
||||
- **Local Configuration**: YAML files instead of distributed storage
|
||||
- **Immediate Functionality**: Working agent over complex architecture
|
||||
|
||||
## Critical Missing Components
|
||||
|
||||
### 🔴 HIGH PRIORITY GAPS
|
||||
|
||||
1. **Web UI Setup Interface**
|
||||
- Original: Rich web interface at `:8080/setup`
|
||||
- Current: Command-line prompts only
|
||||
- Impact: No user-friendly cluster management
|
||||
|
||||
2. **Master Key Generation & Display**
|
||||
- Original: One-time master key display with security warnings
|
||||
- Current: No cryptographic key management
|
||||
- Impact: No secure cluster recovery mechanism
|
||||
|
||||
3. **SSH-Based Cluster Deployment**
|
||||
- Original: Deploy from one node to entire cluster
|
||||
- Current: Manual installation on each node
|
||||
- Impact: Scaling difficulty, no centralized deployment
|
||||
|
||||
4. **Automatic P2P Network Formation**
|
||||
- Original: Nodes discover and organize automatically
|
||||
- Current: Static configuration per node
|
||||
- Impact: No dynamic cluster topology
|
||||
|
||||
### 🟡 MEDIUM PRIORITY GAPS
|
||||
|
||||
5. **Shamir's Secret Sharing**
|
||||
- Original: Distributed admin key management
|
||||
- Current: No key splitting or distribution
|
||||
- Impact: Single points of failure
|
||||
|
||||
6. **Leader Election Activation**
|
||||
- Original: Automatic leader selection with weighted scoring
|
||||
- Current: Manual coordinator assignment
|
||||
- Impact: No dynamic leadership, manual failover
|
||||
|
||||
7. **DHT Business Configuration**
|
||||
- Original: Distributed configuration storage
|
||||
- Current: Local YAML files
|
||||
- Impact: No configuration replication or consistency
|
||||
|
||||
8. **P2P Model Distribution**
|
||||
- Original: Cluster-wide model synchronization
|
||||
- Current: Individual node model management
|
||||
- Impact: Manual model management across cluster
|
||||
|
||||
## Architectural Trade-offs Made
|
||||
|
||||
### ✅ **GAINED: Simplicity & Speed**
|
||||
- Fast installation (single command)
|
||||
- Working system in minutes
|
||||
- Repository integration works immediately
|
||||
- Clear configuration files
|
||||
- Easy troubleshooting
|
||||
|
||||
### ❌ **LOST: Enterprise Features**
|
||||
- No centralized cluster management
|
||||
- No cryptographic security model
|
||||
- No automatic scaling capabilities
|
||||
- No distributed configuration
|
||||
- No sophisticated failure recovery
|
||||
|
||||
## Recommendations
|
||||
|
||||
### Short-term (Immediate)
|
||||
1. **Document the gap** - Users need to understand current limitations
|
||||
2. **Manual cluster setup guide** - Document how to deploy across multiple nodes manually
|
||||
3. **Basic health checking** - Add cluster connectivity validation
|
||||
4. **Configuration templates** - Provide coordinator vs worker config examples
|
||||
|
||||
### Medium-term (Next Phase)
|
||||
1. **Web UI Development** - Implement the missing `:8080/setup` interface
|
||||
2. **SSH Deployment Module** - Add remote installation capabilities
|
||||
3. **P2P Network Activation** - Enable automatic peer discovery
|
||||
4. **Basic Key Management** - Implement simplified security model
|
||||
|
||||
### Long-term (Strategic)
|
||||
1. **Full Plan Implementation** - Gradually implement all 7 phases
|
||||
2. **Security Architecture** - Add Shamir's Secret Sharing and master keys
|
||||
3. **Enterprise Features** - Leader election, DHT storage, model distribution
|
||||
4. **Migration Path** - Allow upgrading from simple to sophisticated deployment
|
||||
|
||||
## Conclusion
|
||||
|
||||
Our enhanced installer successfully delivers **immediate functionality** for repository-based task coordination but represents a **significant simplification** of the original comprehensive plan.
|
||||
|
||||
**Current State:** ✅ Single-node ready, repository integrated, immediately useful
|
||||
**Original Vision:** 🔴 Enterprise-grade, security-first, fully distributed cluster
|
||||
|
||||
The implementation prioritizes **time-to-value** over **comprehensive architecture**. While this enables rapid deployment and testing, it means users must manually scale and manage clusters rather than having sophisticated automated deployment and management capabilities.
|
||||
|
||||
**Strategic Decision Point:** Continue with simplified approach for rapid iteration, or invest in implementing the full sophisticated architecture as originally planned.
|
||||
355
install/SETUP_INTEGRATION_GUIDE.md
Normal file
355
install/SETUP_INTEGRATION_GUIDE.md
Normal file
@@ -0,0 +1,355 @@
|
||||
# BZZZ Web Configuration Setup Integration Guide
|
||||
|
||||
This guide explains how to use the new integrated web-based configuration system for BZZZ.
|
||||
|
||||
## Overview
|
||||
|
||||
BZZZ now includes an embedded web configuration interface that automatically activates when:
|
||||
- No configuration file exists
|
||||
- The existing configuration is invalid or incomplete
|
||||
- Setup is explicitly required
|
||||
|
||||
## Features
|
||||
|
||||
### 🎯 Automatic Setup Detection
|
||||
- BZZZ automatically detects when setup is required on startup
|
||||
- No separate installation or configuration needed
|
||||
- Seamless transition from setup to normal operation
|
||||
|
||||
### 🌐 Embedded Web Interface
|
||||
- Complete React-based setup wizard embedded in the Go binary
|
||||
- No external dependencies required
|
||||
- Works offline and in air-gapped environments
|
||||
|
||||
### 🔧 Comprehensive Configuration
|
||||
- System detection and hardware analysis
|
||||
- Repository integration (GitHub, GitLab, Gitea)
|
||||
- Network and security configuration
|
||||
- AI model and capability setup
|
||||
- Service deployment options
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Build BZZZ with Embedded UI
|
||||
|
||||
```bash
|
||||
# Build the complete system with embedded web UI
|
||||
make build
|
||||
|
||||
# Or build just the binary (uses placeholder UI)
|
||||
make build-go
|
||||
```
|
||||
|
||||
### 2. First-Time Setup
|
||||
|
||||
```bash
|
||||
# Start BZZZ - it will automatically enter setup mode
|
||||
./build/bzzz
|
||||
|
||||
# Or use the transition script for guided setup
|
||||
./scripts/setup-transition.sh
|
||||
```
|
||||
|
||||
### 3. Access Setup Interface
|
||||
|
||||
Open your browser to: **http://localhost:8080**
|
||||
|
||||
The setup wizard will guide you through:
|
||||
1. **System Detection** - Hardware and environment analysis
|
||||
2. **Agent Configuration** - ID, capabilities, and AI models
|
||||
3. **Repository Setup** - Git integration configuration
|
||||
4. **Network Configuration** - P2P and cluster settings
|
||||
5. **Security Setup** - Encryption and access control
|
||||
6. **Service Deployment** - Additional services configuration
|
||||
7. **Testing & Validation** - Configuration verification
|
||||
|
||||
### 4. Complete Setup
|
||||
|
||||
After saving configuration:
|
||||
1. BZZZ will create the configuration file
|
||||
2. Restart BZZZ to enter normal operation mode
|
||||
3. The web interface will no longer be available
|
||||
|
||||
## Development Workflow
|
||||
|
||||
### Building the Web UI
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
make deps
|
||||
|
||||
# Build just the web UI
|
||||
make build-ui
|
||||
|
||||
# Embed web UI in Go binary
|
||||
make embed-ui
|
||||
|
||||
# Complete build process
|
||||
make build
|
||||
```
|
||||
|
||||
### Development Mode
|
||||
|
||||
```bash
|
||||
# Start both React dev server and Go API
|
||||
make dev
|
||||
|
||||
# React UI: http://localhost:3000
|
||||
# Go API: http://localhost:8080
|
||||
```
|
||||
|
||||
### Project Structure
|
||||
|
||||
```
|
||||
BZZZ/
|
||||
├── install/config-ui/ # React setup wizard
|
||||
│ ├── app/ # Next.js application
|
||||
│ ├── package.json # Node.js dependencies
|
||||
│ └── next.config.js # Build configuration
|
||||
├── pkg/web/ # Embedded file system
|
||||
│ ├── embed.go # File embedding logic
|
||||
│ └── index.html # Fallback page
|
||||
├── api/ # Go HTTP server
|
||||
│ ├── http_server.go # Main server with setup routes
|
||||
│ └── setup_manager.go # Setup logic
|
||||
├── Makefile # Build automation
|
||||
└── scripts/
|
||||
└── setup-transition.sh # Setup helper script
|
||||
```
|
||||
|
||||
## Configuration Management
|
||||
|
||||
### Configuration Files
|
||||
|
||||
- **Default Location**: `~/.bzzz/config.yaml`
|
||||
- **Environment Override**: `BZZZ_CONFIG_PATH`
|
||||
- **Backup Directory**: `~/.bzzz/backups/`
|
||||
|
||||
### Setup Requirements Detection
|
||||
|
||||
BZZZ checks for setup requirements using:
|
||||
1. Configuration file existence
|
||||
2. Configuration file validity
|
||||
3. Essential fields completion (Agent ID, capabilities, models)
|
||||
|
||||
### Configuration Validation
|
||||
|
||||
The setup system validates:
|
||||
- Required fields presence
|
||||
- Repository connectivity
|
||||
- AI model availability
|
||||
- Network configuration
|
||||
- Security settings
|
||||
|
||||
## API Endpoints
|
||||
|
||||
### Setup Mode APIs
|
||||
|
||||
When in setup mode, BZZZ exposes these endpoints:
|
||||
|
||||
```bash
|
||||
# Check if setup is required
|
||||
GET /api/setup/required
|
||||
|
||||
# Get system information
|
||||
GET /api/setup/system
|
||||
|
||||
# Validate repository configuration
|
||||
POST /api/setup/repository/validate
|
||||
|
||||
# Get supported repository providers
|
||||
GET /api/setup/repository/providers
|
||||
|
||||
# Validate complete configuration
|
||||
POST /api/setup/validate
|
||||
|
||||
# Save configuration
|
||||
POST /api/setup/save
|
||||
|
||||
# Health check
|
||||
GET /api/health
|
||||
```
|
||||
|
||||
### Web UI Routes
|
||||
|
||||
```bash
|
||||
# Setup interface (embedded React app)
|
||||
GET /
|
||||
GET /setup
|
||||
GET /setup/*
|
||||
|
||||
# API proxy (development only)
|
||||
/api/* -> http://localhost:8080/api/*
|
||||
```
|
||||
|
||||
## Deployment Scenarios
|
||||
|
||||
### 1. Fresh Installation
|
||||
|
||||
```bash
|
||||
# Build and start BZZZ
|
||||
make build
|
||||
./build/bzzz
|
||||
|
||||
# Access setup at http://localhost:8080
|
||||
# Complete configuration wizard
|
||||
# Restart BZZZ for normal operation
|
||||
```
|
||||
|
||||
### 2. Existing Installation
|
||||
|
||||
```bash
|
||||
# Backup existing configuration
|
||||
./scripts/setup-transition.sh
|
||||
|
||||
# BZZZ will use existing config if valid
|
||||
# Or enter setup mode if invalid
|
||||
```
|
||||
|
||||
### 3. Container Deployment
|
||||
|
||||
```dockerfile
|
||||
# Build container with embedded UI
|
||||
FROM golang:1.21-alpine AS builder
|
||||
COPY . /app
|
||||
WORKDIR /app
|
||||
RUN make build
|
||||
|
||||
FROM alpine:latest
|
||||
COPY --from=builder /app/build/bzzz /usr/local/bin/
|
||||
EXPOSE 8080
|
||||
CMD ["bzzz"]
|
||||
```
|
||||
|
||||
### 4. Cluster Deployment
|
||||
|
||||
```bash
|
||||
# Build BZZZ with embedded UI
|
||||
make build
|
||||
|
||||
# Deploy to each cluster node
|
||||
scp build/bzzz node1:/usr/local/bin/
|
||||
ssh node1 'bzzz' # Setup via web interface
|
||||
|
||||
# Repeat for additional nodes
|
||||
# Nodes will discover each other via mDNS
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Web UI Not Loading**
|
||||
```bash
|
||||
# Check if web UI was built
|
||||
make build-ui
|
||||
|
||||
# Verify embedded files
|
||||
ls -la pkg/web/
|
||||
|
||||
# Rebuild if necessary
|
||||
make clean && make build
|
||||
```
|
||||
|
||||
**Setup Not Starting**
|
||||
```bash
|
||||
# Check configuration status
|
||||
./scripts/setup-transition.sh
|
||||
|
||||
# Force setup mode by removing config
|
||||
rm ~/.bzzz/config.yaml
|
||||
./build/bzzz
|
||||
```
|
||||
|
||||
**Port Conflicts**
|
||||
```bash
|
||||
# Check if port 8080 is in use
|
||||
netstat -tulpn | grep 8080
|
||||
|
||||
# Kill conflicting processes
|
||||
sudo lsof -ti:8080 | xargs kill -9
|
||||
```
|
||||
|
||||
### Debug Mode
|
||||
|
||||
```bash
|
||||
# Enable debug logging
|
||||
export BZZZ_LOG_LEVEL=debug
|
||||
./build/bzzz
|
||||
|
||||
# Check embedded files
|
||||
curl http://localhost:8080/api/health
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### Network Security
|
||||
- Setup interface only accessible on localhost by default
|
||||
- CORS enabled for development, restricted in production
|
||||
- HTTPS recommended for external access
|
||||
|
||||
### Configuration Security
|
||||
- Sensitive values (tokens, keys) stored in separate files
|
||||
- Configuration backups created automatically
|
||||
- Audit logging for configuration changes
|
||||
|
||||
### Access Control
|
||||
- Setup mode automatically disabled after configuration
|
||||
- No authentication required for initial setup
|
||||
- Full authentication required for normal operation
|
||||
|
||||
## Advanced Usage
|
||||
|
||||
### Custom Build Configuration
|
||||
|
||||
```bash
|
||||
# Build with custom UI path
|
||||
UI_DIR=custom-ui make build
|
||||
|
||||
# Build without UI (API only)
|
||||
make build-go
|
||||
|
||||
# Production build with optimizations
|
||||
NODE_ENV=production make build
|
||||
```
|
||||
|
||||
### Configuration Migration
|
||||
|
||||
```bash
|
||||
# Export existing configuration
|
||||
bzzz --export-config > backup.yaml
|
||||
|
||||
# Import configuration
|
||||
bzzz --import-config backup.yaml
|
||||
|
||||
# Validate configuration
|
||||
bzzz --config-check
|
||||
```
|
||||
|
||||
### Integration Testing
|
||||
|
||||
```bash
|
||||
# Test complete setup flow
|
||||
make test
|
||||
|
||||
# Test web UI components
|
||||
cd install/config-ui && npm test
|
||||
|
||||
# Test Go integration
|
||||
go test ./api/...
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
After completing setup:
|
||||
|
||||
1. **Verify Operation**: Check BZZZ logs and peer connections
|
||||
2. **Configure Repositories**: Add GitHub/GitLab tokens and repositories
|
||||
3. **Join Cluster**: Configure additional nodes to join the cluster
|
||||
4. **Monitor Health**: Use `/api/health` endpoint for monitoring
|
||||
5. **Scale Services**: Deploy additional BZZZ components as needed
|
||||
|
||||
For advanced configuration and cluster management, see:
|
||||
- [BZZZ Architecture Documentation](../docs/BZZZ-2B-ARCHITECTURE.md)
|
||||
- [Operations Guide](../docs/BZZZv2B-OPERATIONS.md)
|
||||
- [Developer Manual](../docs/BZZZv2B-DEVELOPER.md)
|
||||
425
install/WEB_UI_DEVELOPMENT_PLAN.md
Normal file
425
install/WEB_UI_DEVELOPMENT_PLAN.md
Normal file
@@ -0,0 +1,425 @@
|
||||
# BZZZ Web Installation/Configuration Development Plan
|
||||
|
||||
## Overview
|
||||
|
||||
This plan leverages existing BZZZ infrastructure to implement the missing web-based installation and configuration functionality without reinventing the wheel. We'll integrate the existing config-ui with our enhanced installer and BZZZ's existing systems.
|
||||
|
||||
## Existing Infrastructure Analysis
|
||||
|
||||
### ✅ **What We Already Have**
|
||||
|
||||
1. **HTTP API Server** (`api/http_server.go`)
|
||||
- Existing HTTP server with CORS support
|
||||
- Health endpoints (`/api/health`, `/api/status`)
|
||||
- Hypercore log API endpoints
|
||||
- Gorilla Mux router setup
|
||||
|
||||
2. **Config UI Foundation** (`install/config-ui/`)
|
||||
- Complete Next.js 14 setup
|
||||
- 8-step setup wizard framework
|
||||
- TypeScript + Tailwind CSS
|
||||
- Component structure already defined
|
||||
- Progress tracking and navigation
|
||||
|
||||
3. **Task Coordinator** (`coordinator/task_coordinator.go`)
|
||||
- Agent management and role assignment
|
||||
- Repository integration framework
|
||||
- Status reporting capabilities
|
||||
|
||||
4. **Configuration System** (`pkg/config/`)
|
||||
- YAML configuration management
|
||||
- Role and agent configuration
|
||||
- Network and service settings
|
||||
|
||||
5. **Repository Integration** (`repository/factory.go`)
|
||||
- GITEA and GitHub providers
|
||||
- Task management interfaces
|
||||
- Credential handling
|
||||
|
||||
## Implementation Strategy
|
||||
|
||||
### Phase 1: Backend API Integration (1-2 days)
|
||||
|
||||
#### 1.1 Extend HTTP Server with Setup APIs
|
||||
**File**: `api/http_server.go`
|
||||
|
||||
Add new endpoints to existing server:
|
||||
```go
|
||||
// Setup and configuration endpoints
|
||||
api.HandleFunc("/setup/system", h.handleSystemInfo).Methods("GET")
|
||||
api.HandleFunc("/setup/network", h.handleNetworkConfig).Methods("GET", "POST")
|
||||
api.HandleFunc("/setup/security", h.handleSecurityConfig).Methods("GET", "POST")
|
||||
api.HandleFunc("/setup/ai", h.handleAIConfig).Methods("GET", "POST")
|
||||
api.HandleFunc("/setup/resources", h.handleResourceConfig).Methods("GET", "POST")
|
||||
api.HandleFunc("/setup/deploy", h.handleServiceDeploy).Methods("POST")
|
||||
api.HandleFunc("/setup/cluster", h.handleClusterConfig).Methods("GET", "POST")
|
||||
api.HandleFunc("/setup/validate", h.handleValidation).Methods("POST")
|
||||
|
||||
// Repository configuration (integrate with existing factory)
|
||||
api.HandleFunc("/setup/repository", h.handleRepositoryConfig).Methods("GET", "POST")
|
||||
```
|
||||
|
||||
#### 1.2 System Detection Integration
|
||||
Leverage existing system info from enhanced installer:
|
||||
```go
|
||||
func (h *HTTPServer) handleSystemInfo(w http.ResponseWriter, r *http.Request) {
|
||||
info := map[string]interface{}{
|
||||
"os": detectOS(), // From enhanced installer
|
||||
"architecture": detectArchitecture(), // From enhanced installer
|
||||
"hardware": detectHardware(), // New GPU detection
|
||||
"network": detectNetwork(), // Network interface discovery
|
||||
"services": detectServices(), // Docker, Ollama status
|
||||
}
|
||||
json.NewEncoder(w).Encode(info)
|
||||
}
|
||||
```
|
||||
|
||||
#### 1.3 Configuration Management
|
||||
Extend existing config system to support web updates:
|
||||
```go
|
||||
// New file: api/setup_handlers.go
|
||||
type SetupManager struct {
|
||||
configPath string
|
||||
coordinator *coordinator.TaskCoordinator
|
||||
repoFactory *repository.DefaultProviderFactory
|
||||
}
|
||||
|
||||
func (s *SetupManager) UpdateNetworkConfig(config NetworkConfig) error {
|
||||
// Update YAML configuration
|
||||
// Restart network services if needed
|
||||
// Validate connectivity
|
||||
}
|
||||
```
|
||||
|
||||
### Phase 2: Web UI Enhancement (2-3 days)
|
||||
|
||||
#### 2.1 Complete Existing Components
|
||||
The config-ui framework exists but components need implementation:
|
||||
|
||||
**SystemDetection.tsx** - Leverage system detection API:
|
||||
```typescript
|
||||
const SystemDetection = ({ onComplete, systemInfo }) => {
|
||||
// Display detected hardware (GPU detection for Parallama)
|
||||
// Show system requirements validation
|
||||
// Network interface selection
|
||||
// Prerequisite checking
|
||||
}
|
||||
```
|
||||
|
||||
**NetworkConfiguration.tsx** - Network setup:
|
||||
```typescript
|
||||
const NetworkConfiguration = ({ onComplete, configData }) => {
|
||||
// Port configuration (8080, 8081, 4001)
|
||||
// Firewall rules setup
|
||||
// Network interface selection
|
||||
// Connectivity testing
|
||||
}
|
||||
```
|
||||
|
||||
**SecuritySetup.tsx** - Security configuration:
|
||||
```typescript
|
||||
const SecuritySetup = ({ onComplete, configData }) => {
|
||||
// SSH key generation/upload (for cluster deployment)
|
||||
// TLS certificate setup
|
||||
// Authentication method selection
|
||||
// Security policy configuration
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.2 Repository Integration Component
|
||||
**File**: `install/config-ui/app/setup/components/RepositoryConfiguration.tsx`
|
||||
```typescript
|
||||
const RepositoryConfiguration = ({ onComplete, configData }) => {
|
||||
// GITEA/GitHub provider selection
|
||||
// Credential input and validation
|
||||
// Repository access testing
|
||||
// Task label configuration
|
||||
// Integration with existing repository factory
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.3 AI Configuration Enhancement
|
||||
**AIConfiguration.tsx** - GPU optimization:
|
||||
```typescript
|
||||
const AIConfiguration = ({ onComplete, systemInfo }) => {
|
||||
// GPU detection display
|
||||
// Parallama vs Ollama recommendation
|
||||
// OpenAI API configuration
|
||||
// Model selection and downloading
|
||||
// Resource allocation per model
|
||||
}
|
||||
```
|
||||
|
||||
### Phase 3: Installer Integration (1 day)
|
||||
|
||||
#### 3.1 Enhanced Installer Web Mode
|
||||
**File**: `/home/tony/chorus/project-queues/active/chorus.services/installer/install-chorus-enhanced.sh`
|
||||
|
||||
Add web UI mode option:
|
||||
```bash
|
||||
# Add new command line option
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--web-ui)
|
||||
ENABLE_WEB_UI=true
|
||||
shift
|
||||
;;
|
||||
# ... existing options
|
||||
esac
|
||||
done
|
||||
|
||||
# After basic installation
|
||||
if [[ "$ENABLE_WEB_UI" == "true" ]]; then
|
||||
setup_web_ui
|
||||
fi
|
||||
|
||||
setup_web_ui() {
|
||||
log_step "Setting up web configuration interface..."
|
||||
|
||||
# Copy config-ui to BZZZ directory
|
||||
cp -r "$BZZZ_DIR/../install/config-ui" "$BZZZ_DIR/web-ui"
|
||||
|
||||
# Install Node.js and dependencies
|
||||
install_nodejs
|
||||
cd "$BZZZ_DIR/web-ui" && npm install
|
||||
|
||||
# Start web UI in background
|
||||
npm run build && npm run start &
|
||||
|
||||
echo ""
|
||||
echo "🌐 Web configuration available at: http://$(hostname):8080/setup"
|
||||
echo "⚡ Continue setup in your browser"
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2 Hybrid Installation Flow
|
||||
```bash
|
||||
# Enhanced installer usage options:
|
||||
curl -fsSL https://chorus.services/install-enhanced.sh | sh # CLI mode (current)
|
||||
curl -fsSL https://chorus.services/install-enhanced.sh | sh -s -- --web-ui # Web mode (new)
|
||||
```
|
||||
|
||||
### Phase 4: Cluster Deployment Integration (2-3 days)
|
||||
|
||||
#### 4.1 SSH Deployment System
|
||||
**File**: `api/cluster_deployment.go`
|
||||
```go
|
||||
type ClusterDeployer struct {
|
||||
sshConfig SSHConfig
|
||||
installer string // Enhanced installer script
|
||||
coordinator *coordinator.TaskCoordinator
|
||||
}
|
||||
|
||||
func (c *ClusterDeployer) DeployToNodes(nodes []NodeConfig) error {
|
||||
for _, node := range nodes {
|
||||
// SSH to remote node
|
||||
// Execute enhanced installer with node-specific config
|
||||
// Verify installation
|
||||
// Add to cluster coordination
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 4.2 Cluster Formation Component
|
||||
**ClusterFormation.tsx** - Multi-node coordination:
|
||||
```typescript
|
||||
const ClusterFormation = ({ onComplete, configData }) => {
|
||||
// Node discovery (SSH-based or manual IP entry)
|
||||
// SSH credential configuration
|
||||
// Remote deployment progress tracking
|
||||
// Cluster validation and health checking
|
||||
// P2P network formation verification
|
||||
}
|
||||
```
|
||||
|
||||
#### 4.3 P2P Network Integration
|
||||
Leverage existing P2P infrastructure:
|
||||
```go
|
||||
// Integration with existing p2p/node.go
|
||||
func (h *HTTPServer) handleClusterConfig(w http.ResponseWriter, r *http.Request) {
|
||||
// Use existing P2P node configuration
|
||||
// Coordinate with task coordinator
|
||||
// Enable automatic peer discovery
|
||||
}
|
||||
```
|
||||
|
||||
### Phase 5: Professional Installation Experience (1-2 days)
|
||||
|
||||
#### 5.1 Enhanced Installation Output
|
||||
```bash
|
||||
# Professional branded installer output
|
||||
print_professional_banner() {
|
||||
echo -e "${PURPLE}"
|
||||
cat << 'EOF'
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
🔥 BZZZ Distributed AI Coordination Platform
|
||||
Professional Installation System v2.0
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
EOF
|
||||
echo -e "${NC}"
|
||||
}
|
||||
|
||||
show_installation_progress() {
|
||||
local step="$1"
|
||||
local total="$2"
|
||||
local message="$3"
|
||||
|
||||
echo -e "${BLUE}[$step/$total]${NC} $message"
|
||||
|
||||
# Progress bar
|
||||
local progress=$((step * 100 / total))
|
||||
printf "Progress: ["
|
||||
for ((i=0; i<progress/5; i++)); do printf "█"; done
|
||||
for ((i=progress/5; i<20; i++)); do printf "░"; done
|
||||
printf "] %d%%\n" $progress
|
||||
}
|
||||
```
|
||||
|
||||
#### 5.2 GPU Detection and Parallama Integration
|
||||
```bash
|
||||
detect_gpu_configuration() {
|
||||
log_step "Analyzing GPU configuration..."
|
||||
|
||||
# Detect NVIDIA GPUs
|
||||
if command -v nvidia-smi >/dev/null 2>&1; then
|
||||
GPU_COUNT=$(nvidia-smi --list-gpus | wc -l)
|
||||
GPU_INFO=$(nvidia-smi --query-gpu=name,memory.total --format=csv,noheader)
|
||||
|
||||
if [[ $GPU_COUNT -gt 1 ]]; then
|
||||
echo ""
|
||||
echo -e "${GREEN}🚀 Multi-GPU Setup Detected ($GPU_COUNT NVIDIA GPUs)${NC}"
|
||||
echo -e "${CYAN}Parallama is RECOMMENDED for optimal multi-GPU performance!${NC}"
|
||||
echo ""
|
||||
echo "Detected GPUs:"
|
||||
echo "$GPU_INFO" | sed 's/^/ • /'
|
||||
echo ""
|
||||
|
||||
read -p "Install Parallama (recommended) or standard Ollama? [P/o]: " choice
|
||||
case $choice in
|
||||
[Oo]* ) INSTALL_OLLAMA_TYPE="standard" ;;
|
||||
* ) INSTALL_OLLAMA_TYPE="parallama" ;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
}
|
||||
```
|
||||
|
||||
## Implementation Timeline
|
||||
|
||||
### Week 1: Backend Foundation
|
||||
- **Day 1-2**: Extend HTTP server with setup APIs
|
||||
- **Day 3-4**: Implement system detection and configuration management
|
||||
- **Day 5**: Repository integration and credential handling
|
||||
|
||||
### Week 2: Web UI Development
|
||||
- **Day 1-2**: Complete existing setup components
|
||||
- **Day 3-4**: Repository configuration and AI setup components
|
||||
- **Day 5**: Integration testing and UI polish
|
||||
|
||||
### Week 3: Cluster and Professional Features
|
||||
- **Day 1-2**: SSH deployment system and cluster formation
|
||||
- **Day 3-4**: Professional installation experience and GPU detection
|
||||
- **Day 5**: End-to-end testing and documentation
|
||||
|
||||
## Leveraging Existing BZZZ Systems
|
||||
|
||||
### ✅ **Reuse Without Modification**
|
||||
1. **HTTP Server Architecture** - Extend existing `api/http_server.go`
|
||||
2. **Configuration System** - Use existing `pkg/config/` YAML management
|
||||
3. **Repository Integration** - Leverage `repository/factory.go` providers
|
||||
4. **Task Coordination** - Integrate with `coordinator/task_coordinator.go`
|
||||
5. **P2P Networking** - Use existing `p2p/node.go` infrastructure
|
||||
|
||||
### 🔧 **Extend Existing Systems**
|
||||
1. **Enhanced Installer** - Add web UI mode to existing script
|
||||
2. **Config UI Framework** - Complete existing component implementations
|
||||
3. **API Endpoints** - Add setup endpoints to existing HTTP server
|
||||
4. **System Detection** - Enhance existing OS detection with hardware profiling
|
||||
|
||||
### 🆕 **New Components Needed**
|
||||
1. **Cluster Deployment Manager** - SSH-based remote installation
|
||||
2. **GPU Detection System** - Hardware profiling and Parallama integration
|
||||
3. **Professional Installation UX** - Enhanced progress and branding
|
||||
4. **Setup API Handlers** - Backend logic for web configuration
|
||||
|
||||
## Integration Points
|
||||
|
||||
### Repository Integration
|
||||
```go
|
||||
// Leverage existing repository factory
|
||||
func (h *HTTPServer) handleRepositoryConfig(w http.ResponseWriter, r *http.Request) {
|
||||
factory := &repository.DefaultProviderFactory{}
|
||||
|
||||
// Create provider based on web UI input
|
||||
provider, err := factory.CreateProvider(ctx, repoConfig)
|
||||
|
||||
// Test connectivity
|
||||
// Store configuration
|
||||
// Update task coordinator
|
||||
}
|
||||
```
|
||||
|
||||
### Task Coordinator Integration
|
||||
```go
|
||||
// Use existing task coordinator for cluster management
|
||||
func (h *HTTPServer) handleClusterStatus(w http.ResponseWriter, r *http.Request) {
|
||||
status := h.taskCoordinator.GetStatus()
|
||||
json.NewEncoder(w).Encode(status)
|
||||
}
|
||||
```
|
||||
|
||||
### Configuration Management
|
||||
```go
|
||||
// Extend existing config system
|
||||
func (s *SetupManager) SaveConfiguration(config SetupConfig) error {
|
||||
// Convert web config to BZZZ YAML format
|
||||
// Use existing config.Config struct
|
||||
// Restart services as needed
|
||||
}
|
||||
```
|
||||
|
||||
## Success Metrics
|
||||
|
||||
### Technical Completeness
|
||||
- [ ] Web UI accessible at `:8080/setup`
|
||||
- [ ] 8-step configuration wizard functional
|
||||
- [ ] GPU detection and Parallama recommendation
|
||||
- [ ] SSH-based cluster deployment
|
||||
- [ ] Repository integration (GITEA/GitHub)
|
||||
- [ ] Professional installation experience
|
||||
|
||||
### User Experience
|
||||
- [ ] Single-command installation with web option
|
||||
- [ ] Intuitive progress tracking and navigation
|
||||
- [ ] Real-time validation and error handling
|
||||
- [ ] Mobile-responsive design
|
||||
- [ ] Comprehensive help and documentation
|
||||
|
||||
### Integration Quality
|
||||
- [ ] Seamless integration with existing BZZZ systems
|
||||
- [ ] No disruption to current enhanced installer
|
||||
- [ ] Proper error handling and rollback
|
||||
- [ ] Production-ready security and performance
|
||||
|
||||
## Risk Mitigation
|
||||
|
||||
### Technical Risks
|
||||
- **API Integration Complexity**: Use existing HTTP server patterns
|
||||
- **Configuration Conflicts**: Maintain YAML compatibility
|
||||
- **Service Coordination**: Leverage existing task coordinator
|
||||
|
||||
### User Experience Risks
|
||||
- **Installation Complexity**: Provide both CLI and web options
|
||||
- **Error Recovery**: Implement proper rollback mechanisms
|
||||
- **Performance**: Optimize for low-resource environments
|
||||
|
||||
## Conclusion
|
||||
|
||||
This plan leverages 80% of existing BZZZ infrastructure while delivering the professional web-based installation experience envisioned in the original plans. By extending rather than replacing existing systems, we minimize development time and maintain compatibility with current deployments.
|
||||
|
||||
**Key Benefits:**
|
||||
- ✅ Rapid implementation using existing code
|
||||
- ✅ Maintains backward compatibility
|
||||
- ✅ Professional installation experience
|
||||
- ✅ Complete feature parity with original vision
|
||||
- ✅ Seamless integration with enhanced installer
|
||||
1
install/config-ui/.next/BUILD_ID
Normal file
1
install/config-ui/.next/BUILD_ID
Normal file
@@ -0,0 +1 @@
|
||||
7pc3-W9griwsLqMFO9F7n
|
||||
37
install/config-ui/.next/app-build-manifest.json
Normal file
37
install/config-ui/.next/app-build-manifest.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"pages": {
|
||||
"/_not-found": [
|
||||
"static/chunks/webpack-82180bff1cad158b.js",
|
||||
"static/chunks/fd9d1056-fe71d9d3341a0a8a.js",
|
||||
"static/chunks/938-17b8dfc164ba32b9.js",
|
||||
"static/chunks/main-app-49b06b9db6b856b1.js",
|
||||
"static/chunks/app/_not-found-e0388bca29104022.js"
|
||||
],
|
||||
"/layout": [
|
||||
"static/chunks/webpack-82180bff1cad158b.js",
|
||||
"static/chunks/fd9d1056-fe71d9d3341a0a8a.js",
|
||||
"static/chunks/938-17b8dfc164ba32b9.js",
|
||||
"static/chunks/main-app-49b06b9db6b856b1.js",
|
||||
"static/css/e8d1974119224823.css",
|
||||
"static/chunks/app/layout-ca1eeb8fd961ab0a.js"
|
||||
],
|
||||
"/page": [
|
||||
"static/chunks/webpack-82180bff1cad158b.js",
|
||||
"static/chunks/fd9d1056-fe71d9d3341a0a8a.js",
|
||||
"static/chunks/938-17b8dfc164ba32b9.js",
|
||||
"static/chunks/main-app-49b06b9db6b856b1.js",
|
||||
"static/chunks/1-c9d7758e4e3ba2a3.js",
|
||||
"static/chunks/644-0fed11847454c654.js",
|
||||
"static/chunks/app/page-8faaddc37bd2f9b3.js"
|
||||
],
|
||||
"/setup/page": [
|
||||
"static/chunks/webpack-82180bff1cad158b.js",
|
||||
"static/chunks/fd9d1056-fe71d9d3341a0a8a.js",
|
||||
"static/chunks/938-17b8dfc164ba32b9.js",
|
||||
"static/chunks/main-app-49b06b9db6b856b1.js",
|
||||
"static/chunks/1-c9d7758e4e3ba2a3.js",
|
||||
"static/chunks/644-0fed11847454c654.js",
|
||||
"static/chunks/app/setup/page-0064fc4ceb1b12be.js"
|
||||
]
|
||||
}
|
||||
}
|
||||
1
install/config-ui/.next/app-path-routes-manifest.json
Normal file
1
install/config-ui/.next/app-path-routes-manifest.json
Normal file
@@ -0,0 +1 @@
|
||||
{"/_not-found":"/_not-found","/page":"/","/setup/page":"/setup"}
|
||||
32
install/config-ui/.next/build-manifest.json
Normal file
32
install/config-ui/.next/build-manifest.json
Normal file
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"polyfillFiles": [
|
||||
"static/chunks/polyfills-c67a75d1b6f99dc8.js"
|
||||
],
|
||||
"devFiles": [],
|
||||
"ampDevFiles": [],
|
||||
"lowPriorityFiles": [
|
||||
"static/7pc3-W9griwsLqMFO9F7n/_buildManifest.js",
|
||||
"static/7pc3-W9griwsLqMFO9F7n/_ssgManifest.js"
|
||||
],
|
||||
"rootMainFiles": [
|
||||
"static/chunks/webpack-82180bff1cad158b.js",
|
||||
"static/chunks/fd9d1056-fe71d9d3341a0a8a.js",
|
||||
"static/chunks/938-17b8dfc164ba32b9.js",
|
||||
"static/chunks/main-app-49b06b9db6b856b1.js"
|
||||
],
|
||||
"pages": {
|
||||
"/_app": [
|
||||
"static/chunks/webpack-82180bff1cad158b.js",
|
||||
"static/chunks/framework-c5181c9431ddc45b.js",
|
||||
"static/chunks/main-780468f99531c6f2.js",
|
||||
"static/chunks/pages/_app-98cb51ec6f9f135f.js"
|
||||
],
|
||||
"/_error": [
|
||||
"static/chunks/webpack-82180bff1cad158b.js",
|
||||
"static/chunks/framework-c5181c9431ddc45b.js",
|
||||
"static/chunks/main-780468f99531c6f2.js",
|
||||
"static/chunks/pages/_error-e87e5963ec1b8011.js"
|
||||
]
|
||||
},
|
||||
"ampFirstPages": []
|
||||
}
|
||||
1
install/config-ui/.next/cache/.tsbuildinfo
vendored
Normal file
1
install/config-ui/.next/cache/.tsbuildinfo
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
install/config-ui/.next/cache/webpack/client-production/0.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/0.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/1.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/1.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/10.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/10.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/11.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/11.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/12.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/12.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/13.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/13.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/14.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/14.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/15.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/15.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/2.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/2.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/3.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/3.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/4.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/4.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/5.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/5.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/6.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/6.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/7.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/7.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/8.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/8.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/9.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/9.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/index.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/index.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/client-production/index.pack.old
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/client-production/index.pack.old
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/0.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/0.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/1.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/1.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/2.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/2.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/3.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/3.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/4.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/4.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/5.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/5.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/6.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/6.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/7.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/7.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/8.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/8.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/9.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/9.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/index.pack
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/index.pack
vendored
Normal file
Binary file not shown.
BIN
install/config-ui/.next/cache/webpack/server-production/index.pack.old
vendored
Normal file
BIN
install/config-ui/.next/cache/webpack/server-production/index.pack.old
vendored
Normal file
Binary file not shown.
1
install/config-ui/.next/export-detail.json
Normal file
1
install/config-ui/.next/export-detail.json
Normal file
@@ -0,0 +1 @@
|
||||
{"version":1,"outDirectory":"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/out","success":true}
|
||||
1
install/config-ui/.next/export-marker.json
Normal file
1
install/config-ui/.next/export-marker.json
Normal file
@@ -0,0 +1 @@
|
||||
{"version":1,"hasExportPathMap":false,"exportTrailingSlash":true,"isNextImageImported":false}
|
||||
1
install/config-ui/.next/images-manifest.json
Normal file
1
install/config-ui/.next/images-manifest.json
Normal file
@@ -0,0 +1 @@
|
||||
{"version":1,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[16,32,48,64,96,128,256,384],"path":"/setup/_next/image/","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":60,"formats":["image/webp"],"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"inline","remotePatterns":[],"unoptimized":true,"sizes":[640,750,828,1080,1200,1920,2048,3840,16,32,48,64,96,128,256,384]}}
|
||||
1
install/config-ui/.next/next-minimal-server.js.nft.json
Normal file
1
install/config-ui/.next/next-minimal-server.js.nft.json
Normal file
@@ -0,0 +1 @@
|
||||
{"version":1,"files":["../node_modules/styled-jsx/index.js","../node_modules/styled-jsx/package.json","../node_modules/styled-jsx/dist/index/index.js","../node_modules/react/package.json","../node_modules/react/index.js","../node_modules/client-only/package.json","../node_modules/react/cjs/react.production.min.js","../node_modules/client-only/index.js","../node_modules/styled-jsx/style.js","../node_modules/next/dist/compiled/next-server/server.runtime.prod.js","../node_modules/next/package.json","../node_modules/next/dist/server/body-streams.js","../node_modules/next/dist/shared/lib/constants.js","../node_modules/next/dist/server/web/utils.js","../node_modules/next/dist/client/components/app-router-headers.js","../node_modules/next/dist/server/lib/trace/tracer.js","../node_modules/next/dist/server/lib/trace/constants.js","../node_modules/next/dist/shared/lib/modern-browserslist-target.js","../node_modules/next/dist/shared/lib/runtime-config.external.js","../node_modules/next/dist/compiled/ws/package.json","../node_modules/@swc/helpers/_/_interop_require_default/package.json","../node_modules/next/dist/compiled/ws/index.js","../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../node_modules/@swc/helpers/package.json","../node_modules/next/dist/compiled/jsonwebtoken/package.json","../node_modules/@swc/helpers/cjs/_interop_require_default.cjs","../node_modules/next/dist/compiled/jsonwebtoken/index.js","../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../node_modules/next/dist/lib/semver-noop.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/amp-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/app-router-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/head-manager-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/hooks-client-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/html-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/image-config-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/loadable-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/loadable.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/router-context.js","../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/server-inserted-html.js","../node_modules/next/dist/server/future/route-modules/app-page/module.compiled.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/amp-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/app-router-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/head-manager-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/hooks-client-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/html-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/image-config-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/loadable-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/loadable.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/router-context.js","../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/server-inserted-html.js","../node_modules/next/dist/server/future/route-modules/pages/module.compiled.js"]}
|
||||
1
install/config-ui/.next/next-server.js.nft.json
Normal file
1
install/config-ui/.next/next-server.js.nft.json
Normal file
File diff suppressed because one or more lines are too long
1
install/config-ui/.next/package.json
Normal file
1
install/config-ui/.next/package.json
Normal file
@@ -0,0 +1 @@
|
||||
{"type": "commonjs"}
|
||||
1
install/config-ui/.next/prerender-manifest.js
Normal file
1
install/config-ui/.next/prerender-manifest.js
Normal file
@@ -0,0 +1 @@
|
||||
self.__PRERENDER_MANIFEST="{\"version\":4,\"routes\":{\"/\":{\"experimentalBypassFor\":[{\"type\":\"header\",\"key\":\"Next-Action\"},{\"type\":\"header\",\"key\":\"content-type\",\"value\":\"multipart/form-data\"}],\"initialRevalidateSeconds\":false,\"srcRoute\":\"/\",\"dataRoute\":\"/index.rsc\"},\"/setup\":{\"experimentalBypassFor\":[{\"type\":\"header\",\"key\":\"Next-Action\"},{\"type\":\"header\",\"key\":\"content-type\",\"value\":\"multipart/form-data\"}],\"initialRevalidateSeconds\":false,\"srcRoute\":\"/setup\",\"dataRoute\":\"/setup.rsc\"}},\"dynamicRoutes\":{},\"notFoundRoutes\":[],\"preview\":{\"previewModeId\":\"4974799f6c7984ca4a10d398c763a83c\",\"previewModeSigningKey\":\"89d67a032454b2cf7d09e64ea43595a17330c01e669273a63ae1aa9dd4e908fc\",\"previewModeEncryptionKey\":\"a1fe2cdbaf54a6dadc88418bc9627f0a14dbfd72df335c92811d09992a9d464f\"}}"
|
||||
1
install/config-ui/.next/prerender-manifest.json
Normal file
1
install/config-ui/.next/prerender-manifest.json
Normal file
@@ -0,0 +1 @@
|
||||
{"version":4,"routes":{"/":{"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data"}],"initialRevalidateSeconds":false,"srcRoute":"/","dataRoute":"/index.rsc"},"/setup":{"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data"}],"initialRevalidateSeconds":false,"srcRoute":"/setup","dataRoute":"/setup.rsc"}},"dynamicRoutes":{},"notFoundRoutes":[],"preview":{"previewModeId":"4974799f6c7984ca4a10d398c763a83c","previewModeSigningKey":"89d67a032454b2cf7d09e64ea43595a17330c01e669273a63ae1aa9dd4e908fc","previewModeEncryptionKey":"a1fe2cdbaf54a6dadc88418bc9627f0a14dbfd72df335c92811d09992a9d464f"}}
|
||||
1
install/config-ui/.next/react-loadable-manifest.json
Normal file
1
install/config-ui/.next/react-loadable-manifest.json
Normal file
@@ -0,0 +1 @@
|
||||
{}
|
||||
1
install/config-ui/.next/required-server-files.json
Normal file
1
install/config-ui/.next/required-server-files.json
Normal file
@@ -0,0 +1 @@
|
||||
{"version":1,"config":{"env":{},"webpack":null,"eslint":{"ignoreDuringBuilds":false},"typescript":{"ignoreBuildErrors":false,"tsconfigPath":"tsconfig.json"},"distDir":".next","cleanDistDir":true,"assetPrefix":"/setup","configOrigin":"next.config.js","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"analyticsId":"","images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[16,32,48,64,96,128,256,384],"path":"/setup/_next/image/","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":60,"formats":["image/webp"],"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"inline","remotePatterns":[],"unoptimized":true},"devIndicators":{"buildActivity":true,"buildActivityPosition":"bottom-right"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"amp":{"canonicalBase":"/setup"},"basePath":"/setup","sassOptions":{},"trailingSlash":true,"i18n":null,"productionBrowserSourceMaps":false,"optimizeFonts":true,"excludeDefaultMomentLocales":true,"serverRuntimeConfig":{},"publicRuntimeConfig":{},"reactProductionProfiling":false,"reactStrictMode":null,"httpAgentOptions":{"keepAlive":true},"outputFileTracing":true,"staticPageGenerationTimeout":60,"swcMinify":true,"output":"export","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"},"next/server":{"transform":"next/dist/server/web/exports/{{ kebabCase member }}"}},"experimental":{"windowHistorySupport":false,"serverMinification":true,"serverSourceMaps":false,"caseSensitiveRoutes":false,"useDeploymentId":false,"useDeploymentIdServerActions":false,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","middlewarePrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":15,"memoryBasedWorkersCount":false,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"isrMemoryCacheSize":52428800,"fullySpecified":false,"outputFileTracingRoot":"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui","swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"adjustFontFallbacks":false,"adjustFontFallbacksWithSizeAdjust":false,"typedRoutes":false,"instrumentationHook":false,"bundlePagesExternals":false,"ppr":false,"webpackBuildWorker":false,"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"configFileName":"next.config.js","_originalRewrites":{"beforeFiles":[],"afterFiles":[],"fallback":[]}},"appDir":"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui","relativeAppDir":"","files":[".next/routes-manifest.json",".next/server/pages-manifest.json",".next/build-manifest.json",".next/prerender-manifest.json",".next/prerender-manifest.js",".next/server/middleware-manifest.json",".next/server/middleware-build-manifest.js",".next/server/middleware-react-loadable-manifest.js",".next/server/app-paths-manifest.json",".next/app-path-routes-manifest.json",".next/app-build-manifest.json",".next/server/server-reference-manifest.js",".next/server/server-reference-manifest.json",".next/react-loadable-manifest.json",".next/server/font-manifest.json",".next/BUILD_ID",".next/server/next-font-manifest.js",".next/server/next-font-manifest.json"],"ignore":["node_modules/next/dist/compiled/@ampproject/toolbox-optimizer/**/*"]}
|
||||
1
install/config-ui/.next/routes-manifest.json
Normal file
1
install/config-ui/.next/routes-manifest.json
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"pages404":true,"caseSensitive":false,"basePath":"/setup","redirects":[{"source":"/setup","destination":"/setup/","basePath":false,"internal":true,"statusCode":308,"regex":"^/setup$"},{"source":"/:file((?!\\.well-known(?:/.*)?)(?:[^/]+/)*[^/]+\\.\\w+)/","destination":"/:file","internal":true,"missing":[{"type":"header","key":"x-nextjs-data"}],"statusCode":308,"regex":"^(?:/((?!\\.well-known(?:/.*)?)(?:[^/]+/)*[^/]+\\.\\w+))/$"},{"source":"/:notfile((?!\\.well-known(?:/.*)?)(?:[^/]+/)*[^/\\.]+)","destination":"/:notfile/","internal":true,"statusCode":308,"regex":"^(?:/((?!\\.well-known(?:/.*)?)(?:[^/]+/)*[^/\\.]+))$"}],"headers":[],"dynamicRoutes":[],"staticRoutes":[{"page":"/","regex":"^/(?:/)?$","routeKeys":{},"namedRegex":"^/(?:/)?$"},{"page":"/_not-found","regex":"^/_not\\-found(?:/)?$","routeKeys":{},"namedRegex":"^/_not\\-found(?:/)?$"},{"page":"/setup","regex":"^/setup(?:/)?$","routeKeys":{},"namedRegex":"^/setup(?:/)?$"}],"dataRoutes":[],"rsc":{"header":"RSC","varyHeader":"RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Url","prefetchHeader":"Next-Router-Prefetch","didPostponeHeader":"x-nextjs-postponed","contentTypeHeader":"text/x-component","suffix":".rsc","prefetchSuffix":".prefetch.rsc"},"rewrites":[]}
|
||||
5
install/config-ui/.next/server/app-paths-manifest.json
Normal file
5
install/config-ui/.next/server/app-paths-manifest.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"/_not-found": "app/_not-found.js",
|
||||
"/page": "app/page.js",
|
||||
"/setup/page": "app/setup/page.js"
|
||||
}
|
||||
1
install/config-ui/.next/server/app/_not-found.html
Normal file
1
install/config-ui/.next/server/app/_not-found.html
Normal file
File diff suppressed because one or more lines are too long
1
install/config-ui/.next/server/app/_not-found.js
Normal file
1
install/config-ui/.next/server/app/_not-found.js
Normal file
@@ -0,0 +1 @@
|
||||
(()=>{var e={};e.id=165,e.ids=[165],e.modules={7849:e=>{"use strict";e.exports=require("next/dist/client/components/action-async-storage.external")},2934:e=>{"use strict";e.exports=require("next/dist/client/components/action-async-storage.external.js")},5403:e=>{"use strict";e.exports=require("next/dist/client/components/request-async-storage.external")},4580:e=>{"use strict";e.exports=require("next/dist/client/components/request-async-storage.external.js")},4749:e=>{"use strict";e.exports=require("next/dist/client/components/static-generation-async-storage.external")},5869:e=>{"use strict";e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},399:e=>{"use strict";e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},6674:(e,t,s)=>{"use strict";s.r(t),s.d(t,{GlobalError:()=>a.a,__next_app__:()=>m,originalPathname:()=>x,pages:()=>d,routeModule:()=>u,tree:()=>c});var r=s(482),n=s(9108),i=s(2563),a=s.n(i),o=s(8300),l={};for(let e in o)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(e)&&(l[e]=()=>o[e]);s.d(t,l);let c=["",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(s.t.bind(s,9361,23)),"next/dist/client/components/not-found-error"]}]},{layout:[()=>Promise.resolve().then(s.bind(s,2917)),"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/layout.tsx"],"not-found":[()=>Promise.resolve().then(s.t.bind(s,9361,23)),"next/dist/client/components/not-found-error"]}],d=[],x="/_not-found",m={require:s,loadChunk:()=>Promise.resolve()},u=new r.AppPageRouteModule({definition:{kind:n.x.APP_PAGE,page:"/_not-found",pathname:"/_not-found",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:c}})},3422:()=>{},4581:(e,t,s)=>{Promise.resolve().then(s.t.bind(s,2583,23)),Promise.resolve().then(s.t.bind(s,6840,23)),Promise.resolve().then(s.t.bind(s,8771,23)),Promise.resolve().then(s.t.bind(s,3225,23)),Promise.resolve().then(s.t.bind(s,9295,23)),Promise.resolve().then(s.t.bind(s,3982,23))},2917:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>i,metadata:()=>n});var r=s(5036);s(7272);let n={title:"BZZZ Cluster Configuration",description:"Configure your BZZZ distributed AI coordination cluster",viewport:"width=device-width, initial-scale=1"};function i({children:e}){return r.jsx("html",{lang:"en",children:r.jsx("body",{className:"bg-gray-50 min-h-screen",children:(0,r.jsxs)("div",{className:"min-h-screen flex flex-col",children:[r.jsx("header",{className:"bg-white shadow-sm border-b border-gray-200",children:r.jsx("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8",children:(0,r.jsxs)("div",{className:"flex justify-between items-center py-4",children:[(0,r.jsxs)("div",{className:"flex items-center",children:[r.jsx("div",{className:"flex-shrink-0",children:r.jsx("div",{className:"w-8 h-8 bg-bzzz-primary rounded-lg flex items-center justify-center",children:r.jsx("span",{className:"text-white font-bold text-lg",children:"B"})})}),(0,r.jsxs)("div",{className:"ml-3",children:[r.jsx("h1",{className:"text-xl font-semibold text-gray-900",children:"BZZZ Cluster Configuration"}),r.jsx("p",{className:"text-sm text-gray-500",children:"Distributed AI Coordination Platform"})]})]}),r.jsx("div",{className:"flex items-center space-x-4",children:r.jsx("div",{className:"status-online",children:"System Online"})})]})})}),r.jsx("main",{className:"flex-1",children:e}),r.jsx("footer",{className:"bg-white border-t border-gray-200",children:r.jsx("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4",children:(0,r.jsxs)("div",{className:"flex justify-between items-center text-sm text-gray-500",children:[r.jsx("div",{children:"\xa9 2025 Chorus Services. All rights reserved."}),(0,r.jsxs)("div",{className:"flex space-x-4",children:[r.jsx("a",{href:"https://docs.chorus.services/bzzz",target:"_blank",className:"hover:text-bzzz-primary transition-colors",children:"Documentation"}),r.jsx("a",{href:"https://discord.gg/chorus-services",target:"_blank",className:"hover:text-bzzz-primary transition-colors",children:"Support"})]})]})})})]})})})}},7272:()=>{}};var t=require("../webpack-runtime.js");t.C(e);var s=e=>t(t.s=e),r=t.X(0,[73],()=>s(6674));module.exports=r})();
|
||||
@@ -0,0 +1 @@
|
||||
{"version":1,"files":["../../../node_modules/next/dist/client/components/action-async-storage.external.js","../../../node_modules/next/dist/client/components/async-local-storage.js","../../../node_modules/next/dist/client/components/request-async-storage.external.js","../../../node_modules/next/dist/client/components/static-generation-async-storage.external.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../node_modules/next/dist/server/lib/trace/constants.js","../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../node_modules/next/package.json","../../package.json","../chunks/329.js","../chunks/565.js","../chunks/73.js","../chunks/761.js","../chunks/font-manifest.json","../webpack-runtime.js","_not-found_client-reference-manifest.js"]}
|
||||
5
install/config-ui/.next/server/app/_not-found.meta
Normal file
5
install/config-ui/.next/server/app/_not-found.meta
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"headers": {
|
||||
"x-next-cache-tags": "_N_T_/layout,_N_T_/_not-found/layout,_N_T_/_not-found/"
|
||||
}
|
||||
}
|
||||
9
install/config-ui/.next/server/app/_not-found.rsc
Normal file
9
install/config-ui/.next/server/app/_not-found.rsc
Normal file
@@ -0,0 +1,9 @@
|
||||
2:I[5613,[],""]
|
||||
3:I[1778,[],""]
|
||||
4:{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"}
|
||||
5:{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"}
|
||||
6:{"display":"inline-block"}
|
||||
7:{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0}
|
||||
0:["7pc3-W9griwsLqMFO9F7n",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"bg-gray-50 min-h-screen","children":["$","div",null,{"className":"min-h-screen flex flex-col","children":[["$","header",null,{"className":"bg-white shadow-sm border-b border-gray-200","children":["$","div",null,{"className":"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8","children":["$","div",null,{"className":"flex justify-between items-center py-4","children":[["$","div",null,{"className":"flex items-center","children":[["$","div",null,{"className":"flex-shrink-0","children":["$","div",null,{"className":"w-8 h-8 bg-bzzz-primary rounded-lg flex items-center justify-center","children":["$","span",null,{"className":"text-white font-bold text-lg","children":"B"}]}]}],["$","div",null,{"className":"ml-3","children":[["$","h1",null,{"className":"text-xl font-semibold text-gray-900","children":"BZZZ Cluster Configuration"}],["$","p",null,{"className":"text-sm text-gray-500","children":"Distributed AI Coordination Platform"}]]}]]}],["$","div",null,{"className":"flex items-center space-x-4","children":["$","div",null,{"className":"status-online","children":"System Online"}]}]]}]}]}],["$","main",null,{"className":"flex-1","children":["$","$L2",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$4","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$5","children":"404"}],["$","div",null,{"style":"$6","children":["$","h2",null,{"style":"$7","children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}],["$","footer",null,{"className":"bg-white border-t border-gray-200","children":["$","div",null,{"className":"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4","children":["$","div",null,{"className":"flex justify-between items-center text-sm text-gray-500","children":[["$","div",null,{"children":"© 2025 Chorus Services. All rights reserved."}],["$","div",null,{"className":"flex space-x-4","children":[["$","a",null,{"href":"https://docs.chorus.services/bzzz","target":"_blank","className":"hover:text-bzzz-primary transition-colors","children":"Documentation"}],["$","a",null,{"href":"https://discord.gg/chorus-services","target":"_blank","className":"hover:text-bzzz-primary transition-colors","children":"Support"}]]}]]}]}]}]]}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/setup/_next/static/css/e8d1974119224823.css","precedence":"next","crossOrigin":""}]],"$L8"]]]]
|
||||
8:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"BZZZ Cluster Configuration"}],["$","meta","3",{"name":"description","content":"Configure your BZZZ distributed AI coordination cluster"}]]
|
||||
1:null
|
||||
@@ -0,0 +1 @@
|
||||
globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/_not-found"]={"moduleLoading":{"prefix":"/setup/_next/","crossOrigin":null},"ssrModuleMapping":{"1778":{"*":{"id":"9295","name":"*","chunks":[],"async":false}},"1902":{"*":{"id":"3225","name":"*","chunks":[],"async":false}},"5613":{"*":{"id":"8771","name":"*","chunks":[],"async":false}},"7690":{"*":{"id":"2583","name":"*","chunks":[],"async":false}},"7815":{"*":{"id":"6726","name":"*","chunks":[],"async":false}},"7831":{"*":{"id":"3982","name":"*","chunks":[],"async":false}},"8955":{"*":{"id":"6840","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/app-router.js":{"id":7690,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/app-router.js":{"id":7690,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/error-boundary.js":{"id":8955,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/error-boundary.js":{"id":8955,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/layout-router.js":{"id":5613,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/layout-router.js":{"id":5613,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/not-found-boundary.js":{"id":1902,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/not-found-boundary.js":{"id":1902,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/render-from-template-context.js":{"id":1778,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":1778,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/static-generation-searchparams-bailout-provider.js":{"id":7831,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/static-generation-searchparams-bailout-provider.js":{"id":7831,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/globals.css":{"id":2445,"name":"*","chunks":["185","static/chunks/app/layout-ca1eeb8fd961ab0a.js"],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/setup/page.tsx":{"id":7815,"name":"*","chunks":["1","static/chunks/1-c9d7758e4e3ba2a3.js","644","static/chunks/644-0fed11847454c654.js","931","static/chunks/app/page-8faaddc37bd2f9b3.js"],"async":false}},"entryCSSFiles":{"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/_not-found":[],"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/layout":["static/css/e8d1974119224823.css"],"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/page":[]}}
|
||||
1
install/config-ui/.next/server/app/index.html
Normal file
1
install/config-ui/.next/server/app/index.html
Normal file
File diff suppressed because one or more lines are too long
5
install/config-ui/.next/server/app/index.meta
Normal file
5
install/config-ui/.next/server/app/index.meta
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"headers": {
|
||||
"x-next-cache-tags": "_N_T_/layout,_N_T_/page,_N_T_/"
|
||||
}
|
||||
}
|
||||
6
install/config-ui/.next/server/app/index.rsc
Normal file
6
install/config-ui/.next/server/app/index.rsc
Normal file
@@ -0,0 +1,6 @@
|
||||
2:I[7815,["1","static/chunks/1-c9d7758e4e3ba2a3.js","644","static/chunks/644-0fed11847454c654.js","931","static/chunks/app/page-8faaddc37bd2f9b3.js"],""]
|
||||
3:I[5613,[],""]
|
||||
4:I[1778,[],""]
|
||||
0:["7pc3-W9griwsLqMFO9F7n",[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],["",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{}],null]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"bg-gray-50 min-h-screen","children":["$","div",null,{"className":"min-h-screen flex flex-col","children":[["$","header",null,{"className":"bg-white shadow-sm border-b border-gray-200","children":["$","div",null,{"className":"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8","children":["$","div",null,{"className":"flex justify-between items-center py-4","children":[["$","div",null,{"className":"flex items-center","children":[["$","div",null,{"className":"flex-shrink-0","children":["$","div",null,{"className":"w-8 h-8 bg-bzzz-primary rounded-lg flex items-center justify-center","children":["$","span",null,{"className":"text-white font-bold text-lg","children":"B"}]}]}],["$","div",null,{"className":"ml-3","children":[["$","h1",null,{"className":"text-xl font-semibold text-gray-900","children":"BZZZ Cluster Configuration"}],["$","p",null,{"className":"text-sm text-gray-500","children":"Distributed AI Coordination Platform"}]]}]]}],["$","div",null,{"className":"flex items-center space-x-4","children":["$","div",null,{"className":"status-online","children":"System Online"}]}]]}]}]}],["$","main",null,{"className":"flex-1","children":["$","$L3",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L4",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}],["$","footer",null,{"className":"bg-white border-t border-gray-200","children":["$","div",null,{"className":"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4","children":["$","div",null,{"className":"flex justify-between items-center text-sm text-gray-500","children":[["$","div",null,{"children":"© 2025 Chorus Services. All rights reserved."}],["$","div",null,{"className":"flex space-x-4","children":[["$","a",null,{"href":"https://docs.chorus.services/bzzz","target":"_blank","className":"hover:text-bzzz-primary transition-colors","children":"Documentation"}],["$","a",null,{"href":"https://discord.gg/chorus-services","target":"_blank","className":"hover:text-bzzz-primary transition-colors","children":"Support"}]]}]]}]}]}]]}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/setup/_next/static/css/e8d1974119224823.css","precedence":"next","crossOrigin":""}]],"$L5"]]]]
|
||||
5:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"BZZZ Cluster Configuration"}],["$","meta","3",{"name":"description","content":"Configure your BZZZ distributed AI coordination cluster"}]]
|
||||
1:null
|
||||
1
install/config-ui/.next/server/app/page.js
Normal file
1
install/config-ui/.next/server/app/page.js
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";(()=>{var e={};e.id=931,e.ids=[931],e.modules={7849:e=>{e.exports=require("next/dist/client/components/action-async-storage.external")},2934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},5403:e=>{e.exports=require("next/dist/client/components/request-async-storage.external")},4580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},4749:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external")},5869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},940:(e,t,n)=>{n.r(t),n.d(t,{GlobalError:()=>s.a,__next_app__:()=>d,originalPathname:()=>c,pages:()=>u,routeModule:()=>x,tree:()=>p});var r=n(482),o=n(9108),a=n(2563),s=n.n(a),i=n(8300),l={};for(let e in i)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(e)&&(l[e]=()=>i[e]);n.d(t,l);let p=["",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(n.bind(n,751)),"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/page.tsx"]}]},{layout:[()=>Promise.resolve().then(n.bind(n,2917)),"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/layout.tsx"],"not-found":[()=>Promise.resolve().then(n.t.bind(n,9361,23)),"next/dist/client/components/not-found-error"]}],u=["/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/page.tsx"],c="/page",d={require:n,loadChunk:()=>Promise.resolve()},x=new r.AppPageRouteModule({definition:{kind:o.x.APP_PAGE,page:"/page",pathname:"/",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:p}})},751:(e,t,n)=>{n.r(t),n.d(t,{default:()=>a});var r=n(5036),o=n(3386);function a(){return r.jsx(o.default,{})}}};var t=require("../webpack-runtime.js");t.C(e);var n=e=>t(t.s=e),r=t.X(0,[73,565,761],()=>n(940));module.exports=r})();
|
||||
1
install/config-ui/.next/server/app/page.js.nft.json
Normal file
1
install/config-ui/.next/server/app/page.js.nft.json
Normal file
@@ -0,0 +1 @@
|
||||
{"version":1,"files":["../../../node_modules/next/dist/client/components/action-async-storage.external.js","../../../node_modules/next/dist/client/components/async-local-storage.js","../../../node_modules/next/dist/client/components/request-async-storage.external.js","../../../node_modules/next/dist/client/components/static-generation-async-storage.external.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../node_modules/next/dist/server/lib/trace/constants.js","../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../node_modules/next/package.json","../../../package.json","../../package.json","../chunks/329.js","../chunks/565.js","../chunks/73.js","../chunks/761.js","../chunks/font-manifest.json","../webpack-runtime.js","page_client-reference-manifest.js"]}
|
||||
@@ -0,0 +1 @@
|
||||
globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/page"]={"moduleLoading":{"prefix":"/setup/_next/","crossOrigin":null},"ssrModuleMapping":{"1778":{"*":{"id":"9295","name":"*","chunks":[],"async":false}},"1902":{"*":{"id":"3225","name":"*","chunks":[],"async":false}},"5613":{"*":{"id":"8771","name":"*","chunks":[],"async":false}},"7690":{"*":{"id":"2583","name":"*","chunks":[],"async":false}},"7815":{"*":{"id":"6726","name":"*","chunks":[],"async":false}},"7831":{"*":{"id":"3982","name":"*","chunks":[],"async":false}},"8955":{"*":{"id":"6840","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/app-router.js":{"id":7690,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/app-router.js":{"id":7690,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/error-boundary.js":{"id":8955,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/error-boundary.js":{"id":8955,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/layout-router.js":{"id":5613,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/layout-router.js":{"id":5613,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/not-found-boundary.js":{"id":1902,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/not-found-boundary.js":{"id":1902,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/render-from-template-context.js":{"id":1778,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":1778,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/static-generation-searchparams-bailout-provider.js":{"id":7831,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/static-generation-searchparams-bailout-provider.js":{"id":7831,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/globals.css":{"id":2445,"name":"*","chunks":["185","static/chunks/app/layout-ca1eeb8fd961ab0a.js"],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/setup/page.tsx":{"id":7815,"name":"*","chunks":["1","static/chunks/1-c9d7758e4e3ba2a3.js","644","static/chunks/644-0fed11847454c654.js","931","static/chunks/app/page-8faaddc37bd2f9b3.js"],"async":false}},"entryCSSFiles":{"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/_not-found":[],"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/layout":["static/css/e8d1974119224823.css"],"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/page":[]}}
|
||||
1
install/config-ui/.next/server/app/setup.html
Normal file
1
install/config-ui/.next/server/app/setup.html
Normal file
File diff suppressed because one or more lines are too long
5
install/config-ui/.next/server/app/setup.meta
Normal file
5
install/config-ui/.next/server/app/setup.meta
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"headers": {
|
||||
"x-next-cache-tags": "_N_T_/layout,_N_T_/setup/layout,_N_T_/setup/page,_N_T_/setup/"
|
||||
}
|
||||
}
|
||||
7
install/config-ui/.next/server/app/setup.rsc
Normal file
7
install/config-ui/.next/server/app/setup.rsc
Normal file
@@ -0,0 +1,7 @@
|
||||
2:I[7831,[],""]
|
||||
3:I[7815,["1","static/chunks/1-c9d7758e4e3ba2a3.js","644","static/chunks/644-0fed11847454c654.js","413","static/chunks/app/setup/page-0064fc4ceb1b12be.js"],""]
|
||||
4:I[5613,[],""]
|
||||
5:I[1778,[],""]
|
||||
0:["7pc3-W9griwsLqMFO9F7n",[[["",{"children":["setup",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["setup",{"children":["__PAGE__",{},["$L1",["$","$L2",null,{"propsForComponent":{"params":{}},"Component":"$3","isStaticGeneration":true}],null]]},["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children","setup","children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","styles":null}]]},[null,["$","html",null,{"lang":"en","children":["$","body",null,{"className":"bg-gray-50 min-h-screen","children":["$","div",null,{"className":"min-h-screen flex flex-col","children":[["$","header",null,{"className":"bg-white shadow-sm border-b border-gray-200","children":["$","div",null,{"className":"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8","children":["$","div",null,{"className":"flex justify-between items-center py-4","children":[["$","div",null,{"className":"flex items-center","children":[["$","div",null,{"className":"flex-shrink-0","children":["$","div",null,{"className":"w-8 h-8 bg-bzzz-primary rounded-lg flex items-center justify-center","children":["$","span",null,{"className":"text-white font-bold text-lg","children":"B"}]}]}],["$","div",null,{"className":"ml-3","children":[["$","h1",null,{"className":"text-xl font-semibold text-gray-900","children":"BZZZ Cluster Configuration"}],["$","p",null,{"className":"text-sm text-gray-500","children":"Distributed AI Coordination Platform"}]]}]]}],["$","div",null,{"className":"flex items-center space-x-4","children":["$","div",null,{"className":"status-online","children":"System Online"}]}]]}]}]}],["$","main",null,{"className":"flex-1","children":["$","$L4",null,{"parallelRouterKey":"children","segmentPath":["children"],"loading":"$undefined","loadingStyles":"$undefined","loadingScripts":"$undefined","hasLoading":false,"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[],"styles":null}]}],["$","footer",null,{"className":"bg-white border-t border-gray-200","children":["$","div",null,{"className":"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4","children":["$","div",null,{"className":"flex justify-between items-center text-sm text-gray-500","children":[["$","div",null,{"children":"© 2025 Chorus Services. All rights reserved."}],["$","div",null,{"className":"flex space-x-4","children":[["$","a",null,{"href":"https://docs.chorus.services/bzzz","target":"_blank","className":"hover:text-bzzz-primary transition-colors","children":"Documentation"}],["$","a",null,{"href":"https://discord.gg/chorus-services","target":"_blank","className":"hover:text-bzzz-primary transition-colors","children":"Support"}]]}]]}]}]}]]}]}]}],null]],[[["$","link","0",{"rel":"stylesheet","href":"/setup/_next/static/css/e8d1974119224823.css","precedence":"next","crossOrigin":""}]],"$L6"]]]]
|
||||
6:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"charSet":"utf-8"}],["$","title","2",{"children":"BZZZ Cluster Configuration"}],["$","meta","3",{"name":"description","content":"Configure your BZZZ distributed AI coordination cluster"}]]
|
||||
1:null
|
||||
1
install/config-ui/.next/server/app/setup/page.js
Normal file
1
install/config-ui/.next/server/app/setup/page.js
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";(()=>{var e={};e.id=413,e.ids=[413],e.modules={7849:e=>{e.exports=require("next/dist/client/components/action-async-storage.external")},2934:e=>{e.exports=require("next/dist/client/components/action-async-storage.external.js")},5403:e=>{e.exports=require("next/dist/client/components/request-async-storage.external")},4580:e=>{e.exports=require("next/dist/client/components/request-async-storage.external.js")},4749:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external")},5869:e=>{e.exports=require("next/dist/client/components/static-generation-async-storage.external.js")},399:e=>{e.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},9601:(e,t,n)=>{n.r(t),n.d(t,{GlobalError:()=>a.a,__next_app__:()=>d,originalPathname:()=>c,pages:()=>l,routeModule:()=>x,tree:()=>u});var r=n(482),o=n(9108),s=n(2563),a=n.n(s),i=n(8300),p={};for(let e in i)0>["default","tree","pages","GlobalError","originalPathname","__next_app__","routeModule"].indexOf(e)&&(p[e]=()=>i[e]);n.d(t,p);let u=["",{children:["setup",{children:["__PAGE__",{},{page:[()=>Promise.resolve().then(n.bind(n,3386)),"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/setup/page.tsx"]}]},{}]},{layout:[()=>Promise.resolve().then(n.bind(n,2917)),"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/layout.tsx"],"not-found":[()=>Promise.resolve().then(n.t.bind(n,9361,23)),"next/dist/client/components/not-found-error"]}],l=["/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/setup/page.tsx"],c="/setup/page",d={require:n,loadChunk:()=>Promise.resolve()},x=new r.AppPageRouteModule({definition:{kind:o.x.APP_PAGE,page:"/setup/page",pathname:"/setup",bundlePath:"",filename:"",appPaths:[]},userland:{loaderTree:u}})}};var t=require("../../webpack-runtime.js");t.C(e);var n=e=>t(t.s=e),r=t.X(0,[73,565,761],()=>n(9601));module.exports=r})();
|
||||
@@ -0,0 +1 @@
|
||||
{"version":1,"files":["../../../../node_modules/next/dist/client/components/action-async-storage.external.js","../../../../node_modules/next/dist/client/components/async-local-storage.js","../../../../node_modules/next/dist/client/components/request-async-storage.external.js","../../../../node_modules/next/dist/client/components/static-generation-async-storage.external.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../../node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js","../../../../node_modules/next/dist/server/lib/trace/constants.js","../../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../../node_modules/next/package.json","../../../../package.json","../../../package.json","../../chunks/329.js","../../chunks/565.js","../../chunks/73.js","../../chunks/761.js","../../chunks/font-manifest.json","../../webpack-runtime.js","page_client-reference-manifest.js"]}
|
||||
@@ -0,0 +1 @@
|
||||
globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/setup/page"]={"moduleLoading":{"prefix":"/setup/_next/","crossOrigin":null},"ssrModuleMapping":{"1778":{"*":{"id":"9295","name":"*","chunks":[],"async":false}},"1902":{"*":{"id":"3225","name":"*","chunks":[],"async":false}},"5613":{"*":{"id":"8771","name":"*","chunks":[],"async":false}},"7690":{"*":{"id":"2583","name":"*","chunks":[],"async":false}},"7815":{"*":{"id":"6726","name":"*","chunks":[],"async":false}},"7831":{"*":{"id":"3982","name":"*","chunks":[],"async":false}},"8955":{"*":{"id":"6840","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/app-router.js":{"id":7690,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/app-router.js":{"id":7690,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/error-boundary.js":{"id":8955,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/error-boundary.js":{"id":8955,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/layout-router.js":{"id":5613,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/layout-router.js":{"id":5613,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/not-found-boundary.js":{"id":1902,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/not-found-boundary.js":{"id":1902,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/render-from-template-context.js":{"id":1778,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":1778,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/client/components/static-generation-searchparams-bailout-provider.js":{"id":7831,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/node_modules/next/dist/esm/client/components/static-generation-searchparams-bailout-provider.js":{"id":7831,"name":"*","chunks":[],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/globals.css":{"id":2445,"name":"*","chunks":["185","static/chunks/app/layout-ca1eeb8fd961ab0a.js"],"async":false},"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/setup/page.tsx":{"id":7815,"name":"*","chunks":["1","static/chunks/1-c9d7758e4e3ba2a3.js","644","static/chunks/644-0fed11847454c654.js","413","static/chunks/app/setup/page-0064fc4ceb1b12be.js"],"async":false}},"entryCSSFiles":{"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/_not-found":[],"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/layout":["static/css/e8d1974119224823.css"],"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/page":[],"/home/tony/chorus/project-queues/active/BZZZ/install/config-ui/app/setup/page":[]}}
|
||||
6
install/config-ui/.next/server/chunks/329.js
Normal file
6
install/config-ui/.next/server/chunks/329.js
Normal file
File diff suppressed because one or more lines are too long
1
install/config-ui/.next/server/chunks/565.js
Normal file
1
install/config-ui/.next/server/chunks/565.js
Normal file
File diff suppressed because one or more lines are too long
1
install/config-ui/.next/server/chunks/73.js
Normal file
1
install/config-ui/.next/server/chunks/73.js
Normal file
File diff suppressed because one or more lines are too long
3
install/config-ui/.next/server/chunks/761.js
Normal file
3
install/config-ui/.next/server/chunks/761.js
Normal file
File diff suppressed because one or more lines are too long
1
install/config-ui/.next/server/chunks/font-manifest.json
Normal file
1
install/config-ui/.next/server/chunks/font-manifest.json
Normal file
@@ -0,0 +1 @@
|
||||
[]
|
||||
1
install/config-ui/.next/server/font-manifest.json
Normal file
1
install/config-ui/.next/server/font-manifest.json
Normal file
@@ -0,0 +1 @@
|
||||
[]
|
||||
@@ -0,0 +1 @@
|
||||
self.__BUILD_MANIFEST={polyfillFiles:["static/chunks/polyfills-c67a75d1b6f99dc8.js"],devFiles:[],ampDevFiles:[],lowPriorityFiles:["static/7pc3-W9griwsLqMFO9F7n/_buildManifest.js","static/7pc3-W9griwsLqMFO9F7n/_ssgManifest.js"],rootMainFiles:["static/chunks/webpack-82180bff1cad158b.js","static/chunks/fd9d1056-fe71d9d3341a0a8a.js","static/chunks/938-17b8dfc164ba32b9.js","static/chunks/main-app-49b06b9db6b856b1.js"],pages:{"/_app":["static/chunks/webpack-82180bff1cad158b.js","static/chunks/framework-c5181c9431ddc45b.js","static/chunks/main-780468f99531c6f2.js","static/chunks/pages/_app-98cb51ec6f9f135f.js"],"/_error":["static/chunks/webpack-82180bff1cad158b.js","static/chunks/framework-c5181c9431ddc45b.js","static/chunks/main-780468f99531c6f2.js","static/chunks/pages/_error-e87e5963ec1b8011.js"]},ampFirstPages:[]};
|
||||
6
install/config-ui/.next/server/middleware-manifest.json
Normal file
6
install/config-ui/.next/server/middleware-manifest.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"sortedMiddleware": [],
|
||||
"middleware": {},
|
||||
"functions": {},
|
||||
"version": 2
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
self.__REACT_LOADABLE_MANIFEST="{}";
|
||||
1
install/config-ui/.next/server/next-font-manifest.js
Normal file
1
install/config-ui/.next/server/next-font-manifest.js
Normal file
@@ -0,0 +1 @@
|
||||
self.__NEXT_FONT_MANIFEST='{"pages":{},"app":{},"appUsingSizeAdjust":false,"pagesUsingSizeAdjust":false}';
|
||||
1
install/config-ui/.next/server/next-font-manifest.json
Normal file
1
install/config-ui/.next/server/next-font-manifest.json
Normal file
@@ -0,0 +1 @@
|
||||
{"pages":{},"app":{},"appUsingSizeAdjust":false,"pagesUsingSizeAdjust":false}
|
||||
1
install/config-ui/.next/server/pages-manifest.json
Normal file
1
install/config-ui/.next/server/pages-manifest.json
Normal file
@@ -0,0 +1 @@
|
||||
{"/_app":"pages/_app.js","/_error":"pages/_error.js","/_document":"pages/_document.js","/404":"pages/404.html"}
|
||||
1
install/config-ui/.next/server/pages/404.html
Normal file
1
install/config-ui/.next/server/pages/404.html
Normal file
File diff suppressed because one or more lines are too long
1
install/config-ui/.next/server/pages/500.html
Normal file
1
install/config-ui/.next/server/pages/500.html
Normal file
@@ -0,0 +1 @@
|
||||
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>500: Internal Server Error</title><meta name="next-head-count" content="3"/><noscript data-n-css=""></noscript><script defer="" crossorigin="" nomodule="" src="/setup/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script><script src="/setup/_next/static/chunks/webpack-82180bff1cad158b.js" defer="" crossorigin=""></script><script src="/setup/_next/static/chunks/framework-c5181c9431ddc45b.js" defer="" crossorigin=""></script><script src="/setup/_next/static/chunks/main-780468f99531c6f2.js" defer="" crossorigin=""></script><script src="/setup/_next/static/chunks/pages/_app-98cb51ec6f9f135f.js" defer="" crossorigin=""></script><script src="/setup/_next/static/chunks/pages/_error-e87e5963ec1b8011.js" defer="" crossorigin=""></script><script src="/setup/_next/static/7pc3-W9griwsLqMFO9F7n/_buildManifest.js" defer="" crossorigin=""></script><script src="/setup/_next/static/7pc3-W9griwsLqMFO9F7n/_ssgManifest.js" defer="" crossorigin=""></script></head><body><div id="__next"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json" crossorigin="">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"7pc3-W9griwsLqMFO9F7n","assetPrefix":"/setup","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
||||
1
install/config-ui/.next/server/pages/_app.js
Normal file
1
install/config-ui/.next/server/pages/_app.js
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";(()=>{var e={};e.id=888,e.ids=[888],e.modules={4096:(e,t,r)=>{Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"default",{enumerable:!0,get:function(){return u}});let n=r(167)._(r(6689)),o=r(4316);async function i(e){let{Component:t,ctx:r}=e;return{pageProps:await (0,o.loadGetInitialProps)(t,r)}}class u extends n.default.Component{render(){let{Component:e,pageProps:t}=this.props;return n.default.createElement(e,t)}}u.origGetInitialProps=i,u.getInitialProps=i,("function"==typeof t.default||"object"==typeof t.default&&null!==t.default)&&void 0===t.default.__esModule&&(Object.defineProperty(t.default,"__esModule",{value:!0}),Object.assign(t.default,t),e.exports=t.default)},4316:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),function(e,t){for(var r in t)Object.defineProperty(e,r,{enumerable:!0,get:t[r]})}(t,{WEB_VITALS:function(){return r},execOnce:function(){return n},isAbsoluteUrl:function(){return i},getLocationOrigin:function(){return u},getURL:function(){return s},getDisplayName:function(){return a},isResSent:function(){return c},normalizeRepeatedSlashes:function(){return l},loadGetInitialProps:function(){return f},SP:function(){return d},ST:function(){return p},DecodeError:function(){return g},NormalizeError:function(){return m},PageNotFoundError:function(){return P},MissingStaticPage:function(){return y},MiddlewareNotFoundError:function(){return E},stringifyError:function(){return _}});let r=["CLS","FCP","FID","INP","LCP","TTFB"];function n(e){let t,r=!1;return function(){for(var n=arguments.length,o=Array(n),i=0;i<n;i++)o[i]=arguments[i];return r||(r=!0,t=e(...o)),t}}let o=/^[a-zA-Z][a-zA-Z\d+\-.]*?:/,i=e=>o.test(e);function u(){let{protocol:e,hostname:t,port:r}=window.location;return e+"//"+t+(r?":"+r:"")}function s(){let{href:e}=window.location,t=u();return e.substring(t.length)}function a(e){return"string"==typeof e?e:e.displayName||e.name||"Unknown"}function c(e){return e.finished||e.headersSent}function l(e){let t=e.split("?");return t[0].replace(/\\/g,"/").replace(/\/\/+/g,"/")+(t[1]?"?"+t.slice(1).join("?"):"")}async function f(e,t){let r=t.res||t.ctx&&t.ctx.res;if(!e.getInitialProps)return t.ctx&&t.Component?{pageProps:await f(t.Component,t.ctx)}:{};let n=await e.getInitialProps(t);if(r&&c(r))return n;if(!n)throw Error('"'+a(e)+'.getInitialProps()" should resolve to an object. But found "'+n+'" instead.');return n}let d="undefined"!=typeof performance,p=d&&["mark","measure","getEntriesByName"].every(e=>"function"==typeof performance[e]);class g extends Error{}class m extends Error{}class P extends Error{constructor(e){super(),this.code="ENOENT",this.name="PageNotFoundError",this.message="Cannot find module for page: "+e}}class y extends Error{constructor(e,t){super(),this.message="Failed to load static file for page: "+e+" "+t}}class E extends Error{constructor(){super(),this.code="ENOENT",this.message="Cannot find the middleware module"}}function _(e){return JSON.stringify({message:e.message,stack:e.stack})}},6689:e=>{e.exports=require("react")},167:(e,t)=>{t._=t._interop_require_default=function(e){return e&&e.__esModule?e:{default:e}}}};var t=require("../webpack-runtime.js");t.C(e);var r=t(t.s=4096);module.exports=r})();
|
||||
1
install/config-ui/.next/server/pages/_app.js.nft.json
Normal file
1
install/config-ui/.next/server/pages/_app.js.nft.json
Normal file
@@ -0,0 +1 @@
|
||||
{"version":1,"files":["../../../node_modules/next/dist/pages/_app.js","../../../node_modules/react/cjs/react.development.js","../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/react/package.json","../../../package.json","../../package.json","../chunks/329.js","../chunks/565.js","../chunks/73.js","../chunks/761.js","../chunks/font-manifest.json","../webpack-runtime.js"]}
|
||||
1
install/config-ui/.next/server/pages/_document.js
Normal file
1
install/config-ui/.next/server/pages/_document.js
Normal file
@@ -0,0 +1 @@
|
||||
"use strict";(()=>{var e={};e.id=660,e.ids=[660],e.modules={2785:e=>{e.exports=require("next/dist/compiled/next-server/pages.runtime.prod.js")},6689:e=>{e.exports=require("react")},1017:e=>{e.exports=require("path")}};var r=require("../webpack-runtime.js");r.C(e);var s=e=>r(r.s=e),t=r.X(0,[329],()=>s(2329));module.exports=t})();
|
||||
@@ -0,0 +1 @@
|
||||
{"version":1,"files":["../../../node_modules/client-only/index.js","../../../node_modules/client-only/package.json","../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../node_modules/next/dist/compiled/lru-cache/index.js","../../../node_modules/next/dist/compiled/lru-cache/package.json","../../../node_modules/next/dist/compiled/next-server/pages.runtime.prod.js","../../../node_modules/next/dist/compiled/node-html-parser/index.js","../../../node_modules/next/dist/compiled/node-html-parser/package.json","../../../node_modules/next/dist/lib/semver-noop.js","../../../node_modules/next/dist/pages/_document.js","../../../node_modules/next/dist/server/lib/trace/constants.js","../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../node_modules/next/package.json","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.production.min.js","../../../node_modules/react-dom/package.json","../../../node_modules/react-dom/server.browser.js","../../../node_modules/react/cjs/react.development.js","../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/react/package.json","../../../node_modules/styled-jsx/dist/index/index.js","../../../node_modules/styled-jsx/index.js","../../../node_modules/styled-jsx/package.json","../../../package.json","../../package.json","../chunks/329.js","../chunks/565.js","../chunks/73.js","../chunks/761.js","../chunks/font-manifest.json","../webpack-runtime.js"]}
|
||||
1
install/config-ui/.next/server/pages/_error.js
Normal file
1
install/config-ui/.next/server/pages/_error.js
Normal file
File diff suppressed because one or more lines are too long
1
install/config-ui/.next/server/pages/_error.js.nft.json
Normal file
1
install/config-ui/.next/server/pages/_error.js.nft.json
Normal file
@@ -0,0 +1 @@
|
||||
{"version":1,"files":["../../../node_modules/client-only/index.js","../../../node_modules/client-only/package.json","../../../node_modules/next/dist/compiled/@opentelemetry/api/index.js","../../../node_modules/next/dist/compiled/@opentelemetry/api/package.json","../../../node_modules/next/dist/compiled/jsonwebtoken/index.js","../../../node_modules/next/dist/compiled/jsonwebtoken/package.json","../../../node_modules/next/dist/compiled/lru-cache/index.js","../../../node_modules/next/dist/compiled/lru-cache/package.json","../../../node_modules/next/dist/compiled/next-server/pages.runtime.prod.js","../../../node_modules/next/dist/compiled/node-html-parser/index.js","../../../node_modules/next/dist/compiled/node-html-parser/package.json","../../../node_modules/next/dist/lib/semver-noop.js","../../../node_modules/next/dist/server/lib/trace/constants.js","../../../node_modules/next/dist/server/lib/trace/tracer.js","../../../node_modules/next/package.json","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server-legacy.browser.production.min.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.development.js","../../../node_modules/react-dom/cjs/react-dom-server.browser.production.min.js","../../../node_modules/react-dom/package.json","../../../node_modules/react-dom/server.browser.js","../../../node_modules/react/cjs/react.development.js","../../../node_modules/react/cjs/react.production.min.js","../../../node_modules/react/index.js","../../../node_modules/react/package.json","../../../node_modules/styled-jsx/dist/index/index.js","../../../node_modules/styled-jsx/index.js","../../../node_modules/styled-jsx/package.json","../../package.json","../chunks/329.js","../chunks/565.js","../chunks/73.js","../chunks/761.js","../chunks/font-manifest.json","../webpack-runtime.js"]}
|
||||
@@ -0,0 +1 @@
|
||||
self.__RSC_SERVER_MANIFEST="{\"node\":{},\"edge\":{},\"encryptionKey\":\"gDVv6ZXh8m64s0NW0KpZiPxeQf13vgpecC6R4AZuBw4=\"}"
|
||||
@@ -0,0 +1 @@
|
||||
{"node":{},"edge":{},"encryptionKey":"gDVv6ZXh8m64s0NW0KpZiPxeQf13vgpecC6R4AZuBw4="}
|
||||
1
install/config-ui/.next/server/webpack-runtime.js
Normal file
1
install/config-ui/.next/server/webpack-runtime.js
Normal file
@@ -0,0 +1 @@
|
||||
(()=>{"use strict";var e={},r={};function t(o){var n=r[o];if(void 0!==n)return n.exports;var a=r[o]={exports:{}},u=!0;try{e[o](a,a.exports,t),u=!1}finally{u&&delete r[o]}return a.exports}t.m=e,t.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return t.d(r,{a:r}),r},(()=>{var e,r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__;t.t=function(o,n){if(1&n&&(o=this(o)),8&n||"object"==typeof o&&o&&(4&n&&o.__esModule||16&n&&"function"==typeof o.then))return o;var a=Object.create(null);t.r(a);var u={};e=e||[null,r({}),r([]),r(r)];for(var f=2&n&&o;"object"==typeof f&&!~e.indexOf(f);f=r(f))Object.getOwnPropertyNames(f).forEach(e=>u[e]=()=>o[e]);return u.default=()=>o,t.d(a,u),a}})(),t.d=(e,r)=>{for(var o in r)t.o(r,o)&&!t.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},t.f={},t.e=e=>Promise.all(Object.keys(t.f).reduce((r,o)=>(t.f[o](e,r),r),[])),t.u=e=>""+e+".js",t.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),t.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.X=(e,r,o)=>{var n=r;o||(r=e,o=()=>t(t.s=n)),r.map(t.e,t);var a=o();return void 0===a?e:a},(()=>{var e={658:1},r=r=>{var o=r.modules,n=r.ids,a=r.runtime;for(var u in o)t.o(o,u)&&(t.m[u]=o[u]);a&&a(t);for(var f=0;f<n.length;f++)e[n[f]]=1};t.f.require=(o,n)=>{e[o]||(658!=o?r(require("./chunks/"+t.u(o))):e[o]=1)},module.exports=t,t.C=r})()})();
|
||||
@@ -0,0 +1 @@
|
||||
self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/_error":["static/chunks/pages/_error-e87e5963ec1b8011.js"],sortedPages:["/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user