feat: add web UI dashboard SPA with dashboard, chat, sessions, and settings pages

- Add SPA shell with hash-based router, sidebar navigation, and WebSocket RPC client
- Add dashboard page with system health cards, channel status, and auto-refresh
- Add chat page with session selector, streaming tool events, and markdown rendering
- Add sessions page with list, history viewer, and delete functionality
- Add settings page with hook pattern editor, tool list, and config viewer
- Add backend handlers: sessions.delete, sessions.switch, system.channels, system.usage
- Wire channelRegistry into gateway server for channel status reporting
- Extend static file server with .mjs, .png, .ico, .woff2 content types
This commit is contained in:
William Valentin
2026-02-07 10:07:45 -08:00
parent f7d889e35e
commit 22230a3e3f
14 changed files with 1836 additions and 207 deletions
+9
View File
@@ -41,6 +41,7 @@ export interface GatewayServerConfig {
config?: Config;
/** Optional callback for system.restart. Should trigger graceful shutdown + process restart. */
restart?: () => Promise<void>;
channelRegistry?: { list(): Array<{ readonly name: string; readonly status: string }> };
}
export class GatewayServer {
@@ -75,10 +76,18 @@ export class GatewayServer {
getToolCount: () => this.config.toolRegistry.list().length,
getConnectionCount: () => this.sessionBridge.connectionCount,
restart: this.config.restart,
getChannels: this.config.channelRegistry
? () => this.config.channelRegistry!.list().map(a => ({ name: a.name, status: a.status }))
: undefined,
getUsage: () => ({
totalSessions: this.config.sessionManager.listSessions().length,
activeConnections: this.sessionBridge.connectionCount,
}),
});
const sessionHandlers = createSessionHandlers({
sessionManager: this.config.sessionManager,
sessionBridge: this.sessionBridge,
});
const toolHandlers = createToolHandlers({