@zhin.js/plugin-group-suite 1.0.1 → 1.1.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.
Files changed (135) hide show
  1. package/README.md +42 -58
  2. package/agent/tools/group_announce.ts +12 -0
  3. package/commands/checkin.js +11 -0
  4. package/commands/checkin.ts +12 -0
  5. package/commands/forget.js +10 -0
  6. package/commands/forget.ts +12 -0
  7. package/commands/keyword-add/[keyword].js +16 -0
  8. package/commands/keyword-add/[keyword].ts +16 -0
  9. package/commands/keyword-list.js +14 -0
  10. package/commands/keyword-list.ts +14 -0
  11. package/commands/keyword-remove/[keyword].js +16 -0
  12. package/commands/keyword-remove/[keyword].ts +15 -0
  13. package/commands/mypoints.js +10 -0
  14. package/commands/mypoints.ts +12 -0
  15. package/commands/mystats.js +10 -0
  16. package/commands/mystats.ts +12 -0
  17. package/commands/rank.js +11 -0
  18. package/commands/rank.ts +12 -0
  19. package/commands/stats-rank.js +13 -0
  20. package/commands/stats-rank.ts +20 -0
  21. package/commands/stats-week.js +13 -0
  22. package/commands/stats-week.ts +20 -0
  23. package/commands/stats.js +14 -0
  24. package/commands/stats.ts +21 -0
  25. package/commands/teach-list/[[page]].js +13 -0
  26. package/commands/teach-list/[[page]].ts +14 -0
  27. package/commands/teach-regex.js +11 -0
  28. package/commands/teach-regex.ts +12 -0
  29. package/commands/teach.js +11 -0
  30. package/commands/teach.ts +12 -0
  31. package/lib/checkin-lib.d.ts +27 -0
  32. package/lib/checkin-lib.d.ts.map +1 -0
  33. package/lib/checkin-lib.js +134 -0
  34. package/lib/checkin-lib.js.map +1 -0
  35. package/lib/config.d.ts +4 -57
  36. package/lib/config.d.ts.map +1 -1
  37. package/lib/config.js +18 -40
  38. package/lib/config.js.map +1 -1
  39. package/lib/db-store.d.ts +12 -0
  40. package/lib/db-store.d.ts.map +1 -0
  41. package/lib/db-store.js +38 -0
  42. package/lib/db-store.js.map +1 -0
  43. package/lib/index.d.ts +9 -1
  44. package/lib/index.d.ts.map +1 -1
  45. package/lib/index.js +7 -29
  46. package/lib/index.js.map +1 -1
  47. package/lib/keyword-store.d.ts +6 -0
  48. package/lib/keyword-store.d.ts.map +1 -0
  49. package/lib/keyword-store.js +21 -0
  50. package/lib/keyword-store.js.map +1 -0
  51. package/lib/memory-store.d.ts +31 -0
  52. package/lib/memory-store.d.ts.map +1 -0
  53. package/lib/memory-store.js +63 -0
  54. package/lib/memory-store.js.map +1 -0
  55. package/lib/runtime-state.d.ts +25 -0
  56. package/lib/runtime-state.d.ts.map +1 -0
  57. package/lib/runtime-state.js +21 -0
  58. package/lib/runtime-state.js.map +1 -0
  59. package/lib/shared-runtime.d.ts +26 -0
  60. package/lib/shared-runtime.d.ts.map +1 -0
  61. package/lib/shared-runtime.js +34 -0
  62. package/lib/shared-runtime.js.map +1 -0
  63. package/lib/stats-lib.d.ts +41 -0
  64. package/lib/stats-lib.d.ts.map +1 -0
  65. package/lib/stats-lib.js +177 -0
  66. package/lib/stats-lib.js.map +1 -0
  67. package/lib/tables.d.ts +4 -0
  68. package/lib/tables.d.ts.map +1 -0
  69. package/lib/tables.js +40 -0
  70. package/lib/tables.js.map +1 -0
  71. package/lib/teach-lib.d.ts +25 -0
  72. package/lib/teach-lib.d.ts.map +1 -0
  73. package/lib/teach-lib.js +233 -0
  74. package/lib/teach-lib.js.map +1 -0
  75. package/middlewares/keyword-reply.js +36 -0
  76. package/middlewares/keyword-reply.ts +37 -0
  77. package/middlewares/stats-count.js +20 -0
  78. package/middlewares/stats-count.ts +22 -0
  79. package/middlewares/teach-reply.js +21 -0
  80. package/middlewares/teach-reply.ts +22 -0
  81. package/package.json +53 -14
  82. package/plugin.js +40 -0
  83. package/schema.json +17 -0
  84. package/src/checkin-lib.ts +165 -0
  85. package/src/config.ts +23 -57
  86. package/src/db-store.ts +51 -0
  87. package/src/index.ts +47 -33
  88. package/src/keyword-store.ts +24 -0
  89. package/src/memory-store.ts +90 -0
  90. package/src/runtime-state.ts +44 -0
  91. package/src/shared-runtime.ts +44 -0
  92. package/src/stats-lib.ts +205 -0
  93. package/src/tables.ts +46 -0
  94. package/src/teach-lib.ts +301 -0
  95. package/tools/checkin-query/handler.js +22 -0
  96. package/tools/checkin-query/handler.ts +2 -2
  97. package/tools/checkin-rank/handler.js +15 -0
  98. package/tools/checkin-rank/handler.ts +1 -1
  99. package/tools/stats-query/handler.js +28 -0
  100. package/tools/stats-query/handler.ts +2 -2
  101. package/tools/stats-user/handler.js +29 -0
  102. package/tools/stats-user/handler.ts +3 -2
  103. package/lib/admin.d.ts +0 -4
  104. package/lib/admin.d.ts.map +0 -1
  105. package/lib/admin.js +0 -123
  106. package/lib/admin.js.map +0 -1
  107. package/lib/checkin.d.ts +0 -5
  108. package/lib/checkin.d.ts.map +0 -1
  109. package/lib/checkin.js +0 -168
  110. package/lib/checkin.js.map +0 -1
  111. package/lib/daily-analysis.d.ts +0 -7
  112. package/lib/daily-analysis.d.ts.map +0 -1
  113. package/lib/daily-analysis.js +0 -334
  114. package/lib/daily-analysis.js.map +0 -1
  115. package/lib/shared.d.ts +0 -25
  116. package/lib/shared.d.ts.map +0 -1
  117. package/lib/shared.js +0 -40
  118. package/lib/shared.js.map +0 -1
  119. package/lib/stats.d.ts +0 -12
  120. package/lib/stats.d.ts.map +0 -1
  121. package/lib/stats.js +0 -256
  122. package/lib/stats.js.map +0 -1
  123. package/lib/teach.d.ts +0 -4
  124. package/lib/teach.d.ts.map +0 -1
  125. package/lib/teach.js +0 -294
  126. package/lib/teach.js.map +0 -1
  127. package/plugin.yml +0 -3
  128. package/src/admin.ts +0 -145
  129. package/src/checkin.ts +0 -196
  130. package/src/daily-analysis.ts +0 -458
  131. package/src/shared.ts +0 -51
  132. package/src/stats.ts +0 -297
  133. package/src/teach.ts +0 -307
  134. /package/{skills/checkin/SKILL.md → agent/skills/checkin.md} +0 -0
  135. /package/{skills/group-daily-analysis/SKILL.md → agent/skills/group-daily-analysis.md} +0 -0
