@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,158 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { CliError, resolvePaths, writeSecurely } from "@leemour/cli-core";
|
|
4
|
+
import * as v from "valibot";
|
|
5
|
+
import { LEVELS } from "../sends/permissions.js";
|
|
6
|
+
/** What a rule does with what it finds; nothing but `report` acts until the group's level lets it. */
|
|
7
|
+
export const RULE_ACTIONS = ["report", "delete", "remove"];
|
|
8
|
+
/**
|
|
9
|
+
* max-cli's first words for a group's consent (`NEED-308`), read as the profile's levels
|
|
10
|
+
* (`NEED-462` B): `flag` and `confirm` both ask, `forbid` denies.
|
|
11
|
+
*/
|
|
12
|
+
const OLD_LEVELS = { forbid: "deny", flag: "ask", confirm: "ask", allow: "allow" };
|
|
13
|
+
const level = v.pipe(v.picklist([...LEVELS, ...Object.keys(OLD_LEVELS)]), v.transform((typed) => (OLD_LEVELS[typed] ?? typed)));
|
|
14
|
+
const action = v.picklist(RULE_ACTIONS);
|
|
15
|
+
const personIds = v.array(v.pipe(v.string(), v.regex(/^-?\d+$/, "a person id is digits")));
|
|
16
|
+
const atLeast = (min) => v.pipe(v.number(), v.integer(), v.minValue(min));
|
|
17
|
+
/** `requests` and `consent.accept|decline` were for join requests (max-cli `FIND-249`); a file with them loads and drops them. */
|
|
18
|
+
const groupRules = v.pipe(v.strictObject({
|
|
19
|
+
title: v.nullable(v.string()),
|
|
20
|
+
trusted: personIds,
|
|
21
|
+
blocked: personIds,
|
|
22
|
+
blockedNames: v.array(v.pipe(v.string(), v.minLength(1))),
|
|
23
|
+
links: action,
|
|
24
|
+
invites: action,
|
|
25
|
+
forwards: action,
|
|
26
|
+
blockedPeople: action,
|
|
27
|
+
flood: v.strictObject({ messages: atLeast(1), minutes: atLeast(1), action }),
|
|
28
|
+
/** 0 days turns the rule off. */
|
|
29
|
+
newAccount: v.strictObject({ days: atLeast(0), action: v.picklist(["report", "remove"]) }),
|
|
30
|
+
requests: v.optional(v.unknown()),
|
|
31
|
+
consent: v.strictObject({
|
|
32
|
+
delete: level,
|
|
33
|
+
remove: level,
|
|
34
|
+
accept: v.optional(v.unknown()),
|
|
35
|
+
decline: v.optional(v.unknown()),
|
|
36
|
+
}),
|
|
37
|
+
}), v.transform(({ requests: _, consent: { accept: _accept, decline: _decline, ...consent }, ...rules }) => ({
|
|
38
|
+
...rules,
|
|
39
|
+
consent,
|
|
40
|
+
})));
|
|
41
|
+
const file = v.strictObject({
|
|
42
|
+
groups: v.record(v.string(), groupRules),
|
|
43
|
+
/** Where each group's next `chats moderate` starts, ISO 8601. */
|
|
44
|
+
checkedUntil: v.optional(v.record(v.string(), v.string())),
|
|
45
|
+
});
|
|
46
|
+
/** Every key written out, so the file shows all there is to set (max-cli `NEED-314`). Nothing here acts. */
|
|
47
|
+
export const defaultRules = (title) => ({
|
|
48
|
+
title,
|
|
49
|
+
trusted: [],
|
|
50
|
+
blocked: [],
|
|
51
|
+
blockedNames: [],
|
|
52
|
+
links: "report",
|
|
53
|
+
invites: "report",
|
|
54
|
+
forwards: "report",
|
|
55
|
+
blockedPeople: "report",
|
|
56
|
+
flood: { messages: 5, minutes: 1, action: "report" },
|
|
57
|
+
newAccount: { days: 7, action: "report" },
|
|
58
|
+
consent: { delete: "ask", remove: "ask" },
|
|
59
|
+
});
|
|
60
|
+
const list = (value) => value
|
|
61
|
+
.split(",")
|
|
62
|
+
.map((item) => item.trim())
|
|
63
|
+
.filter(Boolean);
|
|
64
|
+
const whole = (value) => (/^\d+$/.test(value.trim()) ? Number(value) : Number.NaN);
|
|
65
|
+
/** What `chats rules set` accepts, and how its text becomes the stored value. */
|
|
66
|
+
const KEYS = {
|
|
67
|
+
trusted: { help: "person ids, comma-separated; never acted on", parse: list },
|
|
68
|
+
blocked: { help: "person ids, comma-separated", parse: list },
|
|
69
|
+
blockedNames: { help: "parts of a name, comma-separated, any case", parse: list },
|
|
70
|
+
links: { help: RULE_ACTIONS.join("|"), parse: String },
|
|
71
|
+
invites: { help: RULE_ACTIONS.join("|"), parse: String },
|
|
72
|
+
forwards: { help: RULE_ACTIONS.join("|"), parse: String },
|
|
73
|
+
blockedPeople: { help: RULE_ACTIONS.join("|"), parse: String },
|
|
74
|
+
"flood.messages": { help: "a whole number, 1 or more", parse: whole },
|
|
75
|
+
"flood.minutes": { help: "a whole number, 1 or more", parse: whole },
|
|
76
|
+
"flood.action": { help: RULE_ACTIONS.join("|"), parse: String },
|
|
77
|
+
"newAccount.days": { help: "a whole number; 0 turns it off", parse: whole },
|
|
78
|
+
"newAccount.action": { help: "report|remove", parse: String },
|
|
79
|
+
"consent.delete": { help: LEVELS.join("|"), parse: String },
|
|
80
|
+
"consent.remove": { help: LEVELS.join("|"), parse: String },
|
|
81
|
+
};
|
|
82
|
+
export const RULE_KEYS = Object.keys(KEYS);
|
|
83
|
+
export const moderationPathFor = (app, profile, env = process.env) => join(resolvePaths({ appName: app.appName, prefix: app.envPrefix, env }).state, "profiles", `${profile}.moderation.json`);
|
|
84
|
+
/**
|
|
85
|
+
* The rules of each group this profile moderates, one file per profile beside the recipient list —
|
|
86
|
+
* the path max-cli used, so its rules carry over. May be edited by hand; a file that does not check
|
|
87
|
+
* out refuses rather than being guessed at.
|
|
88
|
+
*/
|
|
89
|
+
export class ModerationRules {
|
|
90
|
+
path;
|
|
91
|
+
constructor(path) {
|
|
92
|
+
this.path = path;
|
|
93
|
+
}
|
|
94
|
+
/** `undefined` when this group has no section yet. */
|
|
95
|
+
read(chatId) {
|
|
96
|
+
return this.#file().groups[chatId];
|
|
97
|
+
}
|
|
98
|
+
/** Writes the group's whole section — the defaults first, if it had none — with one key changed. */
|
|
99
|
+
set(chatId, title, key, value) {
|
|
100
|
+
const known = KEYS[key];
|
|
101
|
+
if (!known)
|
|
102
|
+
throw invalid(`no rule ${key} — one of: ${RULE_KEYS.join(", ")}`);
|
|
103
|
+
const current = this.read(chatId) ?? defaultRules(title);
|
|
104
|
+
const checked = v.safeParse(groupRules, assign(current, key, known.parse(value)));
|
|
105
|
+
if (!checked.success)
|
|
106
|
+
throw invalid(`${key} ${JSON.stringify(value)} is not valid — ${known.help}`);
|
|
107
|
+
const saved = this.#file();
|
|
108
|
+
this.#write({ ...saved, groups: { ...saved.groups, [chatId]: checked.output } });
|
|
109
|
+
return checked.output;
|
|
110
|
+
}
|
|
111
|
+
/** Puts one key back to its default. */
|
|
112
|
+
unset(chatId, title, key) {
|
|
113
|
+
if (!KEYS[key])
|
|
114
|
+
throw invalid(`no rule ${key} — one of: ${RULE_KEYS.join(", ")}`);
|
|
115
|
+
const current = this.read(chatId) ?? defaultRules(title);
|
|
116
|
+
const changed = assign(current, key, lookup(defaultRules(title), key));
|
|
117
|
+
const saved = this.#file();
|
|
118
|
+
this.#write({ ...saved, groups: { ...saved.groups, [chatId]: changed } });
|
|
119
|
+
return changed;
|
|
120
|
+
}
|
|
121
|
+
checkedUntil(chatId) {
|
|
122
|
+
return this.#file().checkedUntil?.[chatId];
|
|
123
|
+
}
|
|
124
|
+
markChecked(chatId, at) {
|
|
125
|
+
const saved = this.#file();
|
|
126
|
+
this.#write({ ...saved, checkedUntil: { ...saved.checkedUntil, [chatId]: at } });
|
|
127
|
+
}
|
|
128
|
+
#file() {
|
|
129
|
+
if (!existsSync(this.path))
|
|
130
|
+
return { groups: {} };
|
|
131
|
+
let parsed;
|
|
132
|
+
try {
|
|
133
|
+
parsed = JSON.parse(readFileSync(this.path, "utf8"));
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
throw broken(this.path, error instanceof Error ? error.message : String(error));
|
|
137
|
+
}
|
|
138
|
+
const checked = v.safeParse(file, parsed);
|
|
139
|
+
if (!checked.success) {
|
|
140
|
+
const problems = checked.issues.map((issue) => `${v.getDotPath(issue) ?? "file"}: ${issue.message}`);
|
|
141
|
+
throw broken(this.path, problems.join("; "));
|
|
142
|
+
}
|
|
143
|
+
return checked.output;
|
|
144
|
+
}
|
|
145
|
+
#write(content) {
|
|
146
|
+
writeSecurely(this.path, `${JSON.stringify(content, null, 2)}\n`, 0o600);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const invalid = (message) => new CliError("validation_error", message);
|
|
150
|
+
const broken = (path, why) => new CliError("configuration_error", `the moderation rules ${path} cannot be read (${why}) — fix the file`);
|
|
151
|
+
const lookup = (rules, key) => key.split(".").reduce((value, part) => value[part], rules);
|
|
152
|
+
const assign = (rules, key, value) => {
|
|
153
|
+
const [head, tail] = key.split(".");
|
|
154
|
+
if (tail === undefined)
|
|
155
|
+
return { ...rules, [head]: value };
|
|
156
|
+
return { ...rules, [head]: { ...rules[head], [tail]: value } };
|
|
157
|
+
};
|
|
158
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/moderation/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAG5B,OAAO,EAAE,MAAM,EAAc,MAAM,yBAAyB,CAAA;AAE5D,sGAAsG;AACtG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAU,CAAA;AAEnE;;;GAGG;AACH,MAAM,UAAU,GAA0B,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AAEzG,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAClB,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EACnD,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAU,CAAC,CAC9D,CAAA;AACD,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;AACvC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAA;AAC1F,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;AAEjF,kIAAkI;AAClI,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CACvB,CAAC,CAAC,YAAY,CAAC;IACb,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,MAAM;IAChB,aAAa,EAAE,MAAM;IACrB,KAAK,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5E,iCAAiC;IACjC,UAAU,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC1F,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,YAAY,CAAC;QACtB,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KACjC,CAAC;CACH,CAAC,EACF,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACvG,GAAG,KAAK;IACR,OAAO;CACR,CAAC,CAAC,CACJ,CAAA;AAID,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC;IACxC,iEAAiE;IACjE,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;CAC3D,CAAC,CAAA;AAEF,4GAA4G;AAC5G,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAoB,EAAc,EAAE,CAAC,CAAC;IACjE,KAAK;IACL,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,YAAY,EAAE,EAAE;IAChB,KAAK,EAAE,QAAQ;IACf,OAAO,EAAE,QAAQ;IACjB,QAAQ,EAAE,QAAQ;IAClB,aAAa,EAAE,QAAQ;IACvB,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE;IACpD,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE;IACzC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;CAC1C,CAAC,CAAA;AAEF,MAAM,IAAI,GAAG,CAAC,KAAa,EAAY,EAAE,CACvC,KAAK;KACF,KAAK,CAAC,GAAG,CAAC;KACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;KAC1B,MAAM,CAAC,OAAO,CAAC,CAAA;AAEpB,MAAM,KAAK,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AAElG,iFAAiF;AACjF,MAAM,IAAI,GAAwE;IAChF,OAAO,EAAE,EAAE,IAAI,EAAE,6CAA6C,EAAE,KAAK,EAAE,IAAI,EAAE;IAC7E,OAAO,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE,KAAK,EAAE,IAAI,EAAE;IAC7D,YAAY,EAAE,EAAE,IAAI,EAAE,4CAA4C,EAAE,KAAK,EAAE,IAAI,EAAE;IACjF,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;IACtD,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;IACxD,QAAQ,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;IACzD,aAAa,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;IAC9D,gBAAgB,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,KAAK,EAAE;IACrE,eAAe,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,KAAK,EAAE;IACpE,cAAc,EAAE,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/D,iBAAiB,EAAE,EAAE,IAAI,EAAE,gCAAgC,EAAE,KAAK,EAAE,KAAK,EAAE;IAC3E,mBAAmB,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE;IAC7D,gBAAgB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;IAC3D,gBAAgB,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;CAC5D,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAE1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAgB,EAAE,OAAe,EAAE,GAAG,GAAsB,OAAO,CAAC,GAAG,EAAU,EAAE,CACnH,IAAI,CACF,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EACxE,UAAU,EACV,GAAG,OAAO,kBAAkB,CAC7B,CAAA;AAEH;;;;GAIG;AACH,MAAM,OAAO,eAAe;IACL,IAAI;IAAzB,YAAqB,IAAY;oBAAZ,IAAI;IAAW,CAAC;IAErC,sDAAsD;IACtD,IAAI,CAAC,MAAU;QACb,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC;IAED,oGAAoG;IACpG,GAAG,CAAC,MAAU,EAAE,KAAoB,EAAE,GAAW,EAAE,KAAa;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACvB,IAAI,CAAC,KAAK;YAAE,MAAM,OAAO,CAAC,WAAW,GAAG,cAAc,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACjF,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,MAAM,OAAO,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,mBAAmB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;QACnG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAC1B,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAChF,OAAO,OAAO,CAAC,MAAM,CAAA;IACvB,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,MAAU,EAAE,KAAoB,EAAE,GAAW;QACjD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,OAAO,CAAC,WAAW,GAAG,cAAc,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACjF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,CAAA;QACxD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAC1B,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QACzE,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,YAAY,CAAC,MAAU;QACrB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAA;IAC5C,CAAC;IAED,WAAW,CAAC,MAAU,EAAE,EAAU;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAA;QAC1B,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,EAAE,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;QACjD,IAAI,MAAe,CAAA;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QACtD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QACjF,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACzC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;YACpG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9C,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAA;IACvB,CAAC;IAED,MAAM,CAAC,OAAmC;QACxC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IAC1E,CAAC;CACF;AAED,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAA;AAE9E,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE,CAC3C,IAAI,QAAQ,CAAC,qBAAqB,EAAE,wBAAwB,IAAI,oBAAoB,GAAG,kBAAkB,CAAC,CAAA;AAE5G,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAE,GAAW,EAAW,EAAE,CACzD,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAU,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAE,KAAiC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;AAElG,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAE,GAAW,EAAE,KAAc,EAAc,EAAE;IAC5E,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAA2C,CAAA;IAC7E,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAA;IAC1D,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,GAAI,KAAK,CAAC,IAAI,CAAY,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAA;AAC5E,CAAC,CAAA"}
|
package/dist/parity/bin.js
CHANGED
|
@@ -2,12 +2,25 @@
|
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
3
|
import { parityProblems } from "./manifest.js";
|
|
4
4
|
import { pageProblems } from "./pages.js";
|
|
5
|
+
import { wordingProblems } from "./wording.js";
|
|
5
6
|
const [cli, flag, ...pages] = process.argv.slice(2);
|
|
7
|
+
const manifest = JSON.parse(readFileSync(new URL("../../parity.json", import.meta.url), "utf8"));
|
|
8
|
+
const read = (file) => JSON.parse(readFileSync(file, "utf8"));
|
|
9
|
+
if (cli === "wording" && flag !== undefined && pages.length === 1) {
|
|
10
|
+
const problems = wordingProblems(manifest, read(flag), read(pages[0] ?? ""));
|
|
11
|
+
for (const problem of problems)
|
|
12
|
+
console.error(problem);
|
|
13
|
+
if (problems.length > 0) {
|
|
14
|
+
console.error(`${problems.length} shared option(s) worded differently — STANDARD.md, Help text rule 4`);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
process.exit(0);
|
|
18
|
+
}
|
|
6
19
|
if ((cli !== "max" && cli !== "tg") || (flag !== undefined && (flag !== "--pages" || pages.length === 0))) {
|
|
7
|
-
console.error("usage: <tool> commands --json | cli-messaging-parity <max|tg> [--pages <file...>]"
|
|
20
|
+
console.error("usage: <tool> commands --json | cli-messaging-parity <max|tg> [--pages <file...>]\n" +
|
|
21
|
+
" cli-messaging-parity wording <max.json> <tg.json>");
|
|
8
22
|
process.exit(2);
|
|
9
23
|
}
|
|
10
|
-
const manifest = JSON.parse(readFileSync(new URL("../../parity.json", import.meta.url), "utf8"));
|
|
11
24
|
const program = JSON.parse(readFileSync(0, "utf8"));
|
|
12
25
|
if (flag === "--pages") {
|
|
13
26
|
const problems = pages.flatMap((page) => pageProblems(readFileSync(page, "utf8"), cli, manifest, program).map((found) => `${page}: ${found} — no such option, and the parity manifest plans none for ${cli}`));
|
package/dist/parity/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/parity/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAA2B,cAAc,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/parity/bin.ts"],"names":[],"mappings":"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"}
|
package/dist/parity/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parity/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parity/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA"}
|
package/dist/parity/index.js
CHANGED
package/dist/parity/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parity/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parity/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type CommandsJson, type Manifest } from "./manifest.js";
|
|
2
|
+
/**
|
|
3
|
+
* Every `both` option the two tools describe in different words. An option whose catalogue entry has a
|
|
4
|
+
* `note` is a clash already written down, and is left to whoever the note names.
|
|
5
|
+
*/
|
|
6
|
+
export declare const wordingProblems: (manifest: Manifest, max: CommandsJson, tg: CommandsJson) => string[];
|
|
7
|
+
//# sourceMappingURL=wording.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wording.d.ts","sourceRoot":"","sources":["../../src/parity/wording.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAY,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAc1E;;;GAGG;AACH,eAAO,MAAM,eAAe,aAAc,QAAQ,OAAO,YAAY,MAAM,YAAY,KAAG,MAAM,EAc/F,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { longName } from "./manifest.js";
|
|
2
|
+
const descriptions = (program) => {
|
|
3
|
+
const found = new Map();
|
|
4
|
+
for (const option of program.globalOptions)
|
|
5
|
+
found.set(`(global) ${longName(option.flags)}`, option.description);
|
|
6
|
+
const walk = (command) => {
|
|
7
|
+
for (const option of command.options)
|
|
8
|
+
found.set(`${command.path.join(" ")} ${longName(option.flags)}`, option.description);
|
|
9
|
+
command.commands.forEach(walk);
|
|
10
|
+
};
|
|
11
|
+
program.commands.forEach(walk);
|
|
12
|
+
return found;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Every `both` option the two tools describe in different words. An option whose catalogue entry has a
|
|
16
|
+
* `note` is a clash already written down, and is left to whoever the note names.
|
|
17
|
+
*/
|
|
18
|
+
export const wordingProblems = (manifest, max, tg) => {
|
|
19
|
+
const rows = [
|
|
20
|
+
...Object.entries(manifest.globalOptions).map(([name, entry]) => ["(global)", name, entry]),
|
|
21
|
+
...Object.entries(manifest.commands).flatMap(([path, row]) => Object.entries(row.options ?? {}).map(([name, entry]) => [path, name, entry])),
|
|
22
|
+
];
|
|
23
|
+
const inMax = descriptions(max);
|
|
24
|
+
const inTg = descriptions(tg);
|
|
25
|
+
return rows
|
|
26
|
+
.filter(([, name, entry]) => entry === "both" && !manifest.options[name]?.note)
|
|
27
|
+
.map(([path, name]) => `${path} ${name}`)
|
|
28
|
+
.filter((where) => inMax.get(where) !== inTg.get(where))
|
|
29
|
+
.map((where) => `${where}: max says "${inMax.get(where)}", tg says "${inTg.get(where)}"`);
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=wording.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wording.js","sourceRoot":"","sources":["../../src/parity/wording.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,QAAQ,EAAiB,MAAM,eAAe,CAAA;AAE1E,MAAM,YAAY,GAAG,CAAC,OAAqB,EAAuB,EAAE;IAClE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,aAAa;QAAE,KAAK,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IAC/G,MAAM,IAAI,GAAG,CAAC,OAAoB,EAAE,EAAE;QACpC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO;YAClC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;QACtF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC,CAAA;IACD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAkB,EAAE,GAAiB,EAAE,EAAgB,EAAY,EAAE;IACnG,MAAM,IAAI,GAAG;QACX,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAU,CAAC;QACpG,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CAC3D,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAU,CAAC,CACvF;KACF,CAAA;IACD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;IAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAA;IAC7B,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;SAC9E,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;SACxC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;SACvD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,eAAe,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AAC7F,CAAC,CAAA"}
|
|
@@ -16,11 +16,13 @@ export type PermissionKey = string;
|
|
|
16
16
|
/** Only what cannot be undone asks; the tool is meant to work without questions (owner, NEED-460). */
|
|
17
17
|
export declare const DEFAULT_PERMISSIONS: Readonly<Record<PermissionKey, Level>>;
|
|
18
18
|
/** The resources at the top of the command tree, which `readOnly` and `allow` turn read-only as a whole. */
|
|
19
|
-
export declare const RESOURCES: readonly ["messages", "reactions", "polls", "topics", "chats", "contacts", "account"];
|
|
19
|
+
export declare const RESOURCES: readonly ["messages", "reactions", "polls", "topics", "chats", "contacts", "account", "bot"];
|
|
20
20
|
/** The command path an old `allow` word stood for, as one key — what an MCP tool's `permission` is checked against. */
|
|
21
21
|
export declare const keyOfWord: (word: Permission) => PermissionKey;
|
|
22
|
-
/** `
|
|
23
|
-
export declare const fromOldSettings: (readOnly: boolean, allow: readonly Permission[] | undefined
|
|
22
|
+
/** `bot` translates a bot's `readOnly` and `allow`, which only ever covered the bot. */
|
|
23
|
+
export declare const fromOldSettings: (readOnly: boolean, allow: readonly Permission[] | undefined, { bot }?: {
|
|
24
|
+
bot?: boolean;
|
|
25
|
+
}) => Record<PermissionKey, Level>;
|
|
24
26
|
/**
|
|
25
27
|
* The most specific key the owner set wins. A built-in default (`DEFAULT_PERMISSIONS`) only ever
|
|
26
28
|
* tightens: against a broader key of the owner's, the stricter of the two holds — so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,WAAW,YACtB,MAAM,EACN,SAAS,EACT,UAAU,EACV,MAAM,EACN,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,CACF,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAgBrD,eAAO,MAAM,aAAa,SAAU,QAAQ,WAAW,MAAM,KAAG,UAc/D,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,MAAM,YAAI,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAU,CAAA;AAEnE,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;AAE3C,qFAAqF;AACrF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAElC,sGAAsG;AACtG,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE3D;;;;;GAKG;AACH,eAAO,MAAM,WAAW,YACtB,MAAM,EACN,SAAS,EACT,UAAU,EACV,MAAM,EACN,KAAK,EACL,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,CACF,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAgBrD,eAAO,MAAM,aAAa,SAAU,QAAQ,WAAW,MAAM,KAAG,UAc/D,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,MAAM,YAAI,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAU,CAAA;AAEnE,MAAM,MAAM,KAAK,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;AAE3C,qFAAqF;AACrF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAElC,sGAAsG;AACtG,eAAO,MAAM,mBAAmB,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAItE,CAAA;AAED,4GAA4G;AAC5G,eAAO,MAAM,SAAS,YAAI,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,CAAU,CAAA;AA2BrH,uHAAuH;AACvH,eAAO,MAAM,SAAS,SAAU,UAAU,KAAG,aAAoD,CAAA;AAajG,wFAAwF;AACxF,eAAO,MAAM,eAAe,aAChB,OAAO,SACV,SAAS,UAAU,EAAE,GAAG,SAAS,YACvB;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,KACjC,MAAM,CAAC,aAAa,EAAE,KAAK,CAW7B,CAAA;AAeD;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,gBACN,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,OAC9C,aAAa,aACR,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,KAC/C;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CAAA;CAM3C,CAAA;AA4BD,oFAAoF;AACpF,eAAO,MAAM,WAAW,SAAU,QAAQ,WAAW,MAAM,KAAG,aAQ7D,CAAA;AA2BD;;;GAGG;AACH,eAAO,MAAM,aAAa,SAAU,SAAS,MAAM,EAAE,KAAG,aAAa,GAAG,IAAI,GAAG,SAY9E,CAAA"}
|
|
@@ -53,9 +53,10 @@ export const LEVELS = ["deny", "readonly", "ask", "allow"];
|
|
|
53
53
|
export const DEFAULT_PERMISSIONS = {
|
|
54
54
|
"messages.delete": "ask",
|
|
55
55
|
"account.sessions.end": "ask",
|
|
56
|
+
"bot.messages.delete": "ask",
|
|
56
57
|
};
|
|
57
58
|
/** The resources at the top of the command tree, which `readOnly` and `allow` turn read-only as a whole. */
|
|
58
|
-
export const RESOURCES = ["messages", "reactions", "polls", "topics", "chats", "contacts", "account"];
|
|
59
|
+
export const RESOURCES = ["messages", "reactions", "polls", "topics", "chats", "contacts", "account", "bot"];
|
|
59
60
|
const OLD_WORDS = {
|
|
60
61
|
send: ["messages.send", "polls.create"],
|
|
61
62
|
forward: ["messages.forward"],
|
|
@@ -83,16 +84,31 @@ const OLD_WORDS = {
|
|
|
83
84
|
/** The command path an old `allow` word stood for, as one key — what an MCP tool's `permission` is checked against. */
|
|
84
85
|
export const keyOfWord = (word) => OLD_WORDS[word][0];
|
|
85
86
|
/** `readOnly` and `allow` as levels, so a file written before `permissions` keeps meaning what it meant. */
|
|
86
|
-
|
|
87
|
+
/**
|
|
88
|
+
* A bot's old words meant its own writes: `profile` was its command menu, and `read` was taking
|
|
89
|
+
* updates, which every level but `deny` allows now.
|
|
90
|
+
*/
|
|
91
|
+
const botKeysOf = (word) => {
|
|
92
|
+
if (word === "profile")
|
|
93
|
+
return ["bot.commands"];
|
|
94
|
+
if (word === "read")
|
|
95
|
+
return [];
|
|
96
|
+
return OLD_WORDS[word].map((key) => `bot.${key}`);
|
|
97
|
+
};
|
|
98
|
+
/** `bot` translates a bot's `readOnly` and `allow`, which only ever covered the bot. */
|
|
99
|
+
export const fromOldSettings = (readOnly, allow, { bot = false } = {}) => {
|
|
87
100
|
if (!readOnly && allow === undefined)
|
|
88
101
|
return {};
|
|
89
|
-
const levels =
|
|
102
|
+
const levels = bot
|
|
103
|
+
? { bot: "readonly" }
|
|
104
|
+
: Object.fromEntries(RESOURCES.filter((resource) => resource !== "bot").map((resource) => [resource, "readonly"]));
|
|
90
105
|
if (readOnly)
|
|
91
106
|
return levels;
|
|
92
107
|
// A deletion needed its flag whatever `allow` said, so it keeps asking.
|
|
93
|
-
for (const word of allow ?? [])
|
|
94
|
-
for (const key of OLD_WORDS[word])
|
|
108
|
+
for (const word of allow ?? []) {
|
|
109
|
+
for (const key of bot ? botKeysOf(word) : OLD_WORDS[word])
|
|
95
110
|
levels[key] = DEFAULT_PERMISSIONS[key] ?? "allow";
|
|
111
|
+
}
|
|
96
112
|
return levels;
|
|
97
113
|
};
|
|
98
114
|
const ALLOWED = { level: "allow", key: null };
|
|
@@ -172,15 +188,23 @@ const HOUSEKEEPING = new Set([
|
|
|
172
188
|
"recipients",
|
|
173
189
|
"mcp",
|
|
174
190
|
]);
|
|
191
|
+
/** Under `bot`: its token, its names, its lists and its MCP server. */
|
|
192
|
+
const BOT_HOUSEKEEPING = new Set(["auth", "list", "sends", "recipients", "mcp"]);
|
|
175
193
|
const STORE_MAINTENANCE = new Set(["info", "check", "migrate", "backup", "restore"]);
|
|
176
194
|
/** Commands outside `messages` that print what people wrote, so `deny messages` reaches them too. */
|
|
177
|
-
const SHOW_MESSAGES = new Set(["inbox", "review", "watch", "serve", "store"]);
|
|
195
|
+
const SHOW_MESSAGES = new Set(["inbox", "review", "watch", "serve", "store", "conversations"]);
|
|
178
196
|
/**
|
|
179
197
|
* The key a command path is checked against: `null` for housekeeping, which no level stops, and
|
|
180
198
|
* `undefined` for a path this package does not know — a CLI's own command, which its CLI maps.
|
|
181
199
|
*/
|
|
182
200
|
export const keyForCommand = (path) => {
|
|
183
201
|
const [top, next] = path;
|
|
202
|
+
if (top === "bot") {
|
|
203
|
+
if (next === undefined || BOT_HOUSEKEEPING.has(next))
|
|
204
|
+
return null;
|
|
205
|
+
const inner = keyForCommand(path.slice(1));
|
|
206
|
+
return `bot.${inner ?? path.slice(1).join(".")}`;
|
|
207
|
+
}
|
|
184
208
|
if (top === undefined || HOUSEKEEPING.has(top))
|
|
185
209
|
return null;
|
|
186
210
|
if (top === "store" && next !== undefined && STORE_MAINTENANCE.has(next))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM;IACN,SAAS;IACT,UAAU;IACV,MAAM;IACN,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,UAAU;IACV,SAAS;IACT,SAAS;IACT,UAAU;CACF,CAAA;AAIV,MAAM,OAAO,GAAsC;IACjD,aAAa,EAAE,UAAU;IACzB,gBAAgB,EAAE,UAAU;IAC5B,gBAAgB,EAAE,UAAU;IAC5B,gBAAgB,EAAE,UAAU;IAC5B,eAAe,EAAE,UAAU;IAC3B,iBAAiB,EAAE,UAAU;IAC7B,OAAO,EAAE,SAAS;IAClB,eAAe,EAAE,SAAS;IAC1B,eAAe,EAAE,SAAS;IAC1B,eAAe,EAAE,SAAS;IAC1B,cAAc,EAAE,UAAU;CAC3B,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAc,EAAE,MAAe,EAAc,EAAE;IAC3E,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,MAAM,CAAA;QACf,KAAK,MAAM;YACT,OAAO,QAAQ,CAAA;QACjB,KAAK,SAAS,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,OAAO,CAAC,MAAuB,CAAC,CAAA;YACnD,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,EAAE,CAAC,CAAA;YACvF,OAAO,UAAU,CAAA;QACnB,CAAC;QACD;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC,CAAA;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,CAAU,CAAA;AAOnE,sGAAsG;AACtG,MAAM,CAAC,MAAM,mBAAmB,GAA2C;IACzE,iBAAiB,EAAE,KAAK;IACxB,sBAAsB,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Id, Message, Page } from "../domain/models.js";
|
|
2
|
+
import type { ConversationSummary, StoredLink } from "../store/store.js";
|
|
3
|
+
import type { ServiceDeps } from "./deps.js";
|
|
4
|
+
export interface Built {
|
|
5
|
+
chat: Id;
|
|
6
|
+
messages: number;
|
|
7
|
+
links: number;
|
|
8
|
+
conversations: number;
|
|
9
|
+
builtAt: string;
|
|
10
|
+
rulesVersion: number;
|
|
11
|
+
}
|
|
12
|
+
export interface MessageLinks {
|
|
13
|
+
chat: Id;
|
|
14
|
+
message: Id;
|
|
15
|
+
/** The message's own links; `chosen` is the one its conversation follows. */
|
|
16
|
+
links: (StoredLink & {
|
|
17
|
+
chosen: boolean;
|
|
18
|
+
})[];
|
|
19
|
+
/** Its chosen parents back to where the conversation starts, nearest first. */
|
|
20
|
+
chain: Id[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Conversations inside a chat, built from the store alone by rules (phase 3): replies, mentions and one
|
|
24
|
+
* sender's messages in a row. Nothing is built on sync; a chat has conversations once `build` ran for it.
|
|
25
|
+
*/
|
|
26
|
+
export interface ConversationsService {
|
|
27
|
+
build(chat: string): Promise<Built>;
|
|
28
|
+
list(chat: string, window: {
|
|
29
|
+
limit: number;
|
|
30
|
+
since?: string;
|
|
31
|
+
}): Promise<Page<ConversationSummary>>;
|
|
32
|
+
/** By the conversation's id, or as the conversation a message is in. */
|
|
33
|
+
show(target: {
|
|
34
|
+
id: string;
|
|
35
|
+
} | {
|
|
36
|
+
chat: string;
|
|
37
|
+
message: Id;
|
|
38
|
+
}): Promise<{
|
|
39
|
+
summary: ConversationSummary;
|
|
40
|
+
messages: Message[];
|
|
41
|
+
}>;
|
|
42
|
+
links(chat: string, message: Id): Promise<MessageLinks>;
|
|
43
|
+
}
|
|
44
|
+
export declare const conversationsService: (deps: ServiceDeps) => ConversationsService;
|
|
45
|
+
//# sourceMappingURL=conversations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversations.d.ts","sourceRoot":"","sources":["../../src/services/conversations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAS5C,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,EAAE,CAAA;IACR,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,EAAE,CAAA;IACR,OAAO,EAAE,EAAE,CAAA;IACX,6EAA6E;IAC7E,KAAK,EAAE,CAAC,UAAU,GAAG;QAAE,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,EAAE,CAAA;IAC3C,+EAA+E;IAC/E,KAAK,EAAE,EAAE,EAAE,CAAA;CACZ;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IACnC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACjG,wEAAwE;IACxE,IAAI,CACF,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,EAAE,CAAA;KAAE,GACrD,OAAO,CAAC;QAAE,OAAO,EAAE,mBAAmB,CAAC;QAAC,QAAQ,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAA;IACjE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CACxD;AAED,eAAO,MAAM,oBAAoB,SAAU,WAAW,KAAG,oBAuFxD,CAAA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { CliError } from "@leemour/cli-core";
|
|
2
|
+
import { linkMessages, RULES_VERSION } from "../conversations/link.js";
|
|
3
|
+
import { storedChatId } from "./messages.js";
|
|
4
|
+
/** A page of messages handed to the rules at a time; reading is quick, the rules hold a 50-message window. */
|
|
5
|
+
const READ_PAGE = 5_000;
|
|
6
|
+
/** How far `links` follows a message's chosen parents back. */
|
|
7
|
+
const CHAIN = 50;
|
|
8
|
+
export const conversationsService = (deps) => {
|
|
9
|
+
const found = async (chat) => {
|
|
10
|
+
const store = await deps.store();
|
|
11
|
+
const account = await deps.account();
|
|
12
|
+
return { store, account, chatId: await storedChatId(deps.messenger, chat, store, account) };
|
|
13
|
+
};
|
|
14
|
+
const notBuilt = (chatId) => new CliError("not_found", `chat ${chatId} has no conversations yet — \`${deps.messenger.app.command} conversations build --chat ${chatId}\``);
|
|
15
|
+
return {
|
|
16
|
+
build: async (chat) => {
|
|
17
|
+
const { store, account, chatId } = await found(chat);
|
|
18
|
+
const startedAt = Date.now();
|
|
19
|
+
const inputs = [];
|
|
20
|
+
let after;
|
|
21
|
+
for (;;) {
|
|
22
|
+
const page = await store.linkInputs(account, chatId, { limit: READ_PAGE, ...(after ? { after } : {}) });
|
|
23
|
+
inputs.push(...page.items);
|
|
24
|
+
if (page.next === null)
|
|
25
|
+
break;
|
|
26
|
+
after = page.next;
|
|
27
|
+
}
|
|
28
|
+
if (inputs.length === 0) {
|
|
29
|
+
throw new CliError("not_found", `the store holds no messages of chat ${chatId} — fetch them first`);
|
|
30
|
+
}
|
|
31
|
+
const { links, conversations } = linkMessages(inputs, { handles: await store.senderHandles(account, chatId) });
|
|
32
|
+
await store.replaceConversations(account, chatId, {
|
|
33
|
+
startedAt,
|
|
34
|
+
algorithmVersion: RULES_VERSION,
|
|
35
|
+
links,
|
|
36
|
+
conversations,
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
chat: chatId,
|
|
40
|
+
messages: inputs.length,
|
|
41
|
+
links: links.length,
|
|
42
|
+
conversations: conversations.length,
|
|
43
|
+
builtAt: new Date(startedAt).toISOString(),
|
|
44
|
+
rulesVersion: RULES_VERSION,
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
list: async (chat, { limit, since }) => {
|
|
48
|
+
const { store, account, chatId } = await found(chat);
|
|
49
|
+
if (!(await store.conversationState(account, chatId))?.builtAt)
|
|
50
|
+
throw notBuilt(chatId);
|
|
51
|
+
return store.conversations(account, chatId, { limit, ...(since === undefined ? {} : { after: since }) });
|
|
52
|
+
},
|
|
53
|
+
show: async (target) => {
|
|
54
|
+
const store = await deps.store();
|
|
55
|
+
const account = await deps.account();
|
|
56
|
+
let id;
|
|
57
|
+
if ("id" in target) {
|
|
58
|
+
id = target.id;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const { chatId } = await found(target.chat);
|
|
62
|
+
const of = await store.conversationOf(account, chatId, target.message);
|
|
63
|
+
if (of === undefined) {
|
|
64
|
+
if (!(await store.conversationState(account, chatId))?.builtAt)
|
|
65
|
+
throw notBuilt(chatId);
|
|
66
|
+
throw new CliError("not_found", `message ${target.message} is in no conversation of chat ${chatId}`);
|
|
67
|
+
}
|
|
68
|
+
id = of;
|
|
69
|
+
}
|
|
70
|
+
const conversation = await store.conversation(account, id);
|
|
71
|
+
if (!conversation) {
|
|
72
|
+
throw new CliError("not_found", `no conversation ${id} — a rebuild gives new ids; \`conversations list\``);
|
|
73
|
+
}
|
|
74
|
+
return conversation;
|
|
75
|
+
},
|
|
76
|
+
links: async (chat, message) => {
|
|
77
|
+
const { store, account, chatId } = await found(chat);
|
|
78
|
+
const chosenOf = (links) => links.find((link) => !link.stale);
|
|
79
|
+
const own = await store.links(account, chatId, message);
|
|
80
|
+
const chosen = chosenOf(own);
|
|
81
|
+
const chain = [];
|
|
82
|
+
for (let parent = chosen?.parentId ?? null; parent !== null && chain.length < CHAIN;) {
|
|
83
|
+
if (chain.includes(parent))
|
|
84
|
+
break;
|
|
85
|
+
chain.push(parent);
|
|
86
|
+
parent = chosenOf(await store.links(account, chatId, parent))?.parentId ?? null;
|
|
87
|
+
}
|
|
88
|
+
return { chat: chatId, message, links: own.map((link) => ({ ...link, chosen: link === chosen })), chain };
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=conversations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversations.js","sourceRoot":"","sources":["../../src/services/conversations.ts"],"names":[],"mappings":"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"}
|
package/dist/services/deps.d.ts
CHANGED
|
@@ -15,6 +15,9 @@ export interface ServiceDeps {
|
|
|
15
15
|
connection: () => Promise<MessengerAdapter>;
|
|
16
16
|
store: () => Promise<MessageStore>;
|
|
17
17
|
guard: SendGuard;
|
|
18
|
+
/** For the profile's own files — a group's moderation rules. `default` and `process.env` when unset. */
|
|
19
|
+
profile?: string;
|
|
20
|
+
env?: NodeJS.ProcessEnv;
|
|
18
21
|
}
|
|
19
22
|
/**
|
|
20
23
|
* Online, the store only adds to an answer the messenger already gave, so a store that will not open,
|
|
@@ -26,7 +29,10 @@ export declare const storeIfOpen: (deps: ServiceDeps) => Promise<{
|
|
|
26
29
|
} | undefined>;
|
|
27
30
|
export declare const OFFLINE = "--offline answers only from what is kept locally: `chats list|show`, `messages list|show|context` and `contacts list|show`";
|
|
28
31
|
/** Over a connection that is already open — an MCP session holds one for minutes. */
|
|
29
|
-
export declare const onlineDeps: (messenger: Messenger, adapter: MessengerAdapter, guard: SendGuard
|
|
32
|
+
export declare const onlineDeps: (messenger: Messenger, adapter: MessengerAdapter, guard: SendGuard, where?: {
|
|
33
|
+
profile?: string;
|
|
34
|
+
env?: NodeJS.ProcessEnv;
|
|
35
|
+
}) => ServiceDeps;
|
|
30
36
|
/** Over the local store alone, for `--offline` and the tools that never ask the messenger. */
|
|
31
37
|
export declare const storedDeps: (messenger: Messenger, store: MessageStore, account: AccountKey, guard: SendGuard) => ServiceDeps;
|
|
32
38
|
//# sourceMappingURL=deps.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/services/deps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEjE;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAA;IAClC,oFAAoF;IACpF,UAAU,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC3C,KAAK,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAA;IAClC,KAAK,EAAE,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/services/deps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEjE;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAA;IAClC,oFAAoF;IACpF,UAAU,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC3C,KAAK,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAA;IAClC,KAAK,EAAE,SAAS,CAAA;IAChB,wGAAwG;IACxG,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,SAChB,WAAW,KAChB,OAAO,CAAC;IAAE,KAAK,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,GAAG,SAAS,CAMlE,CAAA;AAED,eAAO,MAAM,OAAO,+HAC0G,CAAA;AAE9H,qFAAqF;AACrF,eAAO,MAAM,UAAU,cACV,SAAS,WACX,gBAAgB,SAClB,SAAS,UACT;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KACnD,WAcD,CAAA;AAEF,8FAA8F;AAC9F,eAAO,MAAM,UAAU,cACV,SAAS,SACb,YAAY,WACV,UAAU,SACZ,SAAS,KACf,WASD,CAAA"}
|
package/dist/services/deps.js
CHANGED
|
@@ -13,8 +13,9 @@ export const storeIfOpen = async (deps) => {
|
|
|
13
13
|
};
|
|
14
14
|
export const OFFLINE = "--offline answers only from what is kept locally: `chats list|show`, `messages list|show|context` and `contacts list|show`";
|
|
15
15
|
/** Over a connection that is already open — an MCP session holds one for minutes. */
|
|
16
|
-
export const onlineDeps = (messenger, adapter, guard) => ({
|
|
16
|
+
export const onlineDeps = (messenger, adapter, guard, where = {}) => ({
|
|
17
17
|
messenger,
|
|
18
|
+
...where,
|
|
18
19
|
offline: false,
|
|
19
20
|
guard,
|
|
20
21
|
connection: async () => adapter,
|