feat(phase7): complete page audit, add missing admin pages - command station, logs, substations, deployments

This commit is contained in:
cawcenter
2025-12-15 02:03:25 -05:00
parent 80236e4d56
commit 135de6de52
8 changed files with 942 additions and 1 deletions

215
ADMIN_PAGE_AUDIT.md Normal file
View File

@@ -0,0 +1,215 @@
# God Mode Admin - Page Inventory & Status
## 📊 Complete Audit of All Admin Pages
### ✅ FULLY FUNCTIONAL PAGES
#### 1. **Mission Control** (`/admin` or `/admin/index.astro`)
- **Status:** ✅ Complete
- **Features:** Dashboard, system metrics, resource monitor, quick links
- **DB Required:** SystemControl component fetches metrics
- **API:** Uses internal metrics API
#### 2. **Content Generator** (`/admin/content-generator.astro`)
- **Status:** ✅ Complete
- **Features:** Submit blueprints, launch campaigns, view stats
- **DB Required:** campaign_masters, variation_registry
- **API:** `/api/god/campaigns/*`
---
### 🟡 PAGES WITH CODE (Need DB/API Connection)
#### 3. **Sites** (`/admin/sites.astro`)
- **Status:** 🟡 UI exists, needs DB data
- **Built:** Table layout, stats cards
- **Missing:** Real data from `sites` table
- **DB Tables:** sites, posts (count)
- **Next Step:** Connect to `/api/collections/sites`
#### 4. **Avatars** (`/admin/intelligence/avatars.astro`)
- **Status:** 🟡 UI exists, needs DB data
- **Built:** Table layout, stats
- **Missing:** Real data from `avatars` table
- **DB Tables:** avatars
- **Next Step:** Connect to `/api/collections/avatars`
#### 5. **Campaigns** (`/admin/collections/campaign-masters.astro`)
- **Status:** 🟡 UI exists, needs DB data
- **Built:** Table layout, stats grid
- **Missing:** Real data from `campaign_masters` table
- **DB Tables:** campaign_masters, posts
- **Next Step:** Connect to existing fetch logic
#### 6. **Spintax Dictionaries** (`/admin/collections/spintax-dictionaries.astro`)
- **Status:** 🟡 UI exists, needs DB data
- **Built:** Table layout
- **Missing:** Real spintax data
- **DB Tables:** spintax_dictionaries
- **Next Step:** Populate with actual spintax data
#### 7. **Cartesian Patterns** (`/admin/collections/cartesian-patterns.astro`)
- **Status:** 🟡 UI exists, needs DB data
- **Built:** Table layout
- **Missing:** Real pattern data
- **DB Tables:** cartesian_patterns
- **Next Step:** Connect to real pattern storage
#### 8. **Generation Queue** (`/admin/collections/generation-jobs.astro`)
- **Status:** 🟡 UI exists, needs BullMQ connection
- **Built:** Table layout, status indicators
- **Missing:** Real job queue data
- **DB Tables:** generation_jobs + BullMQ Redis
- **Next Step:** Connect to BullMQ API
#### 9. **Content Fragments** (`/admin/collections/content-fragments.astro`)
- **Status:** 🟡 UI exists, needs DB data
- **Built:** Table layout
- **Missing:** Real fragment data
- **DB Tables:** content_fragments
- **Next Step:** Show actual blocks from campaigns
#### 10. **Posts** (`/admin/content/posts.astro`)
- **Status:** 🟡 UI exists, needs DB data
- **Built:** Table layout
- **Missing:** Real posts
- **DB Tables:** posts
- **Next Step:** Show generated articles
#### 11. **Pages** (`/admin/content/pages.astro`)
- **Status:** 🟡 UI exists, needs DB data
- **Built:** Table layout
- **Missing:** Real pages
- **DB Tables:** pages
- **Next Step:** Connect to pages table
#### 12. **Articles** (`/admin/seo/articles/index.astro`)
- **Status:** 🟡 UI exists, needs DB data
- **Built:** Table layout
- **Missing:** Real SEO articles
- **DB Tables:** posts (SEO optimized)
- **Next Step:** Filter posts by type
---
### 🔴 PLACEHOLDER PAGES (Coming Soon UI)
#### 13. **Avatar Variants** (`/admin/collections/avatar-variants.astro`)
- **Status:** 🔴 Placeholder only
- **Message:** "Coming soon - Avatar variation management"
- **Planned:** Sub-personas, tone variations
#### 14. **Headlines** (`/admin/collections/headline-inventory.astro`)
- **Status:** 🔴 Placeholder only
- **Message:** "Coming soon - Headline library"
- **Planned:** H1/H2 templates, A/B variations
#### 15. **Offer Blocks** (`/admin/collections/offer-blocks.astro`)
- **Status:** 🔴 Placeholder only
- **Message:** "Coming soon - Offer block templates"
- **Planned:** CTA blocks, pricing tables
#### 16. **Leads** (`/admin/leads/index.astro`)
- **Status:** 🔴 Placeholder only
- **Message:** "Coming soon - Lead management"
- **Planned:** Form submissions, CRM integration
#### 17. **Media Assets** (`/admin/media/templates.astro`)
- **Status:** 🔴 Placeholder only
- **Message:** "Coming soon - Media library"
- **Planned:** Images, SVGs, videos
#### 18. **Jumpstart** (`/admin/sites/jumpstart.astro`)
- **Status:** 🔴 Placeholder only
- **Message:** "Coming soon - Quick site deployment"
- **Planned:** 1-click site setup
---
### ❌ MISSING PAGES (No Code Yet)
#### 19. **Command Station** (`/admin/command-station`)
- **Status:** ❌ Does not exist
- **Purpose:** Unified command center (possibly duplicate of Mission Control?)
- **Should Create:** Placeholder or redirect to Mission Control
#### 20. **Jumpstart Test** (`/admin/jumpstart-test`)
- **Status:** ❌ Does not exist
- **Purpose:** Testing wizard for Jumpstart feature
- **Should Create:** Placeholder page
#### 21. **Content Factory** (`/admin/content-factory`)
- **Status:** ❌ Does not exist
- **Purpose:** Content production dashboard
- **Should Create:** Aggregated view of campaigns + generation + posts
#### 22. **Intelligence Library** (`/admin/intelligence`)
- **Status:** ❌ Does not exist (folder exists but no index)
- **Purpose:** Main intelligence hub
- **Should Create:** Index page linking to Avatars, Geo Intelligence
#### 23. **Geo Intelligence** (`/admin/collections/geo-intelligence.astro`)
- **Status:** ⚠️ File exists but was previously broken
- **Purpose:** Location data management
- **Should Create:** Fix and test
#### 24. **Sites & Deployments** (`/admin/deployments`)
- **Status:** ❌ Does not exist (sites.astro exists but not deployments)
- **Purpose:** Deployment status dashboard
- **Should Create:** Deployment tracking page
#### 25. **Generated Articles** (`/admin/generated-articles`)
- **Status:** ❌ Does not exist (posts.astro exists)
- **Purpose:** Filter for generated content vs manual
- **Should Create:** Filtered view of posts
#### 26. **Configuration** (`/admin/configuration` or `/admin/settings.astro`)
- **Status:** ⚠️ settings.astro exists
- **Purpose:** System settings
- **Should Check:** Verify settings.astro works
#### 27. **System Logs** (`/admin/logs`)
- **Status:** ❌ Does not exist
- **Purpose:** System activity logs
- **Should Create:** Log viewer page
#### 28. **Sub-Station Status** (`/admin/substations`)
- **Status:** ❌ Does not exist
- **Purpose:** Monitor Intelligence/Production/WordPress stations
- **Should Create:** Status dashboard
---
## 🎯 Phase 7 Action Plan
### Immediate Actions:
1. ✅ Fix package.json (broken JSON syntax)
2. 🔧 Create all missing placeholder pages
3. 🔧 Fix geo-intelligence.astro
4. 🔧 Verify settings.astro
5. 🔧 Create redirects where appropriate
### DB Connection Priority:
1. Sites (most important for users)
2. Campaigns (for content generation)
3. Generated Posts (to show results)
4. Avatars (for AI personas)
5. Generation Queue (to track progress)
### API Endpoints Needed:
- `/api/collections/*` - Generic collection fetcher
- `/api/queue/status` - BullMQ job status
- `/api/logs` - System logs
- `/api/substations/status` - Service health
---
## 📋 Summary
- **Total Pages Needed:** 28
- **Fully Functional:** 2
- **UI Built (Need Data):** 10
- **Placeholders:** 6
- **Missing Entirely:** 10
**Next:** Create all missing pages with proper layouts and status indicators.

