@zhin.js/plugin-group-daily-analysis 0.0.2
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/LICENSE +21 -0
- package/README.md +63 -0
- package/lib/analysis.d.ts +83 -0
- package/lib/analysis.d.ts.map +1 -0
- package/lib/analysis.js +167 -0
- package/lib/analysis.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +368 -0
- package/lib/index.js.map +1 -0
- package/package.json +68 -0
- package/skills/group-daily-analysis/SKILL.md +19 -0
- package/src/analysis.ts +227 -0
- package/src/index.ts +438 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 凉菜
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# @zhin.js/plugin-group-daily-analysis
|
|
2
|
+
|
|
3
|
+
群日常分析插件:基于 zhin 内置收件箱(`unified_inbox_message`)统计群消息、参与人数、活跃时段,可选 LLM 话题/金句/用户画像,支持文本或图片报告与定时推送。
|
|
4
|
+
|
|
5
|
+
## 依赖
|
|
6
|
+
|
|
7
|
+
- **收件箱**:需在主配置中启用 `inbox.enabled` 与 `database`,否则无法读取历史消息。
|
|
8
|
+
- **可选**:配置 `ai` 服务后可启用话题/金句/用户画像的 LLM 分析。
|
|
9
|
+
- **可选**:安装 `@zhin.js/plugin-html-renderer` 且配置 `outputFormat: "image"` 时可输出图片报告。
|
|
10
|
+
|
|
11
|
+
## 配置
|
|
12
|
+
|
|
13
|
+
在 `zhin.config.yml` 中:
|
|
14
|
+
|
|
15
|
+
```yaml
|
|
16
|
+
database: { dialect: sqlite, filename: ./data/db.sqlite }
|
|
17
|
+
inbox:
|
|
18
|
+
enabled: true
|
|
19
|
+
|
|
20
|
+
plugins:
|
|
21
|
+
- "@zhin.js/plugin-group-daily-analysis"
|
|
22
|
+
|
|
23
|
+
group-daily-analysis:
|
|
24
|
+
analysisDays: 1 # 默认分析最近天数
|
|
25
|
+
autoAnalysisEnabled: false # 是否定时自动分析
|
|
26
|
+
autoAnalysisCron: "0 9 * * *" # 每日 9 点
|
|
27
|
+
enabledGroups: [] # 群 ID 白名单(空表示不限制)
|
|
28
|
+
disabledGroups: [] # 群 ID 黑名单
|
|
29
|
+
outputFormat: "text" # text | image(image 需 html-renderer)
|
|
30
|
+
maxMessagesPerAnalysis: 500 # 单次分析最多使用的消息条数
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 命令
|
|
34
|
+
|
|
35
|
+
| 命令 | 说明 |
|
|
36
|
+
|------|------|
|
|
37
|
+
| `/群分析 [天数]` | 分析本群近期消息(默认 1 天),输出统计与可选 LLM 摘要 |
|
|
38
|
+
| `/分析设置 enable` | 为本群启用日常分析(用于定时任务) |
|
|
39
|
+
| `/分析设置 disable` | 为本群关闭日常分析 |
|
|
40
|
+
| `/分析设置 status` | 查看本群是否已启用分析 |
|
|
41
|
+
|
|
42
|
+
## 功能说明
|
|
43
|
+
|
|
44
|
+
- **基础统计**:消息总数、参与人数、总字数、最活跃时段、每小时消息分布。
|
|
45
|
+
- **LLM 分析**(需配置 ai):热门话题、金句筛选、用户称号/画像(灵感见下)。
|
|
46
|
+
- **报告格式**:`outputFormat: "text"` 为纯文本;`"image"` 时尝试用 html-renderer 出图,失败则回退文本。
|
|
47
|
+
- **定时任务**:`autoAnalysisEnabled: true` 时按 `autoAnalysisCron` 执行;仅对「已启用分析」的群(分析设置 enable 或位于白名单)推送。
|
|
48
|
+
|
|
49
|
+
## 灵感与参考
|
|
50
|
+
|
|
51
|
+
本插件的功能与设计参考了以下项目,在此致谢:
|
|
52
|
+
|
|
53
|
+
- **[astrbot_plugin_qq_group_daily_analysis](https://github.com/SXP-Simon/astrbot_plugin_qq_group_daily_analysis)**
|
|
54
|
+
AstrBot 的群聊日常分析插件(Python)。本插件中的**话题提取、金句识别、用户画像/称号**等分析思路与交互设计借鉴自该项目。
|
|
55
|
+
|
|
56
|
+
- **[openmcp-tutorial / qq-group-summary](https://github.com/LSTM-Kirigaya/openmcp-tutorial/tree/main/qq-group-summary)**
|
|
57
|
+
原 AstrBot 插件 README 中注明的灵感来源之一。
|
|
58
|
+
|
|
59
|
+
在源码中,与上述参考相关的逻辑已用注释标明「灵感来自 astrbot_plugin_qq_group_daily_analysis」。
|
|
60
|
+
|
|
61
|
+
## License
|
|
62
|
+
|
|
63
|
+
MIT
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 群日常分析:从收件箱查询、基础统计、文本报告。
|
|
3
|
+
* 数据源为 zhin 内置 unified_inbox_message 表(需 inbox.enabled)。
|
|
4
|
+
*
|
|
5
|
+
* 话题/金句/用户画像分析逻辑灵感来自:
|
|
6
|
+
* https://github.com/SXP-Simon/astrbot_plugin_qq_group_daily_analysis
|
|
7
|
+
*/
|
|
8
|
+
export interface InboxMessageRow {
|
|
9
|
+
id?: number;
|
|
10
|
+
adapter: string;
|
|
11
|
+
bot_id: string;
|
|
12
|
+
channel_id: string;
|
|
13
|
+
channel_type: string;
|
|
14
|
+
sender_id: string;
|
|
15
|
+
sender_name: string | null;
|
|
16
|
+
content: string;
|
|
17
|
+
/** 收件箱里可能是字符串,也可能被 ORM/驱动解析成对象 */
|
|
18
|
+
raw: unknown;
|
|
19
|
+
created_at: number;
|
|
20
|
+
}
|
|
21
|
+
export interface BasicStats {
|
|
22
|
+
messageCount: number;
|
|
23
|
+
participantCount: number;
|
|
24
|
+
totalChars: number;
|
|
25
|
+
hourlyDistribution: Record<number, number>;
|
|
26
|
+
mostActiveHour: number;
|
|
27
|
+
}
|
|
28
|
+
/** 话题摘要(灵感来自 astrbot_plugin_qq_group_daily_analysis) */
|
|
29
|
+
export interface SummaryTopic {
|
|
30
|
+
topic: string;
|
|
31
|
+
summary?: string;
|
|
32
|
+
}
|
|
33
|
+
/** 金句(灵感来自 astrbot_plugin_qq_group_daily_analysis) */
|
|
34
|
+
export interface GoldenQuote {
|
|
35
|
+
content: string;
|
|
36
|
+
sender: string;
|
|
37
|
+
reason: string;
|
|
38
|
+
}
|
|
39
|
+
/** 用户称号/画像(灵感来自 astrbot_plugin_qq_group_daily_analysis) */
|
|
40
|
+
export interface UserTitle {
|
|
41
|
+
name: string;
|
|
42
|
+
user_id: string;
|
|
43
|
+
title: string;
|
|
44
|
+
reason?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface LLMAnalysis {
|
|
47
|
+
topics: SummaryTopic[];
|
|
48
|
+
quotes: GoldenQuote[];
|
|
49
|
+
userTitles: UserTitle[];
|
|
50
|
+
}
|
|
51
|
+
export interface AnalysisResult {
|
|
52
|
+
stats: BasicStats;
|
|
53
|
+
textReport: string;
|
|
54
|
+
llm?: LLMAnalysis;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 从 content (JSON) 或 raw 提取纯文本,用于统计与 LLM
|
|
58
|
+
*/
|
|
59
|
+
export declare function extractText(row: InboxMessageRow): string;
|
|
60
|
+
/**
|
|
61
|
+
* 计算基础统计:消息数、人数、总字数、按小时分布、最活跃时段
|
|
62
|
+
*/
|
|
63
|
+
export declare function computeBasicStats(rows: InboxMessageRow[]): BasicStats;
|
|
64
|
+
/**
|
|
65
|
+
* 生成纯文本报告(不含 LLM 内容)
|
|
66
|
+
*/
|
|
67
|
+
export declare function formatTextReport(stats: BasicStats, options: {
|
|
68
|
+
channelName?: string;
|
|
69
|
+
days: number;
|
|
70
|
+
startDate: string;
|
|
71
|
+
endDate: string;
|
|
72
|
+
}): string;
|
|
73
|
+
/**
|
|
74
|
+
* 将 LLM 分析结果追加到文本报告。
|
|
75
|
+
* 话题/金句/用户画像 设计灵感来自 astrbot_plugin_qq_group_daily_analysis
|
|
76
|
+
*/
|
|
77
|
+
export declare function appendLLMReport(textReport: string, llm: LLMAnalysis): string;
|
|
78
|
+
/**
|
|
79
|
+
* 从 LLM 返回的文本中解析出 topics / quotes / userTitles。
|
|
80
|
+
* 约定 LLM 返回 JSON 或类似结构,此处做宽松解析。
|
|
81
|
+
*/
|
|
82
|
+
export declare function parseLLMResponse(raw: string): LLMAnalysis;
|
|
83
|
+
//# sourceMappingURL=analysis.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,GAAG,EAAE,OAAO,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,sDAAsD;AACtD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,2DAA2D;AAC3D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,WAAW,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CA2BxD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,UAAU,CA+BrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClF,MAAM,CAqBR;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,MAAM,CAuB5E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAiCzD"}
|
package/lib/analysis.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 群日常分析:从收件箱查询、基础统计、文本报告。
|
|
3
|
+
* 数据源为 zhin 内置 unified_inbox_message 表(需 inbox.enabled)。
|
|
4
|
+
*
|
|
5
|
+
* 话题/金句/用户画像分析逻辑灵感来自:
|
|
6
|
+
* https://github.com/SXP-Simon/astrbot_plugin_qq_group_daily_analysis
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* 从 content (JSON) 或 raw 提取纯文本,用于统计与 LLM
|
|
10
|
+
*/
|
|
11
|
+
export function extractText(row) {
|
|
12
|
+
const raw = row.raw;
|
|
13
|
+
if (typeof raw === "string") {
|
|
14
|
+
const t = raw.trim();
|
|
15
|
+
if (t)
|
|
16
|
+
return t;
|
|
17
|
+
}
|
|
18
|
+
// 非字符串 raw(如 icqq 存的对象)不走 trim,避免报错;改从 content 解析
|
|
19
|
+
try {
|
|
20
|
+
const c = row.content;
|
|
21
|
+
const contentStr = typeof c === "string" ? c : JSON.stringify(c ?? []);
|
|
22
|
+
const content = JSON.parse(contentStr || "[]");
|
|
23
|
+
if (typeof content === "string")
|
|
24
|
+
return content;
|
|
25
|
+
if (Array.isArray(content)) {
|
|
26
|
+
return content
|
|
27
|
+
.map((part) => {
|
|
28
|
+
if (part?.type === "text") {
|
|
29
|
+
return part.data?.text ?? part.text ?? "";
|
|
30
|
+
}
|
|
31
|
+
return part?.text ?? "";
|
|
32
|
+
})
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.join("");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// ignore
|
|
39
|
+
}
|
|
40
|
+
return "";
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 计算基础统计:消息数、人数、总字数、按小时分布、最活跃时段
|
|
44
|
+
*/
|
|
45
|
+
export function computeBasicStats(rows) {
|
|
46
|
+
const participantIds = new Set();
|
|
47
|
+
let totalChars = 0;
|
|
48
|
+
const hourly = {};
|
|
49
|
+
for (let h = 0; h < 24; h++)
|
|
50
|
+
hourly[h] = 0;
|
|
51
|
+
for (const row of rows) {
|
|
52
|
+
participantIds.add(row.sender_id);
|
|
53
|
+
const text = extractText(row);
|
|
54
|
+
totalChars += text.length;
|
|
55
|
+
const date = new Date(row.created_at);
|
|
56
|
+
const h = date.getHours();
|
|
57
|
+
hourly[h] = (hourly[h] || 0) + 1;
|
|
58
|
+
}
|
|
59
|
+
let mostActiveHour = 0;
|
|
60
|
+
let maxCount = 0;
|
|
61
|
+
for (let h = 0; h < 24; h++) {
|
|
62
|
+
if (hourly[h] > maxCount) {
|
|
63
|
+
maxCount = hourly[h];
|
|
64
|
+
mostActiveHour = h;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
messageCount: rows.length,
|
|
69
|
+
participantCount: participantIds.size,
|
|
70
|
+
totalChars,
|
|
71
|
+
hourlyDistribution: hourly,
|
|
72
|
+
mostActiveHour,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 生成纯文本报告(不含 LLM 内容)
|
|
77
|
+
*/
|
|
78
|
+
export function formatTextReport(stats, options) {
|
|
79
|
+
const lines = [];
|
|
80
|
+
const title = options.channelName
|
|
81
|
+
? `【${options.channelName}】群日常分析`
|
|
82
|
+
: "群日常分析";
|
|
83
|
+
lines.push(`📊 ${title}`);
|
|
84
|
+
lines.push(`📅 统计区间:${options.startDate} 至 ${options.endDate}(最近 ${options.days} 天)`);
|
|
85
|
+
lines.push("");
|
|
86
|
+
lines.push(`💬 消息总数:${stats.messageCount} 条`);
|
|
87
|
+
lines.push(`👥 参与人数:${stats.participantCount} 人`);
|
|
88
|
+
lines.push(`📝 总字数:${stats.totalChars} 字`);
|
|
89
|
+
lines.push(`⏰ 最活跃时段:${stats.mostActiveHour}:00 - ${stats.mostActiveHour + 1}:00`);
|
|
90
|
+
lines.push("");
|
|
91
|
+
lines.push("📈 每小时消息分布:");
|
|
92
|
+
const maxH = Math.max(...Object.values(stats.hourlyDistribution), 1);
|
|
93
|
+
for (let h = 0; h < 24; h++) {
|
|
94
|
+
const c = stats.hourlyDistribution[h] || 0;
|
|
95
|
+
const bar = "█".repeat(Math.round((c / maxH) * 10)) || "░";
|
|
96
|
+
lines.push(` ${String(h).padStart(2, "0")}:00 ${bar} ${c}`);
|
|
97
|
+
}
|
|
98
|
+
return lines.join("\n");
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 将 LLM 分析结果追加到文本报告。
|
|
102
|
+
* 话题/金句/用户画像 设计灵感来自 astrbot_plugin_qq_group_daily_analysis
|
|
103
|
+
*/
|
|
104
|
+
export function appendLLMReport(textReport, llm) {
|
|
105
|
+
const lines = [textReport, ""];
|
|
106
|
+
if (llm.topics?.length) {
|
|
107
|
+
lines.push("🔥 热门话题(LLM 提取):");
|
|
108
|
+
llm.topics.forEach((t, i) => {
|
|
109
|
+
lines.push(` ${i + 1}. ${t.topic}${t.summary ? ` — ${t.summary}` : ""}`);
|
|
110
|
+
});
|
|
111
|
+
lines.push("");
|
|
112
|
+
}
|
|
113
|
+
if (llm.quotes?.length) {
|
|
114
|
+
lines.push("💬 金句(LLM 筛选):");
|
|
115
|
+
llm.quotes.forEach((q, i) => {
|
|
116
|
+
lines.push(` ${i + 1}. 「${q.content}」 — ${q.sender}(${q.reason})`);
|
|
117
|
+
});
|
|
118
|
+
lines.push("");
|
|
119
|
+
}
|
|
120
|
+
if (llm.userTitles?.length) {
|
|
121
|
+
lines.push("👤 用户画像/称号(LLM):");
|
|
122
|
+
llm.userTitles.forEach((u, i) => {
|
|
123
|
+
lines.push(` ${i + 1}. ${u.name} — ${u.title}${u.reason ? `(${u.reason})` : ""}`);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return lines.join("\n");
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 从 LLM 返回的文本中解析出 topics / quotes / userTitles。
|
|
130
|
+
* 约定 LLM 返回 JSON 或类似结构,此处做宽松解析。
|
|
131
|
+
*/
|
|
132
|
+
export function parseLLMResponse(raw) {
|
|
133
|
+
const result = { topics: [], quotes: [], userTitles: [] };
|
|
134
|
+
try {
|
|
135
|
+
const trimmed = raw.trim();
|
|
136
|
+
const jsonMatch = trimmed.match(/\{[\s\S]*\}/);
|
|
137
|
+
if (jsonMatch) {
|
|
138
|
+
const obj = JSON.parse(jsonMatch[0]);
|
|
139
|
+
if (Array.isArray(obj.topics)) {
|
|
140
|
+
result.topics = obj.topics.map((t) => ({
|
|
141
|
+
topic: typeof t.topic === "string" ? t.topic : String(t.topic || ""),
|
|
142
|
+
summary: typeof t.summary === "string" ? t.summary : undefined,
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
if (Array.isArray(obj.quotes)) {
|
|
146
|
+
result.quotes = obj.quotes.map((q) => ({
|
|
147
|
+
content: String(q.content ?? ""),
|
|
148
|
+
sender: String(q.sender ?? ""),
|
|
149
|
+
reason: String(q.reason ?? ""),
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
if (Array.isArray(obj.user_titles)) {
|
|
153
|
+
result.userTitles = obj.user_titles.map((u) => ({
|
|
154
|
+
name: String(u.name ?? ""),
|
|
155
|
+
user_id: String(u.user_id ?? ""),
|
|
156
|
+
title: String(u.title ?? ""),
|
|
157
|
+
reason: typeof u.reason === "string" ? u.reason : undefined,
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// ignore parse errors
|
|
164
|
+
}
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=analysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analysis.js","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|