@leemour/cli-messaging 0.88.0 → 0.90.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 (111) hide show
  1. package/dist/background/units.d.ts +7 -0
  2. package/dist/background/units.d.ts.map +1 -1
  3. package/dist/background/units.js +3 -2
  4. package/dist/background/units.js.map +1 -1
  5. package/dist/cli/bot/port.d.ts +29 -0
  6. package/dist/cli/bot/port.d.ts.map +1 -0
  7. package/dist/cli/bot/port.js +2 -0
  8. package/dist/cli/bot/port.js.map +1 -0
  9. package/dist/cli/bot/registry.d.ts +37 -0
  10. package/dist/cli/bot/registry.d.ts.map +1 -0
  11. package/dist/cli/bot/registry.js +94 -0
  12. package/dist/cli/bot/registry.js.map +1 -0
  13. package/dist/cli/bot/token.d.ts +25 -0
  14. package/dist/cli/bot/token.d.ts.map +1 -0
  15. package/dist/cli/bot/token.js +36 -0
  16. package/dist/cli/bot/token.js.map +1 -0
  17. package/dist/cli/index.d.ts +5 -1
  18. package/dist/cli/index.d.ts.map +1 -1
  19. package/dist/cli/index.js +4 -1
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/cli/messenger/after.d.ts +18 -5
  22. package/dist/cli/messenger/after.d.ts.map +1 -1
  23. package/dist/cli/messenger/after.js +19 -31
  24. package/dist/cli/messenger/after.js.map +1 -1
  25. package/dist/cli/messenger/conversations-command.d.ts +10 -0
  26. package/dist/cli/messenger/conversations-command.d.ts.map +1 -0
  27. package/dist/cli/messenger/conversations-command.js +101 -0
  28. package/dist/cli/messenger/conversations-command.js.map +1 -0
  29. package/dist/cli/messenger/messages-command.d.ts.map +1 -1
  30. package/dist/cli/messenger/messages-command.js +6 -7
  31. package/dist/cli/messenger/messages-command.js.map +1 -1
  32. package/dist/cli/messenger/server-command.d.ts +37 -6
  33. package/dist/cli/messenger/server-command.d.ts.map +1 -1
  34. package/dist/cli/messenger/server-command.js +114 -64
  35. package/dist/cli/messenger/server-command.js.map +1 -1
  36. package/dist/cli/messenger/store-maintenance-command.d.ts.map +1 -1
  37. package/dist/cli/messenger/store-maintenance-command.js +34 -0
  38. package/dist/cli/messenger/store-maintenance-command.js.map +1 -1
  39. package/dist/conversations/link.d.ts +2 -2
  40. package/dist/conversations/link.d.ts.map +1 -1
  41. package/dist/conversations/link.js +6 -4
  42. package/dist/conversations/link.js.map +1 -1
  43. package/dist/domain/models.d.ts +2 -0
  44. package/dist/domain/models.d.ts.map +1 -1
  45. package/dist/mcp/confirm.js +1 -1
  46. package/dist/mcp/confirm.js.map +1 -1
  47. package/dist/mcp/tool.d.ts +2 -0
  48. package/dist/mcp/tool.d.ts.map +1 -1
  49. package/dist/mcp/tool.js +2 -0
  50. package/dist/mcp/tool.js.map +1 -1
  51. package/dist/mcp/tools/chats.d.ts.map +1 -1
  52. package/dist/mcp/tools/chats.js +13 -8
  53. package/dist/mcp/tools/chats.js.map +1 -1
  54. package/dist/mcp/tools/conversations.d.ts +5 -0
  55. package/dist/mcp/tools/conversations.d.ts.map +1 -0
  56. package/dist/mcp/tools/conversations.js +56 -0
  57. package/dist/mcp/tools/conversations.js.map +1 -0
  58. package/dist/mcp/tools/inbox.js +3 -3
  59. package/dist/mcp/tools/inbox.js.map +1 -1
  60. package/dist/mcp/tools/messages-actions.js +2 -2
  61. package/dist/mcp/tools/messages-actions.js.map +1 -1
  62. package/dist/mcp/tools/messages-send.js +4 -4
  63. package/dist/mcp/tools/messages-send.js.map +1 -1
  64. package/dist/mcp/tools/messages.d.ts.map +1 -1
  65. package/dist/mcp/tools/messages.js +25 -18
  66. package/dist/mcp/tools/messages.js.map +1 -1
  67. package/dist/mcp/tools/review.d.ts.map +1 -1
  68. package/dist/mcp/tools/review.js +3 -3
  69. package/dist/mcp/tools/review.js.map +1 -1
  70. package/dist/mcp/tools.d.ts.map +1 -1
  71. package/dist/mcp/tools.js +2 -0
  72. package/dist/mcp/tools.js.map +1 -1
  73. package/dist/parity/bin.js +15 -2
  74. package/dist/parity/bin.js.map +1 -1
  75. package/dist/parity/index.d.ts +1 -0
  76. package/dist/parity/index.d.ts.map +1 -1
  77. package/dist/parity/index.js +1 -0
  78. package/dist/parity/index.js.map +1 -1
  79. package/dist/parity/wording.d.ts +7 -0
  80. package/dist/parity/wording.d.ts.map +1 -0
  81. package/dist/parity/wording.js +31 -0
  82. package/dist/parity/wording.js.map +1 -0
  83. package/dist/sends/permissions.js +1 -1
  84. package/dist/sends/permissions.js.map +1 -1
  85. package/dist/services/conversations.d.ts +45 -0
  86. package/dist/services/conversations.d.ts.map +1 -0
  87. package/dist/services/conversations.js +92 -0
  88. package/dist/services/conversations.js.map +1 -0
  89. package/dist/services/index.d.ts +4 -0
  90. package/dist/services/index.d.ts.map +1 -1
  91. package/dist/services/index.js +3 -0
  92. package/dist/services/index.js.map +1 -1
  93. package/dist/store/sqlite/conversations.d.ts +45 -0
  94. package/dist/store/sqlite/conversations.d.ts.map +1 -0
  95. package/dist/store/sqlite/conversations.js +309 -0
  96. package/dist/store/sqlite/conversations.js.map +1 -0
  97. package/dist/store/sqlite/messages.d.ts.map +1 -1
  98. package/dist/store/sqlite/messages.js +2 -0
  99. package/dist/store/sqlite/messages.js.map +1 -1
  100. package/dist/store/sqlite/reads.d.ts +50 -0
  101. package/dist/store/sqlite/reads.d.ts.map +1 -1
  102. package/dist/store/sqlite/reads.js +2 -1
  103. package/dist/store/sqlite/reads.js.map +1 -1
  104. package/dist/store/sqlite/search.d.ts +33 -0
  105. package/dist/store/sqlite/search.d.ts.map +1 -1
  106. package/dist/store/store.d.ts +70 -0
  107. package/dist/store/store.d.ts.map +1 -1
  108. package/dist/store/store.js +46 -0
  109. package/dist/store/store.js.map +1 -1
  110. package/package.json +1 -1
  111. package/parity.json +47 -21
