@zhin.js/plugin-reminder 1.0.1 → 1.0.3

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.
@@ -0,0 +1,128 @@
1
+ import { reminderActor } from './caller.js';
2
+ import { reminderServiceToken } from './runtime.js';
3
+ import { ReminderInputError } from './service.js';
4
+ import { ReminderTimeInputError, parseNaturalReminderTime, formatReminderTime } from './natural-time.js';
5
+ const STEP_TIMEOUT = 60_000;
6
+ const FLOW_TIMEOUT = 3 * STEP_TIMEOUT;
7
+ const TIMEOUT_TEXT = '提醒输入超时,未创建提醒;请重新执行 remind create。';
8
+ class ReminderCreationCancelled extends Error {
9
+ }
10
+ class ReminderCreationDeadline extends Error {
11
+ }
12
+ class ReminderPreviewDeliveryError extends Error {
13
+ }
14
+ /** Personal reminder entry: no persistence is touched before explicit confirmation. */
15
+ export async function createPersonalReminder(context, parameters) {
16
+ if (!context.input?.sender?.id || !context.interaction || !context.input.$replyFrom && !context.input.$reply)
17
+ return '请在真实聊天会话中使用此指令;需要发送者身份和交互能力,未创建提醒。';
18
+ const deadline = Date.now() + FLOW_TIMEOUT;
19
+ let creating = false;
20
+ try {
21
+ const actor = reminderActor(context.input);
22
+ const interaction = context.interaction;
23
+ const timezone = context.config.timezone;
24
+ const steps = new Map();
25
+ const invocationHead = /^(.*?remind)\s+create(?:\s|$)/iu.exec(context.input.content.trim())?.[1];
26
+ const isCommand = (value) => /^[!/#.]?remind\s+(?:create|after|at|every|list|cancel)(?:\s|$)/iu.test(value)
27
+ || !!invocationHead && value.startsWith(`${invocationHead} `);
28
+ const checkDeadline = () => {
29
+ context.signal.throwIfAborted();
30
+ if (Date.now() >= deadline)
31
+ throw new ReminderCreationDeadline();
32
+ };
33
+ const checkCancel = (value) => {
34
+ if (/^(?:取消|cancel)$/iu.test(value.trim()))
35
+ throw new ReminderCreationCancelled();
36
+ };
37
+ const ask = async (stage, title, description, maxLength) => {
38
+ checkDeadline();
39
+ const stepDeadline = steps.get(stage) ?? Date.now() + STEP_TIMEOUT;
40
+ steps.set(stage, stepDeadline);
41
+ const remaining = Math.min(deadline, stepDeadline) - Date.now();
42
+ if (remaining <= 0)
43
+ throw new ReminderCreationDeadline();
44
+ const answer = (await interaction.ask({ type: 'text', title, description,
45
+ tip: '直接回复内容,不加命令前缀;输入“取消”或 cancel 可退出。', maxLength,
46
+ timeout: remaining, timeoutText: TIMEOUT_TEXT, signal: context.signal,
47
+ })).trim();
48
+ checkDeadline();
49
+ checkCancel(answer);
50
+ return answer;
51
+ };
52
+ let expression = parameters.when?.trim();
53
+ if (expression)
54
+ checkCancel(expression);
55
+ let parsed;
56
+ let timeError = '';
57
+ while (!parsed) {
58
+ checkDeadline();
59
+ if (!expression)
60
+ expression = await ask('time', '什么时候提醒你?', [timeError, `按 ${timezone} 解析,例如“10分钟后”或“明天上午九点”;也可使用带 offset 的 ISO 时间。`].filter(Boolean).join('\n'), 200);
61
+ try {
62
+ parsed = parseNaturalReminderTime(expression, { now: Date.now(), timezone });
63
+ }
64
+ catch (error) {
65
+ if (!(error instanceof ReminderTimeInputError))
66
+ throw error;
67
+ timeError = error.message;
68
+ expression = undefined;
69
+ }
70
+ }
71
+ let text = parameters.text?.trim();
72
+ if (text)
73
+ checkCancel(text);
74
+ let textError = '';
75
+ while (!text || text.length > 500 || isCommand(text)) {
76
+ if (text)
77
+ textError = isCommand(text) ? '当前正在补全提醒;请直接回复正文,或先取消后重新发指令。' : '提醒正文须为 1–500 个字符。';
78
+ text = await ask('body', '提醒你做什么?', [textError, '请输入纯文字提醒正文(1–500 字)。'].filter(Boolean).join('\n'), 500);
79
+ }
80
+ const target = actor.target;
81
+ const scene = `${target.kind} ${target.id}${target.parent ? `;父容器 ${target.parent.kind} ${target.parent.id}` : ''}${target.threadId ? `;话题 ${target.threadId}` : ''}`;
82
+ const account = `${target.endpoint.adapter} / ${target.endpoint.id.replaceAll('\0', ' / ')}`;
83
+ const preview = `时间:${formatReminderTime(parsed.at, parsed.timezone)}\n原会话:${scene}\n账号:${account}\n正文(原样显示):\n${text}\n\n请等待下一条确认提示,再输入“确认”创建;不会更换目标会话。\n若确认后未收到创建结果,请先在原会话用 remind list 核对,不要直接重复创建。`;
84
+ checkDeadline();
85
+ // Canonical text avoids interpreting reminder content as Markdown/HTML in the prompt renderer.
86
+ const previewContent = { type: 'text', data: { text: preview } };
87
+ const receipt = context.input.$reply
88
+ ? await context.input.$reply(previewContent)
89
+ : await context.input.$replyFrom(context.owner.id, previewContent);
90
+ checkDeadline();
91
+ if (!receipt || typeof receipt !== 'object' || !('status' in receipt) || receipt.status !== 'sent')
92
+ throw new ReminderPreviewDeliveryError();
93
+ let confirmError = '';
94
+ while (true) {
95
+ const answer = await ask('confirmation', '确认创建这条提醒?', [confirmError, '请核对上一条预览的时间、时区、正文和原会话;仅输入“确认”才创建。'].filter(Boolean).join('\n'), 500);
96
+ if (answer === '确认')
97
+ break;
98
+ confirmError = '未创建提醒。请明确输入“确认”,或输入“取消”退出。';
99
+ }
100
+ checkDeadline();
101
+ if (parsed.at <= Date.now())
102
+ return '提醒时间已过,未创建提醒。请重新执行 remind create 并选择未来时间;不会自动顺延。';
103
+ const service = context.use(reminderServiceToken);
104
+ creating = true;
105
+ const task = await service.add(actor, text, parsed.at, null);
106
+ return `已创建个人提醒\n${service.describe(task)}`;
107
+ }
108
+ catch (error) {
109
+ if (error instanceof ReminderCreationCancelled)
110
+ return '已取消,未创建提醒。';
111
+ if (error instanceof ReminderInputError)
112
+ return `未创建提醒:${error.message}`;
113
+ if (creating)
114
+ return '提醒创建结果未能确认,请先使用 remind list 核对;不要直接重复创建。';
115
+ if (context.signal.aborted
116
+ || error instanceof Error && ['UserInteractionTimeoutError', 'UserInteractionSupersededError', 'AbortError'].includes(error.name))
117
+ return undefined;
118
+ if (error instanceof Error && /(?:retired|inactive generation|scope has ended)/iu.test(error.message))
119
+ return undefined;
120
+ // Core reports ask timeouts itself; this deadline can instead expire during preview delivery.
121
+ if (error instanceof ReminderCreationDeadline)
122
+ return TIMEOUT_TEXT;
123
+ if (error instanceof ReminderPreviewDeliveryError || error instanceof Error && error.name === 'UserInteractionDeliveryError')
124
+ return '提示消息未能确认送达,未创建提醒;请核对会话后重新执行,不会自动重发。';
125
+ throw error;
126
+ }
127
+ }
128
+ //# sourceMappingURL=create-reminder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-reminder.js","sourceRoot":"","sources":["../src/create-reminder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare class ReminderTimeInputError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ /** Parse a bounded, explicit grammar; this never reads the machine's default timezone. */
5
+ export declare function parseNaturalReminderTime(expression: string, options: {
6
+ now: number;
7
+ timezone: string;
8
+ }): {
9
+ at: number;
10
+ timezone: string;
11
+ expression: string;
12
+ };
13
+ /** Always show the resolved date, configured zone and its actual offset. */
14
+ export declare function formatReminderTime(at: number, timezone: string): string;
15
+ //# sourceMappingURL=natural-time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"natural-time.d.ts","sourceRoot":"","sources":["../src/natural-time.ts"],"names":[],"mappings":"AAEA,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAoBD,0FAA0F;AAC1F,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAmCtD;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQvE"}
@@ -0,0 +1,219 @@
1
+ import { MAX_DELAY_SECONDS, parseReminderInstant } from './timing.js';
2
+ export class ReminderTimeInputError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = 'ReminderTimeInputError';
6
+ }
7
+ }
8
+ const DAY = 86_400_000;
9
+ const MAX_DELAY = MAX_DELAY_SECONDS * 1000;
10
+ const NUMBER = '[0-9零〇一二两三四五六七八九十百千万]+';
11
+ const RELATIVE = new RegExp(`^(${NUMBER})\\s*(秒钟?|分钟?|小时|天)\\s*后$`, 'u');
12
+ const LOCAL = /^(今天|明天|后天)\s*(凌晨|上午|中午|下午|晚上)?\s*(.+)$/u;
13
+ const POINT = new RegExp(`^(${NUMBER})\\s*点(?:\\s*(半)|\\s*(${NUMBER})\\s*分(?:\\s*(${NUMBER})\\s*秒)?)?$`, 'u');
14
+ const DIGITS = '零一二三四五六七八九';
15
+ const HELP = '暂不支持这种时间表达,请使用“十分钟后”“明天九点半”或带时区 offset 的 ISO 时间;不支持每天、每周等日历周期';
16
+ /** Parse a bounded, explicit grammar; this never reads the machine's default timezone. */
17
+ export function parseNaturalReminderTime(expression, options) {
18
+ if (typeof expression !== 'string' || expression.length > 200)
19
+ fail('提醒时间须为不超过 200 个字符的文字');
20
+ const text = expression.trim();
21
+ if (!text || /\p{Cc}/u.test(expression))
22
+ fail('请在一行内输入提醒时间');
23
+ assertInstant(options.now);
24
+ const formatter = createFormatter(options.timezone);
25
+ let at;
26
+ if (/^\d{4}-/u.test(text)) {
27
+ try {
28
+ at = parseReminderInstant(text);
29
+ }
30
+ catch {
31
+ fail('绝对时间无效,请使用带 Z 或 ±hh:mm 的 ISO 时间,例如 2026-10-20T09:00:00+08:00');
32
+ }
33
+ }
34
+ else {
35
+ const relative = RELATIVE.exec(text);
36
+ if (relative) {
37
+ const amount = parseInteger(relative[1]);
38
+ const unit = relative[2];
39
+ const multiplier = unit.startsWith('秒') ? 1000 : unit.startsWith('分') ? 60_000 : unit === '小时' ? 3_600_000 : DAY;
40
+ at = options.now + amount * multiplier;
41
+ }
42
+ else {
43
+ const local = LOCAL.exec(text);
44
+ if (!local)
45
+ fail(HELP);
46
+ const current = partsAt(options.now, formatter);
47
+ const date = new Date(utc({ ...current, hour: 0, minute: 0, second: 0 }));
48
+ date.setUTCDate(date.getUTCDate() + (local[1] === '今天' ? 0 : local[1] === '明天' ? 1 : 2));
49
+ const clock = parseClock(local[3], local[2]);
50
+ const desired = { year: date.getUTCFullYear(), month: date.getUTCMonth() + 1,
51
+ day: date.getUTCDate(), ...clock };
52
+ at = localInstant(desired, formatter);
53
+ }
54
+ }
55
+ const delay = at - options.now;
56
+ if (delay > MAX_DELAY)
57
+ fail('提醒时间不能超过当前时间的 365 天后');
58
+ if (!Number.isSafeInteger(at) || !Number.isFinite(new Date(at).getTime()) || delay < 1000) {
59
+ fail('提醒时间须在当前时间至少 1 秒后;今天已过的时间不会自动改到明天,请重新指定日期');
60
+ }
61
+ return { at, timezone: options.timezone, expression: text };
62
+ }
63
+ /** Always show the resolved date, configured zone and its actual offset. */
64
+ export function formatReminderTime(at, timezone) {
65
+ assertInstant(at);
66
+ const formatter = createFormatter(timezone);
67
+ const local = partsAt(at, formatter);
68
+ const offset = offsetAt(at, formatter);
69
+ const seconds = Math.abs(offset) / 1000;
70
+ const offsetText = `${offset < 0 ? '-' : '+'}${pad(Math.floor(seconds / 3600))}:${pad(Math.floor(seconds / 60) % 60)}${seconds % 60 ? `:${pad(seconds % 60)}` : ''}`;
71
+ return `${String(local.year).padStart(4, '0')}-${pad(local.month)}-${pad(local.day)} ${pad(local.hour)}:${pad(local.minute)}:${pad(local.second)} UTC${offsetText} (${timezone})`;
72
+ }
73
+ function fail(message) { throw new ReminderTimeInputError(message); }
74
+ function pad(value) { return String(value).padStart(2, '0'); }
75
+ function assertInstant(value) {
76
+ if (!Number.isSafeInteger(value) || !Number.isFinite(new Date(value).getTime()))
77
+ fail('当前时间或提醒时间无效');
78
+ }
79
+ function createFormatter(timezone) {
80
+ if (typeof timezone !== 'string' || !timezone || timezone.length > 100 || timezone !== timezone.trim() || /^[+-]/u.test(timezone)) {
81
+ fail('提醒时区无效,请配置有效的 IANA 时区,例如 Asia/Shanghai');
82
+ }
83
+ try {
84
+ return new Intl.DateTimeFormat('en-GB', { timeZone: timezone, calendar: 'iso8601', numberingSystem: 'latn',
85
+ year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit',
86
+ hourCycle: 'h23', era: 'short' });
87
+ }
88
+ catch {
89
+ fail('提醒时区无效,请配置有效的 IANA 时区,例如 Asia/Shanghai');
90
+ }
91
+ }
92
+ function partsAt(at, formatter) {
93
+ const parts = Object.fromEntries(formatter.formatToParts(at).map(part => [part.type, part.value]));
94
+ return { year: parts.era === 'BC' ? 1 - Number(parts.year) : Number(parts.year), month: Number(parts.month),
95
+ day: Number(parts.day), hour: Number(parts.hour), minute: Number(parts.minute), second: Number(parts.second) };
96
+ }
97
+ function utc(value) {
98
+ const date = new Date(0);
99
+ date.setUTCFullYear(value.year, value.month - 1, value.day);
100
+ date.setUTCHours(value.hour, value.minute, value.second, 0);
101
+ return date.getTime();
102
+ }
103
+ function offsetAt(at, formatter) {
104
+ const local = utc(partsAt(at, formatter));
105
+ if (!Number.isFinite(local))
106
+ fail('提醒日期超出支持范围');
107
+ return local - Math.floor(at / 1000) * 1000;
108
+ }
109
+ function localInstant(desired, formatter) {
110
+ const naive = utc(desired);
111
+ if (!Number.isFinite(naive))
112
+ fail('提醒日期超出支持范围');
113
+ const offsets = new Set();
114
+ // A fixed 97 probes cover both sides of a DST or date-line transition.
115
+ // Candidate instants must round-trip exactly; never pick one side of a fold.
116
+ for (let hour = -48; hour <= 48; hour++) {
117
+ const probe = naive + hour * 3_600_000;
118
+ if (Number.isFinite(new Date(probe).getTime()))
119
+ offsets.add(offsetAt(probe, formatter));
120
+ }
121
+ const candidates = [...offsets].map(offset => naive - offset).filter(at => {
122
+ if (!Number.isFinite(new Date(at).getTime()))
123
+ return false;
124
+ const actual = partsAt(at, formatter);
125
+ return Object.keys(desired).every(key => actual[key] === desired[key]);
126
+ });
127
+ if (candidates.length === 0)
128
+ fail('这个本地时间因时区或夏令时切换而不存在,请改用明确日期并带 offset 的 ISO 时间');
129
+ if (candidates.length !== 1)
130
+ fail('这个本地时间因夏令时切换出现两次,请使用带明确 offset 的 ISO 时间选择其中一次');
131
+ return candidates[0];
132
+ }
133
+ function parseClock(text, period) {
134
+ const colon = /^(\d{1,2}):(\d{2})(?::(\d{2}))?$/u.exec(text);
135
+ const point = POINT.exec(text);
136
+ if (!colon && !point)
137
+ fail('时间须写为 09:30、九点、九点半或九点三十分;请同时指定今天、明天或后天');
138
+ let hour = colon ? Number(colon[1]) : parseInteger(point[1]);
139
+ const minute = colon ? Number(colon[2]) : point[2] ? 30 : point[3] ? parseInteger(point[3]) : 0;
140
+ const second = colon ? Number(colon[3] ?? 0) : point[4] ? parseInteger(point[4]) : 0;
141
+ if (minute > 59 || second > 59 || hour > 23)
142
+ fail('小时须为 0–23,分钟和秒须为 0–59');
143
+ if (period === '下午' || period === '晚上') {
144
+ if (hour < 1 || hour > 12 || period === '晚上' && hour === 12)
145
+ fail('时段与钟点不明确,请使用 24 小时制,例如 00:00 或 18:00');
146
+ hour = hour === 12 ? 12 : hour + 12;
147
+ }
148
+ else if (period === '上午' || period === '凌晨') {
149
+ if (hour > 11)
150
+ fail('时段与钟点不明确,请使用 24 小时制,例如 00:00 或 12:00');
151
+ }
152
+ else if (period === '中午') {
153
+ if (hour === 1 || hour === 2)
154
+ hour += 12;
155
+ else if (hour !== 11 && hour !== 12)
156
+ fail('中午的钟点不明确,请使用 24 小时制');
157
+ }
158
+ return { hour, minute, second };
159
+ }
160
+ function parseInteger(text) {
161
+ if (/^\d+$/u.test(text)) {
162
+ const number = Number(text);
163
+ if (!Number.isSafeInteger(number))
164
+ fail('时间数值过大,请使用一年以内的时间');
165
+ return number;
166
+ }
167
+ if (/两(?![百千万]|$)/u.test(text))
168
+ fail('中文数字不明确,请改用阿拉伯数字');
169
+ const normalized = text.replace(/〇/gu, '零').replace(/两/gu, '二');
170
+ let total = 0;
171
+ let section = 0;
172
+ let digit = 0;
173
+ for (const character of normalized) {
174
+ const index = DIGITS.indexOf(character);
175
+ if (index !== -1)
176
+ digit = index;
177
+ else if (character === '万') {
178
+ total += (section + digit) * 10_000;
179
+ section = 0;
180
+ digit = 0;
181
+ }
182
+ else {
183
+ const unit = character === '十' ? 10 : character === '百' ? 100 : character === '千' ? 1000 : NaN;
184
+ section += (digit || 1) * unit;
185
+ digit = 0;
186
+ }
187
+ }
188
+ const number = total + section + digit;
189
+ if (!Number.isSafeInteger(number) || number < 0 || number > 99_999_999
190
+ || chineseInteger(number) !== normalized && !(normalized.startsWith('一十') && chineseInteger(number) === normalized.slice(1))) {
191
+ fail('中文数字不明确,请写完整中文整数或改用阿拉伯数字');
192
+ }
193
+ return number;
194
+ }
195
+ function chineseInteger(value) {
196
+ if (value === 0)
197
+ return '零';
198
+ const section = (number) => {
199
+ let result = '';
200
+ let zero = false;
201
+ for (const [unit, label] of [[1000, '千'], [100, '百'], [10, '十'], [1, '']]) {
202
+ const digit = Math.floor(number / unit) % 10;
203
+ if (digit) {
204
+ if (zero)
205
+ result += '零';
206
+ result += `${DIGITS[digit]}${label}`;
207
+ zero = false;
208
+ }
209
+ else if (result && number % unit)
210
+ zero = true;
211
+ }
212
+ return result;
213
+ };
214
+ const high = Math.floor(value / 10_000);
215
+ const low = value % 10_000;
216
+ const result = high ? `${section(high)}万${low ? `${low < 1000 ? '零' : ''}${section(low)}` : ''}` : section(low);
217
+ return result.startsWith('一十') ? result.slice(1) : result;
218
+ }
219
+ //# sourceMappingURL=natural-time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"natural-time.js","sourceRoot":"","sources":["../src/natural-time.ts"],"names":[],"mappings":"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"}
package/lib/service.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { type DeliveryTarget, type OutboundHost, type PluginStateStore } from 'zhin.js';
2
2
  import type { ReminderConfig } from './config.js';
