@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.
- package/dist/adapter/max-adapter.d.ts +1 -5
- package/dist/adapter/max-adapter.d.ts.map +1 -1
- package/dist/adapter/max-adapter.js +21 -53
- package/dist/adapter/max-adapter.js.map +1 -1
- package/dist/client/account.d.ts +3 -3
- package/dist/client/account.d.ts.map +1 -1
- package/dist/client/account.js +4 -4
- package/dist/client/account.js.map +1 -1
- package/dist/client/chat-members.d.ts +2 -1
- package/dist/client/chat-members.d.ts.map +1 -1
- package/dist/client/chat-members.js.map +1 -1
- package/dist/client/chat-reads.d.ts +2 -1
- package/dist/client/chat-reads.d.ts.map +1 -1
- package/dist/client/chat-reads.js +9 -7
- package/dist/client/chat-reads.js.map +1 -1
- package/dist/client/chat-writes.d.ts +5 -12
- package/dist/client/chat-writes.d.ts.map +1 -1
- package/dist/client/chat-writes.js +40 -67
- package/dist/client/chat-writes.js.map +1 -1
- package/dist/client/contacts.d.ts +4 -4
- package/dist/client/contacts.d.ts.map +1 -1
- package/dist/client/contacts.js +6 -6
- package/dist/client/contacts.js.map +1 -1
- package/dist/client/delivery.d.ts +1 -1
- package/dist/client/delivery.d.ts.map +1 -1
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/folders.d.ts +2 -3
- package/dist/client/folders.d.ts.map +1 -1
- package/dist/client/folders.js +4 -4
- package/dist/client/folders.js.map +1 -1
- package/dist/client/history.d.ts +2 -1
- package/dist/client/history.d.ts.map +1 -1
- package/dist/client/history.js +4 -3
- package/dist/client/history.js.map +1 -1
- package/dist/client/live.d.ts +2 -1
- package/dist/client/live.d.ts.map +1 -1
- package/dist/client/live.js.map +1 -1
- package/dist/client/message-reads.d.ts +1 -1
- package/dist/client/message-reads.d.ts.map +1 -1
- package/dist/client/message-reads.js +7 -5
- package/dist/client/message-reads.js.map +1 -1
- package/dist/client/message-writes.d.ts +2 -8
- package/dist/client/message-writes.d.ts.map +1 -1
- package/dist/client/message-writes.js +75 -178
- package/dist/client/message-writes.js.map +1 -1
- package/dist/client/people.d.ts +1 -1
- package/dist/client/people.d.ts.map +1 -1
- package/dist/client/people.js.map +1 -1
- package/dist/client/polls.d.ts +5 -10
- package/dist/client/polls.d.ts.map +1 -1
- package/dist/client/polls.js +27 -74
- package/dist/client/polls.js.map +1 -1
- package/dist/client/session.d.ts +1 -1
- package/dist/client/session.d.ts.map +1 -1
- package/dist/client/session.js.map +1 -1
- package/dist/client/shapes.d.ts +59 -0
- package/dist/client/shapes.d.ts.map +1 -0
- package/dist/client/shapes.js +6 -0
- package/dist/client/shapes.js.map +1 -0
- package/dist/client/stickers.d.ts +1 -1
- package/dist/client/stickers.d.ts.map +1 -1
- package/dist/client/stickers.js.map +1 -1
- package/dist/client/types.d.ts +0 -8
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/values.d.ts +7 -1
- package/dist/client/values.d.ts.map +1 -1
- package/dist/client/values.js +5 -0
- package/dist/client/values.js.map +1 -1
- package/dist/client/writes.d.ts +6 -15
- package/dist/client/writes.d.ts.map +1 -1
- package/dist/client/writes.js +21 -118
- package/dist/client/writes.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +9 -19
- package/dist/client.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +2 -6
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/serve.js +1 -1
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/session.js +1 -1
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +21 -13
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/watch.d.ts +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +6 -4
- package/dist/commands/watch.js.map +1 -1
- package/dist/domain/map.d.ts +4 -3
- package/dist/domain/map.d.ts.map +1 -1
- package/dist/domain/map.js +27 -22
- package/dist/domain/map.js.map +1 -1
- package/dist/download.d.ts +1 -1
- package/dist/download.d.ts.map +1 -1
- package/dist/messenger.d.ts +1 -1
- package/dist/messenger.d.ts.map +1 -1
- package/dist/messenger.js +36 -9
- package/dist/messenger.js.map +1 -1
- package/dist/permissions.d.ts +3 -3
- package/dist/permissions.d.ts.map +1 -1
- package/dist/permissions.js +20 -4
- package/dist/permissions.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +2 -3
- package/dist/program.js.map +1 -1
- package/dist/report.d.ts +2 -2
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +25 -13
- package/dist/report.js.map +1 -1
- package/dist/resolve.d.ts +1 -1
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js.map +1 -1
- package/dist/sends.d.ts +3 -3
- package/dist/sends.d.ts.map +1 -1
- package/dist/sends.js +3 -3
- package/dist/sends.js.map +1 -1
- package/dist/server/replies.d.ts +1 -2
- package/dist/server/replies.d.ts.map +1 -1
- package/dist/server/replies.js.map +1 -1
- package/dist/server/server-connection.js +1 -1
- package/dist/server/server-connection.js.map +1 -1
- package/dist/server/server.d.ts +2 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +0 -2
- package/dist/server/server.js.map +1 -1
- package/dist/transcribe/index.d.ts +1 -1
- package/dist/transcribe/index.d.ts.map +1 -1
- package/dist/transcribe/index.js +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/skills/max-cli/SKILL.md +5 -4
- package/dist/client/read-policy.d.ts +0 -2
- package/dist/client/read-policy.d.ts.map +0 -1
- package/dist/client/read-policy.js +0 -34
- package/dist/client/read-policy.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -29
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js +0 -176
- package/dist/commands/mcp.js.map +0 -1
- package/dist/domain/models.d.ts +0 -238
- package/dist/domain/models.d.ts.map +0 -1
- package/dist/domain/models.js +0 -17
- package/dist/domain/models.js.map +0 -1
- package/dist/mcp/instructions.d.ts +0 -4
- package/dist/mcp/instructions.d.ts.map +0 -1
- package/dist/mcp/instructions.js +0 -16
- package/dist/mcp/instructions.js.map +0 -1
- package/dist/mcp/legacy-check.d.ts +0 -12
- package/dist/mcp/legacy-check.d.ts.map +0 -1
- package/dist/mcp/legacy-check.js +0 -46
- package/dist/mcp/legacy-check.js.map +0 -1
- package/dist/mcp/photo.d.ts +0 -9
- package/dist/mcp/photo.d.ts.map +0 -1
- package/dist/mcp/photo.js +0 -38
- package/dist/mcp/photo.js.map +0 -1
- package/dist/mcp/prompts.d.ts +0 -7
- package/dist/mcp/prompts.d.ts.map +0 -1
- package/dist/mcp/prompts.js +0 -102
- package/dist/mcp/prompts.js.map +0 -1
- package/dist/mcp/resources.d.ts +0 -15
- package/dist/mcp/resources.d.ts.map +0 -1
- package/dist/mcp/resources.js +0 -60
- package/dist/mcp/resources.js.map +0 -1
- package/dist/mcp/server.d.ts +0 -23
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -98
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/session.d.ts +0 -30
- package/dist/mcp/session.d.ts.map +0 -1
- package/dist/mcp/session.js +0 -109
- package/dist/mcp/session.js.map +0 -1
- package/dist/mcp/shared.d.ts +0 -14
- package/dist/mcp/shared.d.ts.map +0 -1
- package/dist/mcp/shared.js +0 -46
- package/dist/mcp/shared.js.map +0 -1
- package/dist/mcp/tools.d.ts +0 -19
- package/dist/mcp/tools.d.ts.map +0 -1
- package/dist/mcp/tools.js +0 -257
- package/dist/mcp/tools.js.map +0 -1
- package/dist/moderation/check.d.ts +0 -103
- package/dist/moderation/check.d.ts.map +0 -1
- package/dist/moderation/check.js +0 -273
- package/dist/moderation/check.js.map +0 -1
- package/dist/moderation/points.d.ts +0 -8
- package/dist/moderation/points.d.ts.map +0 -1
- package/dist/moderation/points.js +0 -21
- package/dist/moderation/points.js.map +0 -1
- package/dist/rendering/messages.d.ts +0 -24
- package/dist/rendering/messages.d.ts.map +0 -1
- package/dist/rendering/messages.js +0 -172
- package/dist/rendering/messages.js.map +0 -1
package/dist/moderation/check.js
DELETED
|
@@ -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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"}
|