feat(hermes): add terminal cloud runtime controls

This commit is contained in:
晴天
2026-05-27 04:17:17 +08:00
parent c196cef026
commit 0b4a70e7a4
6 changed files with 168 additions and 1 deletions

View File

@@ -3324,6 +3324,8 @@ const HERMES_SESSION_RESET_MODES = new Set(['both', 'idle', 'daily', 'none'])
const HERMES_STREAMING_TRANSPORTS = new Set(['auto', 'draft', 'edit', 'off'])
const HERMES_CODE_EXECUTION_MODES = new Set(['project', 'strict'])
const HERMES_TERMINAL_BACKENDS = new Set(['local', 'ssh', 'docker', 'singularity', 'modal', 'daytona', 'vercel_sandbox'])
const HERMES_TERMINAL_MODAL_MODES = new Set(['auto', 'managed', 'direct'])
const HERMES_TERMINAL_VERCEL_RUNTIMES = new Set(['node24', 'node22', 'python3.13'])
const HERMES_BROWSER_ENGINES = new Set(['auto', 'lightpanda', 'chrome'])
const HERMES_BROWSER_DIALOG_POLICIES = new Set(['must_respond', 'auto_dismiss', 'auto_accept'])
const HERMES_STT_PROVIDERS = new Set(['auto', 'local', 'groq', 'openai', 'mistral'])
@@ -3458,6 +3460,20 @@ function normalizeHermesTerminalBackend(value, strict = false) {
return 'local'
}
function normalizeHermesTerminalModalMode(value, strict = false) {
const mode = String(value ?? '').trim().toLowerCase() || 'auto'
if (HERMES_TERMINAL_MODAL_MODES.has(mode)) return mode
if (strict) throw new Error('terminal.modal_mode 必须是 auto、managed 或 direct')
return 'auto'
}
function normalizeHermesTerminalVercelRuntime(value, strict = false) {
const runtime = String(value ?? '').trim().toLowerCase() || 'node24'
if (HERMES_TERMINAL_VERCEL_RUNTIMES.has(runtime)) return runtime
if (strict) throw new Error('terminal.vercel_runtime 必须是 node24、node22 或 python3.13')
return 'node24'
}
function normalizeHermesBrowserEngine(value, strict = false) {
const engine = String(value ?? '').trim().toLowerCase() || 'auto'
if (HERMES_BROWSER_ENGINES.has(engine)) return engine
@@ -5636,6 +5652,8 @@ export function buildHermesTerminalConfigValues(config = {}) {
terminalDockerImage: typeof terminal.docker_image === 'string' ? terminal.docker_image.trim() : '',
terminalSingularityImage: typeof terminal.singularity_image === 'string' ? terminal.singularity_image.trim() : '',
terminalModalImage: typeof terminal.modal_image === 'string' ? terminal.modal_image.trim() : '',
terminalModalMode: normalizeHermesTerminalModalMode(terminal.modal_mode, false),
terminalVercelRuntime: normalizeHermesTerminalVercelRuntime(terminal.vercel_runtime, false),
terminalDaytonaImage: typeof terminal.daytona_image === 'string' ? terminal.daytona_image.trim() : '',
terminalDockerForwardEnv: normalizeHermesEnvNameList(terminal.docker_forward_env || [], 'terminal.docker_forward_env').join('\n'),
terminalSshHost: typeof terminal.ssh_host === 'string' ? terminal.ssh_host.trim() : '',
@@ -5669,6 +5687,8 @@ export function mergeHermesTerminalConfig(config = {}, form = {}) {
else delete terminal.env_passthrough
terminal.docker_mount_cwd_to_workspace = formHermesBool(form, 'terminalDockerMountCwdToWorkspace', currentValues.terminalDockerMountCwdToWorkspace)
terminal.docker_run_as_host_user = formHermesBool(form, 'terminalDockerRunAsHostUser', currentValues.terminalDockerRunAsHostUser)
terminal.modal_mode = normalizeHermesTerminalModalMode(Object.hasOwn(form, 'terminalModalMode') ? form.terminalModalMode : currentValues.terminalModalMode, true)
terminal.vercel_runtime = normalizeHermesTerminalVercelRuntime(Object.hasOwn(form, 'terminalVercelRuntime') ? form.terminalVercelRuntime : currentValues.terminalVercelRuntime, true)
for (const [formKey, yamlKey] of [
['terminalDockerImage', 'docker_image'],
['terminalSingularityImage', 'singularity_image'],