clawconnect-agent 0.1.20 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +22 -2
- package/README.md +8 -0
- package/README.zh-CN.md +29 -0
- package/dist/commands/install.js +3 -19
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/set-token.js +2 -1
- package/dist/commands/set-token.js.map +1 -1
- package/dist/commands/status.js +34 -6
- package/dist/commands/status.js.map +1 -1
- package/dist/config/config.d.ts +1 -1
- package/dist/config/config.js +38 -10
- package/dist/config/config.js.map +1 -1
- package/dist/config/env.d.ts +2 -1
- package/dist/config/env.js +32 -2
- package/dist/config/env.js.map +1 -1
- package/dist/core/relay/voice-input.js +13 -7
- package/dist/core/relay/voice-input.js.map +1 -1
- package/dist/hermes/relay/hermes-state-db-realtime.js +4 -21
- package/dist/hermes/relay/hermes-state-db-realtime.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-api-client.js +5 -30
- package/dist/hermes/runtime/hermes-runtime-api-client.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-api-settings.d.ts +19 -0
- package/dist/hermes/runtime/hermes-runtime-api-settings.js +69 -0
- package/dist/hermes/runtime/hermes-runtime-api-settings.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-backups.js +6 -4
- package/dist/hermes/runtime/hermes-runtime-backups.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-chat.js +3 -2
- package/dist/hermes/runtime/hermes-runtime-chat.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-lifecycle.js +3 -2
- package/dist/hermes/runtime/hermes-runtime-lifecycle.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-paths.d.ts +9 -0
- package/dist/hermes/runtime/hermes-runtime-paths.js +67 -0
- package/dist/hermes/runtime/hermes-runtime-paths.js.map +1 -0
- package/dist/hermes/runtime/hermes-runtime-process.d.ts +2 -0
- package/dist/hermes/runtime/hermes-runtime-process.js +70 -30
- package/dist/hermes/runtime/hermes-runtime-process.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-skills.js +10 -5
- package/dist/hermes/runtime/hermes-runtime-skills.js.map +1 -1
- package/dist/hermes/runtime/hermes-runtime-state-db.js +3 -18
- package/dist/hermes/runtime/hermes-runtime-state-db.js.map +1 -1
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/openclaw/backups/backup-manager.js +10 -8
- package/dist/openclaw/backups/backup-manager.js.map +1 -1
- package/dist/openclaw/config/provider-config.js +19 -19
- package/dist/openclaw/config/provider-config.js.map +1 -1
- package/dist/openclaw/handlers/local-handlers.d.ts +1 -0
- package/dist/openclaw/handlers/local-handlers.js +29 -45
- package/dist/openclaw/handlers/local-handlers.js.map +1 -1
- package/dist/openclaw/relay/chat-send-attachments.js +2 -3
- package/dist/openclaw/relay/chat-send-attachments.js.map +1 -1
- package/dist/openclaw/relay/outgoing-media-relay.d.ts +1 -0
- package/dist/openclaw/relay/outgoing-media-relay.js +18 -7
- package/dist/openclaw/relay/outgoing-media-relay.js.map +1 -1
- package/dist/openclaw/relay/session-context.js +2 -3
- package/dist/openclaw/relay/session-context.js.map +1 -1
- package/dist/openclaw/runtime/local-runtime.d.ts +1 -0
- package/dist/openclaw/runtime/local-runtime.js +81 -50
- package/dist/openclaw/runtime/local-runtime.js.map +1 -1
- package/dist/openclaw/runtime/openclaw-paths.d.ts +15 -0
- package/dist/openclaw/runtime/openclaw-paths.js +52 -0
- package/dist/openclaw/runtime/openclaw-paths.js.map +1 -0
- package/dist/openclaw/session-store.js +3 -3
- package/dist/openclaw/session-store.js.map +1 -1
- package/dist/platform/process-invocation.d.ts +14 -0
- package/dist/platform/process-invocation.js +72 -0
- package/dist/platform/process-invocation.js.map +1 -0
- package/dist/platform/service-manager-windows.d.ts +18 -5
- package/dist/platform/service-manager-windows.js +124 -92
- package/dist/platform/service-manager-windows.js.map +1 -1
- package/dist/platform/service-manager.js +5 -5
- package/dist/platform/service-manager.js.map +1 -1
- package/dist/platform/text-file-decoder.d.ts +5 -0
- package/dist/platform/text-file-decoder.js +40 -0
- package/dist/platform/text-file-decoder.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* OpenClaw 官方允许安装方式和运行用户独立于状态目录。
|
|
5
|
+
* 所有 ClawConnect 功能必须经过同一解析器,避免连接端口正确但日志、会话或备份仍误读 ~/.openclaw。
|
|
6
|
+
*/
|
|
7
|
+
export function resolveOpenClawStateDir(options = {}) {
|
|
8
|
+
const env = options.env ?? process.env;
|
|
9
|
+
const systemHome = options.systemHome ?? homedir();
|
|
10
|
+
const explicitStateDir = firstNonEmpty(env.OPENCLAW_STATE_DIR, env.CLAWCONNECT_OPENCLAW_HOME);
|
|
11
|
+
if (explicitStateDir) {
|
|
12
|
+
return resolveConfiguredPath(explicitStateDir, systemHome);
|
|
13
|
+
}
|
|
14
|
+
const openClawHome = firstNonEmpty(env.OPENCLAW_HOME);
|
|
15
|
+
return openClawHome
|
|
16
|
+
? join(resolveConfiguredPath(openClawHome, systemHome), ".openclaw")
|
|
17
|
+
: join(systemHome, ".openclaw");
|
|
18
|
+
}
|
|
19
|
+
export function resolveOpenClawConfigPath(options = {}) {
|
|
20
|
+
const env = options.env ?? process.env;
|
|
21
|
+
const systemHome = options.systemHome ?? homedir();
|
|
22
|
+
const explicitConfigPath = firstNonEmpty(env.OPENCLAW_CONFIG_PATH);
|
|
23
|
+
return explicitConfigPath
|
|
24
|
+
? resolveConfiguredPath(explicitConfigPath, systemHome)
|
|
25
|
+
: join(resolveOpenClawStateDir({ env, systemHome }), "openclaw.json");
|
|
26
|
+
}
|
|
27
|
+
export function resolveOpenClawConfigDir(options = {}) {
|
|
28
|
+
return dirname(resolveOpenClawConfigPath(options));
|
|
29
|
+
}
|
|
30
|
+
export function resolveOpenClawAgentsDir(options = {}) {
|
|
31
|
+
return join(resolveOpenClawStateDir(options), "agents");
|
|
32
|
+
}
|
|
33
|
+
export function resolveConfiguredPath(value, systemHome = homedir()) {
|
|
34
|
+
const trimmed = value.trim();
|
|
35
|
+
if (trimmed === "~") {
|
|
36
|
+
return systemHome;
|
|
37
|
+
}
|
|
38
|
+
if (trimmed.startsWith("~/") || trimmed.startsWith("~\\")) {
|
|
39
|
+
return resolve(systemHome, trimmed.slice(2));
|
|
40
|
+
}
|
|
41
|
+
return resolve(trimmed);
|
|
42
|
+
}
|
|
43
|
+
function firstNonEmpty(...values) {
|
|
44
|
+
for (const value of values) {
|
|
45
|
+
const trimmed = value?.trim();
|
|
46
|
+
if (trimmed) {
|
|
47
|
+
return trimmed;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=openclaw-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw-paths.js","sourceRoot":"","sources":["../../../src/openclaw/runtime/openclaw-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcnD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAA+B,EAAE;IACvE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,EAAE,CAAC;IACnD,MAAM,gBAAgB,GAAG,aAAa,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAC9F,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,qBAAqB,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACtD,OAAO,YAAY;QACjB,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC;QACpE,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAA+B,EAAE;IACzE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,EAAE,CAAC;IACnD,MAAM,kBAAkB,GAAG,aAAa,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACnE,OAAO,kBAAkB;QACvB,CAAC,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,UAAU,CAAC;QACvD,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,UAA+B,EAAE;IACxE,OAAO,OAAO,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,UAA+B,EAAE;IACxE,OAAO,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,UAAU,GAAG,OAAO,EAAE;IACzE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QACpB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,OAAO,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,aAAa,CAAC,GAAG,MAAiC;IACzD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;QAC9B,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readdir, readFile } from "fs/promises";
|
|
2
|
-
import { homedir } from "os";
|
|
3
2
|
import { basename, isAbsolute, join, resolve } from "path";
|
|
4
|
-
|
|
3
|
+
import { resolveOpenClawStateDir } from "./runtime/openclaw-paths.js";
|
|
4
|
+
export async function inferLatestOpenClawSessionKey(sessionStoreRoot = resolveOpenClawStateDir()) {
|
|
5
5
|
const agentsDir = join(sessionStoreRoot, "agents");
|
|
6
6
|
let agentEntries;
|
|
7
7
|
try {
|
|
@@ -107,7 +107,7 @@ function userTurnRunId(message, parsed) {
|
|
|
107
107
|
function assistantToolRunId(message, parsed) {
|
|
108
108
|
return normalizeRunId(firstString(message.sourceRunId, message.source_run_id, message.runId, message.run_id, message.turnId, message.turn_id, message.messageId, message.message_id, message.id, parsed.id));
|
|
109
109
|
}
|
|
110
|
-
async function resolveOpenClawSessionLogPath(sessionKey, sessionStoreRoot =
|
|
110
|
+
async function resolveOpenClawSessionLogPath(sessionKey, sessionStoreRoot = resolveOpenClawStateDir()) {
|
|
111
111
|
const trimmedSessionKey = sessionKey.trim();
|
|
112
112
|
if (!trimmedSessionKey) {
|
|
113
113
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/openclaw/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../../src/openclaw/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ProcessInvocation {
|
|
2
|
+
command: string;
|
|
3
|
+
args: string[];
|
|
4
|
+
}
|
|
5
|
+
/** Windows 不能由 CreateProcess 直接执行 .cmd/.bat;统一经 cmd.exe,JS 入口统一经当前 Node。 */
|
|
6
|
+
export declare function buildExecutableInvocation(executable: string, args: string[], options?: {
|
|
7
|
+
platform?: NodeJS.Platform;
|
|
8
|
+
nodePath?: string;
|
|
9
|
+
commandShell?: string;
|
|
10
|
+
powershellPath?: string;
|
|
11
|
+
}): ProcessInvocation;
|
|
12
|
+
export declare function buildWindowsCommandLine(args: string[]): string;
|
|
13
|
+
export declare function buildShellCommandInvocation(command: string, platform?: NodeJS.Platform): ProcessInvocation;
|
|
14
|
+
export declare function quoteShellArgument(value: string, platform?: NodeJS.Platform): string;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { extname } from "node:path";
|
|
2
|
+
/** Windows 不能由 CreateProcess 直接执行 .cmd/.bat;统一经 cmd.exe,JS 入口统一经当前 Node。 */
|
|
3
|
+
export function buildExecutableInvocation(executable, args, options = {}) {
|
|
4
|
+
const platform = options.platform ?? process.platform;
|
|
5
|
+
if (platform !== "win32") {
|
|
6
|
+
return { command: executable, args };
|
|
7
|
+
}
|
|
8
|
+
const extension = extname(executable).toLowerCase();
|
|
9
|
+
if ([".js", ".mjs", ".cjs"].includes(extension)) {
|
|
10
|
+
return { command: options.nodePath ?? process.execPath, args: [executable, ...args] };
|
|
11
|
+
}
|
|
12
|
+
if (extension === ".cmd" || extension === ".bat") {
|
|
13
|
+
return {
|
|
14
|
+
command: options.commandShell ?? process.env.ComSpec ?? "cmd.exe",
|
|
15
|
+
args: ["/d", "/s", "/c", buildWindowsCommandLine([executable, ...args])],
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
if (extension === ".ps1") {
|
|
19
|
+
return {
|
|
20
|
+
command: options.powershellPath ?? "powershell.exe",
|
|
21
|
+
args: ["-NoProfile", "-NonInteractive", "-File", executable, ...args],
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return { command: executable, args };
|
|
25
|
+
}
|
|
26
|
+
export function buildWindowsCommandLine(args) {
|
|
27
|
+
return args.map(quoteWindowsArgument).join(" ");
|
|
28
|
+
}
|
|
29
|
+
export function buildShellCommandInvocation(command, platform = process.platform) {
|
|
30
|
+
if (platform !== "win32") {
|
|
31
|
+
return { command: "sh", args: ["-lc", command] };
|
|
32
|
+
}
|
|
33
|
+
const utf8Bootstrap = [
|
|
34
|
+
"$utf8NoBom = [System.Text.UTF8Encoding]::new($false)",
|
|
35
|
+
"[Console]::InputEncoding = $utf8NoBom",
|
|
36
|
+
"[Console]::OutputEncoding = $utf8NoBom",
|
|
37
|
+
"$OutputEncoding = $utf8NoBom",
|
|
38
|
+
command,
|
|
39
|
+
].join("; ");
|
|
40
|
+
return {
|
|
41
|
+
command: "powershell.exe",
|
|
42
|
+
args: ["-NoProfile", "-NonInteractive", "-Command", utf8Bootstrap],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function quoteShellArgument(value, platform = process.platform) {
|
|
46
|
+
if (platform === "win32") {
|
|
47
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
48
|
+
}
|
|
49
|
+
return `'${value.replaceAll("'", "'\\''")}'`;
|
|
50
|
+
}
|
|
51
|
+
function quoteWindowsArgument(arg) {
|
|
52
|
+
if (!/[\s"]/.test(arg)) {
|
|
53
|
+
return arg;
|
|
54
|
+
}
|
|
55
|
+
let result = '"';
|
|
56
|
+
let backslashes = 0;
|
|
57
|
+
for (const char of arg) {
|
|
58
|
+
if (char === "\\") {
|
|
59
|
+
backslashes += 1;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (char === '"') {
|
|
63
|
+
result += "\\".repeat(backslashes * 2 + 1) + '"';
|
|
64
|
+
backslashes = 0;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
result += "\\".repeat(backslashes) + char;
|
|
68
|
+
backslashes = 0;
|
|
69
|
+
}
|
|
70
|
+
return result + "\\".repeat(backslashes * 2) + '"';
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=process-invocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-invocation.js","sourceRoot":"","sources":["../../src/platform/process-invocation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
import type { ServiceStatus } from "./service-manager-common.js";
|
|
2
2
|
export declare const TASK_NAME = "ClawConnectAgent";
|
|
3
|
+
export declare const WINDOWS_SERVICE_RUNNER_NAME = "clawconnect-service.ps1";
|
|
4
|
+
export declare function windowsTaskName(profile?: string): string;
|
|
3
5
|
export declare function buildWindowsPowerShellBootstrap(command: string): string;
|
|
4
|
-
export declare function
|
|
5
|
-
export declare function
|
|
6
|
-
export declare function
|
|
7
|
-
export declare function
|
|
8
|
-
export declare function
|
|
6
|
+
export declare function normalizeWindowsServiceLogEncoding(path: string): void;
|
|
7
|
+
export declare function buildWindowsServiceProcessCommand(args: string[], logPath: string, errorLogPath: string): string;
|
|
8
|
+
export declare function windowsServiceRunnerPath(profile?: string): string;
|
|
9
|
+
export declare function buildWindowsServiceTaskCommand(runnerPath: string): string;
|
|
10
|
+
export declare function writeWindowsServiceRunner(profile: string | undefined, args: string[], logPath: string, errorLogPath: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Kill any running node processes that are executing this specific script.
|
|
13
|
+
* Uses execFileSync to bypass cmd.exe, avoiding CMD quote-mangling.
|
|
14
|
+
* Returns true if any processes were killed.
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildWindowsProcessQueryScript(profile?: string): string;
|
|
17
|
+
export declare function installWindowsService(profile?: string): boolean;
|
|
18
|
+
export declare function uninstallWindowsService(profile?: string): boolean;
|
|
19
|
+
export declare function restartWindowsService(profile?: string): boolean;
|
|
20
|
+
export declare function stopWindowsService(profile?: string): boolean;
|
|
21
|
+
export declare function getWindowsServiceStatus(profile?: string): ServiceStatus;
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { execFileSync } from "child_process";
|
|
2
|
-
import {
|
|
2
|
+
import { existsSync, readFileSync, unlinkSync, writeFileSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { ensureLogDir, getProfileErrorLogPath, getProfileLogDir, getProfileLogPath, getProgramArgs, resolveServiceEntryPath, setRestrictiveFilePermissions, } from "./service-manager-common.js";
|
|
5
|
+
import { getActiveProfile, normalizeProfileName } from "../config/profile.js";
|
|
6
|
+
import { decodeTextBuffer } from "./text-file-decoder.js";
|
|
3
7
|
export const TASK_NAME = "ClawConnectAgent";
|
|
8
|
+
export const WINDOWS_SERVICE_RUNNER_NAME = "clawconnect-service.ps1";
|
|
9
|
+
export function windowsTaskName(profile) {
|
|
10
|
+
const normalized = normalizeProfileName(profile);
|
|
11
|
+
return normalized ? `${TASK_NAME}-${normalized}` : TASK_NAME;
|
|
12
|
+
}
|
|
4
13
|
function qps(value) {
|
|
5
14
|
return `'${value.replace(/'/g, "''")}'`;
|
|
6
15
|
}
|
|
@@ -16,64 +25,68 @@ export function buildWindowsPowerShellBootstrap(command) {
|
|
|
16
25
|
command,
|
|
17
26
|
].join("; ");
|
|
18
27
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
function
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
// Normal character: backslashes are literal
|
|
54
|
-
result += "\\".repeat(backslashCount);
|
|
55
|
-
result += arg[i];
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return `"${result}"`;
|
|
59
|
-
}
|
|
60
|
-
return arg;
|
|
61
|
-
})
|
|
62
|
-
.join(" ");
|
|
28
|
+
export function normalizeWindowsServiceLogEncoding(path) {
|
|
29
|
+
if (!existsSync(path)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const decoded = decodeTextBuffer(readFileSync(path));
|
|
33
|
+
if (decoded.encoding !== "utf8") {
|
|
34
|
+
writeFileSync(path, decoded.text, "utf8");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function buildWindowsServiceProcessCommand(args, logPath, errorLogPath) {
|
|
38
|
+
const [execPath, ...execArgs] = args;
|
|
39
|
+
if (!execPath) {
|
|
40
|
+
throw new Error("Windows service executable is required");
|
|
41
|
+
}
|
|
42
|
+
return buildWindowsPowerShellBootstrap(`& ${qps(execPath)} ${execArgs.map((arg) => qps(arg)).join(" ")} >> ${qps(logPath)} 2>> ${qps(errorLogPath)}`);
|
|
43
|
+
}
|
|
44
|
+
export function windowsServiceRunnerPath(profile) {
|
|
45
|
+
return join(getProfileLogDir(profile), WINDOWS_SERVICE_RUNNER_NAME);
|
|
46
|
+
}
|
|
47
|
+
export function buildWindowsServiceTaskCommand(runnerPath) {
|
|
48
|
+
return `powershell.exe -NoProfile -WindowStyle Hidden -ExecutionPolicy Bypass -File "${runnerPath}"`;
|
|
49
|
+
}
|
|
50
|
+
export function writeWindowsServiceRunner(profile, args, logPath, errorLogPath) {
|
|
51
|
+
const runnerPath = windowsServiceRunnerPath(profile);
|
|
52
|
+
const script = `${buildWindowsServiceProcessCommand(args, logPath, errorLogPath)}\r\n`;
|
|
53
|
+
// Windows PowerShell 5.1 treats UTF-8 files without a BOM as the active ANSI
|
|
54
|
+
// code page. Keep the BOM so user names and install paths remain intact.
|
|
55
|
+
const utf8WithBom = Buffer.concat([
|
|
56
|
+
Buffer.from([0xef, 0xbb, 0xbf]),
|
|
57
|
+
Buffer.from(script, "utf8"),
|
|
58
|
+
]);
|
|
59
|
+
writeFileSync(runnerPath, utf8WithBom);
|
|
60
|
+
setRestrictiveFilePermissions(runnerPath);
|
|
61
|
+
return runnerPath;
|
|
63
62
|
}
|
|
64
63
|
/**
|
|
65
64
|
* Kill any running node processes that are executing this specific script.
|
|
66
65
|
* Uses execFileSync to bypass cmd.exe, avoiding CMD quote-mangling.
|
|
67
66
|
* Returns true if any processes were killed.
|
|
68
67
|
*/
|
|
69
|
-
function
|
|
68
|
+
export function buildWindowsProcessQueryScript(profile) {
|
|
69
|
+
const profileFilter = normalizeProfileName(profile)
|
|
70
|
+
? `($_.CommandLine -match ('(?:^|\\s)--profile(?:\\s+|=)' + [regex]::Escape($env:CLAW_PROFILE_NAME) + '(?:\\s|$)'))`
|
|
71
|
+
: `($_.CommandLine -notmatch '(?:^|\\s)--profile(?:\\s|=)')`;
|
|
72
|
+
return `Get-CimInstance Win32_Process -Filter "Name = 'node.exe'" | Where-Object { $_.CommandLine -match [regex]::Escape($env:CLAW_SCRIPT_PATH) -and ${profileFilter} } | Select-Object -ExpandProperty ProcessId`;
|
|
73
|
+
}
|
|
74
|
+
function windowsProcessQueryEnv(profile) {
|
|
75
|
+
const scriptPath = process.argv[1];
|
|
76
|
+
return {
|
|
77
|
+
...process.env,
|
|
78
|
+
CLAW_SCRIPT_PATH: scriptPath ? resolveServiceEntryPath(scriptPath) : "",
|
|
79
|
+
CLAW_PROFILE_NAME: normalizeProfileName(profile) ?? "",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function killWindowsProcess(profile) {
|
|
70
83
|
const scriptPath = process.argv[1];
|
|
71
84
|
if (!scriptPath)
|
|
72
85
|
return false;
|
|
73
86
|
const currentPid = process.pid;
|
|
74
87
|
try {
|
|
75
|
-
const psScript =
|
|
76
|
-
const output = execFileSync("powershell", ["-NoProfile", "-Command", psScript], { stdio: "pipe", env:
|
|
88
|
+
const psScript = buildWindowsProcessQueryScript(profile);
|
|
89
|
+
const output = execFileSync("powershell", ["-NoProfile", "-Command", psScript], { stdio: "pipe", env: windowsProcessQueryEnv(profile) })
|
|
77
90
|
.toString()
|
|
78
91
|
.trim();
|
|
79
92
|
const pids = output
|
|
@@ -115,53 +128,55 @@ function killWindowsProcess() {
|
|
|
115
128
|
return false;
|
|
116
129
|
}
|
|
117
130
|
}
|
|
118
|
-
export function installWindowsService() {
|
|
119
|
-
const
|
|
131
|
+
export function installWindowsService(profile) {
|
|
132
|
+
const resolvedProfile = normalizeProfileName(profile ?? getActiveProfile());
|
|
133
|
+
const taskName = windowsTaskName(resolvedProfile);
|
|
134
|
+
const logPath = getProfileLogPath(resolvedProfile);
|
|
135
|
+
const errorLogPath = getProfileErrorLogPath(resolvedProfile);
|
|
136
|
+
const args = getProgramArgs(resolvedProfile);
|
|
120
137
|
try {
|
|
121
|
-
ensureLogDir();
|
|
138
|
+
ensureLogDir(resolvedProfile);
|
|
139
|
+
try {
|
|
140
|
+
execFileSync("schtasks", ["/end", "/tn", taskName], { stdio: "pipe" });
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// First install or already stopped.
|
|
144
|
+
}
|
|
145
|
+
killWindowsProcess(resolvedProfile);
|
|
146
|
+
// 旧版 PowerShell 可能创建 UTF-16LE 日志;转换后再以 UTF-8 追加,避免一个文件混合两种编码。
|
|
147
|
+
normalizeWindowsServiceLogEncoding(logPath);
|
|
148
|
+
normalizeWindowsServiceLogEncoding(errorLogPath);
|
|
149
|
+
// Keep the scheduled task command short. schtasks limits /tr to 261
|
|
150
|
+
// characters, while NVM/npm paths plus UTF-8 bootstrap and log redirects
|
|
151
|
+
// can easily exceed it when embedded inline.
|
|
152
|
+
const runnerPath = writeWindowsServiceRunner(resolvedProfile, args, logPath, errorLogPath);
|
|
153
|
+
const taskCommand = buildWindowsServiceTaskCommand(runnerPath);
|
|
154
|
+
const taskArguments = taskCommand.slice("powershell.exe ".length);
|
|
122
155
|
// ── Attempt 1: PowerShell ScheduledTasks module ──────────────────────
|
|
123
156
|
// Supports RestartOnFailure (crash recovery) and full settings control.
|
|
124
157
|
// Available on Windows 10 / Server 2016+.
|
|
125
158
|
try {
|
|
126
|
-
const execPath = args[0];
|
|
127
|
-
const execArgs = args.slice(1);
|
|
128
159
|
// We use 'powershell -WindowStyle Hidden' to launch node without a visible console window.
|
|
129
160
|
// This is the most reliable native way to run a background console app on login.
|
|
130
161
|
// Stdout/stderr are redirected to log files, matching the behavior of the
|
|
131
162
|
// Linux (systemd/nohup) and macOS (launchd) service managers.
|
|
132
|
-
const innerCmd = buildWindowsPowerShellBootstrap(`& ${qps(execPath)} ${execArgs.map((a) => qps(a)).join(" ")} >> ${qps(LOG_PATH)} 2>> ${qps(ERROR_LOG_PATH)}`);
|
|
133
|
-
// The -Argument value uses a PowerShell double-quote string ("" → literal ")
|
|
134
|
-
// so that single quotes from qps() inside it are preserved literally.
|
|
135
|
-
// Escape any `$` or `` ` `` in the paths to prevent PowerShell variable expansion.
|
|
136
|
-
const escapedInner = innerCmd.replace(/`/g, "``").replace(/\$/g, "`$");
|
|
137
|
-
const quotedArg = `"-WindowStyle Hidden -Command ""${escapedInner}"""`;
|
|
138
163
|
const psScript = [
|
|
139
|
-
`$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument ${
|
|
164
|
+
`$action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument ${qps(taskArguments)}`,
|
|
140
165
|
`$trigger = New-ScheduledTaskTrigger -AtLogon`,
|
|
141
166
|
`$principal = New-ScheduledTaskPrincipal -UserId $env:USERNAME -LogonType Interactive -RunLevel Highest`,
|
|
142
167
|
`$settings = New-ScheduledTaskSettingsSet -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1) -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries`,
|
|
143
|
-
`Register-ScheduledTask -TaskName ${qps(
|
|
168
|
+
`Register-ScheduledTask -TaskName ${qps(taskName)} -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Force | Out-Null`,
|
|
144
169
|
].join("\n");
|
|
145
170
|
execFileSync("powershell", ["-NoProfile", "-Command", psScript], { stdio: "pipe" });
|
|
146
|
-
execFileSync("schtasks", ["/run", "/tn",
|
|
171
|
+
execFileSync("schtasks", ["/run", "/tn", taskName], { stdio: "pipe" });
|
|
147
172
|
return true;
|
|
148
173
|
}
|
|
149
174
|
catch (err) {
|
|
150
175
|
// Fall through to basic schtasks below
|
|
151
176
|
}
|
|
152
177
|
// ── Attempt 2: Basic schtasks (no crash recovery) ────────────────────
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
// schtasks stores /tr as-is; CreateProcess parses it with CommandLineToArgvW.
|
|
156
|
-
// The inner command is passed as a single argument to -Command via double quotes
|
|
157
|
-
// escaped as \" per CommandLineToArgvW convention.
|
|
158
|
-
// Stdout/stderr are redirected to log files via PowerShell >> / 2>> operators.
|
|
159
|
-
const escLogPath = LOG_PATH.replace(/'/g, "''");
|
|
160
|
-
const escErrPath = ERROR_LOG_PATH.replace(/'/g, "''");
|
|
161
|
-
const fallbackInner = buildWindowsPowerShellBootstrap(`${cmdLine} >> '${escLogPath}' 2>> '${escErrPath}'`);
|
|
162
|
-
const fallbackTr = `powershell.exe -WindowStyle Hidden -Command "${fallbackInner.replace(/"/g, '\\"')}"`;
|
|
163
|
-
execFileSync("schtasks", ["/create", "/tn", TASK_NAME, "/tr", fallbackTr, "/sc", "onlogon", "/f"], { stdio: "pipe" });
|
|
164
|
-
execFileSync("schtasks", ["/run", "/tn", TASK_NAME], { stdio: "pipe" });
|
|
178
|
+
execFileSync("schtasks", ["/create", "/tn", taskName, "/tr", taskCommand, "/sc", "onlogon", "/f"], { stdio: "pipe" });
|
|
179
|
+
execFileSync("schtasks", ["/run", "/tn", taskName], { stdio: "pipe" });
|
|
165
180
|
return true;
|
|
166
181
|
}
|
|
167
182
|
catch (err) {
|
|
@@ -169,19 +184,29 @@ export function installWindowsService() {
|
|
|
169
184
|
return false;
|
|
170
185
|
}
|
|
171
186
|
}
|
|
172
|
-
export function uninstallWindowsService() {
|
|
187
|
+
export function uninstallWindowsService(profile) {
|
|
188
|
+
const resolvedProfile = normalizeProfileName(profile ?? getActiveProfile());
|
|
189
|
+
const taskName = windowsTaskName(resolvedProfile);
|
|
190
|
+
const runnerPath = windowsServiceRunnerPath(resolvedProfile);
|
|
173
191
|
try {
|
|
174
192
|
let changed = false;
|
|
175
193
|
try {
|
|
176
|
-
execFileSync("schtasks", ["/delete", "/tn",
|
|
194
|
+
execFileSync("schtasks", ["/delete", "/tn", taskName, "/f"], { stdio: "pipe" });
|
|
177
195
|
changed = true;
|
|
178
196
|
}
|
|
179
197
|
catch {
|
|
180
198
|
// task might not exist
|
|
181
199
|
}
|
|
182
|
-
if (killWindowsProcess()) {
|
|
200
|
+
if (killWindowsProcess(resolvedProfile)) {
|
|
201
|
+
changed = true;
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
unlinkSync(runnerPath);
|
|
183
205
|
changed = true;
|
|
184
206
|
}
|
|
207
|
+
catch {
|
|
208
|
+
// runner might not exist
|
|
209
|
+
}
|
|
185
210
|
return changed;
|
|
186
211
|
}
|
|
187
212
|
catch (err) {
|
|
@@ -189,37 +214,44 @@ export function uninstallWindowsService() {
|
|
|
189
214
|
return false;
|
|
190
215
|
}
|
|
191
216
|
}
|
|
192
|
-
export function restartWindowsService() {
|
|
217
|
+
export function restartWindowsService(profile) {
|
|
218
|
+
const resolvedProfile = normalizeProfileName(profile ?? getActiveProfile());
|
|
219
|
+
const taskName = windowsTaskName(resolvedProfile);
|
|
193
220
|
// Try to stop the task first
|
|
194
221
|
try {
|
|
195
|
-
execFileSync("schtasks", ["/end", "/tn",
|
|
222
|
+
execFileSync("schtasks", ["/end", "/tn", taskName], { stdio: "pipe" });
|
|
196
223
|
}
|
|
197
224
|
catch {
|
|
198
225
|
// ignore if not running
|
|
199
226
|
}
|
|
200
|
-
killWindowsProcess();
|
|
227
|
+
killWindowsProcess(resolvedProfile);
|
|
201
228
|
try {
|
|
202
|
-
execFileSync("schtasks", ["/run", "/tn",
|
|
229
|
+
execFileSync("schtasks", ["/run", "/tn", taskName], { stdio: "pipe" });
|
|
203
230
|
return true;
|
|
204
231
|
}
|
|
205
232
|
catch {
|
|
206
233
|
// If the task doesn't exist, install it
|
|
207
|
-
return installWindowsService();
|
|
234
|
+
return installWindowsService(resolvedProfile);
|
|
208
235
|
}
|
|
209
236
|
}
|
|
210
|
-
export function stopWindowsService() {
|
|
237
|
+
export function stopWindowsService(profile) {
|
|
238
|
+
const resolvedProfile = normalizeProfileName(profile ?? getActiveProfile());
|
|
239
|
+
const taskName = windowsTaskName(resolvedProfile);
|
|
211
240
|
try {
|
|
212
|
-
execFileSync("schtasks", ["/end", "/tn",
|
|
241
|
+
execFileSync("schtasks", ["/end", "/tn", taskName], { stdio: "pipe" });
|
|
213
242
|
}
|
|
214
243
|
catch {
|
|
215
244
|
// ignore if not running
|
|
216
245
|
}
|
|
217
|
-
return killWindowsProcess();
|
|
246
|
+
return killWindowsProcess(resolvedProfile);
|
|
218
247
|
}
|
|
219
|
-
export function getWindowsServiceStatus() {
|
|
248
|
+
export function getWindowsServiceStatus(profile) {
|
|
249
|
+
const resolvedProfile = normalizeProfileName(profile ?? getActiveProfile());
|
|
250
|
+
const taskName = windowsTaskName(resolvedProfile);
|
|
251
|
+
const logPath = getProfileLogPath(resolvedProfile);
|
|
220
252
|
let installed = false;
|
|
221
253
|
try {
|
|
222
|
-
execFileSync("schtasks", ["/query", "/tn",
|
|
254
|
+
execFileSync("schtasks", ["/query", "/tn", taskName], { stdio: "pipe" });
|
|
223
255
|
installed = true;
|
|
224
256
|
}
|
|
225
257
|
catch {
|
|
@@ -230,8 +262,8 @@ export function getWindowsServiceStatus() {
|
|
|
230
262
|
try {
|
|
231
263
|
const scriptPath = process.argv[1];
|
|
232
264
|
if (scriptPath) {
|
|
233
|
-
const psScript =
|
|
234
|
-
const output = execFileSync("powershell", ["-NoProfile", "-Command", psScript], { stdio: "pipe", env:
|
|
265
|
+
const psScript = buildWindowsProcessQueryScript(resolvedProfile);
|
|
266
|
+
const output = execFileSync("powershell", ["-NoProfile", "-Command", psScript], { stdio: "pipe", env: windowsProcessQueryEnv(resolvedProfile) })
|
|
235
267
|
.toString()
|
|
236
268
|
.trim();
|
|
237
269
|
running = /\d+/.test(output);
|
|
@@ -245,10 +277,10 @@ export function getWindowsServiceStatus() {
|
|
|
245
277
|
platform: "windows",
|
|
246
278
|
installed,
|
|
247
279
|
running,
|
|
248
|
-
serviceName:
|
|
280
|
+
serviceName: taskName,
|
|
249
281
|
manager: "Windows Task Scheduler",
|
|
250
|
-
logPath
|
|
251
|
-
startHint: `schtasks /run /tn "${
|
|
282
|
+
logPath,
|
|
283
|
+
startHint: `schtasks /run /tn "${taskName}"`,
|
|
252
284
|
};
|
|
253
285
|
}
|
|
254
286
|
//# sourceMappingURL=service-manager-windows.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-manager-windows.js","sourceRoot":"","sources":["../../src/platform/service-manager-windows.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service-manager-windows.js","sourceRoot":"","sources":["../../src/platform/service-manager-windows.ts"],"names":[],"mappings":"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"}
|