remotelink 0.3.11 → 0.3.13
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/README.md +13 -7
- package/dist/index.js +173 -17
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -78,11 +78,12 @@ Remote Arc snapshots the previous local file state before supported
|
|
|
78
78
|
`write_file` and `edit_block` operations. These snapshots stay under
|
|
79
79
|
`~/.remotearc/undo` on the device and are never uploaded to Remote Arc Cloud.
|
|
80
80
|
|
|
81
|
-
The `undo_last_change` skill
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
81
|
+
The `undo_last_change` skill controls whether an AI may invoke the newest
|
|
82
|
+
reversible Remote Arc file change. Snapshot creation is a separate per-device
|
|
83
|
+
Recovery setting in the dashboard. The dashboard can also list local undo
|
|
84
|
+
metadata on demand and restore a specific action without uploading snapshot
|
|
85
|
+
contents. Snapshots expire after 7 days, use at most 200 MB in total, and files
|
|
86
|
+
larger than 20 MB are not snapshotted.
|
|
86
87
|
|
|
87
88
|
Local Undo covers Remote Arc file writes only. It cannot reverse external side
|
|
88
89
|
effects such as publishing a package, deploying cloud infrastructure, sending a
|
|
@@ -91,7 +92,9 @@ request to another service, or mutating a remote database.
|
|
|
91
92
|
## Workspace and sensitive-path policy
|
|
92
93
|
|
|
93
94
|
The dashboard can configure allowed workspace roots, additional protected
|
|
94
|
-
paths, and narrow sensitive-path exceptions per device.
|
|
95
|
+
paths, and narrow sensitive-path exceptions per device. Online devices also
|
|
96
|
+
support a local directory picker so workspace roots can be selected without
|
|
97
|
+
typing paths manually. Sensitive-path
|
|
95
98
|
protection stays on by default for common credential locations and `.env`
|
|
96
99
|
files; an exception bypasses only sensitive-path protection, not Workspace
|
|
97
100
|
Scope.
|
|
@@ -112,7 +115,8 @@ the local execution core.
|
|
|
112
115
|
Full mode also supports managed background processes. `start_process` can
|
|
113
116
|
return a local process id, and `process_status`, `process_output`, and
|
|
114
117
|
`stop_process` manage that process without introducing another execution
|
|
115
|
-
backend.
|
|
118
|
+
backend. The authenticated dashboard can list Remote Arc-managed jobs, inspect
|
|
119
|
+
their captured output, and stop a running job on demand.
|
|
116
120
|
|
|
117
121
|
## Security
|
|
118
122
|
|
|
@@ -120,6 +124,8 @@ backend.
|
|
|
120
124
|
- Raw device credentials are not stored in the hosted database.
|
|
121
125
|
- Connections are initiated outbound from your computer.
|
|
122
126
|
- MCP access uses OAuth 2.1 + PKCE.
|
|
127
|
+
- Each AI OAuth authorization is shown separately as active, refreshable, or expired.
|
|
128
|
+
- Revoking one AI authorization does not revoke paired computers or other AI grants.
|
|
123
129
|
- Device access is scoped to the authenticated Remote Arc account.
|
|
124
130
|
- You can revoke paired devices from the Remote Arc dashboard.
|
|
125
131
|
- Supported file changes can be rolled back from local-only snapshots.
|
package/dist/index.js
CHANGED
|
@@ -149,6 +149,35 @@ async function editTextBlock(filePath, oldString, newString, expectedReplacement
|
|
|
149
149
|
atomic: true
|
|
150
150
|
};
|
|
151
151
|
}
|
|
152
|
+
async function browseDirectories(targetPath, canReveal) {
|
|
153
|
+
const stat = await fs.stat(targetPath);
|
|
154
|
+
if (!stat.isDirectory()) throw new Error("Path is not a directory: " + targetPath);
|
|
155
|
+
const entries = await fs.readdir(targetPath, { withFileTypes: true });
|
|
156
|
+
const directories = [];
|
|
157
|
+
let protectedEntries = 0;
|
|
158
|
+
for (const entry of entries) {
|
|
159
|
+
if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;
|
|
160
|
+
const absolute = path.join(targetPath, entry.name);
|
|
161
|
+
if (canReveal && !await canReveal(absolute)) {
|
|
162
|
+
protectedEntries += 1;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
directories.push({
|
|
166
|
+
name: entry.name,
|
|
167
|
+
path: absolute,
|
|
168
|
+
type: entry.isSymbolicLink() ? "symlink" : "directory"
|
|
169
|
+
});
|
|
170
|
+
if (directories.length >= 300) break;
|
|
171
|
+
}
|
|
172
|
+
directories.sort((a, b) => a.name.localeCompare(b.name));
|
|
173
|
+
return {
|
|
174
|
+
path: targetPath,
|
|
175
|
+
parent: path.dirname(targetPath) === targetPath ? null : path.dirname(targetPath),
|
|
176
|
+
directories,
|
|
177
|
+
protected_entries_omitted: protectedEntries,
|
|
178
|
+
truncated: directories.length >= 300
|
|
179
|
+
};
|
|
180
|
+
}
|
|
152
181
|
|
|
153
182
|
// ../execution-core/src/process.ts
|
|
154
183
|
import { execFile, spawn } from "child_process";
|
|
@@ -381,6 +410,23 @@ async function stopAllManagedProcesses() {
|
|
|
381
410
|
})
|
|
382
411
|
);
|
|
383
412
|
}
|
|
413
|
+
function listManagedProcesses() {
|
|
414
|
+
cleanupManagedProcesses();
|
|
415
|
+
return [...managedProcesses.values()].sort((a, b) => b.startedAt - a.startedAt).map((item) => ({
|
|
416
|
+
process_id: item.id,
|
|
417
|
+
pid: item.child.pid || null,
|
|
418
|
+
command: item.command,
|
|
419
|
+
cwd: item.cwd,
|
|
420
|
+
status: item.endedAt === null ? "running" : "exited",
|
|
421
|
+
exit_code: item.exitCode,
|
|
422
|
+
signal: item.signal,
|
|
423
|
+
started_at: new Date(item.startedAt).toISOString(),
|
|
424
|
+
ended_at: item.endedAt === null ? null : new Date(item.endedAt).toISOString(),
|
|
425
|
+
duration_ms: (item.endedAt || Date.now()) - item.startedAt,
|
|
426
|
+
stdout_bytes: Buffer.byteLength(item.stdout),
|
|
427
|
+
stderr_bytes: Buffer.byteLength(item.stderr)
|
|
428
|
+
}));
|
|
429
|
+
}
|
|
384
430
|
|
|
385
431
|
// ../execution-core/src/safety.ts
|
|
386
432
|
import crypto3 from "crypto";
|
|
@@ -786,6 +832,7 @@ function normalizePolicy(policy) {
|
|
|
786
832
|
// ../execution-core/src/core.ts
|
|
787
833
|
var SAFE_TOOLS = /* @__PURE__ */ new Set([
|
|
788
834
|
"list_directory",
|
|
835
|
+
"browse_directories",
|
|
789
836
|
"read_file",
|
|
790
837
|
"get_file_info",
|
|
791
838
|
"list_processes",
|
|
@@ -803,6 +850,7 @@ var FULL_TOOLS = /* @__PURE__ */ new Set([
|
|
|
803
850
|
"start_process",
|
|
804
851
|
"process_status",
|
|
805
852
|
"process_output",
|
|
853
|
+
"list_managed_processes",
|
|
806
854
|
"stop_process"
|
|
807
855
|
]);
|
|
808
856
|
var DEFINITIONS = [
|
|
@@ -819,6 +867,18 @@ var DEFINITIONS = [
|
|
|
819
867
|
additionalProperties: false
|
|
820
868
|
}
|
|
821
869
|
},
|
|
870
|
+
{
|
|
871
|
+
name: "browse_directories",
|
|
872
|
+
description: "List child directories for the Remote Arc dashboard directory picker.",
|
|
873
|
+
inputSchema: {
|
|
874
|
+
type: "object",
|
|
875
|
+
properties: {
|
|
876
|
+
path: { type: "string" }
|
|
877
|
+
},
|
|
878
|
+
required: ["path"],
|
|
879
|
+
additionalProperties: false
|
|
880
|
+
}
|
|
881
|
+
},
|
|
822
882
|
{
|
|
823
883
|
name: "read_file",
|
|
824
884
|
description: "Read a text file by line range. Negative offsets read from the end.",
|
|
@@ -940,6 +1000,15 @@ var DEFINITIONS = [
|
|
|
940
1000
|
additionalProperties: false
|
|
941
1001
|
}
|
|
942
1002
|
},
|
|
1003
|
+
{
|
|
1004
|
+
name: "list_managed_processes",
|
|
1005
|
+
description: "List background processes started and managed by Remote Arc on this device.",
|
|
1006
|
+
inputSchema: {
|
|
1007
|
+
type: "object",
|
|
1008
|
+
properties: {},
|
|
1009
|
+
additionalProperties: false
|
|
1010
|
+
}
|
|
1011
|
+
},
|
|
943
1012
|
{
|
|
944
1013
|
name: "stop_process",
|
|
945
1014
|
description: "Stop a Remote Arc managed background process and its child process tree.",
|
|
@@ -1010,6 +1079,22 @@ var RemoteArcExecutionCore = class {
|
|
|
1010
1079
|
)
|
|
1011
1080
|
);
|
|
1012
1081
|
}
|
|
1082
|
+
case "browse_directories": {
|
|
1083
|
+
const target = await enforcePathPolicy(requiredString(args, "path"), policy);
|
|
1084
|
+
return textResult(
|
|
1085
|
+
await browseDirectories(
|
|
1086
|
+
target,
|
|
1087
|
+
async (candidate) => {
|
|
1088
|
+
try {
|
|
1089
|
+
await enforcePathPolicy(candidate, policy);
|
|
1090
|
+
return true;
|
|
1091
|
+
} catch {
|
|
1092
|
+
return false;
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
)
|
|
1096
|
+
);
|
|
1097
|
+
}
|
|
1013
1098
|
case "read_file": {
|
|
1014
1099
|
const target = await enforcePathPolicy(requiredString(args, "path"), policy);
|
|
1015
1100
|
return textResult(
|
|
@@ -1093,6 +1178,8 @@ var RemoteArcExecutionCore = class {
|
|
|
1093
1178
|
return textResult(
|
|
1094
1179
|
readManagedProcessOutput(requiredString(args, "process_id"))
|
|
1095
1180
|
);
|
|
1181
|
+
case "list_managed_processes":
|
|
1182
|
+
return textResult(listManagedProcesses());
|
|
1096
1183
|
case "stop_process":
|
|
1097
1184
|
return textResult(
|
|
1098
1185
|
await stopManagedProcess(requiredString(args, "process_id"))
|
|
@@ -1135,11 +1222,32 @@ var RemoteArcExecutionCore = class {
|
|
|
1135
1222
|
};
|
|
1136
1223
|
|
|
1137
1224
|
// src/index.ts
|
|
1138
|
-
var VERSION = "0.3.
|
|
1225
|
+
var VERSION = "0.3.13";
|
|
1139
1226
|
var DEFAULT_ORIGIN = "https://mcp.remotearc.app";
|
|
1140
1227
|
var CONFIG_DIR = path4.join(os3.homedir(), ".remotearc");
|
|
1141
1228
|
var CONFIG_PATH = path4.join(CONFIG_DIR, "config.json");
|
|
1142
1229
|
var LEGACY_CONFIG_PATH = path4.join(os3.homedir(), ".remote-link", "config.json");
|
|
1230
|
+
var RevokedDeviceCredentialError = class extends Error {
|
|
1231
|
+
constructor() {
|
|
1232
|
+
super("Saved device credential has been revoked.");
|
|
1233
|
+
this.name = "RevokedDeviceCredentialError";
|
|
1234
|
+
}
|
|
1235
|
+
};
|
|
1236
|
+
async function validateSavedPairing(config) {
|
|
1237
|
+
try {
|
|
1238
|
+
const response = await fetch(new URL("/api/device/heartbeat", config.origin), {
|
|
1239
|
+
method: "POST",
|
|
1240
|
+
headers: { Authorization: "Bearer " + config.deviceToken }
|
|
1241
|
+
});
|
|
1242
|
+
if (response.status === 401 || response.status === 403) {
|
|
1243
|
+
throw new RevokedDeviceCredentialError();
|
|
1244
|
+
}
|
|
1245
|
+
return;
|
|
1246
|
+
} catch (error) {
|
|
1247
|
+
if (error instanceof RevokedDeviceCredentialError) throw error;
|
|
1248
|
+
return;
|
|
1249
|
+
}
|
|
1250
|
+
}
|
|
1143
1251
|
var sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
1144
1252
|
var supportsColor = process3.stdout.isTTY && !process3.env.NO_COLOR;
|
|
1145
1253
|
var paint = (code, value) => supportsColor ? `\x1B[${code}m${value}\x1B[0m` : value;
|
|
@@ -1303,13 +1411,24 @@ async function connectAgent(config) {
|
|
|
1303
1411
|
const tools = await core.tools();
|
|
1304
1412
|
logLine("success", `Local tools ready: ${tools.length} exposed`);
|
|
1305
1413
|
process3.stdout.write(" " + dim(tools.map((tool) => tool.name).join(" \xB7 ")) + "\n");
|
|
1414
|
+
try {
|
|
1415
|
+
await validateSavedPairing(config);
|
|
1416
|
+
} catch (error) {
|
|
1417
|
+
if (error instanceof RevokedDeviceCredentialError) {
|
|
1418
|
+
logLine("warn", error.message);
|
|
1419
|
+
await resetConfig();
|
|
1420
|
+
logLine("event", "Starting a fresh device pairing\u2026");
|
|
1421
|
+
await core.close().catch(() => void 0);
|
|
1422
|
+
return "rePair";
|
|
1423
|
+
}
|
|
1424
|
+
throw error;
|
|
1425
|
+
}
|
|
1306
1426
|
const wsUrl = new URL("/agent", config.origin.replace(/^http/, "ws"));
|
|
1307
1427
|
let stopped = false;
|
|
1308
1428
|
let backoff = 1e3;
|
|
1309
1429
|
const shutdown = async () => {
|
|
1310
1430
|
stopped = true;
|
|
1311
1431
|
await core.close().catch(() => void 0);
|
|
1312
|
-
process3.exit(0);
|
|
1313
1432
|
};
|
|
1314
1433
|
process3.on("SIGINT", shutdown);
|
|
1315
1434
|
process3.on("SIGTERM", shutdown);
|
|
@@ -1322,8 +1441,34 @@ async function connectAgent(config) {
|
|
|
1322
1441
|
});
|
|
1323
1442
|
try {
|
|
1324
1443
|
await new Promise((resolve, reject) => {
|
|
1325
|
-
|
|
1326
|
-
|
|
1444
|
+
const onOpen = () => {
|
|
1445
|
+
cleanup();
|
|
1446
|
+
resolve();
|
|
1447
|
+
};
|
|
1448
|
+
const onError = (error) => {
|
|
1449
|
+
cleanup();
|
|
1450
|
+
reject(error);
|
|
1451
|
+
};
|
|
1452
|
+
const onUnexpectedResponse = (_request, response) => {
|
|
1453
|
+
cleanup();
|
|
1454
|
+
if (response.statusCode === 401 || response.statusCode === 403) {
|
|
1455
|
+
reject(new RevokedDeviceCredentialError());
|
|
1456
|
+
return;
|
|
1457
|
+
}
|
|
1458
|
+
reject(
|
|
1459
|
+
new Error(
|
|
1460
|
+
"Unexpected relay response: " + String(response.statusCode || "unknown")
|
|
1461
|
+
)
|
|
1462
|
+
);
|
|
1463
|
+
};
|
|
1464
|
+
const cleanup = () => {
|
|
1465
|
+
ws.off("open", onOpen);
|
|
1466
|
+
ws.off("error", onError);
|
|
1467
|
+
ws.off("unexpected-response", onUnexpectedResponse);
|
|
1468
|
+
};
|
|
1469
|
+
ws.once("open", onOpen);
|
|
1470
|
+
ws.once("error", onError);
|
|
1471
|
+
ws.once("unexpected-response", onUnexpectedResponse);
|
|
1327
1472
|
});
|
|
1328
1473
|
backoff = 1e3;
|
|
1329
1474
|
ws.send(
|
|
@@ -1402,6 +1547,13 @@ async function connectAgent(config) {
|
|
|
1402
1547
|
});
|
|
1403
1548
|
clearInterval(heartbeatTimer);
|
|
1404
1549
|
} catch (error) {
|
|
1550
|
+
if (error instanceof RevokedDeviceCredentialError) {
|
|
1551
|
+
logLine("warn", error.message);
|
|
1552
|
+
await resetConfig();
|
|
1553
|
+
logLine("event", "Starting a fresh device pairing\u2026");
|
|
1554
|
+
await core.close().catch(() => void 0);
|
|
1555
|
+
return "rePair";
|
|
1556
|
+
}
|
|
1405
1557
|
logLine(
|
|
1406
1558
|
"error",
|
|
1407
1559
|
"Relay connection failed: " + (error instanceof Error ? error.message : String(error))
|
|
@@ -1419,6 +1571,8 @@ async function connectAgent(config) {
|
|
|
1419
1571
|
backoff = Math.min(backoff * 2, 3e4);
|
|
1420
1572
|
}
|
|
1421
1573
|
}
|
|
1574
|
+
await core.close().catch(() => void 0);
|
|
1575
|
+
return "stopped";
|
|
1422
1576
|
}
|
|
1423
1577
|
async function main() {
|
|
1424
1578
|
if (argFlag("--help") || argFlag("-h")) {
|
|
@@ -1453,21 +1607,23 @@ async function main() {
|
|
|
1453
1607
|
}
|
|
1454
1608
|
const origin = process3.env.REMOTEARC_ORIGIN || process3.env.REMOTE_LINK_ORIGIN || process3.argv.find((value) => value.startsWith("--origin="))?.slice(9) || DEFAULT_ORIGIN;
|
|
1455
1609
|
let config = await readConfig();
|
|
1456
|
-
|
|
1457
|
-
config.origin
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1610
|
+
while (true) {
|
|
1611
|
+
if (config && ["https://remote.samyao.me", "https://remotearc.app"].includes(config.origin)) {
|
|
1612
|
+
config.origin = DEFAULT_ORIGIN;
|
|
1613
|
+
await writeConfig(config);
|
|
1614
|
+
logLine("info", "Migrated relay origin to " + DEFAULT_ORIGIN);
|
|
1615
|
+
}
|
|
1616
|
+
if (!config) {
|
|
1617
|
+
config = await pair(origin, selectedMode());
|
|
1618
|
+
} else if (argFlag("--safe") || argFlag("--developer")) {
|
|
1619
|
+
config.mode = argFlag("--safe") ? "safe" : "managed";
|
|
1620
|
+
await writeConfig(config);
|
|
1621
|
+
}
|
|
1468
1622
|
logLine("info", `Using paired device identity ${dim(config.deviceId.slice(0, 8))}\u2026`);
|
|
1623
|
+
const result = await connectAgent(config);
|
|
1624
|
+
if (result !== "rePair") return;
|
|
1625
|
+
config = null;
|
|
1469
1626
|
}
|
|
1470
|
-
await connectAgent(config);
|
|
1471
1627
|
}
|
|
1472
1628
|
main().catch((error) => {
|
|
1473
1629
|
logLine(
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../execution-core/src/filesystem.ts","../../execution-core/src/process.ts","../../execution-core/src/safety.ts","../../execution-core/src/policy.ts","../../execution-core/src/core.ts"],"sourcesContent":["#!/usr/bin/env node\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport { spawn } from \"node:child_process\";\nimport process from \"node:process\";\nimport WebSocket from \"ws\";\nimport {\n RemoteArcExecutionCore,\n type ExecutionPolicy,\n} from \"@remotearc/execution-core\";\n\nconst VERSION = \"0.3.11\";\nconst DEFAULT_ORIGIN = \"https://mcp.remotearc.app\";\nconst CONFIG_DIR = path.join(os.homedir(), \".remotearc\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\nconst LEGACY_CONFIG_PATH = path.join(os.homedir(), \".remote-link\", \"config.json\");\n\ntype Mode = \"managed\" | \"safe\" | \"developer\";\n\ntype SavedConfig = {\n deviceId: string;\n deviceToken: string;\n deviceName: string;\n origin: string;\n mode: Mode;\n};\n\ntype PairingStart = {\n device_code: string;\n device_secret: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n};\n\ntype PairingToken = {\n device_id: string;\n device_token: string;\n relay_url: string;\n};\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst supportsColor = process.stdout.isTTY && !process.env.NO_COLOR;\nconst paint = (code: string, value: string) =>\n supportsColor ? `\\x1b[${code}m${value}\\x1b[0m` : value;\nconst dim = (value: string) => paint(\"2\", value);\nconst cyan = (value: string) => paint(\"36\", value);\nconst green = (value: string) => paint(\"32\", value);\nconst yellow = (value: string) => paint(\"33\", value);\nconst red = (value: string) => paint(\"31\", value);\nconst bold = (value: string) => paint(\"1\", value);\n\nfunction nowTime() {\n return new Date().toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n}\n\nfunction logLine(\n level: \"info\" | \"success\" | \"warn\" | \"error\" | \"event\",\n message: string,\n) {\n const icon =\n level === \"success\" ? green(\"✓\") :\n level === \"warn\" ? yellow(\"!\") :\n level === \"error\" ? red(\"×\") :\n level === \"event\" ? cyan(\"→\") :\n cyan(\"•\");\n process.stdout.write(`${dim(nowTime())} ${icon} ${message}\\n`);\n}\n\nfunction banner() {\n process.stdout.write(\"\\n\");\n process.stdout.write(bold(\"Remote Arc\") + \" \" + dim(`v${VERSION}`) + \"\\n\");\n process.stdout.write(dim(\"Secure remote MCP bridge\") + \"\\n\\n\");\n}\n\nfunction argFlag(name: string) {\n return process.argv.includes(name);\n}\n\nfunction selectedMode(): Mode {\n if (argFlag(\"--safe\")) return \"safe\";\n return \"managed\";\n}\n\nfunction isLocalSafeMode(mode: Mode) {\n return mode === \"safe\";\n}\n\nfunction modeLabel(mode: Mode) {\n return isLocalSafeMode(mode) ? \"safe local cap\" : \"dashboard-managed\";\n}\n\nasync function readConfig(): Promise<SavedConfig | null> {\n try {\n return JSON.parse(await fs.readFile(CONFIG_PATH, \"utf8\")) as SavedConfig;\n } catch {\n try {\n const legacy = JSON.parse(\n await fs.readFile(LEGACY_CONFIG_PATH, \"utf8\"),\n ) as SavedConfig;\n await writeConfig(legacy);\n logLine(\"success\", \"Migrated existing Remote Link pairing to Remote Arc.\");\n return legacy;\n } catch {\n return null;\n }\n }\n}\n\nasync function writeConfig(config: SavedConfig) {\n await fs.mkdir(CONFIG_DIR, { recursive: true });\n await fs.writeFile(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", {\n mode: 0o600,\n });\n}\n\nasync function resetConfig() {\n await Promise.all([\n fs.rm(CONFIG_PATH, { force: true }),\n fs.rm(LEGACY_CONFIG_PATH, { force: true }),\n ]);\n logLine(\"success\", \"Removed saved device credentials.\");\n}\n\nfunction openBrowser(url: string) {\n const command =\n process.platform === \"win32\"\n ? \"cmd\"\n : process.platform === \"darwin\"\n ? \"open\"\n : \"xdg-open\";\n const args =\n process.platform === \"win32\"\n ? [\"/c\", \"start\", \"\", url]\n : [url];\n\n const child = spawn(command, args, {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n}\n\nasync function pair(origin: string, mode: Mode): Promise<SavedConfig> {\n const deviceName = os.hostname();\n const response = await fetch(origin + \"/api/device/start\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n device_name: deviceName,\n platform: process.platform,\n arch: process.arch,\n hostname: os.hostname(),\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Could not start device pairing: \" + response.status);\n }\n\n const pairing = (await response.json()) as PairingStart;\n\n banner();\n logLine(\"info\", `Device: ${bold(deviceName)} · ${process.platform}/${process.arch} · ${modeLabel(mode)}`);\n logLine(\"event\", \"Pairing required — opening secure browser approval.\");\n process.stdout.write(\"\\n Pairing code \" + bold(cyan(pairing.user_code)) + \"\\n\");\n process.stdout.write(\" \" + dim(pairing.verification_uri_complete) + \"\\n\\n\");\n openBrowser(pairing.verification_uri_complete);\n logLine(\"info\", \"Waiting for authorization…\");\n\n const startedAt = Date.now();\n while (Date.now() - startedAt < pairing.expires_in * 1000) {\n await sleep(Math.max(pairing.interval, 2) * 1000);\n\n const tokenResponse = await fetch(origin + \"/api/device/token\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n device_code: pairing.device_code,\n device_secret: pairing.device_secret,\n }),\n });\n\n if (tokenResponse.status === 428) {\n if (process.stdout.isTTY) process.stdout.write(dim(\"·\"));\n continue;\n }\n\n if (!tokenResponse.ok) {\n const body = await tokenResponse.text();\n throw new Error(\"Pairing failed: \" + body);\n }\n\n const result = (await tokenResponse.json()) as PairingToken;\n process.stdout.write(\"\\n\");\n logLine(\"success\", \"Device authorized.\");\n\n const config: SavedConfig = {\n deviceId: result.device_id,\n deviceToken: result.device_token,\n deviceName,\n origin,\n mode,\n };\n await writeConfig(config);\n return config;\n }\n\n throw new Error(\"Pairing expired. Run Remote Arc again to retry.\");\n}\n\nclass ExecutionCore {\n private readonly core: RemoteArcExecutionCore;\n\n constructor(mode: Mode) {\n this.core = new RemoteArcExecutionCore(\n isLocalSafeMode(mode) ? \"safe\" : \"managed\",\n );\n }\n\n async tools() {\n return this.core.listTools();\n }\n\n async call(\n name: string,\n args: Record<string, unknown>,\n policy?: ExecutionPolicy,\n ) {\n return this.core.callTool(name, args, policy);\n }\n\n async close() {\n await this.core.close();\n }\n}\n\nasync function connectAgent(config: SavedConfig) {\n const core = new ExecutionCore(config.mode);\n banner();\n logLine(\"info\", `Device: ${bold(config.deviceName)} · ${process.platform}/${process.arch}`);\n logLine(\n \"info\",\n `Permission profile: ${isLocalSafeMode(config.mode) ? green(\"safe local cap\") : cyan(\"dashboard-managed\")}`,\n );\n\n const tools = await core.tools();\n logLine(\"success\", `Local tools ready: ${tools.length} exposed`);\n process.stdout.write(\" \" + dim(tools.map((tool) => tool.name).join(\" · \")) + \"\\n\");\n const wsUrl = new URL(\"/agent\", config.origin.replace(/^http/, \"ws\"));\n\n let stopped = false;\n let backoff = 1000;\n\n const shutdown = async () => {\n stopped = true;\n await core.close().catch(() => undefined);\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n while (!stopped) {\n logLine(\"event\", `Connecting relay ${dim(wsUrl.host)}…`);\n const ws = new WebSocket(wsUrl, {\n headers: {\n Authorization: \"Bearer \" + config.deviceToken,\n },\n });\n\n try {\n await new Promise<void>((resolve, reject) => {\n ws.once(\"open\", resolve);\n ws.once(\"error\", reject);\n });\n\n backoff = 1000;\n ws.send(\n JSON.stringify({\n type: \"hello\",\n device: {\n id: config.deviceId,\n name: config.deviceName,\n platform: process.platform,\n arch: process.arch,\n hostname: os.hostname(),\n agentVersion: VERSION,\n },\n tools: tools.map((tool) => tool.name),\n capabilities: [\"native_core_v1\", \"device_policy_v1\", \"undo_history_v1\"],\n }),\n );\n\n logLine(\"success\", `Relay connected · ${bold(config.deviceName)} · ${config.mode} mode`);\n logLine(\"success\", \"Device presence published.\");\n process.stdout.write(\" \" + dim(config.origin) + \"\\n\");\n process.stdout.write(\" \" + dim(\"Ctrl+C to disconnect\") + \"\\n\\n\");\n\n const sendHeartbeat = async () => {\n try {\n await fetch(new URL(\"/api/device/heartbeat\", config.origin), {\n method: \"POST\",\n headers: { Authorization: \"Bearer \" + config.deviceToken },\n });\n } catch {\n // WebSocket reconnect logic remains the source of truth for connectivity.\n }\n };\n void sendHeartbeat();\n const heartbeatTimer = setInterval(\n () => void sendHeartbeat(),\n 15 * 60_000,\n );\n\n await new Promise<void>((resolve) => {\n ws.on(\"message\", async (raw) => {\n let message: {\n type?: string;\n id?: string;\n tool?: string;\n arguments?: Record<string, unknown>;\n policy?: ExecutionPolicy;\n };\n\n try {\n message = JSON.parse(raw.toString());\n } catch {\n return;\n }\n\n if (\n message.type !== \"call\" ||\n !message.id ||\n !message.tool\n ) {\n return;\n }\n\n const callStarted = Date.now();\n logLine(\"event\", `tool.call ${bold(message.tool)} · ${dim(message.id.slice(0, 8))}`);\n try {\n const result = await core.call(\n message.tool,\n message.arguments || {},\n message.policy,\n );\n logLine(\"success\", `tool.done ${message.tool} · ${Date.now() - callStarted}ms`);\n ws.send(\n JSON.stringify({\n type: \"result\",\n id: message.id,\n result,\n }),\n );\n } catch (error) {\n logLine(\"error\", `tool.fail ${message.tool} · ${error instanceof Error ? error.message : String(error)}`);\n ws.send(\n JSON.stringify({\n type: \"result\",\n id: message.id,\n error: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n });\n\n ws.once(\"close\", resolve);\n ws.once(\"error\", resolve);\n });\n clearInterval(heartbeatTimer);\n } catch (error) {\n logLine(\n \"error\",\n \"Relay connection failed: \" +\n (error instanceof Error ? error.message : String(error)),\n );\n } finally {\n ws.removeAllListeners();\n ws.close();\n }\n\n if (!stopped) {\n logLine(\n \"warn\",\n \"Relay disconnected · retrying in \" + Math.round(backoff / 1000) + \"s\",\n );\n await sleep(backoff);\n backoff = Math.min(backoff * 2, 30_000);\n }\n }\n}\n\nasync function main() {\n if (argFlag(\"--help\") || argFlag(\"-h\")) {\n process.stdout.write(\n [\n \"Remote Arc\",\n \"\",\n \"Usage:\",\n \" npx remotelink\",\n \"\",\n \"After the npm release:\",\n \" npx remotelink\",\n \"\",\n \"Options:\",\n \" --safe Hard local read-only cap; dashboard cannot enable write tools\",\n \" --developer Legacy alias for dashboard-managed capabilities\",\n \" --reset Remove this computer's saved pairing\",\n \" --version Print CLI version\",\n \" --help Show this help\",\n \"\",\n ].join(\"\\n\"),\n );\n return;\n }\n\n if (argFlag(\"--version\") || argFlag(\"-v\")) {\n process.stdout.write(VERSION + \"\\n\");\n return;\n }\n\n if (argFlag(\"--reset\")) {\n await resetConfig();\n return;\n }\n\n const origin =\n process.env.REMOTEARC_ORIGIN || process.env.REMOTE_LINK_ORIGIN ||\n process.argv.find((value) => value.startsWith(\"--origin=\"))?.slice(9) ||\n DEFAULT_ORIGIN;\n\n let config = await readConfig();\n if (config && [\"https://remote.samyao.me\", \"https://remotearc.app\"].includes(config.origin)) {\n config.origin = DEFAULT_ORIGIN;\n await writeConfig(config);\n logLine(\"info\", \"Migrated relay origin to \" + DEFAULT_ORIGIN);\n }\n if (!config) {\n config = await pair(origin, selectedMode());\n } else if (argFlag(\"--safe\") || argFlag(\"--developer\")) {\n config.mode = argFlag(\"--safe\") ? \"safe\" : \"managed\";\n await writeConfig(config);\n }\n\n if (config) {\n logLine(\"info\", `Using paired device identity ${dim(config.deviceId.slice(0, 8))}…`);\n }\n await connectAgent(config);\n}\n\nmain().catch((error) => {\n logLine(\n \"error\",\n \"Fatal: \" + (error instanceof Error ? error.message : String(error)),\n );\n process.exit(1);\n});\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst MAX_DIRECTORY_ENTRIES = 2000;\nconst DEFAULT_READ_LINES = 240;\nconst MAX_TEXT_FILE_BYTES = 20 * 1024 * 1024;\n\nconst printableSize = (bytes: number) => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nexport async function listDirectory(\n targetPath: string,\n depth = 2,\n canReveal?: (candidatePath: string) => Promise<boolean>,\n) {\n const maxDepth = Math.max(1, Math.min(10, Math.trunc(depth || 2)));\n const lines: string[] = [];\n let entriesSeen = 0;\n let protectedEntries = 0;\n\n async function walk(directory: string, level: number, prefix: string) {\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) return;\n const entries = await fs.readdir(directory, { withFileTypes: true });\n entries.sort((a, b) => {\n if (a.isDirectory() !== b.isDirectory()) return a.isDirectory() ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n for (const entry of entries) {\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) break;\n const absolute = path.join(directory, entry.name);\n\n if (canReveal && !(await canReveal(absolute))) {\n protectedEntries += 1;\n continue;\n }\n\n entriesSeen += 1;\n const label = entry.isDirectory()\n ? \"[DIR]\"\n : entry.isSymbolicLink()\n ? \"[LINK]\"\n : \"[FILE]\";\n lines.push(`${prefix}${label} ${entry.name}`);\n\n if (entry.isDirectory() && level < maxDepth) {\n await walk(absolute, level + 1, prefix + \" \");\n }\n }\n }\n\n const stat = await fs.stat(targetPath);\n if (!stat.isDirectory()) throw new Error(\"Path is not a directory: \" + targetPath);\n\n await walk(targetPath, 1, \"\");\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) {\n lines.push(`… truncated after ${MAX_DIRECTORY_ENTRIES} entries`);\n }\n\n const protectionNote = protectedEntries\n ? `\\n\\n[Remote Arc omitted ${protectedEntries} protected or out-of-scope entr${protectedEntries === 1 ? \"y\" : \"ies\"}.]`\n : \"\";\n\n return `Directory: ${targetPath}\\nDepth: ${maxDepth}\\n\\n${lines.join(\"\\n\") || \"(empty)\"}${protectionNote}`;\n}\n\nexport async function readTextFile(\n targetPath: string,\n offset?: number,\n length?: number,\n) {\n const stat = await fs.stat(targetPath);\n if (!stat.isFile()) throw new Error(\"Path is not a file: \" + targetPath);\n if (stat.size > MAX_TEXT_FILE_BYTES) {\n throw new Error(\n `File is too large for read_file (${printableSize(stat.size)} > 20 MB). Use a terminal command or a more targeted tool instead.`,\n );\n }\n\n const buffer = await fs.readFile(targetPath);\n const sample = buffer.subarray(0, Math.min(buffer.length, 8192));\n if (sample.includes(0)) {\n throw new Error(\"Binary file detected. read_file currently supports text files only.\");\n }\n\n const text = buffer.toString(\"utf8\");\n const lines = text.split(/\\r?\\n/);\n const requestedOffset = Number.isFinite(offset) ? Math.trunc(offset as number) : 0;\n const start =\n requestedOffset < 0\n ? Math.max(0, lines.length + requestedOffset)\n : Math.min(lines.length, Math.max(0, requestedOffset));\n const requestedLength =\n Number.isFinite(length) && (length as number) > 0\n ? Math.trunc(length as number)\n : DEFAULT_READ_LINES;\n const end = Math.min(lines.length, start + requestedLength);\n const chunk = lines.slice(start, end).join(\"\\n\");\n\n const location =\n start === 0\n ? \"start\"\n : end === lines.length\n ? `line ${start + 1} to end`\n : `lines ${start + 1}-${end}`;\n\n return `[Reading ${end - start} lines from ${location} (total: ${lines.length} lines, ${printableSize(stat.size)})]\\n\\n${chunk}`;\n}\n\nexport async function getFileInfo(targetPath: string) {\n const stat = await fs.lstat(targetPath);\n return {\n path: targetPath,\n type: stat.isFile()\n ? \"file\"\n : stat.isDirectory()\n ? \"directory\"\n : stat.isSymbolicLink()\n ? \"symlink\"\n : \"other\",\n size: stat.size,\n size_human: printableSize(stat.size),\n mode: stat.mode,\n created_at: stat.birthtime.toISOString(),\n modified_at: stat.mtime.toISOString(),\n accessed_at: stat.atime.toISOString(),\n };\n}\n\nasync function atomicWriteText(targetPath: string, content: string) {\n const directory = path.dirname(targetPath);\n await fs.mkdir(directory, { recursive: true });\n const temporary = path.join(\n directory,\n \".\" + path.basename(targetPath) + \".remotearc-\" + crypto.randomUUID() + \".tmp\",\n );\n\n try {\n await fs.writeFile(temporary, content, \"utf8\");\n await fs.rename(temporary, targetPath);\n } finally {\n await fs.rm(temporary, { force: true }).catch(() => undefined);\n }\n}\n\nexport async function writeTextFile(\n targetPath: string,\n content: string,\n mode: \"rewrite\" | \"append\" = \"rewrite\",\n) {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n if (mode === \"append\") {\n await fs.appendFile(targetPath, content, \"utf8\");\n } else {\n await atomicWriteText(targetPath, content);\n }\n const stat = await fs.stat(targetPath);\n return {\n path: targetPath,\n mode,\n bytes: Buffer.byteLength(content),\n file_size: stat.size,\n atomic: mode === \"rewrite\",\n };\n}\n\nexport async function editTextBlock(\n filePath: string,\n oldString: string,\n newString: string,\n expectedReplacements = 1,\n) {\n if (!oldString) throw new Error(\"old_string cannot be empty.\");\n const current = await fs.readFile(filePath, \"utf8\");\n const parts = current.split(oldString);\n const replacements = parts.length - 1;\n\n if (replacements !== expectedReplacements) {\n throw new Error(\n `Expected ${expectedReplacements} replacement(s) in ${filePath}, found ${replacements}. No changes were written.`,\n );\n }\n\n const next = parts.join(newString);\n await atomicWriteText(filePath, next);\n return {\n path: filePath,\n replacements,\n bytes_before: Buffer.byteLength(current),\n bytes_after: Buffer.byteLength(next),\n atomic: true,\n };\n}\n","import { execFile, spawn, type ChildProcess } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport process from \"node:process\";\n\nconst MAX_CAPTURE_BYTES = 2 * 1024 * 1024;\n\nfunction appendCapped(current: string, chunk: Buffer | string) {\n if (Buffer.byteLength(current) >= MAX_CAPTURE_BYTES) return current;\n const next = current + chunk.toString();\n if (Buffer.byteLength(next) <= MAX_CAPTURE_BYTES) return next;\n return next.slice(0, MAX_CAPTURE_BYTES) + \"\\n… output truncated …\";\n}\n\nexport async function listProcesses() {\n const output = await new Promise<string>((resolve, reject) => {\n const command = process.platform === \"win32\" ? \"tasklist.exe\" : \"ps\";\n const args =\n process.platform === \"win32\"\n ? [\"/FO\", \"CSV\", \"/NH\"]\n : [\"-axo\", \"pid,ppid,user,%cpu,%mem,etime,command\"];\n execFile(command, args, { maxBuffer: MAX_CAPTURE_BYTES }, (error, stdout, stderr) => {\n if (error) {\n reject(new Error(`Could not list processes: ${stderr || error.message}`));\n return;\n }\n resolve(stdout.trim());\n });\n });\n\n return `Processes on ${process.platform}:\\n\\n${output}`;\n}\n\nasync function terminateTree(child: ReturnType<typeof spawn>) {\n if (!child.pid) return;\n if (process.platform === \"win32\") {\n await new Promise<void>((resolve) => {\n const killer = spawn(\n \"taskkill.exe\",\n [\"/PID\", String(child.pid), \"/T\", \"/F\"],\n { windowsHide: true, stdio: \"ignore\" },\n );\n killer.once(\"close\", () => resolve());\n killer.once(\"error\", () => resolve());\n });\n return;\n }\n\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill(\"SIGTERM\");\n }\n await new Promise((resolve) => setTimeout(resolve, 300));\n try {\n process.kill(-child.pid, \"SIGKILL\");\n } catch {\n if (!child.killed) child.kill(\"SIGKILL\");\n }\n}\n\nexport async function runShellCommand(\n command: string,\n timeoutMs = 5000,\n cwd?: string,\n) {\n const timeout = Math.max(100, Math.min(120_000, Math.trunc(timeoutMs || 5000)));\n const startedAt = Date.now();\n\n return await new Promise<{\n command: string;\n cwd: string | null;\n exit_code: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n duration_ms: number;\n timed_out: boolean;\n }>((resolve, reject) => {\n const child = spawn(command, {\n shell: true,\n cwd,\n windowsHide: true,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n\n child.stdout?.on(\"data\", (chunk) => {\n stdout = appendCapped(stdout, chunk);\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr = appendCapped(stderr, chunk);\n });\n\n const timer = setTimeout(async () => {\n timedOut = true;\n await terminateTree(child);\n }, timeout);\n\n child.once(\"error\", (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n reject(error);\n });\n\n child.once(\"close\", (code, signal) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({\n command,\n cwd: cwd || null,\n exit_code: code,\n signal,\n stdout,\n stderr,\n duration_ms: Date.now() - startedAt,\n timed_out: timedOut,\n });\n });\n });\n}\n\n\ntype ManagedProcess = {\n id: string;\n child: ChildProcess;\n command: string;\n cwd: string | null;\n startedAt: number;\n endedAt: number | null;\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n};\n\nconst managedProcesses = new Map<string, ManagedProcess>();\nconst MAX_MANAGED_PROCESSES = 32;\nconst FINISHED_PROCESS_RETENTION_MS = 30 * 60 * 1000;\n\nfunction cleanupManagedProcesses() {\n const now = Date.now();\n for (const [id, item] of managedProcesses) {\n if (\n item.endedAt !== null &&\n now - item.endedAt > FINISHED_PROCESS_RETENTION_MS\n ) {\n managedProcesses.delete(id);\n }\n }\n\n if (managedProcesses.size <= MAX_MANAGED_PROCESSES) return;\n const finished = [...managedProcesses.values()]\n .filter((item) => item.endedAt !== null)\n .sort((a, b) => (a.endedAt || 0) - (b.endedAt || 0));\n for (const item of finished) {\n if (managedProcesses.size <= MAX_MANAGED_PROCESSES) break;\n managedProcesses.delete(item.id);\n }\n}\n\nexport async function startBackgroundProcess(command: string, cwd?: string) {\n cleanupManagedProcesses();\n if (managedProcesses.size >= MAX_MANAGED_PROCESSES) {\n throw new Error(\n \"Remote Arc already has the maximum number of managed background processes on this device.\",\n );\n }\n\n const child = spawn(command, {\n shell: true,\n cwd,\n windowsHide: true,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const id = crypto.randomUUID();\n const item: ManagedProcess = {\n id,\n child,\n command,\n cwd: cwd || null,\n startedAt: Date.now(),\n endedAt: null,\n exitCode: null,\n signal: null,\n stdout: \"\",\n stderr: \"\",\n };\n managedProcesses.set(id, item);\n\n child.stdout?.on(\"data\", (chunk) => {\n item.stdout = appendCapped(item.stdout, chunk);\n });\n child.stderr?.on(\"data\", (chunk) => {\n item.stderr = appendCapped(item.stderr, chunk);\n });\n child.once(\"error\", (error) => {\n item.stderr = appendCapped(item.stderr, \"\\n\" + error.message);\n item.endedAt = Date.now();\n });\n child.once(\"close\", (code, signal) => {\n item.exitCode = code;\n item.signal = signal;\n item.endedAt = Date.now();\n });\n\n return {\n process_id: id,\n pid: child.pid || null,\n command,\n cwd: cwd || null,\n status: \"running\",\n started_at: new Date(item.startedAt).toISOString(),\n };\n}\n\nfunction managedProcessOrThrow(processId: string) {\n cleanupManagedProcesses();\n const item = managedProcesses.get(processId);\n if (!item) {\n throw new Error(\n \"Managed process not found or its local retention window has expired.\",\n );\n }\n return item;\n}\n\nexport function getManagedProcessStatus(processId: string) {\n const item = managedProcessOrThrow(processId);\n return {\n process_id: item.id,\n pid: item.child.pid || null,\n command: item.command,\n cwd: item.cwd,\n status: item.endedAt === null ? \"running\" : \"exited\",\n exit_code: item.exitCode,\n signal: item.signal,\n started_at: new Date(item.startedAt).toISOString(),\n ended_at: item.endedAt === null ? null : new Date(item.endedAt).toISOString(),\n duration_ms: (item.endedAt || Date.now()) - item.startedAt,\n };\n}\n\nexport function readManagedProcessOutput(processId: string) {\n const item = managedProcessOrThrow(processId);\n return {\n ...getManagedProcessStatus(processId),\n stdout: item.stdout,\n stderr: item.stderr,\n truncated:\n Buffer.byteLength(item.stdout) >= MAX_CAPTURE_BYTES ||\n Buffer.byteLength(item.stderr) >= MAX_CAPTURE_BYTES,\n };\n}\n\nexport async function stopManagedProcess(processId: string) {\n const item = managedProcessOrThrow(processId);\n if (item.endedAt !== null) {\n return {\n ...getManagedProcessStatus(processId),\n stopped: false,\n already_exited: true,\n };\n }\n\n await terminateTree(item.child);\n await new Promise((resolve) => setTimeout(resolve, 50));\n return {\n ...getManagedProcessStatus(processId),\n stopped: true,\n already_exited: false,\n };\n}\n\n\nexport async function stopAllManagedProcesses() {\n const running = [...managedProcesses.values()].filter(\n (item) => item.endedAt === null,\n );\n await Promise.all(\n running.map(async (item) => {\n await terminateTree(item.child).catch(() => undefined);\n }),\n );\n}\n","import crypto from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst RETENTION_MS = 7 * 24 * 60 * 60 * 1000;\nconst MAX_SNAPSHOT_BYTES = 20 * 1024 * 1024;\nconst MAX_UNDO_BYTES = 200 * 1024 * 1024;\n\ntype UndoManifest = {\n id: string;\n createdAt: string;\n tool: \"write_file\" | \"edit_block\";\n targetPath: string;\n existed: boolean;\n mode?: number;\n bytes: number;\n postChangeHash?: string;\n};\n\nexport type UndoSnapshot = {\n id: string;\n directory: string;\n manifest: UndoManifest;\n};\n\nconst undoRoot = () =>\n process.env.REMOTEARC_UNDO_ROOT ||\n path.join(os.homedir(), \".remotearc\", \"undo\");\n\nasync function ensureUndoRoot() {\n await fs.mkdir(undoRoot(), { recursive: true, mode: 0o700 });\n}\n\nasync function readManifest(directory: string): Promise<UndoManifest | null> {\n try {\n return JSON.parse(\n await fs.readFile(path.join(directory, \"manifest.json\"), \"utf8\"),\n ) as UndoManifest;\n } catch {\n return null;\n }\n}\n\nasync function snapshotDirectories() {\n await ensureUndoRoot();\n const entries = await fs.readdir(undoRoot(), { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(undoRoot(), entry.name));\n}\n\nasync function cleanupUndoStore() {\n const now = Date.now();\n const snapshots: Array<{ directory: string; manifest: UndoManifest }> = [];\n\n for (const directory of await snapshotDirectories()) {\n const manifest = await readManifest(directory);\n if (!manifest) {\n await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined);\n continue;\n }\n\n const created = Date.parse(manifest.createdAt);\n if (!Number.isFinite(created) || now - created > RETENTION_MS) {\n await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined);\n continue;\n }\n\n snapshots.push({ directory, manifest });\n }\n\n snapshots.sort(\n (a, b) => Date.parse(a.manifest.createdAt) - Date.parse(b.manifest.createdAt),\n );\n\n let total = snapshots.reduce((sum, item) => sum + item.manifest.bytes, 0);\n for (const item of snapshots) {\n if (total <= MAX_UNDO_BYTES) break;\n await fs.rm(item.directory, { recursive: true, force: true }).catch(() => undefined);\n total -= item.manifest.bytes;\n }\n}\n\nfunction mutationPath(\n tool: \"write_file\" | \"edit_block\",\n args: Record<string, unknown>,\n) {\n const candidate = tool === \"write_file\" ? args.path : args.file_path;\n return typeof candidate === \"string\" && candidate.trim() ? candidate : null;\n}\n\nexport async function createUndoSnapshot(\n tool: \"write_file\" | \"edit_block\",\n args: Record<string, unknown>,\n): Promise<UndoSnapshot | null> {\n const targetPath = mutationPath(tool, args);\n if (!targetPath) return null;\n\n await cleanupUndoStore();\n\n let existed = false;\n let mode: number | undefined;\n let bytes = 0;\n let original: Buffer | null = null;\n\n try {\n const stat = await fs.stat(targetPath);\n if (!stat.isFile()) return null;\n existed = true;\n mode = stat.mode;\n bytes = stat.size;\n if (bytes > MAX_SNAPSHOT_BYTES) return null;\n original = await fs.readFile(targetPath);\n } catch (error) {\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? String((error as { code?: unknown }).code)\n : \"\";\n if (code !== \"ENOENT\") throw error;\n }\n\n const id = `${Date.now()}-${crypto.randomUUID().slice(0, 8)}`;\n const directory = path.join(undoRoot(), id);\n await fs.mkdir(directory, { recursive: true, mode: 0o700 });\n\n if (original) {\n await fs.writeFile(path.join(directory, \"content.bin\"), original, { mode: 0o600 });\n }\n\n const manifest: UndoManifest = {\n id,\n createdAt: new Date().toISOString(),\n tool,\n targetPath,\n existed,\n ...(mode !== undefined ? { mode } : {}),\n bytes,\n };\n\n await fs.writeFile(\n path.join(directory, \"manifest.json\"),\n JSON.stringify(manifest, null, 2) + \"\\n\",\n { mode: 0o600 },\n );\n\n await cleanupUndoStore();\n return { id, directory, manifest };\n}\n\nasync function hashFile(filePath: string) {\n const hash = crypto.createHash(\"sha256\");\n for await (const chunk of createReadStream(filePath)) hash.update(chunk);\n return hash.digest(\"hex\");\n}\n\nexport async function finalizeUndoSnapshot(snapshot: UndoSnapshot | null) {\n if (!snapshot) return false;\n try {\n snapshot.manifest.postChangeHash = await hashFile(snapshot.manifest.targetPath);\n await fs.writeFile(\n path.join(snapshot.directory, \"manifest.json\"),\n JSON.stringify(snapshot.manifest, null, 2) + \"\\n\",\n { mode: 0o600 },\n );\n return true;\n } catch {\n await discardUndoSnapshot(snapshot);\n return false;\n }\n}\n\nexport async function discardUndoSnapshot(snapshot: UndoSnapshot | null) {\n if (!snapshot) return;\n await fs.rm(snapshot.directory, { recursive: true, force: true }).catch(() => undefined);\n}\n\nasync function undoCandidates() {\n await cleanupUndoStore();\n const candidates: Array<{ directory: string; manifest: UndoManifest }> = [];\n for (const directory of await snapshotDirectories()) {\n const manifest = await readManifest(directory);\n if (manifest) candidates.push({ directory, manifest });\n }\n candidates.sort(\n (a, b) => Date.parse(b.manifest.createdAt) - Date.parse(a.manifest.createdAt),\n );\n return candidates;\n}\n\nexport async function listUndoActions(limit = 20) {\n const candidates = (await undoCandidates()).slice(\n 0,\n Math.max(1, Math.min(100, Math.trunc(limit))),\n );\n\n return Promise.all(\n candidates.map(async ({ manifest }) => {\n let status: \"ready\" | \"conflict\" | \"missing\" | \"legacy\" = \"legacy\";\n\n if (manifest.postChangeHash) {\n try {\n const currentHash = await hashFile(manifest.targetPath);\n status =\n currentHash === manifest.postChangeHash ? \"ready\" : \"conflict\";\n } catch {\n status = \"missing\";\n }\n }\n\n return {\n id: manifest.id,\n created_at: manifest.createdAt,\n tool: manifest.tool,\n path: manifest.targetPath,\n bytes: manifest.bytes,\n existed_before: manifest.existed,\n conflict_safe: Boolean(manifest.postChangeHash),\n can_undo: status === \"ready\",\n status,\n };\n }),\n );\n}\n\nasync function restoreUndoCandidate(candidate: { directory: string; manifest: UndoManifest }) {\n const { directory, manifest } = candidate;\n\n if (!manifest.postChangeHash) {\n throw new Error(\n \"This snapshot predates conflict-safe Local Undo and cannot be restored automatically.\",\n );\n }\n\n let currentHash: string;\n try {\n currentHash = await hashFile(manifest.targetPath);\n } catch {\n throw new Error(\n \"The target file changed or disappeared after the Remote Arc edit. Automatic undo was refused to avoid overwriting newer work.\",\n );\n }\n\n if (currentHash !== manifest.postChangeHash) {\n throw new Error(\n \"The target file changed again after the Remote Arc edit. Automatic undo was refused to avoid overwriting newer work.\",\n );\n }\n\n if (manifest.existed) {\n const original = await fs.readFile(path.join(directory, \"content.bin\"));\n await fs.mkdir(path.dirname(manifest.targetPath), { recursive: true });\n await fs.writeFile(manifest.targetPath, original);\n if (manifest.mode !== undefined) {\n await fs.chmod(manifest.targetPath, manifest.mode).catch(() => undefined);\n }\n } else {\n await fs.rm(manifest.targetPath, { force: true });\n }\n\n await fs.rm(directory, { recursive: true, force: true });\n\n return {\n restored: true,\n action_id: manifest.id,\n tool: manifest.tool,\n path: manifest.targetPath,\n snapshot_location: \"local-device-only\",\n };\n}\n\nexport async function undoChange(actionId: string) {\n const candidate = (await undoCandidates()).find(({ manifest }) => manifest.id === actionId);\n if (!candidate) {\n throw new Error(\"Undo action not found or expired on this device.\");\n }\n return restoreUndoCandidate(candidate);\n}\n\nexport async function undoLastChange() {\n const latest = (await undoCandidates())[0];\n if (!latest) {\n throw new Error(\"No reversible Remote Arc file change is available on this device.\");\n }\n return restoreUndoCandidate(latest);\n}\n\ntype GuardRule = { pattern: RegExp; reason: string };\n\nconst DESTRUCTIVE_COMMAND_RULES: GuardRule[] = [\n {\n pattern: /(?:^|[;&|]\\s*)(?:sudo\\s+)?rm\\s+[^\\n]*(?:-rf|-fr|-[a-z]*r[a-z]*f)[^\\n]*(?:\\s\\/\\s*$|\\s\\/\\*|\\s~(?:\\s|$)|\\s\\$HOME(?:\\s|$))/i,\n reason: \"recursive deletion of a root or home path\",\n },\n {\n pattern: /\\b(?:mkfs(?:\\.\\w+)?|wipefs|fdisk|parted)\\b/i,\n reason: \"disk or filesystem destructive operation\",\n },\n {\n pattern: /\\bdd\\b[^\\n]*\\bof=\\/dev\\/(?:sd|nvme|vd|xvd|mmcblk)/i,\n reason: \"raw disk overwrite\",\n },\n {\n pattern: /\\bdiskutil\\s+erase(?:disk|volume)\\b/i,\n reason: \"disk erase\",\n },\n {\n pattern: /\\b(?:format(?:\\.com)?\\s+[a-z]:|diskpart\\b|clear-disk\\b|initialize-disk\\b)/i,\n reason: \"Windows disk destructive operation\",\n },\n {\n pattern: /\\b(?:shutdown|reboot|halt|poweroff)\\b/i,\n reason: \"system shutdown or reboot\",\n },\n {\n pattern: /\\bremove-item\\b[^\\n]*(?:-recurse[^\\n]*-force|-force[^\\n]*-recurse)[^\\n]*(?:[a-z]:\\\\(?:\\*|\\s|$)|\\$env:systemdrive)/i,\n reason: \"recursive forced deletion of a drive root\",\n },\n {\n pattern: /\\b(?:del|erase|rd|rmdir)\\b[^\\n]*\\/s[^\\n]*\\/q[^\\n]*[a-z]:\\\\/i,\n reason: \"recursive Windows drive deletion\",\n },\n {\n pattern: /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\};\\s*:/,\n reason: \"fork bomb\",\n },\n];\n\nexport function assertCommandAllowed(command: string) {\n if (process.env.REMOTEARC_ALLOW_DESTRUCTIVE === \"1\") return;\n\n for (const rule of DESTRUCTIVE_COMMAND_RULES) {\n if (rule.pattern.test(command)) {\n throw new Error(\n \"Blocked by Remote Arc Safety Guard: \" +\n rule.reason +\n \". Run this action manually on the device if you intentionally need it.\",\n );\n }\n }\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport type ExecutionPolicy = {\n workspaceRoots?: string[];\n protectSensitivePaths?: boolean;\n sensitivePaths?: string[];\n sensitiveAllowPaths?: string[];\n undoEnabled?: boolean;\n};\n\nconst SENSITIVE_BASENAMES = new Set([\n \".npmrc\",\n \".pypirc\",\n \".netrc\",\n \".git-credentials\",\n \"id_rsa\",\n \"id_ed25519\",\n \"credentials\",\n]);\n\nconst expandPath = (value: string) => {\n const trimmed = value.trim();\n if (trimmed === \"~\") return os.homedir();\n if (trimmed.startsWith(\"~/\") || trimmed.startsWith(\"~\\\\\")) {\n return path.join(os.homedir(), trimmed.slice(2));\n }\n return trimmed\n .replace(/%USERPROFILE%/gi, os.homedir())\n .replace(/\\$HOME\\b/g, os.homedir());\n};\n\nconst comparePath = (value: string) => {\n const resolved = path.resolve(expandPath(value));\n return process.platform === \"win32\" ? resolved.toLowerCase() : resolved;\n};\n\nasync function canonicalTarget(targetPath: string) {\n const expanded = path.resolve(expandPath(targetPath));\n try {\n return comparePath(await fs.realpath(expanded));\n } catch {\n const missing: string[] = [];\n let cursor = expanded;\n\n while (true) {\n try {\n const realParent = await fs.realpath(cursor);\n return comparePath(path.join(realParent, ...missing.reverse()));\n } catch {\n const parent = path.dirname(cursor);\n if (parent === cursor) return comparePath(expanded);\n missing.push(path.basename(cursor));\n cursor = parent;\n }\n }\n }\n}\n\nconst isInside = (target: string, root: string) => {\n const relative = path.relative(root, target);\n return (\n relative === \"\" ||\n (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n );\n};\n\nfunction defaultSensitiveRoots() {\n const home = os.homedir();\n const roots = [\n path.join(home, \".ssh\"),\n path.join(home, \".aws\"),\n path.join(home, \".gnupg\"),\n path.join(home, \".azure\"),\n path.join(home, \".kube\"),\n path.join(home, \".docker\"),\n path.join(home, \".config\", \"gcloud\"),\n ];\n\n if (process.platform === \"darwin\") {\n roots.push(\n path.join(home, \"Library\", \"Application Support\", \"Google\", \"Chrome\"),\n path.join(home, \"Library\", \"Application Support\", \"Microsoft Edge\"),\n path.join(home, \"Library\", \"Application Support\", \"Firefox\"),\n );\n }\n\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA;\n const localAppData = process.env.LOCALAPPDATA;\n if (appData) {\n roots.push(path.join(appData, \"Mozilla\", \"Firefox\"));\n }\n if (localAppData) {\n roots.push(\n path.join(localAppData, \"Google\", \"Chrome\", \"User Data\"),\n path.join(localAppData, \"Microsoft\", \"Edge\", \"User Data\"),\n );\n }\n }\n\n return roots;\n}\n\nfunction looksLikeSensitiveFile(target: string) {\n const basename = path.basename(target).toLowerCase();\n if (basename === \".env\" || basename.startsWith(\".env.\")) return true;\n if (SENSITIVE_BASENAMES.has(basename)) return true;\n\n const normalized = target.replace(/\\\\/g, \"/\").toLowerCase();\n if (normalized.endsWith(\"/.docker/config.json\")) return true;\n if (normalized.endsWith(\"/.kube/config\")) return true;\n\n return false;\n}\n\nexport async function enforcePathPolicy(\n targetPath: string,\n policy: ExecutionPolicy = {},\n) {\n const target = await canonicalTarget(targetPath);\n\n const workspaceInputs = (policy.workspaceRoots || []).filter(\n (item) => typeof item === \"string\" && item.trim(),\n );\n const roots = await Promise.all(workspaceInputs.map(canonicalTarget));\n\n if (roots.length && !roots.some((root) => isInside(target, root))) {\n throw new Error(\n \"Blocked by Remote Arc Workspace Scope: path is outside the allowed workspace roots.\",\n );\n }\n\n if (policy.protectSensitivePaths !== false) {\n const sensitiveInputs = [\n ...defaultSensitiveRoots(),\n ...(policy.sensitivePaths || []),\n ].filter((item) => typeof item === \"string\" && item.trim());\n const sensitiveRoots = await Promise.all(\n sensitiveInputs.map(canonicalTarget),\n );\n const allowedSensitiveRoots = await Promise.all(\n (policy.sensitiveAllowPaths || [])\n .filter((item) => typeof item === \"string\" && item.trim())\n .map(canonicalTarget),\n );\n const explicitlyAllowed = allowedSensitiveRoots.some((root) =>\n isInside(target, root),\n );\n\n if (\n !explicitlyAllowed &&\n (looksLikeSensitiveFile(target) ||\n sensitiveRoots.some((root) => isInside(target, root)))\n ) {\n throw new Error(\n \"Blocked by Remote Arc Sensitive Path Policy. Add a narrow sensitive-path exception for this device if you intentionally need access.\",\n );\n }\n }\n\n return target;\n}\n\nexport function normalizePolicy(policy?: ExecutionPolicy): ExecutionPolicy {\n return {\n workspaceRoots: Array.from(\n new Set((policy?.workspaceRoots || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n protectSensitivePaths: policy?.protectSensitivePaths !== false,\n sensitivePaths: Array.from(\n new Set((policy?.sensitivePaths || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n sensitiveAllowPaths: Array.from(\n new Set((policy?.sensitiveAllowPaths || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n undoEnabled: policy?.undoEnabled !== false,\n };\n}\n","import {\n editTextBlock,\n getFileInfo,\n listDirectory,\n readTextFile,\n writeTextFile,\n} from \"./filesystem.js\";\nimport {\n getManagedProcessStatus,\n listProcesses,\n readManagedProcessOutput,\n runShellCommand,\n startBackgroundProcess,\n stopAllManagedProcesses,\n stopManagedProcess,\n} from \"./process.js\";\nimport {\n assertCommandAllowed,\n createUndoSnapshot,\n discardUndoSnapshot,\n finalizeUndoSnapshot,\n listUndoActions,\n undoChange,\n} from \"./safety.js\";\nimport {\n enforcePathPolicy,\n normalizePolicy,\n type ExecutionPolicy,\n} from \"./policy.js\";\nimport type {\n ExecutionMode,\n ToolArguments,\n ToolDefinition,\n ToolName,\n ToolResult,\n} from \"./types.js\";\n\nconst SAFE_TOOLS = new Set<ToolName>([\n \"list_directory\",\n \"read_file\",\n \"get_file_info\",\n \"list_processes\",\n \"list_undo_actions\",\n]);\n\nconst DEVELOPER_TOOLS = new Set<ToolName>([\n ...SAFE_TOOLS,\n \"write_file\",\n \"edit_block\",\n \"undo_change\",\n \"undo_last_change\",\n]);\n\nconst FULL_TOOLS = new Set<ToolName>([\n ...DEVELOPER_TOOLS,\n \"start_process\",\n \"process_status\",\n \"process_output\",\n \"stop_process\",\n]);\n\nconst DEFINITIONS: ToolDefinition[] = [\n {\n name: \"list_directory\",\n description: \"List files and directories on this computer without following directory symlinks.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n depth: { type: \"integer\", minimum: 1, maximum: 10, default: 2 },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"read_file\",\n description: \"Read a text file by line range. Negative offsets read from the end.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n offset: { type: \"integer\" },\n length: { type: \"integer\", minimum: 1 },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"get_file_info\",\n description: \"Get local file or directory metadata.\",\n inputSchema: {\n type: \"object\",\n properties: { path: { type: \"string\" } },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"list_processes\",\n description: \"List processes running on this computer.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"write_file\",\n description: \"Write or append UTF-8 text. Remote Arc creates a local-only Undo snapshot first.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n content: { type: \"string\" },\n mode: { type: \"string\", enum: [\"rewrite\", \"append\"], default: \"rewrite\" },\n },\n required: [\"path\", \"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"edit_block\",\n description: \"Apply an exact text replacement with conflict-safe Local Undo.\",\n inputSchema: {\n type: \"object\",\n properties: {\n file_path: { type: \"string\" },\n old_string: { type: \"string\" },\n new_string: { type: \"string\" },\n expected_replacements: { type: \"integer\", minimum: 1, default: 1 },\n },\n required: [\"file_path\", \"old_string\", \"new_string\"],\n additionalProperties: false,\n },\n },\n {\n name: \"list_undo_actions\",\n description: \"List reversible Remote Arc file changes currently stored on this device.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"integer\", minimum: 1, maximum: 100, default: 20 },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"undo_change\",\n description: \"Restore one specific local Remote Arc undo snapshot by action id.\",\n inputSchema: {\n type: \"object\",\n properties: {\n action_id: { type: \"string\" },\n },\n required: [\"action_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"undo_last_change\",\n description: \"Undo the newest reversible Remote Arc file edit stored only on this device.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"start_process\",\n description: \"Run a shell command with timeout and output capture. Catastrophic command patterns are blocked locally.\",\n inputSchema: {\n type: \"object\",\n properties: {\n command: { type: \"string\" },\n timeout_ms: { type: \"integer\", minimum: 100, maximum: 120000, default: 5000 },\n cwd: { type: \"string\" },\n background: { type: \"boolean\", default: false },\n },\n required: [\"command\"],\n additionalProperties: false,\n },\n },\n {\n name: \"process_status\",\n description: \"Get status for a Remote Arc managed background process.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"process_output\",\n description: \"Read captured stdout and stderr from a Remote Arc managed background process.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"stop_process\",\n description: \"Stop a Remote Arc managed background process and its child process tree.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n];\n\nconst textResult = (value: unknown): ToolResult => ({\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value, null, 2),\n },\n ],\n});\n\nfunction requiredString(args: ToolArguments, key: string) {\n const value = args[key];\n if (typeof value !== \"string\") throw new Error(`${key} must be a string.`);\n return value;\n}\n\nfunction optionalNumber(args: ToolArguments, key: string) {\n const value = args[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction optionalString(args: ToolArguments, key: string) {\n const value = args[key];\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nexport class RemoteArcExecutionCore {\n constructor(private readonly mode: ExecutionMode = \"managed\") {}\n\n private allowedTools() {\n if (this.mode === \"safe\") return SAFE_TOOLS;\n if (this.mode === \"developer\") return DEVELOPER_TOOLS;\n return FULL_TOOLS;\n }\n\n listTools() {\n const allowed = this.allowedTools();\n return DEFINITIONS.filter((tool) => allowed.has(tool.name));\n }\n\n async callTool(\n name: string,\n args: ToolArguments = {},\n policyInput: ExecutionPolicy = {},\n ): Promise<ToolResult> {\n const toolName = name as ToolName;\n if (!this.allowedTools().has(toolName)) {\n throw new Error(`Tool blocked by local permission mode: ${name}`);\n }\n\n const policy = normalizePolicy(policyInput);\n\n switch (toolName) {\n case \"list_directory\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(\n await listDirectory(\n target,\n optionalNumber(args, \"depth\") ?? 2,\n async (candidate) => {\n try {\n await enforcePathPolicy(candidate, policy);\n return true;\n } catch {\n return false;\n }\n },\n ),\n );\n }\n case \"read_file\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(\n await readTextFile(\n target,\n optionalNumber(args, \"offset\"),\n optionalNumber(args, \"length\"),\n ),\n );\n }\n case \"get_file_info\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(await getFileInfo(target));\n }\n case \"list_processes\":\n return textResult(await listProcesses());\n case \"list_undo_actions\": {\n const actions = await listUndoActions(optionalNumber(args, \"limit\") ?? 20);\n const visible = [];\n for (const action of actions) {\n try {\n await enforcePathPolicy(action.path, policy);\n visible.push(action);\n } catch {\n // Do not reveal protected or out-of-scope paths through undo metadata.\n }\n }\n return textResult(visible);\n }\n case \"undo_change\": {\n if (policy.undoEnabled === false) {\n throw new Error(\"Local Undo is disabled for this device.\");\n }\n const actionId = requiredString(args, \"action_id\");\n const action = (await listUndoActions(100)).find((item) => item.id === actionId);\n if (!action) throw new Error(\"Undo action not found or expired on this device.\");\n await enforcePathPolicy(action.path, policy);\n return textResult(await undoChange(actionId));\n }\n case \"undo_last_change\": {\n if (policy.undoEnabled === false) {\n throw new Error(\"Local Undo is disabled for this device.\");\n }\n const actions = await listUndoActions(100);\n for (const action of actions) {\n try {\n await enforcePathPolicy(action.path, policy);\n return textResult(await undoChange(action.id));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (!message.startsWith(\"Blocked by Remote Arc\")) throw error;\n }\n }\n throw new Error(\"No reversible in-scope Remote Arc file change is available.\");\n }\n case \"start_process\": {\n const command = requiredString(args, \"command\");\n assertCommandAllowed(command);\n const cwdInput = optionalString(args, \"cwd\");\n if ((policy.workspaceRoots || []).length && !cwdInput) {\n throw new Error(\n \"Workspace Scope is enabled. start_process requires an in-scope cwd. Terminal commands are not an OS sandbox and may still access paths outside that directory.\",\n );\n }\n const cwd = cwdInput ? await enforcePathPolicy(cwdInput, policy) : undefined;\n if (args.background === true) {\n return textResult(await startBackgroundProcess(command, cwd));\n }\n return textResult(\n await runShellCommand(\n command,\n optionalNumber(args, \"timeout_ms\") ?? 5000,\n cwd,\n ),\n );\n }\n case \"process_status\":\n return textResult(\n getManagedProcessStatus(requiredString(args, \"process_id\")),\n );\n case \"process_output\":\n return textResult(\n readManagedProcessOutput(requiredString(args, \"process_id\")),\n );\n case \"stop_process\":\n return textResult(\n await stopManagedProcess(requiredString(args, \"process_id\")),\n );\n case \"write_file\":\n case \"edit_block\": {\n const pathKey = toolName === \"write_file\" ? \"path\" : \"file_path\";\n const target = await enforcePathPolicy(requiredString(args, pathKey), policy);\n const scopedArgs = { ...args, [pathKey]: target };\n const snapshot =\n policy.undoEnabled === false\n ? null\n : await createUndoSnapshot(toolName, scopedArgs);\n try {\n const result =\n toolName === \"write_file\"\n ? await writeTextFile(\n target,\n requiredString(args, \"content\"),\n args.mode === \"append\" ? \"append\" : \"rewrite\",\n )\n : await editTextBlock(\n target,\n requiredString(args, \"old_string\"),\n requiredString(args, \"new_string\"),\n optionalNumber(args, \"expected_replacements\") ?? 1,\n );\n\n const undoAvailable = await finalizeUndoSnapshot(snapshot);\n return textResult({\n ...result,\n undo_available: undoAvailable,\n undo_storage: undoAvailable ? \"local-device-only\" : null,\n });\n } catch (error) {\n await discardUndoSnapshot(snapshot);\n throw error;\n }\n }\n default:\n throw new Error(\"Unknown Remote Arc tool: \" + name);\n }\n }\n\n async close() {\n await stopAllManagedProcesses();\n }\n}\n\nexport const toolDefinitions = DEFINITIONS;\n"],"mappings":";;;AACA,OAAOA,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,SAAAC,cAAa;AACtB,OAAOC,cAAa;AACpB,OAAO,eAAe;;;ACNtB,OAAO,YAAY;AACnB,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,IAAM,wBAAwB;AAC9B,IAAM,qBAAqB;AAC3B,IAAM,sBAAsB,KAAK,OAAO;AAExC,IAAM,gBAAgB,CAAC,UAAkB;AACvC,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,SAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9C;AAEA,eAAsB,cACpB,YACA,QAAQ,GACR,WACA;AACA,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,SAAS,CAAC,CAAC,CAAC;AACjE,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc;AAClB,MAAI,mBAAmB;AAEvB,iBAAe,KAAK,WAAmB,OAAe,QAAgB;AACpE,QAAI,eAAe,sBAAuB;AAC1C,UAAM,UAAU,MAAM,GAAG,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AACnE,YAAQ,KAAK,CAAC,GAAG,MAAM;AACrB,UAAI,EAAE,YAAY,MAAM,EAAE,YAAY,EAAG,QAAO,EAAE,YAAY,IAAI,KAAK;AACvE,aAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,IACpC,CAAC;AAED,eAAW,SAAS,SAAS;AAC3B,UAAI,eAAe,sBAAuB;AAC1C,YAAM,WAAW,KAAK,KAAK,WAAW,MAAM,IAAI;AAEhD,UAAI,aAAa,CAAE,MAAM,UAAU,QAAQ,GAAI;AAC7C,4BAAoB;AACpB;AAAA,MACF;AAEA,qBAAe;AACf,YAAM,QAAQ,MAAM,YAAY,IAC5B,UACA,MAAM,eAAe,IACnB,WACA;AACN,YAAM,KAAK,GAAG,MAAM,GAAG,KAAK,IAAI,MAAM,IAAI,EAAE;AAE5C,UAAI,MAAM,YAAY,KAAK,QAAQ,UAAU;AAC3C,cAAM,KAAK,UAAU,QAAQ,GAAG,SAAS,IAAI;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,GAAG,KAAK,UAAU;AACrC,MAAI,CAAC,KAAK,YAAY,EAAG,OAAM,IAAI,MAAM,8BAA8B,UAAU;AAEjF,QAAM,KAAK,YAAY,GAAG,EAAE;AAC5B,MAAI,eAAe,uBAAuB;AACxC,UAAM,KAAK,0BAAqB,qBAAqB,UAAU;AAAA,EACjE;AAEA,QAAM,iBAAiB,mBACnB;AAAA;AAAA,sBAA2B,gBAAgB,kCAAkC,qBAAqB,IAAI,MAAM,KAAK,OACjH;AAEJ,SAAO,cAAc,UAAU;AAAA,SAAY,QAAQ;AAAA;AAAA,EAAO,MAAM,KAAK,IAAI,KAAK,SAAS,GAAG,cAAc;AAC1G;AAEA,eAAsB,aACpB,YACA,QACA,QACA;AACA,QAAM,OAAO,MAAM,GAAG,KAAK,UAAU;AACrC,MAAI,CAAC,KAAK,OAAO,EAAG,OAAM,IAAI,MAAM,yBAAyB,UAAU;AACvE,MAAI,KAAK,OAAO,qBAAqB;AACnC,UAAM,IAAI;AAAA,MACR,oCAAoC,cAAc,KAAK,IAAI,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,GAAG,SAAS,UAAU;AAC3C,QAAM,SAAS,OAAO,SAAS,GAAG,KAAK,IAAI,OAAO,QAAQ,IAAI,CAAC;AAC/D,MAAI,OAAO,SAAS,CAAC,GAAG;AACtB,UAAM,IAAI,MAAM,qEAAqE;AAAA,EACvF;AAEA,QAAM,OAAO,OAAO,SAAS,MAAM;AACnC,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAM,kBAAkB,OAAO,SAAS,MAAM,IAAI,KAAK,MAAM,MAAgB,IAAI;AACjF,QAAM,QACJ,kBAAkB,IACd,KAAK,IAAI,GAAG,MAAM,SAAS,eAAe,IAC1C,KAAK,IAAI,MAAM,QAAQ,KAAK,IAAI,GAAG,eAAe,CAAC;AACzD,QAAM,kBACJ,OAAO,SAAS,MAAM,KAAM,SAAoB,IAC5C,KAAK,MAAM,MAAgB,IAC3B;AACN,QAAM,MAAM,KAAK,IAAI,MAAM,QAAQ,QAAQ,eAAe;AAC1D,QAAM,QAAQ,MAAM,MAAM,OAAO,GAAG,EAAE,KAAK,IAAI;AAE/C,QAAM,WACJ,UAAU,IACN,UACA,QAAQ,MAAM,SACZ,QAAQ,QAAQ,CAAC,YACjB,SAAS,QAAQ,CAAC,IAAI,GAAG;AAEjC,SAAO,YAAY,MAAM,KAAK,eAAe,QAAQ,YAAY,MAAM,MAAM,WAAW,cAAc,KAAK,IAAI,CAAC;AAAA;AAAA,EAAS,KAAK;AAChI;AAEA,eAAsB,YAAY,YAAoB;AACpD,QAAM,OAAO,MAAM,GAAG,MAAM,UAAU;AACtC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,KAAK,OAAO,IACd,SACA,KAAK,YAAY,IACf,cACA,KAAK,eAAe,IAClB,YACA;AAAA,IACR,MAAM,KAAK;AAAA,IACX,YAAY,cAAc,KAAK,IAAI;AAAA,IACnC,MAAM,KAAK;AAAA,IACX,YAAY,KAAK,UAAU,YAAY;AAAA,IACvC,aAAa,KAAK,MAAM,YAAY;AAAA,IACpC,aAAa,KAAK,MAAM,YAAY;AAAA,EACtC;AACF;AAEA,eAAe,gBAAgB,YAAoB,SAAiB;AAClE,QAAM,YAAY,KAAK,QAAQ,UAAU;AACzC,QAAM,GAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC7C,QAAM,YAAY,KAAK;AAAA,IACrB;AAAA,IACA,MAAM,KAAK,SAAS,UAAU,IAAI,gBAAgB,OAAO,WAAW,IAAI;AAAA,EAC1E;AAEA,MAAI;AACF,UAAM,GAAG,UAAU,WAAW,SAAS,MAAM;AAC7C,UAAM,GAAG,OAAO,WAAW,UAAU;AAAA,EACvC,UAAE;AACA,UAAM,GAAG,GAAG,WAAW,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAC/D;AACF;AAEA,eAAsB,cACpB,YACA,SACA,OAA6B,WAC7B;AACA,QAAM,GAAG,MAAM,KAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,MAAI,SAAS,UAAU;AACrB,UAAM,GAAG,WAAW,YAAY,SAAS,MAAM;AAAA,EACjD,OAAO;AACL,UAAM,gBAAgB,YAAY,OAAO;AAAA,EAC3C;AACA,QAAM,OAAO,MAAM,GAAG,KAAK,UAAU;AACrC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,OAAO,OAAO,WAAW,OAAO;AAAA,IAChC,WAAW,KAAK;AAAA,IAChB,QAAQ,SAAS;AAAA,EACnB;AACF;AAEA,eAAsB,cACpB,UACA,WACA,WACA,uBAAuB,GACvB;AACA,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,6BAA6B;AAC7D,QAAM,UAAU,MAAM,GAAG,SAAS,UAAU,MAAM;AAClD,QAAM,QAAQ,QAAQ,MAAM,SAAS;AACrC,QAAM,eAAe,MAAM,SAAS;AAEpC,MAAI,iBAAiB,sBAAsB;AACzC,UAAM,IAAI;AAAA,MACR,YAAY,oBAAoB,sBAAsB,QAAQ,WAAW,YAAY;AAAA,IACvF;AAAA,EACF;AAEA,QAAM,OAAO,MAAM,KAAK,SAAS;AACjC,QAAM,gBAAgB,UAAU,IAAI;AACpC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,cAAc,OAAO,WAAW,OAAO;AAAA,IACvC,aAAa,OAAO,WAAW,IAAI;AAAA,IACnC,QAAQ;AAAA,EACV;AACF;;;ACpMA,SAAS,UAAU,aAAgC;AACnD,OAAOC,aAAY;AACnB,OAAOC,cAAa;AAEpB,IAAM,oBAAoB,IAAI,OAAO;AAErC,SAAS,aAAa,SAAiB,OAAwB;AAC7D,MAAI,OAAO,WAAW,OAAO,KAAK,kBAAmB,QAAO;AAC5D,QAAM,OAAO,UAAU,MAAM,SAAS;AACtC,MAAI,OAAO,WAAW,IAAI,KAAK,kBAAmB,QAAO;AACzD,SAAO,KAAK,MAAM,GAAG,iBAAiB,IAAI;AAC5C;AAEA,eAAsB,gBAAgB;AACpC,QAAM,SAAS,MAAM,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC5D,UAAM,UAAUA,SAAQ,aAAa,UAAU,iBAAiB;AAChE,UAAM,OACJA,SAAQ,aAAa,UACjB,CAAC,OAAO,OAAO,KAAK,IACpB,CAAC,QAAQ,uCAAuC;AACtD,aAAS,SAAS,MAAM,EAAE,WAAW,kBAAkB,GAAG,CAAC,OAAO,QAAQ,WAAW;AACnF,UAAI,OAAO;AACT,eAAO,IAAI,MAAM,6BAA6B,UAAU,MAAM,OAAO,EAAE,CAAC;AACxE;AAAA,MACF;AACA,cAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AAED,SAAO,gBAAgBA,SAAQ,QAAQ;AAAA;AAAA,EAAQ,MAAM;AACvD;AAEA,eAAe,cAAc,OAAiC;AAC5D,MAAI,CAAC,MAAM,IAAK;AAChB,MAAIA,SAAQ,aAAa,SAAS;AAChC,UAAM,IAAI,QAAc,CAAC,YAAY;AACnC,YAAM,SAAS;AAAA,QACb;AAAA,QACA,CAAC,QAAQ,OAAO,MAAM,GAAG,GAAG,MAAM,IAAI;AAAA,QACtC,EAAE,aAAa,MAAM,OAAO,SAAS;AAAA,MACvC;AACA,aAAO,KAAK,SAAS,MAAM,QAAQ,CAAC;AACpC,aAAO,KAAK,SAAS,MAAM,QAAQ,CAAC;AAAA,IACtC,CAAC;AACD;AAAA,EACF;AAEA,MAAI;AACF,IAAAA,SAAQ,KAAK,CAAC,MAAM,KAAK,SAAS;AAAA,EACpC,QAAQ;AACN,UAAM,KAAK,SAAS;AAAA,EACtB;AACA,QAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AACvD,MAAI;AACF,IAAAA,SAAQ,KAAK,CAAC,MAAM,KAAK,SAAS;AAAA,EACpC,QAAQ;AACN,QAAI,CAAC,MAAM,OAAQ,OAAM,KAAK,SAAS;AAAA,EACzC;AACF;AAEA,eAAsB,gBACpB,SACA,YAAY,KACZ,KACA;AACA,QAAM,UAAU,KAAK,IAAI,KAAK,KAAK,IAAI,MAAS,KAAK,MAAM,aAAa,GAAI,CAAC,CAAC;AAC9E,QAAM,YAAY,KAAK,IAAI;AAE3B,SAAO,MAAM,IAAI,QASd,CAAC,SAAS,WAAW;AACtB,UAAM,QAAQ,MAAM,SAAS;AAAA,MAC3B,OAAO;AAAA,MACP;AAAA,MACA,aAAa;AAAA,MACb,UAAUA,SAAQ,aAAa;AAAA,MAC/B,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AAED,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,WAAW;AACf,QAAI,UAAU;AAEd,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAClC,eAAS,aAAa,QAAQ,KAAK;AAAA,IACrC,CAAC;AACD,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAClC,eAAS,aAAa,QAAQ,KAAK;AAAA,IACrC,CAAC;AAED,UAAM,QAAQ,WAAW,YAAY;AACnC,iBAAW;AACX,YAAM,cAAc,KAAK;AAAA,IAC3B,GAAG,OAAO;AAEV,UAAM,KAAK,SAAS,CAAC,UAAU;AAC7B,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,aAAO,KAAK;AAAA,IACd,CAAC;AAED,UAAM,KAAK,SAAS,CAAC,MAAM,WAAW;AACpC,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,cAAQ;AAAA,QACN;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,KAAK,IAAI,IAAI;AAAA,QAC1B,WAAW;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAgBA,IAAM,mBAAmB,oBAAI,IAA4B;AACzD,IAAM,wBAAwB;AAC9B,IAAM,gCAAgC,KAAK,KAAK;AAEhD,SAAS,0BAA0B;AACjC,QAAM,MAAM,KAAK,IAAI;AACrB,aAAW,CAAC,IAAI,IAAI,KAAK,kBAAkB;AACzC,QACE,KAAK,YAAY,QACjB,MAAM,KAAK,UAAU,+BACrB;AACA,uBAAiB,OAAO,EAAE;AAAA,IAC5B;AAAA,EACF;AAEA,MAAI,iBAAiB,QAAQ,sBAAuB;AACpD,QAAM,WAAW,CAAC,GAAG,iBAAiB,OAAO,CAAC,EAC3C,OAAO,CAAC,SAAS,KAAK,YAAY,IAAI,EACtC,KAAK,CAAC,GAAG,OAAO,EAAE,WAAW,MAAM,EAAE,WAAW,EAAE;AACrD,aAAW,QAAQ,UAAU;AAC3B,QAAI,iBAAiB,QAAQ,sBAAuB;AACpD,qBAAiB,OAAO,KAAK,EAAE;AAAA,EACjC;AACF;AAEA,eAAsB,uBAAuB,SAAiB,KAAc;AAC1E,0BAAwB;AACxB,MAAI,iBAAiB,QAAQ,uBAAuB;AAClD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,MAAM,SAAS;AAAA,IAC3B,OAAO;AAAA,IACP;AAAA,IACA,aAAa;AAAA,IACb,UAAUA,SAAQ,aAAa;AAAA,IAC/B,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,EAClC,CAAC;AAED,QAAM,KAAKD,QAAO,WAAW;AAC7B,QAAM,OAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,WAAW,KAAK,IAAI;AAAA,IACpB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,mBAAiB,IAAI,IAAI,IAAI;AAE7B,QAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAClC,SAAK,SAAS,aAAa,KAAK,QAAQ,KAAK;AAAA,EAC/C,CAAC;AACD,QAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAClC,SAAK,SAAS,aAAa,KAAK,QAAQ,KAAK;AAAA,EAC/C,CAAC;AACD,QAAM,KAAK,SAAS,CAAC,UAAU;AAC7B,SAAK,SAAS,aAAa,KAAK,QAAQ,OAAO,MAAM,OAAO;AAC5D,SAAK,UAAU,KAAK,IAAI;AAAA,EAC1B,CAAC;AACD,QAAM,KAAK,SAAS,CAAC,MAAM,WAAW;AACpC,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,UAAU,KAAK,IAAI;AAAA,EAC1B,CAAC;AAED,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,KAAK,MAAM,OAAO;AAAA,IAClB;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,QAAQ;AAAA,IACR,YAAY,IAAI,KAAK,KAAK,SAAS,EAAE,YAAY;AAAA,EACnD;AACF;AAEA,SAAS,sBAAsB,WAAmB;AAChD,0BAAwB;AACxB,QAAM,OAAO,iBAAiB,IAAI,SAAS;AAC3C,MAAI,CAAC,MAAM;AACT,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,wBAAwB,WAAmB;AACzD,QAAM,OAAO,sBAAsB,SAAS;AAC5C,SAAO;AAAA,IACL,YAAY,KAAK;AAAA,IACjB,KAAK,KAAK,MAAM,OAAO;AAAA,IACvB,SAAS,KAAK;AAAA,IACd,KAAK,KAAK;AAAA,IACV,QAAQ,KAAK,YAAY,OAAO,YAAY;AAAA,IAC5C,WAAW,KAAK;AAAA,IAChB,QAAQ,KAAK;AAAA,IACb,YAAY,IAAI,KAAK,KAAK,SAAS,EAAE,YAAY;AAAA,IACjD,UAAU,KAAK,YAAY,OAAO,OAAO,IAAI,KAAK,KAAK,OAAO,EAAE,YAAY;AAAA,IAC5E,cAAc,KAAK,WAAW,KAAK,IAAI,KAAK,KAAK;AAAA,EACnD;AACF;AAEO,SAAS,yBAAyB,WAAmB;AAC1D,QAAM,OAAO,sBAAsB,SAAS;AAC5C,SAAO;AAAA,IACL,GAAG,wBAAwB,SAAS;AAAA,IACpC,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,WACE,OAAO,WAAW,KAAK,MAAM,KAAK,qBAClC,OAAO,WAAW,KAAK,MAAM,KAAK;AAAA,EACtC;AACF;AAEA,eAAsB,mBAAmB,WAAmB;AAC1D,QAAM,OAAO,sBAAsB,SAAS;AAC5C,MAAI,KAAK,YAAY,MAAM;AACzB,WAAO;AAAA,MACL,GAAG,wBAAwB,SAAS;AAAA,MACpC,SAAS;AAAA,MACT,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,cAAc,KAAK,KAAK;AAC9B,QAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACtD,SAAO;AAAA,IACL,GAAG,wBAAwB,SAAS;AAAA,IACpC,SAAS;AAAA,IACT,gBAAgB;AAAA,EAClB;AACF;AAGA,eAAsB,0BAA0B;AAC9C,QAAM,UAAU,CAAC,GAAG,iBAAiB,OAAO,CAAC,EAAE;AAAA,IAC7C,CAAC,SAAS,KAAK,YAAY;AAAA,EAC7B;AACA,QAAM,QAAQ;AAAA,IACZ,QAAQ,IAAI,OAAO,SAAS;AAC1B,YAAM,cAAc,KAAK,KAAK,EAAE,MAAM,MAAM,MAAS;AAAA,IACvD,CAAC;AAAA,EACH;AACF;;;ACpSA,OAAOE,aAAY;AACnB,SAAS,wBAAwB;AACjC,OAAOC,SAAQ;AACf,OAAO,QAAQ;AACf,OAAOC,WAAU;AAEjB,IAAM,eAAe,IAAI,KAAK,KAAK,KAAK;AACxC,IAAM,qBAAqB,KAAK,OAAO;AACvC,IAAM,iBAAiB,MAAM,OAAO;AAmBpC,IAAM,WAAW,MACf,QAAQ,IAAI,uBACZA,MAAK,KAAK,GAAG,QAAQ,GAAG,cAAc,MAAM;AAE9C,eAAe,iBAAiB;AAC9B,QAAMD,IAAG,MAAM,SAAS,GAAG,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAC7D;AAEA,eAAe,aAAa,WAAiD;AAC3E,MAAI;AACF,WAAO,KAAK;AAAA,MACV,MAAMA,IAAG,SAASC,MAAK,KAAK,WAAW,eAAe,GAAG,MAAM;AAAA,IACjE;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,sBAAsB;AACnC,QAAM,eAAe;AACrB,QAAM,UAAU,MAAMD,IAAG,QAAQ,SAAS,GAAG,EAAE,eAAe,KAAK,CAAC;AACpE,SAAO,QACJ,OAAO,CAAC,UAAU,MAAM,YAAY,CAAC,EACrC,IAAI,CAAC,UAAUC,MAAK,KAAK,SAAS,GAAG,MAAM,IAAI,CAAC;AACrD;AAEA,eAAe,mBAAmB;AAChC,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,YAAkE,CAAC;AAEzE,aAAW,aAAa,MAAM,oBAAoB,GAAG;AACnD,UAAM,WAAW,MAAM,aAAa,SAAS;AAC7C,QAAI,CAAC,UAAU;AACb,YAAMD,IAAG,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAC9E;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,MAAM,SAAS,SAAS;AAC7C,QAAI,CAAC,OAAO,SAAS,OAAO,KAAK,MAAM,UAAU,cAAc;AAC7D,YAAMA,IAAG,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAC9E;AAAA,IACF;AAEA,cAAU,KAAK,EAAE,WAAW,SAAS,CAAC;AAAA,EACxC;AAEA,YAAU;AAAA,IACR,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,SAAS,SAAS,IAAI,KAAK,MAAM,EAAE,SAAS,SAAS;AAAA,EAC9E;AAEA,MAAI,QAAQ,UAAU,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,SAAS,OAAO,CAAC;AACxE,aAAW,QAAQ,WAAW;AAC5B,QAAI,SAAS,eAAgB;AAC7B,UAAMA,IAAG,GAAG,KAAK,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AACnF,aAAS,KAAK,SAAS;AAAA,EACzB;AACF;AAEA,SAAS,aACP,MACA,MACA;AACA,QAAM,YAAY,SAAS,eAAe,KAAK,OAAO,KAAK;AAC3D,SAAO,OAAO,cAAc,YAAY,UAAU,KAAK,IAAI,YAAY;AACzE;AAEA,eAAsB,mBACpB,MACA,MAC8B;AAC9B,QAAM,aAAa,aAAa,MAAM,IAAI;AAC1C,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,iBAAiB;AAEvB,MAAI,UAAU;AACd,MAAI;AACJ,MAAI,QAAQ;AACZ,MAAI,WAA0B;AAE9B,MAAI;AACF,UAAM,OAAO,MAAMA,IAAG,KAAK,UAAU;AACrC,QAAI,CAAC,KAAK,OAAO,EAAG,QAAO;AAC3B,cAAU;AACV,WAAO,KAAK;AACZ,YAAQ,KAAK;AACb,QAAI,QAAQ,mBAAoB,QAAO;AACvC,eAAW,MAAMA,IAAG,SAAS,UAAU;AAAA,EACzC,SAAS,OAAO;AACd,UAAM,OACJ,SAAS,OAAO,UAAU,YAAY,UAAU,QAC5C,OAAQ,MAA6B,IAAI,IACzC;AACN,QAAI,SAAS,SAAU,OAAM;AAAA,EAC/B;AAEA,QAAM,KAAK,GAAG,KAAK,IAAI,CAAC,IAAID,QAAO,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AAC3D,QAAM,YAAYE,MAAK,KAAK,SAAS,GAAG,EAAE;AAC1C,QAAMD,IAAG,MAAM,WAAW,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAE1D,MAAI,UAAU;AACZ,UAAMA,IAAG,UAAUC,MAAK,KAAK,WAAW,aAAa,GAAG,UAAU,EAAE,MAAM,IAAM,CAAC;AAAA,EACnF;AAEA,QAAM,WAAyB;AAAA,IAC7B;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,IACrC;AAAA,EACF;AAEA,QAAMD,IAAG;AAAA,IACPC,MAAK,KAAK,WAAW,eAAe;AAAA,IACpC,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI;AAAA,IACpC,EAAE,MAAM,IAAM;AAAA,EAChB;AAEA,QAAM,iBAAiB;AACvB,SAAO,EAAE,IAAI,WAAW,SAAS;AACnC;AAEA,eAAe,SAAS,UAAkB;AACxC,QAAM,OAAOF,QAAO,WAAW,QAAQ;AACvC,mBAAiB,SAAS,iBAAiB,QAAQ,EAAG,MAAK,OAAO,KAAK;AACvE,SAAO,KAAK,OAAO,KAAK;AAC1B;AAEA,eAAsB,qBAAqB,UAA+B;AACxE,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI;AACF,aAAS,SAAS,iBAAiB,MAAM,SAAS,SAAS,SAAS,UAAU;AAC9E,UAAMC,IAAG;AAAA,MACPC,MAAK,KAAK,SAAS,WAAW,eAAe;AAAA,MAC7C,KAAK,UAAU,SAAS,UAAU,MAAM,CAAC,IAAI;AAAA,MAC7C,EAAE,MAAM,IAAM;AAAA,IAChB;AACA,WAAO;AAAA,EACT,QAAQ;AACN,UAAM,oBAAoB,QAAQ;AAClC,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,oBAAoB,UAA+B;AACvE,MAAI,CAAC,SAAU;AACf,QAAMD,IAAG,GAAG,SAAS,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AACzF;AAEA,eAAe,iBAAiB;AAC9B,QAAM,iBAAiB;AACvB,QAAM,aAAmE,CAAC;AAC1E,aAAW,aAAa,MAAM,oBAAoB,GAAG;AACnD,UAAM,WAAW,MAAM,aAAa,SAAS;AAC7C,QAAI,SAAU,YAAW,KAAK,EAAE,WAAW,SAAS,CAAC;AAAA,EACvD;AACA,aAAW;AAAA,IACT,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,SAAS,SAAS,IAAI,KAAK,MAAM,EAAE,SAAS,SAAS;AAAA,EAC9E;AACA,SAAO;AACT;AAEA,eAAsB,gBAAgB,QAAQ,IAAI;AAChD,QAAM,cAAc,MAAM,eAAe,GAAG;AAAA,IAC1C;AAAA,IACA,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,EAC9C;AAEA,SAAO,QAAQ;AAAA,IACb,WAAW,IAAI,OAAO,EAAE,SAAS,MAAM;AACrC,UAAI,SAAsD;AAE1D,UAAI,SAAS,gBAAgB;AAC3B,YAAI;AACF,gBAAM,cAAc,MAAM,SAAS,SAAS,UAAU;AACtD,mBACE,gBAAgB,SAAS,iBAAiB,UAAU;AAAA,QACxD,QAAQ;AACN,mBAAS;AAAA,QACX;AAAA,MACF;AAEA,aAAO;AAAA,QACL,IAAI,SAAS;AAAA,QACb,YAAY,SAAS;AAAA,QACrB,MAAM,SAAS;AAAA,QACf,MAAM,SAAS;AAAA,QACf,OAAO,SAAS;AAAA,QAChB,gBAAgB,SAAS;AAAA,QACzB,eAAe,QAAQ,SAAS,cAAc;AAAA,QAC9C,UAAU,WAAW;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,eAAe,qBAAqB,WAA0D;AAC5F,QAAM,EAAE,WAAW,SAAS,IAAI;AAEhC,MAAI,CAAC,SAAS,gBAAgB;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,kBAAc,MAAM,SAAS,SAAS,UAAU;AAAA,EAClD,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,SAAS,gBAAgB;AAC3C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,SAAS;AACpB,UAAM,WAAW,MAAMA,IAAG,SAASC,MAAK,KAAK,WAAW,aAAa,CAAC;AACtE,UAAMD,IAAG,MAAMC,MAAK,QAAQ,SAAS,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACrE,UAAMD,IAAG,UAAU,SAAS,YAAY,QAAQ;AAChD,QAAI,SAAS,SAAS,QAAW;AAC/B,YAAMA,IAAG,MAAM,SAAS,YAAY,SAAS,IAAI,EAAE,MAAM,MAAM,MAAS;AAAA,IAC1E;AAAA,EACF,OAAO;AACL,UAAMA,IAAG,GAAG,SAAS,YAAY,EAAE,OAAO,KAAK,CAAC;AAAA,EAClD;AAEA,QAAMA,IAAG,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAEvD,SAAO;AAAA,IACL,UAAU;AAAA,IACV,WAAW,SAAS;AAAA,IACpB,MAAM,SAAS;AAAA,IACf,MAAM,SAAS;AAAA,IACf,mBAAmB;AAAA,EACrB;AACF;AAEA,eAAsB,WAAW,UAAkB;AACjD,QAAM,aAAa,MAAM,eAAe,GAAG,KAAK,CAAC,EAAE,SAAS,MAAM,SAAS,OAAO,QAAQ;AAC1F,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AACA,SAAO,qBAAqB,SAAS;AACvC;AAYA,IAAM,4BAAyC;AAAA,EAC7C;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,qBAAqB,SAAiB;AACpD,MAAI,QAAQ,IAAI,gCAAgC,IAAK;AAErD,aAAW,QAAQ,2BAA2B;AAC5C,QAAI,KAAK,QAAQ,KAAK,OAAO,GAAG;AAC9B,YAAM,IAAI;AAAA,QACR,yCACE,KAAK,SACL;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;;;ACrVA,OAAOE,SAAQ;AACf,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAUjB,IAAM,sBAAsB,oBAAI,IAAI;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,aAAa,CAAC,UAAkB;AACpC,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,YAAY,IAAK,QAAOD,IAAG,QAAQ;AACvC,MAAI,QAAQ,WAAW,IAAI,KAAK,QAAQ,WAAW,KAAK,GAAG;AACzD,WAAOC,MAAK,KAAKD,IAAG,QAAQ,GAAG,QAAQ,MAAM,CAAC,CAAC;AAAA,EACjD;AACA,SAAO,QACJ,QAAQ,mBAAmBA,IAAG,QAAQ,CAAC,EACvC,QAAQ,aAAaA,IAAG,QAAQ,CAAC;AACtC;AAEA,IAAM,cAAc,CAAC,UAAkB;AACrC,QAAM,WAAWC,MAAK,QAAQ,WAAW,KAAK,CAAC;AAC/C,SAAO,QAAQ,aAAa,UAAU,SAAS,YAAY,IAAI;AACjE;AAEA,eAAe,gBAAgB,YAAoB;AACjD,QAAM,WAAWA,MAAK,QAAQ,WAAW,UAAU,CAAC;AACpD,MAAI;AACF,WAAO,YAAY,MAAMF,IAAG,SAAS,QAAQ,CAAC;AAAA,EAChD,QAAQ;AACN,UAAM,UAAoB,CAAC;AAC3B,QAAI,SAAS;AAEb,WAAO,MAAM;AACX,UAAI;AACF,cAAM,aAAa,MAAMA,IAAG,SAAS,MAAM;AAC3C,eAAO,YAAYE,MAAK,KAAK,YAAY,GAAG,QAAQ,QAAQ,CAAC,CAAC;AAAA,MAChE,QAAQ;AACN,cAAM,SAASA,MAAK,QAAQ,MAAM;AAClC,YAAI,WAAW,OAAQ,QAAO,YAAY,QAAQ;AAClD,gBAAQ,KAAKA,MAAK,SAAS,MAAM,CAAC;AAClC,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,WAAW,CAAC,QAAgB,SAAiB;AACjD,QAAM,WAAWA,MAAK,SAAS,MAAM,MAAM;AAC3C,SACE,aAAa,MACZ,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,QAAQ;AAE5D;AAEA,SAAS,wBAAwB;AAC/B,QAAM,OAAOD,IAAG,QAAQ;AACxB,QAAM,QAAQ;AAAA,IACZC,MAAK,KAAK,MAAM,MAAM;AAAA,IACtBA,MAAK,KAAK,MAAM,MAAM;AAAA,IACtBA,MAAK,KAAK,MAAM,QAAQ;AAAA,IACxBA,MAAK,KAAK,MAAM,QAAQ;AAAA,IACxBA,MAAK,KAAK,MAAM,OAAO;AAAA,IACvBA,MAAK,KAAK,MAAM,SAAS;AAAA,IACzBA,MAAK,KAAK,MAAM,WAAW,QAAQ;AAAA,EACrC;AAEA,MAAI,QAAQ,aAAa,UAAU;AACjC,UAAM;AAAA,MACJA,MAAK,KAAK,MAAM,WAAW,uBAAuB,UAAU,QAAQ;AAAA,MACpEA,MAAK,KAAK,MAAM,WAAW,uBAAuB,gBAAgB;AAAA,MAClEA,MAAK,KAAK,MAAM,WAAW,uBAAuB,SAAS;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,UAAU,QAAQ,IAAI;AAC5B,UAAM,eAAe,QAAQ,IAAI;AACjC,QAAI,SAAS;AACX,YAAM,KAAKA,MAAK,KAAK,SAAS,WAAW,SAAS,CAAC;AAAA,IACrD;AACA,QAAI,cAAc;AAChB,YAAM;AAAA,QACJA,MAAK,KAAK,cAAc,UAAU,UAAU,WAAW;AAAA,QACvDA,MAAK,KAAK,cAAc,aAAa,QAAQ,WAAW;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,QAAgB;AAC9C,QAAM,WAAWA,MAAK,SAAS,MAAM,EAAE,YAAY;AACnD,MAAI,aAAa,UAAU,SAAS,WAAW,OAAO,EAAG,QAAO;AAChE,MAAI,oBAAoB,IAAI,QAAQ,EAAG,QAAO;AAE9C,QAAM,aAAa,OAAO,QAAQ,OAAO,GAAG,EAAE,YAAY;AAC1D,MAAI,WAAW,SAAS,sBAAsB,EAAG,QAAO;AACxD,MAAI,WAAW,SAAS,eAAe,EAAG,QAAO;AAEjD,SAAO;AACT;AAEA,eAAsB,kBACpB,YACA,SAA0B,CAAC,GAC3B;AACA,QAAM,SAAS,MAAM,gBAAgB,UAAU;AAE/C,QAAM,mBAAmB,OAAO,kBAAkB,CAAC,GAAG;AAAA,IACpD,CAAC,SAAS,OAAO,SAAS,YAAY,KAAK,KAAK;AAAA,EAClD;AACA,QAAM,QAAQ,MAAM,QAAQ,IAAI,gBAAgB,IAAI,eAAe,CAAC;AAEpE,MAAI,MAAM,UAAU,CAAC,MAAM,KAAK,CAAC,SAAS,SAAS,QAAQ,IAAI,CAAC,GAAG;AACjE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,0BAA0B,OAAO;AAC1C,UAAM,kBAAkB;AAAA,MACtB,GAAG,sBAAsB;AAAA,MACzB,GAAI,OAAO,kBAAkB,CAAC;AAAA,IAChC,EAAE,OAAO,CAAC,SAAS,OAAO,SAAS,YAAY,KAAK,KAAK,CAAC;AAC1D,UAAM,iBAAiB,MAAM,QAAQ;AAAA,MACnC,gBAAgB,IAAI,eAAe;AAAA,IACrC;AACA,UAAM,wBAAwB,MAAM,QAAQ;AAAA,OACzC,OAAO,uBAAuB,CAAC,GAC7B,OAAO,CAAC,SAAS,OAAO,SAAS,YAAY,KAAK,KAAK,CAAC,EACxD,IAAI,eAAe;AAAA,IACxB;AACA,UAAM,oBAAoB,sBAAsB;AAAA,MAAK,CAAC,SACpD,SAAS,QAAQ,IAAI;AAAA,IACvB;AAEA,QACE,CAAC,sBACA,uBAAuB,MAAM,KAC5B,eAAe,KAAK,CAAC,SAAS,SAAS,QAAQ,IAAI,CAAC,IACtD;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,QAA2C;AACzE,SAAO;AAAA,IACL,gBAAgB,MAAM;AAAA,MACpB,IAAI,KAAK,QAAQ,kBAAkB,CAAC,GAAG,OAAO,CAAC,SAAS,OAAO,SAAS,YAAY,KAAK,KAAK,CAAC,CAAC;AAAA,IAClG,EAAE,MAAM,GAAG,EAAE;AAAA,IACb,uBAAuB,QAAQ,0BAA0B;AAAA,IACzD,gBAAgB,MAAM;AAAA,MACpB,IAAI,KAAK,QAAQ,kBAAkB,CAAC,GAAG,OAAO,CAAC,SAAS,OAAO,SAAS,YAAY,KAAK,KAAK,CAAC,CAAC;AAAA,IAClG,EAAE,MAAM,GAAG,EAAE;AAAA,IACb,qBAAqB,MAAM;AAAA,MACzB,IAAI,KAAK,QAAQ,uBAAuB,CAAC,GAAG,OAAO,CAAC,SAAS,OAAO,SAAS,YAAY,KAAK,KAAK,CAAC,CAAC;AAAA,IACvG,EAAE,MAAM,GAAG,EAAE;AAAA,IACb,aAAa,QAAQ,gBAAgB;AAAA,EACvC;AACF;;;AC9IA,IAAM,aAAa,oBAAI,IAAc;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,kBAAkB,oBAAI,IAAc;AAAA,EACxC,GAAG;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,aAAa,oBAAI,IAAc;AAAA,EACnC,GAAG;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,cAAgC;AAAA,EACpC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,SAAS;AAAA,QACvB,OAAO,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,IAAI,SAAS,EAAE;AAAA,MAChE;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,MACjB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,SAAS;AAAA,QACvB,QAAQ,EAAE,MAAM,UAAU;AAAA,QAC1B,QAAQ,EAAE,MAAM,WAAW,SAAS,EAAE;AAAA,MACxC;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,MACjB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE;AAAA,MACvC,UAAU,CAAC,MAAM;AAAA,MACjB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,GAAG,sBAAsB,MAAM;AAAA,EAC7E;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM,EAAE,MAAM,SAAS;AAAA,QACvB,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,WAAW,QAAQ,GAAG,SAAS,UAAU;AAAA,MAC1E;AAAA,MACA,UAAU,CAAC,QAAQ,SAAS;AAAA,MAC5B,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,SAAS;AAAA,QAC5B,YAAY,EAAE,MAAM,SAAS;AAAA,QAC7B,YAAY,EAAE,MAAM,SAAS;AAAA,QAC7B,uBAAuB,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,EAAE;AAAA,MACnE;AAAA,MACA,UAAU,CAAC,aAAa,cAAc,YAAY;AAAA,MAClD,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,WAAW,SAAS,GAAG,SAAS,KAAK,SAAS,GAAG;AAAA,MAClE;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,SAAS;AAAA,MAC9B;AAAA,MACA,UAAU,CAAC,WAAW;AAAA,MACtB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,GAAG,sBAAsB,MAAM;AAAA,EAC7E;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,YAAY,EAAE,MAAM,WAAW,SAAS,KAAK,SAAS,MAAQ,SAAS,IAAK;AAAA,QAC5E,KAAK,EAAE,MAAM,SAAS;AAAA,QACtB,YAAY,EAAE,MAAM,WAAW,SAAS,MAAM;AAAA,MAChD;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,MACpB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,EAAE;AAAA,MAC7C,UAAU,CAAC,YAAY;AAAA,MACvB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,EAAE;AAAA,MAC7C,UAAU,CAAC,YAAY;AAAA,MACvB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,EAAE;AAAA,MAC7C,UAAU,CAAC,YAAY;AAAA,MACvB,sBAAsB;AAAA,IACxB;AAAA,EACF;AACF;AAEA,IAAM,aAAa,CAAC,WAAgC;AAAA,EAClD,SAAS;AAAA,IACP;AAAA,MACE,MAAM;AAAA,MACN,MAAM,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,IACzE;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAAqB,KAAa;AACxD,QAAM,QAAQ,KAAK,GAAG;AACtB,MAAI,OAAO,UAAU,SAAU,OAAM,IAAI,MAAM,GAAG,GAAG,oBAAoB;AACzE,SAAO;AACT;AAEA,SAAS,eAAe,MAAqB,KAAa;AACxD,QAAM,QAAQ,KAAK,GAAG;AACtB,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ;AACvE;AAEA,SAAS,eAAe,MAAqB,KAAa;AACxD,QAAM,QAAQ,KAAK,GAAG;AACtB,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,QAAQ;AAC7D;AAEO,IAAM,yBAAN,MAA6B;AAAA,EAClC,YAA6B,OAAsB,WAAW;AAAjC;AAAA,EAAkC;AAAA,EAAlC;AAAA,EAErB,eAAe;AACrB,QAAI,KAAK,SAAS,OAAQ,QAAO;AACjC,QAAI,KAAK,SAAS,YAAa,QAAO;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY;AACV,UAAM,UAAU,KAAK,aAAa;AAClC,WAAO,YAAY,OAAO,CAAC,SAAS,QAAQ,IAAI,KAAK,IAAI,CAAC;AAAA,EAC5D;AAAA,EAEA,MAAM,SACJ,MACA,OAAsB,CAAC,GACvB,cAA+B,CAAC,GACX;AACrB,UAAM,WAAW;AACjB,QAAI,CAAC,KAAK,aAAa,EAAE,IAAI,QAAQ,GAAG;AACtC,YAAM,IAAI,MAAM,0CAA0C,IAAI,EAAE;AAAA,IAClE;AAEA,UAAM,SAAS,gBAAgB,WAAW;AAE1C,YAAQ,UAAU;AAAA,MAChB,KAAK,kBAAkB;AACrB,cAAM,SAAS,MAAM,kBAAkB,eAAe,MAAM,MAAM,GAAG,MAAM;AAC3E,eAAO;AAAA,UACL,MAAM;AAAA,YACJ;AAAA,YACA,eAAe,MAAM,OAAO,KAAK;AAAA,YACjC,OAAO,cAAc;AACnB,kBAAI;AACF,sBAAM,kBAAkB,WAAW,MAAM;AACzC,uBAAO;AAAA,cACT,QAAQ;AACN,uBAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,SAAS,MAAM,kBAAkB,eAAe,MAAM,MAAM,GAAG,MAAM;AAC3E,eAAO;AAAA,UACL,MAAM;AAAA,YACJ;AAAA,YACA,eAAe,MAAM,QAAQ;AAAA,YAC7B,eAAe,MAAM,QAAQ;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,iBAAiB;AACpB,cAAM,SAAS,MAAM,kBAAkB,eAAe,MAAM,MAAM,GAAG,MAAM;AAC3E,eAAO,WAAW,MAAM,YAAY,MAAM,CAAC;AAAA,MAC7C;AAAA,MACA,KAAK;AACH,eAAO,WAAW,MAAM,cAAc,CAAC;AAAA,MACzC,KAAK,qBAAqB;AACxB,cAAM,UAAU,MAAM,gBAAgB,eAAe,MAAM,OAAO,KAAK,EAAE;AACzE,cAAM,UAAU,CAAC;AACjB,mBAAW,UAAU,SAAS;AAC5B,cAAI;AACF,kBAAM,kBAAkB,OAAO,MAAM,MAAM;AAC3C,oBAAQ,KAAK,MAAM;AAAA,UACrB,QAAQ;AAAA,UAER;AAAA,QACF;AACA,eAAO,WAAW,OAAO;AAAA,MAC3B;AAAA,MACA,KAAK,eAAe;AAClB,YAAI,OAAO,gBAAgB,OAAO;AAChC,gBAAM,IAAI,MAAM,yCAAyC;AAAA,QAC3D;AACA,cAAM,WAAW,eAAe,MAAM,WAAW;AACjD,cAAM,UAAU,MAAM,gBAAgB,GAAG,GAAG,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ;AAC/E,YAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,kDAAkD;AAC/E,cAAM,kBAAkB,OAAO,MAAM,MAAM;AAC3C,eAAO,WAAW,MAAM,WAAW,QAAQ,CAAC;AAAA,MAC9C;AAAA,MACA,KAAK,oBAAoB;AACvB,YAAI,OAAO,gBAAgB,OAAO;AAChC,gBAAM,IAAI,MAAM,yCAAyC;AAAA,QAC3D;AACA,cAAM,UAAU,MAAM,gBAAgB,GAAG;AACzC,mBAAW,UAAU,SAAS;AAC5B,cAAI;AACF,kBAAM,kBAAkB,OAAO,MAAM,MAAM;AAC3C,mBAAO,WAAW,MAAM,WAAW,OAAO,EAAE,CAAC;AAAA,UAC/C,SAAS,OAAO;AACd,kBAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,gBAAI,CAAC,QAAQ,WAAW,uBAAuB,EAAG,OAAM;AAAA,UAC1D;AAAA,QACF;AACA,cAAM,IAAI,MAAM,6DAA6D;AAAA,MAC/E;AAAA,MACA,KAAK,iBAAiB;AACpB,cAAM,UAAU,eAAe,MAAM,SAAS;AAC9C,6BAAqB,OAAO;AAC5B,cAAM,WAAW,eAAe,MAAM,KAAK;AAC3C,aAAK,OAAO,kBAAkB,CAAC,GAAG,UAAU,CAAC,UAAU;AACrD,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,cAAM,MAAM,WAAW,MAAM,kBAAkB,UAAU,MAAM,IAAI;AACnE,YAAI,KAAK,eAAe,MAAM;AAC5B,iBAAO,WAAW,MAAM,uBAAuB,SAAS,GAAG,CAAC;AAAA,QAC9D;AACA,eAAO;AAAA,UACL,MAAM;AAAA,YACJ;AAAA,YACA,eAAe,MAAM,YAAY,KAAK;AAAA,YACtC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK;AACH,eAAO;AAAA,UACL,wBAAwB,eAAe,MAAM,YAAY,CAAC;AAAA,QAC5D;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,yBAAyB,eAAe,MAAM,YAAY,CAAC;AAAA,QAC7D;AAAA,MACF,KAAK;AACH,eAAO;AAAA,UACL,MAAM,mBAAmB,eAAe,MAAM,YAAY,CAAC;AAAA,QAC7D;AAAA,MACF,KAAK;AAAA,MACL,KAAK,cAAc;AACjB,cAAM,UAAU,aAAa,eAAe,SAAS;AACrD,cAAM,SAAS,MAAM,kBAAkB,eAAe,MAAM,OAAO,GAAG,MAAM;AAC5E,cAAM,aAAa,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,OAAO;AAChD,cAAM,WACJ,OAAO,gBAAgB,QACnB,OACA,MAAM,mBAAmB,UAAU,UAAU;AACnD,YAAI;AACF,gBAAM,SACJ,aAAa,eACT,MAAM;AAAA,YACJ;AAAA,YACA,eAAe,MAAM,SAAS;AAAA,YAC9B,KAAK,SAAS,WAAW,WAAW;AAAA,UACtC,IACA,MAAM;AAAA,YACJ;AAAA,YACA,eAAe,MAAM,YAAY;AAAA,YACjC,eAAe,MAAM,YAAY;AAAA,YACjC,eAAe,MAAM,uBAAuB,KAAK;AAAA,UACnD;AAEN,gBAAM,gBAAgB,MAAM,qBAAqB,QAAQ;AACzD,iBAAO,WAAW;AAAA,YAChB,GAAG;AAAA,YACH,gBAAgB;AAAA,YAChB,cAAc,gBAAgB,sBAAsB;AAAA,UACtD,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,oBAAoB,QAAQ;AAClC,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA;AACE,cAAM,IAAI,MAAM,8BAA8B,IAAI;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ;AACZ,UAAM,wBAAwB;AAAA,EAChC;AACF;;;AL5YA,IAAM,UAAU;AAChB,IAAM,iBAAiB;AACvB,IAAM,aAAaC,MAAK,KAAKC,IAAG,QAAQ,GAAG,YAAY;AACvD,IAAM,cAAcD,MAAK,KAAK,YAAY,aAAa;AACvD,IAAM,qBAAqBA,MAAK,KAAKC,IAAG,QAAQ,GAAG,gBAAgB,aAAa;AA4BhF,IAAM,QAAQ,CAAC,OAAe,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAE9E,IAAM,gBAAgBC,SAAQ,OAAO,SAAS,CAACA,SAAQ,IAAI;AAC3D,IAAM,QAAQ,CAAC,MAAc,UAC3B,gBAAgB,QAAQ,IAAI,IAAI,KAAK,YAAY;AACnD,IAAM,MAAM,CAAC,UAAkB,MAAM,KAAK,KAAK;AAC/C,IAAM,OAAO,CAAC,UAAkB,MAAM,MAAM,KAAK;AACjD,IAAM,QAAQ,CAAC,UAAkB,MAAM,MAAM,KAAK;AAClD,IAAM,SAAS,CAAC,UAAkB,MAAM,MAAM,KAAK;AACnD,IAAM,MAAM,CAAC,UAAkB,MAAM,MAAM,KAAK;AAChD,IAAM,OAAO,CAAC,UAAkB,MAAM,KAAK,KAAK;AAEhD,SAAS,UAAU;AACjB,UAAO,oBAAI,KAAK,GAAE,mBAAmB,CAAC,GAAG;AAAA,IACvC,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,SAAS,QACP,OACA,SACA;AACA,QAAM,OACJ,UAAU,YAAY,MAAM,QAAG,IAC/B,UAAU,SAAS,OAAO,GAAG,IAC7B,UAAU,UAAU,IAAI,MAAG,IAC3B,UAAU,UAAU,KAAK,QAAG,IAC5B,KAAK,QAAG;AACV,EAAAA,SAAQ,OAAO,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,KAAK,IAAI,KAAK,OAAO;AAAA,CAAI;AACjE;AAEA,SAAS,SAAS;AAChB,EAAAA,SAAQ,OAAO,MAAM,IAAI;AACzB,EAAAA,SAAQ,OAAO,MAAM,KAAK,YAAY,IAAI,OAAO,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI;AAC1E,EAAAA,SAAQ,OAAO,MAAM,IAAI,0BAA0B,IAAI,MAAM;AAC/D;AAEA,SAAS,QAAQ,MAAc;AAC7B,SAAOA,SAAQ,KAAK,SAAS,IAAI;AACnC;AAEA,SAAS,eAAqB;AAC5B,MAAI,QAAQ,QAAQ,EAAG,QAAO;AAC9B,SAAO;AACT;AAEA,SAAS,gBAAgB,MAAY;AACnC,SAAO,SAAS;AAClB;AAEA,SAAS,UAAU,MAAY;AAC7B,SAAO,gBAAgB,IAAI,IAAI,mBAAmB;AACpD;AAEA,eAAe,aAA0C;AACvD,MAAI;AACF,WAAO,KAAK,MAAM,MAAMC,IAAG,SAAS,aAAa,MAAM,CAAC;AAAA,EAC1D,QAAQ;AACN,QAAI;AACF,YAAM,SAAS,KAAK;AAAA,QAClB,MAAMA,IAAG,SAAS,oBAAoB,MAAM;AAAA,MAC9C;AACA,YAAM,YAAY,MAAM;AACxB,cAAQ,WAAW,sDAAsD;AACzE,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,YAAY,QAAqB;AAC9C,QAAMA,IAAG,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAMA,IAAG,UAAU,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,MAAM;AAAA,IACtE,MAAM;AAAA,EACR,CAAC;AACH;AAEA,eAAe,cAAc;AAC3B,QAAM,QAAQ,IAAI;AAAA,IAChBA,IAAG,GAAG,aAAa,EAAE,OAAO,KAAK,CAAC;AAAA,IAClCA,IAAG,GAAG,oBAAoB,EAAE,OAAO,KAAK,CAAC;AAAA,EAC3C,CAAC;AACD,UAAQ,WAAW,mCAAmC;AACxD;AAEA,SAAS,YAAY,KAAa;AAChC,QAAM,UACJD,SAAQ,aAAa,UACjB,QACAA,SAAQ,aAAa,WACnB,SACA;AACR,QAAM,OACJA,SAAQ,aAAa,UACjB,CAAC,MAAM,SAAS,IAAI,GAAG,IACvB,CAAC,GAAG;AAEV,QAAM,QAAQE,OAAM,SAAS,MAAM;AAAA,IACjC,UAAU;AAAA,IACV,OAAO;AAAA,EACT,CAAC;AACD,QAAM,MAAM;AACd;AAEA,eAAe,KAAK,QAAgB,MAAkC;AACpE,QAAM,aAAaH,IAAG,SAAS;AAC/B,QAAM,WAAW,MAAM,MAAM,SAAS,qBAAqB;AAAA,IACzD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU;AAAA,MACnB,aAAa;AAAA,MACb,UAAUC,SAAQ;AAAA,MAClB,MAAMA,SAAQ;AAAA,MACd,UAAUD,IAAG,SAAS;AAAA,IACxB,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,qCAAqC,SAAS,MAAM;AAAA,EACtE;AAEA,QAAM,UAAW,MAAM,SAAS,KAAK;AAErC,SAAO;AACP,UAAQ,QAAQ,WAAW,KAAK,UAAU,CAAC,SAAMC,SAAQ,QAAQ,IAAIA,SAAQ,IAAI,SAAM,UAAU,IAAI,CAAC,EAAE;AACxG,UAAQ,SAAS,0DAAqD;AACtE,EAAAA,SAAQ,OAAO,MAAM,uBAAuB,KAAK,KAAK,QAAQ,SAAS,CAAC,IAAI,IAAI;AAChF,EAAAA,SAAQ,OAAO,MAAM,OAAO,IAAI,QAAQ,yBAAyB,IAAI,MAAM;AAC3E,cAAY,QAAQ,yBAAyB;AAC7C,UAAQ,QAAQ,iCAA4B;AAE5C,QAAM,YAAY,KAAK,IAAI;AAC3B,SAAO,KAAK,IAAI,IAAI,YAAY,QAAQ,aAAa,KAAM;AACzD,UAAM,MAAM,KAAK,IAAI,QAAQ,UAAU,CAAC,IAAI,GAAI;AAEhD,UAAM,gBAAgB,MAAM,MAAM,SAAS,qBAAqB;AAAA,MAC9D,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QACnB,aAAa,QAAQ;AAAA,QACrB,eAAe,QAAQ;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AAED,QAAI,cAAc,WAAW,KAAK;AAChC,UAAIA,SAAQ,OAAO,MAAO,CAAAA,SAAQ,OAAO,MAAM,IAAI,MAAG,CAAC;AACvD;AAAA,IACF;AAEA,QAAI,CAAC,cAAc,IAAI;AACrB,YAAM,OAAO,MAAM,cAAc,KAAK;AACtC,YAAM,IAAI,MAAM,qBAAqB,IAAI;AAAA,IAC3C;AAEA,UAAM,SAAU,MAAM,cAAc,KAAK;AACzC,IAAAA,SAAQ,OAAO,MAAM,IAAI;AACzB,YAAQ,WAAW,oBAAoB;AAEvC,UAAM,SAAsB;AAAA,MAC1B,UAAU,OAAO;AAAA,MACjB,aAAa,OAAO;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,YAAY,MAAM;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,iDAAiD;AACnE;AAEA,IAAM,gBAAN,MAAoB;AAAA,EACD;AAAA,EAEjB,YAAY,MAAY;AACtB,SAAK,OAAO,IAAI;AAAA,MACd,gBAAgB,IAAI,IAAI,SAAS;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ;AACZ,WAAO,KAAK,KAAK,UAAU;AAAA,EAC7B;AAAA,EAEA,MAAM,KACJ,MACA,MACA,QACA;AACA,WAAO,KAAK,KAAK,SAAS,MAAM,MAAM,MAAM;AAAA,EAC9C;AAAA,EAEA,MAAM,QAAQ;AACZ,UAAM,KAAK,KAAK,MAAM;AAAA,EACxB;AACF;AAEA,eAAe,aAAa,QAAqB;AAC/C,QAAM,OAAO,IAAI,cAAc,OAAO,IAAI;AAC1C,SAAO;AACP,UAAQ,QAAQ,WAAW,KAAK,OAAO,UAAU,CAAC,SAAMA,SAAQ,QAAQ,IAAIA,SAAQ,IAAI,EAAE;AAC1F;AAAA,IACE;AAAA,IACA,uBAAuB,gBAAgB,OAAO,IAAI,IAAI,MAAM,gBAAgB,IAAI,KAAK,mBAAmB,CAAC;AAAA,EAC3G;AAEA,QAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,UAAQ,WAAW,sBAAsB,MAAM,MAAM,UAAU;AAC/D,EAAAA,SAAQ,OAAO,MAAM,YAAY,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,QAAK,CAAC,IAAI,IAAI;AACvF,QAAM,QAAQ,IAAI,IAAI,UAAU,OAAO,OAAO,QAAQ,SAAS,IAAI,CAAC;AAEpE,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,QAAM,WAAW,YAAY;AAC3B,cAAU;AACV,UAAM,KAAK,MAAM,EAAE,MAAM,MAAM,MAAS;AACxC,IAAAA,SAAQ,KAAK,CAAC;AAAA,EAChB;AACA,EAAAA,SAAQ,GAAG,UAAU,QAAQ;AAC7B,EAAAA,SAAQ,GAAG,WAAW,QAAQ;AAE9B,SAAO,CAAC,SAAS;AACf,YAAQ,SAAS,oBAAoB,IAAI,MAAM,IAAI,CAAC,QAAG;AACvD,UAAM,KAAK,IAAI,UAAU,OAAO;AAAA,MAC9B,SAAS;AAAA,QACP,eAAe,YAAY,OAAO;AAAA,MACpC;AAAA,IACF,CAAC;AAED,QAAI;AACF,YAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,WAAG,KAAK,QAAQ,OAAO;AACvB,WAAG,KAAK,SAAS,MAAM;AAAA,MACzB,CAAC;AAED,gBAAU;AACV,SAAG;AAAA,QACD,KAAK,UAAU;AAAA,UACb,MAAM;AAAA,UACN,QAAQ;AAAA,YACN,IAAI,OAAO;AAAA,YACX,MAAM,OAAO;AAAA,YACb,UAAUA,SAAQ;AAAA,YAClB,MAAMA,SAAQ;AAAA,YACd,UAAUD,IAAG,SAAS;AAAA,YACtB,cAAc;AAAA,UAChB;AAAA,UACA,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI;AAAA,UACpC,cAAc,CAAC,kBAAkB,oBAAoB,iBAAiB;AAAA,QACxE,CAAC;AAAA,MACH;AAEA,cAAQ,WAAW,wBAAqB,KAAK,OAAO,UAAU,CAAC,SAAM,OAAO,IAAI,OAAO;AACvF,cAAQ,WAAW,4BAA4B;AAC/C,MAAAC,SAAQ,OAAO,MAAM,YAAY,IAAI,OAAO,MAAM,IAAI,IAAI;AAC1D,MAAAA,SAAQ,OAAO,MAAM,YAAY,IAAI,sBAAsB,IAAI,MAAM;AAErE,YAAM,gBAAgB,YAAY;AAChC,YAAI;AACF,gBAAM,MAAM,IAAI,IAAI,yBAAyB,OAAO,MAAM,GAAG;AAAA,YAC3D,QAAQ;AAAA,YACR,SAAS,EAAE,eAAe,YAAY,OAAO,YAAY;AAAA,UAC3D,CAAC;AAAA,QACH,QAAQ;AAAA,QAER;AAAA,MACF;AACA,WAAK,cAAc;AACnB,YAAM,iBAAiB;AAAA,QACrB,MAAM,KAAK,cAAc;AAAA,QACzB,KAAK;AAAA,MACP;AAEA,YAAM,IAAI,QAAc,CAAC,YAAY;AACnC,WAAG,GAAG,WAAW,OAAO,QAAQ;AAC9B,cAAI;AAQJ,cAAI;AACF,sBAAU,KAAK,MAAM,IAAI,SAAS,CAAC;AAAA,UACrC,QAAQ;AACN;AAAA,UACF;AAEA,cACE,QAAQ,SAAS,UACjB,CAAC,QAAQ,MACT,CAAC,QAAQ,MACT;AACA;AAAA,UACF;AAEA,gBAAM,cAAc,KAAK,IAAI;AAC7B,kBAAQ,SAAS,aAAa,KAAK,QAAQ,IAAI,CAAC,SAAM,IAAI,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;AACnF,cAAI;AACF,kBAAM,SAAS,MAAM,KAAK;AAAA,cACxB,QAAQ;AAAA,cACR,QAAQ,aAAa,CAAC;AAAA,cACtB,QAAQ;AAAA,YACV;AACA,oBAAQ,WAAW,aAAa,QAAQ,IAAI,SAAM,KAAK,IAAI,IAAI,WAAW,IAAI;AAC9E,eAAG;AAAA,cACD,KAAK,UAAU;AAAA,gBACb,MAAM;AAAA,gBACN,IAAI,QAAQ;AAAA,gBACZ;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,SAAS,OAAO;AACd,oBAAQ,SAAS,aAAa,QAAQ,IAAI,SAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AACxG,eAAG;AAAA,cACD,KAAK,UAAU;AAAA,gBACb,MAAM;AAAA,gBACN,IAAI,QAAQ;AAAA,gBACZ,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,cAC9D,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAC;AAED,WAAG,KAAK,SAAS,OAAO;AACxB,WAAG,KAAK,SAAS,OAAO;AAAA,MAC1B,CAAC;AACD,oBAAc,cAAc;AAAA,IAC9B,SAAS,OAAO;AACd;AAAA,QACE;AAAA,QACA,+BACG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC1D;AAAA,IACF,UAAE;AACA,SAAG,mBAAmB;AACtB,SAAG,MAAM;AAAA,IACX;AAEA,QAAI,CAAC,SAAS;AACZ;AAAA,QACE;AAAA,QACA,yCAAsC,KAAK,MAAM,UAAU,GAAI,IAAI;AAAA,MACrE;AACA,YAAM,MAAM,OAAO;AACnB,gBAAU,KAAK,IAAI,UAAU,GAAG,GAAM;AAAA,IACxC;AAAA,EACF;AACF;AAEA,eAAe,OAAO;AACpB,MAAI,QAAQ,QAAQ,KAAK,QAAQ,IAAI,GAAG;AACtC,IAAAA,SAAQ,OAAO;AAAA,MACb;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,KAAK,QAAQ,IAAI,GAAG;AACzC,IAAAA,SAAQ,OAAO,MAAM,UAAU,IAAI;AACnC;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,YAAY;AAClB;AAAA,EACF;AAEA,QAAM,SACJA,SAAQ,IAAI,oBAAoBA,SAAQ,IAAI,sBAC5CA,SAAQ,KAAK,KAAK,CAAC,UAAU,MAAM,WAAW,WAAW,CAAC,GAAG,MAAM,CAAC,KACpE;AAEF,MAAI,SAAS,MAAM,WAAW;AAC9B,MAAI,UAAU,CAAC,4BAA4B,uBAAuB,EAAE,SAAS,OAAO,MAAM,GAAG;AAC3F,WAAO,SAAS;AAChB,UAAM,YAAY,MAAM;AACxB,YAAQ,QAAQ,8BAA8B,cAAc;AAAA,EAC9D;AACA,MAAI,CAAC,QAAQ;AACX,aAAS,MAAM,KAAK,QAAQ,aAAa,CAAC;AAAA,EAC5C,WAAW,QAAQ,QAAQ,KAAK,QAAQ,aAAa,GAAG;AACtD,WAAO,OAAO,QAAQ,QAAQ,IAAI,SAAS;AAC3C,UAAM,YAAY,MAAM;AAAA,EAC1B;AAEA,MAAI,QAAQ;AACV,YAAQ,QAAQ,gCAAgC,IAAI,OAAO,SAAS,MAAM,GAAG,CAAC,CAAC,CAAC,QAAG;AAAA,EACrF;AACA,QAAM,aAAa,MAAM;AAC3B;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB;AAAA,IACE;AAAA,IACA,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,EACpE;AACA,EAAAA,SAAQ,KAAK,CAAC;AAChB,CAAC;","names":["os","path","fs","spawn","process","crypto","process","crypto","fs","path","fs","os","path","path","os","process","fs","spawn"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../execution-core/src/filesystem.ts","../../execution-core/src/process.ts","../../execution-core/src/safety.ts","../../execution-core/src/policy.ts","../../execution-core/src/core.ts"],"sourcesContent":["#!/usr/bin/env node\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport { spawn } from \"node:child_process\";\nimport process from \"node:process\";\nimport WebSocket from \"ws\";\nimport {\n RemoteArcExecutionCore,\n type ExecutionPolicy,\n} from \"@remotearc/execution-core\";\n\nconst VERSION = \"0.3.13\";\nconst DEFAULT_ORIGIN = \"https://mcp.remotearc.app\";\nconst CONFIG_DIR = path.join(os.homedir(), \".remotearc\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\nconst LEGACY_CONFIG_PATH = path.join(os.homedir(), \".remote-link\", \"config.json\");\n\ntype Mode = \"managed\" | \"safe\" | \"developer\";\n\ntype SavedConfig = {\n deviceId: string;\n deviceToken: string;\n deviceName: string;\n origin: string;\n mode: Mode;\n};\n\nclass RevokedDeviceCredentialError extends Error {\n constructor() {\n super(\"Saved device credential has been revoked.\");\n this.name = \"RevokedDeviceCredentialError\";\n }\n}\n\nasync function validateSavedPairing(config: SavedConfig) {\n try {\n const response = await fetch(new URL(\"/api/device/heartbeat\", config.origin), {\n method: \"POST\",\n headers: { Authorization: \"Bearer \" + config.deviceToken },\n });\n\n if (response.status === 401 || response.status === 403) {\n throw new RevokedDeviceCredentialError();\n }\n\n // A transient server-side failure should not destroy a valid local pairing.\n // The WebSocket connection remains the source of truth for availability.\n return;\n } catch (error) {\n if (error instanceof RevokedDeviceCredentialError) throw error;\n return;\n }\n}\n\ntype PairingStart = {\n device_code: string;\n device_secret: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n};\n\ntype PairingToken = {\n device_id: string;\n device_token: string;\n relay_url: string;\n};\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst supportsColor = process.stdout.isTTY && !process.env.NO_COLOR;\nconst paint = (code: string, value: string) =>\n supportsColor ? `\\x1b[${code}m${value}\\x1b[0m` : value;\nconst dim = (value: string) => paint(\"2\", value);\nconst cyan = (value: string) => paint(\"36\", value);\nconst green = (value: string) => paint(\"32\", value);\nconst yellow = (value: string) => paint(\"33\", value);\nconst red = (value: string) => paint(\"31\", value);\nconst bold = (value: string) => paint(\"1\", value);\n\nfunction nowTime() {\n return new Date().toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n}\n\nfunction logLine(\n level: \"info\" | \"success\" | \"warn\" | \"error\" | \"event\",\n message: string,\n) {\n const icon =\n level === \"success\" ? green(\"✓\") :\n level === \"warn\" ? yellow(\"!\") :\n level === \"error\" ? red(\"×\") :\n level === \"event\" ? cyan(\"→\") :\n cyan(\"•\");\n process.stdout.write(`${dim(nowTime())} ${icon} ${message}\\n`);\n}\n\nfunction banner() {\n process.stdout.write(\"\\n\");\n process.stdout.write(bold(\"Remote Arc\") + \" \" + dim(`v${VERSION}`) + \"\\n\");\n process.stdout.write(dim(\"Secure remote MCP bridge\") + \"\\n\\n\");\n}\n\nfunction argFlag(name: string) {\n return process.argv.includes(name);\n}\n\nfunction selectedMode(): Mode {\n if (argFlag(\"--safe\")) return \"safe\";\n return \"managed\";\n}\n\nfunction isLocalSafeMode(mode: Mode) {\n return mode === \"safe\";\n}\n\nfunction modeLabel(mode: Mode) {\n return isLocalSafeMode(mode) ? \"safe local cap\" : \"dashboard-managed\";\n}\n\nasync function readConfig(): Promise<SavedConfig | null> {\n try {\n return JSON.parse(await fs.readFile(CONFIG_PATH, \"utf8\")) as SavedConfig;\n } catch {\n try {\n const legacy = JSON.parse(\n await fs.readFile(LEGACY_CONFIG_PATH, \"utf8\"),\n ) as SavedConfig;\n await writeConfig(legacy);\n logLine(\"success\", \"Migrated existing Remote Link pairing to Remote Arc.\");\n return legacy;\n } catch {\n return null;\n }\n }\n}\n\nasync function writeConfig(config: SavedConfig) {\n await fs.mkdir(CONFIG_DIR, { recursive: true });\n await fs.writeFile(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", {\n mode: 0o600,\n });\n}\n\nasync function resetConfig() {\n await Promise.all([\n fs.rm(CONFIG_PATH, { force: true }),\n fs.rm(LEGACY_CONFIG_PATH, { force: true }),\n ]);\n logLine(\"success\", \"Removed saved device credentials.\");\n}\n\nfunction openBrowser(url: string) {\n const command =\n process.platform === \"win32\"\n ? \"cmd\"\n : process.platform === \"darwin\"\n ? \"open\"\n : \"xdg-open\";\n const args =\n process.platform === \"win32\"\n ? [\"/c\", \"start\", \"\", url]\n : [url];\n\n const child = spawn(command, args, {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n}\n\nasync function pair(origin: string, mode: Mode): Promise<SavedConfig> {\n const deviceName = os.hostname();\n const response = await fetch(origin + \"/api/device/start\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n device_name: deviceName,\n platform: process.platform,\n arch: process.arch,\n hostname: os.hostname(),\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Could not start device pairing: \" + response.status);\n }\n\n const pairing = (await response.json()) as PairingStart;\n\n banner();\n logLine(\"info\", `Device: ${bold(deviceName)} · ${process.platform}/${process.arch} · ${modeLabel(mode)}`);\n logLine(\"event\", \"Pairing required — opening secure browser approval.\");\n process.stdout.write(\"\\n Pairing code \" + bold(cyan(pairing.user_code)) + \"\\n\");\n process.stdout.write(\" \" + dim(pairing.verification_uri_complete) + \"\\n\\n\");\n openBrowser(pairing.verification_uri_complete);\n logLine(\"info\", \"Waiting for authorization…\");\n\n const startedAt = Date.now();\n while (Date.now() - startedAt < pairing.expires_in * 1000) {\n await sleep(Math.max(pairing.interval, 2) * 1000);\n\n const tokenResponse = await fetch(origin + \"/api/device/token\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n device_code: pairing.device_code,\n device_secret: pairing.device_secret,\n }),\n });\n\n if (tokenResponse.status === 428) {\n if (process.stdout.isTTY) process.stdout.write(dim(\"·\"));\n continue;\n }\n\n if (!tokenResponse.ok) {\n const body = await tokenResponse.text();\n throw new Error(\"Pairing failed: \" + body);\n }\n\n const result = (await tokenResponse.json()) as PairingToken;\n process.stdout.write(\"\\n\");\n logLine(\"success\", \"Device authorized.\");\n\n const config: SavedConfig = {\n deviceId: result.device_id,\n deviceToken: result.device_token,\n deviceName,\n origin,\n mode,\n };\n await writeConfig(config);\n return config;\n }\n\n throw new Error(\"Pairing expired. Run Remote Arc again to retry.\");\n}\n\nclass ExecutionCore {\n private readonly core: RemoteArcExecutionCore;\n\n constructor(mode: Mode) {\n this.core = new RemoteArcExecutionCore(\n isLocalSafeMode(mode) ? \"safe\" : \"managed\",\n );\n }\n\n async tools() {\n return this.core.listTools();\n }\n\n async call(\n name: string,\n args: Record<string, unknown>,\n policy?: ExecutionPolicy,\n ) {\n return this.core.callTool(name, args, policy);\n }\n\n async close() {\n await this.core.close();\n }\n}\n\nasync function connectAgent(config: SavedConfig): Promise<\"stopped\" | \"rePair\"> {\n const core = new ExecutionCore(config.mode);\n banner();\n logLine(\"info\", `Device: ${bold(config.deviceName)} · ${process.platform}/${process.arch}`);\n logLine(\n \"info\",\n `Permission profile: ${isLocalSafeMode(config.mode) ? green(\"safe local cap\") : cyan(\"dashboard-managed\")}`,\n );\n\n const tools = await core.tools();\n logLine(\"success\", `Local tools ready: ${tools.length} exposed`);\n process.stdout.write(\" \" + dim(tools.map((tool) => tool.name).join(\" · \")) + \"\\n\");\n try {\n await validateSavedPairing(config);\n } catch (error) {\n if (error instanceof RevokedDeviceCredentialError) {\n logLine(\"warn\", error.message);\n await resetConfig();\n logLine(\"event\", \"Starting a fresh device pairing…\");\n await core.close().catch(() => undefined);\n return \"rePair\";\n }\n throw error;\n }\n\n const wsUrl = new URL(\"/agent\", config.origin.replace(/^http/, \"ws\"));\n\n let stopped = false;\n let backoff = 1000;\n\n const shutdown = async () => {\n stopped = true;\n await core.close().catch(() => undefined);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n while (!stopped) {\n logLine(\"event\", `Connecting relay ${dim(wsUrl.host)}…`);\n const ws = new WebSocket(wsUrl, {\n headers: {\n Authorization: \"Bearer \" + config.deviceToken,\n },\n });\n\n try {\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onUnexpectedResponse = (\n _request: unknown,\n response: { statusCode?: number },\n ) => {\n cleanup();\n if (response.statusCode === 401 || response.statusCode === 403) {\n reject(new RevokedDeviceCredentialError());\n return;\n }\n reject(\n new Error(\n \"Unexpected relay response: \" + String(response.statusCode || \"unknown\"),\n ),\n );\n };\n const cleanup = () => {\n ws.off(\"open\", onOpen);\n ws.off(\"error\", onError);\n ws.off(\"unexpected-response\", onUnexpectedResponse);\n };\n\n ws.once(\"open\", onOpen);\n ws.once(\"error\", onError);\n ws.once(\"unexpected-response\", onUnexpectedResponse);\n });\n\n backoff = 1000;\n ws.send(\n JSON.stringify({\n type: \"hello\",\n device: {\n id: config.deviceId,\n name: config.deviceName,\n platform: process.platform,\n arch: process.arch,\n hostname: os.hostname(),\n agentVersion: VERSION,\n },\n tools: tools.map((tool) => tool.name),\n capabilities: [\"native_core_v1\", \"device_policy_v1\", \"undo_history_v1\"],\n }),\n );\n\n logLine(\"success\", `Relay connected · ${bold(config.deviceName)} · ${config.mode} mode`);\n logLine(\"success\", \"Device presence published.\");\n process.stdout.write(\" \" + dim(config.origin) + \"\\n\");\n process.stdout.write(\" \" + dim(\"Ctrl+C to disconnect\") + \"\\n\\n\");\n\n const sendHeartbeat = async () => {\n try {\n await fetch(new URL(\"/api/device/heartbeat\", config.origin), {\n method: \"POST\",\n headers: { Authorization: \"Bearer \" + config.deviceToken },\n });\n } catch {\n // WebSocket reconnect logic remains the source of truth for connectivity.\n }\n };\n void sendHeartbeat();\n const heartbeatTimer = setInterval(\n () => void sendHeartbeat(),\n 15 * 60_000,\n );\n\n await new Promise<void>((resolve) => {\n ws.on(\"message\", async (raw) => {\n let message: {\n type?: string;\n id?: string;\n tool?: string;\n arguments?: Record<string, unknown>;\n policy?: ExecutionPolicy;\n };\n\n try {\n message = JSON.parse(raw.toString());\n } catch {\n return;\n }\n\n if (\n message.type !== \"call\" ||\n !message.id ||\n !message.tool\n ) {\n return;\n }\n\n const callStarted = Date.now();\n logLine(\"event\", `tool.call ${bold(message.tool)} · ${dim(message.id.slice(0, 8))}`);\n try {\n const result = await core.call(\n message.tool,\n message.arguments || {},\n message.policy,\n );\n logLine(\"success\", `tool.done ${message.tool} · ${Date.now() - callStarted}ms`);\n ws.send(\n JSON.stringify({\n type: \"result\",\n id: message.id,\n result,\n }),\n );\n } catch (error) {\n logLine(\"error\", `tool.fail ${message.tool} · ${error instanceof Error ? error.message : String(error)}`);\n ws.send(\n JSON.stringify({\n type: \"result\",\n id: message.id,\n error: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n });\n\n ws.once(\"close\", resolve);\n ws.once(\"error\", resolve);\n });\n clearInterval(heartbeatTimer);\n } catch (error) {\n if (error instanceof RevokedDeviceCredentialError) {\n logLine(\"warn\", error.message);\n await resetConfig();\n logLine(\"event\", \"Starting a fresh device pairing…\");\n await core.close().catch(() => undefined);\n return \"rePair\";\n }\n\n logLine(\n \"error\",\n \"Relay connection failed: \" +\n (error instanceof Error ? error.message : String(error)),\n );\n } finally {\n ws.removeAllListeners();\n ws.close();\n }\n\n if (!stopped) {\n logLine(\n \"warn\",\n \"Relay disconnected · retrying in \" + Math.round(backoff / 1000) + \"s\",\n );\n await sleep(backoff);\n backoff = Math.min(backoff * 2, 30_000);\n }\n }\n\n await core.close().catch(() => undefined);\n return \"stopped\";\n}\n\nasync function main() {\n if (argFlag(\"--help\") || argFlag(\"-h\")) {\n process.stdout.write(\n [\n \"Remote Arc\",\n \"\",\n \"Usage:\",\n \" npx remotelink\",\n \"\",\n \"After the npm release:\",\n \" npx remotelink\",\n \"\",\n \"Options:\",\n \" --safe Hard local read-only cap; dashboard cannot enable write tools\",\n \" --developer Legacy alias for dashboard-managed capabilities\",\n \" --reset Remove this computer's saved pairing\",\n \" --version Print CLI version\",\n \" --help Show this help\",\n \"\",\n ].join(\"\\n\"),\n );\n return;\n }\n\n if (argFlag(\"--version\") || argFlag(\"-v\")) {\n process.stdout.write(VERSION + \"\\n\");\n return;\n }\n\n if (argFlag(\"--reset\")) {\n await resetConfig();\n return;\n }\n\n const origin =\n process.env.REMOTEARC_ORIGIN || process.env.REMOTE_LINK_ORIGIN ||\n process.argv.find((value) => value.startsWith(\"--origin=\"))?.slice(9) ||\n DEFAULT_ORIGIN;\n\n let config = await readConfig();\n\n while (true) {\n if (config && [\"https://remote.samyao.me\", \"https://remotearc.app\"].includes(config.origin)) {\n config.origin = DEFAULT_ORIGIN;\n await writeConfig(config);\n logLine(\"info\", \"Migrated relay origin to \" + DEFAULT_ORIGIN);\n }\n\n if (!config) {\n config = await pair(origin, selectedMode());\n } else if (argFlag(\"--safe\") || argFlag(\"--developer\")) {\n config.mode = argFlag(\"--safe\") ? \"safe\" : \"managed\";\n await writeConfig(config);\n }\n\n logLine(\"info\", `Using paired device identity ${dim(config.deviceId.slice(0, 8))}…`);\n const result = await connectAgent(config);\n if (result !== \"rePair\") return;\n\n config = null;\n }\n}\n\nmain().catch((error) => {\n logLine(\n \"error\",\n \"Fatal: \" + (error instanceof Error ? error.message : String(error)),\n );\n process.exit(1);\n});\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst MAX_DIRECTORY_ENTRIES = 2000;\nconst DEFAULT_READ_LINES = 240;\nconst MAX_TEXT_FILE_BYTES = 20 * 1024 * 1024;\n\nconst printableSize = (bytes: number) => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nexport async function listDirectory(\n targetPath: string,\n depth = 2,\n canReveal?: (candidatePath: string) => Promise<boolean>,\n) {\n const maxDepth = Math.max(1, Math.min(10, Math.trunc(depth || 2)));\n const lines: string[] = [];\n let entriesSeen = 0;\n let protectedEntries = 0;\n\n async function walk(directory: string, level: number, prefix: string) {\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) return;\n const entries = await fs.readdir(directory, { withFileTypes: true });\n entries.sort((a, b) => {\n if (a.isDirectory() !== b.isDirectory()) return a.isDirectory() ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n for (const entry of entries) {\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) break;\n const absolute = path.join(directory, entry.name);\n\n if (canReveal && !(await canReveal(absolute))) {\n protectedEntries += 1;\n continue;\n }\n\n entriesSeen += 1;\n const label = entry.isDirectory()\n ? \"[DIR]\"\n : entry.isSymbolicLink()\n ? \"[LINK]\"\n : \"[FILE]\";\n lines.push(`${prefix}${label} ${entry.name}`);\n\n if (entry.isDirectory() && level < maxDepth) {\n await walk(absolute, level + 1, prefix + \" \");\n }\n }\n }\n\n const stat = await fs.stat(targetPath);\n if (!stat.isDirectory()) throw new Error(\"Path is not a directory: \" + targetPath);\n\n await walk(targetPath, 1, \"\");\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) {\n lines.push(`… truncated after ${MAX_DIRECTORY_ENTRIES} entries`);\n }\n\n const protectionNote = protectedEntries\n ? `\\n\\n[Remote Arc omitted ${protectedEntries} protected or out-of-scope entr${protectedEntries === 1 ? \"y\" : \"ies\"}.]`\n : \"\";\n\n return `Directory: ${targetPath}\\nDepth: ${maxDepth}\\n\\n${lines.join(\"\\n\") || \"(empty)\"}${protectionNote}`;\n}\n\nexport async function readTextFile(\n targetPath: string,\n offset?: number,\n length?: number,\n) {\n const stat = await fs.stat(targetPath);\n if (!stat.isFile()) throw new Error(\"Path is not a file: \" + targetPath);\n if (stat.size > MAX_TEXT_FILE_BYTES) {\n throw new Error(\n `File is too large for read_file (${printableSize(stat.size)} > 20 MB). Use a terminal command or a more targeted tool instead.`,\n );\n }\n\n const buffer = await fs.readFile(targetPath);\n const sample = buffer.subarray(0, Math.min(buffer.length, 8192));\n if (sample.includes(0)) {\n throw new Error(\"Binary file detected. read_file currently supports text files only.\");\n }\n\n const text = buffer.toString(\"utf8\");\n const lines = text.split(/\\r?\\n/);\n const requestedOffset = Number.isFinite(offset) ? Math.trunc(offset as number) : 0;\n const start =\n requestedOffset < 0\n ? Math.max(0, lines.length + requestedOffset)\n : Math.min(lines.length, Math.max(0, requestedOffset));\n const requestedLength =\n Number.isFinite(length) && (length as number) > 0\n ? Math.trunc(length as number)\n : DEFAULT_READ_LINES;\n const end = Math.min(lines.length, start + requestedLength);\n const chunk = lines.slice(start, end).join(\"\\n\");\n\n const location =\n start === 0\n ? \"start\"\n : end === lines.length\n ? `line ${start + 1} to end`\n : `lines ${start + 1}-${end}`;\n\n return `[Reading ${end - start} lines from ${location} (total: ${lines.length} lines, ${printableSize(stat.size)})]\\n\\n${chunk}`;\n}\n\nexport async function getFileInfo(targetPath: string) {\n const stat = await fs.lstat(targetPath);\n return {\n path: targetPath,\n type: stat.isFile()\n ? \"file\"\n : stat.isDirectory()\n ? \"directory\"\n : stat.isSymbolicLink()\n ? \"symlink\"\n : \"other\",\n size: stat.size,\n size_human: printableSize(stat.size),\n mode: stat.mode,\n created_at: stat.birthtime.toISOString(),\n modified_at: stat.mtime.toISOString(),\n accessed_at: stat.atime.toISOString(),\n };\n}\n\nasync function atomicWriteText(targetPath: string, content: string) {\n const directory = path.dirname(targetPath);\n await fs.mkdir(directory, { recursive: true });\n const temporary = path.join(\n directory,\n \".\" + path.basename(targetPath) + \".remotearc-\" + crypto.randomUUID() + \".tmp\",\n );\n\n try {\n await fs.writeFile(temporary, content, \"utf8\");\n await fs.rename(temporary, targetPath);\n } finally {\n await fs.rm(temporary, { force: true }).catch(() => undefined);\n }\n}\n\nexport async function writeTextFile(\n targetPath: string,\n content: string,\n mode: \"rewrite\" | \"append\" = \"rewrite\",\n) {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n if (mode === \"append\") {\n await fs.appendFile(targetPath, content, \"utf8\");\n } else {\n await atomicWriteText(targetPath, content);\n }\n const stat = await fs.stat(targetPath);\n return {\n path: targetPath,\n mode,\n bytes: Buffer.byteLength(content),\n file_size: stat.size,\n atomic: mode === \"rewrite\",\n };\n}\n\nexport async function editTextBlock(\n filePath: string,\n oldString: string,\n newString: string,\n expectedReplacements = 1,\n) {\n if (!oldString) throw new Error(\"old_string cannot be empty.\");\n const current = await fs.readFile(filePath, \"utf8\");\n const parts = current.split(oldString);\n const replacements = parts.length - 1;\n\n if (replacements !== expectedReplacements) {\n throw new Error(\n `Expected ${expectedReplacements} replacement(s) in ${filePath}, found ${replacements}. No changes were written.`,\n );\n }\n\n const next = parts.join(newString);\n await atomicWriteText(filePath, next);\n return {\n path: filePath,\n replacements,\n bytes_before: Buffer.byteLength(current),\n bytes_after: Buffer.byteLength(next),\n atomic: true,\n };\n}\n\n\nexport async function browseDirectories(\n targetPath: string,\n canReveal?: (candidatePath: string) => Promise<boolean>,\n) {\n const stat = await fs.stat(targetPath);\n if (!stat.isDirectory()) throw new Error(\"Path is not a directory: \" + targetPath);\n\n const entries = await fs.readdir(targetPath, { withFileTypes: true });\n const directories: Array<{ name: string; path: string; type: \"directory\" | \"symlink\" }> = [];\n let protectedEntries = 0;\n\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const absolute = path.join(targetPath, entry.name);\n if (canReveal && !(await canReveal(absolute))) {\n protectedEntries += 1;\n continue;\n }\n directories.push({\n name: entry.name,\n path: absolute,\n type: entry.isSymbolicLink() ? \"symlink\" : \"directory\",\n });\n if (directories.length >= 300) break;\n }\n\n directories.sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n path: targetPath,\n parent: path.dirname(targetPath) === targetPath ? null : path.dirname(targetPath),\n directories,\n protected_entries_omitted: protectedEntries,\n truncated: directories.length >= 300,\n };\n}\n","import { execFile, spawn, type ChildProcess } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport process from \"node:process\";\n\nconst MAX_CAPTURE_BYTES = 2 * 1024 * 1024;\n\nfunction appendCapped(current: string, chunk: Buffer | string) {\n if (Buffer.byteLength(current) >= MAX_CAPTURE_BYTES) return current;\n const next = current + chunk.toString();\n if (Buffer.byteLength(next) <= MAX_CAPTURE_BYTES) return next;\n return next.slice(0, MAX_CAPTURE_BYTES) + \"\\n… output truncated …\";\n}\n\nexport async function listProcesses() {\n const output = await new Promise<string>((resolve, reject) => {\n const command = process.platform === \"win32\" ? \"tasklist.exe\" : \"ps\";\n const args =\n process.platform === \"win32\"\n ? [\"/FO\", \"CSV\", \"/NH\"]\n : [\"-axo\", \"pid,ppid,user,%cpu,%mem,etime,command\"];\n execFile(command, args, { maxBuffer: MAX_CAPTURE_BYTES }, (error, stdout, stderr) => {\n if (error) {\n reject(new Error(`Could not list processes: ${stderr || error.message}`));\n return;\n }\n resolve(stdout.trim());\n });\n });\n\n return `Processes on ${process.platform}:\\n\\n${output}`;\n}\n\nasync function terminateTree(child: ReturnType<typeof spawn>) {\n if (!child.pid) return;\n if (process.platform === \"win32\") {\n await new Promise<void>((resolve) => {\n const killer = spawn(\n \"taskkill.exe\",\n [\"/PID\", String(child.pid), \"/T\", \"/F\"],\n { windowsHide: true, stdio: \"ignore\" },\n );\n killer.once(\"close\", () => resolve());\n killer.once(\"error\", () => resolve());\n });\n return;\n }\n\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill(\"SIGTERM\");\n }\n await new Promise((resolve) => setTimeout(resolve, 300));\n try {\n process.kill(-child.pid, \"SIGKILL\");\n } catch {\n if (!child.killed) child.kill(\"SIGKILL\");\n }\n}\n\nexport async function runShellCommand(\n command: string,\n timeoutMs = 5000,\n cwd?: string,\n) {\n const timeout = Math.max(100, Math.min(120_000, Math.trunc(timeoutMs || 5000)));\n const startedAt = Date.now();\n\n return await new Promise<{\n command: string;\n cwd: string | null;\n exit_code: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n duration_ms: number;\n timed_out: boolean;\n }>((resolve, reject) => {\n const child = spawn(command, {\n shell: true,\n cwd,\n windowsHide: true,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n\n child.stdout?.on(\"data\", (chunk) => {\n stdout = appendCapped(stdout, chunk);\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr = appendCapped(stderr, chunk);\n });\n\n const timer = setTimeout(async () => {\n timedOut = true;\n await terminateTree(child);\n }, timeout);\n\n child.once(\"error\", (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n reject(error);\n });\n\n child.once(\"close\", (code, signal) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({\n command,\n cwd: cwd || null,\n exit_code: code,\n signal,\n stdout,\n stderr,\n duration_ms: Date.now() - startedAt,\n timed_out: timedOut,\n });\n });\n });\n}\n\n\ntype ManagedProcess = {\n id: string;\n child: ChildProcess;\n command: string;\n cwd: string | null;\n startedAt: number;\n endedAt: number | null;\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n};\n\nconst managedProcesses = new Map<string, ManagedProcess>();\nconst MAX_MANAGED_PROCESSES = 32;\nconst FINISHED_PROCESS_RETENTION_MS = 30 * 60 * 1000;\n\nfunction cleanupManagedProcesses() {\n const now = Date.now();\n for (const [id, item] of managedProcesses) {\n if (\n item.endedAt !== null &&\n now - item.endedAt > FINISHED_PROCESS_RETENTION_MS\n ) {\n managedProcesses.delete(id);\n }\n }\n\n if (managedProcesses.size <= MAX_MANAGED_PROCESSES) return;\n const finished = [...managedProcesses.values()]\n .filter((item) => item.endedAt !== null)\n .sort((a, b) => (a.endedAt || 0) - (b.endedAt || 0));\n for (const item of finished) {\n if (managedProcesses.size <= MAX_MANAGED_PROCESSES) break;\n managedProcesses.delete(item.id);\n }\n}\n\nexport async function startBackgroundProcess(command: string, cwd?: string) {\n cleanupManagedProcesses();\n if (managedProcesses.size >= MAX_MANAGED_PROCESSES) {\n throw new Error(\n \"Remote Arc already has the maximum number of managed background processes on this device.\",\n );\n }\n\n const child = spawn(command, {\n shell: true,\n cwd,\n windowsHide: true,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const id = crypto.randomUUID();\n const item: ManagedProcess = {\n id,\n child,\n command,\n cwd: cwd || null,\n startedAt: Date.now(),\n endedAt: null,\n exitCode: null,\n signal: null,\n stdout: \"\",\n stderr: \"\",\n };\n managedProcesses.set(id, item);\n\n child.stdout?.on(\"data\", (chunk) => {\n item.stdout = appendCapped(item.stdout, chunk);\n });\n child.stderr?.on(\"data\", (chunk) => {\n item.stderr = appendCapped(item.stderr, chunk);\n });\n child.once(\"error\", (error) => {\n item.stderr = appendCapped(item.stderr, \"\\n\" + error.message);\n item.endedAt = Date.now();\n });\n child.once(\"close\", (code, signal) => {\n item.exitCode = code;\n item.signal = signal;\n item.endedAt = Date.now();\n });\n\n return {\n process_id: id,\n pid: child.pid || null,\n command,\n cwd: cwd || null,\n status: \"running\",\n started_at: new Date(item.startedAt).toISOString(),\n };\n}\n\nfunction managedProcessOrThrow(processId: string) {\n cleanupManagedProcesses();\n const item = managedProcesses.get(processId);\n if (!item) {\n throw new Error(\n \"Managed process not found or its local retention window has expired.\",\n );\n }\n return item;\n}\n\nexport function getManagedProcessStatus(processId: string) {\n const item = managedProcessOrThrow(processId);\n return {\n process_id: item.id,\n pid: item.child.pid || null,\n command: item.command,\n cwd: item.cwd,\n status: item.endedAt === null ? \"running\" : \"exited\",\n exit_code: item.exitCode,\n signal: item.signal,\n started_at: new Date(item.startedAt).toISOString(),\n ended_at: item.endedAt === null ? null : new Date(item.endedAt).toISOString(),\n duration_ms: (item.endedAt || Date.now()) - item.startedAt,\n };\n}\n\nexport function readManagedProcessOutput(processId: string) {\n const item = managedProcessOrThrow(processId);\n return {\n ...getManagedProcessStatus(processId),\n stdout: item.stdout,\n stderr: item.stderr,\n truncated:\n Buffer.byteLength(item.stdout) >= MAX_CAPTURE_BYTES ||\n Buffer.byteLength(item.stderr) >= MAX_CAPTURE_BYTES,\n };\n}\n\nexport async function stopManagedProcess(processId: string) {\n const item = managedProcessOrThrow(processId);\n if (item.endedAt !== null) {\n return {\n ...getManagedProcessStatus(processId),\n stopped: false,\n already_exited: true,\n };\n }\n\n await terminateTree(item.child);\n await new Promise((resolve) => setTimeout(resolve, 50));\n return {\n ...getManagedProcessStatus(processId),\n stopped: true,\n already_exited: false,\n };\n}\n\n\nexport async function stopAllManagedProcesses() {\n const running = [...managedProcesses.values()].filter(\n (item) => item.endedAt === null,\n );\n await Promise.all(\n running.map(async (item) => {\n await terminateTree(item.child).catch(() => undefined);\n }),\n );\n}\n\n\nexport function listManagedProcesses() {\n cleanupManagedProcesses();\n return [...managedProcesses.values()]\n .sort((a, b) => b.startedAt - a.startedAt)\n .map((item) => ({\n process_id: item.id,\n pid: item.child.pid || null,\n command: item.command,\n cwd: item.cwd,\n status: item.endedAt === null ? \"running\" : \"exited\",\n exit_code: item.exitCode,\n signal: item.signal,\n started_at: new Date(item.startedAt).toISOString(),\n ended_at: item.endedAt === null ? null : new Date(item.endedAt).toISOString(),\n duration_ms: (item.endedAt || Date.now()) - item.startedAt,\n stdout_bytes: Buffer.byteLength(item.stdout),\n stderr_bytes: Buffer.byteLength(item.stderr),\n }));\n}\n","import crypto from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst RETENTION_MS = 7 * 24 * 60 * 60 * 1000;\nconst MAX_SNAPSHOT_BYTES = 20 * 1024 * 1024;\nconst MAX_UNDO_BYTES = 200 * 1024 * 1024;\n\ntype UndoManifest = {\n id: string;\n createdAt: string;\n tool: \"write_file\" | \"edit_block\";\n targetPath: string;\n existed: boolean;\n mode?: number;\n bytes: number;\n postChangeHash?: string;\n};\n\nexport type UndoSnapshot = {\n id: string;\n directory: string;\n manifest: UndoManifest;\n};\n\nconst undoRoot = () =>\n process.env.REMOTEARC_UNDO_ROOT ||\n path.join(os.homedir(), \".remotearc\", \"undo\");\n\nasync function ensureUndoRoot() {\n await fs.mkdir(undoRoot(), { recursive: true, mode: 0o700 });\n}\n\nasync function readManifest(directory: string): Promise<UndoManifest | null> {\n try {\n return JSON.parse(\n await fs.readFile(path.join(directory, \"manifest.json\"), \"utf8\"),\n ) as UndoManifest;\n } catch {\n return null;\n }\n}\n\nasync function snapshotDirectories() {\n await ensureUndoRoot();\n const entries = await fs.readdir(undoRoot(), { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(undoRoot(), entry.name));\n}\n\nasync function cleanupUndoStore() {\n const now = Date.now();\n const snapshots: Array<{ directory: string; manifest: UndoManifest }> = [];\n\n for (const directory of await snapshotDirectories()) {\n const manifest = await readManifest(directory);\n if (!manifest) {\n await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined);\n continue;\n }\n\n const created = Date.parse(manifest.createdAt);\n if (!Number.isFinite(created) || now - created > RETENTION_MS) {\n await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined);\n continue;\n }\n\n snapshots.push({ directory, manifest });\n }\n\n snapshots.sort(\n (a, b) => Date.parse(a.manifest.createdAt) - Date.parse(b.manifest.createdAt),\n );\n\n let total = snapshots.reduce((sum, item) => sum + item.manifest.bytes, 0);\n for (const item of snapshots) {\n if (total <= MAX_UNDO_BYTES) break;\n await fs.rm(item.directory, { recursive: true, force: true }).catch(() => undefined);\n total -= item.manifest.bytes;\n }\n}\n\nfunction mutationPath(\n tool: \"write_file\" | \"edit_block\",\n args: Record<string, unknown>,\n) {\n const candidate = tool === \"write_file\" ? args.path : args.file_path;\n return typeof candidate === \"string\" && candidate.trim() ? candidate : null;\n}\n\nexport async function createUndoSnapshot(\n tool: \"write_file\" | \"edit_block\",\n args: Record<string, unknown>,\n): Promise<UndoSnapshot | null> {\n const targetPath = mutationPath(tool, args);\n if (!targetPath) return null;\n\n await cleanupUndoStore();\n\n let existed = false;\n let mode: number | undefined;\n let bytes = 0;\n let original: Buffer | null = null;\n\n try {\n const stat = await fs.stat(targetPath);\n if (!stat.isFile()) return null;\n existed = true;\n mode = stat.mode;\n bytes = stat.size;\n if (bytes > MAX_SNAPSHOT_BYTES) return null;\n original = await fs.readFile(targetPath);\n } catch (error) {\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? String((error as { code?: unknown }).code)\n : \"\";\n if (code !== \"ENOENT\") throw error;\n }\n\n const id = `${Date.now()}-${crypto.randomUUID().slice(0, 8)}`;\n const directory = path.join(undoRoot(), id);\n await fs.mkdir(directory, { recursive: true, mode: 0o700 });\n\n if (original) {\n await fs.writeFile(path.join(directory, \"content.bin\"), original, { mode: 0o600 });\n }\n\n const manifest: UndoManifest = {\n id,\n createdAt: new Date().toISOString(),\n tool,\n targetPath,\n existed,\n ...(mode !== undefined ? { mode } : {}),\n bytes,\n };\n\n await fs.writeFile(\n path.join(directory, \"manifest.json\"),\n JSON.stringify(manifest, null, 2) + \"\\n\",\n { mode: 0o600 },\n );\n\n await cleanupUndoStore();\n return { id, directory, manifest };\n}\n\nasync function hashFile(filePath: string) {\n const hash = crypto.createHash(\"sha256\");\n for await (const chunk of createReadStream(filePath)) hash.update(chunk);\n return hash.digest(\"hex\");\n}\n\nexport async function finalizeUndoSnapshot(snapshot: UndoSnapshot | null) {\n if (!snapshot) return false;\n try {\n snapshot.manifest.postChangeHash = await hashFile(snapshot.manifest.targetPath);\n await fs.writeFile(\n path.join(snapshot.directory, \"manifest.json\"),\n JSON.stringify(snapshot.manifest, null, 2) + \"\\n\",\n { mode: 0o600 },\n );\n return true;\n } catch {\n await discardUndoSnapshot(snapshot);\n return false;\n }\n}\n\nexport async function discardUndoSnapshot(snapshot: UndoSnapshot | null) {\n if (!snapshot) return;\n await fs.rm(snapshot.directory, { recursive: true, force: true }).catch(() => undefined);\n}\n\nasync function undoCandidates() {\n await cleanupUndoStore();\n const candidates: Array<{ directory: string; manifest: UndoManifest }> = [];\n for (const directory of await snapshotDirectories()) {\n const manifest = await readManifest(directory);\n if (manifest) candidates.push({ directory, manifest });\n }\n candidates.sort(\n (a, b) => Date.parse(b.manifest.createdAt) - Date.parse(a.manifest.createdAt),\n );\n return candidates;\n}\n\nexport async function listUndoActions(limit = 20) {\n const candidates = (await undoCandidates()).slice(\n 0,\n Math.max(1, Math.min(100, Math.trunc(limit))),\n );\n\n return Promise.all(\n candidates.map(async ({ manifest }) => {\n let status: \"ready\" | \"conflict\" | \"missing\" | \"legacy\" = \"legacy\";\n\n if (manifest.postChangeHash) {\n try {\n const currentHash = await hashFile(manifest.targetPath);\n status =\n currentHash === manifest.postChangeHash ? \"ready\" : \"conflict\";\n } catch {\n status = \"missing\";\n }\n }\n\n return {\n id: manifest.id,\n created_at: manifest.createdAt,\n tool: manifest.tool,\n path: manifest.targetPath,\n bytes: manifest.bytes,\n existed_before: manifest.existed,\n conflict_safe: Boolean(manifest.postChangeHash),\n can_undo: status === \"ready\",\n status,\n };\n }),\n );\n}\n\nasync function restoreUndoCandidate(candidate: { directory: string; manifest: UndoManifest }) {\n const { directory, manifest } = candidate;\n\n if (!manifest.postChangeHash) {\n throw new Error(\n \"This snapshot predates conflict-safe Local Undo and cannot be restored automatically.\",\n );\n }\n\n let currentHash: string;\n try {\n currentHash = await hashFile(manifest.targetPath);\n } catch {\n throw new Error(\n \"The target file changed or disappeared after the Remote Arc edit. Automatic undo was refused to avoid overwriting newer work.\",\n );\n }\n\n if (currentHash !== manifest.postChangeHash) {\n throw new Error(\n \"The target file changed again after the Remote Arc edit. Automatic undo was refused to avoid overwriting newer work.\",\n );\n }\n\n if (manifest.existed) {\n const original = await fs.readFile(path.join(directory, \"content.bin\"));\n await fs.mkdir(path.dirname(manifest.targetPath), { recursive: true });\n await fs.writeFile(manifest.targetPath, original);\n if (manifest.mode !== undefined) {\n await fs.chmod(manifest.targetPath, manifest.mode).catch(() => undefined);\n }\n } else {\n await fs.rm(manifest.targetPath, { force: true });\n }\n\n await fs.rm(directory, { recursive: true, force: true });\n\n return {\n restored: true,\n action_id: manifest.id,\n tool: manifest.tool,\n path: manifest.targetPath,\n snapshot_location: \"local-device-only\",\n };\n}\n\nexport async function undoChange(actionId: string) {\n const candidate = (await undoCandidates()).find(({ manifest }) => manifest.id === actionId);\n if (!candidate) {\n throw new Error(\"Undo action not found or expired on this device.\");\n }\n return restoreUndoCandidate(candidate);\n}\n\nexport async function undoLastChange() {\n const latest = (await undoCandidates())[0];\n if (!latest) {\n throw new Error(\"No reversible Remote Arc file change is available on this device.\");\n }\n return restoreUndoCandidate(latest);\n}\n\ntype GuardRule = { pattern: RegExp; reason: string };\n\nconst DESTRUCTIVE_COMMAND_RULES: GuardRule[] = [\n {\n pattern: /(?:^|[;&|]\\s*)(?:sudo\\s+)?rm\\s+[^\\n]*(?:-rf|-fr|-[a-z]*r[a-z]*f)[^\\n]*(?:\\s\\/\\s*$|\\s\\/\\*|\\s~(?:\\s|$)|\\s\\$HOME(?:\\s|$))/i,\n reason: \"recursive deletion of a root or home path\",\n },\n {\n pattern: /\\b(?:mkfs(?:\\.\\w+)?|wipefs|fdisk|parted)\\b/i,\n reason: \"disk or filesystem destructive operation\",\n },\n {\n pattern: /\\bdd\\b[^\\n]*\\bof=\\/dev\\/(?:sd|nvme|vd|xvd|mmcblk)/i,\n reason: \"raw disk overwrite\",\n },\n {\n pattern: /\\bdiskutil\\s+erase(?:disk|volume)\\b/i,\n reason: \"disk erase\",\n },\n {\n pattern: /\\b(?:format(?:\\.com)?\\s+[a-z]:|diskpart\\b|clear-disk\\b|initialize-disk\\b)/i,\n reason: \"Windows disk destructive operation\",\n },\n {\n pattern: /\\b(?:shutdown|reboot|halt|poweroff)\\b/i,\n reason: \"system shutdown or reboot\",\n },\n {\n pattern: /\\bremove-item\\b[^\\n]*(?:-recurse[^\\n]*-force|-force[^\\n]*-recurse)[^\\n]*(?:[a-z]:\\\\(?:\\*|\\s|$)|\\$env:systemdrive)/i,\n reason: \"recursive forced deletion of a drive root\",\n },\n {\n pattern: /\\b(?:del|erase|rd|rmdir)\\b[^\\n]*\\/s[^\\n]*\\/q[^\\n]*[a-z]:\\\\/i,\n reason: \"recursive Windows drive deletion\",\n },\n {\n pattern: /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\};\\s*:/,\n reason: \"fork bomb\",\n },\n];\n\nexport function assertCommandAllowed(command: string) {\n if (process.env.REMOTEARC_ALLOW_DESTRUCTIVE === \"1\") return;\n\n for (const rule of DESTRUCTIVE_COMMAND_RULES) {\n if (rule.pattern.test(command)) {\n throw new Error(\n \"Blocked by Remote Arc Safety Guard: \" +\n rule.reason +\n \". Run this action manually on the device if you intentionally need it.\",\n );\n }\n }\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport type ExecutionPolicy = {\n workspaceRoots?: string[];\n protectSensitivePaths?: boolean;\n sensitivePaths?: string[];\n sensitiveAllowPaths?: string[];\n undoEnabled?: boolean;\n};\n\nconst SENSITIVE_BASENAMES = new Set([\n \".npmrc\",\n \".pypirc\",\n \".netrc\",\n \".git-credentials\",\n \"id_rsa\",\n \"id_ed25519\",\n \"credentials\",\n]);\n\nconst expandPath = (value: string) => {\n const trimmed = value.trim();\n if (trimmed === \"~\") return os.homedir();\n if (trimmed.startsWith(\"~/\") || trimmed.startsWith(\"~\\\\\")) {\n return path.join(os.homedir(), trimmed.slice(2));\n }\n return trimmed\n .replace(/%USERPROFILE%/gi, os.homedir())\n .replace(/\\$HOME\\b/g, os.homedir());\n};\n\nconst comparePath = (value: string) => {\n const resolved = path.resolve(expandPath(value));\n return process.platform === \"win32\" ? resolved.toLowerCase() : resolved;\n};\n\nasync function canonicalTarget(targetPath: string) {\n const expanded = path.resolve(expandPath(targetPath));\n try {\n return comparePath(await fs.realpath(expanded));\n } catch {\n const missing: string[] = [];\n let cursor = expanded;\n\n while (true) {\n try {\n const realParent = await fs.realpath(cursor);\n return comparePath(path.join(realParent, ...missing.reverse()));\n } catch {\n const parent = path.dirname(cursor);\n if (parent === cursor) return comparePath(expanded);\n missing.push(path.basename(cursor));\n cursor = parent;\n }\n }\n }\n}\n\nconst isInside = (target: string, root: string) => {\n const relative = path.relative(root, target);\n return (\n relative === \"\" ||\n (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n );\n};\n\nfunction defaultSensitiveRoots() {\n const home = os.homedir();\n const roots = [\n path.join(home, \".ssh\"),\n path.join(home, \".aws\"),\n path.join(home, \".gnupg\"),\n path.join(home, \".azure\"),\n path.join(home, \".kube\"),\n path.join(home, \".docker\"),\n path.join(home, \".config\", \"gcloud\"),\n ];\n\n if (process.platform === \"darwin\") {\n roots.push(\n path.join(home, \"Library\", \"Application Support\", \"Google\", \"Chrome\"),\n path.join(home, \"Library\", \"Application Support\", \"Microsoft Edge\"),\n path.join(home, \"Library\", \"Application Support\", \"Firefox\"),\n );\n }\n\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA;\n const localAppData = process.env.LOCALAPPDATA;\n if (appData) {\n roots.push(path.join(appData, \"Mozilla\", \"Firefox\"));\n }\n if (localAppData) {\n roots.push(\n path.join(localAppData, \"Google\", \"Chrome\", \"User Data\"),\n path.join(localAppData, \"Microsoft\", \"Edge\", \"User Data\"),\n );\n }\n }\n\n return roots;\n}\n\nfunction looksLikeSensitiveFile(target: string) {\n const basename = path.basename(target).toLowerCase();\n if (basename === \".env\" || basename.startsWith(\".env.\")) return true;\n if (SENSITIVE_BASENAMES.has(basename)) return true;\n\n const normalized = target.replace(/\\\\/g, \"/\").toLowerCase();\n if (normalized.endsWith(\"/.docker/config.json\")) return true;\n if (normalized.endsWith(\"/.kube/config\")) return true;\n\n return false;\n}\n\nexport async function enforcePathPolicy(\n targetPath: string,\n policy: ExecutionPolicy = {},\n) {\n const target = await canonicalTarget(targetPath);\n\n const workspaceInputs = (policy.workspaceRoots || []).filter(\n (item) => typeof item === \"string\" && item.trim(),\n );\n const roots = await Promise.all(workspaceInputs.map(canonicalTarget));\n\n if (roots.length && !roots.some((root) => isInside(target, root))) {\n throw new Error(\n \"Blocked by Remote Arc Workspace Scope: path is outside the allowed workspace roots.\",\n );\n }\n\n if (policy.protectSensitivePaths !== false) {\n const sensitiveInputs = [\n ...defaultSensitiveRoots(),\n ...(policy.sensitivePaths || []),\n ].filter((item) => typeof item === \"string\" && item.trim());\n const sensitiveRoots = await Promise.all(\n sensitiveInputs.map(canonicalTarget),\n );\n const allowedSensitiveRoots = await Promise.all(\n (policy.sensitiveAllowPaths || [])\n .filter((item) => typeof item === \"string\" && item.trim())\n .map(canonicalTarget),\n );\n const explicitlyAllowed = allowedSensitiveRoots.some((root) =>\n isInside(target, root),\n );\n\n if (\n !explicitlyAllowed &&\n (looksLikeSensitiveFile(target) ||\n sensitiveRoots.some((root) => isInside(target, root)))\n ) {\n throw new Error(\n \"Blocked by Remote Arc Sensitive Path Policy. Add a narrow sensitive-path exception for this device if you intentionally need access.\",\n );\n }\n }\n\n return target;\n}\n\nexport function normalizePolicy(policy?: ExecutionPolicy): ExecutionPolicy {\n return {\n workspaceRoots: Array.from(\n new Set((policy?.workspaceRoots || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n protectSensitivePaths: policy?.protectSensitivePaths !== false,\n sensitivePaths: Array.from(\n new Set((policy?.sensitivePaths || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n sensitiveAllowPaths: Array.from(\n new Set((policy?.sensitiveAllowPaths || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n undoEnabled: policy?.undoEnabled !== false,\n };\n}\n","import {\n browseDirectories,\n editTextBlock,\n getFileInfo,\n listDirectory,\n readTextFile,\n writeTextFile,\n} from \"./filesystem.js\";\nimport {\n getManagedProcessStatus,\n listManagedProcesses,\n listProcesses,\n readManagedProcessOutput,\n runShellCommand,\n startBackgroundProcess,\n stopAllManagedProcesses,\n stopManagedProcess,\n} from \"./process.js\";\nimport {\n assertCommandAllowed,\n createUndoSnapshot,\n discardUndoSnapshot,\n finalizeUndoSnapshot,\n listUndoActions,\n undoChange,\n} from \"./safety.js\";\nimport {\n enforcePathPolicy,\n normalizePolicy,\n type ExecutionPolicy,\n} from \"./policy.js\";\nimport type {\n ExecutionMode,\n ToolArguments,\n ToolDefinition,\n ToolName,\n ToolResult,\n} from \"./types.js\";\n\nconst SAFE_TOOLS = new Set<ToolName>([\n \"list_directory\",\n \"browse_directories\",\n \"read_file\",\n \"get_file_info\",\n \"list_processes\",\n \"list_undo_actions\",\n]);\n\nconst DEVELOPER_TOOLS = new Set<ToolName>([\n ...SAFE_TOOLS,\n \"write_file\",\n \"edit_block\",\n \"undo_change\",\n \"undo_last_change\",\n]);\n\nconst FULL_TOOLS = new Set<ToolName>([\n ...DEVELOPER_TOOLS,\n \"start_process\",\n \"process_status\",\n \"process_output\",\n \"list_managed_processes\",\n \"stop_process\",\n]);\n\nconst DEFINITIONS: ToolDefinition[] = [\n {\n name: \"list_directory\",\n description: \"List files and directories on this computer without following directory symlinks.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n depth: { type: \"integer\", minimum: 1, maximum: 10, default: 2 },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"browse_directories\",\n description: \"List child directories for the Remote Arc dashboard directory picker.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"read_file\",\n description: \"Read a text file by line range. Negative offsets read from the end.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n offset: { type: \"integer\" },\n length: { type: \"integer\", minimum: 1 },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"get_file_info\",\n description: \"Get local file or directory metadata.\",\n inputSchema: {\n type: \"object\",\n properties: { path: { type: \"string\" } },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"list_processes\",\n description: \"List processes running on this computer.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"write_file\",\n description: \"Write or append UTF-8 text. Remote Arc creates a local-only Undo snapshot first.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n content: { type: \"string\" },\n mode: { type: \"string\", enum: [\"rewrite\", \"append\"], default: \"rewrite\" },\n },\n required: [\"path\", \"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"edit_block\",\n description: \"Apply an exact text replacement with conflict-safe Local Undo.\",\n inputSchema: {\n type: \"object\",\n properties: {\n file_path: { type: \"string\" },\n old_string: { type: \"string\" },\n new_string: { type: \"string\" },\n expected_replacements: { type: \"integer\", minimum: 1, default: 1 },\n },\n required: [\"file_path\", \"old_string\", \"new_string\"],\n additionalProperties: false,\n },\n },\n {\n name: \"list_undo_actions\",\n description: \"List reversible Remote Arc file changes currently stored on this device.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"integer\", minimum: 1, maximum: 100, default: 20 },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"undo_change\",\n description: \"Restore one specific local Remote Arc undo snapshot by action id.\",\n inputSchema: {\n type: \"object\",\n properties: {\n action_id: { type: \"string\" },\n },\n required: [\"action_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"undo_last_change\",\n description: \"Undo the newest reversible Remote Arc file edit stored only on this device.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"start_process\",\n description: \"Run a shell command with timeout and output capture. Catastrophic command patterns are blocked locally.\",\n inputSchema: {\n type: \"object\",\n properties: {\n command: { type: \"string\" },\n timeout_ms: { type: \"integer\", minimum: 100, maximum: 120000, default: 5000 },\n cwd: { type: \"string\" },\n background: { type: \"boolean\", default: false },\n },\n required: [\"command\"],\n additionalProperties: false,\n },\n },\n {\n name: \"process_status\",\n description: \"Get status for a Remote Arc managed background process.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"process_output\",\n description: \"Read captured stdout and stderr from a Remote Arc managed background process.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"list_managed_processes\",\n description: \"List background processes started and managed by Remote Arc on this device.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"stop_process\",\n description: \"Stop a Remote Arc managed background process and its child process tree.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n];\n\nconst textResult = (value: unknown): ToolResult => ({\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value, null, 2),\n },\n ],\n});\n\nfunction requiredString(args: ToolArguments, key: string) {\n const value = args[key];\n if (typeof value !== \"string\") throw new Error(`${key} must be a string.`);\n return value;\n}\n\nfunction optionalNumber(args: ToolArguments, key: string) {\n const value = args[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction optionalString(args: ToolArguments, key: string) {\n const value = args[key];\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nexport class RemoteArcExecutionCore {\n constructor(private readonly mode: ExecutionMode = \"managed\") {}\n\n private allowedTools() {\n if (this.mode === \"safe\") return SAFE_TOOLS;\n if (this.mode === \"developer\") return DEVELOPER_TOOLS;\n return FULL_TOOLS;\n }\n\n listTools() {\n const allowed = this.allowedTools();\n return DEFINITIONS.filter((tool) => allowed.has(tool.name));\n }\n\n async callTool(\n name: string,\n args: ToolArguments = {},\n policyInput: ExecutionPolicy = {},\n ): Promise<ToolResult> {\n const toolName = name as ToolName;\n if (!this.allowedTools().has(toolName)) {\n throw new Error(`Tool blocked by local permission mode: ${name}`);\n }\n\n const policy = normalizePolicy(policyInput);\n\n switch (toolName) {\n case \"list_directory\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(\n await listDirectory(\n target,\n optionalNumber(args, \"depth\") ?? 2,\n async (candidate) => {\n try {\n await enforcePathPolicy(candidate, policy);\n return true;\n } catch {\n return false;\n }\n },\n ),\n );\n }\n case \"browse_directories\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(\n await browseDirectories(\n target,\n async (candidate) => {\n try {\n await enforcePathPolicy(candidate, policy);\n return true;\n } catch {\n return false;\n }\n },\n ),\n );\n }\n case \"read_file\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(\n await readTextFile(\n target,\n optionalNumber(args, \"offset\"),\n optionalNumber(args, \"length\"),\n ),\n );\n }\n case \"get_file_info\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(await getFileInfo(target));\n }\n case \"list_processes\":\n return textResult(await listProcesses());\n case \"list_undo_actions\": {\n const actions = await listUndoActions(optionalNumber(args, \"limit\") ?? 20);\n const visible = [];\n for (const action of actions) {\n try {\n await enforcePathPolicy(action.path, policy);\n visible.push(action);\n } catch {\n // Do not reveal protected or out-of-scope paths through undo metadata.\n }\n }\n return textResult(visible);\n }\n case \"undo_change\": {\n if (policy.undoEnabled === false) {\n throw new Error(\"Local Undo is disabled for this device.\");\n }\n const actionId = requiredString(args, \"action_id\");\n const action = (await listUndoActions(100)).find((item) => item.id === actionId);\n if (!action) throw new Error(\"Undo action not found or expired on this device.\");\n await enforcePathPolicy(action.path, policy);\n return textResult(await undoChange(actionId));\n }\n case \"undo_last_change\": {\n if (policy.undoEnabled === false) {\n throw new Error(\"Local Undo is disabled for this device.\");\n }\n const actions = await listUndoActions(100);\n for (const action of actions) {\n try {\n await enforcePathPolicy(action.path, policy);\n return textResult(await undoChange(action.id));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (!message.startsWith(\"Blocked by Remote Arc\")) throw error;\n }\n }\n throw new Error(\"No reversible in-scope Remote Arc file change is available.\");\n }\n case \"start_process\": {\n const command = requiredString(args, \"command\");\n assertCommandAllowed(command);\n const cwdInput = optionalString(args, \"cwd\");\n if ((policy.workspaceRoots || []).length && !cwdInput) {\n throw new Error(\n \"Workspace Scope is enabled. start_process requires an in-scope cwd. Terminal commands are not an OS sandbox and may still access paths outside that directory.\",\n );\n }\n const cwd = cwdInput ? await enforcePathPolicy(cwdInput, policy) : undefined;\n if (args.background === true) {\n return textResult(await startBackgroundProcess(command, cwd));\n }\n return textResult(\n await runShellCommand(\n command,\n optionalNumber(args, \"timeout_ms\") ?? 5000,\n cwd,\n ),\n );\n }\n case \"process_status\":\n return textResult(\n getManagedProcessStatus(requiredString(args, \"process_id\")),\n );\n case \"process_output\":\n return textResult(\n readManagedProcessOutput(requiredString(args, \"process_id\")),\n );\n case \"list_managed_processes\":\n return textResult(listManagedProcesses());\n case \"stop_process\":\n return textResult(\n await stopManagedProcess(requiredString(args, \"process_id\")),\n );\n case \"write_file\":\n case \"edit_block\": {\n const pathKey = toolName === \"write_file\" ? \"path\" : \"file_path\";\n const target = await enforcePathPolicy(requiredString(args, pathKey), policy);\n const scopedArgs = { ...args, [pathKey]: target };\n const snapshot =\n policy.undoEnabled === false\n ? null\n : await createUndoSnapshot(toolName, scopedArgs);\n try {\n const result =\n toolName === \"write_file\"\n ? await writeTextFile(\n target,\n requiredString(args, \"content\"),\n args.mode === \"append\" ? \"append\" : \"rewrite\",\n )\n : await editTextBlock(\n target,\n requiredString(args, \"old_string\"),\n requiredString(args, \"new_string\"),\n optionalNumber(args, \"expected_replacements\") ?? 1,\n );\n\n const undoAvailable = await finalizeUndoSnapshot(snapshot);\n return textResult({\n ...result,\n undo_available: undoAvailable,\n undo_storage: undoAvailable ? \"local-device-only\" : null,\n });\n } catch (error) {\n await discardUndoSnapshot(snapshot);\n throw error;\n }\n }\n default:\n throw new Error(\"Unknown Remote Arc tool: \" + name);\n }\n }\n\n async close() {\n await stopAllManagedProcesses();\n }\n}\n\nexport const toolDefinitions = DEFINITIONS;\n"],"mappings":"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","names":["os","path","fs","spawn","process","crypto","process","crypto","fs","path","fs","os","path","path","os","process","fs","spawn"]}
|