@leemour/cli-messaging 0.144.0 → 0.146.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 -1
- package/THIRD_PARTY_NOTICES +34 -0
- package/dist/cli/config-command.d.ts +9 -1
- package/dist/cli/config-command.d.ts.map +1 -1
- package/dist/cli/config-command.js +35 -1
- package/dist/cli/config-command.js.map +1 -1
- package/dist/cli/index.d.ts +6 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +6 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/messenger/chats-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-command.js +2 -0
- package/dist/cli/messenger/chats-command.js.map +1 -1
- package/dist/cli/messenger/chats-stats-command.d.ts +4 -0
- package/dist/cli/messenger/chats-stats-command.d.ts.map +1 -0
- package/dist/cli/messenger/chats-stats-command.js +59 -0
- package/dist/cli/messenger/chats-stats-command.js.map +1 -0
- package/dist/cli/messenger/context.d.ts +3 -0
- package/dist/cli/messenger/context.d.ts.map +1 -1
- package/dist/cli/messenger/context.js +4 -0
- package/dist/cli/messenger/context.js.map +1 -1
- package/dist/cli/messenger/conversations-command.d.ts.map +1 -1
- package/dist/cli/messenger/conversations-command.js +8 -3
- package/dist/cli/messenger/conversations-command.js.map +1 -1
- package/dist/cli/messenger/mcp-command.d.ts +6 -0
- package/dist/cli/messenger/mcp-command.d.ts.map +1 -1
- package/dist/cli/messenger/mcp-command.js +49 -2
- package/dist/cli/messenger/mcp-command.js.map +1 -1
- package/dist/cli/permission-keys.d.ts +12 -0
- package/dist/cli/permission-keys.d.ts.map +1 -0
- package/dist/cli/permission-keys.js +43 -0
- package/dist/cli/permission-keys.js.map +1 -0
- package/dist/mcp/http/node.d.ts +17 -0
- package/dist/mcp/http/node.d.ts.map +1 -0
- package/dist/mcp/http/node.js +74 -0
- package/dist/mcp/http/node.js.map +1 -0
- package/dist/mcp/http/oauth.d.ts +25 -0
- package/dist/mcp/http/oauth.d.ts.map +1 -0
- package/dist/mcp/http/oauth.js +264 -0
- package/dist/mcp/http/oauth.js.map +1 -0
- package/dist/mcp/http/serve.d.ts +21 -0
- package/dist/mcp/http/serve.d.ts.map +1 -0
- package/dist/mcp/http/serve.js +119 -0
- package/dist/mcp/http/serve.js.map +1 -0
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +37 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/chats.d.ts.map +1 -1
- package/dist/mcp/tools/chats.js +21 -1
- package/dist/mcp/tools/chats.js.map +1 -1
- package/dist/mcp/tools/conversations.d.ts.map +1 -1
- package/dist/mcp/tools/conversations.js +7 -2
- package/dist/mcp/tools/conversations.js.map +1 -1
- package/dist/search/snowball/LICENSE +29 -0
- package/dist/search/snowball/base-stemmer.js +445 -0
- package/dist/search/snowball/english-stemmer.js +775 -0
- package/dist/search/snowball/russian-stemmer.js +468 -0
- package/dist/search/snowball/spanish-stemmer.js +722 -0
- package/dist/search/stem.d.ts +35 -0
- package/dist/search/stem.d.ts.map +1 -0
- package/dist/search/stem.js +76 -0
- package/dist/search/stem.js.map +1 -0
- package/dist/sends/index.d.ts +1 -1
- package/dist/sends/index.d.ts.map +1 -1
- package/dist/sends/index.js +1 -1
- package/dist/sends/index.js.map +1 -1
- package/dist/sends/permissions.d.ts +2 -0
- package/dist/sends/permissions.d.ts.map +1 -1
- package/dist/sends/permissions.js +40 -0
- package/dist/sends/permissions.js.map +1 -1
- package/dist/services/chat-stats.d.ts +70 -0
- package/dist/services/chat-stats.d.ts.map +1 -0
- package/dist/services/chat-stats.js +125 -0
- package/dist/services/chat-stats.js.map +1 -0
- package/dist/services/chats.d.ts +10 -0
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.js +44 -0
- package/dist/services/chats.js.map +1 -1
- package/dist/services/embeddings.d.ts +5 -1
- package/dist/services/embeddings.d.ts.map +1 -1
- package/dist/services/embeddings.js +4 -1
- package/dist/services/embeddings.js.map +1 -1
- package/dist/services/inbox.d.ts +7 -0
- package/dist/services/inbox.d.ts.map +1 -1
- package/dist/services/inbox.js +14 -8
- package/dist/services/inbox.js.map +1 -1
- package/dist/services/messages-search.d.ts +1 -0
- package/dist/services/messages-search.d.ts.map +1 -1
- package/dist/services/messages-search.js +1 -1
- package/dist/services/messages-search.js.map +1 -1
- package/package.json +2 -2
- package/parity.json +65 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** The version of the vendored files in `./snowball/`; `bin/snowball-update` regenerates them. */
|
|
2
|
+
export declare const SNOWBALL_VERSION = "3.1.1";
|
|
3
|
+
export declare const CYRILLIC_STEMMERS: readonly ["russian", "none"];
|
|
4
|
+
export declare const LATIN_STEMMERS: readonly ["spanish", "english", "none"];
|
|
5
|
+
export type CyrillicStemmer = (typeof CYRILLIC_STEMMERS)[number];
|
|
6
|
+
export type LatinStemmer = (typeof LATIN_STEMMERS)[number];
|
|
7
|
+
export type Stemmers = {
|
|
8
|
+
cyrillic: CyrillicStemmer;
|
|
9
|
+
latin: LatinStemmer;
|
|
10
|
+
};
|
|
11
|
+
export declare const DEFAULT_STEMMERS: Stemmers;
|
|
12
|
+
/** Clear-all rather than LRU: the 1M benchmark corpus holds 523k distinct words, and a Map stays cheap below this. */
|
|
13
|
+
export declare const STEM_CACHE_LIMIT = 200000;
|
|
14
|
+
/** Recorded beside an index built with these choices; a different value means the index must be rebuilt. */
|
|
15
|
+
export declare const analyzerIdentity: (stemmers: Stemmers) => string;
|
|
16
|
+
/** Checks choices that come from outside the type system — the store, a config value, an MCP argument. */
|
|
17
|
+
export declare const parseStemmers: (value: unknown) => Stemmers;
|
|
18
|
+
export type Stemmer = {
|
|
19
|
+
readonly stemmers: Stemmers;
|
|
20
|
+
readonly identity: string;
|
|
21
|
+
/** The indexed form of one token: stemmed by the script of its letters, then folded with `normalize()`. */
|
|
22
|
+
stemToken(token: string): string;
|
|
23
|
+
/** `stemToken` over every word of a text, split as `unicode61` splits it; tokens that fold to nothing are dropped. */
|
|
24
|
+
stemTokens(text: string): string[];
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* One stemmer per fill run or write drain: it owns its cache, so a cache never outlives the choices it was
|
|
28
|
+
* built with. A token is stemmed only when all its letters are of one script and it has no digit: mixed scripts
|
|
29
|
+
* (`Москвa` with a Latin `a`) are usually homoglyph spoofing or code, and `covid19` is a name, not a word form.
|
|
30
|
+
* Ukrainian and other Cyrillic languages go through the Russian stemmer — there is no language detection.
|
|
31
|
+
*/
|
|
32
|
+
export declare const createStemmer: (stemmers?: Stemmers, { cacheLimit }?: {
|
|
33
|
+
cacheLimit?: number;
|
|
34
|
+
}) => Stemmer;
|
|
35
|
+
//# sourceMappingURL=stem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stem.d.ts","sourceRoot":"","sources":["../../src/search/stem.ts"],"names":[],"mappings":"AAMA,kGAAkG;AAClG,eAAO,MAAM,gBAAgB,UAAU,CAAA;AAEvC,eAAO,MAAM,iBAAiB,YAAI,SAAS,EAAE,MAAM,CAAU,CAAA;AAC7D,eAAO,MAAM,cAAc,YAAI,SAAS,EAAE,SAAS,EAAE,MAAM,CAAU,CAAA;AACrE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAA;AAChE,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA;AAC1D,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAA;AAEzE,eAAO,MAAM,gBAAgB,EAAE,QAAoD,CAAA;AAEnF,sHAAsH;AACtH,eAAO,MAAM,gBAAgB,SAAU,CAAA;AAEvC,4GAA4G;AAC5G,eAAO,MAAM,gBAAgB,aAAc,QAAQ,KAAG,MACgC,CAAA;AAEtF,0GAA0G;AAC1G,eAAO,MAAM,aAAa,UAAW,OAAO,KAAG,QAe9C,CAAA;AAeD,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,2GAA2G;IAC3G,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IAChC,sHAAsH;IACtH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CACnC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,aAAa,cACd,QAAQ,mBACiB;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,KACzD,OA6BF,CAAA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { CliError } from "@leemour/cli-core";
|
|
2
|
+
import { normalize } from "../store/normalize.js";
|
|
3
|
+
import EnglishStemmer from "./snowball/english-stemmer.js";
|
|
4
|
+
import RussianStemmer from "./snowball/russian-stemmer.js";
|
|
5
|
+
import SpanishStemmer from "./snowball/spanish-stemmer.js";
|
|
6
|
+
/** The version of the vendored files in `./snowball/`; `bin/snowball-update` regenerates them. */
|
|
7
|
+
export const SNOWBALL_VERSION = "3.1.1";
|
|
8
|
+
export const CYRILLIC_STEMMERS = ["russian", "none"];
|
|
9
|
+
export const LATIN_STEMMERS = ["spanish", "english", "none"];
|
|
10
|
+
export const DEFAULT_STEMMERS = { cyrillic: "russian", latin: "spanish" };
|
|
11
|
+
/** Clear-all rather than LRU: the 1M benchmark corpus holds 523k distinct words, and a Map stays cheap below this. */
|
|
12
|
+
export const STEM_CACHE_LIMIT = 200_000;
|
|
13
|
+
/** Recorded beside an index built with these choices; a different value means the index must be rebuilt. */
|
|
14
|
+
export const analyzerIdentity = (stemmers) => `snowball-${SNOWBALL_VERSION} cyrillic=${stemmers.cyrillic} latin=${stemmers.latin}`;
|
|
15
|
+
/** Checks choices that come from outside the type system — the store, a config value, an MCP argument. */
|
|
16
|
+
export const parseStemmers = (value) => {
|
|
17
|
+
const record = (typeof value === "object" && value !== null ? value : {});
|
|
18
|
+
const pick = (script, allowed, fallback) => {
|
|
19
|
+
const choice = record[script] ?? fallback;
|
|
20
|
+
if (allowed.includes(choice))
|
|
21
|
+
return choice;
|
|
22
|
+
throw new CliError("validation_error", `${script} words cannot be stemmed with ${JSON.stringify(choice)} — choose ${allowed.join(", ")}`, { reason: "invalid_stemmer", script, allowed: [...allowed] });
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
cyrillic: pick("cyrillic", CYRILLIC_STEMMERS, DEFAULT_STEMMERS.cyrillic),
|
|
26
|
+
latin: pick("latin", LATIN_STEMMERS, DEFAULT_STEMMERS.latin),
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
/** What FTS5 `unicode61` keeps inside a token: letters, digits, private use, and combining marks. */
|
|
30
|
+
const TOKEN = /[\p{L}\p{N}\p{Co}\p{M}]+/gu;
|
|
31
|
+
const MARKS = /\p{M}+/gu;
|
|
32
|
+
const CYRILLIC = /^\p{Script=Cyrillic}+$/u;
|
|
33
|
+
const LATIN = /^\p{Script=Latin}+$/u;
|
|
34
|
+
const snowball = {
|
|
35
|
+
russian: () => new RussianStemmer(),
|
|
36
|
+
spanish: () => new SpanishStemmer(),
|
|
37
|
+
english: () => new EnglishStemmer(),
|
|
38
|
+
none: () => null,
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* One stemmer per fill run or write drain: it owns its cache, so a cache never outlives the choices it was
|
|
42
|
+
* built with. A token is stemmed only when all its letters are of one script and it has no digit: mixed scripts
|
|
43
|
+
* (`Москвa` with a Latin `a`) are usually homoglyph spoofing or code, and `covid19` is a name, not a word form.
|
|
44
|
+
* Ukrainian and other Cyrillic languages go through the Russian stemmer — there is no language detection.
|
|
45
|
+
*/
|
|
46
|
+
export const createStemmer = (stemmers = DEFAULT_STEMMERS, { cacheLimit = STEM_CACHE_LIMIT } = {}) => {
|
|
47
|
+
const valid = parseStemmers(stemmers);
|
|
48
|
+
const cyrillic = snowball[valid.cyrillic]();
|
|
49
|
+
const latin = snowball[valid.latin]();
|
|
50
|
+
const cache = new Map();
|
|
51
|
+
const compute = (token) => {
|
|
52
|
+
// Stress marks survive NFC (кварти́ру) and would hide the suffix from Snowball; ё and й compose and stay.
|
|
53
|
+
const word = token.normalize("NFC").toLowerCase().replace(MARKS, "");
|
|
54
|
+
const engine = CYRILLIC.test(word) ? cyrillic : LATIN.test(word) ? latin : null;
|
|
55
|
+
const stem = engine?.stemWord(word) || word;
|
|
56
|
+
return normalize(stem);
|
|
57
|
+
};
|
|
58
|
+
const stemToken = (token) => {
|
|
59
|
+
const cached = cache.get(token);
|
|
60
|
+
if (cached !== undefined)
|
|
61
|
+
return cached;
|
|
62
|
+
const stem = compute(token);
|
|
63
|
+
if (cache.size >= cacheLimit)
|
|
64
|
+
cache.clear();
|
|
65
|
+
if (cacheLimit > 0)
|
|
66
|
+
cache.set(token, stem);
|
|
67
|
+
return stem;
|
|
68
|
+
};
|
|
69
|
+
return {
|
|
70
|
+
stemmers: valid,
|
|
71
|
+
identity: analyzerIdentity(valid),
|
|
72
|
+
stemToken,
|
|
73
|
+
stemTokens: (text) => (text.normalize("NFC").toLowerCase().match(TOKEN) ?? []).map(stemToken).filter(Boolean),
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=stem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stem.js","sourceRoot":"","sources":["../../src/search/stem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,cAAc,MAAM,+BAA+B,CAAA;AAC1D,OAAO,cAAc,MAAM,+BAA+B,CAAA;AAC1D,OAAO,cAAc,MAAM,+BAA+B,CAAA;AAE1D,kGAAkG;AAClG,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAA;AAEvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,MAAM,CAAU,CAAA;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAU,CAAA;AAKrE,MAAM,CAAC,MAAM,gBAAgB,GAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;AAEnF,sHAAsH;AACtH,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAA;AAEvC,4GAA4G;AAC5G,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAkB,EAAU,EAAE,CAC7D,YAAY,gBAAgB,aAAa,QAAQ,CAAC,QAAQ,UAAU,QAAQ,CAAC,KAAK,EAAE,CAAA;AAEtF,0GAA0G;AAC1G,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAY,EAAE;IACxD,MAAM,MAAM,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAA4B,CAAA;IACpG,MAAM,IAAI,GAAG,CAAmB,MAAc,EAAE,OAAqB,EAAE,QAAW,EAAK,EAAE;QACvF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAA;QACzC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAW,CAAC;YAAE,OAAO,MAAW,CAAA;QACrD,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,GAAG,MAAM,iCAAiC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACjG,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,CAC7D,CAAA;IACH,CAAC,CAAA;IACD,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,QAAQ,CAAC;QACxE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,KAAK,CAAC;KAC7D,CAAA;AACH,CAAC,CAAA;AAED,qGAAqG;AACrG,MAAM,KAAK,GAAG,4BAA4B,CAAA;AAC1C,MAAM,KAAK,GAAG,UAAU,CAAA;AACxB,MAAM,QAAQ,GAAG,yBAAyB,CAAA;AAC1C,MAAM,KAAK,GAAG,sBAAsB,CAAA;AAEpC,MAAM,QAAQ,GAAG;IACf,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE;IACnC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE;IACnC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE;IACnC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;CACjB,CAAA;AAWD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,QAAQ,GAAa,gBAAgB,EACrC,EAAE,UAAU,GAAG,gBAAgB,EAAE,GAA4B,EAAE,EACtD,EAAE;IACX,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAA;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEvC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAU,EAAE;QACxC,0GAA0G;QAC1G,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACpE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;QAC/E,MAAM,IAAI,GAAG,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAA;QAC3C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE;QAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAC/B,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAA;QACvC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;QAC3B,IAAI,KAAK,CAAC,IAAI,IAAI,UAAU;YAAE,KAAK,CAAC,KAAK,EAAE,CAAA;QAC3C,IAAI,UAAU,GAAG,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;QAC1C,OAAO,IAAI,CAAA;IACb,CAAC,CAAA;IAED,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC;QACjC,SAAS;QACT,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;KAC9G,CAAA;AACH,CAAC,CAAA"}
|
package/dist/sends/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { type Asker, type GuardRequest, guardFor, type SendGuard, type SendGuardOptions, sendGuard, sharedJournal, } from "./guard.js";
|
|
2
2
|
export { currentOperation, guardedWrite, type Operated } from "./guarded.js";
|
|
3
3
|
export { type AccountAction, type ChatAction, type SendEntry, SendJournal, type SendKind, type SendOutcome, sendsPathFor, } from "./journal.js";
|
|
4
|
-
export { DEFAULT_PERMISSIONS, fromOldSettings, keyForCommand, keyForWrite, LEVELS, type Level, layerPermissions, levelFor, PERMISSIONS, type Permission, type PermissionKey, permissionFor, } from "./permissions.js";
|
|
4
|
+
export { DEFAULT_PERMISSIONS, fromOldSettings, keyForCommand, keyForWrite, LEVELS, type Level, layerPermissions, levelFor, PERMISSIONS, type Permission, type PermissionKey, permissionFor, WRITE_KEYS, } from "./permissions.js";
|
|
5
5
|
export { type Recipient, RecipientList, recipientsPathFor } from "./recipients.js";
|
|
6
6
|
export { newOperationId, newSendId } from "./send-id.js";
|
|
7
7
|
export { readUpload, type Upload, type UploadKind } from "./upload.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sends/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,KAAK,EACV,KAAK,YAAY,EACjB,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,SAAS,EACT,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,WAAW,EACX,MAAM,EACN,KAAK,KAAK,EACV,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sends/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,KAAK,EACV,KAAK,YAAY,EACjB,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,SAAS,EACT,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,WAAW,EACX,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,WAAW,EACX,MAAM,EACN,KAAK,KAAK,EACV,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,aAAa,EACb,UAAU,GACX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAClF,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/sends/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { guardFor, sendGuard, sharedJournal, } from "./guard.js";
|
|
2
2
|
export { currentOperation, guardedWrite } from "./guarded.js";
|
|
3
3
|
export { SendJournal, sendsPathFor, } from "./journal.js";
|
|
4
|
-
export { DEFAULT_PERMISSIONS, fromOldSettings, keyForCommand, keyForWrite, LEVELS, layerPermissions, levelFor, PERMISSIONS, permissionFor, } from "./permissions.js";
|
|
4
|
+
export { DEFAULT_PERMISSIONS, fromOldSettings, keyForCommand, keyForWrite, LEVELS, layerPermissions, levelFor, PERMISSIONS, permissionFor, WRITE_KEYS, } from "./permissions.js";
|
|
5
5
|
export { RecipientList, recipientsPathFor } from "./recipients.js";
|
|
6
6
|
export { newOperationId, newSendId } from "./send-id.js";
|
|
7
7
|
export { readUpload } from "./upload.js";
|
package/dist/sends/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sends/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EAGR,SAAS,EACT,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAiB,MAAM,cAAc,CAAA;AAC5E,OAAO,EAIL,WAAW,EAGX,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,WAAW,EACX,MAAM,EAEN,gBAAgB,EAChB,QAAQ,EACR,WAAW,EAGX,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sends/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EAGR,SAAS,EACT,aAAa,GACd,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAiB,MAAM,cAAc,CAAA;AAC5E,OAAO,EAIL,WAAW,EAGX,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,WAAW,EACX,MAAM,EAEN,gBAAgB,EAChB,QAAQ,EACR,WAAW,EAGX,aAAa,EACb,UAAU,GACX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAkB,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAClF,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,UAAU,EAAgC,MAAM,aAAa,CAAA"}
|
|
@@ -44,6 +44,8 @@ export declare const levelFor: (permissions: Readonly<Record<PermissionKey, Leve
|
|
|
44
44
|
};
|
|
45
45
|
/** The command path a guarded write belongs to, when the caller did not name it. */
|
|
46
46
|
export declare const keyForWrite: (kind: SendKind, action?: string) => PermissionKey;
|
|
47
|
+
/** Every key a write is checked against that a command path may not spell out. */
|
|
48
|
+
export declare const WRITE_KEYS: readonly PermissionKey[];
|
|
47
49
|
/**
|
|
48
50
|
* The key a command path is checked against: `null` for housekeeping, which no level stops, and
|
|
49
51
|
* `undefined` for a path this package does not know — a CLI's own command, which its CLI maps.
|
|
@@ -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,CAKtE,CAAA;AAED,4GAA4G;AAC5G,eAAO,MAAM,SAAS,YACpB,UAAU,EACV,WAAW,EACX,OAAO,EACP,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,EACT,KAAK,EACL,eAAe,CACP,CAAA;AA6BV,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;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,WAAY,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE;;;CAY/G,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,SAgB9E,CAAA"}
|
|
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,CAKtE,CAAA;AAED,4GAA4G;AAC5G,eAAO,MAAM,SAAS,YACpB,UAAU,EACV,WAAW,EACX,OAAO,EACP,QAAQ,EACR,OAAO,EACP,UAAU,EACV,SAAS,EACT,KAAK,EACL,eAAe,CACP,CAAA;AA6BV,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;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,WAAY,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE;;;CAY/G,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;AAgCD,kFAAkF;AAClF,eAAO,MAAM,UAAU,EAAE,SAAS,aAAa,EAS9C,CAAA;AA2BD;;;GAGG;AACH,eAAO,MAAM,aAAa,SAAU,SAAS,MAAM,EAAE,KAAG,aAAa,GAAG,IAAI,GAAG,SAgB9E,CAAA"}
|
|
@@ -204,6 +204,46 @@ export const keyForWrite = (kind, action) => {
|
|
|
204
204
|
}
|
|
205
205
|
return KIND_KEYS[kind];
|
|
206
206
|
};
|
|
207
|
+
/** Write keys written out where a write is checked; `permission-keys.test.ts` keeps this list whole. */
|
|
208
|
+
const NAMED_WRITE_KEYS = [
|
|
209
|
+
"account.sessions.list",
|
|
210
|
+
"bot.callbacks.answer",
|
|
211
|
+
"bot.chats.action",
|
|
212
|
+
"bot.chats.admins.add",
|
|
213
|
+
"bot.chats.admins.remove",
|
|
214
|
+
"bot.chats.leave",
|
|
215
|
+
"bot.chats.members.remove",
|
|
216
|
+
"bot.chats.moderate",
|
|
217
|
+
"bot.messages.delete",
|
|
218
|
+
"bot.messages.edit",
|
|
219
|
+
"bot.messages.pin",
|
|
220
|
+
"bot.messages.send",
|
|
221
|
+
"bot.messages.unpin",
|
|
222
|
+
"chats.admins.add",
|
|
223
|
+
"chats.admins.remove",
|
|
224
|
+
"chats.link.reset",
|
|
225
|
+
"chats.members.add",
|
|
226
|
+
"chats.members.remove",
|
|
227
|
+
"chats.moderate",
|
|
228
|
+
"conversations.embed",
|
|
229
|
+
"conversations.links",
|
|
230
|
+
"polls.close",
|
|
231
|
+
"polls.create",
|
|
232
|
+
"polls.vote",
|
|
233
|
+
"topics.create",
|
|
234
|
+
"topics.enable",
|
|
235
|
+
];
|
|
236
|
+
/** Every key a write is checked against that a command path may not spell out. */
|
|
237
|
+
export const WRITE_KEYS = [
|
|
238
|
+
...new Set([
|
|
239
|
+
...NAMED_WRITE_KEYS,
|
|
240
|
+
...Object.keys(DEFAULT_PERMISSIONS),
|
|
241
|
+
...Object.values(KIND_KEYS),
|
|
242
|
+
...Object.values(ACCOUNT_KEYS),
|
|
243
|
+
...Object.values(CHAT_KEYS),
|
|
244
|
+
...PERMISSIONS.flatMap((word) => [...OLD_WORDS[word], ...botKeysOf(word)]),
|
|
245
|
+
]),
|
|
246
|
+
];
|
|
207
247
|
/** Commands that look after the tool and its files and never show a message: no level stops them. */
|
|
208
248
|
const HOUSEKEEPING = new Set([
|
|
209
249
|
"config",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/sends/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { ChatEvents, Id, Message } from "../domain/models.js";
|
|
2
|
+
import type { ChatCompleteness } from "../store/store.js";
|
|
3
|
+
export declare const TOP_POSTS = 5;
|
|
4
|
+
export type StatsPeriod = "day" | "week";
|
|
5
|
+
export interface TopPost {
|
|
6
|
+
messageId: Id;
|
|
7
|
+
timestamp: string;
|
|
8
|
+
reactions: number;
|
|
9
|
+
/** Telegram channel posts only; absent where the messenger did not say. */
|
|
10
|
+
views?: number;
|
|
11
|
+
forwards?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface MemberChanges {
|
|
14
|
+
joined: number;
|
|
15
|
+
left: number;
|
|
16
|
+
net: number;
|
|
17
|
+
/** Of those who joined in the period, how many wrote at least once afterwards. */
|
|
18
|
+
wrote: number;
|
|
19
|
+
/** `null` when nobody who joined wrote. */
|
|
20
|
+
medianMinutesToFirstMessage: number | null;
|
|
21
|
+
/** The messenger stopped reading its history before `since`: the counts are lower bounds. */
|
|
22
|
+
more: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface StatsRow {
|
|
25
|
+
key: string;
|
|
26
|
+
messages: number;
|
|
27
|
+
senders: number;
|
|
28
|
+
joined?: number;
|
|
29
|
+
left?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface ChatStats {
|
|
32
|
+
chatId: Id;
|
|
33
|
+
since: string;
|
|
34
|
+
until: string;
|
|
35
|
+
/** The store holds the chat whole and the messenger read every join and leave; otherwise lower bounds. */
|
|
36
|
+
complete: boolean;
|
|
37
|
+
completeness: ChatCompleteness;
|
|
38
|
+
/** The command that fetches what the store lacks; only when it does not hold the chat whole. */
|
|
39
|
+
fetch?: string;
|
|
40
|
+
messages: number;
|
|
41
|
+
senders: number;
|
|
42
|
+
replies: number;
|
|
43
|
+
/** Messages that are not replies themselves and got at least one reply in the period. */
|
|
44
|
+
threads: number;
|
|
45
|
+
reactions: number;
|
|
46
|
+
/** Present only when some stored message carries the number. */
|
|
47
|
+
views?: number;
|
|
48
|
+
forwards?: number;
|
|
49
|
+
topPosts: TopPost[];
|
|
50
|
+
questions: {
|
|
51
|
+
asked: number;
|
|
52
|
+
answered: number;
|
|
53
|
+
medianMinutesToAnswer: number | null;
|
|
54
|
+
answeredBy: "owner" | "owner-and-admins";
|
|
55
|
+
};
|
|
56
|
+
/** Absent where the messenger was not asked: `--offline`, or one that does not say who joined. */
|
|
57
|
+
members?: MemberChanges;
|
|
58
|
+
series?: StatsRow[];
|
|
59
|
+
}
|
|
60
|
+
export declare const chatStats: (messages: Message[], { chatId, since, until, completeness, events, admins, by, timezone, }: {
|
|
61
|
+
chatId: Id;
|
|
62
|
+
since: number;
|
|
63
|
+
until: number;
|
|
64
|
+
completeness: ChatCompleteness;
|
|
65
|
+
events?: ChatEvents;
|
|
66
|
+
admins: Id[] | null;
|
|
67
|
+
by?: StatsPeriod;
|
|
68
|
+
timezone: string;
|
|
69
|
+
}) => ChatStats;
|
|
70
|
+
//# sourceMappingURL=chat-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-stats.d.ts","sourceRoot":"","sources":["../../src/services/chat-stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzD,eAAO,MAAM,SAAS,IAAI,CAAA;AAE1B,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,MAAM,CAAA;AAExC,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,EAAE,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,kFAAkF;IAClF,KAAK,EAAE,MAAM,CAAA;IACb,2CAA2C;IAC3C,2BAA2B,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1C,6FAA6F;IAC7F,IAAI,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,EAAE,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,0GAA0G;IAC1G,QAAQ,EAAE,OAAO,CAAA;IACjB,YAAY,EAAE,gBAAgB,CAAA;IAC9B,gGAAgG;IAChG,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAA;QACpC,UAAU,EAAE,OAAO,GAAG,kBAAkB,CAAA;KACzC,CAAA;IACD,kGAAkG;IAClG,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;CACpB;AAKD,eAAO,MAAM,SAAS,aACV,OAAO,EAAE,yEAUhB;IACD,MAAM,EAAE,EAAE,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,gBAAgB,CAAA;IAC9B,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAA;IACnB,EAAE,CAAC,EAAE,WAAW,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;CACjB,KACA,SAqCF,CAAA"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { questions } from "./inbox.js";
|
|
2
|
+
import { calendarKey } from "./messages-search.js";
|
|
3
|
+
export const TOP_POSTS = 5;
|
|
4
|
+
const JOINS = new Set(["join", "add"]);
|
|
5
|
+
const LEAVES = new Set(["leave", "remove"]);
|
|
6
|
+
export const chatStats = (messages, { chatId, since, until, completeness, events, admins, by, timezone, }) => {
|
|
7
|
+
const service = new Set(events?.events.map(({ messageId }) => messageId));
|
|
8
|
+
const held = messages.filter((one) => !service.has(one.id) &&
|
|
9
|
+
one.providerMetadata?.action === undefined &&
|
|
10
|
+
!one.attachments.some(({ kind }) => kind === "control"));
|
|
11
|
+
const replied = new Set(held.flatMap((one) => one.replyToId ?? one.replyTo?.id ?? []));
|
|
12
|
+
const asked = questions(held, { answerers: new Set(admins ?? []) });
|
|
13
|
+
const answered = asked.flatMap(({ question, answer }) => answer ? [(Date.parse(answer.timestamp) - Date.parse(question.timestamp)) / 60_000] : []);
|
|
14
|
+
return {
|
|
15
|
+
chatId,
|
|
16
|
+
since: new Date(since).toISOString(),
|
|
17
|
+
until: new Date(until).toISOString(),
|
|
18
|
+
complete: completeness.state === "complete" && events?.more !== true,
|
|
19
|
+
completeness,
|
|
20
|
+
messages: held.length,
|
|
21
|
+
senders: sendersOf(held),
|
|
22
|
+
replies: held.filter((one) => (one.replyToId ?? one.replyTo?.id) !== undefined).length,
|
|
23
|
+
threads: held.filter((one) => replied.has(one.id) && (one.replyToId ?? one.replyTo?.id) === undefined).length,
|
|
24
|
+
reactions: sum(held.map(reactionsOf)),
|
|
25
|
+
...summed(held, "views"),
|
|
26
|
+
...summed(held, "forwards"),
|
|
27
|
+
topPosts: topPosts(held),
|
|
28
|
+
questions: {
|
|
29
|
+
asked: asked.length,
|
|
30
|
+
answered: answered.length,
|
|
31
|
+
medianMinutesToAnswer: median(answered),
|
|
32
|
+
answeredBy: admins === null ? "owner" : "owner-and-admins",
|
|
33
|
+
},
|
|
34
|
+
...(events ? { members: membersOf(events, held, since) } : {}),
|
|
35
|
+
...(by ? { series: seriesOf(held, events, by, timezone) } : {}),
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
const sendersOf = (messages) => new Set(messages.flatMap(({ senderId }) => senderId ?? [])).size;
|
|
39
|
+
const reactionsOf = ({ reactions }) => reactions?.total ?? 0;
|
|
40
|
+
const counted = (message, name) => {
|
|
41
|
+
const value = message.providerMetadata?.[name];
|
|
42
|
+
return typeof value === "number" ? value : undefined;
|
|
43
|
+
};
|
|
44
|
+
const summed = (messages, name) => {
|
|
45
|
+
const values = messages.flatMap((one) => counted(one, name) ?? []);
|
|
46
|
+
return values.length === 0 ? {} : { [name]: sum(values) };
|
|
47
|
+
};
|
|
48
|
+
const topPosts = (messages) => messages
|
|
49
|
+
.map((one) => {
|
|
50
|
+
const views = counted(one, "views");
|
|
51
|
+
const forwards = counted(one, "forwards");
|
|
52
|
+
return {
|
|
53
|
+
messageId: one.id,
|
|
54
|
+
timestamp: one.timestamp,
|
|
55
|
+
reactions: reactionsOf(one),
|
|
56
|
+
...(views === undefined ? {} : { views }),
|
|
57
|
+
...(forwards === undefined ? {} : { forwards }),
|
|
58
|
+
};
|
|
59
|
+
})
|
|
60
|
+
.filter((one) => one.reactions > 0 || (one.views ?? 0) > 0)
|
|
61
|
+
.sort((a, b) => b.reactions - a.reactions || (b.views ?? 0) - (a.views ?? 0))
|
|
62
|
+
.slice(0, TOP_POSTS);
|
|
63
|
+
const membersOf = ({ events, more }, messages, since) => {
|
|
64
|
+
const inPeriod = events.filter(({ timestamp }) => Date.parse(timestamp) >= since);
|
|
65
|
+
const people = (names) => inPeriod
|
|
66
|
+
.filter(({ event }) => names.has(event))
|
|
67
|
+
.flatMap(({ timestamp, people }) => people.map(({ id }) => ({ id, at: Date.parse(timestamp) })));
|
|
68
|
+
const joined = people(JOINS);
|
|
69
|
+
const left = people(LEAVES);
|
|
70
|
+
const firstWords = joined.flatMap(({ id, at }) => {
|
|
71
|
+
const first = messages.find((one) => one.senderId === id && Date.parse(one.timestamp) >= at);
|
|
72
|
+
return first ? [(Date.parse(first.timestamp) - at) / 60_000] : [];
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
joined: joined.length,
|
|
76
|
+
left: left.length,
|
|
77
|
+
net: joined.length - left.length,
|
|
78
|
+
wrote: firstWords.length,
|
|
79
|
+
medianMinutesToFirstMessage: median(firstWords),
|
|
80
|
+
more,
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
const seriesOf = (messages, events, by, timezone) => {
|
|
84
|
+
const dayOf = calendarKey(timezone, "day");
|
|
85
|
+
const keyOf = (timestamp) => {
|
|
86
|
+
const day = dayOf(Date.parse(timestamp));
|
|
87
|
+
if (by === "day")
|
|
88
|
+
return day;
|
|
89
|
+
const date = new Date(`${day}T00:00:00Z`);
|
|
90
|
+
date.setUTCDate(date.getUTCDate() - ((date.getUTCDay() + 6) % 7));
|
|
91
|
+
return date.toISOString().slice(0, 10);
|
|
92
|
+
};
|
|
93
|
+
const rows = new Map();
|
|
94
|
+
const row = (key) => {
|
|
95
|
+
const found = rows.get(key) ?? { messages: [], joined: 0, left: 0 };
|
|
96
|
+
rows.set(key, found);
|
|
97
|
+
return found;
|
|
98
|
+
};
|
|
99
|
+
for (const one of messages)
|
|
100
|
+
row(keyOf(one.timestamp)).messages.push(one);
|
|
101
|
+
for (const { timestamp, event, people } of events?.events ?? []) {
|
|
102
|
+
if (JOINS.has(event))
|
|
103
|
+
row(keyOf(timestamp)).joined += people.length;
|
|
104
|
+
if (LEAVES.has(event))
|
|
105
|
+
row(keyOf(timestamp)).left += people.length;
|
|
106
|
+
}
|
|
107
|
+
return [...rows.entries()]
|
|
108
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
109
|
+
.map(([key, found]) => ({
|
|
110
|
+
key,
|
|
111
|
+
messages: found.messages.length,
|
|
112
|
+
senders: sendersOf(found.messages),
|
|
113
|
+
...(events ? { joined: found.joined, left: found.left } : {}),
|
|
114
|
+
}));
|
|
115
|
+
};
|
|
116
|
+
const sum = (values) => values.reduce((total, value) => total + value, 0);
|
|
117
|
+
const median = (values) => {
|
|
118
|
+
if (values.length === 0)
|
|
119
|
+
return null;
|
|
120
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
121
|
+
const middle = Math.floor(sorted.length / 2);
|
|
122
|
+
const upper = sorted[middle] ?? 0;
|
|
123
|
+
return Math.round(sorted.length % 2 === 0 ? ((sorted[middle - 1] ?? upper) + upper) / 2 : upper);
|
|
124
|
+
};
|
|
125
|
+
//# sourceMappingURL=chat-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-stats.js","sourceRoot":"","sources":["../../src/services/chat-stats.ts"],"names":[],"mappings":"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"}
|
package/dist/services/chats.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Chat, ChatCard, ChatEvents, ChatKind, GroupMember, Id, LinkTarget, Page } from "../domain/models.js";
|
|
2
2
|
import { type Operated } from "../sends/guarded.js";
|
|
3
|
+
import { type ChatStats, type StatsPeriod } from "./chat-stats.js";
|
|
3
4
|
import { type ServiceDeps } from "./deps.js";
|
|
4
5
|
/** How far back `events` looks without `since`, as in max-cli. */
|
|
5
6
|
export declare const EVENTS_DAYS = 7;
|
|
@@ -41,6 +42,15 @@ export interface ChatsService {
|
|
|
41
42
|
only?: string;
|
|
42
43
|
}): Promise<ChatEvents>;
|
|
43
44
|
inspect(link: string): Promise<LinkTarget>;
|
|
45
|
+
/**
|
|
46
|
+
* Counts over the stored messages since `since` (ms; `EVENTS_DAYS` ago when unset). Joins and leaves
|
|
47
|
+
* come from the messenger, so they are absent offline; the rest never asks it.
|
|
48
|
+
*/
|
|
49
|
+
stats(chat: string, options: {
|
|
50
|
+
since?: number;
|
|
51
|
+
by?: StatsPeriod;
|
|
52
|
+
timezone?: string;
|
|
53
|
+
}): Promise<ChatStats>;
|
|
44
54
|
/** Through the guard; never counts toward the hourly limit. */
|
|
45
55
|
markRead(request: {
|
|
46
56
|
chat: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../src/services/chats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,WAAW,EACX,EAAE,EACF,UAAU,
|
|
1
|
+
{"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../src/services/chats.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,WAAW,EACX,EAAE,EACF,UAAU,EAGV,IAAI,EACL,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAwB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAGzE,OAAO,EAAE,KAAK,SAAS,EAAa,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7E,OAAO,EAA4B,KAAK,WAAW,EAAe,MAAM,WAAW,CAAA;AAGnF,kEAAkE;AAClE,eAAO,MAAM,WAAW,IAAI,CAAA;AAK5B,oHAAoH;AACpH,eAAO,MAAM,SAAS,MAAM,CAAA;AAE5B,iEAAiE;AACjE,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,eAAO,MAAM,UAAU,EAAE,QAAQ,EAA4C,CAAA;AAE7E,kFAAkF;AAClF,eAAO,MAAM,aAAa,6BAA8B,UAAU,KAAG,UAYpE,CAAA;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,EAAE,CAAA;IACV,wCAAwC;IACxC,KAAK,EAAE,EAAE,GAAG,IAAI,CAAA;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACxF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;IACrC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG;QAAE,MAAM,EAAE,EAAE,CAAA;KAAE,CAAC,CAAA;IACtF,oGAAoG;IACpG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IACrF,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAC1C;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACzG,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAA;CACnF;AAED,eAAO,MAAM,YAAY,SAAU,WAAW,KAAG,YA6G/C,CAAA"}
|
package/dist/services/chats.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { CliError } from "@leemour/cli-core";
|
|
2
2
|
import { capability } from "../cli/messenger/port.js";
|
|
3
|
+
import { timezoneOf } from "../search/lucene/dates.js";
|
|
3
4
|
import { codeOf, guardedWrite } from "../sends/guarded.js";
|
|
4
5
|
import { newOperationId } from "../sends/send-id.js";
|
|
6
|
+
import { chatStats } from "./chat-stats.js";
|
|
5
7
|
import { fromStore, nothingStored, storeIfOpen } from "./deps.js";
|
|
6
8
|
import { storedChatId } from "./messages.js";
|
|
7
9
|
/** How far back `events` looks without `since`, as in max-cli. */
|
|
8
10
|
export const EVENTS_DAYS = 7;
|
|
11
|
+
/** How many stored messages one read of the store takes while `stats` walks the period. */
|
|
12
|
+
const STATS_PAGE = 1000;
|
|
9
13
|
/** A filtered list searches the newest this many: paging through every dialog hit FLOOD_WAIT (tg handoff §4.14). */
|
|
10
14
|
export const CHAT_SCAN = 200;
|
|
11
15
|
export const CHAT_KINDS = ["dialog", "group", "channel", "saved"];
|
|
@@ -81,6 +85,33 @@ export const chatsService = (deps) => ({
|
|
|
81
85
|
}
|
|
82
86
|
return capability(await deps.connection(), "inspect", "read a link")(link);
|
|
83
87
|
},
|
|
88
|
+
stats: async (chat, { since, by, timezone }) => {
|
|
89
|
+
const store = await deps.store();
|
|
90
|
+
const account = await deps.account();
|
|
91
|
+
const chatId = await storedChatId(deps.messenger, chat, store, account);
|
|
92
|
+
const [completeness] = await store.chatCompleteness(account, [chatId]);
|
|
93
|
+
if (!completeness)
|
|
94
|
+
throw new CliError("not_found", `no stored chat ${chatId}`);
|
|
95
|
+
const from = since ?? Date.now() - EVENTS_DAYS * 86_400_000;
|
|
96
|
+
const until = Date.now();
|
|
97
|
+
const messages = await storedSince(store, account, chatId, new Date(from).toISOString());
|
|
98
|
+
const connection = fromStore(deps) ? undefined : await deps.connection();
|
|
99
|
+
const events = connection?.chatEvents ? await connection.chatEvents(chatId, { since: from }) : undefined;
|
|
100
|
+
const admins = (await connection?.admins?.(chatId)) ?? null;
|
|
101
|
+
const stats = chatStats(messages, {
|
|
102
|
+
chatId,
|
|
103
|
+
since: from,
|
|
104
|
+
until,
|
|
105
|
+
completeness,
|
|
106
|
+
...(events ? { events } : {}),
|
|
107
|
+
admins,
|
|
108
|
+
...(by ? { by } : {}),
|
|
109
|
+
timezone: timezoneOf(timezone),
|
|
110
|
+
});
|
|
111
|
+
return completeness.state === "complete"
|
|
112
|
+
? stats
|
|
113
|
+
: { ...stats, fetch: `${deps.messenger.app.command} store fetch ${chatId}` };
|
|
114
|
+
},
|
|
84
115
|
markRead: async ({ chat, until }) => {
|
|
85
116
|
const connection = await deps.connection();
|
|
86
117
|
const markRead = capability(connection, "markRead", "mark a chat read");
|
|
@@ -90,6 +121,19 @@ export const chatsService = (deps) => ({
|
|
|
90
121
|
return { operationId, chatId, until: until ?? null };
|
|
91
122
|
},
|
|
92
123
|
});
|
|
124
|
+
/** Oldest first. */
|
|
125
|
+
const storedSince = async (store, account, chatId, since) => {
|
|
126
|
+
const pages = [];
|
|
127
|
+
let before;
|
|
128
|
+
for (;;) {
|
|
129
|
+
const page = await store.messages(account, chatId, { limit: STATS_PAGE, since, ...(before ? { before } : {}) });
|
|
130
|
+
pages.unshift(page.items);
|
|
131
|
+
const oldest = page.items[0];
|
|
132
|
+
if (!page.hasMore || !oldest)
|
|
133
|
+
return pages.flat();
|
|
134
|
+
before = oldest.id;
|
|
135
|
+
}
|
|
136
|
+
};
|
|
93
137
|
/** `null` when no member list was ever saved: not knowing who is there is not nobody being there. */
|
|
94
138
|
const storedMembers = async (store, account, chatId) => {
|
|
95
139
|
const members = (await store.members(account, chatId)).filter((one) => one.id !== account.account);
|