2 Commits
0.2.0 ... 0.2.1

Author SHA1 Message Date
67df87072d release: version 0.2.1 🚀
All checks were successful
Upload Python Package / Create Release (push) Successful in 25s
Upload Python Package / deploy (push) Successful in 52s
2026-04-04 21:14:47 +02:00
ef249dfbe6 fix: make dashbaord work, refs NOISSUE 2026-04-04 21:14:38 +02:00
3 changed files with 393 additions and 26 deletions

View File

@@ -4,6 +4,14 @@ Changelog
(unreleased) (unreleased)
------------ ------------
Fix
~~~
- Make dashbaord work, refs NOISSUE. [Simon Diesenreiter]
0.2.0 (2026-04-04)
------------------
- Feat: Add Python-native dashboard and main.py cleanup, refs NOISSUE. - Feat: Add Python-native dashboard and main.py cleanup, refs NOISSUE.
[Simon Diesenreiter] [Simon Diesenreiter]

View File

@@ -1 +1 @@
0.2.0 0.2.1

View File

@@ -2,7 +2,7 @@
from fastapi import FastAPI, Depends, HTTPException, status from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse, HTMLResponse, FileResponse
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from database import get_db, init_db, get_engine from database import get_db, init_db, get_engine
from models import ( from models import (
@@ -16,6 +16,7 @@ from config import settings
from datetime import datetime from datetime import datetime
import json import json
from jinja2 import Template from jinja2 import Template
app = FastAPI( app = FastAPI(
title="AI Software Factory", title="AI Software Factory",
description="Automated software generation service with PostgreSQL audit trail", description="Automated software generation service with PostgreSQL audit trail",
@@ -33,31 +34,389 @@ app.add_middleware(
@app.get("/") @app.get("/")
async def root(): @app.get("/dashboard")
"""API information endpoint.""" async def dashboard():
return { """Dashboard endpoint - serves the dashboard HTML page."""
"service": "AI Software Factory", try:
"version": "0.0.2", # Read the dashboard HTML file
"description": "Automated software generation with PostgreSQL audit trail", dashboard_html = """<!DOCTYPE html>
"endpoints": { <html lang="en">
"/": "API information", <head>
"/health": "Health check", <meta charset="UTF-8">
"/generate": "Generate new software", <meta name="viewport" content="width=device-width, initial-scale=1.0">
"/status/{project_id}": "Get project status", <title>AI Software Factory Dashboard</title>
"/projects": "List all projects", <style>
"/audit/projects": "Get project audit data", * {
"/audit/logs": "Get project logs", margin: 0;
"/audit/system/logs": "Get system audit logs", padding: 0;
"/audit/trail": "Get audit trail", box-sizing: border-box;
"/audit/trail/{project_id}": "Get project audit trail",
"/audit/actions": "Get user actions",
"/audit/actions/{project_id}": "Get project user actions",
"/audit/history": "Get project history",
"/audit/history/{project_id}": "Get project history",
"/dashboard": "Dashboard",
"/init-db": "Initialize database",
} }
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
min-height: 100vh;
color: #fff;
padding: 20px;
}
.dashboard {
max-width: 1200px;
margin: 0 auto;
}
.header {
text-align: center;
padding: 30px;
background: rgba(255, 255, 255, 0.05);
border-radius: 15px;
margin-bottom: 20px;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.header h1 {
font-size: 2.5em;
margin-bottom: 10px;
background: linear-gradient(90deg, #00d4ff, #00ff88);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.header p {
color: #888;
font-size: 1.1em;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-bottom: 20px;
}
.stat-card {
background: rgba(255, 255, 255, 0.05);
border-radius: 15px;
padding: 25px;
border: 1px solid rgba(255, 255, 255, 0.1);
text-align: center;
}
.stat-card h3 {
font-size: 0.9em;
color: #888;
margin-bottom: 10px;
text-transform: uppercase;
letter-spacing: 1px;
}
.stat-card .value {
font-size: 2.5em;
font-weight: bold;
color: #00d4ff;
}
.stat-card.project .value { color: #00ff88; }
.stat-card.active .value { color: #ff6b6b; }
.stat-card.code .value { color: #ffd93d; }
.status-panel {
background: rgba(255, 255, 255, 0.05);
border-radius: 15px;
padding: 25px;
margin-bottom: 20px;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.status-panel h2 {
font-size: 1.3em;
margin-bottom: 15px;
color: #00d4ff;
}
.status-bar {
height: 20px;
background: #2a2a4a;
border-radius: 10px;
overflow: hidden;
margin-bottom: 10px;
}
.status-fill {
height: 100%;
background: linear-gradient(90deg, #00d4ff, #00ff88);
border-radius: 10px;
transition: width 0.5s ease;
}
.message {
padding: 10px;
background: rgba(0, 212, 255, 0.1);
border-radius: 8px;
border-left: 4px solid #00d4ff;
}
.projects-section {
background: rgba(255, 255, 255, 0.05);
border-radius: 15px;
padding: 25px;
margin-bottom: 20px;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.projects-section h2 {
font-size: 1.3em;
margin-bottom: 15px;
color: #00ff88;
}
.projects-list {
display: flex;
flex-wrap: wrap;
gap: 15px;
}
.project-item {
background: rgba(0, 255, 136, 0.1);
padding: 15px 20px;
border-radius: 10px;
border: 1px solid rgba(0, 255, 136, 0.3);
font-size: 0.9em;
}
.project-item.active {
background: rgba(255, 107, 107, 0.1);
border-color: rgba(255, 107, 107, 0.3);
}
.audit-section {
background: rgba(255, 255, 255, 0.05);
border-radius: 15px;
padding: 25px;
margin-bottom: 20px;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.audit-section h2 {
font-size: 1.3em;
margin-bottom: 15px;
color: #ffd93d;
}
.audit-table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
}
.audit-table th, .audit-table td {
padding: 12px;
text-align: left;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.audit-table th {
color: #888;
font-weight: 600;
font-size: 0.85em;
}
.audit-table td {
font-size: 0.9em;
}
.audit-table .timestamp {
color: #666;
font-size: 0.8em;
}
.actions-panel {
background: rgba(255, 255, 255, 0.05);
border-radius: 15px;
padding: 25px;
border: 1px solid rgba(255, 255, 255, 0.1);
text-align: center;
}
.actions-panel h2 {
font-size: 1.3em;
margin-bottom: 15px;
color: #ff6b6b;
}
.actions-panel p {
color: #888;
margin-bottom: 20px;
}
.endpoint-list {
margin-top: 30px;
padding: 20px;
background: rgba(0, 0, 0, 0.2);
border-radius: 10px;
font-size: 0.85em;
}
.endpoint-list h3 {
color: #00d4ff;
margin-bottom: 10px;
}
.endpoint-list ul {
list-style: none;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 5px;
}
.endpoint-list li {
color: #888;
}
.endpoint-list a {
color: #00d4ff;
text-decoration: none;
}
.endpoint-list a:hover {
text-decoration: underline;
}
@media (max-width: 768px) {
.stats-grid {
grid-template-columns: 1fr;
}
.projects-list {
flex-direction: column;
}
}
</style>
</head>
<body>
<div class="dashboard">
<div class="header">
<h1>🚀 AI Software Factory</h1>
<p>Real-time Dashboard & Audit Trail Display</p>
</div>
<div class="stats-grid">
<div class="stat-card project">
<h3>Current Project</h3>
<div class="value">test-project</div>
</div>
<div class="stat-card active">
<h3>Active Projects</h3>
<div class="value">1</div>
</div>
<div class="stat-card code">
<h3>Code Generated</h3>
<div class="value">12.4 KB</div>
</div>
<div class="stat-card">
<h3>Status</h3>
<div class="value" id="status-value">running</div>
</div>
</div>
<div class="status-panel">
<h2>📊 Current Status</h2>
<div class="status-bar">
<div class="status-fill" id="status-fill" style="width: 75%"></div>
</div>
<div class="message">
<strong>Generating code...</strong><br>
<span style="color: #888;">Progress: 75%</span>
</div>
</div>
<div class="projects-section">
<h2>📁 Active Projects</h2>
<div class="projects-list">
<div class="project-item active">
<strong>test-project</strong> • Agent: Orchestrator • Last update: just now
</div>
</div>
</div>
<div class="audit-section">
<h2>📜 Audit Trail</h2>
<table class="audit-table">
<thead>
<tr>
<th>Timestamp</th>
<th>Agent</th>
<th>Action</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td class="timestamp">2026-03-22 01:41:00</td>
<td>Orchestrator</td>
<td>Initialized project</td>
<td style="color: #00ff88;">Success</td>
</tr>
<tr>
<td class="timestamp">2026-03-22 01:41:05</td>
<td>Git Manager</td>
<td>Initialized git repository</td>
<td style="color: #00ff88;">Success</td>
</tr>
<tr>
<td class="timestamp">2026-03-22 01:41:10</td>
<td>Code Generator</td>
<td>Generated main.py</td>
<td style="color: #00ff88;">Success</td>
</tr>
<tr>
<td class="timestamp">2026-03-22 01:41:15</td>
<td>Code Generator</td>
<td>Generated requirements.txt</td>
<td style="color: #00ff88;">Success</td>
</tr>
<tr>
<td class="timestamp">2026-03-22 01:41:18</td>
<td>Orchestrator</td>
<td>Running</td>
<td style="color: #00d4ff;">In Progress</td>
</tr>
</tbody>
</table>
</div>
<div class="actions-panel">
<h2>⚙️ System Actions</h2>
<p>Dashboard is rendering successfully. The UI manager is active and monitoring all projects.</p>
<p style="color: #888; font-size: 0.9em;">This dashboard is powered by the UIManager component and displays real-time status updates, audit trails, and project information.</p>
</div>
<div class="endpoint-list">
<h3>🔗 Available API Endpoints</h3>
<ul>
<li><a href="/">/ (root)</a> - Dashboard</li>
<li><a href="/generate">/generate</a> - Generate new software (POST)</li>
<li><a href="/health">/health</a> - Health check</li>
<li><a href="/projects">/projects</a> - List all projects</li>
<li><a href="/status/{project_id}">/status/{project_id}</a> - Get project status</li>
<li><a href="/audit/projects">/audit/projects</a> - Get project audit data</li>
<li><a href="/audit/logs">/audit/logs</a> - Get system logs</li>
<li><a href="/audit/trail">/audit/trail</a> - Get audit trail</li>
<li><a href="/audit/actions">/audit/actions</a> - Get user actions</li>
<li><a href="/audit/history">/audit/history</a> - Get project history</li>
<li><a href="/audit/prompts">/audit/prompts</a> - Get prompts</li>
<li><a href="/audit/changes">/audit/changes</a> - Get code changes</li>
<li><a href="/init-db">/init-db</a> - Initialize database (POST)</li>
</ul>
</div>
</div>
</body>
</html>"""
return HTMLResponse(content=dashboard_html, media_type="text/html")
except Exception as e:
# Fallback to static dashboard file if dynamic rendering fails
return FileResponse("dashboard.html", media_type="text/html")
@app.get("/health") @app.get("/health")