import uvicorn
from fastapi import FastAPI, WebSocket, WebSocketDisconnect, Request
-from fastapi.responses import HTMLResponse, JSONResponse
+from fastapi.responses import HTMLResponse, JSONResponse, Response
# JWT
from jose import jwt, JWTError
return HTMLResponse(load_html(), headers={"Cache-Control": "no-store"})
+# 站点图标(黑白灰终端提示符风格 SVG),供浏览器标签页 / 收藏夹使用
+FAVICON_FILE = FRONTEND_DIR / "favicon.svg"
+@app.get("/favicon.svg")
+async def favicon():
+ if not FAVICON_FILE.exists():
+ return Response(status_code=404)
+ return Response(
+ FAVICON_FILE.read_text(encoding="utf-8"),
+ media_type="image/svg+xml",
+ headers={"Cache-Control": "public, max-age=86400"},
+ )
+
+
# 设计说明 / 帮助页(独立静态 HTML,可从应用内“❓ 帮助”打开,支持打印为 PDF)
HELP_FILE = FRONTEND_DIR / "help.html"
@app.get("/help")
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" fill="none">
+ <rect width="100" height="100" rx="20" fill="#18181b"/>
+ <rect x="1.5" y="1.5" width="97" height="97" rx="18.5" stroke="#3f3f46" stroke-width="3"/>
+ <path d="M30 38L46 50L30 62" stroke="#f4f4f5" stroke-width="7" stroke-linecap="round" stroke-linejoin="round"/>
+ <rect x="54" y="56" width="18" height="6" rx="1.5" fill="#a1a1aa"/>
+</svg>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<title>Codebuddy Web Console</title>
+<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
<!-- 登录页 -->
<div id="login-page">
<div class="login-card">
- <div class="logo">🤖</div>
+ <div class="logo">
+ <svg width="56" height="56" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
+ <rect width="100" height="100" rx="20" fill="#18181b"/>
+ <rect x="1.5" y="1.5" width="97" height="97" rx="18.5" stroke="#3f3f46" stroke-width="3"/>
+ <path d="M30 38L46 50L30 62" stroke="#f4f4f5" stroke-width="7" stroke-linecap="round" stroke-linejoin="round"/>
+ <rect x="54" y="56" width="18" height="6" rx="1.5" fill="#a1a1aa"/>
+ </svg>
+ </div>
<h1>Codebuddy Console</h1>
<p class="subtitle">AI 编程助手 · 多任务远程控制台</p>
<input type="password" id="password-input" class="login-input" placeholder="输入访问密码" autofocus>