@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.
Files changed (165) hide show
  1. package/README.md +81 -586
  2. package/dist/bin/supervisord.js +4 -5
  3. package/dist/bin/supervisord.js.map +1 -1
  4. package/dist/config.d.ts +1 -1
  5. package/dist/config.js +2 -2
  6. package/dist/daemon/cli-links.d.ts +30 -0
  7. package/dist/daemon/cli-links.js +134 -0
  8. package/dist/daemon/cli-links.js.map +1 -0
  9. package/dist/daemon/commands.d.ts +27 -0
  10. package/dist/daemon/commands.js +295 -0
  11. package/dist/daemon/commands.js.map +1 -0
  12. package/dist/daemon/control_protocol.d.ts +53 -31
  13. package/dist/daemon/control_protocol.js +8 -31
  14. package/dist/daemon/control_protocol.js.map +1 -1
  15. package/dist/daemon/cron_log.d.ts +2 -23
  16. package/dist/daemon/cron_log.js +10 -25
  17. package/dist/daemon/cron_log.js.map +1 -1
  18. package/dist/daemon/cron_registry.d.ts +3 -40
  19. package/dist/daemon/cron_registry.js +58 -103
  20. package/dist/daemon/cron_registry.js.map +1 -1
  21. package/dist/daemon/install-runtime.d.ts +10 -0
  22. package/dist/daemon/install-runtime.js +81 -0
  23. package/dist/daemon/install-runtime.js.map +1 -0
  24. package/dist/daemon/install.d.ts +3 -63
  25. package/dist/daemon/install.js +5 -289
  26. package/dist/daemon/install.js.map +1 -1
  27. package/dist/daemon/preflight.d.ts +51 -0
  28. package/dist/daemon/preflight.js +136 -0
  29. package/dist/daemon/preflight.js.map +1 -0
  30. package/dist/daemon/registry.d.ts +33 -45
  31. package/dist/daemon/registry.js +171 -117
  32. package/dist/daemon/registry.js.map +1 -1
  33. package/dist/daemon/rpc_child.d.ts +92 -146
  34. package/dist/daemon/rpc_child.js +336 -263
  35. package/dist/daemon/rpc_child.js.map +1 -1
  36. package/dist/daemon/status.d.ts +45 -0
  37. package/dist/daemon/status.js +87 -0
  38. package/dist/daemon/status.js.map +1 -0
  39. package/dist/daemon/supervisor-ipc.d.ts +2 -0
  40. package/dist/daemon/supervisor-ipc.js +20 -0
  41. package/dist/daemon/supervisor-ipc.js.map +1 -0
  42. package/dist/daemon/supervisor.d.ts +48 -71
  43. package/dist/daemon/supervisor.js +430 -420
  44. package/dist/daemon/supervisor.js.map +1 -1
  45. package/dist/extension_ui_bridge.d.ts +4 -3
  46. package/dist/extension_ui_bridge.js +10 -0
  47. package/dist/extension_ui_bridge.js.map +1 -1
  48. package/dist/index.d.ts +25 -230
  49. package/dist/index.js +515 -5553
  50. package/dist/index.js.map +1 -1
  51. package/dist/pairing/crypto.d.ts +8 -1
  52. package/dist/pairing/crypto.js +56 -6
  53. package/dist/pairing/crypto.js.map +1 -1
  54. package/dist/pairing/owner_storage.d.ts +42 -0
  55. package/dist/pairing/owner_storage.js +207 -0
  56. package/dist/pairing/owner_storage.js.map +1 -0
  57. package/dist/pairing/qr.d.ts +3 -42
  58. package/dist/pairing/qr.js +9 -59
  59. package/dist/pairing/qr.js.map +1 -1
  60. package/dist/pairing/storage.d.ts +3 -45
  61. package/dist/pairing/storage.js +10 -223
  62. package/dist/pairing/storage.js.map +1 -1
  63. package/dist/protocol/types.d.ts +1 -1
  64. package/dist/protocol/v2/schemas.d.ts +1 -1
  65. package/dist/protocol/v2/schemas.js +1 -1
  66. package/dist/protocol/v2/schemas.js.map +1 -1
  67. package/dist/runtime/owner_router.d.ts +16 -0
  68. package/dist/runtime/owner_router.js +37 -0
  69. package/dist/runtime/owner_router.js.map +1 -0
  70. package/dist/session/ipc.d.ts +1 -22
  71. package/dist/session/ipc.js +4 -11
  72. package/dist/session/ipc.js.map +1 -1
  73. package/dist/session/local_config.d.ts +4 -47
  74. package/dist/session/local_config.js +19 -101
  75. package/dist/session/local_config.js.map +1 -1
  76. package/dist/transport/peer_channel.d.ts +25 -39
  77. package/dist/transport/peer_channel.js +74 -131
  78. package/dist/transport/peer_channel.js.map +1 -1
  79. package/dist/transport/relay_client.d.ts +26 -70
  80. package/dist/transport/relay_client.js +37 -106
  81. package/dist/transport/relay_client.js.map +1 -1
  82. package/docs/daemon.md +91 -207
  83. package/package.json +21 -17
  84. package/dist/daemon/id.d.ts +0 -24
  85. package/dist/daemon/id.js +0 -36
  86. package/dist/daemon/id.js.map +0 -1
  87. package/dist/mcp/mesh_result.d.ts +0 -10
  88. package/dist/mcp/mesh_result.js +0 -42
  89. package/dist/mcp/mesh_result.js.map +0 -1
  90. package/dist/mcp/mesh_server.d.ts +0 -16
  91. package/dist/mcp/mesh_server.js +0 -327
  92. package/dist/mcp/mesh_server.js.map +0 -1
  93. package/dist/mesh/canonical.d.ts +0 -30
  94. package/dist/mesh/canonical.js +0 -61
  95. package/dist/mesh/canonical.js.map +0 -1
  96. package/dist/mesh/client.d.ts +0 -18
  97. package/dist/mesh/client.js +0 -125
  98. package/dist/mesh/client.js.map +0 -1
  99. package/dist/mesh/encoding.d.ts +0 -38
  100. package/dist/mesh/encoding.js +0 -216
  101. package/dist/mesh/encoding.js.map +0 -1
  102. package/dist/mesh/self_revoke.d.ts +0 -73
  103. package/dist/mesh/self_revoke.js +0 -401
  104. package/dist/mesh/self_revoke.js.map +0 -1
  105. package/dist/mesh/siblings.d.ts +0 -49
  106. package/dist/mesh/siblings.js +0 -159
  107. package/dist/mesh/siblings.js.map +0 -1
  108. package/dist/mesh/types.d.ts +0 -34
  109. package/dist/mesh/types.js +0 -11
  110. package/dist/mesh/types.js.map +0 -1
  111. package/dist/mesh/verify.d.ts +0 -17
  112. package/dist/mesh/verify.js +0 -86
  113. package/dist/mesh/verify.js.map +0 -1
  114. package/dist/rooms.d.ts +0 -29
  115. package/dist/rooms.js +0 -57
  116. package/dist/rooms.js.map +0 -1
  117. package/dist/session/bridge.d.ts +0 -37
  118. package/dist/session/bridge.js +0 -130
  119. package/dist/session/bridge.js.map +0 -1
  120. package/dist/session/broker.d.ts +0 -189
  121. package/dist/session/broker.js +0 -507
  122. package/dist/session/broker.js.map +0 -1
  123. package/dist/session/broker_remote.d.ts +0 -74
  124. package/dist/session/broker_remote.js +0 -583
  125. package/dist/session/broker_remote.js.map +0 -1
  126. package/dist/session/cwd_lock.d.ts +0 -33
  127. package/dist/session/cwd_lock.js +0 -126
  128. package/dist/session/cwd_lock.js.map +0 -1
  129. package/dist/session/envelope.d.ts +0 -33
  130. package/dist/session/envelope.js +0 -117
  131. package/dist/session/envelope.js.map +0 -1
  132. package/dist/session/global_config.d.ts +0 -33
  133. package/dist/session/global_config.js +0 -73
  134. package/dist/session/global_config.js.map +0 -1
  135. package/dist/session/leader_election.d.ts +0 -32
  136. package/dist/session/leader_election.js +0 -106
  137. package/dist/session/leader_election.js.map +0 -1
  138. package/dist/session/mesh_node.d.ts +0 -116
  139. package/dist/session/mesh_node.js +0 -573
  140. package/dist/session/mesh_node.js.map +0 -1
  141. package/dist/session/peer.d.ts +0 -139
  142. package/dist/session/peer.js +0 -451
  143. package/dist/session/peer.js.map +0 -1
  144. package/dist/session/peer_inventory.d.ts +0 -13
  145. package/dist/session/peer_inventory.js +0 -48
  146. package/dist/session/peer_inventory.js.map +0 -1
  147. package/dist/session/peer_limits.d.ts +0 -9
  148. package/dist/session/peer_limits.js +0 -21
  149. package/dist/session/peer_limits.js.map +0 -1
  150. package/dist/session/setup_wizard.d.ts +0 -39
  151. package/dist/session/setup_wizard.js +0 -63
  152. package/dist/session/setup_wizard.js.map +0 -1
  153. package/dist/session/tools.d.ts +0 -24
  154. package/dist/session/tools.js +0 -252
  155. package/dist/session/tools.js.map +0 -1
  156. package/dist/session/wizard.d.ts +0 -13
  157. package/dist/session/wizard.js +0 -20
  158. package/dist/session/wizard.js.map +0 -1
  159. package/dist/transport/pi_forward_client.d.ts +0 -29
  160. package/dist/transport/pi_forward_client.js +0 -62
  161. package/dist/transport/pi_forward_client.js.map +0 -1
  162. package/dist/ui/footer.d.ts +0 -32
  163. package/dist/ui/footer.js +0 -34
  164. package/dist/ui/footer.js.map +0 -1
  165. package/skills/agent-network/SKILL.md +0 -310
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * Once running, it:
12
12
  * - Reads `~/.pi/remote/daemons.json`
