@leemour/cli-messaging 0.39.0 → 0.41.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 (92) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/index.d.ts +3 -2
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +2 -1
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/messenger/after.d.ts +5 -0
  7. package/dist/cli/messenger/after.d.ts.map +1 -0
  8. package/dist/cli/messenger/after.js +10 -0
  9. package/dist/cli/messenger/after.js.map +1 -0
  10. package/dist/cli/messenger/backfill-jobs.d.ts +1 -5
  11. package/dist/cli/messenger/backfill-jobs.d.ts.map +1 -1
  12. package/dist/cli/messenger/backfill-jobs.js +4 -27
  13. package/dist/cli/messenger/backfill-jobs.js.map +1 -1
  14. package/dist/cli/messenger/chats-command.d.ts +32 -0
  15. package/dist/cli/messenger/chats-command.d.ts.map +1 -1
  16. package/dist/cli/messenger/chats-command.js +90 -4
  17. package/dist/cli/messenger/chats-command.js.map +1 -1
  18. package/dist/cli/messenger/context.d.ts +2 -0
  19. package/dist/cli/messenger/context.d.ts.map +1 -1
  20. package/dist/cli/messenger/context.js.map +1 -1
  21. package/dist/cli/messenger/messages-command.d.ts +1 -1
  22. package/dist/cli/messenger/messages-command.d.ts.map +1 -1
  23. package/dist/cli/messenger/messages-command.js +16 -6
  24. package/dist/cli/messenger/messages-command.js.map +1 -1
  25. package/dist/cli/messenger/models-command.d.ts +9 -0
  26. package/dist/cli/messenger/models-command.d.ts.map +1 -0
  27. package/dist/cli/messenger/models-command.js +69 -0
  28. package/dist/cli/messenger/models-command.js.map +1 -0
  29. package/dist/cli/messenger/port.d.ts +16 -1
  30. package/dist/cli/messenger/port.d.ts.map +1 -1
  31. package/dist/cli/messenger/port.js.map +1 -1
  32. package/dist/cli/messenger/processes.d.ts +9 -0
  33. package/dist/cli/messenger/processes.d.ts.map +1 -0
  34. package/dist/cli/messenger/processes.js +37 -0
  35. package/dist/cli/messenger/processes.js.map +1 -0
  36. package/dist/cli/messenger/serve-command.d.ts +4 -5
  37. package/dist/cli/messenger/serve-command.d.ts.map +1 -1
  38. package/dist/cli/messenger/serve-command.js +14 -22
  39. package/dist/cli/messenger/serve-command.js.map +1 -1
  40. package/dist/cli/messenger/server-command.d.ts +27 -0
  41. package/dist/cli/messenger/server-command.d.ts.map +1 -0
  42. package/dist/cli/messenger/server-command.js +453 -0
  43. package/dist/cli/messenger/server-command.js.map +1 -0
  44. package/dist/cli/messenger/transcribe-command.d.ts +1 -1
  45. package/dist/cli/messenger/transcribe-command.d.ts.map +1 -1
  46. package/dist/cli/messenger/transcribe-command.js +16 -7
  47. package/dist/cli/messenger/transcribe-command.js.map +1 -1
  48. package/dist/cli/messenger/watch-command.d.ts +2 -1
  49. package/dist/cli/messenger/watch-command.d.ts.map +1 -1
  50. package/dist/cli/messenger/watch-command.js +2 -2
  51. package/dist/cli/messenger/watch-command.js.map +1 -1
  52. package/dist/cli/settings.d.ts +4 -0
  53. package/dist/cli/settings.d.ts.map +1 -1
  54. package/dist/cli/settings.js +2 -0
  55. package/dist/cli/settings.js.map +1 -1
  56. package/dist/domain/models.d.ts +26 -0
  57. package/dist/domain/models.d.ts.map +1 -1
  58. package/dist/mcp/server.js +1 -1
  59. package/dist/mcp/server.js.map +1 -1
  60. package/dist/mcp/tool.d.ts +4 -0
  61. package/dist/mcp/tool.d.ts.map +1 -1
  62. package/dist/mcp/tool.js.map +1 -1
  63. package/dist/mcp/tools/chats.d.ts.map +1 -1
  64. package/dist/mcp/tools/chats.js +30 -5
  65. package/dist/mcp/tools/chats.js.map +1 -1
  66. package/dist/mcp/tools/messages-transcribe.d.ts.map +1 -1
  67. package/dist/mcp/tools/messages-transcribe.js +15 -8
  68. package/dist/mcp/tools/messages-transcribe.js.map +1 -1
  69. package/dist/mcp/tools/messages.d.ts.map +1 -1
  70. package/dist/mcp/tools/messages.js +15 -5
  71. package/dist/mcp/tools/messages.js.map +1 -1
  72. package/dist/speech/install.d.ts +23 -0
  73. package/dist/speech/install.d.ts.map +1 -0
  74. package/dist/speech/install.js +106 -0
  75. package/dist/speech/install.js.map +1 -0
  76. package/dist/speech/models.d.ts +38 -0
  77. package/dist/speech/models.d.ts.map +1 -0
  78. package/dist/speech/models.js +130 -0
  79. package/dist/speech/models.js.map +1 -0
  80. package/dist/speech/recognize.d.ts +24 -0
  81. package/dist/speech/recognize.d.ts.map +1 -0
  82. package/dist/speech/recognize.js +106 -0
  83. package/dist/speech/recognize.js.map +1 -0
  84. package/dist/speech/transcribe.d.ts +36 -0
  85. package/dist/speech/transcribe.d.ts.map +1 -0
  86. package/dist/speech/transcribe.js +80 -0
  87. package/dist/speech/transcribe.js.map +1 -0
  88. package/package.json +3 -1
  89. package/dist/cli/messenger/service-command.d.ts +0 -21
  90. package/dist/cli/messenger/service-command.d.ts.map +0 -1
  91. package/dist/cli/messenger/service-command.js +0 -305
  92. package/dist/cli/messenger/service-command.js.map +0 -1