View File

@@ -1,4 +1,3 @@
```json
{
"name": "spark-god-mode",
"type": "module",

View File

@@ -0,0 +1,133 @@
---
import AdminLayout from '../../layouts/AdminLayout.astro';
---
<AdminLayout title="Command Station">
<div class="space-y-8">
<!-- Header -->
<div>
<h1 class="text-4xl font-bold text-gold-500 mb-2">🎛️ Command Station</h1>
<p class="text-gray-400">Unified control center for all God Mode operations</p>
</div>
<!-- Status Grid -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- Intelligence Station -->
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="flex items-center justify-between mb-4">
<h3 class="text-xl font-bold text-gold-500">🧠 Intelligence Station</h3>
<span class="px-3 py-1 bg-green-500/20 text-green-400 rounded-full text-sm font-semibold">ACTIVE</span>
</div>
<div class="space-y-3 text-sm">
<div class="flex justify-between">
<span class="text-gray-400">Avatars</span>
<a href="/admin/intelligence/avatars" class="text-blue-400 hover:text-blue-300">Manage →</a>
</div>
<div class="flex justify-between">
<span class="text-gray-400">Geo Intelligence</span>
<a href="/admin/collections/geo-intelligence" class="text-blue-400 hover:text-blue-300">View →</a>
</div>
<div class="flex justify-between">
<span class="text-gray-400">Patterns</span>
<a href="/admin/collections/cartesian-patterns" class="text-blue-400 hover:text-blue-300">Edit →</a>
</div>
</div>
</div>
<!-- Production Station -->
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="flex items-center justify-between mb-4">
<h3 class="text-xl font-bold text-gold-500">⚡ Production Station</h3>
<span class="px-3 py-1 bg-green-500/20 text-green-400 rounded-full text-sm font-semibold">ACTIVE</span>
</div>
<div class="space-y-3 text-sm">
<div class="flex justify-between">
<span class="text-gray-400">Content Generator</span>
<a href="/admin/content-generator" class="text-blue-400 hover:text-blue-300">Launch →</a>
</div>
<div class="flex justify-between">
<span class="text-gray-400">Generation Queue</span>
<a href="/admin/collections/generation-jobs" class="text-blue-400 hover:text-blue-300">Monitor →</a>
</div>
<div class="flex justify-between">
<span class="text-gray-400">Factory</span>
<a href="/admin/factory" class="text-blue-400 hover:text-blue-300">Open →</a>
</div>
</div>
</div>
<!-- WordPress Ignition -->
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="flex items-center justify-between mb-4">
<h3 class="text-xl font-bold text-gold-500">🔌 WordPress Ignition</h3>
<span class="px-3 py-1 bg-yellow-500/20 text-yellow-400 rounded-full text-sm font-semibold">STANDBY</span>
</div>
<div class="space-y-3 text-sm">
<div class="flex justify-between">
<span class="text-gray-400">WP Connection</span>
<span class="text-green-400">Ready</span>
</div>
<div class="flex justify-between">
<span class="text-gray-400">Sync Status</span>
<span class="text-gray-500">Idle</span>
</div>
<div class="flex justify-between">
<span class="text-gray-400">Actions</span>
<button class="text-blue-400 hover:text-blue-300">Configure →</button>
</div>
</div>
</div>
</div>
<!-- Quick Actions -->
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<h2 class="text-2xl font-bold text-gold-500 mb-6">⚡ Quick Actions</h2>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
<a href="/admin/content-generator" class="bg-obsidian border border-edge-subtle rounded-lg p-4 hover:border-gold-500 transition-all text-center">
<div class="text-3xl mb-2">🎯</div>
<div class="text-sm font-semibold text-gray-300">New Campaign</div>
</a>
<a href="/admin/factory" class="bg-obsidian border border-edge-subtle rounded-lg p-4 hover:border-gold-500 transition-all text-center">
<div class="text-3xl mb-2">🏭</div>
<div class="text-sm font-semibold text-gray-300">Content Factory</div>
</a>
<a href="/admin/sites" class="bg-obsidian border border-edge-subtle rounded-lg p-4 hover:border-gold-500 transition-all text-center">
<div class="text-3xl mb-2">🌐</div>
<div class="text-sm font-semibold text-gray-300">Sites</div>
</a>
<a href="/admin/db-console" class="bg-obsidian border border-edge-subtle rounded-lg p-4 hover:border-gold-500 transition-all text-center">
<div class="text-3xl mb-2">💾</div>
<div class="text-sm font-semibold text-gray-300">DB Console</div>
</a>
</div>
</div>
<!-- System Health -->
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<h2 class="text-2xl font-bold text-gold-500 mb-6">🏥 System Health</h2>
<div class="grid grid-cols-2 md:grid-cols-3 gap-4">
<div class="bg-obsidian rounded-lg p-4 border border-edge-subtle">
<div class="text-sm text-gray-400 mb-1">Core API</div>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-green-400 font-semibold">Online</span>
</div>
</div>
<div class="bg-obsidian rounded-lg p-4 border border-edge-subtle">
<div class="text-sm text-gray-400 mb-1">Database</div>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-green-400 font-semibold">Connected</span>
</div>
</div>
<div class="bg-obsidian rounded-lg p-4 border border-edge-subtle">
<div class="text-sm text-gray-400 mb-1">Redis Queue</div>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-green-400 font-semibold">Active</span>
</div>
</div>
</div>
</div>
</div>
</AdminLayout>

View File

@@ -0,0 +1,100 @@
---
import AdminLayout from '../../layouts/AdminLayout.astro';
---
<AdminLayout title="Generated Articles">
<div class="space-y-8">
<!-- Header -->
<div>
<h1 class="text-4xl font-bold text-gold-500 mb-2">📰 Generated Articles</h1>
<p class="text-gray-400">View all AI-generated content from campaigns</p>
</div>
<!-- Stats -->
<div class="grid grid-cols-4 gap-4">
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="text-sm text-gray-400 mb-1">Total Generated</div>
<div id="statTotal" class="text-3xl font-bold text-gold-500">0</div>
</div>
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="text-sm text-gray-400 mb-1">Published</div>
<div id="statPublished" class="text-3xl font-bold text-green-400">0</div>
</div>
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="text-sm text-gray-400 mb-1">Drafts</div>
<div id="statDrafts" class="text-3xl font-bold text-blue-400">0</div>
</div>
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="text-sm text-gray-400 mb-1">Campaigns</div>
<div id="statCampaigns" class="text-3xl font-bold text-purple-400">0</div>
</div>
</div>
<!-- Articles Table -->
<div class="bg-titanium border border-edge-normal rounded-xl overflow-hidden">
<div class="p-6 border-b border-edge-subtle">
<h2 class="text-xl font-bold text-gold-500">Generated Content</h2>
</div>
<div class="overflow-x-auto">
<table class="w-full">
<thead class="bg-obsidian border-b border-edge-subtle">
<tr>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Title</th>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Campaign</th>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Location</th>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Status</th>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Created</th>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Actions</th>
</tr>
</thead>
<tbody id="articlesTable" class="divide-y divide-edge-subtle">
<tr>
<td colspan="6" class="px-6 py-12 text-center text-gray-500">
<div class="text-4xl mb-2">📝</div>
<p>No generated articles yet. Create a campaign to get started.</p>
<a href="/admin/content-generator" class="inline-block mt-4 px-6 py-2 bg-gold-500 hover:bg-gold-600 text-obsidian font-semibold rounded-lg transition-all">
Create Campaign
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Implementation Note -->
<div class="bg-blue-500/10 border border-blue-500/30 rounded-xl p-6">
<div class="flex items-start gap-4">
<div class="text-2xl"></div>
<div>
<h3 class="font-semibold text-blue-400 mb-2">Database Connection Required</h3>
<p class="text-sm text-gray-400 mb-3">
This page will display posts from the <code class="px-2 py-1 bg-obsidian rounded text-gold-500">posts</code> table
filtered by generated content (linked via <code class="px-2 py-1 bg-obsidian rounded text-gold-500">variation_registry</code>).
</p>
<p class="text-sm text-gray-400">
<strong>API Endpoint:</strong> <code class="px-2 py-1 bg-obsidian rounded text-gold-500">GET /api/posts?type=generated</code>
</p>
</div>
</div>
</div>
</div>
</AdminLayout>
<script>
// Placeholder for future DB connection
async function loadGeneratedArticles() {
try {
const response = await fetch('/api/posts?type=generated');
if (response.ok) {
const data = await response.json();
// Update UI with real data
}
} catch (err) {
console.log('API not yet implemented');
}
}
loadGeneratedArticles();
</script>

View File

@@ -0,0 +1,51 @@
---
import AdminLayout from '../../layouts/AdminLayout.astro';
---
<AdminLayout title="Jumpstart Test">
<div class="space-y-8">
<!-- Header -->
<div>
<h1 class="text-4xl font-bold text-gold-500 mb-2">🚀 Jumpstart Test</h1>
<p class="text-gray-400">Test and validate Jumpstart site deployment wizard</p>
</div>
<!-- Test Status -->
<div class="bg-titanium border border-edge-normal rounded-xl p-8">
<div class="text-center py-12">
<div class="text-6xl mb-4">🧪</div>
<h2 class="text-2xl font-bold text-gold-500 mb-4">Jumpstart Testing Suite</h2>
<p class="text-gray-400 mb-8 max-w-2xl mx-auto">
This page will test the Jumpstart wizard functionality including template selection,
configuration, and rapid deployment to production.
</p>
<div class="inline-block bg-blue-500/20 border border-blue-500/50 rounded-lg px-6 py-3 mb-6">
<p class="text-blue-400 font-semibold">🔨 Under Construction</p>
</div>
<div class="space-y-4 max-w-md mx-auto text-left">
<div class="bg-obsidian rounded-lg p-4 border border-edge-subtle">
<h3 class="font-semibold text-gold-500 mb-2">Planned Features</h3>
<ul class="text-sm text-gray-400 space-y-2">
<li>✓ Template library browser</li>
<li>✓ Configuration wizard</li>
<li>✓ DNS verification</li>
<li>✓ Deployment validation</li>
<li>✓ Health check monitoring</li>
</ul>
</div>
<div class="flex gap-3">
<a href="/admin/sites/jumpstart" class="flex-1 px-4 py-3 bg-gray-700 hover:bg-gray-600 text-white font-semibold rounded-lg text-center transition-all">
Jumpstart Page →
</a>
<a href="/admin" class="flex-1 px-4 py-3 bg-gold-500 hover:bg-gold-600 text-obsidian font-semibold rounded-lg text-center transition-all">
Mission Control
</a>
</div>
</div>
</div>
</div>
</div>
</AdminLayout>

View File

@@ -0,0 +1,146 @@
---
import AdminLayout from '../../layouts/AdminLayout.astro';
---
<AdminLayout title="Sites & Deployments">
<div class="space-y-8">
<div>
<h1 class="text-4xl font-bold text-gold-500 mb-2">🚀 Sites & Deployments</h1>
<p class="text-gray-400">Manage site deployments and monitor deployment status</p>
</div>
<!-- Quick Stats -->
<div class="grid grid-cols-4 gap-4">
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="text-sm text-gray-400 mb-1">Total Sites</div>
<div class="text-3xl font-bold text-gold-500">0</div>
</div>
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="text-sm text-gray-400 mb-1">Live</div>
<div class="text-3xl font-bold text-green-400">0</div>
</div>
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="text-sm text-gray-400 mb-1">Deploying</div>
<div class="text-3xl font-bold text-blue-400">0</div>
</div>
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="text-sm text-gray-400 mb-1">Failed</div>
<div class="text-3xl font-bold text-red-400">0</div>
</div>
</div>
<!-- Deployments Table -->
<div class="bg-titanium border border-edge-normal rounded-xl overflow-hidden">
<div class="p-6 border-b border-edge-subtle flex items-center justify-between">
<h2 class="text-xl font-bold text-gold-500">Recent Deployments</h2>
<a href="/admin/sites/jumpstart" class="px-4 py-2 bg-gold-500 hover:bg-gold-600 text-obsidian font-semibold rounded-lg transition-all">
New Deployment
</a>
</div>
<div class="overflow-x-auto">
<table class="w-full">
<thead class="bg-obsidian border-b border-edge-subtle">
<tr>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Site</th>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Domain</th>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Status</th>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Last Deploy</th>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Health</th>
<th class="px-6 py-4 text-left text-sm font-semibold text-gray-300">Actions</th>
</tr>
</thead>
<tbody class="divide-y divide-edge-subtle">
<tr>
<td colspan="6" class="px-6 py-12 text-center text-gray-500">
<div class="text-4xl mb-2">🌐</div>
<p>No deployments yet. Use Jumpstart to deploy your first site.</p>
<a href="/admin/sites/jumpstart" class="inline-block mt-4 px-6 py-2 bg-gold-500 hover:bg-gold-600 text-obsidian font-semibold rounded-lg transition-all">
Launch Jumpstart
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- Deployment Services -->
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<h2 class="text-2xl font-bold text-gold-500 mb-6">🔧 Deployment Services</h2>
<div class="grid grid-cols-3 gap-4">
<div class="bg-obsidian rounded-lg p-4 border border-edge-subtle">
<div class="flex items-center gap-3 mb-3">
<div class="text-2xl">☁️</div>
<h3 class="font-semibold text-gold-500">Coolify</h3>
</div>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-sm text-green-400">Connected</span>
</div>
</div>
<div class="bg-obsidian rounded-lg p-4 border border-edge-subtle">
<div class="flex items-center gap-3 mb-3">
<div class="text-2xl">🔌</div>
<h3 class="font-semibold text-gold-500">DNS Provider</h3>
</div>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-yellow-400"></div>
<span class="text-sm text-yellow-400">Not Configured</span>
</div>
</div>
<div class="bg-obsidian rounded-lg p-4 border border-edge-subtle">
<div class="flex items-center gap-3 mb-3">
<div class="text-2xl">🔒</div>
<h3 class="font-semibold text-gold-500">SSL Certificates</h3>
</div>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-sm text-green-400">Auto-Provision</span>
</div>
</div>
</div>
</div>
<!-- Implementation Note -->
<div class="bg-blue-500/10 border border-blue-500/30 rounded-xl p-6">
<div class="flex items-start gap-4">
<div class="text-2xl"></div>
<div>
<h3 class="font-semibold text-blue-400 mb-2">Database & API Connection Required</h3>
<p class="text-sm text-gray-400 mb-3">
This page will fetch deployment data from the <code class="px-2 py-1 bg-obsidian rounded text-gold-500">sites</code> table
and deployment history from a <code class="px-2 py-1 bg-obsidian rounded text-gold-500">deployments</code> table.
</p>
<p class="text-sm text-gray-400">
<strong>API Endpoints:</strong>
</p>
<ul class="text-sm text-gray-400 space-y-1 list-disc list-inside mt-2">
<li><code class="px-2 py-1 bg-obsidian rounded text-gold-500">GET /api/sites</code></li>
<li><code class="px-2 py-1 bg-obsidian rounded text-gold-500">GET /api/deployments</code></li>
<li><code class="px-2 py-1 bg-obsidian rounded text-gold-500">POST /api/deployments/trigger</code></li>
<li><code class="px-2 py-1 bg-obsidian rounded text-gold-500">GET /api/deployments/:id/status</code></li>
</ul>
</div>
</div>
</div>
</div>
</AdminLayout>
<script>
async function loadDeployments() {
try {
const response = await fetch('/api/deployments');
if (response.ok) {
const data = await response.json();
// Update UI with real deployment data
}
} catch (err) {
console.log('Deployments API not yet implemented');
}
}
loadDeployments();
</script>

View File

@@ -0,0 +1,212 @@
---
import AdminLayout from '../../layouts/AdminLayout.astro';
---
<AdminLayout title="Sub-Station Status">
<div class="space-y-8">
<div>
<h1 class="text-4xl font-bold text-gold-500 mb-2">🎛️ Sub-Station Status</h1>
<p class="text-gray-400">Monitor all system sub-stations and services</p>
</div>
<!-- Status Overview -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- Intelligence Station -->
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="flex items-center justify-between mb-6">
<div class="flex items-center gap-3">
<div class="text-3xl">🧠</div>
<h3 class="text-xl font-bold text-gold-500">Intelligence Station</h3>
</div>
<span class="px-3 py-1 bg-green-500/20 text-green-400 rounded-full text-sm font-semibold">ACTIVE</span>
</div>
<div class="space-y-3">
<div class="bg-obsidian rounded-lg p-3 border border-edge-subtle">
<div class="flex items-center justify-between mb-2">
<span class="text-sm text-gray-400">Avatar Engine</span>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-xs text-green-400">Online</span>
</div>
</div>
<div class="text-xs text-gray-500">12 avatars loaded</div>
</div>
<div class="bg-obsidian rounded-lg p-3 border border-edge-subtle">
<div class="flex items-center justify-between mb-2">
<span class="text-sm text-gray-400">Geo Intelligence</span>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-xs text-green-400">Online</span>
</div>
</div>
<div class="text-xs text-gray-500">5,234 locations indexed</div>
</div>
<div class="bg-obsidian rounded-lg p-3 border border-edge-subtle">
<div class="flex items-center justify-between mb-2">
<span class="text-sm text-gray-400">Pattern Analyzer</span>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-xs text-green-400">Online</span>
</div>
</div>
<div class="text-xs text-gray-500">28 active patterns</div>
</div>
</div>
</div>
<!-- Production Station -->
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="flex items-center justify-between mb-6">
<div class="flex items-center gap-3">
<div class="text-3xl">⚡</div>
<h3 class="text-xl font-bold text-gold-500">Production Station</h3>
</div>
<span class="px-3 py-1 bg-green-500/20 text-green-400 rounded-full text-sm font-semibold">ACTIVE</span>
</div>
<div class="space-y-3">
<div class="bg-obsidian rounded-lg p-3 border border-edge-subtle">
<div class="flex items-center justify-between mb-2">
<span class="text-sm text-gray-400">Content Generator</span>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-xs text-green-400">Online</span>
</div>
</div>
<div class="text-xs text-gray-500">Worker idle, ready</div>
</div>
<div class="bg-obsidian rounded-lg p-3 border border-edge-subtle">
<div class="flex items-center justify-between mb-2">
<span class="text-sm text-gray-400">BullMQ Worker</span>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-xs text-green-400">Online</span>
</div>
</div>
<div class="text-xs text-gray-500">0 jobs in queue</div>
</div>
<div class="bg-obsidian rounded-lg p-3 border border-edge-subtle">
<div class="flex items-center justify-between mb-2">
<span class="text-sm text-gray-400">Spintax Engine</span>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-xs text-green-400">Online</span>
</div>
</div>
<div class="text-xs text-gray-500">Ready for processing</div>
</div>
</div>
</div>
<!-- WordPress Ignition -->
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="flex items-center justify-between mb-6">
<div class="flex items-center gap-3">
<div class="text-3xl">🔌</div>
<h3 class="text-xl font-bold text-gold-500">WordPress Ignition</h3>
</div>
<span class="px-3 py-1 bg-yellow-500/20 text-yellow-400 rounded-full text-sm font-semibold">STANDBY</span>
</div>
<div class="space-y-3">
<div class="bg-obsidian rounded-lg p-3 border border-edge-subtle">
<div class="flex items-center justify-between mb-2">
<span class="text-sm text-gray-400">WP Connection</span>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-xs text-green-400">Ready</span>
</div>
</div>
<div class="text-xs text-gray-500">Not configured</div>
</div>
<div class="bg-obsidian rounded-lg p-3 border border-edge-subtle">
<div class="flex items-center justify-between mb-2">
<span class="text-sm text-gray-400">Sync Engine</span>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-gray-500"></div>
<span class="text-xs text-gray-500">Idle</span>
</div>
</div>
<div class="text-xs text-gray-500">No active syncs</div>
</div>
</div>
</div>
</div>
<!-- Core Services -->
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<h2 class="text-2xl font-bold text-gold-500 mb-6">🔧 Core Services</h2>
<div class="grid grid-cols-2 md:grid-cols-4 gap-4">
<div class="bg-obsidian rounded-lg p-4 border border-edge-subtle">
<div class="text-sm text-gray-400 mb-2">Core API</div>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-green-400 font-semibold">Online</span>
</div>
</div>
<div class="bg-obsidian rounded-lg p-4 border border-edge-subtle">
<div class="text-sm text-gray-400 mb-2">Database</div>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-green-400 font-semibold">Connected</span>
</div>
</div>
<div class="bg-obsidian rounded-lg p-4 border border-edge-subtle">
<div class="text-sm text-gray-400 mb-2">Redis Queue</div>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-green-400 font-semibold">Active</span>
</div>
</div>
<div class="bg-obsidian rounded-lg p-4 border border-edge-subtle">
<div class="text-sm text-gray-400 mb-2">Astro Server</div>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400"></div>
<span class="text-green-400 font-semibold">Running</span>
</div>
</div>
</div>
</div>
<!-- Implementation Note -->
<div class="bg-blue-500/10 border border-blue-500/30 rounded-xl p-6">
<div class="flex items-start gap-4">
<div class="text-2xl"></div>
<div>
<h3 class="font-semibold text-blue-400 mb-2">Real-Time Status API Required</h3>
<p class="text-sm text-gray-400 mb-3">
This page requires health check endpoints for each service.
</p>
<p class="text-sm text-gray-400">
<strong>API Endpoints:</strong>
</p>
<ul class="text-sm text-gray-400 space-y-1 list-disc list-inside mt-2">
<li><code class="px-2 py-1 bg-obsidian rounded text-gold-500">GET /api/health/intelligence</code></li>
<li><code class="px-2 py-1 bg-obsidian rounded text-gold-500">GET /api/health/production</code></li>
<li><code class="px-2 py-1 bg-obsidian rounded text-gold-500">GET /api/health/wordpress</code></li>
<li><code class="px-2 py-1 bg-obsidian rounded text-gold-500">GET /api/health/core</code></li>
</ul>
</div>
</div>
</div>
</div>
</AdminLayout>
<script>
// Placeholder for health check polling
async function pollHealthStatus() {
// Will poll health endpoints every 5 seconds
console.log('Health check polling placeholder');
}
setInterval(pollHealthStatus, 5000);
</script>

View File

@@ -0,0 +1,85 @@
---
import AdminLayout from '../../layouts/AdminLayout.astro';
---
<AdminLayout title="System Logs">
<div class="space-y-8">
<div>
<h1 class="text-4xl font-bold text-gold-500 mb-2">📋 System Logs</h1>
<p class="text-gray-400">Real-time system activity and event monitoring</p>
</div>
<!-- Filters -->
<div class="bg-titanium border border-edge-normal rounded-xl p-6">
<div class="grid grid-cols-4 gap-4">
<select class="bg-obsidian border border-edge-subtle rounded-lg px-4 py-2 text-white">
<option>All Levels</option>
<option>Info</option>
<option>Warning</option>
<option>Error</option>
</select>
<select class="bg-obsidian border border-edge-subtle rounded-lg px-4 py-2 text-white">
<option>All Sources</option>
<option>API</option>
<option>Worker</option>
<option>Database</option>
</select>
<input type="datetime-local" class="bg-obsidian border border-edge-subtle rounded-lg px-4 py-2 text-white" />
<button class="px-4 py-2 bg-gold-500 hover:bg-gold-600 text-obsidian font-semibold rounded-lg transition-all">
Apply Filters
</button>
</div>
</div>
<!-- Log Stream -->
<div class="bg-titanium border border-edge-normal rounded-xl overflow-hidden">
<div class="p-6 border-b border-edge-subtle flex items-center justify-between">
<h2 class="text-xl font-bold text-gold-500">Live Log Stream</h2>
<div class="flex items-center gap-2">
<div class="w-2 h-2 rounded-full bg-green-400 animate-pulse"></div>
<span class="text-sm text-green-400">Live</span>
</div>
</div>
<div id="logContainer" class="bg-obsidian p-6 font-mono text-sm max-h-[600px] overflow-y-auto">
<div class="space-y-2">
<div class="text-gray-500">[2025-12-15 02:00:00] INFO: System initialized</div>
<div class="text-blue-400">[2025-12-15 02:00:05] INFO: Database connected</div>
<div class="text-green-400">[2025-12-15 02:00:10] INFO: Worker started</div>
<div class="text-gray-500">[2025-12-15 02:00:15] INFO: Redis connection established</div>
</div>
</div>
</div>
<!-- Implementation Note -->
<div class="bg-blue-500/10 border border-blue-500/30 rounded-xl p-6">
<div class="flex items-start gap-4">
<div class="text-2xl"></div>
<div>
<h3 class="font-semibold text-blue-400 mb-2">API Integration Required</h3>
<p class="text-sm text-gray-400 mb-3">
This page requires a logging API endpoint to stream real-time logs. Logs can be stored in:
</p>
<ul class="text-sm text-gray-400 space-y-1 list-disc list-inside">
<li>Database table: <code class="px-2 py-1 bg-obsidian rounded text-gold-500">system_logs</code></li>
<li>File-based logging (Winston, Pino)</li>
<li>External service (Datadog, Logstash)</li>
</ul>
<p class="text-sm text-gray-400 mt-3">
<strong>API Endpoint:</strong> <code class="px-2 py-1 bg-obsidian rounded text-gold-500">GET /api/logs?level=&source=&after=</code>
</p>
</div>
</div>
</div>
</div>
</AdminLayout>
<script>
// Placeholder for WebSocket log streaming
function connectLogStream() {
// Will connect to WebSocket for real-time logs
console.log('Log streaming placeholder');
}
connectLogStream();
</script>