Add scheduled task automation skill with worker execution pipeline.
Memind CI / Test, build, and release guards (push) Failing after 18s

Introduce scheduled-task-automation for H5 and WeChat, persist tasks in h5_scheduled_tasks, and run due jobs via a dedicated worker that executes agent tasks and delivers results.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-07-31 08:02:49 +08:00
parent 4186522c72
commit 81e63c16d3
27 changed files with 1736 additions and 2 deletions
@@ -26,6 +26,7 @@ import {
writebackPublications,
} from '../plaza-tasks.mjs';
import { createScheduleService } from '../schedule-service.mjs';
import { createScheduledTaskService } from '../scheduled-task-service.mjs';
import { createFeedbackService } from '../user-feedback.mjs';
import { PUBLISH_KEY_UUID } from '../user-publish.mjs';
import { initSchema } from '../db.mjs';
@@ -47,6 +48,7 @@ export async function bootstrapPortalDomainServices({
ensureMindSpaceConfigFn = ensureMindSpaceConfig,
loadMindSpaceConfigFn = loadMindSpaceConfig,
createScheduleServiceFn = createScheduleService,
createScheduledTaskServiceFn = createScheduledTaskService,
createPageDataServiceFn = createPageDataService,
createPageDataPublicServiceFn =
createPageDataPublicService,
@@ -114,6 +116,10 @@ export async function bootstrapPortalDomainServices({
defaultTimezone:
env.H5_DEFAULT_TIMEZONE || 'Asia/Shanghai',
});
const scheduledTaskService = createScheduledTaskServiceFn(pool, {
defaultTimezone:
env.H5_DEFAULT_TIMEZONE || 'Asia/Shanghai',
});
const pageDataService = createPageDataServiceFn({
getUserAuth,
getPool: () => pool,
@@ -278,6 +284,7 @@ export async function bootstrapPortalDomainServices({
mindSpaceAnalyticsConfig: resolvedAnalyticsConfig,
mindSpaceRybbitConfig: resolvedRybbitConfig,
scheduleService,
scheduledTaskService,
pageDataService,
pageDataPublicService,
feedbackService,
@@ -10,6 +10,7 @@ import {
import { createPageEditSessionService } from '../mindspace-page-edit-session.mjs';
import { createNotificationDispatcher } from '../notification-dispatcher.mjs';
import { startScheduleReminderWorker } from '../schedule-reminder-worker.mjs';
import { startScheduledTaskWorker } from '../scheduled-task-worker.mjs';
import { isPassiveCanaryRuntime } from './portal-runtime-role.mjs';
import { loadWechatMpModule } from '../wechat-mp-loader.mjs';
import { createToolGateway } from '../tool-gateway.mjs';
@@ -29,11 +30,12 @@ export async function bootstrapPortalIntegrationServices({
sessionAccess,
tkmindProxy,
scheduleService,
scheduledTaskService = null,
sessionSnapshotService = null,
wechatScheduleLlmConfigService,
llmProviderService,
chatIntentRouter,
systemDisclosurePolicyService,
sessionSnapshotService,
mindSpaceAnalyticsConfig,
mindSpaceRybbitConfig,
subscriptionService,
@@ -56,6 +58,8 @@ export async function bootstrapPortalIntegrationServices({
createNotificationDispatcher,
startScheduleReminderWorkerFn =
startScheduleReminderWorker,
startScheduledTaskWorkerFn =
startScheduledTaskWorker,
createPageEditSessionServiceFn =
createPageEditSessionService,
createToolGatewayFn = createToolGateway,
@@ -266,6 +270,27 @@ export async function bootstrapPortalIntegrationServices({
logger.log('Schedule reminder worker enabled');
}
let scheduledTaskWorker = null;
if (
!isPassiveCanaryRuntime(env) &&
env.H5_SCHEDULED_TASK_WORKER_ENABLED === '1' &&
scheduledTaskService &&
userAuth &&
tkmindProxy
) {
scheduledTaskWorker =
startScheduledTaskWorkerFn({
scheduledTaskService,
scheduleService,
userAuth,
tkmindProxy,
sessionSnapshotService,
notificationDispatcher,
logger,
});
logger.log('Scheduled task worker enabled');
}
let subscriptionExpiryTimer = null;
if (subscriptionService && !isPassiveCanaryRuntime(env)) {
subscriptionExpiryTimer = setIntervalFn(
@@ -323,6 +348,7 @@ export async function bootstrapPortalIntegrationServices({
wechatMpService,
notificationDispatcher,
scheduleReminderWorker,
scheduledTaskWorker,
subscriptionExpiryTimer,
mindSpacePageEditSession,
};