@@ -0,0 +1,134 @@
1
+ import { getCheckinModel } from './db-store.js';
2
+ import { randomInt, resolveContextKey, resolveSender, todayStr, ts, yesterdayStr, } from './shared-runtime.js';
3
+ async function getOrCreateUser(model, userId, userName, ctxType, ctxId) {
4
+ const rows = (await model.select().where({
5
+ user_id: userId,
6
+ context_type: ctxType,
7
+ context_id: ctxId,
8
+ }));
9
+ if (rows.length > 0)
10
+ return rows[0];
11
+ await model.insert({
12
+ user_id: userId,
13
+ user_name: userName,
14
+ points: 0,
15
+ total_checkins: 0,
16
+ streak: 0,
17
+ max_streak: 0,
18
+ last_checkin: '',
19
+ context_type: ctxType,
20
+ context_id: ctxId,
21
+ created_at: ts(),
22
+ updated_at: ts(),
23
+ });
24
+ const created = (await model.select().where({
25
+ user_id: userId,
26
+ context_type: ctxType,
27
+ context_id: ctxId,
28
+ }));
29
+ return created[0] ?? null;
30
+ }
31
+ /**
32
+ * 同一 user_id+context 的签到串行化(per-user promise 链),
33
+ * 避免 check-then-act 竞态导致连发两条都签到成功。
34
+ */
35
+ const checkinChains = new Map();
36
+ function serializedCheckin(key, task) {
37
+ const prev = checkinChains.get(key) ?? Promise.resolve();
38
+ const next = prev.then(task, task);
39
+ checkinChains.set(key, next);
40
+ return next.finally(() => {
41
+ if (checkinChains.get(key) === next)
42
+ checkinChains.delete(key);
43
+ });
44
+ }
45
+ export async function doCheckin(input, cfg, runtime) {
46
+ const M = getCheckinModel(runtime?.db);
47
+ if (!M)
48
+ return '签到数据库尚未就绪,请稍后重试';
49
+ const { id: userId, name: userName } = resolveSender(input);
50
+ if (!userId)
51
+ return '无法获取用户信息';
52
+ const { type: ctxType, id: ctxId } = resolveContextKey(input);
53
+ return serializedCheckin(`${userId}:${ctxType}:${ctxId}`, async () => {
54
+ const user = await getOrCreateUser(M, userId, userName, ctxType, ctxId);
55
+ if (!user)
56
+ return '签到失败,请重试';
57
+ const today = todayStr();
58
+ if (user.last_checkin === today) {
59
+ return `你今天已经签到过了哦~\n当前积分: ${user.points}\n连续签到: ${user.streak} 天`;
60
+ }
61
+ const isConsecutive = user.last_checkin === yesterdayStr();
62
+ const newStreak = isConsecutive ? Number(user.streak) + 1 : 1;
63
+ const base = randomInt(cfg.basePointsMin, cfg.basePointsMax);
64
+ const bonus = Math.min(newStreak * cfg.streakBonus, cfg.streakCap);
65
+ const earned = base + bonus;
66
+ const newPoints = Number(user.points || 0) + earned;
67
+ await M.update({
68
+ points: newPoints,
69
+ total_checkins: Number(user.total_checkins || 0) + 1,
70
+ streak: newStreak,
71
+ max_streak: Math.max(Number(user.max_streak || 0), newStreak),
72
+ last_checkin: today,
73
+ user_name: userName,
74
+ updated_at: ts(),
75
+ }).where({
76
+ user_id: userId,
77
+ context_type: ctxType,
78
+ context_id: ctxId,
79
+ });
80
+ const lines = [`签到成功!`, `基础积分: +${base}`];
81
+ if (bonus > 0)
82
+ lines.push(`连续奖励: +${bonus} (连续${newStreak}天)`);
83
+ lines.push(`本次获得: +${earned}`, `当前积分: ${newPoints}`);
84
+ return lines.join('\n');
85
+ });
86
+ }
87
+ export async function myPoints(input, runtime) {
88
+ const M = getCheckinModel(runtime?.db);
89
+ if (!M)
90
+ return '签到数据库尚未就绪';
91
+ const { id: userId } = resolveSender(input);
92
+ const { type: ctxType, id: ctxId } = resolveContextKey(input);
93
+ const rows = (await M.select().where({
94
+ user_id: userId,
95
+ context_type: ctxType,
96
+ context_id: ctxId,
97
+ }));
98
+ if (rows.length === 0)
99
+ return '你还没有签到记录哦,发送「checkin」开始吧!';
100
+ const u = rows[0];
101
+ const checkedToday = u.last_checkin === todayStr();
102
+ return [
103
+ `${u.user_name || '用户'} 的积分信息`,
104
+ `积分: ${u.points}`,
105
+ `累计签到: ${u.total_checkins} 天`,
106
+ `连续签到: ${u.streak} 天`,
107
+ `最长连续: ${u.max_streak} 天`,
108
+ checkedToday ? '今日已签到 ✓' : '今日未签到',
109
+ ].join('\n');
110
+ }
111
+ export async function pointsRank(input, cfg, runtime) {
112
+ const M = getCheckinModel(runtime?.db);
113
+ if (!M)
114
+ return '签到数据库尚未就绪';
115
+ const { type: ctxType, id: ctxId } = resolveContextKey(input);
116
+ const all = (await M.select().where(ctxType === 'global'
117
+ ? { context_type: 'global' }
118
+ : { context_type: ctxType, context_id: ctxId }));
119
+ if (all.length === 0)
120
+ return '还没有人签到过哦~';
121
+ const sorted = all.sort((a, b) => Number(b.points || 0) - Number(a.points || 0));
122
+ const top = sorted.slice(0, cfg.rankSize);
123
+ const medals = ['🥇', '🥈', '🥉'];
124
+ const lines = top.map((u, i) => {
125
+ const prefix = i < 3 ? medals[i] : `${i + 1}.`;
126
+ return `${prefix} ${u.user_name || u.user_id} — ${u.points}分 (${u.total_checkins}天)`;
127
+ });
128
+ const title = ctxType === 'group' ? '本群积分排行' : '全局积分排行';
129
+ const { id: userId } = resolveSender(input);
130
+ const myRank = sorted.findIndex((u) => u.user_id === userId);
131
+ const footer = myRank >= 0 ? `\n你的排名: 第${myRank + 1}名` : '';
132
+ return `${title}\n${lines.join('\n')}${footer}`;
133
+ }
134
+ //# sourceMappingURL=checkin-lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkin-lib.js","sourceRoot":"","sources":["../src/checkin-lib.ts"],"names":[],"mappings":"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"}
package/lib/config.d.ts CHANGED
@@ -1,68 +1,15 @@
1
- import { Schema } from "zhin.js";
2
- /** 扁平 groupSuite 配置(单层字段,默认值覆盖多数场景) */
3
- export declare const groupSuiteSchema: Schema<{
4
- welcome?: string | undefined;
5
- recallNotify?: boolean | undefined;
6
- keywordReply?: boolean | undefined;
7
- noticeAdapters?: string[] | undefined;
8
- basePointsMin?: number | undefined;
9
- basePointsMax?: number | undefined;
10
- streakBonus?: number | undefined;
11
- streakCap?: number | undefined;
12
- rankSize?: number | undefined;
13
- statsRetentionDays?: number | undefined;
14
- analysisDays?: number | undefined;
15
- autoAnalysisEnabled?: boolean | undefined;
16
- autoAnalysisCron?: string | undefined;
17
- analysisGroups?: string[] | undefined;
18
- analysisGroupsBlock?: string[] | undefined;
19
- analysisMaxMessages?: number | undefined;
20
- teachMaxPerGroup?: number | undefined;
21
- teachCooldownMs?: number | undefined;
22
- teachAllowRegex?: boolean | undefined;
23
- teachPageSize?: number | undefined;
24
- }, {
25
- welcome?: string | undefined;
26
- recallNotify?: boolean | undefined;
27
- keywordReply?: boolean | undefined;
28
- noticeAdapters?: string[] | undefined;
29
- basePointsMin?: number | undefined;
30
- basePointsMax?: number | undefined;
31
- streakBonus?: number | undefined;
32
- streakCap?: number | undefined;
33
- rankSize?: number | undefined;
34
- statsRetentionDays?: number | undefined;
35
- analysisDays?: number | undefined;
36
- autoAnalysisEnabled?: boolean | undefined;
37
- autoAnalysisCron?: string | undefined;
38
- analysisGroups?: string[] | undefined;
39
- analysisGroupsBlock?: string[] | undefined;
40
- analysisMaxMessages?: number | undefined;
41
- teachMaxPerGroup?: number | undefined;
42
- teachCooldownMs?: number | undefined;
43
- teachAllowRegex?: boolean | undefined;
44
- teachPageSize?: number | undefined;
45
- }>;
46
- export type GroupSuiteConfig = {
47
- welcome: string;
48
- recallNotify: boolean;
1
+ export interface GroupSuiteConfig {
49
2
  keywordReply: boolean;
50
- noticeAdapters: string[];
51
3
  basePointsMin: number;
52
4
  basePointsMax: number;
53
5
  streakBonus: number;
54
6
  streakCap: number;
55
7
  rankSize: number;
56
- statsRetentionDays: number;
57
- analysisDays: number;
58
- autoAnalysisEnabled: boolean;
59
- autoAnalysisCron: string;
60
- analysisGroups: string[];
61
- analysisGroupsBlock: string[];
62
- analysisMaxMessages: number;
63
8
  teachMaxPerGroup: number;
64
9
  teachCooldownMs: number;
65
10
  teachAllowRegex: boolean;
66
11
  teachPageSize: number;
67
- };
12
+ }
13
+ export declare const DEFAULT_GROUP_SUITE_CONFIG: GroupSuiteConfig;
14
+ export declare function resolveGroupSuiteConfig(raw: Partial<GroupSuiteConfig> | undefined): GroupSuiteConfig;
68
15
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,uCAAuC;AACvC,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyC3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,0BAA0B,EAAE,gBAWxC,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,SAAS,GACzC,gBAAgB,CAKlB"}
package/lib/config.js CHANGED
@@ -1,41 +1,19 @@
1
- import { Schema } from "zhin.js";
2
- /** 扁平 groupSuite 配置(单层字段,默认值覆盖多数场景) */
3
- export const groupSuiteSchema = Schema.object({
4
- welcome: Schema.string()
5
- .default("欢迎新成员加入本群!")
6
- .description("入群欢迎语"),
7
- recallNotify: Schema.boolean()
8
- .default(true)
9
- .description("群消息撤回时是否提示"),
10
- keywordReply: Schema.boolean()
11
- .default(false)
12
- .description("内置关键词回复(默认关闭,用 teach 问答)"),
13
- noticeAdapters: Schema.list(Schema.string())
14
- .default(["icqq"])
15
- .description("处理 notice 的适配器(欢迎/撤回)"),
16
- basePointsMin: Schema.number().default(10).min(1).max(100),
17
- basePointsMax: Schema.number().default(30).min(1).max(200),
18
- streakBonus: Schema.number().default(5).min(0).max(100),
19
- streakCap: Schema.number().default(50).min(0).max(500),
20
- rankSize: Schema.number()
21
- .default(10)
22
- .min(3)
23
- .max(50)
24
- .description("签到排行与消息统计排行显示人数"),
25
- statsRetentionDays: Schema.number().default(90).min(7).max(365),
26
- analysisDays: Schema.number().default(1).min(1).max(30),
27
- autoAnalysisEnabled: Schema.boolean().default(false),
28
- autoAnalysisCron: Schema.string().default("0 9 * * *"),
29
- analysisGroups: Schema.list(Schema.string())
30
- .default([])
31
- .description("启用群日报的群 ID 白名单(空=不限制)"),
32
- analysisGroupsBlock: Schema.list(Schema.string())
33
- .default([])
34
- .description("禁用群日报的群 ID"),
35
- analysisMaxMessages: Schema.number().default(500).min(100).max(5000),
36
- teachMaxPerGroup: Schema.number().default(200).min(1).max(1000),
37
- teachCooldownMs: Schema.number().default(3000).min(0).max(60000),
38
- teachAllowRegex: Schema.boolean().default(true),
39
- teachPageSize: Schema.number().default(10).min(5).max(50),
40
- });
1
+ export const DEFAULT_GROUP_SUITE_CONFIG = {
2
+ keywordReply: false,
3
+ basePointsMin: 10,
4
+ basePointsMax: 30,
5
+ streakBonus: 5,
6
+ streakCap: 50,
7
+ rankSize: 10,
8
+ teachMaxPerGroup: 200,
9
+ teachCooldownMs: 3000,
10
+ teachAllowRegex: true,
11
+ teachPageSize: 10,
12
+ };
13
+ export function resolveGroupSuiteConfig(raw) {
14
+ return {
15
+ ...DEFAULT_GROUP_SUITE_CONFIG,
16
+ ...raw,
17
+ };
18
+ }
41
19
  //# sourceMappingURL=config.js.map
