Files
LobsterAI/tests/imScheduledTaskHandler.test.mjs
fisherdaddy 4f2bfa217f feat(cron): improve scheduled task delivery, channel history sync, and reminder parsing
- Add DingTalk delivery route resolution and caching for scheduled task replies
- Extract shared scheduled reminder text parsing into src/common/
- Patch OpenClaw runtime cron delivery inference to support deliveryContext
- Improve channel history sync with tail-overlap reconciliation strategy
- Harden IM session tracking with DB fallback via ensureTrackedSession
- Disable web_search tool for managed sessions and add browser/web_fetch guidance
- Guard against stale loadSessions responses in renderer
- Normalize scheduled reminder display text in CoworkSessionDetail
2026-03-16 02:01:08 +08:00

71 lines
2.6 KiB
JavaScript

import assert from 'node:assert/strict';
import test from 'node:test';
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const {
looksLikeIMScheduledTaskCandidate,
normalizeDetectedScheduledTaskRequest,
isReminderSystemTurn,
} = require('../dist-electron/main/im/imScheduledTaskHandler.js');
test('normalizes model-detected IM reminder requests into direct cron.add inputs', () => {
const parsed = normalizeDetectedScheduledTaskRequest(
{
shouldCreateTask: true,
scheduleAt: '2026-03-15T16:30:00+08:00',
reminderBody: '喝饮料',
taskName: '喝饮料提醒',
},
'2分钟后提醒我喝饮料',
new Date('2026-03-15T16:28:00+08:00'),
);
assert.ok(parsed);
assert.equal(parsed.kind, 'create');
assert.equal(parsed.reminderBody, '喝饮料');
assert.equal(parsed.taskName, '喝饮料提醒');
assert.equal(parsed.payloadText, '⏰ 提醒:喝饮料');
assert.equal(parsed.delayLabel, '2分钟后');
assert.equal(parsed.scheduleAt, '2026-03-15T16:30:00+08:00');
assert.match(parsed.confirmationText, /2分钟后(16:30)会提醒你喝饮料/u);
});
test('only uses heuristic as a cheap reminder candidate prefilter', () => {
assert.equal(looksLikeIMScheduledTaskCandidate('帮我总结一下今天的会议纪要'), false);
assert.equal(looksLikeIMScheduledTaskCandidate('2分钟后提醒我喝饮料'), true);
});
test('rejects detector payloads without a future timezone-aware timestamp', () => {
assert.equal(normalizeDetectedScheduledTaskRequest({
shouldCreateTask: true,
scheduleAt: '2026-03-15T16:30:00',
reminderBody: '喝水',
}, '提醒我喝水', new Date('2026-03-15T16:28:00+08:00')), null);
});
test('identifies reminder system turns for async IM delivery', () => {
assert.equal(isReminderSystemTurn([
{ type: 'assistant', content: '普通回复' },
]), false);
assert.equal(isReminderSystemTurn([
{ type: 'system', content: '⏰ 提醒:喝饮料' },
{ type: 'assistant', content: '该喝饮料啦!' },
]), true);
});
test('keeps recognizing legacy reminder system messages during transition', () => {
assert.equal(isReminderSystemTurn([
{ type: 'system', content: 'System: [Sunday, March 15th, 2026 — 4:30 PM] ⏰ 提醒:喝饮料' },
{ type: 'assistant', content: '该喝饮料啦!' },
]), true);
});
test('recognizes plain reminder text turns during runtime hotfix rollout', () => {
assert.equal(isReminderSystemTurn([
{ type: 'user', content: '⏰ 提醒:该去钉钉打卡啦!别忘了打卡哦~' },
{ type: 'assistant', content: '⏰ 时间到啦,该去打卡了。' },
]), true);
});