diff --git a/CHANGELOG.md b/CHANGELOG.md index 83057641153..97fc17aa3f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -113,6 +113,7 @@ Docs: https://docs.openclaw.ai - Exec approvals: fall back to a guarded copy when Windows rejects rename-overwrite for `exec-approvals.json`, while preserving symlink, hard-link, and owner-only permission safeguards. Fixes #77785. (#77907) Thanks @Alex-Alaniz and @MilleniumGenAI. - Slack: preserve Socket Mode SDK error context and structured Slack API fields in reconnect logs, so startup failures no longer collapse to a bare `unknown error`. - iOS pairing: allow setup-code and manual `ws://` connects for private LAN and `.local` gateways while keeping Tailscale/public routes on `wss://`, and prefer explicit gateway passwords over stale bootstrap tokens in mixed-auth reconnects. Fixes #47887; carries forward #65185. Thanks @draix and @BunsDev. +- Node/Windows: fall back to the Startup-folder launcher when Spanish-localized `schtasks` reports `Acceso denegado`, matching the existing access-denied fallback path. Fixes #77993. Thanks @jackonedev. - Plugins/diagnostics: make source-only TypeScript package warnings actionable by explaining that missing compiled runtime output is a publisher packaging issue and pointing users to update/reinstall or disable/uninstall the plugin. Fixes #77835. Thanks @googlerest. - Control UI/chat: keep persisted assistant progress text visible when the same transcript turn also contains tool-use metadata, so chat.history reloads no longer make those replies vanish after the next user message. Fixes #77374. Thanks @BunsDev. - TUI: skip the generic CLI respawn wrapper for interactive launches, exit cleanly on terminal loss, and refuse to restore heartbeat sessions as the remembered chat session, preventing stale heartbeat history and orphaned `openclaw-tui` processes on first boot. Thanks @vincentkoc. diff --git a/src/daemon/schtasks.startup-fallback.test.ts b/src/daemon/schtasks.startup-fallback.test.ts index 18ea4f5d5e6..5949444ab58 100644 --- a/src/daemon/schtasks.startup-fallback.test.ts +++ b/src/daemon/schtasks.startup-fallback.test.ts @@ -216,6 +216,19 @@ describe("Windows startup fallback", () => { }); }); + it("falls back to a Startup-folder launcher when schtasks create returns Spanish access denied", async () => { + await withWindowsEnv("openclaw-win-startup-", async ({ env }) => { + addStartupFallbackMissingResponses([ + { code: 1, stdout: "", stderr: "Error: Acceso denegado." }, + ]); + + await installGatewayScheduledTask(env); + + await expect(fs.access(resolveStartupEntryPath(env))).resolves.toBeUndefined(); + expectStartupFallbackSpawn(); + }); + }); + it("falls back to a Startup-folder launcher when schtasks create hangs", async () => { await withWindowsEnv("openclaw-win-startup-", async ({ env }) => { addStartupFallbackMissingResponses([ diff --git a/src/daemon/schtasks.ts b/src/daemon/schtasks.ts index 4674cfbe71e..5ffc058d866 100644 --- a/src/daemon/schtasks.ts +++ b/src/daemon/schtasks.ts @@ -37,7 +37,7 @@ function resolveTaskName(env: GatewayServiceEnv): string { function shouldFallbackToStartupEntry(params: { code: number; detail: string }): boolean { return ( - /access is denied/i.test(params.detail) || + /(?:access is denied|acceso denegado)/i.test(params.detail) || params.code === 124 || /schtasks timed out/i.test(params.detail) || /schtasks produced no output/i.test(params.detail)