Files
memind/wechat/handlers/scheduled-task.mjs
T
john 5de58af9ed fix(wechat): resolve scheduled task cancel via manage LLM instead of hard rules
Use a lightweight LLM over active task lists to pick taskId for cancel,
exclude page.generate from scheduled-task inbound, and remove single-task
auto-cancel so Cursor page generation stays isolated.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-29 13:45:28 +08:00

108 lines
3.1 KiB
JavaScript

import { isPageGenerateText } from '../intent/patterns.mjs';
import {
formatScheduledTaskCancelReply,
formatScheduledTaskListReply,
isScheduledTaskIntent,
parseScheduledTaskIntent,
} from '../../scheduled-task-intent.mjs';
import { resolveScheduledTaskCancelWithLlm } from '../../wechat-scheduled-task-manage-llm.mjs';
export async function handleWechatScheduledTaskIntent({
intent,
user,
scheduledTaskService,
wechatScheduledTaskManageLlmConfigService = null,
llmProviderService = null,
env = process.env,
logger = console,
}) {
if (!scheduledTaskService) return null;
const agentText = String(intent?.agentText ?? '').trim();
if (isPageGenerateText(agentText)) {
return null;
}
const timezone = env.H5_DEFAULT_TIMEZONE || 'Asia/Shanghai';
const taskIntent = parseScheduledTaskIntent(agentText, {
timezone,
});
if (!isScheduledTaskIntent(taskIntent)) return null;
try {
if (taskIntent.action === 'list_scheduled_tasks') {
const tasks = await scheduledTaskService.listTasks({
userId: user.userId,
status: 'active',
limit: 20,
});
return formatScheduledTaskListReply(tasks);
}
if (taskIntent.action === 'create_scheduled_task') {
return null;
}
if (taskIntent.action === 'cancel_scheduled_task') {
const tasks = await scheduledTaskService.listTasks({
userId: user.userId,
status: 'active',
limit: 20,
});
if (!tasks.length) {
return '你当前没有进行中的定时自动任务。';
}
let manageLlmEnabled = false;
let modelProviderKeyId = null;
let model = null;
if (wechatScheduledTaskManageLlmConfigService && llmProviderService) {
try {
manageLlmEnabled = await wechatScheduledTaskManageLlmConfigService.isManageLlmEnabled();
if (manageLlmEnabled) {
const config = await wechatScheduledTaskManageLlmConfigService.getConfig();
modelProviderKeyId = config.modelProviderKeyId ?? null;
model = config.model ?? null;
}
} catch (err) {
logger.warn?.(
'[wechat-scheduled-task-manage-llm] config load failed:',
err instanceof Error ? err.message : err,
);
}
}
if (manageLlmEnabled) {
const decision = await resolveScheduledTaskCancelWithLlm({
text: agentText,
tasks,
llmProviderService,
modelProviderKeyId,
model,
logger,
});
if (decision.action === 'cancel' && decision.taskId) {
const cancelled = await scheduledTaskService.cancelTask({
userId: user.userId,
taskId: decision.taskId,
});
return formatScheduledTaskCancelReply(cancelled);
}
if (decision.action === 'clarify') {
return decision.message;
}
}
return null;
}
} catch (err) {
logger.warn?.(
'[wechat-scheduled-task] preflight failed:',
err instanceof Error ? err.message : err,
);
return `定时任务设置失败:${err instanceof Error ? err.message : String(err)}`;
}
return null;
}