@leemour/cli-messaging 0.39.0 → 0.40.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 (51) hide show
  1. package/README.md +1 -1
  2. package/dist/cli/index.d.ts +2 -2
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +1 -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 +25 -0
  15. package/dist/cli/messenger/chats-command.d.ts.map +1 -1
  16. package/dist/cli/messenger/chats-command.js +51 -4
  17. package/dist/cli/messenger/chats-command.js.map +1 -1
  18. package/dist/cli/messenger/messages-command.d.ts +1 -1
  19. package/dist/cli/messenger/messages-command.d.ts.map +1 -1
  20. package/dist/cli/messenger/messages-command.js +16 -6
  21. package/dist/cli/messenger/messages-command.js.map +1 -1
  22. package/dist/cli/messenger/port.d.ts +11 -0
  23. package/dist/cli/messenger/port.d.ts.map +1 -1
  24. package/dist/cli/messenger/port.js.map +1 -1
  25. package/dist/cli/messenger/processes.d.ts +9 -0
  26. package/dist/cli/messenger/processes.d.ts.map +1 -0
  27. package/dist/cli/messenger/processes.js +37 -0
  28. package/dist/cli/messenger/processes.js.map +1 -0
  29. package/dist/cli/messenger/serve-command.d.ts +4 -5
  30. package/dist/cli/messenger/serve-command.d.ts.map +1 -1
  31. package/dist/cli/messenger/serve-command.js +14 -22
  32. package/dist/cli/messenger/serve-command.js.map +1 -1
  33. package/dist/cli/messenger/server-command.d.ts +27 -0
  34. package/dist/cli/messenger/server-command.d.ts.map +1 -0
  35. package/dist/cli/messenger/server-command.js +453 -0
  36. package/dist/cli/messenger/server-command.js.map +1 -0
  37. package/dist/cli/messenger/watch-command.d.ts +2 -1
  38. package/dist/cli/messenger/watch-command.d.ts.map +1 -1
  39. package/dist/cli/messenger/watch-command.js +2 -2
  40. package/dist/cli/messenger/watch-command.js.map +1 -1
  41. package/dist/mcp/tools/chats.d.ts.map +1 -1
  42. package/dist/mcp/tools/chats.js +17 -5
  43. package/dist/mcp/tools/chats.js.map +1 -1
  44. package/dist/mcp/tools/messages.d.ts.map +1 -1
  45. package/dist/mcp/tools/messages.js +15 -5
  46. package/dist/mcp/tools/messages.js.map +1 -1
  47. package/package.json +1 -1
  48. package/dist/cli/messenger/service-command.d.ts +0 -21
  49. package/dist/cli/messenger/service-command.d.ts.map +0 -1
  50. package/dist/cli/messenger/service-command.js +0 -305
  51. package/dist/cli/messenger/service-command.js.map +0 -1
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/chats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,KAAK,OAAO,EAAqD,MAAM,YAAY,CAAA;AAE5F,eAAO,MAAM,UAAU,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAwBvE,CAAA"}
1
+ {"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/chats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC/D,OAAO,EAAE,KAAK,OAAO,EAAqD,MAAM,YAAY,CAAA;AAE5F,eAAO,MAAM,UAAU,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAmCvE,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import * as v from "valibot";
2
+ import { CHAT_SCAN, checkedFilter, filteredChats } from "../../cli/messenger/chats-command.js";
2
3
  import { chatOf, envelope, limit, page, paging, READ, tool } from "../tool.js";
3
4
  export const chatsTools = (messenger) => {
4
5
  const chat = chatOf(messenger);
@@ -6,12 +7,23 @@ export const chatsTools = (messenger) => {
6
7
  chats_list: tool({
7
8
  title: "List chats",
8
9
  description: "Chats the owner is in, most recent first. Use it to find a chat's id before reading or sending. " +
9
- "Returns { items, page, limit, hasMore }.",
10
- input: v.object({ limit, page }),
10
+ `With search, kind or unread, only the newest ${CHAT_SCAN} chats are searched, and partial says there were ` +
11
+ "older ones. Returns { items, page, limit, hasMore, partial? }.",
12
+ input: v.object({
13
+ search: v.optional(v.pipe(v.string(), v.minLength(3), v.description("only chats whose name contains this"))),
14
+ kind: v.optional(v.picklist(["dialog", "group", "channel", "saved"])),
15
+ unread: v.optional(v.pipe(v.boolean(), v.description("only chats with unread messages"))),
16
+ limit,
17
+ page,
18
+ }),
11
19
  annotations: READ,
12
- online: async (adapter, args, defaults) => {
13
- const { size, number, window } = paging(args, defaults);
14
- return envelope(await adapter.chats(window), number, size);
20
+ online: async (adapter, { search, kind, unread, ...rest }, defaults) => {
21
+ const { size, number, window } = paging(rest, defaults);
22
+ if (search === undefined && kind === undefined && !unread) {
23
+ return envelope(await adapter.chats(window), number, size);
24
+ }
25
+ const found = await filteredChats({ adapter }, checkedFilter({ search, kind, unread }), window);
26
+ return { ...envelope(found, number, size), ...(found.partial ? { partial: true } : {}) };
15
27
  },
16
28
  }),
17
29
  chats_show: tool({
@@ -1 +1 @@
1
- {"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../src/mcp/tools/chats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAgB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAE5F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,SAAoB,EAA2B,EAAE;IAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;IAC9B,OAAO;QACL,UAAU,EAAE,IAAI,CAAC;YACf,KAAK,EAAE,YAAY;YACnB,WAAW,EACT,kGAAkG;gBAClG,0CAA0C;YAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAChC,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;gBACxC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;gBACvD,OAAO,QAAQ,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YAC5D,CAAC;SACF,CAAC;QAEF,UAAU,EAAE,IAAI,CAAC;YACf,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,uEAAuE;YACpF,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;YACzB,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;SACnD,CAAC;KACH,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"chats.js","sourceRoot":"","sources":["../../../src/mcp/tools/chats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAA;AAE9F,OAAO,EAAgB,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAE5F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,SAAoB,EAA2B,EAAE;IAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;IAC9B,OAAO;QACL,UAAU,EAAE,IAAI,CAAC;YACf,KAAK,EAAE,YAAY;YACnB,WAAW,EACT,kGAAkG;gBAClG,gDAAgD,SAAS,mDAAmD;gBAC5G,gEAAgE;YAClE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;gBACd,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAC5G,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;gBACrE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACzF,KAAK;gBACL,IAAI;aACL,CAAC;YACF,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE;gBACrE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;gBACvD,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;oBAC1D,OAAO,QAAQ,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;gBAC5D,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,EAAE,OAAO,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;gBAC/F,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;YAC1F,CAAC;SACF,CAAC;QAEF,UAAU,EAAE,IAAI,CAAC;YACf,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,uEAAuE;YACpF,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;YACzB,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;SACnD,CAAC;KACH,CAAA;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAE/D,OAAO,EAAE,KAAK,OAAO,EAA8C,MAAM,YAAY,CAAA;AAErF,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAkE1E,CAAA"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/messages.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAG/D,OAAO,EAAE,KAAK,OAAO,EAA8C,MAAM,YAAY,CAAA;AAErF,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAiF1E,CAAA"}
@@ -1,5 +1,7 @@
1
1
  import * as v from "valibot";
2
+ import { afterOf, oneDirection } from "../../cli/messenger/after.js";
2
3
  import { storedChatId } from "../../cli/messenger/messages-command.js";
4
+ import { capability } from "../../cli/messenger/port.js";
3
5
  import { chatOf, limit, message, nameOf, READ, tool } from "../tool.js";
4
6
  export const messagesTools = (messenger) => {
5
7
  const chat = chatOf(messenger);
@@ -8,19 +10,27 @@ export const messagesTools = (messenger) => {
8
10
  messages_list: tool({
9
11
  title: "Read a chat",
10
12
  description: "Recent messages in a chat, oldest first. Does not mark anything read. For older messages pass " +
11
- "`before` = the id of the first item. Returns { items, limit, hasMore }.",
13
+ "`before` = the id of the first item; for newer ones, `after` = the id of the last item, or a time. " +
14
+ "Returns { items, limit, hasMore }.",
12
15
  input: v.object({
13
16
  chat,
14
17
  limit,
15
18
  before: v.optional(v.pipe(message, v.description("only messages older than this message id"))),
19
+ after: v.optional(v.pipe(v.string(), v.description("only messages newer than this message id, ISO 8601 time, or 2h / 1d ago"))),
16
20
  }),
17
21
  annotations: READ,
18
22
  online: async (adapter, args, defaults) => {
19
23
  const size = args.limit ?? defaults.limit;
20
- const found = await adapter.history(args.chat, {
21
- limit: size,
22
- ...(args.before === undefined ? {} : { before: args.before }),
23
- });
24
+ oneDirection(args.before, args.after);
25
+ const found = args.after === undefined
26
+ ? await adapter.history(args.chat, {
27
+ limit: size,
28
+ ...(args.before === undefined ? {} : { before: args.before }),
29
+ })
30
+ : await capability(adapter, "historyAfter", "read forward from a message")(args.chat, {
31
+ limit: size,
32
+ after: afterOf(args.after, "after"),
33
+ });
24
34
  return { items: found.items, limit: size, hasMore: found.hasMore };
25
35
  },
26
36
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/mcp/tools/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/mcp/tools/messages.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leemour/cli-messaging",
3
- "version": "0.39.0",
3
+ "version": "0.40.0",
4
4
  "description": "The messenger-neutral half of a messaging CLI: domain model, message locators, rendering, name resolution, the SQLite seam, the command skeleton and shared read commands, the send guard, run records and the message store",
5
5
  "license": "MIT",
6
6
  "author": "Viacheslav Ptsarev",
@@ -1,21 +0,0 @@
1
- import { Command } from "commander";
2
- import { type Messenger } from "./context.js";
3
- export interface Ran {
4
- code: number;
5
- stdout: string;
6
- stderr: string;
7
- }
8
- /** What the service commands ask of the machine. Tests hand one in; nothing else does. */
9
- export interface ServiceSystem {
10
- platform: NodeJS.Platform;
11
- run: (argv: string[], env: NodeJS.ProcessEnv) => Promise<Ran>;
12
- /** The command line that starts this CLI: the node binary and the script, both absolute. */
13
- entry: string[];
14
- uid: number;
15
- }
16
- /**
17
- * `serve` as a user service: a systemd user unit on Linux, a launchd agent on macOS, one per
18
- * profile. **`install` only writes the file** — nothing starts or enables it until asked (NEED-9).
19
- */
20
- export declare const serviceCommand: (messenger: Messenger) => Command;
21
- //# sourceMappingURL=service-command.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/service-command.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAG/D,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,0FAA0F;AAC1F,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAA;IACzB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IAC7D,4FAA4F;IAC5F,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ;AA+MD;;;GAGG;AACH,eAAO,MAAM,cAAc,cAAe,SAAS,KAAG,OAmIrD,CAAA"}
@@ -1,305 +0,0 @@
1
- import { execFile } from "node:child_process";
2
- import { existsSync, mkdirSync, readFileSync, realpathSync, rmSync } from "node:fs";
3
- import { dirname, join } from "node:path";
4
- import { CliError, resolvePaths, writeSecurely } from "@leemour/cli-core";
5
- import { Command } from "commander";
6
- import { environmentOf } from "../context.js";
7
- import { messengerContext } from "./context.js";
8
- import { alive, lockPath, readLock } from "./serve-command.js";
9
- const runProgram = (argv, env) => new Promise((resolve, reject) => {
10
- const [file = "", ...args] = argv;
11
- execFile(file, args, { env, encoding: "utf8" }, (error, stdout, stderr) => {
12
- if (error?.code === "ENOENT") {
13
- reject(new CliError("configuration_error", `${file} was not found — this machine has no ${file} to run serve`));
14
- return;
15
- }
16
- resolve({ code: typeof error?.code === "number" ? error.code : error ? 1 : 0, stdout, stderr });
17
- });
18
- });
19
- const thisMachine = () => ({
20
- platform: process.platform,
21
- run: runProgram,
22
- entry: [process.execPath, realpathSync(process.argv[1] ?? "")],
23
- uid: process.getuid?.() ?? 0,
24
- });
25
- /**
26
- * Only the variables that say **where** the files are travel into the unit: a unit written from a
27
- * development checkout must open that checkout's session and store, never the owner's real ones.
28
- * Nothing that could hold a credential is copied.
29
- */
30
- const locationVariables = (app, env) => {
31
- const names = [
32
- ...["CONFIG_DIR", "STATE_DIR", "CACHE_DIR"].map((name) => `${app.envPrefix}_${name}`),
33
- "MESSAGING_STORE",
34
- "MESSAGING_STATE_DIR",
35
- ];
36
- return Object.fromEntries(names.flatMap((name) => (env[name] === undefined ? [] : [[name, env[name]]])));
37
- };
38
- const home = (env) => {
39
- if (!env.HOME)
40
- throw new CliError("configuration_error", "HOME is not set, so there is nowhere to put the unit");
41
- return env.HOME;
42
- };
43
- /** `%` is a specifier in both; `$` is a variable only in `ExecStart=` — in `Environment=` it is itself. */
44
- const systemdQuote = (value, { command = false } = {}) => {
45
- const quoted = value.replaceAll("\\", "\\\\").replaceAll('"', '\\"').replaceAll("%", "%%");
46
- return `"${command ? quoted.replaceAll("$", "$$$$") : quoted}"`;
47
- };
48
- const systemd = (app, system, env) => {
49
- const folder = join(env.XDG_CONFIG_HOME ?? join(home(env), ".config"), "systemd", "user");
50
- const checked = async (argv) => {
51
- const ran = await system.run(argv, env);
52
- if (ran.code !== 0)
53
- throw new CliError("configuration_error", `${argv.join(" ")} failed: ${ran.stderr.trim()}`);
54
- return ran.stdout;
55
- };
56
- return {
57
- unit: (base) => {
58
- const name = `${app.command}-serve-${base.profile}.service`;
59
- return { ...base, name, path: join(folder, name) };
60
- },
61
- text: (unit) => [
62
- "[Unit]",
63
- `Description=${app.command} serve — keep the local message archive current (profile ${unit.profile})`,
64
- "",
65
- "[Service]",
66
- `ExecStart=${unit.command.map((word) => systemdQuote(word, { command: true })).join(" ")}`,
67
- ...Object.entries(unit.environment).map(([name, value]) => `Environment=${systemdQuote(`${name}=${value}`)}`),
68
- "Restart=on-failure",
69
- "RestartSec=30",
70
- "",
71
- "[Install]",
72
- "WantedBy=default.target",
73
- "",
74
- ].join("\n"),
75
- start: (unit) => [
76
- ["systemctl", "--user", "daemon-reload"],
77
- ["systemctl", "--user", "start", unit.name],
78
- ],
79
- stop: (unit) => [["systemctl", "--user", "stop", unit.name]],
80
- state: async (unit) => {
81
- const ran = await system.run([
82
- "systemctl",
83
- "--user",
84
- "show",
85
- unit.name,
86
- "-p",
87
- "LoadState",
88
- "-p",
89
- "ActiveState",
90
- "-p",
91
- "SubState",
92
- "-p",
93
- "MainPID",
94
- ], env);
95
- const fields = Object.fromEntries(ran.stdout
96
- .split("\n")
97
- .filter((line) => line.includes("="))
98
- .map((line) => [line.slice(0, line.indexOf("=")), line.slice(line.indexOf("=") + 1)]));
99
- const pid = Number(fields.MainPID);
100
- return {
101
- loaded: fields.LoadState === "loaded",
102
- active: fields.ActiveState === "active",
103
- ...(pid > 0 ? { pid } : {}),
104
- ...(fields.ActiveState ? { detail: `${fields.ActiveState} (${fields.SubState})` } : {}),
105
- };
106
- },
107
- logs: (unit, lines) => checked(["journalctl", "--user", "-u", unit.name, "-n", String(lines), "--no-pager"]),
108
- };
109
- };
110
- const xml = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
111
- const launchd = (app, system, env) => {
112
- const folder = join(home(env), "Library", "LaunchAgents");
113
- const domain = `gui/${system.uid}`;
114
- return {
115
- unit: (base) => {
116
- const name = `${app.appName}.serve.${base.profile}`;
117
- return { ...base, name, path: join(folder, `${name}.plist`) };
118
- },
119
- text: (unit) => [
120
- '<?xml version="1.0" encoding="UTF-8"?>',
121
- '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">',
122
- '<plist version="1.0">',
123
- "<dict>",
124
- ` <key>Label</key><string>${xml(unit.name)}</string>`,
125
- " <key>ProgramArguments</key>",
126
- " <array>",
127
- ...unit.command.map((word) => ` <string>${xml(word)}</string>`),
128
- " </array>",
129
- " <key>EnvironmentVariables</key>",
130
- " <dict>",
131
- ...Object.entries(unit.environment).map(([name, value]) => ` <key>${xml(name)}</key><string>${xml(value)}</string>`),
132
- " </dict>",
133
- " <key>RunAtLoad</key><true/>",
134
- " <key>KeepAlive</key><dict><key>SuccessfulExit</key><false/></dict>",
135
- " <key>ThrottleInterval</key><integer>30</integer>",
136
- ` <key>StandardOutPath</key><string>${xml(unit.logPath ?? "")}</string>`,
137
- ` <key>StandardErrorPath</key><string>${xml(unit.logPath ?? "")}</string>`,
138
- "</dict>",
139
- "</plist>",
140
- "",
141
- ].join("\n"),
142
- // RunAtLoad makes loading the agent the start, so `install` only writes the file.
143
- start: (unit) => [["launchctl", "bootstrap", domain, unit.path]],
144
- stop: (unit) => [["launchctl", "bootout", `${domain}/${unit.name}`]],
145
- state: async (unit) => {
146
- const ran = await system.run(["launchctl", "print", `${domain}/${unit.name}`], env);
147
- if (ran.code !== 0)
148
- return { loaded: false, active: false };
149
- const state = /^\s*state = (.+)$/m.exec(ran.stdout)?.[1]?.trim();
150
- const pid = Number(/^\s*pid = (\d+)$/m.exec(ran.stdout)?.[1]);
151
- return {
152
- loaded: true,
153
- active: state === "running",
154
- ...(pid > 0 ? { pid } : {}),
155
- ...(state ? { detail: state } : {}),
156
- };
157
- },
158
- // launchd opens the log itself and does not create its folder.
159
- prepare: (unit) => {
160
- if (unit.logPath)
161
- mkdirSync(dirname(unit.logPath), { recursive: true, mode: 0o700 });
162
- },
163
- logs: async (unit, lines) => {
164
- if (!unit.logPath || !existsSync(unit.logPath))
165
- return "";
166
- return `${readFileSync(unit.logPath, "utf8").split("\n").filter(Boolean).slice(-lines).join("\n")}\n`;
167
- },
168
- };
169
- };
170
- const platformFor = (app, system, env) => {
171
- if (system.platform === "linux")
172
- return systemd(app, system, env);
173
- if (system.platform === "darwin")
174
- return launchd(app, system, env);
175
- throw new CliError("validation_error", `${app.command} service knows systemd (Linux) and launchd (macOS), not ${system.platform} — run \`${app.command} serve\` under your own supervisor`);
176
- };
177
- /**
178
- * `serve` as a user service: a systemd user unit on Linux, a launchd agent on macOS, one per
179
- * profile. **`install` only writes the file** — nothing starts or enables it until asked (NEED-9).
180
- */
181
- export const serviceCommand = (messenger) => {
182
- const { app } = messenger;
183
- const command = new Command("service").description(`run \`${app.command} serve\` as a user service — systemd on Linux, launchd on macOS`);
184
- const prepare = (self) => {
185
- const context = messengerContext(self, messenger);
186
- const system = environmentOf(self).system ?? thisMachine();
187
- const platform = platformFor(app, system, context.env);
188
- const state = resolvePaths({ appName: app.appName, prefix: app.envPrefix, env: context.env }).state;
189
- const unit = platform.unit({
190
- profile: context.profile,
191
- command: [...system.entry, "serve"],
192
- environment: { [`${app.envPrefix}_PROFILE`]: context.profile, ...locationVariables(app, context.env) },
193
- logPath: join(state, "serve", `${context.profile}.log`),
194
- });
195
- const each = async (argvs) => {
196
- for (const argv of argvs) {
197
- const ran = await system.run(argv, context.env);
198
- if (ran.code !== 0)
199
- throw new CliError("configuration_error", `${argv.join(" ")} failed: ${ran.stderr.trim()}`);
200
- }
201
- };
202
- return { context, platform, unit, each };
203
- };
204
- const installed = (unit) => {
205
- if (!existsSync(unit.path)) {
206
- throw new CliError("not_found", `no service for profile ${unit.profile} — \`${app.command} service install\` writes it`);
207
- }
208
- };
209
- command
210
- .command("install")
211
- .description("write the unit for this profile; it does not start or enable it")
212
- .action(function () {
213
- const { context, platform, unit } = prepare(this);
214
- const replaced = existsSync(unit.path);
215
- writeSecurely(unit.path, platform.text(unit, app), 0o644);
216
- platform.prepare?.(unit);
217
- context.renderer.result({
218
- profile: unit.profile,
219
- unit: unit.name,
220
- path: unit.path,
221
- command: unit.command,
222
- replaced,
223
- });
224
- context.renderer.note(`written, not started — \`${app.command} service start\` starts it`);
225
- });
226
- command
227
- .command("uninstall")
228
- .description("remove the unit for this profile; stop it first")
229
- .action(async function () {
230
- const { context, platform, unit } = prepare(this);
231
- installed(unit);
232
- if ((await platform.state(unit)).active) {
233
- throw new CliError("validation_error", `the service is running — \`${app.command} service stop\` first`);
234
- }
235
- rmSync(unit.path, { force: true });
236
- context.renderer.result({ profile: unit.profile, unit: unit.name, path: unit.path, removed: true });
237
- });
238
- command
239
- .command("start")
240
- .description("start the service for this profile")
241
- .action(async function () {
242
- const { context, platform, unit, each } = prepare(this);
243
- installed(unit);
244
- const held = readLock(lockPath(app, unit.profile, context.env));
245
- if (held && alive(held.pid) && !(await platform.state(unit)).active) {
246
- throw new CliError("validation_error", `${app.command} serve is already running for profile ${unit.profile} outside the service (PID ${held.pid}) — stop it first`);
247
- }
248
- await each(platform.start(unit));
249
- context.renderer.result({ profile: unit.profile, unit: unit.name, started: true });
250
- });
251
- command
252
- .command("stop")
253
- .description("stop the service for this profile")
254
- .action(async function () {
255
- const { context, platform, unit, each } = prepare(this);
256
- installed(unit);
257
- await each(platform.stop(unit));
258
- context.renderer.result({ profile: unit.profile, unit: unit.name, stopped: true });
259
- });
260
- command
261
- .command("status")
262
- .description("whether the unit is installed and running, and who holds the serve lock")
263
- .action(async function () {
264
- const { context, platform, unit } = prepare(this);
265
- const isInstalled = existsSync(unit.path);
266
- const state = isInstalled ? await platform.state(unit) : { loaded: false, active: false };
267
- const lock = readLock(lockPath(app, unit.profile, context.env));
268
- const serving = lock !== undefined && alive(lock.pid);
269
- context.renderer.result({
270
- profile: unit.profile,
271
- unit: unit.name,
272
- path: unit.path,
273
- installed: isInstalled,
274
- ...state,
275
- serve: {
276
- running: serving,
277
- ...(serving && lock
278
- ? { pid: lock.pid, since: lock.startedAt, byService: state.pid !== undefined && state.pid === lock.pid }
279
- : {}),
280
- },
281
- });
282
- });
283
- command
284
- .command("logs")
285
- .description("the service's latest log lines")
286
- .option("-n, --lines <n>", "how many lines", (value) => wholeNumber(value), 50)
287
- .action(async function () {
288
- const { lines } = this.opts();
289
- const { context, platform, unit } = prepare(this);
290
- installed(unit);
291
- const text = await platform.logs(unit, lines);
292
- if (context.format === "pretty")
293
- context.streams.data(text.replace(/\n$/, ""));
294
- else
295
- context.renderer.result({ profile: unit.profile, unit: unit.name, lines: text.split("\n").filter(Boolean) });
296
- });
297
- return command;
298
- };
299
- const wholeNumber = (value) => {
300
- const parsed = Number(value);
301
- if (!Number.isInteger(parsed) || parsed < 1)
302
- throw new CliError("validation_error", `"${value}" is not a count`);
303
- return parsed;
304
- };
305
- //# sourceMappingURL=service-command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/service-command.ts"],"names":[],"mappings":"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"}