@wirecat/max-cli 0.55.0 → 0.56.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 (194) hide show
  1. package/dist/adapter/max-adapter.d.ts +1 -5
  2. package/dist/adapter/max-adapter.d.ts.map +1 -1
  3. package/dist/adapter/max-adapter.js +21 -53
  4. package/dist/adapter/max-adapter.js.map +1 -1
  5. package/dist/client/account.d.ts +3 -3
  6. package/dist/client/account.d.ts.map +1 -1
  7. package/dist/client/account.js +4 -4
  8. package/dist/client/account.js.map +1 -1
  9. package/dist/client/chat-members.d.ts +2 -1
  10. package/dist/client/chat-members.d.ts.map +1 -1
  11. package/dist/client/chat-members.js.map +1 -1
  12. package/dist/client/chat-reads.d.ts +2 -1
  13. package/dist/client/chat-reads.d.ts.map +1 -1
  14. package/dist/client/chat-reads.js +9 -7
  15. package/dist/client/chat-reads.js.map +1 -1
  16. package/dist/client/chat-writes.d.ts +5 -12
  17. package/dist/client/chat-writes.d.ts.map +1 -1
  18. package/dist/client/chat-writes.js +40 -67
  19. package/dist/client/chat-writes.js.map +1 -1
  20. package/dist/client/contacts.d.ts +4 -4
  21. package/dist/client/contacts.d.ts.map +1 -1
  22. package/dist/client/contacts.js +6 -6
  23. package/dist/client/contacts.js.map +1 -1
  24. package/dist/client/delivery.d.ts +1 -1
  25. package/dist/client/delivery.d.ts.map +1 -1
  26. package/dist/client/delivery.js.map +1 -1
  27. package/dist/client/folders.d.ts +2 -3
  28. package/dist/client/folders.d.ts.map +1 -1
  29. package/dist/client/folders.js +4 -4
  30. package/dist/client/folders.js.map +1 -1
  31. package/dist/client/history.d.ts +2 -1
  32. package/dist/client/history.d.ts.map +1 -1
  33. package/dist/client/history.js +4 -3
  34. package/dist/client/history.js.map +1 -1
  35. package/dist/client/live.d.ts +2 -1
  36. package/dist/client/live.d.ts.map +1 -1
  37. package/dist/client/live.js.map +1 -1
  38. package/dist/client/message-reads.d.ts +1 -1
  39. package/dist/client/message-reads.d.ts.map +1 -1
  40. package/dist/client/message-reads.js +7 -5
  41. package/dist/client/message-reads.js.map +1 -1
  42. package/dist/client/message-writes.d.ts +2 -8
  43. package/dist/client/message-writes.d.ts.map +1 -1
  44. package/dist/client/message-writes.js +75 -178
  45. package/dist/client/message-writes.js.map +1 -1
  46. package/dist/client/people.d.ts +1 -1
  47. package/dist/client/people.d.ts.map +1 -1
  48. package/dist/client/people.js.map +1 -1
  49. package/dist/client/polls.d.ts +5 -10
  50. package/dist/client/polls.d.ts.map +1 -1
  51. package/dist/client/polls.js +27 -74
  52. package/dist/client/polls.js.map +1 -1
  53. package/dist/client/session.d.ts +1 -1
  54. package/dist/client/session.d.ts.map +1 -1
  55. package/dist/client/session.js.map +1 -1
  56. package/dist/client/shapes.d.ts +59 -0
  57. package/dist/client/shapes.d.ts.map +1 -0
  58. package/dist/client/shapes.js +6 -0
  59. package/dist/client/shapes.js.map +1 -0
  60. package/dist/client/stickers.d.ts +1 -1
  61. package/dist/client/stickers.d.ts.map +1 -1
  62. package/dist/client/stickers.js.map +1 -1
  63. package/dist/client/types.d.ts +0 -8
  64. package/dist/client/types.d.ts.map +1 -1
  65. package/dist/client/values.d.ts +7 -1
  66. package/dist/client/values.d.ts.map +1 -1
  67. package/dist/client/values.js +5 -0
  68. package/dist/client/values.js.map +1 -1
  69. package/dist/client/writes.d.ts +6 -15
  70. package/dist/client/writes.d.ts.map +1 -1
  71. package/dist/client/writes.js +21 -118
  72. package/dist/client/writes.js.map +1 -1
  73. package/dist/client.d.ts +1 -1
  74. package/dist/client.d.ts.map +1 -1
  75. package/dist/client.js +9 -19
  76. package/dist/client.js.map +1 -1
  77. package/dist/commands/context.d.ts.map +1 -1
  78. package/dist/commands/context.js +2 -6
  79. package/dist/commands/context.js.map +1 -1
  80. package/dist/commands/serve.js +1 -1
  81. package/dist/commands/serve.js.map +1 -1
  82. package/dist/commands/session.js +1 -1
  83. package/dist/commands/session.js.map +1 -1
  84. package/dist/commands/setup.d.ts.map +1 -1
  85. package/dist/commands/setup.js +21 -13
  86. package/dist/commands/setup.js.map +1 -1
  87. package/dist/commands/watch.d.ts +1 -1
  88. package/dist/commands/watch.d.ts.map +1 -1
  89. package/dist/commands/watch.js +6 -4
  90. package/dist/commands/watch.js.map +1 -1
  91. package/dist/domain/map.d.ts +4 -3
  92. package/dist/domain/map.d.ts.map +1 -1
  93. package/dist/domain/map.js +27 -22
  94. package/dist/domain/map.js.map +1 -1
  95. package/dist/download.d.ts +1 -1
  96. package/dist/download.d.ts.map +1 -1
  97. package/dist/messenger.d.ts +1 -1
  98. package/dist/messenger.d.ts.map +1 -1
  99. package/dist/messenger.js +36 -9
  100. package/dist/messenger.js.map +1 -1
  101. package/dist/permissions.d.ts +3 -3
  102. package/dist/permissions.d.ts.map +1 -1
  103. package/dist/permissions.js +20 -4
  104. package/dist/permissions.js.map +1 -1
  105. package/dist/program.d.ts.map +1 -1
  106. package/dist/program.js +2 -3
  107. package/dist/program.js.map +1 -1
  108. package/dist/report.d.ts +2 -2
  109. package/dist/report.d.ts.map +1 -1
  110. package/dist/report.js +25 -13
  111. package/dist/report.js.map +1 -1
  112. package/dist/resolve.d.ts +1 -1
  113. package/dist/resolve.d.ts.map +1 -1
  114. package/dist/resolve.js.map +1 -1
  115. package/dist/sends.d.ts +3 -3
  116. package/dist/sends.d.ts.map +1 -1
  117. package/dist/sends.js +3 -3
  118. package/dist/sends.js.map +1 -1
  119. package/dist/server/replies.d.ts +1 -2
  120. package/dist/server/replies.d.ts.map +1 -1
  121. package/dist/server/replies.js.map +1 -1
  122. package/dist/server/server-connection.js +1 -1
  123. package/dist/server/server-connection.js.map +1 -1
  124. package/dist/server/server.d.ts +2 -1
  125. package/dist/server/server.d.ts.map +1 -1
  126. package/dist/server/server.js +0 -2
  127. package/dist/server/server.js.map +1 -1
  128. package/dist/transcribe/index.d.ts +1 -1
  129. package/dist/transcribe/index.d.ts.map +1 -1
  130. package/dist/transcribe/index.js +2 -2
  131. package/dist/version.d.ts +1 -1
  132. package/dist/version.js +1 -1
  133. package/package.json +3 -3
  134. package/skills/max-cli/SKILL.md +5 -4
  135. package/dist/client/read-policy.d.ts +0 -2
  136. package/dist/client/read-policy.d.ts.map +0 -1
  137. package/dist/client/read-policy.js +0 -34
  138. package/dist/client/read-policy.js.map +0 -1
  139. package/dist/commands/mcp.d.ts +0 -29
  140. package/dist/commands/mcp.d.ts.map +0 -1
  141. package/dist/commands/mcp.js +0 -176
  142. package/dist/commands/mcp.js.map +0 -1
  143. package/dist/domain/models.d.ts +0 -238
  144. package/dist/domain/models.d.ts.map +0 -1
  145. package/dist/domain/models.js +0 -17
  146. package/dist/domain/models.js.map +0 -1
  147. package/dist/mcp/instructions.d.ts +0 -4
  148. package/dist/mcp/instructions.d.ts.map +0 -1
  149. package/dist/mcp/instructions.js +0 -16
  150. package/dist/mcp/instructions.js.map +0 -1
  151. package/dist/mcp/legacy-check.d.ts +0 -12
  152. package/dist/mcp/legacy-check.d.ts.map +0 -1
  153. package/dist/mcp/legacy-check.js +0 -46
  154. package/dist/mcp/legacy-check.js.map +0 -1
  155. package/dist/mcp/photo.d.ts +0 -9
  156. package/dist/mcp/photo.d.ts.map +0 -1
  157. package/dist/mcp/photo.js +0 -38
  158. package/dist/mcp/photo.js.map +0 -1
  159. package/dist/mcp/prompts.d.ts +0 -7
  160. package/dist/mcp/prompts.d.ts.map +0 -1
  161. package/dist/mcp/prompts.js +0 -102
  162. package/dist/mcp/prompts.js.map +0 -1
  163. package/dist/mcp/resources.d.ts +0 -15
  164. package/dist/mcp/resources.d.ts.map +0 -1
  165. package/dist/mcp/resources.js +0 -60
  166. package/dist/mcp/resources.js.map +0 -1
  167. package/dist/mcp/server.d.ts +0 -23
  168. package/dist/mcp/server.d.ts.map +0 -1
  169. package/dist/mcp/server.js +0 -98
  170. package/dist/mcp/server.js.map +0 -1
  171. package/dist/mcp/session.d.ts +0 -30
  172. package/dist/mcp/session.d.ts.map +0 -1
  173. package/dist/mcp/session.js +0 -109
  174. package/dist/mcp/session.js.map +0 -1
  175. package/dist/mcp/shared.d.ts +0 -14
  176. package/dist/mcp/shared.d.ts.map +0 -1
  177. package/dist/mcp/shared.js +0 -46
  178. package/dist/mcp/shared.js.map +0 -1
  179. package/dist/mcp/tools.d.ts +0 -19
  180. package/dist/mcp/tools.d.ts.map +0 -1
  181. package/dist/mcp/tools.js +0 -257
  182. package/dist/mcp/tools.js.map +0 -1
  183. package/dist/moderation/check.d.ts +0 -103
  184. package/dist/moderation/check.d.ts.map +0 -1
  185. package/dist/moderation/check.js +0 -273
  186. package/dist/moderation/check.js.map +0 -1
  187. package/dist/moderation/points.d.ts +0 -8
  188. package/dist/moderation/points.d.ts.map +0 -1
  189. package/dist/moderation/points.js +0 -21
  190. package/dist/moderation/points.js.map +0 -1
  191. package/dist/rendering/messages.d.ts +0 -24
  192. package/dist/rendering/messages.d.ts.map +0 -1
  193. package/dist/rendering/messages.js +0 -172
  194. package/dist/rendering/messages.js.map +0 -1
