@moxt-ai/mobius 0.0.336 → 0.0.337
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/dist/cli.js +427 -353
- package/dist/cli.js.map +4 -4
- package/dist/runtime.js +350 -310
- package/dist/runtime.js.map +4 -4
- package/dist/util/filesystem/private-path.js +6 -324
- package/dist/util/filesystem/private-path.js.map +4 -4
- package/dist/util/platform/contracts.d.ts +0 -26
- package/dist/util/platform/contracts.d.ts.map +1 -1
- package/dist/util/platform/index.d.ts.map +1 -1
- package/dist/util/platform/index.js +1 -4
- package/dist/util/platform/index.js.map +1 -1
- package/dist/util/platform/linux.d.ts.map +1 -1
- package/dist/util/platform/linux.js +1 -117
- package/dist/util/platform/linux.js.map +1 -1
- package/dist/util/platform/macos.d.ts.map +1 -1
- package/dist/util/platform/macos.js +1 -4
- package/dist/util/platform/macos.js.map +1 -1
- package/dist/util/platform/posix.d.ts +0 -21
- package/dist/util/platform/posix.d.ts.map +1 -1
- package/dist/util/platform/posix.js +1 -104
- package/dist/util/platform/posix.js.map +1 -1
- package/dist/util/platform/windows.d.ts.map +1 -1
- package/dist/util/platform/windows.js +1 -107
- package/dist/util/platform/windows.js.map +1 -1
- package/dist/util/process/executable.d.ts +2 -2
- package/dist/util/process/executable.d.ts.map +1 -1
- package/dist/util/process/executable.js +31 -222
- package/dist/util/process/executable.js.map +4 -4
- package/dist/util/process/platform/contracts.d.ts +29 -0
- package/dist/util/process/platform/contracts.d.ts.map +1 -0
- package/dist/util/process/platform/contracts.js +2 -0
- package/dist/util/process/platform/contracts.js.map +1 -0
- package/dist/util/process/platform/index.d.ts +3 -0
- package/dist/util/process/platform/index.d.ts.map +1 -0
- package/dist/util/process/platform/index.js +20 -0
- package/dist/util/process/platform/index.js.map +1 -0
- package/dist/util/process/platform/linux.d.ts +3 -0
- package/dist/util/process/platform/linux.d.ts.map +1 -0
- package/dist/util/process/platform/linux.js +122 -0
- package/dist/util/process/platform/linux.js.map +1 -0
- package/dist/util/process/platform/macos.d.ts +3 -0
- package/dist/util/process/platform/macos.d.ts.map +1 -0
- package/dist/util/process/platform/macos.js +8 -0
- package/dist/util/process/platform/macos.js.map +1 -0
- package/dist/util/process/platform/posix.d.ts +25 -0
- package/dist/util/process/platform/posix.d.ts.map +1 -0
- package/dist/util/process/platform/posix.js +107 -0
- package/dist/util/process/platform/posix.js.map +1 -0
- package/dist/util/process/platform/windows.d.ts +3 -0
- package/dist/util/process/platform/windows.d.ts.map +1 -0
- package/dist/util/process/platform/windows.js +114 -0
- package/dist/util/process/platform/windows.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,123 +1,7 @@
|
|
|
1
|
-
import { constants, readdirSync, readFileSync } from "node:fs";
|
|
2
|
-
import { access, readdir, readFile, realpath, stat } from "node:fs/promises";
|
|
3
1
|
import { isAbsolute, join } from "node:path";
|
|
4
|
-
import { posixOperations
|
|
5
|
-
function appendLinuxProcessTableEntry(entries, processId, encoded) {
|
|
6
|
-
const closingParenthesis = encoded.lastIndexOf(")");
|
|
7
|
-
if (!encoded.startsWith(`${processId.toString()} (`) || closingParenthesis < 0) {
|
|
8
|
-
return;
|
|
9
|
-
}
|
|
10
|
-
const fields = encoded
|
|
11
|
-
.slice(closingParenthesis + 1)
|
|
12
|
-
.trim()
|
|
13
|
-
.split(/\s+/);
|
|
14
|
-
const parentProcessId = Number(fields[1]);
|
|
15
|
-
const processGroupId = Number(fields[2]);
|
|
16
|
-
if (!Number.isSafeInteger(parentProcessId) ||
|
|
17
|
-
parentProcessId < 0 ||
|
|
18
|
-
!Number.isSafeInteger(processGroupId) ||
|
|
19
|
-
processGroupId <= 0) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
entries.push({ parentProcessId, processGroupId, processId });
|
|
23
|
-
}
|
|
24
|
-
async function readLinuxProcessTable() {
|
|
25
|
-
const entries = [];
|
|
26
|
-
try {
|
|
27
|
-
const directories = await readdir("/proc", { withFileTypes: true });
|
|
28
|
-
for (const directory of directories) {
|
|
29
|
-
if (!directory.isDirectory() || !/^\d+$/.test(directory.name)) {
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
const processId = Number(directory.name);
|
|
33
|
-
if (!Number.isSafeInteger(processId) || processId <= 0) {
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
try {
|
|
37
|
-
appendLinuxProcessTableEntry(entries, processId, await readFile(join("/proc", directory.name, "stat"), "utf8"));
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
// Processes can exit while procfs is being enumerated.
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
// A restricted Linux runtime may not mount procfs; the fixed ps fallback runs below.
|
|
46
|
-
}
|
|
47
|
-
return entries;
|
|
48
|
-
}
|
|
49
|
-
function readLinuxProcessTableSynchronously() {
|
|
50
|
-
const entries = [];
|
|
51
|
-
try {
|
|
52
|
-
const directories = readdirSync("/proc", { withFileTypes: true });
|
|
53
|
-
for (const directory of directories) {
|
|
54
|
-
if (!directory.isDirectory() || !/^\d+$/.test(directory.name)) {
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
const processId = Number(directory.name);
|
|
58
|
-
if (!Number.isSafeInteger(processId) || processId <= 0) {
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
try {
|
|
62
|
-
appendLinuxProcessTableEntry(entries, processId, readFileSync(join("/proc", directory.name, "stat"), "utf8"));
|
|
63
|
-
}
|
|
64
|
-
catch {
|
|
65
|
-
// Processes can exit while procfs is being enumerated.
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
// A restricted Linux runtime may not mount procfs; the asynchronous fallback runs below.
|
|
71
|
-
}
|
|
72
|
-
return entries;
|
|
73
|
-
}
|
|
74
|
-
async function readLinuxProcessTableWithFallback() {
|
|
75
|
-
const procfsEntries = await readLinuxProcessTable();
|
|
76
|
-
if (procfsEntries.length > 0) {
|
|
77
|
-
return procfsEntries;
|
|
78
|
-
}
|
|
79
|
-
for (const candidate of ["/usr/bin/ps", "/bin/ps", "/run/current-system/sw/bin/ps"]) {
|
|
80
|
-
try {
|
|
81
|
-
const resolvedPath = await realpath(candidate);
|
|
82
|
-
if (!(await stat(resolvedPath)).isFile()) {
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
await access(resolvedPath, constants.X_OK);
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
const entries = await readProcessTableWithPs(candidate);
|
|
91
|
-
if (entries.length > 0) {
|
|
92
|
-
return entries;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return [];
|
|
96
|
-
}
|
|
97
|
-
function processExists(processId) {
|
|
98
|
-
try {
|
|
99
|
-
const encoded = readFileSync(join("/proc", processId.toString(), "stat"), "utf8");
|
|
100
|
-
const closingParenthesis = encoded.lastIndexOf(")");
|
|
101
|
-
if (closingParenthesis >= 0) {
|
|
102
|
-
const processState = encoded
|
|
103
|
-
.slice(closingParenthesis + 1)
|
|
104
|
-
.trimStart()
|
|
105
|
-
.charAt(0);
|
|
106
|
-
if (processState === "Z" || processState === "X") {
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
// Fall through so restricted procfs mounts still use the portable signal probe.
|
|
113
|
-
}
|
|
114
|
-
return posixProcessExists(processId);
|
|
115
|
-
}
|
|
2
|
+
import { posixOperations } from "./posix.js";
|
|
116
3
|
export const linuxPlatform = {
|
|
117
4
|
...posixOperations,
|
|
118
|
-
readProcessTable: readLinuxProcessTableWithFallback,
|
|
119
|
-
readProcessTableSynchronously: readLinuxProcessTableSynchronously,
|
|
120
|
-
processExists,
|
|
121
5
|
claudeCodeExecutablePaths: (environment) => {
|
|
122
6
|
const homeDirectory = environment["HOME"];
|
|
123
7
|
return homeDirectory !== undefined && isAbsolute(homeDirectory)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linux.js","sourceRoot":"","sources":["../../../src/util/platform/linux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"linux.js","sourceRoot":"","sources":["../../../src/util/platform/linux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,CAAC,MAAM,aAAa,GAAoB;IAC1C,GAAG,eAAe;IAClB,yBAAyB,EAAE,CAAC,WAAW,EAAE,EAAE;QACvC,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,aAAa,KAAK,SAAS,IAAI,UAAU,CAAC,aAAa,CAAC;YAC3D,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAClD,CAAC,CAAC,EAAE,CAAC;IACb,CAAC;CACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"macos.d.ts","sourceRoot":"","sources":["../../../src/util/platform/macos.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,eAAO,MAAM,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"macos.d.ts","sourceRoot":"","sources":["../../../src/util/platform/macos.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,eAAO,MAAM,aAAa,EAAE,eAgB3B,CAAC"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { isAbsolute, join } from "node:path";
|
|
2
2
|
import { claudeDesktopExecutablePaths } from "./claude-desktop.js";
|
|
3
|
-
import { posixOperations
|
|
3
|
+
import { posixOperations } from "./posix.js";
|
|
4
4
|
export const macosPlatform = {
|
|
5
5
|
...posixOperations,
|
|
6
|
-
readProcessTable: () => readProcessTableWithPs("/bin/ps"),
|
|
7
|
-
readProcessTableSynchronously: () => [],
|
|
8
|
-
processExists,
|
|
9
6
|
claudeCodeExecutablePaths: (environment) => {
|
|
10
7
|
const paths = ["/opt/homebrew/bin/claude", "/usr/local/bin/claude"];
|
|
11
8
|
const homeDirectory = environment["HOME"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"macos.js","sourceRoot":"","sources":["../../../src/util/platform/macos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"macos.js","sourceRoot":"","sources":["../../../src/util/platform/macos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,CAAC,MAAM,aAAa,GAAoB;IAC1C,GAAG,eAAe;IAClB,yBAAyB,EAAE,CAAC,WAAW,EAAE,EAAE;QACvC,MAAM,KAAK,GAAG,CAAC,0BAA0B,EAAE,uBAAuB,CAAC,CAAC;QACpE,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,aAAa,KAAK,SAAS,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3D,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC9D,KAAK,CAAC,IAAI,CACN,GAAG,4BAA4B,CAC3B,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,qBAAqB,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,EAChF,CAAC,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAC9D,CACJ,CAAC;QACN,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ,CAAC"}
|
|
@@ -1,30 +1,9 @@
|
|
|
1
|
-
import { type ChildProcess } from "node:child_process";
|
|
2
|
-
import type { ProcessTableEntry, ProcessTreeIdentity } from "./contracts.ts";
|
|
3
|
-
export declare function parseProcessTable(output: string): readonly ProcessTableEntry[];
|
|
4
|
-
export declare function readProcessTableWithPs(executable: string): Promise<readonly ProcessTableEntry[]>;
|
|
5
|
-
export declare function processExists(processId: number): boolean;
|
|
6
|
-
export declare function signalCapturedProcesses(processes: readonly ProcessTreeIdentity[], rootProcessId: number, signal: number): void;
|
|
7
|
-
declare function terminateProcess(child: ChildProcess, signal: NodeJS.Signals): void;
|
|
8
1
|
declare function removeControlSocket(path: string): Promise<void>;
|
|
9
2
|
export declare const posixOperations: {
|
|
10
3
|
controlSocketPath: (installationHash: string) => string;
|
|
11
4
|
prepareControlSocket: typeof removeControlSocket;
|
|
12
5
|
secureControlSocket: (path: string) => Promise<void>;
|
|
13
6
|
removeControlSocket: typeof removeControlSocket;
|
|
14
|
-
pathDelimiter: string;
|
|
15
|
-
environmentValue: (environment: Readonly<NodeJS.ProcessEnv>, name: string) => string | undefined;
|
|
16
|
-
executableExtensions: () => string[];
|
|
17
|
-
resolveExecutableTarget: (path: string) => Promise<string>;
|
|
18
|
-
executableLaunch: (command: string, args: readonly string[]) => {
|
|
19
|
-
command: string;
|
|
20
|
-
arguments: readonly string[];
|
|
21
|
-
};
|
|
22
|
-
spawnOptions: {
|
|
23
|
-
detached: true;
|
|
24
|
-
windowsHide: true;
|
|
25
|
-
};
|
|
26
|
-
signalCapturedProcesses: typeof signalCapturedProcesses;
|
|
27
|
-
terminateProcess: typeof terminateProcess;
|
|
28
7
|
validatePathPermissions: (path: string, directory: boolean, privateAccess: boolean, signal: AbortSignal) => Promise<void>;
|
|
29
8
|
};
|
|
30
9
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posix.d.ts","sourceRoot":"","sources":["../../../src/util/platform/posix.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"posix.d.ts","sourceRoot":"","sources":["../../../src/util/platform/posix.ts"],"names":[],"mappings":"AAMA,iBAAe,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ9D;AAED,eAAO,MAAM,eAAe;0CACc,MAAM;;gCAEV,MAAM;;oCAIF,MAAM,aAAa,OAAO,iBAAiB,OAAO,UAAU,WAAW;CAkBhH,CAAC"}
|
|
@@ -1,98 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { constants } from "node:fs";
|
|
3
|
-
import { access, chmod, lstat, realpath, unlink } from "node:fs/promises";
|
|
1
|
+
import { chmod, lstat, unlink } from "node:fs/promises";
|
|
4
2
|
import { tmpdir } from "node:os";
|
|
5
3
|
import { join } from "node:path";
|
|
6
4
|
import { LocalPathError } from "../filesystem/path-error.js";
|
|
7
|
-
const PROCESS_TABLE_TIMEOUT_MILLISECONDS = 1_000;
|
|
8
|
-
const PROCESS_TABLE_OUTPUT_LIMIT_BYTES = 1024 * 1024;
|
|
9
|
-
export function parseProcessTable(output) {
|
|
10
|
-
const entries = [];
|
|
11
|
-
for (const line of output.split("\n")) {
|
|
12
|
-
const groups = /^\s*(?<pid>\d+)\s+(?<ppid>\d+)\s+(?<pgid>\d+)\s*$/.exec(line)?.groups;
|
|
13
|
-
if (groups === undefined) {
|
|
14
|
-
continue;
|
|
15
|
-
}
|
|
16
|
-
const processId = Number(groups["pid"]);
|
|
17
|
-
const parentProcessId = Number(groups["ppid"]);
|
|
18
|
-
const processGroupId = Number(groups["pgid"]);
|
|
19
|
-
if (!Number.isSafeInteger(processId) ||
|
|
20
|
-
processId <= 0 ||
|
|
21
|
-
!Number.isSafeInteger(parentProcessId) ||
|
|
22
|
-
parentProcessId < 0 ||
|
|
23
|
-
!Number.isSafeInteger(processGroupId) ||
|
|
24
|
-
processGroupId <= 0) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
entries.push({ parentProcessId, processGroupId, processId });
|
|
28
|
-
}
|
|
29
|
-
return entries;
|
|
30
|
-
}
|
|
31
|
-
export function readProcessTableWithPs(executable) {
|
|
32
|
-
return new Promise((resolveTable) => {
|
|
33
|
-
execFile(executable, ["-axo", "pid=,ppid=,pgid="], {
|
|
34
|
-
encoding: "utf8",
|
|
35
|
-
maxBuffer: PROCESS_TABLE_OUTPUT_LIMIT_BYTES,
|
|
36
|
-
signal: AbortSignal.timeout(PROCESS_TABLE_TIMEOUT_MILLISECONDS),
|
|
37
|
-
timeout: PROCESS_TABLE_TIMEOUT_MILLISECONDS,
|
|
38
|
-
}, (error, stdout) => {
|
|
39
|
-
resolveTable(error === null ? parseProcessTable(stdout) : []);
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
export function processExists(processId) {
|
|
44
|
-
try {
|
|
45
|
-
process.kill(processId, 0);
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
export function signalCapturedProcesses(processes, rootProcessId, signal) {
|
|
53
|
-
const processIds = new Set(processes.map((identity) => identity.processId));
|
|
54
|
-
const signalledGroups = new Set();
|
|
55
|
-
for (const identity of processes) {
|
|
56
|
-
const isRootProcessGroup = identity.processGroupId === rootProcessId;
|
|
57
|
-
if ((!isRootProcessGroup && !processIds.has(identity.processGroupId)) ||
|
|
58
|
-
signalledGroups.has(identity.processGroupId)) {
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
try {
|
|
62
|
-
process.kill(-identity.processGroupId, signal);
|
|
63
|
-
signalledGroups.add(identity.processGroupId);
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
// A concurrently exited group no longer needs cleanup.
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
for (const identity of processes) {
|
|
70
|
-
if (identity.processId === rootProcessId ||
|
|
71
|
-
identity.processGroupId === rootProcessId ||
|
|
72
|
-
signalledGroups.has(identity.processGroupId)) {
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
try {
|
|
76
|
-
process.kill(identity.processId, signal);
|
|
77
|
-
}
|
|
78
|
-
catch {
|
|
79
|
-
// A concurrently exited process no longer needs cleanup.
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
function terminateProcess(child, signal) {
|
|
84
|
-
if (child.exitCode !== null || child.signalCode !== null || child.pid === undefined) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
try {
|
|
88
|
-
process.kill(-child.pid, signal);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
// Fall through when the child did not create a process group.
|
|
93
|
-
}
|
|
94
|
-
child.kill(signal);
|
|
95
|
-
}
|
|
96
5
|
async function removeControlSocket(path) {
|
|
97
6
|
try {
|
|
98
7
|
await unlink(path);
|
|
@@ -110,18 +19,6 @@ export const posixOperations = {
|
|
|
110
19
|
await chmod(path, 0o600);
|
|
111
20
|
},
|
|
112
21
|
removeControlSocket,
|
|
113
|
-
pathDelimiter: ":",
|
|
114
|
-
environmentValue: (environment, name) => environment[name],
|
|
115
|
-
executableExtensions: () => [""],
|
|
116
|
-
resolveExecutableTarget: async (path) => {
|
|
117
|
-
const target = await realpath(path);
|
|
118
|
-
await access(target, constants.X_OK);
|
|
119
|
-
return target;
|
|
120
|
-
},
|
|
121
|
-
executableLaunch: (command, args) => ({ command, arguments: args }),
|
|
122
|
-
spawnOptions: { detached: true, windowsHide: true },
|
|
123
|
-
signalCapturedProcesses,
|
|
124
|
-
terminateProcess,
|
|
125
22
|
validatePathPermissions: async (path, directory, privateAccess, signal) => {
|
|
126
23
|
signal.throwIfAborted();
|
|
127
24
|
const metadata = await lstat(path);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posix.js","sourceRoot":"","sources":["../../../src/util/platform/posix.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"posix.js","sourceRoot":"","sources":["../../../src/util/platform/posix.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D,KAAK,UAAU,mBAAmB,CAAC,IAAY;IAC3C,IAAI,CAAC;QACD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7E,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC3B,iBAAiB,EAAE,CAAC,gBAAwB,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,gBAAgB,OAAO,CAAC;IAClG,oBAAoB,EAAE,mBAAmB;IACzC,mBAAmB,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;QACxC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,mBAAmB;IACnB,uBAAuB,EAAE,KAAK,EAAE,IAAY,EAAE,SAAkB,EAAE,aAAsB,EAAE,MAAmB,EAAE,EAAE;QAC7G,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACpE,MAAM,IAAI,cAAc,CAAC,wBAAwB,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,aAAa,EAAE,CAAC;YAChB,MAAM,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,CAAC,cAAc,EAAE,CAAC;IAC5B,CAAC;CAQJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../../../src/util/platform/windows.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../../../src/util/platform/windows.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AA6FtD,eAAO,MAAM,eAAe,EAAE,eAmB7B,CAAC"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
|
-
import {
|
|
3
|
-
import { dirname, extname, isAbsolute, join, resolve } from "node:path";
|
|
2
|
+
import { isAbsolute, join } from "node:path";
|
|
4
3
|
import { promisify } from "node:util";
|
|
5
4
|
import { LocalPathError } from "../filesystem/path-error.js";
|
|
6
|
-
import { ProcessExecutionError } from "../process/process-error.js";
|
|
7
5
|
import { claudeDesktopExecutablePaths, installedDirectories } from "./claude-desktop.js";
|
|
8
|
-
import { parseProcessTable, processExists } from "./posix.js";
|
|
9
6
|
const execute = promisify(execFile);
|
|
10
7
|
function environmentValue(environment, name) {
|
|
11
8
|
return Object.entries(environment).find(([key]) => key.toUpperCase() === name.toUpperCase())?.[1];
|
|
@@ -27,98 +24,6 @@ function desktopClaudeExecutablePaths(environment) {
|
|
|
27
24
|
}
|
|
28
25
|
return claudeDesktopExecutablePaths(roots, [["claude.exe"]]);
|
|
29
26
|
}
|
|
30
|
-
function executableExtensions(executableName, environment) {
|
|
31
|
-
if (/\.[a-zA-Z0-9]+$/.test(executableName)) {
|
|
32
|
-
return [""];
|
|
33
|
-
}
|
|
34
|
-
const configured = environmentValue(environment, "PATHEXT") ?? ".COM;.EXE;.BAT;.CMD";
|
|
35
|
-
const extensions = configured
|
|
36
|
-
.split(";")
|
|
37
|
-
.map((extension) => extension.trim())
|
|
38
|
-
.filter((extension) => extension.length > 0)
|
|
39
|
-
.map((extension) => (extension.startsWith(".") ? extension : `.${extension}`));
|
|
40
|
-
return extensions.length > 0 ? extensions : [".EXE"];
|
|
41
|
-
}
|
|
42
|
-
async function resolveExecutableTarget(path) {
|
|
43
|
-
let resolvedPath;
|
|
44
|
-
try {
|
|
45
|
-
resolvedPath = await realpath(extname(path) === "" ? `${path}.cmd` : path);
|
|
46
|
-
}
|
|
47
|
-
catch (cause) {
|
|
48
|
-
if (extname(path) !== "" || !(cause instanceof Error) || !("code" in cause) || cause.code !== "ENOENT") {
|
|
49
|
-
throw cause;
|
|
50
|
-
}
|
|
51
|
-
resolvedPath = await realpath(path);
|
|
52
|
-
}
|
|
53
|
-
if (extname(resolvedPath).toLowerCase() === ".cmd") {
|
|
54
|
-
// npm cmd-shim entrypoints are Node scripts. Resolve the script instead of
|
|
55
|
-
// handing untrusted arguments to cmd.exe's command language.
|
|
56
|
-
const shim = await readFile(resolvedPath, "utf8");
|
|
57
|
-
// Node's bundled npm uses its own shim format, not npm cmd-shim.
|
|
58
|
-
if (shim.includes('SET "NPM_CLI_JS=%~dp0\\node_modules\\npm\\bin\\npm-cli.js"') &&
|
|
59
|
-
shim.includes('"%NODE_EXE%" "%NPM_CLI_JS%" %*')) {
|
|
60
|
-
return await realpath(resolve(dirname(resolvedPath), "node_modules/npm/bin/npm-cli.js"));
|
|
61
|
-
}
|
|
62
|
-
const script = /"%_prog%"\s+"%dp0%[\\/]([^"\r\n]+\.(?:js|mjs|cjs))"\s+%\*/iu.exec(shim)?.[1];
|
|
63
|
-
if (script !== undefined && shim.includes("SET dp0=%~dp0")) {
|
|
64
|
-
resolvedPath = await realpath(resolve(dirname(resolvedPath), script));
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
const pnpmScript = /^\s*node\s+"%~dp0[\\/]([^"\r\n]+\.(?:js|mjs|cjs))"\s+%\*\s*$/imu.exec(shim)?.[1];
|
|
68
|
-
if (pnpmScript === undefined || !shim.includes("@SETLOCAL")) {
|
|
69
|
-
throw new ProcessExecutionError("process_unsupported_script", "Use a native executable or a verified Node entrypoint");
|
|
70
|
-
}
|
|
71
|
-
resolvedPath = await realpath(resolve(dirname(resolvedPath), pnpmScript));
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return resolvedPath;
|
|
75
|
-
}
|
|
76
|
-
function executableLaunch(command, args) {
|
|
77
|
-
if (/\.(?:js|mjs|cjs)$/iu.test(command)) {
|
|
78
|
-
return { command: process.execPath, arguments: [command, ...args] };
|
|
79
|
-
}
|
|
80
|
-
if (/\.(?:cmd|bat)$/iu.test(command)) {
|
|
81
|
-
throw new ProcessExecutionError("process_unsupported_script", "Use a native executable or a verified Node entrypoint");
|
|
82
|
-
}
|
|
83
|
-
return { command, arguments: args };
|
|
84
|
-
}
|
|
85
|
-
function readProcessTable() {
|
|
86
|
-
const systemRoot = environmentValue(process.env, "SystemRoot");
|
|
87
|
-
if (systemRoot === undefined) {
|
|
88
|
-
return Promise.resolve([]);
|
|
89
|
-
}
|
|
90
|
-
return new Promise((resolveTable) => {
|
|
91
|
-
execFile(join(systemRoot, "System32", "WindowsPowerShell", "v1.0", "powershell.exe"), [
|
|
92
|
-
"-NoLogo",
|
|
93
|
-
"-NoProfile",
|
|
94
|
-
"-NonInteractive",
|
|
95
|
-
"-Command",
|
|
96
|
-
"Get-CimInstance Win32_Process | ForEach-Object { '{0} {1} {0}' -f $_.ProcessId, $_.ParentProcessId }",
|
|
97
|
-
], {
|
|
98
|
-
encoding: "utf8",
|
|
99
|
-
windowsHide: true,
|
|
100
|
-
timeout: 10000,
|
|
101
|
-
signal: AbortSignal.timeout(10000),
|
|
102
|
-
maxBuffer: 1024 * 1024,
|
|
103
|
-
}, (error, stdout) => resolveTable(error === null ? parseProcessTable(stdout) : []));
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
function signalCapturedProcesses(processes, _rootProcessId, signal) {
|
|
107
|
-
for (const identity of [...processes].reverse()) {
|
|
108
|
-
try {
|
|
109
|
-
process.kill(identity.processId, signal);
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
// A concurrently exited process no longer needs cleanup.
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
function terminateProcess(child, signal) {
|
|
117
|
-
if (child.exitCode !== null || child.signalCode !== null || child.pid === undefined) {
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
child.kill(signal);
|
|
121
|
-
}
|
|
122
27
|
// The path is data in the environment, never interpolated into PowerShell source.
|
|
123
28
|
const windowsPermissions = `
|
|
124
29
|
$ErrorActionPreference = 'Stop'
|
|
@@ -180,18 +85,7 @@ export const windowsPlatform = {
|
|
|
180
85
|
prepareControlSocket: async () => { },
|
|
181
86
|
secureControlSocket: async () => { },
|
|
182
87
|
removeControlSocket: async () => { },
|
|
183
|
-
pathDelimiter: ";",
|
|
184
|
-
environmentValue,
|
|
185
|
-
executableExtensions,
|
|
186
|
-
resolveExecutableTarget,
|
|
187
|
-
executableLaunch,
|
|
188
|
-
spawnOptions: { detached: false, windowsHide: true },
|
|
189
|
-
signalCapturedProcesses,
|
|
190
|
-
terminateProcess,
|
|
191
88
|
validatePathPermissions,
|
|
192
|
-
readProcessTable,
|
|
193
|
-
readProcessTableSynchronously: () => [],
|
|
194
|
-
processExists,
|
|
195
89
|
claudeCodeExecutablePaths: (environment) => {
|
|
196
90
|
const paths = [];
|
|
197
91
|
const userProfile = environmentValue(environment, "USERPROFILE");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"windows.js","sourceRoot":"","sources":["../../../src/util/platform/windows.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"windows.js","sourceRoot":"","sources":["../../../src/util/platform/windows.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
-
import type { ProcessLaunch, ProcessTreeIdentity } from "
|
|
3
|
-
export type { ProcessTreeIdentity } from "
|
|
2
|
+
import type { ProcessLaunch, ProcessTreeIdentity } from "./platform/contracts.ts";
|
|
3
|
+
export type { ProcessTreeIdentity } from "./platform/contracts.ts";
|
|
4
4
|
export { ProcessExecutionError } from "./process-error.ts";
|
|
5
5
|
export declare class ExecutableIdentity {
|
|
6
6
|
readonly changedAtMilliseconds: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executable.d.ts","sourceRoot":"","sources":["../../../src/util/process/executable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAI3C,OAAO,KAAK,EAAE,aAAa,EAAqB,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"executable.d.ts","sourceRoot":"","sources":["../../../src/util/process/executable.ts"],"names":[],"mappings":"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"}
|