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,252 @@
1
+ import { arch, hostname, platform } from "node:os";
2
+ import { Command } from "commander";
3
+ import { AgreementRequiredError, NotAuthenticatedError, } from "../../core/backend-client.js";
4
+ import { METHOD } from "../../shared/protocol.js";
5
+ import { EXIT } from "../exit-codes.js";
6
+ import { printError } from "../format.js";
7
+ import { DaemonUnreachableError, IpcClient } from "../ipc-client.js";
8
+ import { promptYesNo } from "../prompts.js";
9
+ import { buildClientServices } from "../services.js";
10
+ async function requireToken(services, json) {
11
+ const token = await services.auth.getValidAccessToken();
12
+ if (!token) {
13
+ printError("not authenticated", {
14
+ json,
15
+ hint: "Log in first: peerllm-host login",
16
+ });
17
+ process.exit(EXIT.notAuthenticated);
18
+ }
19
+ return token;
20
+ }
21
+ function handleBackendError(err, json) {
22
+ if (err instanceof AgreementRequiredError) {
23
+ printError("you must accept the latest agreement first", {
24
+ json,
25
+ hint: "peerllm-host agreement accept",
26
+ });
27
+ process.exit(EXIT.notAuthorized);
28
+ }
29
+ if (err instanceof NotAuthenticatedError) {
30
+ printError("not authenticated", {
31
+ json,
32
+ hint: "Log in first: peerllm-host login",
33
+ });
34
+ process.exit(EXIT.notAuthenticated);
35
+ }
36
+ const e = err;
37
+ printError(e.message || "request failed", { json });
38
+ process.exit(EXIT.runtimeError);
39
+ }
40
+ function makeCreate() {
41
+ return new Command("create")
42
+ .description("Register a new host with PeerLLM")
43
+ .option("--name <hostName>", "host display name (default: machine hostname)")
44
+ .option("--config-dir <path>", "override config directory")
45
+ .option("--json", "machine-readable JSON output")
46
+ .action(async (opts) => {
47
+ const services = buildClientServices({ configDir: opts.configDir });
48
+ const token = await requireToken(services, opts.json);
49
+ const existing = await services.config.load();
50
+ const machineName = opts.name ?? existing.hostName ?? hostname();
51
+ try {
52
+ const result = await services.backend.request({
53
+ method: "POST",
54
+ path: "/api/hosts",
55
+ bearerToken: token,
56
+ body: {
57
+ HostId: null,
58
+ MachineName: machineName,
59
+ HostOS: platform(),
60
+ HostArch: arch(),
61
+ HostVersion: "0.1.0",
62
+ },
63
+ });
64
+ await services.config.update((c) => ({
65
+ ...c,
66
+ hostId: result.hostId,
67
+ hostName: machineName,
68
+ }));
69
+ if (opts.json) {
70
+ process.stdout.write(JSON.stringify({ hostId: result.hostId, hostName: machineName }) + "\n");
71
+ }
72
+ else {
73
+ process.stdout.write(` host registered: ${machineName}\n`);
74
+ process.stdout.write(` hostId: ${result.hostId}\n`);
75
+ process.stdout.write(` note: approval can take 24–48 hours\n`);
76
+ }
77
+ process.exit(EXIT.ok);
78
+ }
79
+ catch (err) {
80
+ handleBackendError(err, opts.json);
81
+ }
82
+ });
83
+ }
84
+ function makeLink() {
85
+ return new Command("link")
86
+ .description("Link an existing host id to this CLI")
87
+ .argument("<hostId>", "host id to link")
88
+ .option("--config-dir <path>", "override config directory")
89
+ .option("--json", "machine-readable JSON output")
90
+ .action(async (hostId, opts) => {
91
+ const services = buildClientServices({ configDir: opts.configDir });
92
+ const token = await requireToken(services, opts.json);
93
+ try {
94
+ await services.backend.request({
95
+ method: "POST",
96
+ path: "/user-hosts/link",
97
+ bearerToken: token,
98
+ body: { hostId },
99
+ });
100
+ await services.config.update((c) => ({ ...c, hostId }));
101
+ if (opts.json) {
102
+ process.stdout.write(JSON.stringify({ linked: true, hostId }) + "\n");
103
+ }
104
+ else {
105
+ process.stdout.write(` linked host ${hostId}\n`);
106
+ }
107
+ process.exit(EXIT.ok);
108
+ }
109
+ catch (err) {
110
+ handleBackendError(err, opts.json);
111
+ }
112
+ });
113
+ }
114
+ function makeRename() {
115
+ return new Command("rename")
116
+ .description("Change the display name for this host")
117
+ .argument("<hostName>", "new display name")
118
+ .option("--config-dir <path>", "override config directory")
119
+ .option("--json", "machine-readable JSON output")
120
+ .action(async (hostName, opts) => {
121
+ const services = buildClientServices({ configDir: opts.configDir });
122
+ // Try the daemon first so the orchestrator label is updated atomically.
123
+ const client = new IpcClient(services.paths.ipcEndpoint);
124
+ let daemonHandled = false;
125
+ try {
126
+ await client.connect();
127
+ await client.call(METHOD.hostRename, { hostName });
128
+ daemonHandled = true;
129
+ }
130
+ catch (err) {
131
+ if (!(err instanceof DaemonUnreachableError)) {
132
+ client.close();
133
+ printError(err.message, { json: opts.json });
134
+ process.exit(EXIT.runtimeError);
135
+ }
136
+ }
137
+ finally {
138
+ client.close();
139
+ }
140
+ if (!daemonHandled) {
141
+ // Daemon not running — update local config only. The label syncs
142
+ // to the orchestrator on the next start.
143
+ await services.config.update((c) => ({ ...c, hostName }));
144
+ }
145
+ if (opts.json) {
146
+ process.stdout.write(JSON.stringify({ renamed: true, hostName, syncedToOrchestrator: daemonHandled }) +
147
+ "\n");
148
+ }
149
+ else {
150
+ process.stdout.write(` host renamed to ${hostName}\n`);
151
+ if (!daemonHandled) {
152
+ process.stdout.write(` (daemon not running — label will sync on next start)\n`);
153
+ }
154
+ }
155
+ process.exit(EXIT.ok);
156
+ });
157
+ }
158
+ function makeList() {
159
+ return new Command("list")
160
+ .description("List hosts owned by the logged-in user")
161
+ .option("--config-dir <path>", "override config directory")
162
+ .option("--json", "machine-readable JSON output")
163
+ .action(async (opts) => {
164
+ const services = buildClientServices({ configDir: opts.configDir });
165
+ const token = await requireToken(services, opts.json);
166
+ const cfg = await services.config.load();
167
+ if (!cfg.userId) {
168
+ printError("userId is missing from local config", {
169
+ json: opts.json,
170
+ hint: "Try logging in again: peerllm-host login",
171
+ });
172
+ process.exit(EXIT.runtimeError);
173
+ }
174
+ try {
175
+ const hosts = await services.backend.request({
176
+ method: "GET",
177
+ path: `/user-hosts/for-user/${cfg.userId}`,
178
+ bearerToken: token,
179
+ });
180
+ if (opts.json) {
181
+ process.stdout.write(JSON.stringify(hosts, null, 2) + "\n");
182
+ }
183
+ else if (hosts.length === 0) {
184
+ process.stdout.write("no hosts registered\n");
185
+ }
186
+ else {
187
+ for (const h of hosts) {
188
+ const marker = h.hostId === cfg.hostId ? "* " : " ";
189
+ process.stdout.write(`${marker}${h.hostId} ${h.role ?? ""}\n`);
190
+ }
191
+ }
192
+ process.exit(EXIT.ok);
193
+ }
194
+ catch (err) {
195
+ handleBackendError(err, opts.json);
196
+ }
197
+ });
198
+ }
199
+ function makeDelete() {
200
+ return new Command("delete")
201
+ .description("Delete the linked host (removes from PeerLLM + clears local hostId)")
202
+ .option("--yes", "skip the interactive confirmation prompt")
203
+ .option("--config-dir <path>", "override config directory")
204
+ .option("--json", "machine-readable JSON output")
205
+ .action(async (opts) => {
206
+ const services = buildClientServices({ configDir: opts.configDir });
207
+ const cfg = await services.config.load();
208
+ if (!cfg.hostId) {
209
+ printError("no host is linked", {
210
+ json: opts.json,
211
+ hint: "Nothing to delete.",
212
+ });
213
+ process.exit(EXIT.userError);
214
+ }
215
+ if (!opts.yes) {
216
+ const confirmed = await promptYesNo(`Delete host ${cfg.hostId}? This cannot be undone.`, false);
217
+ if (!confirmed) {
218
+ printError("aborted", { json: opts.json });
219
+ process.exit(EXIT.userError);
220
+ }
221
+ }
222
+ const token = await requireToken(services, opts.json);
223
+ try {
224
+ await services.backend.request({
225
+ method: "DELETE",
226
+ path: `/api/hosts/${cfg.hostId}`,
227
+ bearerToken: token,
228
+ });
229
+ await services.config.update((c) => ({ ...c, hostId: undefined }));
230
+ if (opts.json) {
231
+ process.stdout.write(JSON.stringify({ deleted: true }) + "\n");
232
+ }
233
+ else {
234
+ process.stdout.write("host deleted\n");
235
+ }
236
+ process.exit(EXIT.ok);
237
+ }
238
+ catch (err) {
239
+ handleBackendError(err, opts.json);
240
+ }
241
+ });
242
+ }
243
+ export function makeHostCommand() {
244
+ return new Command("host")
245
+ .description("Manage this host's registration with PeerLLM")
246
+ .addCommand(makeCreate())
247
+ .addCommand(makeLink())
248
+ .addCommand(makeRename())
249
+ .addCommand(makeList())
250
+ .addCommand(makeDelete());
251
+ }
252
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../../src/cli/commands/host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function makeLoginCommand(): Command;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,gBAAgB,IAAI,OAAO,CA+C1C"}
@@ -0,0 +1,51 @@
1
+ import { Command } from "commander";
2
+ import { EXIT } from "../exit-codes.js";
3
+ import { printError } from "../format.js";
4
+ import { prompt, promptPassword, readStdinUntilEnd } from "../prompts.js";
5
+ import { buildClientServices } from "../services.js";
6
+ export function makeLoginCommand() {
7
+ return new Command("login")
8
+ .description("Log in with your PeerLLM email + password")
9
+ .option("--email <email>", "email address (skips the prompt)")
10
+ .option("--password-stdin", "read password from stdin (non-interactive)")
11
+ .option("--config-dir <path>", "override config directory")
12
+ .option("--json", "machine-readable JSON output")
13
+ .action(async (opts) => {
14
+ const services = buildClientServices({ configDir: opts.configDir });
15
+ const email = opts.email ?? (await prompt("Email: ")).trim();
16
+ if (!email) {
17
+ printError("email is required", { json: opts.json });
18
+ process.exit(EXIT.userError);
19
+ }
20
+ const password = opts.passwordStdin
21
+ ? await readStdinUntilEnd()
22
+ : await promptPassword("Password: ");
23
+ if (!password) {
24
+ printError("password is required", { json: opts.json });
25
+ process.exit(EXIT.userError);
26
+ }
27
+ try {
28
+ const result = await services.auth.login(email, password);
29
+ if (opts.json) {
30
+ process.stdout.write(JSON.stringify({ loggedIn: true, email, userId: result.userId }) + "\n");
31
+ }
32
+ else {
33
+ process.stdout.write(` logged in as ${email}\n`);
34
+ process.stdout.write(` refresh token saved to ${services.paths.secretsFile}\n`);
35
+ }
36
+ process.exit(EXIT.ok);
37
+ }
38
+ catch (err) {
39
+ const e = err;
40
+ const message = e.status === 401
41
+ ? "invalid email or password"
42
+ : e.message || "login failed";
43
+ printError(message, {
44
+ json: opts.json,
45
+ hint: e.status === 0 ? "Check your internet connection." : undefined,
46
+ });
47
+ process.exit(e.status === 401 ? EXIT.notAuthenticated : EXIT.runtimeError);
48
+ }
49
+ });
50
+ }
51
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function makeLogoutCommand(): Command;
3
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,iBAAiB,IAAI,OAAO,CAoB3C"}
@@ -0,0 +1,28 @@
1
+ import { Command } from "commander";
2
+ import { EXIT } from "../exit-codes.js";
3
+ import { printError } from "../format.js";
4
+ import { buildClientServices } from "../services.js";
5
+ export function makeLogoutCommand() {
6
+ return new Command("logout")
7
+ .description("Clear your refresh token from this machine")
8
+ .option("--config-dir <path>", "override config directory")
9
+ .option("--json", "machine-readable JSON output")
10
+ .action(async (opts) => {
11
+ const services = buildClientServices({ configDir: opts.configDir });
12
+ try {
13
+ await services.auth.logout();
14
+ if (opts.json) {
15
+ process.stdout.write(JSON.stringify({ loggedOut: true }) + "\n");
16
+ }
17
+ else {
18
+ process.stdout.write("logged out\n");
19
+ }
20
+ process.exit(EXIT.ok);
21
+ }
22
+ catch (err) {
23
+ printError(err.message, { json: opts.json });
24
+ process.exit(EXIT.runtimeError);
25
+ }
26
+ });
27
+ }
28
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;SACzB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;SAC1D,MAAM,CAAC,QAAQ,EAAE,8BAA8B,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,IAA4C,EAAE,EAAE;QAC7D,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAE,GAAa,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function makeLogsCommand(): Command;
3
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4JpC,wBAAgB,eAAe,IAAI,OAAO,CAMzC"}
@@ -0,0 +1,157 @@
1
+ import { createReadStream, existsSync, readdirSync, statSync } from "node:fs";
2
+ import { open } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { setTimeout as delay } from "node:timers/promises";
5
+ import { Command } from "commander";
6
+ import { resolvePaths } from "../../core/paths.js";
7
+ import { EXIT } from "../exit-codes.js";
8
+ import { printError } from "../format.js";
9
+ function listLogFiles(logsDir) {
10
+ if (!existsSync(logsDir))
11
+ return [];
12
+ return readdirSync(logsDir)
13
+ .filter((f) => f.endsWith(".log"))
14
+ .map((f) => {
15
+ const match = f.match(/^host-(\d{4}-\d{2}-\d{2})\.log$/);
16
+ const path = join(logsDir, f);
17
+ const stat = statSync(path);
18
+ return {
19
+ date: match?.[1] ?? f.replace(/\.log$/, ""),
20
+ path,
21
+ sizeBytes: stat.size,
22
+ };
23
+ })
24
+ .sort((a, b) => a.date.localeCompare(b.date));
25
+ }
26
+ function makeList() {
27
+ return new Command("list")
28
+ .description("List dated log files")
29
+ .option("--config-dir <path>", "override config directory")
30
+ .option("--json", "machine-readable JSON output")
31
+ .action(async (opts) => {
32
+ const paths = resolvePaths({ configDirOverride: opts.configDir });
33
+ const files = listLogFiles(paths.logsDir);
34
+ if (opts.json) {
35
+ process.stdout.write(JSON.stringify(files, null, 2) + "\n");
36
+ }
37
+ else if (files.length === 0) {
38
+ process.stdout.write(`no logs in ${paths.logsDir}\n`);
39
+ }
40
+ else {
41
+ for (const f of files) {
42
+ const mb = (f.sizeBytes / 1024 / 1024).toFixed(2);
43
+ process.stdout.write(`${f.date} ${mb.padStart(7)} MB ${f.path}\n`);
44
+ }
45
+ }
46
+ process.exit(EXIT.ok);
47
+ });
48
+ }
49
+ function makeShow() {
50
+ return new Command("show")
51
+ .description("Print a single day's log file")
52
+ .argument("[date]", "YYYY-MM-DD (default: today)")
53
+ .option("--config-dir <path>", "override config directory")
54
+ .action(async (date, opts) => {
55
+ const paths = resolvePaths({ configDirOverride: opts.configDir });
56
+ const day = date ?? new Date().toISOString().slice(0, 10);
57
+ const file = join(paths.logsDir, `host-${day}.log`);
58
+ if (!existsSync(file)) {
59
+ printError(`no log file for ${day}`, {
60
+ hint: `Run 'peerllm-host logs list' to see available dates.`,
61
+ });
62
+ process.exit(EXIT.userError);
63
+ }
64
+ const stream = createReadStream(file, { encoding: "utf8" });
65
+ stream.on("data", (chunk) => process.stdout.write(chunk));
66
+ await new Promise((resolve, reject) => {
67
+ stream.on("end", resolve);
68
+ stream.on("error", reject);
69
+ });
70
+ process.exit(EXIT.ok);
71
+ });
72
+ }
73
+ async function tailLast(file, lines) {
74
+ const handle = await open(file, "r");
75
+ try {
76
+ const stat = await handle.stat();
77
+ const chunkSize = 64 * 1024;
78
+ let position = stat.size;
79
+ let collected = "";
80
+ while (position > 0 && collected.split("\n").length <= lines + 1) {
81
+ const len = Math.min(chunkSize, position);
82
+ position -= len;
83
+ const buf = Buffer.alloc(len);
84
+ await handle.read(buf, 0, len, position);
85
+ collected = buf.toString("utf8") + collected;
86
+ }
87
+ const all = collected.split("\n");
88
+ return all.slice(Math.max(0, all.length - lines)).join("\n");
89
+ }
90
+ finally {
91
+ await handle.close();
92
+ }
93
+ }
94
+ function makeTail() {
95
+ return new Command("tail")
96
+ .description("Print the last N lines of today's log file, optionally follow")
97
+ .option("-n, --lines <count>", "number of lines", "50")
98
+ .option("-f, --follow", "follow appended output")
99
+ .option("--config-dir <path>", "override config directory")
100
+ .action(async (opts) => {
101
+ const paths = resolvePaths({ configDirOverride: opts.configDir });
102
+ const day = new Date().toISOString().slice(0, 10);
103
+ const file = join(paths.logsDir, `host-${day}.log`);
104
+ const count = Number.parseInt(opts.lines, 10);
105
+ if (!Number.isFinite(count) || count <= 0) {
106
+ printError("--lines must be a positive integer");
107
+ process.exit(EXIT.userError);
108
+ }
109
+ if (!existsSync(file)) {
110
+ // Wait for it if we're in follow mode; otherwise show empty state.
111
+ if (!opts.follow) {
112
+ process.stdout.write(`(no log for ${day} yet)\n`);
113
+ process.exit(EXIT.ok);
114
+ }
115
+ }
116
+ else {
117
+ const last = await tailLast(file, count);
118
+ if (last)
119
+ process.stdout.write(last + (last.endsWith("\n") ? "" : "\n"));
120
+ }
121
+ if (!opts.follow) {
122
+ process.exit(EXIT.ok);
123
+ }
124
+ let lastSize = existsSync(file) ? statSync(file).size : 0;
125
+ const stop = () => process.exit(EXIT.ok);
126
+ process.on("SIGINT", stop);
127
+ process.on("SIGTERM", stop);
128
+ for (;;) {
129
+ await delay(500);
130
+ if (!existsSync(file))
131
+ continue;
132
+ const size = statSync(file).size;
133
+ if (size > lastSize) {
134
+ const stream = createReadStream(file, {
135
+ encoding: "utf8",
136
+ start: lastSize,
137
+ end: size - 1,
138
+ });
139
+ stream.on("data", (chunk) => process.stdout.write(chunk));
140
+ await new Promise((resolve) => stream.on("end", resolve));
141
+ lastSize = size;
142
+ }
143
+ else if (size < lastSize) {
144
+ // File rotated (new day). Reset and start at 0.
145
+ lastSize = 0;
146
+ }
147
+ }
148
+ });
149
+ }
150
+ export function makeLogsCommand() {
151
+ return new Command("logs")
152
+ .description("View daemon logs")
153
+ .addCommand(makeList())
154
+ .addCommand(makeShow())
155
+ .addCommand(makeTail());
156
+ }
157
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function makeModelsCommand(): Command;
3
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/models.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoOpC,wBAAgB,iBAAiB,IAAI,OAAO,CAO3C"}