@@ -0,0 +1,453 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ import { closeSync, existsSync, mkdirSync, openSync, readFileSync, realpathSync, rmSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { setTimeout as sleep } from "node:timers/promises";
5
+ import { CliError, resolvePaths, writeSecurely } from "@leemour/cli-core";
6
+ import { Command } from "commander";
7
+ import { environmentOf } from "../context.js";
8
+ import { messengerContext } from "./context.js";
9
+ import { alive, carries } from "./processes.js";
10
+ import { lockPath, readLock } from "./serve-command.js";
11
+ const runProgram = (argv, env) => new Promise((resolve, reject) => {
12
+ const [file = "", ...args] = argv;
13
+ execFile(file, args, { env, encoding: "utf8" }, (error, stdout, stderr) => {
14
+ if (error?.code === "ENOENT") {
15
+ reject(new CliError("configuration_error", `${file} was not found — this machine has no ${file} to run serve`));
16
+ return;
17
+ }
18
+ resolve({ code: typeof error?.code === "number" ? error.code : error ? 1 : 0, stdout, stderr });
19
+ });
20
+ });
21
+ const thisMachine = () => {
22
+ const entry = [process.execPath, realpathSync(process.argv[1] ?? "")];
23
+ return {
24
+ platform: process.platform,
25
+ run: runProgram,
26
+ entry,
27
+ uid: process.getuid?.() ?? 0,
28
+ spawn: (argv, env, log) => {
29
+ mkdirSync(dirname(log), { recursive: true, mode: 0o700 });
30
+ const out = openSync(log, "a", 0o600);
31
+ try {
32
+ const [file = "", ...rest] = entry;
33
+ const child = spawn(file, [...rest, ...argv], { detached: true, stdio: ["ignore", out, out], env });
34
+ child.unref();
35
+ return child.pid ?? 0;
36
+ }
37
+ finally {
38
+ closeSync(out);
39
+ }
40
+ },
41
+ pause: () => sleep(250),
42
+ };
43
+ };
44
+ /** How many looks, a pause apart, `start` gives `serve` to connect — about 30 seconds on a real machine. */
45
+ const LOOKS = 120;
46
+ /**
47
+ * Only the variables that say **where** the files are travel into the unit: a unit written from a
48
+ * development checkout must open that checkout's session and store, never the owner's real ones.
49
+ * Nothing that could hold a credential is copied.
50
+ */
51
+ const locationVariables = (app, env) => {
52
+ const names = [
53
+ ...["CONFIG_DIR", "STATE_DIR", "CACHE_DIR"].map((name) => `${app.envPrefix}_${name}`),
54
+ "MESSAGING_STORE",
55
+ "MESSAGING_STATE_DIR",
56
+ ];
57
+ return Object.fromEntries(names.flatMap((name) => (env[name] === undefined ? [] : [[name, env[name]]])));
58
+ };
59
+ const home = (env) => {
60
+ if (!env.HOME)
61
+ throw new CliError("configuration_error", "HOME is not set, so there is nowhere to put the unit");
62
+ return env.HOME;
63
+ };
64
+ /** `%` is a specifier in both; `$` is a variable only in `ExecStart=` — in `Environment=` it is itself. */
65
+ const systemdQuote = (value, { command = false } = {}) => {
66
+ const quoted = value.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replaceAll("%", "%%");
67
+ return `"${command ? quoted.replaceAll("$", "$$$$") : quoted}"`;
68
+ };
69
+ const systemd = (app, system, env) => {
70
+ const folder = join(env.XDG_CONFIG_HOME ?? join(home(env), ".config"), "systemd", "user");
71
+ const checked = async (argv) => {
72
+ const ran = await system.run(argv, env);
73
+ if (ran.code !== 0)
74
+ throw new CliError("configuration_error", `${argv.join(" ")} failed: ${ran.stderr.trim()}`);
75
+ return ran.stdout;
76
+ };
77
+ return {
78
+ unit: (base) => {
79
+ const name = `${app.command}-serve-${base.profile}.service`;
80
+ return { ...base, name, path: join(folder, name) };
81
+ },
82
+ text: (unit) => [
83
+ "[Unit]",
84
+ `Description=${app.command} serve — keep the local message archive current (profile ${unit.profile})`,
85
+ "",
86
+ "[Service]",
87
+ `ExecStart=${unit.command.map((word) => systemdQuote(word, { command: true })).join(" ")}`,
88
+ ...Object.entries(unit.environment).map(([name, value]) => `Environment=${systemdQuote(`${name}=${value}`)}`),
89
+ "Restart=on-failure",
90
+ "RestartSec=30",
91
+ "",
92
+ "[Install]",
93
+ "WantedBy=default.target",
94
+ "",
95
+ ].join("\n"),
96
+ start: (unit) => [
97
+ ["systemctl", "--user", "daemon-reload"],
98
+ ["systemctl", "--user", "start", unit.name],
99
+ ],
100
+ stop: (unit) => [["systemctl", "--user", "stop", unit.name]],
101
+ state: async (unit) => {
102
+ const ran = await system.run([
103
+ "systemctl",
104
+ "--user",
105
+ "show",
106
+ unit.name,
107
+ "-p",
108
+ "LoadState",
109
+ "-p",
110
+ "ActiveState",
111
+ "-p",
112
+ "SubState",
113
+ "-p",
114
+ "MainPID",
115
+ ], env);
116
+ const fields = Object.fromEntries(ran.stdout
117
+ .split("\n")
118
+ .filter((line) => line.includes("="))
119
+ .map((line) => [line.slice(0, line.indexOf("=")), line.slice(line.indexOf("=") + 1)]));
120
+ const pid = Number(fields.MainPID);
121
+ return {
122
+ loaded: fields.LoadState === "loaded",
123
+ active: fields.ActiveState === "active",
124
+ ...(pid > 0 ? { pid } : {}),
125
+ ...(fields.ActiveState ? { detail: `${fields.ActiveState} (${fields.SubState})` } : {}),
126
+ };
127
+ },
128
+ logs: (unit, lines) => checked(["journalctl", "--user", "-u", unit.name, "-n", String(lines), "--no-pager"]),
129
+ atLogin: (unit) => `at every login too: systemctl --user enable ${unit.name.replace(/\.service$/, "")}`,
130
+ };
131
+ };
132
+ const xml = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
133
+ const launchd = (app, system, env) => {
134
+ const folder = join(home(env), "Library", "LaunchAgents");
135
+ const domain = `gui/${system.uid}`;
136
+ return {
137
+ unit: (base) => {
138
+ const name = `${app.appName}.serve.${base.profile}`;
139
+ return { ...base, name, path: join(folder, `${name}.plist`) };
140
+ },
141
+ text: (unit) => [
142
+ '<?xml version="1.0" encoding="UTF-8"?>',
143
+ '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">',
144
+ '<plist version="1.0">',
145
+ "<dict>",
146
+ ` <key>Label</key><string>${xml(unit.name)}</string>`,
147
+ " <key>ProgramArguments</key>",
148
+ " <array>",
149
+ ...unit.command.map((word) => ` <string>${xml(word)}</string>`),
150
+ " </array>",
151
+ " <key>EnvironmentVariables</key>",
152
+ " <dict>",
153
+ ...Object.entries(unit.environment).map(([name, value]) => ` <key>${xml(name)}</key><string>${xml(value)}</string>`),
154
+ " </dict>",
155
+ // launchd loads every agent here at login; disabled, it waits for `server start` to enable it.
156
+ " <key>Disabled</key><true/>",
157
+ " <key>RunAtLoad</key><true/>",
158
+ " <key>KeepAlive</key><dict><key>SuccessfulExit</key><false/></dict>",
159
+ " <key>ThrottleInterval</key><integer>30</integer>",
160
+ ` <key>StandardOutPath</key><string>${xml(unit.logPath ?? "")}</string>`,
161
+ ` <key>StandardErrorPath</key><string>${xml(unit.logPath ?? "")}</string>`,
162
+ "</dict>",
163
+ "</plist>",
164
+ "",
165
+ ].join("\n"),
166
+ // RunAtLoad makes loading the agent the start; `enable` overrides the file's Disabled until `disable`.
167
+ start: (unit) => [
168
+ ["launchctl", "enable", `${domain}/${unit.name}`],
169
+ ["launchctl", "bootstrap", domain, unit.path],
170
+ ],
171
+ stop: (unit) => [
172
+ ["launchctl", "bootout", `${domain}/${unit.name}`],
173
+ ["launchctl", "disable", `${domain}/${unit.name}`],
174
+ ],
175
+ state: async (unit) => {
176
+ const ran = await system.run(["launchctl", "print", `${domain}/${unit.name}`], env);
177
+ if (ran.code !== 0)
178
+ return { loaded: false, active: false };
179
+ const state = /^\s*state = (.+)$/m.exec(ran.stdout)?.[1]?.trim();
180
+ const pid = Number(/^\s*pid = (\d+)$/m.exec(ran.stdout)?.[1]);
181
+ return {
182
+ loaded: true,
183
+ active: state === "running",
184
+ ...(pid > 0 ? { pid } : {}),
185
+ ...(state ? { detail: state } : {}),
186
+ };
187
+ },
188
+ // launchd opens the log itself and does not create its folder.
189
+ prepare: (unit) => {
190
+ if (unit.logPath)
191
+ mkdirSync(dirname(unit.logPath), { recursive: true, mode: 0o700 });
192
+ },
193
+ logs: async (unit, lines) => tail(unit.logPath, lines),
194
+ atLogin: () => "from then on it also starts at every login, until `server stop`",
195
+ };
196
+ };
197
+ const tail = (path, lines) => path && existsSync(path) ? `${readFileSync(path, "utf8").split("\n").filter(Boolean).slice(-lines).join("\n")}\n` : "";
198
+ /** Where there is neither: `start` still runs serve in the background; only `install` needs one of them. */
199
+ const noUnits = (app, system) => {
200
+ const refuse = () => {
201
+ throw new CliError("validation_error", `${app.command} server install knows systemd (Linux) and launchd (macOS), not ${system.platform} — \`${app.command} server start\` runs serve without a unit`);
202
+ };
203
+ return {
204
+ unit: (base) => ({ ...base, name: `${app.command}-serve-${base.profile}`, path: "" }),
205
+ text: refuse,
206
+ start: refuse,
207
+ stop: refuse,
208
+ state: async () => ({ loaded: false, active: false }),
209
+ logs: async () => "",
210
+ atLogin: () => "",
211
+ };
212
+ };
213
+ const platformFor = (app, system, env) => {
214
+ if (system.platform === "linux")
215
+ return systemd(app, system, env);
216
+ if (system.platform === "darwin")
217
+ return launchd(app, system, env);
218
+ return noUnits(app, system);
219
+ };
220
+ /** A person reads paths under their home as `~/…`. */
221
+ const tilde = (path, env) => env.HOME && path.startsWith(`${env.HOME}/`) ? `~${path.slice(env.HOME.length)}` : path;
222
+ /** Local time, and the date too when it is not today. */
223
+ const clock = (iso) => {
224
+ const when = new Date(iso);
225
+ const time = when.toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit" });
226
+ return when.toDateString() === new Date().toDateString() ? time : `${when.toLocaleDateString("sv-SE")} ${time}`;
227
+ };
228
+ /**
229
+ * `serve` in the background, the way max-cli's `server` is: `start`, `stop`, `restart`, `status`,
230
+ * `logs`. Without a unit, `start` runs `serve` as a process of its own; with one — `install`, a
231
+ * systemd user unit or a launchd agent — it goes through systemd or launchd. **Nothing starts until
232
+ * `start` is typed** (NEED-9): `install` only writes the file.
233
+ */
234
+ export const serverCommand = (messenger) => {
235
+ const { app } = messenger;
236
+ const command = new Command("server").description(`\`${app.command} serve\` in the background: start, stop, restart, status, logs; install adds a systemd or launchd unit`);
237
+ const marker = (profile) => `${app.envPrefix}_SERVER=${profile}`;
238
+ const prepare = (self) => {
239
+ const context = messengerContext(self, messenger);
240
+ const system = environmentOf(self).system ?? thisMachine();
241
+ const platform = platformFor(app, system, context.env);
242
+ const state = resolvePaths({ appName: app.appName, prefix: app.envPrefix, env: context.env }).state;
243
+ const unit = platform.unit({
244
+ profile: context.profile,
245
+ command: [...system.entry, "serve"],
246
+ environment: { [`${app.envPrefix}_PROFILE`]: context.profile, ...locationVariables(app, context.env) },
247
+ logPath: join(state, "serve", `${context.profile}.log`),
248
+ });
249
+ const each = async (argvs) => {
250
+ for (const argv of argvs) {
251
+ const ran = await system.run(argv, context.env);
252
+ if (ran.code !== 0)
253
+ throw new CliError("configuration_error", `${argv.join(" ")} failed: ${ran.stderr.trim()}`);
254
+ }
255
+ };
256
+ const lock = () => {
257
+ const held = readLock(lockPath(app, unit.profile, context.env));
258
+ return held && alive(held.pid) ? held : undefined;
259
+ };
260
+ const say = (value, lines) => {
261
+ if (context.format === "pretty")
262
+ context.streams.data(lines.join("\n"));
263
+ else
264
+ context.renderer.result(value);
265
+ };
266
+ return { context, system, platform, unit, each, lock, say };
267
+ };
268
+ const installed = (unit) => {
269
+ if (!existsSync(unit.path)) {
270
+ throw new CliError("not_found", `no unit for profile ${unit.profile} — \`${app.command} server install\` writes it`);
271
+ }
272
+ };
273
+ const byOf = async ({ platform, unit }, held) => {
274
+ if (existsSync(unit.path) && (await platform.state(unit)).pid === held.pid)
275
+ return "unit";
276
+ return carries(held.pid, marker(unit.profile)) ? "server" : "hand";
277
+ };
278
+ const how = (by, unit) => by === "unit"
279
+ ? `under ${unit.path.endsWith(".plist") ? "launchd" : "systemd"} (${unit.name})`
280
+ : by === "server"
281
+ ? `started by \`${app.command} server start\``
282
+ : `started by hand — \`${app.command} server stop\` leaves it alone`;
283
+ const start = async (prepared) => {
284
+ const { context, system, platform, unit, each, lock, say } = prepared;
285
+ const held = lock();
286
+ if (held) {
287
+ say({ profile: unit.profile, started: false, running: true, pid: held.pid, since: held.startedAt }, [
288
+ `Already serving profile ${unit.profile} since ${clock(held.startedAt)} (PID ${held.pid}).`,
289
+ ]);
290
+ return;
291
+ }
292
+ let by;
293
+ let spawned;
294
+ if (existsSync(unit.path)) {
295
+ await each(platform.start(unit));
296
+ by = "unit";
297
+ }
298
+ else {
299
+ // A shell's --timeout default would end a server meant to outlive the shell.
300
+ const { [`${app.envPrefix}_TIMEOUT`]: _timeout, ...inherited } = context.env;
301
+ const [name = "", value = ""] = marker(unit.profile).split("=");
302
+ spawned = system.spawn(["serve"], { ...inherited, [`${app.envPrefix}_PROFILE`]: unit.profile, [name]: value }, unit.logPath ?? "");
303
+ by = "server";
304
+ }
305
+ for (let look = 0; look < LOOKS; look++) {
306
+ const now = lock();
307
+ if (now?.listeningAt) {
308
+ say({ profile: unit.profile, started: true, by, pid: now.pid, listeningSince: now.listeningAt }, [
309
+ `Started: serving profile ${unit.profile} (PID ${now.pid}), listening since ${clock(now.listeningAt)}, ${how(by, unit)}.`,
310
+ `Its log: ${app.command} server logs`,
311
+ ]);
312
+ return;
313
+ }
314
+ const gone = spawned !== undefined ? !alive(spawned) : look > 8 && !(await platform.state(unit)).active;
315
+ if (gone) {
316
+ const last = (by === "unit" ? await platform.logs(unit, 5) : tail(unit.logPath, 5)).trim();
317
+ throw new CliError("provider_unavailable", `serve stopped before it was listening${last ? `:\n${last}` : ""}`);
318
+ }
319
+ await system.pause();
320
+ }
321
+ throw new CliError("timeout", `serve is running but not listening yet — \`${app.command} server status\`, \`${app.command} server logs\``);
322
+ };
323
+ const stop = async (prepared) => {
324
+ const { platform, unit, each, lock, say, system } = prepared;
325
+ if (existsSync(unit.path) && (await platform.state(unit)).active) {
326
+ await each(platform.stop(unit));
327
+ say({ profile: unit.profile, stopped: true, by: "unit" }, [`Stopped ${unit.name}.`]);
328
+ return;
329
+ }
330
+ const held = lock();
331
+ if (!held) {
332
+ say({ profile: unit.profile, stopped: false }, [`Nothing to stop: profile ${unit.profile} is not being served.`]);
333
+ return;
334
+ }
335
+ if (!carries(held.pid, marker(unit.profile))) {
336
+ throw new CliError("validation_error", `serve for profile ${unit.profile} (PID ${held.pid}) was not started by \`${app.command} server start\` — stop it where it runs`);
337
+ }
338
+ process.kill(held.pid, "SIGTERM");
339
+ for (let look = 0; look < LOOKS && alive(held.pid); look++)
340
+ await system.pause();
341
+ say({ profile: unit.profile, stopped: true, by: "server", pid: held.pid }, [
342
+ `Stopped serving profile ${unit.profile} (PID ${held.pid}).`,
343
+ ]);
344
+ };
345
+ command
346
+ .command("start")
347
+ .description("start serve in the background — through the unit if one is installed — and answer once it listens")
348
+ .action(async function () {
349
+ await start(prepare(this));
350
+ });
351
+ command
352
+ .command("stop")
353
+ .description("stop the serve that `server start` or the unit started")
354
+ .action(async function () {
355
+ await stop(prepare(this));
356
+ });
357
+ command
358
+ .command("restart")
359
+ .description("stop it and start it again")
360
+ .action(async function () {
361
+ const prepared = prepare(this);
362
+ await stop({ ...prepared, say: () => { } });
363
+ await start(prepared);
364
+ });
365
+ command
366
+ .command("status")
367
+ .description("whether serve runs for this profile, since when, who started it, and the unit if there is one")
368
+ .action(async function () {
369
+ const prepared = prepare(this);
370
+ const { context, platform, unit, lock, say } = prepared;
371
+ const isInstalled = existsSync(unit.path);
372
+ const state = isInstalled ? await platform.state(unit) : { loaded: false, active: false };
373
+ const held = lock();
374
+ const by = held ? await byOf(prepared, held) : null;
375
+ const unitLine = isInstalled
376
+ ? `Unit: ${tilde(unit.path, context.env)} — ${state.detail ?? (state.active ? "active" : "inactive")}.`
377
+ : `No unit installed — \`${app.command} server install\` adds one, for starting under systemd or launchd.`;
378
+ say({
379
+ profile: unit.profile,
380
+ running: held !== undefined,
381
+ ...(held
382
+ ? {
383
+ pid: held.pid,
384
+ since: held.startedAt,
385
+ listening: held.listeningAt !== undefined,
386
+ ...(held.listeningAt ? { listeningSince: held.listeningAt } : {}),
387
+ by,
388
+ }
389
+ : {}),
390
+ unit: { name: unit.name, path: unit.path, installed: isInstalled, ...state },
391
+ }, [
392
+ held
393
+ ? held.listeningAt
394
+ ? `Serving profile ${unit.profile} since ${clock(held.startedAt)} (PID ${held.pid}), listening since ${clock(held.listeningAt)}, ${how(by ?? "hand", unit)}.`
395
+ : `Starting profile ${unit.profile} since ${clock(held.startedAt)} (PID ${held.pid}) — not listening yet, ${how(by ?? "hand", unit)}.`
396
+ : `Not serving profile ${unit.profile}.${isInstalled && state.detail?.startsWith("failed") ? ` The unit failed — \`${app.command} server logs\`.` : ""}`,
397
+ unitLine,
398
+ ]);
399
+ });
400
+ command
401
+ .command("logs")
402
+ .description("serve's latest log lines — from the journal under systemd, else its log file")
403
+ .option("-n, --lines <n>", "how many lines", (value) => wholeNumber(value), 50)
404
+ .action(async function () {
405
+ const { lines } = this.opts();
406
+ const { context, platform, unit } = prepare(this);
407
+ const text = existsSync(unit.path) ? await platform.logs(unit, lines) : tail(unit.logPath, lines);
408
+ if (!text)
409
+ context.renderer.note(`no log yet for profile ${unit.profile}`);
410
+ if (context.format === "pretty") {
411
+ if (text)
412
+ context.streams.data(text.replace(/\n$/, ""));
413
+ }
414
+ else
415
+ context.renderer.result({ profile: unit.profile, unit: unit.name, lines: text.split("\n").filter(Boolean) });
416
+ });
417
+ command
418
+ .command("install")
419
+ .description("write a systemd user unit or a launchd agent for this profile; starts nothing")
420
+ .action(function () {
421
+ const { context, platform, unit, say } = prepare(this);
422
+ const replaced = existsSync(unit.path);
423
+ writeSecurely(unit.path, platform.text(unit, app), 0o644);
424
+ platform.prepare?.(unit);
425
+ say({ profile: unit.profile, unit: unit.name, path: unit.path, command: unit.command, replaced }, [
426
+ `${replaced ? "Rewrote" : "Wrote"} ${tilde(unit.path, context.env)} — nothing started.`,
427
+ `It runs: ${unit.command.map((word) => tilde(word, context.env)).join(" ")}`,
428
+ `Start it now: ${app.command} server start · ${platform.atLogin(unit)}`,
429
+ ]);
430
+ });
431
+ command
432
+ .command("uninstall")
433
+ .description("remove this profile's unit; stop it first")
434
+ .action(async function () {
435
+ const { context, platform, unit, say } = prepare(this);
436
+ installed(unit);
437
+ if ((await platform.state(unit)).active) {
438
+ throw new CliError("validation_error", `the unit is running — \`${app.command} server stop\` first`);
439
+ }
440
+ rmSync(unit.path, { force: true });
441
+ say({ profile: unit.profile, unit: unit.name, path: unit.path, removed: true }, [
442
+ `Removed ${tilde(unit.path, context.env)}.`,
443
+ ]);
444
+ });
445
+ return command;
446
+ };
447
+ const wholeNumber = (value) => {
448
+ const parsed = Number(value);
449
+ if (!Number.isInteger(parsed) || parsed < 1)
450
+ throw new CliError("validation_error", `"${value}" is not a count`);
451
+ return parsed;
452
+ };
453
+ //# sourceMappingURL=server-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/server-command.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Command } from "commander";
2
2
  import { type Messenger } from "./context.js";