13
- * - Spawns `pi --mode rpc -e <remote-pi/dist/index.js>` per entry
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
- // The supervisor needs to point each spawned Pi at the extension
59
- // entry it's bundled with. We're at `dist/bin/supervisord.js` after
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(`[pi-supervisord] up — UDS: ~/.pi/remote/supervisor.sock, extension: ${extensionPath}\n`);
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":"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"}
1
+ {"version":3,"file":"supervisord.js","sourceRoot":"","sources":["../../src/bin/supervisord.ts"],"names":[],"mappings":"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"}
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 mesh HTTP client both stay on http(s)://.
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 endpoints used by the mesh client.
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 mesh HTTP client both stay on http(s)://.
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":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5H,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AASxF,MAAM,UAAU,eAAe,CAAC,OAAe,OAAO,EAAE;IACtD,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,UAAkB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;IAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAe,OAAO,EAAE,EACxB,QAAqD,EAAE,EACvD,OAAgD,EAAE;IAElD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,QAAQ,EAAE,KAAK,OAAO;QAAE,OAAO,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE/E,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,kBAAkB,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,oBAAoB,EAAE,CAAC;IAChE,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC;QAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC/D,IAAI,CAAC;QAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAElE,MAAM,KAAK,GAAgC;QACzC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE;QACxE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE;KACtF,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK;QAAE,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,YAAY,MAAM,wFAAwF,CAAC,CAAC;IAClI,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAgB,EAAE,WAAmB;IAC/D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,wDAAwD,CAAC,CAAC;IAC9I,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,WAAW,wDAAwD,CAAC,CAAC;AACvJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,MAAc,EACd,KAAkD,EAClD,IAA6C;IAE7C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,GAAG,CAAC,IAAI,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,cAAc,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,kBAAkB,EAAE,CAAC;IACxD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,oBAAoB,EAAE,CAAC;IAChE,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAgC;QACzC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE;QAChF,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE;KAC9F,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IACxH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;QACzC,IAAI,CAAC;YAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,SAAS,MAAM,wEAAwE,CAAC,CAAC;QAAC,CAAC;QAC/H,OAAO,KAAK,EAAE,CAAC;YAAC,GAAG,CAAC,IAAI,CAAC,YAAY,MAAM,wCAAwC,MAAM,CAAC,KAAK,CAAC,yCAAyC,MAAM,GAAG,CAAC,CAAC;QAAC,CAAC;IACxJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAAc;IACvD,OAAO,iBAAiB,IAAI,MAAM,MAAM,UAAU,CAAC;AACrD,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IAC/C,YAAY,CAAC,YAAY,EAAE;QACzB,YAAY,EAAE,iBAAiB,EAAE,UAAU;QAC3C,QAAQ,OAAO,IAAI;YACnB,6DAA6D;YAC7D,4BAA4B;YAC5B,uDAAuD;YACvD,kHAAkH;KACnH,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAC5C,CAAC;AAQD,MAAM,UAAU,iBAAiB,CAAC,OAAe,OAAO,EAAE;IACxD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACjH,MAAM,OAAO,GAAoC,EAAE,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO,GAAG,IAAI,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC/D,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAAC,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YAAC,CAAC;YACtD,OAAO,KAAK,EAAE,CAAC;gBAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAAC,OAAO,GAAG,KAAK,CAAC;YAAC,CAAC;QAC5F,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,MAAc,EAAE,GAAa;IACrE,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,CAAC;QAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACxE,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,IAAI,CAAC,WAAW,QAAQ,MAAM,MAAM,cAAc,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAC7F,IAAI,CAAC;QAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACpD,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,WAAW,QAAQ,MAAM,MAAM,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -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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"}