remotelink 0.3.13 → 0.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1222,7 +1222,7 @@ var RemoteArcExecutionCore = class {
1222
1222
  };
1223
1223
 
1224
1224
  // src/index.ts
1225
- var VERSION = "0.3.13";
1225
+ var VERSION = "0.3.14";
1226
1226
  var DEFAULT_ORIGIN = "https://mcp.remotearc.app";
1227
1227
  var CONFIG_DIR = path4.join(os3.homedir(), ".remotearc");
1228
1228
  var CONFIG_PATH = path4.join(CONFIG_DIR, "config.json");
@@ -1439,6 +1439,8 @@ async function connectAgent(config) {
1439
1439
  Authorization: "Bearer " + config.deviceToken
1440
1440
  }
1441
1441
  });
1442
+ const absorbSocketError = () => void 0;
1443
+ ws.on("error", absorbSocketError);
1442
1444
  try {
1443
1445
  await new Promise((resolve, reject) => {
1444
1446
  const onOpen = () => {
@@ -1451,6 +1453,7 @@ async function connectAgent(config) {
1451
1453
  };
1452
1454
  const onUnexpectedResponse = (_request, response) => {
1453
1455
  cleanup();
1456
+ response.resume?.();
1454
1457
  if (response.statusCode === 401 || response.statusCode === 403) {
1455
1458
  reject(new RevokedDeviceCredentialError());
1456
1459
  return;
@@ -1559,8 +1562,17 @@ async function connectAgent(config) {
1559
1562
  "Relay connection failed: " + (error instanceof Error ? error.message : String(error))
1560
1563
  );
1561
1564
  } finally {
1562
- ws.removeAllListeners();
1563
- ws.close();
1565
+ ws.removeAllListeners("message");
1566
+ ws.removeAllListeners("open");
1567
+ ws.removeAllListeners("unexpected-response");
1568
+ ws.removeAllListeners("close");
1569
+ ws.removeAllListeners("error");
1570
+ ws.on("error", absorbSocketError);
1571
+ if (ws.readyState === WebSocket.OPEN) {
1572
+ ws.close();
1573
+ } else if (ws.readyState === WebSocket.CONNECTING) {
1574
+ ws.terminate();
1575
+ }
1564
1576
  }
1565
1577
  if (!stopped) {
1566
1578
  logLine(
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../execution-core/src/filesystem.ts","../../execution-core/src/process.ts","../../execution-core/src/safety.ts","../../execution-core/src/policy.ts","../../execution-core/src/core.ts"],"sourcesContent":["#!/usr/bin/env node\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport fs from \"node:fs/promises\";\nimport { spawn } from \"node:child_process\";\nimport process from \"node:process\";\nimport WebSocket from \"ws\";\nimport {\n RemoteArcExecutionCore,\n type ExecutionPolicy,\n} from \"@remotearc/execution-core\";\n\nconst VERSION = \"0.3.13\";\nconst DEFAULT_ORIGIN = \"https://mcp.remotearc.app\";\nconst CONFIG_DIR = path.join(os.homedir(), \".remotearc\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\nconst LEGACY_CONFIG_PATH = path.join(os.homedir(), \".remote-link\", \"config.json\");\n\ntype Mode = \"managed\" | \"safe\" | \"developer\";\n\ntype SavedConfig = {\n deviceId: string;\n deviceToken: string;\n deviceName: string;\n origin: string;\n mode: Mode;\n};\n\nclass RevokedDeviceCredentialError extends Error {\n constructor() {\n super(\"Saved device credential has been revoked.\");\n this.name = \"RevokedDeviceCredentialError\";\n }\n}\n\nasync function validateSavedPairing(config: SavedConfig) {\n try {\n const response = await fetch(new URL(\"/api/device/heartbeat\", config.origin), {\n method: \"POST\",\n headers: { Authorization: \"Bearer \" + config.deviceToken },\n });\n\n if (response.status === 401 || response.status === 403) {\n throw new RevokedDeviceCredentialError();\n }\n\n // A transient server-side failure should not destroy a valid local pairing.\n // The WebSocket connection remains the source of truth for availability.\n return;\n } catch (error) {\n if (error instanceof RevokedDeviceCredentialError) throw error;\n return;\n }\n}\n\ntype PairingStart = {\n device_code: string;\n device_secret: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n};\n\ntype PairingToken = {\n device_id: string;\n device_token: string;\n relay_url: string;\n};\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst supportsColor = process.stdout.isTTY && !process.env.NO_COLOR;\nconst paint = (code: string, value: string) =>\n supportsColor ? `\\x1b[${code}m${value}\\x1b[0m` : value;\nconst dim = (value: string) => paint(\"2\", value);\nconst cyan = (value: string) => paint(\"36\", value);\nconst green = (value: string) => paint(\"32\", value);\nconst yellow = (value: string) => paint(\"33\", value);\nconst red = (value: string) => paint(\"31\", value);\nconst bold = (value: string) => paint(\"1\", value);\n\nfunction nowTime() {\n return new Date().toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n}\n\nfunction logLine(\n level: \"info\" | \"success\" | \"warn\" | \"error\" | \"event\",\n message: string,\n) {\n const icon =\n level === \"success\" ? green(\"✓\") :\n level === \"warn\" ? yellow(\"!\") :\n level === \"error\" ? red(\"×\") :\n level === \"event\" ? cyan(\"→\") :\n cyan(\"•\");\n process.stdout.write(`${dim(nowTime())} ${icon} ${message}\\n`);\n}\n\nfunction banner() {\n process.stdout.write(\"\\n\");\n process.stdout.write(bold(\"Remote Arc\") + \" \" + dim(`v${VERSION}`) + \"\\n\");\n process.stdout.write(dim(\"Secure remote MCP bridge\") + \"\\n\\n\");\n}\n\nfunction argFlag(name: string) {\n return process.argv.includes(name);\n}\n\nfunction selectedMode(): Mode {\n if (argFlag(\"--safe\")) return \"safe\";\n return \"managed\";\n}\n\nfunction isLocalSafeMode(mode: Mode) {\n return mode === \"safe\";\n}\n\nfunction modeLabel(mode: Mode) {\n return isLocalSafeMode(mode) ? \"safe local cap\" : \"dashboard-managed\";\n}\n\nasync function readConfig(): Promise<SavedConfig | null> {\n try {\n return JSON.parse(await fs.readFile(CONFIG_PATH, \"utf8\")) as SavedConfig;\n } catch {\n try {\n const legacy = JSON.parse(\n await fs.readFile(LEGACY_CONFIG_PATH, \"utf8\"),\n ) as SavedConfig;\n await writeConfig(legacy);\n logLine(\"success\", \"Migrated existing Remote Link pairing to Remote Arc.\");\n return legacy;\n } catch {\n return null;\n }\n }\n}\n\nasync function writeConfig(config: SavedConfig) {\n await fs.mkdir(CONFIG_DIR, { recursive: true });\n await fs.writeFile(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", {\n mode: 0o600,\n });\n}\n\nasync function resetConfig() {\n await Promise.all([\n fs.rm(CONFIG_PATH, { force: true }),\n fs.rm(LEGACY_CONFIG_PATH, { force: true }),\n ]);\n logLine(\"success\", \"Removed saved device credentials.\");\n}\n\nfunction openBrowser(url: string) {\n const command =\n process.platform === \"win32\"\n ? \"cmd\"\n : process.platform === \"darwin\"\n ? \"open\"\n : \"xdg-open\";\n const args =\n process.platform === \"win32\"\n ? [\"/c\", \"start\", \"\", url]\n : [url];\n\n const child = spawn(command, args, {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n}\n\nasync function pair(origin: string, mode: Mode): Promise<SavedConfig> {\n const deviceName = os.hostname();\n const response = await fetch(origin + \"/api/device/start\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n device_name: deviceName,\n platform: process.platform,\n arch: process.arch,\n hostname: os.hostname(),\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Could not start device pairing: \" + response.status);\n }\n\n const pairing = (await response.json()) as PairingStart;\n\n banner();\n logLine(\"info\", `Device: ${bold(deviceName)} · ${process.platform}/${process.arch} · ${modeLabel(mode)}`);\n logLine(\"event\", \"Pairing required — opening secure browser approval.\");\n process.stdout.write(\"\\n Pairing code \" + bold(cyan(pairing.user_code)) + \"\\n\");\n process.stdout.write(\" \" + dim(pairing.verification_uri_complete) + \"\\n\\n\");\n openBrowser(pairing.verification_uri_complete);\n logLine(\"info\", \"Waiting for authorization…\");\n\n const startedAt = Date.now();\n while (Date.now() - startedAt < pairing.expires_in * 1000) {\n await sleep(Math.max(pairing.interval, 2) * 1000);\n\n const tokenResponse = await fetch(origin + \"/api/device/token\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n device_code: pairing.device_code,\n device_secret: pairing.device_secret,\n }),\n });\n\n if (tokenResponse.status === 428) {\n if (process.stdout.isTTY) process.stdout.write(dim(\"·\"));\n continue;\n }\n\n if (!tokenResponse.ok) {\n const body = await tokenResponse.text();\n throw new Error(\"Pairing failed: \" + body);\n }\n\n const result = (await tokenResponse.json()) as PairingToken;\n process.stdout.write(\"\\n\");\n logLine(\"success\", \"Device authorized.\");\n\n const config: SavedConfig = {\n deviceId: result.device_id,\n deviceToken: result.device_token,\n deviceName,\n origin,\n mode,\n };\n await writeConfig(config);\n return config;\n }\n\n throw new Error(\"Pairing expired. Run Remote Arc again to retry.\");\n}\n\nclass ExecutionCore {\n private readonly core: RemoteArcExecutionCore;\n\n constructor(mode: Mode) {\n this.core = new RemoteArcExecutionCore(\n isLocalSafeMode(mode) ? \"safe\" : \"managed\",\n );\n }\n\n async tools() {\n return this.core.listTools();\n }\n\n async call(\n name: string,\n args: Record<string, unknown>,\n policy?: ExecutionPolicy,\n ) {\n return this.core.callTool(name, args, policy);\n }\n\n async close() {\n await this.core.close();\n }\n}\n\nasync function connectAgent(config: SavedConfig): Promise<\"stopped\" | \"rePair\"> {\n const core = new ExecutionCore(config.mode);\n banner();\n logLine(\"info\", `Device: ${bold(config.deviceName)} · ${process.platform}/${process.arch}`);\n logLine(\n \"info\",\n `Permission profile: ${isLocalSafeMode(config.mode) ? green(\"safe local cap\") : cyan(\"dashboard-managed\")}`,\n );\n\n const tools = await core.tools();\n logLine(\"success\", `Local tools ready: ${tools.length} exposed`);\n process.stdout.write(\" \" + dim(tools.map((tool) => tool.name).join(\" · \")) + \"\\n\");\n try {\n await validateSavedPairing(config);\n } catch (error) {\n if (error instanceof RevokedDeviceCredentialError) {\n logLine(\"warn\", error.message);\n await resetConfig();\n logLine(\"event\", \"Starting a fresh device pairing…\");\n await core.close().catch(() => undefined);\n return \"rePair\";\n }\n throw error;\n }\n\n const wsUrl = new URL(\"/agent\", config.origin.replace(/^http/, \"ws\"));\n\n let stopped = false;\n let backoff = 1000;\n\n const shutdown = async () => {\n stopped = true;\n await core.close().catch(() => undefined);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n while (!stopped) {\n logLine(\"event\", `Connecting relay ${dim(wsUrl.host)}…`);\n const ws = new WebSocket(wsUrl, {\n headers: {\n Authorization: \"Bearer \" + config.deviceToken,\n },\n });\n\n try {\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onUnexpectedResponse = (\n _request: unknown,\n response: { statusCode?: number },\n ) => {\n cleanup();\n if (response.statusCode === 401 || response.statusCode === 403) {\n reject(new RevokedDeviceCredentialError());\n return;\n }\n reject(\n new Error(\n \"Unexpected relay response: \" + String(response.statusCode || \"unknown\"),\n ),\n );\n };\n const cleanup = () => {\n ws.off(\"open\", onOpen);\n ws.off(\"error\", onError);\n ws.off(\"unexpected-response\", onUnexpectedResponse);\n };\n\n ws.once(\"open\", onOpen);\n ws.once(\"error\", onError);\n ws.once(\"unexpected-response\", onUnexpectedResponse);\n });\n\n backoff = 1000;\n ws.send(\n JSON.stringify({\n type: \"hello\",\n device: {\n id: config.deviceId,\n name: config.deviceName,\n platform: process.platform,\n arch: process.arch,\n hostname: os.hostname(),\n agentVersion: VERSION,\n },\n tools: tools.map((tool) => tool.name),\n capabilities: [\"native_core_v1\", \"device_policy_v1\", \"undo_history_v1\"],\n }),\n );\n\n logLine(\"success\", `Relay connected · ${bold(config.deviceName)} · ${config.mode} mode`);\n logLine(\"success\", \"Device presence published.\");\n process.stdout.write(\" \" + dim(config.origin) + \"\\n\");\n process.stdout.write(\" \" + dim(\"Ctrl+C to disconnect\") + \"\\n\\n\");\n\n const sendHeartbeat = async () => {\n try {\n await fetch(new URL(\"/api/device/heartbeat\", config.origin), {\n method: \"POST\",\n headers: { Authorization: \"Bearer \" + config.deviceToken },\n });\n } catch {\n // WebSocket reconnect logic remains the source of truth for connectivity.\n }\n };\n void sendHeartbeat();\n const heartbeatTimer = setInterval(\n () => void sendHeartbeat(),\n 15 * 60_000,\n );\n\n await new Promise<void>((resolve) => {\n ws.on(\"message\", async (raw) => {\n let message: {\n type?: string;\n id?: string;\n tool?: string;\n arguments?: Record<string, unknown>;\n policy?: ExecutionPolicy;\n };\n\n try {\n message = JSON.parse(raw.toString());\n } catch {\n return;\n }\n\n if (\n message.type !== \"call\" ||\n !message.id ||\n !message.tool\n ) {\n return;\n }\n\n const callStarted = Date.now();\n logLine(\"event\", `tool.call ${bold(message.tool)} · ${dim(message.id.slice(0, 8))}`);\n try {\n const result = await core.call(\n message.tool,\n message.arguments || {},\n message.policy,\n );\n logLine(\"success\", `tool.done ${message.tool} · ${Date.now() - callStarted}ms`);\n ws.send(\n JSON.stringify({\n type: \"result\",\n id: message.id,\n result,\n }),\n );\n } catch (error) {\n logLine(\"error\", `tool.fail ${message.tool} · ${error instanceof Error ? error.message : String(error)}`);\n ws.send(\n JSON.stringify({\n type: \"result\",\n id: message.id,\n error: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n });\n\n ws.once(\"close\", resolve);\n ws.once(\"error\", resolve);\n });\n clearInterval(heartbeatTimer);\n } catch (error) {\n if (error instanceof RevokedDeviceCredentialError) {\n logLine(\"warn\", error.message);\n await resetConfig();\n logLine(\"event\", \"Starting a fresh device pairing…\");\n await core.close().catch(() => undefined);\n return \"rePair\";\n }\n\n logLine(\n \"error\",\n \"Relay connection failed: \" +\n (error instanceof Error ? error.message : String(error)),\n );\n } finally {\n ws.removeAllListeners();\n ws.close();\n }\n\n if (!stopped) {\n logLine(\n \"warn\",\n \"Relay disconnected · retrying in \" + Math.round(backoff / 1000) + \"s\",\n );\n await sleep(backoff);\n backoff = Math.min(backoff * 2, 30_000);\n }\n }\n\n await core.close().catch(() => undefined);\n return \"stopped\";\n}\n\nasync function main() {\n if (argFlag(\"--help\") || argFlag(\"-h\")) {\n process.stdout.write(\n [\n \"Remote Arc\",\n \"\",\n \"Usage:\",\n \" npx remotelink\",\n \"\",\n \"After the npm release:\",\n \" npx remotelink\",\n \"\",\n \"Options:\",\n \" --safe Hard local read-only cap; dashboard cannot enable write tools\",\n \" --developer Legacy alias for dashboard-managed capabilities\",\n \" --reset Remove this computer's saved pairing\",\n \" --version Print CLI version\",\n \" --help Show this help\",\n \"\",\n ].join(\"\\n\"),\n );\n return;\n }\n\n if (argFlag(\"--version\") || argFlag(\"-v\")) {\n process.stdout.write(VERSION + \"\\n\");\n return;\n }\n\n if (argFlag(\"--reset\")) {\n await resetConfig();\n return;\n }\n\n const origin =\n process.env.REMOTEARC_ORIGIN || process.env.REMOTE_LINK_ORIGIN ||\n process.argv.find((value) => value.startsWith(\"--origin=\"))?.slice(9) ||\n DEFAULT_ORIGIN;\n\n let config = await readConfig();\n\n while (true) {\n if (config && [\"https://remote.samyao.me\", \"https://remotearc.app\"].includes(config.origin)) {\n config.origin = DEFAULT_ORIGIN;\n await writeConfig(config);\n logLine(\"info\", \"Migrated relay origin to \" + DEFAULT_ORIGIN);\n }\n\n if (!config) {\n config = await pair(origin, selectedMode());\n } else if (argFlag(\"--safe\") || argFlag(\"--developer\")) {\n config.mode = argFlag(\"--safe\") ? \"safe\" : \"managed\";\n await writeConfig(config);\n }\n\n logLine(\"info\", `Using paired device identity ${dim(config.deviceId.slice(0, 8))}…`);\n const result = await connectAgent(config);\n if (result !== \"rePair\") return;\n\n config = null;\n }\n}\n\nmain().catch((error) => {\n logLine(\n \"error\",\n \"Fatal: \" + (error instanceof Error ? error.message : String(error)),\n );\n process.exit(1);\n});\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst MAX_DIRECTORY_ENTRIES = 2000;\nconst DEFAULT_READ_LINES = 240;\nconst MAX_TEXT_FILE_BYTES = 20 * 1024 * 1024;\n\nconst printableSize = (bytes: number) => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nexport async function listDirectory(\n targetPath: string,\n depth = 2,\n canReveal?: (candidatePath: string) => Promise<boolean>,\n) {\n const maxDepth = Math.max(1, Math.min(10, Math.trunc(depth || 2)));\n const lines: string[] = [];\n let entriesSeen = 0;\n let protectedEntries = 0;\n\n async function walk(directory: string, level: number, prefix: string) {\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) return;\n const entries = await fs.readdir(directory, { withFileTypes: true });\n entries.sort((a, b) => {\n if (a.isDirectory() !== b.isDirectory()) return a.isDirectory() ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n for (const entry of entries) {\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) break;\n const absolute = path.join(directory, entry.name);\n\n if (canReveal && !(await canReveal(absolute))) {\n protectedEntries += 1;\n continue;\n }\n\n entriesSeen += 1;\n const label = entry.isDirectory()\n ? \"[DIR]\"\n : entry.isSymbolicLink()\n ? \"[LINK]\"\n : \"[FILE]\";\n lines.push(`${prefix}${label} ${entry.name}`);\n\n if (entry.isDirectory() && level < maxDepth) {\n await walk(absolute, level + 1, prefix + \" \");\n }\n }\n }\n\n const stat = await fs.stat(targetPath);\n if (!stat.isDirectory()) throw new Error(\"Path is not a directory: \" + targetPath);\n\n await walk(targetPath, 1, \"\");\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) {\n lines.push(`… truncated after ${MAX_DIRECTORY_ENTRIES} entries`);\n }\n\n const protectionNote = protectedEntries\n ? `\\n\\n[Remote Arc omitted ${protectedEntries} protected or out-of-scope entr${protectedEntries === 1 ? \"y\" : \"ies\"}.]`\n : \"\";\n\n return `Directory: ${targetPath}\\nDepth: ${maxDepth}\\n\\n${lines.join(\"\\n\") || \"(empty)\"}${protectionNote}`;\n}\n\nexport async function readTextFile(\n targetPath: string,\n offset?: number,\n length?: number,\n) {\n const stat = await fs.stat(targetPath);\n if (!stat.isFile()) throw new Error(\"Path is not a file: \" + targetPath);\n if (stat.size > MAX_TEXT_FILE_BYTES) {\n throw new Error(\n `File is too large for read_file (${printableSize(stat.size)} > 20 MB). Use a terminal command or a more targeted tool instead.`,\n );\n }\n\n const buffer = await fs.readFile(targetPath);\n const sample = buffer.subarray(0, Math.min(buffer.length, 8192));\n if (sample.includes(0)) {\n throw new Error(\"Binary file detected. read_file currently supports text files only.\");\n }\n\n const text = buffer.toString(\"utf8\");\n const lines = text.split(/\\r?\\n/);\n const requestedOffset = Number.isFinite(offset) ? Math.trunc(offset as number) : 0;\n const start =\n requestedOffset < 0\n ? Math.max(0, lines.length + requestedOffset)\n : Math.min(lines.length, Math.max(0, requestedOffset));\n const requestedLength =\n Number.isFinite(length) && (length as number) > 0\n ? Math.trunc(length as number)\n : DEFAULT_READ_LINES;\n const end = Math.min(lines.length, start + requestedLength);\n const chunk = lines.slice(start, end).join(\"\\n\");\n\n const location =\n start === 0\n ? \"start\"\n : end === lines.length\n ? `line ${start + 1} to end`\n : `lines ${start + 1}-${end}`;\n\n return `[Reading ${end - start} lines from ${location} (total: ${lines.length} lines, ${printableSize(stat.size)})]\\n\\n${chunk}`;\n}\n\nexport async function getFileInfo(targetPath: string) {\n const stat = await fs.lstat(targetPath);\n return {\n path: targetPath,\n type: stat.isFile()\n ? \"file\"\n : stat.isDirectory()\n ? \"directory\"\n : stat.isSymbolicLink()\n ? \"symlink\"\n : \"other\",\n size: stat.size,\n size_human: printableSize(stat.size),\n mode: stat.mode,\n created_at: stat.birthtime.toISOString(),\n modified_at: stat.mtime.toISOString(),\n accessed_at: stat.atime.toISOString(),\n };\n}\n\nasync function atomicWriteText(targetPath: string, content: string) {\n const directory = path.dirname(targetPath);\n await fs.mkdir(directory, { recursive: true });\n const temporary = path.join(\n directory,\n \".\" + path.basename(targetPath) + \".remotearc-\" + crypto.randomUUID() + \".tmp\",\n );\n\n try {\n await fs.writeFile(temporary, content, \"utf8\");\n await fs.rename(temporary, targetPath);\n } finally {\n await fs.rm(temporary, { force: true }).catch(() => undefined);\n }\n}\n\nexport async function writeTextFile(\n targetPath: string,\n content: string,\n mode: \"rewrite\" | \"append\" = \"rewrite\",\n) {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n if (mode === \"append\") {\n await fs.appendFile(targetPath, content, \"utf8\");\n } else {\n await atomicWriteText(targetPath, content);\n }\n const stat = await fs.stat(targetPath);\n return {\n path: targetPath,\n mode,\n bytes: Buffer.byteLength(content),\n file_size: stat.size,\n atomic: mode === \"rewrite\",\n };\n}\n\nexport async function editTextBlock(\n filePath: string,\n oldString: string,\n newString: string,\n expectedReplacements = 1,\n) {\n if (!oldString) throw new Error(\"old_string cannot be empty.\");\n const current = await fs.readFile(filePath, \"utf8\");\n const parts = current.split(oldString);\n const replacements = parts.length - 1;\n\n if (replacements !== expectedReplacements) {\n throw new Error(\n `Expected ${expectedReplacements} replacement(s) in ${filePath}, found ${replacements}. No changes were written.`,\n );\n }\n\n const next = parts.join(newString);\n await atomicWriteText(filePath, next);\n return {\n path: filePath,\n replacements,\n bytes_before: Buffer.byteLength(current),\n bytes_after: Buffer.byteLength(next),\n atomic: true,\n };\n}\n\n\nexport async function browseDirectories(\n targetPath: string,\n canReveal?: (candidatePath: string) => Promise<boolean>,\n) {\n const stat = await fs.stat(targetPath);\n if (!stat.isDirectory()) throw new Error(\"Path is not a directory: \" + targetPath);\n\n const entries = await fs.readdir(targetPath, { withFileTypes: true });\n const directories: Array<{ name: string; path: string; type: \"directory\" | \"symlink\" }> = [];\n let protectedEntries = 0;\n\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const absolute = path.join(targetPath, entry.name);\n if (canReveal && !(await canReveal(absolute))) {\n protectedEntries += 1;\n continue;\n }\n directories.push({\n name: entry.name,\n path: absolute,\n type: entry.isSymbolicLink() ? \"symlink\" : \"directory\",\n });\n if (directories.length >= 300) break;\n }\n\n directories.sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n path: targetPath,\n parent: path.dirname(targetPath) === targetPath ? null : path.dirname(targetPath),\n directories,\n protected_entries_omitted: protectedEntries,\n truncated: directories.length >= 300,\n };\n}\n","import { execFile, spawn, type ChildProcess } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport process from \"node:process\";\n\nconst MAX_CAPTURE_BYTES = 2 * 1024 * 1024;\n\nfunction appendCapped(current: string, chunk: Buffer | string) {\n if (Buffer.byteLength(current) >= MAX_CAPTURE_BYTES) return current;\n const next = current + chunk.toString();\n if (Buffer.byteLength(next) <= MAX_CAPTURE_BYTES) return next;\n return next.slice(0, MAX_CAPTURE_BYTES) + \"\\n… output truncated …\";\n}\n\nexport async function listProcesses() {\n const output = await new Promise<string>((resolve, reject) => {\n const command = process.platform === \"win32\" ? \"tasklist.exe\" : \"ps\";\n const args =\n process.platform === \"win32\"\n ? [\"/FO\", \"CSV\", \"/NH\"]\n : [\"-axo\", \"pid,ppid,user,%cpu,%mem,etime,command\"];\n execFile(command, args, { maxBuffer: MAX_CAPTURE_BYTES }, (error, stdout, stderr) => {\n if (error) {\n reject(new Error(`Could not list processes: ${stderr || error.message}`));\n return;\n }\n resolve(stdout.trim());\n });\n });\n\n return `Processes on ${process.platform}:\\n\\n${output}`;\n}\n\nasync function terminateTree(child: ReturnType<typeof spawn>) {\n if (!child.pid) return;\n if (process.platform === \"win32\") {\n await new Promise<void>((resolve) => {\n const killer = spawn(\n \"taskkill.exe\",\n [\"/PID\", String(child.pid), \"/T\", \"/F\"],\n { windowsHide: true, stdio: \"ignore\" },\n );\n killer.once(\"close\", () => resolve());\n killer.once(\"error\", () => resolve());\n });\n return;\n }\n\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill(\"SIGTERM\");\n }\n await new Promise((resolve) => setTimeout(resolve, 300));\n try {\n process.kill(-child.pid, \"SIGKILL\");\n } catch {\n if (!child.killed) child.kill(\"SIGKILL\");\n }\n}\n\nexport async function runShellCommand(\n command: string,\n timeoutMs = 5000,\n cwd?: string,\n) {\n const timeout = Math.max(100, Math.min(120_000, Math.trunc(timeoutMs || 5000)));\n const startedAt = Date.now();\n\n return await new Promise<{\n command: string;\n cwd: string | null;\n exit_code: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n duration_ms: number;\n timed_out: boolean;\n }>((resolve, reject) => {\n const child = spawn(command, {\n shell: true,\n cwd,\n windowsHide: true,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n\n child.stdout?.on(\"data\", (chunk) => {\n stdout = appendCapped(stdout, chunk);\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr = appendCapped(stderr, chunk);\n });\n\n const timer = setTimeout(async () => {\n timedOut = true;\n await terminateTree(child);\n }, timeout);\n\n child.once(\"error\", (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n reject(error);\n });\n\n child.once(\"close\", (code, signal) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({\n command,\n cwd: cwd || null,\n exit_code: code,\n signal,\n stdout,\n stderr,\n duration_ms: Date.now() - startedAt,\n timed_out: timedOut,\n });\n });\n });\n}\n\n\ntype ManagedProcess = {\n id: string;\n child: ChildProcess;\n command: string;\n cwd: string | null;\n startedAt: number;\n endedAt: number | null;\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n};\n\nconst managedProcesses = new Map<string, ManagedProcess>();\nconst MAX_MANAGED_PROCESSES = 32;\nconst FINISHED_PROCESS_RETENTION_MS = 30 * 60 * 1000;\n\nfunction cleanupManagedProcesses() {\n const now = Date.now();\n for (const [id, item] of managedProcesses) {\n if (\n item.endedAt !== null &&\n now - item.endedAt > FINISHED_PROCESS_RETENTION_MS\n ) {\n managedProcesses.delete(id);\n }\n }\n\n if (managedProcesses.size <= MAX_MANAGED_PROCESSES) return;\n const finished = [...managedProcesses.values()]\n .filter((item) => item.endedAt !== null)\n .sort((a, b) => (a.endedAt || 0) - (b.endedAt || 0));\n for (const item of finished) {\n if (managedProcesses.size <= MAX_MANAGED_PROCESSES) break;\n managedProcesses.delete(item.id);\n }\n}\n\nexport async function startBackgroundProcess(command: string, cwd?: string) {\n cleanupManagedProcesses();\n if (managedProcesses.size >= MAX_MANAGED_PROCESSES) {\n throw new Error(\n \"Remote Arc already has the maximum number of managed background processes on this device.\",\n );\n }\n\n const child = spawn(command, {\n shell: true,\n cwd,\n windowsHide: true,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const id = crypto.randomUUID();\n const item: ManagedProcess = {\n id,\n child,\n command,\n cwd: cwd || null,\n startedAt: Date.now(),\n endedAt: null,\n exitCode: null,\n signal: null,\n stdout: \"\",\n stderr: \"\",\n };\n managedProcesses.set(id, item);\n\n child.stdout?.on(\"data\", (chunk) => {\n item.stdout = appendCapped(item.stdout, chunk);\n });\n child.stderr?.on(\"data\", (chunk) => {\n item.stderr = appendCapped(item.stderr, chunk);\n });\n child.once(\"error\", (error) => {\n item.stderr = appendCapped(item.stderr, \"\\n\" + error.message);\n item.endedAt = Date.now();\n });\n child.once(\"close\", (code, signal) => {\n item.exitCode = code;\n item.signal = signal;\n item.endedAt = Date.now();\n });\n\n return {\n process_id: id,\n pid: child.pid || null,\n command,\n cwd: cwd || null,\n status: \"running\",\n started_at: new Date(item.startedAt).toISOString(),\n };\n}\n\nfunction managedProcessOrThrow(processId: string) {\n cleanupManagedProcesses();\n const item = managedProcesses.get(processId);\n if (!item) {\n throw new Error(\n \"Managed process not found or its local retention window has expired.\",\n );\n }\n return item;\n}\n\nexport function getManagedProcessStatus(processId: string) {\n const item = managedProcessOrThrow(processId);\n return {\n process_id: item.id,\n pid: item.child.pid || null,\n command: item.command,\n cwd: item.cwd,\n status: item.endedAt === null ? \"running\" : \"exited\",\n exit_code: item.exitCode,\n signal: item.signal,\n started_at: new Date(item.startedAt).toISOString(),\n ended_at: item.endedAt === null ? null : new Date(item.endedAt).toISOString(),\n duration_ms: (item.endedAt || Date.now()) - item.startedAt,\n };\n}\n\nexport function readManagedProcessOutput(processId: string) {\n const item = managedProcessOrThrow(processId);\n return {\n ...getManagedProcessStatus(processId),\n stdout: item.stdout,\n stderr: item.stderr,\n truncated:\n Buffer.byteLength(item.stdout) >= MAX_CAPTURE_BYTES ||\n Buffer.byteLength(item.stderr) >= MAX_CAPTURE_BYTES,\n };\n}\n\nexport async function stopManagedProcess(processId: string) {\n const item = managedProcessOrThrow(processId);\n if (item.endedAt !== null) {\n return {\n ...getManagedProcessStatus(processId),\n stopped: false,\n already_exited: true,\n };\n }\n\n await terminateTree(item.child);\n await new Promise((resolve) => setTimeout(resolve, 50));\n return {\n ...getManagedProcessStatus(processId),\n stopped: true,\n already_exited: false,\n };\n}\n\n\nexport async function stopAllManagedProcesses() {\n const running = [...managedProcesses.values()].filter(\n (item) => item.endedAt === null,\n );\n await Promise.all(\n running.map(async (item) => {\n await terminateTree(item.child).catch(() => undefined);\n }),\n );\n}\n\n\nexport function listManagedProcesses() {\n cleanupManagedProcesses();\n return [...managedProcesses.values()]\n .sort((a, b) => b.startedAt - a.startedAt)\n .map((item) => ({\n process_id: item.id,\n pid: item.child.pid || null,\n command: item.command,\n cwd: item.cwd,\n status: item.endedAt === null ? \"running\" : \"exited\",\n exit_code: item.exitCode,\n signal: item.signal,\n started_at: new Date(item.startedAt).toISOString(),\n ended_at: item.endedAt === null ? null : new Date(item.endedAt).toISOString(),\n duration_ms: (item.endedAt || Date.now()) - item.startedAt,\n stdout_bytes: Buffer.byteLength(item.stdout),\n stderr_bytes: Buffer.byteLength(item.stderr),\n }));\n}\n","import crypto from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst RETENTION_MS = 7 * 24 * 60 * 60 * 1000;\nconst MAX_SNAPSHOT_BYTES = 20 * 1024 * 1024;\nconst MAX_UNDO_BYTES = 200 * 1024 * 1024;\n\ntype UndoManifest = {\n id: string;\n createdAt: string;\n tool: \"write_file\" | \"edit_block\";\n targetPath: string;\n existed: boolean;\n mode?: number;\n bytes: number;\n postChangeHash?: string;\n};\n\nexport type UndoSnapshot = {\n id: string;\n directory: string;\n manifest: UndoManifest;\n};\n\nconst undoRoot = () =>\n process.env.REMOTEARC_UNDO_ROOT ||\n path.join(os.homedir(), \".remotearc\", \"undo\");\n\nasync function ensureUndoRoot() {\n await fs.mkdir(undoRoot(), { recursive: true, mode: 0o700 });\n}\n\nasync function readManifest(directory: string): Promise<UndoManifest | null> {\n try {\n return JSON.parse(\n await fs.readFile(path.join(directory, \"manifest.json\"), \"utf8\"),\n ) as UndoManifest;\n } catch {\n return null;\n }\n}\n\nasync function snapshotDirectories() {\n await ensureUndoRoot();\n const entries = await fs.readdir(undoRoot(), { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(undoRoot(), entry.name));\n}\n\nasync function cleanupUndoStore() {\n const now = Date.now();\n const snapshots: Array<{ directory: string; manifest: UndoManifest }> = [];\n\n for (const directory of await snapshotDirectories()) {\n const manifest = await readManifest(directory);\n if (!manifest) {\n await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined);\n continue;\n }\n\n const created = Date.parse(manifest.createdAt);\n if (!Number.isFinite(created) || now - created > RETENTION_MS) {\n await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined);\n continue;\n }\n\n snapshots.push({ directory, manifest });\n }\n\n snapshots.sort(\n (a, b) => Date.parse(a.manifest.createdAt) - Date.parse(b.manifest.createdAt),\n );\n\n let total = snapshots.reduce((sum, item) => sum + item.manifest.bytes, 0);\n for (const item of snapshots) {\n if (total <= MAX_UNDO_BYTES) break;\n await fs.rm(item.directory, { recursive: true, force: true }).catch(() => undefined);\n total -= item.manifest.bytes;\n }\n}\n\nfunction mutationPath(\n tool: \"write_file\" | \"edit_block\",\n args: Record<string, unknown>,\n) {\n const candidate = tool === \"write_file\" ? args.path : args.file_path;\n return typeof candidate === \"string\" && candidate.trim() ? candidate : null;\n}\n\nexport async function createUndoSnapshot(\n tool: \"write_file\" | \"edit_block\",\n args: Record<string, unknown>,\n): Promise<UndoSnapshot | null> {\n const targetPath = mutationPath(tool, args);\n if (!targetPath) return null;\n\n await cleanupUndoStore();\n\n let existed = false;\n let mode: number | undefined;\n let bytes = 0;\n let original: Buffer | null = null;\n\n try {\n const stat = await fs.stat(targetPath);\n if (!stat.isFile()) return null;\n existed = true;\n mode = stat.mode;\n bytes = stat.size;\n if (bytes > MAX_SNAPSHOT_BYTES) return null;\n original = await fs.readFile(targetPath);\n } catch (error) {\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? String((error as { code?: unknown }).code)\n : \"\";\n if (code !== \"ENOENT\") throw error;\n }\n\n const id = `${Date.now()}-${crypto.randomUUID().slice(0, 8)}`;\n const directory = path.join(undoRoot(), id);\n await fs.mkdir(directory, { recursive: true, mode: 0o700 });\n\n if (original) {\n await fs.writeFile(path.join(directory, \"content.bin\"), original, { mode: 0o600 });\n }\n\n const manifest: UndoManifest = {\n id,\n createdAt: new Date().toISOString(),\n tool,\n targetPath,\n existed,\n ...(mode !== undefined ? { mode } : {}),\n bytes,\n };\n\n await fs.writeFile(\n path.join(directory, \"manifest.json\"),\n JSON.stringify(manifest, null, 2) + \"\\n\",\n { mode: 0o600 },\n );\n\n await cleanupUndoStore();\n return { id, directory, manifest };\n}\n\nasync function hashFile(filePath: string) {\n const hash = crypto.createHash(\"sha256\");\n for await (const chunk of createReadStream(filePath)) hash.update(chunk);\n return hash.digest(\"hex\");\n}\n\nexport async function finalizeUndoSnapshot(snapshot: UndoSnapshot | null) {\n if (!snapshot) return false;\n try {\n snapshot.manifest.postChangeHash = await hashFile(snapshot.manifest.targetPath);\n await fs.writeFile(\n path.join(snapshot.directory, \"manifest.json\"),\n JSON.stringify(snapshot.manifest, null, 2) + \"\\n\",\n { mode: 0o600 },\n );\n return true;\n } catch {\n await discardUndoSnapshot(snapshot);\n return false;\n }\n}\n\nexport async function discardUndoSnapshot(snapshot: UndoSnapshot | null) {\n if (!snapshot) return;\n await fs.rm(snapshot.directory, { recursive: true, force: true }).catch(() => undefined);\n}\n\nasync function undoCandidates() {\n await cleanupUndoStore();\n const candidates: Array<{ directory: string; manifest: UndoManifest }> = [];\n for (const directory of await snapshotDirectories()) {\n const manifest = await readManifest(directory);\n if (manifest) candidates.push({ directory, manifest });\n }\n candidates.sort(\n (a, b) => Date.parse(b.manifest.createdAt) - Date.parse(a.manifest.createdAt),\n );\n return candidates;\n}\n\nexport async function listUndoActions(limit = 20) {\n const candidates = (await undoCandidates()).slice(\n 0,\n Math.max(1, Math.min(100, Math.trunc(limit))),\n );\n\n return Promise.all(\n candidates.map(async ({ manifest }) => {\n let status: \"ready\" | \"conflict\" | \"missing\" | \"legacy\" = \"legacy\";\n\n if (manifest.postChangeHash) {\n try {\n const currentHash = await hashFile(manifest.targetPath);\n status =\n currentHash === manifest.postChangeHash ? \"ready\" : \"conflict\";\n } catch {\n status = \"missing\";\n }\n }\n\n return {\n id: manifest.id,\n created_at: manifest.createdAt,\n tool: manifest.tool,\n path: manifest.targetPath,\n bytes: manifest.bytes,\n existed_before: manifest.existed,\n conflict_safe: Boolean(manifest.postChangeHash),\n can_undo: status === \"ready\",\n status,\n };\n }),\n );\n}\n\nasync function restoreUndoCandidate(candidate: { directory: string; manifest: UndoManifest }) {\n const { directory, manifest } = candidate;\n\n if (!manifest.postChangeHash) {\n throw new Error(\n \"This snapshot predates conflict-safe Local Undo and cannot be restored automatically.\",\n );\n }\n\n let currentHash: string;\n try {\n currentHash = await hashFile(manifest.targetPath);\n } catch {\n throw new Error(\n \"The target file changed or disappeared after the Remote Arc edit. Automatic undo was refused to avoid overwriting newer work.\",\n );\n }\n\n if (currentHash !== manifest.postChangeHash) {\n throw new Error(\n \"The target file changed again after the Remote Arc edit. Automatic undo was refused to avoid overwriting newer work.\",\n );\n }\n\n if (manifest.existed) {\n const original = await fs.readFile(path.join(directory, \"content.bin\"));\n await fs.mkdir(path.dirname(manifest.targetPath), { recursive: true });\n await fs.writeFile(manifest.targetPath, original);\n if (manifest.mode !== undefined) {\n await fs.chmod(manifest.targetPath, manifest.mode).catch(() => undefined);\n }\n } else {\n await fs.rm(manifest.targetPath, { force: true });\n }\n\n await fs.rm(directory, { recursive: true, force: true });\n\n return {\n restored: true,\n action_id: manifest.id,\n tool: manifest.tool,\n path: manifest.targetPath,\n snapshot_location: \"local-device-only\",\n };\n}\n\nexport async function undoChange(actionId: string) {\n const candidate = (await undoCandidates()).find(({ manifest }) => manifest.id === actionId);\n if (!candidate) {\n throw new Error(\"Undo action not found or expired on this device.\");\n }\n return restoreUndoCandidate(candidate);\n}\n\nexport async function undoLastChange() {\n const latest = (await undoCandidates())[0];\n if (!latest) {\n throw new Error(\"No reversible Remote Arc file change is available on this device.\");\n }\n return restoreUndoCandidate(latest);\n}\n\ntype GuardRule = { pattern: RegExp; reason: string };\n\nconst DESTRUCTIVE_COMMAND_RULES: GuardRule[] = [\n {\n pattern: /(?:^|[;&|]\\s*)(?:sudo\\s+)?rm\\s+[^\\n]*(?:-rf|-fr|-[a-z]*r[a-z]*f)[^\\n]*(?:\\s\\/\\s*$|\\s\\/\\*|\\s~(?:\\s|$)|\\s\\$HOME(?:\\s|$))/i,\n reason: \"recursive deletion of a root or home path\",\n },\n {\n pattern: /\\b(?:mkfs(?:\\.\\w+)?|wipefs|fdisk|parted)\\b/i,\n reason: \"disk or filesystem destructive operation\",\n },\n {\n pattern: /\\bdd\\b[^\\n]*\\bof=\\/dev\\/(?:sd|nvme|vd|xvd|mmcblk)/i,\n reason: \"raw disk overwrite\",\n },\n {\n pattern: /\\bdiskutil\\s+erase(?:disk|volume)\\b/i,\n reason: \"disk erase\",\n },\n {\n pattern: /\\b(?:format(?:\\.com)?\\s+[a-z]:|diskpart\\b|clear-disk\\b|initialize-disk\\b)/i,\n reason: \"Windows disk destructive operation\",\n },\n {\n pattern: /\\b(?:shutdown|reboot|halt|poweroff)\\b/i,\n reason: \"system shutdown or reboot\",\n },\n {\n pattern: /\\bremove-item\\b[^\\n]*(?:-recurse[^\\n]*-force|-force[^\\n]*-recurse)[^\\n]*(?:[a-z]:\\\\(?:\\*|\\s|$)|\\$env:systemdrive)/i,\n reason: \"recursive forced deletion of a drive root\",\n },\n {\n pattern: /\\b(?:del|erase|rd|rmdir)\\b[^\\n]*\\/s[^\\n]*\\/q[^\\n]*[a-z]:\\\\/i,\n reason: \"recursive Windows drive deletion\",\n },\n {\n pattern: /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\};\\s*:/,\n reason: \"fork bomb\",\n },\n];\n\nexport function assertCommandAllowed(command: string) {\n if (process.env.REMOTEARC_ALLOW_DESTRUCTIVE === \"1\") return;\n\n for (const rule of DESTRUCTIVE_COMMAND_RULES) {\n if (rule.pattern.test(command)) {\n throw new Error(\n \"Blocked by Remote Arc Safety Guard: \" +\n rule.reason +\n \". Run this action manually on the device if you intentionally need it.\",\n );\n }\n }\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport type ExecutionPolicy = {\n workspaceRoots?: string[];\n protectSensitivePaths?: boolean;\n sensitivePaths?: string[];\n sensitiveAllowPaths?: string[];\n undoEnabled?: boolean;\n};\n\nconst SENSITIVE_BASENAMES = new Set([\n \".npmrc\",\n \".pypirc\",\n \".netrc\",\n \".git-credentials\",\n \"id_rsa\",\n \"id_ed25519\",\n \"credentials\",\n]);\n\nconst expandPath = (value: string) => {\n const trimmed = value.trim();\n if (trimmed === \"~\") return os.homedir();\n if (trimmed.startsWith(\"~/\") || trimmed.startsWith(\"~\\\\\")) {\n return path.join(os.homedir(), trimmed.slice(2));\n }\n return trimmed\n .replace(/%USERPROFILE%/gi, os.homedir())\n .replace(/\\$HOME\\b/g, os.homedir());\n};\n\nconst comparePath = (value: string) => {\n const resolved = path.resolve(expandPath(value));\n return process.platform === \"win32\" ? resolved.toLowerCase() : resolved;\n};\n\nasync function canonicalTarget(targetPath: string) {\n const expanded = path.resolve(expandPath(targetPath));\n try {\n return comparePath(await fs.realpath(expanded));\n } catch {\n const missing: string[] = [];\n let cursor = expanded;\n\n while (true) {\n try {\n const realParent = await fs.realpath(cursor);\n return comparePath(path.join(realParent, ...missing.reverse()));\n } catch {\n const parent = path.dirname(cursor);\n if (parent === cursor) return comparePath(expanded);\n missing.push(path.basename(cursor));\n cursor = parent;\n }\n }\n }\n}\n\nconst isInside = (target: string, root: string) => {\n const relative = path.relative(root, target);\n return (\n relative === \"\" ||\n (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n );\n};\n\nfunction defaultSensitiveRoots() {\n const home = os.homedir();\n const roots = [\n path.join(home, \".ssh\"),\n path.join(home, \".aws\"),\n path.join(home, \".gnupg\"),\n path.join(home, \".azure\"),\n path.join(home, \".kube\"),\n path.join(home, \".docker\"),\n path.join(home, \".config\", \"gcloud\"),\n ];\n\n if (process.platform === \"darwin\") {\n roots.push(\n path.join(home, \"Library\", \"Application Support\", \"Google\", \"Chrome\"),\n path.join(home, \"Library\", \"Application Support\", \"Microsoft Edge\"),\n path.join(home, \"Library\", \"Application Support\", \"Firefox\"),\n );\n }\n\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA;\n const localAppData = process.env.LOCALAPPDATA;\n if (appData) {\n roots.push(path.join(appData, \"Mozilla\", \"Firefox\"));\n }\n if (localAppData) {\n roots.push(\n path.join(localAppData, \"Google\", \"Chrome\", \"User Data\"),\n path.join(localAppData, \"Microsoft\", \"Edge\", \"User Data\"),\n );\n }\n }\n\n return roots;\n}\n\nfunction looksLikeSensitiveFile(target: string) {\n const basename = path.basename(target).toLowerCase();\n if (basename === \".env\" || basename.startsWith(\".env.\")) return true;\n if (SENSITIVE_BASENAMES.has(basename)) return true;\n\n const normalized = target.replace(/\\\\/g, \"/\").toLowerCase();\n if (normalized.endsWith(\"/.docker/config.json\")) return true;\n if (normalized.endsWith(\"/.kube/config\")) return true;\n\n return false;\n}\n\nexport async function enforcePathPolicy(\n targetPath: string,\n policy: ExecutionPolicy = {},\n) {\n const target = await canonicalTarget(targetPath);\n\n const workspaceInputs = (policy.workspaceRoots || []).filter(\n (item) => typeof item === \"string\" && item.trim(),\n );\n const roots = await Promise.all(workspaceInputs.map(canonicalTarget));\n\n if (roots.length && !roots.some((root) => isInside(target, root))) {\n throw new Error(\n \"Blocked by Remote Arc Workspace Scope: path is outside the allowed workspace roots.\",\n );\n }\n\n if (policy.protectSensitivePaths !== false) {\n const sensitiveInputs = [\n ...defaultSensitiveRoots(),\n ...(policy.sensitivePaths || []),\n ].filter((item) => typeof item === \"string\" && item.trim());\n const sensitiveRoots = await Promise.all(\n sensitiveInputs.map(canonicalTarget),\n );\n const allowedSensitiveRoots = await Promise.all(\n (policy.sensitiveAllowPaths || [])\n .filter((item) => typeof item === \"string\" && item.trim())\n .map(canonicalTarget),\n );\n const explicitlyAllowed = allowedSensitiveRoots.some((root) =>\n isInside(target, root),\n );\n\n if (\n !explicitlyAllowed &&\n (looksLikeSensitiveFile(target) ||\n sensitiveRoots.some((root) => isInside(target, root)))\n ) {\n throw new Error(\n \"Blocked by Remote Arc Sensitive Path Policy. Add a narrow sensitive-path exception for this device if you intentionally need access.\",\n );\n }\n }\n\n return target;\n}\n\nexport function normalizePolicy(policy?: ExecutionPolicy): ExecutionPolicy {\n return {\n workspaceRoots: Array.from(\n new Set((policy?.workspaceRoots || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n protectSensitivePaths: policy?.protectSensitivePaths !== false,\n sensitivePaths: Array.from(\n new Set((policy?.sensitivePaths || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n sensitiveAllowPaths: Array.from(\n new Set((policy?.sensitiveAllowPaths || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n undoEnabled: policy?.undoEnabled !== false,\n };\n}\n","import {\n browseDirectories,\n editTextBlock,\n getFileInfo,\n listDirectory,\n readTextFile,\n writeTextFile,\n} from \"./filesystem.js\";\nimport {\n getManagedProcessStatus,\n listManagedProcesses,\n listProcesses,\n readManagedProcessOutput,\n runShellCommand,\n startBackgroundProcess,\n stopAllManagedProcesses,\n stopManagedProcess,\n} from \"./process.js\";\nimport {\n assertCommandAllowed,\n createUndoSnapshot,\n discardUndoSnapshot,\n finalizeUndoSnapshot,\n listUndoActions,\n undoChange,\n} from \"./safety.js\";\nimport {\n enforcePathPolicy,\n normalizePolicy,\n type ExecutionPolicy,\n} from \"./policy.js\";\nimport type {\n ExecutionMode,\n ToolArguments,\n ToolDefinition,\n ToolName,\n ToolResult,\n} from \"./types.js\";\n\nconst SAFE_TOOLS = new Set<ToolName>([\n \"list_directory\",\n \"browse_directories\",\n \"read_file\",\n \"get_file_info\",\n \"list_processes\",\n \"list_undo_actions\",\n]);\n\nconst DEVELOPER_TOOLS = new Set<ToolName>([\n ...SAFE_TOOLS,\n \"write_file\",\n \"edit_block\",\n \"undo_change\",\n \"undo_last_change\",\n]);\n\nconst FULL_TOOLS = new Set<ToolName>([\n ...DEVELOPER_TOOLS,\n \"start_process\",\n \"process_status\",\n \"process_output\",\n \"list_managed_processes\",\n \"stop_process\",\n]);\n\nconst DEFINITIONS: ToolDefinition[] = [\n {\n name: \"list_directory\",\n description: \"List files and directories on this computer without following directory symlinks.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n depth: { type: \"integer\", minimum: 1, maximum: 10, default: 2 },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"browse_directories\",\n description: \"List child directories for the Remote Arc dashboard directory picker.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"read_file\",\n description: \"Read a text file by line range. Negative offsets read from the end.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n offset: { type: \"integer\" },\n length: { type: \"integer\", minimum: 1 },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"get_file_info\",\n description: \"Get local file or directory metadata.\",\n inputSchema: {\n type: \"object\",\n properties: { path: { type: \"string\" } },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"list_processes\",\n description: \"List processes running on this computer.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"write_file\",\n description: \"Write or append UTF-8 text. Remote Arc creates a local-only Undo snapshot first.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n content: { type: \"string\" },\n mode: { type: \"string\", enum: [\"rewrite\", \"append\"], default: \"rewrite\" },\n },\n required: [\"path\", \"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"edit_block\",\n description: \"Apply an exact text replacement with conflict-safe Local Undo.\",\n inputSchema: {\n type: \"object\",\n properties: {\n file_path: { type: \"string\" },\n old_string: { type: \"string\" },\n new_string: { type: \"string\" },\n expected_replacements: { type: \"integer\", minimum: 1, default: 1 },\n },\n required: [\"file_path\", \"old_string\", \"new_string\"],\n additionalProperties: false,\n },\n },\n {\n name: \"list_undo_actions\",\n description: \"List reversible Remote Arc file changes currently stored on this device.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"integer\", minimum: 1, maximum: 100, default: 20 },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"undo_change\",\n description: \"Restore one specific local Remote Arc undo snapshot by action id.\",\n inputSchema: {\n type: \"object\",\n properties: {\n action_id: { type: \"string\" },\n },\n required: [\"action_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"undo_last_change\",\n description: \"Undo the newest reversible Remote Arc file edit stored only on this device.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"start_process\",\n description: \"Run a shell command with timeout and output capture. Catastrophic command patterns are blocked locally.\",\n inputSchema: {\n type: \"object\",\n properties: {\n command: { type: \"string\" },\n timeout_ms: { type: \"integer\", minimum: 100, maximum: 120000, default: 5000 },\n cwd: { type: \"string\" },\n background: { type: \"boolean\", default: false },\n },\n required: [\"command\"],\n additionalProperties: false,\n },\n },\n {\n name: \"process_status\",\n description: \"Get status for a Remote Arc managed background process.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"process_output\",\n description: \"Read captured stdout and stderr from a Remote Arc managed background process.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"list_managed_processes\",\n description: \"List background processes started and managed by Remote Arc on this device.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"stop_process\",\n description: \"Stop a Remote Arc managed background process and its child process tree.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n];\n\nconst textResult = (value: unknown): ToolResult => ({\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value, null, 2),\n },\n ],\n});\n\nfunction requiredString(args: ToolArguments, key: string) {\n const value = args[key];\n if (typeof value !== \"string\") throw new Error(`${key} must be a string.`);\n return value;\n}\n\nfunction optionalNumber(args: ToolArguments, key: string) {\n const value = args[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction optionalString(args: ToolArguments, key: string) {\n const value = args[key];\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nexport class RemoteArcExecutionCore {\n constructor(private readonly mode: ExecutionMode = \"managed\") {}\n\n private allowedTools() {\n if (this.mode === \"safe\") return SAFE_TOOLS;\n if (this.mode === \"developer\") return DEVELOPER_TOOLS;\n return FULL_TOOLS;\n }\n\n listTools() {\n const allowed = this.allowedTools();\n return DEFINITIONS.filter((tool) => allowed.has(tool.name));\n }\n\n async callTool(\n name: string,\n args: ToolArguments = {},\n policyInput: ExecutionPolicy = {},\n ): Promise<ToolResult> {\n const toolName = name as ToolName;\n if (!this.allowedTools().has(toolName)) {\n throw new Error(`Tool blocked by local permission mode: ${name}`);\n }\n\n const policy = normalizePolicy(policyInput);\n\n switch (toolName) {\n case \"list_directory\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(\n await listDirectory(\n target,\n optionalNumber(args, \"depth\") ?? 2,\n async (candidate) => {\n try {\n await enforcePathPolicy(candidate, policy);\n return true;\n } catch {\n return false;\n }\n },\n ),\n );\n }\n case \"browse_directories\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(\n await browseDirectories(\n target,\n async (candidate) => {\n try {\n await enforcePathPolicy(candidate, policy);\n return true;\n } catch {\n return false;\n }\n },\n ),\n );\n }\n case \"read_file\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(\n await readTextFile(\n target,\n optionalNumber(args, \"offset\"),\n optionalNumber(args, \"length\"),\n ),\n );\n }\n case \"get_file_info\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(await getFileInfo(target));\n }\n case \"list_processes\":\n return textResult(await listProcesses());\n case \"list_undo_actions\": {\n const actions = await listUndoActions(optionalNumber(args, \"limit\") ?? 20);\n const visible = [];\n for (const action of actions) {\n try {\n await enforcePathPolicy(action.path, policy);\n visible.push(action);\n } catch {\n // Do not reveal protected or out-of-scope paths through undo metadata.\n }\n }\n return textResult(visible);\n }\n case \"undo_change\": {\n if (policy.undoEnabled === false) {\n throw new Error(\"Local Undo is disabled for this device.\");\n }\n const actionId = requiredString(args, \"action_id\");\n const action = (await listUndoActions(100)).find((item) => item.id === actionId);\n if (!action) throw new Error(\"Undo action not found or expired on this device.\");\n await enforcePathPolicy(action.path, policy);\n return textResult(await undoChange(actionId));\n }\n case \"undo_last_change\": {\n if (policy.undoEnabled === false) {\n throw new Error(\"Local Undo is disabled for this device.\");\n }\n const actions = await listUndoActions(100);\n for (const action of actions) {\n try {\n await enforcePathPolicy(action.path, policy);\n return textResult(await undoChange(action.id));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (!message.startsWith(\"Blocked by Remote Arc\")) throw error;\n }\n }\n throw new Error(\"No reversible in-scope Remote Arc file change is available.\");\n }\n case \"start_process\": {\n const command = requiredString(args, \"command\");\n assertCommandAllowed(command);\n const cwdInput = optionalString(args, \"cwd\");\n if ((policy.workspaceRoots || []).length && !cwdInput) {\n throw new Error(\n \"Workspace Scope is enabled. start_process requires an in-scope cwd. Terminal commands are not an OS sandbox and may still access paths outside that directory.\",\n );\n }\n const cwd = cwdInput ? await enforcePathPolicy(cwdInput, policy) : undefined;\n if (args.background === true) {\n return textResult(await startBackgroundProcess(command, cwd));\n }\n return textResult(\n await runShellCommand(\n command,\n optionalNumber(args, \"timeout_ms\") ?? 5000,\n cwd,\n ),\n );\n }\n case \"process_status\":\n return textResult(\n getManagedProcessStatus(requiredString(args, \"process_id\")),\n );\n case \"process_output\":\n return textResult(\n readManagedProcessOutput(requiredString(args, \"process_id\")),\n );\n case \"list_managed_processes\":\n return textResult(listManagedProcesses());\n case \"stop_process\":\n return textResult(\n await stopManagedProcess(requiredString(args, \"process_id\")),\n );\n case \"write_file\":\n case \"edit_block\": {\n const pathKey = toolName === \"write_file\" ? \"path\" : \"file_path\";\n const target = await enforcePathPolicy(requiredString(args, pathKey), policy);\n const scopedArgs = { ...args, [pathKey]: target };\n const snapshot =\n policy.undoEnabled === false\n ? null\n : await createUndoSnapshot(toolName, scopedArgs);\n try {\n const result =\n toolName === \"write_file\"\n ? await writeTextFile(\n target,\n requiredString(args, \"content\"),\n args.mode === \"append\" ? \"append\" : \"rewrite\",\n )\n : await editTextBlock(\n target,\n requiredString(args, \"old_string\"),\n requiredString(args, \"new_string\"),\n optionalNumber(args, \"expected_replacements\") ?? 1,\n );\n\n const undoAvailable = await finalizeUndoSnapshot(snapshot);\n return textResult({\n ...result,\n undo_available: undoAvailable,\n undo_storage: undoAvailable ? \"local-device-only\" : null,\n });\n } catch (error) {\n await discardUndoSnapshot(snapshot);\n throw error;\n }\n }\n default:\n throw new Error(\"Unknown Remote Arc tool: \" + name);\n }\n }\n\n async close() {\n await stopAllManagedProcesses();\n }\n}\n\nexport const toolDefinitions = DEFINITIONS;\n"],"mappings":"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","names":["os","path","fs","spawn","process","crypto","process","crypto","fs","path","fs","os","path","path","os","process","fs","spawn"]}
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.14\";\nconst DEFAULT_ORIGIN = \"https://mcp.remotearc.app\";\nconst CONFIG_DIR = path.join(os.homedir(), \".remotearc\");\nconst CONFIG_PATH = path.join(CONFIG_DIR, \"config.json\");\nconst LEGACY_CONFIG_PATH = path.join(os.homedir(), \".remote-link\", \"config.json\");\n\ntype Mode = \"managed\" | \"safe\" | \"developer\";\n\ntype SavedConfig = {\n deviceId: string;\n deviceToken: string;\n deviceName: string;\n origin: string;\n mode: Mode;\n};\n\nclass RevokedDeviceCredentialError extends Error {\n constructor() {\n super(\"Saved device credential has been revoked.\");\n this.name = \"RevokedDeviceCredentialError\";\n }\n}\n\nasync function validateSavedPairing(config: SavedConfig) {\n try {\n const response = await fetch(new URL(\"/api/device/heartbeat\", config.origin), {\n method: \"POST\",\n headers: { Authorization: \"Bearer \" + config.deviceToken },\n });\n\n if (response.status === 401 || response.status === 403) {\n throw new RevokedDeviceCredentialError();\n }\n\n // A transient server-side failure should not destroy a valid local pairing.\n // The WebSocket connection remains the source of truth for availability.\n return;\n } catch (error) {\n if (error instanceof RevokedDeviceCredentialError) throw error;\n return;\n }\n}\n\ntype PairingStart = {\n device_code: string;\n device_secret: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval: number;\n};\n\ntype PairingToken = {\n device_id: string;\n device_token: string;\n relay_url: string;\n};\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst supportsColor = process.stdout.isTTY && !process.env.NO_COLOR;\nconst paint = (code: string, value: string) =>\n supportsColor ? `\\x1b[${code}m${value}\\x1b[0m` : value;\nconst dim = (value: string) => paint(\"2\", value);\nconst cyan = (value: string) => paint(\"36\", value);\nconst green = (value: string) => paint(\"32\", value);\nconst yellow = (value: string) => paint(\"33\", value);\nconst red = (value: string) => paint(\"31\", value);\nconst bold = (value: string) => paint(\"1\", value);\n\nfunction nowTime() {\n return new Date().toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n });\n}\n\nfunction logLine(\n level: \"info\" | \"success\" | \"warn\" | \"error\" | \"event\",\n message: string,\n) {\n const icon =\n level === \"success\" ? green(\"✓\") :\n level === \"warn\" ? yellow(\"!\") :\n level === \"error\" ? red(\"×\") :\n level === \"event\" ? cyan(\"→\") :\n cyan(\"•\");\n process.stdout.write(`${dim(nowTime())} ${icon} ${message}\\n`);\n}\n\nfunction banner() {\n process.stdout.write(\"\\n\");\n process.stdout.write(bold(\"Remote Arc\") + \" \" + dim(`v${VERSION}`) + \"\\n\");\n process.stdout.write(dim(\"Secure remote MCP bridge\") + \"\\n\\n\");\n}\n\nfunction argFlag(name: string) {\n return process.argv.includes(name);\n}\n\nfunction selectedMode(): Mode {\n if (argFlag(\"--safe\")) return \"safe\";\n return \"managed\";\n}\n\nfunction isLocalSafeMode(mode: Mode) {\n return mode === \"safe\";\n}\n\nfunction modeLabel(mode: Mode) {\n return isLocalSafeMode(mode) ? \"safe local cap\" : \"dashboard-managed\";\n}\n\nasync function readConfig(): Promise<SavedConfig | null> {\n try {\n return JSON.parse(await fs.readFile(CONFIG_PATH, \"utf8\")) as SavedConfig;\n } catch {\n try {\n const legacy = JSON.parse(\n await fs.readFile(LEGACY_CONFIG_PATH, \"utf8\"),\n ) as SavedConfig;\n await writeConfig(legacy);\n logLine(\"success\", \"Migrated existing Remote Link pairing to Remote Arc.\");\n return legacy;\n } catch {\n return null;\n }\n }\n}\n\nasync function writeConfig(config: SavedConfig) {\n await fs.mkdir(CONFIG_DIR, { recursive: true });\n await fs.writeFile(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", {\n mode: 0o600,\n });\n}\n\nasync function resetConfig() {\n await Promise.all([\n fs.rm(CONFIG_PATH, { force: true }),\n fs.rm(LEGACY_CONFIG_PATH, { force: true }),\n ]);\n logLine(\"success\", \"Removed saved device credentials.\");\n}\n\nfunction openBrowser(url: string) {\n const command =\n process.platform === \"win32\"\n ? \"cmd\"\n : process.platform === \"darwin\"\n ? \"open\"\n : \"xdg-open\";\n const args =\n process.platform === \"win32\"\n ? [\"/c\", \"start\", \"\", url]\n : [url];\n\n const child = spawn(command, args, {\n detached: true,\n stdio: \"ignore\",\n });\n child.unref();\n}\n\nasync function pair(origin: string, mode: Mode): Promise<SavedConfig> {\n const deviceName = os.hostname();\n const response = await fetch(origin + \"/api/device/start\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n device_name: deviceName,\n platform: process.platform,\n arch: process.arch,\n hostname: os.hostname(),\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Could not start device pairing: \" + response.status);\n }\n\n const pairing = (await response.json()) as PairingStart;\n\n banner();\n logLine(\"info\", `Device: ${bold(deviceName)} · ${process.platform}/${process.arch} · ${modeLabel(mode)}`);\n logLine(\"event\", \"Pairing required — opening secure browser approval.\");\n process.stdout.write(\"\\n Pairing code \" + bold(cyan(pairing.user_code)) + \"\\n\");\n process.stdout.write(\" \" + dim(pairing.verification_uri_complete) + \"\\n\\n\");\n openBrowser(pairing.verification_uri_complete);\n logLine(\"info\", \"Waiting for authorization…\");\n\n const startedAt = Date.now();\n while (Date.now() - startedAt < pairing.expires_in * 1000) {\n await sleep(Math.max(pairing.interval, 2) * 1000);\n\n const tokenResponse = await fetch(origin + \"/api/device/token\", {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n device_code: pairing.device_code,\n device_secret: pairing.device_secret,\n }),\n });\n\n if (tokenResponse.status === 428) {\n if (process.stdout.isTTY) process.stdout.write(dim(\"·\"));\n continue;\n }\n\n if (!tokenResponse.ok) {\n const body = await tokenResponse.text();\n throw new Error(\"Pairing failed: \" + body);\n }\n\n const result = (await tokenResponse.json()) as PairingToken;\n process.stdout.write(\"\\n\");\n logLine(\"success\", \"Device authorized.\");\n\n const config: SavedConfig = {\n deviceId: result.device_id,\n deviceToken: result.device_token,\n deviceName,\n origin,\n mode,\n };\n await writeConfig(config);\n return config;\n }\n\n throw new Error(\"Pairing expired. Run Remote Arc again to retry.\");\n}\n\nclass ExecutionCore {\n private readonly core: RemoteArcExecutionCore;\n\n constructor(mode: Mode) {\n this.core = new RemoteArcExecutionCore(\n isLocalSafeMode(mode) ? \"safe\" : \"managed\",\n );\n }\n\n async tools() {\n return this.core.listTools();\n }\n\n async call(\n name: string,\n args: Record<string, unknown>,\n policy?: ExecutionPolicy,\n ) {\n return this.core.callTool(name, args, policy);\n }\n\n async close() {\n await this.core.close();\n }\n}\n\nasync function connectAgent(config: SavedConfig): Promise<\"stopped\" | \"rePair\"> {\n const core = new ExecutionCore(config.mode);\n banner();\n logLine(\"info\", `Device: ${bold(config.deviceName)} · ${process.platform}/${process.arch}`);\n logLine(\n \"info\",\n `Permission profile: ${isLocalSafeMode(config.mode) ? green(\"safe local cap\") : cyan(\"dashboard-managed\")}`,\n );\n\n const tools = await core.tools();\n logLine(\"success\", `Local tools ready: ${tools.length} exposed`);\n process.stdout.write(\" \" + dim(tools.map((tool) => tool.name).join(\" · \")) + \"\\n\");\n try {\n await validateSavedPairing(config);\n } catch (error) {\n if (error instanceof RevokedDeviceCredentialError) {\n logLine(\"warn\", error.message);\n await resetConfig();\n logLine(\"event\", \"Starting a fresh device pairing…\");\n await core.close().catch(() => undefined);\n return \"rePair\";\n }\n throw error;\n }\n\n const wsUrl = new URL(\"/agent\", config.origin.replace(/^http/, \"ws\"));\n\n let stopped = false;\n let backoff = 1000;\n\n const shutdown = async () => {\n stopped = true;\n await core.close().catch(() => undefined);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n while (!stopped) {\n logLine(\"event\", `Connecting relay ${dim(wsUrl.host)}…`);\n const ws = new WebSocket(wsUrl, {\n headers: {\n Authorization: \"Bearer \" + config.deviceToken,\n },\n });\n\n // Keep a permanent error listener on every socket attempt. During a\n // failed handshake, ws can emit a second asynchronous error when the\n // connecting socket is aborted. Without this guard Node treats that as\n // an unhandled EventEmitter error and terminates the process.\n const absorbSocketError = () => undefined;\n ws.on(\"error\", absorbSocketError);\n\n try {\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onUnexpectedResponse = (\n _request: unknown,\n response: { statusCode?: number; resume?: () => void },\n ) => {\n cleanup();\n response.resume?.();\n if (response.statusCode === 401 || response.statusCode === 403) {\n reject(new RevokedDeviceCredentialError());\n return;\n }\n reject(\n new Error(\n \"Unexpected relay response: \" + String(response.statusCode || \"unknown\"),\n ),\n );\n };\n const cleanup = () => {\n ws.off(\"open\", onOpen);\n ws.off(\"error\", onError);\n ws.off(\"unexpected-response\", onUnexpectedResponse);\n };\n\n ws.once(\"open\", onOpen);\n ws.once(\"error\", onError);\n ws.once(\"unexpected-response\", onUnexpectedResponse);\n });\n\n backoff = 1000;\n ws.send(\n JSON.stringify({\n type: \"hello\",\n device: {\n id: config.deviceId,\n name: config.deviceName,\n platform: process.platform,\n arch: process.arch,\n hostname: os.hostname(),\n agentVersion: VERSION,\n },\n tools: tools.map((tool) => tool.name),\n capabilities: [\"native_core_v1\", \"device_policy_v1\", \"undo_history_v1\"],\n }),\n );\n\n logLine(\"success\", `Relay connected · ${bold(config.deviceName)} · ${config.mode} mode`);\n logLine(\"success\", \"Device presence published.\");\n process.stdout.write(\" \" + dim(config.origin) + \"\\n\");\n process.stdout.write(\" \" + dim(\"Ctrl+C to disconnect\") + \"\\n\\n\");\n\n const sendHeartbeat = async () => {\n try {\n await fetch(new URL(\"/api/device/heartbeat\", config.origin), {\n method: \"POST\",\n headers: { Authorization: \"Bearer \" + config.deviceToken },\n });\n } catch {\n // WebSocket reconnect logic remains the source of truth for connectivity.\n }\n };\n void sendHeartbeat();\n const heartbeatTimer = setInterval(\n () => void sendHeartbeat(),\n 15 * 60_000,\n );\n\n await new Promise<void>((resolve) => {\n ws.on(\"message\", async (raw) => {\n let message: {\n type?: string;\n id?: string;\n tool?: string;\n arguments?: Record<string, unknown>;\n policy?: ExecutionPolicy;\n };\n\n try {\n message = JSON.parse(raw.toString());\n } catch {\n return;\n }\n\n if (\n message.type !== \"call\" ||\n !message.id ||\n !message.tool\n ) {\n return;\n }\n\n const callStarted = Date.now();\n logLine(\"event\", `tool.call ${bold(message.tool)} · ${dim(message.id.slice(0, 8))}`);\n try {\n const result = await core.call(\n message.tool,\n message.arguments || {},\n message.policy,\n );\n logLine(\"success\", `tool.done ${message.tool} · ${Date.now() - callStarted}ms`);\n ws.send(\n JSON.stringify({\n type: \"result\",\n id: message.id,\n result,\n }),\n );\n } catch (error) {\n logLine(\"error\", `tool.fail ${message.tool} · ${error instanceof Error ? error.message : String(error)}`);\n ws.send(\n JSON.stringify({\n type: \"result\",\n id: message.id,\n error: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n });\n\n ws.once(\"close\", resolve);\n ws.once(\"error\", resolve);\n });\n clearInterval(heartbeatTimer);\n } catch (error) {\n if (error instanceof RevokedDeviceCredentialError) {\n logLine(\"warn\", error.message);\n await resetConfig();\n logLine(\"event\", \"Starting a fresh device pairing…\");\n await core.close().catch(() => undefined);\n return \"rePair\";\n }\n\n logLine(\n \"error\",\n \"Relay connection failed: \" +\n (error instanceof Error ? error.message : String(error)),\n );\n } finally {\n ws.removeAllListeners(\"message\");\n ws.removeAllListeners(\"open\");\n ws.removeAllListeners(\"unexpected-response\");\n ws.removeAllListeners(\"close\");\n ws.removeAllListeners(\"error\");\n ws.on(\"error\", absorbSocketError);\n\n if (ws.readyState === WebSocket.OPEN) {\n ws.close();\n } else if (ws.readyState === WebSocket.CONNECTING) {\n ws.terminate();\n }\n }\n\n if (!stopped) {\n logLine(\n \"warn\",\n \"Relay disconnected · retrying in \" + Math.round(backoff / 1000) + \"s\",\n );\n await sleep(backoff);\n backoff = Math.min(backoff * 2, 30_000);\n }\n }\n\n await core.close().catch(() => undefined);\n return \"stopped\";\n}\n\nasync function main() {\n if (argFlag(\"--help\") || argFlag(\"-h\")) {\n process.stdout.write(\n [\n \"Remote Arc\",\n \"\",\n \"Usage:\",\n \" npx remotelink\",\n \"\",\n \"After the npm release:\",\n \" npx remotelink\",\n \"\",\n \"Options:\",\n \" --safe Hard local read-only cap; dashboard cannot enable write tools\",\n \" --developer Legacy alias for dashboard-managed capabilities\",\n \" --reset Remove this computer's saved pairing\",\n \" --version Print CLI version\",\n \" --help Show this help\",\n \"\",\n ].join(\"\\n\"),\n );\n return;\n }\n\n if (argFlag(\"--version\") || argFlag(\"-v\")) {\n process.stdout.write(VERSION + \"\\n\");\n return;\n }\n\n if (argFlag(\"--reset\")) {\n await resetConfig();\n return;\n }\n\n const origin =\n process.env.REMOTEARC_ORIGIN || process.env.REMOTE_LINK_ORIGIN ||\n process.argv.find((value) => value.startsWith(\"--origin=\"))?.slice(9) ||\n DEFAULT_ORIGIN;\n\n let config = await readConfig();\n\n while (true) {\n if (config && [\"https://remote.samyao.me\", \"https://remotearc.app\"].includes(config.origin)) {\n config.origin = DEFAULT_ORIGIN;\n await writeConfig(config);\n logLine(\"info\", \"Migrated relay origin to \" + DEFAULT_ORIGIN);\n }\n\n if (!config) {\n config = await pair(origin, selectedMode());\n } else if (argFlag(\"--safe\") || argFlag(\"--developer\")) {\n config.mode = argFlag(\"--safe\") ? \"safe\" : \"managed\";\n await writeConfig(config);\n }\n\n logLine(\"info\", `Using paired device identity ${dim(config.deviceId.slice(0, 8))}…`);\n const result = await connectAgent(config);\n if (result !== \"rePair\") return;\n\n config = null;\n }\n}\n\nmain().catch((error) => {\n logLine(\n \"error\",\n \"Fatal: \" + (error instanceof Error ? error.message : String(error)),\n );\n process.exit(1);\n});\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst MAX_DIRECTORY_ENTRIES = 2000;\nconst DEFAULT_READ_LINES = 240;\nconst MAX_TEXT_FILE_BYTES = 20 * 1024 * 1024;\n\nconst printableSize = (bytes: number) => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\nexport async function listDirectory(\n targetPath: string,\n depth = 2,\n canReveal?: (candidatePath: string) => Promise<boolean>,\n) {\n const maxDepth = Math.max(1, Math.min(10, Math.trunc(depth || 2)));\n const lines: string[] = [];\n let entriesSeen = 0;\n let protectedEntries = 0;\n\n async function walk(directory: string, level: number, prefix: string) {\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) return;\n const entries = await fs.readdir(directory, { withFileTypes: true });\n entries.sort((a, b) => {\n if (a.isDirectory() !== b.isDirectory()) return a.isDirectory() ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n\n for (const entry of entries) {\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) break;\n const absolute = path.join(directory, entry.name);\n\n if (canReveal && !(await canReveal(absolute))) {\n protectedEntries += 1;\n continue;\n }\n\n entriesSeen += 1;\n const label = entry.isDirectory()\n ? \"[DIR]\"\n : entry.isSymbolicLink()\n ? \"[LINK]\"\n : \"[FILE]\";\n lines.push(`${prefix}${label} ${entry.name}`);\n\n if (entry.isDirectory() && level < maxDepth) {\n await walk(absolute, level + 1, prefix + \" \");\n }\n }\n }\n\n const stat = await fs.stat(targetPath);\n if (!stat.isDirectory()) throw new Error(\"Path is not a directory: \" + targetPath);\n\n await walk(targetPath, 1, \"\");\n if (entriesSeen >= MAX_DIRECTORY_ENTRIES) {\n lines.push(`… truncated after ${MAX_DIRECTORY_ENTRIES} entries`);\n }\n\n const protectionNote = protectedEntries\n ? `\\n\\n[Remote Arc omitted ${protectedEntries} protected or out-of-scope entr${protectedEntries === 1 ? \"y\" : \"ies\"}.]`\n : \"\";\n\n return `Directory: ${targetPath}\\nDepth: ${maxDepth}\\n\\n${lines.join(\"\\n\") || \"(empty)\"}${protectionNote}`;\n}\n\nexport async function readTextFile(\n targetPath: string,\n offset?: number,\n length?: number,\n) {\n const stat = await fs.stat(targetPath);\n if (!stat.isFile()) throw new Error(\"Path is not a file: \" + targetPath);\n if (stat.size > MAX_TEXT_FILE_BYTES) {\n throw new Error(\n `File is too large for read_file (${printableSize(stat.size)} > 20 MB). Use a terminal command or a more targeted tool instead.`,\n );\n }\n\n const buffer = await fs.readFile(targetPath);\n const sample = buffer.subarray(0, Math.min(buffer.length, 8192));\n if (sample.includes(0)) {\n throw new Error(\"Binary file detected. read_file currently supports text files only.\");\n }\n\n const text = buffer.toString(\"utf8\");\n const lines = text.split(/\\r?\\n/);\n const requestedOffset = Number.isFinite(offset) ? Math.trunc(offset as number) : 0;\n const start =\n requestedOffset < 0\n ? Math.max(0, lines.length + requestedOffset)\n : Math.min(lines.length, Math.max(0, requestedOffset));\n const requestedLength =\n Number.isFinite(length) && (length as number) > 0\n ? Math.trunc(length as number)\n : DEFAULT_READ_LINES;\n const end = Math.min(lines.length, start + requestedLength);\n const chunk = lines.slice(start, end).join(\"\\n\");\n\n const location =\n start === 0\n ? \"start\"\n : end === lines.length\n ? `line ${start + 1} to end`\n : `lines ${start + 1}-${end}`;\n\n return `[Reading ${end - start} lines from ${location} (total: ${lines.length} lines, ${printableSize(stat.size)})]\\n\\n${chunk}`;\n}\n\nexport async function getFileInfo(targetPath: string) {\n const stat = await fs.lstat(targetPath);\n return {\n path: targetPath,\n type: stat.isFile()\n ? \"file\"\n : stat.isDirectory()\n ? \"directory\"\n : stat.isSymbolicLink()\n ? \"symlink\"\n : \"other\",\n size: stat.size,\n size_human: printableSize(stat.size),\n mode: stat.mode,\n created_at: stat.birthtime.toISOString(),\n modified_at: stat.mtime.toISOString(),\n accessed_at: stat.atime.toISOString(),\n };\n}\n\nasync function atomicWriteText(targetPath: string, content: string) {\n const directory = path.dirname(targetPath);\n await fs.mkdir(directory, { recursive: true });\n const temporary = path.join(\n directory,\n \".\" + path.basename(targetPath) + \".remotearc-\" + crypto.randomUUID() + \".tmp\",\n );\n\n try {\n await fs.writeFile(temporary, content, \"utf8\");\n await fs.rename(temporary, targetPath);\n } finally {\n await fs.rm(temporary, { force: true }).catch(() => undefined);\n }\n}\n\nexport async function writeTextFile(\n targetPath: string,\n content: string,\n mode: \"rewrite\" | \"append\" = \"rewrite\",\n) {\n await fs.mkdir(path.dirname(targetPath), { recursive: true });\n if (mode === \"append\") {\n await fs.appendFile(targetPath, content, \"utf8\");\n } else {\n await atomicWriteText(targetPath, content);\n }\n const stat = await fs.stat(targetPath);\n return {\n path: targetPath,\n mode,\n bytes: Buffer.byteLength(content),\n file_size: stat.size,\n atomic: mode === \"rewrite\",\n };\n}\n\nexport async function editTextBlock(\n filePath: string,\n oldString: string,\n newString: string,\n expectedReplacements = 1,\n) {\n if (!oldString) throw new Error(\"old_string cannot be empty.\");\n const current = await fs.readFile(filePath, \"utf8\");\n const parts = current.split(oldString);\n const replacements = parts.length - 1;\n\n if (replacements !== expectedReplacements) {\n throw new Error(\n `Expected ${expectedReplacements} replacement(s) in ${filePath}, found ${replacements}. No changes were written.`,\n );\n }\n\n const next = parts.join(newString);\n await atomicWriteText(filePath, next);\n return {\n path: filePath,\n replacements,\n bytes_before: Buffer.byteLength(current),\n bytes_after: Buffer.byteLength(next),\n atomic: true,\n };\n}\n\n\nexport async function browseDirectories(\n targetPath: string,\n canReveal?: (candidatePath: string) => Promise<boolean>,\n) {\n const stat = await fs.stat(targetPath);\n if (!stat.isDirectory()) throw new Error(\"Path is not a directory: \" + targetPath);\n\n const entries = await fs.readdir(targetPath, { withFileTypes: true });\n const directories: Array<{ name: string; path: string; type: \"directory\" | \"symlink\" }> = [];\n let protectedEntries = 0;\n\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;\n const absolute = path.join(targetPath, entry.name);\n if (canReveal && !(await canReveal(absolute))) {\n protectedEntries += 1;\n continue;\n }\n directories.push({\n name: entry.name,\n path: absolute,\n type: entry.isSymbolicLink() ? \"symlink\" : \"directory\",\n });\n if (directories.length >= 300) break;\n }\n\n directories.sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n path: targetPath,\n parent: path.dirname(targetPath) === targetPath ? null : path.dirname(targetPath),\n directories,\n protected_entries_omitted: protectedEntries,\n truncated: directories.length >= 300,\n };\n}\n","import { execFile, spawn, type ChildProcess } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport process from \"node:process\";\n\nconst MAX_CAPTURE_BYTES = 2 * 1024 * 1024;\n\nfunction appendCapped(current: string, chunk: Buffer | string) {\n if (Buffer.byteLength(current) >= MAX_CAPTURE_BYTES) return current;\n const next = current + chunk.toString();\n if (Buffer.byteLength(next) <= MAX_CAPTURE_BYTES) return next;\n return next.slice(0, MAX_CAPTURE_BYTES) + \"\\n… output truncated …\";\n}\n\nexport async function listProcesses() {\n const output = await new Promise<string>((resolve, reject) => {\n const command = process.platform === \"win32\" ? \"tasklist.exe\" : \"ps\";\n const args =\n process.platform === \"win32\"\n ? [\"/FO\", \"CSV\", \"/NH\"]\n : [\"-axo\", \"pid,ppid,user,%cpu,%mem,etime,command\"];\n execFile(command, args, { maxBuffer: MAX_CAPTURE_BYTES }, (error, stdout, stderr) => {\n if (error) {\n reject(new Error(`Could not list processes: ${stderr || error.message}`));\n return;\n }\n resolve(stdout.trim());\n });\n });\n\n return `Processes on ${process.platform}:\\n\\n${output}`;\n}\n\nasync function terminateTree(child: ReturnType<typeof spawn>) {\n if (!child.pid) return;\n if (process.platform === \"win32\") {\n await new Promise<void>((resolve) => {\n const killer = spawn(\n \"taskkill.exe\",\n [\"/PID\", String(child.pid), \"/T\", \"/F\"],\n { windowsHide: true, stdio: \"ignore\" },\n );\n killer.once(\"close\", () => resolve());\n killer.once(\"error\", () => resolve());\n });\n return;\n }\n\n try {\n process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill(\"SIGTERM\");\n }\n await new Promise((resolve) => setTimeout(resolve, 300));\n try {\n process.kill(-child.pid, \"SIGKILL\");\n } catch {\n if (!child.killed) child.kill(\"SIGKILL\");\n }\n}\n\nexport async function runShellCommand(\n command: string,\n timeoutMs = 5000,\n cwd?: string,\n) {\n const timeout = Math.max(100, Math.min(120_000, Math.trunc(timeoutMs || 5000)));\n const startedAt = Date.now();\n\n return await new Promise<{\n command: string;\n cwd: string | null;\n exit_code: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n duration_ms: number;\n timed_out: boolean;\n }>((resolve, reject) => {\n const child = spawn(command, {\n shell: true,\n cwd,\n windowsHide: true,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n\n child.stdout?.on(\"data\", (chunk) => {\n stdout = appendCapped(stdout, chunk);\n });\n child.stderr?.on(\"data\", (chunk) => {\n stderr = appendCapped(stderr, chunk);\n });\n\n const timer = setTimeout(async () => {\n timedOut = true;\n await terminateTree(child);\n }, timeout);\n\n child.once(\"error\", (error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n reject(error);\n });\n\n child.once(\"close\", (code, signal) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({\n command,\n cwd: cwd || null,\n exit_code: code,\n signal,\n stdout,\n stderr,\n duration_ms: Date.now() - startedAt,\n timed_out: timedOut,\n });\n });\n });\n}\n\n\ntype ManagedProcess = {\n id: string;\n child: ChildProcess;\n command: string;\n cwd: string | null;\n startedAt: number;\n endedAt: number | null;\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n};\n\nconst managedProcesses = new Map<string, ManagedProcess>();\nconst MAX_MANAGED_PROCESSES = 32;\nconst FINISHED_PROCESS_RETENTION_MS = 30 * 60 * 1000;\n\nfunction cleanupManagedProcesses() {\n const now = Date.now();\n for (const [id, item] of managedProcesses) {\n if (\n item.endedAt !== null &&\n now - item.endedAt > FINISHED_PROCESS_RETENTION_MS\n ) {\n managedProcesses.delete(id);\n }\n }\n\n if (managedProcesses.size <= MAX_MANAGED_PROCESSES) return;\n const finished = [...managedProcesses.values()]\n .filter((item) => item.endedAt !== null)\n .sort((a, b) => (a.endedAt || 0) - (b.endedAt || 0));\n for (const item of finished) {\n if (managedProcesses.size <= MAX_MANAGED_PROCESSES) break;\n managedProcesses.delete(item.id);\n }\n}\n\nexport async function startBackgroundProcess(command: string, cwd?: string) {\n cleanupManagedProcesses();\n if (managedProcesses.size >= MAX_MANAGED_PROCESSES) {\n throw new Error(\n \"Remote Arc already has the maximum number of managed background processes on this device.\",\n );\n }\n\n const child = spawn(command, {\n shell: true,\n cwd,\n windowsHide: true,\n detached: process.platform !== \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const id = crypto.randomUUID();\n const item: ManagedProcess = {\n id,\n child,\n command,\n cwd: cwd || null,\n startedAt: Date.now(),\n endedAt: null,\n exitCode: null,\n signal: null,\n stdout: \"\",\n stderr: \"\",\n };\n managedProcesses.set(id, item);\n\n child.stdout?.on(\"data\", (chunk) => {\n item.stdout = appendCapped(item.stdout, chunk);\n });\n child.stderr?.on(\"data\", (chunk) => {\n item.stderr = appendCapped(item.stderr, chunk);\n });\n child.once(\"error\", (error) => {\n item.stderr = appendCapped(item.stderr, \"\\n\" + error.message);\n item.endedAt = Date.now();\n });\n child.once(\"close\", (code, signal) => {\n item.exitCode = code;\n item.signal = signal;\n item.endedAt = Date.now();\n });\n\n return {\n process_id: id,\n pid: child.pid || null,\n command,\n cwd: cwd || null,\n status: \"running\",\n started_at: new Date(item.startedAt).toISOString(),\n };\n}\n\nfunction managedProcessOrThrow(processId: string) {\n cleanupManagedProcesses();\n const item = managedProcesses.get(processId);\n if (!item) {\n throw new Error(\n \"Managed process not found or its local retention window has expired.\",\n );\n }\n return item;\n}\n\nexport function getManagedProcessStatus(processId: string) {\n const item = managedProcessOrThrow(processId);\n return {\n process_id: item.id,\n pid: item.child.pid || null,\n command: item.command,\n cwd: item.cwd,\n status: item.endedAt === null ? \"running\" : \"exited\",\n exit_code: item.exitCode,\n signal: item.signal,\n started_at: new Date(item.startedAt).toISOString(),\n ended_at: item.endedAt === null ? null : new Date(item.endedAt).toISOString(),\n duration_ms: (item.endedAt || Date.now()) - item.startedAt,\n };\n}\n\nexport function readManagedProcessOutput(processId: string) {\n const item = managedProcessOrThrow(processId);\n return {\n ...getManagedProcessStatus(processId),\n stdout: item.stdout,\n stderr: item.stderr,\n truncated:\n Buffer.byteLength(item.stdout) >= MAX_CAPTURE_BYTES ||\n Buffer.byteLength(item.stderr) >= MAX_CAPTURE_BYTES,\n };\n}\n\nexport async function stopManagedProcess(processId: string) {\n const item = managedProcessOrThrow(processId);\n if (item.endedAt !== null) {\n return {\n ...getManagedProcessStatus(processId),\n stopped: false,\n already_exited: true,\n };\n }\n\n await terminateTree(item.child);\n await new Promise((resolve) => setTimeout(resolve, 50));\n return {\n ...getManagedProcessStatus(processId),\n stopped: true,\n already_exited: false,\n };\n}\n\n\nexport async function stopAllManagedProcesses() {\n const running = [...managedProcesses.values()].filter(\n (item) => item.endedAt === null,\n );\n await Promise.all(\n running.map(async (item) => {\n await terminateTree(item.child).catch(() => undefined);\n }),\n );\n}\n\n\nexport function listManagedProcesses() {\n cleanupManagedProcesses();\n return [...managedProcesses.values()]\n .sort((a, b) => b.startedAt - a.startedAt)\n .map((item) => ({\n process_id: item.id,\n pid: item.child.pid || null,\n command: item.command,\n cwd: item.cwd,\n status: item.endedAt === null ? \"running\" : \"exited\",\n exit_code: item.exitCode,\n signal: item.signal,\n started_at: new Date(item.startedAt).toISOString(),\n ended_at: item.endedAt === null ? null : new Date(item.endedAt).toISOString(),\n duration_ms: (item.endedAt || Date.now()) - item.startedAt,\n stdout_bytes: Buffer.byteLength(item.stdout),\n stderr_bytes: Buffer.byteLength(item.stderr),\n }));\n}\n","import crypto from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst RETENTION_MS = 7 * 24 * 60 * 60 * 1000;\nconst MAX_SNAPSHOT_BYTES = 20 * 1024 * 1024;\nconst MAX_UNDO_BYTES = 200 * 1024 * 1024;\n\ntype UndoManifest = {\n id: string;\n createdAt: string;\n tool: \"write_file\" | \"edit_block\";\n targetPath: string;\n existed: boolean;\n mode?: number;\n bytes: number;\n postChangeHash?: string;\n};\n\nexport type UndoSnapshot = {\n id: string;\n directory: string;\n manifest: UndoManifest;\n};\n\nconst undoRoot = () =>\n process.env.REMOTEARC_UNDO_ROOT ||\n path.join(os.homedir(), \".remotearc\", \"undo\");\n\nasync function ensureUndoRoot() {\n await fs.mkdir(undoRoot(), { recursive: true, mode: 0o700 });\n}\n\nasync function readManifest(directory: string): Promise<UndoManifest | null> {\n try {\n return JSON.parse(\n await fs.readFile(path.join(directory, \"manifest.json\"), \"utf8\"),\n ) as UndoManifest;\n } catch {\n return null;\n }\n}\n\nasync function snapshotDirectories() {\n await ensureUndoRoot();\n const entries = await fs.readdir(undoRoot(), { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(undoRoot(), entry.name));\n}\n\nasync function cleanupUndoStore() {\n const now = Date.now();\n const snapshots: Array<{ directory: string; manifest: UndoManifest }> = [];\n\n for (const directory of await snapshotDirectories()) {\n const manifest = await readManifest(directory);\n if (!manifest) {\n await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined);\n continue;\n }\n\n const created = Date.parse(manifest.createdAt);\n if (!Number.isFinite(created) || now - created > RETENTION_MS) {\n await fs.rm(directory, { recursive: true, force: true }).catch(() => undefined);\n continue;\n }\n\n snapshots.push({ directory, manifest });\n }\n\n snapshots.sort(\n (a, b) => Date.parse(a.manifest.createdAt) - Date.parse(b.manifest.createdAt),\n );\n\n let total = snapshots.reduce((sum, item) => sum + item.manifest.bytes, 0);\n for (const item of snapshots) {\n if (total <= MAX_UNDO_BYTES) break;\n await fs.rm(item.directory, { recursive: true, force: true }).catch(() => undefined);\n total -= item.manifest.bytes;\n }\n}\n\nfunction mutationPath(\n tool: \"write_file\" | \"edit_block\",\n args: Record<string, unknown>,\n) {\n const candidate = tool === \"write_file\" ? args.path : args.file_path;\n return typeof candidate === \"string\" && candidate.trim() ? candidate : null;\n}\n\nexport async function createUndoSnapshot(\n tool: \"write_file\" | \"edit_block\",\n args: Record<string, unknown>,\n): Promise<UndoSnapshot | null> {\n const targetPath = mutationPath(tool, args);\n if (!targetPath) return null;\n\n await cleanupUndoStore();\n\n let existed = false;\n let mode: number | undefined;\n let bytes = 0;\n let original: Buffer | null = null;\n\n try {\n const stat = await fs.stat(targetPath);\n if (!stat.isFile()) return null;\n existed = true;\n mode = stat.mode;\n bytes = stat.size;\n if (bytes > MAX_SNAPSHOT_BYTES) return null;\n original = await fs.readFile(targetPath);\n } catch (error) {\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? String((error as { code?: unknown }).code)\n : \"\";\n if (code !== \"ENOENT\") throw error;\n }\n\n const id = `${Date.now()}-${crypto.randomUUID().slice(0, 8)}`;\n const directory = path.join(undoRoot(), id);\n await fs.mkdir(directory, { recursive: true, mode: 0o700 });\n\n if (original) {\n await fs.writeFile(path.join(directory, \"content.bin\"), original, { mode: 0o600 });\n }\n\n const manifest: UndoManifest = {\n id,\n createdAt: new Date().toISOString(),\n tool,\n targetPath,\n existed,\n ...(mode !== undefined ? { mode } : {}),\n bytes,\n };\n\n await fs.writeFile(\n path.join(directory, \"manifest.json\"),\n JSON.stringify(manifest, null, 2) + \"\\n\",\n { mode: 0o600 },\n );\n\n await cleanupUndoStore();\n return { id, directory, manifest };\n}\n\nasync function hashFile(filePath: string) {\n const hash = crypto.createHash(\"sha256\");\n for await (const chunk of createReadStream(filePath)) hash.update(chunk);\n return hash.digest(\"hex\");\n}\n\nexport async function finalizeUndoSnapshot(snapshot: UndoSnapshot | null) {\n if (!snapshot) return false;\n try {\n snapshot.manifest.postChangeHash = await hashFile(snapshot.manifest.targetPath);\n await fs.writeFile(\n path.join(snapshot.directory, \"manifest.json\"),\n JSON.stringify(snapshot.manifest, null, 2) + \"\\n\",\n { mode: 0o600 },\n );\n return true;\n } catch {\n await discardUndoSnapshot(snapshot);\n return false;\n }\n}\n\nexport async function discardUndoSnapshot(snapshot: UndoSnapshot | null) {\n if (!snapshot) return;\n await fs.rm(snapshot.directory, { recursive: true, force: true }).catch(() => undefined);\n}\n\nasync function undoCandidates() {\n await cleanupUndoStore();\n const candidates: Array<{ directory: string; manifest: UndoManifest }> = [];\n for (const directory of await snapshotDirectories()) {\n const manifest = await readManifest(directory);\n if (manifest) candidates.push({ directory, manifest });\n }\n candidates.sort(\n (a, b) => Date.parse(b.manifest.createdAt) - Date.parse(a.manifest.createdAt),\n );\n return candidates;\n}\n\nexport async function listUndoActions(limit = 20) {\n const candidates = (await undoCandidates()).slice(\n 0,\n Math.max(1, Math.min(100, Math.trunc(limit))),\n );\n\n return Promise.all(\n candidates.map(async ({ manifest }) => {\n let status: \"ready\" | \"conflict\" | \"missing\" | \"legacy\" = \"legacy\";\n\n if (manifest.postChangeHash) {\n try {\n const currentHash = await hashFile(manifest.targetPath);\n status =\n currentHash === manifest.postChangeHash ? \"ready\" : \"conflict\";\n } catch {\n status = \"missing\";\n }\n }\n\n return {\n id: manifest.id,\n created_at: manifest.createdAt,\n tool: manifest.tool,\n path: manifest.targetPath,\n bytes: manifest.bytes,\n existed_before: manifest.existed,\n conflict_safe: Boolean(manifest.postChangeHash),\n can_undo: status === \"ready\",\n status,\n };\n }),\n );\n}\n\nasync function restoreUndoCandidate(candidate: { directory: string; manifest: UndoManifest }) {\n const { directory, manifest } = candidate;\n\n if (!manifest.postChangeHash) {\n throw new Error(\n \"This snapshot predates conflict-safe Local Undo and cannot be restored automatically.\",\n );\n }\n\n let currentHash: string;\n try {\n currentHash = await hashFile(manifest.targetPath);\n } catch {\n throw new Error(\n \"The target file changed or disappeared after the Remote Arc edit. Automatic undo was refused to avoid overwriting newer work.\",\n );\n }\n\n if (currentHash !== manifest.postChangeHash) {\n throw new Error(\n \"The target file changed again after the Remote Arc edit. Automatic undo was refused to avoid overwriting newer work.\",\n );\n }\n\n if (manifest.existed) {\n const original = await fs.readFile(path.join(directory, \"content.bin\"));\n await fs.mkdir(path.dirname(manifest.targetPath), { recursive: true });\n await fs.writeFile(manifest.targetPath, original);\n if (manifest.mode !== undefined) {\n await fs.chmod(manifest.targetPath, manifest.mode).catch(() => undefined);\n }\n } else {\n await fs.rm(manifest.targetPath, { force: true });\n }\n\n await fs.rm(directory, { recursive: true, force: true });\n\n return {\n restored: true,\n action_id: manifest.id,\n tool: manifest.tool,\n path: manifest.targetPath,\n snapshot_location: \"local-device-only\",\n };\n}\n\nexport async function undoChange(actionId: string) {\n const candidate = (await undoCandidates()).find(({ manifest }) => manifest.id === actionId);\n if (!candidate) {\n throw new Error(\"Undo action not found or expired on this device.\");\n }\n return restoreUndoCandidate(candidate);\n}\n\nexport async function undoLastChange() {\n const latest = (await undoCandidates())[0];\n if (!latest) {\n throw new Error(\"No reversible Remote Arc file change is available on this device.\");\n }\n return restoreUndoCandidate(latest);\n}\n\ntype GuardRule = { pattern: RegExp; reason: string };\n\nconst DESTRUCTIVE_COMMAND_RULES: GuardRule[] = [\n {\n pattern: /(?:^|[;&|]\\s*)(?:sudo\\s+)?rm\\s+[^\\n]*(?:-rf|-fr|-[a-z]*r[a-z]*f)[^\\n]*(?:\\s\\/\\s*$|\\s\\/\\*|\\s~(?:\\s|$)|\\s\\$HOME(?:\\s|$))/i,\n reason: \"recursive deletion of a root or home path\",\n },\n {\n pattern: /\\b(?:mkfs(?:\\.\\w+)?|wipefs|fdisk|parted)\\b/i,\n reason: \"disk or filesystem destructive operation\",\n },\n {\n pattern: /\\bdd\\b[^\\n]*\\bof=\\/dev\\/(?:sd|nvme|vd|xvd|mmcblk)/i,\n reason: \"raw disk overwrite\",\n },\n {\n pattern: /\\bdiskutil\\s+erase(?:disk|volume)\\b/i,\n reason: \"disk erase\",\n },\n {\n pattern: /\\b(?:format(?:\\.com)?\\s+[a-z]:|diskpart\\b|clear-disk\\b|initialize-disk\\b)/i,\n reason: \"Windows disk destructive operation\",\n },\n {\n pattern: /\\b(?:shutdown|reboot|halt|poweroff)\\b/i,\n reason: \"system shutdown or reboot\",\n },\n {\n pattern: /\\bremove-item\\b[^\\n]*(?:-recurse[^\\n]*-force|-force[^\\n]*-recurse)[^\\n]*(?:[a-z]:\\\\(?:\\*|\\s|$)|\\$env:systemdrive)/i,\n reason: \"recursive forced deletion of a drive root\",\n },\n {\n pattern: /\\b(?:del|erase|rd|rmdir)\\b[^\\n]*\\/s[^\\n]*\\/q[^\\n]*[a-z]:\\\\/i,\n reason: \"recursive Windows drive deletion\",\n },\n {\n pattern: /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\};\\s*:/,\n reason: \"fork bomb\",\n },\n];\n\nexport function assertCommandAllowed(command: string) {\n if (process.env.REMOTEARC_ALLOW_DESTRUCTIVE === \"1\") return;\n\n for (const rule of DESTRUCTIVE_COMMAND_RULES) {\n if (rule.pattern.test(command)) {\n throw new Error(\n \"Blocked by Remote Arc Safety Guard: \" +\n rule.reason +\n \". Run this action manually on the device if you intentionally need it.\",\n );\n }\n }\n}\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport type ExecutionPolicy = {\n workspaceRoots?: string[];\n protectSensitivePaths?: boolean;\n sensitivePaths?: string[];\n sensitiveAllowPaths?: string[];\n undoEnabled?: boolean;\n};\n\nconst SENSITIVE_BASENAMES = new Set([\n \".npmrc\",\n \".pypirc\",\n \".netrc\",\n \".git-credentials\",\n \"id_rsa\",\n \"id_ed25519\",\n \"credentials\",\n]);\n\nconst expandPath = (value: string) => {\n const trimmed = value.trim();\n if (trimmed === \"~\") return os.homedir();\n if (trimmed.startsWith(\"~/\") || trimmed.startsWith(\"~\\\\\")) {\n return path.join(os.homedir(), trimmed.slice(2));\n }\n return trimmed\n .replace(/%USERPROFILE%/gi, os.homedir())\n .replace(/\\$HOME\\b/g, os.homedir());\n};\n\nconst comparePath = (value: string) => {\n const resolved = path.resolve(expandPath(value));\n return process.platform === \"win32\" ? resolved.toLowerCase() : resolved;\n};\n\nasync function canonicalTarget(targetPath: string) {\n const expanded = path.resolve(expandPath(targetPath));\n try {\n return comparePath(await fs.realpath(expanded));\n } catch {\n const missing: string[] = [];\n let cursor = expanded;\n\n while (true) {\n try {\n const realParent = await fs.realpath(cursor);\n return comparePath(path.join(realParent, ...missing.reverse()));\n } catch {\n const parent = path.dirname(cursor);\n if (parent === cursor) return comparePath(expanded);\n missing.push(path.basename(cursor));\n cursor = parent;\n }\n }\n }\n}\n\nconst isInside = (target: string, root: string) => {\n const relative = path.relative(root, target);\n return (\n relative === \"\" ||\n (!relative.startsWith(\"..\") && !path.isAbsolute(relative))\n );\n};\n\nfunction defaultSensitiveRoots() {\n const home = os.homedir();\n const roots = [\n path.join(home, \".ssh\"),\n path.join(home, \".aws\"),\n path.join(home, \".gnupg\"),\n path.join(home, \".azure\"),\n path.join(home, \".kube\"),\n path.join(home, \".docker\"),\n path.join(home, \".config\", \"gcloud\"),\n ];\n\n if (process.platform === \"darwin\") {\n roots.push(\n path.join(home, \"Library\", \"Application Support\", \"Google\", \"Chrome\"),\n path.join(home, \"Library\", \"Application Support\", \"Microsoft Edge\"),\n path.join(home, \"Library\", \"Application Support\", \"Firefox\"),\n );\n }\n\n if (process.platform === \"win32\") {\n const appData = process.env.APPDATA;\n const localAppData = process.env.LOCALAPPDATA;\n if (appData) {\n roots.push(path.join(appData, \"Mozilla\", \"Firefox\"));\n }\n if (localAppData) {\n roots.push(\n path.join(localAppData, \"Google\", \"Chrome\", \"User Data\"),\n path.join(localAppData, \"Microsoft\", \"Edge\", \"User Data\"),\n );\n }\n }\n\n return roots;\n}\n\nfunction looksLikeSensitiveFile(target: string) {\n const basename = path.basename(target).toLowerCase();\n if (basename === \".env\" || basename.startsWith(\".env.\")) return true;\n if (SENSITIVE_BASENAMES.has(basename)) return true;\n\n const normalized = target.replace(/\\\\/g, \"/\").toLowerCase();\n if (normalized.endsWith(\"/.docker/config.json\")) return true;\n if (normalized.endsWith(\"/.kube/config\")) return true;\n\n return false;\n}\n\nexport async function enforcePathPolicy(\n targetPath: string,\n policy: ExecutionPolicy = {},\n) {\n const target = await canonicalTarget(targetPath);\n\n const workspaceInputs = (policy.workspaceRoots || []).filter(\n (item) => typeof item === \"string\" && item.trim(),\n );\n const roots = await Promise.all(workspaceInputs.map(canonicalTarget));\n\n if (roots.length && !roots.some((root) => isInside(target, root))) {\n throw new Error(\n \"Blocked by Remote Arc Workspace Scope: path is outside the allowed workspace roots.\",\n );\n }\n\n if (policy.protectSensitivePaths !== false) {\n const sensitiveInputs = [\n ...defaultSensitiveRoots(),\n ...(policy.sensitivePaths || []),\n ].filter((item) => typeof item === \"string\" && item.trim());\n const sensitiveRoots = await Promise.all(\n sensitiveInputs.map(canonicalTarget),\n );\n const allowedSensitiveRoots = await Promise.all(\n (policy.sensitiveAllowPaths || [])\n .filter((item) => typeof item === \"string\" && item.trim())\n .map(canonicalTarget),\n );\n const explicitlyAllowed = allowedSensitiveRoots.some((root) =>\n isInside(target, root),\n );\n\n if (\n !explicitlyAllowed &&\n (looksLikeSensitiveFile(target) ||\n sensitiveRoots.some((root) => isInside(target, root)))\n ) {\n throw new Error(\n \"Blocked by Remote Arc Sensitive Path Policy. Add a narrow sensitive-path exception for this device if you intentionally need access.\",\n );\n }\n }\n\n return target;\n}\n\nexport function normalizePolicy(policy?: ExecutionPolicy): ExecutionPolicy {\n return {\n workspaceRoots: Array.from(\n new Set((policy?.workspaceRoots || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n protectSensitivePaths: policy?.protectSensitivePaths !== false,\n sensitivePaths: Array.from(\n new Set((policy?.sensitivePaths || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n sensitiveAllowPaths: Array.from(\n new Set((policy?.sensitiveAllowPaths || []).filter((item) => typeof item === \"string\" && item.trim())),\n ).slice(0, 32),\n undoEnabled: policy?.undoEnabled !== false,\n };\n}\n","import {\n browseDirectories,\n editTextBlock,\n getFileInfo,\n listDirectory,\n readTextFile,\n writeTextFile,\n} from \"./filesystem.js\";\nimport {\n getManagedProcessStatus,\n listManagedProcesses,\n listProcesses,\n readManagedProcessOutput,\n runShellCommand,\n startBackgroundProcess,\n stopAllManagedProcesses,\n stopManagedProcess,\n} from \"./process.js\";\nimport {\n assertCommandAllowed,\n createUndoSnapshot,\n discardUndoSnapshot,\n finalizeUndoSnapshot,\n listUndoActions,\n undoChange,\n} from \"./safety.js\";\nimport {\n enforcePathPolicy,\n normalizePolicy,\n type ExecutionPolicy,\n} from \"./policy.js\";\nimport type {\n ExecutionMode,\n ToolArguments,\n ToolDefinition,\n ToolName,\n ToolResult,\n} from \"./types.js\";\n\nconst SAFE_TOOLS = new Set<ToolName>([\n \"list_directory\",\n \"browse_directories\",\n \"read_file\",\n \"get_file_info\",\n \"list_processes\",\n \"list_undo_actions\",\n]);\n\nconst DEVELOPER_TOOLS = new Set<ToolName>([\n ...SAFE_TOOLS,\n \"write_file\",\n \"edit_block\",\n \"undo_change\",\n \"undo_last_change\",\n]);\n\nconst FULL_TOOLS = new Set<ToolName>([\n ...DEVELOPER_TOOLS,\n \"start_process\",\n \"process_status\",\n \"process_output\",\n \"list_managed_processes\",\n \"stop_process\",\n]);\n\nconst DEFINITIONS: ToolDefinition[] = [\n {\n name: \"list_directory\",\n description: \"List files and directories on this computer without following directory symlinks.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n depth: { type: \"integer\", minimum: 1, maximum: 10, default: 2 },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"browse_directories\",\n description: \"List child directories for the Remote Arc dashboard directory picker.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"read_file\",\n description: \"Read a text file by line range. Negative offsets read from the end.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n offset: { type: \"integer\" },\n length: { type: \"integer\", minimum: 1 },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"get_file_info\",\n description: \"Get local file or directory metadata.\",\n inputSchema: {\n type: \"object\",\n properties: { path: { type: \"string\" } },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"list_processes\",\n description: \"List processes running on this computer.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"write_file\",\n description: \"Write or append UTF-8 text. Remote Arc creates a local-only Undo snapshot first.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\" },\n content: { type: \"string\" },\n mode: { type: \"string\", enum: [\"rewrite\", \"append\"], default: \"rewrite\" },\n },\n required: [\"path\", \"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"edit_block\",\n description: \"Apply an exact text replacement with conflict-safe Local Undo.\",\n inputSchema: {\n type: \"object\",\n properties: {\n file_path: { type: \"string\" },\n old_string: { type: \"string\" },\n new_string: { type: \"string\" },\n expected_replacements: { type: \"integer\", minimum: 1, default: 1 },\n },\n required: [\"file_path\", \"old_string\", \"new_string\"],\n additionalProperties: false,\n },\n },\n {\n name: \"list_undo_actions\",\n description: \"List reversible Remote Arc file changes currently stored on this device.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"integer\", minimum: 1, maximum: 100, default: 20 },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"undo_change\",\n description: \"Restore one specific local Remote Arc undo snapshot by action id.\",\n inputSchema: {\n type: \"object\",\n properties: {\n action_id: { type: \"string\" },\n },\n required: [\"action_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"undo_last_change\",\n description: \"Undo the newest reversible Remote Arc file edit stored only on this device.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"start_process\",\n description: \"Run a shell command with timeout and output capture. Catastrophic command patterns are blocked locally.\",\n inputSchema: {\n type: \"object\",\n properties: {\n command: { type: \"string\" },\n timeout_ms: { type: \"integer\", minimum: 100, maximum: 120000, default: 5000 },\n cwd: { type: \"string\" },\n background: { type: \"boolean\", default: false },\n },\n required: [\"command\"],\n additionalProperties: false,\n },\n },\n {\n name: \"process_status\",\n description: \"Get status for a Remote Arc managed background process.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"process_output\",\n description: \"Read captured stdout and stderr from a Remote Arc managed background process.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"list_managed_processes\",\n description: \"List background processes started and managed by Remote Arc on this device.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n },\n {\n name: \"stop_process\",\n description: \"Stop a Remote Arc managed background process and its child process tree.\",\n inputSchema: {\n type: \"object\",\n properties: { process_id: { type: \"string\" } },\n required: [\"process_id\"],\n additionalProperties: false,\n },\n },\n];\n\nconst textResult = (value: unknown): ToolResult => ({\n content: [\n {\n type: \"text\",\n text: typeof value === \"string\" ? value : JSON.stringify(value, null, 2),\n },\n ],\n});\n\nfunction requiredString(args: ToolArguments, key: string) {\n const value = args[key];\n if (typeof value !== \"string\") throw new Error(`${key} must be a string.`);\n return value;\n}\n\nfunction optionalNumber(args: ToolArguments, key: string) {\n const value = args[key];\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction optionalString(args: ToolArguments, key: string) {\n const value = args[key];\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nexport class RemoteArcExecutionCore {\n constructor(private readonly mode: ExecutionMode = \"managed\") {}\n\n private allowedTools() {\n if (this.mode === \"safe\") return SAFE_TOOLS;\n if (this.mode === \"developer\") return DEVELOPER_TOOLS;\n return FULL_TOOLS;\n }\n\n listTools() {\n const allowed = this.allowedTools();\n return DEFINITIONS.filter((tool) => allowed.has(tool.name));\n }\n\n async callTool(\n name: string,\n args: ToolArguments = {},\n policyInput: ExecutionPolicy = {},\n ): Promise<ToolResult> {\n const toolName = name as ToolName;\n if (!this.allowedTools().has(toolName)) {\n throw new Error(`Tool blocked by local permission mode: ${name}`);\n }\n\n const policy = normalizePolicy(policyInput);\n\n switch (toolName) {\n case \"list_directory\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(\n await listDirectory(\n target,\n optionalNumber(args, \"depth\") ?? 2,\n async (candidate) => {\n try {\n await enforcePathPolicy(candidate, policy);\n return true;\n } catch {\n return false;\n }\n },\n ),\n );\n }\n case \"browse_directories\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(\n await browseDirectories(\n target,\n async (candidate) => {\n try {\n await enforcePathPolicy(candidate, policy);\n return true;\n } catch {\n return false;\n }\n },\n ),\n );\n }\n case \"read_file\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(\n await readTextFile(\n target,\n optionalNumber(args, \"offset\"),\n optionalNumber(args, \"length\"),\n ),\n );\n }\n case \"get_file_info\": {\n const target = await enforcePathPolicy(requiredString(args, \"path\"), policy);\n return textResult(await getFileInfo(target));\n }\n case \"list_processes\":\n return textResult(await listProcesses());\n case \"list_undo_actions\": {\n const actions = await listUndoActions(optionalNumber(args, \"limit\") ?? 20);\n const visible = [];\n for (const action of actions) {\n try {\n await enforcePathPolicy(action.path, policy);\n visible.push(action);\n } catch {\n // Do not reveal protected or out-of-scope paths through undo metadata.\n }\n }\n return textResult(visible);\n }\n case \"undo_change\": {\n if (policy.undoEnabled === false) {\n throw new Error(\"Local Undo is disabled for this device.\");\n }\n const actionId = requiredString(args, \"action_id\");\n const action = (await listUndoActions(100)).find((item) => item.id === actionId);\n if (!action) throw new Error(\"Undo action not found or expired on this device.\");\n await enforcePathPolicy(action.path, policy);\n return textResult(await undoChange(actionId));\n }\n case \"undo_last_change\": {\n if (policy.undoEnabled === false) {\n throw new Error(\"Local Undo is disabled for this device.\");\n }\n const actions = await listUndoActions(100);\n for (const action of actions) {\n try {\n await enforcePathPolicy(action.path, policy);\n return textResult(await undoChange(action.id));\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (!message.startsWith(\"Blocked by Remote Arc\")) throw error;\n }\n }\n throw new Error(\"No reversible in-scope Remote Arc file change is available.\");\n }\n case \"start_process\": {\n const command = requiredString(args, \"command\");\n assertCommandAllowed(command);\n const cwdInput = optionalString(args, \"cwd\");\n if ((policy.workspaceRoots || []).length && !cwdInput) {\n throw new Error(\n \"Workspace Scope is enabled. start_process requires an in-scope cwd. Terminal commands are not an OS sandbox and may still access paths outside that directory.\",\n );\n }\n const cwd = cwdInput ? await enforcePathPolicy(cwdInput, policy) : undefined;\n if (args.background === true) {\n return textResult(await startBackgroundProcess(command, cwd));\n }\n return textResult(\n await runShellCommand(\n command,\n optionalNumber(args, \"timeout_ms\") ?? 5000,\n cwd,\n ),\n );\n }\n case \"process_status\":\n return textResult(\n getManagedProcessStatus(requiredString(args, \"process_id\")),\n );\n case \"process_output\":\n return textResult(\n readManagedProcessOutput(requiredString(args, \"process_id\")),\n );\n case \"list_managed_processes\":\n return textResult(listManagedProcesses());\n case \"stop_process\":\n return textResult(\n await stopManagedProcess(requiredString(args, \"process_id\")),\n );\n case \"write_file\":\n case \"edit_block\": {\n const pathKey = toolName === \"write_file\" ? \"path\" : \"file_path\";\n const target = await enforcePathPolicy(requiredString(args, pathKey), policy);\n const scopedArgs = { ...args, [pathKey]: target };\n const snapshot =\n policy.undoEnabled === false\n ? null\n : await createUndoSnapshot(toolName, scopedArgs);\n try {\n const result =\n toolName === \"write_file\"\n ? await writeTextFile(\n target,\n requiredString(args, \"content\"),\n args.mode === \"append\" ? \"append\" : \"rewrite\",\n )\n : await editTextBlock(\n target,\n requiredString(args, \"old_string\"),\n requiredString(args, \"new_string\"),\n optionalNumber(args, \"expected_replacements\") ?? 1,\n );\n\n const undoAvailable = await finalizeUndoSnapshot(snapshot);\n return textResult({\n ...result,\n undo_available: undoAvailable,\n undo_storage: undoAvailable ? \"local-device-only\" : null,\n });\n } catch (error) {\n await discardUndoSnapshot(snapshot);\n throw error;\n }\n }\n default:\n throw new Error(\"Unknown Remote Arc tool: \" + name);\n }\n }\n\n async close() {\n await stopAllManagedProcesses();\n }\n}\n\nexport const toolDefinitions = DEFINITIONS;\n"],"mappings":"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","names":["os","path","fs","spawn","process","crypto","process","crypto","fs","path","fs","os","path","path","os","process","fs","spawn"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remotelink",
3
- "version": "0.3.13",
3
+ "version": "0.3.14",
4
4
  "description": "Connect a computer to Remote Arc with one command.",
5
5
  "type": "module",
6
6
  "bin": {