3
- /** `messages transcribe`: a voice message as text, by the messenger's own speech recognition. */
3
+ /** `messages transcribe`: a voice message as text, by the messenger or by a model on this machine. */
4
4
  export declare const transcribeSubcommand: (messages: Command, messenger: Messenger) => Command;
5
5
  //# sourceMappingURL=transcribe-command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transcribe-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/transcribe-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAG/D,iGAAiG;AACjG,eAAO,MAAM,oBAAoB,aAAc,OAAO,aAAa,SAAS,KAAG,OAezE,CAAA"}
1
+ {"version":3,"file":"transcribe-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/transcribe-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAE/D,sGAAsG;AACtG,eAAO,MAAM,oBAAoB,aAAc,OAAO,aAAa,SAAS,KAAG,OAuBzE,CAAA"}
@@ -1,20 +1,29 @@
1
+ import { isInstalled } from "../../speech/install.js";
2
+ import { choose, hearLocally, hearOnline, notDownloaded } from "../../speech/transcribe.js";
1
3
  import { messengerContext } from "./context.js";
2
- import { capability } from "./port.js";
3
- /** `messages transcribe`: a voice message as text, by the messenger's own speech recognition. */
4
+ /** `messages transcribe`: a voice message as text, by the messenger or by a model on this machine. */
4
5
  export const transcribeSubcommand = (messages, messenger) => messages
