remotelink 0.3.11 → 0.3.12

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 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 restores the newest reversible Remote Arc file
82
- change. The dashboard can also list local undo metadata on demand and restore a
83
- specific action without uploading snapshot contents. Snapshots expire after 7
84
- days, use at most 200 MB in total, and files larger than 20 MB are not
85
- snapshotted.
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. Sensitive-path
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,7 +1222,7 @@ var RemoteArcExecutionCore = class {
1135
1222
  };
1136
1223
 
1137
1224
  // src/index.ts
1138
- var VERSION = "0.3.11";
1225
+ var VERSION = "0.3.12";
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");
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":"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","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.12\";\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\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remotelink",
3
- "version": "0.3.11",
3
+ "version": "0.3.12",
4
4
  "description": "Connect a computer to Remote Arc with one command.",
5
5
  "type": "module",
6
6
  "bin": {