@leemour/max-cli 0.15.0 → 0.17.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 +56 -37
- package/dist/bot/client.d.ts +6 -0
- package/dist/bot/client.d.ts.map +1 -1
- package/dist/bot/client.js +17 -3
- package/dist/bot/client.js.map +1 -1
- package/dist/bot/input.d.ts.map +1 -1
- package/dist/bot/input.js +7 -4
- package/dist/bot/input.js.map +1 -1
- package/dist/bot/joins.d.ts +26 -0
- package/dist/bot/joins.d.ts.map +1 -0
- package/dist/bot/joins.js +56 -0
- package/dist/bot/joins.js.map +1 -0
- package/dist/bot/keep.d.ts +2 -2
- package/dist/bot/keep.d.ts.map +1 -1
- package/dist/bot/keep.js +3 -2
- package/dist/bot/keep.js.map +1 -1
- package/dist/bot/map.d.ts +5 -2
- package/dist/bot/map.d.ts.map +1 -1
- package/dist/bot/map.js +7 -1
- package/dist/bot/map.js.map +1 -1
- package/dist/bot/transport.d.ts +4 -0
- package/dist/bot/transport.d.ts.map +1 -1
- package/dist/bot/transport.js +43 -3
- package/dist/bot/transport.js.map +1 -1
- package/dist/bot-mcp/instructions.d.ts +9 -0
- package/dist/bot-mcp/instructions.d.ts.map +1 -0
- package/dist/bot-mcp/instructions.js +22 -0
- package/dist/bot-mcp/instructions.js.map +1 -0
- package/dist/bot-mcp/server.d.ts +21 -0
- package/dist/bot-mcp/server.d.ts.map +1 -0
- package/dist/bot-mcp/server.js +213 -0
- package/dist/bot-mcp/server.js.map +1 -0
- package/dist/bot-mcp/tools.d.ts +27 -0
- package/dist/bot-mcp/tools.d.ts.map +1 -0
- package/dist/bot-mcp/tools.js +280 -0
- package/dist/bot-mcp/tools.js.map +1 -0
- package/dist/client.d.ts +43 -10
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +207 -31
- package/dist/client.js.map +1 -1
- package/dist/commands/account.d.ts.map +1 -1
- package/dist/commands/account.js +7 -5
- package/dist/commands/account.js.map +1 -1
- package/dist/commands/backup.js +1 -1
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/bot-check.d.ts +11 -0
- package/dist/commands/bot-check.d.ts.map +1 -0
- package/dist/commands/bot-check.js +206 -0
- package/dist/commands/bot-check.js.map +1 -0
- package/dist/commands/bot-comments.d.ts.map +1 -1
- package/dist/commands/bot-comments.js +2 -1
- package/dist/commands/bot-comments.js.map +1 -1
- package/dist/commands/bot-context.d.ts +7 -0
- package/dist/commands/bot-context.d.ts.map +1 -1
- package/dist/commands/bot-context.js +32 -2
- package/dist/commands/bot-context.js.map +1 -1
- package/dist/commands/bot-mcp.d.ts +3 -0
- package/dist/commands/bot-mcp.d.ts.map +1 -0
- package/dist/commands/bot-mcp.js +69 -0
- package/dist/commands/bot-mcp.js.map +1 -0
- package/dist/commands/bot-members.d.ts.map +1 -1
- package/dist/commands/bot-members.js +7 -4
- package/dist/commands/bot-members.js.map +1 -1
- package/dist/commands/bot-people.d.ts +10 -0
- package/dist/commands/bot-people.d.ts.map +1 -0
- package/dist/commands/bot-people.js +156 -0
- package/dist/commands/bot-people.js.map +1 -0
- package/dist/commands/bot-reads.d.ts.map +1 -1
- package/dist/commands/bot-reads.js +25 -14
- package/dist/commands/bot-reads.js.map +1 -1
- package/dist/commands/bot-sends.d.ts.map +1 -1
- package/dist/commands/bot-sends.js +6 -5
- package/dist/commands/bot-sends.js.map +1 -1
- package/dist/commands/bot-setup.d.ts.map +1 -1
- package/dist/commands/bot-setup.js +5 -4
- package/dist/commands/bot-setup.js.map +1 -1
- package/dist/commands/bot-updates.d.ts.map +1 -1
- package/dist/commands/bot-updates.js +16 -2
- package/dist/commands/bot-updates.js.map +1 -1
- package/dist/commands/bot.d.ts.map +1 -1
- package/dist/commands/bot.js +13 -4
- package/dist/commands/bot.js.map +1 -1
- package/dist/commands/chats.d.ts.map +1 -1
- package/dist/commands/chats.js +15 -30
- package/dist/commands/chats.js.map +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +7 -6
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/complete.d.ts.map +1 -1
- package/dist/commands/complete.js +27 -3
- package/dist/commands/complete.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +29 -27
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/contacts.js +21 -0
- package/dist/commands/contacts.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +75 -21
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/export.js +1 -1
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/folders.d.ts.map +1 -1
- package/dist/commands/folders.js +3 -2
- package/dist/commands/folders.js.map +1 -1
- package/dist/commands/inbox.d.ts.map +1 -1
- package/dist/commands/inbox.js +1 -1
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +9 -11
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/models.d.ts.map +1 -1
- package/dist/commands/models.js +2 -1
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/paging.d.ts +17 -1
- package/dist/commands/paging.d.ts.map +1 -1
- package/dist/commands/paging.js +22 -2
- package/dist/commands/paging.js.map +1 -1
- package/dist/commands/polls.d.ts +3 -0
- package/dist/commands/polls.d.ts.map +1 -0
- package/dist/commands/polls.js +103 -0
- package/dist/commands/polls.js.map +1 -0
- package/dist/commands/recipients.d.ts.map +1 -1
- package/dist/commands/recipients.js +3 -2
- package/dist/commands/recipients.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +1 -1
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/runs.d.ts.map +1 -1
- package/dist/commands/runs.js +4 -3
- package/dist/commands/runs.js.map +1 -1
- package/dist/commands/sends.d.ts.map +1 -1
- package/dist/commands/sends.js +3 -2
- package/dist/commands/sends.js.map +1 -1
- package/dist/config.d.ts +78 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +143 -72
- package/dist/config.js.map +1 -1
- package/dist/diagnose.d.ts +47 -1
- package/dist/diagnose.d.ts.map +1 -1
- package/dist/diagnose.js +56 -5
- package/dist/diagnose.js.map +1 -1
- package/dist/domain/map.d.ts +9 -1
- package/dist/domain/map.d.ts.map +1 -1
- package/dist/domain/map.js +57 -0
- package/dist/domain/map.js.map +1 -1
- package/dist/domain/models.d.ts +29 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/models.js.map +1 -1
- package/dist/export.d.ts.map +1 -1
- package/dist/export.js +2 -1
- package/dist/export.js.map +1 -1
- package/dist/generated/client.generated.d.ts +1 -0
- package/dist/generated/client.generated.d.ts.map +1 -1
- package/dist/generated/client.generated.js +1 -0
- package/dist/generated/client.generated.js.map +1 -1
- package/dist/generated/opcodes.generated.d.ts +1 -0
- package/dist/generated/opcodes.generated.d.ts.map +1 -1
- package/dist/generated/opcodes.generated.js +1 -0
- package/dist/generated/opcodes.generated.js.map +1 -1
- package/dist/generated/operations.generated.d.ts +25 -10
- package/dist/generated/operations.generated.d.ts.map +1 -1
- package/dist/generated/operations.generated.js +2 -1
- package/dist/generated/operations.generated.js.map +1 -1
- package/dist/mcp/confirm.d.ts +6 -2
- package/dist/mcp/confirm.d.ts.map +1 -1
- package/dist/mcp/confirm.js +2 -2
- package/dist/mcp/confirm.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +83 -17
- package/dist/mcp/tools.js.map +1 -1
- package/dist/moderation/check.d.ts +15 -9
- package/dist/moderation/check.d.ts.map +1 -1
- package/dist/moderation/check.js +14 -45
- package/dist/moderation/check.js.map +1 -1
- package/dist/moderation/rules.d.ts +57 -7
- package/dist/moderation/rules.d.ts.map +1 -1
- package/dist/moderation/rules.js +13 -11
- package/dist/moderation/rules.js.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +11 -3
- package/dist/program.js.map +1 -1
- package/dist/rendering/messages.d.ts +6 -1
- package/dist/rendering/messages.d.ts.map +1 -1
- package/dist/rendering/messages.js +24 -3
- package/dist/rendering/messages.js.map +1 -1
- package/dist/runs/events.d.ts +5 -2
- package/dist/runs/events.d.ts.map +1 -1
- package/dist/runs/events.js +4 -1
- package/dist/runs/events.js.map +1 -1
- package/dist/runs/recording.d.ts +11 -0
- package/dist/runs/recording.d.ts.map +1 -1
- package/dist/runs/recording.js +28 -12
- package/dist/runs/recording.js.map +1 -1
- package/dist/sends/guard.d.ts +2 -2
- package/dist/sends/guard.d.ts.map +1 -1
- package/dist/sends/guard.js +2 -1
- package/dist/sends/guard.js.map +1 -1
- package/dist/sends/journal.d.ts +2 -2
- package/dist/sends/journal.d.ts.map +1 -1
- package/dist/sends/journal.js.map +1 -1
- package/dist/sends/permissions.d.ts.map +1 -1
- package/dist/sends/permissions.js +3 -0
- package/dist/sends/permissions.js.map +1 -1
- package/dist/server/server-connection.d.ts +8 -1
- package/dist/server/server-connection.d.ts.map +1 -1
- package/dist/server/server-connection.js +27 -1
- package/dist/server/server-connection.js.map +1 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +7 -1
- package/dist/server/server.js.map +1 -1
- package/dist/server/start.d.ts +1 -1
- package/dist/server/start.d.ts.map +1 -1
- package/dist/server/start.js +5 -3
- package/dist/server/start.js.map +1 -1
- package/dist/session/store.d.ts +2 -0
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js +5 -1
- package/dist/session/store.js.map +1 -1
- package/dist/spec/index.d.ts.map +1 -1
- package/dist/spec/index.js +2 -1
- package/dist/spec/index.js.map +1 -1
- package/dist/spec/operations/account.d.ts +3 -0
- package/dist/spec/operations/account.d.ts.map +1 -1
- package/dist/spec/operations/account.js +5 -1
- package/dist/spec/operations/account.js.map +1 -1
- package/dist/spec/operations/chats.d.ts +4 -3
- package/dist/spec/operations/chats.d.ts.map +1 -1
- package/dist/spec/operations/chats.js +12 -7
- package/dist/spec/operations/chats.js.map +1 -1
- package/dist/spec/operations/contacts.d.ts +8 -3
- package/dist/spec/operations/contacts.d.ts.map +1 -1
- package/dist/spec/operations/contacts.js +26 -5
- package/dist/spec/operations/contacts.js.map +1 -1
- package/dist/spec/operations/folders.d.ts.map +1 -1
- package/dist/spec/operations/folders.js +1 -0
- package/dist/spec/operations/folders.js.map +1 -1
- package/dist/spec/operations/messages.d.ts +14 -4
- package/dist/spec/operations/messages.d.ts.map +1 -1
- package/dist/spec/operations/messages.js +30 -3
- package/dist/spec/operations/messages.js.map +1 -1
- package/dist/spec/operations/uploads.d.ts +1 -1
- package/dist/spec/operations/uploads.d.ts.map +1 -1
- package/dist/spec/operations/uploads.js +2 -1
- package/dist/spec/operations/uploads.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -2
- package/skills/max-cli/SKILL.md +19 -9
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { CliError, writeSecurely } from "@leemour/cli-core";
|
|
4
|
+
import { annotate } from "@leemour/cli-core/commands";
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
import { JoinLog } from "../bot/joins.js";
|
|
7
|
+
import { forget } from "../bot/keep.js";
|
|
8
|
+
import { botsDirectory } from "../bot/registry.js";
|
|
9
|
+
import { describe, finish, judge, MAX_ACTIONS, } from "../moderation/check.js";
|
|
10
|
+
import { defaultRules, ModerationRules, moderationPathFor, RULE_KEYS } from "../moderation/rules.js";
|
|
11
|
+
import { botContext } from "./bot-context.js";
|
|
12
|
+
import { chatIdOf } from "./bot-reads.js";
|
|
13
|
+
import { guardedCall, operation } from "./bot-sends.js";
|
|
14
|
+
import { environmentOf } from "./context.js";
|
|
15
|
+
import { renderList } from "./paging.js";
|
|
16
|
+
const FIRST_LOOK_MS = 24 * 3_600_000;
|
|
17
|
+
const PAGE = 100;
|
|
18
|
+
const READ_AT_MOST = 2000;
|
|
19
|
+
/**
|
|
20
|
+
* `max <bot> bot chats check` — the group check of `max chats check`, done by the bot (plan
|
|
21
|
+
* `2026-09-27-bot-moderation-plan.md`). Removing bans unless `--no-ban` (`NEED-336`); joins come
|
|
22
|
+
* from what `bot updates watch` kept (`NEED-338`); account age is not in the Bot API, so that rule
|
|
23
|
+
* never fires here.
|
|
24
|
+
*/
|
|
25
|
+
export const botCheckCommand = () => annotate(new Command("check"), { mutates: true })
|
|
26
|
+
.argument("<chat>", "chat id, or the title of a chat this bot has seen")
|
|
27
|
+
.option("--since <time>", "judge what came after this ISO 8601 time; the saved point stays")
|
|
28
|
+
.option("--dry-run", "judge and plan; do nothing")
|
|
29
|
+
.option("--allow-dangerous", "do what a rule at consent level flag asks: delete messages, remove people")
|
|
30
|
+
.option("--no-ban", "remove without banning; by default a removed person cannot come back by the link")
|
|
31
|
+
.option("--max-actions <n>", `at most this many actions in one check; ${MAX_ACTIONS} if not given`)
|
|
32
|
+
.description("judge a group's new messages and joins by its rules, and act as they allow — as the bot")
|
|
33
|
+
.action(async function (chat) {
|
|
34
|
+
const context = botContext(this);
|
|
35
|
+
const options = this.opts();
|
|
36
|
+
const maxActions = options.maxActions === undefined ? MAX_ACTIONS : Number(options.maxActions);
|
|
37
|
+
if (!Number.isInteger(maxActions) || maxActions < 0) {
|
|
38
|
+
throw new CliError("validation_error", `--max-actions takes a whole number — got ${options.maxActions}`);
|
|
39
|
+
}
|
|
40
|
+
const explicit = options.since === undefined ? undefined : Date.parse(options.since);
|
|
41
|
+
if (explicit !== undefined && Number.isNaN(explicit)) {
|
|
42
|
+
throw new CliError("validation_error", `--since takes an ISO 8601 time — got ${options.since}`);
|
|
43
|
+
}
|
|
44
|
+
const client = context.authenticated();
|
|
45
|
+
const self = (await client.me()).user_id;
|
|
46
|
+
context.registry.rememberBot(self);
|
|
47
|
+
const chatId = chatIdOf(chat, context.registry);
|
|
48
|
+
const title = context.registry.list().find((one) => one.id === chatId)?.title ?? null;
|
|
49
|
+
const profile = context.settings.profile;
|
|
50
|
+
const saved = new ModerationRules(moderationPathFor(profile)).read(chatId);
|
|
51
|
+
const rules = saved ?? defaultRules(title);
|
|
52
|
+
const points = botPoints(profile);
|
|
53
|
+
const point = points.read(chatId);
|
|
54
|
+
const since = explicit ?? (point === undefined ? Date.now() - FIRST_LOOK_MS : Date.parse(point));
|
|
55
|
+
const found = await gather(context, client, self, chatId, since);
|
|
56
|
+
const prepared = {
|
|
57
|
+
chatId,
|
|
58
|
+
title,
|
|
59
|
+
rules,
|
|
60
|
+
found,
|
|
61
|
+
findings: judge({ ...found, rules, now: Date.now() }),
|
|
62
|
+
explicit: explicit !== undefined,
|
|
63
|
+
notes: [...(saved ? [] : [`${title ?? chatId} has no rules yet — the defaults only report`]), ...found.notes],
|
|
64
|
+
};
|
|
65
|
+
const interactive = environmentOf(this).interactive ?? (process.stdin.isTTY === true && process.stderr.isTTY === true);
|
|
66
|
+
const { rows, notes } = await finish(moderator(context, self, options.ban), points, prepared, {
|
|
67
|
+
allowDangerous: options.allowDangerous === true,
|
|
68
|
+
dryRun: options.dryRun === true,
|
|
69
|
+
maxActions,
|
|
70
|
+
...(interactive
|
|
71
|
+
? {
|
|
72
|
+
confirm: async (finding) => /^y(es)?$/i.test((await context.ask(`${describe(finding)}? [y/N] `)).trim()),
|
|
73
|
+
}
|
|
74
|
+
: {}),
|
|
75
|
+
});
|
|
76
|
+
renderList(context.renderer, context.format, context.format === "pretty" ? rows.map(pretty) : rows);
|
|
77
|
+
for (const note of notes)
|
|
78
|
+
context.streams.diagnostic(note);
|
|
79
|
+
});
|
|
80
|
+
/**
|
|
81
|
+
* New messages since `since`, oldest first. MAX answers newest first (`BUG-59`), so this walks back
|
|
82
|
+
* with `before` until a page comes short; past `READ_AT_MOST` only the newest are judged.
|
|
83
|
+
*/
|
|
84
|
+
const readSince = async (client, self, chatId, since) => {
|
|
85
|
+
const read = new Map();
|
|
86
|
+
let before;
|
|
87
|
+
while (read.size < READ_AT_MOST) {
|
|
88
|
+
const answer = (await client.call(operation("getMessages"), {
|
|
89
|
+
query: {
|
|
90
|
+
chat_id: chatId,
|
|
91
|
+
count: String(PAGE),
|
|
92
|
+
after: String(since),
|
|
93
|
+
...(before === undefined ? {} : { before: String(before) }),
|
|
94
|
+
},
|
|
95
|
+
}));
|
|
96
|
+
const page = (answer?.messages ?? []).map((raw) => client.decodeMessage(raw, self));
|
|
97
|
+
for (const message of page)
|
|
98
|
+
read.set(message.id, message);
|
|
99
|
+
const oldest = page.at(-1);
|
|
100
|
+
if (page.length < PAGE || !oldest)
|
|
101
|
+
return { messages: oldestFirst(read), more: false };
|
|
102
|
+
before = Date.parse(oldest.timestamp);
|
|
103
|
+
}
|
|
104
|
+
return { messages: oldestFirst(read), more: true };
|
|
105
|
+
};
|
|
106
|
+
const oldestFirst = (read) => [...read.values()].sort((a, b) => Date.parse(a.timestamp) - Date.parse(b.timestamp));
|
|
107
|
+
const gather = async (context, client, self, chatId, since) => {
|
|
108
|
+
const notes = [];
|
|
109
|
+
const { messages, more } = await readSince(client, self, chatId, since);
|
|
110
|
+
if (more)
|
|
111
|
+
notes.push(`more than ${READ_AT_MOST} messages since ${new Date(since).toISOString()} — only the newest were judged`);
|
|
112
|
+
const admins = (await client.call(operation("getAdmins"), { path: { chatId } }));
|
|
113
|
+
const answerers = new Set((admins?.members ?? []).map((member) => String(member.user_id)));
|
|
114
|
+
const log = JoinLog.for(context.settings.profile);
|
|
115
|
+
if (!log.kept())
|
|
116
|
+
notes.push("no joins kept for this bot — run `bot updates watch` to have them judged");
|
|
117
|
+
const joined = log
|
|
118
|
+
.read()
|
|
119
|
+
.filter((entry) => entry.chatId === chatId && entry.event === "add" && entry.at > since)
|
|
120
|
+
.map((entry) => ({ id: entry.userId, name: entry.name, username: null, registeredAt: null, lastSeenAt: null }));
|
|
121
|
+
return {
|
|
122
|
+
messages: messages,
|
|
123
|
+
joined,
|
|
124
|
+
answerers,
|
|
125
|
+
until: messages.at(-1)?.timestamp ?? null,
|
|
126
|
+
more,
|
|
127
|
+
notes,
|
|
128
|
+
};
|
|
129
|
+
};
|
|
130
|
+
const moderator = (context, self, ban) => ({
|
|
131
|
+
deleteMessage: async (chatId, messageId) => {
|
|
132
|
+
await guardedCall(context, operation("deleteMessage"), { query: { message_id: messageId } });
|
|
133
|
+
await forget(self, [{ chatId, messageId }], context.streams.diagnostic);
|
|
134
|
+
},
|
|
135
|
+
removePerson: async (chatId, personId) => {
|
|
136
|
+
await guardedCall(context, operation("removeMember"), {
|
|
137
|
+
path: { chatId },
|
|
138
|
+
query: { user_id: personId, ...(ban ? { block: "true" } : {}) },
|
|
139
|
+
});
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
/** Beside the bot's other state, one file per bot profile. */
|
|
143
|
+
const botPoints = (profile) => {
|
|
144
|
+
const path = join(botsDirectory(), "checks", `${profile}.json`);
|
|
145
|
+
const all = () => existsSync(path)
|
|
146
|
+
? (JSON.parse(readFileSync(path, "utf8")).points ?? {})
|
|
147
|
+
: {};
|
|
148
|
+
return {
|
|
149
|
+
read: (chatId) => all()[chatId],
|
|
150
|
+
write: (chatId, at) => writeSecurely(path, `${JSON.stringify({ points: { ...all(), [chatId]: at } })}\n`, 0o600),
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
const pretty = (row) => ({
|
|
154
|
+
what: row.kind,
|
|
155
|
+
who: row.personName ?? row.personId,
|
|
156
|
+
rule: row.rule,
|
|
157
|
+
action: row.action,
|
|
158
|
+
outcome: row.outcome,
|
|
159
|
+
...(row.reason ? { why: row.reason } : {}),
|
|
160
|
+
});
|
|
161
|
+
/** The same rules file as `max chats rules`, the chat named the bot's way. */
|
|
162
|
+
export const botRulesCommand = () => {
|
|
163
|
+
const command = new Command("rules").description("a chat's moderation rules for this bot, kept on this machine");
|
|
164
|
+
const show = (context, chatId, rules) => {
|
|
165
|
+
const saved = rules.read(chatId);
|
|
166
|
+
const title = context.registry.list().find((one) => one.id === chatId)?.title ?? null;
|
|
167
|
+
context.renderer.result({
|
|
168
|
+
chatId,
|
|
169
|
+
title,
|
|
170
|
+
file: rules.path,
|
|
171
|
+
saved: saved !== undefined,
|
|
172
|
+
rules: saved ?? defaultRules(title),
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
const target = (command, chat) => {
|
|
176
|
+
const context = botContext(command, { offline: true });
|
|
177
|
+
const chatId = chatIdOf(chat, context.registry);
|
|
178
|
+
const title = context.registry.list().find((one) => one.id === chatId)?.title ?? null;
|
|
179
|
+
return { context, chatId, title, rules: new ModerationRules(moderationPathFor(context.settings.profile)) };
|
|
180
|
+
};
|
|
181
|
+
command
|
|
182
|
+
.command("show <chat>")
|
|
183
|
+
.description("the chat's rules; the defaults, marked not saved, if it has none yet")
|
|
184
|
+
.action(function (chat) {
|
|
185
|
+
const { context, chatId, rules } = target(this, chat);
|
|
186
|
+
show(context, chatId, rules);
|
|
187
|
+
});
|
|
188
|
+
command
|
|
189
|
+
.command("set <chat> <key> <value>")
|
|
190
|
+
.description(`change one rule — ${RULE_KEYS.join(", ")}`)
|
|
191
|
+
.action(function (chat, key, value) {
|
|
192
|
+
const { context, chatId, title, rules } = target(this, chat);
|
|
193
|
+
rules.set(chatId, title, key, value);
|
|
194
|
+
show(context, chatId, rules);
|
|
195
|
+
});
|
|
196
|
+
command
|
|
197
|
+
.command("unset <chat> <key>")
|
|
198
|
+
.description("put one rule back to its default")
|
|
199
|
+
.action(function (chat, key) {
|
|
200
|
+
const { context, chatId, title, rules } = target(this, chat);
|
|
201
|
+
rules.unset(chatId, title, key);
|
|
202
|
+
show(context, chatId, rules);
|
|
203
|
+
});
|
|
204
|
+
return command;
|
|
205
|
+
};
|
|
206
|
+
//# sourceMappingURL=bot-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-check.js","sourceRoot":"","sources":["../../src/commands/bot-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-comments.d.ts","sourceRoot":"","sources":["../../src/commands/bot-comments.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"bot-comments.d.ts","sourceRoot":"","sources":["../../src/commands/bot-comments.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AAY3C,eAAO,MAAM,eAAe,QAAO,OAwElC,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAO,OA4BnC,CAAA"}
|
|
@@ -5,6 +5,7 @@ import { plainJson } from "../bot/transport.js";
|
|
|
5
5
|
import { botContext } from "./bot-context.js";
|
|
6
6
|
import { checked } from "./bot-members.js";
|
|
7
7
|
import { guardedCall, operation, textOf } from "./bot-sends.js";
|
|
8
|
+
import { renderList } from "./paging.js";
|
|
8
9
|
const format = () => new Option("--format <format>", "how the text is marked up").choices(["markdown", "html"]);
|
|
9
10
|
const commentBody = (id, text, format) => checked(id, JSON.stringify({ text: textOf(text), ...(format ? { format } : {}) }));
|
|
10
11
|
export const commentsCommand = () => {
|
|
@@ -22,7 +23,7 @@ export const commentsCommand = () => {
|
|
|
22
23
|
path: { messageId: message },
|
|
23
24
|
query: { count: String(limit) },
|
|
24
25
|
});
|
|
25
|
-
context.renderer.
|
|
26
|
+
renderList(context.renderer, context.format, plainJson(answer)?.messages ?? []);
|
|
26
27
|
});
|
|
27
28
|
command
|
|
28
29
|
.command("get <message> <comment>")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-comments.js","sourceRoot":"","sources":["../../src/commands/bot-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"bot-comments.js","sourceRoot":"","sources":["../../src/commands/bot-comments.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,13 @@ import { BotTokenStore } from "../bot/auth.js";
|
|
|
4
4
|
import { BotApiClient } from "../bot/client.js";
|
|
5
5
|
import { ChatRegistry } from "../bot/registry.js";
|
|
6
6
|
import { type Settings } from "../config.js";
|
|
7
|
+
import { type Recording } from "../runs/recording.js";
|
|
8
|
+
/**
|
|
9
|
+
* Every `max bot` command is recorded like a personal one, from the group's hooks rather than in each
|
|
10
|
+
* action: the run starts before the action and ends after it, or fails in the program's catch.
|
|
11
|
+
*/
|
|
12
|
+
export declare const startBotRecording: (command: Command) => void;
|
|
13
|
+
export declare const botRecordingOf: (command: Command) => Recording | undefined;
|
|
7
14
|
/** `offline` is for the reads the local copy can answer; every other command still refuses the flag. */
|
|
8
15
|
export declare const botContext: (command: Command, { offline: answersOffline }?: {
|
|
9
16
|
offline?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-context.d.ts","sourceRoot":"","sources":["../../src/commands/bot-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAqC,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"bot-context.d.ts","sourceRoot":"","sources":["../../src/commands/bot-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAqC,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;AAG/E,OAAO,EAAE,KAAK,SAAS,EAAkB,MAAM,sBAAsB,CAAA;AAMrE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,YAAa,OAAO,KAAG,IAsBpD,CAAA;AAED,eAAO,MAAM,cAAc,YAAa,OAAO,KAAG,SAAS,GAAG,SAA4C,CAAA;AAE1G,wGAAwG;AACxG,eAAO,MAAM,UAAU,YAAa,OAAO,gCAAuC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;;;;;;;;oBAgB9E,MAAM,SAAS,WAAW;;2BAcnB,WAAW;;;;CA2B1C,CAAA;AAED,+HAA+H;AAC/H,eAAO,MAAM,aAAa,cAAe,iBAAiB,YAAY,QAAQ,KAAG,IAkBhF,CAAA"}
|
|
@@ -6,9 +6,37 @@ import { ChatRegistry } from "../bot/registry.js";
|
|
|
6
6
|
import { botFetch } from "../bot/transport.js";
|
|
7
7
|
import { resolveSettings } from "../config.js";
|
|
8
8
|
import { resolveOutput } from "../output.js";
|
|
9
|
-
import { asFirstWord } from "../profile.js";
|
|
9
|
+
import { asFirstWord, rootOf } from "../profile.js";
|
|
10
|
+
import { startRecording } from "../runs/recording.js";
|
|
10
11
|
import { readSecret } from "../session/prompt.js";
|
|
11
12
|
import { environmentOf } from "./context.js";
|
|
13
|
+
const recordings = new WeakMap();
|
|
14
|
+
/**
|
|
15
|
+
* Every `max bot` command is recorded like a personal one, from the group's hooks rather than in each
|
|
16
|
+
* action: the run starts before the action and ends after it, or fails in the program's catch.
|
|
17
|
+
*/
|
|
18
|
+
export const startBotRecording = (command) => {
|
|
19
|
+
const environment = environmentOf(command);
|
|
20
|
+
// The program's own flags only: `bot api get-updates --limit` is the API's limit, not ours.
|
|
21
|
+
const settings = resolveSettings(rootOf(command).opts(), { kind: "bot" });
|
|
22
|
+
const { streams, format } = resolveOutput({
|
|
23
|
+
...settings,
|
|
24
|
+
...(environment.streams ? { streams: environment.streams } : {}),
|
|
25
|
+
...(environment.tty === undefined ? {} : { tty: environment.tty }),
|
|
26
|
+
});
|
|
27
|
+
const words = [];
|
|
28
|
+
for (let at = command; at?.parent; at = at.parent)
|
|
29
|
+
words.unshift(at.name());
|
|
30
|
+
recordings.set(rootOf(command), startRecording({
|
|
31
|
+
command: words.join(" "),
|
|
32
|
+
profile: settings.profile,
|
|
33
|
+
options: { record: settings.record, keepFailed: settings.keepFailedRuns, trace: settings.trace },
|
|
34
|
+
format,
|
|
35
|
+
streams,
|
|
36
|
+
keepDays: settings.keepRunsForDays,
|
|
37
|
+
}));
|
|
38
|
+
};
|
|
39
|
+
export const botRecordingOf = (command) => recordings.get(rootOf(command));
|
|
12
40
|
/** `offline` is for the reads the local copy can answer; every other command still refuses the flag. */
|
|
13
41
|
export const botContext = (command, { offline: answersOffline = false } = {}) => {
|
|
14
42
|
const environment = environmentOf(command);
|
|
@@ -17,13 +45,14 @@ export const botContext = (command, { offline: answersOffline = false } = {}) =>
|
|
|
17
45
|
if (offline && !answersOffline) {
|
|
18
46
|
throw new CliError("validation_error", `--offline reads the local copy; \`${command.name()}\` has to ask MAX`);
|
|
19
47
|
}
|
|
20
|
-
const settings = resolveSettings(flags);
|
|
48
|
+
const settings = resolveSettings(flags, { kind: "bot" });
|
|
21
49
|
const { renderer, streams, format, color } = resolveOutput({
|
|
22
50
|
...settings,
|
|
23
51
|
...(environment.streams ? { streams: environment.streams } : {}),
|
|
24
52
|
...(environment.tty === undefined ? {} : { tty: environment.tty }),
|
|
25
53
|
});
|
|
26
54
|
const store = environment.botStore?.(settings.profile) ?? new BotTokenStore({ profile: settings.profile });
|
|
55
|
+
const recording = botRecordingOf(command);
|
|
27
56
|
const deadline = settings.commandTimeoutMs === undefined ? undefined : AbortSignal.timeout(settings.commandTimeoutMs);
|
|
28
57
|
const client = (token, stop) => {
|
|
29
58
|
const signal = deadline && stop ? AbortSignal.any([deadline, stop]) : (deadline ?? stop);
|
|
@@ -34,6 +63,7 @@ export const botContext = (command, { offline: answersOffline = false } = {}) =>
|
|
|
34
63
|
...(settings.timeoutMs === undefined ? {} : { timeoutMs: settings.timeoutMs }),
|
|
35
64
|
...(environment.botRetry ? { retry: environment.botRetry } : {}),
|
|
36
65
|
...(signal ? { signal } : {}),
|
|
66
|
+
...(recording ? { events: recording.events } : {}),
|
|
37
67
|
});
|
|
38
68
|
};
|
|
39
69
|
const ask = environment.ask ?? ((prompt) => readSecret(prompt, { echo: false }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-context.js","sourceRoot":"","sources":["../../src/commands/bot-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAG5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAoB,eAAe,EAAiB,MAAM,cAAc,CAAA;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"bot-context.js","sourceRoot":"","sources":["../../src/commands/bot-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-mcp.d.ts","sourceRoot":"","sources":["../../src/commands/bot-mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAiCnC,eAAO,MAAM,aAAa,QAAO,OA+DhC,CAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { CliError } from "@leemour/cli-core";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { ownScript } from "../install.js";
|
|
4
|
+
import { botContext } from "./bot-context.js";
|
|
5
|
+
import { environmentOf } from "./context.js";
|
|
6
|
+
import { serverEntry } from "./mcp.js";
|
|
7
|
+
const withFlags = (command) => command
|
|
8
|
+
.option("--allow-send", "offer the tools that write as the bot; without it the server can only read")
|
|
9
|
+
.option("--confirm-send", "show the owner every write in a form from the server first")
|
|
10
|
+
.option("--allow-delete", "offer the tools that delete messages and comments; it cannot be undone")
|
|
11
|
+
.option("--allow-moderate", "offer max_bot_chats_check and adding and removing members — the bot acts on a group's rules");
|
|
12
|
+
const checked = (flags) => {
|
|
13
|
+
if (flags.confirmSend && !flags.allowSend && !flags.allowDelete && !flags.allowModerate) {
|
|
14
|
+
throw new CliError("validation_error", "`--confirm-send` confirms writes, and without `--allow-send`, `--allow-delete` or `--allow-moderate` there are none");
|
|
15
|
+
}
|
|
16
|
+
return flags;
|
|
17
|
+
};
|
|
18
|
+
export const botMcpCommand = () => {
|
|
19
|
+
const command = withFlags(new Command("mcp").description("serve this bot to an agent over MCP, on stdin and stdout — `claude mcp add sales-bot -- max sales bot mcp`")).action(async function () {
|
|
20
|
+
const flags = checked(this.opts());
|
|
21
|
+
const context = botContext(this);
|
|
22
|
+
context.authenticated();
|
|
23
|
+
// Loaded here: every other command would otherwise pay for the SDK.
|
|
24
|
+
const [{ serveBotOverStdio }, { run }] = await Promise.all([
|
|
25
|
+
import("../bot-mcp/server.js"),
|
|
26
|
+
import("../program.js"),
|
|
27
|
+
]);
|
|
28
|
+
await serveBotOverStdio({
|
|
29
|
+
profile: context.settings.profile,
|
|
30
|
+
allowSend: flags.allowSend === true,
|
|
31
|
+
confirmSend: flags.confirmSend === true,
|
|
32
|
+
allowDelete: flags.allowDelete === true,
|
|
33
|
+
allowModerate: flags.allowModerate === true,
|
|
34
|
+
...(context.settings.allow ? { permitted: context.settings.allow } : {}),
|
|
35
|
+
run,
|
|
36
|
+
environment: environmentOf(this),
|
|
37
|
+
}, context.streams.diagnostic);
|
|
38
|
+
});
|
|
39
|
+
command.addCommand(withFlags(new Command("config").description("print the mcpServers entry for Claude Desktop, Cursor and others, with full paths; writes nothing")).action(function () {
|
|
40
|
+
const flags = checked(this.optsWithGlobals());
|
|
41
|
+
const { renderer, settings, format, streams } = botContext(this);
|
|
42
|
+
const entry = serverEntry({
|
|
43
|
+
profile: settings.profile,
|
|
44
|
+
flags: {},
|
|
45
|
+
execPath: process.execPath,
|
|
46
|
+
scriptPath: ownScript(),
|
|
47
|
+
env: process.env,
|
|
48
|
+
});
|
|
49
|
+
const [name, server] = Object.entries(entry.config.mcpServers)[0];
|
|
50
|
+
const flagArgs = [
|
|
51
|
+
["allowSend", "--allow-send"],
|
|
52
|
+
["confirmSend", "--confirm-send"],
|
|
53
|
+
["allowDelete", "--allow-delete"],
|
|
54
|
+
["allowModerate", "--allow-moderate"],
|
|
55
|
+
]
|
|
56
|
+
.filter(([key]) => flags[key] === true)
|
|
57
|
+
.map(([, flag]) => flag);
|
|
58
|
+
const args = server.args.flatMap((arg) => (arg === "mcp" ? ["bot", "mcp", ...flagArgs] : [arg]));
|
|
59
|
+
const config = { mcpServers: { [name.replace(/^max/, "max-bot")]: { ...server, args } } };
|
|
60
|
+
if (format === "pretty")
|
|
61
|
+
streams.data(JSON.stringify(config, null, 2));
|
|
62
|
+
else
|
|
63
|
+
renderer.result(config);
|
|
64
|
+
if (entry.warning)
|
|
65
|
+
renderer.note(entry.warning);
|
|
66
|
+
}));
|
|
67
|
+
return command;
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=bot-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-mcp.js","sourceRoot":"","sources":["../../src/commands/bot-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-members.d.ts","sourceRoot":"","sources":["../../src/commands/bot-members.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"bot-members.d.ts","sourceRoot":"","sources":["../../src/commands/bot-members.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUnC;;;GAGG;AACH,eAAO,MAAM,WAAW,QAAS,SAAS,MAAM,EAAE,KAAG,MAKpD,CAAA;AAED,2FAA2F;AAC3F,eAAO,MAAM,OAAO,OAAQ,MAAM,QAAQ,MAAM,KAAG,MAAgD,CAAA;AAcnG,eAAO,MAAM,cAAc,QAAO,OA4CjC,CAAA;AAED,eAAO,MAAM,iBAAiB,YAC5B,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,OAAO,EACP,MAAM,EACN,QAAQ,EACR,UAAU,EACV,YAAY,CACJ,CAAA;AAkBV,eAAO,MAAM,aAAa,QAAO,OA2ChC,CAAA"}
|
|
@@ -6,6 +6,7 @@ import { plainJson } from "../bot/transport.js";
|
|
|
6
6
|
import { botContext } from "./bot-context.js";
|
|
7
7
|
import { chatIdOf } from "./bot-reads.js";
|
|
8
8
|
import { guardedCall, operation } from "./bot-sends.js";
|
|
9
|
+
import { renderList } from "./paging.js";
|
|
9
10
|
const USER_ID = /^\d+$/;
|
|
10
11
|
/**
|
|
11
12
|
* User ids as JSON numbers with exactly the digits typed: the schema says int64, and `Number`
|
|
@@ -25,9 +26,11 @@ const limitOf = (limit) => {
|
|
|
25
26
|
throw new CliError("validation_error", "MAX gives at most 100 at a time — --limit 100");
|
|
26
27
|
return String(limit);
|
|
27
28
|
};
|
|
28
|
-
|
|
29
|
+
/** The Bot API's page of members, in our envelope with string ids (`NEED-358`); `marker` asks for the next. */
|
|
30
|
+
const showMembers = (context, answer) => {
|
|
29
31
|
const { members, marker } = plainJson(answer);
|
|
30
|
-
|
|
32
|
+
const items = (members ?? []).map((member) => ({ ...member, user_id: String(member.user_id) }));
|
|
33
|
+
renderList(context.renderer, context.format, items, { marker: marker ?? null, hasMore: marker != null });
|
|
31
34
|
};
|
|
32
35
|
export const membersCommand = () => {
|
|
33
36
|
const command = new Command("members").description("the people in a group chat or channel the bot is in");
|
|
@@ -43,7 +46,7 @@ export const membersCommand = () => {
|
|
|
43
46
|
path: { chatId: chatIdOf(chat, context.registry) },
|
|
44
47
|
query: { count: limitOf(context.settings.limit), ...(marker ? { marker } : {}) },
|
|
45
48
|
});
|
|
46
|
-
context
|
|
49
|
+
showMembers(context, answer);
|
|
47
50
|
});
|
|
48
51
|
annotate(command.command("add <chat> <users...>"), { mutates: true })
|
|
49
52
|
.description("add people to a chat by user id; the bot must be an admin that may add members")
|
|
@@ -105,7 +108,7 @@ export const adminsCommand = () => {
|
|
|
105
108
|
const answer = await context.authenticated().call(operation("getAdmins"), {
|
|
106
109
|
path: { chatId: chatIdOf(chat, context.registry) },
|
|
107
110
|
});
|
|
108
|
-
context
|
|
111
|
+
showMembers(context, answer);
|
|
109
112
|
});
|
|
110
113
|
annotate(command.command("add <chat> <user>"), { mutates: true })
|
|
111
114
|
.description("make a person an admin with the permissions named")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-members.js","sourceRoot":"","sources":["../../src/commands/bot-members.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"bot-members.js","sourceRoot":"","sources":["../../src/commands/bot-members.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { StoredHit } from "@leemour/cli-messaging/store";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { botContext } from "./bot-context.js";
|
|
4
|
+
type Context = ReturnType<typeof botContext>;
|
|
5
|
+
export declare const peopleCommand: () => Command;
|
|
6
|
+
/** `bot messages search --from`: every message from any of them, with or without text. */
|
|
7
|
+
export declare const searchMessages: (context: Context, text: string | undefined, from?: string[]) => Promise<StoredHit[]>;
|
|
8
|
+
export declare const addBetween: (messages: Command) => void;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=bot-people.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-people.d.ts","sourceRoot":"","sources":["../../src/commands/bot-people.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AA2E5C,eAAO,MAAM,aAAa,QAAO,OA6ChC,CAAA;AAED,0FAA0F;AAC1F,eAAO,MAAM,cAAc,YAChB,OAAO,QACV,MAAM,GAAG,SAAS,SAClB,MAAM,EAAE,KACb,OAAO,CAAC,SAAS,EAAE,CAWrB,CAAA;AAED,eAAO,MAAM,UAAU,aAAc,OAAO,KAAG,IAsC9C,CAAA"}
|