@h-ai/scheduler 0.1.0-alpha5
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.
- package/LICENSE +202 -0
- package/README.md +201 -0
- package/dist/index.d.ts +364 -0
- package/dist/index.js +1416 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scheduler-config.ts","../messages/en-US.json","../messages/zh-CN.json","../src/scheduler-i18n.ts","../src/scheduler-types.ts","../src/repositories/scheduler-log-repository.ts","../src/repositories/scheduler-task-repository.ts","../src/scheduler-js-compiler.ts","../src/scheduler-executor.ts","../src/scheduler-cron.ts","../src/scheduler-functions.ts","../src/scheduler-runner.ts","../src/scheduler-main.ts"],"names":["core","logger","z","BaseReldbCrudRepository","err","ok","taskRepo","logRepo","cache"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @h-ai/scheduler — 配置 Schema\n *\n * 本文件定义定时任务模块的配置结构,使用 Zod 进行运行时校验。\n * @module scheduler-config\n */\n\nimport { z } from 'zod'\n\n// ─── 配置 Schema ───\n\n/**\n * 调度器配置 Zod Schema\n *\n * 所有字段均可选,提供合理默认值。\n *\n * @example\n * ```ts\n * const config = SchedulerConfigSchema.parse({\n * enableDb: true,\n * tickInterval: 1000,\n * })\n * ```\n */\nexport const SchedulerConfigSchema = z.object({\n /** 是否启用数据库记录(默认 true,需要 @h-ai/reldb 已初始化) */\n enableDb: z.boolean().default(true),\n /** 调度检查间隔,单位毫秒(默认 1000,即每秒检查一次) */\n tickInterval: z.number().int().min(100).default(1000),\n /** 分布式锁过期时间,单位毫秒(默认 300000,即 5 分钟) */\n lockExpireMs: z.number().int().min(10000).default(300000),\n /** 节点标识(默认自动生成 UUID,多节点部署时建议设置固定标识以便审计) */\n nodeId: z.string().min(1).optional(),\n /** 执行日志最大保留条数(启用 DB 时生效) */\n maxLogs: z.number().int().min(1).optional(),\n /** 执行日志保留天数(启用 DB 时生效) */\n retentionDays: z.number().int().min(1).optional(),\n})\n\n/** 调度器配置类型 */\nexport type SchedulerConfig = z.infer<typeof SchedulerConfigSchema>\n\n/** 调度器配置输入类型 */\nexport type SchedulerConfigInput = z.input<typeof SchedulerConfigSchema>\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"scheduler_notInitialized\": \"Scheduler not initialized, please call scheduler.init() first\",\n \"scheduler_initFailed\": \"Failed to initialize scheduler: {error}\",\n \"scheduler_alreadyRunning\": \"Scheduler is already running\",\n \"scheduler_notRunning\": \"Scheduler is not running\",\n \"scheduler_taskNotFound\": \"Task not found: {taskId}\",\n \"scheduler_taskAlreadyExists\": \"Task already exists: {taskId}\",\n \"scheduler_invalidCron\": \"Invalid cron expression: {expression}\",\n \"scheduler_executionFailed\": \"Task execution failed: {error}\",\n \"scheduler_jsExecutionFailed\": \"JS code execution failed: {error}\",\n \"scheduler_apiExecutionFailed\": \"API call failed: {error}\",\n \"scheduler_dbSaveFailed\": \"Failed to save execution log: {error}\",\n \"scheduler_dbNotInitialized\": \"Database not initialized, cannot save execution logs\",\n \"scheduler_configError\": \"Scheduler config validation failed: {error}\",\n \"scheduler_taskIdEmpty\": \"Task ID cannot be empty\",\n \"scheduler_taskRunning\": \"Task is currently running: {taskId}\",\n \"scheduler_invalidApiConfig\": \"Invalid api_config for task: {taskId}\",\n \"scheduler_lockAcquireFailed\": \"Failed to acquire distributed lock, another node already holds it: {taskId}\",\n \"scheduler_jsCompileFailed\": \"Failed to compile JS task: {error}\",\n \"scheduler_hookExecutionFailed\": \"Task lifecycle hook execution failed: {error}\",\n \"scheduler_taskHandlerMissing\": \"Task has no executable handler and no global execute hook is configured: {taskId}\",\n \"scheduler_invalidHandlerConfig\": \"Invalid task handler config: {taskId}\",\n \"scheduler_invalidRetryConfig\": \"Invalid retry policy config for task: {taskId}\",\n \"scheduler_reldbNotInitialized\": \"enableDb is true but @h-ai/reldb is not initialized, please call reldb.init() first\"\n}\n","{\n \"$schema\": \"https://inlang.com/schema/inlang-message-format\",\n \"scheduler_notInitialized\": \"定时任务模块未初始化,请先调用 scheduler.init()\",\n \"scheduler_initFailed\": \"定时任务模块初始化失败: {error}\",\n \"scheduler_alreadyRunning\": \"定时任务调度器已在运行中\",\n \"scheduler_notRunning\": \"定时任务调度器未运行\",\n \"scheduler_taskNotFound\": \"任务未找到: {taskId}\",\n \"scheduler_taskAlreadyExists\": \"任务已存在: {taskId}\",\n \"scheduler_invalidCron\": \"无效的 cron 表达式: {expression}\",\n \"scheduler_executionFailed\": \"任务执行失败: {error}\",\n \"scheduler_jsExecutionFailed\": \"JS 代码执行失败: {error}\",\n \"scheduler_apiExecutionFailed\": \"API 调用失败: {error}\",\n \"scheduler_dbSaveFailed\": \"保存执行记录失败: {error}\",\n \"scheduler_dbNotInitialized\": \"数据库未初始化,无法保存执行记录\",\n \"scheduler_configError\": \"调度器配置校验失败:{error}\",\n \"scheduler_taskIdEmpty\": \"任务 ID 不能为空\",\n \"scheduler_taskRunning\": \"任务正在执行中: {taskId}\",\n \"scheduler_invalidApiConfig\": \"任务 api_config 格式无效: {taskId}\",\n \"scheduler_lockAcquireFailed\": \"获取分布式锁失败,其他节点已获锁: {taskId}\",\n \"scheduler_jsCompileFailed\": \"JS 任务编译失败: {error}\",\n \"scheduler_hookExecutionFailed\": \"任务生命周期回调执行失败: {error}\",\n \"scheduler_taskHandlerMissing\": \"任务缺少可执行 handler,且未配置全局执行回调: {taskId}\",\n \"scheduler_invalidHandlerConfig\": \"任务 handler 配置无效: {taskId}\",\n \"scheduler_invalidRetryConfig\": \"任务重试策略配置无效: {taskId}\",\n \"scheduler_reldbNotInitialized\": \"enableDb 为 true 但 @h-ai/reldb 未初始化,请先调用 reldb.init()\"\n}\n","/**\n * @h-ai/scheduler — i18n\n *\n * 本文件提供定时任务模块的 i18n 文案访问入口。\n * @module scheduler-i18n\n */\n\nimport { core } from '@h-ai/core'\nimport messagesEnUS from '../messages/en-US.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\n// ─── i18n ───\n\n/**\n * 定时任务模块文案 Key 类型\n */\ntype SchedulerMessageKey = keyof typeof messagesZhCN\n\n/**\n * 获取定时任务模块文案\n *\n * @param key - 文案 Key\n * @param options - 插值参数与格式化选项\n * @returns 本地化后的文案字符串\n *\n * @example\n * ```ts\n * schedulerM('scheduler_taskNotFound', { params: { taskId: 'my-task' } })\n * ```\n */\nexport const schedulerM = core.i18n.createMessageGetter<SchedulerMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n})\n","/**\n * @h-ai/scheduler — 类型定义\n *\n * 本文件定义定时任务模块的核心接口和类型。\n * @module scheduler-types\n */\n\nimport type { ErrorInfo, HaiResult, PaginatedResult, PaginationOptionsInput } from '@h-ai/core'\nimport type { SchedulerConfig, SchedulerConfigInput } from './scheduler-config.js'\nimport { core } from '@h-ai/core'\n\n// ─── 错误定义(照 @h-ai/core 范式) ───\n\nconst SchedulerErrorInfo = {\n NOT_INITIALIZED: '010:500',\n INIT_FAILED: '011:500',\n CONFIG_ERROR: '012:500',\n TASK_NOT_FOUND: '020:404',\n TASK_ALREADY_EXISTS: '021:409',\n INVALID_CRON: '022:400',\n EXECUTION_FAILED: '023:500',\n JS_EXECUTION_FAILED: '024:500',\n API_EXECUTION_FAILED: '025:502',\n DB_SAVE_FAILED: '026:500',\n ALREADY_RUNNING: '027:409',\n NOT_RUNNING: '028:400',\n LOCK_ACQUIRE_FAILED: '029:409',\n JS_COMPILE_FAILED: '030:500',\n HOOK_EXECUTION_FAILED: '031:500',\n} as const satisfies ErrorInfo\n\nexport const HaiSchedulerError = core.error.buildHaiErrorsDef('scheduler', SchedulerErrorInfo)\n\n// ─── 任务定义 ───\n\n/** 任务参数字典(键值对) */\nexport type TaskParams = Record<string, unknown>\n\n/** 任务触发类型 */\nexport type TaskTriggerType = 'scheduled' | 'manual'\n\n/** 任务处理器类型 */\nexport type TaskHandlerKind = 'api' | 'js'\n\n/** 失败重试策略 */\nexport interface TaskRetryPolicy {\n /** 最大尝试次数(包含首次执行,最小 1) */\n maxAttempts: number\n /** 每次重试前的退避时间(毫秒);按顺序对应第 2、3... 次尝试 */\n backoffMs?: number[]\n}\n\n/** 任务执行目标类型 */\nexport type TaskExecutionTargetType = TaskHandlerKind | 'hook'\n\n/**\n * API 任务配置\n */\nexport interface ApiTaskConfig {\n /** 处理器类型 */\n kind: 'api'\n /** 请求 URL */\n url: string\n /** HTTP 方法(默认 GET) */\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n /** 请求头 */\n headers?: Record<string, string>\n /** 请求体(POST/PUT/PATCH 时使用) */\n body?: unknown\n /** 超时时间,单位毫秒(默认 30000) */\n timeout?: number\n}\n\n/**\n * JS 任务配置\n *\n * `code` 为 JS 函数字符串,例如:\n * `(context) => ({ taskId: context.task.id, params: context.params })`\n */\nexport interface JsTaskConfig {\n /** 处理器类型 */\n kind: 'js'\n /** JS 函数字符串 */\n code: string\n /** 软超时时间,单位毫秒 */\n timeout?: number\n}\n\n/** 统一任务处理器配置 */\nexport type TaskHandlerConfig = ApiTaskConfig | JsTaskConfig\n\n/**\n * 任务定义\n *\n * @example\n * ```ts\n * const jsTask: TaskDefinition = {\n * id: 'cleanup',\n * name: '清理过期数据',\n * cron: '0 2 * * *',\n * params: { channel: 'nightly' },\n * handler: {\n * kind: 'js',\n * code: '(context) => ({ taskId: context.task.id, params: context.params })',\n * },\n * }\n *\n * const apiTask: TaskDefinition = {\n * id: 'health-check',\n * name: '健康检查',\n * cron: '*/5 * * * *',\n * handler: {\n * kind: 'api',\n * url: 'https://api.example.com/health',\n * method: 'GET',\n * },\n * }\n * ```\n */\nexport interface TaskDefinition {\n /** 任务唯一标识 */\n id: string\n /** 任务名称 */\n name: string\n /** 任务描述 */\n description?: string\n /** cron 表达式(标准 5 字段:分 时 日 月 周) */\n cron: string\n /** 是否启用(默认 true) */\n enabled?: boolean\n /** 是否在执行后自动删除(默认 false) */\n deleteAfterRun?: boolean\n /** 失败重试策略 */\n retry?: TaskRetryPolicy\n /** 通用参数 */\n params?: TaskParams\n /** 任务处理器;为空时可由全局事件回调统一处理 */\n handler?: TaskHandlerConfig\n}\n\n// ─── 触发与执行上下文 ───\n\n/**\n * 任务触发信息\n */\nexport interface TaskTriggerInfo {\n /** 触发类型 */\n type: TaskTriggerType\n /** 触发来源;定时触发时通常为 null,手工触发时可指定渠道 */\n source: string | null\n}\n\n/**\n * 任务执行上下文\n */\nexport interface SchedulerTaskContext {\n /** 当前任务 */\n task: TaskDefinition\n /** 任务 ID */\n taskId: string\n /** 当前参数快照 */\n params: TaskParams\n /** 触发信息 */\n trigger: TaskTriggerInfo\n}\n\n/** 编译后的 JS 任务函数 */\nexport type JsTaskHandler = (context: SchedulerTaskContext) => unknown | Promise<unknown>\n\n// ─── 生命周期回调 ───\n\n/** 任务开始事件 */\nexport interface SchedulerTaskStartEvent {\n /** 当前任务 */\n task: TaskDefinition\n /** 触发信息 */\n trigger: TaskTriggerInfo\n /** 开始时间(Unix 时间戳,毫秒) */\n startedAt: number\n}\n\n/** 任务执行事件 */\nexport interface SchedulerTaskExecuteEvent extends SchedulerTaskStartEvent {\n /** 执行上下文 */\n context: SchedulerTaskContext\n}\n\n/** 任务中断事件 */\nexport interface SchedulerTaskInterruptedEvent extends SchedulerTaskStartEvent {\n /** 中断时间(Unix 时间戳,毫秒) */\n interruptedAt: number\n /** 中断原因 */\n reason: string\n}\n\n/** 任务结束事件 */\nexport interface SchedulerTaskFinishEvent extends SchedulerTaskStartEvent {\n /** 结束时间(Unix 时间戳,毫秒) */\n finishedAt: number\n /** 执行日志 */\n log: TaskExecutionLog\n}\n\n/**\n * 全局任务生命周期回调\n *\n * - `onTaskExecute` 可用于统一处理无内置 handler 的任务\n * - `onTaskStart` / `onTaskInterrupted` / `onTaskFinish` 用于观测生命周期\n */\nexport interface SchedulerTaskHooks {\n /** 任务开始前触发 */\n onTaskStart?: (event: SchedulerTaskStartEvent) => void | Promise<void>\n /** 当任务无内置 handler 时,可在此统一执行 */\n onTaskExecute?: (event: SchedulerTaskExecuteEvent) => unknown | Promise<unknown>\n /** 任务被中断时触发 */\n onTaskInterrupted?: (event: SchedulerTaskInterruptedEvent) => void | Promise<void>\n /** 任务结束时触发 */\n onTaskFinish?: (event: SchedulerTaskFinishEvent) => void | Promise<void>\n}\n\n// ─── 执行日志 ───\n\n/** 执行状态 */\nexport type ExecutionStatus = 'success' | 'failed' | 'interrupted'\n\n/**\n * 任务执行日志\n */\nexport interface TaskExecutionLog {\n /** 日志 ID */\n id: number\n /** 任务 ID */\n taskId: string\n /** 任务名称 */\n taskName: string\n /** 执行目标类型 */\n taskType: TaskExecutionTargetType\n /** 触发类型 */\n triggerType: TaskTriggerType\n /** 触发来源 */\n triggerSource: string | null\n /** 执行状态 */\n status: ExecutionStatus\n /** 执行结果(JSON 字符串) */\n result: string | null\n /** 错误或中断信息 */\n error: string | null\n /** 开始时间(Unix 时间戳,毫秒) */\n startedAt: number\n /** 结束时间(Unix 时间戳,毫秒) */\n finishedAt: number\n /** 执行耗时(毫秒) */\n duration: number\n}\n\n// ─── 日志查询 ───\n\n/**\n * 执行日志查询选项\n */\nexport interface LogQueryOptions {\n /** 按任务 ID 过滤 */\n taskId?: string\n /** 按状态过滤 */\n status?: ExecutionStatus\n /** 按触发类型过滤 */\n triggerType?: TaskTriggerType\n /** 按触发来源过滤 */\n triggerSource?: string\n /** 仅查询开始时间 >= startedAfter 的日志(Unix 时间戳毫秒) */\n startedAfter?: number\n /** 仅查询开始时间 <= startedBefore 的日志(Unix 时间戳毫秒) */\n startedBefore?: number\n /** 分页参数(page 从 1 开始,pageSize 默认 20) */\n pagination?: PaginationOptionsInput\n}\n\n/** 日志清理策略 */\nexport interface SchedulerLogCleanupPolicy {\n /** 最多保留日志条数 */\n maxLogs?: number\n /** 最多保留天数 */\n retentionDays?: number\n}\n\n// ─── 任务更新 ───\n\n/**\n * 任务更新输入\n *\n * 可更新的字段包括:名称、cron 表达式、启用状态、参数、处理器。\n * 任务 ID 不可更新。\n */\nexport interface TaskUpdateInput {\n /** 任务名称 */\n name?: string\n /** 任务描述 */\n description?: string\n /** cron 表达式 */\n cron?: string\n /** 是否启用 */\n enabled?: boolean\n /** 是否在执行后自动删除 */\n deleteAfterRun?: boolean\n /** 失败重试策略;传 null 表示清空重试策略 */\n retry?: TaskRetryPolicy | null\n /** 通用参数 */\n params?: TaskParams\n /** 任务处理器;传 null 表示清空内置处理器 */\n handler?: TaskHandlerConfig | null\n}\n\n/** 手工触发输入 */\nexport interface TriggerTaskInput {\n /** 手工触发来源(例如 admin-console / api / cli) */\n source?: string\n}\n\n// ─── 初始化输入 ───\n\n/**\n * 调度器初始化输入\n *\n * 包含调度器配置、可选的预定义任务列表,以及可选的全局生命周期回调。\n */\nexport interface SchedulerInitInput extends SchedulerConfigInput {\n /** 预定义任务列表(从配置中加载,初始化时自动注册) */\n tasks?: TaskDefinition[]\n /** 全局任务生命周期回调 */\n hooks?: SchedulerTaskHooks\n}\n\n// ─── 调度器接口 ───\n\n/**\n * 调度器函数接口\n */\nexport interface SchedulerFunctions {\n /** 初始化调度器 */\n init: (config?: SchedulerInitInput) => Promise<HaiResult<void>>\n\n /** 注册任务 */\n register: (task: TaskDefinition) => Promise<HaiResult<void>>\n\n /** 注销任务 */\n unregister: (taskId: string) => Promise<HaiResult<void>>\n\n /** 更新任务 */\n updateTask: (taskId: string, updates: TaskUpdateInput) => Promise<HaiResult<void>>\n\n /** 启动调度 */\n start: () => HaiResult<void>\n\n /** 停止调度 */\n stop: () => HaiResult<void>\n\n /** 手动触发任务 */\n trigger: (taskId: string, options?: TriggerTaskInput) => Promise<HaiResult<TaskExecutionLog>>\n\n /** 查询执行日志 */\n getLogs: (options?: LogQueryOptions) => Promise<HaiResult<PaginatedResult<TaskExecutionLog>>>\n\n /** 设置全局任务生命周期回调 */\n setHooks: (hooks: SchedulerTaskHooks) => HaiResult<void>\n\n /** 清空全局任务生命周期回调 */\n clearHooks: () => HaiResult<void>\n\n /** 获取已注册任务列表 */\n readonly tasks: ReadonlyMap<string, TaskDefinition>\n\n /** 当前配置 */\n readonly config: SchedulerConfig | null\n\n /** 当前生命周期回调 */\n readonly hooks: Readonly<SchedulerTaskHooks>\n\n /** 是否已初始化 */\n readonly isInitialized: boolean\n\n /** 调度器是否正在运行 */\n readonly isRunning: boolean\n\n /** 关闭调度器 */\n close: () => Promise<void>\n}\n","/**\n * @h-ai/scheduler — 执行日志仓库\n *\n * 基于 @h-ai/reldb BaseReldbCrudRepository 实现执行日志的持久化与查询。\n * @module scheduler-log-repository\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type { ReldbFunctions } from '@h-ai/reldb'\nimport type { LogQueryOptions, SchedulerLogCleanupPolicy, TaskExecutionLog } from '../scheduler-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\nimport { BaseReldbCrudRepository } from '@h-ai/reldb'\n\nimport { schedulerM } from '../scheduler-i18n.js'\nimport { HaiSchedulerError } from '../scheduler-types.js'\n\nconst logger = core.logger.child({ module: 'scheduler', scope: 'log-repository' })\n\nconst SCHEDULER_LOG_TABLE = 'hai_scheduler_logs'\n\ninterface LogRow {\n id: number\n taskId: string\n taskName: string\n taskType: string\n triggerType: string\n triggerSource: string | null\n status: string\n result: string | null\n error: string | null\n startedAt: number\n finishedAt: number\n duration: number\n}\n\nexport class SchedulerLogRepository extends BaseReldbCrudRepository<LogRow> {\n constructor(db: ReldbFunctions) {\n super(db, {\n table: SCHEDULER_LOG_TABLE,\n idColumn: 'id',\n fields: [\n { fieldName: 'id', columnName: 'id', def: { type: 'INTEGER', primaryKey: true, autoIncrement: true }, select: true, create: false, update: false },\n { fieldName: 'taskId', columnName: 'task_id', def: { type: 'TEXT', notNull: true }, select: true, create: true, update: false },\n { fieldName: 'taskName', columnName: 'task_name', def: { type: 'TEXT', notNull: true }, select: true, create: true, update: false },\n { fieldName: 'taskType', columnName: 'task_type', def: { type: 'TEXT', notNull: true }, select: true, create: true, update: false },\n { fieldName: 'triggerType', columnName: 'trigger_type', def: { type: 'TEXT', notNull: true }, select: true, create: true, update: false },\n { fieldName: 'triggerSource', columnName: 'trigger_source', def: { type: 'TEXT' }, select: true, create: true, update: false },\n { fieldName: 'status', columnName: 'status', def: { type: 'TEXT', notNull: true }, select: true, create: true, update: false },\n { fieldName: 'result', columnName: 'result', def: { type: 'TEXT' }, select: true, create: true, update: false },\n { fieldName: 'error', columnName: 'error', def: { type: 'TEXT' }, select: true, create: true, update: false },\n { fieldName: 'startedAt', columnName: 'started_at', def: { type: 'INTEGER', notNull: true }, select: true, create: true, update: false },\n { fieldName: 'finishedAt', columnName: 'finished_at', def: { type: 'INTEGER', notNull: true }, select: true, create: true, update: false },\n { fieldName: 'duration', columnName: 'duration', def: { type: 'INTEGER', notNull: true }, select: true, create: true, update: false },\n ],\n })\n }\n\n async saveLog(log: TaskExecutionLog): Promise<void> {\n try {\n const createResult = await this.create({\n taskId: log.taskId,\n taskName: log.taskName,\n taskType: log.taskType,\n triggerType: log.triggerType,\n triggerSource: log.triggerSource,\n status: log.status,\n result: log.result,\n error: log.error,\n startedAt: log.startedAt,\n finishedAt: log.finishedAt,\n duration: log.duration,\n })\n\n if (!createResult.success)\n logger.error('Failed to save execution log', { taskId: log.taskId, error: createResult.error.message })\n }\n catch (error) {\n logger.error('Failed to save execution log', { taskId: log.taskId, error })\n }\n }\n\n async queryLogs(options?: LogQueryOptions): Promise<HaiResult<PaginatedResult<TaskExecutionLog>>> {\n const { taskId, status, triggerType, triggerSource, startedAfter, startedBefore, pagination } = options ?? {}\n\n const conditions: string[] = []\n const params: unknown[] = []\n\n if (taskId) {\n conditions.push('task_id = ?')\n params.push(taskId)\n }\n if (status) {\n conditions.push('status = ?')\n params.push(status)\n }\n if (triggerType) {\n conditions.push('trigger_type = ?')\n params.push(triggerType)\n }\n if (triggerSource) {\n conditions.push('trigger_source = ?')\n params.push(triggerSource)\n }\n if (startedAfter !== undefined) {\n conditions.push('started_at >= ?')\n params.push(startedAfter)\n }\n if (startedBefore !== undefined) {\n conditions.push('started_at <= ?')\n params.push(startedBefore)\n }\n\n try {\n const pageResult = await this.findPage({\n where: conditions.length > 0 ? conditions.join(' AND ') : undefined,\n params: params.length > 0 ? params : undefined,\n orderBy: 'id DESC',\n pagination,\n overrides: { defaultPageSize: 20, maxPageSize: 200 },\n })\n\n if (!pageResult.success) {\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: pageResult.error.message } }),\n pageResult.error,\n )\n }\n\n return ok({\n ...pageResult.data,\n items: pageResult.data.items.map(row => ({\n id: row.id,\n taskId: row.taskId,\n taskName: row.taskName,\n taskType: row.taskType as TaskExecutionLog['taskType'],\n triggerType: row.triggerType as TaskExecutionLog['triggerType'],\n triggerSource: row.triggerSource ?? null,\n status: row.status as TaskExecutionLog['status'],\n result: row.result ?? null,\n error: row.error ?? null,\n startedAt: row.startedAt,\n finishedAt: row.finishedAt,\n duration: row.duration,\n })),\n })\n }\n catch (error) {\n logger.error('Failed to query execution logs', { error })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', {\n params: { error: error instanceof Error ? error.message : String(error) },\n }),\n error,\n )\n }\n }\n\n async cleanupLogs(policy: SchedulerLogCleanupPolicy): Promise<HaiResult<void>> {\n const { maxLogs, retentionDays } = policy\n if (!maxLogs && !retentionDays)\n return ok(undefined)\n\n try {\n if (retentionDays) {\n const cutoff = Date.now() - retentionDays * 24 * 60 * 60 * 1000\n const retentionResult = await this.sql().execute(\n `DELETE FROM ${SCHEDULER_LOG_TABLE} WHERE started_at < ?`,\n [cutoff],\n )\n\n if (!retentionResult.success) {\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: retentionResult.error.message } }),\n retentionResult.error,\n )\n }\n }\n\n if (maxLogs) {\n const maxLogsResult = await this.sql().execute(\n `DELETE FROM ${SCHEDULER_LOG_TABLE}\n WHERE id NOT IN (\n SELECT id FROM (\n SELECT id\n FROM ${SCHEDULER_LOG_TABLE}\n ORDER BY started_at DESC, id DESC\n LIMIT ?\n ) AS keep_logs\n )`,\n [maxLogs],\n )\n\n if (!maxLogsResult.success) {\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: maxLogsResult.error.message } }),\n maxLogsResult.error,\n )\n }\n }\n\n return ok(undefined)\n }\n catch (error) {\n logger.error('Failed to cleanup execution logs', { error, maxLogs, retentionDays })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', {\n params: { error: error instanceof Error ? error.message : String(error) },\n }),\n error,\n )\n }\n }\n}\n","/**\n * @h-ai/scheduler — 任务定义仓库\n *\n * 基于 @h-ai/reldb BaseReldbCrudRepository 实现统一任务定义的持久化与查询。\n * @module scheduler-task-repository\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { ReldbFunctions } from '@h-ai/reldb'\n\nimport type { TaskDefinition, TaskUpdateInput } from '../scheduler-types.js'\nimport { core, err, ok } from '@h-ai/core'\nimport { BaseReldbCrudRepository } from '@h-ai/reldb'\nimport { z } from 'zod'\n\nimport { schedulerM } from '../scheduler-i18n.js'\nimport { HaiSchedulerError } from '../scheduler-types.js'\n\nconst logger = core.logger.child({ module: 'scheduler', scope: 'task-repository' })\n\nconst SCHEDULER_TASK_TABLE = 'hai_scheduler_tasks'\n\nconst TaskParamsSchema = z.record(z.string(), z.unknown())\nconst TaskRetryPolicySchema = z.object({\n maxAttempts: z.number().int().min(1),\n backoffMs: z.array(z.number().int().min(0)).optional(),\n})\nconst ApiTaskConfigSchema = z.object({\n kind: z.literal('api'),\n url: z.string().min(1),\n method: z.enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH']).optional(),\n headers: z.record(z.string(), z.string()).optional(),\n body: z.unknown().optional(),\n timeout: z.number().int().positive().optional(),\n})\nconst JsTaskConfigSchema = z.object({\n kind: z.literal('js'),\n code: z.string().min(1),\n timeout: z.number().int().positive().optional(),\n})\nconst TaskHandlerConfigSchema = z.discriminatedUnion('kind', [ApiTaskConfigSchema, JsTaskConfigSchema])\n\ninterface TaskRow {\n id: number\n taskId: string\n taskName: string\n description: string | null\n cron: string\n enabled: boolean\n deleteAfterRun: boolean\n retry: unknown\n params: unknown\n handler: unknown\n createdAt: Date\n updatedAt: Date\n}\n\nexport class SchedulerTaskRepository extends BaseReldbCrudRepository<TaskRow> {\n constructor(db: ReldbFunctions) {\n super(db, {\n table: SCHEDULER_TASK_TABLE,\n idColumn: 'id',\n fields: [\n { fieldName: 'id', columnName: 'id', def: { type: 'INTEGER', primaryKey: true, autoIncrement: true }, select: true, create: false, update: false },\n { fieldName: 'taskId', columnName: 'task_id', def: { type: 'TEXT', notNull: true, unique: true }, select: true, create: true, update: false },\n { fieldName: 'taskName', columnName: 'task_name', def: { type: 'TEXT', notNull: true }, select: true, create: true, update: true },\n { fieldName: 'description', columnName: 'description', def: { type: 'TEXT' }, select: true, create: true, update: true },\n { fieldName: 'cron', columnName: 'cron', def: { type: 'TEXT', notNull: true }, select: true, create: true, update: true },\n { fieldName: 'enabled', columnName: 'enabled', def: { type: 'BOOLEAN', notNull: true, defaultValue: true }, select: true, create: true, update: true },\n { fieldName: 'deleteAfterRun', columnName: 'delete_after_run', def: { type: 'BOOLEAN', notNull: true, defaultValue: false }, select: true, create: true, update: true },\n { fieldName: 'retry', columnName: 'retry', def: { type: 'JSON' }, select: true, create: true, update: true },\n { fieldName: 'params', columnName: 'params', def: { type: 'JSON' }, select: true, create: true, update: true },\n { fieldName: 'handler', columnName: 'handler', def: { type: 'JSON' }, select: true, create: true, update: true },\n { fieldName: 'createdAt', columnName: 'created_at', def: { type: 'TIMESTAMP' }, select: true, create: true, update: false },\n { fieldName: 'updatedAt', columnName: 'updated_at', def: { type: 'TIMESTAMP' }, select: true, create: false, update: true },\n ],\n })\n }\n\n async saveTask(task: TaskDefinition): Promise<HaiResult<void>> {\n try {\n const createResult = await this.create({\n taskId: task.id,\n taskName: task.name,\n description: task.description ?? null,\n cron: task.cron,\n enabled: task.enabled !== false,\n deleteAfterRun: task.deleteAfterRun === true,\n retry: task.retry ?? null,\n params: task.params ?? {},\n handler: task.handler ?? null,\n createdAt: new Date(),\n })\n\n if (!createResult.success) {\n logger.error('Failed to save task definition', { taskId: task.id, error: createResult.error.message })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: createResult.error.message } }),\n createResult.error,\n )\n }\n\n return ok(undefined)\n }\n catch (error) {\n logger.error('Failed to save task definition', { taskId: task.id, error })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', {\n params: { error: error instanceof Error ? error.message : String(error) },\n }),\n error,\n )\n }\n }\n\n async updateTask(taskId: string, updates: TaskUpdateInput): Promise<HaiResult<void>> {\n try {\n const rows = await this.findAll({ where: 'task_id = ?', params: [taskId], limit: 1 })\n if (!rows.success) {\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: rows.error.message } }),\n rows.error,\n )\n }\n\n if (rows.data.length === 0)\n return ok(undefined)\n\n const data: Partial<TaskRow> = {}\n if (updates.name !== undefined)\n data.taskName = updates.name\n if (updates.description !== undefined)\n data.description = updates.description ?? null\n if (updates.cron !== undefined)\n data.cron = updates.cron\n if (updates.enabled !== undefined)\n data.enabled = updates.enabled\n if (updates.deleteAfterRun !== undefined)\n data.deleteAfterRun = updates.deleteAfterRun\n if (updates.retry !== undefined)\n data.retry = updates.retry ?? null\n if (updates.params !== undefined)\n data.params = updates.params\n if (updates.handler !== undefined)\n data.handler = updates.handler ?? null\n\n data.updatedAt = new Date()\n\n if (Object.keys(data).length <= 1)\n return ok(undefined)\n\n const updateResult = await this.updateById(rows.data[0].id, data)\n if (!updateResult.success) {\n logger.error('Failed to update task definition', { taskId, error: updateResult.error.message })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: updateResult.error.message } }),\n updateResult.error,\n )\n }\n\n return ok(undefined)\n }\n catch (error) {\n logger.error('Failed to update task definition', { taskId, error })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', {\n params: { error: error instanceof Error ? error.message : String(error) },\n }),\n error,\n )\n }\n }\n\n async deleteTask(taskId: string): Promise<HaiResult<void>> {\n try {\n const rows = await this.findAll({ where: 'task_id = ?', params: [taskId], limit: 1 })\n if (!rows.success) {\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: rows.error.message } }),\n rows.error,\n )\n }\n\n if (rows.data.length === 0)\n return ok(undefined)\n\n const deleteResult = await this.deleteById(rows.data[0].id)\n if (!deleteResult.success) {\n logger.error('Failed to delete task definition', { taskId, error: deleteResult.error.message })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: deleteResult.error.message } }),\n deleteResult.error,\n )\n }\n\n return ok(undefined)\n }\n catch (error) {\n logger.error('Failed to delete task definition', { taskId, error })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', {\n params: { error: error instanceof Error ? error.message : String(error) },\n }),\n error,\n )\n }\n }\n\n async loadTasks(): Promise<HaiResult<TaskDefinition[]>> {\n try {\n const rows = await this.findAll({ orderBy: 'id ASC' })\n if (!rows.success) {\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: rows.error.message } }),\n rows.error,\n )\n }\n\n const tasks: TaskDefinition[] = []\n for (const row of rows.data) {\n const paramsResult = TaskParamsSchema.safeParse(row.params ?? {})\n if (!paramsResult.success) {\n logger.warn('Skipping task with invalid params', { taskId: row.taskId, error: paramsResult.error.message })\n continue\n }\n\n const handlerResult = row.handler == null\n ? { success: true as const, data: undefined }\n : TaskHandlerConfigSchema.safeParse(row.handler)\n\n if (!handlerResult.success) {\n logger.warn('Skipping task with invalid handler config', { taskId: row.taskId, error: handlerResult.error.message })\n continue\n }\n\n const retryResult = row.retry == null\n ? { success: true as const, data: undefined }\n : TaskRetryPolicySchema.safeParse(row.retry)\n\n if (!retryResult.success) {\n logger.warn('Skipping task with invalid retry policy', { taskId: row.taskId, error: retryResult.error.message })\n continue\n }\n\n tasks.push({\n id: row.taskId,\n name: row.taskName,\n ...(row.description ? { description: row.description } : {}),\n cron: row.cron,\n enabled: row.enabled,\n deleteAfterRun: row.deleteAfterRun,\n ...(retryResult.data ? { retry: retryResult.data } : {}),\n params: paramsResult.data,\n ...(handlerResult.data ? { handler: handlerResult.data } : {}),\n })\n }\n\n return ok(tasks)\n }\n catch (error) {\n logger.error('Failed to load task definitions', { error })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', {\n params: { error: error instanceof Error ? error.message : String(error) },\n }),\n error,\n )\n }\n }\n}\n","/**\n * @h-ai/scheduler — JS 任务编译器\n *\n * 将 JS 函数字符串编译为可执行函数,并基于源码缓存编译结果。\n * @module scheduler-js-compiler\n */\n\nimport type { HaiResult } from '@h-ai/core'\n\nimport type { JsTaskConfig, JsTaskHandler } from './scheduler-types.js'\nimport { createHash } from 'node:crypto'\nimport { Script } from 'node:vm'\nimport { err, ok } from '@h-ai/core'\n\nimport { schedulerM } from './scheduler-i18n.js'\nimport { HaiSchedulerError } from './scheduler-types.js'\n\n/** 已编译 JS 处理器缓存 */\nconst compiledHandlerCache = new Map<string, JsTaskHandler>()\n\nfunction createCacheKey(config: JsTaskConfig): string {\n // 缓存键包含 timeout,确保相同代码不同超时语义不会复用同一处理器\n const keySource = `${config.code}:${config.timeout ?? 0}`\n return createHash('sha256').update(keySource).digest('hex')\n}\n\nexport function clearJsTaskHandlerCache(): void {\n compiledHandlerCache.clear()\n}\n\nexport function compileJsTaskHandler(config: JsTaskConfig): HaiResult<JsTaskHandler> {\n const cacheKey = createCacheKey(config)\n const cachedHandler = compiledHandlerCache.get(cacheKey)\n if (cachedHandler)\n return ok(cachedHandler)\n\n try {\n const script = new Script(`(${config.code})`)\n const candidate = script.runInNewContext({})\n if (typeof candidate !== 'function') {\n return err(\n HaiSchedulerError.JS_COMPILE_FAILED,\n schedulerM('scheduler_jsCompileFailed', { params: { error: 'Compiled result is not a function' } }),\n )\n }\n\n const handler: JsTaskHandler = async (context) => {\n const functionResult = (candidate as JsTaskHandler)(context)\n if (!config.timeout || config.timeout <= 0)\n return functionResult\n\n // 使用显式 Promise,确保函数提前完成时定时器被清理,避免定时器泄漏\n return await new Promise<unknown>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error(`JS task timed out after ${config.timeout}ms`))\n }, config.timeout!)\n Promise.resolve(functionResult).then(\n (result) => {\n clearTimeout(timer)\n resolve(result)\n },\n (error) => {\n clearTimeout(timer)\n reject(error)\n },\n )\n })\n }\n\n compiledHandlerCache.set(cacheKey, handler)\n return ok(handler)\n }\n catch (error) {\n return err(\n HaiSchedulerError.JS_COMPILE_FAILED,\n schedulerM('scheduler_jsCompileFailed', {\n params: { error: error instanceof Error ? error.message : String(error) },\n }),\n error,\n )\n }\n}\n","/**\n * @h-ai/scheduler — 任务执行器\n *\n * 负责执行统一任务模型中的 API / JS / Hook 三类执行路径,并生成执行日志。\n * @module scheduler-executor\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport type { SchedulerLogRepository } from './repositories/index.js'\nimport type { ExecutionStatus, SchedulerLogCleanupPolicy, SchedulerTaskContext, SchedulerTaskExecuteEvent, SchedulerTaskFinishEvent, SchedulerTaskHooks, SchedulerTaskInterruptedEvent, SchedulerTaskStartEvent, TaskDefinition, TaskExecutionLog, TaskExecutionTargetType, TaskTriggerInfo } from './scheduler-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { schedulerM } from './scheduler-i18n.js'\nimport { compileJsTaskHandler } from './scheduler-js-compiler.js'\nimport { HaiSchedulerError } from './scheduler-types.js'\n\nconst logger = core.logger.child({ module: 'scheduler', scope: 'executor' })\n\nlet currentLogRepo: SchedulerLogRepository | null = null\nlet currentCleanupPolicy: SchedulerLogCleanupPolicy = {}\n\nexport function setLogRepository(repo: SchedulerLogRepository | null, cleanupPolicy: SchedulerLogCleanupPolicy = {}): void {\n currentLogRepo = repo\n currentCleanupPolicy = { ...cleanupPolicy }\n}\n\nfunction sanitizeUrl(url: string): string {\n try {\n const parsedUrl = new URL(url)\n if (parsedUrl.password)\n parsedUrl.password = '***'\n if (parsedUrl.username)\n parsedUrl.username = '***'\n return parsedUrl.toString()\n }\n catch {\n return '(invalid url)'\n }\n}\n\nfunction resolveTaskType(task: TaskDefinition, hooks: Readonly<SchedulerTaskHooks>): TaskExecutionTargetType {\n if (task.handler)\n return task.handler.kind\n\n if (hooks.onTaskExecute)\n return 'hook'\n\n return 'hook'\n}\n\nfunction createTaskContext(task: TaskDefinition, trigger: TaskTriggerInfo): SchedulerTaskContext {\n return {\n task,\n taskId: task.id,\n params: task.params ?? {},\n trigger,\n }\n}\n\nasync function notifyTaskStart(hooks: Readonly<SchedulerTaskHooks>, event: SchedulerTaskStartEvent): Promise<void> {\n if (!hooks.onTaskStart)\n return\n\n try {\n await hooks.onTaskStart(event)\n }\n catch (error) {\n logger.warn('Task start hook failed', { taskId: event.task.id, error })\n }\n}\n\nasync function notifyTaskInterrupted(hooks: Readonly<SchedulerTaskHooks>, event: SchedulerTaskInterruptedEvent): Promise<void> {\n if (!hooks.onTaskInterrupted)\n return\n\n try {\n await hooks.onTaskInterrupted(event)\n }\n catch (error) {\n logger.warn('Task interrupted hook failed', { taskId: event.task.id, error })\n }\n}\n\nasync function notifyTaskFinish(hooks: Readonly<SchedulerTaskHooks>, event: SchedulerTaskFinishEvent): Promise<void> {\n if (!hooks.onTaskFinish)\n return\n\n try {\n await hooks.onTaskFinish(event)\n }\n catch (error) {\n logger.warn('Task finish hook failed', { taskId: event.task.id, error })\n }\n}\n\nasync function saveExecutionLog(\n task: TaskDefinition,\n trigger: TaskTriggerInfo,\n taskType: TaskExecutionTargetType,\n status: ExecutionStatus,\n startedAt: number,\n finishedAt: number,\n result: string | null,\n error: string | null,\n): Promise<TaskExecutionLog> {\n const log: TaskExecutionLog = {\n id: 0,\n taskId: task.id,\n taskName: task.name,\n taskType,\n triggerType: trigger.type,\n triggerSource: trigger.source,\n status,\n result,\n error,\n startedAt,\n finishedAt,\n duration: finishedAt - startedAt,\n }\n\n if (!currentLogRepo)\n return log\n\n await currentLogRepo.saveLog(log)\n\n const cleanupResult = await currentLogRepo.cleanupLogs(currentCleanupPolicy)\n if (!cleanupResult.success) {\n logger.warn('Failed to cleanup execution logs', {\n taskId: task.id,\n error: cleanupResult.error.message,\n maxLogs: currentCleanupPolicy.maxLogs,\n retentionDays: currentCleanupPolicy.retentionDays,\n })\n }\n\n return log\n}\n\nexport async function saveInterruptedTaskLog(\n task: TaskDefinition,\n trigger: TaskTriggerInfo,\n reason: string,\n taskType: TaskExecutionTargetType,\n startedAt: number,\n finishedAt: number,\n): Promise<TaskExecutionLog> {\n return saveExecutionLog(task, trigger, taskType, 'interrupted', startedAt, finishedAt, null, reason)\n}\n\nexport async function interruptTask(\n task: TaskDefinition,\n trigger: TaskTriggerInfo,\n reason: string,\n hooks: Readonly<SchedulerTaskHooks>,\n): Promise<TaskExecutionLog> {\n const startedAt = Date.now()\n const taskType = resolveTaskType(task, hooks)\n\n await notifyTaskStart(hooks, { task, trigger, startedAt })\n\n const finishedAt = Date.now()\n const interruptedLog = await saveInterruptedTaskLog(task, trigger, reason, taskType, startedAt, finishedAt)\n\n await notifyTaskInterrupted(hooks, {\n task,\n trigger,\n startedAt,\n interruptedAt: finishedAt,\n reason,\n })\n\n return interruptedLog\n}\n\nexport async function executeJsTask(\n task: TaskDefinition,\n context: SchedulerTaskContext,\n): Promise<HaiResult<string | null>> {\n const handler = task.handler\n if (!handler || handler.kind !== 'js') {\n return err(\n HaiSchedulerError.EXECUTION_FAILED,\n schedulerM('scheduler_invalidHandlerConfig', { params: { taskId: task.id } }),\n )\n }\n\n const compileResult = compileJsTaskHandler(handler)\n if (!compileResult.success)\n return compileResult\n\n try {\n const result = await compileResult.data(context)\n return ok(result !== undefined ? JSON.stringify(result) : null)\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n logger.error('JS task execution failed', { taskId: task.id, error: message })\n return err(\n HaiSchedulerError.JS_EXECUTION_FAILED,\n schedulerM('scheduler_jsExecutionFailed', { params: { error: message } }),\n error,\n )\n }\n}\n\nexport async function executeApiTask(\n task: TaskDefinition,\n context: SchedulerTaskContext,\n): Promise<HaiResult<string | null>> {\n const handler = task.handler\n if (!handler || handler.kind !== 'api') {\n return err(\n HaiSchedulerError.EXECUTION_FAILED,\n schedulerM('scheduler_invalidHandlerConfig', { params: { taskId: task.id } }),\n )\n }\n\n const { url, method = 'GET', headers, body, timeout = 30000 } = handler\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n ...headers,\n ...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),\n },\n signal: controller.signal,\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n })\n\n clearTimeout(timer)\n const responseText = await response.text()\n\n if (!response.ok) {\n logger.error('API task returned non-OK status', {\n taskId: context.taskId,\n status: response.status,\n url: sanitizeUrl(url),\n })\n return err(\n HaiSchedulerError.API_EXECUTION_FAILED,\n schedulerM('scheduler_apiExecutionFailed', {\n params: { error: `HTTP ${response.status}: ${responseText.slice(0, 200)}` },\n }),\n )\n }\n\n return ok(responseText || null)\n }\n catch (error) {\n clearTimeout(timer)\n const message = error instanceof Error ? error.message : String(error)\n logger.error('API task execution failed', { taskId: context.taskId, error: message, url: sanitizeUrl(url) })\n return err(\n HaiSchedulerError.API_EXECUTION_FAILED,\n schedulerM('scheduler_apiExecutionFailed', { params: { error: message } }),\n error,\n )\n }\n}\n\nasync function executeHookTask(\n task: TaskDefinition,\n context: SchedulerTaskContext,\n hooks: Readonly<SchedulerTaskHooks>,\n startedAt: number,\n): Promise<HaiResult<string | null>> {\n if (!hooks.onTaskExecute) {\n return err(\n HaiSchedulerError.EXECUTION_FAILED,\n schedulerM('scheduler_taskHandlerMissing', { params: { taskId: task.id } }),\n )\n }\n\n const executeEvent: SchedulerTaskExecuteEvent = {\n task,\n trigger: context.trigger,\n startedAt,\n context,\n }\n\n try {\n const result = await hooks.onTaskExecute(executeEvent)\n return ok(result !== undefined ? JSON.stringify(result) : null)\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n logger.error('Task execute hook failed', { taskId: task.id, error: message })\n return err(\n HaiSchedulerError.HOOK_EXECUTION_FAILED,\n schedulerM('scheduler_hookExecutionFailed', { params: { error: message } }),\n error,\n )\n }\n}\n\nexport async function executeTask(\n task: TaskDefinition,\n trigger: TaskTriggerInfo,\n hooks: Readonly<SchedulerTaskHooks>,\n): Promise<TaskExecutionLog> {\n const startedAt = Date.now()\n const taskType = resolveTaskType(task, hooks)\n const context = createTaskContext(task, trigger)\n\n await notifyTaskStart(hooks, { task, trigger, startedAt })\n\n let executionResult: HaiResult<string | null>\n let shouldNotifyInterrupted = false\n if (!task.handler) {\n executionResult = await executeHookTask(task, context, hooks, startedAt)\n shouldNotifyInterrupted = !executionResult.success\n }\n else if (task.handler.kind === 'api') {\n executionResult = await executeApiTask(task, context)\n }\n else {\n executionResult = await executeJsTask(task, context)\n }\n\n const finishedAt = Date.now()\n const status: ExecutionStatus = executionResult.success\n ? 'success'\n : (shouldNotifyInterrupted ? 'interrupted' : 'failed')\n const log = await saveExecutionLog(\n task,\n trigger,\n taskType,\n status,\n startedAt,\n finishedAt,\n executionResult.success ? executionResult.data : null,\n executionResult.success ? null : executionResult.error.message,\n )\n\n if (!executionResult.success && shouldNotifyInterrupted) {\n await notifyTaskInterrupted(hooks, {\n task,\n trigger,\n startedAt,\n interruptedAt: finishedAt,\n reason: executionResult.error.message,\n })\n }\n\n if (status !== 'interrupted')\n await notifyTaskFinish(hooks, { task, trigger, startedAt, finishedAt, log })\n\n return log\n}\n","/**\n * @h-ai/scheduler — Cron 表达式工具(基于 croner)\n *\n * 使用 croner 库解析和匹配 cron 表达式。 支持标准 5/6 字段 cron 表达式及扩展语法。\n * @module scheduler-cron\n */\n\nimport type { HaiResult } from '@h-ai/core'\nimport { err, ok } from '@h-ai/core'\nimport { Cron } from 'croner'\n\nimport { schedulerM } from './scheduler-i18n.js'\nimport { HaiSchedulerError } from './scheduler-types.js'\n\n// ─── 公共 API ───\n\n/**\n * 解析 cron 表达式并返回 Cron 实例\n *\n * @param expression - cron 表达式\n * @returns 解析结果,成功时返回 Cron 实例\n *\n * @example\n * ```ts\n * // 每天凌晨 2 点\n * parseCronExpression('0 2 * * *')\n *\n * // 每 5 分钟\n * parseCronExpression('*/5 * * * *')\n *\n * // 工作日 9 点到 17 点每小时\n * parseCronExpression('0 9-17 * * 1-5')\n * ```\n */\nexport function parseCronExpression(expression: string): HaiResult<Cron> {\n try {\n const cron = new Cron(expression, { legacyMode: false })\n return ok(cron)\n }\n catch {\n return err(\n HaiSchedulerError.INVALID_CRON,\n schedulerM('scheduler_invalidCron', { params: { expression } }),\n )\n }\n}\n\n/**\n * 判断给定时间是否匹配 cron 实例\n *\n * @param cron - croner Cron 实例\n * @param date - 要检查的时间\n * @returns 是否匹配\n */\nexport function matchesCron(cron: Cron, date: Date): boolean {\n return cron.match(date)\n}\n","/**\n * @h-ai/scheduler — 业务函数\n *\n * 职责:\n * - 维护任务注册表(内存 Map)、cron 实例缓存、全局生命周期回调(hooks)状态\n * - 实现任务注册 / 注销 / 更新 / 批量加载等业务逻辑\n * - 实现执行日志分页查询\n *\n * 此文件不感知定时器、分布式锁、执行并发等调度运行细节,那些由 scheduler-runner.ts 负责。\n * @module scheduler-functions\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\nimport type { Cron } from 'croner'\nimport type { SchedulerLogRepository, SchedulerTaskRepository } from './repositories/index.js'\nimport type { LogQueryOptions, SchedulerTaskHooks, TaskDefinition, TaskExecutionLog, TaskRetryPolicy, TaskUpdateInput } from './scheduler-types.js'\n\nimport { core, err, ok } from '@h-ai/core'\n\nimport { parseCronExpression } from './scheduler-cron.js'\nimport { schedulerM } from './scheduler-i18n.js'\nimport { HaiSchedulerError } from './scheduler-types.js'\n\nconst logger = core.logger.child({ module: 'scheduler', scope: 'functions' })\n\n// ─── 任务注册表状态 ───\n\n/** 已注册任务(键:taskId) */\nconst taskRegistry = new Map<string, TaskDefinition>()\n\n/** 解析后的 Cron 实例缓存(键:taskId) */\nconst cronCache = new Map<string, Cron>()\n\n/** 当前全局生命周期回调 */\nlet currentHooks: SchedulerTaskHooks = {}\n\n// ─── 任务注册表访问器 ───\n\nexport function getTaskRegistry(): ReadonlyMap<string, TaskDefinition> {\n return taskRegistry\n}\n\nexport function getTask(taskId: string): TaskDefinition | undefined {\n return taskRegistry.get(taskId)\n}\n\nexport function hasTask(taskId: string): boolean {\n return taskRegistry.has(taskId)\n}\n\nexport function setTask(taskId: string, task: TaskDefinition): void {\n taskRegistry.set(taskId, task)\n}\n\nexport function deleteTask(taskId: string): void {\n taskRegistry.delete(taskId)\n}\n\n// ─── Cron 缓存访问器 ───\n\nexport function getCron(taskId: string): Cron | undefined {\n return cronCache.get(taskId)\n}\n\nexport function setCron(taskId: string, cron: Cron): void {\n cronCache.set(taskId, cron)\n}\n\nexport function deleteCron(taskId: string): void {\n cronCache.delete(taskId)\n}\n\n// ─── 生命周期回调访问器 ───\n\nexport function setHooks(hooks: SchedulerTaskHooks): void {\n currentHooks = { ...hooks }\n}\n\nexport function clearHooks(): void {\n currentHooks = {}\n}\n\nexport function getHooks(): Readonly<SchedulerTaskHooks> {\n return currentHooks\n}\n\n// ─── 重置(供 close() 调用) ───\n\nexport function resetTaskState(): void {\n taskRegistry.clear()\n cronCache.clear()\n currentHooks = {}\n}\n\nfunction normalizeTaskDescription(description: string | undefined): string | undefined {\n if (description === undefined)\n return undefined\n\n const trimmed = description.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nfunction validateRetryPolicy(taskId: string, retry: TaskRetryPolicy): HaiResult<TaskRetryPolicy> {\n if (!Number.isInteger(retry.maxAttempts) || retry.maxAttempts < 1) {\n return err(\n HaiSchedulerError.EXECUTION_FAILED,\n schedulerM('scheduler_invalidRetryConfig', { params: { taskId } }),\n )\n }\n\n if (retry.backoffMs !== undefined) {\n const hasInvalidBackoff = retry.backoffMs.some(ms => !Number.isInteger(ms) || ms < 0)\n if (hasInvalidBackoff) {\n return err(\n HaiSchedulerError.EXECUTION_FAILED,\n schedulerM('scheduler_invalidRetryConfig', { params: { taskId } }),\n )\n }\n }\n\n return ok({\n maxAttempts: retry.maxAttempts,\n ...(retry.backoffMs ? { backoffMs: [...retry.backoffMs] } : {}),\n })\n}\n\n// ─── 业务函数 ───\n\nexport async function loadPersistedTasks(taskRepo: SchedulerTaskRepository | null): Promise<void> {\n if (!taskRepo)\n return\n\n const loadResult = await taskRepo.loadTasks()\n if (!loadResult.success) {\n logger.warn('Failed to load persisted tasks', { error: loadResult.error.message })\n return\n }\n\n let loadedCount = 0\n for (const task of loadResult.data) {\n const registerResult = await registerTask(task)\n if (registerResult.success) {\n loadedCount++\n logger.debug('Loaded persisted task', { taskId: task.id, taskName: task.name })\n continue\n }\n\n logger.warn('Failed to load persisted task', { taskId: task.id, error: registerResult.error.message })\n }\n\n if (loadedCount > 0)\n logger.info('Loaded persisted tasks', { count: loadedCount })\n}\n\nexport async function loadConfigTasks(tasks: TaskDefinition[]): Promise<void> {\n let loadedCount = 0\n for (const task of tasks) {\n if (!task.id) {\n logger.warn('Skipping config task with empty id')\n continue\n }\n\n if (hasTask(task.id)) {\n logger.debug('Skipping config task, already registered from DB', { taskId: task.id })\n continue\n }\n\n const registerResult = await registerTask(task)\n if (registerResult.success) {\n loadedCount++\n logger.debug('Loaded config task', { taskId: task.id, taskName: task.name })\n continue\n }\n\n logger.warn('Failed to load config task', { taskId: task.id, error: registerResult.error.message })\n }\n\n if (loadedCount > 0)\n logger.info('Loaded config tasks', { count: loadedCount })\n}\n\nexport async function registerTask(\n task: TaskDefinition,\n taskRepo?: SchedulerTaskRepository | null,\n): Promise<HaiResult<void>> {\n if (!task.id) {\n return err(\n HaiSchedulerError.EXECUTION_FAILED,\n schedulerM('scheduler_taskIdEmpty'),\n )\n }\n\n if (hasTask(task.id)) {\n return err(\n HaiSchedulerError.TASK_ALREADY_EXISTS,\n schedulerM('scheduler_taskAlreadyExists', { params: { taskId: task.id } }),\n )\n }\n\n const cronResult = parseCronExpression(task.cron)\n if (!cronResult.success)\n return cronResult\n\n const retryResult = task.retry ? validateRetryPolicy(task.id, task.retry) : ok(undefined)\n if (!retryResult.success)\n return retryResult\n\n const normalizedTask: TaskDefinition = {\n ...task,\n description: normalizeTaskDescription(task.description),\n enabled: task.enabled !== false,\n deleteAfterRun: task.deleteAfterRun === true,\n retry: retryResult.data,\n params: task.params ?? {},\n }\n\n setTask(task.id, normalizedTask)\n setCron(task.id, cronResult.data)\n\n if (taskRepo) {\n const saveResult = await taskRepo.saveTask(normalizedTask)\n if (!saveResult.success) {\n // 持久化失败:回滚内存状态,避免内存与 DB 之间的状态漂移\n logger.warn('Failed to persist task definition, rolling back in-memory registration', { taskId: task.id, error: saveResult.error.message })\n deleteTask(task.id)\n deleteCron(task.id)\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: saveResult.error.message } }),\n saveResult.error,\n )\n }\n }\n\n return ok(undefined)\n}\n\nexport async function unregisterTask(\n taskId: string,\n taskRepo?: SchedulerTaskRepository | null,\n): Promise<HaiResult<void>> {\n if (!hasTask(taskId)) {\n return err(\n HaiSchedulerError.TASK_NOT_FOUND,\n schedulerM('scheduler_taskNotFound', { params: { taskId } }),\n )\n }\n\n deleteTask(taskId)\n deleteCron(taskId)\n\n if (taskRepo) {\n const deleteResult = await taskRepo.deleteTask(taskId)\n if (!deleteResult.success) {\n // 持久化删除失败:不回滚内存(任务已不应再被调度),但将错误上报给调用方\n logger.warn('Failed to delete persisted task definition', { taskId, error: deleteResult.error.message })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: deleteResult.error.message } }),\n deleteResult.error,\n )\n }\n }\n\n return ok(undefined)\n}\n\nexport async function updateRegisteredTask(\n taskId: string,\n updates: TaskUpdateInput,\n taskRepo?: SchedulerTaskRepository | null,\n): Promise<HaiResult<void>> {\n const existingTask = getTask(taskId)\n if (!existingTask) {\n return err(\n HaiSchedulerError.TASK_NOT_FOUND,\n schedulerM('scheduler_taskNotFound', { params: { taskId } }),\n )\n }\n\n // 提前保存旧 cron 实例,供 DB 失败时回滚使用\n const existingCron = getCron(taskId)\n\n if (updates.cron !== undefined) {\n const cronResult = parseCronExpression(updates.cron)\n if (!cronResult.success)\n return cronResult\n\n setCron(taskId, cronResult.data)\n }\n\n let normalizedRetry: TaskRetryPolicy | null | undefined\n if (updates.retry !== undefined) {\n if (updates.retry === null) {\n normalizedRetry = null\n }\n else {\n const retryResult = validateRetryPolicy(taskId, updates.retry)\n if (!retryResult.success)\n return retryResult\n\n normalizedRetry = retryResult.data\n }\n }\n\n const normalizedDescription = updates.description !== undefined\n ? normalizeTaskDescription(updates.description)\n : undefined\n\n const normalizedUpdates: TaskUpdateInput = {\n ...updates,\n ...(updates.description !== undefined ? { description: normalizedDescription } : {}),\n ...(updates.retry !== undefined ? { retry: normalizedRetry } : {}),\n }\n\n const updatedTask: TaskDefinition = {\n ...existingTask,\n ...(normalizedUpdates.name !== undefined ? { name: normalizedUpdates.name } : {}),\n ...(normalizedUpdates.description !== undefined ? { description: normalizedUpdates.description } : {}),\n ...(normalizedUpdates.cron !== undefined ? { cron: normalizedUpdates.cron } : {}),\n ...(normalizedUpdates.enabled !== undefined ? { enabled: normalizedUpdates.enabled } : {}),\n ...(normalizedUpdates.deleteAfterRun !== undefined ? { deleteAfterRun: normalizedUpdates.deleteAfterRun } : {}),\n ...(normalizedUpdates.retry !== undefined ? { retry: normalizedUpdates.retry ?? undefined } : {}),\n ...(normalizedUpdates.params !== undefined ? { params: normalizedUpdates.params } : {}),\n ...(normalizedUpdates.handler !== undefined ? { handler: normalizedUpdates.handler ?? undefined } : {}),\n }\n\n setTask(taskId, updatedTask)\n\n if (taskRepo) {\n const updateResult = await taskRepo.updateTask(taskId, normalizedUpdates)\n if (!updateResult.success) {\n // 持久化更新失败:回滚内存状态,避免内存与 DB 之间的状态漂移\n logger.warn('Failed to update persisted task definition, rolling back in-memory update', { taskId, error: updateResult.error.message })\n setTask(taskId, existingTask)\n if (updates.cron !== undefined && existingCron)\n setCron(taskId, existingCron)\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: updateResult.error.message } }),\n updateResult.error,\n )\n }\n }\n\n return ok(undefined)\n}\n\nexport async function queryTaskLogs(\n logRepo: SchedulerLogRepository | null,\n options?: LogQueryOptions,\n): Promise<HaiResult<PaginatedResult<TaskExecutionLog>>> {\n if (!logRepo) {\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbNotInitialized'),\n )\n }\n\n return logRepo.queryLogs(options)\n}\n","/**\n * @h-ai/scheduler — 调度运行器\n *\n * 职责:\n * - 维护调度执行期间的进程内状态:运行中任务集合、tick 定时器、上一次 tick 分钟、\n * 分布式锁配置(nodeId / lockTtlSec)\n * - 实现 tick 调度循环(每分钟触发一次)\n * - 通过分布式锁防止多节点重复执行同一分钟的任务\n * - 将具体任务交给 scheduler-executor.ts 执行\n *\n * 此文件不感知任务注册/更新等业务逻辑,那些由 scheduler-functions.ts 负责。\n * @module scheduler-runner\n */\n\nimport type { SchedulerTaskRepository } from './repositories/index.js'\nimport type { TaskDefinition, TaskExecutionLog, TaskTriggerInfo } from './scheduler-types.js'\n\nimport { cache } from '@h-ai/cache'\nimport { core } from '@h-ai/core'\n\nimport { executeTask, interruptTask } from './scheduler-executor.js'\nimport { getCron, getHooks, getTaskRegistry, unregisterTask } from './scheduler-functions.js'\nimport { schedulerM } from './scheduler-i18n.js'\n\nconst logger = core.logger.child({ module: 'scheduler', scope: 'runner' })\n\n// ─── 运行状态 ───\n\n/** 当前正在执行中的任务 ID 集合 */\nconst runningTasks = new Set<string>()\n\n/** 调度器定时器 ID */\nlet tickTimer: ReturnType<typeof setInterval> | null = null\n\n/** 上一次检查的分钟标记(防止同一分钟内多次触发) */\nlet lastTickMinute = -1\n\n/** 当前节点 ID(分布式锁用) */\nlet currentNodeId = ''\n\n/** 当前锁过期时间(秒,分布式锁用) */\nlet currentLockTtlSec = 300\n\n/** 当前任务仓库(用于 deleteAfterRun 持久化删除) */\nlet currentTaskRepo: SchedulerTaskRepository | null = null\n\n// ─── 运行状态访问器(供 main.ts 编排) ───\n\nexport function configureLock(nodeId: string, lockTtlSec: number): void {\n currentNodeId = nodeId\n currentLockTtlSec = lockTtlSec\n}\n\nexport function setTaskRepository(repo: SchedulerTaskRepository | null): void {\n currentTaskRepo = repo\n}\n\nexport function isTaskRunning(taskId: string): boolean {\n return runningTasks.has(taskId)\n}\n\nexport function isTimerRunning(): boolean {\n return tickTimer !== null\n}\n\n// ─── 重置(供 close() 调用) ───\n\nexport function resetRunner(): void {\n runningTasks.clear()\n if (tickTimer) {\n clearInterval(tickTimer)\n tickTimer = null\n }\n lastTickMinute = -1\n currentNodeId = ''\n currentLockTtlSec = 300\n currentTaskRepo = null\n}\n\nasync function sleep(ms: number): Promise<void> {\n if (ms <= 0)\n return\n\n await new Promise(resolve => setTimeout(resolve, ms))\n}\n\nfunction resolveRetryBackoffMs(task: TaskDefinition, attempt: number): number {\n const backoff = task.retry?.backoffMs\n if (!backoff || backoff.length === 0)\n return 0\n\n const index = Math.min(Math.max(attempt - 2, 0), backoff.length - 1)\n return backoff[index] ?? 0\n}\n\n// ─── 调度循环与任务执行 ───\n\nfunction tick(): void {\n const now = new Date()\n const currentMinute = Math.floor(now.getTime() / 60000)\n if (currentMinute === lastTickMinute)\n return\n\n lastTickMinute = currentMinute\n\n for (const [taskId, task] of getTaskRegistry()) {\n if (task.enabled === false)\n continue\n\n const cron = getCron(taskId)\n if (!cron || !cron.match(now))\n continue\n\n if (runningTasks.has(taskId)) {\n logger.debug('Skipping task already running', { taskId, taskName: task.name })\n continue\n }\n\n void runTask(task, currentMinute, { type: 'scheduled', source: null }).catch((error) => {\n logger.error('Unhandled task execution error', { taskId, error })\n })\n }\n}\n\nexport async function runTask(\n task: TaskDefinition,\n minuteTimestamp?: number,\n trigger: TaskTriggerInfo = { type: 'manual', source: null },\n): Promise<TaskExecutionLog> {\n const lockKey = minuteTimestamp !== undefined ? `hai:scheduler:${task.id}:${minuteTimestamp}` : undefined\n\n if (cache.isInitialized && lockKey) {\n const lockResult = await cache.lock.acquire(lockKey, { ttl: currentLockTtlSec, owner: currentNodeId })\n if (!lockResult.success) {\n // lock 服务本身异常时 fail-close:中断任务,避免多节点重复执行\n logger.warn('Failed to acquire distributed lock, interrupting task', { taskId: task.id, error: lockResult.error.message })\n return interruptTask(\n task,\n trigger,\n schedulerM('scheduler_lockAcquireFailed', { params: { taskId: task.id } }),\n getHooks(),\n )\n }\n if (!lockResult.data) {\n logger.debug('Skipping task, another node holds the lock', { taskId: task.id, minuteTimestamp })\n return interruptTask(\n task,\n trigger,\n schedulerM('scheduler_lockAcquireFailed', { params: { taskId: task.id } }),\n getHooks(),\n )\n }\n }\n\n if (runningTasks.has(task.id)) {\n return interruptTask(\n task,\n trigger,\n schedulerM('scheduler_taskRunning', { params: { taskId: task.id } }),\n getHooks(),\n )\n }\n\n runningTasks.add(task.id)\n\n try {\n const maxAttempts = Math.max(1, task.retry?.maxAttempts ?? 1)\n let log: TaskExecutionLog | null = null\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n log = await executeTask(task, trigger, getHooks())\n if (log.status !== 'failed')\n break\n\n if (attempt >= maxAttempts)\n break\n\n const backoffMs = resolveRetryBackoffMs(task, attempt + 1)\n logger.warn('Retrying failed task execution', {\n taskId: task.id,\n attempt,\n maxAttempts,\n backoffMs,\n })\n await sleep(backoffMs)\n }\n\n if (!log) {\n return interruptTask(\n task,\n trigger,\n schedulerM('scheduler_executionFailed', { params: { error: 'Task execution produced no log' } }),\n getHooks(),\n )\n }\n\n if (log.status === 'failed')\n logger.warn('Task execution failed', { taskId: task.id, error: log.error })\n else if (log.status === 'interrupted')\n logger.debug('Task execution interrupted', { taskId: task.id, error: log.error })\n else\n logger.debug('Task execution succeeded', { taskId: task.id, duration: log.duration })\n\n if (task.deleteAfterRun === true) {\n const unregisterResult = await unregisterTask(task.id, currentTaskRepo)\n if (!unregisterResult.success) {\n logger.warn('Failed to auto-delete one-time task after run', {\n taskId: task.id,\n error: unregisterResult.error.message,\n })\n }\n else {\n logger.info('Auto-deleted one-time task after run', { taskId: task.id })\n }\n }\n\n return log\n }\n finally {\n runningTasks.delete(task.id)\n }\n}\n\nexport function startTimer(tickInterval: number): void {\n lastTickMinute = -1\n tickTimer = setInterval(() => tick(), tickInterval)\n}\n\nexport function stopTimer(): void {\n if (!tickTimer)\n return\n\n clearInterval(tickTimer)\n tickTimer = null\n}\n","/**\n * @h-ai/scheduler — 定时任务服务主入口\n *\n * 本文件仅负责生命周期管理(init / close)与 API 编排;\n * 具体业务逻辑委托给 scheduler-functions.ts / scheduler-runner.ts。\n * @module scheduler-main\n */\n\nimport type { HaiResult, PaginatedResult } from '@h-ai/core'\n\nimport type { SchedulerConfig } from './scheduler-config.js'\nimport type { LogQueryOptions, SchedulerFunctions, SchedulerInitInput, SchedulerTaskHooks, TaskDefinition, TaskExecutionLog, TaskUpdateInput, TriggerTaskInput } from './scheduler-types.js'\nimport { cache } from '@h-ai/cache'\nimport { core, err, ok } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\n\nimport { SchedulerLogRepository, SchedulerTaskRepository } from './repositories/index.js'\nimport { SchedulerConfigSchema } from './scheduler-config.js'\nimport { setLogRepository } from './scheduler-executor.js'\nimport { clearHooks, getHooks, getTask, getTaskRegistry, loadConfigTasks, loadPersistedTasks, queryTaskLogs, registerTask, resetTaskState, setHooks, unregisterTask, updateRegisteredTask } from './scheduler-functions.js'\nimport { schedulerM } from './scheduler-i18n.js'\nimport { clearJsTaskHandlerCache } from './scheduler-js-compiler.js'\nimport { configureLock, isTaskRunning, isTimerRunning, resetRunner, runTask, setTaskRepository, startTimer, stopTimer } from './scheduler-runner.js'\nimport { HaiSchedulerError } from './scheduler-types.js'\n\nconst logger = core.logger.child({ module: 'scheduler', scope: 'main' })\n\nlet currentConfig: SchedulerConfig | null = null\nlet initInProgress = false\nlet taskRepo: SchedulerTaskRepository | null = null\nlet logRepo: SchedulerLogRepository | null = null\n\nconst notInitialized = core.module.createNotInitializedKit(\n HaiSchedulerError.NOT_INITIALIZED,\n () => schedulerM('scheduler_notInitialized'),\n)\n\nasync function initDatabase(parsed: SchedulerConfig): Promise<SchedulerConfig> {\n if (!parsed.enableDb)\n return parsed\n\n if (!reldb.isInitialized) {\n logger.error('enableDb is true but @h-ai/reldb is not initialized')\n throw new Error(schedulerM('scheduler_reldbNotInitialized'))\n }\n\n taskRepo = new SchedulerTaskRepository(reldb)\n logRepo = new SchedulerLogRepository(reldb)\n setTaskRepository(taskRepo)\n setLogRepository(logRepo, {\n maxLogs: parsed.maxLogs,\n retentionDays: parsed.retentionDays,\n })\n\n const nodeId = parsed.nodeId ?? crypto.randomUUID()\n const lockTtlSec = Math.ceil(parsed.lockExpireMs / 1000)\n configureLock(nodeId, lockTtlSec)\n\n if (cache.isInitialized)\n logger.info('Distributed lock configured (cache-based)', { nodeId, lockTtlSec })\n else\n logger.warn('Cache module not initialized, distributed lock will be enabled when cache becomes available')\n\n return { ...parsed, nodeId }\n}\n\nfunction normalizeTriggerInput(options?: TriggerTaskInput): { type: 'manual', source: string | null } {\n return {\n type: 'manual',\n source: options?.source ?? null,\n }\n}\n\nexport const scheduler: SchedulerFunctions = {\n async init(config?: SchedulerInitInput): Promise<HaiResult<void>> {\n if (initInProgress) {\n logger.warn('Scheduler init already in progress, skipping concurrent call')\n return err(\n HaiSchedulerError.INIT_FAILED,\n schedulerM('scheduler_initFailed', { params: { error: 'Concurrent initialization detected' } }),\n )\n }\n\n initInProgress = true\n try {\n if (currentConfig) {\n logger.warn('Scheduler module is already initialized, reinitializing')\n await scheduler.close()\n }\n\n logger.info('Initializing scheduler module')\n const { tasks = [], hooks = {}, ...configOptions } = config ?? {}\n\n const parseResult = SchedulerConfigSchema.safeParse(configOptions)\n if (!parseResult.success) {\n logger.error('Scheduler config validation failed', { error: parseResult.error.message })\n return err(\n HaiSchedulerError.CONFIG_ERROR,\n schedulerM('scheduler_configError', { params: { error: parseResult.error.message } }),\n parseResult.error,\n )\n }\n\n try {\n currentConfig = await initDatabase(parseResult.data)\n setHooks(hooks)\n\n await loadPersistedTasks(taskRepo)\n if (tasks.length > 0)\n await loadConfigTasks(tasks)\n\n logger.info('Scheduler module initialized', { enableDb: currentConfig.enableDb, taskCount: getTaskRegistry().size })\n return ok(undefined)\n }\n catch (error) {\n logger.error('Scheduler initialization failed', { error })\n await scheduler.close()\n return err(\n HaiSchedulerError.INIT_FAILED,\n schedulerM('scheduler_initFailed', {\n params: { error: error instanceof Error ? error.message : String(error) },\n }),\n error,\n )\n }\n }\n finally {\n initInProgress = false\n }\n },\n\n async register(task: TaskDefinition): Promise<HaiResult<void>> {\n if (!currentConfig)\n return notInitialized.result()\n\n const registerResult = await registerTask(task, taskRepo)\n if (registerResult.success) {\n logger.info('Task registered', { taskId: task.id, taskName: task.name, cron: task.cron })\n }\n return registerResult\n },\n\n async unregister(taskId: string): Promise<HaiResult<void>> {\n if (!currentConfig)\n return notInitialized.result()\n\n const unregisterResult = await unregisterTask(taskId, taskRepo)\n if (unregisterResult.success)\n logger.info('Task unregistered', { taskId })\n\n return unregisterResult\n },\n\n async updateTask(taskId: string, updates: TaskUpdateInput): Promise<HaiResult<void>> {\n if (!currentConfig)\n return notInitialized.result()\n\n const updateResult = await updateRegisteredTask(taskId, updates, taskRepo)\n if (updateResult.success)\n logger.info('Task updated', { taskId, updates: Object.keys(updates) })\n\n return updateResult\n },\n\n start(): HaiResult<void> {\n if (!currentConfig)\n return notInitialized.result()\n\n if (isTimerRunning()) {\n return err(\n HaiSchedulerError.ALREADY_RUNNING,\n schedulerM('scheduler_alreadyRunning'),\n )\n }\n\n startTimer(currentConfig.tickInterval)\n logger.info('Scheduler started', { tickInterval: currentConfig.tickInterval })\n return ok(undefined)\n },\n\n stop(): HaiResult<void> {\n if (!currentConfig)\n return notInitialized.result()\n\n if (!isTimerRunning()) {\n return err(\n HaiSchedulerError.NOT_RUNNING,\n schedulerM('scheduler_notRunning'),\n )\n }\n\n stopTimer()\n logger.info('Scheduler stopped')\n return ok(undefined)\n },\n\n async trigger(taskId: string, options?: TriggerTaskInput): Promise<HaiResult<TaskExecutionLog>> {\n if (!currentConfig)\n return notInitialized.result()\n\n const task = getTask(taskId)\n if (!task) {\n return err(\n HaiSchedulerError.TASK_NOT_FOUND,\n schedulerM('scheduler_taskNotFound', { params: { taskId } }),\n )\n }\n\n if (isTaskRunning(taskId)) {\n return err(\n HaiSchedulerError.EXECUTION_FAILED,\n schedulerM('scheduler_taskRunning', { params: { taskId } }),\n )\n }\n\n const log = await runTask(task, undefined, normalizeTriggerInput(options))\n return ok(log)\n },\n\n async getLogs(options?: LogQueryOptions): Promise<HaiResult<PaginatedResult<TaskExecutionLog>>> {\n if (!currentConfig)\n return notInitialized.result()\n\n return queryTaskLogs(logRepo, options)\n },\n\n setHooks(hooks: SchedulerTaskHooks): HaiResult<void> {\n if (!currentConfig)\n return notInitialized.result()\n\n setHooks(hooks)\n return ok(undefined)\n },\n\n clearHooks(): HaiResult<void> {\n if (!currentConfig)\n return notInitialized.result()\n\n clearHooks()\n return ok(undefined)\n },\n\n get tasks(): ReadonlyMap<string, TaskDefinition> {\n return getTaskRegistry()\n },\n\n get config(): SchedulerConfig | null {\n return currentConfig\n },\n\n get hooks(): Readonly<SchedulerTaskHooks> {\n return getHooks()\n },\n\n get isInitialized(): boolean {\n return currentConfig !== null\n },\n\n get isRunning(): boolean {\n return isTimerRunning()\n },\n\n async close(): Promise<void> {\n if (!currentConfig) {\n logger.info('Scheduler module already closed, skipping')\n return\n }\n\n logger.info('Closing scheduler module')\n stopTimer()\n clearJsTaskHandlerCache()\n resetTaskState()\n resetRunner()\n setLogRepository(null)\n setTaskRepository(null)\n currentConfig = null\n taskRepo = null\n logRepo = null\n logger.info('Scheduler module closed')\n },\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@h-ai/scheduler",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.1.0-alpha5",
|
|
5
|
+
"description": "Hai Framework task scheduling module with cron, function, and API jobs.",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"croner": "^10.0.1",
|
|
24
|
+
"zod": "^4.3.6",
|
|
25
|
+
"@h-ai/cache": "0.1.0-alpha5",
|
|
26
|
+
"@h-ai/reldb": "0.1.0-alpha5",
|
|
27
|
+
"@h-ai/core": "0.1.0-alpha5"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/node": "^25.1.0",
|
|
31
|
+
"rimraf": "^6.0.1",
|
|
32
|
+
"tsup": "^8.3.5",
|
|
33
|
+
"typescript": "^5.7.2",
|
|
34
|
+
"vitest": "^4.0.18"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsup",
|
|
38
|
+
"dev": "tsup --watch",
|
|
39
|
+
"test": "vitest run",
|
|
40
|
+
"test:watch": "vitest",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"lint": "eslint .",
|
|
43
|
+
"lint:fix": "eslint . --fix",
|
|
44
|
+
"clean": "rimraf dist .turbo"
|
|
45
|
+
}
|
|
46
|
+
}
|