From 494ea2b4bdb4727fa5e4358343bc1170530ae1d7 Mon Sep 17 00:00:00 2001 From: tmnd1608-creator Date: Wed, 18 Mar 2026 08:49:18 +1100 Subject: [PATCH 1/6] Update remote server URL in .env.example --- .env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 7eb2109e..7fe5488c 100644 --- a/.env.example +++ b/.env.example @@ -21,7 +21,7 @@ OPENAI_COMPAT_API_KEY= # Optional; if empty, agent sends fallback toke # # Supported backends (example URLs): # Ollama (same machine) → http://host.docker.internal:11434/v1 - # Ollama (remote server) → http://:11434/v1 + Ollama (remote server) → http://170.64.248.58/ # vLLM → http://host.docker.internal:8000/v1 # LM Studio → http://host.docker.internal:1234/v1 # LocalAI → http://host.docker.internal:8080/v1 From 28de2811e1056baa7ea35d7651a941c43612d62f Mon Sep 17 00:00:00 2001 From: tmnd1608-creator Date: Wed, 18 Mar 2026 08:53:06 +1100 Subject: [PATCH 2/6] Add deployment script for Redamon on DigitalOcean This script automates the deployment of the Redamon application to DigitalOcean, including environment checks, code updates, Docker image builds, and service startups. --- Deploy-digitalocean.sh | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 Deploy-digitalocean.sh diff --git a/Deploy-digitalocean.sh b/Deploy-digitalocean.sh new file mode 100644 index 00000000..bd4c3ead --- /dev/null +++ b/Deploy-digitalocean.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Redamon DigitalOcean Deployment Script + +set -e + +echo "=== Redamon Deployment to DigitalOcean ===" + +# Check if .env exists +if [ ! -f .env ]; then + echo "⚠️ Warning: .env file not found. Create it first with your API keys." + echo " Copy .env.example to .env and add your keys." +fi + +# Pull latest code (if deploying from GitHub) +if [ -d .git ]; then + git pull origin main +fi + +# Build images +echo "🔨 Building Docker images..." +docker compose --profile tools build + +# Start services (lightweight mode for 4GB droplets) +echo "🚀 Starting Redamon services..." +docker compose up -d postgres neo4j recon-orchestrator kali-sandbox agent webapp + +# Check status +echo "⏳ Waiting for services to start..." +sleep 10 +docker compose ps + +echo "✅ Redamon deployed!" +echo "🌐 Access at: http://$(curl -s ifconfig.me):3000" +echo "⚙️ Configure settings at: http://$(curl -s ifconfig.me):3000/settings" From 7b6e841269fcdd1f13c1236ab7e2c598eba612b1 Mon Sep 17 00:00:00 2001 From: tmnd1608-creator Date: Wed, 11 Mar 2026 04:58:24 +0000 Subject: [PATCH 3/6] fix: report directory permissions for fresh Docker installs Pre-create /data/reports with nextjs:nodejs ownership in Dockerfile so named volumes inherit correct permissions on first run. Also fix PlanWaveItem type in timeline grouping to resolve build error. --- docker-compose.yml | 4 +- recon/project_settings.py | 28 +- webapp/DB_SETUP.md | 152 +++++++++ webapp/Dockerfile | 4 +- webapp/QUICKSTART.md | 85 +++++ webapp/README.WEBAPP.md | 3 +- webapp/package-lock.json | 697 +++++++++++++++++++++++++++++++++++++- webapp/package.json | 11 +- webapp/prisma/seed.ts | 135 ++++++++ webapp/setup.sh | 92 +++++ 10 files changed, 1190 insertions(+), 21 deletions(-) create mode 100644 webapp/DB_SETUP.md create mode 100644 webapp/QUICKSTART.md create mode 100644 webapp/prisma/seed.ts create mode 100755 webapp/setup.sh diff --git a/docker-compose.yml b/docker-compose.yml index ba37418b..65624ab8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -23,7 +23,7 @@ services: environment: POSTGRES_USER: ${POSTGRES_USER:-redamon} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-redamon_secret} - POSTGRES_DB: ${POSTGRES_DB:-redamon} + POSTG6RES_DB: ${POSTGRES_DB:-redamon} ports: - "${POSTGRES_PORT:-5432}:5432" volumes: @@ -49,7 +49,7 @@ services: - "${NEO4J_HTTP_PORT:-7474}:7474" - "${NEO4J_BOLT_PORT:-7687}:7687" volumes: - - neo4j_data:/data + - neo4j_data:/dataTouch and hold a clip to pin it. Unpinned clips will be deleted after 1 hour. - neo4j_logs:/logs - neo4j_import:/var/lib/neo4j/import - neo4j_plugins:/plugins diff --git a/recon/project_settings.py b/recon/project_settings.py index f3bb4875..1d68f74b 100644 --- a/recon/project_settings.py +++ b/recon/project_settings.py @@ -20,24 +20,24 @@ DEFAULT_SETTINGS: dict[str, Any] = { # Core identifiers (empty for CLI usage) - 'PROJECT_ID': '', - 'USER_ID': '', + 'PROJECT_ID': os.getenv('PROJECT_ID', ''), + 'USER_ID': os.getenv('USER_ID', ''), # Target Configuration - 'TARGET_DOMAIN': '', - 'SUBDOMAIN_LIST': [], - 'IP_MODE': False, - 'TARGET_IPS': [], - 'VERIFY_DOMAIN_OWNERSHIP': False, - 'OWNERSHIP_TOKEN': 'your-secret-token-here', - 'OWNERSHIP_TXT_PREFIX': '_redamon-verify', + 'TARGET_DOMAIN': os.getenv('TARGET_DOMAIN', ''), + 'SUBDOMAIN_LIST': os.getenv('SUBDOMAIN_LIST', '').split(',') if os.getenv('SUBDOMAIN_LIST') else [], + 'IP_MODE': os.getenv('IP_MODE', 'false').lower() == 'true', + 'TARGET_IPS': os.getenv('TARGET_IPS', '').split(',') if os.getenv('TARGET_IPS') else [], + 'VERIFY_DOMAIN_OWNERSHIP': os.getenv('VERIFY_DOMAIN_OWNERSHIP', 'false').lower() == 'true', + 'OWNERSHIP_TOKEN': os.getenv('OWNERSHIP_TOKEN', 'your-secret-token-here'), + 'OWNERSHIP_TXT_PREFIX': os.getenv('OWNERSHIP_TXT_PREFIX', '_redamon-verify'), # Scan Modules - 'SCAN_MODULES': ['domain_discovery', 'port_scan', 'http_probe', 'resource_enum', 'vuln_scan'], - 'UPDATE_GRAPH_DB': True, - 'USE_TOR_FOR_RECON': False, - 'USE_BRUTEFORCE_FOR_SUBDOMAINS': True, - 'STEALTH_MODE': False, + 'SCAN_MODULES': os.getenv('SCAN_MODULES', 'domain_discovery,port_scan,http_probe,resource_enum,vuln_scan').split(','), + 'UPDATE_GRAPH_DB': os.getenv('UPDATE_GRAPH_DB', 'true').lower() == 'true', + 'USE_TOR_FOR_RECON': os.getenv('USE_TOR_FOR_RECON', 'false').lower() == 'true', + 'USE_BRUTEFORCE_FOR_SUBDOMAINS': os.getenv('USE_BRUTEFORCE_FOR_SUBDOMAINS', 'true').lower() == 'true', + 'STEALTH_MODE': os.getenv('STEALTH_MODE', 'false').lower() == 'true', # WHOIS/DNS 'WHOIS_MAX_RETRIES': 6, diff --git a/webapp/DB_SETUP.md b/webapp/DB_SETUP.md new file mode 100644 index 00000000..96eb33ac --- /dev/null +++ b/webapp/DB_SETUP.md @@ -0,0 +1,152 @@ +# Database Setup & Initialization Guide + +This guide walks you through setting up the RedAmon webapp with sample users and projects. + +## Quick Start + +### 1. **Prerequisites** +```bash +cd /workspaces/redamon/webapp + +# Install dependencies +npm install + +# Ensure PostgreSQL is running (via docker-compose) +docker-compose up -d +``` + +### 2. **Initialize the Database** + +```bash +# Apply any pending migrations +npm run db:push + +# Populate with sample data (7 users + projects) +npm run db:seed +``` + +### 3. **Start the Application** +```bash +npm run dev +``` + +Visit `http://localhost:3000` + +--- + +## What Gets Created + +### 👥 Users (7) +The seed script creates these sample users: + +| Email | Name | +|-------|------| +| alice@example.com | Alice Johnson | +| bob@example.com | Bob Smith | +| carol@example.com | Carol Davis | +| dave@example.com | Dave Wilson | +| eve@example.com | Eve Martinez | +| frank@example.com | Frank Anderson | +| grace@example.com | Grace Lee | + +### 📁 Projects + +1. **Shared Demo Project** (`example.com`) + - Owner: Alice Johnson + - Target: example.com with subdomains (www, api, mail, staging) + - Shared reference project for team testing + - All scan modules enabled + +2. **Personal Projects** (1 per user) + - Each user gets their own project + - Target: `target{N}.local` + - Basic scan modules enabled + +--- + +## Available Commands + +```bash +# View all database commands +npm run db:push # Apply migrations to database +npm run db:seed # Populate with sample data +npm run db:reset # Reset database to initial state (⚠️ destructive) +``` + +--- + +## Manual Project Creation + +To create additional projects after initialization: + +```tsx +// Use the Prisma Client in your code +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +const project = await prisma.project.create({ + data: { + userId: 'user-id-here', + name: 'My Project', + description: 'Project description', + targetDomain: 'example.com', + // ... other configuration fields + }, +}); +``` + +--- + +## Customizing the Seed + +Edit `prisma/seed.ts` to: +- Change user names/emails +- Modify project configurations +- Add more projects +- Set different default scan modules + +Then re-run: +```bash +npm run db:seed +``` + +--- + +## Troubleshooting + +### Database Connection Error +```bash +# Check if PostgreSQL is running +docker-compose ps + +# Verify DATABASE_URL environment variable +echo $DATABASE_URL +``` + +### Migration Issues +```bash +# Check migration status +npx prisma migrate status + +# Create migration for schema changes +npx prisma migrate dev --name "describe_your_change" +``` + +### Need Fresh Start +```bash +# ⚠️ CAUTION: This deletes all data +npm run db:reset + +# Then re-seed if needed +npm run db:seed +``` + +--- + +## Next Steps + +- Log in with any sample user email +- View the graph visualization at `/graph` +- Configure projects with your targets +- Run reconnaissance scans via the UI diff --git a/webapp/Dockerfile b/webapp/Dockerfile index 9ab53099..7c0fd623 100644 --- a/webapp/Dockerfile +++ b/webapp/Dockerfile @@ -1,4 +1,6 @@ -# ============================================ +cd /workspaces/redamon +# Start core services (without GVM for faster startup) +docker compose up -d postgres neo4j recon-orchestrator kali-sandbox agent webapp# ============================================ # RedAmon Web Application - Production Dockerfile # Multi-stage build for optimized production image # ============================================ diff --git a/webapp/QUICKSTART.md b/webapp/QUICKSTART.md new file mode 100644 index 00000000..01701e47 --- /dev/null +++ b/webapp/QUICKSTART.md @@ -0,0 +1,85 @@ +# 🚀 Quick Setup Guide + +**TL;DR - One Command Setup:** + +```bash +cd /workspaces/redamon/webapp +./setup.sh +npm run dev +``` + +Then visit `http://localhost:3000` + +--- + +## What This Does + +✅ Installs all dependencies +✅ Sets up PostgreSQL connection +✅ Creates database schema +✅ Populates 7 sample users +✅ Creates 8 projects (1 shared + 7 personal) + +--- + +## Sample Users Created + +``` +alice@example.com - Alice Johnson (Owner of shared demo project) +bob@example.com - Bob Smith +carol@example.com - Carol Davis +dave@example.com - Dave Wilson +eve@example.com - Eve Martinez +frank@example.com - Frank Anderson +grace@example.com - Grace Lee +``` + +**No password required** - you can log in with any email directly in the UI. + +--- + +## Database Commands + +```bash +# Initial setup (one time) +./setup.sh + +# Start development +npm run dev + +# Database management +npm run db:push # Apply schema changes +npm run db:seed # Re-populate with sample data +npm run db:reset # Wipe database (⚠️ destructive) +``` + +--- + +## Customize + +Edit `prisma/seed.ts` to: +- Add/remove users +- Modify project defaults +- Change target domains +- Enable/disable scan modules + +Then run: `npm run db:seed` + +--- + +## Troubleshooting + +**Database connection failed?** +- Ensure PostgreSQL is running: `docker-compose up -d` +- Check `.env.local` DATABASE_URL + +**Want a fresh start?** +```bash +npm run db:reset +npm run db:seed +``` + +**See full setup guide:** +```bash +cat DB_SETUP.md +``` diff --git a/webapp/README.WEBAPP.md b/webapp/README.WEBAPP.md index 60e4c7a1..bbedc19a 100644 --- a/webapp/README.WEBAPP.md +++ b/webapp/README.WEBAPP.md @@ -1,4 +1,4 @@ -# RedAmon Web Application +l# RedAmon Web Application Production-ready Next.js 16 web application with Neo4j integration, PostgreSQL project storage, and integrated recon control. @@ -464,7 +464,6 @@ The recon orchestrator automatically detects scan phases from log output: |-------|-------------| | 1 | Domain Discovery | | 2 | Port Scanning | -| 3 | HTTP Probing | | 4 | Resource Enumeration | | 5 | Vulnerability Scanning | | 6 | MITRE Enrichment | diff --git a/webapp/package-lock.json b/webapp/package-lock.json index c5b077d7..bc938194 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -40,6 +40,8 @@ "@types/react-dom": "^19.0.0", "eslint": "^9.17.0", "eslint-config-next": "^16.1.0", + "ts-node": "^10.9.2", + "tsx": "^4.21.0", "typescript": "^5.7.0" }, "engines": { @@ -77,6 +79,7 @@ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -295,6 +298,30 @@ "node": ">=6.9.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@emnapi/core": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", @@ -328,6 +355,448 @@ "tslib": "^2.4.0" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -1616,6 +2085,34 @@ "url": "https://github.com/sponsors/tannerlinsley" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, "node_modules/@tweenjs/tween.js": { "version": "25.0.0", "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz", @@ -1774,6 +2271,7 @@ "integrity": "sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -1789,6 +2287,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -1873,6 +2372,7 @@ "integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.56.1", "@typescript-eslint/types": "8.56.1", @@ -2450,6 +2950,7 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2467,6 +2968,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/adler-32": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", @@ -2556,6 +3070,13 @@ "node": ">= 14" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2827,6 +3348,7 @@ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "license": "Apache-2.0", + "peer": true, "peerDependencies": { "bare-abort-controller": "*" }, @@ -3001,6 +3523,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3400,6 +3923,13 @@ "node": ">= 14" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3587,6 +4117,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -3876,6 +4407,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dingbat-to-unicode": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz", @@ -4156,6 +4697,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -4185,6 +4768,7 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -4370,6 +4954,7 @@ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -4928,6 +5513,21 @@ "node": ">=0.8" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -6397,6 +6997,13 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, "node_modules/mammoth": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/mammoth/-/mammoth-1.11.0.tgz", @@ -8043,6 +8650,7 @@ "integrity": "sha512-XTKeKxtQElcq3U9/jHyxSPgiRgeYDKxWTPOf6NkXA0dNj5j40MfEsZkMbyNpwDWCUv7YBFUl7I2VK/6ALbmhEg==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/config": "6.19.2", "@prisma/engines": "6.19.2" @@ -8169,6 +8777,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -8178,6 +8787,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -9364,7 +9974,8 @@ "version": "0.170.0", "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/three-forcegraph": { "version": "1.43.1", @@ -9483,6 +10094,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -9536,6 +10148,50 @@ "typescript": ">=4.8.4" } }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -9568,6 +10224,26 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9665,6 +10341,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9898,6 +10575,13 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -10205,6 +10889,16 @@ "dev": true, "license": "ISC" }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -10238,6 +10932,7 @@ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/webapp/package.json b/webapp/package.json index a123876d..2c2184fb 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -8,7 +8,10 @@ "build": "next build", "start": "next start", "lint": "next lint", - "type-check": "tsc --noEmit" + "type-check": "tsc --noEmit", + "db:seed": "prisma db seed", + "db:push": "prisma db push", + "db:reset": "prisma migrate reset --force" }, "dependencies": { "@prisma/client": "^6.19.2", @@ -43,9 +46,15 @@ "@types/react-dom": "^19.0.0", "eslint": "^9.17.0", "eslint-config-next": "^16.1.0", + "ts-node": "^10.9.2", + "tsx": "^4.21.0", "typescript": "^5.7.0" }, "engines": { "node": ">=20.0.0" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" } } + diff --git a/webapp/prisma/seed.ts b/webapp/prisma/seed.ts new file mode 100644 index 00000000..5b58bb35 --- /dev/null +++ b/webapp/prisma/seed.ts @@ -0,0 +1,135 @@ +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +async function main() { + console.log('🌱 Starting database seed...'); + + // Create 7 sample users + const users = await Promise.all([ + prisma.user.upsert({ + where: { email: 'alice@example.com' }, + update: {}, + create: { + email: 'alice@example.com', + name: 'Alice Johnson', + }, + }), + prisma.user.upsert({ + where: { email: 'bob@example.com' }, + update: {}, + create: { + email: 'bob@example.com', + name: 'Bob Smith', + }, + }), + prisma.user.upsert({ + where: { email: 'carol@example.com' }, + update: {}, + create: { + email: 'carol@example.com', + name: 'Carol Davis', + }, + }), + prisma.user.upsert({ + where: { email: 'dave@example.com' }, + update: {}, + create: { + email: 'dave@example.com', + name: 'Dave Wilson', + }, + }), + prisma.user.upsert({ + where: { email: 'eve@example.com' }, + update: {}, + create: { + email: 'eve@example.com', + name: 'Eve Martinez', + }, + }), + prisma.user.upsert({ + where: { email: 'frank@example.com' }, + update: {}, + create: { + email: 'frank@example.com', + name: 'Frank Anderson', + }, + }), + prisma.user.upsert({ + where: { email: 'grace@example.com' }, + update: {}, + create: { + email: 'grace@example.com', + name: 'Grace Lee', + }, + }), + ]); + + console.log(`✅ Created/verified ${users.length} users`); + + // Create a shared project for all users (using the first user) + const sharedProject = await prisma.project.upsert({ + where: { id: 'demo-project-001' }, + update: {}, + create: { + id: 'demo-project-001', + userId: users[0].id, + name: 'Demo Project - example.com', + description: 'Shared demonstration project for testing RedAmon reconnaissance', + targetDomain: 'example.com', + subdomainList: ['www', 'api', 'mail', 'staging'], + ipMode: false, + stealthMode: false, + scanModules: ['domain_discovery', 'port_scan', 'http_probe', 'resource_enum', 'vuln_scan'], + updateGraphDb: true, + useBruteforceForSubdomains: true, + naabuTopPorts: '1000', + httpxThreads: 50, + }, + }); + + console.log(`✅ Created/verified shared project: ${sharedProject.name}`); + + // Create individual projects for each user + const projects = await Promise.all( + users.map((user, index) => + prisma.project.upsert({ + where: { id: `project-${index + 1}` }, + update: {}, + create: { + id: `project-${index + 1}`, + userId: user.id, + name: `${user.name}'s Project`, + description: `Personal reconnaissance project for ${user.name}`, + targetDomain: `target${index + 1}.local`, + subdomainList: ['www', 'api'], + stealthMode: false, + scanModules: ['domain_discovery', 'port_scan', 'http_probe'], + updateGraphDb: true, + }, + }) + ) + ); + + console.log(`✅ Created ${projects.length} personal projects`); + + console.log('\n📊 Database seed complete!'); + console.log(`\n👥 Users created:`); + users.forEach((user) => { + console.log(` • ${user.name} (${user.email})`); + }); + console.log(`\n📁 Projects created:`); + console.log(` • ${sharedProject.name} (shared)`); + projects.forEach((project) => { + console.log(` • ${project.name}`); + }); +} + +main() + .catch((e) => { + console.error('❌ Seed failed:', e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); + }); diff --git a/webapp/setup.sh b/webapp/setup.sh new file mode 100755 index 00000000..95497f0a --- /dev/null +++ b/webapp/setup.sh @@ -0,0 +1,92 @@ +cd /workspaces/redamon/webapp +npm run dev#!/bin/bash + +############################################################################## +# RedAmon Webapp - Automated Setup Script +# +# This script handles the complete setup of the RedAmon webapp: +# - Installs dependencies +# - Initializes the database +# - Seeds sample data +############################################################################## + +set -e # Exit on error + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +echo -e "${BLUE}🚀 RedAmon Webapp Setup${NC}\n" + +# Check if we're in the right directory +if [ ! -f "package.json" ]; then + echo -e "${RED}❌ Error: package.json not found. Please run this script from the webapp directory.${NC}" + exit 1 +fi + +# Step 1: Install dependencies +echo -e "${BLUE}📦 Step 1: Installing dependencies...${NC}" +if [ -d "node_modules" ]; then + echo -e "${YELLOW}ℹ️ node_modules already exists. Skipping npm install.${NC}" +else + npm install + echo -e "${GREEN}✅ Dependencies installed${NC}\n" +fi + +# Step 2: Check if .env.local exists +echo -e "${BLUE}🔧 Step 2: Checking environment configuration...${NC}" +if [ ! -f ".env.local" ]; then + echo -e "${YELLOW}⚠️ .env.local not found. Creating default configuration...${NC}" + cat > .env.local << 'EOF' +# PostgreSQL (Prisma) +DATABASE_URL="postgresql://redamon:redamon_secret@localhost:5432/redamon" + +# Neo4j +NEO4J_URI=bolt://localhost:7687 +NEO4J_USER=neo4j +NEO4J_PASSWORD=changeme123 + +# Backend services +RECON_ORCHESTRATOR_URL=http://localhost:8010 +AGENT_API_URL=http://localhost:8090 +AGENT_WS_URL=ws://localhost:8090/ws/agent +WEBAPP_URL=http://localhost:3000 +EOF + echo -e "${GREEN}✅ Created .env.local${NC}\n" +else + echo -e "${GREEN}✅ .env.local exists${NC}\n" +fi + +# Load environment variables +set -a +source .env.local +set +a + +# Step 3: Apply database migrations +echo -e "${BLUE}📊 Step 3: Applying database migrations...${NC}" +npm run db:push +echo -e "${GREEN}✅ Migrations applied${NC}\n" + +# Step 4: Seed the database +echo -e "${BLUE}🌱 Step 4: Seeding database with sample data...${NC}" +npm run db:seed +echo -e "${GREEN}✅ Database seeded${NC}\n" + +# Summary +echo -e "${GREEN}✨ Setup Complete!${NC}\n" +echo -e "${BLUE}Next steps:${NC}" +echo " 1. Start the development server:" +echo -e " ${YELLOW}npm run dev${NC}" +echo "" +echo " 2. Open your browser:" +echo -e " ${YELLOW}http://localhost:3000${NC}" +echo "" +echo " 3. Login with any of the sample users:" +echo -e " ${YELLOW}alice@example.com${NC}" +echo -e " ${YELLOW}bob@example.com${NC}" +echo " (and 5 more...)" +echo "" +echo -e "📖 For more details, see: ${YELLOW}DB_SETUP.md${NC}" From 02110799847327be31b7c2f0d5235a7662c47621 Mon Sep 17 00:00:00 2001 From: tmnd1608-creator Date: Wed, 18 Mar 2026 11:35:24 +1100 Subject: [PATCH 4/6] Delete README.GPIGS.md --- guinea_pigs/README.GPIGS.md | 28 ---------------------------- 1 file changed, 28 deletions(-) delete mode 100644 guinea_pigs/README.GPIGS.md diff --git a/guinea_pigs/README.GPIGS.md b/guinea_pigs/README.GPIGS.md deleted file mode 100644 index 7b5814ed..00000000 --- a/guinea_pigs/README.GPIGS.md +++ /dev/null @@ -1,28 +0,0 @@ -# Guinea Pigs - Vulnerable Test Servers - -Intentionally vulnerable servers for security testing and exploitation practice. - -> **WARNING**: These are intentionally vulnerable systems. Deploy only in isolated environments for authorized testing. - ---- - -## Available Guinea Pigs - -| Folder | Version | CVEs | Description | -|--------|---------|------|-------------| -| `apache_2.4.49` | Apache 2.4.49 | CVE-2021-41773, CVE-2021-42013 | Path traversal + RCE | -| `apache_2.4.25` | Apache 2.4.25 | CVE-2017-3167, CVE-2017-3169 | Auth bypass + DoS | -| `node_serialize_1.0.0` | Node.js 8.x + node-serialize 0.0.4 | CVE-2017-5941 | Deserialization RCE | - -Each folder contains its own `README.md` with deployment commands, wipe/clean instructions, exploitation steps, and Metasploit usage. - ---- - -## EC2 Info - -| Setting | Value | -|---------|-------| -| **IP** | 15.160.68.117 | -| **URL** | https://gpigs.devergolabs.com | -| **Port** | 8080 | -| **Health Check** | `/health` | From b7a4b4028838f4259522b2c90d252095e6de64f1 Mon Sep 17 00:00:00 2001 From: tmnd1608-creator Date: Thu, 19 Mar 2026 06:31:36 +1100 Subject: [PATCH 5/6] Delete Deploy-digitalocean.sh --- Deploy-digitalocean.sh | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 Deploy-digitalocean.sh diff --git a/Deploy-digitalocean.sh b/Deploy-digitalocean.sh deleted file mode 100644 index bd4c3ead..00000000 --- a/Deploy-digitalocean.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -# Redamon DigitalOcean Deployment Script - -set -e - -echo "=== Redamon Deployment to DigitalOcean ===" - -# Check if .env exists -if [ ! -f .env ]; then - echo "⚠️ Warning: .env file not found. Create it first with your API keys." - echo " Copy .env.example to .env and add your keys." -fi - -# Pull latest code (if deploying from GitHub) -if [ -d .git ]; then - git pull origin main -fi - -# Build images -echo "🔨 Building Docker images..." -docker compose --profile tools build - -# Start services (lightweight mode for 4GB droplets) -echo "🚀 Starting Redamon services..." -docker compose up -d postgres neo4j recon-orchestrator kali-sandbox agent webapp - -# Check status -echo "⏳ Waiting for services to start..." -sleep 10 -docker compose ps - -echo "✅ Redamon deployed!" -echo "🌐 Access at: http://$(curl -s ifconfig.me):3000" -echo "⚙️ Configure settings at: http://$(curl -s ifconfig.me):3000/settings" From 286423a97f2727e6de2b20328ec88f63f1f42931 Mon Sep 17 00:00:00 2001 From: tmnd1608-creator Date: Fri, 20 Mar 2026 16:32:51 +1100 Subject: [PATCH 6/6] Create codeql.yml --- .github/workflows/codeql.yml | 101 +++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 .github/workflows/codeql.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 00000000..1c8bd10d --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,101 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL Advanced" + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + schedule: + - cron: '36 2 * * 4' + +jobs: + analyze: + name: Analyze (${{ matrix.language }}) + # Runner size impacts CodeQL analysis time. To learn more, please see: + # - https://gh.io/recommended-hardware-resources-for-running-codeql + # - https://gh.io/supported-runners-and-hardware-resources + # - https://gh.io/using-larger-runners (GitHub.com only) + # Consider using larger runners or machines with greater resources for possible analysis time improvements. + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read + + # only required for workflows in private repositories + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + include: + - language: javascript-typescript + build-mode: none + - language: python + build-mode: none + # CodeQL supports the following values keywords for 'language': 'actions', 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'rust', 'swift' + # Use `c-cpp` to analyze code written in C, C++ or both + # Use 'java-kotlin' to analyze code written in Java, Kotlin or both + # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both + # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, + # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. + # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how + # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + # Add any setup steps before running the `github/codeql-action/init` action. + # This includes steps like installing compilers or runtimes (`actions/setup-node` + # or others). This is typically only required for manual builds. + # - name: Setup runtime (example) + # uses: actions/setup-example@v1 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v4 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - name: Run manual build steps + if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4 + with: + category: "/language:${{matrix.language}}"