@botiverse/oar 0.35.0 → 0.36.1
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/runtimes/claude/launch.d.ts.map +1 -1
- package/dist/runtimes/claude/launch.js +3 -0
- package/dist/runtimes/claude/launch.js.map +1 -1
- package/dist/runtimes/claude/session.d.ts.map +1 -1
- package/dist/runtimes/claude/session.js +32 -21
- package/dist/runtimes/claude/session.js.map +1 -1
- package/dist/runtimes/codex/app-server-client.d.ts +3 -0
- package/dist/runtimes/codex/app-server-client.d.ts.map +1 -1
- package/dist/runtimes/codex/app-server-client.js +3 -3
- package/dist/runtimes/codex/app-server-client.js.map +1 -1
- package/dist/runtimes/codex/rpc-control.d.ts.map +1 -1
- package/dist/runtimes/codex/rpc-control.js +6 -1
- package/dist/runtimes/codex/rpc-control.js.map +1 -1
- package/dist/runtimes/codex/session.d.ts.map +1 -1
- package/dist/runtimes/codex/session.js +31 -32
- package/dist/runtimes/codex/session.js.map +1 -1
- package/dist/shared/abort-fallback.d.ts +11 -0
- package/dist/shared/abort-fallback.d.ts.map +1 -0
- package/dist/shared/abort-fallback.js +34 -0
- package/dist/shared/abort-fallback.js.map +1 -0
- package/dist/shared/acp/process.js +1 -1
- package/dist/shared/acp/process.js.map +1 -1
- package/dist/shared/acp/terminal.d.ts.map +1 -1
- package/dist/shared/acp/terminal.js +2 -1
- package/dist/shared/acp/terminal.js.map +1 -1
- package/dist/shared/executable/index.d.ts +1 -1
- package/dist/shared/executable/index.d.ts.map +1 -1
- package/dist/shared/executable/index.js +1 -1
- package/dist/shared/executable/index.js.map +1 -1
- package/dist/shared/executable/isolated.d.ts.map +1 -1
- package/dist/shared/executable/isolated.js +2 -1
- package/dist/shared/executable/isolated.js.map +1 -1
- package/dist/shared/executable/ownership.d.ts +12 -0
- package/dist/shared/executable/ownership.d.ts.map +1 -0
- package/dist/shared/executable/ownership.js +69 -0
- package/dist/shared/executable/ownership.js.map +1 -0
- package/dist/shared/executable/process-tree.d.ts +24 -0
- package/dist/shared/executable/process-tree.d.ts.map +1 -0
- package/dist/shared/executable/process-tree.js +123 -0
- package/dist/shared/executable/process-tree.js.map +1 -0
- package/dist/shared/executable/process.d.ts +13 -6
- package/dist/shared/executable/process.d.ts.map +1 -1
- package/dist/shared/executable/process.js +31 -1
- package/dist/shared/executable/process.js.map +1 -1
- package/dist/shared/executable/run.d.ts.map +1 -1
- package/dist/shared/executable/run.js +74 -30
- package/dist/shared/executable/run.js.map +1 -1
- package/dist/shared/login.d.ts.map +1 -1
- package/dist/shared/login.js +2 -1
- package/dist/shared/login.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../../src/shared/acp/terminal.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,OAAO,EACL,YAAY,GAWb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"terminal.js","sourceRoot":"","sources":["../../../src/shared/acp/terminal.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,5 +4,5 @@ export type { ExecutableResult, ExecutableRunner, ExecutableRunOptions } from ".
|
|
|
4
4
|
export { runExecutable } from "./run.js";
|
|
5
5
|
export { readExecutableVersion, type VersionReader } from "./version.js";
|
|
6
6
|
export type { LineProcess, LineProcessOptions } from "./process.js";
|
|
7
|
-
export { KILL_GRACE_MS, killGraceMs, killProcessTree, OWN_PROCESS_GROUP, requiresShell, signalProcessGroup, spawnLineProcess, } from "./process.js";
|
|
7
|
+
export { KILL_GRACE_MS, killGraceMs, killProcessTree, OWN_PROCESS_GROUP, requiresShell, signalProcessGroup, spawnLineProcess, trackOwnedProcess, } from "./process.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/executable/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACjE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/executable/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACjE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACzE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
|
|
@@ -2,5 +2,5 @@ export { resolveExecutable, resolveExecutableAll } from "./resolve.js";
|
|
|
2
2
|
export { runIsolated } from "./isolated.js";
|
|
3
3
|
export { runExecutable } from "./run.js";
|
|
4
4
|
export { readExecutableVersion } from "./version.js";
|
|
5
|
-
export { KILL_GRACE_MS, killGraceMs, killProcessTree, OWN_PROCESS_GROUP, requiresShell, signalProcessGroup, spawnLineProcess, } from "./process.js";
|
|
5
|
+
export { KILL_GRACE_MS, killGraceMs, killProcessTree, OWN_PROCESS_GROUP, requiresShell, signalProcessGroup, spawnLineProcess, trackOwnedProcess, } from "./process.js";
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/executable/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,WAAW,EAAuB,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAsB,MAAM,cAAc,CAAC;AAEzE,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/shared/executable/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,WAAW,EAAuB,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAsB,MAAM,cAAc,CAAC;AAEzE,OAAO,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolated.d.ts","sourceRoot":"","sources":["../../../src/shared/executable/isolated.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAwBD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"isolated.d.ts","sourceRoot":"","sources":["../../../src/shared/executable/isolated.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAwBD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAyChI"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import spawn from "cross-spawn";
|
|
2
|
-
import { killGraceMs, killProcessTree, OWN_PROCESS_GROUP, signalProcessGroup } from "./process.js";
|
|
2
|
+
import { killGraceMs, killProcessTree, OWN_PROCESS_GROUP, signalProcessGroup, trackOwnedProcess } from "./process.js";
|
|
3
3
|
const OUTPUT_LIMIT = 1024 * 1024;
|
|
4
4
|
/** After the command itself exits, how long a process it left holding the output pipes may keep them. */
|
|
5
5
|
const PIPE_DRAIN_MS = 2000;
|
|
@@ -33,6 +33,7 @@ export async function runIsolated(command, args, options) {
|
|
|
33
33
|
detached: OWN_PROCESS_GROUP,
|
|
34
34
|
windowsHide: true,
|
|
35
35
|
});
|
|
36
|
+
trackOwnedProcess(child);
|
|
36
37
|
let stdout = "";
|
|
37
38
|
let stderr = "";
|
|
38
39
|
const stop = { timedOut: false };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isolated.js","sourceRoot":"","sources":["../../../src/shared/executable/isolated.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"isolated.js","sourceRoot":"","sources":["../../../src/shared/executable/isolated.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ChildProcess } from "node:child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Own a detached POSIX group or Windows tree until its output pipes close:
|
|
4
|
+
* descendants may hold them after the launcher exits. One synchronous hook
|
|
5
|
+
* covers sessions, probes, updaters, logins and ACP terminals when a host
|
|
6
|
+
* calls process.exit without disposing them; on POSIX it also SIGKILLs the
|
|
7
|
+
* descendants of a child still running that left its group, and their groups
|
|
8
|
+
* (process-tree.ts). Node does not emit `exit` for an unhandled terminating
|
|
9
|
+
* signal or SIGKILL; hosts own graceful handling.
|
|
10
|
+
*/
|
|
11
|
+
export declare function trackOwnedProcess(child: ChildProcess): void;
|
|
12
|
+
//# sourceMappingURL=ownership.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.d.ts","sourceRoot":"","sources":["../../../src/shared/executable/ownership.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAiCrE;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAiB3D"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { descendantsOf, killEntries, readProcessTable } from "./process-tree.js";
|
|
3
|
+
const ownedChildren = new Set();
|
|
4
|
+
let exitHookInstalled = false;
|
|
5
|
+
function killOwnedProcess(child, table) {
|
|
6
|
+
try {
|
|
7
|
+
if (child.pid !== undefined) {
|
|
8
|
+
if (process.platform === "win32") {
|
|
9
|
+
// A reaped Windows pid can already identify an unrelated process.
|
|
10
|
+
if (child.exitCode !== null || child.signalCode !== null) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
// An exit listener cannot wait for an asynchronous taskkill. Bound
|
|
14
|
+
// this synchronous cleanup too, and suppress its console output.
|
|
15
|
+
execFileSync("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
|
|
16
|
+
stdio: "ignore", timeout: 10_000, windowsHide: true,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
// Its descendants outside its group too, found below it only while
|
|
21
|
+
// it runs: a reaped pid may already be someone else's.
|
|
22
|
+
if (child.exitCode === null && child.signalCode === null) {
|
|
23
|
+
killEntries(descendantsOf(table(), child.pid), table());
|
|
24
|
+
}
|
|
25
|
+
process.kill(-child.pid, "SIGKILL");
|
|
26
|
+
}
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// An empty group or failed tree walk still permits a direct-child try.
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
child.kill("SIGKILL");
|
|
35
|
+
}
|
|
36
|
+
catch { /* Continue with the other children. */ }
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Own a detached POSIX group or Windows tree until its output pipes close:
|
|
40
|
+
* descendants may hold them after the launcher exits. One synchronous hook
|
|
41
|
+
* covers sessions, probes, updaters, logins and ACP terminals when a host
|
|
42
|
+
* calls process.exit without disposing them; on POSIX it also SIGKILLs the
|
|
43
|
+
* descendants of a child still running that left its group, and their groups
|
|
44
|
+
* (process-tree.ts). Node does not emit `exit` for an unhandled terminating
|
|
45
|
+
* signal or SIGKILL; hosts own graceful handling.
|
|
46
|
+
*/
|
|
47
|
+
export function trackOwnedProcess(child) {
|
|
48
|
+
ownedChildren.add(child);
|
|
49
|
+
const forget = () => { ownedChildren.delete(child); };
|
|
50
|
+
child.once("close", forget);
|
|
51
|
+
child.once("error", () => {
|
|
52
|
+
// Other errors (e.g. a failed kill) do not prove the process is gone.
|
|
53
|
+
if (child.pid === undefined) {
|
|
54
|
+
forget();
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
if (!exitHookInstalled) {
|
|
58
|
+
exitHookInstalled = true;
|
|
59
|
+
process.once("exit", () => {
|
|
60
|
+
// One read of the process table serves every child.
|
|
61
|
+
let table = null;
|
|
62
|
+
const read = () => { table ??= readProcessTable(); return table; };
|
|
63
|
+
for (const owned of ownedChildren) {
|
|
64
|
+
killOwnedProcess(owned, read);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=ownership.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.js","sourceRoot":"","sources":["../../../src/shared/executable/ownership.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAqB,MAAM,mBAAmB,CAAC;AAEpG,MAAM,aAAa,GAAG,IAAI,GAAG,EAAgB,CAAC;AAC9C,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAE9B,SAAS,gBAAgB,CAAC,KAAmB,EAAE,KAAyB;IACtE,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,kEAAkE;gBAClE,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBACrE,mEAAmE;gBACnE,iEAAiE;gBACjE,YAAY,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;oBAChE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI;iBACpD,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,mEAAmE;gBACnE,uDAAuD;gBACvD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;oBACzD,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACtC,CAAC;YACD,OAAO;QACT,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;IACzE,CAAC;IACD,IAAI,CAAC;QAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,uCAAuC,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAmB;IACnD,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,GAAS,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;QACvB,sEAAsE;QACtE,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAAC,MAAM,EAAE,CAAC;QAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,iBAAiB,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;YACxB,oDAAoD;YACpD,IAAI,KAAK,GAAwB,IAAI,CAAC;YACtC,MAAM,IAAI,GAAG,GAAiB,EAAE,GAAG,KAAK,KAAK,gBAAgB,EAAE,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;YACjF,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAAC,CAAC;QACvE,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** One process in the table. `start` tells it from a later process given the same pid. */
|
|
2
|
+
export interface ProcessEntry {
|
|
3
|
+
readonly pid: number;
|
|
4
|
+
readonly ppid: number;
|
|
5
|
+
readonly pgid: number;
|
|
6
|
+
readonly start: string;
|
|
7
|
+
}
|
|
8
|
+
/** The process table at one moment, by pid. */
|
|
9
|
+
export type ProcessTable = ReadonlyMap<number, ProcessEntry>;
|
|
10
|
+
/**
|
|
11
|
+
* The process table now (synchronous: the host's `exit` hook reads it too).
|
|
12
|
+
* Empty when it cannot be read; the caller then reaches the process group only.
|
|
13
|
+
*/
|
|
14
|
+
export declare function readProcessTable(source?: "procfs" | "ps"): ProcessTable;
|
|
15
|
+
/** Every process below `pid` in `table`: its children, theirs, and so on. */
|
|
16
|
+
export declare function descendantsOf(table: ProcessTable, pid: number): ProcessEntry[];
|
|
17
|
+
/**
|
|
18
|
+
* SIGKILL each of `entries` that `table` (read just before) shows still
|
|
19
|
+
* running, the same process (same start time), and the process group each
|
|
20
|
+
* belongs to now: the runtime's own, or one a descendant made, which can hold
|
|
21
|
+
* processes started since the entries were read. Never the host, nor its group.
|
|
22
|
+
*/
|
|
23
|
+
export declare function killEntries(entries: Iterable<ProcessEntry>, table: ProcessTable): void;
|
|
24
|
+
//# sourceMappingURL=process-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-tree.d.ts","sourceRoot":"","sources":["../../../src/shared/executable/process-tree.ts"],"names":[],"mappings":"AAcA,0FAA0F;AAC1F,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,+CAA+C;AAC/C,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAiD7D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,QAAQ,GAAG,IAAqD,GAAG,YAAY,CAMvH;AAED,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE,CAuB9E;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CA4BtF"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
3
|
+
/** `/proc/<pid>/stat`'s ppid, pgrp and starttime (clock ticks since boot); null once the process is gone. */
|
|
4
|
+
function readStat(pid) {
|
|
5
|
+
let stat = "";
|
|
6
|
+
try {
|
|
7
|
+
stat = readFileSync(`/proc/${String(pid)}/stat`, "utf8");
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
// Field 2, the command name, is parenthesized and may itself hold spaces
|
|
13
|
+
// and parentheses; the fields after its last ")" start at field 3 (state).
|
|
14
|
+
const fields = stat.slice(stat.lastIndexOf(")") + 2).split(" ");
|
|
15
|
+
const [ppid, pgid, start] = [Number(fields[1]), Number(fields[2]), fields[19]];
|
|
16
|
+
return Number.isInteger(ppid) && Number.isInteger(pgid) && start !== undefined ? { pid, ppid, pgid, start } : null;
|
|
17
|
+
}
|
|
18
|
+
/** Linux: every process's stat. */
|
|
19
|
+
function readProcfs() {
|
|
20
|
+
const table = new Map();
|
|
21
|
+
for (const name of readdirSync("/proc")) {
|
|
22
|
+
const entry = /^\d+$/u.test(name) ? readStat(Number(name)) : null;
|
|
23
|
+
if (entry !== null) {
|
|
24
|
+
table.set(entry.pid, entry);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return table;
|
|
28
|
+
}
|
|
29
|
+
/** Other POSIX systems (macOS): one `ps` run; `lstart` is the start time to the second. */
|
|
30
|
+
function readPs() {
|
|
31
|
+
const output = execFileSync("ps", ["-A", "-o", "pid=,ppid=,pgid=,lstart="], {
|
|
32
|
+
encoding: "utf8",
|
|
33
|
+
env: { ...process.env, LC_ALL: "C" },
|
|
34
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
35
|
+
timeout: 5000,
|
|
36
|
+
maxBuffer: 16 * 1024 * 1024,
|
|
37
|
+
});
|
|
38
|
+
const table = new Map();
|
|
39
|
+
for (const line of output.split("\n")) {
|
|
40
|
+
const match = /^\s*(\d+)\s+(\d+)\s+(\d+)\s+(\S.*?)\s*$/u.exec(line);
|
|
41
|
+
if (match !== null) {
|
|
42
|
+
const pid = Number(match[1]);
|
|
43
|
+
table.set(pid, { pid, ppid: Number(match[2]), pgid: Number(match[3]), start: match[4] ?? "" });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return table;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* The process table now (synchronous: the host's `exit` hook reads it too).
|
|
50
|
+
* Empty when it cannot be read; the caller then reaches the process group only.
|
|
51
|
+
*/
|
|
52
|
+
export function readProcessTable(source = process.platform === "linux" ? "procfs" : "ps") {
|
|
53
|
+
try {
|
|
54
|
+
return source === "procfs" ? readProcfs() : readPs();
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return new Map();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** Every process below `pid` in `table`: its children, theirs, and so on. */
|
|
61
|
+
export function descendantsOf(table, pid) {
|
|
62
|
+
const children = new Map();
|
|
63
|
+
for (const entry of table.values()) {
|
|
64
|
+
const siblings = children.get(entry.ppid);
|
|
65
|
+
if (siblings === undefined) {
|
|
66
|
+
children.set(entry.ppid, [entry]);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
siblings.push(entry);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const found = [];
|
|
73
|
+
const seen = new Set([pid]);
|
|
74
|
+
const pending = [pid];
|
|
75
|
+
for (let parent = pending.pop(); parent !== undefined; parent = pending.pop()) {
|
|
76
|
+
for (const child of children.get(parent) ?? []) {
|
|
77
|
+
if (!seen.has(child.pid)) {
|
|
78
|
+
seen.add(child.pid);
|
|
79
|
+
found.push(child);
|
|
80
|
+
pending.push(child.pid);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return found;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* SIGKILL each of `entries` that `table` (read just before) shows still
|
|
88
|
+
* running, the same process (same start time), and the process group each
|
|
89
|
+
* belongs to now: the runtime's own, or one a descendant made, which can hold
|
|
90
|
+
* processes started since the entries were read. Never the host, nor its group.
|
|
91
|
+
*/
|
|
92
|
+
export function killEntries(entries, table) {
|
|
93
|
+
const hostGroup = table.get(process.pid)?.pgid;
|
|
94
|
+
const groups = new Set();
|
|
95
|
+
const pids = new Set();
|
|
96
|
+
for (const entry of entries) {
|
|
97
|
+
const current = table.get(entry.pid);
|
|
98
|
+
if (current === undefined || current.start !== entry.start || current.pid === process.pid) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
pids.add(current.pid);
|
|
102
|
+
if (current.pgid > 1 && current.pgid !== hostGroup) {
|
|
103
|
+
groups.add(current.pgid);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const group of groups) {
|
|
107
|
+
try {
|
|
108
|
+
process.kill(-group, "SIGKILL");
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// The group emptied meanwhile.
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
for (const pid of pids) {
|
|
115
|
+
try {
|
|
116
|
+
process.kill(pid, "SIGKILL");
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Gone meanwhile.
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=process-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-tree.js","sourceRoot":"","sources":["../../../src/shared/executable/process-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type ChildProcess } from "node:child_process";
|
|
2
2
|
import type { Readable, Writable } from "node:stream";
|
|
3
3
|
import { type ProcessDiagnostics } from "./diagnostics.js";
|
|
4
|
+
export { trackOwnedProcess } from "./ownership.js";
|
|
4
5
|
export interface LineProcessOptions {
|
|
5
6
|
readonly cwd?: string;
|
|
6
7
|
readonly env?: NodeJS.ProcessEnv;
|
|
@@ -11,9 +12,14 @@ export interface LineProcessOptions {
|
|
|
11
12
|
*/
|
|
12
13
|
readonly inheritStderr?: boolean;
|
|
13
14
|
/**
|
|
14
|
-
*
|
|
15
|
-
* ({@link killProcessTree})
|
|
16
|
-
* npm `.cmd` shim is only `cmd.exe`. POSIX
|
|
15
|
+
* `kill()` ends the child's whole process tree. On Windows
|
|
16
|
+
* ({@link killProcessTree}) that is more than the direct child, which for an
|
|
17
|
+
* npm `.cmd` shim is only `cmd.exe`. On POSIX, where the child's process
|
|
18
|
+
* group is always signalled, it adds the descendants that left the group
|
|
19
|
+
* (process-tree.ts): SIGTERM still goes to the group alone, so the child
|
|
20
|
+
* can stop its tools itself; the SIGKILL, or the child's exit if that comes
|
|
21
|
+
* first, also takes every descendant seen before (when `kill()` began, and
|
|
22
|
+
* again just before the SIGKILL) and the groups they belong to.
|
|
17
23
|
*/
|
|
18
24
|
readonly killTree?: boolean;
|
|
19
25
|
}
|
|
@@ -74,9 +80,10 @@ export interface LineProcess {
|
|
|
74
80
|
/**
|
|
75
81
|
* Stop the process and everything it started: close stdin, SIGTERM its
|
|
76
82
|
* process group, and SIGKILL the group if the child is still running once
|
|
77
|
-
* the grace period is over
|
|
78
|
-
*
|
|
79
|
-
*
|
|
83
|
+
* the grace period is over; with `killTree`, its descendants outside the
|
|
84
|
+
* group too. On Windows it ends the child alone, or its whole tree with
|
|
85
|
+
* `killTree`. Idempotent; a no-op after the exit, since a reaped pid may
|
|
86
|
+
* already belong to another process.
|
|
80
87
|
*/
|
|
81
88
|
kill(): void;
|
|
82
89
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../src/shared/executable/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAA2B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../../src/shared/executable/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAA2B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAIpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,QAAS,CAAC;AAEpC;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAIxE;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,SAA+B,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAWpF;AAED,8EAA8E;AAC9E,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,kEAAkE;IAClE,WAAW,IAAI,kBAAkB,CAAC;IAClC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,yEAAyE;IACzE,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9C,+DAA+D;IAC/D,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IACrD;;;;;;;OAOG;IACH,IAAI,IAAI,IAAI,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAWzD;AAED,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAEjF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,kBAAuB,GAC/B,WAAW,CAoJb"}
|
|
@@ -2,6 +2,9 @@ import { execFile } from "node:child_process";
|
|
|
2
2
|
import spawn from "cross-spawn";
|
|
3
3
|
import { StringDecoder } from "node:string_decoder";
|
|
4
4
|
import { nativeError, StderrTail } from "./diagnostics.js";
|
|
5
|
+
import { trackOwnedProcess } from "./ownership.js";
|
|
6
|
+
import { descendantsOf, killEntries, readProcessTable } from "./process-tree.js";
|
|
7
|
+
export { trackOwnedProcess } from "./ownership.js";
|
|
5
8
|
/**
|
|
6
9
|
* How long a process asked to stop (SIGTERM) gets before it is killed outright
|
|
7
10
|
* (SIGKILL): the bound that keeps `kill()` followed by `await exited` from
|
|
@@ -64,11 +67,12 @@ export function killProcessTree(child) {
|
|
|
64
67
|
child.kill();
|
|
65
68
|
return;
|
|
66
69
|
}
|
|
67
|
-
execFile("taskkill", ["/pid", String(child.pid), "/T", "/F"], (error) => {
|
|
70
|
+
const killer = execFile("taskkill", ["/pid", String(child.pid), "/T", "/F"], (error) => {
|
|
68
71
|
if (error !== null) {
|
|
69
72
|
child.kill();
|
|
70
73
|
}
|
|
71
74
|
});
|
|
75
|
+
trackOwnedProcess(killer);
|
|
72
76
|
}
|
|
73
77
|
/** Windows npm shims need a shell for one-shot execFile calls. */
|
|
74
78
|
export function requiresShell(command, platform) {
|
|
@@ -85,6 +89,7 @@ export function spawnLineProcess(command, args, options = {}) {
|
|
|
85
89
|
stdio: ["pipe", "pipe", "pipe"],
|
|
86
90
|
detached: OWN_PROCESS_GROUP,
|
|
87
91
|
});
|
|
92
|
+
trackOwnedProcess(child);
|
|
88
93
|
const { stdin, stdout } = child;
|
|
89
94
|
const stderr = new StderrTail();
|
|
90
95
|
const inheritStderr = options.inheritStderr ?? process.env.OAR_CHILD_STDERR === "inherit";
|
|
@@ -108,6 +113,9 @@ export function spawnLineProcess(command, args, options = {}) {
|
|
|
108
113
|
let exitSignal = null;
|
|
109
114
|
let spawnError = undefined;
|
|
110
115
|
let escalation = null;
|
|
116
|
+
// POSIX `killTree`: the child's descendants when kill() began, until they
|
|
117
|
+
// have had their SIGKILL.
|
|
118
|
+
let descendants = [];
|
|
111
119
|
const { promise: spawned, resolve: spawnOk, reject: spawnFailed } = Promise.withResolvers();
|
|
112
120
|
const { promise: exited, resolve: exitDone } = Promise.withResolvers();
|
|
113
121
|
child.once("spawn", spawnOk);
|
|
@@ -121,6 +129,12 @@ export function spawnLineProcess(command, args, options = {}) {
|
|
|
121
129
|
if (escalation !== null) {
|
|
122
130
|
clearTimeout(escalation);
|
|
123
131
|
}
|
|
132
|
+
if (descendants.length > 0) {
|
|
133
|
+
// The child stopped before its SIGKILL: what it left running of its
|
|
134
|
+
// tree now belongs to nobody, and goes before the exit is reported.
|
|
135
|
+
killEntries(descendants, readProcessTable());
|
|
136
|
+
descendants = [];
|
|
137
|
+
}
|
|
124
138
|
for (const handler of exitHandlers) {
|
|
125
139
|
handler(code);
|
|
126
140
|
}
|
|
@@ -191,11 +205,27 @@ export function spawnLineProcess(command, args, options = {}) {
|
|
|
191
205
|
}, killGraceMs());
|
|
192
206
|
return;
|
|
193
207
|
}
|
|
208
|
+
const { pid } = child;
|
|
209
|
+
const tree = options.killTree === true && pid !== undefined;
|
|
210
|
+
if (tree) {
|
|
211
|
+
// Read while the child runs: once it is gone, what left its group is
|
|
212
|
+
// re-parented and no longer found below it.
|
|
213
|
+
descendants = descendantsOf(readProcessTable(), pid);
|
|
214
|
+
}
|
|
194
215
|
signalProcessGroup(child, "SIGTERM");
|
|
195
216
|
// Cleared by the exit, so it only fires on a process that ignored the
|
|
196
217
|
// SIGTERM; the SIGKILL then takes its whole group down with it.
|
|
197
218
|
escalation = setTimeout(() => {
|
|
219
|
+
if (!tree) {
|
|
220
|
+
signalProcessGroup(child, "SIGKILL");
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
// Read again first: the child may have started more since.
|
|
224
|
+
const table = readProcessTable();
|
|
225
|
+
const now = descendantsOf(table, pid);
|
|
198
226
|
signalProcessGroup(child, "SIGKILL");
|
|
227
|
+
killEntries([...descendants, ...now], table);
|
|
228
|
+
descendants = [];
|
|
199
229
|
}, killGraceMs());
|
|
200
230
|
},
|
|
201
231
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/shared/executable/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAqB,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,MAAM,aAAa,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,UAAU,EAA2B,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../../src/shared/executable/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/shared/executable/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEpF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,oBAAoB,KAC3B,OAAO,CAAC,gBAAgB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/shared/executable/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEpF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,CAAC,EAAE,oBAAoB,KAC3B,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAI/B,eAAO,MAAM,aAAa,EAAE,gBAgF3B,CAAC"}
|