koishi-plugin-group-analysis-mx 1.0.1

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.
Files changed (94) hide show
  1. package/lib/config.d.ts +53 -0
  2. package/lib/config.d.ts.map +1 -0
  3. package/lib/config.js +376 -0
  4. package/lib/config.js.map +1 -0
  5. package/lib/cron.d.ts +8 -0
  6. package/lib/cron.d.ts.map +1 -0
  7. package/lib/cron.js +62 -0
  8. package/lib/cron.js.map +1 -0
  9. package/lib/index.d.ts +6 -0
  10. package/lib/index.d.ts.map +1 -0
  11. package/lib/index.js +51 -0
  12. package/lib/index.js.map +1 -0
  13. package/lib/onebot/cqcode.d.ts +14 -0
  14. package/lib/onebot/cqcode.d.ts.map +1 -0
  15. package/lib/onebot/cqcode.js +92 -0
  16. package/lib/onebot/cqcode.js.map +1 -0
  17. package/lib/plugin.d.ts +4 -0
  18. package/lib/plugin.d.ts.map +1 -0
  19. package/lib/plugin.js +41 -0
  20. package/lib/plugin.js.map +1 -0
  21. package/lib/plugins/command.d.ts +9 -0
  22. package/lib/plugins/command.d.ts.map +1 -0
  23. package/lib/plugins/command.js +196 -0
  24. package/lib/plugins/command.js.map +1 -0
  25. package/lib/service/analysis.d.ts +48 -0
  26. package/lib/service/analysis.d.ts.map +1 -0
  27. package/lib/service/analysis.js +714 -0
  28. package/lib/service/analysis.js.map +1 -0
  29. package/lib/service/llm.d.ts +43 -0
  30. package/lib/service/llm.d.ts.map +1 -0
  31. package/lib/service/llm.js +160 -0
  32. package/lib/service/llm.js.map +1 -0
  33. package/lib/service/message.d.ts +55 -0
  34. package/lib/service/message.d.ts.map +1 -0
  35. package/lib/service/message.js +527 -0
  36. package/lib/service/message.js.map +1 -0
  37. package/lib/service/renderer.d.ts +23 -0
  38. package/lib/service/renderer.d.ts.map +1 -0
  39. package/lib/service/renderer.js +298 -0
  40. package/lib/service/renderer.js.map +1 -0
  41. package/lib/skins/anime.d.ts +19 -0
  42. package/lib/skins/anime.d.ts.map +1 -0
  43. package/lib/skins/anime.js +138 -0
  44. package/lib/skins/anime.js.map +1 -0
  45. package/lib/skins/art.d.ts +19 -0
  46. package/lib/skins/art.d.ts.map +1 -0
  47. package/lib/skins/art.js +146 -0
  48. package/lib/skins/art.js.map +1 -0
  49. package/lib/skins/index.d.ts +50 -0
  50. package/lib/skins/index.d.ts.map +1 -0
  51. package/lib/skins/index.js +84 -0
  52. package/lib/skins/index.js.map +1 -0
  53. package/lib/skins/md3.d.ts +19 -0
  54. package/lib/skins/md3.d.ts.map +1 -0
  55. package/lib/skins/md3.js +147 -0
  56. package/lib/skins/md3.js.map +1 -0
  57. package/lib/skins/newspaper.d.ts +19 -0
  58. package/lib/skins/newspaper.d.ts.map +1 -0
  59. package/lib/skins/newspaper.js +141 -0
  60. package/lib/skins/newspaper.js.map +1 -0
  61. package/lib/skins/scrapbook.d.ts +20 -0
  62. package/lib/skins/scrapbook.d.ts.map +1 -0
  63. package/lib/skins/scrapbook.js +207 -0
  64. package/lib/skins/scrapbook.js.map +1 -0
  65. package/lib/skins/types.d.ts +69 -0
  66. package/lib/skins/types.d.ts.map +1 -0
  67. package/lib/skins/types.js +12 -0
  68. package/lib/skins/types.js.map +1 -0
  69. package/lib/types.d.ts +170 -0
  70. package/lib/types.d.ts.map +1 -0
  71. package/lib/types.js +3 -0
  72. package/lib/types.js.map +1 -0
  73. package/lib/utils.d.ts +55 -0
  74. package/lib/utils.d.ts.map +1 -0
  75. package/lib/utils.js +334 -0
  76. package/lib/utils.js.map +1 -0
  77. package/package.json +48 -0
  78. package/resources/anime/css/template_group.css +470 -0
  79. package/resources/anime/images/decoration_br.svg +19 -0
  80. package/resources/anime/images/decoration_tl.svg +24 -0
  81. package/resources/anime/template_group.html +108 -0
  82. package/resources/anime/template_user.html +99 -0
  83. package/resources/art/css/template_group.css +484 -0
  84. package/resources/art/template_group.html +77 -0
  85. package/resources/art/template_user.html +63 -0
  86. package/resources/md3/css/template_group.css +880 -0
  87. package/resources/md3/template_group.html +189 -0
  88. package/resources/md3/template_user.html +175 -0
  89. package/resources/newspaper/css/template_group.css +568 -0
  90. package/resources/newspaper/template_group.html +133 -0
  91. package/resources/newspaper/template_user.html +119 -0
  92. package/resources/scrapbook/css/style.css +1094 -0
  93. package/resources/scrapbook/template_group.html +115 -0
  94. package/resources/scrapbook/template_user.html +119 -0
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScrapbookSkinRenderer = void 0;
4
+ const types_1 = require("./types");
5
+ /**
6
+ * Scrapbook Skin Renderer
7
+ * Ported from AstrBot's scrapbook template.
8
+ * Features a hand-drawn, colorful, and playful aesthetic.
9
+ */
10
+ class ScrapbookSkinRenderer {
11
+ id = 'scrapbook';
12
+ name = 'Scrapbook';
13
+ containerSelector = '.container';
14
+ formatUserStats(userStats) {
15
+ // The scrapbook design doesn't have a dedicated user stats section like rankings in the main view
16
+ // It relies on "User Titles" (Portraits) for user display.
17
+ // If we need to display a simple list, we can implement it, but standard AstrBot scrapbook doesn't seem to have a plain ranking list.
18
+ // We will return empty or a simple hidden block to satisfy the interface.
19
+ return '';
20
+ }
21
+ formatGoldenQuotes(quotes) {
22
+ if (!quotes || quotes.length === 0) {
23
+ return '';
24
+ }
25
+ const itemsHtml = quotes
26
+ .map((quote) => `
27
+ <div class="quote-wrapper">
28
+ <div class="q-flex-container">
29
+ <div class="q-user-col">
30
+ </div>
31
+
32
+ <div class="q-content-col">
33
+ <div class="q-sender-name">${quote.sender}</div>
34
+ <div class="q-bubble">
35
+ <div class="q-quote-mark">"</div>
36
+ <div class="q-content">${quote.content}</div>
37
+ </div>
38
+ <div class="q-analysis-note">
39
+ <span class="note-label">🤣👉 AI 锐评:</span>
40
+ ${quote.reason}
41
+ </div>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ `)
46
+ .join('');
47
+ return `
48
+ <div class="quotes-section">
49
+ <div class="section-title" style="justify-content: center;">
50
+ <svg class="doodle" viewBox="0 0 24 24">
51
+ <path d="M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z" />
52
+ </svg>
53
+ 群贤毕至 Bible Quotes
54
+ </div>
55
+ ${itemsHtml}
56
+ </div>
57
+ `;
58
+ }
59
+ formatUserTitles(userTitles) {
60
+ if (!userTitles || userTitles.length === 0) {
61
+ return '';
62
+ }
63
+ const itemsHtml = userTitles
64
+ .map((title) => `
65
+ <div class="user-card">
66
+ <div class="card-tape"></div>
67
+ <div class="user-header">
68
+ <div class="u-avatar">
69
+ <img src="${(0, types_1.getAvatarUrl)(title.id)}" alt="头像" style="width: 100%; height: 100%; object-fit: cover;">
70
+ </div>
71
+ <div class="u-info">
72
+ <div class="u-name">${title.name}</div>
73
+ <div class="badges">
74
+ <span class="badge title">${title.title}</span>
75
+ ${title.mbti && title.mbti !== 'N/A' ? `<span class="badge mbti">${title.mbti}</span>` : ''}
76
+ </div>
77
+ </div>
78
+ </div>
79
+ <div class="u-reason">
80
+ ${title.reason}
81
+ </div>
82
+ </div>
83
+ `)
84
+ .join('');
85
+ return `
86
+ <div class="user-section">
87
+ <div class="section-title" style="justify-content: center;">
88
+ <svg class="doodle" viewBox="0 0 24 24">
89
+ <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" />
90
+ </svg>
91
+ 群友画像 Portraits
92
+ </div>
93
+ <div class="masonry-grid">
94
+ ${itemsHtml}
95
+ </div>
96
+ </div>
97
+ `;
98
+ }
99
+ formatTopics(topics) {
100
+ if (!topics || topics.length === 0) {
101
+ return '';
102
+ }
103
+ const itemsHtml = topics
104
+ .map((topic, index) => {
105
+ const indexStr = String(index + 1).padStart(2, '0');
106
+ return `
107
+ <div class="topic-item">
108
+ <div class="check-box">
109
+ <div class="check-tick"></div>
110
+ </div>
111
+ <div class="topic-content">
112
+ <div style="display: flex; align-items: baseline; gap: 10px; margin-bottom: 8px;">
113
+ <span class="topic-title">${topic.topic}</span>
114
+ <span style="font-size: 0.85em; color: #999; font-family: var(--font-body);">#${indexStr}</span>
115
+ </div>
116
+ <div style="font-family: var(--font-hand); font-size: 1.05em; color: var(--ink-secondary); margin-bottom: 8px;">
117
+ 🙋‍♀️ 参与者: ${topic.contributors.join(', ')}
118
+ </div>
119
+ <div class="topic-detail">${topic.detail}</div>
120
+ </div>
121
+ </div>
122
+ `;
123
+ })
124
+ .join('');
125
+ return `
126
+ <div class="topic-section">
127
+ <div class="paper-holes">
128
+ <div class="hole"></div>
129
+ <div class="hole"></div>
130
+ <div class="hole"></div>
131
+ </div>
132
+ <div class="section-title">
133
+ <svg class="doodle" viewBox="0 0 24 24">
134
+ <path d="M14 17H4v2h10v-2zm6-8H4v2h16V9zM4 15h16v-2H4v2zM4 5v2h16V5H4z" />
135
+ </svg>
136
+ 今日话题 Topics
137
+ </div>
138
+ ${itemsHtml}
139
+ </div>
140
+ `;
141
+ }
142
+ formatTags(tags) {
143
+ if (!tags || tags.length === 0)
144
+ return '';
145
+ const colors = ['c1', 'c2', 'c3', 'c4'];
146
+ return tags.map((tag, i) => {
147
+ const colorClass = colors[i % colors.length];
148
+ return `<div class="washi-tape-tag ${colorClass}">${tag}</div>`;
149
+ }).join('');
150
+ }
151
+ formatEvidence(evidence) {
152
+ if (!evidence || evidence.length === 0)
153
+ return '<div class="empty-state">暂无证据</div>';
154
+ return evidence.map((item, index) => {
155
+ // Random rotation between -3 and 3 degrees
156
+ const rot = (Math.random() * 6 - 3).toFixed(1) + 'deg';
157
+ return `
158
+ <div class="evidence-card-pin" style="--rot: ${rot};">
159
+ ${item}
160
+ </div>
161
+ `;
162
+ }).join('');
163
+ }
164
+ generateActiveHoursChart(activeHours) {
165
+ const items = [];
166
+ let maxCount = 0;
167
+ for (const count of Object.values(activeHours)) {
168
+ if (count > maxCount)
169
+ maxCount = count;
170
+ }
171
+ for (let i = 0; i < 24; i++) {
172
+ const count = activeHours[i] || 0;
173
+ const percentage = maxCount > 0 ? (count / maxCount) * 100 : 0;
174
+ let colorVar = 'var(--color-purple)';
175
+ // Min height 4px to show the bar even if small
176
+ let height = `max(4px, ${percentage}%)`;
177
+ if (count === 0) {
178
+ height = '0px';
179
+ }
180
+ else if (percentage >= 70) {
181
+ colorVar = 'var(--accent-orange)';
182
+ }
183
+ else if (percentage >= 30) {
184
+ colorVar = 'var(--color-green)';
185
+ }
186
+ else {
187
+ colorVar = 'var(--color-blue)';
188
+ }
189
+ // Add a class to conditionally show values if count > 0
190
+ const columnClass = count > 0 ? 'chart-column show-value' : 'chart-column';
191
+ items.push(`
192
+ <div class="${columnClass}" title="${String(i).padStart(2, '0')}:00 - ${count}条">
193
+ <div class="bar-value-top">${count > 0 ? count : ''}</div>
194
+ <div class="bar-vertical" style="height: ${height}; background: ${colorVar};"></div>
195
+ <div class="bar-label-x">${String(i).padStart(2, '0')}</div>
196
+ </div>
197
+ `);
198
+ }
199
+ return `
200
+ <div class="chart-container-horizontal">
201
+ ${items.join('')}
202
+ </div>
203
+ `;
204
+ }
205
+ }
206
+ exports.ScrapbookSkinRenderer = ScrapbookSkinRenderer;
207
+ //# sourceMappingURL=scrapbook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrapbook.js","sourceRoot":"","sources":["../../src/skins/scrapbook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { GroupAnalysisResult, UserPersonaProfile, UserStats } from '../types';
2
+ /**
3
+ * Skin renderer interface
4
+ * Each skin must implement these methods to render different components
5
+ */
6
+ export interface SkinRenderer {
7
+ /**
8
+ * Skin identifier (e.g., 'md3', 'anime')
9
+ */
10
+ readonly id: string;
11
+ /**
12
+ * Human-readable skin name
13
+ */
14
+ readonly name: string;
15
+ /**
16
+ * CSS selector for the main container element to screenshot
17
+ * This is used by Puppeteer to find the element to capture
18
+ */
19
+ readonly containerSelector: string;
20
+ /**
21
+ * Format user statistics list
22
+ * @param userStats Array of user statistics
23
+ * @returns HTML string
24
+ */
25
+ formatUserStats(userStats: UserStats[]): string;
26
+ /**
27
+ * Format golden quotes section
28
+ * @param quotes Array of golden quotes
29
+ * @returns HTML string
30
+ */
31
+ formatGoldenQuotes(quotes: GroupAnalysisResult['goldenQuotes']): string;
32
+ /**
33
+ * Format user titles section
34
+ * @param userTitles Array of user titles
35
+ * @returns HTML string
36
+ */
37
+ formatUserTitles(userTitles: GroupAnalysisResult['userTitles']): string;
38
+ /**
39
+ * Format topics section
40
+ * @param topics Array of discussion topics
41
+ * @returns HTML string
42
+ */
43
+ formatTopics(topics: GroupAnalysisResult['topics']): string;
44
+ /**
45
+ * Generate active hours chart
46
+ * @param activeHours Record mapping hour (0-23) to message count
47
+ * @returns HTML string
48
+ */
49
+ generateActiveHoursChart(activeHours: Record<number, number>): string;
50
+ /**
51
+ * Format tags for user persona (optional)
52
+ * @param tags Array of tags
53
+ * @returns HTML string
54
+ */
55
+ formatTags?(tags: string[] | undefined): string;
56
+ /**
57
+ * Format evidence for user persona (optional)
58
+ * @param evidence Array of evidence strings
59
+ * @returns HTML string
60
+ */
61
+ formatEvidence?(evidence: UserPersonaProfile['evidence']): string;
62
+ }
63
+ /**
64
+ * Get avatar URL for a user
65
+ * @param userId User ID (QQ number)
66
+ * @returns Avatar URL
67
+ */
68
+ export declare function getAvatarUrl(userId: number | string): string;
69
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skins/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,EAAgB,MAAM,UAAU,CAAA;AAE3F;;;GAGG;AACH,MAAM,WAAW,YAAY;IACzB;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAElC;;;;OAIG;IACH,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,CAAA;IAE/C;;;;OAIG;IACH,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,CAAC,cAAc,CAAC,GAAG,MAAM,CAAA;IAEvE;;;;OAIG;IACH,gBAAgB,CAAC,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,GAAG,MAAM,CAAA;IAEvE;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAA;IAE3D;;;;OAIG;IACH,wBAAwB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IAErE;;;;OAIG;IACH,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAAA;IAE/C;;;;OAIG;IACH,cAAc,CAAC,CAAC,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,GAAG,MAAM,CAAA;CACpE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE5D"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAvatarUrl = getAvatarUrl;
4
+ /**
5
+ * Get avatar URL for a user
6
+ * @param userId User ID (QQ number)
7
+ * @returns Avatar URL
8
+ */
9
+ function getAvatarUrl(userId) {
10
+ return `http://q1.qlogo.cn/g?b=qq&nk=${userId}&s=640`;
11
+ }
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/skins/types.ts"],"names":[],"mappings":";;AA8EA,oCAEC;AAPD;;;;GAIG;AACH,SAAgB,YAAY,CAAC,MAAuB;IAChD,OAAO,gCAAgC,MAAM,QAAQ,CAAA;AACzD,CAAC"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,170 @@
1
+ import { h } from "koishi";
2
+ export interface OneBotMessage {
3
+ message_id: number;
4
+ message_seq: number;
5
+ time: number;
6
+ message: string | OneBotMessageType[];
7
+ raw_message: string;
8
+ sender: {
9
+ user_id: number;
10
+ nickname: string;
11
+ card?: string;
12
+ };
13
+ }
14
+ export interface OneBotMessageType {
15
+ type: string;
16
+ data: Record<string, string>;
17
+ }
18
+ export interface UserStats {
19
+ userId: string;
20
+ nickname: string;
21
+ messageCount: number;
22
+ charCount: number;
23
+ lastActive: Date;
24
+ avatar?: string;
25
+ replyCount: number;
26
+ emojiRatio: number;
27
+ atCount: number;
28
+ emojiStats: Record<string, number>;
29
+ nightRatio: number;
30
+ avgChars: number;
31
+ replyRatio: number;
32
+ nightMessages: number;
33
+ activeHours: Record<number, number>;
34
+ }
35
+ export interface SummaryTopic {
36
+ topic: string;
37
+ contributors: string[];
38
+ detail: string;
39
+ }
40
+ export interface UserTitle {
41
+ name: string;
42
+ id: number;
43
+ title: string;
44
+ mbti: string;
45
+ reason: string;
46
+ avatar?: string;
47
+ }
48
+ export interface GoldenQuote {
49
+ content: string;
50
+ sender: string;
51
+ reason: string;
52
+ }
53
+ export interface UserPersonaProfile {
54
+ userId: string;
55
+ username: string;
56
+ summary: string;
57
+ keyTraits: string[];
58
+ interests: string[];
59
+ communicationStyle: string;
60
+ analysisDate?: string;
61
+ evidence: string[];
62
+ lastMergedFromHistory?: boolean;
63
+ }
64
+ export interface GroupAnalysisResult {
65
+ totalMessages: number;
66
+ totalChars: number;
67
+ totalParticipants: number;
68
+ emojiCount: number;
69
+ mostActiveUser: UserStats | null;
70
+ mostActivePeriod: string;
71
+ userStats: UserStats[];
72
+ topics: SummaryTopic[];
73
+ userTitles: UserTitle[];
74
+ goldenQuotes: GoldenQuote[];
75
+ activeHoursChart: string;
76
+ activeHoursData: Record<number, number>;
77
+ analysisDate: string;
78
+ groupName: string;
79
+ }
80
+ export type QueryAction = '只分析' | '分析加对话' | '只对话';
81
+ export interface QueryTargetTime {
82
+ description?: string;
83
+ startTime?: string;
84
+ endTime?: string;
85
+ }
86
+ export interface QueryIntent {
87
+ action?: QueryAction;
88
+ keywords?: string[];
89
+ topics?: string[];
90
+ nicknames?: string[];
91
+ targetTime?: QueryTargetTime;
92
+ query?: string;
93
+ }
94
+ export interface AnalysisPromptContext {
95
+ keywords?: string[];
96
+ topics?: string[];
97
+ nicknames?: string[];
98
+ query?: string;
99
+ timeRange?: {
100
+ start?: Date;
101
+ end?: Date;
102
+ description?: string;
103
+ };
104
+ }
105
+ export interface BasicStatsResult {
106
+ userStats: Record<string, UserStats>;
107
+ totalChars: number;
108
+ totalEmojiCount: number;
109
+ allMessagesText: string[];
110
+ }
111
+ export interface GroupMessageFetchFilter {
112
+ guildId?: string;
113
+ channelId?: string;
114
+ userId?: string[];
115
+ selfId?: string;
116
+ startTime?: string;
117
+ endTime?: string;
118
+ limit?: number;
119
+ offset?: number;
120
+ }
121
+ export interface MessageFilter {
122
+ guildId?: string;
123
+ channelId?: string;
124
+ userId?: string[];
125
+ selfId?: string;
126
+ startTime?: Date;
127
+ endTime?: Date;
128
+ limit?: number;
129
+ offset?: number;
130
+ purpose?: 'group-analysis' | 'user-persona' | 'general';
131
+ }
132
+ export interface StoredMessage {
133
+ id: string;
134
+ platform: string;
135
+ selfId: string;
136
+ channelId: string;
137
+ avatarUrl: string;
138
+ guildId?: string;
139
+ userId: string;
140
+ username: string;
141
+ content: string;
142
+ timestamp: Date;
143
+ messageId?: string;
144
+ elements?: h[];
145
+ }
146
+ export interface ActivityStats {
147
+ windowStart: number;
148
+ count: number;
149
+ }
150
+ export interface PersistenceBuffer {
151
+ messages: StoredMessage[];
152
+ lastMessageAt: number;
153
+ }
154
+ export interface PersonaRecord {
155
+ id: string;
156
+ platform: string;
157
+ selfId: string;
158
+ userId: string;
159
+ username: string;
160
+ roles: string[];
161
+ persona?: string;
162
+ lastAnalysisAt?: Date;
163
+ updatedAt?: Date;
164
+ }
165
+ export interface PersonaCache {
166
+ record: PersonaRecord;
167
+ pendingMessages: number;
168
+ parsedPersona?: UserPersonaProfile | null;
169
+ }
170
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/lib/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/lib/utils.d.ts ADDED
@@ -0,0 +1,55 @@
1
+ import { Context } from 'koishi';
2
+ import { BasicStatsResult, GroupAnalysisResult, StoredMessage, UserPersonaProfile, UserStats } from './types';
3
+ import { Config } from './config';
4
+ import type { OneBotBot } from 'koishi-plugin-adapter-onebot';
5
+ export declare function calculateBasicStats(messages: StoredMessage[]): BasicStatsResult;
6
+ export declare function buildPersonaRecordId(platform: string, selfId: string, userId: string | number): string;
7
+ export declare function generateTextReport(result: GroupAnalysisResult): string;
8
+ export declare function getAvatarUrl(userId: number | string): string;
9
+ export declare function formatUserStats(userStats: UserStats[], skin?: string): string;
10
+ export declare function formatGoldenQuotes(quotes: GroupAnalysisResult['goldenQuotes'], skin?: string): string;
11
+ export declare function formatUserTitles(userTitles: GroupAnalysisResult['userTitles'], skin?: string): string;
12
+ export declare function formatTopics(topics: GroupAnalysisResult['topics'], skin?: string): string;
13
+ export declare function generateActiveHoursChart(activeHours: Record<number, number>, skin?: string): string;
14
+ export declare function renderTemplate(template: string, data: Record<string, string>): string;
15
+ export declare function shouldListenToMessage(session: {
16
+ guildId?: string;
17
+ channelId?: string;
18
+ platform: string;
19
+ selfId: string;
20
+ }, listenerGroups: {
21
+ enabled: boolean;
22
+ platform: string;
23
+ selfId: string;
24
+ channelId: string;
25
+ guildId?: string;
26
+ }[], enableAllGroupsByDefault?: boolean): boolean;
27
+ export declare function inferPlatformInfo(filter: {
28
+ guildId?: string;
29
+ channelId?: string;
30
+ }, listenerGroups: Config['listenerGroups']): {
31
+ platform?: string;
32
+ guildId?: string;
33
+ channelId?: string;
34
+ selfId?: string;
35
+ };
36
+ export declare function getStartTimeByDays(days: number): Date;
37
+ export declare function normalizeArray(value: string[] | string | '无' | undefined): string[];
38
+ export declare function preferArray(primary?: string[] | null, fallback?: string[] | null): string[];
39
+ export declare function finalizePersonaList(list: string[]): string[] | '无';
40
+ export declare function normalizePersonaText(text: string | undefined): string;
41
+ export declare function formatMessagesForPersona(messages: StoredMessage[]): string;
42
+ export declare function formatPersonaForPrompt(persona?: UserPersonaProfile | null): string;
43
+ export declare function mergePersona(previous: UserPersonaProfile | null | undefined, current: UserPersonaProfile): UserPersonaProfile;
44
+ export declare function isCacheExpiredByDays(lastAnalysisAt: Date | undefined, ttlDays: number): boolean;
45
+ export declare function isCacheExpiredByMinutes(lastAnalysisAt: Date | undefined, ttlMinutes: number): boolean;
46
+ export declare function buildGroupAnalysisCacheKey(selfId: string, target: {
47
+ guildId?: string;
48
+ channelId?: string;
49
+ }, days: number): string;
50
+ export declare function buildMessagePersistenceKey(message: StoredMessage): string;
51
+ export declare function isNapCatBot(bot: OneBotBot<Context>): Promise<{
52
+ isRunningNapCat: boolean;
53
+ botAppName: string;
54
+ }>;
55
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}