@leemour/cli-messaging 0.87.0 → 0.89.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/README.md +1 -0
- package/dist/background/index.d.ts +5 -0
- package/dist/background/index.d.ts.map +1 -0
- package/dist/background/index.js +5 -0
- package/dist/background/index.js.map +1 -0
- package/dist/background/lock.d.ts +17 -0
- package/dist/background/lock.d.ts.map +1 -0
- package/dist/background/lock.js +34 -0
- package/dist/background/lock.js.map +1 -0
- package/dist/background/processes.d.ts.map +1 -0
- package/dist/background/processes.js.map +1 -0
- package/dist/background/system.d.ts +20 -0
- package/dist/background/system.d.ts.map +1 -0
- package/dist/background/system.js +39 -0
- package/dist/background/system.js.map +1 -0
- package/dist/background/units.d.ts +42 -0
- package/dist/background/units.d.ts.map +1 -0
- package/dist/background/units.js +178 -0
- package/dist/background/units.js.map +1 -0
- package/dist/cli/bot/port.d.ts +29 -0
- package/dist/cli/bot/port.d.ts.map +1 -0
- package/dist/cli/bot/port.js +2 -0
- package/dist/cli/bot/port.js.map +1 -0
- package/dist/cli/bot/registry.d.ts +37 -0
- package/dist/cli/bot/registry.d.ts.map +1 -0
- package/dist/cli/bot/registry.js +94 -0
- package/dist/cli/bot/registry.js.map +1 -0
- package/dist/cli/bot/token.d.ts +25 -0
- package/dist/cli/bot/token.d.ts.map +1 -0
- package/dist/cli/bot/token.js +36 -0
- package/dist/cli/bot/token.js.map +1 -0
- package/dist/cli/config-command.d.ts.map +1 -1
- package/dist/cli/config-command.js +17 -5
- package/dist/cli/config-command.js.map +1 -1
- package/dist/cli/context.d.ts +3 -0
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/index.d.ts +5 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/messenger/admin-moderation-command.d.ts +11 -0
- package/dist/cli/messenger/admin-moderation-command.d.ts.map +1 -0
- package/dist/cli/messenger/admin-moderation-command.js +83 -0
- package/dist/cli/messenger/admin-moderation-command.js.map +1 -0
- package/dist/cli/messenger/after.d.ts +18 -5
- package/dist/cli/messenger/after.d.ts.map +1 -1
- package/dist/cli/messenger/after.js +19 -30
- package/dist/cli/messenger/after.js.map +1 -1
- package/dist/cli/messenger/ask.d.ts +2 -0
- package/dist/cli/messenger/ask.d.ts.map +1 -1
- package/dist/cli/messenger/ask.js +7 -0
- package/dist/cli/messenger/ask.js.map +1 -1
- package/dist/cli/messenger/backfill-jobs.d.ts.map +1 -1
- package/dist/cli/messenger/backfill-jobs.js +1 -1
- package/dist/cli/messenger/backfill-jobs.js.map +1 -1
- package/dist/cli/messenger/chats-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-command.js +3 -0
- package/dist/cli/messenger/chats-command.js.map +1 -1
- package/dist/cli/messenger/context.d.ts +5 -0
- package/dist/cli/messenger/context.d.ts.map +1 -1
- package/dist/cli/messenger/context.js +3 -0
- package/dist/cli/messenger/context.js.map +1 -1
- package/dist/cli/messenger/conversations-command.d.ts +10 -0
- package/dist/cli/messenger/conversations-command.d.ts.map +1 -0
- package/dist/cli/messenger/conversations-command.js +101 -0
- package/dist/cli/messenger/conversations-command.js.map +1 -0
- package/dist/cli/messenger/hearing-command.d.ts.map +1 -1
- package/dist/cli/messenger/hearing-command.js +4 -1
- package/dist/cli/messenger/hearing-command.js.map +1 -1
- package/dist/cli/messenger/messages-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-command.js +9 -7
- package/dist/cli/messenger/messages-command.js.map +1 -1
- package/dist/cli/messenger/port.d.ts +6 -1
- package/dist/cli/messenger/port.d.ts.map +1 -1
- package/dist/cli/messenger/port.js.map +1 -1
- package/dist/cli/messenger/serve-command.d.ts +1 -13
- package/dist/cli/messenger/serve-command.d.ts.map +1 -1
- package/dist/cli/messenger/serve-command.js +7 -32
- package/dist/cli/messenger/serve-command.js.map +1 -1
- package/dist/cli/messenger/server-command.d.ts +1 -17
- package/dist/cli/messenger/server-command.d.ts.map +1 -1
- package/dist/cli/messenger/server-command.js +24 -222
- package/dist/cli/messenger/server-command.js.map +1 -1
- package/dist/cli/messenger/store-maintenance-command.d.ts.map +1 -1
- package/dist/cli/messenger/store-maintenance-command.js +35 -1
- package/dist/cli/messenger/store-maintenance-command.js.map +1 -1
- package/dist/cli/messenger/transcribe-command.d.ts.map +1 -1
- package/dist/cli/messenger/transcribe-command.js +4 -1
- package/dist/cli/messenger/transcribe-command.js.map +1 -1
- package/dist/cli/settings.d.ts +25 -1
- package/dist/cli/settings.d.ts.map +1 -1
- package/dist/cli/settings.js +108 -34
- package/dist/cli/settings.js.map +1 -1
- package/dist/conversations/link.d.ts +2 -2
- package/dist/conversations/link.d.ts.map +1 -1
- package/dist/conversations/link.js +6 -4
- package/dist/conversations/link.js.map +1 -1
- package/dist/domain/models.d.ts +4 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/send-time.d.ts +1 -1
- package/dist/domain/send-time.js +4 -4
- package/dist/domain/send-time.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/confirm.js +1 -1
- package/dist/mcp/confirm.js.map +1 -1
- package/dist/mcp/tool.d.ts +2 -0
- package/dist/mcp/tool.d.ts.map +1 -1
- package/dist/mcp/tool.js +2 -0
- package/dist/mcp/tool.js.map +1 -1
- package/dist/mcp/tools/chats.d.ts.map +1 -1
- package/dist/mcp/tools/chats.js +13 -8
- package/dist/mcp/tools/chats.js.map +1 -1
- package/dist/mcp/tools/conversations.d.ts +5 -0
- package/dist/mcp/tools/conversations.d.ts.map +1 -0
- package/dist/mcp/tools/conversations.js +56 -0
- package/dist/mcp/tools/conversations.js.map +1 -0
- package/dist/mcp/tools/inbox.js +3 -3
- package/dist/mcp/tools/inbox.js.map +1 -1
- package/dist/mcp/tools/messages-send.js +4 -4
- package/dist/mcp/tools/messages-send.js.map +1 -1
- package/dist/mcp/tools/messages.d.ts.map +1 -1
- package/dist/mcp/tools/messages.js +25 -18
- package/dist/mcp/tools/messages.js.map +1 -1
- package/dist/mcp/tools/moderation.d.ts +8 -0
- package/dist/mcp/tools/moderation.d.ts.map +1 -0
- package/dist/mcp/tools/moderation.js +36 -0
- package/dist/mcp/tools/moderation.js.map +1 -0
- package/dist/mcp/tools/review.d.ts.map +1 -1
- package/dist/mcp/tools/review.js +3 -3
- package/dist/mcp/tools/review.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +4 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/moderation/check.d.ts +83 -0
- package/dist/moderation/check.d.ts.map +1 -0
- package/dist/moderation/check.js +227 -0
- package/dist/moderation/check.js.map +1 -0
- package/dist/moderation/rules.d.ts +105 -0
- package/dist/moderation/rules.d.ts.map +1 -0
- package/dist/moderation/rules.js +158 -0
- package/dist/moderation/rules.js.map +1 -0
- package/dist/parity/bin.js +15 -2
- package/dist/parity/bin.js.map +1 -1
- package/dist/parity/index.d.ts +1 -0
- package/dist/parity/index.d.ts.map +1 -1
- package/dist/parity/index.js +1 -0
- package/dist/parity/index.js.map +1 -1
- package/dist/parity/wording.d.ts +7 -0
- package/dist/parity/wording.d.ts.map +1 -0
- package/dist/parity/wording.js +31 -0
- package/dist/parity/wording.js.map +1 -0
- package/dist/sends/permissions.d.ts +5 -3
- package/dist/sends/permissions.d.ts.map +1 -1
- package/dist/sends/permissions.js +30 -6
- package/dist/sends/permissions.js.map +1 -1
- package/dist/services/conversations.d.ts +45 -0
- package/dist/services/conversations.d.ts.map +1 -0
- package/dist/services/conversations.js +92 -0
- package/dist/services/conversations.js.map +1 -0
- package/dist/services/deps.d.ts +7 -1
- package/dist/services/deps.d.ts.map +1 -1
- package/dist/services/deps.js +2 -1
- package/dist/services/deps.js.map +1 -1
- package/dist/services/index.d.ts +8 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +6 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/messages.d.ts +2 -0
- package/dist/services/messages.d.ts.map +1 -1
- package/dist/services/messages.js +7 -1
- package/dist/services/messages.js.map +1 -1
- package/dist/services/moderation.d.ts +33 -0
- package/dist/services/moderation.d.ts.map +1 -0
- package/dist/services/moderation.js +99 -0
- package/dist/services/moderation.js.map +1 -0
- package/dist/speech/transcribe.d.ts +5 -1
- package/dist/speech/transcribe.d.ts.map +1 -1
- package/dist/speech/transcribe.js +2 -2
- package/dist/speech/transcribe.js.map +1 -1
- package/dist/store/sqlite/conversations.d.ts +45 -0
- package/dist/store/sqlite/conversations.d.ts.map +1 -0
- package/dist/store/sqlite/conversations.js +309 -0
- package/dist/store/sqlite/conversations.js.map +1 -0
- package/dist/store/sqlite/drizzle/bun.js +1 -1
- package/dist/store/sqlite/drizzle/core.d.ts +1 -1
- package/dist/store/sqlite/drizzle/core.d.ts.map +1 -1
- package/dist/store/sqlite/drizzle/core.js +5 -3
- package/dist/store/sqlite/drizzle/core.js.map +1 -1
- package/dist/store/sqlite/drizzle/node.js +1 -1
- package/dist/store/sqlite/drizzle/{shared-JAIU3GYB.js → shared-VIVPOB3Q.js} +5 -1
- package/dist/store/sqlite/drizzle/{shared-JAIU3GYB.js.map → shared-VIVPOB3Q.js.map} +1 -1
- package/dist/store/sqlite/manifest.d.ts.map +1 -1
- package/dist/store/sqlite/manifest.js +1 -0
- package/dist/store/sqlite/manifest.js.map +1 -1
- package/dist/store/sqlite/messages.d.ts.map +1 -1
- package/dist/store/sqlite/messages.js +2 -0
- package/dist/store/sqlite/messages.js.map +1 -1
- package/dist/store/sqlite/migrations.generated.d.ts.map +1 -1
- package/dist/store/sqlite/migrations.generated.js +15 -0
- package/dist/store/sqlite/migrations.generated.js.map +1 -1
- package/dist/store/sqlite/reads.d.ts +50 -0
- package/dist/store/sqlite/reads.d.ts.map +1 -1
- package/dist/store/sqlite/reads.js +2 -1
- package/dist/store/sqlite/reads.js.map +1 -1
- package/dist/store/sqlite/schema.d.ts +494 -0
- package/dist/store/sqlite/schema.d.ts.map +1 -1
- package/dist/store/sqlite/schema.js +78 -1
- package/dist/store/sqlite/schema.js.map +1 -1
- package/dist/store/sqlite/search.d.ts +33 -0
- package/dist/store/sqlite/search.d.ts.map +1 -1
- package/dist/store/store.d.ts +70 -0
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +46 -0
- package/dist/store/store.js.map +1 -1
- package/package.json +5 -1
- package/parity.json +115 -104
- package/dist/cli/messenger/processes.d.ts.map +0 -1
- package/dist/cli/messenger/processes.js.map +0 -1
- /package/dist/{cli/messenger → background}/processes.d.ts +0 -0
- /package/dist/{cli/messenger → background}/processes.js +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Messenger } from "../../cli/messenger/context.js";
|
|
2
|
+
import { type AnyTool } from "../tool.js";
|
|
3
|
+
/**
|
|
4
|
+
* A group's rules, and the run that acts on them. Over MCP nobody can answer a question per action,
|
|
5
|
+
* so an action whose level in the group's rules is `ask` is planned, not taken.
|
|
6
|
+
*/
|
|
7
|
+
export declare const moderationTools: (messenger: Messenger) => Record<string, AnyTool>;
|
|
8
|
+
//# sourceMappingURL=moderation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moderation.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/moderation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAG/D,OAAO,EAAE,KAAK,OAAO,EAAsC,MAAM,YAAY,CAAA;AAE7E;;;GAGG;AACH,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAkC3E,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { onlineDeps, servicesFor } from "../../services/index.js";
|
|
3
|
+
import { momentOf } from "../../services/moment.js";
|
|
4
|
+
import { APPROVE, chatOf, READ, tool, WRITE } from "../tool.js";
|
|
5
|
+
/**
|
|
6
|
+
* A group's rules, and the run that acts on them. Over MCP nobody can answer a question per action,
|
|
7
|
+
* so an action whose level in the group's rules is `ask` is planned, not taken.
|
|
8
|
+
*/
|
|
9
|
+
export const moderationTools = (messenger) => ({
|
|
10
|
+
chats_rules_show: tool({
|
|
11
|
+
title: "A group's moderation rules",
|
|
12
|
+
description: "The rules `chats_moderate` judges a group by; the defaults, marked not saved, if it has none.",
|
|
13
|
+
input: v.object({ chat: chatOf(messenger) }),
|
|
14
|
+
annotations: READ,
|
|
15
|
+
online: (adapter, args, { guard, settings, env }) => servicesFor(onlineDeps(messenger, adapter, guard, { profile: settings.profile, env })).moderation.rules(args.chat),
|
|
16
|
+
}),
|
|
17
|
+
chats_moderate: tool({
|
|
18
|
+
title: "Apply a group's rules",
|
|
19
|
+
description: "Judge a group's new messages and members by its rules, and delete or remove where the rules' levels allow; " +
|
|
20
|
+
"an action at level ask is planned for the owner, not taken. Only when the owner asked for this group.",
|
|
21
|
+
input: v.object({
|
|
22
|
+
chat: chatOf(messenger),
|
|
23
|
+
since_time: v.optional(v.pipe(v.string(), v.description("ISO 8601, or 2h / 1d ago; the saved point stays"))),
|
|
24
|
+
dry_run: v.optional(v.pipe(v.boolean(), v.description("judge and plan; do nothing"))),
|
|
25
|
+
}),
|
|
26
|
+
annotations: WRITE,
|
|
27
|
+
_meta: APPROVE,
|
|
28
|
+
permission: "groups",
|
|
29
|
+
online: (adapter, args, { guard, settings, env }) => servicesFor(onlineDeps(messenger, adapter, guard, { profile: settings.profile, env })).moderation.moderate(args.chat, {
|
|
30
|
+
...(args.since_time === undefined ? {} : { since: momentOf(args.since_time, "since_time") }),
|
|
31
|
+
dryRun: args.dry_run === true,
|
|
32
|
+
allowDangerous: false,
|
|
33
|
+
}),
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=moderation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moderation.js","sourceRoot":"","sources":["../../../src/mcp/tools/moderation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAgB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAE7E;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IACjF,gBAAgB,EAAE,IAAI,CAAC;QACrB,KAAK,EAAE,4BAA4B;QACnC,WAAW,EAAE,+FAA+F;QAC5G,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5C,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,CAClD,WAAW,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CACrG,IAAI,CAAC,IAAI,CACV;KACJ,CAAC;IACF,cAAc,EAAE,IAAI,CAAC;QACnB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,6GAA6G;YAC7G,uGAAuG;QACzG,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC;YACvB,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC5G,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,4BAA4B,CAAC,CAAC,CAAC;SACtF,CAAC;QACF,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,QAAQ;QACpB,MAAM,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,CAClD,WAAW,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CACxG,IAAI,CAAC,IAAI,EACT;YACE,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC;YAC5F,MAAM,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI;YAC7B,cAAc,EAAE,KAAK;SACtB,CACF;KACJ,CAAC;CACH,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/review.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAK/D,OAAO,EAAE,KAAK,OAAO,EAAsB,MAAM,YAAY,CAAA;AAE7D,eAAO,MAAM,WAAW,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/review.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAK/D,OAAO,EAAE,KAAK,OAAO,EAAsB,MAAM,YAAY,CAAA;AAE7D,eAAO,MAAM,WAAW,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAuDvE,CAAA"}
|
package/dist/mcp/tools/review.js
CHANGED
|
@@ -8,11 +8,11 @@ export const reviewTools = (messenger) => ({
|
|
|
8
8
|
review: tool({
|
|
9
9
|
title: "Review who owes what",
|
|
10
10
|
description: "Every message, the owner's too (outgoing: true), in each chat that changed since a point — for sorting out " +
|
|
11
|
-
`what the owner owes and what others owe. Without \`
|
|
11
|
+
`what the owner owes and what others owe. Without \`since_time\`, the last ${REVIEW_DAYS} days. Muted and archived ` +
|
|
12
12
|
"chats are left out unless they mention the owner, or `all` is set. Returns { since, until, complete, chats: " +
|
|
13
13
|
"[{ id, title, messages, more }], skipped, partial, quiet }; when complete, the next review starts at until.",
|
|
14
14
|
input: v.object({
|
|
15
|
-
|
|
15
|
+
since_time: v.optional(v.pipe(v.string(), v.description("where the last review ended: ISO 8601, or 2h / 1d ago"))),
|
|
16
16
|
chat: v.optional(chatOf(messenger)),
|
|
17
17
|
unanswered: v.optional(v.pipe(v.number(), v.minValue(0), v.description(`only questions nobody answered, asked at least this many hours ago (${UNANSWERED_HOURS} is usual)`))),
|
|
18
18
|
all: v.optional(v.pipe(v.boolean(), v.description("muted and archived chats too"))),
|
|
@@ -23,7 +23,7 @@ export const reviewTools = (messenger) => ({
|
|
|
23
23
|
online: async (adapter, args, defaults) => {
|
|
24
24
|
const model = modelWith(args.transcribe, args.model);
|
|
25
25
|
const found = await servicesFor(onlineDeps(messenger, adapter, defaults.guard)).inbox.review({
|
|
26
|
-
since: args.
|
|
26
|
+
since: args.since_time === undefined ? reviewStart() : momentOf(args.since_time, "since_time"),
|
|
27
27
|
...(args.chat === undefined ? {} : { chat: args.chat }),
|
|
28
28
|
...(args.all ? { all: true } : {}),
|
|
29
29
|
...(args.unanswered === undefined ? {} : { unansweredAfterHours: args.unanswered }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/mcp/tools/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACpF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACvE,OAAO,EAAgB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAE7D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC7E,MAAM,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EACT,6GAA6G;YAC7G,
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/mcp/tools/review.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAsBxC;;;GAGG;AACH,eAAO,MAAM,SAAS,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAYrE,CAAA;AAEF,0GAA0G;AAC1G,eAAO,MAAM,aAAa,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAA8B,CAAA;AAEzG,kHAAkH;AAClH,eAAO,MAAM,WAAW,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAkC,CAAA;AAE3G,oFAAoF;AACpF,eAAO,MAAM,SAAS,cAAe,SAAS,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CASrE,CAAA"}
|
package/dist/mcp/tools.js
CHANGED
|
@@ -4,6 +4,7 @@ import { chatsTools } from "./tools/chats.js";
|
|
|
4
4
|
import { chatsReadTools } from "./tools/chats-read.js";
|
|
5
5
|
import { contactsTools } from "./tools/contacts.js";
|
|
6
6
|
import { contactWriteTools } from "./tools/contacts-write.js";
|
|
7
|
+
import { conversationsTools } from "./tools/conversations.js";
|
|
7
8
|
import { folderTools } from "./tools/folders.js";
|
|
8
9
|
import { inboxTools } from "./tools/inbox.js";
|
|
9
10
|
import { messagesTools } from "./tools/messages.js";
|
|
@@ -12,6 +13,7 @@ import { messageDeleteTools } from "./tools/messages-delete.js";
|
|
|
12
13
|
import { messagesPhotoTools } from "./tools/messages-photo.js";
|
|
13
14
|
import { messageSendTools } from "./tools/messages-send.js";
|
|
14
15
|
import { messagesTranscribeTools } from "./tools/messages-transcribe.js";
|
|
16
|
+
import { moderationTools } from "./tools/moderation.js";
|
|
15
17
|
import { pollReadTools, pollWriteTools } from "./tools/polls.js";
|
|
16
18
|
import { reactionTools } from "./tools/reactions.js";
|
|
17
19
|
import { reviewTools } from "./tools/review.js";
|
|
@@ -28,6 +30,7 @@ export const readTools = (messenger) => ({
|
|
|
28
30
|
...chatsTools(messenger),
|
|
29
31
|
...contactsTools(messenger),
|
|
30
32
|
...messagesTools(messenger),
|
|
33
|
+
...conversationsTools(messenger),
|
|
31
34
|
...pollReadTools(messenger),
|
|
32
35
|
...messagesPhotoTools(messenger),
|
|
33
36
|
...messagesTranscribeTools(messenger),
|
|
@@ -41,6 +44,7 @@ export const sendTools = (messenger) => ({
|
|
|
41
44
|
...adminTools(messenger),
|
|
42
45
|
...folderTools(messenger),
|
|
43
46
|
...contactWriteTools(messenger),
|
|
47
|
+
...moderationTools(messenger),
|
|
44
48
|
...messageSendTools(messenger),
|
|
45
49
|
...messageActionTools(messenger),
|
|
46
50
|
...reactionTools(messenger),
|
package/dist/mcp/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,YAAY,CAAC,SAAS,CAAC;IAC1B,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,uBAAuB,CAAC,SAAS,CAAC;CACtC,CAAC,CAAA;AAEF,0GAA0G;AAC1G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;AAEzG,kHAAkH;AAClH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;AAE3G,oFAAoF;AACpF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,iBAAiB,CAAC,SAAS,CAAC;IAC/B,GAAG,gBAAgB,CAAC,SAAS,CAAC;IAC9B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,cAAc,CAAC,SAAS,CAAC;CAC7B,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,YAAY,CAAC,SAAS,CAAC;IAC1B,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,uBAAuB,CAAC,SAAS,CAAC;CACtC,CAAC,CAAA;AAEF,0GAA0G;AAC1G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC,CAAA;AAEzG,kHAAkH;AAClH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAA;AAE3G,oFAAoF;AACpF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,SAAoB,EAA2B,EAAE,CAAC,CAAC;IAC3E,GAAG,UAAU,CAAC,SAAS,CAAC;IACxB,GAAG,WAAW,CAAC,SAAS,CAAC;IACzB,GAAG,iBAAiB,CAAC,SAAS,CAAC;IAC/B,GAAG,eAAe,CAAC,SAAS,CAAC;IAC7B,GAAG,gBAAgB,CAAC,SAAS,CAAC;IAC9B,GAAG,kBAAkB,CAAC,SAAS,CAAC;IAChC,GAAG,aAAa,CAAC,SAAS,CAAC;IAC3B,GAAG,cAAc,CAAC,SAAS,CAAC;CAC7B,CAAC,CAAA"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { MessengerAdapter } from "../cli/messenger/port.js";
|
|
2
|
+
import type { GroupMember, Id, Message } from "../domain/models.js";
|
|
3
|
+
import type { GroupRules } from "./rules.js";
|
|
4
|
+
export type Action = "report" | "delete" | "remove";
|
|
5
|
+
export type Outcome = "reported" | "done" | "planned" | "forbidden" | "declined" | "refused" | "failed" | "skipped";
|
|
6
|
+
export interface Finding {
|
|
7
|
+
/** A message, or somebody who joined. */
|
|
8
|
+
kind: "message" | "member";
|
|
9
|
+
rule: "blocked" | "invites" | "links" | "forwards" | "flood" | "newAccount";
|
|
10
|
+
personId: Id;
|
|
11
|
+
personName: string | null;
|
|
12
|
+
messageId?: Id;
|
|
13
|
+
action: Action;
|
|
14
|
+
}
|
|
15
|
+
export interface CheckRow extends Finding {
|
|
16
|
+
outcome: Outcome;
|
|
17
|
+
reason?: string;
|
|
18
|
+
/** What the owner types to do it by hand, on a row that was not done. */
|
|
19
|
+
command?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CheckInput {
|
|
22
|
+
rules: GroupRules;
|
|
23
|
+
messages: Message[];
|
|
24
|
+
joined: GroupMember[];
|
|
25
|
+
/** The group's admins; the owner's own messages are known by `outgoing`. */
|
|
26
|
+
answerers: ReadonlySet<Id>;
|
|
27
|
+
/** Service messages — someone joined, the title changed — which no rule judges. */
|
|
28
|
+
service: ReadonlySet<Id>;
|
|
29
|
+
now: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* What the rules say about what is new. Pure: nothing here talks to a messenger. One finding per
|
|
33
|
+
* message — the rule with the strongest action — and one removal per person, whatever else they did.
|
|
34
|
+
*/
|
|
35
|
+
export declare const judge: ({ rules, messages, joined, answerers, service, now }: CheckInput) => Finding[];
|
|
36
|
+
/** The two things a check may do, whoever does them: the personal account, or a bot. */
|
|
37
|
+
export interface Moderator {
|
|
38
|
+
deleteMessage(chatId: Id, messageId: Id): Promise<void>;
|
|
39
|
+
removePerson(chatId: Id, personId: Id): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
export interface ActOptions {
|
|
42
|
+
chatId: Id;
|
|
43
|
+
rules: GroupRules;
|
|
44
|
+
/** `--allow-dangerous`: yes to every action at level `ask`. */
|
|
45
|
+
allowDangerous: boolean;
|
|
46
|
+
dryRun: boolean;
|
|
47
|
+
maxActions: number;
|
|
48
|
+
/** Asks the owner about one action: `undefined` from it, or no `confirm`, when nobody is there to answer. */
|
|
49
|
+
confirm?: (finding: Finding) => Promise<boolean | undefined>;
|
|
50
|
+
/** The program's word, for the command a row says to type by hand: `tg`, `max`. */
|
|
51
|
+
command: string;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Does what the findings ask, as far as the group's levels, the per-run limit and the guard let it.
|
|
55
|
+
* `deny` never acts, `readonly` only reports, `ask` asks — or `--allow-dangerous` says yes — and
|
|
56
|
+
* `allow` acts. Stops acting at the first hourly-limit refusal: the rest is `skipped`, never tried.
|
|
57
|
+
*/
|
|
58
|
+
export declare const act: (moderator: Moderator, findings: Finding[], options: ActOptions) => Promise<CheckRow[]>;
|
|
59
|
+
/** One action in words, for a question at the terminal. */
|
|
60
|
+
export declare const describe: (finding: Finding) => string;
|
|
61
|
+
export interface Gathered extends Omit<CheckInput, "rules" | "now"> {
|
|
62
|
+
/** The newest message read, ISO 8601: where the next check starts. */
|
|
63
|
+
until: string | null;
|
|
64
|
+
/** More history than one check reads. */
|
|
65
|
+
more: boolean;
|
|
66
|
+
notes: string[];
|
|
67
|
+
}
|
|
68
|
+
/** One check reads at most this many messages; the rest waits for the next. */
|
|
69
|
+
export declare const CHECK_READS = 1000;
|
|
70
|
+
/**
|
|
71
|
+
* What is new in the group since `since` (ms): its messages, who joined — from the chat's service
|
|
72
|
+
* messages — and who the admins are. Reads only.
|
|
73
|
+
*/
|
|
74
|
+
export declare const gather: (adapter: MessengerAdapter, chatId: Id, since: number) => Promise<Gathered>;
|
|
75
|
+
export declare const MAX_ACTIONS = 10;
|
|
76
|
+
/**
|
|
77
|
+
* Where the next check starts: after the newest message read, or just before the first message whose
|
|
78
|
+
* action is still undone — so it is judged again, and what came after it is still read. A person
|
|
79
|
+
* who joined and is still undone keeps the point where it was, since the join is not a row's message.
|
|
80
|
+
*/
|
|
81
|
+
export declare const nextPoint: (rows: CheckRow[], found: Gathered) => string | null;
|
|
82
|
+
export declare const someUndone: (rows: CheckRow[]) => boolean;
|
|
83
|
+
//# sourceMappingURL=check.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/moderation/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { CliError } from "@leemour/cli-core";
|
|
2
|
+
const INVITE = /max\.ru\/join\/|(t|telegram)\.me\/(\+|joinchat\/)|tg:\/\/join/i;
|
|
3
|
+
const LINK = /https?:\/\/\S+/i;
|
|
4
|
+
/** Which action wins when a message breaks several rules; the first rule listed breaks a tie. */
|
|
5
|
+
const STRENGTH = { report: 0, delete: 1, remove: 2 };
|
|
6
|
+
/**
|
|
7
|
+
* What the rules say about what is new. Pure: nothing here talks to a messenger. One finding per
|
|
8
|
+
* message — the rule with the strongest action — and one removal per person, whatever else they did.
|
|
9
|
+
*/
|
|
10
|
+
export const judge = ({ rules, messages, joined, answerers, service, now }) => {
|
|
11
|
+
const trusted = new Set(rules.trusted);
|
|
12
|
+
const blocked = (id, name) => (id !== null && rules.blocked.includes(id)) ||
|
|
13
|
+
(name !== null && rules.blockedNames.some((part) => name.toLocaleLowerCase().includes(part.toLocaleLowerCase())));
|
|
14
|
+
const young = (member) => rules.newAccount.days > 0 &&
|
|
15
|
+
typeof member.registeredAt === "string" &&
|
|
16
|
+
now - Date.parse(member.registeredAt) < rules.newAccount.days * 86_400_000;
|
|
17
|
+
const found = [];
|
|
18
|
+
const add = (finding) => {
|
|
19
|
+
if (finding.action === "remove" && found.some((f) => f.action === "remove" && f.personId === finding.personId)) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
found.push(finding);
|
|
23
|
+
};
|
|
24
|
+
for (const member of joined) {
|
|
25
|
+
if (trusted.has(member.id) || answerers.has(member.id))
|
|
26
|
+
continue;
|
|
27
|
+
const person = { kind: "member", personId: member.id, personName: member.name };
|
|
28
|
+
if (blocked(member.id, member.name)) {
|
|
29
|
+
add({ ...person, rule: "blocked", action: rules.blockedPeople === "remove" ? "remove" : "report" });
|
|
30
|
+
}
|
|
31
|
+
else if (young(member)) {
|
|
32
|
+
add({ ...person, rule: "newAccount", action: rules.newAccount.action });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const flooding = floodOf(messages, rules.flood);
|
|
36
|
+
for (const message of messages) {
|
|
37
|
+
const id = message.senderId;
|
|
38
|
+
if (id === null || message.outgoing === true || answerers.has(id) || trusted.has(id))
|
|
39
|
+
continue;
|
|
40
|
+
if (service.has(message.id) || message.attachments.some((attachment) => attachment.kind === "control"))
|
|
41
|
+
continue;
|
|
42
|
+
const base = { kind: "message", personId: id, personName: message.senderName, messageId: message.id };
|
|
43
|
+
const text = message.text;
|
|
44
|
+
const broken = [];
|
|
45
|
+
if (blocked(id, message.senderName))
|
|
46
|
+
broken.push(["blocked", rules.blockedPeople]);
|
|
47
|
+
if (INVITE.test(text))
|
|
48
|
+
broken.push(["invites", rules.invites]);
|
|
49
|
+
if (LINK.test(text) || message.attachments.some((attachment) => attachment.kind === "share")) {
|
|
50
|
+
broken.push(["links", rules.links]);
|
|
51
|
+
}
|
|
52
|
+
if (message.forwardedFrom !== null)
|
|
53
|
+
broken.push(["forwards", rules.forwards]);
|
|
54
|
+
if (flooding.has(message.id))
|
|
55
|
+
broken.push(["flood", rules.flood.action]);
|
|
56
|
+
const strongest = broken.reduce((best, rule) => (best === undefined || STRENGTH[rule[1]] > STRENGTH[best[1]] ? rule : best), undefined);
|
|
57
|
+
if (strongest)
|
|
58
|
+
add({ ...base, rule: strongest[0], action: strongest[1] });
|
|
59
|
+
}
|
|
60
|
+
return found;
|
|
61
|
+
};
|
|
62
|
+
/** Messages past the limit: more than `messages` from one person within `minutes`. */
|
|
63
|
+
const floodOf = (messages, flood) => {
|
|
64
|
+
const window = flood.minutes * 60_000;
|
|
65
|
+
const over = new Set();
|
|
66
|
+
const bySender = new Map();
|
|
67
|
+
for (const message of messages) {
|
|
68
|
+
if (message.senderId === null)
|
|
69
|
+
continue;
|
|
70
|
+
const times = bySender.get(message.senderId) ?? [];
|
|
71
|
+
const at = Date.parse(message.timestamp);
|
|
72
|
+
times.push(at);
|
|
73
|
+
bySender.set(message.senderId, times);
|
|
74
|
+
if (times.filter((time) => at - time < window).length > flood.messages)
|
|
75
|
+
over.add(message.id);
|
|
76
|
+
}
|
|
77
|
+
return over;
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Does what the findings ask, as far as the group's levels, the per-run limit and the guard let it.
|
|
81
|
+
* `deny` never acts, `readonly` only reports, `ask` asks — or `--allow-dangerous` says yes — and
|
|
82
|
+
* `allow` acts. Stops acting at the first hourly-limit refusal: the rest is `skipped`, never tried.
|
|
83
|
+
*/
|
|
84
|
+
export const act = async (moderator, findings, options) => {
|
|
85
|
+
const { chatId, rules, allowDangerous, dryRun, maxActions, confirm, command } = options;
|
|
86
|
+
const rows = [];
|
|
87
|
+
let acted = 0;
|
|
88
|
+
let stopped;
|
|
89
|
+
for (const finding of findings) {
|
|
90
|
+
if (finding.action === "report") {
|
|
91
|
+
rows.push({ ...finding, outcome: "reported" });
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const consent = finding.action;
|
|
95
|
+
const level = rules.consent[consent];
|
|
96
|
+
const row = (outcome, reason) => ({
|
|
97
|
+
...finding,
|
|
98
|
+
outcome,
|
|
99
|
+
...(reason ? { reason } : {}),
|
|
100
|
+
...(outcome === "done" || outcome === "reported" ? {} : { command: commandFor(command, chatId, finding) }),
|
|
101
|
+
});
|
|
102
|
+
if (level === "deny") {
|
|
103
|
+
rows.push(row("forbidden", `consent.${consent} is deny`));
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (level === "readonly") {
|
|
107
|
+
rows.push(row("reported", `consent.${consent} is readonly`));
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (dryRun) {
|
|
111
|
+
rows.push(row("planned", "--dry-run"));
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (stopped || acted >= maxActions) {
|
|
115
|
+
rows.push(row("skipped", stopped ?? `over the limit of ${maxActions} actions per check`));
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (level === "ask" && !allowDangerous) {
|
|
119
|
+
const yes = confirm ? await confirm(finding) : undefined;
|
|
120
|
+
if (yes === undefined) {
|
|
121
|
+
rows.push(row("planned", `consent.${consent} is ask, and nobody is there to answer — run with --allow-dangerous`));
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (!yes) {
|
|
125
|
+
rows.push(row("declined", "the answer was no"));
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
acted += 1;
|
|
130
|
+
try {
|
|
131
|
+
if (finding.action === "delete" && finding.messageId) {
|
|
132
|
+
await moderator.deleteMessage(chatId, finding.messageId);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
await moderator.removePerson(chatId, finding.personId);
|
|
136
|
+
}
|
|
137
|
+
rows.push(row("done"));
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const failure = asCliError(error);
|
|
141
|
+
if (failure.code === "rate_limited")
|
|
142
|
+
stopped = failure.message;
|
|
143
|
+
const refused = ["rate_limited", "permission_error", "confirmation_required"].includes(failure.code);
|
|
144
|
+
rows.push(row(refused ? "refused" : "failed", failure.message));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return rows;
|
|
148
|
+
};
|
|
149
|
+
const asCliError = (error) => error instanceof CliError
|
|
150
|
+
? error
|
|
151
|
+
: new CliError("provider_error", error instanceof Error ? error.message : String(error));
|
|
152
|
+
const who = (finding) => finding.personName ?? finding.personId;
|
|
153
|
+
/** One action in words, for a question at the terminal. */
|
|
154
|
+
export const describe = (finding) => finding.action === "delete"
|
|
155
|
+
? `delete message ${finding.messageId} from ${who(finding)} for everyone (${finding.rule})`
|
|
156
|
+
: `remove ${who(finding)} from the group (${finding.rule})`;
|
|
157
|
+
const commandFor = (command, chatId, finding) => finding.action === "delete"
|
|
158
|
+
? `${command} messages delete ${chatId} ${finding.messageId} --for-everyone --allow-dangerous`
|
|
159
|
+
: finding.action === "remove"
|
|
160
|
+
? `${command} chats members remove ${chatId} ${finding.personId}`
|
|
161
|
+
: "";
|
|
162
|
+
/** One check reads at most this many messages; the rest waits for the next. */
|
|
163
|
+
export const CHECK_READS = 1000;
|
|
164
|
+
const PAGE = 100;
|
|
165
|
+
/**
|
|
166
|
+
* What is new in the group since `since` (ms): its messages, who joined — from the chat's service
|
|
167
|
+
* messages — and who the admins are. Reads only.
|
|
168
|
+
*/
|
|
169
|
+
export const gather = async (adapter, chatId, since) => {
|
|
170
|
+
const notes = [];
|
|
171
|
+
const historyAfter = adapter.historyAfter;
|
|
172
|
+
if (!historyAfter)
|
|
173
|
+
throw new CliError("validation_error", "this messenger cannot read a chat forward from a time");
|
|
174
|
+
const messages = [];
|
|
175
|
+
let more = true;
|
|
176
|
+
while (more && messages.length < CHECK_READS) {
|
|
177
|
+
const last = messages.at(-1);
|
|
178
|
+
const page = await historyAfter.call(adapter, chatId, {
|
|
179
|
+
limit: PAGE,
|
|
180
|
+
after: last ? { id: last.id } : { time: since },
|
|
181
|
+
});
|
|
182
|
+
messages.push(...page.items);
|
|
183
|
+
more = page.hasMore && page.items.length > 0;
|
|
184
|
+
}
|
|
185
|
+
const events = adapter.chatEvents ? (await adapter.chatEvents(chatId, { since })).events : [];
|
|
186
|
+
if (!adapter.chatEvents)
|
|
187
|
+
notes.push("this messenger does not say who joined, so only messages are judged");
|
|
188
|
+
const joinedIds = new Set(events
|
|
189
|
+
.filter((one) => one.event === "join" || one.event === "add")
|
|
190
|
+
.flatMap((one) => (one.people.length > 0 ? one.people.map((person) => person.id) : one.by.id ? [one.by.id] : [])));
|
|
191
|
+
const joined = joinedIds.size === 0 || !adapter.members
|
|
192
|
+
? []
|
|
193
|
+
: (await adapter.members(chatId, { offset: 0 })).items.filter((member) => joinedIds.has(member.id));
|
|
194
|
+
const admins = adapter.admins ? await adapter.admins(chatId) : null;
|
|
195
|
+
if (admins === null)
|
|
196
|
+
notes.push("the group's admins are not known, so only your own messages are exempt");
|
|
197
|
+
return {
|
|
198
|
+
messages,
|
|
199
|
+
joined,
|
|
200
|
+
answerers: new Set(admins ?? []),
|
|
201
|
+
service: new Set(events.map((one) => one.messageId)),
|
|
202
|
+
until: messages.at(-1)?.timestamp ?? null,
|
|
203
|
+
more,
|
|
204
|
+
notes,
|
|
205
|
+
};
|
|
206
|
+
};
|
|
207
|
+
export const MAX_ACTIONS = 10;
|
|
208
|
+
const undone = (row) => ["planned", "skipped", "failed"].includes(row.outcome);
|
|
209
|
+
/**
|
|
210
|
+
* Where the next check starts: after the newest message read, or just before the first message whose
|
|
211
|
+
* action is still undone — so it is judged again, and what came after it is still read. A person
|
|
212
|
+
* who joined and is still undone keeps the point where it was, since the join is not a row's message.
|
|
213
|
+
*/
|
|
214
|
+
export const nextPoint = (rows, found) => {
|
|
215
|
+
const waiting = rows.filter(undone);
|
|
216
|
+
if (waiting.some((row) => row.messageId === undefined))
|
|
217
|
+
return null;
|
|
218
|
+
const times = waiting
|
|
219
|
+
.map((row) => found.messages.find((message) => message.id === row.messageId)?.timestamp)
|
|
220
|
+
.filter((time) => time !== undefined)
|
|
221
|
+
.map(Date.parse);
|
|
222
|
+
if (times.length === 0)
|
|
223
|
+
return found.until;
|
|
224
|
+
return new Date(Math.min(...times) - 1).toISOString();
|
|
225
|
+
};
|
|
226
|
+
export const someUndone = (rows) => rows.some(undone);
|
|
227
|
+
//# sourceMappingURL=check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/moderation/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import type { AppIdentity } from "../cli/app.js";
|
|
3
|
+
import type { Id } from "../domain/models.js";
|
|
4
|
+
/** What a rule does with what it finds; nothing but `report` acts until the group's level lets it. */
|
|
5
|
+
export declare const RULE_ACTIONS: readonly ["report", "delete", "remove"];
|
|
6
|
+
/** `requests` and `consent.accept|decline` were for join requests (max-cli `FIND-249`); a file with them loads and drops them. */
|
|
7
|
+
declare const groupRules: v.SchemaWithPipe<readonly [v.StrictObjectSchema<{
|
|
8
|
+
readonly title: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
9
|
+
readonly trusted: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a person id is digits">]>, undefined>;
|
|
10
|
+
readonly blocked: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a person id is digits">]>, undefined>;
|
|
11
|
+
readonly blockedNames: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.MinLengthAction<string, 1, undefined>]>, undefined>;
|
|
12
|
+
readonly links: v.PicklistSchema<readonly ["report", "delete", "remove"], undefined>;
|
|
13
|
+
readonly invites: v.PicklistSchema<readonly ["report", "delete", "remove"], undefined>;
|
|
14
|
+
readonly forwards: v.PicklistSchema<readonly ["report", "delete", "remove"], undefined>;
|
|
15
|
+
readonly blockedPeople: v.PicklistSchema<readonly ["report", "delete", "remove"], undefined>;
|
|
16
|
+
readonly flood: v.StrictObjectSchema<{
|
|
17
|
+
readonly messages: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, number, undefined>]>;
|
|
18
|
+
readonly minutes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, number, undefined>]>;
|
|
19
|
+
readonly action: v.PicklistSchema<readonly ["report", "delete", "remove"], undefined>;
|
|
20
|
+
}, undefined>;
|
|
21
|
+
/** 0 days turns the rule off. */
|
|
22
|
+
readonly newAccount: v.StrictObjectSchema<{
|
|
23
|
+
readonly days: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, number, undefined>]>;
|
|
24
|
+
readonly action: v.PicklistSchema<["report", "remove"], undefined>;
|
|
25
|
+
}, undefined>;
|
|
26
|
+
readonly requests: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
27
|
+
readonly consent: v.StrictObjectSchema<{
|
|
28
|
+
readonly delete: v.SchemaWithPipe<readonly [v.PicklistSchema<["deny", "readonly", "ask", "allow", ...string[]], undefined>, v.TransformAction<string, "allow" | "ask" | "deny" | "readonly">]>;
|
|
29
|
+
readonly remove: v.SchemaWithPipe<readonly [v.PicklistSchema<["deny", "readonly", "ask", "allow", ...string[]], undefined>, v.TransformAction<string, "allow" | "ask" | "deny" | "readonly">]>;
|
|
30
|
+
readonly accept: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
31
|
+
readonly decline: v.OptionalSchema<v.UnknownSchema, undefined>;
|
|
32
|
+
}, undefined>;
|
|
33
|
+
}, undefined>, v.TransformAction<{
|
|
34
|
+
title: string | null;
|
|
35
|
+
trusted: string[];
|
|
36
|
+
blocked: string[];
|
|
37
|
+
blockedNames: string[];
|
|
38
|
+
links: "delete" | "remove" | "report";
|
|
39
|
+
invites: "delete" | "remove" | "report";
|
|
40
|
+
forwards: "delete" | "remove" | "report";
|
|
41
|
+
blockedPeople: "delete" | "remove" | "report";
|
|
42
|
+
flood: {
|
|
43
|
+
messages: number;
|
|
44
|
+
minutes: number;
|
|
45
|
+
action: "delete" | "remove" | "report";
|
|
46
|
+
};
|
|
47
|
+
newAccount: {
|
|
48
|
+
days: number;
|
|
49
|
+
action: "remove" | "report";
|
|
50
|
+
};
|
|
51
|
+
requests?: unknown;
|
|
52
|
+
consent: {
|
|
53
|
+
delete: "allow" | "ask" | "deny" | "readonly";
|
|
54
|
+
remove: "allow" | "ask" | "deny" | "readonly";
|
|
55
|
+
accept?: unknown;
|
|
56
|
+
decline?: unknown;
|
|
57
|
+
};
|
|
58
|
+
}, {
|
|
59
|
+
title: string | null;
|
|
60
|
+
trusted: string[];
|
|
61
|
+
blocked: string[];
|
|
62
|
+
blockedNames: string[];
|
|
63
|
+
links: "delete" | "remove" | "report";
|
|
64
|
+
invites: "delete" | "remove" | "report";
|
|
65
|
+
forwards: "delete" | "remove" | "report";
|
|
66
|
+
blockedPeople: "delete" | "remove" | "report";
|
|
67
|
+
flood: {
|
|
68
|
+
messages: number;
|
|
69
|
+
minutes: number;
|
|
70
|
+
action: "delete" | "remove" | "report";
|
|
71
|
+
};
|
|
72
|
+
newAccount: {
|
|
73
|
+
days: number;
|
|
74
|
+
action: "remove" | "report";
|
|
75
|
+
};
|
|
76
|
+
consent: {
|
|
77
|
+
delete: "allow" | "ask" | "deny" | "readonly";
|
|
78
|
+
remove: "allow" | "ask" | "deny" | "readonly";
|
|
79
|
+
};
|
|
80
|
+
}>]>;
|
|
81
|
+
export type GroupRules = v.InferOutput<typeof groupRules>;
|
|
82
|
+
/** Every key written out, so the file shows all there is to set (max-cli `NEED-314`). Nothing here acts. */
|
|
83
|
+
export declare const defaultRules: (title: string | null) => GroupRules;
|
|
84
|
+
export declare const RULE_KEYS: string[];
|
|
85
|
+
export declare const moderationPathFor: (app: AppIdentity, profile: string, env?: NodeJS.ProcessEnv) => string;
|
|
86
|
+
/**
|
|
87
|
+
* The rules of each group this profile moderates, one file per profile beside the recipient list —
|
|
88
|
+
* the path max-cli used, so its rules carry over. May be edited by hand; a file that does not check
|
|
89
|
+
* out refuses rather than being guessed at.
|
|
90
|
+
*/
|
|
91
|
+
export declare class ModerationRules {
|
|
92
|
+
#private;
|
|
93
|
+
readonly path: string;
|
|
94
|
+
constructor(path: string);
|
|
95
|
+
/** `undefined` when this group has no section yet. */
|
|
96
|
+
read(chatId: Id): GroupRules | undefined;
|
|
97
|
+
/** Writes the group's whole section — the defaults first, if it had none — with one key changed. */
|
|
98
|
+
set(chatId: Id, title: string | null, key: string, value: string): GroupRules;
|
|
99
|
+
/** Puts one key back to its default. */
|
|
100
|
+
unset(chatId: Id, title: string | null, key: string): GroupRules;
|
|
101
|
+
checkedUntil(chatId: Id): string | undefined;
|
|
102
|
+
markChecked(chatId: Id, at: string): void;
|
|
103
|
+
}
|
|
104
|
+
export {};
|
|
105
|
+
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/moderation/rules.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAA;AAG7C,sGAAsG;AACtG,eAAO,MAAM,YAAY,YAAI,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAA;AAgBnE,kIAAkI;AAClI,QAAA,MAAM,UAAU;;;;;;;;;;;;;;IAWZ,iCAAiC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAcpC,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,UAAU,CAAC,CAAA;AAQzD,4GAA4G;AAC5G,eAAO,MAAM,YAAY,UAAW,MAAM,GAAG,IAAI,KAAG,UAYlD,CAAA;AA4BF,eAAO,MAAM,SAAS,UAAoB,CAAA;AAE1C,eAAO,MAAM,iBAAiB,QAAS,WAAW,WAAW,MAAM,QAAO,MAAM,CAAC,UAAU,KAAiB,MAKzG,CAAA;AAEH;;;;GAIG;AACH,qBAAa,eAAe;;IACd,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAjC,YAAqB,IAAI,EAAE,MAAM,EAAI;IAErC,sDAAsD;IACtD,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,UAAU,GAAG,SAAS,CAEvC;IAED,oGAAoG;IACpG,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAS5E;IAED,wCAAwC;IACxC,KAAK,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAO/D;IAED,YAAY,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,GAAG,SAAS,CAE3C;IAED,WAAW,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAGxC;CAqBF"}
|