@@ -0,0 +1,101 @@
1
+ import { CliError } from "@leemour/cli-core";
2
+ import { Command } from "commander";
3
+ import { renderMessages } from "../../render/messages.js";
4
+ import { momentOf } from "../../services/moment.js";
5
+ import { positiveCount } from "../paging.js";
6
+ import { messengerContext } from "./context.js";
7
+ /**
8
+ * `conversations`: the threads inside a group chat, found by rules over the stored messages — replies,
9
+ * mentions, one sender's messages in a row. From the store alone; nothing is built until asked (phase 3).
10
+ */
11
+ export const conversationsCommand = (messenger) => {
12
+ const conversations = new Command("conversations").description("the conversations inside a chat, found in the stored messages by replies, mentions and who wrote next");
13
+ conversations
14
+ .command("build")
15
+ .description("find a chat's conversations in what the store holds, replacing the last build; never asks the messenger")
16
+ .requiredOption("--chat <chat>", messenger.chatArgument)
17
+ .action(async function () {
18
+ const { chat } = this.opts();
19
+ const context = messengerContext(this, messenger);
20
+ const built = await context.withServices((services) => services.conversations.build(chat));
21
+ if (context.format === "pretty") {
22
+ context.streams.data(`${built.messages} messages → ${built.conversations} conversations, ${built.links} links (rules v${built.rulesVersion})\n`);
23
+ }
24
+ else
25
+ context.renderer.result(built);
26
+ });
27
+ conversations
28
+ .command("list")
29
+ .description("a chat's conversations, the newest first: when, how many messages, how many people")
30
+ .requiredOption("--chat <chat>", messenger.chatArgument)
31
+ .option("--since-time <time>", "only those that started at this ISO 8601 time, or 30m / 2h / 1d ago, or later")
32
+ .option("--limit <n>", "how many", positiveCount("--limit"))
33
+ .action(async function () {
34
+ const { chat, sinceTime: since } = this.opts();
35
+ const context = messengerContext(this, messenger);
36
+ const { limit } = context.settings;
37
+ const page = await context.withServices((services) => services.conversations.list(chat, {
38
+ limit,
39
+ ...(since === undefined ? {} : { since: new Date(momentOf(since, "--since-time")).toISOString() }),
40
+ }));
41
+ if (context.format === "pretty") {
42
+ context.streams.data(page.items.map((one) => `${line(one)}\n`).join(""));
43
+ if (page.items.length === 0)
44
+ context.renderer.note("no conversations in that window");
45
+ }
46
+ else if (context.format === "jsonl")
47
+ context.renderer.stream(page.items);
48
+ else
49
+ context.renderer.result({ items: page.items, limit, hasMore: page.hasMore });
50
+ });
51
+ conversations
52
+ .command("show")
53
+ .description("one conversation's messages, oldest first — by its id, or the one a message is in")
54
+ .argument("<conversation>", `a conversation id from \`conversations list\`; or ${messenger.chatArgument}, with a message`)
55
+ .argument("[message]", "a message id in that chat: show the conversation it is in")
56
+ .action(async function (first, message) {
57
+ const context = messengerContext(this, messenger);
58
+ if (message === undefined && !/^\d+$/.test(first)) {
59
+ throw new CliError("validation_error", "a conversation id is a number; for a chat, name a message too");
60
+ }
61
+ const { summary, messages } = await context.withServices((services) => services.conversations.show(message === undefined ? { id: first } : { chat: first, message }));
62
+ if (context.format === "pretty") {
63
+ context.streams.data(`${line(summary)}\n\n${renderMessages(messages, {
64
+ color: context.color,
65
+ verbosity: context.settings.detail,
66
+ senderColors: context.settings.senderColors,
67
+ profile: context.profile,
68
+ provider: messenger.provider,
69
+ locale: messenger.app.locale,
70
+ })}`);
71
+ }
72
+ else if (context.format === "jsonl")
73
+ context.renderer.stream(messages);
74
+ else
75
+ context.renderer.result({ ...summary, messages });
76
+ });
77
+ return conversations;
78
+ };
79
+ /** `messages links`: why a message sits where it does in its conversation. */
80
+ export const linksCommand = (messenger) => new Command("links")
81
+ .description("why a message is in its conversation: each link it has, and the chain of answers back to the start")
82
+ .argument("<chat>", messenger.chatArgument)
83
+ .argument("<message>", "the message id")
84
+ .action(async function (chat, message) {
85
+ const context = messengerContext(this, messenger);
86
+ const found = await context.withServices((services) => services.conversations.links(chat, message));
87
+ if (context.format !== "pretty") {
88
+ context.renderer.result(found);
89
+ return;
90
+ }
91
+ if (found.links.length === 0) {
92
+ context.renderer.note("no links: it starts a conversation, or the chat is not built — `conversations build`");
93
+ }
94
+ context.streams.data(found.links
95
+ .map((link) => `${link.chosen ? "→" : " "} ${link.parentId ?? "(starts)"} ${link.source} ${link.kind} ` +
96
+ `${link.confidence} ${link.method}${link.stale ? " stale" : ""}\n`)
97
+ .join("") + (found.chain.length > 0 ? `chain: ${[message, ...found.chain].join(" ← ")}\n` : ""));
98
+ });
99
+ const line = (one) => `${one.id} ${one.firstAt.slice(0, 16).replace("T", " ")}–${one.lastAt.slice(11, 16)} ` +
100
+ `${one.messageCount} messages · ${one.senders} people · from message ${one.firstMessageId}`;
101
+ //# sourceMappingURL=conversations-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/conversations-command.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/messages-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAkB/D,6FAA6F;AAC7F,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,OA0LtD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,cAAe,SAAS,KAAG,OAqB7C,CAAA"}
1
+ {"version":3,"file":"messages-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/messages-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAQnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAmB/D,6FAA6F;AAC7F,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,OAiLtD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,cAAe,SAAS,KAAG,OAqB7C,CAAA"}
@@ -5,11 +5,11 @@ import { isLocator, parseLocator } from "../../domain/locator.js";
5
5
  import { sendTime } from "../../domain/send-time.js";
