Skip to content

Commit b913bb3

Browse files
WBWB
authored andcommitted
fix(daemon): normalize Windows gateway task names
1 parent 126ebfc commit b913bb3

2 files changed

Lines changed: 31 additions & 3 deletions

File tree

src/daemon/inspect.test.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,9 +359,15 @@ describe("findExtraGatewayServices (win32)", () => {
359359
execSchtasksMock.mockResolvedValueOnce({
360360
code: 0,
361361
stdout: [
362-
"TaskName: OpenClaw Gateway",
362+
"TaskName: \\OpenClaw Gateway",
363363
"Task To Run: C:\\Program Files\\OpenClaw\\openclaw.exe gateway run",
364364
"",
365+
"TaskName: \\OpenClaw Gateway (work)",
366+
"Task To Run: C:\\work\\openclaw.exe gateway",
367+
"",
368+
"TaskName: \\OpenClaw Gateway Copy",
369+
"Task To Run: C:\\custom\\openclaw.exe gateway",
370+
"",
365371
"TaskName: Clawdbot Legacy",
366372
"Task To Run: C:\\clawdbot\\clawdbot.exe run",
367373
"",
@@ -374,6 +380,14 @@ describe("findExtraGatewayServices (win32)", () => {
374380

375381
const result = await findExtraGatewayServices({}, { deep: true });
376382
expect(result).toEqual([
383+
{
384+
platform: "win32",
385+
label: "\\OpenClaw Gateway Copy",
386+
detail: "task: \\OpenClaw Gateway Copy, run: C:\\custom\\openclaw.exe gateway",
387+
scope: "system",
388+
marker: "openclaw",
389+
legacy: false,
390+
},
377391
{
378392
platform: "win32",
379393
label: "Clawdbot Legacy",

src/daemon/inspect.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,13 +198,27 @@ function isOpenClawGatewaySystemdService(name: string, contents: string): boolea
198198
return normalizeLowercaseStringOrEmpty(contents).includes("gateway");
199199
}
200200

201+
function normalizeWindowsScheduledTaskName(name: string): string {
202+
// schtasks reports root-folder tasks as \Name; compare against the durable task name.
203+
return normalizeLowercaseStringOrEmpty(name.trim().replace(/^[\\/]+/u, ""));
204+
}
205+
206+
function isProfiledOpenClawGatewayTaskName(name: string, defaultName: string): boolean {
207+
const prefix = `${defaultName} (`;
208+
if (!name.startsWith(prefix) || !name.endsWith(")")) {
209+
return false;
210+
}
211+
const profile = name.slice(prefix.length, -1).trim();
212+
return profile.length > 0 && !/[\\/]/u.test(profile);
213+
}
214+
201215
function isOpenClawGatewayTaskName(name: string): boolean {
202-
const normalized = normalizeLowercaseStringOrEmpty(name);
216+
const normalized = normalizeWindowsScheduledTaskName(name);
203217
if (!normalized) {
204218
return false;
205219
}
206220
const defaultName = normalizeLowercaseStringOrEmpty(resolveGatewayWindowsTaskName());
207-
return normalized === defaultName || normalized.startsWith("openclaw gateway");
221+
return normalized === defaultName || isProfiledOpenClawGatewayTaskName(normalized, defaultName);
208222
}
209223

210224
function tryExtractPlistLabel(contents: string): string | null {

0 commit comments

Comments
 (0)