3
+ import { AdministratorReminderTasks } from './admin-tasks.js';
4
+ export { MAX_DELAY_SECONDS, parseReminderInstant } from './timing.js';
3
5
  export declare const REMINDER_STATE_KEY = "reminders/v1";
4
- export declare const MAX_DELAY_SECONDS: number;
5
6
  export declare class ReminderInputError extends Error {
6
7
  }
7
8
  type TaskStatus = 'pending' | 'unknown' | 'delivered' | 'failed' | 'cancelled';
@@ -29,6 +30,7 @@ export type ReminderBook = {
29
30
  /** Generation-owned worker; saved state contains plain identities, never live objects. */
30
31
  export declare class ReminderService {
31
32
  #private;
33
+ readonly administratorTasks: AdministratorReminderTasks;
32
34
  constructor(state: PluginStateStore, outbound: OutboundHost, config: ReminderConfig);
33
35
  stop(): void;
34
36
  add(actor: ReminderActor, text: string, at: number, intervalMs: number | null): Promise<ReminderTask>;
@@ -37,6 +39,4 @@ export declare class ReminderService {
37
39
  tick(): Promise<void>;
38
40
  describe(task: ReminderTask): string;
39
41
  }
40
- export declare function parseReminderInstant(value: string): number;
41
- export {};
42
42
  //# sourceMappingURL=service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE9G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AACjD,eAAO,MAAM,iBAAiB,QAAqB,CAAC;AACpD,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAEhD,KAAK,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAC/E,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC;AAC3F,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC7F,CAAC;AACF,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,CAAC;AAE5F,0FAA0F;AAC1F,qBAAa,eAAe;;gBAOd,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc;IAMnF,IAAI,IAAI,IAAI;IAEN,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAuBrG,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAM5D,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0C3B,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;CAQrC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU1D"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE9G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEtE,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AACjD,qBAAa,kBAAmB,SAAQ,KAAK;CAAG;AAEhD,KAAK,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAC/E,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE,CAAC;AAC3F,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC7F,CAAC;AACF,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAA;CAAE,CAAC;AAE5F,0FAA0F;AAC1F,qBAAa,eAAe;;IAC1B,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;gBAQ5C,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc;IAOnF,IAAI,IAAI,IAAI;IAEN,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IAuBrG,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAM5D,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyD3B,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;CAQrC"}
package/lib/service.js CHANGED
@@ -1,23 +1,28 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { createDeliveryTarget } from 'zhin.js';
3
3
  import { EndpointDeliveryError } from '@zhin.js/im-contract';
4
+ import { AdministratorReminderTasks } from './admin-tasks.js';
5
+ import { MAX_DELAY_SECONDS, nextPeriodicTime } from './timing.js';
6
+ export { MAX_DELAY_SECONDS, parseReminderInstant } from './timing.js';
4
7
  export const REMINDER_STATE_KEY = 'reminders/v1';
5
- export const MAX_DELAY_SECONDS = 365 * 24 * 60 * 60;
6
8
  export class ReminderInputError extends Error {
7
9
  }
8
10
  /** Generation-owned worker; saved state contains plain identities, never live objects. */
9
11
  export class ReminderService {
12
+ administratorTasks;
10
13
  #state;
11
14
  #outbound;
12
15
  #config;
13
16
  #working = false;
14
17
  #stopped = false;
18
+ #administratorFirst = false;
15
19
  constructor(state, outbound, config) {
16
20
  this.#state = state;
17
21
  this.#outbound = outbound;
18
22
  this.#config = config;
23
+ this.administratorTasks = new AdministratorReminderTasks(state, outbound, config);
19
24
  }
20
- stop() { this.#stopped = true; }
25
+ stop() { this.#stopped = true; this.administratorTasks.stop(); }
21
26
  async add(actor, text, at, intervalMs) {
22
27
  this.#assertLive();
23
28
  assertActor(actor);
@@ -67,6 +72,18 @@ export class ReminderService {
67
72
  for (let count = 0; count < this.#config.batchSize && !this.#stopped; count++) {
68
73
  const now = Date.now();
69
74
  const claimId = randomUUID();
75
+ const administratorFirst = this.#administratorFirst;
76
+ // Persist priority across ticks too: batchSize=1 must not starve either pool.
77
+ this.#administratorFirst = !this.#administratorFirst;
78
+ if (administratorFirst) {
79
+ const administratorTask = await this.administratorTasks.claim(now, claimId);
80
+ if (this.#stopped)
81
+ break;
82
+ if (administratorTask) {
83
+ await this.administratorTasks.deliver(administratorTask);
84
+ continue;
85
+ }
86
+ }
70
87
  const book = await this.#state.update(REMINDER_STATE_KEY, current => {
71
88
  let claimed = false;
72
89
  return { version: 1, tasks: readBook(current).tasks.map(task => {
@@ -84,8 +101,17 @@ export class ReminderService {
84
101
  }) };
85
102
  });
86
103
  const task = book?.tasks.find(item => item.claimId === claimId);
87
- if (!task || this.#stopped)
104
+ if (this.#stopped)
88
105
  break;
106
+ if (!task) {
107
+ if (administratorFirst)
108
+ break;
109
+ const administratorTask = await this.administratorTasks.claim(now, claimId);
110
+ if (!administratorTask || this.#stopped)
111
+ break;
112
+ await this.administratorTasks.deliver(administratorTask);
113
+ continue;
114
+ }
89
115
  let status = 'unknown';
90
116
  let detail = '平台未返回确认的消息 ID;不会自动重试';
91
117
  try {
@@ -123,23 +149,6 @@ export class ReminderService {
123
149
  #assertLive() { if (this.#stopped)
124
150
  throw new Error('提醒服务属于已停止的插件实例'); }
125
151
  }
126
- export function parseReminderInstant(value) {
127
- if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})$/u.test(value))
128
- throw new TypeError('绝对时间须为带 Z 或 ±hh:mm 的 ISO 时间,例如 2026-10-14T09:00:00+08:00');
129
- const [year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0] = value.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?/u).slice(1).map(item => Number(item ?? 0));
130
- const calendar = new Date(0);
131
- calendar.setUTCFullYear(year, month, 0);
132
- const daysInMonth = calendar.getUTCDate();
133
- if (month < 1 || month > 12 || day < 1 || day > daysInMonth || hour > 23 || minute > 59 || second > 59)
134
- throw new TypeError('提醒时间无效');
135
- const time = Date.parse(value);
136
- if (!Number.isSafeInteger(time))
137
- throw new TypeError('提醒时间无效');
138
- return time;
139
- }
140
- function nextPeriodicTime(from, interval, now) {
141
- return from + (Math.floor((now - from) / interval) + 1) * interval;
142
- }
143
152
  function sameActor(task, actor) {
144
153
  return task.senderId === actor.senderId && JSON.stringify(task.target) === JSON.stringify(createDeliveryTarget({ conversation: actor.target }));
145
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const MAX_DELAY_SECONDS: number;
2
+ export declare function parseReminderInstant(value: string): number;
3
+ export declare function nextPeriodicTime(from: number, interval: number, now: number): number;
4
+ //# sourceMappingURL=timing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../src/timing.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,QAAqB,CAAC;AAEpD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU1D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEpF"}
package/lib/timing.js ADDED
@@ -0,0 +1,19 @@
1
+ export const MAX_DELAY_SECONDS = 365 * 24 * 60 * 60;
2
+ export function parseReminderInstant(value) {
3
+ if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})$/u.test(value))
4
+ throw new TypeError('绝对时间须为带 Z 或 ±hh:mm 的 ISO 时间,例如 2026-10-14T09:00:00+08:00');
5
+ const [year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0] = value.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?/u).slice(1).map(item => Number(item ?? 0));
6
+ const calendar = new Date(0);
7
+ calendar.setUTCFullYear(year, month, 0);
8
+ const daysInMonth = calendar.getUTCDate();
9
+ if (month < 1 || month > 12 || day < 1 || day > daysInMonth || hour > 23 || minute > 59 || second > 59)
10
+ throw new TypeError('提醒时间无效');
11
+ const time = Date.parse(value);
12
+ if (!Number.isSafeInteger(time))
13
+ throw new TypeError('提醒时间无效');
14
+ return time;
15
+ }
16
+ export function nextPeriodicTime(from, interval, now) {
17
+ return from + (Math.floor((now - from) / interval) + 1) * interval;
18
+ }
19
+ //# sourceMappingURL=timing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timing.js","sourceRoot":"","sources":["../src/timing.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAEpD,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,IAAI,CAAC,gFAAgF,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,0DAA0D,CAAC,CAAC;IACnL,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,wDAAwD,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACxL,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC1C,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,WAAW,IAAI,IAAI,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;IACtI,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAAgB,EAAE,GAAW;IAC1E,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;AACrE,CAAC"}