@remotepilot/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +70 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/list.d.ts +5 -0
  6. package/dist/commands/list.d.ts.map +1 -0
  7. package/dist/commands/list.js +75 -0
  8. package/dist/commands/list.js.map +1 -0
  9. package/dist/commands/pair.d.ts +6 -0
  10. package/dist/commands/pair.d.ts.map +1 -0
  11. package/dist/commands/pair.js +114 -0
  12. package/dist/commands/pair.js.map +1 -0
  13. package/dist/commands/restart.d.ts +5 -0
  14. package/dist/commands/restart.d.ts.map +1 -0
  15. package/dist/commands/restart.js +67 -0
  16. package/dist/commands/restart.js.map +1 -0
  17. package/dist/commands/setup.d.ts +8 -0
  18. package/dist/commands/setup.d.ts.map +1 -0
  19. package/dist/commands/setup.js +387 -0
  20. package/dist/commands/setup.js.map +1 -0
  21. package/dist/commands/start.d.ts +6 -0
  22. package/dist/commands/start.d.ts.map +1 -0
  23. package/dist/commands/start.js +164 -0
  24. package/dist/commands/start.js.map +1 -0
  25. package/dist/commands/status.d.ts +5 -0
  26. package/dist/commands/status.d.ts.map +1 -0
  27. package/dist/commands/status.js +130 -0
  28. package/dist/commands/status.js.map +1 -0
  29. package/dist/commands/stop.d.ts +5 -0
  30. package/dist/commands/stop.d.ts.map +1 -0
  31. package/dist/commands/stop.js +67 -0
  32. package/dist/commands/stop.js.map +1 -0
  33. package/dist/commands/update.d.ts +2 -0
  34. package/dist/commands/update.d.ts.map +1 -0
  35. package/dist/commands/update.js +8 -0
  36. package/dist/commands/update.js.map +1 -0
  37. package/dist/daemon-manager.ps1 +114 -0
  38. package/dist/daemon.d.ts +14 -0
  39. package/dist/daemon.d.ts.map +1 -0
  40. package/dist/daemon.js +216 -0
  41. package/dist/daemon.js.map +1 -0
  42. package/dist/daemon.log +0 -0
  43. package/dist/daemon.pid +0 -0
  44. package/dist/utils/update-check.d.ts +3 -0
  45. package/dist/utils/update-check.d.ts.map +1 -0
  46. package/dist/utils/update-check.js +112 -0
  47. package/dist/utils/update-check.js.map +1 -0
  48. package/package.json +65 -0
