mirror of
https://github.com/blackboxprogramming/BlackRoad-Operating-System.git
synced 2026-03-17 06:57:17 -05:00
Implements complete Phase 2 scaffold across 6 core modules: ## New Modules ### 1. Backend API Enhancements - Add system router with /version, /config/public, /os/state endpoints - Register system router in main.py - Add comprehensive tests for system endpoints ### 2. Core OS Runtime (core_os/) - Implement UserSession, Window, OSState models - Add state management functions (open_window, close_window, etc.) - Create Backend API adapter for communication - Include full test suite for models and state ### 3. Operator Engine (operator_engine/) - Build job registry with example jobs - Implement simple scheduler with lifecycle management - Optional HTTP server on port 8001 - Complete tests for jobs and scheduler ### 4. Web Client Enhancements - Add CoreOSClient JavaScript class - Integrate system API endpoints - Event-driven architecture for state updates - Zero dependencies, vanilla JavaScript ### 5. Prism Console (prism-console/) - Modern dark-themed admin UI - Multi-tab navigation (Overview, Jobs, Agents, Logs, System) - Real-time metrics dashboard - Backend API integration with auto-refresh ### 6. Documentation (codex-docs/) - Complete MkDocs-based documentation - Architecture guides and component docs - Infrastructure setup guides - API reference documentation ## CI/CD - Add core-os-tests.yml workflow - Add operator-tests.yml workflow - Add docs-build.yml workflow ## Documentation - Create BLACKROAD_OS_REPO_MAP.md cross-reference - Add README for each module - Comprehensive integration documentation ## Summary - 37 new files created - ~3,500 lines of new code - 5 test suites with 15+ tests - 3 new CI workflows - 10+ documentation pages All modules are minimal working skeletons ready for integration. Designed to be extracted into separate repos if needed. Phase 2 scaffold complete and ready for review.
149 lines
3.9 KiB
JavaScript
149 lines
3.9 KiB
JavaScript
/**
|
|
* Prism Console JavaScript
|
|
* BlackRoad OS Admin Interface
|
|
*/
|
|
|
|
class PrismConsole {
|
|
constructor() {
|
|
this.apiBase = window.location.origin;
|
|
this.init();
|
|
}
|
|
|
|
async init() {
|
|
console.log('Prism Console initializing...');
|
|
|
|
// Setup tab navigation
|
|
this.setupTabs();
|
|
|
|
// Load initial data
|
|
await this.loadDashboard();
|
|
|
|
// Setup auto-refresh
|
|
setInterval(() => this.loadDashboard(), 30000); // Every 30 seconds
|
|
|
|
console.log('Prism Console ready');
|
|
}
|
|
|
|
setupTabs() {
|
|
const navItems = document.querySelectorAll('.nav-item');
|
|
|
|
navItems.forEach(item => {
|
|
item.addEventListener('click', () => {
|
|
// Remove active from all
|
|
navItems.forEach(nav => nav.classList.remove('active'));
|
|
document.querySelectorAll('.tab-panel').forEach(panel => {
|
|
panel.classList.remove('active');
|
|
});
|
|
|
|
// Add active to clicked
|
|
item.classList.add('active');
|
|
const tabId = `${item.dataset.tab}-tab`;
|
|
document.getElementById(tabId).classList.add('active');
|
|
|
|
// Load tab-specific data
|
|
this.loadTabData(item.dataset.tab);
|
|
});
|
|
});
|
|
}
|
|
|
|
async loadDashboard() {
|
|
try {
|
|
// Get system version
|
|
const version = await this.fetchAPI('/api/system/version');
|
|
document.getElementById('backend-version').textContent = version.version;
|
|
document.getElementById('environment-badge').textContent = version.env;
|
|
|
|
// Get system status
|
|
document.getElementById('system-status').textContent = 'Healthy ✓';
|
|
document.getElementById('health-status').style.color = '#10b981';
|
|
|
|
// Update last updated time
|
|
const now = new Date().toLocaleTimeString();
|
|
document.getElementById('last-updated').textContent = `Last updated: ${now}`;
|
|
|
|
} catch (error) {
|
|
console.error('Failed to load dashboard:', error);
|
|
document.getElementById('system-status').textContent = 'Error';
|
|
document.getElementById('health-status').style.color = '#ef4444';
|
|
}
|
|
}
|
|
|
|
async loadTabData(tab) {
|
|
console.log(`Loading data for tab: ${tab}`);
|
|
|
|
switch (tab) {
|
|
case 'jobs':
|
|
await this.loadJobs();
|
|
break;
|
|
case 'agents':
|
|
await this.loadAgents();
|
|
break;
|
|
case 'system':
|
|
await this.loadSystemConfig();
|
|
break;
|
|
default:
|
|
console.log('No specific data to load for this tab');
|
|
}
|
|
}
|
|
|
|
async loadJobs() {
|
|
console.log('TODO: Load jobs from Operator Engine API');
|
|
// Future: Fetch from /api/operator/jobs
|
|
}
|
|
|
|
async loadAgents() {
|
|
console.log('TODO: Load agents from Agent Library API');
|
|
// Future: Fetch from /api/agents
|
|
}
|
|
|
|
async loadSystemConfig() {
|
|
try {
|
|
const config = await this.fetchAPI('/api/system/config/public');
|
|
|
|
// Display config
|
|
const configDisplay = document.getElementById('config-display');
|
|
configDisplay.innerHTML = `
|
|
<pre>${JSON.stringify(config, null, 2)}</pre>
|
|
`;
|
|
|
|
// Display features
|
|
const featuresDisplay = document.getElementById('features-display');
|
|
featuresDisplay.innerHTML = Object.entries(config.features || {})
|
|
.map(([key, value]) => {
|
|
const icon = value ? '✅' : '❌';
|
|
return `<div>${icon} ${key}: ${value}</div>`;
|
|
})
|
|
.join('');
|
|
|
|
} catch (error) {
|
|
console.error('Failed to load system config:', error);
|
|
}
|
|
}
|
|
|
|
async fetchAPI(endpoint) {
|
|
const response = await fetch(`${this.apiBase}${endpoint}`);
|
|
if (!response.ok) {
|
|
throw new Error(`API request failed: ${response.statusText}`);
|
|
}
|
|
return response.json();
|
|
}
|
|
}
|
|
|
|
// Global functions for HTML onclick
|
|
function refreshDashboard() {
|
|
window.prism.loadDashboard();
|
|
}
|
|
|
|
function viewLogs() {
|
|
document.querySelector('[data-tab="logs"]').click();
|
|
}
|
|
|
|
function openOS() {
|
|
window.location.href = '/';
|
|
}
|
|
|
|
// Initialize when DOM is ready
|
|
document.addEventListener('DOMContentLoaded', () => {
|
|
window.prism = new PrismConsole();
|
|
});
|