@remotepilot/cli 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +199 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +0 -1
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/pair.d.ts +15 -2
- package/dist/commands/pair.d.ts.map +1 -1
- package/dist/commands/pair.js +66 -20
- package/dist/commands/pair.js.map +1 -1
- package/dist/commands/setup.d.ts +19 -2
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +161 -66
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/start.d.ts +8 -2
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +152 -57
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +48 -1
- package/dist/commands/stop.js.map +1 -1
- package/dist/daemon-manager.ps1 +10 -1
- package/dist/daemon.d.ts +7 -6
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +271 -46
- package/dist/daemon.js.map +1 -1
- package/package.json +3 -3
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
3
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
37
|
const commander_1 = require("commander");
|
|
5
38
|
const setup_js_1 = require("./commands/setup.js");
|
|
@@ -11,20 +44,30 @@ const pair_js_1 = require("./commands/pair.js");
|
|
|
11
44
|
const list_js_1 = require("./commands/list.js");
|
|
12
45
|
const update_js_1 = require("./commands/update.js");
|
|
13
46
|
const update_check_js_1 = require("./utils/update-check.js");
|
|
47
|
+
const http = __importStar(require("node:http"));
|
|
14
48
|
const program = new commander_1.Command();
|
|
15
49
|
// Auto-update check (non-blocking, runs in background)
|
|
16
50
|
(0, update_check_js_1.checkForUpdate)().catch(() => { });
|
|
17
51
|
program
|
|
18
52
|
.name("remotepilot")
|
|
19
53
|
.description("RemotePilot - Connect your phone to any computer via QR code")
|
|
20
|
-
.version("0.
|
|
54
|
+
.version("0.2.0");
|
|
55
|
+
// --- Default action: all-in-one (no subcommand) ---
|
|
56
|
+
// Commander runs this when no known subcommand is matched
|
|
57
|
+
program
|
|
58
|
+
.option("--name <name>", "Host name")
|
|
59
|
+
.option("--port <port>", "Port number", "6060")
|
|
60
|
+
.option("--no-tunnel", "Skip Cloudflare tunnel")
|
|
61
|
+
.action(async (opts) => {
|
|
62
|
+
await runAllInOne(opts.name, opts);
|
|
63
|
+
});
|
|
21
64
|
// Setup command
|
|
22
65
|
program
|
|
23
66
|
.command("setup")
|
|
24
67
|
.alias("install")
|
|
25
68
|
.description("Set up RemotePilot host on this computer")
|
|
26
69
|
.option("--name <name>", "Host name")
|
|
27
|
-
.option("--port <port>", "Port number", "
|
|
70
|
+
.option("--port <port>", "Port number", "6060")
|
|
28
71
|
.option("--force", "Force setup even if already configured")
|
|
29
72
|
.action(setup_js_1.setupCommand);
|
|
30
73
|
// Start command
|
|
@@ -60,11 +103,165 @@ program
|
|
|
60
103
|
.command("list")
|
|
61
104
|
.description("List paired devices")
|
|
62
105
|
.action(list_js_1.listCommand);
|
|
106
|
+
// Unpair command
|
|
107
|
+
program
|
|
108
|
+
.command("unpair")
|
|
109
|
+
.description("Remove a paired device")
|
|
110
|
+
.argument("<device-id>", "Device ID to unpair")
|
|
111
|
+
.action(async (deviceId) => {
|
|
112
|
+
const fs = require("node:fs");
|
|
113
|
+
const path = require("node:path");
|
|
114
|
+
const devicesPath = path.join(process.env.HOME || process.env.USERPROFILE || "~", ".remotepilot", "devices.json");
|
|
115
|
+
if (!fs.existsSync(devicesPath)) {
|
|
116
|
+
console.log("No paired devices found.");
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const devices = JSON.parse(fs.readFileSync(devicesPath, "utf-8"));
|
|
120
|
+
const idx = devices.findIndex((d) => d.deviceId === deviceId);
|
|
121
|
+
if (idx === -1) {
|
|
122
|
+
console.log(`Device ${deviceId} not found.`);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
devices.splice(idx, 1);
|
|
126
|
+
fs.writeFileSync(devicesPath, JSON.stringify(devices, null, 2));
|
|
127
|
+
console.log(`Device ${deviceId} removed.`);
|
|
128
|
+
});
|
|
129
|
+
// Tunnel command - show current tunnel URL
|
|
130
|
+
program
|
|
131
|
+
.command("tunnel")
|
|
132
|
+
.description("Show Cloudflare Quick Tunnel status and URL")
|
|
133
|
+
.action(async () => {
|
|
134
|
+
const http = require("node:http");
|
|
135
|
+
const fs = require("node:fs");
|
|
136
|
+
const path = require("node:path");
|
|
137
|
+
const configPath = path.join(process.env.HOME || process.env.USERPROFILE || "~", ".remotepilot", "host.json");
|
|
138
|
+
if (!fs.existsSync(configPath)) {
|
|
139
|
+
console.error("Host not configured. Run 'remotepilot setup' first.");
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
143
|
+
try {
|
|
144
|
+
const response = await fetch(`http://127.0.0.1:${config.port + 1}/status`, {
|
|
145
|
+
headers: { Authorization: `Bearer ${config.apiToken}` }
|
|
146
|
+
});
|
|
147
|
+
const status = await response.json();
|
|
148
|
+
if (status.tunnelUrl && status.tunnelUrl !== "starting...") {
|
|
149
|
+
console.log("Cloudflare Quick Tunnel: connected");
|
|
150
|
+
console.log(` URL: ${status.tunnelUrl}`);
|
|
151
|
+
console.log("\n Scan this QR code with RemotePilot app to connect.");
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
console.log("Cloudflare Quick Tunnel: starting...");
|
|
155
|
+
console.log(" Wait a few seconds and try again.");
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
console.log("Daemon not running. Start with: remotepilot start");
|
|
160
|
+
}
|
|
161
|
+
});
|
|
63
162
|
// Update command
|
|
64
163
|
program
|
|
65
164
|
.command("update")
|
|
66
165
|
.description("Update RemotePilot to the latest version")
|
|
67
166
|
.action(update_js_1.updateCommand);
|
|
167
|
+
// --- All-in-one function ---
|
|
168
|
+
function fetchStatus(port, apiToken) {
|
|
169
|
+
return new Promise((resolve, reject) => {
|
|
170
|
+
const req = http.get(`http://127.0.0.1:${port}/status`, {
|
|
171
|
+
headers: { Authorization: `Bearer ${apiToken}` },
|
|
172
|
+
timeout: 3000
|
|
173
|
+
}, (res) => {
|
|
174
|
+
let data = "";
|
|
175
|
+
res.on("data", (chunk) => data += chunk);
|
|
176
|
+
res.on("end", () => {
|
|
177
|
+
try {
|
|
178
|
+
resolve(JSON.parse(data));
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
reject(new Error("Invalid status"));
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
req.on("error", reject);
|
|
186
|
+
req.on("timeout", () => { req.destroy(); reject(new Error("Timeout")); });
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
async function waitForTunnel(port, apiToken, maxWaitMs = 45000) {
|
|
190
|
+
const start = Date.now();
|
|
191
|
+
while (Date.now() - start < maxWaitMs) {
|
|
192
|
+
try {
|
|
193
|
+
const status = await fetchStatus(port, apiToken);
|
|
194
|
+
if (status.tunnelUrl && status.tunnelUrl !== "starting...") {
|
|
195
|
+
return status.tunnelUrl;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch { /* daemon not ready yet */ }
|
|
199
|
+
await new Promise(r => setTimeout(r, 1500));
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
async function runAllInOne(name, opts) {
|
|
204
|
+
console.log("");
|
|
205
|
+
console.log(" RemotePilot v0.2.0");
|
|
206
|
+
console.log(" ====================");
|
|
207
|
+
console.log(" One command to connect any phone to any computer\n");
|
|
208
|
+
// Step 1: Ensure host is configured
|
|
209
|
+
const { config, alreadyExisted } = await (0, setup_js_1.ensureHost)({ name, quiet: true });
|
|
210
|
+
if (!alreadyExisted) {
|
|
211
|
+
console.log(` ✓ Host configured: ${config.hostName}`);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
console.log(` ✓ Host: ${config.hostName} (${config.hostId})`);
|
|
215
|
+
}
|
|
216
|
+
// Step 2: Ensure daemon is running
|
|
217
|
+
const result = await (0, start_js_1.ensureDaemon)({ quiet: true });
|
|
218
|
+
if (result.started) {
|
|
219
|
+
console.log(` ✓ Daemon started on port ${result.port}`);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
console.log(` ✓ Daemon already running on port ${result.port}`);
|
|
223
|
+
}
|
|
224
|
+
// Step 3: Wait for Cloudflare tunnel
|
|
225
|
+
let tunnelUrl = null;
|
|
226
|
+
if (opts.tunnel !== false) {
|
|
227
|
+
process.stdout.write(" ⏳ Waiting for Cloudflare tunnel");
|
|
228
|
+
tunnelUrl = await waitForTunnel(result.port, config.apiToken || "");
|
|
229
|
+
if (tunnelUrl) {
|
|
230
|
+
console.log(`\r ✓ Tunnel ready: ${tunnelUrl} `);
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
console.log("\r ⚠ Tunnel not ready (daemon may need cloudflared installed) ");
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Step 4: Generate and display QR code
|
|
237
|
+
console.log("");
|
|
238
|
+
const pairingData = await (0, pair_js_1.generatePairingQr)({ quiet: true });
|
|
239
|
+
if (tunnelUrl)
|
|
240
|
+
pairingData.tunnelUrl = tunnelUrl;
|
|
241
|
+
await (0, pair_js_1.renderQr)(pairingData, { quiet: false });
|
|
242
|
+
console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
|
|
243
|
+
console.log(" Scan the QR code above with RemotePilot app on your phone.");
|
|
244
|
+
console.log(" Press Ctrl+C to stop.\n");
|
|
245
|
+
// Step 5: Keep alive and show status
|
|
246
|
+
if (config.apiToken) {
|
|
247
|
+
const printStatus = async () => {
|
|
248
|
+
try {
|
|
249
|
+
const status = await fetchStatus(result.port, config.apiToken);
|
|
250
|
+
const uptime = Math.floor(status.uptime / 60);
|
|
251
|
+
process.stdout.write(`\r ● Uptime: ${uptime}m | Tunnel: ${status.tunnelUrl ? "active" : "starting"} `);
|
|
252
|
+
}
|
|
253
|
+
catch { /* ignore */ }
|
|
254
|
+
};
|
|
255
|
+
const interval = setInterval(printStatus, 15000);
|
|
256
|
+
process.on("SIGINT", () => {
|
|
257
|
+
clearInterval(interval);
|
|
258
|
+
console.log("\n\n RemotePilot stopped.");
|
|
259
|
+
process.exit(0);
|
|
260
|
+
});
|
|
261
|
+
// Keep process alive
|
|
262
|
+
await new Promise(() => { });
|
|
263
|
+
}
|
|
264
|
+
}
|
|
68
265
|
// Parse arguments
|
|
69
266
|
program.parse(process.argv);
|
|
70
267
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,UAAU,WAAW;CAAG;AAUxB,wBAAsB,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAGA,UAAU,WAAW;CAAG;AAUxB,wBAAsB,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCtE"}
|
package/dist/commands/list.js
CHANGED
|
@@ -66,7 +66,6 @@ async function listCommand(_options) {
|
|
|
66
66
|
// Show options
|
|
67
67
|
console.log("Options:");
|
|
68
68
|
console.log(" remotepilot unpair <device-id> - Remove a paired device");
|
|
69
|
-
console.log(" remotepilot list --remove <id> - Remove a paired device");
|
|
70
69
|
}
|
|
71
70
|
function getPairedDevicesPath() {
|
|
72
71
|
const homeDir = process.env.HOME || process.env.USERPROFILE || "~";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,kCAqCC;AAlDD,4CAA8B;AAC9B,gDAAkC;AAY3B,KAAK,UAAU,WAAW,CAAC,QAAqB;IACrD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAG,oBAAoB,EAAE,CAAC;IAE3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAmB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAElF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,MAAM,sBAAsB,CAAC,CAAC;IAE3D,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,eAAe;IACf,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACxB,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC;IACnE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;AAC5D,CAAC"}
|
package/dist/commands/pair.d.ts
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
|
-
interface PairOptions {
|
|
1
|
+
export interface PairOptions {
|
|
2
2
|
timeout?: string;
|
|
3
|
+
quiet?: boolean;
|
|
3
4
|
}
|
|
5
|
+
export interface PairingData {
|
|
6
|
+
version: number;
|
|
7
|
+
hostId: string;
|
|
8
|
+
hostPublicKey: string;
|
|
9
|
+
hostName: string;
|
|
10
|
+
tunnelUrl?: string;
|
|
11
|
+
token: string;
|
|
12
|
+
expiresAt: number;
|
|
13
|
+
timestamp: number;
|
|
14
|
+
signature: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function generatePairingQr(options?: PairOptions): Promise<PairingData>;
|
|
17
|
+
export declare function renderQr(pairingData: PairingData, options?: PairOptions): Promise<void>;
|
|
4
18
|
export declare function pairCommand(options: PairOptions): Promise<void>;
|
|
5
|
-
export {};
|
|
6
19
|
//# sourceMappingURL=pair.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pair.d.ts","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAaD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAmBD,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CA8CvF;AAED,wBAAsB,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBjG;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCrE"}
|
package/dist/commands/pair.js
CHANGED
|
@@ -36,58 +36,105 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.generatePairingQr = generatePairingQr;
|
|
40
|
+
exports.renderQr = renderQr;
|
|
39
41
|
exports.pairCommand = pairCommand;
|
|
40
42
|
const fs = __importStar(require("node:fs"));
|
|
41
43
|
const path = __importStar(require("node:path"));
|
|
44
|
+
const http = __importStar(require("node:http"));
|
|
42
45
|
const qrcode_1 = __importDefault(require("qrcode"));
|
|
43
46
|
const crypto_1 = require("@remotepilot/crypto");
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
function fetchStatus(port, apiToken) {
|
|
48
|
+
return new Promise((resolve, reject) => {
|
|
49
|
+
const req = http.get(`http://127.0.0.1:${port}/status`, {
|
|
50
|
+
headers: { Authorization: `Bearer ${apiToken}` },
|
|
51
|
+
timeout: 3000
|
|
52
|
+
}, (res) => {
|
|
53
|
+
let data = "";
|
|
54
|
+
res.on("data", (chunk) => data += chunk);
|
|
55
|
+
res.on("end", () => {
|
|
56
|
+
try {
|
|
57
|
+
resolve(JSON.parse(data));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
reject(new Error("Invalid status response"));
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
req.on("error", reject);
|
|
65
|
+
req.on("timeout", () => { req.destroy(); reject(new Error("Timeout")); });
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async function generatePairingQr(options = {}) {
|
|
48
69
|
const configPath = getConfigPath();
|
|
49
70
|
if (!fs.existsSync(configPath)) {
|
|
50
|
-
|
|
51
|
-
process.exit(1);
|
|
71
|
+
throw new Error("Host not configured. Run 'remotepilot setup' first.");
|
|
52
72
|
}
|
|
53
73
|
const config = JSON.parse(fs.readFileSync(configPath, "utf-8"));
|
|
74
|
+
const log = options.quiet ? () => { } : console.log;
|
|
54
75
|
// Generate pairing token
|
|
55
76
|
const timeoutSeconds = parseInt(options.timeout || "300", 10);
|
|
56
77
|
const timeoutMs = timeoutSeconds * 1000;
|
|
57
78
|
const { token, hash: tokenHash, expiresAt } = (0, crypto_1.createPairingToken)(config.hostId, config.publicKey, timeoutMs);
|
|
58
|
-
|
|
59
|
-
|
|
79
|
+
// Try to get tunnel URL from daemon
|
|
80
|
+
let tunnelUrl;
|
|
81
|
+
if (config.apiToken) {
|
|
82
|
+
try {
|
|
83
|
+
const status = await fetchStatus(config.port, config.apiToken);
|
|
84
|
+
if (status.tunnelUrl && status.tunnelUrl !== "starting...") {
|
|
85
|
+
tunnelUrl = status.tunnelUrl;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Daemon may not be running yet
|
|
90
|
+
}
|
|
91
|
+
}
|
|
60
92
|
// Create pairing data
|
|
61
93
|
const pairingData = {
|
|
62
94
|
version: 1,
|
|
63
95
|
hostId: config.hostId,
|
|
64
96
|
hostPublicKey: config.publicKey,
|
|
97
|
+
hostName: config.hostName,
|
|
98
|
+
tunnelUrl,
|
|
65
99
|
token,
|
|
66
100
|
expiresAt,
|
|
67
101
|
timestamp: Date.now(),
|
|
68
102
|
signature: tokenHash
|
|
69
103
|
};
|
|
104
|
+
return pairingData;
|
|
105
|
+
}
|
|
106
|
+
async function renderQr(pairingData, options = {}) {
|
|
107
|
+
const log = options.quiet ? () => { } : console.log;
|
|
108
|
+
log(`Host: ${pairingData.hostName} (${pairingData.hostId})`);
|
|
109
|
+
if (pairingData.tunnelUrl) {
|
|
110
|
+
log(`Tunnel: ${pairingData.tunnelUrl}`);
|
|
111
|
+
}
|
|
70
112
|
// Generate QR code
|
|
71
|
-
|
|
113
|
+
log("\nGenerating QR code...\n");
|
|
72
114
|
const qrData = JSON.stringify(pairingData);
|
|
73
115
|
const qrCode = await qrcode_1.default.toString(qrData, { type: "terminal", small: true });
|
|
74
|
-
|
|
116
|
+
log(qrCode);
|
|
75
117
|
// Also show the pairing URL
|
|
76
118
|
const pairingUrl = `remotepilot://pair?data=${encodeURIComponent(qrData)}`;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
console.log(
|
|
119
|
+
log("\nOr use this pairing URL:");
|
|
120
|
+
log(pairingUrl);
|
|
121
|
+
}
|
|
122
|
+
async function pairCommand(options) {
|
|
123
|
+
console.log("RemotePilot Pairing");
|
|
124
|
+
console.log("===================\n");
|
|
125
|
+
const pairingData = await generatePairingQr(options);
|
|
126
|
+
await renderQr(pairingData, options);
|
|
127
|
+
const timeoutSeconds = parseInt(options.timeout || "300", 10);
|
|
128
|
+
const timeoutMs = timeoutSeconds * 1000;
|
|
82
129
|
// Save pairing token for validation
|
|
83
130
|
const pairingTokenPath = getPairingTokenPath();
|
|
84
131
|
fs.writeFileSync(pairingTokenPath, JSON.stringify({
|
|
85
|
-
tokenHash,
|
|
86
|
-
expiresAt,
|
|
132
|
+
tokenHash: pairingData.signature,
|
|
133
|
+
expiresAt: pairingData.expiresAt,
|
|
87
134
|
used: false
|
|
88
135
|
}));
|
|
89
|
-
|
|
90
|
-
|
|
136
|
+
console.log(`\nWaiting for Android device to scan QR code...`);
|
|
137
|
+
console.log(`Timeout in ${timeoutSeconds} seconds`);
|
|
91
138
|
let timeout;
|
|
92
139
|
const pairingPromise = new Promise((resolve) => {
|
|
93
140
|
timeout = setTimeout(() => {
|
|
@@ -95,7 +142,6 @@ async function pairCommand(options) {
|
|
|
95
142
|
resolve();
|
|
96
143
|
}, timeoutMs);
|
|
97
144
|
});
|
|
98
|
-
// Clean up on exit
|
|
99
145
|
process.on("SIGINT", () => {
|
|
100
146
|
clearTimeout(timeout);
|
|
101
147
|
console.log("\n\nPairing cancelled");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/commands/pair.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/setup.d.ts
CHANGED
|
@@ -1,8 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
import { Platform } from "@remotepilot/protocol";
|
|
2
|
+
export interface SetupOptions {
|
|
2
3
|
name?: string;
|
|
3
4
|
port?: string;
|
|
4
5
|
force?: boolean;
|
|
6
|
+
quiet?: boolean;
|
|
5
7
|
}
|
|
8
|
+
export interface HostConfig {
|
|
9
|
+
hostId: string;
|
|
10
|
+
hostName: string;
|
|
11
|
+
platform: Platform;
|
|
12
|
+
publicKey: string;
|
|
13
|
+
privateKeyPath: string;
|
|
14
|
+
port: number;
|
|
15
|
+
apiToken?: string;
|
|
16
|
+
createdAt: number;
|
|
17
|
+
}
|
|
18
|
+
export interface SetupResult {
|
|
19
|
+
config: HostConfig;
|
|
20
|
+
dataDir: string;
|
|
21
|
+
alreadyExisted: boolean;
|
|
22
|
+
}
|
|
23
|
+
export declare function ensureHost(options?: SetupOptions): Promise<SetupResult>;
|
|
6
24
|
export declare function setupCommand(options: SetupOptions): Promise<void>;
|
|
7
|
-
export {};
|
|
8
25
|
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAIjD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA8EjF;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAYvE"}
|