5
6
  .command("transcribe")
6
- .description(`a voice message as text, transcribed by ${messenger.name ?? messenger.app.command}`)
7
+ .description(`a voice message as text — by ${messenger.name ?? messenger.app.command} where it can, else by a model on this machine`)
7
8
  .argument("<chat>", messenger.chatArgument)
8
9
  .argument("<message>", "the id of a voice message")
10
+ .option("--local", "use the model on this machine, never the messenger")
11
+ .option("--model <id>", "which downloaded model; implies --local (`models audio list`)")
9
12
  .action(async function (chat, messageId) {
10
13
  const context = messengerContext(this, messenger);
14
+ const choice = choose(messenger, context.settings, this.opts(), context.env);
15
+ // Before connecting: a missing model should not cost a login.
16
+ if (choice.with === "local" && !isInstalled(choice.model, choice.directory)) {
17
+ throw notDownloaded(messenger, choice.model);
18
+ }
11
19
  const id = messageId.trim();
12
- const transcript = await context.withMessenger((connection) => capability(connection, "transcribe", "transcribe voice messages")(chat, id));
13
- if (transcript.pending)
20
+ const online = await context.withMessenger((connection) => hearOnline(messenger, connection, chat, id, choice));
21
+ const heard = online instanceof Uint8Array ? await hearLocally(online, id, choice) : online;
22
+ if (heard.pending)
14
23
  context.renderer.note("the transcription was not finished yet — ask again later");
15
24
  if (context.format === "pretty")
16
- context.streams.data(`${transcript.text}\n`);
25
+ context.streams.data(`${heard.text}\n`);
17
26
  else
18
- context.renderer.result({ messageId: id, ...transcript });
27
+ context.renderer.result(heard);
19
28
  });
