feat: Add PWA support and CORS configuration

- Configure VitePWA with manifest, icons and service worker
- Add PwaInstallBanner component for install prompt in header
- Enable CORS for z590.interno.com access
- Use dynamic hostname for terminal WebSocket connection
- Add generate-icons script with sharp for PWA icons
- Fix theme-color to match header background
This commit is contained in:
2026-02-13 18:00:54 -06:00
parent 4450d1e034
commit 3c57f95b90
17 changed files with 1438 additions and 282 deletions

View File

@@ -4,7 +4,10 @@ import { RouterView, useRoute, useRouter } from 'vue-router'
import StatusBar from './components/StatusBar.vue'
import Toolbar from './components/Toolbar.vue'
import ComponentsDropdown from './components/ComponentsDropdown.vue'
import ToolsDropdown from './components/ToolsDropdown.vue'
import ConnectionDropdown from './components/ConnectionDropdown.vue'
import FloatingTerminal from './components/FloatingTerminal.vue'
import PwaInstallBanner from './components/PwaInstallBanner.vue'
import { initWebMCP, getWebMCP, startTokenPolling, stopTokenPolling, connectWithToken } from './services/webmcp'
import { initToolRegistry, activatePageTools, initToolsOnRefresh } from './services/toolRegistry'
import { useCanvasStore } from './stores/canvas'
@@ -57,7 +60,10 @@ watch(() => route.name, (newPage) => {
<header class="app-header">
<div class="header-left">
<h1 class="logo">Agent UI</h1>
<ConnectionDropdown />
<ComponentsDropdown />
<ToolsDropdown />
<PwaInstallBanner />
</div>
<StatusBar />
</header>
@@ -97,6 +103,7 @@ watch(() => route.name, (newPage) => {
display: flex;
flex-direction: column;
height: 100vh;
height: 100dvh;
background: var(--bg-primary);
}
@@ -105,8 +112,12 @@ watch(() => route.name, (newPage) => {
align-items: center;
justify-content: space-between;
padding: 0.75rem 1.5rem;
padding-top: calc(0.75rem + env(safe-area-inset-top, 0px));
padding-left: calc(1.5rem + env(safe-area-inset-left, 0px));
padding-right: calc(1.5rem + env(safe-area-inset-right, 0px));
background: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
flex-shrink: 0;
}
.header-left {