package/lib/config.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,0BAA0B,GAAqB;IAC1D,YAAY,EAAE,KAAK;IACnB,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,EAAE;IACZ,gBAAgB,EAAE,GAAG;IACrB,eAAe,EAAE,IAAI;IACrB,eAAe,EAAE,IAAI;IACrB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF,MAAM,UAAU,uBAAuB,CACrC,GAA0C;IAE1C,OAAO;QACL,GAAG,0BAA0B;QAC7B,GAAG,GAAG;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type GroupSuiteMemoryDb, type GroupSuiteModel } from './memory-store.js';
2
+ /** Ensure an in-memory store when Runtime DatabaseFeature Resource is not wired yet. */
3
+ export declare function ensureGroupSuiteMemoryDb(): GroupSuiteMemoryDb;
4
+ export declare function getGroupSuiteDb(): GroupSuiteMemoryDb | null;
5
+ export declare function setGroupSuiteDb(db: GroupSuiteMemoryDb | null): void;
6
+ export declare function registerGroupSuiteDb(db: GroupSuiteMemoryDb): () => void;
7
+ /** Test helper: clear module store. */
8
+ export declare function resetGroupSuiteDb(): void;
9
+ export declare function getCheckinModel(db?: GroupSuiteMemoryDb | null): GroupSuiteModel | null;
10
+ export declare function getTeachModel(db?: GroupSuiteMemoryDb | null): GroupSuiteModel | null;
11
+ export declare function getStatsModel(db?: GroupSuiteMemoryDb | null): GroupSuiteModel | null;
12
+ //# sourceMappingURL=db-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-store.d.ts","sourceRoot":"","sources":["../src/db-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAK3B,wFAAwF;AACxF,wBAAgB,wBAAwB,IAAI,kBAAkB,CAG7D;AAED,wBAAgB,eAAe,IAAI,kBAAkB,GAAG,IAAI,CAE3D;AAED,wBAAgB,eAAe,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAEnE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,kBAAkB,GAAG,MAAM,IAAI,CAOvE;AAED,uCAAuC;AACvC,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,eAAe,CAAC,EAAE,4BAAoB,GAAG,eAAe,GAAG,IAAI,CAE9E;AAED,wBAAgB,aAAa,CAAC,EAAE,4BAAoB,GAAG,eAAe,GAAG,IAAI,CAE5E;AAED,wBAAgB,aAAa,CAAC,EAAE,4BAAoB,GAAG,eAAe,GAAG,IAAI,CAE5E"}
@@ -0,0 +1,38 @@
1
+ import { CHECKIN_TABLE, createInMemoryGroupSuiteDb, STATS_TABLE, TEACH_TABLE, } from './memory-store.js';
2
+ let _db = null;
3
+ const registrations = [];
4
+ /** Ensure an in-memory store when Runtime DatabaseFeature Resource is not wired yet. */
5
+ export function ensureGroupSuiteMemoryDb() {
6
+ if (!_db)
7
+ _db = createInMemoryGroupSuiteDb();
8
+ return _db;
9
+ }
10
+ export function getGroupSuiteDb() {
11
+ return registrations[registrations.length - 1]?.value ?? ensureGroupSuiteMemoryDb();
12
+ }
13
+ export function setGroupSuiteDb(db) {
14
+ _db = db;
15
+ }
16
+ export function registerGroupSuiteDb(db) {
17
+ const registration = Object.freeze({ value: db });
18
+ registrations.push(registration);
19
+ return () => {
20
+ const index = registrations.lastIndexOf(registration);
21
+ if (index >= 0)
22
+ registrations.splice(index, 1);
23
+ };
24
+ }
25
+ /** Test helper: clear module store. */
26
+ export function resetGroupSuiteDb() {
27
+ _db = null;
28
+ }
29
+ export function getCheckinModel(db = getGroupSuiteDb()) {
30
+ return db?.models.get(CHECKIN_TABLE) ?? null;
31
+ }
32
+ export function getTeachModel(db = getGroupSuiteDb()) {
33
+ return db?.models.get(TEACH_TABLE) ?? null;
34
+ }
35
+ export function getStatsModel(db = getGroupSuiteDb()) {
36
+ return db?.models.get(STATS_TABLE) ?? null;
37
+ }
38
+ //# sourceMappingURL=db-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-store.js","sourceRoot":"","sources":["../src/db-store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,0BAA0B,EAC1B,WAAW,EACX,WAAW,GAGZ,MAAM,mBAAmB,CAAC;AAE3B,IAAI,GAAG,GAA8B,IAAI,CAAC;AAC1C,MAAM,aAAa,GAAkD,EAAE,CAAC;AAExE,wFAAwF;AACxF,MAAM,UAAU,wBAAwB;IACtC,IAAI,CAAC,GAAG;QAAE,GAAG,GAAG,0BAA0B,EAAE,CAAC;IAC7C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,wBAAwB,EAAE,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAA6B;IAC3D,GAAG,GAAG,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,EAAsB;IACzD,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAClD,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjC,OAAO,GAAG,EAAE;QACV,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,KAAK,IAAI,CAAC;YAAE,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC;AACJ,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,iBAAiB;IAC/B,GAAG,GAAG,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAE,GAAG,eAAe,EAAE;IACpD,OAAO,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,GAAG,eAAe,EAAE;IAClD,OAAO,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAE,GAAG,eAAe,EAAE;IAClD,OAAO,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC"}
package/lib/index.d.ts CHANGED
@@ -1,2 +1,10 @@
1
- export {};
1
+ export { DEFAULT_GROUP_SUITE_CONFIG, resolveGroupSuiteConfig, } from './config.js';
2
+ export type { GroupSuiteConfig } from './config.js';
3
+ export { doCheckin, myPoints, pointsRank } from './checkin-lib.js';
4
+ export { addKeyword, listKeywords, matchKeyword, removeKeyword, resetKeywords, } from './keyword-store.js';
5
+ export { ensureGroupSuiteMemoryDb, getCheckinModel, getGroupSuiteDb, getStatsModel, getTeachModel, resetGroupSuiteDb, registerGroupSuiteDb, setGroupSuiteDb, } from './db-store.js';
6
+ export { createGroupSuiteRuntime, groupSuiteRuntimeToken, resolveGroupSuiteRuntime, } from './runtime-state.js';
7
+ export type { GroupSuiteRuntime, PendingStatsIncrement } from './runtime-state.js';
8
+ export { parseTeachPair, resetTeachCooldown, teachAdd, teachForget, teachList, tryTeachReply, } from './teach-lib.js';
9
+ export { flushStatsBuffer, monthStartStr, myStatsText, queryStats, recordMessage, resetStatsBuffer, statsRankText, weekStartStr, } from './stats-lib.js';
2
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EACL,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC"}
package/lib/index.js CHANGED
@@ -1,30 +1,8 @@
1
- /**
2
- * @zhin.js/plugin-group-suite
3
- *
4
- * ```yaml
5
- * plugins:
6
- * - "@zhin.js/plugin-group-suite"
7
- * inbox:
8
- * enabled: true
9
- * groupSuite:
10
- * noticeAdapters: [icqq]
11
- * autoAnalysisEnabled: true
12
- * ```
13
- */
14
- import { formatCompact, usePlugin } from "zhin.js";
15
- import { groupSuiteSchema } from "./config.js";
16
- import { registerAdmin } from "./admin.js";
17
- import { registerCheckin } from "./checkin.js";
18
- import { registerDailyAnalysis } from "./daily-analysis.js";
19
- import { registerStats } from "./stats.js";
20
- import { registerTeach } from "./teach.js";
21
- const plugin = usePlugin();
22
- const { logger, declareConfig } = plugin;
23
- const cfg = declareConfig("groupSuite", groupSuiteSchema);
24
- registerAdmin(plugin, cfg);
25
- registerCheckin(plugin, cfg);
26
- registerStats(plugin, cfg);
27
- registerDailyAnalysis(plugin, cfg);
28
- registerTeach(plugin, cfg);
29
- logger.info(formatCompact({ 模块: "群组套件", 状态: "已加载" }));
1
+ export { DEFAULT_GROUP_SUITE_CONFIG, resolveGroupSuiteConfig, } from './config.js';
2
+ export { doCheckin, myPoints, pointsRank } from './checkin-lib.js';
3
+ export { addKeyword, listKeywords, matchKeyword, removeKeyword, resetKeywords, } from './keyword-store.js';
4
+ export { ensureGroupSuiteMemoryDb, getCheckinModel, getGroupSuiteDb, getStatsModel, getTeachModel, resetGroupSuiteDb, registerGroupSuiteDb, setGroupSuiteDb, } from './db-store.js';
5
+ export { createGroupSuiteRuntime, groupSuiteRuntimeToken, resolveGroupSuiteRuntime, } from './runtime-state.js';
6
+ export { parseTeachPair, resetTeachCooldown, teachAdd, teachForget, teachList, tryTeachReply, } from './teach-lib.js';
7
+ export { flushStatsBuffer, monthStartStr, myStatsText, queryStats, recordMessage, resetStatsBuffer, statsRankText, weekStartStr, } from './stats-lib.js';
30
8
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;AAEzC,MAAM,GAAG,GAAG,aAAa,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;AAE1D,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC3B,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC7B,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC3B,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACnC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE3B,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EACL,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,aAAa,GACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function addKeyword(keyword: string, reply: string, store?: Map<string, string>): void;
2
+ export declare function removeKeyword(keyword: string, store?: Map<string, string>): boolean;
3
+ export declare function listKeywords(store?: Map<string, string>): Array<[string, string]>;
4
+ export declare function matchKeyword(text: string, store?: Map<string, string>): string | null;
5
+ export declare function resetKeywords(): void;
6
+ //# sourceMappingURL=keyword-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyword-store.d.ts","sourceRoot":"","sources":["../src/keyword-store.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,sBAAW,GAAG,IAAI,CAEjF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,sBAAW,GAAG,OAAO,CAExE;AAED,wBAAgB,YAAY,CAAC,KAAK,sBAAW,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAEtE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,sBAAW,GAAG,MAAM,GAAG,IAAI,CAK1E;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
@@ -0,0 +1,21 @@
1
+ const keywords = new Map();
2
+ export function addKeyword(keyword, reply, store = keywords) {
3
+ store.set(keyword, reply);
4
+ }
5
+ export function removeKeyword(keyword, store = keywords) {
6
+ return store.delete(keyword);
7
+ }
8
+ export function listKeywords(store = keywords) {
9
+ return Array.from(store.entries());
10
+ }
11
+ export function matchKeyword(text, store = keywords) {
12
+ for (const [keyword, reply] of store) {
13
+ if (text.includes(keyword))
14
+ return reply;
15
+ }
16
+ return null;
17
+ }
18
+ export function resetKeywords() {
19
+ keywords.clear();
20
+ }
21
+ //# sourceMappingURL=keyword-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyword-store.js","sourceRoot":"","sources":["../src/keyword-store.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,KAAa,EAAE,KAAK,GAAG,QAAQ;IACzE,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,KAAK,GAAG,QAAQ;IAC7D,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAK,GAAG,QAAQ;IAC3C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAK,GAAG,QAAQ;IACzD,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,KAAK,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * In-memory group-suite models (slice-2) until Plugin Runtime DatabaseFeature Resource lands.
3
+ *
4
+ * 模型表面与 `@zhin.js/plugin-runtime` 的 DatabaseHostModel 结构兼容
5
+ * (where 返回 PromiseLike,host 侧是链式 Selection),
6
+ * plugin.ts 可把 PluginDatabaseHost 直接当 GroupSuiteMemoryDb 用。
7
+ */
8
+ export type GroupSuiteRow = Record<string, unknown>;
9
+ export interface GroupSuiteModel {
10
+ select: (...fields: string[]) => {
11
+ where: (query: Record<string, unknown>) => PromiseLike<GroupSuiteRow[]>;
12
+ then: <TResult1 = GroupSuiteRow[], TResult2 = never>(onfulfilled?: ((value: GroupSuiteRow[]) => TResult1 | PromiseLike<TResult1>) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null) => Promise<TResult1 | TResult2>;
13
+ };
14
+ insert: (row: Record<string, unknown>) => Promise<unknown>;
15
+ delete: () => {
16
+ where: (query: Record<string, unknown>) => Promise<unknown>;
17
+ };
18
+ update: (patch: Record<string, unknown>) => {
19
+ where: (query: Record<string, unknown>) => Promise<unknown>;
20
+ };
21
+ }
22
+ export interface GroupSuiteMemoryDb {
23
+ models: {
24
+ get: (name: string) => GroupSuiteModel | undefined;
25
+ };
26
+ }
27
+ export declare const CHECKIN_TABLE = "checkin_records";
28
+ export declare const TEACH_TABLE = "teach_qa";
29
+ export declare const STATS_TABLE = "message_stats";
30
+ export declare function createInMemoryGroupSuiteDb(): GroupSuiteMemoryDb;
31
+ //# sourceMappingURL=memory-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.d.ts","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK;QAC/B,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,WAAW,CAAC,aAAa,EAAE,CAAC,CAAC;QACxE,IAAI,EAAE,CAAC,QAAQ,GAAG,aAAa,EAAE,EAAE,QAAQ,GAAG,KAAK,EACjD,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EACnF,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,KACxE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;KACnC,CAAC;IACF,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,EAAE,MAAM;QAAE,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAC9E,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK;QAC1C,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC7D,CAAC;CACH;AA6CD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QACN,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,GAAG,SAAS,CAAC;KACpD,CAAC;CACH;AAED,eAAO,MAAM,aAAa,oBAAoB,CAAC;AAC/C,eAAO,MAAM,WAAW,aAAa,CAAC;AACtC,eAAO,MAAM,WAAW,kBAAkB,CAAC;AAE3C,wBAAgB,0BAA0B,IAAI,kBAAkB,CAW/D"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * In-memory group-suite models (slice-2) until Plugin Runtime DatabaseFeature Resource lands.
3
+ *
4
+ * 模型表面与 `@zhin.js/plugin-runtime` 的 DatabaseHostModel 结构兼容
5
+ * (where 返回 PromiseLike,host 侧是链式 Selection),
6
+ * plugin.ts 可把 PluginDatabaseHost 直接当 GroupSuiteMemoryDb 用。
7
+ */
8
+ function createMemoryModel() {
9
+ const rows = [];
10
+ let nextId = 1;
11
+ function matches(row, query) {
12
+ return Object.entries(query).every(([key, value]) => row[key] === value);
13
+ }
14
+ function all() {
15
+ return rows.map((row) => ({ ...row }));
16
+ }
17
+ return {
18
+ select: () => {
19
+ const promise = Promise.resolve(all());
20
+ return {
21
+ where: async (query) => rows.filter((row) => matches(row, query)).map((row) => ({ ...row })),
22
+ then: (onfulfilled, onrejected) => promise.then(onfulfilled, onrejected),
23
+ };
24
+ },
25
+ insert: async (row) => {
26
+ const withId = { id: String(nextId++), ...row };
27
+ rows.push(withId);
28
+ return { ...withId };
29
+ },
30
+ delete: () => ({
31
+ where: async (query) => {
32
+ for (let i = rows.length - 1; i >= 0; i -= 1) {
33
+ if (matches(rows[i], query))
34
+ rows.splice(i, 1);
35
+ }
36
+ },
37
+ }),
38
+ update: (patch) => ({
39
+ where: async (query) => {
40
+ for (const row of rows) {
41
+ if (matches(row, query))
42
+ Object.assign(row, patch);
43
+ }
44
+ },
45
+ }),
46
+ };
47
+ }
48
+ export const CHECKIN_TABLE = 'checkin_records';
49
+ export const TEACH_TABLE = 'teach_qa';
50
+ export const STATS_TABLE = 'message_stats';
51
+ export function createInMemoryGroupSuiteDb() {
52
+ const models = new Map([
53
+ [CHECKIN_TABLE, createMemoryModel()],
54
+ [TEACH_TABLE, createMemoryModel()],
55
+ [STATS_TABLE, createMemoryModel()],
56
+ ]);
57
+ return {
58
+ models: {
59
+ get: (name) => models.get(name),
60
+ },
61
+ };
62
+ }
63
+ //# sourceMappingURL=memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAmBH,SAAS,iBAAiB;IACxB,MAAM,IAAI,GAAoB,EAAE,CAAC;IACjC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,SAAS,OAAO,CAAC,GAA4B,EAAE,KAA8B;QAC3E,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC;IAC3E,CAAC;IAED,SAAS,GAAG;QACV,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,OAAO;QACL,MAAM,EAAE,GAAG,EAAE;YACX,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACvC,OAAO;gBACL,KAAK,EAAE,KAAK,EAAE,KAA8B,EAAE,EAAE,CAC9C,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;gBACtE,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC;aACzE,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAA4B,EAAE,EAAE;YAC7C,MAAM,MAAM,GAAkB,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC;YAC/D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClB,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACb,KAAK,EAAE,KAAK,EAAE,KAA8B,EAAE,EAAE;gBAC9C,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAE,EAAE,KAAK,CAAC;wBAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;SACF,CAAC;QACF,MAAM,EAAE,CAAC,KAA8B,EAAE,EAAE,CAAC,CAAC;YAC3C,KAAK,EAAE,KAAK,EAAE,KAA8B,EAAE,EAAE;gBAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;wBAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;SACF,CAAC;KACH,CAAC;AACJ,CAAC;AAQD,MAAM,CAAC,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAC/C,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;AAE3C,MAAM,UAAU,0BAA0B;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,CAA0B;QAC9C,CAAC,aAAa,EAAE,iBAAiB,EAAE,CAAC;QACpC,CAAC,WAAW,EAAE,iBAAiB,EAAE,CAAC;QAClC,CAAC,WAAW,EAAE,iBAAiB,EAAE,CAAC;KACnC,CAAC,CAAC;IACH,OAAO;QACL,MAAM,EAAE;YACN,GAAG,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;SACxC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type Token } from 'zhin.js';
2
+ import type { GroupSuiteMemoryDb } from './memory-store.js';
3
+ export interface PendingStatsIncrement {
4
+ user_id: string;
5
+ user_name: string;
6
+ group_id: string;
7
+ date: string;
8
+ count: number;
9
+ }
10
+ /** All mutable state owned by one group-suite plugin instance. */
11
+ export interface GroupSuiteRuntime {
12
+ readonly db: GroupSuiteMemoryDb;
13
+ readonly keywords: Map<string, string>;
14
+ readonly teachCooldowns: Map<string, number>;
15
+ readonly statsBuffer: Map<string, PendingStatsIncrement>;
16
+ }
17
+ export declare const groupSuiteRuntimeToken: Token<GroupSuiteRuntime>;
18
+ export declare function createGroupSuiteRuntime(db: GroupSuiteMemoryDb): GroupSuiteRuntime;
19
+ export declare function resolveGroupSuiteRuntime(context: {
20
+ owner?: {
21
+ id?: unknown;
22
+ };
23
+ use<T>(token: Token<T>): T;
24
+ }): GroupSuiteRuntime | undefined;
25
+ //# sourceMappingURL=runtime-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-state.d.ts","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,kBAAkB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CAC1D;AAED,eAAO,MAAM,sBAAsB,0BAGlC,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,kBAAkB,GAAG,iBAAiB,CAOjF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,KAAK,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACzB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CAC5B,GAAG,iBAAiB,GAAG,SAAS,CAOhC"}
@@ -0,0 +1,21 @@
1
+ import { createToken } from 'zhin.js';
2
+ export const groupSuiteRuntimeToken = createToken('zhin.group-suite.runtime', 'Owner-scoped Group Suite database and ephemeral state');
3
+ export function createGroupSuiteRuntime(db) {
4
+ return {
5
+ db,
6
+ keywords: new Map(),
7
+ teachCooldowns: new Map(),
8
+ statsBuffer: new Map(),
9
+ };
10
+ }
11
+ export function resolveGroupSuiteRuntime(context) {
12
+ try {
13
+ return context.use(groupSuiteRuntimeToken);
14
+ }
15
+ catch (error) {
16
+ if (context.owner?.id)
17
+ throw error;
18
+ return undefined;
19
+ }
20
+ }
21
+ //# sourceMappingURL=runtime-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-state.js","sourceRoot":"","sources":["../src/runtime-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAc,MAAM,SAAS,CAAC;AAmBlD,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAC/C,0BAA0B,EAC1B,uDAAuD,CACxD,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,EAAsB;IAC5D,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,IAAI,GAAG,EAAE;QACnB,cAAc,EAAE,IAAI,GAAG,EAAE;QACzB,WAAW,EAAE,IAAI,GAAG,EAAE;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAGxC;IACC,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE;YAAE,MAAM,KAAK,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}