peerllm-host-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +83 -0
  3. package/dist/cli/commands/agreement.d.ts +3 -0
  4. package/dist/cli/commands/agreement.d.ts.map +1 -0
  5. package/dist/cli/commands/agreement.js +151 -0
  6. package/dist/cli/commands/agreement.js.map +1 -0
  7. package/dist/cli/commands/config.d.ts +3 -0
  8. package/dist/cli/commands/config.d.ts.map +1 -0
  9. package/dist/cli/commands/config.js +163 -0
  10. package/dist/cli/commands/config.js.map +1 -0
  11. package/dist/cli/commands/diagnostics.d.ts +3 -0
  12. package/dist/cli/commands/diagnostics.d.ts.map +1 -0
  13. package/dist/cli/commands/diagnostics.js +131 -0
  14. package/dist/cli/commands/diagnostics.js.map +1 -0
  15. package/dist/cli/commands/doctor.d.ts +3 -0
  16. package/dist/cli/commands/doctor.d.ts.map +1 -0
  17. package/dist/cli/commands/doctor.js +349 -0
  18. package/dist/cli/commands/doctor.js.map +1 -0
  19. package/dist/cli/commands/events.d.ts +3 -0
  20. package/dist/cli/commands/events.d.ts.map +1 -0
  21. package/dist/cli/commands/events.js +51 -0
  22. package/dist/cli/commands/events.js.map +1 -0
  23. package/dist/cli/commands/host.d.ts +3 -0
  24. package/dist/cli/commands/host.d.ts.map +1 -0
  25. package/dist/cli/commands/host.js +252 -0
  26. package/dist/cli/commands/host.js.map +1 -0
  27. package/dist/cli/commands/login.d.ts +3 -0
  28. package/dist/cli/commands/login.d.ts.map +1 -0
  29. package/dist/cli/commands/login.js +51 -0
  30. package/dist/cli/commands/login.js.map +1 -0
  31. package/dist/cli/commands/logout.d.ts +3 -0
  32. package/dist/cli/commands/logout.d.ts.map +1 -0
  33. package/dist/cli/commands/logout.js +28 -0
  34. package/dist/cli/commands/logout.js.map +1 -0
  35. package/dist/cli/commands/logs.d.ts +3 -0
  36. package/dist/cli/commands/logs.d.ts.map +1 -0
  37. package/dist/cli/commands/logs.js +157 -0
  38. package/dist/cli/commands/logs.js.map +1 -0
  39. package/dist/cli/commands/models.d.ts +3 -0
  40. package/dist/cli/commands/models.d.ts.map +1 -0
  41. package/dist/cli/commands/models.js +227 -0
  42. package/dist/cli/commands/models.js.map +1 -0
  43. package/dist/cli/commands/register.d.ts +3 -0
  44. package/dist/cli/commands/register.d.ts.map +1 -0
  45. package/dist/cli/commands/register.js +48 -0
  46. package/dist/cli/commands/register.js.map +1 -0
  47. package/dist/cli/commands/restart.d.ts +3 -0
  48. package/dist/cli/commands/restart.d.ts.map +1 -0
  49. package/dist/cli/commands/restart.js +66 -0
  50. package/dist/cli/commands/restart.js.map +1 -0
  51. package/dist/cli/commands/service.d.ts +3 -0
  52. package/dist/cli/commands/service.d.ts.map +1 -0
  53. package/dist/cli/commands/service.js +194 -0
  54. package/dist/cli/commands/service.js.map +1 -0
  55. package/dist/cli/commands/setup.d.ts +3 -0
  56. package/dist/cli/commands/setup.d.ts.map +1 -0
  57. package/dist/cli/commands/setup.js +242 -0
  58. package/dist/cli/commands/setup.js.map +1 -0
  59. package/dist/cli/commands/start.d.ts +3 -0
  60. package/dist/cli/commands/start.d.ts.map +1 -0
  61. package/dist/cli/commands/start.js +125 -0
  62. package/dist/cli/commands/start.js.map +1 -0
  63. package/dist/cli/commands/status.d.ts +3 -0
  64. package/dist/cli/commands/status.d.ts.map +1 -0
  65. package/dist/cli/commands/status.js +76 -0
  66. package/dist/cli/commands/status.js.map +1 -0
  67. package/dist/cli/commands/stop.d.ts +3 -0
  68. package/dist/cli/commands/stop.d.ts.map +1 -0
  69. package/dist/cli/commands/stop.js +46 -0
  70. package/dist/cli/commands/stop.js.map +1 -0
  71. package/dist/cli/commands/subscription.d.ts +3 -0
  72. package/dist/cli/commands/subscription.d.ts.map +1 -0
  73. package/dist/cli/commands/subscription.js +342 -0
  74. package/dist/cli/commands/subscription.js.map +1 -0
  75. package/dist/cli/exit-codes.d.ts +12 -0
  76. package/dist/cli/exit-codes.d.ts.map +1 -0
  77. package/dist/cli/exit-codes.js +11 -0
  78. package/dist/cli/exit-codes.js.map +1 -0
  79. package/dist/cli/format.d.ts +8 -0
  80. package/dist/cli/format.d.ts.map +1 -0
  81. package/dist/cli/format.js +22 -0
  82. package/dist/cli/format.js.map +1 -0
  83. package/dist/cli/index.d.ts +3 -0
  84. package/dist/cli/index.d.ts.map +1 -0
  85. package/dist/cli/index.js +88 -0
  86. package/dist/cli/index.js.map +1 -0
  87. package/dist/cli/ipc-client.d.ts +20 -0
  88. package/dist/cli/ipc-client.d.ts.map +1 -0
  89. package/dist/cli/ipc-client.js +101 -0
  90. package/dist/cli/ipc-client.js.map +1 -0
  91. package/dist/cli/prompts.d.ts +5 -0
  92. package/dist/cli/prompts.d.ts.map +1 -0
  93. package/dist/cli/prompts.js +68 -0
  94. package/dist/cli/prompts.js.map +1 -0
  95. package/dist/cli/services.d.ts +18 -0
  96. package/dist/cli/services.d.ts.map +1 -0
  97. package/dist/cli/services.js +16 -0
  98. package/dist/cli/services.js.map +1 -0
  99. package/dist/core/auth.d.ts +24 -0
  100. package/dist/core/auth.d.ts.map +1 -0
  101. package/dist/core/auth.js +111 -0
  102. package/dist/core/auth.js.map +1 -0
  103. package/dist/core/backend-client.d.ts +33 -0
  104. package/dist/core/backend-client.d.ts.map +1 -0
  105. package/dist/core/backend-client.js +79 -0
  106. package/dist/core/backend-client.js.map +1 -0
  107. package/dist/core/config.d.ts +21 -0
  108. package/dist/core/config.d.ts.map +1 -0
  109. package/dist/core/config.js +98 -0
  110. package/dist/core/config.js.map +1 -0
  111. package/dist/core/events.d.ts +23 -0
  112. package/dist/core/events.d.ts.map +1 -0
  113. package/dist/core/events.js +15 -0
  114. package/dist/core/events.js.map +1 -0
  115. package/dist/core/fs-lock.d.ts +13 -0
  116. package/dist/core/fs-lock.d.ts.map +1 -0
  117. package/dist/core/fs-lock.js +52 -0
  118. package/dist/core/fs-lock.js.map +1 -0
  119. package/dist/core/jsonrpc.d.ts +55 -0
  120. package/dist/core/jsonrpc.d.ts.map +1 -0
  121. package/dist/core/jsonrpc.js +59 -0
  122. package/dist/core/jsonrpc.js.map +1 -0
  123. package/dist/core/logger.d.ts +28 -0
  124. package/dist/core/logger.d.ts.map +1 -0
  125. package/dist/core/logger.js +80 -0
  126. package/dist/core/logger.js.map +1 -0
  127. package/dist/core/model-info.d.ts +11 -0
  128. package/dist/core/model-info.d.ts.map +1 -0
  129. package/dist/core/model-info.js +137 -0
  130. package/dist/core/model-info.js.map +1 -0
  131. package/dist/core/models-fs.d.ts +6 -0
  132. package/dist/core/models-fs.d.ts.map +1 -0
  133. package/dist/core/models-fs.js +21 -0
  134. package/dist/core/models-fs.js.map +1 -0
  135. package/dist/core/orchestrator.d.ts +42 -0
  136. package/dist/core/orchestrator.d.ts.map +1 -0
  137. package/dist/core/orchestrator.js +304 -0
  138. package/dist/core/orchestrator.js.map +1 -0
  139. package/dist/core/paths.d.ts +17 -0
  140. package/dist/core/paths.d.ts.map +1 -0
  141. package/dist/core/paths.js +51 -0
  142. package/dist/core/paths.js.map +1 -0
  143. package/dist/core/redact.d.ts +3 -0
  144. package/dist/core/redact.d.ts.map +1 -0
  145. package/dist/core/redact.js +27 -0
  146. package/dist/core/redact.js.map +1 -0
  147. package/dist/core/secrets.d.ts +12 -0
  148. package/dist/core/secrets.d.ts.map +1 -0
  149. package/dist/core/secrets.js +66 -0
  150. package/dist/core/secrets.js.map +1 -0
  151. package/dist/core/shared-runner.d.ts +70 -0
  152. package/dist/core/shared-runner.d.ts.map +1 -0
  153. package/dist/core/shared-runner.js +450 -0
  154. package/dist/core/shared-runner.js.map +1 -0
  155. package/dist/core/subscription.d.ts +53 -0
  156. package/dist/core/subscription.d.ts.map +1 -0
  157. package/dist/core/subscription.js +117 -0
  158. package/dist/core/subscription.js.map +1 -0
  159. package/dist/daemon/index.d.ts +3 -0
  160. package/dist/daemon/index.d.ts.map +1 -0
  161. package/dist/daemon/index.js +22 -0
  162. package/dist/daemon/index.js.map +1 -0
  163. package/dist/daemon/ipc-server.d.ts +33 -0
  164. package/dist/daemon/ipc-server.d.ts.map +1 -0
  165. package/dist/daemon/ipc-server.js +202 -0
  166. package/dist/daemon/ipc-server.js.map +1 -0
  167. package/dist/daemon/methods.d.ts +17 -0
  168. package/dist/daemon/methods.d.ts.map +1 -0
  169. package/dist/daemon/methods.js +68 -0
  170. package/dist/daemon/methods.js.map +1 -0
  171. package/dist/daemon/pid-lock.d.ts +10 -0
  172. package/dist/daemon/pid-lock.d.ts.map +1 -0
  173. package/dist/daemon/pid-lock.js +45 -0
  174. package/dist/daemon/pid-lock.js.map +1 -0
  175. package/dist/daemon/run.d.ts +19 -0
  176. package/dist/daemon/run.d.ts.map +1 -0
  177. package/dist/daemon/run.js +182 -0
  178. package/dist/daemon/run.js.map +1 -0
  179. package/dist/shared/config-types.d.ts +27 -0
  180. package/dist/shared/config-types.d.ts.map +1 -0
  181. package/dist/shared/config-types.js +13 -0
  182. package/dist/shared/config-types.js.map +1 -0
  183. package/dist/shared/protocol.d.ts +43 -0
  184. package/dist/shared/protocol.d.ts.map +1 -0
  185. package/dist/shared/protocol.js +11 -0
  186. package/dist/shared/protocol.js.map +1 -0
  187. package/package.json +70 -0
  188. package/templates/launchd/com.peerllm.host.plist +25 -0
  189. package/templates/systemd/peerllm-host.service +17 -0
  190. package/templates/windows/install-service.ps1 +29 -0