20
29
  //# sourceMappingURL=transcribe-command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transcribe-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/transcribe-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,iGAAiG;AACjG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAiB,EAAE,SAAoB,EAAW,EAAE,CACvF,QAAQ;KACL,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,2CAA2C,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;KACjG,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,YAAY,CAAC;KAC1C,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;KAClD,MAAM,CAAC,KAAK,WAA0B,IAAY,EAAE,SAAiB;IACpE,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACjD,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;IAC3B,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,UAAU,EAAE,EAAE,CAC5D,UAAU,CAAC,UAAU,EAAE,YAAY,EAAE,2BAA2B,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAC5E,CAAA;IACD,IAAI,UAAU,CAAC,OAAO;QAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;IACzG,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,CAAA;;QACxE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,UAAU,EAAE,CAAC,CAAA;AAChE,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"transcribe-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/transcribe-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,EAAE,MAAM,EAAc,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AACvG,OAAO,EAAkB,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/D,sGAAsG;AACtG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAiB,EAAE,SAAoB,EAAW,EAAE,CACvF,QAAQ;KACL,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CACV,gCAAgC,SAAS,CAAC,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,gDAAgD,CACxH;KACA,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,YAAY,CAAC;KAC1C,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;KAClD,MAAM,CAAC,SAAS,EAAE,oDAAoD,CAAC;KACvE,MAAM,CAAC,cAAc,EAAE,+DAA+D,CAAC;KACvF,MAAM,CAAC,KAAK,WAA0B,IAAY,EAAE,SAAiB;IACpE,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IACjD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAuC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IACjH,8DAA8D;IAC9D,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,MAAM,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;IAC9C,CAAC;IACD,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;IAC3B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/G,MAAM,KAAK,GAAU,MAAM,YAAY,UAAU,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAClG,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAA;IACpG,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,CAAC,CAAA;;QACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACrC,CAAC,CAAC,CAAA"}
