@yefengr/remote-pi 0.7.4 → 0.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -586
- package/dist/bin/supervisord.js +4 -5
- package/dist/bin/supervisord.js.map +1 -1
- package/dist/config.d.ts +1 -1
- package/dist/config.js +2 -2
- package/dist/daemon/cli-links.d.ts +30 -0
- package/dist/daemon/cli-links.js +134 -0
- package/dist/daemon/cli-links.js.map +1 -0
- package/dist/daemon/commands.d.ts +27 -0
- package/dist/daemon/commands.js +295 -0
- package/dist/daemon/commands.js.map +1 -0
- package/dist/daemon/control_protocol.d.ts +53 -31
- package/dist/daemon/control_protocol.js +8 -31
- package/dist/daemon/control_protocol.js.map +1 -1
- package/dist/daemon/cron_log.d.ts +2 -23
- package/dist/daemon/cron_log.js +10 -25
- package/dist/daemon/cron_log.js.map +1 -1
- package/dist/daemon/cron_registry.d.ts +3 -40
- package/dist/daemon/cron_registry.js +58 -103
- package/dist/daemon/cron_registry.js.map +1 -1
- package/dist/daemon/install-runtime.d.ts +10 -0
- package/dist/daemon/install-runtime.js +81 -0
- package/dist/daemon/install-runtime.js.map +1 -0
- package/dist/daemon/install.d.ts +3 -63
- package/dist/daemon/install.js +5 -289
- package/dist/daemon/install.js.map +1 -1
- package/dist/daemon/preflight.d.ts +51 -0
- package/dist/daemon/preflight.js +136 -0
- package/dist/daemon/preflight.js.map +1 -0
- package/dist/daemon/registry.d.ts +33 -45
- package/dist/daemon/registry.js +171 -117
- package/dist/daemon/registry.js.map +1 -1
- package/dist/daemon/rpc_child.d.ts +92 -146
- package/dist/daemon/rpc_child.js +336 -263
- package/dist/daemon/rpc_child.js.map +1 -1
- package/dist/daemon/status.d.ts +45 -0
- package/dist/daemon/status.js +87 -0
- package/dist/daemon/status.js.map +1 -0
- package/dist/daemon/supervisor-ipc.d.ts +2 -0
- package/dist/daemon/supervisor-ipc.js +20 -0
- package/dist/daemon/supervisor-ipc.js.map +1 -0
- package/dist/daemon/supervisor.d.ts +48 -71
- package/dist/daemon/supervisor.js +430 -420
- package/dist/daemon/supervisor.js.map +1 -1
- package/dist/extension_ui_bridge.d.ts +4 -3
- package/dist/extension_ui_bridge.js +10 -0
- package/dist/extension_ui_bridge.js.map +1 -1
- package/dist/index.d.ts +25 -230
- package/dist/index.js +515 -5553
- package/dist/index.js.map +1 -1
- package/dist/pairing/crypto.d.ts +8 -1
- package/dist/pairing/crypto.js +56 -6
- package/dist/pairing/crypto.js.map +1 -1
- package/dist/pairing/owner_storage.d.ts +42 -0
- package/dist/pairing/owner_storage.js +207 -0
- package/dist/pairing/owner_storage.js.map +1 -0
- package/dist/pairing/qr.d.ts +3 -42
- package/dist/pairing/qr.js +9 -59
- package/dist/pairing/qr.js.map +1 -1
- package/dist/pairing/storage.d.ts +3 -45
- package/dist/pairing/storage.js +10 -223
- package/dist/pairing/storage.js.map +1 -1
- package/dist/protocol/types.d.ts +1 -1
- package/dist/protocol/v2/schemas.d.ts +1 -1
- package/dist/protocol/v2/schemas.js +1 -1
- package/dist/protocol/v2/schemas.js.map +1 -1
- package/dist/runtime/owner_router.d.ts +16 -0
- package/dist/runtime/owner_router.js +37 -0
- package/dist/runtime/owner_router.js.map +1 -0
- package/dist/session/ipc.d.ts +1 -22
- package/dist/session/ipc.js +4 -11
- package/dist/session/ipc.js.map +1 -1
- package/dist/session/local_config.d.ts +4 -47
- package/dist/session/local_config.js +19 -101
- package/dist/session/local_config.js.map +1 -1
- package/dist/transport/peer_channel.d.ts +25 -39
- package/dist/transport/peer_channel.js +74 -131
- package/dist/transport/peer_channel.js.map +1 -1
- package/dist/transport/relay_client.d.ts +26 -70
- package/dist/transport/relay_client.js +37 -106
- package/dist/transport/relay_client.js.map +1 -1
- package/docs/daemon.md +91 -207
- package/package.json +21 -17
- package/dist/daemon/id.d.ts +0 -24
- package/dist/daemon/id.js +0 -36
- package/dist/daemon/id.js.map +0 -1
- package/dist/mcp/mesh_result.d.ts +0 -10
- package/dist/mcp/mesh_result.js +0 -42
- package/dist/mcp/mesh_result.js.map +0 -1
- package/dist/mcp/mesh_server.d.ts +0 -16
- package/dist/mcp/mesh_server.js +0 -327
- package/dist/mcp/mesh_server.js.map +0 -1
- package/dist/mesh/canonical.d.ts +0 -30
- package/dist/mesh/canonical.js +0 -61
- package/dist/mesh/canonical.js.map +0 -1
- package/dist/mesh/client.d.ts +0 -18
- package/dist/mesh/client.js +0 -125
- package/dist/mesh/client.js.map +0 -1
- package/dist/mesh/encoding.d.ts +0 -38
- package/dist/mesh/encoding.js +0 -216
- package/dist/mesh/encoding.js.map +0 -1
- package/dist/mesh/self_revoke.d.ts +0 -73
- package/dist/mesh/self_revoke.js +0 -401
- package/dist/mesh/self_revoke.js.map +0 -1
- package/dist/mesh/siblings.d.ts +0 -49
- package/dist/mesh/siblings.js +0 -159
- package/dist/mesh/siblings.js.map +0 -1
- package/dist/mesh/types.d.ts +0 -34
- package/dist/mesh/types.js +0 -11
- package/dist/mesh/types.js.map +0 -1
- package/dist/mesh/verify.d.ts +0 -17
- package/dist/mesh/verify.js +0 -86
- package/dist/mesh/verify.js.map +0 -1
- package/dist/rooms.d.ts +0 -29
- package/dist/rooms.js +0 -57
- package/dist/rooms.js.map +0 -1
- package/dist/session/bridge.d.ts +0 -37
- package/dist/session/bridge.js +0 -130
- package/dist/session/bridge.js.map +0 -1
- package/dist/session/broker.d.ts +0 -189
- package/dist/session/broker.js +0 -507
- package/dist/session/broker.js.map +0 -1
- package/dist/session/broker_remote.d.ts +0 -74
- package/dist/session/broker_remote.js +0 -583
- package/dist/session/broker_remote.js.map +0 -1
- package/dist/session/cwd_lock.d.ts +0 -33
- package/dist/session/cwd_lock.js +0 -126
- package/dist/session/cwd_lock.js.map +0 -1
- package/dist/session/envelope.d.ts +0 -33
- package/dist/session/envelope.js +0 -117
- package/dist/session/envelope.js.map +0 -1
- package/dist/session/global_config.d.ts +0 -33
- package/dist/session/global_config.js +0 -73
- package/dist/session/global_config.js.map +0 -1
- package/dist/session/leader_election.d.ts +0 -32
- package/dist/session/leader_election.js +0 -106
- package/dist/session/leader_election.js.map +0 -1
- package/dist/session/mesh_node.d.ts +0 -116
- package/dist/session/mesh_node.js +0 -573
- package/dist/session/mesh_node.js.map +0 -1
- package/dist/session/peer.d.ts +0 -139
- package/dist/session/peer.js +0 -451
- package/dist/session/peer.js.map +0 -1
- package/dist/session/peer_inventory.d.ts +0 -13
- package/dist/session/peer_inventory.js +0 -48
- package/dist/session/peer_inventory.js.map +0 -1
- package/dist/session/peer_limits.d.ts +0 -9
- package/dist/session/peer_limits.js +0 -21
- package/dist/session/peer_limits.js.map +0 -1
- package/dist/session/setup_wizard.d.ts +0 -39
- package/dist/session/setup_wizard.js +0 -63
- package/dist/session/setup_wizard.js.map +0 -1
- package/dist/session/tools.d.ts +0 -24
- package/dist/session/tools.js +0 -252
- package/dist/session/tools.js.map +0 -1
- package/dist/session/wizard.d.ts +0 -13
- package/dist/session/wizard.js +0 -20
- package/dist/session/wizard.js.map +0 -1
- package/dist/transport/pi_forward_client.d.ts +0 -29
- package/dist/transport/pi_forward_client.js +0 -62
- package/dist/transport/pi_forward_client.js.map +0 -1
- package/dist/ui/footer.d.ts +0 -32
- package/dist/ui/footer.js +0 -34
- package/dist/ui/footer.js.map +0 -1
- package/skills/agent-network/SKILL.md +0 -310
package/dist/bin/supervisord.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Once running, it:
|
|
12
12
|
* - Reads `~/.pi/remote/daemons.json`
|
|
13
|
-
* - Spawns `pi --mode rpc
|
|
13
|
+
* - Spawns configured `pi --mode rpc` children per entry
|
|
14
14
|
* - Listens on `~/.pi/remote/supervisor.sock` for CLI control requests
|
|
15
15
|
* - Restarts crashed children with exponential backoff
|
|
16
16
|
*
|
|
@@ -55,15 +55,14 @@ async function main() {
|
|
|
55
55
|
"This binary takes no arguments. Run `pi-supervisord --help`.\n");
|
|
56
56
|
process.exit(2);
|
|
57
57
|
}
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
// build; the extension is the sibling `dist/index.js`.
|
|
58
|
+
// Retained only for Supervisor constructor compatibility. Pi discovers the
|
|
59
|
+
// configured extension itself; the child process never receives `-e`.
|
|
61
60
|
const here = fileURLToPath(import.meta.url);
|
|
62
61
|
const distRoot = dirname(dirname(here)); // dist/bin → dist
|
|
63
62
|
const extensionPath = join(distRoot, "index.js");
|
|
64
63
|
const supervisor = new Supervisor({ extensionPath });
|
|
65
64
|
await supervisor.start();
|
|
66
|
-
process.stderr.write(
|
|
65
|
+
process.stderr.write("[pi-supervisord] up — UDS: ~/.pi/remote/supervisor.sock\n");
|
|
67
66
|
const shutdown = async (signal) => {
|
|
68
67
|
process.stderr.write(`[pi-supervisord] received ${signal}, shutting down\n`);
|
|
69
68
|
await supervisor.stop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisord.js","sourceRoot":"","sources":["../../src/bin/supervisord.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAEpF,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;CAgBjB,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,kEAAkE;IAClE,uEAAuE;IACvE,mEAAmE;IACnE,sCAAsC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2CAA2C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI;YAC7D,gEAAgE,CACjE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"supervisord.js","sourceRoot":"","sources":["../../src/bin/supervisord.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAEpF,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;CAgBjB,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,kEAAkE;IAClE,uEAAuE;IACvE,mEAAmE;IACnE,sCAAsC;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2CAA2C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI;YAC7D,gEAAgE,CACjE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,2EAA2E;IAC3E,sEAAsE;IACtE,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,kBAAkB;IAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IACrD,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2DAA2D,CAC5D,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;QACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,MAAM,mBAAmB,CAAC,CAAC;QAC7E,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,yEAAyE;IACzE,0EAA0E;IAC1E,sEAAsE;IACtE,IAAI,GAAG,YAAY,6BAA6B,EAAE,CAAC;QACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -39,7 +39,7 @@ export declare function isWebSocketScheme(url: string): boolean;
|
|
|
39
39
|
/**
|
|
40
40
|
* Converts an http(s):// URL to the corresponding ws(s):// form. Used by
|
|
41
41
|
* the transport layer right before opening the WebSocket — config storage
|
|
42
|
-
* and the
|
|
42
|
+
* and the Relay client both stay on http(s)://.
|
|
43
43
|
*
|
|
44
44
|
* https://host → wss://host
|
|
45
45
|
* http://host → ws://host
|
package/dist/config.js
CHANGED
|
@@ -8,7 +8,7 @@ const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
|
|
|
8
8
|
* to ws(s):// happens at the transport layer (see `toWebSocketUrl`). The
|
|
9
9
|
* community relay's reverse proxy maps `:443 → :3000` (the WS port), so the
|
|
10
10
|
* URL has no explicit port and the WebSocket upgrade rides on the same TLS
|
|
11
|
-
* connection as the HTTPS
|
|
11
|
+
* connection as the HTTPS endpoint used by the Relay client.
|
|
12
12
|
*/
|
|
13
13
|
const kLegacyDefaultRelayUrl = "https://relay-rp1.jacobmoura.work";
|
|
14
14
|
export const kDefaultRelayUrl = "https://relay-pi.yefengr.cn";
|
|
@@ -87,7 +87,7 @@ export function isWebSocketScheme(url) {
|
|
|
87
87
|
/**
|
|
88
88
|
* Converts an http(s):// URL to the corresponding ws(s):// form. Used by
|
|
89
89
|
* the transport layer right before opening the WebSocket — config storage
|
|
90
|
-
* and the
|
|
90
|
+
* and the Relay client both stay on http(s)://.
|
|
91
91
|
*
|
|
92
92
|
* https://host → wss://host
|
|
93
93
|
* http://host → ws://host
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface LinkBinariesResult {
|
|
2
|
+
binDir: string;
|
|
3
|
+
links: Array<{
|
|
4
|
+
name: string;
|
|
5
|
+
path: string;
|
|
6
|
+
target: string;
|
|
7
|
+
}>;
|
|
8
|
+
onPath: boolean;
|
|
9
|
+
log: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function userLocalBinDir(home?: string): string;
|
|
12
|
+
export declare function isOnPath(dir: string, envPath?: string): boolean;
|
|
13
|
+
export declare function linkCliBinaries(home?: string, paths?: {
|
|
14
|
+
remotePi?: string;
|
|
15
|
+
supervisord?: string;
|
|
16
|
+
}, opts?: {
|
|
17
|
+
node?: string;
|
|
18
|
+
mutatePath?: boolean;
|
|
19
|
+
}): LinkBinariesResult;
|
|
20
|
+
export declare function buildCmdShim(node: string, target: string): string;
|
|
21
|
+
export interface UnlinkBinariesResult {
|
|
22
|
+
binDir: string;
|
|
23
|
+
removed: Array<{
|
|
24
|
+
name: string;
|
|
25
|
+
path: string;
|
|
26
|
+
existed: boolean;
|
|
27
|
+
}>;
|
|
28
|
+
log: string[];
|
|
29
|
+
}
|
|
30
|
+
export declare function unlinkCliBinaries(home?: string): UnlinkBinariesResult;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { delimiter, join } from "node:path";
|
|
2
|
+
import { chmodSync, existsSync, lstatSync, mkdirSync, readlinkSync, symlinkSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { execFileSync } from "node:child_process";
|
|
4
|
+
import { homedir, platform } from "node:os";
|
|
5
|
+
import { findNodeBinary, findRemotePiScript, findSupervisorScript } from "./install.js";
|
|
6
|
+
export function userLocalBinDir(home = homedir()) {
|
|
7
|
+
return join(home, ".local", "bin");
|
|
8
|
+
}
|
|
9
|
+
export function isOnPath(dir, envPath = process.env["PATH"] ?? "") {
|
|
10
|
+
const target = dir.replace(/\/+$/, "");
|
|
11
|
+
return envPath.split(delimiter).some((entry) => entry.replace(/\/+$/, "") === target);
|
|
12
|
+
}
|
|
13
|
+
export function linkCliBinaries(home = homedir(), paths = {}, opts = {}) {
|
|
14
|
+
const binDir = userLocalBinDir(home);
|
|
15
|
+
if (platform() === "win32")
|
|
16
|
+
return linkCliBinariesWindows(binDir, paths, opts);
|
|
17
|
+
const log = [];
|
|
18
|
+
mkdirSync(binDir, { recursive: true });
|
|
19
|
+
log.push(`ensured ${binDir}`);
|
|
20
|
+
const remotePi = paths.remotePi ?? findRemotePiScript();
|
|
21
|
+
const supervisord = paths.supervisord ?? findSupervisorScript();
|
|
22
|
+
assertScriptsExist(remotePi, supervisord);
|
|
23
|
+
try {
|
|
24
|
+
chmodSync(remotePi, 0o755);
|
|
25
|
+
}
|
|
26
|
+
catch { /* best-effort */ }
|
|
27
|
+
try {
|
|
28
|
+
chmodSync(supervisord, 0o755);
|
|
29
|
+
}
|
|
30
|
+
catch { /* best-effort */ }
|
|
31
|
+
const links = [
|
|
32
|
+
{ name: "remote-pi", path: join(binDir, "remote-pi"), target: remotePi },
|
|
33
|
+
{ name: "pi-supervisord", path: join(binDir, "pi-supervisord"), target: supervisord },
|
|
34
|
+
];
|
|
35
|
+
for (const link of links)
|
|
36
|
+
replaceSymlink(link.path, link.target, log);
|
|
37
|
+
const onPath = isOnPath(binDir);
|
|
38
|
+
if (!onPath)
|
|
39
|
+
log.push(`WARNING: ${binDir} is not on $PATH. Add this line to your shell rc: export PATH="$HOME/.local/bin:$PATH"`);
|
|
40
|
+
return { binDir, links, onPath, log };
|
|
41
|
+
}
|
|
42
|
+
function assertScriptsExist(remotePi, supervisord) {
|
|
43
|
+
if (!existsSync(remotePi))
|
|
44
|
+
throw new Error(`remote-pi script not found at ${remotePi}. Run \`pnpm build\` (dev) or reinstall the extension.`);
|
|
45
|
+
if (!existsSync(supervisord))
|
|
46
|
+
throw new Error(`supervisor script not found at ${supervisord}. Run \`pnpm build\` (dev) or reinstall the extension.`);
|
|
47
|
+
}
|
|
48
|
+
function linkCliBinariesWindows(binDir, paths, opts) {
|
|
49
|
+
const log = [];
|
|
50
|
+
mkdirSync(binDir, { recursive: true });
|
|
51
|
+
log.push(`ensured ${binDir}`);
|
|
52
|
+
const node = opts.node ?? findNodeBinary();
|
|
53
|
+
const remotePi = paths.remotePi ?? findRemotePiScript();
|
|
54
|
+
const supervisord = paths.supervisord ?? findSupervisorScript();
|
|
55
|
+
assertScriptsExist(remotePi, supervisord);
|
|
56
|
+
const links = [
|
|
57
|
+
{ name: "remote-pi.cmd", path: join(binDir, "remote-pi.cmd"), target: remotePi },
|
|
58
|
+
{ name: "pi-supervisord.cmd", path: join(binDir, "pi-supervisord.cmd"), target: supervisord },
|
|
59
|
+
];
|
|
60
|
+
for (const link of links) {
|
|
61
|
+
writeFileSync(link.path, buildCmdShim(node, link.target));
|
|
62
|
+
log.push(`wrote ${link.path}`);
|
|
63
|
+
}
|
|
64
|
+
const onPath = isOnPath(binDir);
|
|
65
|
+
if (!onPath && opts.mutatePath !== false) {
|
|
66
|
+
try {
|
|
67
|
+
addUserPath(binDir);
|
|
68
|
+
log.push(`added ${binDir} to your user PATH — open a NEW terminal for \`remote-pi\` to resolve.`);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
log.push(`WARNING: ${binDir} is not on PATH and auto-add failed (${String(error)}). Add it manually: setx PATH "%PATH%;${binDir}"`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { binDir, links, onPath, log };
|
|
75
|
+
}
|
|
76
|
+
export function buildCmdShim(node, target) {
|
|
77
|
+
return `@echo off\r\n"${node}" "${target}" %*\r\n`;
|
|
78
|
+
}
|
|
79
|
+
function addUserPath(dir) {
|
|
80
|
+
const literal = `'${dir.replace(/'/g, "''")}'`;
|
|
81
|
+
execFileSync("powershell", [
|
|
82
|
+
"-NoProfile", "-NonInteractive", "-Command",
|
|
83
|
+
`$d = ${literal}; ` +
|
|
84
|
+
"$p = [Environment]::GetEnvironmentVariable('Path','User'); " +
|
|
85
|
+
"if (-not $p) { $p = '' }; " +
|
|
86
|
+
"$parts = $p.Split(';') | Where-Object { $_ -ne '' }; " +
|
|
87
|
+
"if ($parts -notcontains $d) { [Environment]::SetEnvironmentVariable('Path', (($parts + $d) -join ';'), 'User') }",
|
|
88
|
+
], { stdio: ["ignore", "pipe", "pipe"] });
|
|
89
|
+
}
|
|
90
|
+
export function unlinkCliBinaries(home = homedir()) {
|
|
91
|
+
const binDir = userLocalBinDir(home);
|
|
92
|
+
const log = [];
|
|
93
|
+
const names = platform() === "win32" ? ["remote-pi.cmd", "pi-supervisord.cmd"] : ["remote-pi", "pi-supervisord"];
|
|
94
|
+
const removed = [];
|
|
95
|
+
for (const name of names) {
|
|
96
|
+
const path = join(binDir, name);
|
|
97
|
+
let existed = false;
|
|
98
|
+
try {
|
|
99
|
+
lstatSync(path);
|
|
100
|
+
existed = true;
|
|
101
|
+
}
|
|
102
|
+
catch { /* absent */ }
|
|
103
|
+
if (existed) {
|
|
104
|
+
try {
|
|
105
|
+
unlinkSync(path);
|
|
106
|
+
log.push(`removed ${path}`);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
log.push(`failed to remove ${path}: ${String(error)}`);
|
|
110
|
+
existed = false;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
removed.push({ name, path, existed });
|
|
114
|
+
}
|
|
115
|
+
return { binDir, removed, log };
|
|
116
|
+
}
|
|
117
|
+
function replaceSymlink(linkPath, target, log) {
|
|
118
|
+
let existing = null;
|
|
119
|
+
try {
|
|
120
|
+
existing = readlinkSync(linkPath);
|
|
121
|
+
}
|
|
122
|
+
catch { /* not a symlink */ }
|
|
123
|
+
if (existing === target) {
|
|
124
|
+
log.push(`symlink ${linkPath} → ${target} (unchanged)`);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
unlinkSync(linkPath);
|
|
129
|
+
}
|
|
130
|
+
catch { /* absent */ }
|
|
131
|
+
symlinkSync(target, linkPath);
|
|
132
|
+
log.push(`symlink ${linkPath} → ${target}`);
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=cli-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-links.js","sourceRoot":"","sources":["../../src/daemon/cli-links.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type Ed25519Keypair } from "../pairing/crypto.js";
|
|
3
|
+
type CommandStartContext = Pick<ExtensionContext, "ui" | "cwd">;
|
|
4
|
+
export interface RemoteCommandDependencies {
|
|
5
|
+
start(ctx: CommandStartContext): Promise<void>;
|
|
6
|
+
stop(): void;
|
|
7
|
+
state(): "idle" | "started";
|
|
8
|
+
relayStatus(): string;
|
|
9
|
+
relayUrl(): string | null;
|
|
10
|
+
endpointIdentity(): Readonly<{
|
|
11
|
+
endpointId: string;
|
|
12
|
+
runtimeInstanceId: string;
|
|
13
|
+
}>;
|
|
14
|
+
activeOwnerCount(): number;
|
|
15
|
+
isOwnerActive(ownerId: string): boolean;
|
|
16
|
+
detachOwner(ownerId: string): void;
|
|
17
|
+
updateEndpoint(): Promise<void>;
|
|
18
|
+
displayName(cwd?: string): string;
|
|
19
|
+
keypair(): Ed25519Keypair | null;
|
|
20
|
+
hasRelay(): boolean;
|
|
21
|
+
piApi(): ExtensionAPI | null;
|
|
22
|
+
setCommandContext(ctx: ExtensionCommandContext): void;
|
|
23
|
+
}
|
|
24
|
+
export declare function persistModelDefault(provider: string, modelId: string): void;
|
|
25
|
+
export declare function registerCommands(pi: ExtensionAPI, deps: RemoteCommandDependencies): void;
|
|
26
|
+
export declare function runDirectCli(deps: RemoteCommandDependencies, directRun: boolean): void;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { canonicalizeEd25519PublicKey } from "../pairing/crypto.js";
|
|
5
|
+
import { buildQRUri, clampPairTtlMs, qrSession, renderQRAscii, TOKEN_TTL_MS } from "../pairing/qr.js";
|
|
6
|
+
import { listPeers, removePeer } from "../pairing/storage.js";
|
|
7
|
+
import { isValidRelayUrl, isWebSocketScheme, resolveRelayUrl, saveConfig } from "../config.js";
|
|
8
|
+
import { addDaemon, findDaemonByCwd, listDaemons, removeDaemon } from "./registry.js";
|
|
9
|
+
import { callSupervisor, supervisorOnline, SupervisorOfflineError } from "./client.js";
|
|
10
|
+
import { installService, uninstallService, linkCliBinaries, unlinkCliBinaries, LAUNCHD_LABEL, SYSTEMD_UNIT, } from "./install.js";
|
|
11
|
+
function notify(ctx, text, kind = "info") {
|
|
12
|
+
try {
|
|
13
|
+
ctx.ui.notify(text, kind);
|
|
14
|
+
}
|
|
15
|
+
catch { /* headless/stale context */ }
|
|
16
|
+
}
|
|
17
|
+
async function pair(ctx, args, deps) {
|
|
18
|
+
if (deps.state() === "idle")
|
|
19
|
+
await deps.start(ctx);
|
|
20
|
+
const keypair = deps.keypair();
|
|
21
|
+
if (!deps.hasRelay() || !keypair) {
|
|
22
|
+
notify(ctx, "[remote-pi] Pair requires a Relay connection.", "warning");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const ttl = /--ttl\s+(\d+)/.exec(args);
|
|
26
|
+
const ttlMs = ttl ? clampPairTtlMs(Number(ttl[1]) * 1_000) : TOKEN_TTL_MS;
|
|
27
|
+
const issued = qrSession.issueToken(ttlMs);
|
|
28
|
+
const identity = deps.endpointIdentity();
|
|
29
|
+
const uri = buildQRUri(issued.token, keypair.publicKey, deps.displayName(ctx.cwd), identity.endpointId, identity.runtimeInstanceId);
|
|
30
|
+
try {
|
|
31
|
+
deps.piApi()?.sendMessage({
|
|
32
|
+
customType: "remote-pi:pair-code",
|
|
33
|
+
content: `Scan to pair:\n\n${renderQRAscii(uri)}\n\n${uri}`,
|
|
34
|
+
details: { uri, token: issued.token, expiresAt: issued.expiresAt, endpointId: identity.endpointId, name: deps.displayName(ctx.cwd) },
|
|
35
|
+
display: true,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch { /* headless pairing still has a status message */ }
|
|
39
|
+
notify(ctx, `[remote-pi] QR ready until ${new Date(issued.expiresAt).toLocaleTimeString()}.`);
|
|
40
|
+
}
|
|
41
|
+
async function listDevices(ctx, deps) {
|
|
42
|
+
const peers = await listPeers();
|
|
43
|
+
if (!peers.length) {
|
|
44
|
+
notify(ctx, "[remote-pi] No paired devices.");
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
notify(ctx, `[remote-pi] Paired devices:\n${peers.map((peer) => `• ${peer.remote_epk.slice(0, 8)} — ${peer.name}${deps.isOwnerActive(peer.remote_epk) ? " 🟢 online" : ""}`).join("\n")}`);
|
|
48
|
+
}
|
|
49
|
+
async function revoke(args, ctx, deps) {
|
|
50
|
+
const shortId = args.trim();
|
|
51
|
+
if (!shortId) {
|
|
52
|
+
notify(ctx, "[remote-pi] Usage: /remote-pi revoke <shortid>", "warning");
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const matches = (await listPeers()).filter((peer) => peer.remote_epk.startsWith(shortId));
|
|
56
|
+
if (matches.length !== 1) {
|
|
57
|
+
notify(ctx, matches.length ? "[remote-pi] Ambiguous owner id." : "[remote-pi] No matching paired device.", "warning");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const peer = matches[0];
|
|
61
|
+
await removePeer(peer.remote_epk);
|
|
62
|
+
try {
|
|
63
|
+
deps.detachOwner(canonicalizeEd25519PublicKey(peer.remote_epk, "Owner public key"));
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
deps.detachOwner(peer.remote_epk);
|
|
67
|
+
}
|
|
68
|
+
await deps.updateEndpoint();
|
|
69
|
+
notify(ctx, `[remote-pi] Revoked: ${peer.name}`);
|
|
70
|
+
}
|
|
71
|
+
function status(ctx, deps) {
|
|
72
|
+
const url = deps.relayUrl() ?? resolveRelayUrl().url;
|
|
73
|
+
const identity = deps.endpointIdentity();
|
|
74
|
+
const detail = deps.state() === "idle"
|
|
75
|
+
? "off"
|
|
76
|
+
: `${deps.relayStatus()}, endpoint=${identity.endpointId}, runtime=${identity.runtimeInstanceId}, owners=${deps.activeOwnerCount()}`;
|
|
77
|
+
notify(ctx, `[remote-pi] Relay ${detail} (${url})`);
|
|
78
|
+
}
|
|
79
|
+
function setRelay(value, ctx) {
|
|
80
|
+
const url = value.trim();
|
|
81
|
+
if (isWebSocketScheme(url)) {
|
|
82
|
+
notify(ctx, "[remote-pi] Use http:// or https://; it is converted internally.", "warning");
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (!isValidRelayUrl(url)) {
|
|
86
|
+
notify(ctx, "[remote-pi] Invalid Relay URL.", "warning");
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
saveConfig({ relay: url });
|
|
90
|
+
notify(ctx, `[remote-pi] Relay set to ${url}.`);
|
|
91
|
+
}
|
|
92
|
+
export function persistModelDefault(provider, modelId) {
|
|
93
|
+
try {
|
|
94
|
+
const path = join(process.cwd(), ".pi", "settings.json");
|
|
95
|
+
let config = {};
|
|
96
|
+
try {
|
|
97
|
+
config = JSON.parse(readFileSync(path, "utf8"));
|
|
98
|
+
}
|
|
99
|
+
catch { /* fresh file */ }
|
|
100
|
+
config.defaultProvider = provider;
|
|
101
|
+
config.defaultModel = modelId;
|
|
102
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
103
|
+
writeFileSync(path, JSON.stringify(config, null, 2));
|
|
104
|
+
}
|
|
105
|
+
catch { /* a live model switch must not fail because persistence failed */ }
|
|
106
|
+
}
|
|
107
|
+
function daemonLines(daemons) {
|
|
108
|
+
return daemons.map((daemon) => `${daemon.id.slice(0, 8)} ${daemon.name} ${daemon.health} ${daemon.relay}`).join("\n") || "(none)";
|
|
109
|
+
}
|
|
110
|
+
async function daemonList(ctx) {
|
|
111
|
+
if (await supervisorOnline()) {
|
|
112
|
+
const data = await callSupervisor({ op: "list" });
|
|
113
|
+
notify(ctx, `[remote-pi] Daemons:\n${daemonLines(data.daemons)}`);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const entries = listDaemons();
|
|
117
|
+
notify(ctx, `[remote-pi] Daemons (supervisor offline):\n${entries.map((entry) => `${entry.id.slice(0, 8)} ${entry.name} ${entry.desired_state}`).join("\n") || "(none)"}`);
|
|
118
|
+
}
|
|
119
|
+
async function daemonControl(op, id, ctx) {
|
|
120
|
+
const data = await callSupervisor(id ? { op, id } : { op: `${op}_all` });
|
|
121
|
+
notify(ctx, `[remote-pi] ${op}: ${JSON.stringify(data)}`);
|
|
122
|
+
}
|
|
123
|
+
async function daemonCreate(arg, ctx) {
|
|
124
|
+
const cwd = arg.trim() || process.cwd();
|
|
125
|
+
const entry = addDaemon(cwd);
|
|
126
|
+
try {
|
|
127
|
+
await callSupervisor({ op: "start", id: entry.id });
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
if (!(error instanceof SupervisorOfflineError))
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
notify(ctx, `[remote-pi] Registered daemon ${entry.id} for ${entry.cwd}.`);
|
|
134
|
+
}
|
|
135
|
+
async function daemonRemove(arg, ctx) {
|
|
136
|
+
const id = arg.trim();
|
|
137
|
+
if (!id) {
|
|
138
|
+
notify(ctx, "[remote-pi] Usage: remove <daemon-id>", "warning");
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const removed = await supervisorOnline() ? await callSupervisor({ op: "unregister", id }) : removeDaemon(id);
|
|
142
|
+
notify(ctx, removed.removed ? "[remote-pi] Daemon removed." : "[remote-pi] No daemon matched.", removed.removed ? "info" : "warning");
|
|
143
|
+
}
|
|
144
|
+
async function daemonRemoveCwd(cwd, ctx) {
|
|
145
|
+
const target = cwd.trim() || process.cwd();
|
|
146
|
+
const removed = await supervisorOnline()
|
|
147
|
+
? await callSupervisor({ op: "unregister_cwd", cwd: target })
|
|
148
|
+
: (() => { const entry = findDaemonByCwd(target); return entry ? removeDaemon(entry.id) : { removed: false }; })();
|
|
149
|
+
notify(ctx, removed.removed ? "[remote-pi] Daemon removed." : "[remote-pi] No daemon matched.", removed.removed ? "info" : "warning");
|
|
150
|
+
}
|
|
151
|
+
function install(ctx) {
|
|
152
|
+
try {
|
|
153
|
+
installService();
|
|
154
|
+
linkCliBinaries();
|
|
155
|
+
notify(ctx, "[remote-pi] Supervisor service installed.");
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
notify(ctx, `[remote-pi] install failed: ${String(error)}`, "error");
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function uninstall(ctx) {
|
|
162
|
+
try {
|
|
163
|
+
uninstallService();
|
|
164
|
+
unlinkCliBinaries();
|
|
165
|
+
notify(ctx, "[remote-pi] Supervisor service removed.");
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
notify(ctx, `[remote-pi] uninstall failed: ${String(error)}`, "error");
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async function command(args, ctx, deps) {
|
|
172
|
+
deps.setCommandContext(ctx);
|
|
173
|
+
const [verb, ...rest] = args.trim().split(/\s+/);
|
|
174
|
+
const value = rest.join(" ");
|
|
175
|
+
try {
|
|
176
|
+
switch (verb || "start") {
|
|
177
|
+
case "start":
|
|
178
|
+
await deps.start(ctx);
|
|
179
|
+
return;
|
|
180
|
+
case "stop":
|
|
181
|
+
deps.stop();
|
|
182
|
+
notify(ctx, "[remote-pi] Stopped.");
|
|
183
|
+
return;
|
|
184
|
+
case "status":
|
|
185
|
+
status(ctx, deps);
|
|
186
|
+
return;
|
|
187
|
+
case "pair":
|
|
188
|
+
await pair(ctx, value, deps);
|
|
189
|
+
return;
|
|
190
|
+
case "devices":
|
|
191
|
+
await listDevices(ctx, deps);
|
|
192
|
+
return;
|
|
193
|
+
case "revoke":
|
|
194
|
+
await revoke(value, ctx, deps);
|
|
195
|
+
return;
|
|
196
|
+
case "set-relay":
|
|
197
|
+
setRelay(value, ctx);
|
|
198
|
+
return;
|
|
199
|
+
case "config":
|
|
200
|
+
notify(ctx, `[remote-pi] ${resolveRelayUrl().url}`);
|
|
201
|
+
return;
|
|
202
|
+
case "daemons":
|
|
203
|
+
await daemonList(ctx);
|
|
204
|
+
return;
|
|
205
|
+
case "create":
|
|
206
|
+
await daemonCreate(value, ctx);
|
|
207
|
+
return;
|
|
208
|
+
case "remove":
|
|
209
|
+
await daemonRemove(value, ctx);
|
|
210
|
+
return;
|
|
211
|
+
case "remove-cwd":
|
|
212
|
+
await daemonRemoveCwd(value, ctx);
|
|
213
|
+
return;
|
|
214
|
+
case "install":
|
|
215
|
+
install(ctx);
|
|
216
|
+
return;
|
|
217
|
+
case "uninstall":
|
|
218
|
+
uninstall(ctx);
|
|
219
|
+
return;
|
|
220
|
+
case "daemon": {
|
|
221
|
+
const [operation, id] = value.split(/\s+/, 2);
|
|
222
|
+
if (operation === "start" || operation === "stop" || operation === "restart")
|
|
223
|
+
await daemonControl(operation, id, ctx);
|
|
224
|
+
else if (operation === "status")
|
|
225
|
+
await daemonList(ctx);
|
|
226
|
+
else
|
|
227
|
+
notify(ctx, "[remote-pi] Usage: daemon <start|stop|restart|status> [id]", "warning");
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
default:
|
|
231
|
+
await deps.start(ctx);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
notify(ctx, `[remote-pi] ${verb} failed: ${String(error)}`, "error");
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
export function registerCommands(pi, deps) {
|
|
240
|
+
const handler = (args, ctx) => command(args, ctx, deps);
|
|
241
|
+
pi.registerCommand("remote-pi", { description: "Connect this Pi endpoint to Remote Pi", handler });
|
|
242
|
+
pi.registerCommand("remote-pi start", { description: "Connect this endpoint to Relay", handler: async (_, ctx) => handler("start", ctx) });
|
|
243
|
+
pi.registerCommand("remote-pi stop", { description: "Disconnect this endpoint", handler: async (_, ctx) => handler("stop", ctx) });
|
|
244
|
+
pi.registerCommand("remote-pi pair", { description: "Show an endpoint pairing QR", handler: async (args, ctx) => handler(`pair ${args}`, ctx) });
|
|
245
|
+
pi.registerCommand("remote-pi devices", { description: "List locally paired Owners", handler: async (_, ctx) => handler("devices", ctx) });
|
|
246
|
+
pi.registerCommand("remote-pi revoke", { description: "Revoke a locally paired Owner", handler: async (args, ctx) => handler(`revoke ${args}`, ctx) });
|
|
247
|
+
pi.registerCommand("remote-pi remove-cwd", { description: "Unregister the daemon for a cwd", handler: async (args, ctx) => handler(`remove-cwd ${args}`, ctx) });
|
|
248
|
+
pi.registerCommand("remote-pi set-relay", { description: "Set Relay URL", handler: async (args, ctx) => handler(`set-relay ${args}`, ctx) });
|
|
249
|
+
}
|
|
250
|
+
function directCliContext() {
|
|
251
|
+
return { ui: { notify: (message) => console.log(message) } };
|
|
252
|
+
}
|
|
253
|
+
export function runDirectCli(deps, directRun) {
|
|
254
|
+
if (!directRun)
|
|
255
|
+
return;
|
|
256
|
+
const [, , commandName, ...args] = process.argv;
|
|
257
|
+
const ctx = directCliContext();
|
|
258
|
+
if (commandName === "devices" || commandName === "list")
|
|
259
|
+
void listDevices(ctx, deps);
|
|
260
|
+
else if (commandName === "revoke")
|
|
261
|
+
void revoke(args[0] ?? "", ctx, deps);
|
|
262
|
+
else if (commandName === "set-relay")
|
|
263
|
+
setRelay(args[0] ?? "", ctx);
|
|
264
|
+
else if (commandName === "daemons")
|
|
265
|
+
void daemonList(ctx);
|
|
266
|
+
else if (commandName === "daemon" && ["start", "stop", "restart"].includes(args[0] ?? ""))
|
|
267
|
+
void daemonControl(args[0], args[1], ctx);
|
|
268
|
+
else if (commandName === "create")
|
|
269
|
+
void daemonCreate(args.join(" "), ctx);
|
|
270
|
+
else if (commandName === "remove")
|
|
271
|
+
void daemonRemove(args[0] ?? "", ctx);
|
|
272
|
+
else if (commandName === "remove-cwd")
|
|
273
|
+
void daemonRemoveCwd(args.join(" "), ctx);
|
|
274
|
+
else if (commandName === "install")
|
|
275
|
+
install(ctx);
|
|
276
|
+
else if (commandName === "uninstall")
|
|
277
|
+
uninstall(ctx);
|
|
278
|
+
else if (commandName === "restart-supervisor")
|
|
279
|
+
restartSupervisor();
|
|
280
|
+
else
|
|
281
|
+
console.log("Usage: remote-pi <devices|revoke|set-relay|daemons|daemon|create|remove|remove-cwd|install|uninstall>");
|
|
282
|
+
}
|
|
283
|
+
function restartSupervisor() {
|
|
284
|
+
const uid = process.getuid?.() ?? 0;
|
|
285
|
+
const step = process.platform === "darwin"
|
|
286
|
+
? ["launchctl", ["kickstart", "-k", `gui/${uid}/${LAUNCHD_LABEL}`]]
|
|
287
|
+
: process.platform === "linux"
|
|
288
|
+
? ["systemctl", ["--user", "restart", SYSTEMD_UNIT]]
|
|
289
|
+
: null;
|
|
290
|
+
if (!step)
|
|
291
|
+
process.exitCode = 1;
|
|
292
|
+
else
|
|
293
|
+
spawnSync(step[0], step[1], { stdio: "inherit" });
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/daemon/commands.ts"],"names":[],"mappings":"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"}
|