diff --git a/config/platform-infra/webterm.yaml b/config/platform-infra/webterm.yaml index 426ee14e..bd89db05 100644 --- a/config/platform-infra/webterm.yaml +++ b/config/platform-infra/webterm.yaml @@ -19,7 +19,7 @@ sessionStartModes: command: oncx autoResumePrompt: - enabled: true + enabled: false prompt: "[自动提醒]如果有未完成任务则继续,没有则直接结束" sendEnter: true enterDelayMs: 500 @@ -84,7 +84,7 @@ targets: TERMINAL_SNAPSHOT_BYTES: "524288" BROWSER_KEEPALIVE_INTERVAL_MS: "30000" BROWSER_STALE_TIMEOUT_MS: "180000" - BROWSER_SESSION_OUTPUT_IDLE_MS: "60000" + BROWSER_SESSION_OUTPUT_IDLE_MS: "3000" publicExposure: enabled: true publicBaseUrl: https://term.pikapython.com diff --git a/scripts/src/platform-infra-webterm.ts b/scripts/src/platform-infra-webterm.ts index f2374746..4bf92fc4 100644 --- a/scripts/src/platform-infra-webterm.ts +++ b/scripts/src/platform-infra-webterm.ts @@ -334,7 +334,10 @@ function resolveTarget(targetId: string | null): WebtermTarget { function renderCompose(target: WebtermTarget): string { const environment = { ...target.runtime.environment, - AUTO_START_SESSIONS_JSON: JSON.stringify(target.runtime.autoStartSessions), + AUTO_START_SESSIONS_JSON: JSON.stringify(target.runtime.autoStartSessions.map((session) => ({ + ...session, + command: resumeCommandWithPrompt(session, target.runtime.autoResumePrompt), + }))), SESSION_START_MODES_JSON: JSON.stringify(target.runtime.sessionStartModes.options), SESSION_START_DEFAULT_MODE: target.runtime.sessionStartModes.defaultMode, AUTO_RESUME_PROMPT_JSON: JSON.stringify(target.runtime.autoResumePrompt), @@ -365,6 +368,21 @@ ${envLines} `; } +function resumeCommandWithPrompt( + session: WebtermTarget["runtime"]["autoStartSessions"][number], + prompt: AutoResumePrompt, +): string { + if (!session.resumePrompt) return session.command; + if (!/^\s*(?:mycx|oncx)\s+resume\s+\S+\s*$/.test(session.command)) { + throw new Error(`resumePrompt requires a mycx/oncx resume command: ${session.title}`); + } + return `${session.command.trim()} ${quoteShellArg(prompt.prompt)}`; +} + +function quoteShellArg(value: string): string { + return `'${value.replace(/'/g, `'"'"'`)}'`; +} + function policyChecks(target: WebtermTarget, compose: string): Array & { ok: boolean }> { return [ { name: "enabled", ok: target.enabled, detail: "target must be enabled" },