6
6
  import { renderMessages } from "../../render/messages.js";
7
7
  import { readAttachments } from "../../sends/upload.js";
8
- import { momentOf } from "../../services/moment.js";
9
8
  import { modelWith } from "../../speech/hearing.js";
10
9
  import { listed, positiveCount } from "../paging.js";
11
10
  import { listStart } from "./after.js";
12
11
  import { messengerContext } from "./context.js";
12
+ import { linksCommand } from "./conversations-command.js";
13
13
  import { downloadSubcommand } from "./download-command.js";
14
14
  import { heardItems, hearForCommand, hearingFields, MODEL_OPTION, spokenItems, TRANSCRIBE_OPTION, } from "./hearing-command.js";
15
15
  import { deleteCommand } from "./messages-delete-command.js";
@@ -36,8 +36,8 @@ export const messagesCommand = (messenger) => {
36
36
  .option("--mark-read", "also mark the chat read up to the newest message shown; the other person sees it")
37
37
  .action(async function (chat) {
38
38
  const context = messengerContext(this, messenger);
39
- const { beforeId: before, beforeTime, afterId, afterTime, transcribe, model, markRead, } = this.opts();
40
- const after = listStart(before, afterId, afterTime, beforeTime);
39
+ const { beforeId, beforeTime, afterId, afterTime, transcribe, model, markRead } = this.opts();
40
+ const start = listStart({ beforeId, beforeTime, afterId, afterTime });
41
41
  const hearWith = modelWith(transcribe, model);
42
42
  if (markRead && context.settings.offline) {
43
43
  throw new CliError("validation_error", "--mark-read tells the messenger; not with --offline");
@@ -45,9 +45,7 @@ export const messagesCommand = (messenger) => {
45
45
  const { limit } = context.settings;
46
46
  const page = await context.withServices((services) => services.messages.list(chat, {
47
47
  limit,
48
- ...(before === undefined ? {} : { before }),
49
- ...(beforeTime === undefined ? {} : { beforeTime: momentOf(beforeTime, "--before-time") }),
50
- ...(after === undefined ? {} : { after }),
48
+ ...start,
51
49
  }));
52
50
  const hearing = await hearForCommand(context, messenger, page.items, transcribe === true, hearWith);
53
51
  const newest = page.items.at(-1);
@@ -56,7 +54,7 @@ export const messagesCommand = (messenger) => {
56
54
  : undefined;
57
55
  if (marked)
58
56
  context.renderer.note(`marked read up to ${marked.until}`);
59
- const next = (items) => after === undefined
57
+ const next = (items) => start.after === undefined
60
58
  ? `older messages: --before-id ${items[0]?.id}`
61
59
  : `newer messages: --after-id ${items.at(-1)?.id}`;
62
60
  if (context.format === "pretty") {
@@ -172,6 +170,7 @@ export const messagesCommand = (messenger) => {
172
170
  messages.addCommand(pinCommand(messenger));
173
171
  messages.addCommand(unpinCommand(messenger));
174
172
  messages.addCommand(scheduledCommand(messenger));
173
+ messages.addCommand(linksCommand(messenger));
175
174
  return messages;
176
175
  };
177
176
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"messages-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/messages-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,EAAkB,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,EACL,UAAU,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,iBAAiB,GAClB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAE9D,6FAA6F;AAC7F,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,SAAoB,EAAW,EAAE;IAC/D,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,wBAAwB,CAAC,CAAA;IAE9E,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qCAAqC,CAAC;SAClD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,YAAY,CAAC;SAC1C,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;SAC3D,MAAM,CAAC,kBAAkB,EAAE,0CAA0C,CAAC;SACtE,MAAM,CAAC,sBAAsB,EAAE,6DAA6D,CAAC;SAC7F,MAAM,CAAC,iBAAiB,EAAE,0CAA0C,CAAC;SACrE,MAAM,CAAC,qBAAqB,EAAE,6DAA6D,CAAC;SAC5F,MAAM,CAAC,GAAG,iBAAiB,CAAC;SAC5B,MAAM,CAAC,GAAG,YAAY,CAAC;SACvB,MAAM,CAAC,aAAa,EAAE,kFAAkF,CAAC;SACzG,MAAM,CAAC,KAAK,WAA0B,IAAY;QACjD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QACjD,MAAM,EACJ,QAAQ,EAAE,MAAM,EAChB,UAAU,EACV,OAAO,EACP,SAAS,EACT,UAAU,EACV,KAAK,EACL,QAAQ,GACT,GAAG,IAAI,CAAC,IAAI,EAQT,CAAA;QACJ,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QAC/D,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QAC7C,IAAI,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,qDAAqD,CAAC,CAAA;QAC/F,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAA;QAClC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnD,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;YAC3B,KAAK;YACL,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;YAC3C,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,CAAC;YAC1F,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;SAC1C,CAAC,CACH,CAAA;QACD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAA;QACnG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,MAAM,GACV,QAAQ,IAAI,MAAM;YAChB,CAAC,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/F,CAAC,CAAC,SAAS,CAAA;QACf,IAAI,MAAM;YAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;QACtE,MAAM,IAAI,GAAG,CAAC,KAAwB,EAAE,EAAE,CACxC,KAAK,KAAK,SAAS;YACjB,CAAC,CAAC,+BAA+B,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE;YAC/C,CAAC,CAAC,8BAA8B,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAA;QACtD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChC,8FAA8F;YAC9F,OAAO,CAAC,OAAO,CAAC,IAAI,CAClB,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE;gBAC/C,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAClC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAC3C,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM;aAC7B,CAAC,CACH,CAAA;YACD,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;YACzD,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAA;YACxD,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;YACzD,OAAM;QACR,CAAC;QACD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YACtB,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;YACtC,IAAI,EAAE,CAAC;YACP,KAAK;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,aAAa,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;YAC9C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5F,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,MAAM,UAAU,GAAG,KAAK,EAAE,OAAgB,EAAE,IAAY,EAAE,OAA2B,EAAE,MAAc,EAAE,EAAE;QACvG,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CACpD,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAC9D,CAAA;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,OAAO,CAAC,IAAI,CAClB,cAAc,CAAC,KAAK,EAAE;gBACpB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAClC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAC3C,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM;aAC7B,CAAC,CACH,CAAA;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;;YAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACpG,CAAC,CAAA;IAED,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4FAA4F,CAAC;SACzG,QAAQ,CAAC,WAAW,EAAE,+EAA+E,CAAC;SACtG,MAAM,CAAC,eAAe,EAAE,mBAAmB,SAAS,CAAC,YAAY,EAAE,CAAC;SACpE,MAAM,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;SAC3D,MAAM,CAAC,SAAS,EAAE,0FAA0F,CAAC;SAC7G,MAAM,CAAC,KAAK,WAA0B,KAAe;QACpD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QACjD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,EAAsC,CAAA;QACvE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAA;QAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC9D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnD,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtD,KAAK;YACL,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;SACxC,CAAC,CACH,CAAA;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,CAAC,OAAO,CAAC,IAAI,CAClB,IAAI,CAAC,KAAK;iBACP,GAAG,CACF,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,KAAK,cAAc,CAAC,CAAC,GAAG,CAAC,EAAE;gBACvE,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAClC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAC3C,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM;aAC7B,CAAC,EAAE,CACP;iBACA,IAAI,CAAC,IAAI,CAAC,CACd,CAAA;YACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;gBACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAA;YACtF,OAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;;YAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IACnF,CAAC,CAAC,CAAA;IAEJ,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAA;IAE3C,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wDAAwD,CAAC;SACrE,QAAQ,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,YAAY,kDAAkD,CAAC;SAC/F,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;SACvC,MAAM,CAAC,KAAK,WAA0B,IAAY,EAAE,OAA2B;QAC9E,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEJ,QAAQ;SACL,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,yDAAyD,CAAC;SACtE,QAAQ,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,YAAY,kDAAkD,CAAC;SAC/F,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;SACvC,MAAM,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;SACxD,MAAM,CAAC,eAAe,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC;SACtD,MAAM,CAAC,KAAK,WAA0B,IAAY,EAAE,OAA2B;QAC9E,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,EAAuC,CAAA;QAC3F,MAAM,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEJ,kBAAkB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IACvC,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAEzC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAA;IAC3C,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAA;IAC7C,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAA;IAC9C,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;IAC1C,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAA;IAC5C,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAA;IAChD,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAoB,EAAW,EAAE,CAC3D,QAAQ,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;KAC7C,WAAW,CAAC,kEAAkE,CAAC;KAC/E,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,YAAY,CAAC;KAC1C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;KACjC,MAAM,CAAC,sBAAsB,EAAE,iDAAiD,CAAC;KACjF,MAAM,CAAC,gBAAgB,EAAE,wEAAwE,CAAC;KAClG,MAAM,CAAC,UAAU,EAAE,gCAAgC,CAAC;KACpD,MAAM,CAAC,cAAc,EAAE,wCAAwC,CAAC;KAChE,MAAM,CAAC,MAAM,EAAE,qFAAqF,CAAC;KACrG,MAAM,CAAC,eAAe,EAAE,6CAA6C,CAAC;KACtE,MAAM,CAAC,gBAAgB,EAAE,uEAAuE,CAAC;KACjG,MAAM,CAAC,WAAW,EAAE,yDAAyD,CAAC;KAC9E,MAAM,CAAC,gBAAgB,EAAE,+DAA+D,CAAC;KACzF,MAAM,CAAC,kBAAkB,EAAE,yEAAyE,CAAC;KACrG,MAAM,CACL,kBAAkB,EAClB,qHAAqH,CACtH;KACA,MAAM,CAAC,KAAK,WAA0B,IAAY,EAAE,IAAwB;IAC3E,MAAM,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEN,MAAM,QAAQ,GAAG,KAAK,EAAE,OAAgB,EAAE,SAAoB,EAAE,IAAY,EAAE,IAAwB,EAAE,EAAE;IACxG,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IACpD,MAAM,EACJ,OAAO,EAAE,YAAY,EACrB,MAAM,EACN,MAAM,EACN,OAAO,EACP,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,EAAE,EACV,IAAI,EACJ,KAAK,EACL,KAAK,EACL,MAAM,EACN,YAAY,GACb,GAAG,OAAO,CAAC,IAAI,EAYZ,CAAA;IACJ,MAAM,YAAY,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,YAAY,EAAE,IAAI,EAAE,CAAA;IACpC,IAAI,OAAO,KAAK,EAAE;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,kDAAkD,CAAC,CAAA;IAC9G,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,KAAK,IAAI,EAAE,CAAA;IACrF,MAAM,WAAW,GAAG,MAAM,eAAe,CACvC;QACE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACvC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACvC,MAAM,EAAE,MAAM,KAAK,IAAI;KACxB,EACD,IAAI,CACL,CAAA;IACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IACjF,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,+CAA+C,CAAC,CAAA;IACzF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,EAAE,CACnD,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QACrB,IAAI;QACJ,IAAI,EAAE,IAAI;QACV,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3C,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;QAC7C,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,GAAG,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC;QAC3D,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC,CACH,CAAA;IACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,YAAY,qCAAqC,CAAC,CAAA;QACzF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAA;IACtH,CAAC;;QAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;AAC/G,CAAC,CAAA;AAID,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,IAAI,KAAK,kBAAkB,CAAC,CAAA;IAChH,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,4FAA4F;AAC5F,MAAM,QAAQ,GAAG,CAAC,SAAoB,EAAE,IAAY,EAAE,OAA2B,EAAE,EAAE;IACnF,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,qCAAqC,CAAC,CAAA;QACxG,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,qBAAqB,OAAO,CAAC,QAAQ,iBAAiB,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAA;IACzD,CAAC;IACD,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,2CAA2C,CAAC,CAAA;IAC9G,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,MAAc,EAAU,EAAE;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,6BAA8B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAA;IACjG,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"messages-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/messages-command.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,42 @@
1
1
  import { Command } from "commander";
2
- import { type Messenger } from "./context.js";
2
+ import { type ServerSystem } from "../../background/system.js";
3
+ import { type Unit } from "../../background/units.js";
4
+ import { type Messenger, type MessengerContext } from "./context.js";
3
5
  export type { Ran, ServerSystem } from "../../background/system.js";
6
+ /** A running server, as its CLI can tell. */
7
+ export interface Running {
8
+ pid: number;
9
+ startedAt: string;
10
+ connected: boolean;
11
+ connectedAt?: string;
12
+ version?: string;
13
+ /** The server says a command that needed it started it (max); `start` takes its place. */
14
+ byCommand?: boolean;
15
+ }
16
+ /** How a CLI finds, starts and stops its server. Without one, `server` uses tg's: the lock file and a signal. */
17
+ export interface ServerProcess {
18
+ probe: () => Promise<Running | undefined>;
19
+ /** Starts `serve` apart from this process with `args` and the variables in `env` added; its PID. Throws when it cannot start now. */
20
+ launch: (args: string[], env: Record<string, string>) => number;
21
+ /** Asks it to stop; `server` then waits for its PID to be gone. */
22
+ stop: (running: Running) => Promise<void>;
23
+ }
24
+ export interface ServerOptions {
25
+ process?: (context: MessengerContext, system: ServerSystem, logPath: string) => ServerProcess;
26
+ /** Where a server started without a unit writes its log. tg's: `<state>/serve/<profile>.log`. */
27
+ logPath?: (context: MessengerContext) => string;
28
+ /** The words after the CLI's own entry that run `serve` in the foreground — what a unit runs. */
29
+ serveArgv?: string[];
30
+ /** `start` and `restart` take `--idle <duration>` and hand it to `serve`. */
31
+ idle?: boolean;
32
+ unit?: Pick<Unit, "purpose" | "noRestartOn">;
33
+ }
4
34
  /**
5
- * `serve` in the background, the way max-cli's `server` is: `start`, `stop`, `restart`, `status`,
6
- * `logs`. Without a unit, `start` runs `serve` as a process of its own; with one — `install`, a
7
- * systemd user unit or a launchd agent — it goes through systemd or launchd. **Nothing starts until
8
- * `start` is typed** (NEED-9): `install` only writes the file.
35
+ * `serve` in the background: `start`, `stop`, `restart`, `status`, `logs`. Without a unit, `start`
36
+ * runs `serve` as a process of its own; with one — `install`, a systemd user unit or a launchd
37
+ * agent — it goes through systemd or launchd. **Nothing starts until `start` is typed** (NEED-9):
38
+ * `install` only writes the file. What the server does stays each CLI's; `options.process` says how
39
+ * to find, start and stop it.
9
40
  */
10
- export declare const serverCommand: (messenger: Messenger) => Command;
41
+ export declare const serverCommand: (messenger: Messenger, options?: ServerOptions) => Command;
11
42
  //# sourceMappingURL=server-command.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/server-command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAE/D,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAkBnE;;;;;GAKG;AACH,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,OAqPpD,CAAA"}
1
+ {"version":3,"file":"server-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/server-command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,4BAA4B,CAAA;AAC3E,OAAO,EAAwC,KAAK,IAAI,EAAE,MAAM,2BAA2B,CAAA;AAK3F,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAoB,MAAM,cAAc,CAAA;AAEtF,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAOnE,6CAA6C;AAC7C,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0FAA0F;IAC1F,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,iHAAiH;AACjH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAAA;IACzC,qIAAqI;IACrI,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAA;IAC/D,mEAAmE;IACnE,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,KAAK,aAAa,CAAA;IAC7F,iGAAiG;IACjG,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,MAAM,CAAA;IAC/C,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,aAAa,CAAC,CAAA;CAC7C;AA+CD;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,cAAe,SAAS,YAAW,aAAa,KAAQ,OA4QjF,CAAA"}
@@ -8,6 +8,7 @@ import { thisMachine } from "../../background/system.js";
8
8
  import { locationVariables, platformFor, tail } from "../../background/units.js";
9
9
  import { environmentOf } from "../context.js";
10
10
  import { listed } from "../paging.js";
11
+ import { parseDuration } from "../settings.js";
11
12
  import { messengerContext } from "./context.js";
12
13
  /** How many looks, a pause apart, `start` gives `serve` to connect — about 30 seconds on a real machine. */
13
14
  const LOOKS = 120;
@@ -19,27 +20,57 @@ const clock = (iso) => {
19
20
  const time = when.toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit" });
20
21
  return when.toDateString() === new Date().toDateString() ? time : `${when.toLocaleDateString("sv-SE")} ${time}`;
21
22
  };
23
+ const lockProcess = (app, marker, serveArgv) => (context, system, logPath) => ({
24
+ probe: async () => {
25
+ const held = readLock(lockPath(app, context.profile, context.env));
26
+ if (!held || !alive(held.pid))
27
+ return undefined;
28
+ return {
29
+ pid: held.pid,
30
+ startedAt: held.startedAt,
31
+ connected: held.listeningAt !== undefined,
32
+ ...(held.listeningAt ? { connectedAt: held.listeningAt } : {}),
33
+ ...(held.version ? { version: held.version } : {}),
34
+ };
35
+ },
36
+ launch: (args, env) => {
37
+ // A shell's --timeout default would end a server meant to outlive the shell.
38
+ const { [`${app.envPrefix}_TIMEOUT`]: _timeout, ...inherited } = context.env;
39
+ return system.spawn([...serveArgv, ...args], { ...inherited, [`${app.envPrefix}_PROFILE`]: context.profile, ...env }, logPath);
40
+ },
41
+ stop: async ({ pid }) => {
42
+ if (!carries(pid, marker)) {
43
+ throw new CliError("validation_error", `serve for profile ${context.profile} (PID ${pid}) was not started by \`${app.command} server start\` — stop it where it runs`);
44
+ }
45
+ process.kill(pid, "SIGTERM");
46
+ },
47
+ });
22
48
  /**
23
- * `serve` in the background, the way max-cli's `server` is: `start`, `stop`, `restart`, `status`,
24
- * `logs`. Without a unit, `start` runs `serve` as a process of its own; with one — `install`, a
25
- * systemd user unit or a launchd agent — it goes through systemd or launchd. **Nothing starts until
26
- * `start` is typed** (NEED-9): `install` only writes the file.
49
+ * `serve` in the background: `start`, `stop`, `restart`, `status`, `logs`. Without a unit, `start`
50
+ * runs `serve` as a process of its own; with one — `install`, a systemd user unit or a launchd
51
+ * agent — it goes through systemd or launchd. **Nothing starts until `start` is typed** (NEED-9):
52
+ * `install` only writes the file. What the server does stays each CLI's; `options.process` says how
53
+ * to find, start and stop it.
27
54
  */
28
- export const serverCommand = (messenger) => {
55
+ export const serverCommand = (messenger, options = {}) => {
29
56
  const { app } = messenger;
30
57
  const command = new Command("server").description(`\`${app.command} serve\` in the background: start, stop, restart, status, logs; install adds a systemd or launchd unit`);
31
58
  const marker = (profile) => `${app.envPrefix}_SERVER=${profile}`;
59
+ const serveArgv = options.serveArgv ?? ["serve"];
32
60
  const prepare = (self) => {
33
61
  const context = messengerContext(self, messenger);
34
62
  const system = environmentOf(self).system ?? thisMachine();
35
63
  const platform = platformFor(app, system, context.env);
36
64
  const state = resolvePaths({ appName: app.appName, prefix: app.envPrefix, env: context.env }).state;
65
+ const logPath = options.logPath?.(context) ?? join(state, "serve", `${context.profile}.log`);
37
66
  const unit = platform.unit({
38
67
  profile: context.profile,
39
- command: [...system.entry, "serve"],
68
+ command: [...system.entry, ...serveArgv],
40
69
  environment: { [`${app.envPrefix}_PROFILE`]: context.profile, ...locationVariables(app, context.env) },
41
- logPath: join(state, "serve", `${context.profile}.log`),
70
+ logPath,
71
+ ...options.unit,
42
72
  });
73
+ const server = (options.process ?? lockProcess(app, marker(context.profile), serveArgv))(context, system, logPath);
43
74
  const each = async (argvs) => {
44
75
  for (const argv of argvs) {
45
76
  const ran = await system.run(argv, context.env);
@@ -47,39 +78,39 @@ export const serverCommand = (messenger) => {
47
78
  throw new CliError("configuration_error", `${argv.join(" ")} failed: ${ran.stderr.trim()}`);
48
79
  }
49
80
  };
50
- const lock = () => {
51
- const held = readLock(lockPath(app, unit.profile, context.env));
52
- return held && alive(held.pid) ? held : undefined;
53
- };
54
81
  const say = (value, lines) => {
55
82
  if (context.format === "pretty")
56
83
  context.streams.data(lines.join("\n"));
57
84
  else
58
85
  context.renderer.result(value);
59
86
  };
60
- return { context, system, platform, unit, each, lock, say };
87
+ return { context, system, platform, unit, server, each, say };
61
88
  };
62
89
  const installed = (unit) => {
63
90
  if (!existsSync(unit.path)) {
64
91
  throw new CliError("not_found", `no unit for profile ${unit.profile} — \`${app.command} server install\` writes it`);
65
92
  }
66
93
  };
67
- const byOf = async ({ platform, unit }, held) => {
68
- if (existsSync(unit.path) && (await platform.state(unit)).pid === held.pid)
94
+ const byOf = async ({ platform, unit }, running) => {
95
+ if (existsSync(unit.path) && (await platform.state(unit)).pid === running.pid)
69
96
  return "unit";
70
- return carries(held.pid, marker(unit.profile)) ? "server" : "hand";
97
+ if (running.byCommand)
98
+ return "command";
99
+ return carries(running.pid, marker(unit.profile)) ? "server" : "hand";
71
100
  };
72
101
  const how = (by, unit) => by === "unit"
73
102
  ? `under ${unit.path.endsWith(".plist") ? "launchd" : "systemd"} (${unit.name})`
74
103
  : by === "server"
75
104
  ? `started by \`${app.command} server start\``
76
- : `started by hand — \`${app.command} server stop\` leaves it alone`;
77
- const start = async (prepared) => {
78
- const { context, system, platform, unit, each, lock, say } = prepared;
79
- const held = lock();
80
- if (held) {
81
- say({ profile: unit.profile, started: false, running: true, pid: held.pid, since: held.startedAt }, [
82
- `Already serving profile ${unit.profile} since ${clock(held.startedAt)} (PID ${held.pid}).`,
105
+ : by === "command"
106
+ ? `started by a ${app.command} command that needed it — it stops once unused`
107
+ : `started by hand — \`${app.command} server stop\` leaves it alone`;
108
+ const start = async (prepared, args) => {
109
+ const { system, platform, unit, server, each, say } = prepared;
110
+ const before = await server.probe();
111
+ if (before && !before.byCommand) {
112
+ say({ profile: unit.profile, started: false, running: true, pid: before.pid, startedAt: before.startedAt }, [
113
+ `Already serving profile ${unit.profile} since ${clock(before.startedAt)} (PID ${before.pid}).`,
83
114
  ]);
84
115
  return;
85
116
  }
@@ -90,17 +121,24 @@ export const serverCommand = (messenger) => {
90
121
  by = "unit";
91
122
  }
92
123
  else {
93
- // A shell's --timeout default would end a server meant to outlive the shell.
94
- const { [`${app.envPrefix}_TIMEOUT`]: _timeout, ...inherited } = context.env;
95
124
  const [name = "", value = ""] = marker(unit.profile).split("=");
96
- spawned = system.spawn(["serve"], { ...inherited, [`${app.envPrefix}_PROFILE`]: unit.profile, [name]: value }, unit.logPath ?? "");
125
+ spawned = server.launch(args, { [name]: value });
97
126
  by = "server";
98
127
  }
99
128
  for (let look = 0; look < LOOKS; look++) {
100
- const now = lock();
101
- if (now?.listeningAt) {
102
- say({ profile: unit.profile, started: true, by, pid: now.pid, listeningSince: now.listeningAt }, [
103
- `Started: serving profile ${unit.profile} (PID ${now.pid}), listening since ${clock(now.listeningAt)}, ${how(by, unit)}.`,
129
+ const now = await server.probe();
130
+ // A server a command started answers until the new one takes its place.
131
+ if (now?.connected && now.pid !== before?.pid) {
132
+ say({
133
+ profile: unit.profile,
134
+ started: true,
135
+ by,
136
+ pid: now.pid,
137
+ startedAt: now.startedAt,
138
+ ...(now.connectedAt ? { connectedAt: now.connectedAt } : {}),
139
+ log: unit.logPath,
140
+ }, [
141
+ `Started: serving profile ${unit.profile} (PID ${now.pid}), connected${now.connectedAt ? ` since ${clock(now.connectedAt)}` : ""}, ${how(by, unit)}.`,
104
142
  `Its log: ${app.command} server logs`,
105
143
  ]);
106
144
  return;
@@ -108,70 +146,74 @@ export const serverCommand = (messenger) => {
108
146
  const gone = spawned !== undefined ? !alive(spawned) : look > 8 && !(await platform.state(unit)).active;
109
147
  if (gone) {
110
148
  const last = (by === "unit" ? await platform.logs(unit, 5) : tail(unit.logPath, 5)).trim();
111
- throw new CliError("provider_unavailable", `serve stopped before it was listening${last ? `:\n${last}` : ""}`);
149
+ throw new CliError("provider_unavailable", `serve stopped before it was connected${last ? `:\n${last}` : ""}`);
112
150
  }
113
151
  await system.pause();
114
152
  }
115
- throw new CliError("timeout", `serve is running but not listening yet — \`${app.command} server status\`, \`${app.command} server logs\``);
153
+ throw new CliError("timeout", `serve is running but not connected yet — \`${app.command} server status\`, \`${app.command} server logs\``);
116
154
  };
117
155
  const stop = async (prepared) => {
118
- const { platform, unit, each, lock, say, system } = prepared;
156
+ const { platform, unit, server, each, say, system } = prepared;
119
157
  if (existsSync(unit.path) && (await platform.state(unit)).active) {
120
158
  await each(platform.stop(unit));
121
159
  say({ profile: unit.profile, stopped: true, by: "unit" }, [`Stopped ${unit.name}.`]);
122
160
  return;
123
161
  }
124
- const held = lock();
125
- if (!held) {
162
+ const running = await server.probe();
163
+ if (!running) {
126
164
  say({ profile: unit.profile, stopped: false }, [`Nothing to stop: profile ${unit.profile} is not being served.`]);
127
165
  return;
128
166
  }
129
- if (!carries(held.pid, marker(unit.profile))) {
130
- 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`);
131
- }
132
- process.kill(held.pid, "SIGTERM");
133
- for (let look = 0; look < LOOKS && alive(held.pid); look++)
167
+ const by = await byOf(prepared, running);
168
+ await server.stop(running);
169
+ for (let look = 0; look < LOOKS && alive(running.pid); look++)
134
170
  await system.pause();
135
- say({ profile: unit.profile, stopped: true, by: "server", pid: held.pid }, [
136
- `Stopped serving profile ${unit.profile} (PID ${held.pid}).`,
171
+ say({ profile: unit.profile, stopped: true, by, pid: running.pid }, [
172
+ `Stopped serving profile ${unit.profile} (PID ${running.pid}).`,
137
173
  ]);
138
174
  };
139
- command
175
+ const idleArgs = (self) => {
176
+ const { idle } = self.opts();
177
+ if (idle === undefined)
178
+ return [];
179
+ parseDuration(idle, "--idle");
180
+ return ["--idle", idle];
181
+ };
182
+ const withIdle = (sub) => options.idle ? sub.option("--idle <duration>", "stop after this long with nobody using it — 15m, 1h") : sub;
183
+ withIdle(command
140
184
  .command("start")
141
- .description("start serve in the background — through the unit if one is installed — and answer once it listens")
142
- .action(async function () {
143
- await start(prepare(this));
185
+ .description("start serve in the background — through the unit if one is installed — and answer once it connects")).action(async function () {
186
+ await start(prepare(this), idleArgs(this));
144
187
  });
145
188
  command
146
189
  .command("stop")
147
- .description("stop the serve that `server start` or the unit started")
190
+ .description("stop this profile's serve — through the unit if it runs under one")
148
191
  .action(async function () {
149
192
  await stop(prepare(this));
150
193
  });
151
- command
152
- .command("restart")
153
- .description("stop it and start it again")
154
- .action(async function () {
194
+ withIdle(command.command("restart").description("stop it and start it again")).action(async function () {
195
+ const args = idleArgs(this);
155
196
  const prepared = prepare(this);
156
197
  await stop({ ...prepared, say: () => { } });
157
- await start(prepared);
198
+ await start(prepared, args);
158
199
  });
159
200
  command
160
201
  .command("status")
161
202
  .description("whether serve runs for this profile, since when, who started it, and the unit if there is one")
162
203
  .action(async function () {
163
204
  const prepared = prepare(this);
164
- const { context, platform, unit, lock, say } = prepared;
205
+ const { context, platform, unit, server, say } = prepared;
165
206
  const isInstalled = existsSync(unit.path);
166
207
  const state = isInstalled ? await platform.state(unit) : { loaded: false, active: false };
167
- const held = lock();
208
+ const held = await server.probe();
168
209
  const by = held ? await byOf(prepared, held) : null;
169
- // max-cli's server status says the same: an update leaves a running serve on the old code.
170
- const stale = held?.version && held.version !== app.version
210
+ const left = held ? undefined : readLock(lockPath(app, unit.profile, context.env));
211
+ // An update leaves a running serve on the old code.
212
+ const outdated = held?.version && held.version !== app.version
171
213
  ? `It runs ${app.command} ${held.version}, and ${app.command} is now ${app.version} — \`${app.command} server restart\`.`
172
214
  : undefined;
173
- if (stale && context.format !== "pretty")
174
- context.renderer.note(stale);
215
+ if (outdated && context.format !== "pretty")
216
+ context.renderer.note(outdated);
175
217
  const unitLine = isInstalled
176
218
  ? `Unit: ${tilde(unit.path, context.env)} — ${state.detail ?? (state.active ? "active" : "inactive")}.`
177
219
  : `No unit installed — \`${app.command} server install\` adds one, for starting under systemd or launchd.`;
@@ -181,22 +223,30 @@ export const serverCommand = (messenger) => {
181
223
  ...(held
182
224
  ? {
183
225
  pid: held.pid,
184
- since: held.startedAt,
185
- listening: held.listeningAt !== undefined,
186
- ...(held.listeningAt ? { listeningSince: held.listeningAt } : {}),
226
+ startedAt: held.startedAt,
227
+ connected: held.connected,
228
+ ...(held.connectedAt ? { connectedAt: held.connectedAt } : {}),
187
229
  by,
188
230
  }
189
231
  : {}),
190
232
  ...(held?.version ? { version: held.version } : {}),
233
+ cliVersion: app.version,
234
+ log: isInstalled && unit.path.endsWith(".service") ? `journalctl --user -u ${unit.name}` : unit.logPath,
235
+ ...(left ? { stale: { pid: left.pid, startedAt: left.startedAt } } : {}),
191
236
  unit: { name: unit.name, path: unit.path, installed: isInstalled, ...state },
192
237
  }, [
193
238
  held
194
- ? held.listeningAt
195
- ? `Serving profile ${unit.profile} since ${clock(held.startedAt)} (PID ${held.pid}), listening since ${clock(held.listeningAt)}, ${how(by ?? "hand", unit)}.`
196
- : `Starting profile ${unit.profile} since ${clock(held.startedAt)} (PID ${held.pid}) — not listening yet, ${how(by ?? "hand", unit)}.`
239
+ ? held.connected
240
+ ? `Serving profile ${unit.profile} since ${clock(held.startedAt)} (PID ${held.pid}), connected${held.connectedAt ? ` since ${clock(held.connectedAt)}` : ""}, ${how(by ?? "hand", unit)}.`
241
+ : `Starting profile ${unit.profile} since ${clock(held.startedAt)} (PID ${held.pid}) — not connected yet, ${how(by ?? "hand", unit)}.`
197
242
  : `Not serving profile ${unit.profile}.${isInstalled && state.detail?.startsWith("failed") ? ` The unit failed — \`${app.command} server logs\`.` : ""}`,
243
+ ...(left
244
+ ? [
245
+ `A serve that started ${clock(left.startedAt)} (PID ${left.pid}) is gone and left its lock — the next start takes it over.`,
246
+ ]
247
+ : []),
198
248
  unitLine,
199
- ...(stale ? [stale] : []),
249
+ ...(outdated ? [outdated] : []),
200
250
  ]);
201
251
  });
202
252
  command