@@ -0,0 +1,387 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.setupCommand = setupCommand;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const crypto_1 = require("@remotepilot/crypto");
40
+ const protocol_1 = require("@remotepilot/protocol");
41
+ const windows_service_1 = require("@remotepilot/windows-service");
42
+ const windows_process_1 = require("@remotepilot/windows-process");
43
+ async function setupCommand(options) {
44
+ console.log("RemotePilot Host Setup");
45
+ console.log("======================\n");
46
+ // Detect platform
47
+ const platform = detectPlatform();
48
+ console.log(`Detected platform: ${platform}`);
49
+ // Check prerequisites
50
+ console.log("\nChecking prerequisites...");
51
+ await checkPrerequisites(platform);
52
+ // Get host name
53
+ const hostName = options.name || getHostName();
54
+ console.log(`Host name: ${hostName}`);
55
+ // Get port
56
+ const port = parseInt(options.port || "8080", 10);
57
+ console.log(`Port: ${port}`);
58
+ // Check if already configured
59
+ const configPath = getConfigPath();
60
+ if (fs.existsSync(configPath) && !options.force) {
61
+ console.log("\nHost already configured. Use --force to reconfigure.");
62
+ return;
63
+ }
64
+ // Determine data directory: ProgramData when elevated, user profile otherwise
65
+ const elevated = isElevated();
66
+ const dataDir = elevated ? getServiceDataDir() : path.dirname(configPath);
67
+ console.log(`Data directory: ${dataDir}${elevated ? " (elevated — ProgramData)" : " (user profile)"}`);
68
+ // Generate host identity
69
+ console.log("\nGenerating host identity...");
70
+ const { publicKey, privateKey } = (0, crypto_1.generateKeyPairSync)();
71
+ const hostId = (0, crypto_1.generateHostId)(publicKey);
72
+ console.log(`Host ID: ${hostId}`);
73
+ // Ensure config directory exists
74
+ fs.mkdirSync(dataDir, { recursive: true });
75
+ // Save private key with proper Windows ACL
76
+ const privateKeyPath = path.join(dataDir, "host.key");
77
+ fs.writeFileSync(privateKeyPath, privateKey);
78
+ await restrictPrivateKey(privateKeyPath);
79
+ console.log(`Private key saved to: ${privateKeyPath}`);
80
+ // Save public key
81
+ const publicKeyPath = path.join(dataDir, "host.pub");
82
+ fs.writeFileSync(publicKeyPath, publicKey);
83
+ console.log(`Public key saved to: ${publicKeyPath}`);
84
+ // Detect available shells using ShellDetector
85
+ console.log("\nDetecting available shells...");
86
+ const shells = await detectShells(platform);
87
+ console.log(`Available shells: ${shells.join(", ")}`);
88
+ // Detect installed tools
89
+ console.log("\nDetecting installed tools...");
90
+ const tools = await detectInstalledTools(platform);
91
+ console.log(`Installed tools: ${tools.join(", ")}`);
92
+ // Detect installed agents
93
+ console.log("\nDetecting installed AI agents...");
94
+ const agents = await detectInstalledAgents();
95
+ console.log(`Installed agents: ${agents.join(", ")}`);
96
+ // Create config
97
+ const config = {
98
+ hostId,
99
+ hostName,
100
+ platform,
101
+ publicKey,
102
+ privateKeyPath,
103
+ port,
104
+ createdAt: Date.now()
105
+ };
106
+ // Save config to the data directory (user profile for dev, ProgramData for elevated)
107
+ const serviceConfigPath = path.join(dataDir, "host.json");
108
+ fs.writeFileSync(serviceConfigPath, JSON.stringify(config, null, 2));
109
+ console.log(`\nConfiguration saved to: ${serviceConfigPath}`);
110
+ // Install service (pass data dir so the daemon can find config)
111
+ console.log("\nInstalling Windows service...");
112
+ await installService(platform, config, dataDir);
113
+ // Clean up any old startup scripts from previous versions
114
+ cleanupOldStartupScripts();
115
+ console.log("\nSetup complete!");
116
+ console.log("\nNext steps:");
117
+ console.log(" 1. Start the service: remotepilot start");
118
+ console.log(" 2. Check status: remotepilot status");
119
+ console.log(" 3. Pair your device: remotepilot pair");
120
+ }
121
+ function detectPlatform() {
122
+ const platform = process.platform;
123
+ if (platform === "win32") {
124
+ return protocol_1.Platform.WINDOWS;
125
+ }
126
+ else if (platform === "linux") {
127
+ return protocol_1.Platform.LINUX;
128
+ }
129
+ else {
130
+ throw new Error(`Unsupported platform: ${platform}`);
131
+ }
132
+ }
133
+ async function checkPrerequisites(platform) {
134
+ const missing = [];
135
+ if (platform === protocol_1.Platform.WINDOWS) {
136
+ // Check for PowerShell
137
+ try {
138
+ const { exec } = await import("node:child_process");
139
+ const { promisify } = await import("node:util");
140
+ const execAsync = promisify(exec);
141
+ await execAsync("powershell -NoProfile -Command \"Write-Host 'ok'\"", { timeout: 5000 });
142
+ }
143
+ catch {
144
+ missing.push("PowerShell");
145
+ }
146
+ // Check for Node.js (required)
147
+ try {
148
+ const { exec } = await import("node:child_process");
149
+ const { promisify } = await import("node:util");
150
+ const execAsync = promisify(exec);
151
+ await execAsync("node --version", { timeout: 5000 });
152
+ }
153
+ catch {
154
+ missing.push("Node.js (required)");
155
+ }
156
+ }
157
+ if (missing.length > 0) {
158
+ console.log(` Missing prerequisites: ${missing.join(", ")}`);
159
+ console.log(" Install these before continuing.");
160
+ }
161
+ else {
162
+ console.log(" All prerequisites met");
163
+ }
164
+ }
165
+ function getHostName() {
166
+ return process.env.COMPUTERNAME || process.env.HOSTNAME || "Unknown";
167
+ }
168
+ function getConfigPath() {
169
+ const homeDir = process.env.HOME || process.env.USERPROFILE || "~";
170
+ return path.join(homeDir, ".remotepilot", "host.json");
171
+ }
172
+ /**
173
+ * Get the service-owned data directory.
174
+ * When running elevated (Administrator), use %ProgramData%\RemotePilot\
175
+ * so the LocalSystem service can access config, keys, and logs.
176
+ * When not elevated, fall back to user profile (development only).
177
+ */
178
+ function getServiceDataDir() {
179
+ const programData = process.env.PROGRAMDATA || "C:\\ProgramData";
180
+ return path.join(programData, "RemotePilot");
181
+ }
182
+ function isElevated() {
183
+ try {
184
+ const { execSync } = require("node:child_process");
185
+ execSync("net session", { stdio: "ignore" });
186
+ return true;
187
+ }
188
+ catch {
189
+ return false;
190
+ }
191
+ }
192
+ /**
193
+ * Detect available shells using ShellDetector
194
+ */
195
+ async function detectShells(platform) {
196
+ try {
197
+ const detector = new windows_process_1.ShellDetector(platform);
198
+ const shells = await detector.detectAvailableShells();
199
+ return shells.map(s => s.displayName);
200
+ }
201
+ catch {
202
+ return ["PowerShell", "CMD"];
203
+ }
204
+ }
205
+ async function detectInstalledTools(platform) {
206
+ const tools = [];
207
+ const { exec } = await import("node:child_process");
208
+ const { promisify } = await import("node:util");
209
+ const execAsync = promisify(exec);
210
+ const toolChecks = [
211
+ { name: "Git", command: "git --version" },
212
+ { name: "Node.js", command: "node --version" },
213
+ { name: "npm", command: "npm --version" },
214
+ { name: "Python", command: "python --version" },
215
+ { name: "Docker", command: "docker --version" },
216
+ { name: "VS Code", command: "code --version" }
217
+ ];
218
+ for (const tool of toolChecks) {
219
+ try {
220
+ await execAsync(tool.command, { timeout: 5000 });
221
+ tools.push(tool.name);
222
+ }
223
+ catch {
224
+ // Tool not installed
225
+ }
226
+ }
227
+ return tools;
228
+ }
229
+ async function detectInstalledAgents() {
230
+ const agents = [];
231
+ const { exec } = await import("node:child_process");
232
+ const { promisify } = await import("node:util");
233
+ const execAsync = promisify(exec);
234
+ const agentChecks = [
235
+ { name: "Claude Code", command: "claude --version" },
236
+ { name: "Codex", command: "codex --version" },
237
+ { name: "Gemini CLI", command: "gemini --version" },
238
+ { name: "OpenCode", command: "opencode --version" }
239
+ ];
240
+ for (const agent of agentChecks) {
241
+ try {
242
+ await execAsync(agent.command, { timeout: 5000 });
243
+ agents.push(agent.name);
244
+ }
245
+ catch {
246
+ // Agent not installed
247
+ }
248
+ }
249
+ return agents;
250
+ }
251
+ /**
252
+ * Install the Windows service using WindowsServiceManager
253
+ *
254
+ * Strategy:
255
+ * 1. Try sc.exe first (requires Administrator + user password)
256
+ * 2. Fall back to Registry Run key (works without elevation)
257
+ *
258
+ * The Registry Run key approach creates an entry that runs at user logon,
259
+ * under the current user's account.
260
+ */
261
+ async function installService(platform, config, dataDir) {
262
+ if (platform === protocol_1.Platform.WINDOWS) {
263
+ const serviceManager = new windows_service_1.WindowsServiceManager();
264
+ // Find the daemon entry point
265
+ const daemonPath = path.resolve(__dirname, "../daemon.js");
266
+ if (!fs.existsSync(daemonPath)) {
267
+ console.log(" Warning: daemon.ts not built. Service installation skipped.");
268
+ console.log(" Run 'npm run build' and then re-run setup.");
269
+ return;
270
+ }
271
+ // Try sc.exe first (requires Administrator)
272
+ // Service runs as LocalSystem. Service-owned data (config, keys, logs)
273
+ // lives in %ProgramData%\RemotePilot\ (dataDir). The daemon receives
274
+ // --data-dir so it does not depend on %USERPROFILE%.
275
+ console.log(" Attempting Windows service installation via sc.exe...");
276
+ const serviceConfig = {
277
+ serviceName: "RemotePilotHost",
278
+ displayName: "RemotePilot Host Service",
279
+ description: "RemotePilot remote development host daemon",
280
+ scriptPath: daemonPath,
281
+ nodeArgs: [],
282
+ scriptArgs: ["--service", `--data-dir=${dataDir}`],
283
+ configDir: dataDir
284
+ };
285
+ const installed = await serviceManager.install(serviceConfig);
286
+ if (installed) {
287
+ console.log(" Service installed via Windows Service Control Manager.");
288
+ console.log(" Startup type: Automatic (starts with Windows)");
289
+ return;
290
+ }
291
+ // Fall back to Registry Run key
292
+ console.log(" sc.exe requires Administrator privileges.");
293
+ console.log(" Falling back to Registry Run key (works without elevation)...");
294
+ const registryInstalled = await installViaRegistryRunKey(daemonPath, dataDir);
295
+ if (registryInstalled) {
296
+ console.log(" Startup entry installed via Registry Run key.");
297
+ console.log(" The daemon will start automatically at user logon.");
298
+ }
299
+ else {
300
+ console.log(" Warning: Could not install automatic startup.");
301
+ console.log(" Run 'remotepilot start' to start the daemon manually.");
302
+ }
303
+ }
304
+ else if (platform === protocol_1.Platform.LINUX) {
305
+ console.log(" Linux service installation (systemd) - see docs/installation.md");
306
+ }
307
+ }
308
+ /**
309
+ * Install via Windows Registry Run key as a fallback when sc.exe is not available.
310
+ * This works without Administrator privileges and starts the daemon at user logon.
311
+ *
312
+ * The daemon runs under the current user's account. --data-dir points to the
313
+ * user profile so the daemon reads/writes config and logs from %USERPROFILE%.
314
+ */
315
+ async function installViaRegistryRunKey(daemonPath, dataDir) {
316
+ try {
317
+ const { exec } = await import("node:child_process");
318
+ const { promisify } = await import("node:util");
319
+ const execAsync = promisify(exec);
320
+ const nodeExe = process.execPath;
321
+ // Write a batch wrapper to avoid shell escaping issues
322
+ const batchPath = path.join(path.dirname(daemonPath), "remotepilot-service.bat");
323
+ const batchContent = `@echo off\n"${nodeExe}" "${daemonPath}" --service --data-dir="${dataDir}"\n`;
324
+ fs.writeFileSync(batchPath, batchContent);
325
+ // Add to HKCU\Software\Microsoft\Windows\CurrentVersion\Run
326
+ // This starts the daemon when the current user logs in
327
+ const regCmd = `reg add "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" /v "RemotePilotHost" /t REG_SZ /d "\\"${batchPath}\\"" /f`;
328
+ await execAsync(regCmd, { timeout: 5000 });
329
+ return true;
330
+ }
331
+ catch (error) {
332
+ console.log(` Registry error: ${error}`);
333
+ return false;
334
+ }
335
+ }
336
+ /**
337
+ * Remove old startup scripts from previous versions
338
+ */
339
+ function cleanupOldStartupScripts() {
340
+ try {
341
+ const appData = process.env.APPDATA || "";
342
+ const startupPath = path.join(appData, "Microsoft", "Windows", "Start Menu", "Programs", "Startup", "remotepilot.bat");
343
+ if (fs.existsSync(startupPath)) {
344
+ fs.unlinkSync(startupPath);
345
+ console.log(" Removed old startup script (replaced by Windows service)");
346
+ }
347
+ // Also remove scheduled task if it exists
348
+ const { exec } = require("node:child_process");
349
+ exec('schtasks /delete /tn "RemotePilot" /f', () => {
350
+ // Ignore errors - task may not exist
351
+ });
352
+ }
353
+ catch {
354
+ // Ignore cleanup errors
355
+ }
356
+ }
357
+ /**
358
+ * Restrict private key file permissions on Windows
359
+ *
360
+ * Removes inherited permissions and grants access only to:
361
+ * - The current user (Read/Write)
362
+ * - SYSTEM (Read only — needed for daemon to sign pairing challenges)
363
+ *
364
+ * Does NOT grant Full Control to SYSTEM. The daemon only reads the key.
365
+ * Does NOT grant access to Administrators group or other users.
366
+ */
367
+ async function restrictPrivateKey(filePath) {
368
+ if (process.platform !== "win32")
369
+ return;
370
+ try {
371
+ const { exec } = await import("node:child_process");
372
+ const { promisify } = await import("node:util");
373
+ const execAsync = promisify(exec);
374
+ // Get current username
375
+ const username = process.env.USERNAME || process.env.COMPUTERNAME || "unknown";
376
+ const domain = process.env.USERDOMAIN || ".";
377
+ // Remove inherited permissions and set explicit ACL
378
+ // SYSTEM gets Read-only (minimum required for pairing operations)
379
+ const icaclsCmd = `icacls "${filePath}" /inheritance:r /grant:r "${domain}\\${username}:(R,W)" "SYSTEM:(R)"`;
380
+ await execAsync(icaclsCmd, { timeout: 5000 });
381
+ }
382
+ catch {
383
+ // If icacls fails, log but don't block setup
384
+ console.log(" Warning: Could not set private key permissions. Manual adjustment recommended.");
385
+ }
386
+ }
387
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ interface StartOptions {
2
+ foreground?: boolean;
3
+ }
4
+ export declare function startCommand(options: StartOptions): Promise<void>;
5
+ export {};
6
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AASA,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AA0CD,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAwHvE"}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startCommand = startCommand;
4
+ const windows_service_1 = require("@remotepilot/windows-service");
5
+ const node_child_process_1 = require("node:child_process");
6
+ const node_util_1 = require("node:util");
7
+ const promises_1 = require("node:fs/promises");
8
+ const node_path_1 = require("node:path");
9
+ const node_os_1 = require("node:os");
10
+ const execAsync = (0, node_util_1.promisify)(node_child_process_1.exec);
11
+ const SYSTEMD_SERVICE = `[Unit]
12
+ Description=RemotePilot Host Daemon
13
+ After=network.target
14
+
15
+ [Service]
16
+ Type=simple
17
+ ExecStart=/usr/bin/env node -e "import('remotepilot/dist/daemon.js').then(m => m.startDaemon())"
18
+ Restart=on-failure
19
+ RestartSec=5
20
+ Environment=NODE_ENV=production
21
+
22
+ [Install]
23
+ WantedBy=default.target
24
+ `;
25
+ const AGENT_FILE = `<?xml version="1.0" encoding="UTF-8"?>
26
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
27
+ <plist version="1.0">
28
+ <dict>
29
+ <key>Label</key>
30
+ <string>dev.remotepilot.daemon</string>
31
+ <key>ProgramArguments</key>
32
+ <array>
33
+ <string>/usr/bin/env</string>
34
+ <string>node</string>
35
+ <string>-e</string>
36
+ <string>import('remotepilot/dist/daemon.js').then(m => m.startDaemon())</string>
37
+ </array>
38
+ <key>RunAtLoad</key>
39
+ <true/>
40
+ <key>KeepAlive</key>
41
+ <true/>
42
+ <key>StandardOutPath</key>
43
+ <string>/tmp/remotepilot.log</string>
44
+ <key>StandardErrorPath</key>
45
+ <string>/tmp/remotepilot.log</string>
46
+ </dict>
47
+ </plist>
48
+ `;
49
+ async function startCommand(options) {
50
+ console.log("Starting RemotePilot Host...\n");
51
+ if (options.foreground) {
52
+ console.log("Starting in foreground mode (for development)...\n");
53
+ const { startDaemon } = await import("../daemon.js");
54
+ startDaemon();
55
+ return;
56
+ }
57
+ // --- Windows ---
58
+ if (process.platform === "win32") {
59
+ const serviceManager = new windows_service_1.WindowsServiceManager();
60
+ const exists = await serviceManager.exists();
61
+ if (exists) {
62
+ const status = await serviceManager.status();
63
+ if (status.state === "running") {
64
+ console.log("Service is already running.");
65
+ return;
66
+ }
67
+ const started = await serviceManager.start();
68
+ if (started) {
69
+ await new Promise(resolve => setTimeout(resolve, 2000));
70
+ const newStatus = await serviceManager.status();
71
+ if (newStatus.state === "running") {
72
+ console.log("Service started successfully.");
73
+ console.log(` PID: ${newStatus.pid || "unknown"}`);
74
+ }
75
+ else {
76
+ console.log(`Service state: ${newStatus.state}`);
77
+ }
78
+ }
79
+ else {
80
+ console.error("Failed to start service.");
81
+ process.exit(1);
82
+ }
83
+ return;
84
+ }
85
+ // Try Registry Run key fallback
86
+ try {
87
+ const { stdout } = await execAsync('reg query "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run" /v "RemotePilotHost"', { timeout: 5000 });
88
+ if (stdout.includes("RemotePilotHost")) {
89
+ console.log("Daemon found via Registry Run key. Starting in foreground...");
90
+ console.log("(Note: Daemon will auto-start on next user logon)\n");
91
+ const { startDaemon } = await import("../daemon.js");
92
+ startDaemon();
93
+ return;
94
+ }
95
+ }
96
+ catch {
97
+ // Registry entry doesn't exist
98
+ }
99
+ console.log("Service not installed. Run 'remotepilot setup' first.");
100
+ process.exit(1);
101
+ }
102
+ // --- Linux (systemd --user) ---
103
+ if (process.platform === "linux") {
104
+ const unitDir = (0, node_path_1.join)((0, node_os_1.homedir)(), ".config", "systemd", "user");
105
+ const unitPath = (0, node_path_1.join)(unitDir, "remotepilot.service");
106
+ // Install unit file if missing
107
+ try {
108
+ await (0, promises_1.mkdir)(unitDir, { recursive: true });
109
+ await (0, promises_1.writeFile)(unitPath, SYSTEMD_SERVICE, { flag: "ax" }); // skip if exists
110
+ }
111
+ catch { /* already exists */ }
112
+ try {
113
+ await execAsync("systemctl --user daemon-reload", { timeout: 5000 });
114
+ await execAsync("systemctl --user is-active remotepilot", { timeout: 5000 });
115
+ console.log("Service is already running.");
116
+ return;
117
+ }
118
+ catch {
119
+ // Not running, start it
120
+ }
121
+ try {
122
+ await execAsync("systemctl --user start remotepilot", { timeout: 5000 });
123
+ await execAsync("systemctl --user enable remotepilot", { timeout: 5000 });
124
+ console.log("Service started and enabled for auto-start.");
125
+ console.log(" Logs: journalctl --user -u remotepilot -f");
126
+ return;
127
+ }
128
+ catch (err) {
129
+ console.error("Failed to start systemd service:", err.message);
130
+ console.log("Falling back to foreground mode...\n");
131
+ const { startDaemon } = await import("../daemon.js");
132
+ startDaemon();
133
+ return;
134
+ }
135
+ }
136
+ // --- macOS (launchd) ---
137
+ if (process.platform === "darwin") {
138
+ const agentDir = (0, node_path_1.join)((0, node_os_1.homedir)(), "Library", "LaunchAgents");
139
+ const agentPath = (0, node_path_1.join)(agentDir, "dev.remotepilot.daemon.plist");
140
+ try {
141
+ await (0, promises_1.mkdir)(agentDir, { recursive: true });
142
+ await (0, promises_1.writeFile)(agentPath, AGENT_FILE, { flag: "ax" });
143
+ }
144
+ catch { /* already exists */ }
145
+ try {
146
+ // Unload first in case it's already loaded
147
+ await execAsync(`launchctl unload "${agentPath}" 2>/dev/null || true`, { timeout: 5000 });
148
+ await execAsync(`launchctl load "${agentPath}"`, { timeout: 5000 });
149
+ console.log("Service loaded and enabled for auto-start.");
150
+ console.log(" Logs: log show --predicate 'process == \"node\"' --last 1m");
151
+ return;
152
+ }
153
+ catch (err) {
154
+ console.error("Failed to load launchd agent:", err.message);
155
+ console.log("Falling back to foreground mode...\n");
156
+ const { startDaemon } = await import("../daemon.js");
157
+ startDaemon();
158
+ return;
159
+ }
160
+ }
161
+ console.log(`Unsupported platform: ${process.platform}`);
162
+ console.log("Run in foreground: remotepilot start --foreground");
163
+ }
164
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ interface StatusOptions {
2
+ }
3
+ export declare function statusCommand(_options: StatusOptions): Promise<void>;
4
+ export {};
5
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAQA,UAAU,aAAa;CAAG;AAY1B,wBAAsB,aAAa,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2E1E"}