@intentic/machine 1.328.0 → 1.330.0
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/device/commands.js +1 -1
- package/dist/device/commands.js.map +1 -1
- package/dist/device/connection.d.ts.map +1 -1
- package/dist/device/connection.js +3 -0
- package/dist/device/connection.js.map +1 -1
- package/dist/device/grant.d.ts +46 -0
- package/dist/device/grant.d.ts.map +1 -1
- package/dist/device/mcp.d.ts +1 -0
- package/dist/device/mcp.d.ts.map +1 -1
- package/dist/device/mcp.js +51 -0
- package/dist/device/mcp.js.map +1 -1
- package/dist/device/policy.d.ts +1 -1
- package/dist/device/policy.d.ts.map +1 -1
- package/dist/device/policy.js +1 -0
- package/dist/device/policy.js.map +1 -1
- package/dist/device/router.d.ts +43 -0
- package/dist/device/router.d.ts.map +1 -1
- package/dist/device/router.js +24 -0
- package/dist/device/router.js.map +1 -1
- package/dist/device/tools/describe.d.ts.map +1 -1
- package/dist/device/tools/describe.js +3 -3
- package/dist/device/tools/describe.js.map +1 -1
- package/dist/device/tools/programs/artifacts.d.ts +12 -0
- package/dist/device/tools/programs/artifacts.d.ts.map +1 -0
- package/dist/device/tools/programs/artifacts.js +152 -0
- package/dist/device/tools/programs/artifacts.js.map +1 -0
- package/dist/device/tools/programs/isolated.d.ts +20 -0
- package/dist/device/tools/programs/isolated.d.ts.map +1 -0
- package/dist/device/tools/programs/isolated.js +84 -0
- package/dist/device/tools/programs/isolated.js.map +1 -0
- package/dist/device/tools/programs/programs.d.ts +36 -0
- package/dist/device/tools/programs/programs.d.ts.map +1 -0
- package/dist/device/tools/programs/programs.js +426 -0
- package/dist/device/tools/programs/programs.js.map +1 -0
- package/dist/device/tools/programs/tunnel.d.ts +6 -0
- package/dist/device/tools/programs/tunnel.d.ts.map +1 -0
- package/dist/device/tools/programs/tunnel.js +69 -0
- package/dist/device/tools/programs/tunnel.js.map +1 -0
- package/package.json +8 -8
|
@@ -2,7 +2,7 @@ import { execFile } from "node:child_process";
|
|
|
2
2
|
import { arch, hostname, platform, release, type } from "node:os";
|
|
3
3
|
import { homeDir } from "@intentic/local-agent";
|
|
4
4
|
import { promisify } from "node:util";
|
|
5
|
-
import { DEVICE_FEATURE_LOOPBACK_CATCH, DEVICE_FEATURE_PROJECT_DELIVERY } from "@intentic/sandbox-contract";
|
|
5
|
+
import { DEVICE_FEATURE_LOOPBACK_CATCH, DEVICE_FEATURE_PROGRAMS, DEVICE_FEATURE_PROJECT_DELIVERY } from "@intentic/sandbox-contract";
|
|
6
6
|
import { readLinkStates, unreachableIn } from "../config.js";
|
|
7
7
|
import { rootsOf, rootsText } from "../policy.js";
|
|
8
8
|
import { shellFor } from "./shell.js";
|
|
@@ -68,7 +68,7 @@ export const hostFacts = async (scopes) => {
|
|
|
68
68
|
...(wsl === undefined ? {} : { wsl }),
|
|
69
69
|
...(distros === undefined ? {} : { wslDistros: distros }),
|
|
70
70
|
...(links === undefined ? {} : { links }),
|
|
71
|
-
features: [...features, DEVICE_FEATURE_LOOPBACK_CATCH, DEVICE_FEATURE_PROJECT_DELIVERY],
|
|
71
|
+
features: [...features, DEVICE_FEATURE_LOOPBACK_CATCH, DEVICE_FEATURE_PROJECT_DELIVERY, DEVICE_FEATURE_PROGRAMS],
|
|
72
72
|
};
|
|
73
73
|
if (stale !== undefined) {
|
|
74
74
|
facts.icOutOfDate = stale;
|
|
@@ -102,7 +102,7 @@ export const describeText = async (scopes) => {
|
|
|
102
102
|
`Home: ${facts.home}`,
|
|
103
103
|
`Folders you may read and write: ${rootsText(facts.roots)}`,
|
|
104
104
|
...environmentLines(facts),
|
|
105
|
-
`Permissions: run commands ${scopes.shell}, run destructive commands ${scopes.destructive}, write files ${scopes.write}, see the screen ${scopes.screen}, use the mouse and keyboard ${scopes.control}, manage sandboxes ${scopes.sandboxes}`,
|
|
105
|
+
`Permissions: run commands ${scopes.shell}, run destructive commands ${scopes.destructive}, write files ${scopes.write}, see the screen ${scopes.screen}, use the mouse and keyboard ${scopes.control}, manage sandboxes ${scopes.sandboxes}, run programs this sandbox sends ${scopes.programs}`,
|
|
106
106
|
...(facts.icOutOfDate === undefined ? [] : [facts.icOutOfDate]),
|
|
107
107
|
...(facts.engine === undefined
|
|
108
108
|
? []
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../../../src/device/tools/describe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,6BAA6B,EAAE,+BAA+B,EAAuC,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"describe.js","sourceRoot":"","sources":["../../../src/device/tools/describe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DeviceScopes, StageArtifact, StageArtifactResult } from "@intentic/sandbox-contract";
|
|
2
|
+
export declare const runsRoot: () => string;
|
|
3
|
+
export declare const sandboxRunsDir: (sandboxUrl: string) => string;
|
|
4
|
+
export declare const inRuns: (path: string, sandboxUrl: string) => boolean;
|
|
5
|
+
export declare const stageArtifact: (op: StageArtifact, scopes: DeviceScopes, sandboxUrl: string) => Promise<StageArtifactResult>;
|
|
6
|
+
export declare const listArtifacts: (sandboxUrl: string) => Promise<{
|
|
7
|
+
name: string;
|
|
8
|
+
version: string;
|
|
9
|
+
path: string;
|
|
10
|
+
at: Date;
|
|
11
|
+
}[]>;
|
|
12
|
+
//# sourceMappingURL=artifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../../../src/device/tools/programs/artifacts.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAiBnG,eAAO,MAAM,QAAQ,QAAO,MAA+B,CAAC;AAI5D,eAAO,MAAM,cAAc,eAAgB,MAAM,KAAG,MASnD,CAAC;AAIF,eAAO,MAAM,MAAM,SAAU,MAAM,cAAc,MAAM,KAAG,OAIzD,CAAC;AA4FF,eAAO,MAAM,aAAa,OAAc,aAAa,UAAU,YAAY,cAAc,MAAM,KAAG,OAAO,CAAC,mBAAmB,CA0C5H,CAAC;AAGF,eAAO,MAAM,aAAa,eAAsB,MAAM,KAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,IAAI,CAAA;CAAE,EAAE,CAa3H,CAAC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { mkdir, open, readdir, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
4
|
+
import { join, resolve, sep } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { errorMessage, undefinedIfMissing } from "@intentic/base/errors";
|
|
7
|
+
import { baseDir } from "../../../config.js";
|
|
8
|
+
import { assertScope } from "../../policy.js";
|
|
9
|
+
const exec = promisify(execFile);
|
|
10
|
+
const COMPLETE = ".intentic-complete";
|
|
11
|
+
const STALE_UPLOAD_MS = 60 * 60 * 1000;
|
|
12
|
+
export const runsRoot = () => join(baseDir, "runs");
|
|
13
|
+
export const sandboxRunsDir = (sandboxUrl) => {
|
|
14
|
+
let label = "sandbox";
|
|
15
|
+
try {
|
|
16
|
+
label = new URL(sandboxUrl).hostname.split(".")[0] ?? label;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
}
|
|
20
|
+
const safe = label.replace(/[^A-Za-z0-9-]/g, "-").slice(0, 63) || "sandbox";
|
|
21
|
+
return join(runsRoot(), safe);
|
|
22
|
+
};
|
|
23
|
+
export const inRuns = (path, sandboxUrl) => {
|
|
24
|
+
const root = resolve(sandboxRunsDir(sandboxUrl));
|
|
25
|
+
const target = resolve(path);
|
|
26
|
+
return target === root || target.startsWith(`${root}${sep}`);
|
|
27
|
+
};
|
|
28
|
+
const uploads = new Map();
|
|
29
|
+
const incomingDir = (sandboxUrl) => join(sandboxRunsDir(sandboxUrl), ".incoming");
|
|
30
|
+
const finalDir = (sandboxUrl, name, sha256) => join(sandboxRunsDir(sandboxUrl), name, sha256.slice(0, 12));
|
|
31
|
+
const finalPath = (dir, kind, fileName) => (kind === "file" ? join(dir, fileName) : dir);
|
|
32
|
+
const exists = async (path) => await stat(path).then(() => true, () => false);
|
|
33
|
+
const dropUpload = async (id) => {
|
|
34
|
+
const upload = uploads.get(id);
|
|
35
|
+
if (upload === undefined) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
uploads.delete(id);
|
|
39
|
+
await upload.handle.close().catch(() => undefined);
|
|
40
|
+
await rm(upload.path, { force: true });
|
|
41
|
+
};
|
|
42
|
+
const sweep = async (now) => {
|
|
43
|
+
for (const [id, upload] of uploads) {
|
|
44
|
+
if (now - upload.touched > STALE_UPLOAD_MS) {
|
|
45
|
+
await dropUpload(id);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const uploadFor = async (sandboxUrl, id, offset) => {
|
|
50
|
+
const known = uploads.get(id);
|
|
51
|
+
if (known !== undefined) {
|
|
52
|
+
return known;
|
|
53
|
+
}
|
|
54
|
+
if (offset !== 0) {
|
|
55
|
+
throw new Error(`upload ${id} is not open here (the agent restarted mid-push?): push again`);
|
|
56
|
+
}
|
|
57
|
+
const dir = incomingDir(sandboxUrl);
|
|
58
|
+
await mkdir(dir, { recursive: true });
|
|
59
|
+
const path = join(dir, `${id}.part`);
|
|
60
|
+
const created = { handle: await open(path, "w"), hash: createHash("sha256"), path, received: 0, touched: Date.now() };
|
|
61
|
+
uploads.set(id, created);
|
|
62
|
+
return created;
|
|
63
|
+
};
|
|
64
|
+
const unpack = async (archive, into) => {
|
|
65
|
+
await mkdir(into, { recursive: true });
|
|
66
|
+
try {
|
|
67
|
+
await exec("tar", ["-xf", archive, "-C", into], { windowsHide: true, maxBuffer: 4 * 1024 * 1024 });
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
throw new Error(`could not unpack the pushed folder: ${errorMessage(error)}`, { cause: error });
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
const file = async (upload, op, sandboxUrl) => {
|
|
74
|
+
const dir = finalDir(sandboxUrl, op.name, op.sha256);
|
|
75
|
+
const target = finalPath(dir, op.kind, op.fileName);
|
|
76
|
+
if (await exists(join(dir, COMPLETE))) {
|
|
77
|
+
await rm(upload.path, { force: true });
|
|
78
|
+
return target;
|
|
79
|
+
}
|
|
80
|
+
await rm(dir, { recursive: true, force: true });
|
|
81
|
+
await mkdir(dir, { recursive: true });
|
|
82
|
+
if (op.kind === "file") {
|
|
83
|
+
await rename(upload.path, target);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
try {
|
|
87
|
+
await unpack(upload.path, dir);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
await rm(upload.path, { force: true });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
await writeFile(join(dir, COMPLETE), `${op.sha256}\n`);
|
|
94
|
+
return target;
|
|
95
|
+
};
|
|
96
|
+
export const stageArtifact = async (op, scopes, sandboxUrl) => {
|
|
97
|
+
assertScope(scopes, "programs");
|
|
98
|
+
const now = Date.now();
|
|
99
|
+
await sweep(now);
|
|
100
|
+
switch (op.op) {
|
|
101
|
+
case "have": {
|
|
102
|
+
const dir = finalDir(sandboxUrl, op.name, op.sha256);
|
|
103
|
+
return (await exists(join(dir, COMPLETE))) ? { path: finalPath(dir, op.kind, op.fileName) } : {};
|
|
104
|
+
}
|
|
105
|
+
case "chunk": {
|
|
106
|
+
const upload = await uploadFor(sandboxUrl, op.upload, op.offset);
|
|
107
|
+
if (op.offset !== upload.received) {
|
|
108
|
+
await dropUpload(op.upload);
|
|
109
|
+
throw new Error(`piece at ${op.offset} arrived when ${upload.received} bytes were held: push again`);
|
|
110
|
+
}
|
|
111
|
+
const bytes = Buffer.from(op.data, "base64");
|
|
112
|
+
await upload.handle.write(bytes);
|
|
113
|
+
upload.hash.update(bytes);
|
|
114
|
+
upload.received += bytes.byteLength;
|
|
115
|
+
upload.touched = now;
|
|
116
|
+
return { received: upload.received };
|
|
117
|
+
}
|
|
118
|
+
case "commit": {
|
|
119
|
+
const upload = uploads.get(op.upload) ?? (op.size === 0 ? await uploadFor(sandboxUrl, op.upload, 0) : undefined);
|
|
120
|
+
if (upload === undefined) {
|
|
121
|
+
throw new Error(`upload ${op.upload} is not open here: push again`);
|
|
122
|
+
}
|
|
123
|
+
uploads.delete(op.upload);
|
|
124
|
+
await upload.handle.close();
|
|
125
|
+
const sha256 = upload.hash.digest("hex");
|
|
126
|
+
if (upload.received !== op.size || sha256 !== op.sha256) {
|
|
127
|
+
await rm(upload.path, { force: true });
|
|
128
|
+
throw new Error(`what arrived (${upload.received} bytes, sha256 ${sha256.slice(0, 12)}) is not what was sent (${op.size} bytes, ${op.sha256.slice(0, 12)})`);
|
|
129
|
+
}
|
|
130
|
+
return { path: await file(upload, op, sandboxUrl) };
|
|
131
|
+
}
|
|
132
|
+
case "abort": {
|
|
133
|
+
await dropUpload(op.upload);
|
|
134
|
+
return {};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
export const listArtifacts = async (sandboxUrl) => {
|
|
139
|
+
const root = sandboxRunsDir(sandboxUrl);
|
|
140
|
+
const names = await readdir(root).catch(() => []);
|
|
141
|
+
const found = [];
|
|
142
|
+
for (const name of names.filter((entry) => !entry.startsWith("."))) {
|
|
143
|
+
for (const version of await readdir(join(root, name)).catch(() => [])) {
|
|
144
|
+
const marker = await stat(join(root, name, version, COMPLETE)).catch(undefinedIfMissing);
|
|
145
|
+
if (marker !== undefined) {
|
|
146
|
+
found.push({ name, version, path: join(root, name, version), at: marker.mtime });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return found.toSorted((a, b) => b.at.getTime() - a.at.getTime());
|
|
151
|
+
};
|
|
152
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../../../src/device/tools/programs/artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const SANDBOX_APP_DIR = "C:\\app";
|
|
2
|
+
export declare const SANDBOX_LOG_DIR = "C:\\intentic-log";
|
|
3
|
+
export declare const SANDBOX_CLIENTS: readonly ["WindowsSandbox.exe", "WindowsSandboxClient.exe", "WindowsSandboxRemoteSession.exe"];
|
|
4
|
+
export declare const windowsSandboxExe: () => string;
|
|
5
|
+
export declare const windowsSandboxMissing: () => Promise<string | undefined>;
|
|
6
|
+
export declare const psQuote: (text: string) => string;
|
|
7
|
+
export interface IsolatedSpec {
|
|
8
|
+
readonly appFolder: string;
|
|
9
|
+
readonly program: string;
|
|
10
|
+
readonly args: readonly string[];
|
|
11
|
+
readonly env: Readonly<Record<string, string>>;
|
|
12
|
+
readonly logFolder: string;
|
|
13
|
+
readonly network: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare const wsbConfig: (spec: IsolatedSpec) => string;
|
|
16
|
+
export declare const startScript: (spec: IsolatedSpec) => string;
|
|
17
|
+
export declare const windowsSandboxRunning: () => Promise<boolean>;
|
|
18
|
+
export declare const stopWindowsSandbox: () => Promise<void>;
|
|
19
|
+
export declare const isolatedExit: (text: string | undefined) => string | undefined;
|
|
20
|
+
//# sourceMappingURL=isolated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolated.d.ts","sourceRoot":"","sources":["../../../../src/device/tools/programs/isolated.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,eAAe,YAAY,CAAC;AACzC,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAGlD,eAAO,MAAM,eAAe,YAAI,oBAAoB,EAAE,0BAA0B,EAAE,iCAAiC,CAAU,CAAC;AAE9H,eAAO,MAAM,iBAAiB,QAAO,MAA4F,CAAC;AAGlI,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,MAAM,GAAG,SAAS,CAWxE,CAAC;AAIF,eAAO,MAAM,OAAO,SAAU,MAAM,KAAG,MAAyC,CAAC;AAEjF,MAAM,WAAW,YAAY;IAEzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAE/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC7B;AAGD,eAAO,MAAM,SAAS,SAAU,YAAY,KAAG,MAyB7B,CAAC;AAGnB,eAAO,MAAM,WAAW,SAAU,YAAY,KAAG,MAiBhD,CAAC;AAGF,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,OAAO,CAO7D,CAAC;AAGF,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,IAAI,CAMvD,CAAC;AAGF,eAAO,MAAM,YAAY,SAAU,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,SAMhE,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { stat } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { promisify } from "node:util";
|
|
5
|
+
const exec = promisify(execFile);
|
|
6
|
+
export const SANDBOX_APP_DIR = "C:\\app";
|
|
7
|
+
export const SANDBOX_LOG_DIR = "C:\\intentic-log";
|
|
8
|
+
export const SANDBOX_CLIENTS = ["WindowsSandbox.exe", "WindowsSandboxClient.exe", "WindowsSandboxRemoteSession.exe"];
|
|
9
|
+
export const windowsSandboxExe = () => join(process.env["SystemRoot"] ?? "C:\\Windows", "System32", "WindowsSandbox.exe");
|
|
10
|
+
export const windowsSandboxMissing = async () => {
|
|
11
|
+
if (process.platform !== "win32") {
|
|
12
|
+
return "Isolated runs use Windows Sandbox, which only Windows has: start it without `isolated` here.";
|
|
13
|
+
}
|
|
14
|
+
const there = await stat(windowsSandboxExe()).then(() => true, () => false);
|
|
15
|
+
return there
|
|
16
|
+
? undefined
|
|
17
|
+
: "Windows Sandbox is not turned on here. On Windows Pro, Enterprise or Education an administrator turns it on with `Enable-WindowsOptionalFeature -Online -FeatureName Containers-DisposableClientVM -All` and a restart (virtualization must be on in the firmware); Windows Home does not have it. Start it without `isolated` meanwhile.";
|
|
18
|
+
};
|
|
19
|
+
const xml = (text) => text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
20
|
+
export const psQuote = (text) => `'${text.replace(/'/g, "''")}'`;
|
|
21
|
+
export const wsbConfig = (spec) => [
|
|
22
|
+
"<Configuration>",
|
|
23
|
+
` <Networking>${spec.network ? "Enable" : "Disable"}</Networking>`,
|
|
24
|
+
" <ClipboardRedirection>Disable</ClipboardRedirection>",
|
|
25
|
+
" <PrinterRedirection>Disable</PrinterRedirection>",
|
|
26
|
+
" <AudioInput>Disable</AudioInput>",
|
|
27
|
+
" <VideoInput>Disable</VideoInput>",
|
|
28
|
+
" <MappedFolders>",
|
|
29
|
+
" <MappedFolder>",
|
|
30
|
+
` <HostFolder>${xml(spec.appFolder)}</HostFolder>`,
|
|
31
|
+
` <SandboxFolder>${SANDBOX_APP_DIR}</SandboxFolder>`,
|
|
32
|
+
" <ReadOnly>true</ReadOnly>",
|
|
33
|
+
" </MappedFolder>",
|
|
34
|
+
" <MappedFolder>",
|
|
35
|
+
` <HostFolder>${xml(spec.logFolder)}</HostFolder>`,
|
|
36
|
+
` <SandboxFolder>${SANDBOX_LOG_DIR}</SandboxFolder>`,
|
|
37
|
+
" <ReadOnly>false</ReadOnly>",
|
|
38
|
+
" </MappedFolder>",
|
|
39
|
+
" </MappedFolders>",
|
|
40
|
+
" <LogonCommand>",
|
|
41
|
+
` <Command>powershell.exe -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File ${SANDBOX_LOG_DIR}\\start.ps1</Command>`,
|
|
42
|
+
" </LogonCommand>",
|
|
43
|
+
"</Configuration>",
|
|
44
|
+
"",
|
|
45
|
+
].join("\r\n");
|
|
46
|
+
export const startScript = (spec) => {
|
|
47
|
+
const program = `${SANDBOX_APP_DIR}\\${spec.program.replace(/\//g, "\\")}`;
|
|
48
|
+
const log = (name) => psQuote(`${SANDBOX_LOG_DIR}\\${name}`);
|
|
49
|
+
const args = spec.args.length === 0 ? "" : ` -ArgumentList @(${spec.args.map((arg) => psQuote(arg.includes(" ") ? `"${arg}"` : arg)).join(", ")})`;
|
|
50
|
+
return [
|
|
51
|
+
"$ErrorActionPreference = 'Stop'",
|
|
52
|
+
...Object.entries(spec.env).map(([key, value]) => `[Environment]::SetEnvironmentVariable(${psQuote(key)}, ${psQuote(value)}, 'Process')`),
|
|
53
|
+
`Set-Content -Path ${log("started")} -Value (Get-Date -Format o)`,
|
|
54
|
+
"try {",
|
|
55
|
+
` $p = Start-Process -FilePath ${psQuote(program)}${args} -WorkingDirectory ${psQuote(SANDBOX_APP_DIR)} -RedirectStandardOutput ${log("output.log")} -RedirectStandardError ${log("error.log")} -PassThru -Wait`,
|
|
56
|
+
` Set-Content -Path ${log("exit-code")} -Value $p.ExitCode`,
|
|
57
|
+
"} catch {",
|
|
58
|
+
` Add-Content -Path ${log("error.log")} -Value $_.Exception.Message`,
|
|
59
|
+
` Set-Content -Path ${log("exit-code")} -Value 'start-failed'`,
|
|
60
|
+
"}",
|
|
61
|
+
"",
|
|
62
|
+
].join("\r\n");
|
|
63
|
+
};
|
|
64
|
+
export const windowsSandboxRunning = async () => {
|
|
65
|
+
if (process.platform !== "win32") {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
const { stdout } = await exec("tasklist", ["/FO", "CSV", "/NH"], { windowsHide: true, maxBuffer: 8 * 1024 * 1024 });
|
|
69
|
+
const names = new Set(stdout.split(/\r?\n/).map((line) => line.split('","')[0]?.replace(/^"/, "").toLowerCase()));
|
|
70
|
+
return SANDBOX_CLIENTS.some((name) => names.has(name.toLowerCase()));
|
|
71
|
+
};
|
|
72
|
+
export const stopWindowsSandbox = async () => {
|
|
73
|
+
for (const name of SANDBOX_CLIENTS) {
|
|
74
|
+
await exec("taskkill", ["/IM", name, "/T", "/F"], { windowsHide: true }).catch(() => undefined);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
export const isolatedExit = (text) => {
|
|
78
|
+
const said = text?.trim();
|
|
79
|
+
if (said === undefined || said === "") {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
return said === "start-failed" ? "the program could not be started inside the sandbox (see its error output)" : `the program inside ended with code ${said}`;
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=isolated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolated.js","sourceRoot":"","sources":["../../../../src/device/tools/programs/isolated.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Desktop } from "@intentic/desktop-automation";
|
|
2
|
+
import type { DeviceScopes } from "@intentic/sandbox-contract";
|
|
3
|
+
export interface AppRun {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly program: string;
|
|
7
|
+
readonly args: readonly string[];
|
|
8
|
+
readonly cwd: string;
|
|
9
|
+
readonly pid: number;
|
|
10
|
+
readonly startedAt: string;
|
|
11
|
+
readonly log: string;
|
|
12
|
+
readonly endedAt?: string;
|
|
13
|
+
readonly exitCode?: number;
|
|
14
|
+
readonly signal?: string;
|
|
15
|
+
readonly stoppedByAgent?: boolean;
|
|
16
|
+
readonly isolated?: true;
|
|
17
|
+
}
|
|
18
|
+
export interface StartRequest {
|
|
19
|
+
readonly program: string;
|
|
20
|
+
readonly args?: readonly string[] | undefined;
|
|
21
|
+
readonly cwd?: string | undefined;
|
|
22
|
+
readonly env?: Readonly<Record<string, string>> | undefined;
|
|
23
|
+
readonly name?: string | undefined;
|
|
24
|
+
readonly isolated?: boolean | undefined;
|
|
25
|
+
readonly network?: boolean | undefined;
|
|
26
|
+
}
|
|
27
|
+
export declare const DEFAULT_LOG_LINES = 200;
|
|
28
|
+
export declare const MAX_LOG_LINES = 2000;
|
|
29
|
+
export declare const describeExit: (run: Pick<AppRun, "exitCode" | "signal" | "stoppedByAgent">) => string;
|
|
30
|
+
export declare const startApp: (request: StartRequest, scopes: DeviceScopes, sandboxUrl: string) => Promise<string>;
|
|
31
|
+
export declare const descendantsOf: (rows: readonly (readonly [number, number])[], root: number) => Set<number>;
|
|
32
|
+
export declare const parseRows: (text: string) => [number, number][];
|
|
33
|
+
export declare const appStatus: (id: string | undefined, scopes: DeviceScopes, sandboxUrl: string, screen: () => Desktop) => Promise<string>;
|
|
34
|
+
export declare const appLogs: (id: string, lines: number, grep: string | undefined, scopes: DeviceScopes, sandboxUrl: string) => Promise<string>;
|
|
35
|
+
export declare const appStop: (id: string, force: boolean, scopes: DeviceScopes, sandboxUrl: string) => Promise<string>;
|
|
36
|
+
//# sourceMappingURL=programs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"programs.d.ts","sourceRoot":"","sources":["../../../../src/device/tools/programs/programs.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAc,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAgB/D,MAAM,WAAW,MAAM;IACnB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAGlC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1C;AAUD,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,aAAa,OAAO,CAAC;AAiFlC,eAAO,MAAM,YAAY,QAAS,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,gBAAgB,CAAC,KAAG,MAiB1F,CAAC;AA6DF,eAAO,MAAM,QAAQ,YAAmB,YAAY,UAAU,YAAY,cAAc,MAAM,KAAG,OAAO,CAAC,MAAM,CA2D9G,CAAC;AAuEF,eAAO,MAAM,aAAa,SAAU,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,MAAM,KAAG,GAAG,CAAC,MAAM,CAapG,CAAC;AAeF,eAAO,MAAM,SAAS,SAAU,MAAM,KAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAInD,CAAC;AAiCP,eAAO,MAAM,SAAS,OAAc,MAAM,GAAG,SAAS,UAAU,YAAY,cAAc,MAAM,UAAU,MAAM,OAAO,KAAG,OAAO,CAAC,MAAM,CA2CvI,CAAC;AAEF,eAAO,MAAM,OAAO,OAAc,MAAM,SAAS,MAAM,QAAQ,MAAM,GAAG,SAAS,UAAU,YAAY,cAAc,MAAM,KAAG,OAAO,CAAC,MAAM,CAqB3I,CAAC;AA2BF,eAAO,MAAM,OAAO,OAAc,MAAM,SAAS,OAAO,UAAU,YAAY,cAAc,MAAM,KAAG,OAAO,CAAC,MAAM,CA4BlH,CAAC"}
|