@h-ai/scheduler 0.1.0-alpha.69 → 0.1.0-alpha.71

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/scheduler-config.ts","../messages/en-US.json","../messages/ja-JP.json","../messages/zh-CN.json","../src/scheduler-i18n.ts","../src/scheduler-types.ts","../src/repositories/scheduler-repository-execution.ts","../src/repositories/scheduler-repository-log.ts","../src/repositories/scheduler-repository-task.ts","../src/scheduler-cron.ts","../src/scheduler-functions.ts","../src/scheduler-js-compiler.ts","../src/scheduler-cancellation.ts","../src/scheduler-executor.ts","../src/scheduler-runner.ts","../src/scheduler-main.ts"],"names":["core","BaseReldbCrudRepository","ok","err","logger","z","taskRepo","logRepo","createHash","executionRepo","randomUUID","isDeepStrictEqual"],"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 * import { SchedulerConfigSchema } from '@h-ai/scheduler'\n *\n * const parsed = SchedulerConfigSchema.safeParse({ enableDb: true, tickInterval: 1000, leaseMs: 300000 })\n * if (parsed.success) {\n * const renewalPeriod = Math.floor(parsed.data.leaseMs / 3)\n * }\n * ```\n */\nexport const SchedulerConfigSchema = z.object({\n /** 必须使用共享数据库保存执行状态;false 不再允许,需要先初始化 @h-ai/reldb。 */\n enableDb: z.literal(true).default(true),\n /** 调度检查间隔,单位毫秒(默认 1000,即每秒检查一次) */\n tickInterval: z.number().int().min(100).default(1000),\n /** 执行租约毫秒数(默认 300000,范围 1000–86400000),在途每三分之一周期续期。 */\n leaseMs: z.number().int().min(1000).max(86_400_000).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/**\n * 手动触发边界,重复使用同一幂等键会命中同一个执行记录。\n *\n * @example\n * ```ts\n * import { TriggerTaskSchema } from '@h-ai/scheduler'\n *\n * const parsed = TriggerTaskSchema.safeParse({ source: 'billing-console', idempotencyKey: 'billing-2026-10' })\n * if (parsed.success) {\n * const sameOccurrenceKey = parsed.data.idempotencyKey\n * }\n * ```\n */\nexport const TriggerTaskSchema = z.object({\n source: z.string().max(255).optional(),\n idempotencyKey: z.string().min(1).max(128).optional(),\n})\n\n/**\n * 可信服务端人工核对结果;必须先停止旧 runner,不能将未知执行直接重排。\n *\n * @example\n * ```ts\n * import { ExecutionResolutionSchema, scheduler } from '@h-ai/scheduler'\n *\n * // 可信运维流程已停止旧 runner 并核对实际外部结果。\n * const pending = await scheduler.execution.listUnknown({ limit: 10 })\n * if (!pending.success) throw new Error(pending.error.message)\n * const entry = pending.data[0]\n * if (entry) {\n * const resolution = ExecutionResolutionSchema.parse({ status: 'discarded', expectedUpdatedAt: entry.updatedAt })\n * const resolved = await scheduler.execution.resolveUnknown(entry.occurrenceId, resolution)\n * if (!resolved.success) throw new Error(resolved.error.message)\n * }\n * ```\n */\nexport const ExecutionResolutionSchema = z.object({\n status: z.enum(['success', 'discarded']),\n expectedUpdatedAt: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER - 1),\n})\n\n/**\n * 调度器配置类型\n *\n * @example\n * ```ts\n * import type { SchedulerConfig } from '@h-ai/scheduler'\n * import { SchedulerConfigSchema } from '@h-ai/scheduler'\n *\n * const config: SchedulerConfig = SchedulerConfigSchema.parse({ leaseMs: 60000 })\n * const renewalInterval = config.leaseMs / 3\n * ```\n */\nexport type SchedulerConfig = z.infer<typeof SchedulerConfigSchema>\n\n/**\n * 调度器配置输入类型\n *\n * @example\n * ```ts\n * import type { SchedulerConfigInput } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * // 宿主已成功初始化共享 reldb。\n * const config: SchedulerConfigInput = { leaseMs: 60000, retentionDays: 30 }\n * const initialized = await scheduler.init(config)\n * if (!initialized.success) throw new Error(initialized.error.message)\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_closing\": \"Scheduler is closing; task execution cancelled\",\n \"scheduler_definitionsChanged\": \"Task definitions changed during refresh; retry the operation\",\n \"scheduler_taskNoLongerDue\": \"Task {taskId} was removed, disabled, or rescheduled\",\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_jsTimedOut\": \"JS task timed out after {timeout}ms\",\n \"scheduler_apiExecutionFailed\": \"API call failed: {error}\",\n \"scheduler_apiResponseTooLarge\": \"API response exceeds the {maxResponseBytes} byte limit\",\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_invalidPersistedTask\": \"Invalid persisted task {taskId}: {error}\",\n \"scheduler_taskRunning\": \"Task is currently running: {taskId}\",\n \"scheduler_invalidApiConfig\": \"Invalid api_config for task: {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 \"scheduler_executionUnknown\": \"Execution outcome is unknown; stop the old runner and verify external effects before resolving\",\n \"scheduler_executionStateFailed\": \"Shared execution state unavailable or owner lease lost\",\n \"scheduler_executionInputInvalid\": \"Invalid execution identifier or administration input\",\n \"scheduler_occurrenceHandled\": \"Occurrence already handled for task: {taskId}\",\n \"scheduler_logPersistFailed\": \"Execution log persistence is not confirmed. Repair it by receipt without rerunning the business task\"\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_closing\": \"スケジューラーを終了しています。タスクの実行をキャンセルしました\",\n \"scheduler_definitionsChanged\": \"更新中にタスク定義が変更されました。操作を再試行してください\",\n \"scheduler_taskNoLongerDue\": \"タスク{taskId}が削除、無効化、または再スケジュールされました\",\n \"scheduler_taskNotFound\": \"タスクが見つかりません: {taskId}\",\n \"scheduler_taskAlreadyExists\": \"タスクは既に存在します: {taskId}\",\n \"scheduler_invalidCron\": \"cron式が無効です: {expression}\",\n \"scheduler_executionFailed\": \"タスクの実行に失敗しました: {error}\",\n \"scheduler_jsExecutionFailed\": \"JSコードの実行に失敗しました: {error}\",\n \"scheduler_jsTimedOut\": \"JSタスクが{timeout}msでタイムアウトしました\",\n \"scheduler_apiExecutionFailed\": \"API呼び出しに失敗しました: {error}\",\n \"scheduler_apiResponseTooLarge\": \"APIレスポンスが{maxResponseBytes}バイトの制限を超えています\",\n \"scheduler_dbSaveFailed\": \"実行ログの保存に失敗しました: {error}\",\n \"scheduler_dbNotInitialized\": \"データベースが初期化されていないため、実行ログを保存できません\",\n \"scheduler_configError\": \"スケジューラー設定の検証に失敗しました: {error}\",\n \"scheduler_taskIdEmpty\": \"タスクIDを空にすることはできません\",\n \"scheduler_invalidPersistedTask\": \"保存されたタスク{taskId}が無効です: {error}\",\n \"scheduler_taskRunning\": \"タスクは現在実行中です: {taskId}\",\n \"scheduler_invalidApiConfig\": \"タスクのapi_configが無効です: {taskId}\",\n \"scheduler_jsCompileFailed\": \"JSタスクのコンパイルに失敗しました: {error}\",\n \"scheduler_hookExecutionFailed\": \"タスクのライフサイクルフックの実行に失敗しました: {error}\",\n \"scheduler_taskHandlerMissing\": \"実行可能なハンドラーもグローバルexecuteフックも設定されていません: {taskId}\",\n \"scheduler_invalidHandlerConfig\": \"タスクハンドラーの設定が無効です: {taskId}\",\n \"scheduler_invalidRetryConfig\": \"タスクの再試行ポリシーの設定が無効です: {taskId}\",\n \"scheduler_reldbNotInitialized\": \"enableDbはtrueですが、@h-ai/reldbが初期化されていません。先にreldb.init()を呼び出してください\",\n \"scheduler_executionUnknown\": \"実行結果は不明です。手動解決する前に古い実行プロセスを停止し、外部への影響を確認してください\",\n \"scheduler_executionStateFailed\": \"共有実行状態を利用できないか、所有者リースが失われました\",\n \"scheduler_executionInputInvalid\": \"実行識別子または管理操作の入力が無効です\",\n \"scheduler_occurrenceHandled\": \"タスク {taskId} の今回のスケジュールは既に処理済みです\",\n \"scheduler_logPersistFailed\": \"実行ログの永続化は未確認です。受領記録に基づいてログを補完し、業務タスクを再実行しないでください\"\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_closing\": \"调度器正在关闭,任务执行已取消\",\n \"scheduler_definitionsChanged\": \"刷新期间任务定义已变化,请重试操作\",\n \"scheduler_taskNoLongerDue\": \"任务 {taskId} 已删除、禁用或改变调度时间\",\n \"scheduler_taskNotFound\": \"任务未找到: {taskId}\",\n \"scheduler_taskAlreadyExists\": \"任务已存在: {taskId}\",\n \"scheduler_invalidCron\": \"无效的 cron 表达式: {expression}\",\n \"scheduler_executionFailed\": \"任务执行失败: {error}\",\n \"scheduler_jsExecutionFailed\": \"JS 代码执行失败: {error}\",\n \"scheduler_jsTimedOut\": \"JS 任务执行超过 {timeout} 毫秒\",\n \"scheduler_apiExecutionFailed\": \"API 调用失败: {error}\",\n \"scheduler_apiResponseTooLarge\": \"API 响应超过 {maxResponseBytes} 字节上限\",\n \"scheduler_dbSaveFailed\": \"保存执行记录失败: {error}\",\n \"scheduler_dbNotInitialized\": \"数据库未初始化,无法保存执行记录\",\n \"scheduler_configError\": \"调度器配置校验失败:{error}\",\n \"scheduler_taskIdEmpty\": \"任务 ID 不能为空\",\n \"scheduler_invalidPersistedTask\": \"持久化任务 {taskId} 无效:{error}\",\n \"scheduler_taskRunning\": \"任务正在执行中: {taskId}\",\n \"scheduler_invalidApiConfig\": \"任务 api_config 格式无效: {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 \"scheduler_executionUnknown\": \"执行结果未知;请先终止旧 runner 并核对外部副作用后裁定\",\n \"scheduler_executionStateFailed\": \"共享执行状态不可用或 owner 租约已失效\",\n \"scheduler_executionInputInvalid\": \"执行标识或运维输入不合法\",\n \"scheduler_occurrenceHandled\": \"本次调度已处理: {taskId}\",\n \"scheduler_logPersistFailed\": \"执行日志尚未确认持久化,请按执行回执补写;不要重新执行业务\"\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 messagesJaJP from '../messages/ja-JP.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\n// ─── i18n ───\n\n/**\n * 定时任务模块文案 Key 类型\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const key: SchedulerMessageKey = 'scheduler_taskNotFound'\n * const message = schedulerM(key, { params: { taskId: 'daily-report' } })\n * ```\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 * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const message = schedulerM('scheduler_taskNotFound', { params: { taskId: 'daily-report' } })\n * ```\n */\nexport const schedulerM = core.i18n.createMessageGetter<SchedulerMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n 'ja-JP': messagesJaJP,\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 JS_COMPILE_FAILED: '030:500',\n HOOK_EXECUTION_FAILED: '031:500',\n LOG_PERSIST_FAILED: '032:500',\n} as const satisfies ErrorInfo\n\n/**\n * Scheduler 领域错误定义;业务调用先判断 success 再按错误码分支。\n *\n * @example\n * ```ts\n * import { HaiSchedulerError, scheduler } from '@h-ai/scheduler'\n *\n * const result = await scheduler.trigger('missing-task')\n * if (!result.success && result.error.code === HaiSchedulerError.TASK_NOT_FOUND.code) {\n * const missingTask = true\n * }\n * ```\n */\nexport const HaiSchedulerError = core.error.buildHaiErrorsDef('scheduler', SchedulerErrorInfo)\n\n// ─── 任务定义 ───\n\n/**\n * 任务参数字典(键值对)\n *\n * @example\n * ```ts\n * import type { TaskParams } from '@h-ai/scheduler'\n *\n * const params: TaskParams = { month: '2026-10', dryRun: true }\n * const month = params.month\n * ```\n */\nexport type TaskParams = Record<string, unknown>\n\n/**\n * 任务触发类型\n *\n * @example\n * ```ts\n * import type { TaskTriggerType } from '@h-ai/scheduler'\n *\n * const triggerType: TaskTriggerType = 'manual'\n * const isManual = triggerType === 'manual'\n * ```\n */\nexport type TaskTriggerType = 'scheduled' | 'manual'\n\n/**\n * 任务处理器类型\n *\n * @example\n * ```ts\n * import type { TaskHandlerKind } from '@h-ai/scheduler'\n *\n * const kind: TaskHandlerKind = 'api'\n * const needsNetwork = kind === 'api'\n * ```\n */\nexport type TaskHandlerKind = 'api' | 'js'\n\n/**\n * 失败重试策略\n *\n * @example\n * ```ts\n * import type { TaskRetryPolicy } from '@h-ai/scheduler'\n *\n * const retry: TaskRetryPolicy = { maxAttempts: 3, backoffMs: [1000, 5000] }\n * // 只有外部副作用确实按 occurrenceId 持久去重时,任务才能声明 idempotent。\n * ```\n */\nexport interface TaskRetryPolicy {\n /** 最大尝试次数(含首次及崩溃恢复,范围 1–100,默认 1)。 */\n maxAttempts: number\n /** 每次重试前的退避时间(毫秒);按顺序对应第 2、3... 次尝试 */\n backoffMs?: number[]\n}\n\n/**\n * 任务执行目标类型\n *\n * @example\n * ```ts\n * import type { TaskExecutionTargetType } from '@h-ai/scheduler'\n *\n * const target: TaskExecutionTargetType = 'hook'\n * const usesHostCallback = target === 'hook'\n * ```\n */\nexport type TaskExecutionTargetType = TaskHandlerKind | 'hook'\n\n/**\n * API 任务配置\n *\n * @example\n * ```ts\n * import type { ApiTaskConfig } from '@h-ai/scheduler'\n *\n * const handler: ApiTaskConfig = { kind: 'api', url: 'https://example.com/health', method: 'GET', timeout: 5000, maxResponseBytes: 4096 }\n * // API 接收端若支持重试,须持久处理 Idempotency-Key 与 fencing 元数据。\n * ```\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 /** 响应体实际接收字节上限,必须为正安全整数(默认 1048576,即 1 MiB) */\n maxResponseBytes?: number\n}\n\n/**\n * JS 任务配置\n *\n * ⚠️ 安全警示:`code` 仅允许受信任的服务端代码(例如仓库内常量或受控部署配置)。\n * 当前实现通过 Node.js `vm` 便捷执行,不构成安全沙箱;禁止直接接收用户、租户或后台自由输入的 JS 字符串。\n * 多租户或可配置任务优先使用 `kind: 'api'` 或 `hooks.onTaskExecute`。\n *\n * `code` 为 JS 函数字符串,例如:\n * `(context) => ({ taskId: context.task.id, params: context.params })`\n *\n * @example\n * ```ts\n * import type { JsTaskConfig } from '@h-ai/scheduler'\n *\n * const handler: JsTaskConfig = { kind: 'js', code: '(context) => ({ taskId: context.taskId })', timeout: 1000 }\n * // 仅装载受信任的服务端源码;工作线程不是不可信代码沙箱。\n * ```\n */\nexport interface JsTaskConfig {\n /** 处理器类型 */\n kind: 'js'\n /** JS 函数字符串(仅允许受信任的服务端代码,不是安全沙箱) */\n code: string\n /** 独立线程执行期限,单位毫秒(默认 30000,含线程启动);超时终止线程后才允许重试 */\n timeout?: number\n}\n\n/**\n * 统一任务处理器配置\n *\n * @example\n * ```ts\n * import type { TaskHandlerConfig } from '@h-ai/scheduler'\n *\n * const handler: TaskHandlerConfig = { kind: 'api', url: 'https://example.com/health' }\n * const timeout = handler.timeout ?? 30000\n * ```\n */\nexport type TaskHandlerConfig = ApiTaskConfig | JsTaskConfig\n\n/**\n * 任务定义\n *\n * @example\n * ```ts\n * import type { TaskDefinition } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * // 宿主已成功初始化共享 reldb 与 scheduler。\n * const definition: TaskDefinition = { ...{ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }, handler: { kind: 'api', url: 'https://example.com/health', maxResponseBytes: 4096 } }\n * const registered = await scheduler.register(definition)\n * if (!registered.success) throw new Error(registered.error.message)\n * ```\n */\nexport interface TaskDefinition {\n /** 任务唯一标识 */\n id: string\n /** 任务名称 */\n name: string\n /** 任务描述 */\n description?: string\n /** cron 表达式(标准 5 字段:分 时 日 月 周) */\n cron: string\n /** IANA 时区,用于解释 cron 墙上时间;省略或清空时统一使用 UTC,不读取节点 TZ。 */\n timezone?: string\n /** 是否启用(默认 true) */\n enabled?: boolean\n /** 是否在执行后自动删除(默认 false) */\n deleteAfterRun?: boolean\n /** 失败重试策略 */\n retry?: TaskRetryPolicy\n /** 全部副作用按 context.occurrenceId 原子持久去重时才为 true;默认 false,未知结果禁止自动重跑。 */\n idempotent?: boolean\n /** 通用参数 */\n params?: TaskParams\n /** 任务处理器;为空时可由全局事件回调统一处理 */\n handler?: TaskHandlerConfig\n}\n\n// ─── 触发与执行上下文 ───\n\n/**\n * 任务触发信息\n *\n * @example\n * ```ts\n * import type { TaskTriggerInfo } from '@h-ai/scheduler'\n *\n * const trigger: TaskTriggerInfo = { type: 'manual', source: 'billing-console' }\n * const source = trigger.source ?? 'cron'\n * ```\n */\nexport interface TaskTriggerInfo {\n /** 触发类型 */\n type: TaskTriggerType\n /** 触发来源;定时触发时通常为 null,手工触发时可指定渠道 */\n source: string | null\n}\n\n/**\n * 任务执行上下文\n *\n * @example\n * ```ts\n * import type { SchedulerTaskContext } from '@h-ai/scheduler'\n *\n * function safeReceipt(context: SchedulerTaskContext): string {\n * if (!context.occurrenceId || !context.executionToken) throw new Error('Shared execution identity required')\n * return context.occurrenceId\n * }\n * // 接收端将稳定 receipt 原子持久去重;executionToken 不写入用户可见日志。\n * ```\n */\nexport interface SchedulerTaskContext {\n /** 一次调度发生的稳定标识;所有重试共享,供宿主构造业务幂等键。 */\n occurrenceId?: string\n /** 当前领取独有的凭据,用于宿主条件提交;续租失败后不能继续产生副作用。 */\n executionToken?: string\n /** 数据库执行序号;与 attempt 组成接收端可比较的 fencing 版本。 */\n sequence?: number\n /** 同一 occurrence 中持久化的尝试次数。 */\n attempt?: number\n /** 当前任务 */\n task: TaskDefinition\n /** 任务 ID */\n taskId: string\n /** 当前参数快照 */\n params: TaskParams\n /** 触发信息 */\n trigger: TaskTriggerInfo\n}\n\n/**\n * 编译后的 JS 任务函数\n *\n * @example\n * ```ts\n * import type { JsTaskHandler } from '@h-ai/scheduler'\n *\n * const handler: JsTaskHandler = (context, signal) => {\n * signal?.throwIfAborted()\n * return { taskId: context.taskId, batch: context.params.batch }\n * }\n * ```\n */\nexport type JsTaskHandler = (context: SchedulerTaskContext, signal?: AbortSignal) => unknown | Promise<unknown>\n\n// ─── 生命周期回调 ───\n\n/**\n * 任务开始事件\n *\n * @example\n * ```ts\n * import type { SchedulerTaskStartEvent } from '@h-ai/scheduler'\n *\n * function summarizeStart(event: SchedulerTaskStartEvent) {\n * return { taskId: event.task.id, occurrenceId: event.context?.occurrenceId, observedAt: event.startedAt }\n * }\n * ```\n */\nexport interface SchedulerTaskStartEvent {\n /** 已领取执行的持久身份,观测回调也可据此标记或幂等处理;竞争中断时不存在。 */\n context?: SchedulerTaskContext\n /** 关闭调度器时取消;回调必须停止后续副作用并释放资源 */\n signal: AbortSignal\n /** 当前任务 */\n task: TaskDefinition\n /** 触发信息 */\n trigger: TaskTriggerInfo\n /** 开始时间(Unix 时间戳,毫秒) */\n startedAt: number\n}\n\n/**\n * 任务执行事件\n *\n * @example\n * ```ts\n * import type { SchedulerTaskExecuteEvent } from '@h-ai/scheduler'\n *\n * function execute(event: SchedulerTaskExecuteEvent) {\n * event.signal.throwIfAborted()\n * return { taskId: event.context.taskId, params: event.context.params }\n * }\n * ```\n */\nexport interface SchedulerTaskExecuteEvent extends SchedulerTaskStartEvent {\n /** 执行上下文 */\n context: SchedulerTaskContext\n}\n\n/**\n * 任务中断事件\n *\n * @example\n * ```ts\n * import type { SchedulerTaskInterruptedEvent } from '@h-ai/scheduler'\n *\n * function summarizeInterruption(event: SchedulerTaskInterruptedEvent) {\n * return { taskId: event.task.id, reason: event.reason, observedAt: event.interruptedAt }\n * }\n * // 中断观测不能证明外部副作用不存在。\n * ```\n */\nexport interface SchedulerTaskInterruptedEvent extends SchedulerTaskStartEvent {\n /** 中断时间(Unix 时间戳,毫秒) */\n interruptedAt: number\n /** 中断原因 */\n reason: string\n}\n\n/**\n * 任务结束事件\n *\n * @example\n * ```ts\n * import type { SchedulerTaskFinishEvent } from '@h-ai/scheduler'\n *\n * function needsLogRepair(event: SchedulerTaskFinishEvent): boolean {\n * return event.log.persistence.status === 'pending'\n * }\n * // 结束回调是观测;业务是否已提交以 journal 为准。\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 *\n * @example\n * ```ts\n * import type { SchedulerTaskHooks } from '@h-ai/scheduler'\n *\n * const hooks: SchedulerTaskHooks = {\n * onTaskExecute: ({ context, signal }) => {\n * signal.throwIfAborted()\n * return { taskId: context.taskId }\n * },\n * }\n * // 有副作用的宿主需使用 context.occurrenceId 和持久条件写入。\n * ```\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/**\n * 执行状态\n *\n * @example\n * ```ts\n * import type { ExecutionStatus } from '@h-ai/scheduler'\n *\n * function needsReconciliation(status: ExecutionStatus): boolean {\n * return status === 'unknown'\n * }\n * // unknown 先隔离旧执行并核对外部效果,不换键重试。\n * ```\n */\nexport type ExecutionStatus = 'success' | 'failed' | 'interrupted' | 'unknown'\n\n/**\n * 日志投影状态,与业务 status 独立;unconfirmed 表示没有可补写的已确认终态。\n *\n * @example\n * ```ts\n * import type { TaskLogPersistence } from '@h-ai/scheduler'\n *\n * const persistence: TaskLogPersistence = { status: 'pending', error: { code: 'hai:scheduler:032', message: 'Log projection pending' } }\n * const needsRepair = persistence.status === 'pending'\n * ```\n */\nexport interface TaskLogPersistence {\n /** pending 可由已发布 journal 补写;persisted 已确认日志和回执;unconfirmed 不能推断业务结果。 */\n status: 'pending' | 'persisted' | 'unconfirmed'\n /** 安全的公开错误,不包含 SQL、驱动 cause 或连接参数。 */\n error?: { code: string, message: string }\n}\n\n/**\n * 任务执行日志\n *\n * @example\n * ```ts\n * import type { TaskExecutionLog } from '@h-ai/scheduler'\n *\n * function summarize(log: TaskExecutionLog) {\n * return { businessStatus: log.status, logStatus: log.persistence.status, occurrenceId: log.occurrenceId }\n * }\n * // pending 的成功业务只补写日志,不重跑处理器。\n * ```\n */\nexport interface TaskExecutionLog {\n /** 持久执行回执;相同定时 occurrence 或手动幂等键共用。 */\n occurrenceId?: string\n /** 每次尝试固定的 UUID 主键;未知写入回执或并发补写均复用。 */\n id: string\n /** 独立持久化状态;业务成功不等于日志保存成功。 */\n persistence: TaskLogPersistence\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 /** 序列化 JS/Hook 结果或 API 响应正文;无结果为 null */\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 *\n * @example\n * ```ts\n * import type { LogQueryOptions } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * const options: LogQueryOptions = { taskId: 'daily-report', status: 'success', pagination: { page: 1, pageSize: 20 } }\n * const logs = await scheduler.getLogs(options)\n * if (!logs.success) throw new Error(logs.error.message)\n * const page = logs.data.items\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/**\n * 日志清理策略\n *\n * @example\n * ```ts\n * import type { SchedulerLogCleanupPolicy } from '@h-ai/scheduler'\n *\n * const policy: SchedulerLogCleanupPolicy = { maxLogs: 1000, retentionDays: 30 }\n * // 仅清理日志投影,不撤销或重排共享 execution journal。\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 *\n * @example\n * ```ts\n * import type { TaskUpdateInput } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * const updates: TaskUpdateInput = { enabled: false, timezone: null }\n * const changed = await scheduler.updateTask('daily-report', updates)\n * if (!changed.success) throw new Error(changed.error.message)\n * // null 时区恢复 UTC,任务 ID 不能修改。\n * ```\n */\nexport interface TaskUpdateInput {\n /** 全部副作用的持久去重能力声明。 */\n idempotent?: boolean\n /** 任务名称 */\n name?: string\n /** 任务描述 */\n description?: string\n /** cron 表达式 */\n cron?: string\n /** IANA 时区;传 null 表示清空并恢复 UTC,不读取节点 TZ。 */\n timezone?: string | null\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/**\n * 手工触发输入\n *\n * @example\n * ```ts\n * import type { TriggerTaskInput } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * const options: TriggerTaskInput = { source: 'billing-console', idempotencyKey: 'billing-2026-10' }\n * const result = await scheduler.trigger('daily-report', options)\n * if (!result.success) throw new Error(result.error.message)\n * const status = result.data.status\n * ```\n */\nexport interface TriggerTaskInput {\n /** 手工触发来源(例如 admin-console / api / cli) */\n source?: string\n /** 稳定业务触发键(1–128 字符);同任务重复使用会命中同一持久执行。 */\n idempotencyKey?: string\n}\n\n/**\n * 可信运维可见的执行状态;unknown 继续占用任务串行槽。\n *\n * @example\n * ```ts\n * import type { SchedulerExecutionState } from '@h-ai/scheduler'\n *\n * function occupiesUncertainSlot(state: SchedulerExecutionState): boolean {\n * return state === 'unknown'\n * }\n * ```\n */\nexport type SchedulerExecutionState = 'claimed' | 'running' | ExecutionStatus | 'discarded'\n\n/**\n * 不包含代码、参数、URL 或 owner 凭据的共享执行记录。\n *\n * @example\n * ```ts\n * import type { SchedulerExecutionEntry } from '@h-ai/scheduler'\n *\n * function publicAudit(entry: SchedulerExecutionEntry) {\n * return { occurrenceId: entry.occurrenceId, status: entry.status, revision: entry.updatedAt }\n * }\n * // 安全投影不包含 owner token 和业务载荷。\n * ```\n */\nexport interface SchedulerExecutionEntry {\n /** 稳定执行回执。 */\n occurrenceId: string\n /** 任务标识。 */\n taskId: string\n /** 共享状态。 */\n status: SchedulerExecutionState\n /** 数据库序号,配合 attempt 用于外部 fencing。 */\n sequence: number\n /** 已开始的尝试次数。 */\n attemptCount: number\n /** 最近状态版本(Unix 毫秒),用于人工裁定条件。 */\n updatedAt: number\n /** 日志投影独立状态;pending 不会重新排队业务。 */\n logPersistence: TaskLogPersistence['status']\n}\n\n/**\n * 可信服务端的执行查询与人工核对入口。\n *\n * @example\n * ```ts\n * import type { SchedulerExecutionOperations } from '@h-ai/scheduler'\n *\n * async function repairPending(execution: SchedulerExecutionOperations) {\n * const pending = await execution.listLogFailures({ limit: 20 })\n * if (!pending.success) return pending\n * for (const entry of pending.data) {\n * const repaired = await execution.repairLog(entry.occurrenceId)\n * if (!repaired.success) return repaired\n * }\n * }\n * // 此链路不会调用业务 handler。\n * ```\n */\nexport interface SchedulerExecutionOperations {\n /** 按回执查询安全元数据。@example await scheduler.execution.get(occurrenceId) */\n get: (occurrenceId: string) => Promise<HaiResult<SchedulerExecutionEntry | null>>\n /** 有界查询待核对的 unknown;每页 1–100 条。@example await scheduler.execution.listUnknown({ limit: 50, offset: 0 }) */\n listUnknown: (options?: { limit?: number, offset?: number }) => Promise<HaiResult<SchedulerExecutionEntry[]>>\n /** 分页查询已有终态但日志尚待补写的回执,不含业务载荷。@example await scheduler.execution.listLogFailures({ limit: 50 }) */\n listLogFailures: (options?: { limit?: number, offset?: number }) => Promise<HaiResult<SchedulerExecutionEntry[]>>\n /** 只从已发布 journal 幂等补写日志,不执行业务;并发调用安全。@example await scheduler.execution.repairLog(occurrenceId) */\n repairLog: (occurrenceId: string) => Promise<HaiResult<void>>\n /** 先终止旧 runner 并核对外部结果,再条件裁定;不能重新排队。@example await scheduler.execution.resolveUnknown(id, { status: 'discarded', expectedUpdatedAt: entry.updatedAt }) */\n resolveUnknown: (occurrenceId: string, resolution: { status: 'success' | 'discarded', expectedUpdatedAt: number }) => Promise<HaiResult<void>>\n}\n\n// ─── 初始化输入 ───\n\n/**\n * 调度器初始化输入\n *\n * 包含调度器配置、可选的预定义任务列表,以及可选的全局生命周期回调。\n *\n * @example\n * ```ts\n * import type { SchedulerInitInput } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * // 宿主已成功初始化共享 reldb。\n * const input: SchedulerInitInput = { leaseMs: 60000, tasks: [{ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }], hooks: { onTaskExecute: ({ context }) => ({ taskId: context.taskId }) } }\n * const initialized = await scheduler.init(input)\n * if (!initialized.success) throw new Error(initialized.error.message)\n * ```\n */\nexport interface SchedulerInitInput extends SchedulerConfigInput {\n /** 预定义任务列表(从配置中加载,初始化时自动注册) */\n tasks?: TaskDefinition[]\n /** 全局任务生命周期回调 */\n hooks?: SchedulerTaskHooks\n}\n\n// ─── 调度器接口 ───\n\n/**\n * 调度器函数接口\n *\n * @example\n * ```ts\n * import type { SchedulerFunctions } from '@h-ai/scheduler'\n *\n * async function stopScheduler(instance: SchedulerFunctions) {\n * const stopped = instance.stop()\n * if (!stopped.success) return stopped\n * await instance.close()\n * }\n * // close 返回 Promise<void>,宿主随后关闭自己拥有的共享数据库。\n * ```\n */\nexport interface SchedulerFunctions {\n /** 共享执行状态、未知结果查询与可信人工裁定。 */\n readonly execution: SchedulerExecutionOperations\n /** 刷新共享数据库中的任务定义,用于跨实例配置读取。 */\n refreshTasks: () => Promise<HaiResult<void>>\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 * 跨节点执行日志与任务串行槽;唯一约束和 owner 条件是调度正确性的依据。\n * @module scheduler-repository-execution\n */\nimport type { HaiResult } from '@h-ai/core'\nimport type { ReldbFunctions } from '@h-ai/reldb'\nimport type { SchedulerExecutionEntry, SchedulerExecutionState, TaskDefinition, TaskExecutionLog, TaskTriggerInfo } from '../scheduler-types.js'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { err, ok } from '@h-ai/core'\nimport { BaseReldbCrudRepository } from '@h-ai/reldb'\nimport { schedulerM } from '../scheduler-i18n.js'\nimport { HaiSchedulerError } from '../scheduler-types.js'\n\nconst TABLE = 'hai_scheduler_executions'\n\n/**\n * 内部持久执行记录;owner 不对运维查询输出。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function inspect(repository: SchedulerExecutionRepository) {\n * const result = await repository.expired()\n * if (!result.success) return result\n * const records: StoredExecution[] = result.data\n * return records.map(executionEntry)\n * }\n * ```\n */\nexport interface StoredExecution {\n /** 全局递增的数据库序号。 */\n sequence: number\n /** 固定执行身份,跨重试及恢复不变。 */\n occurrenceId: string\n /** 任务标识。 */\n taskId: string\n /** 占据的串行槽;只有确认终态才置空。 */\n activeTask?: string\n /** 共享状态机阶段。 */\n status: SchedulerExecutionState\n /** 当前领取独有的凭据。 */\n owner?: string\n /** 有效租约的 Unix 毫秒截止点。 */\n leasedUntil: number\n /** 已通过副作用门闩的次数。 */\n attemptCount: number\n /** 本 occurrence 保存的次数上限。 */\n maxAttempts: number\n /** 初次领取时声明的持久幂等能力。 */\n idempotent: boolean\n /** 首次领取时的任务定义 JSON。 */\n snapshot: string\n /** 首次触发的类型、来源和可选分钟槽 JSON。 */\n triggerJson: string\n /** 已确认结果 JSON,用于相同手动键返回持久结果。 */\n logJson?: string\n /** 已确认终态的全部尝试日志 JSON;日志投影失败或进程退出后仍可补写。 */\n logsJson?: string\n /** 与业务阶段独立的日志投影状态。 */\n logPersistence: 'pending' | 'persisted' | 'unconfirmed'\n /** 最近共享状态更新时间(Unix 毫秒)。 */\n updatedAt: number\n /** 初次领取时间(Unix 毫秒)。 */\n createdAt: number\n}\n\n/**\n * 稳定 occurrence 包含 taskId,避免不同任务的相同业务键冲突。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const scheduledId = executionId('daily-report', 'scheduled', String(Math.floor(1792705800000 / 60000)))\n * const manualId = executionId('daily-report', 'manual', 'report-2026-10-23')\n * ```\n */\nexport function executionId(taskId: string, type: string, key: string): string {\n return createHash('sha256').update(JSON.stringify([taskId, type, key])).digest('hex')\n}\n\n/**\n * 公共状态投影只保留运维元数据。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function read(repository: SchedulerExecutionRepository, id: string) {\n * const found = await repository.byOccurrence(id)\n * if (!found.success) return found\n * return found.data ? executionEntry(found.data) : null\n * }\n * ```\n */\nexport function executionEntry(row: StoredExecution): SchedulerExecutionEntry {\n return { occurrenceId: row.occurrenceId, taskId: row.taskId, status: row.status, sequence: row.sequence, attemptCount: row.attemptCount, updatedAt: row.updatedAt, logPersistence: row.logPersistence }\n}\n\n/** 统一持久状态失败;不回退为本地执行。 */\nfunction failed(cause?: unknown) {\n return err(HaiSchedulerError.DB_SAVE_FAILED, schedulerM('scheduler_executionStateFailed'), cause)\n}\n\n/**\n * 执行仓库;active_task 唯一列直到已确认的终态才释放,覆盖 cron/manual/跨分钟。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function claimOnce(db: ReldbFunctions) {\n * const repository = new SchedulerExecutionRepository(db)\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const id = executionId(task.id, 'manual', 'report-2026-10-23')\n * const claimed = await repository.claim(task, id, { type: 'manual', source: null }, 'node-report', 60000)\n * if (!claimed.success || !claimed.data) return claimed\n * const begun = await repository.begin(claimed.data, 60000)\n * if (!begun.success) return begun\n * return executionEntry(claimed.data)\n * }\n * ```\n */\nexport class SchedulerExecutionRepository extends BaseReldbCrudRepository<StoredExecution> {\n constructor(db: ReldbFunctions) {\n super(db, {\n table: TABLE,\n idColumn: 'sequence',\n idField: 'sequence',\n fields: [\n { fieldName: 'sequence', columnName: 'sequence', def: { type: 'INTEGER', primaryKey: true, autoIncrement: true }, select: true, create: false, update: false },\n ...[\n ['occurrenceId', 'occurrence_id', true, true],\n ['taskId', 'task_id', true, false],\n ['activeTask', 'active_task', false, true],\n ['status', 'status', true, false],\n ['owner', 'owner', false, false],\n ['snapshot', 'snapshot', true, false],\n ['triggerJson', 'trigger_json', true, false],\n ['logJson', 'log_json', false, false],\n ['logsJson', 'logs_json', false, false],\n ['logPersistence', 'log_persistence', true, false],\n ].map(([fieldName, columnName, notNull, unique]) => ({\n fieldName: String(fieldName),\n columnName: String(columnName),\n def: { type: ['snapshot', 'triggerJson', 'logJson', 'logsJson'].includes(String(fieldName)) ? 'JSON' as const : 'TEXT' as const, notNull: Boolean(notNull), unique: Boolean(unique) },\n select: true,\n create: true,\n update: true,\n })),\n ...[\n ['leasedUntil', 'leased_until'],\n ['attemptCount', 'attempt_count'],\n ['maxAttempts', 'max_attempts'],\n ['updatedAt', 'updated_at'],\n ['createdAt', 'created_at'],\n ].map(([fieldName, columnName]) => ({\n fieldName,\n columnName,\n def: { type: 'BIGINT' as const, notNull: true },\n select: true,\n create: true,\n update: true,\n })),\n { fieldName: 'idempotent', columnName: 'idempotent', def: { type: 'BOOLEAN', notNull: true }, select: true, create: true, update: true },\n ],\n })\n }\n\n /**\n * 只按已初始化的数据库类型选择存储端毫秒时钟。\n * PostgreSQL/MySQL 使用执行时钟,不能使用固定在事务/语句开始处的时间快照。\n * 期限表达式直接进入有 owner 条件的 SQL;先 SELECT 时间再写入仍有等待窗口。\n *\n * @example\n * ```ts\n * // 模块内部上下文:当前仓库实例仅生成固定白名单 SQL,不接收调用方表达式。\n * const deadlinePredicate = `leased_until > ${this.databaseClock()}`\n * ```\n */\n private databaseClock(): string {\n if (this.db.config?.type === 'postgresql')\n return 'CAST(FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) AS BIGINT)'\n if (this.db.config?.type === 'mysql')\n return 'CAST(UNIX_TIMESTAMP(SYSDATE(3)) * 1000 AS UNSIGNED)'\n return 'CAST((julianday(\\'now\\') - 2440587.5) * 86400000 AS INTEGER)'\n }\n\n /** 同毫秒内的持久状态版本仍单调增加,日志确认/人工裁定不依赖节点墙钟。 */\n private nextUpdatedAt(): string {\n const clock = this.databaseClock()\n return `CASE WHEN updated_at >= ${clock} THEN updated_at + 1 ELSE ${clock} END`\n }\n\n /** 存储端毫秒时钟供 cron 计算共享分钟身份;读取失败停止本轮调度,不回退节点时钟。 */\n async currentTime(): Promise<HaiResult<number>> {\n const result = await this.db.sql.get<{ now: number | string }>(`SELECT ${this.databaseClock()} AS now`)\n if (!result.success)\n return failed(result.error)\n const now = Number(result.data?.now)\n return Number.isSafeInteger(now) && now >= 0 ? ok(now) : failed()\n }\n\n /** 读取统一校验 BIGINT,不能把 PG 字符串时间或舍入的序号用于 owner 判断。 */\n private normalize(row: StoredExecution): HaiResult<StoredExecution> {\n const value = { ...row }\n // JSON 大载荷避免 MySQL 的 TEXT→VARCHAR(255) 映射;驱动解码后统一恢复内部 JSON 文本契约。\n for (const field of ['snapshot', 'triggerJson', 'logJson', 'logsJson'] as const) {\n if (row[field] !== undefined && row[field] !== null && typeof row[field] !== 'string')\n value[field] = JSON.stringify(row[field])\n }\n for (const field of ['sequence', 'leasedUntil', 'attemptCount', 'maxAttempts', 'updatedAt', 'createdAt'] as const) {\n const number = Number(row[field])\n if (!Number.isSafeInteger(number) || number < 0)\n return failed()\n value[field] = number\n }\n return ok(value)\n }\n\n /** 按稳定回执读取。@example await repository.byOccurrence(id) */\n async byOccurrence(id: string): Promise<HaiResult<StoredExecution | null>> {\n const rows = await this.findAll({ where: 'occurrence_id = ?', params: [id], limit: 1 })\n if (!rows.success)\n return failed(rows.error)\n return rows.data[0] ? this.normalize(rows.data[0]) : ok(null)\n }\n\n /** 有界读取过期执行,跨分钟恢复原 occurrence,而不是创建新的副作用身份。@example await repository.expired() */\n async expired(): Promise<HaiResult<StoredExecution[]>> {\n return this.rows(`status IN (?, ?) AND leased_until <= ${this.databaseClock()}`, ['claimed', 'running'], 100, 0)\n }\n\n /** 任务被删除或触发元数据损坏时,过期记录隔离为 unknown,允许可信人工核对而非永久悬挂。 */\n async isolateExpired(row: StoredExecution): Promise<HaiResult<void>> {\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, owner = NULL, leased_until = 0, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND owner = ? AND leased_until <= ${this.databaseClock()} AND status IN (?, ?)`,\n ['unknown', row.occurrenceId, row.owner, 'claimed', 'running'],\n )\n return result.success && result.data.changes === 1 ? ok(undefined) : failed()\n }\n\n /** 有界读取待人工核对记录。@example await repository.unknown(50, 0) */\n async unknown(limit: number, offset: number): Promise<HaiResult<StoredExecution[]>> {\n return this.rows('status = ?', ['unknown'], limit, offset)\n }\n\n /** 仅查询已发布终态且日志待补写的回执。@example await repository.pendingLogs(50, 0) */\n async pendingLogs(limit: number, offset: number): Promise<HaiResult<StoredExecution[]>> {\n return this.rows('log_persistence = ? AND status NOT IN (?, ?)', ['pending', 'claimed', 'running'], limit, offset)\n }\n\n /**\n * 确认相同终态快照的日志投影;不变更业务状态,不重新领取任务。\n * @example await repository.confirmLogs(row)\n */\n async confirmLogs(row: StoredExecution): Promise<HaiResult<void>> {\n if (!row.logJson || !row.logsJson)\n return failed()\n const log = JSON.parse(row.logJson) as TaskExecutionLog\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET log_persistence = ?, log_json = ?, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND updated_at = ? AND log_persistence = ? AND status NOT IN (?, ?)`,\n ['persisted', JSON.stringify({ ...log, persistence: { status: 'persisted' } }), row.occurrenceId, row.updatedAt, 'pending', 'claimed', 'running'],\n )\n if (result.success && result.data.changes === 1)\n return ok(undefined)\n const current = await this.byOccurrence(row.occurrenceId)\n return current.success && current.data?.logPersistence === 'persisted' && current.data.logsJson === row.logsJson ? ok(undefined) : failed()\n }\n\n private async rows(where: string, params: unknown[], limit: number, offset: number): Promise<HaiResult<StoredExecution[]>> {\n const result = await this.findAll({ where, params, limit, offset, orderBy: 'sequence ASC' })\n if (!result.success)\n return failed(result.error)\n const rows: StoredExecution[] = []\n for (const row of result.data) {\n const normalized = this.normalize(row)\n if (!normalized.success)\n return normalized\n rows.push(normalized.data)\n }\n return ok(rows)\n }\n\n /**\n * 唯一 active_task 防止不同 occurrence 并行;同 occurrence 只可恢复安全的过期记录。\n * @example await repository.claim(task, id, trigger, nodeId, leaseMs)\n */\n async claim(task: TaskDefinition, id: string, trigger: TaskTriggerInfo, nodeId: string, leaseMs: number): Promise<HaiResult<StoredExecution | null>> {\n const ready = await this.ensureReady()\n if (!ready.success)\n return failed(ready.error)\n const clock = this.databaseClock()\n const owner = `${nodeId}:${randomUUID()}`\n let created: HaiResult<unknown>\n try {\n // INSERT 的期限和初始时间与存储端同一语句计算,不接受本机 Date.now() 授权。\n created = await this.db.sql.execute(\n `INSERT INTO ${TABLE} (occurrence_id, task_id, active_task, status, owner, leased_until, attempt_count, max_attempts, idempotent, snapshot, trigger_json, log_persistence, updated_at, created_at)\n VALUES (?, ?, ?, ?, ?, ${clock} + ?, 0, ?, ?, ?, ?, ?, ${clock}, ${clock})`,\n [id, task.id, task.id, 'claimed', owner, leaseMs, task.retry?.maxAttempts ?? 1, this.db.config?.type === 'postgresql' ? task.idempotent === true : Number(task.idempotent === true), JSON.stringify(task), JSON.stringify(trigger), 'unconfirmed'],\n )\n }\n catch (cause) {\n return failed(cause)\n }\n const existing = await this.byOccurrence(id)\n if (!existing.success)\n return existing\n if (!existing.data) {\n // 冲突可能来自另一个 occurrence 的串行槽;只有实际存在占用者才按正常竞争处理。\n const active = await this.findAll({ where: 'active_task = ?', params: [task.id], limit: 1 })\n return active.success && active.data.length > 0 ? ok(null) : failed(created.success ? undefined : created.error)\n }\n const row = existing.data\n if (created.success || ['success', 'failed', 'interrupted', 'discarded'].includes(row.status))\n return ok(row)\n if (row.status === 'unknown')\n return ok(null)\n // 是否过期只在下方写语句里判断,不能先用某个节点的墙钟决定接管或隔离。\n if (row.status === 'running' && (!row.idempotent || row.attemptCount >= row.maxAttempts)) {\n const isolated = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, owner = NULL, leased_until = 0, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND owner = ? AND leased_until <= ${clock} AND status = ?`,\n ['unknown', id, row.owner, 'running'],\n )\n return isolated.success ? ok(null) : failed(isolated.error)\n }\n const recovered = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, owner = ?, leased_until = ${clock} + ?, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND owner = ? AND leased_until <= ${clock} AND status IN (?, ?)`,\n ['claimed', owner, leaseMs, id, row.owner, 'claimed', 'running'],\n )\n if (!recovered.success)\n return failed(recovered.error)\n return recovered.data.changes === 1 ? this.byOccurrence(id) : ok(null)\n }\n\n /** 外部副作用前的条件门闩,并原子递增持久尝试次数。@example await repository.begin(row, leaseMs) */\n async begin(row: StoredExecution, leaseMs: number): Promise<HaiResult<void>> {\n const clock = this.databaseClock()\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, attempt_count = attempt_count + 1, leased_until = ${clock} + ?, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND owner = ? AND leased_until > ${clock} AND status IN (?, ?) AND attempt_count < max_attempts`,\n ['running', leaseMs, row.occurrenceId, row.owner, 'claimed', 'running'],\n )\n if (!result.success || result.data.changes !== 1)\n return failed(result.success ? undefined : result.error)\n row.status = 'running'\n row.attemptCount += 1\n return ok(undefined)\n }\n\n /** 只续租仍然有效的 owner;过期凭据不能复活。@example await repository.renew(row, leaseMs) */\n async renew(row: StoredExecution, leaseMs: number): Promise<HaiResult<void>> {\n const clock = this.databaseClock()\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET leased_until = ${clock} + ?, updated_at = ${this.nextUpdatedAt()} WHERE occurrence_id = ? AND owner = ? AND leased_until > ${clock} AND status IN (?, ?)`,\n [leaseMs, row.occurrenceId, row.owner, 'claimed', 'running'],\n )\n return result.success && result.data.changes === 1 ? ok(undefined) : failed()\n }\n\n /** 有效 owner 确认终态;unknown 保留串行槽,阻止下一 cron/manual 与旧副作用并行。@example await repository.finish(row, log) */\n async finish(row: StoredExecution, log: TaskExecutionLog, logs: TaskExecutionLog[] = [log]): Promise<HaiResult<void>> {\n const clock = this.databaseClock()\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, active_task = ?, owner = NULL, leased_until = 0, log_json = ?, logs_json = ?, log_persistence = ?, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND owner = ? AND leased_until > ${clock} AND status IN (?, ?)`,\n [log.status, log.status === 'unknown' ? row.taskId : null, JSON.stringify(log), JSON.stringify(logs), 'pending', row.occurrenceId, row.owner, 'claimed', 'running'],\n )\n return result.success && result.data.changes === 1 ? ok(undefined) : failed()\n }\n\n /** 人工隔离旧 runner 后条件裁定;不重排旧 occurrence,只有成功裁定才释放任务槽。@example await repository.resolve(id, 'discarded', updatedAt) */\n async resolve(id: string, status: 'success' | 'discarded', expectedUpdatedAt: number): Promise<HaiResult<void>> {\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, active_task = NULL, updated_at = ${this.nextUpdatedAt()} WHERE occurrence_id = ? AND status = ? AND updated_at = ?`,\n [status, id, 'unknown', expectedUpdatedAt],\n )\n return result.success && result.data.changes === 1 ? ok(undefined) : failed()\n }\n}\n","/**\n * @h-ai/scheduler — 执行日志仓库\n *\n * 基于 @h-ai/reldb BaseReldbCrudRepository 实现执行日志的持久化与查询。\n * @module scheduler-repository-log\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 { isDeepStrictEqual } from 'node:util'\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\n/**\n * 内部持久日志行;UUID 是幂等主键,完整 payload 使用 JSON 保存而不截断结果。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function persistedRow(payload: TaskExecutionLog): LogRow {\n * return { id: payload.id, occurrenceId: payload.occurrenceId, taskId: payload.taskId, taskName: payload.taskName, taskType: payload.taskType, triggerType: payload.triggerType, triggerSource: payload.triggerSource, status: payload.status, payload, startedAt: payload.startedAt, finishedAt: payload.finishedAt, duration: payload.duration }\n * }\n * ```\n */\ninterface LogRow {\n id: string\n occurrenceId?: string\n taskId: string\n taskName: string\n taskType: string\n triggerType: string\n triggerSource: string | null\n status: string\n payload: TaskExecutionLog\n startedAt: number\n finishedAt: number\n duration: number\n}\n\n/**\n * 内部日志投影仓库;固定 UUID 与完整内容比对处理提交后回执丢失,不能因日志失败重跑业务。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function inspect(db: ReldbFunctions) {\n * const repository = new SchedulerLogRepository(db)\n * const logs = await repository.queryLogs({ taskId: 'daily-report', pagination: { page: 1, pageSize: 20 } })\n * if (!logs.success) return logs\n * return logs.data.items\n * }\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: 'TEXT', primaryKey: true }, select: true, create: true, update: false },\n { fieldName: 'occurrenceId', columnName: 'occurrence_id', def: { type: 'TEXT' }, select: true, create: true, 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: 'payload', columnName: 'payload', def: { type: 'JSON', notNull: true }, select: true, create: true, update: false },\n { fieldName: 'startedAt', columnName: 'started_at', def: { type: 'BIGINT', notNull: true }, select: true, create: true, update: false },\n { fieldName: 'finishedAt', columnName: 'finished_at', def: { type: 'BIGINT', 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 /**\n * 按固定 UUID 写入完整日志;写入失败后重读相同主键,只有真实内容相同才视为已保存。\n * @example `const saved = await repository.saveLog(log); if (!saved.success) return saved`\n */\n async saveLog(log: TaskExecutionLog): Promise<HaiResult<void>> {\n const payload: TaskExecutionLog = { ...log, persistence: { status: 'persisted' } }\n try {\n const created = await this.create({\n id: log.id,\n occurrenceId: log.occurrenceId,\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 payload,\n startedAt: log.startedAt,\n finishedAt: log.finishedAt,\n duration: log.duration,\n })\n if (created.success)\n return ok(undefined)\n }\n catch {\n // 驱动可能在提交后丢失回执;下方真实读取确认,不依据重复错误文案猜测。\n }\n try {\n const existing = await this.findById(log.id)\n if (existing.success && existing.data && isDeepStrictEqual(existing.data.payload, payload))\n return ok(undefined)\n }\n catch {}\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\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: 'started_at DESC, 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 => ({ ...row.payload, persistence: { status: 'persisted' as const } })),\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-repository-task\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).max(100),\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 maxResponseBytes: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).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})\n/**\n * 注册与持久读取共用的处理器校验,拒绝未开始发送就可以识别的非法配置。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const parsed = TaskHandlerConfigSchema.safeParse({ kind: 'api', url: 'https://example.com/health', timeout: 1000, maxResponseBytes: 4096 })\n * if (!parsed.success) throw new Error('Invalid handler configuration')\n * const kind = parsed.data.kind\n * ```\n */\nexport const TaskHandlerConfigSchema = z.discriminatedUnion('kind', [ApiTaskConfigSchema, JsTaskConfigSchema])\n\n/**\n * 内部任务持久行;JSON 字段读取后重新校验,null 时区表示默认 UTC。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const now = new Date()\n * const row: TaskRow = { id: 1, taskId: 'daily-report', taskName: '每日报表', description: null, cron: '0 2 * * *', timezone: null, enabled: true, idempotent: false, deleteAfterRun: false, retry: null, params: {}, handler: null, createdAt: now, updatedAt: now }\n * // timezone null 由任务装载流程恢复为 UTC 默认;JSON 字段仍须运行时校验。\n * ```\n */\ninterface TaskRow {\n id: number\n taskId: string\n taskName: string\n description: string | null\n cron: string\n timezone: string | null\n enabled: boolean\n idempotent: boolean\n deleteAfterRun: boolean\n retry: unknown\n params: unknown\n handler: unknown\n createdAt: Date\n updatedAt: Date\n}\n\n/**\n * 共享任务定义仓库;成功落库后才发布本地投影,一次性任务删除核对实际执行的定义快照。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function save(db: ReldbFunctions) {\n * const repository = new SchedulerTaskRepository(db)\n * const result = await repository.saveTask({ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' })\n * if (!result.success) return result\n * return repository.loadTasks()\n * }\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: 'timezone', columnName: 'timezone', def: { type: 'TEXT' }, 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: 'idempotent', columnName: 'idempotent', def: { type: 'BOOLEAN', notNull: true, defaultValue: false }, 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 timezone: task.timezone ?? null,\n enabled: task.enabled !== false,\n idempotent: task.idempotent === true,\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.timezone !== undefined)\n data.timezone = updates.timezone ?? null\n if (updates.enabled !== undefined)\n data.enabled = updates.enabled\n if (updates.idempotent !== undefined)\n data.idempotent = updates.idempotent\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 /** 删除任务;自动清理携带执行定义,在同一条 DELETE 内原子比较,保留并发编辑。 */\n async deleteTask(taskId: string, expected?: TaskDefinition): Promise<HaiResult<boolean>> {\n try {\n if (expected) {\n const conditions = ['task_id = ?', 'task_name = ?', 'cron = ?', 'COALESCE(timezone, \\'\\') = ?', 'COALESCE(description, \\'\\') = ?', 'enabled = ?', 'delete_after_run = ?', 'idempotent = ?']\n const postgres = this.db.config?.type === 'postgresql'\n const enabled = expected.enabled !== false\n const deleteAfterRun = expected.deleteAfterRun === true\n const params: unknown[] = [taskId, expected.name, expected.cron, expected.timezone ?? '', expected.description ?? '', postgres ? enabled : Number(enabled), postgres ? deleteAfterRun : Number(deleteAfterRun), postgres ? expected.idempotent === true : Number(expected.idempotent === true)]\n const jsonValue = this.db.config?.type === 'mysql' ? 'CAST(? AS JSON)' : this.db.config?.type === 'postgresql' ? 'CAST(? AS JSONB)' : '?'\n // JSON 比较使用各数据库的原生类型;标识符仅来自固定列白名单。\n const jsonFields: Array<[string, unknown]> = [['retry', expected.retry], ['params', expected.params ?? {}], ['handler', expected.handler]]\n for (const [column, value] of jsonFields) {\n if (value === undefined || value === null) {\n // CRUD 的 JSON 列可能保存 JSON null,而不是 SQL NULL,两者都表示未配置。\n conditions.push(`(${column} IS NULL OR ${column} = ${jsonValue})`)\n params.push('null')\n }\n else {\n conditions.push(`${column} = ${jsonValue}`)\n params.push(JSON.stringify(value))\n }\n }\n const deleted = await this.db.sql.execute(`DELETE FROM ${SCHEDULER_TASK_TABLE} WHERE ${conditions.join(' AND ')}`, params)\n return deleted.success ? ok(deleted.data.changes > 0) : deleted\n }\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(false)\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(deleteResult.data.changes > 0)\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 return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidPersistedTask', { params: { taskId: row.taskId, error: paramsResult.error.message } }))\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 return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidPersistedTask', { params: { taskId: row.taskId, error: handlerResult.error.message } }))\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 return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidPersistedTask', { params: { taskId: row.taskId, error: retryResult.error.message } }))\n }\n\n tasks.push({\n id: row.taskId,\n name: row.taskName,\n ...(row.description ? { description: row.description } : {}),\n cron: row.cron,\n ...(row.timezone ? { timezone: row.timezone } : {}),\n enabled: row.enabled,\n idempotent: row.idempotent,\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 — 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 * @param timezone - IANA 时区;省略时使用 UTC,不读取节点本地 TZ。\n * @returns 解析结果,成功时返回 Cron 实例\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const parsed = parseCronExpression('0 2 * * *')\n * if (!parsed.success) return parsed\n * const due = matchesCron(parsed.data, new Date('2026-10-23T02:00:00Z'))\n * return due\n * ```\n */\nexport function parseCronExpression(expression: string, timezone?: string): HaiResult<Cron> {\n try {\n const cron = new Cron(expression, { legacyMode: false, timezone: timezone ?? 'UTC' })\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const parsed = parseCronExpression('0 10 * * *', 'Asia/Shanghai')\n * if (!parsed.success) return parsed\n * const due = matchesCron(parsed.data, new Date('2026-10-23T02:00:00Z'))\n * return due\n * ```\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 { TaskHandlerConfigSchema } from './repositories/scheduler-repository-task.js'\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>()\nconst persistedTaskIds = new Set<string>()\nlet definitionEpoch = 0\n/** 同一快照的并发读取共用一次查询,避免互相推进 epoch 后误判写冲突。 */\nlet activeRefresh: { repository: SchedulerTaskRepository, epoch: number, promise: Promise<HaiResult<void>> } | undefined\n\n/** 当前全局生命周期回调 */\nlet currentHooks: SchedulerTaskHooks = {}\n\n// ─── 任务注册表访问器 ───\n\n/**\n * 读取本节点已校验的任务投影;共享定义由刷新流程更新。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const enabled = [...getTaskRegistry().values()].filter(task => task.enabled !== false)\n * ```\n */\nexport function getTaskRegistry(): ReadonlyMap<string, TaskDefinition> {\n return taskRegistry\n}\n\n/**\n * 按任务 ID 读取本地只读投影,不访问数据库。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task = getTask('daily-report')\n * if (task) {\n * const cronExpression = task.cron\n * }\n * ```\n */\nexport function getTask(taskId: string): TaskDefinition | undefined {\n return taskRegistry.get(taskId)\n}\n\n/**\n * 检查当前投影是否含任务;不代替共享数据库的唯一约束。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * if (!hasTask('daily-report')) {\n * const registered = await registerTask({ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' })\n * if (!registered.success) return registered\n * }\n * return getTask('daily-report')\n * ```\n */\nexport function hasTask(taskId: string): boolean {\n return taskRegistry.has(taskId)\n}\n\n/**\n * 发布已校验且已持久化的任务投影,并推进本地快照代际。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * setTask(task.id, task)\n * ```\n */\nexport function setTask(taskId: string, task: TaskDefinition): void {\n definitionEpoch++\n taskRegistry.set(taskId, task)\n}\n\n/**\n * 删除本地投影并推进代际;公共注销先确认数据库删除成功。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * deleteTask('daily-report')\n * deleteCron('daily-report')\n * ```\n */\nexport function deleteTask(taskId: string): void {\n definitionEpoch++\n taskRegistry.delete(taskId)\n}\n\n// ─── Cron 缓存访问器 ───\n\n/**\n * 读取任务已解析的 cron;时区由任务定义明确或默认 UTC。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const cron = getCron('daily-report')\n * const due = cron?.match(new Date('2026-10-23T02:00:00Z')) ?? false\n * ```\n */\nexport function getCron(taskId: string): Cron | undefined {\n return cronCache.get(taskId)\n}\n\n/**\n * 缓存已成功解析的 cron 实例。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const parsed = parseCronExpression('0 2 * * *', 'UTC')\n * if (!parsed.success) return parsed\n * setCron('daily-report', parsed.data)\n * return parsed.data\n * ```\n */\nexport function setCron(taskId: string, cron: Cron): void {\n cronCache.set(taskId, cron)\n}\n\n/**\n * 移除任务的 cron 缓存;不删除持久定义。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * deleteCron('daily-report')\n * ```\n */\nexport function deleteCron(taskId: string): void {\n cronCache.delete(taskId)\n}\n\n// ─── 生命周期回调访问器 ───\n\n/**\n * 复制宿主回调配置;副作用的幂等与协作取消由宿主实现。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * setHooks({ onTaskExecute: ({ context, signal }) => {\n * signal.throwIfAborted()\n * return { taskId: context.taskId }\n * } })\n * ```\n */\nexport function setHooks(hooks: SchedulerTaskHooks): void {\n currentHooks = { ...hooks }\n}\n\n/**\n * 清空当前宿主回调,不能撤销已经开始的外部操作。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * clearHooks()\n * const remaining = getHooks().onTaskExecute\n * ```\n */\nexport function clearHooks(): void {\n currentHooks = {}\n}\n\n/**\n * 读取当前宿主回调的只读视图。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const hooks = getHooks()\n * const usesHostHandler = hooks.onTaskExecute !== undefined\n * ```\n */\nexport function getHooks(): Readonly<SchedulerTaskHooks> {\n return currentHooks\n}\n\n// ─── 重置(供 close() 调用) ───\n\n/**\n * 关闭时使旧刷新快照失效并清空任务、cron 和宿主回调。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // 关闭流程已排空 runner 后再丢弃所有投影与在途刷新句柄。\n * resetTaskState()\n * ```\n */\nexport function resetTaskState(): void {\n definitionEpoch++\n activeRefresh = undefined\n persistedTaskIds.clear()\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 || retry.maxAttempts > 100) {\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\n/**\n * 合并同一任务仓库的在途刷新;配置写入或关闭后不复用旧快照。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function refresh(repository: SchedulerTaskRepository) {\n * const result = await loadPersistedTasks(repository)\n * if (!result.success) return result\n * return [...getTaskRegistry().values()]\n * }\n * ```\n */\nexport async function loadPersistedTasks(taskRepo: SchedulerTaskRepository | null): Promise<HaiResult<void>> {\n if (!taskRepo)\n return ok(undefined)\n\n const epoch = definitionEpoch\n if (activeRefresh?.repository === taskRepo && activeRefresh.epoch === epoch)\n return activeRefresh.promise\n const refresh = { repository: taskRepo, epoch, promise: refreshPersistedTasks(taskRepo, epoch) }\n activeRefresh = refresh\n try {\n return await refresh.promise\n }\n finally {\n if (activeRefresh === refresh)\n activeRefresh = undefined\n }\n}\n\n/** 验证完整持久快照后替换内存投影;发生本地写入时拒绝覆盖更新。 */\nasync function refreshPersistedTasks(taskRepo: SchedulerTaskRepository, epoch: number): Promise<HaiResult<void>> {\n const loadResult = await taskRepo.loadTasks()\n if (!loadResult.success)\n return loadResult\n\n if (epoch !== definitionEpoch)\n return err(HaiSchedulerError.EXECUTION_FAILED, schedulerM('scheduler_definitionsChanged'))\n\n // 先完整验证快照再整体替换;保留仅由本节点配置声明的任务。\n const nextTasks = new Map([...taskRegistry].filter(([id]) => !persistedTaskIds.has(id)))\n const nextCrons = new Map([...cronCache].filter(([id]) => !persistedTaskIds.has(id)))\n for (const task of loadResult.data) {\n if (!task.id)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_taskIdEmpty'))\n if (nextTasks.has(task.id))\n return err(HaiSchedulerError.TASK_ALREADY_EXISTS, schedulerM('scheduler_taskAlreadyExists', { params: { taskId: task.id } }))\n const cronResult = parseCronExpression(task.cron, task.timezone)\n if (!cronResult.success)\n return cronResult\n nextTasks.set(task.id, task)\n nextCrons.set(task.id, cronResult.data)\n }\n definitionEpoch++\n taskRegistry.clear()\n cronCache.clear()\n persistedTaskIds.clear()\n for (const [id, task] of nextTasks)\n taskRegistry.set(id, task)\n for (const [id, cron] of nextCrons)\n cronCache.set(id, cron)\n for (const task of loadResult.data)\n persistedTaskIds.add(task.id)\n return ok(undefined)\n}\n\n/**\n * 顺序校验并加载初始化配置的本地投影;公共初始化随后按真实生命周期接入仓库。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const loaded = await loadConfigTasks([{ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }])\n * if (!loaded.success) return loaded\n * return [...getTaskRegistry().values()]\n * ```\n */\nexport async function loadConfigTasks(tasks: TaskDefinition[]): Promise<HaiResult<void>> {\n for (const task of tasks) {\n const registerResult = await registerTask(task)\n if (!registerResult.success)\n return registerResult\n }\n return ok(undefined)\n}\n\n/**\n * 校验完整定义并先持久化再开放本地调度;失败不发布半成品。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function register(repository: SchedulerTaskRepository) {\n * const result = await registerTask({ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }, repository)\n * if (!result.success) return result\n * return getTask('daily-report')\n * }\n * ```\n */\nexport async function registerTask(\n task: TaskDefinition,\n taskRepo?: SchedulerTaskRepository | null,\n): Promise<HaiResult<void>> {\n if ((task.handler && !TaskHandlerConfigSchema.safeParse(task.handler).success)\n || (task.idempotent !== undefined && typeof task.idempotent !== 'boolean')) {\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidHandlerConfig', { params: { taskId: task.id } }))\n }\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, task.timezone)\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 timezone: task.timezone,\n enabled: task.enabled !== false,\n idempotent: task.idempotent === true,\n deleteAfterRun: task.deleteAfterRun === true,\n retry: retryResult.data,\n params: task.params ?? {},\n }\n\n if (taskRepo) {\n const saveResult = await taskRepo.saveTask(normalizedTask)\n if (!saveResult.success) {\n logger.warn('Failed to persist task definition', { taskId: task.id, error: saveResult.error.message })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: saveResult.error.message } }),\n saveResult.error,\n )\n }\n persistedTaskIds.add(task.id)\n }\n\n // 成功落库后才开放调度,失败的保存不能提前执行。\n setTask(task.id, normalizedTask)\n setCron(task.id, cronResult.data)\n\n return ok(undefined)\n}\n\n/**\n * 先条件删除共享定义,再清除本地任务和 cron;失败保留原投影。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function unregister(repository: SchedulerTaskRepository) {\n * const result = await unregisterTask('daily-report', repository)\n * if (!result.success) return result\n * return result\n * }\n * ```\n */\nexport async function unregisterTask(\n taskId: string,\n taskRepo?: SchedulerTaskRepository | null,\n expected?: TaskDefinition,\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 if (taskRepo) {\n const deleteResult = await taskRepo.deleteTask(taskId, expected)\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 if (expected && !deleteResult.data)\n return ok(undefined)\n }\n\n deleteTask(taskId)\n deleteCron(taskId)\n persistedTaskIds.delete(taskId)\n\n return ok(undefined)\n}\n\n/**\n * 校验整个更新并先落库再替换投影;任何字段失败都不提前替换 cron。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function disable(repository: SchedulerTaskRepository) {\n * const result = await updateRegisteredTask('daily-report', { enabled: false }, repository)\n * if (!result.success) return result\n * return result\n * }\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 // 完整验证与持久化成功前,不发布任何部分更新。\n let updatedCron = getCron(taskId)\n\n if (updates.cron !== undefined || updates.timezone !== undefined) {\n const cronExpression = updates.cron ?? existingTask.cron\n const timezone = updates.timezone === null ? undefined : (updates.timezone ?? existingTask.timezone)\n const cronResult = parseCronExpression(cronExpression, timezone)\n if (!cronResult.success)\n return cronResult\n\n updatedCron = 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 if ((updates.handler && !TaskHandlerConfigSchema.safeParse(updates.handler).success)\n || (updates.idempotent !== undefined && typeof updates.idempotent !== 'boolean')) {\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidHandlerConfig', { params: { taskId } }))\n }\n\n const updatedTask: TaskDefinition = {\n ...existingTask,\n ...(normalizedUpdates.name !== undefined ? { name: normalizedUpdates.name } : {}),\n ...(normalizedUpdates.description !== undefined ? { description: normalizedUpdates.description || undefined } : {}),\n ...(normalizedUpdates.cron !== undefined ? { cron: normalizedUpdates.cron } : {}),\n ...(normalizedUpdates.timezone !== undefined ? { timezone: normalizedUpdates.timezone ?? undefined } : {}),\n ...(normalizedUpdates.enabled !== undefined ? { enabled: normalizedUpdates.enabled } : {}),\n ...(normalizedUpdates.idempotent !== undefined ? { idempotent: normalizedUpdates.idempotent } : {}),\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 if (taskRepo) {\n const updateResult = await taskRepo.updateTask(taskId, normalizedUpdates)\n if (!updateResult.success) {\n logger.warn('Failed to update persisted 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\n setTask(taskId, updatedTask)\n if (updatedCron)\n setCron(taskId, updatedCron)\n\n return ok(undefined)\n}\n\n/**\n * 按过滤和分页读取持久日志;没有仓库返回失败,不伪造空结果。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function inspect(repository: SchedulerLogRepository) {\n * const logs = await queryTaskLogs(repository, { taskId: 'daily-report', pagination: { page: 1, pageSize: 20 } })\n * if (!logs.success) return logs\n * return logs.data.items\n * }\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 — JS 任务编译器\n *\n * 将 JS 函数字符串编译为可执行函数,并基于源码缓存编译结果。\n * ⚠️ 仅用于受信任的服务端代码字符串;当前实现不是安全沙箱。\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 { Worker } from 'node:worker_threads'\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\n/**\n * 清除本地编译闭包缓存;不终止已经启动的工作线程。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // 调度器关闭并排空工作线程后,释放只含编译闭包的本地缓存。\n * clearJsTaskHandlerCache()\n * ```\n */\nexport function clearJsTaskHandlerCache(): void {\n compiledHandlerCache.clear()\n}\n\n/**\n * 校验受信任的 JS 函数表达式并返回独立工作线程执行器;不是安全沙箱。\n *\n * @param config - 受信任源码和含线程启动的总期限\n * @returns 编译结果;返回的 handler 在运行失败或取消时可 reject。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const compiled = compileJsTaskHandler({ kind: 'js', code: '(context) => ({ taskId: context.taskId })', timeout: 1000 })\n * if (!compiled.success) return compiled\n * const task: Parameters<JsTaskHandler>[0]['task'] = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const controller = new AbortController()\n * try {\n * return await compiled.data({ task, taskId: task.id, params: {}, trigger: { type: 'manual', source: null } }, controller.signal)\n * } catch (error) {\n * // 返回的 handler 可 reject;此调用边界转换为领域结果。\n * return err(HaiSchedulerError.EXECUTION_FAILED, schedulerM('scheduler_executionStateFailed'), error)\n * }\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 // 主线程仅解析语法,不执行表达式或任务函数。\n void new Script(`(${config.code})`)\n\n const handler: JsTaskHandler = async (context, signal) => {\n signal?.throwIfAborted()\n return await new Promise<unknown>((resolve, reject) => {\n const timeout = config.timeout ?? 30000\n const worker = new Worker(new URL('./scheduler-js-worker.js', import.meta.url), {\n workerData: { code: config.code, context },\n execArgv: [],\n })\n let settled = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const aborted = () => finish(new Error(schedulerM('scheduler_closing')))\n function finish(error?: Error, result?: unknown): void {\n if (settled)\n return\n settled = true\n clearTimeout(timer)\n signal?.removeEventListener('abort', aborted)\n // 等待线程停止后才结束本次尝试,禁止超时任务与后续重试并行。\n void worker.terminate().then(() => error ? reject(error) : resolve(result), reject)\n }\n timer = setTimeout(() => finish(new Error(schedulerM('scheduler_jsTimedOut', { params: { timeout } }))), timeout)\n signal?.addEventListener('abort', aborted, { once: true })\n worker.once('error', error => finish(error instanceof Error ? error : new Error(String(error))))\n worker.once('exit', code => finish(new Error(`JS worker exited before returning a result (${code})`)))\n worker.once('message', (message: { success: boolean, data?: unknown, message?: string }) => {\n if (message.success)\n finish(undefined, message.data)\n else\n finish(new Error(message.message))\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 * 等待可协作取消的操作;取消只终止等待,operation 必须消费 signal 才能停止外部活动。\n *\n * @param operation - 要启动的同步或异步操作\n * @param signal - 已取消时不启动 operation;进行中取消则拒绝等待\n * @returns operation 的结果\n * @throws signal.reason 或 operation 的异常;不能据此推断外部操作未提交。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const controller = new AbortController()\n * try {\n * const response = await waitWithSignal(\n * () => fetch('https://example.com/health', { signal: controller.signal }),\n * controller.signal,\n * )\n * const status = response.status\n * } catch (error) {\n * // 取消或 operation 异常会 reject;宿主应核对已经开始的外部效果。\n * }\n * ```\n */\nexport async function waitWithSignal<T>(operation: () => T | Promise<T>, signal: AbortSignal): Promise<T> {\n signal.throwIfAborted()\n return new Promise<T>((resolve, reject) => {\n const aborted = () => reject(signal.reason)\n signal.addEventListener('abort', aborted, { once: true })\n Promise.resolve().then(operation).then(resolve, reject).finally(() => {\n signal.removeEventListener('abort', aborted)\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 { ExecutionStatus, 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 { waitWithSignal } from './scheduler-cancellation.js'\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\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, execution?: Partial<SchedulerTaskContext>): SchedulerTaskContext {\n return {\n ...execution,\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 waitWithSignal(() => hooks.onTaskStart!(event), event.signal)\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 waitWithSignal(() => hooks.onTaskInterrupted!(event), event.signal)\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 waitWithSignal(() => hooks.onTaskFinish!(event), event.signal)\n }\n catch (error) {\n logger.warn('Task finish hook failed', { taskId: event.task.id, error })\n }\n}\n\nfunction createExecutionLog(\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 occurrenceId?: string,\n): TaskExecutionLog {\n const log: TaskExecutionLog = {\n id: crypto.randomUUID(),\n persistence: { status: 'unconfirmed' },\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 ...(occurrenceId ? { occurrenceId } : {}),\n }\n\n return log\n}\n\n/**\n * 构造本地中断观测;不代表已确认业务终态。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const now = Date.now()\n * const log = await createInterruptedTaskLog(task, { type: 'manual', source: 'console' }, 'Stopped by host', 'hook', now, now)\n * // 这只是观测,persistence 为 unconfirmed,不能补写成已提交业务成功。\n * ```\n */\nexport async function createInterruptedTaskLog(\n task: TaskDefinition,\n trigger: TaskTriggerInfo,\n reason: string,\n taskType: TaskExecutionTargetType,\n startedAt: number,\n finishedAt: number,\n): Promise<TaskExecutionLog> {\n return createExecutionLog(task, trigger, taskType, 'interrupted', startedAt, finishedAt, null, reason)\n}\n\n/**\n * 生成中断观测并调用开始/中断回调;不领取执行、不调用业务处理器、不发布共享终态。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const log = await interruptTask(task, { type: 'manual', source: 'console' }, 'Stopped by host', {})\n * const interrupted = log.status === 'interrupted'\n * ```\n */\nexport async function interruptTask(\n task: TaskDefinition,\n trigger: TaskTriggerInfo,\n reason: string,\n hooks: Readonly<SchedulerTaskHooks>,\n signal: AbortSignal = new AbortController().signal,\n): Promise<TaskExecutionLog> {\n const startedAt = Date.now()\n const taskType = resolveTaskType(task, hooks)\n\n await notifyTaskStart(hooks, { task, trigger, startedAt, signal })\n\n const finishedAt = Date.now()\n const interruptedLog = await createInterruptedTaskLog(task, trigger, reason, taskType, startedAt, finishedAt)\n\n await notifyTaskInterrupted(hooks, {\n task,\n trigger,\n startedAt,\n interruptedAt: finishedAt,\n signal,\n reason,\n })\n\n return interruptedLog\n}\n\n/**\n * 在可终止工作线程中执行受信任 JS;编译、执行和取消异常转换为 HaiResult。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { ...{ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }, handler: { kind: 'js', code: '(context) => context.params.batch', timeout: 1000 } }\n * const result = await executeJsTask(task, { task, taskId: task.id, params: { batch: '2026-10' }, trigger: { type: 'manual', source: null } })\n * if (!result.success) return result\n * const serialized = result.data\n * return serialized\n * ```\n */\nexport async function executeJsTask(\n task: TaskDefinition,\n context: SchedulerTaskContext,\n signal: AbortSignal = new AbortController().signal,\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, signal)\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\n/**\n * 执行 API 请求并有界读取完整响应;超时覆盖响应体,context 中的持久身份传给接收端去重。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { ...{ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }, handler: { kind: 'api', url: 'https://example.com/health', timeout: 1000, maxResponseBytes: 4096 } }\n * const result = await executeApiTask(task, { task, taskId: task.id, params: {}, trigger: { type: 'manual', source: null } })\n * if (!result.success) return result\n * const body = result.data\n * return body\n * ```\n */\nexport async function executeApiTask(\n task: TaskDefinition,\n context: SchedulerTaskContext,\n signal: AbortSignal = new AbortController().signal,\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, maxResponseBytes = 1024 * 1024 } = handler\n if (!Number.isSafeInteger(maxResponseBytes) || maxResponseBytes <= 0)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidHandlerConfig', { params: { taskId: task.id } }))\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeout)\n\n try {\n const requestHeaders = new Headers(headers)\n if (body !== undefined)\n requestHeaders.set('Content-Type', 'application/json')\n if (context.occurrenceId) {\n requestHeaders.set('Idempotency-Key', context.occurrenceId)\n requestHeaders.set('X-Scheduler-Sequence', String(context.sequence))\n requestHeaders.set('X-Scheduler-Attempt', String(context.attempt))\n requestHeaders.set('X-Scheduler-Task', encodeURIComponent(context.taskId))\n }\n const response = await fetch(url, {\n method,\n headers: requestHeaders,\n signal: AbortSignal.any([signal, controller.signal]),\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n })\n\n // 超时覆盖响应体读取;按实际字节累计,避免信任 Content-Length。\n let receivedBytes = 0\n let responseText = ''\n const reader = response.body?.getReader()\n if (reader) {\n const decoder = new TextDecoder()\n try {\n while (true) {\n const chunk = await reader.read()\n if (chunk.done)\n break\n receivedBytes += chunk.value.byteLength\n if (receivedBytes > maxResponseBytes) {\n controller.abort()\n return err(HaiSchedulerError.API_EXECUTION_FAILED, schedulerM('scheduler_apiResponseTooLarge', { params: { maxResponseBytes } }))\n }\n responseText += decoder.decode(chunk.value, { stream: true })\n }\n responseText += decoder.decode()\n }\n finally {\n reader.releaseLock()\n }\n }\n\n if (!response.ok) {\n logger.error('API task returned non-OK status', {\n taskId: context.taskId,\n status: response.status,\n url: core.sanitize.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 const message = error instanceof Error ? error.message : String(error)\n logger.error('API task execution failed', { taskId: context.taskId, error: message, url: core.sanitize.sanitizeUrl(url) })\n return err(\n HaiSchedulerError.API_EXECUTION_FAILED,\n schedulerM('scheduler_apiExecutionFailed', { params: { error: message } }),\n error,\n )\n }\n finally {\n clearTimeout(timer)\n }\n}\n\nasync function executeHookTask(\n task: TaskDefinition,\n context: SchedulerTaskContext,\n hooks: Readonly<SchedulerTaskHooks>,\n startedAt: number,\n signal: AbortSignal,\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 signal,\n }\n\n try {\n const result = await waitWithSignal(() => hooks.onTaskExecute!(executeEvent), signal)\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\n/**\n * 执行一次 API/JS/Hook 尝试并返回本地日志;共享 owner 和最终提交由 runner 负责,未知副作用不据此自动重放。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const log = await executeTask(task, { type: 'manual', source: 'console' }, { onTaskExecute: ({ context, signal }) => {\n * signal.throwIfAborted()\n * return { taskId: context.taskId }\n * } })\n * // executeTask 只生成尝试日志;runner 另以有效 owner/DB deadline 确认终态。\n * const observedStatus = log.status\n * ```\n */\nexport async function executeTask(\n task: TaskDefinition,\n trigger: TaskTriggerInfo,\n hooks: Readonly<SchedulerTaskHooks>,\n signal: AbortSignal = new AbortController().signal,\n execution?: Partial<SchedulerTaskContext>,\n): Promise<TaskExecutionLog> {\n const startedAt = Date.now()\n const taskType = resolveTaskType(task, hooks)\n const context = createTaskContext(task, trigger, execution)\n\n await notifyTaskStart(hooks, { task, trigger, startedAt, signal, context })\n\n let executionResult: HaiResult<string | null>\n let shouldNotifyInterrupted = false\n if (signal.aborted) {\n executionResult = err(HaiSchedulerError.EXECUTION_FAILED, schedulerM('scheduler_closing'))\n shouldNotifyInterrupted = true\n }\n else if (!task.handler) {\n executionResult = await executeHookTask(task, context, hooks, startedAt, signal)\n // 业务失败需要重试;只有宿主明确跳过或取消才属于 interrupted。\n shouldNotifyInterrupted = !hooks.onTaskExecute || (!executionResult.success && executionResult.error.cause instanceof Error && executionResult.error.cause.name === 'SchedulerTaskSkippedError')\n }\n else if (task.handler.kind === 'api') {\n executionResult = await executeApiTask(task, context, signal)\n }\n else {\n executionResult = await executeJsTask(task, context, signal)\n }\n\n shouldNotifyInterrupted ||= signal.aborted\n const finishedAt = Date.now()\n let status: ExecutionStatus = executionResult.success\n ? 'success'\n : (shouldNotifyInterrupted ? 'interrupted' : 'failed')\n // 分布式执行已经进入持久 running;缺少外部幂等保障时,失败/取消都不能推断副作用未发生。\n if (execution?.executionToken && !task.idempotent && !executionResult.success)\n status = 'unknown'\n const log = createExecutionLog(\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 context.occurrenceId,\n )\n\n if (!executionResult.success && shouldNotifyInterrupted) {\n await notifyTaskInterrupted(hooks, {\n task,\n trigger,\n startedAt,\n interruptedAt: finishedAt,\n signal,\n reason: executionResult.error.message,\n context,\n })\n }\n\n if (status !== 'interrupted' && !signal.aborted)\n await notifyTaskFinish(hooks, { task, trigger, startedAt, finishedAt, log, signal, context })\n\n return log\n}\n","/**\n * 共享数据库执行状态驱动 cron、手动触发与崩溃恢复。\n * @module scheduler-runner\n */\nimport type { HaiResult } from '@h-ai/core'\nimport type { SchedulerExecutionRepository, SchedulerLogRepository, SchedulerTaskRepository, StoredExecution } from './repositories/index.js'\nimport type { SchedulerLogCleanupPolicy, TaskDefinition, TaskExecutionLog, TaskTriggerInfo, TriggerTaskInput } from './scheduler-types.js'\nimport { randomUUID } from 'node:crypto'\nimport { isDeepStrictEqual } from 'node:util'\nimport { core, err, ok } from '@h-ai/core'\nimport { z } from 'zod'\nimport { executionId } from './repositories/scheduler-repository-execution.js'\nimport { executeTask, interruptTask } from './scheduler-executor.js'\nimport { getCron, getHooks, getTask, getTaskRegistry, loadPersistedTasks, unregisterTask } from './scheduler-functions.js'\nimport { schedulerM } from './scheduler-i18n.js'\nimport { HaiSchedulerError } from './scheduler-types.js'\n\nconst logger = core.logger.child({ module: 'scheduler', scope: 'runner' })\nconst runningTasks = new Set<string>()\nconst activeRuns = new Map<Promise<TaskExecutionLog>, AbortController>()\nconst activeRepairs = new Set<Promise<HaiResult<void>>>()\nlet tickTimer: ReturnType<typeof setInterval> | null = null\nlet tickInProgress: ReturnType<typeof setInterval> | null = null\nlet lastTickMinute = -1\nlet currentNodeId = ''\nlet currentLeaseMs = 300_000\nlet currentTaskRepo: SchedulerTaskRepository | null = null\nlet currentExecutionRepo: SchedulerExecutionRepository | null = null\nlet currentLogRepo: SchedulerLogRepository | null = null\nlet currentCleanupPolicy: SchedulerLogCleanupPolicy = {}\n\n/**\n * 绑定调用方拥有的日志仓库;关闭后不可由旧执行写入新实例。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // 本轮实例拥有的仓库通过生命周期装配,不从后续 init 动态借用。\n * setLogRepository(null)\n * ```\n */\nexport function setLogRepository(repo: SchedulerLogRepository | null, policy: SchedulerLogCleanupPolicy = {}): void {\n currentLogRepo = repo\n currentCleanupPolicy = { ...policy }\n}\n\nconst publishedLogSchema = z.object({\n id: z.uuid(),\n occurrenceId: z.string().regex(/^[a-f\\d]{64}$/),\n taskId: z.string(),\n taskName: z.string(),\n taskType: z.enum(['api', 'js', 'hook']),\n triggerType: z.enum(['manual', 'scheduled']),\n triggerSource: z.string().nullable(),\n status: z.enum(['success', 'failed', 'interrupted', 'unknown']),\n result: z.string().nullable(),\n error: z.string().nullable(),\n startedAt: z.number().safe(),\n finishedAt: z.number().safe(),\n duration: z.number().safe(),\n persistence: z.object({ status: z.enum(['pending', 'persisted', 'unconfirmed']), error: z.object({ code: z.string(), message: z.string() }).optional() }),\n})\n\n/**\n * 只投影已通过 owner/lease 条件提交的完整尝试快照;补写不调用 handler 或业务 Hook。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const occurrenceId = 'a'.repeat(64)\n * const result = await repairExecutionLogs(occurrenceId)\n * if (!result.success) return result\n * // 成功仅表示已发布终态的日志投影已确认,未调用 handler。\n * return result.data\n * ```\n */\nexport function repairExecutionLogs(id: string): Promise<HaiResult<void>> {\n const operation = projectExecutionLogs(id)\n activeRepairs.add(operation)\n void operation.finally(() => activeRepairs.delete(operation)).catch(() => {})\n return operation\n}\n\n/** 对快照依赖执行补写,close 会等待本链路释放;不读取后来初始化实例的保留策略。 */\nasync function projectExecutionLogs(id: string): Promise<HaiResult<void>> {\n const execution = currentExecutionRepo\n const logs = currentLogRepo\n const cleanupPolicy = currentCleanupPolicy\n if (!execution || !logs)\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\n try {\n const found = await execution.byOccurrence(id)\n if (!found.success || !found.data || ['claimed', 'running'].includes(found.data.status))\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\n const row = found.data\n if (row.logPersistence === 'persisted')\n return ok(undefined)\n const parsed = z.array(publishedLogSchema).min(1).max(101).safeParse(JSON.parse(row.logsJson ?? 'null') as unknown)\n if (!parsed.success || parsed.data.some(log => log.occurrenceId !== id || log.taskId !== row.taskId))\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\n for (const log of parsed.data) {\n const saved = await logs.saveLog(log)\n if (!saved.success)\n return saved\n }\n const confirmed = await execution.confirmLogs(row)\n if (!confirmed.success)\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\n const cleanup = await logs.cleanupLogs(cleanupPolicy)\n if (!cleanup.success)\n logger.warn('Execution logs persisted but retention cleanup failed', { occurrenceId: id, errorCode: cleanup.error.code })\n return ok(undefined)\n }\n catch {\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\n }\n}\n\n/**\n * 配置共享执行仓库和续租周期。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // 关闭流程排空后解除旧执行仓库绑定。\n * configureExecution(null)\n * ```\n */\nexport function configureExecution(repo: SchedulerExecutionRepository | null, nodeId = '', leaseMs = 300_000): void {\n currentExecutionRepo = repo\n currentNodeId = nodeId\n currentLeaseMs = leaseMs\n}\n\n/**\n * 指定共享任务定义仓库。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // init/close 装配共享仓库;null 只供关闭解除绑定。\n * setTaskRepository(null)\n * ```\n */\nexport function setTaskRepository(repo: SchedulerTaskRepository | null): void {\n currentTaskRepo = repo\n}\n\n/**\n * 检查本实例计时器状态。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const wasRunning = isTimerRunning()\n * if (wasRunning) stopTimer()\n * ```\n */\nexport function isTimerRunning(): boolean {\n return tickTimer !== null\n}\n\n/**\n * 完全排空执行链后重置实例状态。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * await drainRunner()\n * resetRunner()\n * ```\n */\nexport function resetRunner(): void {\n runningTasks.clear()\n stopTimer()\n lastTickMinute = -1\n currentTaskRepo = null\n configureExecution(null)\n}\n\nasync function sleep(ms: number, signal: AbortSignal): Promise<void> {\n if (ms <= 0 || signal.aborted)\n return\n await new Promise<void>((resolve) => {\n let timer: ReturnType<typeof setTimeout> | undefined\n const finish = () => {\n clearTimeout(timer)\n signal.removeEventListener('abort', finish)\n resolve()\n }\n timer = setTimeout(finish, ms)\n signal.addEventListener('abort', finish, { once: true })\n })\n}\n\n/**\n * 停止领取并等待取消链退出;取消不表示已撤销外部副作用。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // signal 取消不会抹除未知外部效果;等待执行与补写释放当前实例依赖。\n * await drainRunner()\n * ```\n */\nexport async function drainRunner(): Promise<void> {\n stopTimer()\n for (const controller of activeRuns.values())\n controller.abort(new Error(schedulerM('scheduler_closing')))\n await Promise.allSettled([...activeRuns.keys()])\n await Promise.allSettled([...activeRepairs])\n}\n\nasync function tick(): Promise<void> {\n const timer = tickTimer\n const repository = currentTaskRepo\n const executionRepo = currentExecutionRepo\n if (!timer || tickInProgress === timer)\n return\n tickInProgress = timer\n // stop/start 与 close/init 都创建新的计时器代际;旧数据库读取只能归属原扫描器。\n const isCurrent = () => tickTimer === timer && currentTaskRepo === repository && currentExecutionRepo === executionRepo\n try {\n const refreshed = await loadPersistedTasks(repository)\n if (!refreshed.success || !isCurrent())\n return\n // 恢复跨分钟遗留的原 occurrence;非幂等 running 由仓库隔离,不能换身份重发。\n const expired = await executionRepo?.expired()\n if (!isCurrent())\n return\n if (expired?.success) {\n for (const row of expired.data) {\n const task = getTask(row.taskId)\n if (!task) {\n await executionRepo?.isolateExpired(row)\n if (!isCurrent())\n return\n continue\n }\n if (task && !runningTasks.has(task.id)) {\n let trigger: TaskTriggerInfo & { minute?: number }\n try {\n // 数据来自本模块写入的固定触发结构;坏 JSON 留在共享槽中供人工核对。\n trigger = JSON.parse(row.triggerJson) as TaskTriggerInfo & { minute?: number }\n }\n catch {\n await executionRepo?.isolateExpired(row)\n if (!isCurrent())\n return\n continue\n }\n void runTask(task, trigger.minute, trigger, undefined, row).catch(error => logger.warn('Execution recovery failed', { taskId: task.id, error }))\n }\n }\n }\n const now = await executionRepo?.currentTime()\n if (now?.success && isCurrent())\n scheduleDueTasks(now.data)\n }\n finally {\n if (tickInProgress === timer)\n tickInProgress = null\n }\n}\n\nfunction scheduleDueTasks(databaseNow: number): void {\n // 同一现实分钟的身份与 cron 匹配都来自共享 DB,不能由各节点本机时钟选定。\n const currentMinute = Math.floor(databaseNow / 60_000)\n if (currentMinute === lastTickMinute)\n return\n lastTickMinute = currentMinute\n for (const [taskId, task] of getTaskRegistry()) {\n if (task.enabled === false || runningTasks.has(taskId))\n continue\n if (!getCron(taskId)?.match(new Date(currentMinute * 60_000)))\n continue\n void runTask(task, currentMinute, { type: 'scheduled', source: null }).catch(error => logger.error('Unhandled task execution error', { taskId, error }))\n }\n}\n\n/**\n * cron/manual/recovery 共用唯一任务串行槽与 occurrence 领取协议。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const log = await runTask(task, undefined, { type: 'manual', source: 'console' }, { idempotencyKey: 'report-2026-10-23' })\n * // 业务成功仍可能等待日志补写;unknown 交可信核对,不能换键重试。\n * if (log.persistence.status === 'pending' && log.occurrenceId) {\n * const repaired = await repairExecutionLogs(log.occurrenceId)\n * if (!repaired.success) return repaired\n * }\n * return log\n * ```\n */\nexport function runTask(task: TaskDefinition, minuteTimestamp?: number, trigger: TaskTriggerInfo = { type: 'manual', source: null }, options?: TriggerTaskInput, recovery?: StoredExecution): Promise<TaskExecutionLog> {\n const controller = new AbortController()\n const run = runTaskExecution(task, minuteTimestamp, trigger, controller, options, recovery)\n activeRuns.set(run, controller)\n void run.finally(() => activeRuns.delete(run)).catch(() => {})\n return run\n}\n\nasync function runTaskExecution(task: TaskDefinition, minute: number | undefined, trigger: TaskTriggerInfo, controller: AbortController, options?: TriggerTaskInput, recovery?: StoredExecution): Promise<TaskExecutionLog> {\n const repository = currentTaskRepo\n const executionRepo = currentExecutionRepo\n const logRepository = currentLogRepo\n const hooks = getHooks()\n const leaseMs = currentLeaseMs\n const occurrenceId = recovery?.occurrenceId ?? executionId(task.id, trigger.type, minute === undefined ? options?.idempotencyKey ?? randomUUID() : String(minute))\n const interrupted = async (reason: string, observationOnly = false): Promise<TaskExecutionLog> => {\n const log = { ...await interruptTask(task, trigger, reason, {}, controller.signal), occurrenceId }\n // 领取前的竞争/跳过只是一条观测事件,不代表 owner 已提交业务终态。\n if (observationOnly && logRepository) {\n const saved = await logRepository.saveLog(log)\n log.persistence = saved.success ? { status: 'persisted' } : { status: 'unconfirmed', error: { code: String(saved.error.code), message: saved.error.message } }\n }\n return log\n }\n if (!executionRepo)\n return interrupted(schedulerM('scheduler_executionStateFailed'), true)\n const claimed = await executionRepo.claim(task, occurrenceId, { ...trigger, ...(minute !== undefined ? { minute } : {}) }, currentNodeId, leaseMs)\n if (!claimed.success)\n return interrupted(claimed.error.message, true)\n if (!claimed.data)\n return interrupted(schedulerM('scheduler_taskRunning', { params: { taskId: task.id } }), true)\n const row = claimed.data\n if (!['claimed', 'running'].includes(row.status)) {\n if (minute === undefined) {\n // 已完成的相同手动幂等键返回持久结果,绝不重新执行。\n try {\n const log: TaskExecutionLog = row.logJson\n ? JSON.parse(row.logJson)\n : {\n id: randomUUID(),\n persistence: { status: 'unconfirmed' },\n taskId: row.taskId,\n taskName: task.name,\n taskType: task.handler?.kind ?? 'hook',\n triggerType: trigger.type,\n triggerSource: trigger.source,\n status: 'interrupted',\n result: null,\n error: null,\n startedAt: row.createdAt,\n finishedAt: row.updatedAt,\n duration: row.updatedAt - row.createdAt,\n }\n const status = row.status === 'discarded' ? 'interrupted' : row.status as TaskExecutionLog['status']\n return { ...log, status, error: status === 'success' ? null : log.error, occurrenceId }\n }\n catch {\n return interrupted(schedulerM('scheduler_executionStateFailed'))\n }\n }\n return interrupted(schedulerM('scheduler_occurrenceHandled', { params: { taskId: task.id } }), true)\n }\n runningTasks.add(task.id)\n let timer: ReturnType<typeof setTimeout> | undefined\n let renewing: Promise<void> | undefined\n let stopped = false\n let lost = false\n const renew = async () => {\n try {\n const result = await executionRepo.renew(row, leaseMs)\n lost = !result.success\n }\n catch {\n lost = true\n }\n if (lost) {\n controller.abort(new Error(schedulerM('scheduler_executionStateFailed')))\n }\n else if (!stopped) {\n timer = setTimeout(() => {\n renewing = renew()\n }, Math.max(1, Math.floor(leaseMs / 3)))\n }\n }\n timer = setTimeout(() => {\n renewing = renew()\n }, Math.max(1, Math.floor(leaseMs / 3)))\n try {\n let log: TaskExecutionLog | undefined\n const attempts: TaskExecutionLog[] = []\n for (; row.attemptCount < row.maxAttempts;) {\n if (controller.signal.aborted)\n break\n const refreshed = await loadPersistedTasks(repository)\n const latest = getTask(task.id)\n let unchanged = false\n try {\n // JSON 快照不会保留 undefined 属性,比较时两侧都采用持久化表示。\n unchanged = latest !== undefined && isDeepStrictEqual(JSON.parse(JSON.stringify(latest)), JSON.parse(row.snapshot))\n }\n catch {}\n if (!refreshed.success || !latest || latest.enabled === false || !unchanged) {\n log = await interrupted(schedulerM('scheduler_taskNoLongerDue', { params: { taskId: task.id } }))\n // 曾开始的任务不能靠配置编辑抹去未知副作用;保留串行槽直到人工核对。\n if (row.attemptCount > 0)\n log.status = 'unknown'\n break\n }\n task = latest\n if (!task.handler && !hooks.onTaskExecute) {\n log = { ...await interruptTask(task, trigger, schedulerM('scheduler_taskHandlerMissing', { params: { taskId: task.id } }), hooks, controller.signal), occurrenceId }\n break\n }\n const begun = await executionRepo.begin(row, leaseMs)\n if (!begun.success) {\n lost = true\n break\n }\n log = await executeTask(task, trigger, hooks, controller.signal, { occurrenceId, executionToken: row.owner, sequence: row.sequence, attempt: row.attemptCount })\n log.occurrenceId = occurrenceId\n attempts.push(log)\n if (log.status !== 'failed' || !row.idempotent || row.attemptCount >= row.maxAttempts)\n break\n const delays = task.retry?.backoffMs ?? []\n const delay = delays[Math.min(row.attemptCount - 1, Math.max(0, delays.length - 1))] ?? 0\n await sleep(delay, controller.signal)\n }\n if (!log)\n log = await interrupted(schedulerM('scheduler_executionStateFailed'))\n if (lost) {\n // 取消和失租不是外部回滚;旧 owner 只返回 unknown,不能覆盖新节点的共享结果。\n return { ...log, status: 'unknown', persistence: { status: 'unconfirmed' }, error: schedulerM('scheduler_executionUnknown'), occurrenceId }\n }\n if (controller.signal.aborted && row.attemptCount > 0)\n log = { ...log, status: 'unknown', error: schedulerM('scheduler_executionUnknown') }\n const currentAttempt = attempts.findIndex(attempt => attempt.id === log.id)\n if (currentAttempt >= 0)\n attempts[currentAttempt] = log\n else\n attempts.push(log)\n const published = attempts.map(attempt => ({ ...attempt, persistence: { status: 'pending' as const } }))\n const finished = await executionRepo.finish(row, { ...log, persistence: { status: 'pending' } }, published)\n if (!finished.success)\n return { ...log, status: 'unknown', persistence: { status: 'unconfirmed' }, error: finished.error.message, occurrenceId }\n // 终态已确认,后续日志故障只能留下 pending,不能改写业务结果或重新执行。\n const projected = await repairExecutionLogs(occurrenceId)\n log.persistence = projected.success ? { status: 'persisted' } : { status: 'pending', error: { code: String(projected.error.code), message: projected.error.message } }\n if (!projected.success)\n logger.warn('Execution completed with pending log persistence', { taskId: task.id, occurrenceId, errorCode: projected.error.code })\n if (task.deleteAfterRun && log.status === 'success') {\n const refreshed = await loadPersistedTasks(repository)\n if (refreshed.success && isDeepStrictEqual(getTask(task.id), task))\n await unregisterTask(task.id, repository, task)\n }\n return log\n }\n finally {\n stopped = true\n clearTimeout(timer)\n await renewing\n runningTasks.delete(task.id)\n }\n}\n\n/**\n * 启动本节点扫描器;每轮从 DB 时间选定分钟,租约授权仍由最终 SQL 原子条件决定。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // 生命周期已绑定任务、执行和日志仓库后才启动扫描。\n * startTimer(1000)\n * stopTimer()\n * ```\n */\nexport function startTimer(tickInterval: number): void {\n lastTickMinute = -1\n tickTimer = setInterval(tick, tickInterval)\n}\n\n/**\n * 停止新领取,已经开始的任务由 drainRunner 处理。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * stopTimer()\n * await drainRunner()\n * ```\n */\nexport function stopTimer(): void {\n if (tickTimer)\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 { core, err, ok } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { z } from 'zod'\n\nimport { executionEntry, SchedulerExecutionRepository, SchedulerLogRepository, SchedulerTaskRepository } from './repositories/index.js'\nimport { ExecutionResolutionSchema, SchedulerConfigSchema, TriggerTaskSchema } from './scheduler-config.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 { configureExecution, drainRunner, isTimerRunning, repairExecutionLogs, resetRunner, runTask, setLogRepository, 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 closeInProgress: Promise<void> | null = null\nlet taskRepo: SchedulerTaskRepository | null = null\nlet logRepo: SchedulerLogRepository | null = null\nlet executionRepo: SchedulerExecutionRepository | null = null\nconst executionIdSchema = z.string().regex(/^[a-f\\d]{64}$/)\nconst executionListSchema = z.object({ limit: z.number().int().min(1).max(100).default(50), offset: z.number().int().min(0).max(1_000_000).default(0) })\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 (!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 executionRepo = new SchedulerExecutionRepository(reldb)\n const ready = await executionRepo.count()\n if (!ready.success)\n throw new Error(schedulerM('scheduler_executionStateFailed'))\n setTaskRepository(taskRepo)\n setLogRepository(logRepo, {\n maxLogs: parsed.maxLogs,\n retentionDays: parsed.retentionDays,\n })\n\n const nodeId = parsed.nodeId ?? crypto.randomUUID()\n configureExecution(executionRepo, nodeId, parsed.leaseMs)\n logger.info('Shared execution repository configured', { nodeId, leaseMs: parsed.leaseMs })\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\n/**\n * 定时任务公共入口;先初始化共享 RelDB,再注册/触发/启动;关闭会排空任务和日志修复,宿主最后关闭数据库。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * import { reldb } from '@h-ai/reldb'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * // 本地开发示例;生产使用所有节点共同连接的 PostgreSQL/MySQL。\n * const database = await reldb.init({ type: 'sqlite', database: ':memory:' })\n * if (!database.success) throw new Error(database.error.message)\n * try {\n * const initialized = await scheduler.init({ hooks: { onTaskExecute: ({ context }) => ({ taskId: context.taskId }) } })\n * if (!initialized.success) throw new Error(initialized.error.message)\n * const registered = await scheduler.register({ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' })\n * if (!registered.success) throw new Error(registered.error.message)\n * const executed = await scheduler.trigger('daily-report', { idempotencyKey: 'report-2026-10-23' })\n * if (!executed.success) throw new Error(executed.error.message)\n * // 业务 status 与 persistence 分开判断;pending 只补日志,不重跑业务。\n * const status = executed.data.status\n * const persistence = executed.data.persistence.status\n * } finally {\n * await scheduler.close()\n * const closed = await reldb.close()\n * if (!closed.success) {\n * core.logger.error('Database cleanup failed', { errorCode: closed.error.code })\n * process.exitCode = 1\n * }\n * }\n * ```\n */\nexport const scheduler: SchedulerFunctions = {\n execution: {\n async get(id) {\n if (!currentConfig || !executionRepo)\n return notInitialized.result()\n if (!executionIdSchema.safeParse(id).success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n const row = await executionRepo.byOccurrence(id)\n return row.success ? ok(row.data ? executionEntry(row.data) : null) : row\n },\n async listUnknown(options) {\n if (!currentConfig || !executionRepo)\n return notInitialized.result()\n const parsed = executionListSchema.safeParse(options ?? {})\n if (!parsed.success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n const rows = await executionRepo.unknown(parsed.data.limit, parsed.data.offset)\n return rows.success ? ok(rows.data.map(executionEntry)) : rows\n },\n async listLogFailures(options) {\n if (!currentConfig || !executionRepo)\n return notInitialized.result()\n const parsed = executionListSchema.safeParse(options ?? {})\n if (!parsed.success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n const rows = await executionRepo.pendingLogs(parsed.data.limit, parsed.data.offset)\n return rows.success ? ok(rows.data.map(executionEntry)) : rows\n },\n async repairLog(id) {\n if (!currentConfig || !executionRepo || closeInProgress)\n return notInitialized.result()\n if (!executionIdSchema.safeParse(id).success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n return repairExecutionLogs(id)\n },\n async resolveUnknown(id, resolution) {\n if (!currentConfig || !executionRepo)\n return notInitialized.result()\n const parsed = ExecutionResolutionSchema.safeParse(resolution)\n if (!executionIdSchema.safeParse(id).success || !parsed.success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n return executionRepo.resolve(id, parsed.data.status, parsed.data.expectedUpdatedAt)\n },\n },\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 (closeInProgress)\n await closeInProgress\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 const persistedResult = await loadPersistedTasks(taskRepo)\n if (!persistedResult.success) {\n await scheduler.close()\n return persistedResult\n }\n const configResult = await loadConfigTasks(tasks)\n if (!configResult.success) {\n await scheduler.close()\n return configResult\n }\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 /** 刷新数据库任务投影,不执行任何任务。 */\n async refreshTasks(): Promise<HaiResult<void>> {\n if (!currentConfig)\n return notInitialized.result()\n return loadPersistedTasks(taskRepo)\n },\n\n async register(task: TaskDefinition): Promise<HaiResult<void>> {\n if (!currentConfig)\n return notInitialized.result()\n\n const config = currentConfig\n const refreshed = await loadPersistedTasks(taskRepo)\n if (!refreshed.success)\n return refreshed\n if (currentConfig !== config)\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 config = currentConfig\n const refreshed = await loadPersistedTasks(taskRepo)\n if (!refreshed.success)\n return refreshed\n if (currentConfig !== config)\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 config = currentConfig\n const refreshed = await loadPersistedTasks(taskRepo)\n if (!refreshed.success)\n return refreshed\n if (currentConfig !== config)\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 const parsed = TriggerTaskSchema.safeParse(options ?? {})\n if (!parsed.success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n\n const config = currentConfig\n const refreshed = await loadPersistedTasks(taskRepo)\n if (!refreshed.success)\n return refreshed\n if (currentConfig !== config)\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 const log = await runTask(task, undefined, normalizeTriggerInput(parsed.data), parsed.data)\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 (closeInProgress)\n return closeInProgress\n\n logger.info('Closing scheduler module')\n // 先拒绝新任务,再等待旧执行链完全退出,最后释放共享状态。\n currentConfig = null\n stopTimer()\n closeInProgress = (async () => {\n await drainRunner()\n clearJsTaskHandlerCache()\n resetTaskState()\n resetRunner()\n setLogRepository(null)\n setTaskRepository(null)\n taskRepo = null\n logRepo = null\n executionRepo = null\n logger.info('Scheduler module closed')\n })()\n try {\n await closeInProgress\n }\n finally {\n closeInProgress = null\n }\n },\n}\n"]}
1
+ {"version":3,"sources":["../src/scheduler-config.ts","../messages/en-US.json","../messages/ja-JP.json","../messages/zh-CN.json","../src/scheduler-i18n.ts","../src/scheduler-types.ts","../src/repositories/scheduler-repository-execution.ts","../src/repositories/scheduler-repository-log.ts","../src/repositories/scheduler-repository-task.ts","../src/scheduler-cron.ts","../src/scheduler-functions.ts","../src/scheduler-js-compiler.ts","../src/scheduler-migration.ts","../src/scheduler-cancellation.ts","../src/scheduler-executor.ts","../src/scheduler-runner.ts","../src/scheduler-main.ts"],"names":["core","BaseReldbCrudRepository","ok","err","logger","z","taskRepo","logRepo","createHash","executionRepo","randomUUID","isDeepStrictEqual","reldb"],"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 * import { SchedulerConfigSchema } from '@h-ai/scheduler'\n *\n * const parsed = SchedulerConfigSchema.safeParse({ enableDb: true, tickInterval: 1000, leaseMs: 300000 })\n * if (parsed.success) {\n * const renewalPeriod = Math.floor(parsed.data.leaseMs / 3)\n * }\n * ```\n */\nexport const SchedulerConfigSchema = z.object({\n /** 必须使用共享数据库保存执行状态;false 不再允许,需要先初始化 @h-ai/reldb。 */\n enableDb: z.literal(true).default(true),\n /** 调度检查间隔,单位毫秒(默认 1000,即每秒检查一次) */\n tickInterval: z.number().int().min(100).default(1000),\n /** 执行租约毫秒数(默认 300000,范围 1000–86400000),在途每三分之一周期续期。 */\n leaseMs: z.number().int().min(1000).max(86_400_000).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/**\n * 手动触发边界,重复使用同一幂等键会命中同一个执行记录。\n *\n * @example\n * ```ts\n * import { TriggerTaskSchema } from '@h-ai/scheduler'\n *\n * const parsed = TriggerTaskSchema.safeParse({ source: 'billing-console', idempotencyKey: 'billing-2026-10' })\n * if (parsed.success) {\n * const sameOccurrenceKey = parsed.data.idempotencyKey\n * }\n * ```\n */\nexport const TriggerTaskSchema = z.object({\n source: z.string().max(255).optional(),\n idempotencyKey: z.string().min(1).max(128).optional(),\n})\n\n/**\n * 可信服务端人工核对结果;必须先停止旧 runner,不能将未知执行直接重排。\n *\n * @example\n * ```ts\n * import { ExecutionResolutionSchema, scheduler } from '@h-ai/scheduler'\n *\n * // 可信运维流程已停止旧 runner 并核对实际外部结果。\n * const pending = await scheduler.execution.listUnknown({ limit: 10 })\n * if (!pending.success) throw new Error(pending.error.message)\n * const entry = pending.data[0]\n * if (entry) {\n * const resolution = ExecutionResolutionSchema.parse({ status: 'discarded', expectedUpdatedAt: entry.updatedAt })\n * const resolved = await scheduler.execution.resolveUnknown(entry.occurrenceId, resolution)\n * if (!resolved.success) throw new Error(resolved.error.message)\n * }\n * ```\n */\nexport const ExecutionResolutionSchema = z.object({\n status: z.enum(['success', 'discarded']),\n expectedUpdatedAt: z.number().int().nonnegative().max(Number.MAX_SAFE_INTEGER - 1),\n})\n\n/**\n * 调度器配置类型\n *\n * @example\n * ```ts\n * import type { SchedulerConfig } from '@h-ai/scheduler'\n * import { SchedulerConfigSchema } from '@h-ai/scheduler'\n *\n * const config: SchedulerConfig = SchedulerConfigSchema.parse({ leaseMs: 60000 })\n * const renewalInterval = config.leaseMs / 3\n * ```\n */\nexport type SchedulerConfig = z.infer<typeof SchedulerConfigSchema>\n\n/**\n * 调度器配置输入类型\n *\n * @example\n * ```ts\n * import type { SchedulerConfigInput } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * // 宿主已成功初始化共享 reldb。\n * const config: SchedulerConfigInput = { leaseMs: 60000, retentionDays: 30 }\n * const initialized = await scheduler.init(config)\n * if (!initialized.success) throw new Error(initialized.error.message)\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_closing\": \"Scheduler is closing; task execution cancelled\",\n \"scheduler_definitionsChanged\": \"Task definitions changed during refresh; retry the operation\",\n \"scheduler_taskNoLongerDue\": \"Task {taskId} was removed, disabled, or rescheduled\",\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_jsTimedOut\": \"JS task timed out after {timeout}ms\",\n \"scheduler_apiExecutionFailed\": \"API call failed: {error}\",\n \"scheduler_apiResponseTooLarge\": \"API response exceeds the {maxResponseBytes} byte limit\",\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_invalidPersistedTask\": \"Invalid persisted task {taskId}: {error}\",\n \"scheduler_taskRunning\": \"Task is currently running: {taskId}\",\n \"scheduler_invalidApiConfig\": \"Invalid api_config for task: {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 \"scheduler_executionUnknown\": \"Execution outcome is unknown; stop the old runner and verify external effects before resolving\",\n \"scheduler_executionStateFailed\": \"Shared execution state unavailable or owner lease lost\",\n \"scheduler_executionInputInvalid\": \"Invalid execution identifier or administration input\",\n \"scheduler_occurrenceHandled\": \"Occurrence already handled for task: {taskId}\",\n \"scheduler_logPersistFailed\": \"Execution log persistence is not confirmed. Repair it by receipt without rerunning the business task\"\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_closing\": \"スケジューラーを終了しています。タスクの実行をキャンセルしました\",\n \"scheduler_definitionsChanged\": \"更新中にタスク定義が変更されました。操作を再試行してください\",\n \"scheduler_taskNoLongerDue\": \"タスク{taskId}が削除、無効化、または再スケジュールされました\",\n \"scheduler_taskNotFound\": \"タスクが見つかりません: {taskId}\",\n \"scheduler_taskAlreadyExists\": \"タスクは既に存在します: {taskId}\",\n \"scheduler_invalidCron\": \"cron式が無効です: {expression}\",\n \"scheduler_executionFailed\": \"タスクの実行に失敗しました: {error}\",\n \"scheduler_jsExecutionFailed\": \"JSコードの実行に失敗しました: {error}\",\n \"scheduler_jsTimedOut\": \"JSタスクが{timeout}msでタイムアウトしました\",\n \"scheduler_apiExecutionFailed\": \"API呼び出しに失敗しました: {error}\",\n \"scheduler_apiResponseTooLarge\": \"APIレスポンスが{maxResponseBytes}バイトの制限を超えています\",\n \"scheduler_dbSaveFailed\": \"実行ログの保存に失敗しました: {error}\",\n \"scheduler_dbNotInitialized\": \"データベースが初期化されていないため、実行ログを保存できません\",\n \"scheduler_configError\": \"スケジューラー設定の検証に失敗しました: {error}\",\n \"scheduler_taskIdEmpty\": \"タスクIDを空にすることはできません\",\n \"scheduler_invalidPersistedTask\": \"保存されたタスク{taskId}が無効です: {error}\",\n \"scheduler_taskRunning\": \"タスクは現在実行中です: {taskId}\",\n \"scheduler_invalidApiConfig\": \"タスクのapi_configが無効です: {taskId}\",\n \"scheduler_jsCompileFailed\": \"JSタスクのコンパイルに失敗しました: {error}\",\n \"scheduler_hookExecutionFailed\": \"タスクのライフサイクルフックの実行に失敗しました: {error}\",\n \"scheduler_taskHandlerMissing\": \"実行可能なハンドラーもグローバルexecuteフックも設定されていません: {taskId}\",\n \"scheduler_invalidHandlerConfig\": \"タスクハンドラーの設定が無効です: {taskId}\",\n \"scheduler_invalidRetryConfig\": \"タスクの再試行ポリシーの設定が無効です: {taskId}\",\n \"scheduler_reldbNotInitialized\": \"enableDbはtrueですが、@h-ai/reldbが初期化されていません。先にreldb.init()を呼び出してください\",\n \"scheduler_executionUnknown\": \"実行結果は不明です。手動解決する前に古い実行プロセスを停止し、外部への影響を確認してください\",\n \"scheduler_executionStateFailed\": \"共有実行状態を利用できないか、所有者リースが失われました\",\n \"scheduler_executionInputInvalid\": \"実行識別子または管理操作の入力が無効です\",\n \"scheduler_occurrenceHandled\": \"タスク {taskId} の今回のスケジュールは既に処理済みです\",\n \"scheduler_logPersistFailed\": \"実行ログの永続化は未確認です。受領記録に基づいてログを補完し、業務タスクを再実行しないでください\"\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_closing\": \"调度器正在关闭,任务执行已取消\",\n \"scheduler_definitionsChanged\": \"刷新期间任务定义已变化,请重试操作\",\n \"scheduler_taskNoLongerDue\": \"任务 {taskId} 已删除、禁用或改变调度时间\",\n \"scheduler_taskNotFound\": \"任务未找到: {taskId}\",\n \"scheduler_taskAlreadyExists\": \"任务已存在: {taskId}\",\n \"scheduler_invalidCron\": \"无效的 cron 表达式: {expression}\",\n \"scheduler_executionFailed\": \"任务执行失败: {error}\",\n \"scheduler_jsExecutionFailed\": \"JS 代码执行失败: {error}\",\n \"scheduler_jsTimedOut\": \"JS 任务执行超过 {timeout} 毫秒\",\n \"scheduler_apiExecutionFailed\": \"API 调用失败: {error}\",\n \"scheduler_apiResponseTooLarge\": \"API 响应超过 {maxResponseBytes} 字节上限\",\n \"scheduler_dbSaveFailed\": \"保存执行记录失败: {error}\",\n \"scheduler_dbNotInitialized\": \"数据库未初始化,无法保存执行记录\",\n \"scheduler_configError\": \"调度器配置校验失败:{error}\",\n \"scheduler_taskIdEmpty\": \"任务 ID 不能为空\",\n \"scheduler_invalidPersistedTask\": \"持久化任务 {taskId} 无效:{error}\",\n \"scheduler_taskRunning\": \"任务正在执行中: {taskId}\",\n \"scheduler_invalidApiConfig\": \"任务 api_config 格式无效: {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 \"scheduler_executionUnknown\": \"执行结果未知;请先终止旧 runner 并核对外部副作用后裁定\",\n \"scheduler_executionStateFailed\": \"共享执行状态不可用或 owner 租约已失效\",\n \"scheduler_executionInputInvalid\": \"执行标识或运维输入不合法\",\n \"scheduler_occurrenceHandled\": \"本次调度已处理: {taskId}\",\n \"scheduler_logPersistFailed\": \"执行日志尚未确认持久化,请按执行回执补写;不要重新执行业务\"\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 messagesJaJP from '../messages/ja-JP.json'\nimport messagesZhCN from '../messages/zh-CN.json'\n\n// ─── i18n ───\n\n/**\n * 定时任务模块文案 Key 类型\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const key: SchedulerMessageKey = 'scheduler_taskNotFound'\n * const message = schedulerM(key, { params: { taskId: 'daily-report' } })\n * ```\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 * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const message = schedulerM('scheduler_taskNotFound', { params: { taskId: 'daily-report' } })\n * ```\n */\nexport const schedulerM = core.i18n.createMessageGetter<SchedulerMessageKey>({\n 'zh-CN': messagesZhCN,\n 'en-US': messagesEnUS,\n 'ja-JP': messagesJaJP,\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 JS_COMPILE_FAILED: '030:500',\n HOOK_EXECUTION_FAILED: '031:500',\n LOG_PERSIST_FAILED: '032:500',\n} as const satisfies ErrorInfo\n\n/**\n * Scheduler 领域错误定义;业务调用先判断 success 再按错误码分支。\n *\n * @example\n * ```ts\n * import { HaiSchedulerError, scheduler } from '@h-ai/scheduler'\n *\n * const result = await scheduler.trigger('missing-task')\n * if (!result.success && result.error.code === HaiSchedulerError.TASK_NOT_FOUND.code) {\n * const missingTask = true\n * }\n * ```\n */\nexport const HaiSchedulerError = core.error.buildHaiErrorsDef('scheduler', SchedulerErrorInfo)\n\n// ─── 任务定义 ───\n\n/**\n * 任务参数字典(键值对)\n *\n * @example\n * ```ts\n * import type { TaskParams } from '@h-ai/scheduler'\n *\n * const params: TaskParams = { month: '2026-10', dryRun: true }\n * const month = params.month\n * ```\n */\nexport type TaskParams = Record<string, unknown>\n\n/**\n * 任务触发类型\n *\n * @example\n * ```ts\n * import type { TaskTriggerType } from '@h-ai/scheduler'\n *\n * const triggerType: TaskTriggerType = 'manual'\n * const isManual = triggerType === 'manual'\n * ```\n */\nexport type TaskTriggerType = 'scheduled' | 'manual'\n\n/**\n * 任务处理器类型\n *\n * @example\n * ```ts\n * import type { TaskHandlerKind } from '@h-ai/scheduler'\n *\n * const kind: TaskHandlerKind = 'api'\n * const needsNetwork = kind === 'api'\n * ```\n */\nexport type TaskHandlerKind = 'api' | 'js'\n\n/**\n * 失败重试策略\n *\n * @example\n * ```ts\n * import type { TaskRetryPolicy } from '@h-ai/scheduler'\n *\n * const retry: TaskRetryPolicy = { maxAttempts: 3, backoffMs: [1000, 5000] }\n * // 只有外部副作用确实按 occurrenceId 持久去重时,任务才能声明 idempotent。\n * ```\n */\nexport interface TaskRetryPolicy {\n /** 最大尝试次数(含首次及崩溃恢复,范围 1–100,默认 1)。 */\n maxAttempts: number\n /** 每次重试前的退避时间(毫秒);按顺序对应第 2、3... 次尝试 */\n backoffMs?: number[]\n}\n\n/**\n * 任务执行目标类型\n *\n * @example\n * ```ts\n * import type { TaskExecutionTargetType } from '@h-ai/scheduler'\n *\n * const target: TaskExecutionTargetType = 'hook'\n * const usesHostCallback = target === 'hook'\n * ```\n */\nexport type TaskExecutionTargetType = TaskHandlerKind | 'hook'\n\n/**\n * API 任务配置\n *\n * @example\n * ```ts\n * import type { ApiTaskConfig } from '@h-ai/scheduler'\n *\n * const handler: ApiTaskConfig = { kind: 'api', url: 'https://example.com/health', method: 'GET', timeout: 5000, maxResponseBytes: 4096 }\n * // API 接收端若支持重试,须持久处理 Idempotency-Key 与 fencing 元数据。\n * ```\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 /** 响应体实际接收字节上限,必须为正安全整数(默认 1048576,即 1 MiB) */\n maxResponseBytes?: number\n}\n\n/**\n * JS 任务配置\n *\n * ⚠️ 安全警示:`code` 仅允许受信任的服务端代码(例如仓库内常量或受控部署配置)。\n * 当前实现通过 Node.js `vm` 便捷执行,不构成安全沙箱;禁止直接接收用户、租户或后台自由输入的 JS 字符串。\n * 多租户或可配置任务优先使用 `kind: 'api'` 或 `hooks.onTaskExecute`。\n *\n * `code` 为 JS 函数字符串,例如:\n * `(context) => ({ taskId: context.task.id, params: context.params })`\n *\n * @example\n * ```ts\n * import type { JsTaskConfig } from '@h-ai/scheduler'\n *\n * const handler: JsTaskConfig = { kind: 'js', code: '(context) => ({ taskId: context.taskId })', timeout: 1000 }\n * // 仅装载受信任的服务端源码;工作线程不是不可信代码沙箱。\n * ```\n */\nexport interface JsTaskConfig {\n /** 处理器类型 */\n kind: 'js'\n /** JS 函数字符串(仅允许受信任的服务端代码,不是安全沙箱) */\n code: string\n /** 独立线程执行期限,单位毫秒(默认 30000,含线程启动);超时终止线程后才允许重试 */\n timeout?: number\n}\n\n/**\n * 统一任务处理器配置\n *\n * @example\n * ```ts\n * import type { TaskHandlerConfig } from '@h-ai/scheduler'\n *\n * const handler: TaskHandlerConfig = { kind: 'api', url: 'https://example.com/health' }\n * const timeout = handler.timeout ?? 30000\n * ```\n */\nexport type TaskHandlerConfig = ApiTaskConfig | JsTaskConfig\n\n/**\n * 任务定义\n *\n * @example\n * ```ts\n * import type { TaskDefinition } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * // 宿主已成功初始化共享 reldb 与 scheduler。\n * const definition: TaskDefinition = { ...{ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }, handler: { kind: 'api', url: 'https://example.com/health', maxResponseBytes: 4096 } }\n * const registered = await scheduler.register(definition)\n * if (!registered.success) throw new Error(registered.error.message)\n * ```\n */\nexport interface TaskDefinition {\n /** 任务唯一标识 */\n id: string\n /** 任务名称 */\n name: string\n /** 任务描述 */\n description?: string\n /** cron 表达式(标准 5 字段:分 时 日 月 周) */\n cron: string\n /** IANA 时区,用于解释 cron 墙上时间;省略或清空时统一使用 UTC,不读取节点 TZ。 */\n timezone?: string\n /** 是否启用(默认 true) */\n enabled?: boolean\n /** 是否在执行后自动删除(默认 false) */\n deleteAfterRun?: boolean\n /** 失败重试策略 */\n retry?: TaskRetryPolicy\n /** 全部副作用按 context.occurrenceId 原子持久去重时才为 true;默认 false,未知结果禁止自动重跑。 */\n idempotent?: boolean\n /** 通用参数 */\n params?: TaskParams\n /** 任务处理器;为空时可由全局事件回调统一处理 */\n handler?: TaskHandlerConfig\n}\n\n// ─── 触发与执行上下文 ───\n\n/**\n * 任务触发信息\n *\n * @example\n * ```ts\n * import type { TaskTriggerInfo } from '@h-ai/scheduler'\n *\n * const trigger: TaskTriggerInfo = { type: 'manual', source: 'billing-console' }\n * const source = trigger.source ?? 'cron'\n * ```\n */\nexport interface TaskTriggerInfo {\n /** 触发类型 */\n type: TaskTriggerType\n /** 触发来源;定时触发时通常为 null,手工触发时可指定渠道 */\n source: string | null\n}\n\n/**\n * 任务执行上下文\n *\n * @example\n * ```ts\n * import type { SchedulerTaskContext } from '@h-ai/scheduler'\n *\n * function safeReceipt(context: SchedulerTaskContext): string {\n * if (!context.occurrenceId || !context.executionToken) throw new Error('Shared execution identity required')\n * return context.occurrenceId\n * }\n * // 接收端将稳定 receipt 原子持久去重;executionToken 不写入用户可见日志。\n * ```\n */\nexport interface SchedulerTaskContext {\n /** 一次调度发生的稳定标识;所有重试共享,供宿主构造业务幂等键。 */\n occurrenceId?: string\n /** 当前领取独有的凭据,用于宿主条件提交;续租失败后不能继续产生副作用。 */\n executionToken?: string\n /** 数据库执行序号;与 attempt 组成接收端可比较的 fencing 版本。 */\n sequence?: number\n /** 同一 occurrence 中持久化的尝试次数。 */\n attempt?: number\n /** 当前任务 */\n task: TaskDefinition\n /** 任务 ID */\n taskId: string\n /** 当前参数快照 */\n params: TaskParams\n /** 触发信息 */\n trigger: TaskTriggerInfo\n}\n\n/**\n * 编译后的 JS 任务函数\n *\n * @example\n * ```ts\n * import type { JsTaskHandler } from '@h-ai/scheduler'\n *\n * const handler: JsTaskHandler = (context, signal) => {\n * signal?.throwIfAborted()\n * return { taskId: context.taskId, batch: context.params.batch }\n * }\n * ```\n */\nexport type JsTaskHandler = (context: SchedulerTaskContext, signal?: AbortSignal) => unknown | Promise<unknown>\n\n// ─── 生命周期回调 ───\n\n/**\n * 任务开始事件\n *\n * @example\n * ```ts\n * import type { SchedulerTaskStartEvent } from '@h-ai/scheduler'\n *\n * function summarizeStart(event: SchedulerTaskStartEvent) {\n * return { taskId: event.task.id, occurrenceId: event.context?.occurrenceId, observedAt: event.startedAt }\n * }\n * ```\n */\nexport interface SchedulerTaskStartEvent {\n /** 已领取执行的持久身份,观测回调也可据此标记或幂等处理;竞争中断时不存在。 */\n context?: SchedulerTaskContext\n /** 关闭调度器时取消;回调必须停止后续副作用并释放资源 */\n signal: AbortSignal\n /** 当前任务 */\n task: TaskDefinition\n /** 触发信息 */\n trigger: TaskTriggerInfo\n /** 开始时间(Unix 时间戳,毫秒) */\n startedAt: number\n}\n\n/**\n * 任务执行事件\n *\n * @example\n * ```ts\n * import type { SchedulerTaskExecuteEvent } from '@h-ai/scheduler'\n *\n * function execute(event: SchedulerTaskExecuteEvent) {\n * event.signal.throwIfAborted()\n * return { taskId: event.context.taskId, params: event.context.params }\n * }\n * ```\n */\nexport interface SchedulerTaskExecuteEvent extends SchedulerTaskStartEvent {\n /** 执行上下文 */\n context: SchedulerTaskContext\n}\n\n/**\n * 任务中断事件\n *\n * @example\n * ```ts\n * import type { SchedulerTaskInterruptedEvent } from '@h-ai/scheduler'\n *\n * function summarizeInterruption(event: SchedulerTaskInterruptedEvent) {\n * return { taskId: event.task.id, reason: event.reason, observedAt: event.interruptedAt }\n * }\n * // 中断观测不能证明外部副作用不存在。\n * ```\n */\nexport interface SchedulerTaskInterruptedEvent extends SchedulerTaskStartEvent {\n /** 中断时间(Unix 时间戳,毫秒) */\n interruptedAt: number\n /** 中断原因 */\n reason: string\n}\n\n/**\n * 任务结束事件\n *\n * @example\n * ```ts\n * import type { SchedulerTaskFinishEvent } from '@h-ai/scheduler'\n *\n * function needsLogRepair(event: SchedulerTaskFinishEvent): boolean {\n * return event.log.persistence.status === 'pending'\n * }\n * // 结束回调是观测;业务是否已提交以 journal 为准。\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 *\n * @example\n * ```ts\n * import type { SchedulerTaskHooks } from '@h-ai/scheduler'\n *\n * const hooks: SchedulerTaskHooks = {\n * onTaskExecute: ({ context, signal }) => {\n * signal.throwIfAborted()\n * return { taskId: context.taskId }\n * },\n * }\n * // 有副作用的宿主需使用 context.occurrenceId 和持久条件写入。\n * ```\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/**\n * 执行状态\n *\n * @example\n * ```ts\n * import type { ExecutionStatus } from '@h-ai/scheduler'\n *\n * function needsReconciliation(status: ExecutionStatus): boolean {\n * return status === 'unknown'\n * }\n * // unknown 先隔离旧执行并核对外部效果,不换键重试。\n * ```\n */\nexport type ExecutionStatus = 'success' | 'failed' | 'interrupted' | 'unknown'\n\n/**\n * 日志投影状态,与业务 status 独立;unconfirmed 表示没有可补写的已确认终态。\n *\n * @example\n * ```ts\n * import type { TaskLogPersistence } from '@h-ai/scheduler'\n *\n * const persistence: TaskLogPersistence = { status: 'pending', error: { code: 'hai:scheduler:032', message: 'Log projection pending' } }\n * const needsRepair = persistence.status === 'pending'\n * ```\n */\nexport interface TaskLogPersistence {\n /** pending 可由已发布 journal 补写;persisted 已确认日志和回执;unconfirmed 不能推断业务结果。 */\n status: 'pending' | 'persisted' | 'unconfirmed'\n /** 安全的公开错误,不包含 SQL、驱动 cause 或连接参数。 */\n error?: { code: string, message: string }\n}\n\n/**\n * 任务执行日志\n *\n * @example\n * ```ts\n * import type { TaskExecutionLog } from '@h-ai/scheduler'\n *\n * function summarize(log: TaskExecutionLog) {\n * return { businessStatus: log.status, logStatus: log.persistence.status, occurrenceId: log.occurrenceId }\n * }\n * // pending 的成功业务只补写日志,不重跑处理器。\n * ```\n */\nexport interface TaskExecutionLog {\n /** 持久执行回执;相同定时 occurrence 或手动幂等键共用。 */\n occurrenceId?: string\n /** 每次尝试固定的 UUID 主键;未知写入回执或并发补写均复用。 */\n id: string\n /** 独立持久化状态;业务成功不等于日志保存成功。 */\n persistence: TaskLogPersistence\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 /** 序列化 JS/Hook 结果或 API 响应正文;无结果为 null */\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 *\n * @example\n * ```ts\n * import type { LogQueryOptions } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * const options: LogQueryOptions = { taskId: 'daily-report', status: 'success', pagination: { page: 1, pageSize: 20 } }\n * const logs = await scheduler.getLogs(options)\n * if (!logs.success) throw new Error(logs.error.message)\n * const page = logs.data.items\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/**\n * 日志清理策略\n *\n * @example\n * ```ts\n * import type { SchedulerLogCleanupPolicy } from '@h-ai/scheduler'\n *\n * const policy: SchedulerLogCleanupPolicy = { maxLogs: 1000, retentionDays: 30 }\n * // 仅清理日志投影,不撤销或重排共享 execution journal。\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 *\n * @example\n * ```ts\n * import type { TaskUpdateInput } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * const updates: TaskUpdateInput = { enabled: false, timezone: null }\n * const changed = await scheduler.updateTask('daily-report', updates)\n * if (!changed.success) throw new Error(changed.error.message)\n * // null 时区恢复 UTC,任务 ID 不能修改。\n * ```\n */\nexport interface TaskUpdateInput {\n /** 全部副作用的持久去重能力声明。 */\n idempotent?: boolean\n /** 任务名称 */\n name?: string\n /** 任务描述 */\n description?: string\n /** cron 表达式 */\n cron?: string\n /** IANA 时区;传 null 表示清空并恢复 UTC,不读取节点 TZ。 */\n timezone?: string | null\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/**\n * 手工触发输入\n *\n * @example\n * ```ts\n * import type { TriggerTaskInput } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * const options: TriggerTaskInput = { source: 'billing-console', idempotencyKey: 'billing-2026-10' }\n * const result = await scheduler.trigger('daily-report', options)\n * if (!result.success) throw new Error(result.error.message)\n * const status = result.data.status\n * ```\n */\nexport interface TriggerTaskInput {\n /** 手工触发来源(例如 admin-console / api / cli) */\n source?: string\n /** 稳定业务触发键(1–128 字符);同任务重复使用会命中同一持久执行。 */\n idempotencyKey?: string\n}\n\n/**\n * 可信运维可见的执行状态;unknown 继续占用任务串行槽。\n *\n * @example\n * ```ts\n * import type { SchedulerExecutionState } from '@h-ai/scheduler'\n *\n * function occupiesUncertainSlot(state: SchedulerExecutionState): boolean {\n * return state === 'unknown'\n * }\n * ```\n */\nexport type SchedulerExecutionState = 'claimed' | 'running' | ExecutionStatus | 'discarded'\n\n/**\n * 不包含代码、参数、URL 或 owner 凭据的共享执行记录。\n *\n * @example\n * ```ts\n * import type { SchedulerExecutionEntry } from '@h-ai/scheduler'\n *\n * function publicAudit(entry: SchedulerExecutionEntry) {\n * return { occurrenceId: entry.occurrenceId, status: entry.status, revision: entry.updatedAt }\n * }\n * // 安全投影不包含 owner token 和业务载荷。\n * ```\n */\nexport interface SchedulerExecutionEntry {\n /** 稳定执行回执。 */\n occurrenceId: string\n /** 任务标识。 */\n taskId: string\n /** 共享状态。 */\n status: SchedulerExecutionState\n /** 数据库序号,配合 attempt 用于外部 fencing。 */\n sequence: number\n /** 已开始的尝试次数。 */\n attemptCount: number\n /** 最近状态版本(Unix 毫秒),用于人工裁定条件。 */\n updatedAt: number\n /** 日志投影独立状态;pending 不会重新排队业务。 */\n logPersistence: TaskLogPersistence['status']\n}\n\n/**\n * 可信服务端的执行查询与人工核对入口。\n *\n * @example\n * ```ts\n * import type { SchedulerExecutionOperations } from '@h-ai/scheduler'\n *\n * async function repairPending(execution: SchedulerExecutionOperations) {\n * const pending = await execution.listLogFailures({ limit: 20 })\n * if (!pending.success) return pending\n * for (const entry of pending.data) {\n * const repaired = await execution.repairLog(entry.occurrenceId)\n * if (!repaired.success) return repaired\n * }\n * }\n * // 此链路不会调用业务 handler。\n * ```\n */\nexport interface SchedulerExecutionOperations {\n /** 按回执查询安全元数据。@example await scheduler.execution.get(occurrenceId) */\n get: (occurrenceId: string) => Promise<HaiResult<SchedulerExecutionEntry | null>>\n /** 有界查询待核对的 unknown;每页 1–100 条。@example await scheduler.execution.listUnknown({ limit: 50, offset: 0 }) */\n listUnknown: (options?: { limit?: number, offset?: number }) => Promise<HaiResult<SchedulerExecutionEntry[]>>\n /** 分页查询已有终态但日志尚待补写的回执,不含业务载荷。@example await scheduler.execution.listLogFailures({ limit: 50 }) */\n listLogFailures: (options?: { limit?: number, offset?: number }) => Promise<HaiResult<SchedulerExecutionEntry[]>>\n /** 只从已发布 journal 幂等补写日志,不执行业务;并发调用安全。@example await scheduler.execution.repairLog(occurrenceId) */\n repairLog: (occurrenceId: string) => Promise<HaiResult<void>>\n /** 先终止旧 runner 并核对外部结果,再条件裁定;不能重新排队。@example await scheduler.execution.resolveUnknown(id, { status: 'discarded', expectedUpdatedAt: entry.updatedAt }) */\n resolveUnknown: (occurrenceId: string, resolution: { status: 'success' | 'discarded', expectedUpdatedAt: number }) => Promise<HaiResult<void>>\n}\n\n// ─── 初始化输入 ───\n\n/**\n * 调度器初始化输入\n *\n * 包含调度器配置、可选的预定义任务列表,以及可选的全局生命周期回调。\n *\n * @example\n * ```ts\n * import type { SchedulerInitInput } from '@h-ai/scheduler'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * // 宿主已成功初始化共享 reldb。\n * const input: SchedulerInitInput = { leaseMs: 60000, tasks: [{ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }], hooks: { onTaskExecute: ({ context }) => ({ taskId: context.taskId }) } }\n * const initialized = await scheduler.init(input)\n * if (!initialized.success) throw new Error(initialized.error.message)\n * ```\n */\nexport interface SchedulerInitInput extends SchedulerConfigInput {\n /** 预定义任务列表(从配置中加载,初始化时自动注册) */\n tasks?: TaskDefinition[]\n /** 全局任务生命周期回调 */\n hooks?: SchedulerTaskHooks\n}\n\n// ─── 调度器接口 ───\n\n/**\n * 调度器函数接口\n *\n * @example\n * ```ts\n * import type { SchedulerFunctions } from '@h-ai/scheduler'\n *\n * async function stopScheduler(instance: SchedulerFunctions) {\n * const stopped = instance.stop()\n * if (!stopped.success) return stopped\n * await instance.close()\n * }\n * // close 返回 Promise<void>,宿主随后关闭自己拥有的共享数据库。\n * ```\n */\nexport interface SchedulerFunctions {\n /** 共享执行状态、未知结果查询与可信人工裁定。 */\n readonly execution: SchedulerExecutionOperations\n /** 刷新共享数据库中的任务定义,用于跨实例配置读取。 */\n refreshTasks: () => Promise<HaiResult<void>>\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 * 跨节点执行日志与任务串行槽;唯一约束和 owner 条件是调度正确性的依据。\n * @module scheduler-repository-execution\n */\nimport type { HaiResult } from '@h-ai/core'\nimport type { ReldbFunctions } from '@h-ai/reldb'\nimport type { SchedulerExecutionEntry, SchedulerExecutionState, TaskDefinition, TaskExecutionLog, TaskTriggerInfo } from '../scheduler-types.js'\nimport { createHash, randomUUID } from 'node:crypto'\nimport { err, ok } from '@h-ai/core'\nimport { BaseReldbCrudRepository } from '@h-ai/reldb'\nimport { schedulerM } from '../scheduler-i18n.js'\nimport { HaiSchedulerError } from '../scheduler-types.js'\n\nconst TABLE = 'hai_scheduler_executions'\n\n/**\n * 内部持久执行记录;owner 不对运维查询输出。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function inspect(repository: SchedulerExecutionRepository) {\n * const result = await repository.expired()\n * if (!result.success) return result\n * const records: StoredExecution[] = result.data\n * return records.map(executionEntry)\n * }\n * ```\n */\nexport interface StoredExecution {\n /** 全局递增的数据库序号。 */\n sequence: number\n /** 固定执行身份,跨重试及恢复不变。 */\n occurrenceId: string\n /** 任务标识。 */\n taskId: string\n /** 占据的串行槽;只有确认终态才置空。 */\n activeTask?: string\n /** 共享状态机阶段。 */\n status: SchedulerExecutionState\n /** 当前领取独有的凭据。 */\n owner?: string\n /** 有效租约的 Unix 毫秒截止点。 */\n leasedUntil: number\n /** 已通过副作用门闩的次数。 */\n attemptCount: number\n /** 本 occurrence 保存的次数上限。 */\n maxAttempts: number\n /** 初次领取时声明的持久幂等能力。 */\n idempotent: boolean\n /** 首次领取时的任务定义 JSON。 */\n snapshot: string\n /** 首次触发的类型、来源和可选分钟槽 JSON。 */\n triggerJson: string\n /** 已确认结果 JSON,用于相同手动键返回持久结果。 */\n logJson?: string\n /** 已确认终态的全部尝试日志 JSON;日志投影失败或进程退出后仍可补写。 */\n logsJson?: string\n /** 与业务阶段独立的日志投影状态。 */\n logPersistence: 'pending' | 'persisted' | 'unconfirmed'\n /** 最近共享状态更新时间(Unix 毫秒)。 */\n updatedAt: number\n /** 初次领取时间(Unix 毫秒)。 */\n createdAt: number\n}\n\n/**\n * 稳定 occurrence 包含 taskId,避免不同任务的相同业务键冲突。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const scheduledId = executionId('daily-report', 'scheduled', String(Math.floor(1792705800000 / 60000)))\n * const manualId = executionId('daily-report', 'manual', 'report-2026-10-23')\n * ```\n */\nexport function executionId(taskId: string, type: string, key: string): string {\n return createHash('sha256').update(JSON.stringify([taskId, type, key])).digest('hex')\n}\n\n/**\n * 公共状态投影只保留运维元数据。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function read(repository: SchedulerExecutionRepository, id: string) {\n * const found = await repository.byOccurrence(id)\n * if (!found.success) return found\n * return found.data ? executionEntry(found.data) : null\n * }\n * ```\n */\nexport function executionEntry(row: StoredExecution): SchedulerExecutionEntry {\n return { occurrenceId: row.occurrenceId, taskId: row.taskId, status: row.status, sequence: row.sequence, attemptCount: row.attemptCount, updatedAt: row.updatedAt, logPersistence: row.logPersistence }\n}\n\n/** 统一持久状态失败;不回退为本地执行。 */\nfunction failed(cause?: unknown) {\n return err(HaiSchedulerError.DB_SAVE_FAILED, schedulerM('scheduler_executionStateFailed'), cause)\n}\n\n/**\n * 执行仓库;active_task 唯一列直到已确认的终态才释放,覆盖 cron/manual/跨分钟。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function claimOnce(db: ReldbFunctions) {\n * const repository = new SchedulerExecutionRepository(db)\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const id = executionId(task.id, 'manual', 'report-2026-10-23')\n * const claimed = await repository.claim(task, id, { type: 'manual', source: null }, 'node-report', 60000)\n * if (!claimed.success || !claimed.data) return claimed\n * const begun = await repository.begin(claimed.data, 60000)\n * if (!begun.success) return begun\n * return executionEntry(claimed.data)\n * }\n * ```\n */\nexport class SchedulerExecutionRepository extends BaseReldbCrudRepository<StoredExecution> {\n constructor(db: ReldbFunctions) {\n super(db, {\n table: TABLE,\n idColumn: 'sequence',\n idField: 'sequence',\n fields: [\n { fieldName: 'sequence', columnName: 'sequence', def: { type: 'INTEGER', primaryKey: true, autoIncrement: true }, select: true, create: false, update: false },\n ...[\n ['occurrenceId', 'occurrence_id', true, true],\n ['taskId', 'task_id', true, false],\n ['activeTask', 'active_task', false, true],\n ['status', 'status', true, false],\n ['owner', 'owner', false, false],\n ['snapshot', 'snapshot', true, false],\n ['triggerJson', 'trigger_json', true, false],\n ['logJson', 'log_json', false, false],\n ['logsJson', 'logs_json', false, false],\n ['logPersistence', 'log_persistence', true, false],\n ].map(([fieldName, columnName, notNull, unique]) => ({\n fieldName: String(fieldName),\n columnName: String(columnName),\n def: { type: ['snapshot', 'triggerJson', 'logJson', 'logsJson'].includes(String(fieldName)) ? 'JSON' as const : 'TEXT' as const, notNull: Boolean(notNull), unique: Boolean(unique) },\n select: true,\n create: true,\n update: true,\n })),\n ...[\n ['leasedUntil', 'leased_until'],\n ['attemptCount', 'attempt_count'],\n ['maxAttempts', 'max_attempts'],\n ['updatedAt', 'updated_at'],\n ['createdAt', 'created_at'],\n ].map(([fieldName, columnName]) => ({\n fieldName,\n columnName,\n def: { type: 'BIGINT' as const, notNull: true },\n select: true,\n create: true,\n update: true,\n })),\n { fieldName: 'idempotent', columnName: 'idempotent', def: { type: 'BOOLEAN', notNull: true }, select: true, create: true, update: true },\n ],\n })\n }\n\n /**\n * 只按已初始化的数据库类型选择存储端毫秒时钟。\n * PostgreSQL/MySQL 使用执行时钟,不能使用固定在事务/语句开始处的时间快照。\n * 期限表达式直接进入有 owner 条件的 SQL;先 SELECT 时间再写入仍有等待窗口。\n *\n * @example\n * ```ts\n * // 模块内部上下文:当前仓库实例仅生成固定白名单 SQL,不接收调用方表达式。\n * const deadlinePredicate = `leased_until > ${this.databaseClock()}`\n * ```\n */\n private databaseClock(): string {\n if (this.db.config?.type === 'postgresql')\n return 'CAST(FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) AS BIGINT)'\n if (this.db.config?.type === 'mysql')\n return 'CAST(UNIX_TIMESTAMP(SYSDATE(3)) * 1000 AS UNSIGNED)'\n return 'CAST((julianday(\\'now\\') - 2440587.5) * 86400000 AS INTEGER)'\n }\n\n /** 同毫秒内的持久状态版本仍单调增加,日志确认/人工裁定不依赖节点墙钟。 */\n private nextUpdatedAt(): string {\n const clock = this.databaseClock()\n return `CASE WHEN updated_at >= ${clock} THEN updated_at + 1 ELSE ${clock} END`\n }\n\n /** 存储端毫秒时钟供 cron 计算共享分钟身份;读取失败停止本轮调度,不回退节点时钟。 */\n async currentTime(): Promise<HaiResult<number>> {\n const result = await this.db.sql.get<{ now: number | string }>(`SELECT ${this.databaseClock()} AS now`)\n if (!result.success)\n return failed(result.error)\n const now = Number(result.data?.now)\n return Number.isSafeInteger(now) && now >= 0 ? ok(now) : failed()\n }\n\n /** 读取统一校验 BIGINT,不能把 PG 字符串时间或舍入的序号用于 owner 判断。 */\n private normalize(row: StoredExecution): HaiResult<StoredExecution> {\n const value = { ...row }\n // JSON 大载荷避免 MySQL 的 TEXT→VARCHAR(255) 映射;驱动解码后统一恢复内部 JSON 文本契约。\n for (const field of ['snapshot', 'triggerJson', 'logJson', 'logsJson'] as const) {\n if (row[field] !== undefined && row[field] !== null && typeof row[field] !== 'string')\n value[field] = JSON.stringify(row[field])\n }\n for (const field of ['sequence', 'leasedUntil', 'attemptCount', 'maxAttempts', 'updatedAt', 'createdAt'] as const) {\n const number = Number(row[field])\n if (!Number.isSafeInteger(number) || number < 0)\n return failed()\n value[field] = number\n }\n return ok(value)\n }\n\n /** 按稳定回执读取。@example await repository.byOccurrence(id) */\n async byOccurrence(id: string): Promise<HaiResult<StoredExecution | null>> {\n const rows = await this.findAll({ where: 'occurrence_id = ?', params: [id], limit: 1 })\n if (!rows.success)\n return failed(rows.error)\n return rows.data[0] ? this.normalize(rows.data[0]) : ok(null)\n }\n\n /** 有界读取过期执行,跨分钟恢复原 occurrence,而不是创建新的副作用身份。@example await repository.expired() */\n async expired(): Promise<HaiResult<StoredExecution[]>> {\n return this.rows(`status IN (?, ?) AND leased_until <= ${this.databaseClock()}`, ['claimed', 'running'], 100, 0)\n }\n\n /** 任务被删除或触发元数据损坏时,过期记录隔离为 unknown,允许可信人工核对而非永久悬挂。 */\n async isolateExpired(row: StoredExecution): Promise<HaiResult<void>> {\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, owner = NULL, leased_until = 0, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND owner = ? AND leased_until <= ${this.databaseClock()} AND status IN (?, ?)`,\n ['unknown', row.occurrenceId, row.owner, 'claimed', 'running'],\n )\n return result.success && result.data.changes === 1 ? ok(undefined) : failed()\n }\n\n /** 有界读取待人工核对记录。@example await repository.unknown(50, 0) */\n async unknown(limit: number, offset: number): Promise<HaiResult<StoredExecution[]>> {\n return this.rows('status = ?', ['unknown'], limit, offset)\n }\n\n /** 仅查询已发布终态且日志待补写的回执。@example await repository.pendingLogs(50, 0) */\n async pendingLogs(limit: number, offset: number): Promise<HaiResult<StoredExecution[]>> {\n return this.rows('log_persistence = ? AND status NOT IN (?, ?)', ['pending', 'claimed', 'running'], limit, offset)\n }\n\n /**\n * 确认相同终态快照的日志投影;不变更业务状态,不重新领取任务。\n * @example await repository.confirmLogs(row)\n */\n async confirmLogs(row: StoredExecution): Promise<HaiResult<void>> {\n if (!row.logJson || !row.logsJson)\n return failed()\n const log = JSON.parse(row.logJson) as TaskExecutionLog\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET log_persistence = ?, log_json = ?, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND updated_at = ? AND log_persistence = ? AND status NOT IN (?, ?)`,\n ['persisted', JSON.stringify({ ...log, persistence: { status: 'persisted' } }), row.occurrenceId, row.updatedAt, 'pending', 'claimed', 'running'],\n )\n if (result.success && result.data.changes === 1)\n return ok(undefined)\n const current = await this.byOccurrence(row.occurrenceId)\n return current.success && current.data?.logPersistence === 'persisted' && current.data.logsJson === row.logsJson ? ok(undefined) : failed()\n }\n\n private async rows(where: string, params: unknown[], limit: number, offset: number): Promise<HaiResult<StoredExecution[]>> {\n const result = await this.findAll({ where, params, limit, offset, orderBy: 'sequence ASC' })\n if (!result.success)\n return failed(result.error)\n const rows: StoredExecution[] = []\n for (const row of result.data) {\n const normalized = this.normalize(row)\n if (!normalized.success)\n return normalized\n rows.push(normalized.data)\n }\n return ok(rows)\n }\n\n /**\n * 唯一 active_task 防止不同 occurrence 并行;同 occurrence 只可恢复安全的过期记录。\n * @example await repository.claim(task, id, trigger, nodeId, leaseMs)\n */\n async claim(task: TaskDefinition, id: string, trigger: TaskTriggerInfo, nodeId: string, leaseMs: number): Promise<HaiResult<StoredExecution | null>> {\n const ready = await this.ensureReady()\n if (!ready.success)\n return failed(ready.error)\n const clock = this.databaseClock()\n const owner = `${nodeId}:${randomUUID()}`\n let created: HaiResult<unknown>\n try {\n // INSERT 的期限和初始时间与存储端同一语句计算,不接受本机 Date.now() 授权。\n created = await this.db.sql.execute(\n `INSERT INTO ${TABLE} (occurrence_id, task_id, active_task, status, owner, leased_until, attempt_count, max_attempts, idempotent, snapshot, trigger_json, log_persistence, updated_at, created_at)\n VALUES (?, ?, ?, ?, ?, ${clock} + ?, 0, ?, ?, ?, ?, ?, ${clock}, ${clock})`,\n [id, task.id, task.id, 'claimed', owner, leaseMs, task.retry?.maxAttempts ?? 1, this.db.config?.type === 'postgresql' ? task.idempotent === true : Number(task.idempotent === true), JSON.stringify(task), JSON.stringify(trigger), 'unconfirmed'],\n )\n }\n catch (cause) {\n return failed(cause)\n }\n const existing = await this.byOccurrence(id)\n if (!existing.success)\n return existing\n if (!existing.data) {\n // 冲突可能来自另一个 occurrence 的串行槽;只有实际存在占用者才按正常竞争处理。\n const active = await this.findAll({ where: 'active_task = ?', params: [task.id], limit: 1 })\n return active.success && active.data.length > 0 ? ok(null) : failed(created.success ? undefined : created.error)\n }\n const row = existing.data\n if (created.success || ['success', 'failed', 'interrupted', 'discarded'].includes(row.status))\n return ok(row)\n if (row.status === 'unknown')\n return ok(null)\n // 是否过期只在下方写语句里判断,不能先用某个节点的墙钟决定接管或隔离。\n if (row.status === 'running' && (!row.idempotent || row.attemptCount >= row.maxAttempts)) {\n const isolated = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, owner = NULL, leased_until = 0, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND owner = ? AND leased_until <= ${clock} AND status = ?`,\n ['unknown', id, row.owner, 'running'],\n )\n return isolated.success ? ok(null) : failed(isolated.error)\n }\n const recovered = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, owner = ?, leased_until = ${clock} + ?, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND owner = ? AND leased_until <= ${clock} AND status IN (?, ?)`,\n ['claimed', owner, leaseMs, id, row.owner, 'claimed', 'running'],\n )\n if (!recovered.success)\n return failed(recovered.error)\n return recovered.data.changes === 1 ? this.byOccurrence(id) : ok(null)\n }\n\n /** 外部副作用前的条件门闩,并原子递增持久尝试次数。@example await repository.begin(row, leaseMs) */\n async begin(row: StoredExecution, leaseMs: number): Promise<HaiResult<void>> {\n const clock = this.databaseClock()\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, attempt_count = attempt_count + 1, leased_until = ${clock} + ?, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND owner = ? AND leased_until > ${clock} AND status IN (?, ?) AND attempt_count < max_attempts`,\n ['running', leaseMs, row.occurrenceId, row.owner, 'claimed', 'running'],\n )\n if (!result.success || result.data.changes !== 1)\n return failed(result.success ? undefined : result.error)\n row.status = 'running'\n row.attemptCount += 1\n return ok(undefined)\n }\n\n /** 只续租仍然有效的 owner;过期凭据不能复活。@example await repository.renew(row, leaseMs) */\n async renew(row: StoredExecution, leaseMs: number): Promise<HaiResult<void>> {\n const clock = this.databaseClock()\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET leased_until = ${clock} + ?, updated_at = ${this.nextUpdatedAt()} WHERE occurrence_id = ? AND owner = ? AND leased_until > ${clock} AND status IN (?, ?)`,\n [leaseMs, row.occurrenceId, row.owner, 'claimed', 'running'],\n )\n return result.success && result.data.changes === 1 ? ok(undefined) : failed()\n }\n\n /** 有效 owner 确认终态;unknown 保留串行槽,阻止下一 cron/manual 与旧副作用并行。@example await repository.finish(row, log) */\n async finish(row: StoredExecution, log: TaskExecutionLog, logs: TaskExecutionLog[] = [log]): Promise<HaiResult<void>> {\n const clock = this.databaseClock()\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, active_task = ?, owner = NULL, leased_until = 0, log_json = ?, logs_json = ?, log_persistence = ?, updated_at = ${this.nextUpdatedAt()}\n WHERE occurrence_id = ? AND owner = ? AND leased_until > ${clock} AND status IN (?, ?)`,\n [log.status, log.status === 'unknown' ? row.taskId : null, JSON.stringify(log), JSON.stringify(logs), 'pending', row.occurrenceId, row.owner, 'claimed', 'running'],\n )\n return result.success && result.data.changes === 1 ? ok(undefined) : failed()\n }\n\n /** 人工隔离旧 runner 后条件裁定;不重排旧 occurrence,只有成功裁定才释放任务槽。@example await repository.resolve(id, 'discarded', updatedAt) */\n async resolve(id: string, status: 'success' | 'discarded', expectedUpdatedAt: number): Promise<HaiResult<void>> {\n const result = await this.db.sql.execute(\n `UPDATE ${TABLE} SET status = ?, active_task = NULL, updated_at = ${this.nextUpdatedAt()} WHERE occurrence_id = ? AND status = ? AND updated_at = ?`,\n [status, id, 'unknown', expectedUpdatedAt],\n )\n return result.success && result.data.changes === 1 ? ok(undefined) : failed()\n }\n}\n","/**\n * @h-ai/scheduler — 执行日志仓库\n *\n * 基于 @h-ai/reldb BaseReldbCrudRepository 实现执行日志的持久化与查询。\n * @module scheduler-repository-log\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 { isDeepStrictEqual } from 'node:util'\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\n/**\n * 内部持久日志行;UUID 是幂等主键,完整 payload 使用 JSON 保存而不截断结果。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * function persistedRow(payload: TaskExecutionLog): LogRow {\n * return { id: payload.id, occurrenceId: payload.occurrenceId, taskId: payload.taskId, taskName: payload.taskName, taskType: payload.taskType, triggerType: payload.triggerType, triggerSource: payload.triggerSource, status: payload.status, payload, startedAt: payload.startedAt, finishedAt: payload.finishedAt, duration: payload.duration }\n * }\n * ```\n */\ninterface LogRow {\n id: string\n occurrenceId?: string\n taskId: string\n taskName: string\n taskType: string\n triggerType: string\n triggerSource: string | null\n status: string\n payload: TaskExecutionLog\n startedAt: number\n finishedAt: number\n duration: number\n}\n\n/**\n * 内部日志投影仓库;固定 UUID 与完整内容比对处理提交后回执丢失,不能因日志失败重跑业务。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function inspect(db: ReldbFunctions) {\n * const repository = new SchedulerLogRepository(db)\n * const logs = await repository.queryLogs({ taskId: 'daily-report', pagination: { page: 1, pageSize: 20 } })\n * if (!logs.success) return logs\n * return logs.data.items\n * }\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: 'TEXT', primaryKey: true }, select: true, create: true, update: false },\n { fieldName: 'occurrenceId', columnName: 'occurrence_id', def: { type: 'TEXT' }, select: true, create: true, 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: 'payload', columnName: 'payload', def: { type: 'JSON', notNull: true }, select: true, create: true, update: false },\n { fieldName: 'startedAt', columnName: 'started_at', def: { type: 'BIGINT', notNull: true }, select: true, create: true, update: false },\n { fieldName: 'finishedAt', columnName: 'finished_at', def: { type: 'BIGINT', 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 /**\n * 按固定 UUID 写入完整日志;写入失败后重读相同主键,只有真实内容相同才视为已保存。\n * @example `const saved = await repository.saveLog(log); if (!saved.success) return saved`\n */\n async saveLog(log: TaskExecutionLog): Promise<HaiResult<void>> {\n const payload: TaskExecutionLog = { ...log, persistence: { status: 'persisted' } }\n try {\n const created = await this.create({\n id: log.id,\n occurrenceId: log.occurrenceId,\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 payload,\n startedAt: log.startedAt,\n finishedAt: log.finishedAt,\n duration: log.duration,\n })\n if (created.success)\n return ok(undefined)\n }\n catch {\n // 驱动可能在提交后丢失回执;下方真实读取确认,不依据重复错误文案猜测。\n }\n try {\n const existing = await this.findById(log.id)\n if (existing.success && existing.data && isDeepStrictEqual(existing.data.payload, payload))\n return ok(undefined)\n }\n catch {}\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\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: 'started_at DESC, 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 => ({ ...row.payload, persistence: { status: 'persisted' as const } })),\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-repository-task\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).max(100),\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 maxResponseBytes: z.number().int().positive().max(Number.MAX_SAFE_INTEGER).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})\n/**\n * 注册与持久读取共用的处理器校验,拒绝未开始发送就可以识别的非法配置。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const parsed = TaskHandlerConfigSchema.safeParse({ kind: 'api', url: 'https://example.com/health', timeout: 1000, maxResponseBytes: 4096 })\n * if (!parsed.success) throw new Error('Invalid handler configuration')\n * const kind = parsed.data.kind\n * ```\n */\nexport const TaskHandlerConfigSchema = z.discriminatedUnion('kind', [ApiTaskConfigSchema, JsTaskConfigSchema])\n\n/**\n * 内部任务持久行;JSON 字段读取后重新校验,null 时区表示默认 UTC。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const now = new Date()\n * const row: TaskRow = { id: 1, taskId: 'daily-report', taskName: '每日报表', description: null, cron: '0 2 * * *', timezone: null, enabled: true, idempotent: false, deleteAfterRun: false, retry: null, params: {}, handler: null, createdAt: now, updatedAt: now }\n * // timezone null 由任务装载流程恢复为 UTC 默认;JSON 字段仍须运行时校验。\n * ```\n */\ninterface TaskRow {\n id: number\n taskId: string\n taskName: string\n description: string | null\n cron: string\n timezone: string | null\n enabled: boolean\n idempotent: boolean\n deleteAfterRun: boolean\n retry: unknown\n params: unknown\n handler: unknown\n createdAt: Date\n updatedAt: Date\n}\n\n/**\n * 共享任务定义仓库;成功落库后才发布本地投影,一次性任务删除核对实际执行的定义快照。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function save(db: ReldbFunctions) {\n * const repository = new SchedulerTaskRepository(db)\n * const result = await repository.saveTask({ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' })\n * if (!result.success) return result\n * return repository.loadTasks()\n * }\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: 'timezone', columnName: 'timezone', def: { type: 'TEXT' }, 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: 'idempotent', columnName: 'idempotent', def: { type: 'BOOLEAN', notNull: true, defaultValue: false }, 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 timezone: task.timezone ?? null,\n enabled: task.enabled !== false,\n idempotent: task.idempotent === true,\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.timezone !== undefined)\n data.timezone = updates.timezone ?? null\n if (updates.enabled !== undefined)\n data.enabled = updates.enabled\n if (updates.idempotent !== undefined)\n data.idempotent = updates.idempotent\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 /** 删除任务;自动清理携带执行定义,在同一条 DELETE 内原子比较,保留并发编辑。 */\n async deleteTask(taskId: string, expected?: TaskDefinition): Promise<HaiResult<boolean>> {\n try {\n if (expected) {\n const conditions = ['task_id = ?', 'task_name = ?', 'cron = ?', 'COALESCE(timezone, \\'\\') = ?', 'COALESCE(description, \\'\\') = ?', 'enabled = ?', 'delete_after_run = ?', 'idempotent = ?']\n const postgres = this.db.config?.type === 'postgresql'\n const enabled = expected.enabled !== false\n const deleteAfterRun = expected.deleteAfterRun === true\n const params: unknown[] = [taskId, expected.name, expected.cron, expected.timezone ?? '', expected.description ?? '', postgres ? enabled : Number(enabled), postgres ? deleteAfterRun : Number(deleteAfterRun), postgres ? expected.idempotent === true : Number(expected.idempotent === true)]\n const jsonValue = this.db.config?.type === 'mysql' ? 'CAST(? AS JSON)' : this.db.config?.type === 'postgresql' ? 'CAST(? AS JSONB)' : '?'\n // JSON 比较使用各数据库的原生类型;标识符仅来自固定列白名单。\n const jsonFields: Array<[string, unknown]> = [['retry', expected.retry], ['params', expected.params ?? {}], ['handler', expected.handler]]\n for (const [column, value] of jsonFields) {\n if (value === undefined || value === null) {\n // CRUD 的 JSON 列可能保存 JSON null,而不是 SQL NULL,两者都表示未配置。\n conditions.push(`(${column} IS NULL OR ${column} = ${jsonValue})`)\n params.push('null')\n }\n else {\n conditions.push(`${column} = ${jsonValue}`)\n params.push(JSON.stringify(value))\n }\n }\n const deleted = await this.db.sql.execute(`DELETE FROM ${SCHEDULER_TASK_TABLE} WHERE ${conditions.join(' AND ')}`, params)\n return deleted.success ? ok(deleted.data.changes > 0) : deleted\n }\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(false)\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(deleteResult.data.changes > 0)\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 return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidPersistedTask', { params: { taskId: row.taskId, error: paramsResult.error.message } }))\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 return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidPersistedTask', { params: { taskId: row.taskId, error: handlerResult.error.message } }))\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 return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidPersistedTask', { params: { taskId: row.taskId, error: retryResult.error.message } }))\n }\n\n tasks.push({\n id: row.taskId,\n name: row.taskName,\n ...(row.description ? { description: row.description } : {}),\n cron: row.cron,\n ...(row.timezone ? { timezone: row.timezone } : {}),\n enabled: row.enabled,\n idempotent: row.idempotent,\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 — 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 * @param timezone - IANA 时区;省略时使用 UTC,不读取节点本地 TZ。\n * @returns 解析结果,成功时返回 Cron 实例\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const parsed = parseCronExpression('0 2 * * *')\n * if (!parsed.success) return parsed\n * const due = matchesCron(parsed.data, new Date('2026-10-23T02:00:00Z'))\n * return due\n * ```\n */\nexport function parseCronExpression(expression: string, timezone?: string): HaiResult<Cron> {\n try {\n const cron = new Cron(expression, { legacyMode: false, timezone: timezone ?? 'UTC' })\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 *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const parsed = parseCronExpression('0 10 * * *', 'Asia/Shanghai')\n * if (!parsed.success) return parsed\n * const due = matchesCron(parsed.data, new Date('2026-10-23T02:00:00Z'))\n * return due\n * ```\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 { TaskHandlerConfigSchema } from './repositories/scheduler-repository-task.js'\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>()\nconst persistedTaskIds = new Set<string>()\nlet definitionEpoch = 0\n/** 同一快照的并发读取共用一次查询,避免互相推进 epoch 后误判写冲突。 */\nlet activeRefresh: { repository: SchedulerTaskRepository, epoch: number, promise: Promise<HaiResult<void>> } | undefined\n\n/** 当前全局生命周期回调 */\nlet currentHooks: SchedulerTaskHooks = {}\n\n// ─── 任务注册表访问器 ───\n\n/**\n * 读取本节点已校验的任务投影;共享定义由刷新流程更新。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const enabled = [...getTaskRegistry().values()].filter(task => task.enabled !== false)\n * ```\n */\nexport function getTaskRegistry(): ReadonlyMap<string, TaskDefinition> {\n return taskRegistry\n}\n\n/**\n * 按任务 ID 读取本地只读投影,不访问数据库。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task = getTask('daily-report')\n * if (task) {\n * const cronExpression = task.cron\n * }\n * ```\n */\nexport function getTask(taskId: string): TaskDefinition | undefined {\n return taskRegistry.get(taskId)\n}\n\n/**\n * 检查当前投影是否含任务;不代替共享数据库的唯一约束。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * if (!hasTask('daily-report')) {\n * const registered = await registerTask({ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' })\n * if (!registered.success) return registered\n * }\n * return getTask('daily-report')\n * ```\n */\nexport function hasTask(taskId: string): boolean {\n return taskRegistry.has(taskId)\n}\n\n/**\n * 发布已校验且已持久化的任务投影,并推进本地快照代际。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * setTask(task.id, task)\n * ```\n */\nexport function setTask(taskId: string, task: TaskDefinition): void {\n definitionEpoch++\n taskRegistry.set(taskId, task)\n}\n\n/**\n * 删除本地投影并推进代际;公共注销先确认数据库删除成功。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * deleteTask('daily-report')\n * deleteCron('daily-report')\n * ```\n */\nexport function deleteTask(taskId: string): void {\n definitionEpoch++\n taskRegistry.delete(taskId)\n}\n\n// ─── Cron 缓存访问器 ───\n\n/**\n * 读取任务已解析的 cron;时区由任务定义明确或默认 UTC。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const cron = getCron('daily-report')\n * const due = cron?.match(new Date('2026-10-23T02:00:00Z')) ?? false\n * ```\n */\nexport function getCron(taskId: string): Cron | undefined {\n return cronCache.get(taskId)\n}\n\n/**\n * 缓存已成功解析的 cron 实例。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const parsed = parseCronExpression('0 2 * * *', 'UTC')\n * if (!parsed.success) return parsed\n * setCron('daily-report', parsed.data)\n * return parsed.data\n * ```\n */\nexport function setCron(taskId: string, cron: Cron): void {\n cronCache.set(taskId, cron)\n}\n\n/**\n * 移除任务的 cron 缓存;不删除持久定义。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * deleteCron('daily-report')\n * ```\n */\nexport function deleteCron(taskId: string): void {\n cronCache.delete(taskId)\n}\n\n// ─── 生命周期回调访问器 ───\n\n/**\n * 复制宿主回调配置;副作用的幂等与协作取消由宿主实现。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * setHooks({ onTaskExecute: ({ context, signal }) => {\n * signal.throwIfAborted()\n * return { taskId: context.taskId }\n * } })\n * ```\n */\nexport function setHooks(hooks: SchedulerTaskHooks): void {\n currentHooks = { ...hooks }\n}\n\n/**\n * 清空当前宿主回调,不能撤销已经开始的外部操作。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * clearHooks()\n * const remaining = getHooks().onTaskExecute\n * ```\n */\nexport function clearHooks(): void {\n currentHooks = {}\n}\n\n/**\n * 读取当前宿主回调的只读视图。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const hooks = getHooks()\n * const usesHostHandler = hooks.onTaskExecute !== undefined\n * ```\n */\nexport function getHooks(): Readonly<SchedulerTaskHooks> {\n return currentHooks\n}\n\n// ─── 重置(供 close() 调用) ───\n\n/**\n * 关闭时使旧刷新快照失效并清空任务、cron 和宿主回调。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // 关闭流程已排空 runner 后再丢弃所有投影与在途刷新句柄。\n * resetTaskState()\n * ```\n */\nexport function resetTaskState(): void {\n definitionEpoch++\n activeRefresh = undefined\n persistedTaskIds.clear()\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 || retry.maxAttempts > 100) {\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\n/**\n * 合并同一任务仓库的在途刷新;配置写入或关闭后不复用旧快照。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function refresh(repository: SchedulerTaskRepository) {\n * const result = await loadPersistedTasks(repository)\n * if (!result.success) return result\n * return [...getTaskRegistry().values()]\n * }\n * ```\n */\nexport async function loadPersistedTasks(taskRepo: SchedulerTaskRepository | null): Promise<HaiResult<void>> {\n if (!taskRepo)\n return ok(undefined)\n\n const epoch = definitionEpoch\n if (activeRefresh?.repository === taskRepo && activeRefresh.epoch === epoch)\n return activeRefresh.promise\n const refresh = { repository: taskRepo, epoch, promise: refreshPersistedTasks(taskRepo, epoch) }\n activeRefresh = refresh\n try {\n return await refresh.promise\n }\n finally {\n if (activeRefresh === refresh)\n activeRefresh = undefined\n }\n}\n\n/** 验证完整持久快照后替换内存投影;发生本地写入时拒绝覆盖更新。 */\nasync function refreshPersistedTasks(taskRepo: SchedulerTaskRepository, epoch: number): Promise<HaiResult<void>> {\n const loadResult = await taskRepo.loadTasks()\n if (!loadResult.success)\n return loadResult\n\n if (epoch !== definitionEpoch)\n return err(HaiSchedulerError.EXECUTION_FAILED, schedulerM('scheduler_definitionsChanged'))\n\n // 先完整验证快照再整体替换;保留仅由本节点配置声明的任务。\n const nextTasks = new Map([...taskRegistry].filter(([id]) => !persistedTaskIds.has(id)))\n const nextCrons = new Map([...cronCache].filter(([id]) => !persistedTaskIds.has(id)))\n for (const task of loadResult.data) {\n if (!task.id)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_taskIdEmpty'))\n if (nextTasks.has(task.id))\n return err(HaiSchedulerError.TASK_ALREADY_EXISTS, schedulerM('scheduler_taskAlreadyExists', { params: { taskId: task.id } }))\n const cronResult = parseCronExpression(task.cron, task.timezone)\n if (!cronResult.success)\n return cronResult\n nextTasks.set(task.id, task)\n nextCrons.set(task.id, cronResult.data)\n }\n definitionEpoch++\n taskRegistry.clear()\n cronCache.clear()\n persistedTaskIds.clear()\n for (const [id, task] of nextTasks)\n taskRegistry.set(id, task)\n for (const [id, cron] of nextCrons)\n cronCache.set(id, cron)\n for (const task of loadResult.data)\n persistedTaskIds.add(task.id)\n return ok(undefined)\n}\n\n/**\n * 顺序校验并加载初始化配置的本地投影;公共初始化随后按真实生命周期接入仓库。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const loaded = await loadConfigTasks([{ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }])\n * if (!loaded.success) return loaded\n * return [...getTaskRegistry().values()]\n * ```\n */\nexport async function loadConfigTasks(tasks: TaskDefinition[]): Promise<HaiResult<void>> {\n for (const task of tasks) {\n const registerResult = await registerTask(task)\n if (!registerResult.success)\n return registerResult\n }\n return ok(undefined)\n}\n\n/**\n * 校验完整定义并先持久化再开放本地调度;失败不发布半成品。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function register(repository: SchedulerTaskRepository) {\n * const result = await registerTask({ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }, repository)\n * if (!result.success) return result\n * return getTask('daily-report')\n * }\n * ```\n */\nexport async function registerTask(\n task: TaskDefinition,\n taskRepo?: SchedulerTaskRepository | null,\n): Promise<HaiResult<void>> {\n if ((task.handler && !TaskHandlerConfigSchema.safeParse(task.handler).success)\n || (task.idempotent !== undefined && typeof task.idempotent !== 'boolean')) {\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidHandlerConfig', { params: { taskId: task.id } }))\n }\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, task.timezone)\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 timezone: task.timezone,\n enabled: task.enabled !== false,\n idempotent: task.idempotent === true,\n deleteAfterRun: task.deleteAfterRun === true,\n retry: retryResult.data,\n params: task.params ?? {},\n }\n\n if (taskRepo) {\n const saveResult = await taskRepo.saveTask(normalizedTask)\n if (!saveResult.success) {\n logger.warn('Failed to persist task definition', { taskId: task.id, error: saveResult.error.message })\n return err(\n HaiSchedulerError.DB_SAVE_FAILED,\n schedulerM('scheduler_dbSaveFailed', { params: { error: saveResult.error.message } }),\n saveResult.error,\n )\n }\n persistedTaskIds.add(task.id)\n }\n\n // 成功落库后才开放调度,失败的保存不能提前执行。\n setTask(task.id, normalizedTask)\n setCron(task.id, cronResult.data)\n\n return ok(undefined)\n}\n\n/**\n * 先条件删除共享定义,再清除本地任务和 cron;失败保留原投影。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function unregister(repository: SchedulerTaskRepository) {\n * const result = await unregisterTask('daily-report', repository)\n * if (!result.success) return result\n * return result\n * }\n * ```\n */\nexport async function unregisterTask(\n taskId: string,\n taskRepo?: SchedulerTaskRepository | null,\n expected?: TaskDefinition,\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 if (taskRepo) {\n const deleteResult = await taskRepo.deleteTask(taskId, expected)\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 if (expected && !deleteResult.data)\n return ok(undefined)\n }\n\n deleteTask(taskId)\n deleteCron(taskId)\n persistedTaskIds.delete(taskId)\n\n return ok(undefined)\n}\n\n/**\n * 校验整个更新并先落库再替换投影;任何字段失败都不提前替换 cron。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function disable(repository: SchedulerTaskRepository) {\n * const result = await updateRegisteredTask('daily-report', { enabled: false }, repository)\n * if (!result.success) return result\n * return result\n * }\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 // 完整验证与持久化成功前,不发布任何部分更新。\n let updatedCron = getCron(taskId)\n\n if (updates.cron !== undefined || updates.timezone !== undefined) {\n const cronExpression = updates.cron ?? existingTask.cron\n const timezone = updates.timezone === null ? undefined : (updates.timezone ?? existingTask.timezone)\n const cronResult = parseCronExpression(cronExpression, timezone)\n if (!cronResult.success)\n return cronResult\n\n updatedCron = 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 if ((updates.handler && !TaskHandlerConfigSchema.safeParse(updates.handler).success)\n || (updates.idempotent !== undefined && typeof updates.idempotent !== 'boolean')) {\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidHandlerConfig', { params: { taskId } }))\n }\n\n const updatedTask: TaskDefinition = {\n ...existingTask,\n ...(normalizedUpdates.name !== undefined ? { name: normalizedUpdates.name } : {}),\n ...(normalizedUpdates.description !== undefined ? { description: normalizedUpdates.description || undefined } : {}),\n ...(normalizedUpdates.cron !== undefined ? { cron: normalizedUpdates.cron } : {}),\n ...(normalizedUpdates.timezone !== undefined ? { timezone: normalizedUpdates.timezone ?? undefined } : {}),\n ...(normalizedUpdates.enabled !== undefined ? { enabled: normalizedUpdates.enabled } : {}),\n ...(normalizedUpdates.idempotent !== undefined ? { idempotent: normalizedUpdates.idempotent } : {}),\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 if (taskRepo) {\n const updateResult = await taskRepo.updateTask(taskId, normalizedUpdates)\n if (!updateResult.success) {\n logger.warn('Failed to update persisted 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\n setTask(taskId, updatedTask)\n if (updatedCron)\n setCron(taskId, updatedCron)\n\n return ok(undefined)\n}\n\n/**\n * 按过滤和分页读取持久日志;没有仓库返回失败,不伪造空结果。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * async function inspect(repository: SchedulerLogRepository) {\n * const logs = await queryTaskLogs(repository, { taskId: 'daily-report', pagination: { page: 1, pageSize: 20 } })\n * if (!logs.success) return logs\n * return logs.data.items\n * }\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 — JS 任务编译器\n *\n * 将 JS 函数字符串编译为可执行函数,并基于源码缓存编译结果。\n * ⚠️ 仅用于受信任的服务端代码字符串;当前实现不是安全沙箱。\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 { Worker } from 'node:worker_threads'\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\n/**\n * 清除本地编译闭包缓存;不终止已经启动的工作线程。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // 调度器关闭并排空工作线程后,释放只含编译闭包的本地缓存。\n * clearJsTaskHandlerCache()\n * ```\n */\nexport function clearJsTaskHandlerCache(): void {\n compiledHandlerCache.clear()\n}\n\n/**\n * 校验受信任的 JS 函数表达式并返回独立工作线程执行器;不是安全沙箱。\n *\n * @param config - 受信任源码和含线程启动的总期限\n * @returns 编译结果;返回的 handler 在运行失败或取消时可 reject。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const compiled = compileJsTaskHandler({ kind: 'js', code: '(context) => ({ taskId: context.taskId })', timeout: 1000 })\n * if (!compiled.success) return compiled\n * const task: Parameters<JsTaskHandler>[0]['task'] = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const controller = new AbortController()\n * try {\n * return await compiled.data({ task, taskId: task.id, params: {}, trigger: { type: 'manual', source: null } }, controller.signal)\n * } catch (error) {\n * // 返回的 handler 可 reject;此调用边界转换为领域结果。\n * return err(HaiSchedulerError.EXECUTION_FAILED, schedulerM('scheduler_executionStateFailed'), error)\n * }\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 // 主线程仅解析语法,不执行表达式或任务函数。\n void new Script(`(${config.code})`)\n\n const handler: JsTaskHandler = async (context, signal) => {\n signal?.throwIfAborted()\n return await new Promise<unknown>((resolve, reject) => {\n const timeout = config.timeout ?? 30000\n const worker = new Worker(new URL('./scheduler-js-worker.js', import.meta.url), {\n workerData: { code: config.code, context },\n execArgv: [],\n })\n let settled = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const aborted = () => finish(new Error(schedulerM('scheduler_closing')))\n function finish(error?: Error, result?: unknown): void {\n if (settled)\n return\n settled = true\n clearTimeout(timer)\n signal?.removeEventListener('abort', aborted)\n // 等待线程停止后才结束本次尝试,禁止超时任务与后续重试并行。\n void worker.terminate().then(() => error ? reject(error) : resolve(result), reject)\n }\n timer = setTimeout(() => finish(new Error(schedulerM('scheduler_jsTimedOut', { params: { timeout } }))), timeout)\n signal?.addEventListener('abort', aborted, { once: true })\n worker.once('error', error => finish(error instanceof Error ? error : new Error(String(error))))\n worker.once('exit', code => finish(new Error(`JS worker exited before returning a result (${code})`)))\n worker.once('message', (message: { success: boolean, data?: unknown, message?: string }) => {\n if (message.success)\n finish(undefined, message.data)\n else\n finish(new Error(message.message))\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","/** 调度器自己升级任务与执行历史;不触发旧任务,不覆盖业务结果。 */\nimport type { SchemaMigration } from '@h-ai/reldb'\nimport { err, HaiCommonError, ok } from '@h-ai/core'\nimport { migrateSchema, reldb, schemaColumns } from '@h-ai/reldb'\n\n/**\n * 预检或升级调度器表;旧日志归档并幂等复制,新版执行账本与旧历史隔离。\n * @example\n * ```ts\n * import { migrateScheduler } from '@h-ai/scheduler'\n * const plan = await migrateScheduler({ dryRun: true })\n * ```\n */\nexport function migrateScheduler(options: { dryRun?: boolean } = {}) {\n const steps: SchemaMigration[] = [{\n version: 1,\n name: 'explicit-task-idempotency',\n async needed(sql) {\n const columns = await schemaColumns(reldb, 'hai_scheduler_tasks', sql)\n return columns.success ? ok(columns.data.length > 0 && !columns.data.includes('idempotent')) : columns\n },\n async apply(sql) {\n return sql.execute('ALTER TABLE hai_scheduler_tasks ADD COLUMN idempotent BOOLEAN NOT NULL DEFAULT FALSE')\n },\n }, {\n version: 2,\n name: 'execution-history-snapshots',\n async needed(sql) {\n const columns = await schemaColumns(reldb, 'hai_scheduler_logs', sql)\n if (!columns.success)\n return columns\n if (columns.data.length && !columns.data.includes('payload'))\n return ok(true)\n const archive = await schemaColumns(reldb, 'hai_scheduler_logs_alpha65', sql)\n if (!archive.success)\n return archive\n if (!archive.data.length)\n return ok(false)\n if (!columns.data.length)\n return ok(true)\n // MySQL 的旧表与新表可能使用不同排序规则;迁移身份按字节精确比较。\n const identity = reldb.config?.type === 'mysql' ? 'CAST(n.id AS BINARY)=CAST(CONCAT(\\'legacy:\\',CAST(a.id AS CHAR)) AS BINARY)' : 'n.id=\\'legacy:\\' || CAST(a.id AS TEXT)'\n const missing = await sql.get(`SELECT id FROM hai_scheduler_logs_alpha65 a WHERE NOT EXISTS (SELECT 1 FROM hai_scheduler_logs n WHERE ${identity}) LIMIT 1`)\n return missing.success ? ok(Boolean(missing.data)) : missing\n },\n async apply(sql) {\n const columns = await schemaColumns(reldb, 'hai_scheduler_logs', sql)\n if (!columns.success)\n return columns\n if (columns.data.length && !columns.data.includes('payload')) {\n const archive = await schemaColumns(reldb, 'hai_scheduler_logs_alpha65', sql)\n if (!archive.success)\n return archive\n if (archive.data.length)\n return err(HaiCommonError.INIT_FAILED, 'Scheduler archive already exists')\n const renamed = await sql.execute('ALTER TABLE hai_scheduler_logs RENAME TO hai_scheduler_logs_alpha65')\n if (!renamed.success)\n return renamed\n }\n const text = reldb.config?.type === 'mysql' ? 'VARCHAR(255)' : 'TEXT'\n const json = reldb.config?.type === 'postgresql' ? 'JSONB' : reldb.config?.type === 'mysql' ? 'JSON' : 'TEXT'\n const created = await sql.execute(`CREATE TABLE IF NOT EXISTS hai_scheduler_logs (id ${text} NOT NULL,occurrence_id ${text},task_id ${text} NOT NULL,task_name ${text} NOT NULL,task_type ${text} NOT NULL,trigger_type ${text} NOT NULL,trigger_source ${text},status ${text} NOT NULL,payload ${json} NOT NULL,started_at BIGINT NOT NULL,finished_at BIGINT NOT NULL,duration INTEGER NOT NULL,CONSTRAINT pk_hai_scheduler_log_v2 PRIMARY KEY(id))`)\n if (!created.success)\n return created\n for (let offset = 0; ; offset += 100) {\n const rows = await sql.query<{ id: string, task_id: string, task_name: string, task_type: string, trigger_type: string, trigger_source: string | null, status: string, result: string | null, error: string | null, started_at: number | string, finished_at: number | string, duration: number }>(`SELECT CAST(id AS ${reldb.config?.type === 'mysql' ? 'CHAR' : 'TEXT'}) AS id,task_id,task_name,task_type,trigger_type,trigger_source,status,result,error,started_at,finished_at,duration FROM hai_scheduler_logs_alpha65 ORDER BY id LIMIT 100 OFFSET ?`, [offset])\n if (!rows.success)\n return rows\n for (const row of rows.data) {\n const id = `legacy:${row.id}`\n const existing = await sql.get('SELECT id FROM hai_scheduler_logs WHERE id=?', [id])\n if (!existing.success)\n return existing\n if (existing.data)\n continue\n const payload = { id, taskId: row.task_id, taskName: row.task_name, taskType: row.task_type, triggerType: row.trigger_type, triggerSource: row.trigger_source, status: row.status, result: row.result, error: row.error, startedAt: Number(row.started_at), finishedAt: Number(row.finished_at), duration: Number(row.duration), persistence: { status: 'persisted' } }\n const copied = await sql.execute('INSERT INTO hai_scheduler_logs(id,task_id,task_name,task_type,trigger_type,trigger_source,status,payload,started_at,finished_at,duration) VALUES(?,?,?,?,?,?,?,?,?,?,?)', [id, row.task_id, row.task_name, row.task_type, row.trigger_type, row.trigger_source, row.status, JSON.stringify(payload), row.started_at, row.finished_at, row.duration])\n if (!copied.success)\n return copied\n }\n if (rows.data.length < 100)\n return ok(undefined)\n }\n },\n }]\n return migrateSchema(reldb, 'scheduler', steps, options)\n}\n","/**\n * 等待可协作取消的操作;取消只终止等待,operation 必须消费 signal 才能停止外部活动。\n *\n * @param operation - 要启动的同步或异步操作\n * @param signal - 已取消时不启动 operation;进行中取消则拒绝等待\n * @returns operation 的结果\n * @throws signal.reason 或 operation 的异常;不能据此推断外部操作未提交。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const controller = new AbortController()\n * try {\n * const response = await waitWithSignal(\n * () => fetch('https://example.com/health', { signal: controller.signal }),\n * controller.signal,\n * )\n * const status = response.status\n * } catch (error) {\n * // 取消或 operation 异常会 reject;宿主应核对已经开始的外部效果。\n * }\n * ```\n */\nexport async function waitWithSignal<T>(operation: () => T | Promise<T>, signal: AbortSignal): Promise<T> {\n signal.throwIfAborted()\n return new Promise<T>((resolve, reject) => {\n const aborted = () => reject(signal.reason)\n signal.addEventListener('abort', aborted, { once: true })\n Promise.resolve().then(operation).then(resolve, reject).finally(() => {\n signal.removeEventListener('abort', aborted)\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 { ExecutionStatus, 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 { waitWithSignal } from './scheduler-cancellation.js'\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\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, execution?: Partial<SchedulerTaskContext>): SchedulerTaskContext {\n return {\n ...execution,\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 waitWithSignal(() => hooks.onTaskStart!(event), event.signal)\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 waitWithSignal(() => hooks.onTaskInterrupted!(event), event.signal)\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 waitWithSignal(() => hooks.onTaskFinish!(event), event.signal)\n }\n catch (error) {\n logger.warn('Task finish hook failed', { taskId: event.task.id, error })\n }\n}\n\nfunction createExecutionLog(\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 occurrenceId?: string,\n): TaskExecutionLog {\n const log: TaskExecutionLog = {\n id: crypto.randomUUID(),\n persistence: { status: 'unconfirmed' },\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 ...(occurrenceId ? { occurrenceId } : {}),\n }\n\n return log\n}\n\n/**\n * 构造本地中断观测;不代表已确认业务终态。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const now = Date.now()\n * const log = await createInterruptedTaskLog(task, { type: 'manual', source: 'console' }, 'Stopped by host', 'hook', now, now)\n * // 这只是观测,persistence 为 unconfirmed,不能补写成已提交业务成功。\n * ```\n */\nexport async function createInterruptedTaskLog(\n task: TaskDefinition,\n trigger: TaskTriggerInfo,\n reason: string,\n taskType: TaskExecutionTargetType,\n startedAt: number,\n finishedAt: number,\n): Promise<TaskExecutionLog> {\n return createExecutionLog(task, trigger, taskType, 'interrupted', startedAt, finishedAt, null, reason)\n}\n\n/**\n * 生成中断观测并调用开始/中断回调;不领取执行、不调用业务处理器、不发布共享终态。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const log = await interruptTask(task, { type: 'manual', source: 'console' }, 'Stopped by host', {})\n * const interrupted = log.status === 'interrupted'\n * ```\n */\nexport async function interruptTask(\n task: TaskDefinition,\n trigger: TaskTriggerInfo,\n reason: string,\n hooks: Readonly<SchedulerTaskHooks>,\n signal: AbortSignal = new AbortController().signal,\n): Promise<TaskExecutionLog> {\n const startedAt = Date.now()\n const taskType = resolveTaskType(task, hooks)\n\n await notifyTaskStart(hooks, { task, trigger, startedAt, signal })\n\n const finishedAt = Date.now()\n const interruptedLog = await createInterruptedTaskLog(task, trigger, reason, taskType, startedAt, finishedAt)\n\n await notifyTaskInterrupted(hooks, {\n task,\n trigger,\n startedAt,\n interruptedAt: finishedAt,\n signal,\n reason,\n })\n\n return interruptedLog\n}\n\n/**\n * 在可终止工作线程中执行受信任 JS;编译、执行和取消异常转换为 HaiResult。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { ...{ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }, handler: { kind: 'js', code: '(context) => context.params.batch', timeout: 1000 } }\n * const result = await executeJsTask(task, { task, taskId: task.id, params: { batch: '2026-10' }, trigger: { type: 'manual', source: null } })\n * if (!result.success) return result\n * const serialized = result.data\n * return serialized\n * ```\n */\nexport async function executeJsTask(\n task: TaskDefinition,\n context: SchedulerTaskContext,\n signal: AbortSignal = new AbortController().signal,\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, signal)\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\n/**\n * 执行 API 请求并有界读取完整响应;超时覆盖响应体,context 中的持久身份传给接收端去重。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { ...{ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }, handler: { kind: 'api', url: 'https://example.com/health', timeout: 1000, maxResponseBytes: 4096 } }\n * const result = await executeApiTask(task, { task, taskId: task.id, params: {}, trigger: { type: 'manual', source: null } })\n * if (!result.success) return result\n * const body = result.data\n * return body\n * ```\n */\nexport async function executeApiTask(\n task: TaskDefinition,\n context: SchedulerTaskContext,\n signal: AbortSignal = new AbortController().signal,\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, maxResponseBytes = 1024 * 1024 } = handler\n if (!Number.isSafeInteger(maxResponseBytes) || maxResponseBytes <= 0)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_invalidHandlerConfig', { params: { taskId: task.id } }))\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeout)\n\n try {\n const requestHeaders = new Headers(headers)\n if (body !== undefined)\n requestHeaders.set('Content-Type', 'application/json')\n if (context.occurrenceId) {\n requestHeaders.set('Idempotency-Key', context.occurrenceId)\n requestHeaders.set('X-Scheduler-Sequence', String(context.sequence))\n requestHeaders.set('X-Scheduler-Attempt', String(context.attempt))\n requestHeaders.set('X-Scheduler-Task', encodeURIComponent(context.taskId))\n }\n const response = await fetch(url, {\n method,\n headers: requestHeaders,\n signal: AbortSignal.any([signal, controller.signal]),\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n })\n\n // 超时覆盖响应体读取;按实际字节累计,避免信任 Content-Length。\n let receivedBytes = 0\n let responseText = ''\n const reader = response.body?.getReader()\n if (reader) {\n const decoder = new TextDecoder()\n try {\n while (true) {\n const chunk = await reader.read()\n if (chunk.done)\n break\n receivedBytes += chunk.value.byteLength\n if (receivedBytes > maxResponseBytes) {\n controller.abort()\n return err(HaiSchedulerError.API_EXECUTION_FAILED, schedulerM('scheduler_apiResponseTooLarge', { params: { maxResponseBytes } }))\n }\n responseText += decoder.decode(chunk.value, { stream: true })\n }\n responseText += decoder.decode()\n }\n finally {\n reader.releaseLock()\n }\n }\n\n if (!response.ok) {\n logger.error('API task returned non-OK status', {\n taskId: context.taskId,\n status: response.status,\n url: core.sanitize.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 const message = error instanceof Error ? error.message : String(error)\n logger.error('API task execution failed', { taskId: context.taskId, error: message, url: core.sanitize.sanitizeUrl(url) })\n return err(\n HaiSchedulerError.API_EXECUTION_FAILED,\n schedulerM('scheduler_apiExecutionFailed', { params: { error: message } }),\n error,\n )\n }\n finally {\n clearTimeout(timer)\n }\n}\n\nasync function executeHookTask(\n task: TaskDefinition,\n context: SchedulerTaskContext,\n hooks: Readonly<SchedulerTaskHooks>,\n startedAt: number,\n signal: AbortSignal,\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 signal,\n }\n\n try {\n const result = await waitWithSignal(() => hooks.onTaskExecute!(executeEvent), signal)\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\n/**\n * 执行一次 API/JS/Hook 尝试并返回本地日志;共享 owner 和最终提交由 runner 负责,未知副作用不据此自动重放。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const log = await executeTask(task, { type: 'manual', source: 'console' }, { onTaskExecute: ({ context, signal }) => {\n * signal.throwIfAborted()\n * return { taskId: context.taskId }\n * } })\n * // executeTask 只生成尝试日志;runner 另以有效 owner/DB deadline 确认终态。\n * const observedStatus = log.status\n * ```\n */\nexport async function executeTask(\n task: TaskDefinition,\n trigger: TaskTriggerInfo,\n hooks: Readonly<SchedulerTaskHooks>,\n signal: AbortSignal = new AbortController().signal,\n execution?: Partial<SchedulerTaskContext>,\n): Promise<TaskExecutionLog> {\n const startedAt = Date.now()\n const taskType = resolveTaskType(task, hooks)\n const context = createTaskContext(task, trigger, execution)\n\n await notifyTaskStart(hooks, { task, trigger, startedAt, signal, context })\n\n let executionResult: HaiResult<string | null>\n let shouldNotifyInterrupted = false\n if (signal.aborted) {\n executionResult = err(HaiSchedulerError.EXECUTION_FAILED, schedulerM('scheduler_closing'))\n shouldNotifyInterrupted = true\n }\n else if (!task.handler) {\n executionResult = await executeHookTask(task, context, hooks, startedAt, signal)\n // 业务失败需要重试;只有宿主明确跳过或取消才属于 interrupted。\n shouldNotifyInterrupted = !hooks.onTaskExecute || (!executionResult.success && executionResult.error.cause instanceof Error && executionResult.error.cause.name === 'SchedulerTaskSkippedError')\n }\n else if (task.handler.kind === 'api') {\n executionResult = await executeApiTask(task, context, signal)\n }\n else {\n executionResult = await executeJsTask(task, context, signal)\n }\n\n shouldNotifyInterrupted ||= signal.aborted\n const finishedAt = Date.now()\n let status: ExecutionStatus = executionResult.success\n ? 'success'\n : (shouldNotifyInterrupted ? 'interrupted' : 'failed')\n // 分布式执行已经进入持久 running;缺少外部幂等保障时,失败/取消都不能推断副作用未发生。\n if (execution?.executionToken && !task.idempotent && !executionResult.success)\n status = 'unknown'\n const log = createExecutionLog(\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 context.occurrenceId,\n )\n\n if (!executionResult.success && shouldNotifyInterrupted) {\n await notifyTaskInterrupted(hooks, {\n task,\n trigger,\n startedAt,\n interruptedAt: finishedAt,\n signal,\n reason: executionResult.error.message,\n context,\n })\n }\n\n if (status !== 'interrupted' && !signal.aborted)\n await notifyTaskFinish(hooks, { task, trigger, startedAt, finishedAt, log, signal, context })\n\n return log\n}\n","/**\n * 共享数据库执行状态驱动 cron、手动触发与崩溃恢复。\n * @module scheduler-runner\n */\nimport type { HaiResult } from '@h-ai/core'\nimport type { SchedulerExecutionRepository, SchedulerLogRepository, SchedulerTaskRepository, StoredExecution } from './repositories/index.js'\nimport type { SchedulerLogCleanupPolicy, TaskDefinition, TaskExecutionLog, TaskTriggerInfo, TriggerTaskInput } from './scheduler-types.js'\nimport { randomUUID } from 'node:crypto'\nimport { isDeepStrictEqual } from 'node:util'\nimport { core, err, ok } from '@h-ai/core'\nimport { z } from 'zod'\nimport { executionId } from './repositories/scheduler-repository-execution.js'\nimport { executeTask, interruptTask } from './scheduler-executor.js'\nimport { getCron, getHooks, getTask, getTaskRegistry, loadPersistedTasks, unregisterTask } from './scheduler-functions.js'\nimport { schedulerM } from './scheduler-i18n.js'\nimport { HaiSchedulerError } from './scheduler-types.js'\n\nconst logger = core.logger.child({ module: 'scheduler', scope: 'runner' })\nconst runningTasks = new Set<string>()\nconst activeRuns = new Map<Promise<TaskExecutionLog>, AbortController>()\nconst activeRepairs = new Set<Promise<HaiResult<void>>>()\nlet tickTimer: ReturnType<typeof setInterval> | null = null\nlet tickInProgress: ReturnType<typeof setInterval> | null = null\nlet lastTickMinute = -1\nlet currentNodeId = ''\nlet currentLeaseMs = 300_000\nlet currentTaskRepo: SchedulerTaskRepository | null = null\nlet currentExecutionRepo: SchedulerExecutionRepository | null = null\nlet currentLogRepo: SchedulerLogRepository | null = null\nlet currentCleanupPolicy: SchedulerLogCleanupPolicy = {}\n\n/**\n * 绑定调用方拥有的日志仓库;关闭后不可由旧执行写入新实例。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // 本轮实例拥有的仓库通过生命周期装配,不从后续 init 动态借用。\n * setLogRepository(null)\n * ```\n */\nexport function setLogRepository(repo: SchedulerLogRepository | null, policy: SchedulerLogCleanupPolicy = {}): void {\n currentLogRepo = repo\n currentCleanupPolicy = { ...policy }\n}\n\nconst publishedLogSchema = z.object({\n id: z.uuid(),\n occurrenceId: z.string().regex(/^[a-f\\d]{64}$/),\n taskId: z.string(),\n taskName: z.string(),\n taskType: z.enum(['api', 'js', 'hook']),\n triggerType: z.enum(['manual', 'scheduled']),\n triggerSource: z.string().nullable(),\n status: z.enum(['success', 'failed', 'interrupted', 'unknown']),\n result: z.string().nullable(),\n error: z.string().nullable(),\n startedAt: z.number().safe(),\n finishedAt: z.number().safe(),\n duration: z.number().safe(),\n persistence: z.object({ status: z.enum(['pending', 'persisted', 'unconfirmed']), error: z.object({ code: z.string(), message: z.string() }).optional() }),\n})\n\n/**\n * 只投影已通过 owner/lease 条件提交的完整尝试快照;补写不调用 handler 或业务 Hook。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const occurrenceId = 'a'.repeat(64)\n * const result = await repairExecutionLogs(occurrenceId)\n * if (!result.success) return result\n * // 成功仅表示已发布终态的日志投影已确认,未调用 handler。\n * return result.data\n * ```\n */\nexport function repairExecutionLogs(id: string): Promise<HaiResult<void>> {\n const operation = projectExecutionLogs(id)\n activeRepairs.add(operation)\n void operation.finally(() => activeRepairs.delete(operation)).catch(() => {})\n return operation\n}\n\n/** 对快照依赖执行补写,close 会等待本链路释放;不读取后来初始化实例的保留策略。 */\nasync function projectExecutionLogs(id: string): Promise<HaiResult<void>> {\n const execution = currentExecutionRepo\n const logs = currentLogRepo\n const cleanupPolicy = currentCleanupPolicy\n if (!execution || !logs)\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\n try {\n const found = await execution.byOccurrence(id)\n if (!found.success || !found.data || ['claimed', 'running'].includes(found.data.status))\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\n const row = found.data\n if (row.logPersistence === 'persisted')\n return ok(undefined)\n const parsed = z.array(publishedLogSchema).min(1).max(101).safeParse(JSON.parse(row.logsJson ?? 'null') as unknown)\n if (!parsed.success || parsed.data.some(log => log.occurrenceId !== id || log.taskId !== row.taskId))\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\n for (const log of parsed.data) {\n const saved = await logs.saveLog(log)\n if (!saved.success)\n return saved\n }\n const confirmed = await execution.confirmLogs(row)\n if (!confirmed.success)\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\n const cleanup = await logs.cleanupLogs(cleanupPolicy)\n if (!cleanup.success)\n logger.warn('Execution logs persisted but retention cleanup failed', { occurrenceId: id, errorCode: cleanup.error.code })\n return ok(undefined)\n }\n catch {\n return err(HaiSchedulerError.LOG_PERSIST_FAILED, schedulerM('scheduler_logPersistFailed'))\n }\n}\n\n/**\n * 配置共享执行仓库和续租周期。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // 关闭流程排空后解除旧执行仓库绑定。\n * configureExecution(null)\n * ```\n */\nexport function configureExecution(repo: SchedulerExecutionRepository | null, nodeId = '', leaseMs = 300_000): void {\n currentExecutionRepo = repo\n currentNodeId = nodeId\n currentLeaseMs = leaseMs\n}\n\n/**\n * 指定共享任务定义仓库。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // init/close 装配共享仓库;null 只供关闭解除绑定。\n * setTaskRepository(null)\n * ```\n */\nexport function setTaskRepository(repo: SchedulerTaskRepository | null): void {\n currentTaskRepo = repo\n}\n\n/**\n * 检查本实例计时器状态。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const wasRunning = isTimerRunning()\n * if (wasRunning) stopTimer()\n * ```\n */\nexport function isTimerRunning(): boolean {\n return tickTimer !== null\n}\n\n/**\n * 完全排空执行链后重置实例状态。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * await drainRunner()\n * resetRunner()\n * ```\n */\nexport function resetRunner(): void {\n runningTasks.clear()\n stopTimer()\n lastTickMinute = -1\n currentTaskRepo = null\n configureExecution(null)\n}\n\nasync function sleep(ms: number, signal: AbortSignal): Promise<void> {\n if (ms <= 0 || signal.aborted)\n return\n await new Promise<void>((resolve) => {\n let timer: ReturnType<typeof setTimeout> | undefined\n const finish = () => {\n clearTimeout(timer)\n signal.removeEventListener('abort', finish)\n resolve()\n }\n timer = setTimeout(finish, ms)\n signal.addEventListener('abort', finish, { once: true })\n })\n}\n\n/**\n * 停止领取并等待取消链退出;取消不表示已撤销外部副作用。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // signal 取消不会抹除未知外部效果;等待执行与补写释放当前实例依赖。\n * await drainRunner()\n * ```\n */\nexport async function drainRunner(): Promise<void> {\n stopTimer()\n for (const controller of activeRuns.values())\n controller.abort(new Error(schedulerM('scheduler_closing')))\n await Promise.allSettled([...activeRuns.keys()])\n await Promise.allSettled([...activeRepairs])\n}\n\nasync function tick(): Promise<void> {\n const timer = tickTimer\n const repository = currentTaskRepo\n const executionRepo = currentExecutionRepo\n if (!timer || tickInProgress === timer)\n return\n tickInProgress = timer\n // stop/start 与 close/init 都创建新的计时器代际;旧数据库读取只能归属原扫描器。\n const isCurrent = () => tickTimer === timer && currentTaskRepo === repository && currentExecutionRepo === executionRepo\n try {\n const refreshed = await loadPersistedTasks(repository)\n if (!refreshed.success || !isCurrent())\n return\n // 恢复跨分钟遗留的原 occurrence;非幂等 running 由仓库隔离,不能换身份重发。\n const expired = await executionRepo?.expired()\n if (!isCurrent())\n return\n if (expired?.success) {\n for (const row of expired.data) {\n const task = getTask(row.taskId)\n if (!task) {\n await executionRepo?.isolateExpired(row)\n if (!isCurrent())\n return\n continue\n }\n if (task && !runningTasks.has(task.id)) {\n let trigger: TaskTriggerInfo & { minute?: number }\n try {\n // 数据来自本模块写入的固定触发结构;坏 JSON 留在共享槽中供人工核对。\n trigger = JSON.parse(row.triggerJson) as TaskTriggerInfo & { minute?: number }\n }\n catch {\n await executionRepo?.isolateExpired(row)\n if (!isCurrent())\n return\n continue\n }\n void runTask(task, trigger.minute, trigger, undefined, row).catch(error => logger.warn('Execution recovery failed', { taskId: task.id, error }))\n }\n }\n }\n const now = await executionRepo?.currentTime()\n if (now?.success && isCurrent())\n scheduleDueTasks(now.data)\n }\n finally {\n if (tickInProgress === timer)\n tickInProgress = null\n }\n}\n\nfunction scheduleDueTasks(databaseNow: number): void {\n // 同一现实分钟的身份与 cron 匹配都来自共享 DB,不能由各节点本机时钟选定。\n const currentMinute = Math.floor(databaseNow / 60_000)\n if (currentMinute === lastTickMinute)\n return\n lastTickMinute = currentMinute\n for (const [taskId, task] of getTaskRegistry()) {\n if (task.enabled === false || runningTasks.has(taskId))\n continue\n if (!getCron(taskId)?.match(new Date(currentMinute * 60_000)))\n continue\n void runTask(task, currentMinute, { type: 'scheduled', source: null }).catch(error => logger.error('Unhandled task execution error', { taskId, error }))\n }\n}\n\n/**\n * cron/manual/recovery 共用唯一任务串行槽与 occurrence 领取协议。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * const task: TaskDefinition = { id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' }\n * const log = await runTask(task, undefined, { type: 'manual', source: 'console' }, { idempotencyKey: 'report-2026-10-23' })\n * // 业务成功仍可能等待日志补写;unknown 交可信核对,不能换键重试。\n * if (log.persistence.status === 'pending' && log.occurrenceId) {\n * const repaired = await repairExecutionLogs(log.occurrenceId)\n * if (!repaired.success) return repaired\n * }\n * return log\n * ```\n */\nexport function runTask(task: TaskDefinition, minuteTimestamp?: number, trigger: TaskTriggerInfo = { type: 'manual', source: null }, options?: TriggerTaskInput, recovery?: StoredExecution): Promise<TaskExecutionLog> {\n const controller = new AbortController()\n const run = runTaskExecution(task, minuteTimestamp, trigger, controller, options, recovery)\n activeRuns.set(run, controller)\n void run.finally(() => activeRuns.delete(run)).catch(() => {})\n return run\n}\n\nasync function runTaskExecution(task: TaskDefinition, minute: number | undefined, trigger: TaskTriggerInfo, controller: AbortController, options?: TriggerTaskInput, recovery?: StoredExecution): Promise<TaskExecutionLog> {\n const repository = currentTaskRepo\n const executionRepo = currentExecutionRepo\n const logRepository = currentLogRepo\n const hooks = getHooks()\n const leaseMs = currentLeaseMs\n const occurrenceId = recovery?.occurrenceId ?? executionId(task.id, trigger.type, minute === undefined ? options?.idempotencyKey ?? randomUUID() : String(minute))\n const interrupted = async (reason: string, observationOnly = false): Promise<TaskExecutionLog> => {\n const log = { ...await interruptTask(task, trigger, reason, {}, controller.signal), occurrenceId }\n // 领取前的竞争/跳过只是一条观测事件,不代表 owner 已提交业务终态。\n if (observationOnly && logRepository) {\n const saved = await logRepository.saveLog(log)\n log.persistence = saved.success ? { status: 'persisted' } : { status: 'unconfirmed', error: { code: String(saved.error.code), message: saved.error.message } }\n }\n return log\n }\n if (!executionRepo)\n return interrupted(schedulerM('scheduler_executionStateFailed'), true)\n const claimed = await executionRepo.claim(task, occurrenceId, { ...trigger, ...(minute !== undefined ? { minute } : {}) }, currentNodeId, leaseMs)\n if (!claimed.success)\n return interrupted(claimed.error.message, true)\n if (!claimed.data)\n return interrupted(schedulerM('scheduler_taskRunning', { params: { taskId: task.id } }), true)\n const row = claimed.data\n if (!['claimed', 'running'].includes(row.status)) {\n if (minute === undefined) {\n // 已完成的相同手动幂等键返回持久结果,绝不重新执行。\n try {\n const log: TaskExecutionLog = row.logJson\n ? JSON.parse(row.logJson)\n : {\n id: randomUUID(),\n persistence: { status: 'unconfirmed' },\n taskId: row.taskId,\n taskName: task.name,\n taskType: task.handler?.kind ?? 'hook',\n triggerType: trigger.type,\n triggerSource: trigger.source,\n status: 'interrupted',\n result: null,\n error: null,\n startedAt: row.createdAt,\n finishedAt: row.updatedAt,\n duration: row.updatedAt - row.createdAt,\n }\n const status = row.status === 'discarded' ? 'interrupted' : row.status as TaskExecutionLog['status']\n return { ...log, status, error: status === 'success' ? null : log.error, occurrenceId }\n }\n catch {\n return interrupted(schedulerM('scheduler_executionStateFailed'))\n }\n }\n return interrupted(schedulerM('scheduler_occurrenceHandled', { params: { taskId: task.id } }), true)\n }\n runningTasks.add(task.id)\n let timer: ReturnType<typeof setTimeout> | undefined\n let renewing: Promise<void> | undefined\n let stopped = false\n let lost = false\n const renew = async () => {\n try {\n const result = await executionRepo.renew(row, leaseMs)\n lost = !result.success\n }\n catch {\n lost = true\n }\n if (lost) {\n controller.abort(new Error(schedulerM('scheduler_executionStateFailed')))\n }\n else if (!stopped) {\n timer = setTimeout(() => {\n renewing = renew()\n }, Math.max(1, Math.floor(leaseMs / 3)))\n }\n }\n timer = setTimeout(() => {\n renewing = renew()\n }, Math.max(1, Math.floor(leaseMs / 3)))\n try {\n let log: TaskExecutionLog | undefined\n const attempts: TaskExecutionLog[] = []\n for (; row.attemptCount < row.maxAttempts;) {\n if (controller.signal.aborted)\n break\n const refreshed = await loadPersistedTasks(repository)\n const latest = getTask(task.id)\n let unchanged = false\n try {\n // JSON 快照不会保留 undefined 属性,比较时两侧都采用持久化表示。\n unchanged = latest !== undefined && isDeepStrictEqual(JSON.parse(JSON.stringify(latest)), JSON.parse(row.snapshot))\n }\n catch {}\n if (!refreshed.success || !latest || latest.enabled === false || !unchanged) {\n log = await interrupted(schedulerM('scheduler_taskNoLongerDue', { params: { taskId: task.id } }))\n // 曾开始的任务不能靠配置编辑抹去未知副作用;保留串行槽直到人工核对。\n if (row.attemptCount > 0)\n log.status = 'unknown'\n break\n }\n task = latest\n if (!task.handler && !hooks.onTaskExecute) {\n log = { ...await interruptTask(task, trigger, schedulerM('scheduler_taskHandlerMissing', { params: { taskId: task.id } }), hooks, controller.signal), occurrenceId }\n break\n }\n const begun = await executionRepo.begin(row, leaseMs)\n if (!begun.success) {\n lost = true\n break\n }\n log = await executeTask(task, trigger, hooks, controller.signal, { occurrenceId, executionToken: row.owner, sequence: row.sequence, attempt: row.attemptCount })\n log.occurrenceId = occurrenceId\n attempts.push(log)\n if (log.status !== 'failed' || !row.idempotent || row.attemptCount >= row.maxAttempts)\n break\n const delays = task.retry?.backoffMs ?? []\n const delay = delays[Math.min(row.attemptCount - 1, Math.max(0, delays.length - 1))] ?? 0\n await sleep(delay, controller.signal)\n }\n if (!log)\n log = await interrupted(schedulerM('scheduler_executionStateFailed'))\n if (lost) {\n // 取消和失租不是外部回滚;旧 owner 只返回 unknown,不能覆盖新节点的共享结果。\n return { ...log, status: 'unknown', persistence: { status: 'unconfirmed' }, error: schedulerM('scheduler_executionUnknown'), occurrenceId }\n }\n if (controller.signal.aborted && row.attemptCount > 0)\n log = { ...log, status: 'unknown', error: schedulerM('scheduler_executionUnknown') }\n const currentAttempt = attempts.findIndex(attempt => attempt.id === log.id)\n if (currentAttempt >= 0)\n attempts[currentAttempt] = log\n else\n attempts.push(log)\n const published = attempts.map(attempt => ({ ...attempt, persistence: { status: 'pending' as const } }))\n const finished = await executionRepo.finish(row, { ...log, persistence: { status: 'pending' } }, published)\n if (!finished.success)\n return { ...log, status: 'unknown', persistence: { status: 'unconfirmed' }, error: finished.error.message, occurrenceId }\n // 终态已确认,后续日志故障只能留下 pending,不能改写业务结果或重新执行。\n const projected = await repairExecutionLogs(occurrenceId)\n log.persistence = projected.success ? { status: 'persisted' } : { status: 'pending', error: { code: String(projected.error.code), message: projected.error.message } }\n if (!projected.success)\n logger.warn('Execution completed with pending log persistence', { taskId: task.id, occurrenceId, errorCode: projected.error.code })\n if (task.deleteAfterRun && log.status === 'success') {\n const refreshed = await loadPersistedTasks(repository)\n if (refreshed.success && isDeepStrictEqual(getTask(task.id), task))\n await unregisterTask(task.id, repository, task)\n }\n return log\n }\n finally {\n stopped = true\n clearTimeout(timer)\n await renewing\n runningTasks.delete(task.id)\n }\n}\n\n/**\n * 启动本节点扫描器;每轮从 DB 时间选定分钟,租约授权仍由最终 SQL 原子条件决定。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * // 生命周期已绑定任务、执行和日志仓库后才启动扫描。\n * startTimer(1000)\n * stopTimer()\n * ```\n */\nexport function startTimer(tickInterval: number): void {\n lastTickMinute = -1\n tickTimer = setInterval(tick, tickInterval)\n}\n\n/**\n * 停止新领取,已经开始的任务由 drainRunner 处理。\n *\n * @example\n * ```ts\n * // 模块内部上下文:示例复用当前声明所在模块的实际绑定。\n * stopTimer()\n * await drainRunner()\n * ```\n */\nexport function stopTimer(): void {\n if (tickTimer)\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 { core, err, ok } from '@h-ai/core'\nimport { reldb } from '@h-ai/reldb'\nimport { z } from 'zod'\n\nimport { executionEntry, SchedulerExecutionRepository, SchedulerLogRepository, SchedulerTaskRepository } from './repositories/index.js'\nimport { ExecutionResolutionSchema, SchedulerConfigSchema, TriggerTaskSchema } from './scheduler-config.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 { migrateScheduler } from './scheduler-migration.js'\nimport { configureExecution, drainRunner, isTimerRunning, repairExecutionLogs, resetRunner, runTask, setLogRepository, 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 closeInProgress: Promise<void> | null = null\nlet taskRepo: SchedulerTaskRepository | null = null\nlet logRepo: SchedulerLogRepository | null = null\nlet executionRepo: SchedulerExecutionRepository | null = null\nconst executionIdSchema = z.string().regex(/^[a-f\\d]{64}$/)\nconst executionListSchema = z.object({ limit: z.number().int().min(1).max(100).default(50), offset: z.number().int().min(0).max(1_000_000).default(0) })\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 (!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 const migration = await migrateScheduler()\n if (!migration.success)\n throw migration.error\n taskRepo = new SchedulerTaskRepository(reldb)\n logRepo = new SchedulerLogRepository(reldb)\n executionRepo = new SchedulerExecutionRepository(reldb)\n const ready = await executionRepo.count()\n if (!ready.success)\n throw new Error(schedulerM('scheduler_executionStateFailed'))\n setTaskRepository(taskRepo)\n setLogRepository(logRepo, {\n maxLogs: parsed.maxLogs,\n retentionDays: parsed.retentionDays,\n })\n\n const nodeId = parsed.nodeId ?? crypto.randomUUID()\n configureExecution(executionRepo, nodeId, parsed.leaseMs)\n logger.info('Shared execution repository configured', { nodeId, leaseMs: parsed.leaseMs })\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\n/**\n * 定时任务公共入口;先初始化共享 RelDB,再注册/触发/启动;关闭会排空任务和日志修复,宿主最后关闭数据库。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * import { reldb } from '@h-ai/reldb'\n * import { scheduler } from '@h-ai/scheduler'\n *\n * // 本地开发示例;生产使用所有节点共同连接的 PostgreSQL/MySQL。\n * const database = await reldb.init({ type: 'sqlite', database: ':memory:' })\n * if (!database.success) throw new Error(database.error.message)\n * try {\n * const initialized = await scheduler.init({ hooks: { onTaskExecute: ({ context }) => ({ taskId: context.taskId }) } })\n * if (!initialized.success) throw new Error(initialized.error.message)\n * const registered = await scheduler.register({ id: 'daily-report', name: '每日报表', cron: '0 2 * * *', timezone: 'UTC' })\n * if (!registered.success) throw new Error(registered.error.message)\n * const executed = await scheduler.trigger('daily-report', { idempotencyKey: 'report-2026-10-23' })\n * if (!executed.success) throw new Error(executed.error.message)\n * // 业务 status 与 persistence 分开判断;pending 只补日志,不重跑业务。\n * const status = executed.data.status\n * const persistence = executed.data.persistence.status\n * } finally {\n * await scheduler.close()\n * const closed = await reldb.close()\n * if (!closed.success) {\n * core.logger.error('Database cleanup failed', { errorCode: closed.error.code })\n * process.exitCode = 1\n * }\n * }\n * ```\n */\nexport const scheduler: SchedulerFunctions = {\n execution: {\n async get(id) {\n if (!currentConfig || !executionRepo)\n return notInitialized.result()\n if (!executionIdSchema.safeParse(id).success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n const row = await executionRepo.byOccurrence(id)\n return row.success ? ok(row.data ? executionEntry(row.data) : null) : row\n },\n async listUnknown(options) {\n if (!currentConfig || !executionRepo)\n return notInitialized.result()\n const parsed = executionListSchema.safeParse(options ?? {})\n if (!parsed.success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n const rows = await executionRepo.unknown(parsed.data.limit, parsed.data.offset)\n return rows.success ? ok(rows.data.map(executionEntry)) : rows\n },\n async listLogFailures(options) {\n if (!currentConfig || !executionRepo)\n return notInitialized.result()\n const parsed = executionListSchema.safeParse(options ?? {})\n if (!parsed.success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n const rows = await executionRepo.pendingLogs(parsed.data.limit, parsed.data.offset)\n return rows.success ? ok(rows.data.map(executionEntry)) : rows\n },\n async repairLog(id) {\n if (!currentConfig || !executionRepo || closeInProgress)\n return notInitialized.result()\n if (!executionIdSchema.safeParse(id).success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n return repairExecutionLogs(id)\n },\n async resolveUnknown(id, resolution) {\n if (!currentConfig || !executionRepo)\n return notInitialized.result()\n const parsed = ExecutionResolutionSchema.safeParse(resolution)\n if (!executionIdSchema.safeParse(id).success || !parsed.success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n return executionRepo.resolve(id, parsed.data.status, parsed.data.expectedUpdatedAt)\n },\n },\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 (closeInProgress)\n await closeInProgress\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 const persistedResult = await loadPersistedTasks(taskRepo)\n if (!persistedResult.success) {\n await scheduler.close()\n return persistedResult\n }\n const configResult = await loadConfigTasks(tasks)\n if (!configResult.success) {\n await scheduler.close()\n return configResult\n }\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 /** 刷新数据库任务投影,不执行任何任务。 */\n async refreshTasks(): Promise<HaiResult<void>> {\n if (!currentConfig)\n return notInitialized.result()\n return loadPersistedTasks(taskRepo)\n },\n\n async register(task: TaskDefinition): Promise<HaiResult<void>> {\n if (!currentConfig)\n return notInitialized.result()\n\n const config = currentConfig\n const refreshed = await loadPersistedTasks(taskRepo)\n if (!refreshed.success)\n return refreshed\n if (currentConfig !== config)\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 config = currentConfig\n const refreshed = await loadPersistedTasks(taskRepo)\n if (!refreshed.success)\n return refreshed\n if (currentConfig !== config)\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 config = currentConfig\n const refreshed = await loadPersistedTasks(taskRepo)\n if (!refreshed.success)\n return refreshed\n if (currentConfig !== config)\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 const parsed = TriggerTaskSchema.safeParse(options ?? {})\n if (!parsed.success)\n return err(HaiSchedulerError.CONFIG_ERROR, schedulerM('scheduler_executionInputInvalid'))\n\n const config = currentConfig\n const refreshed = await loadPersistedTasks(taskRepo)\n if (!refreshed.success)\n return refreshed\n if (currentConfig !== config)\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 const log = await runTask(task, undefined, normalizeTriggerInput(parsed.data), parsed.data)\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 (closeInProgress)\n return closeInProgress\n\n logger.info('Closing scheduler module')\n // 先拒绝新任务,再等待旧执行链完全退出,最后释放共享状态。\n currentConfig = null\n stopTimer()\n closeInProgress = (async () => {\n await drainRunner()\n clearJsTaskHandlerCache()\n resetTaskState()\n resetRunner()\n setLogRepository(null)\n setTaskRepository(null)\n taskRepo = null\n logRepo = null\n executionRepo = null\n logger.info('Scheduler module closed')\n })()\n try {\n await closeInProgress\n }\n finally {\n closeInProgress = null\n }\n },\n}\n"]}