chore: bootstrap hermes-ui skeleton from 0.6.29 snapshot
Import the client, server, skills, tests, and build scripts as the starting point for the rebuild, then trim the surfaces this project does not ship: Electron desktop packaging, the marketing website, and the ESP32 firmware tree. CI keeps the web build, e2e, lockfile, release, and Docker workflows. Rename the package and CLI entry points to hermes-ui, drop the prepare hook so npm ci no longer triggers a build, and drop the removed tsconfig and nodemon references. Rewrite AGENTS.md, ARCHITECTURE.md, DEVELOPMENT.md, and the READMEs so the documented package map and hard rules match this repository. reference_code/ is ignored: it is a read-only snapshot, not an input to the build.
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
import { join, resolve } from 'path'
|
||||
import { homedir } from 'os'
|
||||
|
||||
/**
|
||||
* Web UI environment variables.
|
||||
*
|
||||
* Server/listen:
|
||||
* - PORT: Web UI listen port. Default: 8648.
|
||||
* - BIND_HOST: Web UI bind host. Default: 0.0.0.0.
|
||||
* - CORS_ORIGINS: Comma/space-separated cross-origin allowlist. Default: same host only.
|
||||
*
|
||||
* Web UI storage:
|
||||
* - HERMES_WEB_UI_HOME: Web UI data home for auth token, credentials, logs, DB, and default uploads.
|
||||
* - HERMES_WEBUI_STATE_DIR: Compatibility alias for HERMES_WEB_UI_HOME.
|
||||
* Default: join(homedir(), '.hermes-web-ui').
|
||||
* - UPLOAD_DIR: Upload directory override. Default: join(HERMES_WEB_UI_HOME, 'upload').
|
||||
* - dataDir: Development-only internal Web UI runtime data directory.
|
||||
*
|
||||
* Auth:
|
||||
* - AUTH_TOKEN: Explicit bearer token. If unset, Web UI stores an auto-generated token under HERMES_WEB_UI_HOME.
|
||||
* - HERMES_WEB_UI_AUTH_JWT_EXPIRES_IN: Username/password session JWT lifetime. Supports seconds or s/m/h/d suffixes. Default: 30d.
|
||||
*
|
||||
* Runtime behavior:
|
||||
* - PROFILE: Initial Hermes profile name. Default: default.
|
||||
* - HERMES_GATEWAY_URL / GATEWAY_URL: Explicit Hermes gateway upstream URL for proxy routes.
|
||||
* - GATEWAY_HOST: Default Hermes gateway upstream host. Default: 127.0.0.1.
|
||||
* - GATEWAY_PORT: Default Hermes gateway upstream port. Default: 8642.
|
||||
* - HERMES_WEB_UI_DISABLE_GATEWAY_AUTOSTART: Disable Web UI gateway autostart checks and config-driven gateway start/stop reconciliation.
|
||||
* - HERMES_WEB_UI_MANAGED_GATEWAY: Web UI-managed Hermes gateway handling. Enabled by default; set 0/false/off to use CLI start.
|
||||
* - HERMES_WEB_UI_STOP_GATEWAYS_ON_SHUTDOWN: Whether Web UI shutdown also stops managed gateways.
|
||||
* - HERMES_WEB_UI_DISABLE_MCP_AUTOINJECT: Disable Hermes Studio MCP config injection.
|
||||
* - HERMES_WEB_UI_ALLOW_TRANSIENT_MCP_AUTOINJECT: Allow MCP injection when HERMES_WEB_UI_HOME is under a temp dir.
|
||||
* - HERMES_LAN_DISCOVERY_ENABLED: Set false/0/off to disable UDP LAN discovery responder.
|
||||
* - HERMES_LAN_DISCOVERY_HTTP_PORTS: HTTP ports to probe during UDP discovery scans. Default: 8648,8748 plus current PORT.
|
||||
* Discovery probes are sent to the fixed UDP port 48640 plus legacy mapped ports for compatibility.
|
||||
* - WORKSPACE_BASE: Base directory for workspace browsing. Default: current user's home directory.
|
||||
*
|
||||
* Limits/logging:
|
||||
* - MAX_DOWNLOAD_SIZE: Max file download size. Default: 200MB.
|
||||
* - MAX_EDIT_SIZE: Max editable file size. Default: 10MB.
|
||||
* - LOG_LEVEL: Server log level. Default: info.
|
||||
* - BRIDGE_LOG_LEVEL: Bridge log level. Default: LOG_LEVEL or info.
|
||||
*/
|
||||
|
||||
export function getListenHost(env: Record<string, string | undefined> = process.env): string {
|
||||
const host = env.BIND_HOST?.trim()
|
||||
return host || '0.0.0.0'
|
||||
}
|
||||
|
||||
export function getWebUiHome(env: Record<string, string | undefined> = process.env): string {
|
||||
const appHome = env.HERMES_WEB_UI_HOME?.trim() || env.HERMES_WEBUI_STATE_DIR?.trim()
|
||||
return appHome ? resolve(appHome) : join(homedir(), '.hermes-web-ui')
|
||||
}
|
||||
|
||||
export function shouldCreateWebUiDataDir(env: Record<string, string | undefined> = process.env): boolean {
|
||||
return env.NODE_ENV !== 'production'
|
||||
}
|
||||
|
||||
export function getCorsOrigins(env: Record<string, string | undefined> = process.env): string {
|
||||
return env.CORS_ORIGINS?.trim() || ''
|
||||
}
|
||||
|
||||
const appHome = getWebUiHome()
|
||||
const remoteRelay = {
|
||||
url: 'https://api.hermes-studio.ai',
|
||||
}
|
||||
|
||||
export const config = {
|
||||
port: parseInt(process.env.PORT || '8648', 10),
|
||||
// Default to IPv4 for stable WSL/Windows browser access. Use BIND_HOST=:: explicitly for IPv6.
|
||||
host: getListenHost(),
|
||||
appHome,
|
||||
uploadDir: process.env.UPLOAD_DIR || join(appHome, 'upload'),
|
||||
dataDir: resolve(__dirname, '..', 'data'),
|
||||
corsOrigins: getCorsOrigins(),
|
||||
remoteRelay,
|
||||
}
|
||||
Reference in New Issue
Block a user