@@ -0,0 +1,242 @@
1
+ import { arch as osArch, hostname, platform as osPlatform } from "node:os";
2
+ import { Command } from "commander";
3
+ import { EXIT } from "../exit-codes.js";
4
+ import { printError } from "../format.js";
5
+ import { prompt, promptPassword, promptYesNo, readStdinUntilEnd } from "../prompts.js";
6
+ import { buildClientServices } from "../services.js";
7
+ async function step1Auth(services, opts) {
8
+ if (await services.auth.hasRefreshToken()) {
9
+ process.stdout.write("1/4 Authentication ✓ already logged in\n");
10
+ return;
11
+ }
12
+ process.stdout.write("1/4 Authentication\n");
13
+ const email = opts.email ?? (await prompt(" Email: ")).trim();
14
+ if (!email)
15
+ throw new Error("email is required");
16
+ const password = opts.passwordStdin
17
+ ? await readStdinUntilEnd()
18
+ : await promptPassword(" Password: ");
19
+ if (!password)
20
+ throw new Error("password is required");
21
+ try {
22
+ await services.auth.login(email, password);
23
+ process.stdout.write(` ✓ logged in as ${email}\n`);
24
+ }
25
+ catch (err) {
26
+ const e = err;
27
+ throw new Error(e.status === 401 ? "invalid email or password" : e.message || "login failed");
28
+ }
29
+ }
30
+ async function step2Agreement(services, opts) {
31
+ const cfg = await services.config.load();
32
+ if (cfg.agreementAccepted) {
33
+ process.stdout.write(`2/4 Agreement ✓ accepted${cfg.agreementVersion ? ` (v${cfg.agreementVersion})` : ""}\n`);
34
+ return;
35
+ }
36
+ process.stdout.write("2/4 Agreement\n");
37
+ const agreement = await services.backend.request({
38
+ method: "GET",
39
+ path: "/host-agreements/latest",
40
+ });
41
+ process.stdout.write(` Agreement v${agreement.version ?? "?"} (${agreement.id})\n`);
42
+ process.stdout.write(" Run 'peerllm-host agreement show' to see the full text.\n");
43
+ const confirm = opts.acceptAgreement || opts.yes
44
+ ? true
45
+ : await promptYesNo(" Do you accept the agreement?", false);
46
+ if (!confirm)
47
+ throw new Error("agreement not accepted");
48
+ const token = await services.auth.getValidAccessToken();
49
+ if (!token)
50
+ throw new Error("not authenticated (token unavailable)");
51
+ await services.backend.request({
52
+ method: "POST",
53
+ path: "/host-agreements/accept",
54
+ body: { agreementId: agreement.id, acceptedVia: "cli" },
55
+ bearerToken: token,
56
+ });
57
+ await services.config.update((c) => ({
58
+ ...c,
59
+ agreementAccepted: true,
60
+ agreementId: agreement.id,
61
+ agreementVersion: agreement.version,
62
+ }));
63
+ process.stdout.write(` ✓ accepted v${agreement.version ?? "?"}\n`);
64
+ }
65
+ async function step3Host(services, opts) {
66
+ const cfg = await services.config.load();
67
+ if (cfg.hostId) {
68
+ process.stdout.write(`3/4 Host ✓ already linked (${cfg.hostId})\n`);
69
+ return;
70
+ }
71
+ process.stdout.write("3/4 Host\n");
72
+ const token = await services.auth.getValidAccessToken();
73
+ if (!token)
74
+ throw new Error("not authenticated (token unavailable)");
75
+ if (opts.hostLink) {
76
+ await services.backend.request({
77
+ method: "POST",
78
+ path: "/user-hosts/link",
79
+ body: { hostId: opts.hostLink },
80
+ bearerToken: token,
81
+ });
82
+ await services.config.update((c) => ({ ...c, hostId: opts.hostLink }));
83
+ process.stdout.write(` ✓ linked ${opts.hostLink}\n`);
84
+ return;
85
+ }
86
+ if (opts.hostCreate || opts.yes) {
87
+ const machineName = opts.hostName ?? hostname();
88
+ const result = await services.backend.request({
89
+ method: "POST",
90
+ path: "/api/hosts",
91
+ body: {
92
+ HostId: null,
93
+ MachineName: machineName,
94
+ HostOS: osPlatform(),
95
+ HostArch: osArch(),
96
+ HostVersion: "0.1.0",
97
+ },
98
+ bearerToken: token,
99
+ });
100
+ await services.config.update((c) => ({
101
+ ...c,
102
+ hostId: result.hostId,
103
+ hostName: machineName,
104
+ }));
105
+ process.stdout.write(` ✓ registered ${machineName} (${result.hostId})\n`);
106
+ return;
107
+ }
108
+ // Interactive choice
109
+ const choice = (await prompt(" [c]reate a new host or [l]ink an existing id? ")).trim().toLowerCase();
110
+ if (choice.startsWith("l")) {
111
+ const id = (await prompt(" Host id: ")).trim();
112
+ if (!id)
113
+ throw new Error("host id is required");
114
+ await services.backend.request({
115
+ method: "POST",
116
+ path: "/user-hosts/link",
117
+ body: { hostId: id },
118
+ bearerToken: token,
119
+ });
120
+ await services.config.update((c) => ({ ...c, hostId: id }));
121
+ process.stdout.write(` ✓ linked ${id}\n`);
122
+ return;
123
+ }
124
+ const defaultName = opts.hostName ?? hostname();
125
+ const name = (await prompt(` Host name [${defaultName}]: `)).trim() || defaultName;
126
+ const result = await services.backend.request({
127
+ method: "POST",
128
+ path: "/api/hosts",
129
+ body: {
130
+ HostId: null,
131
+ MachineName: name,
132
+ HostOS: osPlatform(),
133
+ HostArch: osArch(),
134
+ HostVersion: "0.1.0",
135
+ },
136
+ bearerToken: token,
137
+ });
138
+ await services.config.update((c) => ({ ...c, hostId: result.hostId, hostName: name }));
139
+ process.stdout.write(` ✓ registered ${name} (${result.hostId})\n`);
140
+ }
141
+ async function step4Subscription(services, opts) {
142
+ const cfg = await services.config.load();
143
+ if (!cfg.hostId) {
144
+ process.stdout.write("4/4 Subscription ✗ host not registered (skipping)\n");
145
+ return;
146
+ }
147
+ let capacity;
148
+ try {
149
+ capacity = await services.subscription.capacity();
150
+ }
151
+ catch (err) {
152
+ process.stdout.write(`4/4 Subscription ⚠ could not fetch capacity (${err.message})\n`);
153
+ return;
154
+ }
155
+ if (capacity.subscribedHosts.some((h) => h.hostId === cfg.hostId)) {
156
+ process.stdout.write("4/4 Subscription ✓ this host is already subscribed\n");
157
+ return;
158
+ }
159
+ if (opts.skipSubscription) {
160
+ process.stdout.write("4/4 Subscription skipped (--skip-subscription)\n" +
161
+ " Note: hosts must be subscribed before they can serve traffic.\n" +
162
+ " Subscribe later with: peerllm-host subscription start\n");
163
+ return;
164
+ }
165
+ process.stdout.write("4/4 Subscription\n");
166
+ process.stdout.write(` Hosting requires an active subscription ($${capacity.pricePerHost.toFixed(2)} / host / month, PayPal).\n`);
167
+ const proceed = opts.yes ||
168
+ (await promptYesNo(" Start the subscription flow now?", true));
169
+ if (!proceed) {
170
+ process.stdout.write(" skipped — subscribe later with: peerllm-host subscription start\n");
171
+ return;
172
+ }
173
+ let result;
174
+ try {
175
+ result = capacity.hasActiveSubscription
176
+ ? await services.subscription.addHost(cfg.hostId)
177
+ : await services.subscription.create([cfg.hostId]);
178
+ }
179
+ catch (err) {
180
+ throw new Error(`subscription request failed: ${err.message}`);
181
+ }
182
+ if (!result.approvalUrl) {
183
+ process.stdout.write(" ✓ host added to subscription (no approval required)\n");
184
+ return;
185
+ }
186
+ process.stdout.write("\n Open this URL in any browser to approve the payment:\n");
187
+ process.stdout.write(`\n ${result.approvalUrl}\n\n`);
188
+ process.stdout.write(" waiting for PayPal confirmation");
189
+ const deadline = Date.now() + 5 * 60 * 1000;
190
+ const intervalMs = 3_000;
191
+ while (Date.now() < deadline) {
192
+ process.stdout.write(".");
193
+ try {
194
+ const check = await services.subscription.hostIsActive(cfg.hostId);
195
+ if (check.subscribed) {
196
+ process.stdout.write("\n ✓ subscription active\n");
197
+ return;
198
+ }
199
+ }
200
+ catch {
201
+ // keep polling
202
+ }
203
+ await new Promise((r) => setTimeout(r, intervalMs));
204
+ }
205
+ process.stdout.write("\n ⚠ timed out waiting for PayPal — check later: peerllm-host subscription status\n");
206
+ }
207
+ export function makeSetupCommand() {
208
+ return new Command("setup")
209
+ .description("Interactive onboarding: login + agreement + host registration")
210
+ .option("--email <email>")
211
+ .option("--password-stdin", "read password from stdin")
212
+ .option("--accept-agreement", "accept the latest host agreement without prompting")
213
+ .option("--host-name <name>", "host display name (defaults to machine hostname)")
214
+ .option("--host-link <hostId>", "link an existing host id")
215
+ .option("--host-create", "create a new host non-interactively")
216
+ .option("--skip-subscription", "skip the subscription step (host won't serve traffic until subscribed)")
217
+ .option("--yes", "accept all confirmations")
218
+ .option("--config-dir <path>", "override config directory")
219
+ .option("--json", "machine-readable JSON output")
220
+ .action(async (opts) => {
221
+ const services = buildClientServices({ configDir: opts.configDir });
222
+ try {
223
+ await step1Auth(services, opts);
224
+ await step2Agreement(services, opts);
225
+ await step3Host(services, opts);
226
+ await step4Subscription(services, opts);
227
+ if (opts.json) {
228
+ process.stdout.write(JSON.stringify({ setup: "complete" }) + "\n");
229
+ }
230
+ else {
231
+ process.stdout.write("\nSetup complete. Start serving with:\n");
232
+ process.stdout.write(" peerllm-host start\n");
233
+ }
234
+ process.exit(EXIT.ok);
235
+ }
236
+ catch (err) {
237
+ printError(err.message, { json: opts.json });
238
+ process.exit(EXIT.runtimeError);
239
+ }
240
+ });
241
+ }
242
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function makeStartCommand(cliVersion: string): Command;
3
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuEpC,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CA6D5D"}
@@ -0,0 +1,125 @@
1
+ import { spawn } from "node:child_process";
2
+ import { openSync } from "node:fs";
3
+ import { fileURLToPath } from "node:url";
4
+ import { dirname, join } from "node:path";
5
+ import { setTimeout as delay } from "node:timers/promises";
6
+ import { Command } from "commander";
7
+ import { resolvePaths } from "../../core/paths.js";
8
+ import { runDaemon, StartupError } from "../../daemon/run.js";
9
+ import { METHOD } from "../../shared/protocol.js";
10
+ import { EXIT } from "../exit-codes.js";
11
+ import { printError } from "../format.js";
12
+ import { DaemonUnreachableError, IpcClient } from "../ipc-client.js";
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = dirname(__filename);
15
+ async function waitForReachable(endpoint, timeoutMs = 5000) {
16
+ const deadline = Date.now() + timeoutMs;
17
+ while (Date.now() < deadline) {
18
+ const client = new IpcClient(endpoint);
19
+ try {
20
+ await client.connect(500);
21
+ await client.call(METHOD.getStatus);
22
+ return true;
23
+ }
24
+ catch (err) {
25
+ if (!(err instanceof DaemonUnreachableError))
26
+ throw err;
27
+ }
28
+ finally {
29
+ client.close();
30
+ }
31
+ await delay(100);
32
+ }
33
+ return false;
34
+ }
35
+ async function startDetached(configDir, endpoint) {
36
+ const daemonEntry = join(__dirname, "..", "..", "daemon", "index.js");
37
+ const args = configDir ? ["--config-dir", configDir] : [];
38
+ // Open /dev/null (or NUL) for the child's stdio so it has no controlling
39
+ // terminal and can survive parent exit.
40
+ const nullDev = process.platform === "win32" ? "\\\\.\\NUL" : "/dev/null";
41
+ let stdinFd;
42
+ let stdoutFd;
43
+ let stderrFd;
44
+ try {
45
+ stdinFd = openSync(nullDev, "r");
46
+ stdoutFd = openSync(nullDev, "w");
47
+ stderrFd = openSync(nullDev, "w");
48
+ }
49
+ catch (err) {
50
+ throw new Error(`failed to open ${nullDev}: ${err.message}`);
51
+ }
52
+ const child = spawn(process.execPath, [daemonEntry, ...args], {
53
+ detached: true,
54
+ stdio: [stdinFd, stdoutFd, stderrFd],
55
+ windowsHide: true,
56
+ });
57
+ if (!child.pid) {
58
+ throw new Error("failed to spawn detached daemon");
59
+ }
60
+ child.unref();
61
+ const reachable = await waitForReachable(endpoint, 5000);
62
+ if (!reachable) {
63
+ throw new Error("daemon spawned but did not become reachable within 5s — check logs at the path printed by `peerllm-host logs list`");
64
+ }
65
+ return { pid: child.pid, endpoint };
66
+ }
67
+ export function makeStartCommand(cliVersion) {
68
+ return new Command("start")
69
+ .description("Start the PeerLLM host daemon")
70
+ .option("--detach, --detached", "run as a background daemon")
71
+ .option("--foreground", "run in the foreground")
72
+ .option("--config-dir <path>", "override config directory")
73
+ .action(async (opts) => {
74
+ const foreground = opts.foreground || !opts.detach;
75
+ const paths = resolvePaths({ configDirOverride: opts.configDir });
76
+ if (foreground) {
77
+ try {
78
+ const daemon = await runDaemon({
79
+ configDir: opts.configDir,
80
+ cliVersion,
81
+ foreground: true,
82
+ });
83
+ process.stdout.write(`peerllm-host: listening on ${daemon.state.paths.ipcEndpoint}\n`);
84
+ process.stdout.write(`peerllm-host: pid ${daemon.state.pid}\n`);
85
+ process.stdout.write(`peerllm-host: press Ctrl-C to stop\n`);
86
+ await daemon.whenStopped;
87
+ process.exit(EXIT.ok);
88
+ }
89
+ catch (err) {
90
+ if (err instanceof StartupError) {
91
+ printError(err.message, { hint: err.hint });
92
+ process.exit(err.exitCode);
93
+ }
94
+ const e = err;
95
+ if (e.exitCode === EXIT.alreadyRunning) {
96
+ printError(e.message, {
97
+ hint: "Stop the existing daemon first: peerllm-host stop",
98
+ });
99
+ process.exit(EXIT.alreadyRunning);
100
+ }
101
+ printError(e.message);
102
+ process.exit(EXIT.runtimeError);
103
+ }
104
+ }
105
+ // Detached path: spawn the daemon entry and verify reachability.
106
+ try {
107
+ const result = await startDetached(opts.configDir, paths.ipcEndpoint);
108
+ process.stdout.write(`peerllm-host: daemon started (pid ${result.pid})\n`);
109
+ process.stdout.write(`peerllm-host: listening on ${result.endpoint}\n`);
110
+ process.exit(EXIT.ok);
111
+ }
112
+ catch (err) {
113
+ const e = err;
114
+ if (e.exitCode === EXIT.alreadyRunning) {
115
+ printError(e.message, {
116
+ hint: "Stop the existing daemon first: peerllm-host stop",
117
+ });
118
+ process.exit(EXIT.alreadyRunning);
119
+ }
120
+ printError(e.message);
121
+ process.exit(EXIT.runtimeError);
122
+ }
123
+ });
124
+ }
125
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function makeStatusCommand(): Command;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,iBAAiB,IAAI,OAAO,CAwC3C"}
@@ -0,0 +1,76 @@
1
+ import { Command } from "commander";
2
+ import { resolvePaths } from "../../core/paths.js";
3
+ import { METHOD } from "../../shared/protocol.js";
4
+ import { DaemonUnreachableError, IpcClient } from "../ipc-client.js";
5
+ import { EXIT } from "../exit-codes.js";
6
+ import { humanizeUptime, printError } from "../format.js";
7
+ export function makeStatusCommand() {
8
+ return new Command("status")
9
+ .description("Show daemon status")
10
+ .option("--json", "machine-readable JSON output")
11
+ .option("--config-dir <path>", "override config directory")
12
+ .action(async (opts) => {
13
+ const paths = resolvePaths({ configDirOverride: opts.configDir });
14
+ const client = new IpcClient(paths.ipcEndpoint);
15
+ try {
16
+ await client.connect();
17
+ }
18
+ catch (err) {
19
+ if (err instanceof DaemonUnreachableError) {
20
+ if (opts.json) {
21
+ process.stdout.write(JSON.stringify({ running: false, endpoint: paths.ipcEndpoint }) + "\n");
22
+ }
23
+ else {
24
+ process.stdout.write("daemon: not running\n");
25
+ }
26
+ process.exit(EXIT.daemonNotRunning);
27
+ }
28
+ printError(err.message);
29
+ process.exit(EXIT.runtimeError);
30
+ }
31
+ try {
32
+ const status = await client.call(METHOD.getStatus);
33
+ if (opts.json) {
34
+ process.stdout.write(JSON.stringify({ running: true, ...status }, null, 2) + "\n");
35
+ }
36
+ else {
37
+ printStatus(status);
38
+ }
39
+ process.exit(EXIT.ok);
40
+ }
41
+ catch (err) {
42
+ printError(err.message);
43
+ process.exit(EXIT.runtimeError);
44
+ }
45
+ finally {
46
+ client.close();
47
+ }
48
+ });
49
+ }
50
+ function printStatus(status) {
51
+ const hostLabel = status.config.hostName ?? "(unset — run `peerllm-host host create | link`)";
52
+ const hostIdLabel = status.config.hostId
53
+ ? `${status.config.hostId.slice(0, 8)}…`
54
+ : "(unset)";
55
+ const authLabel = status.auth.loggedIn
56
+ ? status.auth.userId
57
+ ? `logged in (user ${status.auth.userId.slice(0, 8)}…)`
58
+ : "logged in"
59
+ : "logged out (run `peerllm-host login`)";
60
+ const agreementLabel = status.auth.agreementAccepted
61
+ ? `accepted${status.auth.agreementVersion ? ` (v${status.auth.agreementVersion})` : ""}`
62
+ : "not accepted (run `peerllm-host agreement accept`)";
63
+ const lines = [
64
+ `daemon: running (pid ${status.daemon.pid}, uptime ${humanizeUptime(status.daemon.uptimeSeconds)})`,
65
+ `protocol: ${status.daemon.protocolVersion}`,
66
+ `auth: ${authLabel}`,
67
+ `agreement: ${agreementLabel}`,
68
+ `host: ${hostLabel}`,
69
+ `host id: ${hostIdLabel}`,
70
+ `orchestrator: ${status.orchestrator.status}`,
71
+ `config: ${status.config.path} (schemaVersion ${status.config.schemaVersion})`,
72
+ ];
73
+ for (const l of lines)
74
+ process.stdout.write(l + "\n");
75
+ }
76
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function makeStopCommand(): Command;
3
+ //# sourceMappingURL=stop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,eAAe,IAAI,OAAO,CAoCzC"}
@@ -0,0 +1,46 @@
1
+ import { Command } from "commander";
2
+ import { resolvePaths } from "../../core/paths.js";
3
+ import { METHOD } from "../../shared/protocol.js";
4
+ import { DaemonUnreachableError, IpcClient } from "../ipc-client.js";
5
+ import { EXIT } from "../exit-codes.js";
6
+ import { printError } from "../format.js";
7
+ export function makeStopCommand() {
8
+ return new Command("stop")
9
+ .description("Stop the running daemon")
10
+ .option("--config-dir <path>", "override config directory")
11
+ .action(async (opts) => {
12
+ const paths = resolvePaths({ configDirOverride: opts.configDir });
13
+ const client = new IpcClient(paths.ipcEndpoint);
14
+ try {
15
+ await client.connect();
16
+ }
17
+ catch (err) {
18
+ if (err instanceof DaemonUnreachableError) {
19
+ process.stdout.write("daemon is not running\n");
20
+ process.exit(EXIT.ok);
21
+ }
22
+ printError(err.message);
23
+ process.exit(EXIT.runtimeError);
24
+ }
25
+ try {
26
+ await client.call(METHOD.shutdown);
27
+ process.stdout.write("stopped\n");
28
+ process.exit(EXIT.ok);
29
+ }
30
+ catch (err) {
31
+ // The daemon closes the socket as part of shutting down; that's
32
+ // expected and means the stop succeeded.
33
+ const message = err.message;
34
+ if (message.includes("daemon closed connection")) {
35
+ process.stdout.write("stopped\n");
36
+ process.exit(EXIT.ok);
37
+ }
38
+ printError(message);
39
+ process.exit(EXIT.runtimeError);
40
+ }
41
+ finally {
42
+ client.close();
43
+ }
44
+ });
45
+ }
46
+ //# sourceMappingURL=stop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;SAC1D,MAAM,CAAC,KAAK,EAAE,IAA4B,EAAE,EAAE;QAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;gBAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;YACD,UAAU,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gEAAgE;YAChE,yCAAyC;YACzC,MAAM,OAAO,GAAI,GAAa,CAAC,OAAO,CAAC;YACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,CAAC;YACD,UAAU,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function makeSubscriptionCommand(): Command;
3
+ //# sourceMappingURL=subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/subscription.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4XpC,wBAAgB,uBAAuB,IAAI,OAAO,CASjD"}