@leemour/max-cli 0.14.0 → 0.16.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 +43 -9
- package/dist/bot/client.d.ts +7 -1
- package/dist/bot/client.d.ts.map +1 -1
- package/dist/bot/client.js +19 -5
- 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 +25 -0
- package/dist/bot/keep.d.ts.map +1 -0
- package/dist/bot/keep.js +97 -0
- package/dist/bot/keep.js.map +1 -0
- 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/registry.d.ts +3 -0
- package/dist/bot/registry.d.ts.map +1 -1
- package/dist/bot/registry.js +27 -10
- package/dist/bot/registry.js.map +1 -1
- package/dist/bot/uploads.d.ts +34 -0
- package/dist/bot/uploads.d.ts.map +1 -0
- package/dist/bot/uploads.js +122 -0
- package/dist/bot/uploads.js.map +1 -0
- 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 +199 -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 +44 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +232 -41
- package/dist/client.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 +4 -0
- package/dist/commands/bot-comments.d.ts.map +1 -0
- package/dist/commands/bot-comments.js +97 -0
- package/dist/commands/bot-comments.js.map +1 -0
- package/dist/commands/bot-context.d.ts +9 -3
- package/dist/commands/bot-context.d.ts.map +1 -1
- package/dist/commands/bot-context.js +38 -15
- 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 +12 -0
- package/dist/commands/bot-members.d.ts.map +1 -0
- package/dist/commands/bot-members.js +136 -0
- package/dist/commands/bot-members.js.map +1 -0
- 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 +56 -8
- package/dist/commands/bot-reads.js.map +1 -1
- package/dist/commands/bot-sends.d.ts +5 -0
- package/dist/commands/bot-sends.d.ts.map +1 -1
- package/dist/commands/bot-sends.js +56 -11
- package/dist/commands/bot-sends.js.map +1 -1
- package/dist/commands/bot-setup.d.ts +5 -0
- package/dist/commands/bot-setup.d.ts.map +1 -0
- package/dist/commands/bot-setup.js +107 -0
- package/dist/commands/bot-setup.js.map +1 -0
- package/dist/commands/bot-updates.d.ts +3 -0
- package/dist/commands/bot-updates.d.ts.map +1 -0
- package/dist/commands/bot-updates.js +196 -0
- package/dist/commands/bot-updates.js.map +1 -0
- package/dist/commands/bot.d.ts.map +1 -1
- package/dist/commands/bot.js +21 -1
- package/dist/commands/bot.js.map +1 -1
- package/dist/commands/chats.d.ts.map +1 -1
- package/dist/commands/chats.js +19 -6
- package/dist/commands/chats.js.map +1 -1
- package/dist/commands/check.d.ts +8 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +64 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/context.d.ts +5 -0
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +5 -1
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/hearing.d.ts +25 -0
- package/dist/commands/hearing.d.ts.map +1 -0
- package/dist/commands/hearing.js +41 -0
- package/dist/commands/hearing.js.map +1 -0
- package/dist/commands/inbox.d.ts.map +1 -1
- package/dist/commands/inbox.js +19 -3
- package/dist/commands/inbox.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +7 -4
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +21 -5
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/paging.d.ts +3 -1
- package/dist/commands/paging.d.ts.map +1 -1
- package/dist/commands/paging.js +4 -1
- 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/review.d.ts.map +1 -1
- package/dist/commands/review.js +5 -7
- package/dist/commands/review.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 +33 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/models.js.map +1 -1
- package/dist/generated/client.generated.d.ts +2 -0
- package/dist/generated/client.generated.d.ts.map +1 -1
- package/dist/generated/client.generated.js +2 -0
- package/dist/generated/client.generated.js.map +1 -1
- package/dist/generated/opcodes.generated.d.ts +2 -0
- package/dist/generated/opcodes.generated.d.ts.map +1 -1
- package/dist/generated/opcodes.generated.js +2 -0
- package/dist/generated/opcodes.generated.js.map +1 -1
- package/dist/generated/operations.generated.d.ts +24 -3
- package/dist/generated/operations.generated.d.ts.map +1 -1
- package/dist/generated/operations.generated.js +4 -2
- 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/instructions.d.ts +2 -1
- package/dist/mcp/instructions.d.ts.map +1 -1
- package/dist/mcp/instructions.js +2 -1
- package/dist/mcp/instructions.js.map +1 -1
- package/dist/mcp/server.d.ts +2 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +4 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts +5 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +187 -12
- package/dist/mcp/tools.js.map +1 -1
- package/dist/moderation/check.d.ts +105 -0
- package/dist/moderation/check.d.ts.map +1 -0
- package/dist/moderation/check.js +313 -0
- package/dist/moderation/check.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +2 -0
- 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/review.d.ts +10 -4
- package/dist/review.d.ts.map +1 -1
- package/dist/review.js +35 -53
- package/dist/review.js.map +1 -1
- package/dist/sends/journal.d.ts +1 -1
- package/dist/sends/journal.d.ts.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 +2 -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 +2 -0
- package/dist/session/store.js.map +1 -1
- package/dist/spec/index.d.ts.map +1 -1
- package/dist/spec/index.js +4 -2
- package/dist/spec/index.js.map +1 -1
- package/dist/spec/operations/chats.d.ts.map +1 -1
- package/dist/spec/operations/chats.js +3 -1
- package/dist/spec/operations/chats.js.map +1 -1
- package/dist/spec/operations/messages.d.ts +13 -3
- package/dist/spec/operations/messages.d.ts.map +1 -1
- package/dist/spec/operations/messages.js +37 -6
- package/dist/spec/operations/messages.js.map +1 -1
- package/dist/spec/operations/uploads.d.ts +13 -0
- package/dist/spec/operations/uploads.d.ts.map +1 -1
- package/dist/spec/operations/uploads.js +21 -0
- package/dist/spec/operations/uploads.js.map +1 -1
- package/dist/transcribe/index.d.ts +36 -1
- package/dist/transcribe/index.d.ts.map +1 -1
- package/dist/transcribe/index.js +91 -14
- package/dist/transcribe/index.js.map +1 -1
- package/dist/upload.d.ts +3 -0
- package/dist/upload.d.ts.map +1 -1
- package/dist/upload.js +13 -7
- package/dist/upload.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/voice.d.ts +9 -0
- package/dist/voice.d.ts.map +1 -0
- package/dist/voice.js +36 -0
- package/dist/voice.js.map +1 -0
- package/package.json +6 -2
- package/skills/max-cli/SKILL.md +17 -5
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { CliError } from "@leemour/cli-core";
|
|
2
|
+
import { annotate } from "@leemour/cli-core/commands";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { checkBody } from "../bot/input.js";
|
|
5
|
+
import { plainJson } from "../bot/transport.js";
|
|
6
|
+
import { botContext } from "./bot-context.js";
|
|
7
|
+
import { chatIdOf } from "./bot-reads.js";
|
|
8
|
+
import { guardedCall, operation } from "./bot-sends.js";
|
|
9
|
+
const USER_ID = /^\d+$/;
|
|
10
|
+
/**
|
|
11
|
+
* User ids as JSON numbers with exactly the digits typed: the schema says int64, and `Number`
|
|
12
|
+
* would turn an id above 2^53 into somebody else's.
|
|
13
|
+
*/
|
|
14
|
+
export const userIdsJson = (ids) => {
|
|
15
|
+
for (const id of ids) {
|
|
16
|
+
if (!USER_ID.test(id))
|
|
17
|
+
throw new CliError("validation_error", `a user id is digits only, not ${id}`);
|
|
18
|
+
}
|
|
19
|
+
return `[${ids.join(",")}]`;
|
|
20
|
+
};
|
|
21
|
+
/** A friendly command's body meets the same schema check as one given to `max bot api`. */
|
|
22
|
+
export const checked = (id, text) => checkBody(operation(id), text) ?? text;
|
|
23
|
+
const limitOf = (limit) => {
|
|
24
|
+
if (limit > 100)
|
|
25
|
+
throw new CliError("validation_error", "MAX gives at most 100 at a time — --limit 100");
|
|
26
|
+
return String(limit);
|
|
27
|
+
};
|
|
28
|
+
const listOf = (answer) => {
|
|
29
|
+
const { members, marker } = plainJson(answer);
|
|
30
|
+
return { members: members ?? [], marker: marker ?? null };
|
|
31
|
+
};
|
|
32
|
+
export const membersCommand = () => {
|
|
33
|
+
const command = new Command("members").description("the people in a group chat or channel the bot is in");
|
|
34
|
+
command
|
|
35
|
+
.command("list <chat>")
|
|
36
|
+
.description("members of a chat, a page at a time — --marker takes the `marker` the last page gave")
|
|
37
|
+
.option("--limit <n>", "how many, up to 100", (value) => Number.parseInt(value, 10))
|
|
38
|
+
.option("--marker <marker>", "continue from here")
|
|
39
|
+
.action(async function (chat) {
|
|
40
|
+
const context = botContext(this);
|
|
41
|
+
const marker = this.opts().marker;
|
|
42
|
+
const answer = await context.authenticated().call(operation("getMembers"), {
|
|
43
|
+
path: { chatId: chatIdOf(chat, context.registry) },
|
|
44
|
+
query: { count: limitOf(context.settings.limit), ...(marker ? { marker } : {}) },
|
|
45
|
+
});
|
|
46
|
+
context.renderer.result(listOf(answer));
|
|
47
|
+
});
|
|
48
|
+
annotate(command.command("add <chat> <users...>"), { mutates: true })
|
|
49
|
+
.description("add people to a chat by user id; the bot must be an admin that may add members")
|
|
50
|
+
.action(async function (chat, users) {
|
|
51
|
+
const context = botContext(this);
|
|
52
|
+
const answer = await guardedCall(context, operation("addMembers"), {
|
|
53
|
+
path: { chatId: chatIdOf(chat, context.registry) },
|
|
54
|
+
body: checked("addMembers", `{"user_ids": ${userIdsJson(users)}}`),
|
|
55
|
+
});
|
|
56
|
+
context.renderer.result(plainJson(answer) ?? { success: true });
|
|
57
|
+
});
|
|
58
|
+
annotate(command.command("remove <chat> <user>"), { mutates: true })
|
|
59
|
+
.description("remove a person from a chat")
|
|
60
|
+
.option("--block", "also block them from coming back by the chat's link")
|
|
61
|
+
.action(async function (chat, user) {
|
|
62
|
+
const context = botContext(this);
|
|
63
|
+
userIdsJson([user]);
|
|
64
|
+
const block = this.opts().block === true;
|
|
65
|
+
const answer = await guardedCall(context, operation("removeMember"), {
|
|
66
|
+
path: { chatId: chatIdOf(chat, context.registry) },
|
|
67
|
+
query: { user_id: user, ...(block ? { block: "true" } : {}) },
|
|
68
|
+
});
|
|
69
|
+
context.renderer.result(plainJson(answer) ?? { success: true });
|
|
70
|
+
});
|
|
71
|
+
return command;
|
|
72
|
+
};
|
|
73
|
+
export const ADMIN_PERMISSIONS = [
|
|
74
|
+
"read_all_messages",
|
|
75
|
+
"add_remove_members",
|
|
76
|
+
"add_admins",
|
|
77
|
+
"change_chat_info",
|
|
78
|
+
"pin_message",
|
|
79
|
+
"edit_link",
|
|
80
|
+
"write",
|
|
81
|
+
"edit",
|
|
82
|
+
"delete",
|
|
83
|
+
"can_call",
|
|
84
|
+
"view_stats",
|
|
85
|
+
];
|
|
86
|
+
const permissionsOf = (list) => {
|
|
87
|
+
const permissions = list
|
|
88
|
+
.split(",")
|
|
89
|
+
.map((one) => one.trim())
|
|
90
|
+
.filter(Boolean);
|
|
91
|
+
const unknown = permissions.filter((one) => !ADMIN_PERMISSIONS.includes(one));
|
|
92
|
+
if (permissions.length === 0 || unknown.length > 0) {
|
|
93
|
+
throw new CliError("validation_error", `--permissions takes a comma list of: ${ADMIN_PERMISSIONS.join(", ")}` +
|
|
94
|
+
(unknown.length > 0 ? ` — not ${unknown.join(", ")}` : ""));
|
|
95
|
+
}
|
|
96
|
+
return permissions;
|
|
97
|
+
};
|
|
98
|
+
export const adminsCommand = () => {
|
|
99
|
+
const command = new Command("admins").description("the admins of a group chat or channel the bot is an admin in");
|
|
100
|
+
command
|
|
101
|
+
.command("list <chat>")
|
|
102
|
+
.description("the admins of a chat and what each may do")
|
|
103
|
+
.action(async function (chat) {
|
|
104
|
+
const context = botContext(this);
|
|
105
|
+
const answer = await context.authenticated().call(operation("getAdmins"), {
|
|
106
|
+
path: { chatId: chatIdOf(chat, context.registry) },
|
|
107
|
+
});
|
|
108
|
+
context.renderer.result(listOf(answer));
|
|
109
|
+
});
|
|
110
|
+
annotate(command.command("add <chat> <user>"), { mutates: true })
|
|
111
|
+
.description("make a person an admin with the permissions named")
|
|
112
|
+
.requiredOption("--permissions <list>", `a comma list: ${ADMIN_PERMISSIONS.join(", ")}`)
|
|
113
|
+
.option("--alias <title>", "the title shown beside their name")
|
|
114
|
+
.action(async function (chat, user) {
|
|
115
|
+
const context = botContext(this);
|
|
116
|
+
const options = this.opts();
|
|
117
|
+
const admin = `{"user_id": ${userIdsJson([user]).slice(1, -1)}, "permissions": ${JSON.stringify(permissionsOf(options.permissions))}${options.alias === undefined ? "" : `, "alias": ${JSON.stringify(options.alias)}`}}`;
|
|
118
|
+
const answer = await guardedCall(context, operation("postAdmins"), {
|
|
119
|
+
path: { chatId: chatIdOf(chat, context.registry) },
|
|
120
|
+
body: checked("postAdmins", `{"admins": [${admin}]}`),
|
|
121
|
+
});
|
|
122
|
+
context.renderer.result(plainJson(answer) ?? { success: true });
|
|
123
|
+
});
|
|
124
|
+
annotate(command.command("remove <chat> <user>"), { mutates: true })
|
|
125
|
+
.description("take a person's admin rights away; they stay in the chat")
|
|
126
|
+
.action(async function (chat, user) {
|
|
127
|
+
const context = botContext(this);
|
|
128
|
+
userIdsJson([user]);
|
|
129
|
+
const answer = await guardedCall(context, operation("deleteAdmins"), {
|
|
130
|
+
path: { chatId: chatIdOf(chat, context.registry), userId: user },
|
|
131
|
+
});
|
|
132
|
+
context.renderer.result(plainJson(answer) ?? { success: true });
|
|
133
|
+
});
|
|
134
|
+
return command;
|
|
135
|
+
};
|
|
136
|
+
//# sourceMappingURL=bot-members.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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;AAE7C,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AA6E5C,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"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { CliError, singleLine } from "@leemour/cli-core";
|
|
2
|
+
import { parseLocator, pickPerson, renderMessages, } from "@leemour/cli-messaging";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { accountOf, fromStore, keep, PROVIDER } from "../bot/keep.js";
|
|
5
|
+
import { KINDS } from "../bot/map.js";
|
|
6
|
+
import { botContext } from "./bot-context.js";
|
|
7
|
+
/** What "common chats" rests on: who has written where in this copy, not who is a member. */
|
|
8
|
+
const BASIS = "messages seen";
|
|
9
|
+
const count = (value) => Number.parseInt(value, 10);
|
|
10
|
+
/** This bot's messages, or every bot's on this machine — identities are per provider, so a person is the same in both. */
|
|
11
|
+
const scopeOf = (context, allBots) => {
|
|
12
|
+
if (allBots)
|
|
13
|
+
return { filter: { provider: PROVIDER }, account: undefined };
|
|
14
|
+
const botId = context.registry.botId();
|
|
15
|
+
if (!botId) {
|
|
16
|
+
throw new CliError("not_found", "nothing is recorded for this bot on this machine — run `bot messages list <chat>` once");
|
|
17
|
+
}
|
|
18
|
+
return { filter: { account: accountOf(botId) }, account: botId };
|
|
19
|
+
};
|
|
20
|
+
const resolve = (store, references, account) => {
|
|
21
|
+
const people = store.people(PROVIDER, account ? { account } : {});
|
|
22
|
+
return references.map((reference) => pickPerson(reference, people));
|
|
23
|
+
};
|
|
24
|
+
/** Two bots in one group keep a copy each; the reader wants the message once. */
|
|
25
|
+
const once = (messages) => {
|
|
26
|
+
const seen = new Set();
|
|
27
|
+
return messages.filter((message) => {
|
|
28
|
+
const key = `${message.chatId} ${message.id}`;
|
|
29
|
+
if (seen.has(key))
|
|
30
|
+
return false;
|
|
31
|
+
seen.add(key);
|
|
32
|
+
return true;
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
const byTime = (a, b) => a.timestamp.localeCompare(b.timestamp);
|
|
36
|
+
const messagesText = (context, messages) => renderMessages(messages, {
|
|
37
|
+
verbosity: context.settings.detail,
|
|
38
|
+
color: context.color,
|
|
39
|
+
profile: context.settings.profile,
|
|
40
|
+
provider: PROVIDER,
|
|
41
|
+
});
|
|
42
|
+
const nameLine = (person) => singleLine([person.name ?? "(no name)", person.username && `@${person.username}`, person.id].filter(Boolean).join(" "));
|
|
43
|
+
const cardOf = (store, context, who, allBots, limit) => {
|
|
44
|
+
const { filter, account } = scopeOf(context, allBots);
|
|
45
|
+
const [person] = resolve(store, [who], account);
|
|
46
|
+
const rows = store.find({ ...filter, senders: [person.id], perChat: true, limit: 1 }).items;
|
|
47
|
+
const latest = rows.filter((hit, index) => rows.findIndex((other) => other.chatId === hit.chatId) === index);
|
|
48
|
+
const kindOf = (hit) => KINDS[String(hit.providerMetadata?.chatType)] ?? "unknown";
|
|
49
|
+
const dialogs = latest.filter((hit) => kindOf(hit) === "dialog");
|
|
50
|
+
const messages = dialogs
|
|
51
|
+
.flatMap((hit) => {
|
|
52
|
+
const { account: bot } = parseLocator(hit.locator);
|
|
53
|
+
return store.messages({ provider: PROVIDER, account: bot }, hit.chatId, { limit }).items;
|
|
54
|
+
})
|
|
55
|
+
.toSorted(byTime);
|
|
56
|
+
const card = {
|
|
57
|
+
...person,
|
|
58
|
+
chats: latest.map((hit) => ({
|
|
59
|
+
id: hit.chatId,
|
|
60
|
+
title: hit.chatTitle,
|
|
61
|
+
kind: kindOf(hit),
|
|
62
|
+
lastMessageAt: hit.timestamp,
|
|
63
|
+
})),
|
|
64
|
+
messages: messages.slice(-limit),
|
|
65
|
+
};
|
|
66
|
+
return { card, dialogs };
|
|
67
|
+
};
|
|
68
|
+
export const peopleCommand = () => {
|
|
69
|
+
const command = new Command("people").description("people this bot has seen write — from the local copy on this machine, never asking MAX unless told to");
|
|
70
|
+
command
|
|
71
|
+
.command("show <who>")
|
|
72
|
+
.option("--limit <n>", "how many messages from the private chat", count)
|
|
73
|
+
.option("--all-bots", "look through every bot's local copy on this machine, not only this one's")
|
|
74
|
+
.option("--refresh", "read the private chat with them from MAX first — one request")
|
|
75
|
+
.description("one person — an id, @username or part of a name: the chats they wrote in (with their last message " +
|
|
76
|
+
"there) and the latest messages of their private chat with the bot")
|
|
77
|
+
.action(async function (who, options) {
|
|
78
|
+
const context = botContext(this, { offline: true });
|
|
79
|
+
if (options.refresh && context.offline)
|
|
80
|
+
throw new CliError("validation_error", "--refresh asks MAX; drop --offline");
|
|
81
|
+
const allBots = options.allBots === true;
|
|
82
|
+
const limit = context.settings.limit;
|
|
83
|
+
const first = await fromStore((store) => cardOf(store, context, who, allBots, limit));
|
|
84
|
+
let card = first.card;
|
|
85
|
+
if (options.refresh) {
|
|
86
|
+
const self = context.registry.botId();
|
|
87
|
+
const ours = first.dialogs.find((hit) => self && parseLocator(hit.locator).account === self);
|
|
88
|
+
if (!self || !ours) {
|
|
89
|
+
context.streams.diagnostic("no private chat with them is recorded for this bot — nothing to refresh");
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const client = context.authenticated();
|
|
93
|
+
const fresh = await client.messages(ours.chatId, Math.min(limit, 100), self);
|
|
94
|
+
await keep(self, fresh, "history", context.streams.diagnostic, client.takeSenders());
|
|
95
|
+
card = (await fromStore((store) => cardOf(store, context, who, allBots, limit))).card;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (context.format !== "pretty") {
|
|
99
|
+
context.renderer.result(card);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const chats = card.chats.map((chat) => ` ${chat.id} ${chat.kind} ${singleLine(chat.title ?? "")} ${chat.lastMessageAt ?? ""}`);
|
|
103
|
+
context.streams.data([nameLine(card), ...chats, "", messagesText(context, card.messages)].join("\n"));
|
|
104
|
+
});
|
|
105
|
+
return command;
|
|
106
|
+
};
|
|
107
|
+
/** `bot messages search --from`: every message from any of them, with or without text. */
|
|
108
|
+
export const searchMessages = (context, text, from = []) => {
|
|
109
|
+
const { filter, account } = scopeOf(context, false);
|
|
110
|
+
return fromStore((store) => {
|
|
111
|
+
const senders = resolve(store, from, account).map(({ id }) => id);
|
|
112
|
+
return store.find({
|
|
113
|
+
...filter,
|
|
114
|
+
...(text === undefined ? {} : { text }),
|
|
115
|
+
...(senders.length ? { senders } : {}),
|
|
116
|
+
limit: context.settings.limit,
|
|
117
|
+
}).items;
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
export const addBetween = (messages) => {
|
|
121
|
+
messages
|
|
122
|
+
.command("between <people...>")
|
|
123
|
+
.option("--limit <n>", "how many of the latest messages from each chat", count)
|
|
124
|
+
.option("--all-bots", "look through every bot's local copy on this machine, not only this one's")
|
|
125
|
+
.description("what two or more people wrote in the chats they have all written in — from the local copy, grouped by " +
|
|
126
|
+
"chat, oldest first; --limit counts per chat. Common chats are the ones this copy saw each of them " +
|
|
127
|
+
"write in, not a member list from MAX")
|
|
128
|
+
.action(async function (references, options) {
|
|
129
|
+
const context = botContext(this, { offline: true });
|
|
130
|
+
if (references.length < 2)
|
|
131
|
+
throw new CliError("validation_error", "name at least two people");
|
|
132
|
+
const { filter, account } = scopeOf(context, options.allBots === true);
|
|
133
|
+
const page = await fromStore((store) => {
|
|
134
|
+
const senders = resolve(store, references, account).map(({ id }) => id);
|
|
135
|
+
return store.find({ ...filter, senders, together: true, perChat: true, limit: context.settings.limit });
|
|
136
|
+
});
|
|
137
|
+
const chats = new Map();
|
|
138
|
+
for (const hit of once(page.items)) {
|
|
139
|
+
const chat = chats.get(hit.chatId) ?? { id: hit.chatId, title: hit.chatTitle, messages: [] };
|
|
140
|
+
chat.messages.push(hit);
|
|
141
|
+
chats.set(hit.chatId, chat);
|
|
142
|
+
}
|
|
143
|
+
const limit = context.settings.limit;
|
|
144
|
+
const grouped = [...chats.values()].map((chat) => ({
|
|
145
|
+
...chat,
|
|
146
|
+
messages: chat.messages.toSorted(byTime).slice(-limit),
|
|
147
|
+
}));
|
|
148
|
+
if (context.format !== "pretty") {
|
|
149
|
+
context.renderer.result({ basis: BASIS, chats: grouped, hasMore: page.hasMore });
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const blocks = grouped.map((chat) => `${chat.id} ${singleLine(chat.title ?? "")}\n${messagesText(context, chat.messages)}`);
|
|
153
|
+
context.streams.data(blocks.join("\n\n"));
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
//# sourceMappingURL=bot-people.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bot-people.js","sourceRoot":"","sources":["../../src/commands/bot-people.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-reads.d.ts","sourceRoot":"","sources":["../../src/commands/bot-reads.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"bot-reads.d.ts","sourceRoot":"","sources":["../../src/commands/bot-reads.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAWtD,8FAA8F;AAC9F,eAAO,MAAM,QAAQ,cAAe,MAAM,YAAY,YAAY,KAAG,MAMpE,CAAA;AAQD,eAAO,MAAM,eAAe,QAAO,OA+ElC,CAAA;AA0BD,eAAO,MAAM,YAAY,QAAO,OAsD/B,CAAA"}
|
|
@@ -3,7 +3,11 @@ import { annotate } from "@leemour/cli-core/commands";
|
|
|
3
3
|
import { pickChat, renderMessages } from "@leemour/cli-messaging";
|
|
4
4
|
import { Command } from "commander";
|
|
5
5
|
import { botOperations } from "../bot/client.js";
|
|
6
|
+
import { accountOf, fromStore, keep, keepChat, PROVIDER } from "../bot/keep.js";
|
|
7
|
+
import { asFirstWord } from "../profile.js";
|
|
8
|
+
import { botCheckCommand, botRulesCommand } from "./bot-check.js";
|
|
6
9
|
import { botContext } from "./bot-context.js";
|
|
10
|
+
import { addBetween, searchMessages } from "./bot-people.js";
|
|
7
11
|
import { guardedCall, sendCommands } from "./bot-sends.js";
|
|
8
12
|
const CHAT_ID = /^-?\d+$/;
|
|
9
13
|
/** An id as it is, or a title this bot has already seen — never a guess (ARCHITECTURE §9). */
|
|
@@ -26,16 +30,28 @@ export const messagesCommand = () => {
|
|
|
26
30
|
command
|
|
27
31
|
.command("list <chat>")
|
|
28
32
|
.option("--limit <n>", "how many, up to 100", (value) => Number.parseInt(value, 10))
|
|
29
|
-
.description("the latest messages in a chat (--limit, up to 100) — its id, or the title of a chat this bot has seen"
|
|
33
|
+
.description("the latest messages in a chat (--limit, up to 100) — its id, or the title of a chat this bot has seen; " +
|
|
34
|
+
"--offline answers from the local copy")
|
|
30
35
|
.action(async function (chat) {
|
|
31
|
-
const context = botContext(this);
|
|
36
|
+
const context = botContext(this, { offline: true });
|
|
32
37
|
const limit = context.settings.limit;
|
|
33
38
|
if (limit > 100)
|
|
34
39
|
throw new CliError("validation_error", "a bot reads at most 100 messages at a time — --limit 100");
|
|
35
|
-
const client = context.authenticated();
|
|
36
40
|
const chatId = chatIdOf(chat, context.registry);
|
|
41
|
+
if (context.offline) {
|
|
42
|
+
const botId = storedBotId(context);
|
|
43
|
+
const page = await fromStore((store) => store.messages(accountOf(botId), chatId, { limit }));
|
|
44
|
+
if (page.items.length === 0) {
|
|
45
|
+
throw new CliError("not_found", `nothing is recorded for chat ${chatId} on this machine — run it once without --offline`);
|
|
46
|
+
}
|
|
47
|
+
show(context, page.items);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const client = context.authenticated();
|
|
37
51
|
const self = (await client.me()).user_id;
|
|
52
|
+
context.registry.rememberBot(self);
|
|
38
53
|
const messages = await client.messages(chatId, limit, self);
|
|
54
|
+
await keep(self, messages, "history", context.streams.diagnostic, client.takeSenders());
|
|
39
55
|
context.registry.observe([{ id: chatId }]);
|
|
40
56
|
show(context, messages);
|
|
41
57
|
});
|
|
@@ -43,14 +59,43 @@ export const messagesCommand = () => {
|
|
|
43
59
|
.command("get <message>")
|
|
44
60
|
.description("one message by its id (mid.…)")
|
|
45
61
|
.action(async function (message) {
|
|
46
|
-
const context = botContext(this);
|
|
62
|
+
const context = botContext(this, { offline: true });
|
|
63
|
+
if (context.offline) {
|
|
64
|
+
const botId = storedBotId(context);
|
|
65
|
+
const kept = await fromStore((store) => store.message(accountOf(botId), message));
|
|
66
|
+
if (!kept)
|
|
67
|
+
throw new CliError("not_found", `message ${message} is not in the local copy`);
|
|
68
|
+
show(context, [kept]);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
47
71
|
const client = context.authenticated();
|
|
48
72
|
const self = (await client.me()).user_id;
|
|
49
|
-
|
|
73
|
+
context.registry.rememberBot(self);
|
|
74
|
+
const found = await client.message(message, self);
|
|
75
|
+
await keep(self, [found], "history", context.streams.diagnostic, client.takeSenders());
|
|
76
|
+
show(context, [found]);
|
|
50
77
|
});
|
|
78
|
+
command
|
|
79
|
+
.command("search [text]")
|
|
80
|
+
.option("--limit <n>", "how many", (value) => Number.parseInt(value, 10))
|
|
81
|
+
.option("--from <who>", "only what this person wrote — an id, @username or part of a name; repeat it for any of several", (value, previous = []) => [...previous, value])
|
|
82
|
+
.description("search the messages this bot has read, sent or received on this machine — the local copy only, newest " +
|
|
83
|
+
"first; by text, by --from, or both")
|
|
84
|
+
.action(async function (text, options) {
|
|
85
|
+
const context = botContext(this, { offline: true });
|
|
86
|
+
storedBotId(context);
|
|
87
|
+
show(context, await searchMessages(context, text, options.from));
|
|
88
|
+
});
|
|
89
|
+
addBetween(command);
|
|
51
90
|
sendCommands(command);
|
|
52
91
|
return command;
|
|
53
92
|
};
|
|
93
|
+
const storedBotId = (context) => {
|
|
94
|
+
const botId = context.registry.botId();
|
|
95
|
+
if (botId)
|
|
96
|
+
return botId;
|
|
97
|
+
throw new CliError("not_found", `nothing is recorded for this bot on this machine — run \`max ${asFirstWord(context.settings.profile)}bot messages list <chat>\` once`);
|
|
98
|
+
};
|
|
54
99
|
const show = (context, messages) => {
|
|
55
100
|
if (context.format !== "pretty") {
|
|
56
101
|
context.renderer.result(messages);
|
|
@@ -60,25 +105,28 @@ const show = (context, messages) => {
|
|
|
60
105
|
verbosity: context.settings.detail,
|
|
61
106
|
color: context.color,
|
|
62
107
|
profile: context.settings.profile,
|
|
63
|
-
provider:
|
|
108
|
+
provider: PROVIDER,
|
|
64
109
|
}));
|
|
65
110
|
};
|
|
66
111
|
export const chatsCommand = () => {
|
|
67
112
|
const command = new Command("chats").description("the chats this bot is in — MAX gives a bot no list of them, so `list` shows the ones it has seen");
|
|
113
|
+
command.addCommand(botCheckCommand());
|
|
114
|
+
command.addCommand(botRulesCommand());
|
|
68
115
|
command
|
|
69
116
|
.command("list")
|
|
70
117
|
.description("chats this bot has seen on this machine — not a complete list from MAX")
|
|
71
118
|
.action(function () {
|
|
72
|
-
const { renderer, registry } = botContext(this);
|
|
119
|
+
const { renderer, registry } = botContext(this, { offline: true });
|
|
73
120
|
renderer.result(registry.list());
|
|
74
121
|
});
|
|
75
122
|
command
|
|
76
123
|
.command("get <chat>")
|
|
77
124
|
.description("one chat from MAX, and remember it")
|
|
78
125
|
.action(async function (chat) {
|
|
79
|
-
const { renderer, registry, authenticated } = botContext(this);
|
|
126
|
+
const { renderer, registry, authenticated, streams } = botContext(this);
|
|
80
127
|
const found = await authenticated().chat(chatIdOf(chat, registry));
|
|
81
128
|
registry.observe([found]);
|
|
129
|
+
await keepChat(registry.botId(), found, streams.diagnostic);
|
|
82
130
|
renderer.result(found);
|
|
83
131
|
});
|
|
84
132
|
const write = (name, operationId, description, body) => annotate(command.command(name), { mutates: true })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-reads.js","sourceRoot":"","sources":["../../src/commands/bot-reads.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAgB,QAAQ,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC/E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"bot-reads.js","sourceRoot":"","sources":["../../src/commands/bot-reads.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { ManifestOperation } from "@leemour/cli-core/codegen";
|
|
2
2
|
import { Command } from "commander";
|
|
3
3
|
import { type CallInput } from "../bot/transport.js";
|
|
4
|
+
import { type UploadType } from "../bot/uploads.js";
|
|
4
5
|
import { botContext } from "./bot-context.js";
|
|
5
6
|
type Context = ReturnType<typeof botContext>;
|
|
7
|
+
export declare const operation: (id: string) => ManifestOperation;
|
|
8
|
+
/** Step one through the client, step two to the upload host; the attachment a body carries. */
|
|
9
|
+
export declare const uploaded: (context: Context, path: string, type?: UploadType, call?: (target: ManifestOperation, input: CallInput) => Promise<unknown>) => Promise<import("../bot/uploads.js").Attachment>;
|
|
10
|
+
export declare const textOf: (text: string) => string;
|
|
6
11
|
/** Every bot write, from any command: readOnly and allow, then the recipient list and the journal. */
|
|
7
12
|
export declare const guardedCall: (context: Context, target: ManifestOperation, input: CallInput) => Promise<unknown>;
|
|
8
13
|
export declare const sendCommands: (messages: Command) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot-sends.d.ts","sourceRoot":"","sources":["../../src/commands/bot-sends.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAIlE,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"bot-sends.d.ts","sourceRoot":"","sources":["../../src/commands/bot-sends.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAIlE,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AAM3C,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAGL,KAAK,UAAU,EAIhB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAiB,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE5D,KAAK,OAAO,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;AAE5C,eAAO,MAAM,SAAS,OAAQ,MAAM,sBAInC,CAAA;AA2DD,+FAA+F;AAC/F,eAAO,MAAM,QAAQ,YACV,OAAO,QACV,MAAM,SACN,UAAU,SACV,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,oDAYxE,CAAA;AAED,eAAO,MAAM,MAAM,SAAU,MAAM,KAAG,MAA4E,CAAA;AAgElH,sGAAsG;AACtG,eAAO,MAAM,WAAW,YAAmB,OAAO,UAAU,iBAAiB,SAAS,SAAS,KAAG,OAAO,CAAC,OAAO,CAUhH,CAAA;AAED,eAAO,MAAM,YAAY,aAAc,OAAO,KAAG,IAyGhD,CAAA;AAED,eAAO,MAAM,iBAAiB,QAAO,OAoCpC,CAAA;AAED,eAAO,MAAM,YAAY,QAAO,OAQ3B,CAAA"}
|