@@ -11,9 +11,10 @@ export declare const watchCommand: (messenger: Messenger) => Command;
11
11
  * Listens until Ctrl-C, SIGTERM, `--timeout` or — with `pipe` — a reader that has gone away.
12
12
  * Each ends it normally. Tests hand in `signal` instead of process-wide handlers.
13
13
  */
14
- export declare const listenUntilStopped: (command: Command, context: MessengerContext, messenger: Messenger, onEvent: (event: MessageEvent) => void, { stop, pipe, catchUp }: {
14
+ export declare const listenUntilStopped: (command: Command, context: MessengerContext, messenger: Messenger, onEvent: (event: MessageEvent) => void, { stop, pipe, catchUp, onReady, }: {
15
15
  stop: AbortController;
16
16
  pipe?: boolean;
17
17
  catchUp?: boolean;
18
+ onReady?: () => void;
18
19
  }) => Promise<void>;
19
20
  //# sourceMappingURL=watch-command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/watch-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,wBAAwB,CAAA;AAGtE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAoB,MAAM,cAAc,CAAA;AAEtF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAe,SAAS,KAAG,OAiC9C,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,kBAAkB,YACpB,OAAO,WACP,gBAAgB,aACd,SAAS,WACX,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,2BACG;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,KACpG,OAAO,CAAC,IAAI,CA6Bd,CAAA"}
1
+ {"version":3,"file":"watch-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/watch-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,wBAAwB,CAAA;AAGtE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAoB,MAAM,cAAc,CAAA;AAEtF;;;;GAIG;AACH,eAAO,MAAM,YAAY,cAAe,SAAS,KAAG,OAiC9C,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,kBAAkB,YACpB,OAAO,WACP,gBAAgB,aACd,SAAS,WACX,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,qCAMnC;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,KACpF,OAAO,CAAC,IAAI,CA6Bd,CAAA"}
@@ -44,7 +44,7 @@ export const watchCommand = (messenger) => new Command("watch")
44
44
  * Listens until Ctrl-C, SIGTERM, `--timeout` or — with `pipe` — a reader that has gone away.
45
45
  * Each ends it normally. Tests hand in `signal` instead of process-wide handlers.
46
46
  */
47
- export const listenUntilStopped = async (command, context, messenger, onEvent, { stop, pipe = false, catchUp = false }) => {
47
+ export const listenUntilStopped = async (command, context, messenger, onEvent, { stop, pipe = false, catchUp = false, onReady = () => context.renderer.note("listening — Ctrl-C to stop"), }) => {
48
48
  const given = environmentOf(command).signal;
49
49
  const end = () => stop.abort();
50
50
  given?.addEventListener("abort", end, { once: true });
@@ -64,7 +64,7 @@ export const listenUntilStopped = async (command, context, messenger, onEvent, {
64
64
  if (!connection.watch) {
65
65
  throw new CliError("validation_error", `${messenger.app.command} cannot listen for new messages`);
66
66
  }
67
- await connection.watch(onEvent, stop.signal, () => context.renderer.note("listening — Ctrl-C to stop"));
67
+ await connection.watch(onEvent, stop.signal, onReady);
68
68
  }, { listen: true, ...(catchUp ? { catchUp } : {}) });
69
69
  }
70
70
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"watch-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/watch-command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"watch-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/watch-command.ts"],"names":[],"mappings":"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"}