@@ -1,273 +0,0 @@
1
- import { CliError } from "@wirecat/cli-base";
2
- import { moderationPoints } from "./points.js";
3
- import { defaultRules, ModerationRules, moderationPathFor } from "./rules.js";
4
- const INVITE = /max\.ru\/join\//i;
5
- const LINK = /https?:\/\/\S+/i;
6
- /** Which action wins when a message breaks several rules; the first rule listed breaks a tie. */
7
- const STRENGTH = { report: 0, delete: 1, remove: 2 };
8
- /**
9
- * What the rules say about what is new. Pure: nothing here talks to MAX. One finding per message —
10
- * the rule with the strongest action — and one removal per person, whatever else they did.
11
- */
12
- export const judge = ({ rules, messages, joined, answerers, now }) => {
13
- const trusted = new Set(rules.trusted);
14
- const blocked = (id, name) => (id !== null && rules.blocked.includes(id)) ||
15
- (name !== null && rules.blockedNames.some((part) => name.toLocaleLowerCase().includes(part.toLocaleLowerCase())));
16
- const young = (member) => rules.newAccount.days > 0 &&
17
- member.registeredAt !== null &&
18
- now - Date.parse(member.registeredAt) < rules.newAccount.days * 86_400_000;
19
- const found = [];
20
- const add = (finding) => {
21
- if (finding.action === "remove" && found.some((f) => f.action === "remove" && f.personId === finding.personId)) {
22
- return;
23
- }
24
- found.push(finding);
25
- };
26
- for (const member of joined) {
27
- if (trusted.has(member.id) || answerers.has(member.id))
28
- continue;
29
- const person = { kind: "member", personId: member.id, personName: member.name };
30
- if (blocked(member.id, member.name)) {
31
- add({ ...person, rule: "blocked", action: rules.blockedPeople === "remove" ? "remove" : "report" });
32
- }
33
- else if (young(member)) {
34
- add({ ...person, rule: "newAccount", action: rules.newAccount.action });
35
- }
36
- }
37
- const flooding = floodOf(messages, rules.flood);
38
- for (const message of messages) {
39
- const id = message.senderId;
40
- if (id === null || message.outgoing === true || answerers.has(id) || trusted.has(id))
41
- continue;
42
- if (message.attachments.some((attachment) => attachment.kind === "control"))
43
- continue;
44
- const base = { kind: "message", personId: id, personName: message.senderName, messageId: message.id };
45
- const text = message.text;
46
- const broken = [];
47
- if (blocked(id, message.senderName))
48
- broken.push(["blocked", rules.blockedPeople]);
49
- if (INVITE.test(text))
50
- broken.push(["invites", rules.invites]);
51
- if (LINK.test(text) || message.attachments.some((attachment) => attachment.kind === "share")) {
52
- broken.push(["links", rules.links]);
53
- }
54
- if (message.forwardedFrom !== null)
55
- broken.push(["forwards", rules.forwards]);
56
- if (flooding.has(message.id))
57
- broken.push(["flood", rules.flood.action]);
58
- const strongest = broken.reduce((best, rule) => (best === undefined || STRENGTH[rule[1]] > STRENGTH[best[1]] ? rule : best), undefined);
59
- if (strongest)
60
- add({ ...base, rule: strongest[0], action: strongest[1] });
61
- }
62
- return found;
63
- };
64
- /** Messages past the limit: more than `messages` from one person within `minutes`. */
65
- const floodOf = (messages, flood) => {
66
- const window = flood.minutes * 60_000;
67
- const over = new Set();
68
- const bySender = new Map();
69
- for (const message of messages) {
70
- if (message.senderId === null)
71
- continue;
72
- const times = bySender.get(message.senderId) ?? [];
73
- const at = Date.parse(message.timestamp);
74
- times.push(at);
75
- bySender.set(message.senderId, times);
76
- if (times.filter((time) => at - time < window).length > flood.messages)
77
- over.add(message.id);
78
- }
79
- return over;
80
- };
81
- const CONSENT = {
82
- delete: "delete",
83
- remove: "remove",
84
- };
85
- /** The personal account: deleting is for everyone, removing leaves messages and cannot ban. */
86
- export const personal = (client) => ({
87
- deleteMessage: async (chatId, messageId) => {
88
- await client.messages.delete(chatId, [messageId], { forEveryone: true });
89
- },
90
- removePerson: async (chatId, personId) => {
91
- await client.chats.members.remove(chatId, [personId]);
92
- },
93
- });
94
- /**
95
- * Does what the findings ask, as far as consent, the per-run limit and the guard let it. Stops
96
- * acting at the first hourly-limit refusal: the rest is `skipped`, never tried.
97
- */
98
- export const act = async (moderator, findings, options) => {
99
- const { chatId, rules, allowDangerous, dryRun, maxActions, confirm } = options;
100
- const rows = [];
101
- let acted = 0;
102
- let stopped;
103
- for (const finding of findings) {
104
- if (finding.action === "report") {
105
- rows.push({ ...finding, outcome: "reported" });
106
- continue;
107
- }
108
- const command = commandFor(chatId, finding);
109
- const level = rules.consent[CONSENT[finding.action]];
110
- const row = (outcome, reason) => ({
111
- ...finding,
112
- outcome,
113
- ...(reason ? { reason } : {}),
114
- ...(outcome === "done" ? {} : { command }),
115
- });
116
- if (level === "deny") {
117
- rows.push(row("forbidden", `consent.${CONSENT[finding.action]} is deny`));
118
- continue;
119
- }
120
- if (dryRun) {
121
- rows.push(row("planned", "--dry-run"));
122
- continue;
123
- }
124
- if (level === "readonly") {
125
- rows.push(row("reported", `consent.${CONSENT[finding.action]} is readonly`));
126
- continue;
127
- }
128
- if (stopped || acted >= maxActions) {
129
- rows.push(row("skipped", stopped ?? `over the limit of ${maxActions} actions per check`));
130
- continue;
131
- }
132
- if (level === "ask" && !allowDangerous) {
133
- if (!confirm) {
134
- rows.push(row("planned", `consent.${CONSENT[finding.action]} is ask, and nobody is there to ask`));
135
- continue;
136
- }
137
- if (!(await confirm(finding))) {
138
- rows.push(row("declined", "not confirmed"));
139
- continue;
140
- }
141
- }
142
- acted += 1;
143
- try {
144
- if (finding.action === "delete" && finding.messageId) {
145
- await moderator.deleteMessage(chatId, finding.messageId);
146
- }
147
- else {
148
- await moderator.removePerson(chatId, finding.personId);
149
- }
150
- rows.push(row("done"));
151
- }
152
- catch (error) {
153
- const failure = asCliError(error);
154
- if (failure.code === "rate_limited")
155
- stopped = failure.message;
156
- const refused = ["rate_limited", "permission_error", "confirmation_required"].includes(failure.code);
157
- rows.push(row(refused ? "refused" : "failed", failure.message));
158
- }
159
- }
160
- return rows;
161
- };
162
- const asCliError = (error) => error instanceof CliError
163
- ? error
164
- : new CliError("provider_error", error instanceof Error ? error.message : String(error));
165
- const who = (finding) => finding.personName ?? finding.personId;
166
- /** One action in words, for a prompt or a confirmation form. */
167
- export const describe = (finding) => finding.action === "delete"
168
- ? `delete message ${finding.messageId} from ${who(finding)} for everyone (${finding.rule})`
169
- : `remove ${who(finding)} from the group (${finding.rule})`;
170
- /** Whether acting on it waits for the owner's yes. */
171
- export const needsConfirm = (rules, finding) => (finding.action === "delete" || finding.action === "remove") && rules.consent[finding.action] === "ask";
172
- const commandFor = (chatId, finding) => {
173
- switch (finding.action) {
174
- case "delete":
175
- return `max messages delete ${chatId} ${finding.messageId} --for-everyone --allow-dangerous`;
176
- case "remove":
177
- return `max chats members remove ${chatId} ${finding.personId}`;
178
- default:
179
- return "";
180
- }
181
- };
182
- /**
183
- * What is new in the group since `since`: its messages, who joined (from the service messages —
184
- * `add` measured, `joinByLink` assumed to name the joiner or be sent by them), who asks to join,
185
- * and who the admins are.
186
- */
187
- export const gather = async (client, chatId, since) => {
188
- const notes = [];
189
- const { messages, more } = await client.chats.since(chatId, since);
190
- const joinedIds = new Set(messages.flatMap((message) => message.attachments.flatMap((attachment) => {
191
- if (attachment.event === "add")
192
- return attachment.userIds ?? [];
193
- if (attachment.event === "joinByLink") {
194
- return attachment.userIds?.length ? attachment.userIds : message.senderId ? [message.senderId] : [];
195
- }
196
- return [];
197
- })));
198
- const joined = joinedIds.size === 0
199
- ? []
200
- : (await client.chats.members.list(chatId)).members.filter((member) => joinedIds.has(member.id));
201
- const admins = await client.chats.adminIds(chatId);
202
- if (admins === undefined)
203
- notes.push("the group's admins are not known, so only your own messages are exempt");
204
- return {
205
- messages,
206
- joined,
207
- answerers: new Set(admins ?? []),
208
- until: messages.at(-1)?.timestamp ?? null,
209
- more,
210
- notes,
211
- };
212
- };
213
- export const MAX_ACTIONS = 10;
214
- export const sessionPoints = moderationPoints;
215
- /** A group never checked before is looked at this far back. */
216
- const FIRST_LOOK_MS = 24 * 3_600_000;
217
- /** Reads and judges; changes nothing. `since` overrides the group's saved point. */
218
- export const prepare = async (client, { points, profile, chat, since }) => {
219
- const group = await client.chats.show(chat);
220
- const saved = new ModerationRules(moderationPathFor(profile)).read(group.id);
221
- const rules = saved ?? defaultRules(group.title);
222
- const point = points.read(group.id);
223
- const from = since ?? (point === undefined ? Date.now() - FIRST_LOOK_MS : Date.parse(point));
224
- const found = await gather(client, group.id, from);
225
- return {
226
- chatId: group.id,
227
- title: group.title,
228
- rules,
229
- found,
230
- findings: judge({ ...found, rules, now: Date.now() }),
231
- explicit: since !== undefined,
232
- notes: [
233
- ...(saved ? [] : [`${group.title ?? group.id} has no rules yet — the defaults only report`]),
234
- ...found.notes,
235
- ],
236
- };
237
- };
238
- /** Acts on what `prepare` found, moves the group's saved point, and says what is left. */
239
- export const finish = async (moderator, points, prepared, options) => {
240
- const { chatId, rules, found, findings, explicit } = prepared;
241
- const rows = await act(moderator, findings, { ...options, chatId, rules });
242
- const notes = [...prepared.notes];
243
- const next = nextPoint(rows, found);
244
- if (!explicit && !options.dryRun && next !== null) {
245
- points.write(chatId, next);
246
- }
247
- if (next !== found.until && rows.some(undone)) {
248
- notes.push("some actions are not done — the next check starts at the first of them");
249
- }
250
- else if (found.more) {
251
- notes.push("more history than one check reads — the next check goes on from here");
252
- }
253
- return { rows, notes };
254
- };
255
- const undone = (row) => ["planned", "skipped", "failed"].includes(row.outcome);
256
- /**
257
- * Where the next check starts: after the newest message read, or just before the first message whose
258
- * action is still undone — so it is judged again, and what came after it is still read. A person
259
- * who joined and is still undone keeps the point where it was, since the join is not a row's message.
260
- */
261
- const nextPoint = (rows, found) => {
262
- const waiting = rows.filter(undone);
263
- if (waiting.some((row) => row.messageId === undefined))
264
- return null;
265
- const times = waiting
266
- .map((row) => found.messages.find((message) => message.id === row.messageId)?.timestamp)
267
- .filter((time) => time !== undefined)
268
- .map(Date.parse);
269
- if (times.length === 0)
270
- return found.until;
271
- return new Date(Math.min(...times) - 1).toISOString();
272
- };
273
- //# sourceMappingURL=check.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/moderation/check.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import { ModerationRules } from "@wirecat/cli-core";
2
- import type { SessionStore } from "../session/store.js";
3
- export declare const migrateModerationPoints: (store: SessionStore, env?: NodeJS.ProcessEnv) => ModerationRules;
4
- export declare const moderationPoints: (store: SessionStore, env?: NodeJS.ProcessEnv) => {
5
- read: (chatId: string) => string | undefined;
6
- write: (chatId: string, at: string) => void;
7
- };
8
- //# sourceMappingURL=points.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"points.d.ts","sourceRoot":"","sources":["../../src/moderation/points.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAqB,MAAM,mBAAmB,CAAA;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,eAAO,MAAM,uBAAuB,UAAW,YAAY,QAAO,MAAM,CAAC,UAAU,KAAiB,eAenG,CAAA;AAGD,eAAO,MAAM,gBAAgB,UAAW,YAAY,QAAO,MAAM,CAAC,UAAU;IAC1E,IAAI,WAAW,MAAM,KAAG,MAAM,GAAG,SAAS;IAC1C,KAAK,WAAW,MAAM,MAAM,MAAM,KAAG,IAAI;CACzC,CAAA"}
@@ -1,21 +0,0 @@
1
- import { CliError } from "@wirecat/cli-base";
2
- import { ModerationRules, moderationPathFor } from "@wirecat/cli-core";
3
- import { MAX_APP } from "../app.js";
4
- export const migrateModerationPoints = (store, env = process.env) => {
5
- const rules = new ModerationRules(moderationPathFor(MAX_APP, store.profile, env));
6
- const missing = Object.entries(store.readState().checkedUntil ?? {}).filter(([id]) => rules.checkedUntil(id) === undefined);
7
- for (const [id, at] of missing) {
8
- if (!Number.isFinite(Date.parse(at))) {
9
- throw new CliError("configuration_error", `the saved moderation time for chat ${id} is invalid — fix checkedUntil in the session state`);
10
- }
11
- }
12
- for (const [id, at] of missing)
13
- rules.markChecked(id, at);
14
- return rules;
15
- };
16
- // Legacy MCP and shared CLI must advance the same point while the MCP surface waits for P7.
17
- export const moderationPoints = (store, env = process.env) => ({
18
- read: (chatId) => migrateModerationPoints(store, env).checkedUntil(chatId),
19
- write: (chatId, at) => migrateModerationPoints(store, env).markChecked(chatId, at),
20
- });
21
- //# sourceMappingURL=points.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"points.js","sourceRoot":"","sources":["../../src/moderation/points.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAmB,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAmB,EAAE;IACpH,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;IACjF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CACzE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,SAAS,CAC/C,CAAA;IACD,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,QAAQ,CAChB,qBAAqB,EACrB,sCAAsC,EAAE,qDAAqD,CAC9F,CAAA;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO;QAAE,KAAK,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACzD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,4FAA4F;AAC5F,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAmB,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9F,IAAI,EAAE,CAAC,MAAc,EAAsB,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC;IACtG,KAAK,EAAE,CAAC,MAAc,EAAE,EAAU,EAAQ,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;CACzG,CAAC,CAAA"}
@@ -1,24 +0,0 @@
1
- import type { Message, MessageHit, Poll, WindowedMessage } from "../domain/models.js";
2
- export interface RenderOptions {
3
- /** 0 — the conversation; 1 — the ids worth searching by; 2 — everything the model knows. */
4
- verbosity?: 0 | 1 | 2;
5
- width?: number;
6
- /**
7
- * Whether to style at all. **Decided by the caller**: `styleText` checks the stream under Node and
8
- * not under Bun, which styles a pipe too (measured 2026-09-22).
9
- */
10
- color?: boolean;
11
- /** A colour per sender, `вы` keeping cyan to itself. */
12
- senderColors?: boolean;
13
- locale?: string;
14
- timeZone?: string;
15
- profile?: string;
16
- }
17
- export declare const renderMessages: (messages: (Message | MessageHit | WindowedMessage)[], options?: RenderOptions) => string;
18
- export declare const renderMessage: (message: Message | MessageHit | WindowedMessage, options?: RenderOptions) => string;
19
- /**
20
- * `📊 question`, then one line per answer with the id `max polls vote` takes, its votes, and ✓ on
21
- * the owner's own. What kind of poll it is goes on the last line, beside the count.
22
- */
23
- export declare const pollLines: (poll: Poll) => string[];
24
- //# sourceMappingURL=messages.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/rendering/messages.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,OAAO,EACP,UAAU,EACV,IAAI,EAGJ,eAAe,EAChB,MAAM,qBAAqB,CAAA;AAE5B,MAAM,WAAW,aAAa;IAC5B,4FAA4F;IAC5F,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,wDAAwD;IACxD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AASD,eAAO,MAAM,cAAc,aACf,CAAC,OAAO,GAAG,UAAU,GAAG,eAAe,CAAC,EAAE,YAC3C,aAAa,KACrB,MAcF,CAAA;AAED,eAAO,MAAM,aAAa,YAAa,OAAO,GAAG,UAAU,GAAG,eAAe,YAAW,aAAa,KAAQ,MAgD5G,CAAA;AAmED;;;GAGG;AACH,eAAO,MAAM,SAAS,SAAU,IAAI,KAAG,MAAM,EAc5C,CAAA"}
@@ -1,172 +0,0 @@
1
- import { styleText } from "node:util";
2
- import { singleLine, visibleControls } from "@wirecat/cli-base";
3
- import stringWidth from "string-width";
4
- import wrapAnsi from "wrap-ansi";
5
- const TIME_WIDTH = 8;
6
- const INDENT = " ".repeat(TIME_WIDTH + 2);
7
- const MIN_WIDTH = 40;
8
- const SENDER_COLOURS = ["green", "yellow", "magenta", "blue", "red"];
9
- export const renderMessages = (messages, options = {}) => {
10
- if (messages.length === 0)
11
- return "(nothing)";
12
- const day = dayFormatter(options);
13
- const paint = painter(options);
14
- let previous;
15
- const blocks = [];
16
- for (const message of messages) {
17
- const date = day(message.timestamp);
18
- if (date !== previous)
19
- blocks.push(paint("dim", `── ${date} ──`));
20
- previous = date;
21
- blocks.push(renderMessage(message, options));
22
- }
23
- return blocks.join("\n\n");
24
- };
25
- export const renderMessage = (message, options = {}) => {
26
- const paint = painter(options);
27
- const width = Math.max(MIN_WIDTH, options.width ?? 80);
28
- const room = width - INDENT.length;
29
- const time = timeFormatter(options);
30
- const verbosity = options.verbosity ?? 0;
31
- const chat = "chatTitle" in message ? paint("dim", ` · ${singleLine(message.chatTitle ?? message.chatId)}`) : "";
32
- const mark = "anchor" in message && message.anchor ? paint("bold", " ◀") : "";
33
- const lines = [`${paint("dim", time(message.timestamp))} ${senderOf(message, options)}${chat}${mark}`];
34
- const body = (text) => wrapAnsi(visibleControls(text), room, { hard: true }).split("\n");
35
- if (message.replyTo)
36
- lines.push(paint("dim", preview("↳", message.replyTo, room)));
37
- if (message.forwardedFrom) {
38
- lines.push(paint("dim", `↪ ${nameOf(message.forwardedFrom)}`));
39
- if (message.forwardedFrom.text)
40
- lines.push(...body(message.forwardedFrom.text));
41
- lines.push(...attachmentLines(message.forwardedFrom.attachments, paint, options));
42
- }
43
- if (message.text)
44
- lines.push(...body(message.text));
45
- lines.push(...attachmentLines(message.attachments, paint, options));
46
- if (message.reactions && message.reactions.total > 0)
47
- lines.push(paint("dim", reactionLine(message.reactions)));
48
- if (message.editedAt)
49
- lines.push(paint("dim", `edited ${editedAt(message, options)}`));
50
- if (verbosity >= 1) {
51
- const fields = [
52
- ["message", message.id],
53
- ["sender", message.senderId],
54
- ["chat", message.chatId],
55
- ["reply to", message.replyTo?.id],
56
- ["forward of", message.forwardedFrom?.id],
57
- ...message.attachments.map((a) => ["link", a.url]),
58
- ];
59
- if (verbosity >= 2) {
60
- fields.push(["provider", "max"], ["profile", options.profile], ["sent", message.timestamp], ["edited", message.editedAt], ["outgoing", message.outgoing === null ? "unknown" : String(message.outgoing)], ...message.attachments.map((a) => ["attachment", JSON.stringify(a)]));
61
- }
62
- const shown = fields.filter((field) => typeof field[1] === "string");
63
- const label = Math.max(...shown.map(([key]) => key.length));
64
- lines.push("", ...shown.map(([key, value]) => paint("dim", `${key.padEnd(label)} ${singleLine(value)}`)));
65
- }
66
- return lines.map((line, index) => (index === 0 || line === "" ? line : `${INDENT}${line}`)).join("\n");
67
- };
68
- const painter = ({ color = false }) => (style, text) => color ? styleText(style, text, { validateStream: false }) : text;
69
- const senderOf = (message, options) => {
70
- const paint = painter(options);
71
- if (message.outgoing === true)
72
- return paint(["bold", "cyan"], "вы");
73
- const name = nameOf(message);
74
- if (!options.senderColors)
75
- return paint("bold", name);
76
- const colour = SENDER_COLOURS[hash(message.senderId ?? name) % SENDER_COLOURS.length] ?? "green";
77
- return paint(["bold", colour], name);
78
- };
79
- const nameOf = ({ senderName, senderId, outgoing }) => outgoing === true ? "вы" : singleLine(senderName ?? senderId ?? "unknown");
80
- const hash = (value) => [...value].reduce((sum, char) => (sum * 31 + char.charCodeAt(0)) >>> 0, 7);
81
- /** One line: it is a pointer to the other message, not a second copy of it. */
82
- const preview = (mark, quoted, room) => {
83
- const text = singleLine(quoted.text.split("\n")[0] ?? "") || (quoted.attachments[0] ? `📎 ${quoted.attachments[0].kind}` : "");
84
- const line = text ? `${mark} ${nameOf(quoted)}: ${text}` : `${mark} message ${quoted.id}`;
85
- if (stringWidth(line) <= room)
86
- return line;
87
- return `${wrapAnsi(line, room - 1, { hard: true }).split("\n")[0]}…`;
88
- };
89
- /**
90
- * Compact, and each one a link: `📎 photo`, `📎 photo ×3 1 2 3`, `📎 report.pdf · 24 MB`. The link
91
- * is an OSC 8 hyperlink where there is colour; without it the address is printed, so it is never
92
- * out of reach.
93
- */
94
- const attachmentLines = (attachments, paint, options) => {
95
- // The address sits inside our own OSC 8 sequence: a BEL or ESC in it would end that sequence early.
96
- const link = (label, raw) => {
97
- if (raw === undefined)
98
- return label;
99
- const url = singleLine(raw);
100
- return options.color ? `\u001b]8;;${url}\u0007${label}\u001b]8;;\u0007` : `${label} ${url}`;
101
- };
102
- const polls = attachments.flatMap((attachment) => (attachment.poll ? [attachment.poll] : []));
103
- const groups = new Map();
104
- for (const attachment of attachments.filter((each) => !each.poll)) {
105
- const key = attachment.kind === "poll"
106
- ? "a poll of a newer kind this version cannot show"
107
- : singleLine(attachment.name ?? attachment.title ?? attachment.kind);
108
- groups.set(key, [...(groups.get(key) ?? []), attachment]);
109
- }
110
- const files = [...groups].map(([label, same]) => {
111
- const first = same[0];
112
- const size = first?.size === undefined ? "" : ` · ${megabytes(first.size)}`;
113
- if (same.length === 1)
114
- return paint("dim", `📎 ${link(`${label}${size}`, first?.url)}`);
115
- const each = same.map((attachment, index) => link(String(index + 1), attachment.url)).join(" ");
116
- return paint("dim", `📎 ${label} ×${same.length} ${each}`);
117
- });
118
- return [...polls.flatMap(pollLines), ...files];
119
- };
120
- /**
121
- * `📊 question`, then one line per answer with the id `max polls vote` takes, its votes, and ✓ on
122
- * the owner's own. What kind of poll it is goes on the last line, beside the count.
123
- */
124
- export const pollLines = (poll) => {
125
- const kind = [
126
- poll.closed ? "closed" : "",
127
- poll.multiple ? "several answers" : "",
128
- poll.anonymous ? "anonymous" : "",
129
- poll.quiz ? "quiz" : "",
130
- ].filter(Boolean);
131
- return [
132
- `📊 ${visibleControls(poll.question)}`,
133
- ...poll.answers.map((answer) => ` [${answer.id}] ${visibleControls(answer.text)} — ${answer.votes}${answer.mine ? " ✓" : ""}`),
134
- ` ${[`${poll.total} voted`, ...kind].join(" · ")}`,
135
- ];
136
- };
137
- const megabytes = (bytes) => bytes >= 1_000_000 ? `${Math.round(bytes / 1_000_000)} MB` : `${Math.max(1, Math.round(bytes / 1_000))} KB`;
138
- const parts = (format, iso) => Object.fromEntries(format.formatToParts(new Date(iso)).map(({ type, value }) => [type, value]));
139
- const timeFormatter = ({ timeZone }) => {
140
- const format = new Intl.DateTimeFormat("en-GB", {
141
- hour: "2-digit",
142
- minute: "2-digit",
143
- second: "2-digit",
144
- hourCycle: "h23",
145
- ...(timeZone ? { timeZone } : {}),
146
- });
147
- return (iso) => {
148
- const { hour, minute, second } = parts(format, iso);
149
- return `${hour}:${minute}:${second}`;
150
- };
151
- };
152
- /** `3 января 2026` — the `г.` Intl adds for Russian is dropped; the line is a heading, not a date field. */
153
- const dayFormatter = ({ locale = "ru-RU", timeZone }) => {
154
- const format = new Intl.DateTimeFormat(locale, {
155
- day: "numeric",
156
- month: "long",
157
- year: "numeric",
158
- ...(timeZone ? { timeZone } : {}),
159
- });
160
- return (iso) => format.format(new Date(iso)).replace(/\s*г\.$/, "");
161
- };
162
- const reactionLine = ({ counts, mine }) => {
163
- const shown = counts.map(({ reaction, count }) => `${singleLine(reaction)} ${count}`).join(" ");
164
- return mine ? `${shown} (you: ${singleLine(mine)})` : shown;
165
- };
166
- const editedAt = (message, options) => {
167
- const edited = message.editedAt ?? message.timestamp;
168
- const time = timeFormatter(options)(edited);
169
- const day = dayFormatter(options);
170
- return day(edited) === day(message.timestamp) ? time : `${day(edited)} ${time}`;
171
- };
172
- //# sourceMappingURL=messages.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/rendering/messages.ts"],"names":[],"mappings":"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"}