Skip to content

Commit 55d0689

Browse files
aksOpsclaude
andcommitted
Wire NiceGUI UI into FastAPI server (Task 9)
Replace welcome HTML route with redirect to /ui, call setup_ui() to register NiceGUI pages, and mount NiceGUI on the existing FastAPI app via ui.run_with(). Update test to expect 307 redirect at /. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent f4c8733 commit 55d0689

3 files changed

Lines changed: 72 additions & 11 deletions

File tree

src/osscodeiq/server/app.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
"""FastAPI application assembly — mounts REST API, MCP server, and welcome page."""
1+
"""FastAPI application assembly — mounts REST API, MCP server, and NiceGUI UI."""
22

33
from __future__ import annotations
44

55
from pathlib import Path
66

77
from fastapi import FastAPI
8-
from fastapi.responses import HTMLResponse
8+
from fastapi.responses import RedirectResponse
99

1010
from osscodeiq.server.middleware import AuthMiddleware
1111
from osscodeiq.server.mcp_server import get_mcp_app, set_service
@@ -44,10 +44,21 @@ def create_app(
4444
router = create_router(service)
4545
app.include_router(router)
4646

47-
# Welcome page at /
48-
@app.get("/", response_class=HTMLResponse, include_in_schema=False)
49-
async def welcome():
50-
template_path = Path(__file__).parent / "templates" / "welcome.html"
51-
return HTMLResponse(template_path.read_text(encoding="utf-8"))
47+
# Redirect / to NiceGUI UI
48+
@app.get("/", include_in_schema=False)
49+
async def root_redirect():
50+
return RedirectResponse(url="/ui")
51+
52+
# NiceGUI UI (explorer, flow, MCP console)
53+
from osscodeiq.server.ui import setup_ui
54+
from nicegui import ui
55+
56+
setup_ui(service)
57+
ui.run_with(
58+
app,
59+
dark=None,
60+
title="OSSCodeIQ",
61+
storage_secret="osscodeiq-ui",
62+
)
5263

5364
return app
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,51 @@
11
"""NiceGUI-based web UI for OSSCodeIQ."""
2+
3+
from __future__ import annotations
4+
5+
from typing import TYPE_CHECKING
6+
7+
from nicegui import ui
8+
9+
from osscodeiq.server.ui.theme import BRAND_COLOR
10+
11+
if TYPE_CHECKING:
12+
from osscodeiq.server.service import CodeIQService
13+
14+
15+
def setup_ui(service: CodeIQService) -> None:
16+
"""Register NiceGUI pages on the existing FastAPI app."""
17+
18+
@ui.page("/ui")
19+
def index():
20+
dark = ui.dark_mode(value=None)
21+
22+
with ui.header().classes("items-center justify-between px-4 py-2"):
23+
with ui.row().classes("items-center gap-3"):
24+
ui.icon("hub").style(f"color: {BRAND_COLOR}; font-size: 28px")
25+
ui.label("OSSCodeIQ").classes("text-lg font-bold")
26+
with ui.row().classes("items-center gap-2"):
27+
try:
28+
stats = service.get_stats()
29+
ui.badge(f"{stats.get('total_nodes', 0):,} nodes").props("color=primary outline")
30+
ui.badge(f"{stats.get('total_edges', 0):,} edges").props("color=positive outline")
31+
except Exception:
32+
pass
33+
ui.button(icon="light_mode", on_click=lambda: dark.set_value(False)).props("flat dense round").tooltip("Light theme")
34+
ui.button(icon="dark_mode", on_click=lambda: dark.set_value(True)).props("flat dense round").tooltip("Dark theme")
35+
ui.button(icon="contrast", on_click=lambda: dark.set_value(None)).props("flat dense round").tooltip("System theme")
36+
37+
with ui.tabs().classes("w-full") as tabs:
38+
explorer_tab = ui.tab("Explorer", icon="explore")
39+
flow_tab = ui.tab("Flow", icon="account_tree")
40+
console_tab = ui.tab("MCP Console", icon="terminal")
41+
42+
with ui.tab_panels(tabs, value=explorer_tab).classes("w-full flex-grow"):
43+
with ui.tab_panel(explorer_tab):
44+
from osscodeiq.server.ui.explorer import create_explorer_page
45+
create_explorer_page(service)
46+
with ui.tab_panel(flow_tab):
47+
from osscodeiq.server.ui.flow_view import create_flow_page
48+
create_flow_page(service)
49+
with ui.tab_panel(console_tab):
50+
from osscodeiq.server.ui.mcp_console import create_mcp_console
51+
create_mcp_console(service)

tests/server/test_app.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ def test_create_app_returns_fastapi(app):
2424
assert isinstance(app, FastAPI)
2525

2626

27-
def test_welcome_page(client):
28-
resp = client.get("/")
29-
assert resp.status_code == 200
30-
assert "OSSCodeIQ" in resp.text
27+
def test_root_redirects_to_ui(client):
28+
resp = client.get("/", follow_redirects=False)
29+
assert resp.status_code == 307
30+
assert resp.headers["location"] == "/ui"
3131

3232

3333
def test_api_stats_route(client):

0 commit comments

Comments
 (0)