target-supabase-sdk 0.2.2 → 0.2.3
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/chunks/{enable-log-persist-BH-tbKEj.js → enable-log-persist-C7GJo_Nc.js} +38 -4
- package/dist/chunks/enable-log-persist-C7GJo_Nc.js.map +1 -0
- package/dist/node/env/index.d.ts +2 -2
- package/dist/node/env/index.d.ts.map +1 -1
- package/dist/node/env/init-supabase-from-env.d.ts +1 -1
- package/dist/node/env/init-supabase-from-env.d.ts.map +1 -1
- package/dist/node/env/load-env.d.ts +15 -1
- package/dist/node/env/load-env.d.ts.map +1 -1
- package/dist/node/preload/run-service-preload.d.ts +1 -1
- package/dist/node/preload/run-service-preload.d.ts.map +1 -1
- package/dist/node.d.ts +2 -2
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +2 -2
- package/dist/node.js.map +1 -1
- package/dist/preload.js +3 -2
- package/dist/preload.js.map +1 -1
- package/package.json +1 -1
- package/src/node/env/index.ts +13 -2
- package/src/node/env/init-supabase-from-env.ts +1 -1
- package/src/node/env/load-env.ts +48 -2
- package/src/node/preload/run-service-preload.ts +3 -2
- package/src/node.ts +7 -0
- package/dist/chunks/enable-log-persist-BH-tbKEj.js.map +0 -1
package/dist/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sources":["../src/command/command.interface.ts","../src/command/command.api.ts","../src/node/env/init-supabase-from-env.ts","../src/node/env/public-base-url.ts","../src/node/fs/read-source-file.ts","../src/node/node.utils.ts","../src/node/node-runtime.base.ts","../src/node/process/process-spawn.ts","../src/node/process/managed-child-processes.ts","../src/node/readiness/readiness-checks.ts","../src/node/readiness/run-readiness-checks.ts","../src/node/readiness/service-ready-gate.ts","../src/task/task-repo-context.ts","../src/shared/utils/config-path.utils.ts","../src/repo/repo-context.utils.ts","../src/repo/repo.script-loader.ts","../src/repo/repo-manager.ts","../src/task/local-task-registry.ts","../src/task/task-repo-validation.ts","../src/task/task-manager.ts","../src/task/task-node.ts","../src/task/task-post-validated.api.ts","../src/trigger/trigger.interface.ts","../src/trigger/trigger.api.ts","../src/trigger/trigger.constant.ts","../src/trigger/trigger-manager.ts","../src/trigger/trigger-node.ts"],"sourcesContent":["import type { Target } from \"../core.interface\";\n\nexport enum CategoryCommand {\n COMMAND = \"command\",\n}\n\nexport enum CommandType {\n STOP_NODE = \"stop-node\",\n}\n\nexport interface Command extends Target {\n name: CommandType;\n /** Node.id */\n value: string;\n category: CategoryCommand;\n}\n","import { z } from \"zod\";\nimport { createTarget, MAX_POLL_TARGET_LIST_SIZE, pollTargetList, validateWithSchema } from \"../core.api\";\nimport { generateResponse } from \"../core.interface\";\nimport { createLogger } from \"../shared/log\";\nimport { CategoryCommand, type Command, CommandType } from \"./command.interface\";\n\nconst nodeIdSchema = z.string().trim().min(1);\nconst traceIdSchema = z.string().trim().min(1).optional();\n\n// ─── Zod schemas ─────────────────────────────────────────────────────────────\n\nexport const postCommandSchema = z.object({\n nodeId: nodeIdSchema,\n command: z.nativeEnum(CommandType),\n traceId: traceIdSchema,\n});\n\nexport type PostCommandPayload = z.infer<typeof postCommandSchema>;\n\nexport const getPollCommandListSchema = z.object({\n nodeId: nodeIdSchema,\n size: z.number().int().min(1).max(MAX_POLL_TARGET_LIST_SIZE).optional(),\n traceId: traceIdSchema,\n});\n\nexport type GetPollCommandListPayload = z.infer<typeof getPollCommandListSchema>;\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction commandNodeFilter(nodeId: string) {\n return [{ field: \"value\", operator: \"eq\" as const, value: nodeId }];\n}\n\n// ─── postCommand ─────────────────────────────────────────────────────────────\n\n/** Enqueue a control command for `nodeId` (scheduler / admin). */\nexport const postCommand = validateWithSchema(\n postCommandSchema,\n \"postCommandSchema\",\n)(async ({ nodeId, command, traceId }) => {\n const logger = createLogger({ module: \"postCommand\", traceId, labels: { nodeId } });\n\n const result = await createTarget<Command, PostCommandPayload>({\n payload: { nodeId, command, traceId },\n createFn: () => ({\n name: command,\n value: nodeId,\n category: CategoryCommand.COMMAND,\n tagList: [],\n }),\n });\n\n logger.info(\"Command已入隊\", {\n topic: \"command\",\n data: { nodeId, command },\n });\n\n return result;\n});\n\n// ─── getPollCommandList ──────────────────────────────────────────────────────\n\n/** Dequeue control commands for `nodeId` (oldest first). */\nexport const getPollCommandList = validateWithSchema(\n getPollCommandListSchema,\n \"getPollCommandListSchema\",\n)(async ({ nodeId, size, traceId }) => {\n const logger = createLogger({ module: \"getPollCommandList\", traceId, labels: { nodeId } });\n\n const { data: dequeuedList = [] } = await pollTargetList<Command>({\n category: CategoryCommand.COMMAND,\n size: size ?? 50,\n filterList: commandNodeFilter(nodeId),\n ascending: true,\n });\n\n if (dequeuedList.length === 0) {\n logger.debug(\"Command\", {\n topic: \"command\",\n data: { nodeId, dequeued: dequeuedList.length },\n });\n } else {\n logger.info(\"Command\", {\n topic: \"command\",\n data: { nodeId, dequeued: dequeuedList.length },\n });\n }\n\n return generateResponse.success(dequeuedList);\n});\n","import { supabase } from \"../../supabase\";\nimport { loadEnvFiles } from \"./load-env\";\nimport { readEnv, requireEnv } from \"./require-env\";\n\nexport interface InitSupabaseFromStandardEnvOptions {\n /** Project root for `.env` files (required when `loadEnv` is true). */\n root?: string;\n /** Load `.env.local` / `.env` before initialize (default true). */\n loadEnv?: boolean;\n /** Hook after env files loaded (legacy aliases, etc.). */\n afterLoadEnv?: () => void;\n env?: NodeJS.ProcessEnv;\n}\n\n/**\n * Load standard Supabase env vars and initialize the process-wide Supabase holder.\n *\n * Required: `SUPABASE_URL`, `SUPABASE_ANON_KEY`\n * Optional: `SUPABASE_NEED_AUTH_URL`, `SUPABASE_NEED_AUTH_ANON_KEY`\n */\nexport async function initSupabaseFromStandardEnv(options: InitSupabaseFromStandardEnvOptions = {}): Promise<void> {\n const env = options.env ?? process.env;\n const loadEnv = options.loadEnv ?? true;\n\n if (loadEnv) {\n if (options.root == null || options.root === \"\") {\n throw new Error(\"initSupabaseFromStandardEnv: root is required when loadEnv is true\");\n }\n loadEnvFiles(options.root, { env, afterLoad: options.afterLoadEnv });\n }\n\n await supabase.initialize({\n supabaseUrl: requireEnv(\"SUPABASE_URL\", env),\n supabaseAnonKey: requireEnv(\"SUPABASE_ANON_KEY\", env),\n supabaseNeedAuthUrl: readEnv(\"SUPABASE_NEED_AUTH_URL\", env),\n supabaseNeedAuthAnonKey: readEnv(\"SUPABASE_NEED_AUTH_ANON_KEY\", env),\n });\n}\n","import { readEnv } from \"./require-env\";\n\nexport interface PublicBaseUrlFromEnvOptions {\n /** Env var for public URL override (e.g. `STORAGE_PUBLIC_URL`). */\n envKey: string;\n env?: NodeJS.ProcessEnv;\n}\n\n/**\n * Public base URL: `envKey` if set (trailing slash stripped), else `http://localhost:{port}`.\n */\nexport function publicBaseUrlFromEnv(port: number, options: PublicBaseUrlFromEnvOptions): string {\n const configured = readEnv(options.envKey, options.env ?? process.env);\n if (configured != null) {\n return configured.replace(/\\/$/, \"\");\n }\n return `http://localhost:${port}`;\n}\n","import { access, readFile, stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { sha256Hex } from \"../../shared/utils/sha256\";\n\nexport interface SourceFilePayload {\n absolutePath: string;\n buffer: ArrayBuffer;\n size: number;\n sha256: string;\n}\n\nexport interface ReadAndVerifySourceFileOptions {\n /** When set, digest must match or an error is thrown. */\n expectedSha256?: string;\n /** Reject files larger than this many bytes. */\n maxBytes?: number;\n /** When false, allow zero-byte files (default rejects empty). */\n allowEmpty?: boolean;\n}\n\n/** Copy a Node.js Buffer view to a standalone ArrayBuffer. */\nexport function nodeBufferToArrayBuffer(nodeBuffer: Buffer): ArrayBuffer {\n return nodeBuffer.buffer.slice(nodeBuffer.byteOffset, nodeBuffer.byteOffset + nodeBuffer.byteLength) as ArrayBuffer;\n}\n\n/** Read a local file with basic validation and SHA-256 digest. */\nexport async function readAndVerifySourceFile(\n filePath: string,\n options: ReadAndVerifySourceFileOptions = {},\n): Promise<SourceFilePayload> {\n const absolutePath = resolve(filePath);\n const allowEmpty = options.allowEmpty === true;\n\n try {\n await access(absolutePath);\n } catch {\n throw new Error(`Source file not found: ${absolutePath}`);\n }\n\n const fileStat = await stat(absolutePath);\n if (!fileStat.isFile()) {\n throw new Error(`Source path is not a file: ${absolutePath}`);\n }\n if (!allowEmpty && fileStat.size <= 0) {\n throw new Error(`Source file is empty: ${absolutePath}`);\n }\n if (options.maxBytes != null && fileStat.size > options.maxBytes) {\n throw new Error(`Source file exceeds maxBytes (${fileStat.size} > ${options.maxBytes}): ${absolutePath}`);\n }\n\n const nodeBuffer = await readFile(absolutePath);\n const buffer = nodeBufferToArrayBuffer(nodeBuffer);\n\n if (buffer.byteLength !== fileStat.size) {\n throw new Error(\n `Source file size mismatch after read (${buffer.byteLength} !== ${fileStat.size}): ${absolutePath}`,\n );\n }\n\n const digest = await sha256Hex(buffer);\n\n if (options.expectedSha256 != null && digest.toLowerCase() !== options.expectedSha256.toLowerCase()) {\n throw new Error(\n `Source file SHA-256 mismatch (expected ${options.expectedSha256}, got ${digest}): ${absolutePath}`,\n );\n }\n\n return {\n absolutePath,\n buffer,\n size: buffer.byteLength,\n sha256: digest,\n };\n}\n","export const formatTimestamp = (timestamp: number): string => {\n return new Intl.DateTimeFormat(\"zh-CN\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n fractionalSecondDigits: 3,\n }).format(timestamp);\n};\n\nexport const formatRelativeTime = (timestamp: number): string => {\n const now = Date.now();\n const diff = now - timestamp;\n\n if (diff < 1000) return \"刚刚\";\n if (diff < 60000) return `${Math.floor(diff / 1000)}秒前`;\n if (diff < 3600000) return `${Math.floor(diff / 60000)}分钟前`;\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}小时前`;\n\n return formatTimestamp(timestamp);\n};\n\nexport const getRandomInterval = (): number => {\n const min = 15 * 1000;\n const max = 1 * 60 * 1000;\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\n\nexport const formatHeartbeat = (timestamp: number): string => {\n const absolute = formatTimestamp(timestamp);\n const relative = formatRelativeTime(timestamp);\n return `${absolute} (${relative})`;\n};\n","import { getPollCommandList } from \"../command/command.api\";\nimport { CommandType } from \"../command/command.interface\";\nimport { MAX_POLL_TARGET_LIST_SIZE } from \"../core.api\";\nimport {\n createLogger,\n createScope,\n type LoggerWithScope,\n LogLevel,\n type LogScope,\n logManager,\n patchScope,\n} from \"../shared/log\";\nimport { getErrorMessage } from \"../shared/utils/error.utils\";\nimport { patchChangeNodeStatus, patchNodeHeartBeat, patchStopNode, postRegisterNode } from \"./node.api\";\nimport { NodeStatus } from \"./node.interface\";\nimport { formatHeartbeat, getRandomInterval } from \"./node.utils\";\n\n/** 主循环单轮运行时上下文 — 由 start() 创建并向下传递 */\nexport interface NodeLoopContext {\n loopTraceId: string;\n nodeId: string;\n}\n\nexport const LOG_TOPIC_NODE = \"node\";\nconst LOG_TOPIC_COMMAND = \"command\";\nconst LOG_TOPIC_PROCESS = \"process\";\n\n/**\n * Shared node process runtime: bootstrap, main-loop frame, heartbeat, commands, shutdown.\n * Subclasses implement {@link onBeforeRegisterNode} and {@link runLoopSteps}.\n */\nabstract class BaseNodeRuntime {\n protected static readonly HEARTBEAT_FAILURE_THRESHOLD = 3;\n /** Log `nodeId` label while startup has not yet received an assigned id from Supabase. */\n private static readonly NODE_ID_PENDING_ASSIGNMENT = \"pending-node-id\";\n\n protected readonly runtimeModule: string;\n\n private _localNodeId: string | null = null;\n private _isNodeIdLocked = false;\n\n private isRunning: boolean;\n private loopCount: number;\n private consecutiveHeartbeatFailures = 0;\n private readonly startupTraceId: string;\n private readonly startupScope: LogScope;\n private shutdownPromise: Promise<void> | null = null;\n private startPromise: Promise<void> | null = null;\n\n get localNodeId(): string | null {\n return this._localNodeId;\n }\n\n protected set localNodeId(value: string) {\n if (this._isNodeIdLocked) {\n throw new Error(\"Node ID cannot be modified after initial assignment\");\n }\n if (typeof value !== \"string\" || value.trim() === \"\") {\n throw new Error(\"Invalid node ID\");\n }\n\n this._localNodeId = value;\n this._isNodeIdLocked = true;\n }\n\n protected constructor(runtimeModule: string) {\n this.runtimeModule = runtimeModule;\n this.isRunning = false;\n this.loopCount = 0;\n this.startupTraceId = logManager.generateTraceId();\n this.startupScope = createScope({ module: runtimeModule, traceId: this.startupTraceId });\n }\n\n /** Hook: task registration, trigger config load, etc. Throw to abort bootstrap. */\n protected abstract onBeforeRegisterNode(logger: LoggerWithScope): Promise<void>;\n\n /** Hook: one iteration body after commands + heartbeat gate. */\n protected abstract runLoopSteps(ctx: NodeLoopContext, heartbeatOk: boolean): Promise<void>;\n\n /** Hook: minimum log level for main-loop scoped loggers (heartbeat, batchCommand, iteration). */\n protected loopLoggerMinLevel(): LogLevel {\n return LogLevel.INFO;\n }\n\n /** Hook: ms to wait between loop iterations. Default: random 15–60s. */\n protected getLoopIntervalMs(): number {\n return getRandomInterval();\n }\n\n private getLogNodeId(): string {\n return this.localNodeId ?? BaseNodeRuntime.NODE_ID_PENDING_ASSIGNMENT;\n }\n\n protected isShuttingDown(): boolean {\n return this.shutdownPromise != null;\n }\n\n protected requestShutdown(trigger: string): void {\n void this.shutdown({ trigger });\n }\n\n private registerProcessLifecycle(logger: LoggerWithScope): void {\n process.on(\"SIGTERM\", () => {\n logger.warn(\"收到 SIGTERM 信號,準備關閉節點\", { topic: LOG_TOPIC_PROCESS });\n this.requestShutdown(\"SIGTERM\");\n });\n process.on(\"SIGINT\", () => {\n logger.warn(\"收到 SIGINT 信號,準備關閉節點\", { topic: LOG_TOPIC_PROCESS });\n this.requestShutdown(\"SIGINT\");\n });\n process.on(\"uncaughtException\", (error) => {\n if (this.shutdownPromise != null) {\n logger.critical(\"shutdown 進行中發生未捕獲異常,立即關閉節點\", {\n topic: LOG_TOPIC_PROCESS,\n data: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n },\n });\n process.exit(1);\n return;\n }\n logger.critical(\"未捕獲的異常,準備關閉節點\", {\n topic: LOG_TOPIC_PROCESS,\n data: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n },\n });\n this.requestShutdown(\"uncaughtException\");\n });\n process.on(\"unhandledRejection\", (reason) => {\n if (this.shutdownPromise != null) {\n logger.error(\"shutdown 進行中發生未處理的 Promise 拒絕\", {\n topic: LOG_TOPIC_PROCESS,\n data: {\n reason: getErrorMessage(reason),\n stack: reason instanceof Error ? reason.stack : undefined,\n },\n });\n return;\n }\n logger.error(\"未處理的 Promise 拒絕,準備關閉節點\", {\n topic: LOG_TOPIC_PROCESS,\n data: {\n reason: getErrorMessage(reason),\n stack: reason instanceof Error ? reason.stack : undefined,\n },\n });\n this.requestShutdown(\"unhandledRejection\");\n });\n }\n\n async start(): Promise<void> {\n if (this.startPromise != null) {\n return this.startPromise;\n }\n this.startPromise = this.runStart();\n return this.startPromise;\n }\n\n private async runStart(): Promise<void> {\n const logger = createLogger({\n scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),\n });\n\n logger.debug(\"節點進程啟動中\", {\n topic: LOG_TOPIC_NODE,\n data: {\n pid: process.pid,\n env: process.env.NODE_ENV ?? \"development\",\n runtime: this.runtimeModule,\n },\n });\n this.registerProcessLifecycle(logger);\n\n try {\n await this.onBeforeRegisterNode(logger);\n } catch (error) {\n logger.error(\"節點啟動前置步驟失敗\", {\n topic: LOG_TOPIC_NODE,\n data: { error: getErrorMessage(error) },\n });\n this.requestShutdown(\"bootstrap:pre-register\");\n return;\n }\n\n logger.debug(\"開始向 Supabase 註冊節點\", { topic: LOG_TOPIC_NODE });\n try {\n const { data, error } = await postRegisterNode({ traceId: this.startupTraceId });\n if (data == null || error) {\n throw error ?? new Error(\"postRegisterNode 失敗\");\n }\n this.localNodeId = data.id;\n logger.resetScope({ labels: { nodeId: data.id } });\n logger.success(\"節點註冊成功\", {\n topic: LOG_TOPIC_NODE,\n data: {\n nodeId: data.id,\n details: data.details,\n },\n });\n } catch (error) {\n logger.error(\"節點註冊失敗\", {\n topic: LOG_TOPIC_NODE,\n data: { error: getErrorMessage(error) },\n });\n this.requestShutdown(\"bootstrap:register-node\");\n return;\n }\n\n const nodeId = this.localNodeId!;\n logger.debug(\"節點準備進入主循環\", { topic: LOG_TOPIC_NODE });\n const { error: enterBusyError } = await patchChangeNodeStatus({\n nodeId,\n status: NodeStatus.BUSY,\n fromStatus: NodeStatus.READY,\n traceId: this.startupTraceId,\n });\n if (enterBusyError) {\n logger.error(\"節點進入主循環失敗,無法更新節點狀態為 BUSY\", {\n topic: LOG_TOPIC_NODE,\n data: { error: enterBusyError.message },\n });\n this.requestShutdown(\"bootstrap:enter-busy\");\n return;\n }\n logger.debug(\"節點狀態已設為 BUSY 進入主循環\", { topic: LOG_TOPIC_NODE, data: { nodeId } });\n await this.runLoop(nodeId);\n }\n\n private async runLoop(nodeId: string): Promise<void> {\n this.isRunning = true;\n\n while (this.isRunning) {\n this.loopCount++;\n const loopTraceId = logManager.generateTraceId();\n const loopScope = createScope({\n module: `${this.runtimeModule}-loop-iteration`,\n traceId: loopTraceId,\n labels: { nodeId },\n });\n const loopCtx: NodeLoopContext = { loopTraceId, nodeId };\n const iterLogger = createLogger({\n scope: loopScope,\n minLevel: this.loopLoggerMinLevel(),\n });\n\n iterLogger.debug(`主循環第 ${this.loopCount} 輪開始`, {\n topic: LOG_TOPIC_NODE,\n data: { nodeId, loopCount: this.loopCount },\n });\n try {\n await this.batchCommand(loopCtx);\n if (this.isShuttingDown()) {\n iterLogger.debug(\"節點關閉中,跳過本輪剩餘步驟\", { topic: LOG_TOPIC_NODE });\n break;\n }\n const heartbeatOk = await this.heartbeat(loopCtx);\n if (this.isShuttingDown()) {\n iterLogger.debug(\"節點關閉中,跳過本輪剩餘步驟\", { topic: LOG_TOPIC_NODE });\n break;\n }\n await this.runLoopSteps(loopCtx, heartbeatOk);\n } catch (error) {\n iterLogger.critical(`主循環第 ${this.loopCount} 輪遇到未知錯誤`, {\n topic: LOG_TOPIC_NODE,\n data: { error: getErrorMessage(error) },\n });\n }\n if (this.isShuttingDown()) {\n iterLogger.debug(\"節點關閉中,跳過等待間隔\", { topic: LOG_TOPIC_NODE });\n break;\n }\n const interval = this.getLoopIntervalMs();\n iterLogger.debug(`主循環第 ${this.loopCount} 輪完成,等待下一輪`, {\n topic: LOG_TOPIC_NODE,\n data: { intervalMs: interval },\n });\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n }\n\n async shutdown(options?: { trigger?: string }): Promise<void> {\n if (this.shutdownPromise != null) {\n const logger = createLogger({\n scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),\n });\n logger.debug(\"shutdown 已在進行,跳過重複調用\", {\n topic: LOG_TOPIC_NODE,\n data: { trigger: options?.trigger ?? \"unknown\" },\n });\n return this.shutdownPromise;\n }\n\n this.isRunning = false;\n this.shutdownPromise = this.runShutdown(options?.trigger).catch((error) => {\n const logger = createLogger({\n scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),\n });\n logger.error(\"shutdown 流程異常\", {\n topic: LOG_TOPIC_NODE,\n data: {\n trigger: options?.trigger ?? \"explicit\",\n error: getErrorMessage(error),\n },\n });\n process.exit(1);\n });\n return this.shutdownPromise;\n }\n\n private async runShutdown(trigger?: string): Promise<void> {\n const logger = createLogger({\n scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),\n });\n\n logger.debug(\"正在關閉節點進程\", {\n topic: LOG_TOPIC_NODE,\n data: { trigger: trigger ?? \"explicit\" },\n });\n\n if (this.localNodeId == null) {\n logger.warn(\"本地節點未註冊,進程退出\", { topic: LOG_TOPIC_NODE });\n process.exit(0);\n return;\n }\n\n logger.debug(\"正在登出節點\", { topic: LOG_TOPIC_NODE, data: { nodeId: this.localNodeId } });\n try {\n const { error } = await patchStopNode({\n nodeId: this.localNodeId,\n traceId: this.startupTraceId,\n });\n if (error) {\n throw new Error(`patchStopNode 失敗: ${error.message}`);\n }\n logger.success(\"節點正常關閉,進程退出\", { topic: LOG_TOPIC_NODE });\n } catch (error) {\n logger.critical(\"登出節點失敗,進程退出\", {\n topic: LOG_TOPIC_NODE,\n data: { error: getErrorMessage(error) },\n });\n } finally {\n process.exit(0);\n }\n }\n\n async heartbeat(ctx: NodeLoopContext): Promise<boolean> {\n const { loopTraceId, nodeId } = ctx;\n const logger = createLogger({\n scope: createScope({\n module: \"heartbeat\",\n traceId: loopTraceId,\n labels: { nodeId },\n }),\n minLevel: this.loopLoggerMinLevel(),\n });\n\n logger.debug(\"開始發送心跳\", { topic: LOG_TOPIC_NODE });\n let error: { message: string } | undefined;\n let lastHeartBeat: number | null | undefined;\n try {\n const response = await patchNodeHeartBeat({ nodeId, traceId: loopTraceId });\n error = response.error;\n lastHeartBeat = response.data;\n } catch (caught) {\n error = { message: getErrorMessage(caught) };\n lastHeartBeat = null;\n }\n if (error || lastHeartBeat == null) {\n this.consecutiveHeartbeatFailures++;\n const failureCount = this.consecutiveHeartbeatFailures;\n const logData = {\n error: getErrorMessage(error),\n consecutiveFailures: failureCount,\n threshold: BaseNodeRuntime.HEARTBEAT_FAILURE_THRESHOLD,\n };\n if (failureCount >= BaseNodeRuntime.HEARTBEAT_FAILURE_THRESHOLD) {\n logger.critical(\"連續心跳失敗達上限,準備關閉節點\", {\n topic: LOG_TOPIC_NODE,\n data: logData,\n });\n this.requestShutdown(\"heartbeat:consecutive-failures\");\n } else {\n logger.warn(\"心跳更新失敗\", { topic: LOG_TOPIC_NODE, data: logData });\n }\n return false;\n }\n\n this.consecutiveHeartbeatFailures = 0;\n logger.success(\"心跳更新成功\", {\n topic: LOG_TOPIC_NODE,\n data: { lastHeartBeat: formatHeartbeat(lastHeartBeat) },\n });\n return true;\n }\n\n async batchCommand(ctx: NodeLoopContext): Promise<void> {\n const { loopTraceId, nodeId } = ctx;\n const cmdLogger = createLogger({\n scope: createScope({\n module: \"batchCommand\",\n traceId: loopTraceId,\n labels: { nodeId },\n }),\n minLevel: this.loopLoggerMinLevel(),\n });\n\n cmdLogger.debug(\"開始檢查控制指令\", { topic: LOG_TOPIC_COMMAND });\n const { data: commandList = [], error: pollError } = await getPollCommandList({\n nodeId,\n traceId: loopTraceId,\n size: MAX_POLL_TARGET_LIST_SIZE,\n });\n if (pollError) {\n cmdLogger.warn(\"獲取指令失敗\", {\n topic: LOG_TOPIC_COMMAND,\n data: { error: pollError.message },\n });\n return;\n }\n if (commandList.length === 0) {\n cmdLogger.debug(\"獲取指令數量為0 無需執行\", { topic: LOG_TOPIC_COMMAND });\n return;\n }\n cmdLogger.debug(`獲取到控制指令數量為${commandList.length}`, {\n topic: LOG_TOPIC_COMMAND,\n data: { count: commandList.length, commandList: commandList.map((command) => command.name) },\n });\n\n for (const command of commandList) {\n const cmd = command.name;\n cmdLogger.info(\"執行控制指令\", {\n topic: LOG_TOPIC_COMMAND,\n data: { commandId: command.id, cmd },\n });\n try {\n await this.executeCommand(cmd, ctx);\n cmdLogger.success(\"控制指令執行成功\", {\n topic: LOG_TOPIC_COMMAND,\n data: { commandId: command.id, cmd },\n });\n } catch (error) {\n cmdLogger.warn(\"控制指令執行失敗\", {\n topic: LOG_TOPIC_COMMAND,\n data: {\n commandId: command.id,\n cmd,\n error: getErrorMessage(error),\n },\n });\n }\n }\n\n cmdLogger.debug(\"控制指令批次處理完成\", {\n topic: LOG_TOPIC_COMMAND,\n });\n }\n\n /** Shared commands, then {@link resolveNodeCommand} for subclass-specific handling. */\n protected async executeCommand(cmd: CommandType, ctx: NodeLoopContext): Promise<void> {\n if (cmd === CommandType.STOP_NODE) {\n this.requestShutdown(\"cmd:STOP_NODE\");\n return;\n }\n await this.resolveNodeCommand(cmd, ctx);\n }\n\n /**\n * Hook: handle node-type-specific {@link CommandType} values.\n * Default rejects anything not handled in {@link executeCommand}.\n */\n protected async resolveNodeCommand(cmd: CommandType, _ctx: NodeLoopContext): Promise<void> {\n throw new Error(`無法解析的 cmd: ${cmd}`);\n }\n}\n\nexport { BaseNodeRuntime };\n","import { type ChildProcess, type StdioOptions, spawn } from \"node:child_process\";\n\nexport interface BuildNodeImportArgsInput {\n /** Relative `--import` paths (e.g. `./scripts/preload-env.mjs`). */\n preloadModules?: readonly string[];\n /** When true (default), inserts `--import tsx` before the entry script. */\n useTsx?: boolean;\n /** Entry script relative to `projectRoot` when spawning. */\n entryScript: string;\n}\n\n/**\n * Build argv for `node --import … --import tsx <entry>`.\n * Use **relative** preload paths with `cwd: projectRoot` — Node 24 on Windows rejects\n * absolute paths like `D:\\…` for `--import` (ESM URL scheme error).\n */\nexport function buildNodeImportArgs(input: BuildNodeImportArgsInput): string[] {\n const preloadModules = input.preloadModules ?? [];\n const useTsx = input.useTsx ?? true;\n const args: string[] = [];\n\n for (const modulePath of preloadModules) {\n args.push(\"--import\", modulePath);\n }\n if (useTsx) {\n args.push(\"--import\", \"tsx\");\n }\n args.push(input.entryScript);\n return args;\n}\n\nexport interface SpawnTsxChildOptions {\n projectRoot: string;\n entryScript: string;\n preloadModules?: readonly string[];\n useTsx?: boolean;\n env?: NodeJS.ProcessEnv;\n stdio?: StdioOptions;\n}\n\n/** Spawn `node` with preload chain + tsx + TypeScript entry (relative to projectRoot). */\nexport function spawnTsxChild(options: SpawnTsxChildOptions): ChildProcess {\n return spawn(\n process.execPath,\n buildNodeImportArgs({\n preloadModules: options.preloadModules,\n useTsx: options.useTsx,\n entryScript: options.entryScript,\n }),\n {\n cwd: options.projectRoot,\n env: options.env ?? process.env,\n stdio: options.stdio ?? \"inherit\",\n shell: false,\n },\n );\n}\n\nexport function isChildProcessRunning(child: ChildProcess | null | undefined): child is ChildProcess {\n return child != null && child.exitCode == null && !child.killed;\n}\n","import type { ChildProcess } from \"node:child_process\";\nimport { resolve } from \"node:path\";\nimport type { LoggerWithScope } from \"../../shared/log\";\nimport { isChildProcessRunning, spawnTsxChild } from \"./process-spawn\";\n\nexport interface ManagedChildProcessesOptions {\n projectRoot: string;\n preloadModules?: readonly string[];\n /** SIGTERM -> wait -> SIGKILL delay (default 5000 ms). */\n graceMs?: number;\n logger?: Pick<LoggerWithScope, \"info\" | \"warn\" | \"error\">;\n}\n\nexport interface SpawnChildResult {\n child: ChildProcess;\n /** false when an equivalent label was already running. */\n created: boolean;\n}\n\nexport interface StopAllChildrenOptions {\n /** PIDs to SIGTERM when not tracked by this registry (cross-process cleanup). */\n extraPids?: readonly number[];\n}\n\n/**\n * Process-local registry for tsx child processes (supervisor, worker, etc.).\n * Each OS process has its own instance - do not expect cross-process PID tracking.\n */\nexport class ManagedChildProcesses {\n private readonly projectRoot: string;\n private readonly preloadModules: readonly string[];\n private readonly graceMs: number;\n private readonly logger?: Pick<LoggerWithScope, \"info\" | \"warn\" | \"error\">;\n private readonly byLabel = new Map<string, ChildProcess>();\n\n constructor(options: ManagedChildProcessesOptions) {\n this.projectRoot = options.projectRoot;\n this.preloadModules = options.preloadModules ?? [];\n this.graceMs = options.graceMs ?? 5_000;\n this.logger = options.logger;\n }\n\n get(label: string): ChildProcess | null {\n return this.byLabel.get(label) ?? null;\n }\n\n getRunning(label: string): ChildProcess | null {\n const child = this.byLabel.get(label);\n return isChildProcessRunning(child) ? child : null;\n }\n\n runningLabels(): string[] {\n return [...this.byLabel.entries()]\n .filter((entry): entry is [string, ChildProcess] => isChildProcessRunning(entry[1]))\n .map(([label]) => label);\n }\n\n spawn(label: string, entryScript: string): SpawnChildResult {\n const existing = this.getRunning(label);\n if (existing != null) {\n return { child: existing, created: false };\n }\n\n const child = spawnTsxChild({\n projectRoot: this.projectRoot,\n entryScript,\n preloadModules: this.preloadModules,\n });\n\n child.on(\"exit\", (code, signal) => {\n this.logger?.info(\"child exited\", { topic: \"process\", data: { label, code, signal } });\n const current = this.byLabel.get(label);\n if (current === child) {\n this.byLabel.delete(label);\n }\n });\n\n this.byLabel.set(label, child);\n\n this.logger?.info(\"child started\", {\n topic: \"process\",\n data: {\n label,\n pid: child.pid,\n script: resolve(this.projectRoot, entryScript),\n },\n });\n\n return { child, created: true };\n }\n\n async stopAll(options?: StopAllChildrenOptions): Promise<void> {\n const tracked = [...this.byLabel.values()].filter((child) => isChildProcessRunning(child));\n\n await Promise.all(tracked.map((child) => this.stopChild(child)));\n\n const extraPids = options?.extraPids ?? [];\n for (const pid of extraPids) {\n if (pid == null || tracked.some((child) => child.pid === pid)) {\n continue;\n }\n try {\n process.kill(pid, \"SIGTERM\");\n } catch {\n // already exited\n }\n }\n }\n\n private stopChild(child: ChildProcess): Promise<void> {\n return new Promise((resolvePromise) => {\n child.once(\"exit\", () => resolvePromise());\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (isChildProcessRunning(child)) {\n child.kill(\"SIGKILL\");\n }\n }, this.graceMs);\n });\n }\n}\n","import { access } from \"node:fs/promises\";\nimport { scanTargetList } from \"../../core.api\";\nimport { requireEnv } from \"../env/require-env\";\nimport type { ReadinessCheck, ReadinessCheckResult } from \"./readiness.types\";\n\nexport interface RequiredEnvCheckOptions {\n env?: NodeJS.ProcessEnv;\n}\n\n/** Factory: all listed env keys must be non-empty. */\nexport function createRequiredEnvCheck(\n name: string,\n keys: string[],\n options?: RequiredEnvCheckOptions,\n): ReadinessCheck {\n return () => {\n const env = options?.env ?? process.env;\n try {\n for (const key of keys) {\n requireEnv(key, env);\n }\n return { name, ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { name, ok: false, detail: message };\n }\n };\n}\n\nexport interface PathsExistCheckOptions {\n /** Detail string when all paths exist (default: last path). */\n successDetail?: string;\n /** Detail prefix when a path is missing. */\n missingDetail?: string;\n}\n\n/** Factory: every path must exist on disk. */\nexport function createPathsExistCheck(name: string, paths: string[], options?: PathsExistCheckOptions): ReadinessCheck {\n return async () => {\n for (const filePath of paths) {\n try {\n await access(filePath);\n } catch {\n return {\n name,\n ok: false,\n detail: options?.missingDetail ?? `Missing ${filePath}`,\n };\n }\n }\n\n const detail = options?.successDetail ?? paths[paths.length - 1] ?? paths.join(\", \");\n\n return { name, ok: true, detail };\n };\n}\n\nexport interface SupabaseReachableCheckOptions {\n name?: string;\n category?: string;\n maxRows?: number;\n}\n\n/** Factory: lightweight Supabase query via {@link scanTargetList}. */\nexport function createSupabaseReachableCheck(options?: SupabaseReachableCheckOptions): ReadinessCheck {\n const name = options?.name ?? \"supabase_connectivity\";\n const category = options?.category ?? \"node\";\n const maxRows = options?.maxRows ?? 1;\n\n return async (): Promise<ReadinessCheckResult> => {\n try {\n await scanTargetList({ category, maxRows });\n return { name, ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { name, ok: false, detail: message };\n }\n };\n}\n","import type { ReadinessCheck, ReadinessReport } from \"./readiness.types\";\n\nfunction formatFailureMessage(checks: ReadinessReport[\"checks\"]): string {\n return checks\n .filter((check) => !check.ok)\n .map((check) => `${check.name}: ${check.detail ?? \"failed\"}`)\n .join(\"; \");\n}\n\n/** Run checks in order and aggregate into a {@link ReadinessReport}. */\nexport async function runReadinessChecks(checks: ReadinessCheck[]): Promise<ReadinessReport> {\n const results = await Promise.all(checks.map((check) => check()));\n const failed = results.filter((check) => !check.ok);\n\n return {\n ok: failed.length === 0,\n checks: results,\n message: failed.length === 0 ? null : formatFailureMessage(results),\n };\n}\n","import type { LoggerWithScope } from \"../../shared/log\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface ServiceReadySnapshot {\n failed: boolean;\n ready: boolean;\n failureMessage?: string | null;\n /** Logged on success (e.g. worker tasks, pid). */\n readyDetail?: unknown;\n}\n\n/** Cross-process ready gate — service implements by reading shared state (file, RPC, …). */\nexport interface ServiceReadyGate {\n read(): Promise<ServiceReadySnapshot>;\n}\n\nexport interface WaitForServiceReadyOptions {\n timeoutMs: number;\n pollMs?: number;\n logger?: Pick<LoggerWithScope, \"info\">;\n /** Default failure message when gate.read().failureMessage is empty. */\n failureMessage?: string;\n formatTimeoutError?: (last: ServiceReadySnapshot, timeoutMs: number) => string;\n}\n\n/**\n * Poll {@link ServiceReadyGate} until ready, fail fast on `failed`, or timeout.\n * Returns the final ready snapshot.\n */\nexport async function waitForServiceReady(\n gate: ServiceReadyGate,\n options: WaitForServiceReadyOptions,\n): Promise<ServiceReadySnapshot> {\n const pollMs = options.pollMs ?? 500;\n const defaultFailureMessage = options.failureMessage ?? \"Readiness checks failed\";\n const deadline = Date.now() + options.timeoutMs;\n let last: ServiceReadySnapshot = { failed: false, ready: false };\n\n while (Date.now() < deadline) {\n last = await gate.read();\n\n if (last.failed) {\n throw new Error(last.failureMessage ?? defaultFailureMessage);\n }\n\n if (last.ready) {\n options.logger?.info(\"service ready\", {\n topic: \"readiness\",\n data: last.readyDetail ?? {},\n });\n return last;\n }\n\n await sleep(pollMs);\n }\n\n const message =\n options.formatTimeoutError?.(last, options.timeoutMs) ??\n `Service ready timeout after ${options.timeoutMs}ms (failed=${last.failed}, ready=${last.ready})`;\n\n throw new Error(message);\n}\n","export interface TaskRunResult {\n isSuccess: boolean;\n cost: number;\n extra: unknown;\n}\n\nexport interface TaskFn {\n displayName: string;\n taskTypeKey: string;\n (taskParams: unknown): Promise<TaskRunResult>;\n}\n\n/** Params already bound — used by node executor after prepareTask */\nexport type ExecutableTaskFn = (() => Promise<TaskRunResult>) & {\n displayName: string;\n taskTypeKey: string;\n};\n\n/** Repo script module must expose this shape (see repo-context.utils). */\nexport interface TaskRepoContext {\n taskParamsValidator: (taskParams: unknown) => boolean;\n taskFn: TaskFn;\n}\n\n/** Supabase `target.category` for rows that store task script payloads */\nexport const TASK_REPO_SCRIPT_CATEGORY = \"script\" as const;\n\n/**\n * `target.details` for task script rows — not a separate Target subtype in repo.interface.\n * Loaded dynamically to produce {@link TaskRepoContext}.\n */\nexport interface TaskRepoScriptDetails {\n manifestVersion: number;\n /** Inline ESM source — written to temp file then dynamically imported (Node) */\n source?: string;\n /** Absolute path to an ESM module on the worker machine */\n modulePath?: string;\n /** Named export to read TaskRepoContext from; default export if omitted */\n exportName?: string;\n /** Content hash for cache invalidation */\n hash?: string;\n /** Prefer this script as entry when multiple scripts exist for one repo */\n isEntry?: boolean;\n}\n\n/** Minimal target row shape used by script loader (avoids a dedicated Script Target type). */\nexport interface TaskRepoScriptRecord {\n id: string;\n value: string;\n details: TaskRepoScriptDetails;\n}\n\n/** Host app root config at `config/task.config.js` — where to discover local task packages */\nexport interface TaskRunnerRootConfig {\n /** Directory containing one folder per task (relative to root config file), e.g. `\"./tasks\"` */\n taskDir: string;\n}\n\n/** Per-task `task.config.js` inside `<taskDir>/<name>/` */\nexport interface TaskLocalPackageConfig {\n /** Must match `task.value` when claiming from Supabase */\n taskTypeKey: string;\n /** Entry module relative to this task folder, e.g. `\"./index.mjs\"` */\n entry: string;\n /** Named export on entry module; default export if omitted */\n exportName?: string;\n displayName?: string;\n /** Skip registration when `false` (default `true`) */\n enabled?: boolean;\n}\n\nexport type BootstrapLocalTasksStatus =\n /** Root config found and scan finished (individual tasks may still have errors) */\n | \"loaded\"\n /** Root config found but zero tasks registered */\n | \"empty\"\n /** No root config at default/explicit paths — not an error; use remote scripts or manual register */\n | \"not_configured\"\n /** Root config or taskDir invalid */\n | \"failed\";\n\nexport interface BootstrapLocalTasksResult {\n status: BootstrapLocalTasksStatus;\n /** Human-readable summary for logs */\n message?: string;\n registered: string[];\n skipped: { taskDir: string; reason: string }[];\n errors: { taskDir: string; error: string }[];\n /** True when scan was skipped due to unchanged config fingerprint */\n cached?: boolean;\n}\n\n/** Host app config directory (relative to `cwd`) — recommended for library consumers */\nexport const TASK_RUNNER_CONFIG_DIR = \"config\" as const;\n\nexport const TASK_RUNNER_ROOT_CONFIG_FILENAME = \"task.config.js\" as const;\n\n/** Default root config path: `config/task.config.js` */\nexport const TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH =\n `${TASK_RUNNER_CONFIG_DIR}/${TASK_RUNNER_ROOT_CONFIG_FILENAME}` as const;\n\n/** Legacy fallback at project root */\nexport const TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH = TASK_RUNNER_ROOT_CONFIG_FILENAME;\n\n/** Per-task config filename inside each folder under `taskDir` */\nexport const TASK_LOCAL_PACKAGE_CONFIG_FILENAME = \"task.config.js\" as const;\n","import { access } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\n/**\n * Directory containing a config file — anchor for paths declared **inside** that file.\n */\nexport function getConfigFileDir(configFilePath: string): string {\n return dirname(configFilePath);\n}\n\n/**\n * Resolve a path from a config file's directory.\n *\n * - Absolute `pathInConfig` → returned as-is\n * - Relative `pathInConfig` → `resolve(dirname(configFilePath), pathInConfig)`\n *\n * **Not** relative to `process.cwd()`. See `.cursor/skills/config-file-relative-paths/SKILL.md`.\n */\nexport function resolvePathFromConfigFile(configFilePath: string, pathInConfig: string): string {\n const trimmed = pathInConfig.trim();\n if (isAbsolute(trimmed)) {\n return trimmed;\n }\n return resolve(getConfigFileDir(configFilePath), trimmed);\n}\n\n/**\n * Resolve a path from an explicit base directory (e.g. task package dir for `entry`).\n * Same rules as {@link resolvePathFromConfigFile}, but base is already known.\n */\nexport function resolvePathFromBaseDir(baseDir: string, path: string): string {\n const trimmed = path.trim();\n if (isAbsolute(trimmed)) {\n return trimmed;\n }\n return resolve(baseDir, trimmed);\n}\n\n/**\n * Resolve a path from `cwd` — for **discovering** config files, not for fields inside them.\n */\nexport function resolvePathFromCwd(cwd: string, path: string): string {\n const trimmed = path.trim();\n if (isAbsolute(trimmed)) {\n return trimmed;\n }\n return resolve(cwd, trimmed);\n}\n\nexport async function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface ResolveFirstExistingPathOptions {\n /** When set, only this path is tried (resolved from `cwd` if relative). */\n explicitPath?: string;\n /** Relative to `cwd`, tried in order when `explicitPath` is omitted. */\n candidatePaths: string[];\n}\n\n/**\n * Find the first existing file path: optional explicit path, else scan `candidatePaths` under `cwd`.\n */\nexport async function resolveFirstExistingPath(\n cwd: string,\n options: ResolveFirstExistingPathOptions,\n): Promise<string | null> {\n const { explicitPath, candidatePaths } = options;\n\n if (explicitPath != null && explicitPath.trim() !== \"\") {\n const resolved = resolvePathFromCwd(cwd, explicitPath);\n return (await pathExists(resolved)) ? resolved : null;\n }\n\n for (const candidate of candidatePaths) {\n const resolved = join(cwd, candidate);\n if (await pathExists(resolved)) {\n return resolved;\n }\n }\n\n return null;\n}\n\n/** `file://` href for Node dynamic `import()` of a local module. */\nexport function toFileImportHref(filePath: string): string {\n const trimmed = filePath.trim();\n if (trimmed.includes(\"://\")) {\n return trimmed;\n }\n return pathToFileURL(trimmed).href;\n}\n\n/** Native ESM import of a `.js` / `.mjs` config; supports `export default` or named export object. */\nexport async function importJsConfigModule(configPath: string): Promise<unknown> {\n const mod = await import(toFileImportHref(configPath));\n return mod.default ?? mod;\n}\n","import {\n TASK_REPO_SCRIPT_CATEGORY,\n type TaskRepoContext,\n type TaskRepoScriptDetails,\n type TaskRepoScriptRecord,\n} from \"../task/task-repo-context\";\n\nexport { TASK_REPO_SCRIPT_CATEGORY };\n\nexport interface LoadedRepoContext {\n context: TaskRepoContext;\n /** Cache key segment — typically repo hash or script hash */\n contentHash: string;\n}\n\nexport function isTaskRepoContext(value: unknown): value is TaskRepoContext {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n const record = value as TaskRepoContext;\n return typeof record.taskParamsValidator === \"function\" && typeof record.taskFn === \"function\";\n}\n\n/**\n * Normalize a dynamically imported module into {@link TaskRepoContext}.\n * Supported shapes:\n * - `export default { taskParamsValidator, taskFn }`\n * - `export { taskParamsValidator, taskFn }`\n * - `export default taskFn` (validator becomes `() => true`)\n */\nexport function normalizeRepoContextModule(\n moduleExports: unknown,\n taskTypeKey: string,\n exportName?: string,\n): TaskRepoContext | null {\n if (moduleExports == null) {\n return null;\n }\n\n const record = moduleExports as Record<string, unknown>;\n const namedExport = exportName != null && exportName !== \"\" ? record[exportName] : undefined;\n const defaultExport = record.default;\n const candidate = namedExport ?? defaultExport ?? moduleExports;\n\n let taskParamsValidator: unknown;\n let taskFn: unknown;\n\n if (typeof candidate === \"function\") {\n taskFn = candidate;\n taskParamsValidator = record.taskParamsValidator;\n } else if (typeof candidate === \"object\" && candidate != null) {\n const ctx = candidate as Record<string, unknown>;\n taskParamsValidator = ctx.taskParamsValidator;\n taskFn = ctx.taskFn;\n }\n\n taskParamsValidator ??= record.taskParamsValidator;\n taskFn ??= record.taskFn;\n\n if (typeof taskFn !== \"function\") {\n return null;\n }\n\n if (typeof taskParamsValidator !== \"function\") {\n taskParamsValidator = () => true;\n }\n\n const fn = taskFn as TaskRepoContext[\"taskFn\"];\n if (fn.displayName == null || fn.displayName === \"\") {\n fn.displayName = taskTypeKey;\n }\n if (fn.taskTypeKey == null || fn.taskTypeKey === \"\") {\n fn.taskTypeKey = taskTypeKey;\n }\n\n return {\n taskParamsValidator: taskParamsValidator as TaskRepoContext[\"taskParamsValidator\"],\n taskFn: fn,\n };\n}\n\nexport function pickEntryScript(scripts: TaskRepoScriptRecord[]): TaskRepoScriptRecord | null {\n if (scripts.length === 0) {\n return null;\n }\n const entry = scripts.find((script) => script.details.isEntry === true);\n return entry ?? scripts[0];\n}\n\nexport function getScriptLoadKey(script: TaskRepoScriptRecord): string {\n const { source, modulePath, hash } = script.details;\n if (hash != null && hash !== \"\") {\n return hash;\n }\n if (source != null && source !== \"\") {\n return `source:${source.length}:${source.slice(0, 64)}`;\n }\n if (modulePath != null && modulePath !== \"\") {\n return `path:${modulePath}`;\n }\n return script.id;\n}\n\nexport function assertScriptLoadable(\n details: TaskRepoScriptDetails,\n): details is TaskRepoScriptDetails & ({ source: string } | { modulePath: string }) {\n const hasSource = details.source != null && details.source.trim() !== \"\";\n const hasModulePath = details.modulePath != null && details.modulePath.trim() !== \"\";\n return hasSource || hasModulePath;\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport type { LoggerWithScope } from \"../shared/log\";\nimport { resolvePathFromCwd, toFileImportHref } from \"../shared/utils/config-path.utils\";\nimport type { TaskRepoScriptRecord } from \"../task/task-repo-context\";\nimport { getScriptLoadKey, type LoadedRepoContext, normalizeRepoContextModule } from \"./repo-context.utils\";\n\nconst importedModuleCache = new Map<string, LoadedRepoContext>();\n\nasync function importFromFilePath(modulePath: string): Promise<unknown> {\n return import(toFileImportHref(modulePath));\n}\n\n/** Resolve repo `details.url` to a value suitable for dynamic `import()`. */\nexport function resolveRepoEntryHref(url: string, cwd = process.cwd()): string {\n const trimmed = url.trim();\n if (trimmed.includes(\"://\")) {\n return trimmed;\n }\n return toFileImportHref(resolvePathFromCwd(cwd, trimmed));\n}\n\nasync function importFromSource(source: string, cacheKey: string): Promise<unknown> {\n const hash = createHash(\"sha256\").update(source).digest(\"hex\").slice(0, 16);\n const dir = join(tmpdir(), \"target-supabase-sdk\", \"repo-scripts\");\n await mkdir(dir, { recursive: true });\n const filePath = join(dir, `${cacheKey}-${hash}.mjs`);\n await writeFile(filePath, source, \"utf8\");\n return importFromFilePath(filePath);\n}\n\nexport async function loadRepoContextFromScript({\n logger,\n script,\n taskTypeKey,\n}: {\n logger: LoggerWithScope;\n script: TaskRepoScriptRecord;\n taskTypeKey: string;\n}): Promise<LoadedRepoContext | null> {\n const loadKey = getScriptLoadKey(script);\n const cacheKey = `${taskTypeKey}@${loadKey}`;\n const cached = importedModuleCache.get(cacheKey);\n if (cached != null) {\n logger.info(\"命中 Repo 脚本模块缓存\", { topic: \"repo\", data: { cacheKey } });\n return cached;\n }\n\n const { source, modulePath, exportName } = script.details;\n\n try {\n let moduleExports: unknown;\n if (source != null && source.trim() !== \"\") {\n logger.info(\"从 source 动态加载 Repo 脚本\", { topic: \"repo\", data: { scriptId: script.id } });\n moduleExports = await importFromSource(source, cacheKey);\n } else if (modulePath != null && modulePath.trim() !== \"\") {\n logger.info(\"从 modulePath 动态加载 Repo 脚本\", {\n topic: \"repo\",\n data: { scriptId: script.id, modulePath },\n });\n moduleExports = await importFromFilePath(modulePath);\n } else {\n logger.warn(\"脚本缺少 source 或 modulePath\", { topic: \"repo\", data: { scriptId: script.id } });\n return null;\n }\n\n const context = normalizeRepoContextModule(moduleExports, taskTypeKey, exportName);\n if (context == null) {\n logger.warn(\"脚本模块未导出合法的 TaskRepoContext\", {\n topic: \"repo\",\n data: { scriptId: script.id, exportName: exportName ?? \"default\" },\n });\n return null;\n }\n\n const loaded: LoadedRepoContext = { context, contentHash: loadKey };\n importedModuleCache.set(cacheKey, loaded);\n return loaded;\n } catch (error) {\n logger.error(\"动态加载 Repo 脚本失败\", {\n topic: \"repo\",\n data: { scriptId: script.id, error: error instanceof Error ? error.message : error },\n });\n return null;\n }\n}\n\nexport async function loadRepoContextFromUrl({\n logger,\n url,\n taskTypeKey,\n exportName,\n}: {\n logger: LoggerWithScope;\n url: string;\n taskTypeKey: string;\n exportName?: string;\n}): Promise<LoadedRepoContext | null> {\n const href = resolveRepoEntryHref(url);\n const cacheKey = `${taskTypeKey}@url:${href}`;\n const cached = importedModuleCache.get(cacheKey);\n if (cached != null) {\n logger.info(\"命中 Repo URL 模块缓存\", { topic: \"repo\", data: { cacheKey } });\n return cached;\n }\n\n try {\n logger.info(\"从 Repo URL 动态加载脚本\", { topic: \"repo\", data: { url, href } });\n const moduleExports = await import(href);\n const context = normalizeRepoContextModule(moduleExports, taskTypeKey, exportName);\n if (context == null) {\n logger.warn(\"Repo URL 模块未导出合法的 TaskRepoContext\", {\n topic: \"repo\",\n data: { url, exportName: exportName ?? \"default\" },\n });\n return null;\n }\n const loaded: LoadedRepoContext = { context, contentHash: cacheKey };\n importedModuleCache.set(cacheKey, loaded);\n return loaded;\n } catch (error) {\n logger.error(\"从 Repo URL 动态加载失败\", {\n topic: \"repo\",\n data: { url, error: error instanceof Error ? error.message : error },\n });\n return null;\n }\n}\n\n/** Clear in-memory imported module cache (tests / hot reload). */\nexport function clearRepoScriptModuleCache(): void {\n importedModuleCache.clear();\n}\n","import { getPossibleTarget } from \"../core.api\";\nimport type { LoggerWithScope } from \"../shared/log\";\nimport { supabase } from \"../supabase\";\nimport type { TaskRepoContext, TaskRepoScriptRecord } from \"../task/task-repo-context\";\nimport { TASK_REPO_SCRIPT_CATEGORY } from \"../task/task-repo-context\";\nimport { CategoryRepo, type Repo } from \"./repo.interface\";\nimport { clearRepoScriptModuleCache, loadRepoContextFromScript, loadRepoContextFromUrl } from \"./repo.script-loader\";\nimport { assertScriptLoadable, isTaskRepoContext, pickEntryScript } from \"./repo-context.utils\";\n\ntype LocalRepoEntry =\n | { kind: \"context\"; context: TaskRepoContext }\n | { kind: \"modulePath\"; modulePath: string; exportName?: string };\n\nconst localRepoRegistry = new Map<string, LocalRepoEntry>();\nconst remoteContextCache = new Map<string, TaskRepoContext>();\n\nexport type RepoContextFailureReason =\n | \"LOCAL_REPO_LOAD_FAILED\"\n | \"LOCAL_REPO_NOT_FOUND\"\n | \"REMOTE_REPO_NOT_FOUND\"\n | \"REMOTE_REPO_LOAD_FAILED\";\n\nexport type RepoContextResolvedVia = \"local\" | \"remote\";\n\nexport interface GetRepoContextParams {\n logger: LoggerWithScope;\n /** Task type key (`task.value`) — matches {@link Repo.value} for remote lookup; local registry key */\n taskTypeKey: string;\n /**\n * When false, skip Supabase fetch if the task type is not in the local registry.\n * Default `true`.\n */\n includeRemote?: boolean;\n}\n\nexport interface GetRepoContextResult<T extends TaskRepoContext = TaskRepoContext> {\n context: T | null;\n /** Present when `context` is null — import / DB / format failure at repo layer */\n error?: string;\n failureReason?: RepoContextFailureReason;\n resolvedVia?: RepoContextResolvedVia;\n}\n\nfunction buildRemoteCacheKey(taskTypeKey: string, contentHash: string): string {\n return `${taskTypeKey}@${contentHash}`;\n}\n\nasync function fetchRemoteRepo(taskTypeKey: string): Promise<Repo | null> {\n const { data } = await getPossibleTarget({\n filterList: [\n { field: \"category\", operator: \"eq\", value: CategoryRepo.REPO },\n { field: \"value\", operator: \"eq\", value: taskTypeKey },\n ],\n });\n return (data as Repo | null) ?? null;\n}\n\nasync function fetchRemoteScripts(taskTypeKey: string): Promise<TaskRepoScriptRecord[]> {\n const { data, error } = await supabase.client\n .from(\"target\")\n .select(\"id, value, details\")\n .eq(\"category\", TASK_REPO_SCRIPT_CATEGORY)\n .eq(\"value\", taskTypeKey);\n\n if (error) {\n throw error;\n }\n\n return (data ?? []) as TaskRepoScriptRecord[];\n}\n\nasync function loadLocalEntry(\n logger: LoggerWithScope,\n entry: LocalRepoEntry,\n taskTypeKey: string,\n): Promise<TaskRepoContext | null> {\n if (entry.kind === \"context\") {\n return entry.context;\n }\n\n const loaded = await loadRepoContextFromScript({\n logger,\n script: {\n id: `local:${taskTypeKey}`,\n value: taskTypeKey,\n details: {\n manifestVersion: 0,\n modulePath: entry.modulePath,\n exportName: entry.exportName,\n isEntry: true,\n },\n },\n taskTypeKey,\n });\n return loaded?.context ?? null;\n}\n\nasync function loadRemoteRepoContext(logger: LoggerWithScope, taskTypeKey: string): Promise<GetRepoContextResult> {\n logger.info(\"從 Supabase 加載 Repo\", { topic: \"repo\", data: { taskTypeKey } });\n\n const remoteRepo = await fetchRemoteRepo(taskTypeKey);\n if (remoteRepo == null) {\n const error = `Supabase 未找到 Repo (value=${taskTypeKey})`;\n logger.warn(error, { topic: \"repo\", data: { taskTypeKey } });\n return { context: null, error, failureReason: \"REMOTE_REPO_NOT_FOUND\" };\n }\n\n const repoUrl = remoteRepo.details?.url?.trim() ?? \"\";\n const repoHash = remoteRepo.details?.hash?.trim() ?? repoUrl;\n const cacheKey = buildRemoteCacheKey(taskTypeKey, repoHash);\n const cached = remoteContextCache.get(cacheKey);\n if (cached != null) {\n logger.info(\"命中遠程 Repo 上下文緩存\", { topic: \"repo\", data: { cacheKey } });\n return { context: cached, resolvedVia: \"remote\" };\n }\n\n const scripts = await fetchRemoteScripts(taskTypeKey);\n const entryScript = pickEntryScript(scripts);\n\n let loaded =\n entryScript != null && assertScriptLoadable(entryScript.details)\n ? await loadRepoContextFromScript({ logger, script: entryScript, taskTypeKey })\n : null;\n\n if (loaded == null && repoUrl !== \"\") {\n logger.info(\"未找到 script 行,嘗試從 Repo.details.url 加載\", {\n topic: \"repo\",\n data: { taskTypeKey, url: repoUrl },\n });\n loaded = await loadRepoContextFromUrl({ logger, url: repoUrl, taskTypeKey });\n }\n\n if (loaded == null) {\n const error = `無法從 Repo 加載 TaskRepoContext (hasUrl=${repoUrl !== \"\"}, scriptCount=${scripts.length})`;\n logger.warn(error, {\n topic: \"repo\",\n data: { taskTypeKey, hasUrl: repoUrl !== \"\", scriptCount: scripts.length },\n });\n return { context: null, error, failureReason: \"REMOTE_REPO_LOAD_FAILED\" };\n }\n\n remoteContextCache.set(cacheKey, loaded.context);\n return { context: loaded.context, resolvedVia: \"remote\" };\n}\n\nconst getRepoContext = async <RepoContext extends TaskRepoContext>({\n logger,\n taskTypeKey,\n includeRemote = true,\n}: GetRepoContextParams): Promise<GetRepoContextResult<RepoContext>> => {\n const localEntry = localRepoRegistry.get(taskTypeKey);\n if (localEntry != null) {\n logger.info(\"使用本地註冊的 Repo\", { topic: \"repo\", data: { taskTypeKey } });\n const context = await loadLocalEntry(logger, localEntry, taskTypeKey);\n if (context != null && isTaskRepoContext(context)) {\n return { context: context as RepoContext, resolvedVia: \"local\" };\n }\n const error = \"本地 Repo 模組加載失敗或未導出有效的 TaskRepoContext\";\n logger.warn(error, { topic: \"repo\", data: { taskTypeKey } });\n return { context: null, error, failureReason: \"LOCAL_REPO_LOAD_FAILED\" };\n }\n\n if (!includeRemote) {\n const error = `本地未註冊 Repo (value=${taskTypeKey})`;\n logger.warn(error, { topic: \"repo\", data: { taskTypeKey, includeRemote: false } });\n return { context: null, error, failureReason: \"LOCAL_REPO_NOT_FOUND\" };\n }\n\n try {\n const result = await loadRemoteRepoContext(logger, taskTypeKey);\n if (result.context != null && isTaskRepoContext(result.context)) {\n return { context: result.context as RepoContext, resolvedVia: \"remote\" };\n }\n return {\n context: null,\n error: result.error ?? \"遠程 Repo 上下文無效\",\n failureReason: result.failureReason ?? \"REMOTE_REPO_LOAD_FAILED\",\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(\"從 Supabase 加載 Repo 失敗\", {\n topic: \"repo\",\n data: { taskTypeKey, error: message },\n });\n return { context: null, error: message, failureReason: \"REMOTE_REPO_LOAD_FAILED\" };\n }\n};\n\n/** Register an in-process TaskRepoContext (highest priority — no Supabase fetch). */\nfunction registerLocalRepoContext(taskTypeKey: string, context: TaskRepoContext): void {\n if (!isTaskRepoContext(context)) {\n throw new Error(\"[RepoManager] Invalid TaskRepoContext\");\n }\n localRepoRegistry.set(taskTypeKey, { kind: \"context\", context });\n}\n\n/** Register a local ESM module path; loaded via dynamic import when the task runs. */\nfunction registerLocalModule(taskTypeKey: string, modulePath: string, exportName?: string): void {\n if (modulePath.trim() === \"\") {\n throw new Error(\"[RepoManager] modulePath must not be empty\");\n }\n localRepoRegistry.set(taskTypeKey, { kind: \"modulePath\", modulePath, exportName });\n}\n\nfunction unregisterLocalRepo(taskTypeKey: string): void {\n localRepoRegistry.delete(taskTypeKey);\n}\n\nfunction hasLocalRepo(taskTypeKey: string): boolean {\n return localRepoRegistry.has(taskTypeKey);\n}\n\nfunction getRegisteredLocalTaskTypeKeys(): string[] {\n return [...localRepoRegistry.keys()];\n}\n\nfunction clearRemoteContextCache(): void {\n remoteContextCache.clear();\n}\n\nconst RepoManager = {\n getRepoContext,\n registerLocalRepoContext,\n registerLocalModule,\n unregisterLocalRepo,\n hasLocalRepo,\n getRegisteredLocalTaskTypeKeys,\n clearRemoteContextCache,\n clearRepoScriptModuleCache,\n};\n\nexport { RepoManager };\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { RepoManager } from \"../repo/repo-manager\";\nimport {\n importJsConfigModule,\n pathExists,\n resolveFirstExistingPath,\n resolvePathFromBaseDir,\n resolvePathFromConfigFile,\n} from \"../shared/utils/config-path.utils\";\nimport {\n type BootstrapLocalTasksResult,\n TASK_LOCAL_PACKAGE_CONFIG_FILENAME,\n TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH,\n TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH,\n type TaskLocalPackageConfig,\n type TaskRunnerRootConfig,\n} from \"./task-repo-context\";\n\nexport interface BootstrapLocalTasksOptions {\n /** Absolute or cwd-relative path to root config; if omitted, tries default paths under `cwd` */\n rootConfigPath?: string;\n /** Base directory for resolving root config (default `process.cwd()`) */\n cwd?: string;\n /**\n * When set with an unchanged config fingerprint, skip full scan if this key is already\n * registered in {@link RepoManager}.\n */\n forTaskTypeKey?: string;\n}\n\nconst EMPTY_RESULT: BootstrapLocalTasksResult = {\n status: \"not_configured\",\n registered: [],\n skipped: [],\n errors: [],\n};\n\ntype BootstrapCacheState = {\n fingerprint: string | null;\n lastResult: BootstrapLocalTasksResult | null;\n};\n\nlet bootstrapCache: BootstrapCacheState = { fingerprint: null, lastResult: null };\nlet bootstrapInFlight: Promise<BootstrapLocalTasksResult> | null = null;\n\nfunction parseRootConfig(raw: unknown, configPath: string): TaskRunnerRootConfig {\n if (raw == null || typeof raw !== \"object\") {\n throw new Error(`Root config must export an object: ${configPath}`);\n }\n const record = raw as Record<string, unknown>;\n const taskDir = record.taskDir;\n if (typeof taskDir !== \"string\" || taskDir.trim() === \"\") {\n throw new Error(`Root config.taskDir must be a non-empty string: ${configPath}`);\n }\n return { taskDir: taskDir.trim() };\n}\n\nfunction parseTaskPackageConfig(raw: unknown, configPath: string): TaskLocalPackageConfig {\n if (raw == null || typeof raw !== \"object\") {\n throw new Error(`Task config must export an object: ${configPath}`);\n }\n const record = raw as Record<string, unknown>;\n const taskTypeKey = record.taskTypeKey;\n const entry = record.entry;\n\n if (typeof taskTypeKey !== \"string\" || taskTypeKey.trim() === \"\") {\n throw new Error(`taskTypeKey must be a non-empty string: ${configPath}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`entry must be a non-empty string: ${configPath}`);\n }\n\n return {\n taskTypeKey: taskTypeKey.trim(),\n entry: entry.trim(),\n exportName: typeof record.exportName === \"string\" ? record.exportName : undefined,\n displayName: typeof record.displayName === \"string\" ? record.displayName : undefined,\n enabled: record.enabled !== false,\n };\n}\n\nfunction finalizeStatus(result: Omit<BootstrapLocalTasksResult, \"status\">): BootstrapLocalTasksResult[\"status\"] {\n if (result.errors.length > 0 && result.registered.length === 0) {\n return \"failed\";\n }\n if (result.registered.length === 0) {\n return \"empty\";\n }\n return \"loaded\";\n}\n\nasync function computeConfigFingerprint(rootConfigPath: string, tasksRoot: string): Promise<string> {\n const rootStat = await stat(rootConfigPath);\n const tasksRootStat = await stat(tasksRoot);\n const entries = await readdir(tasksRoot, { withFileTypes: true });\n const configMtims: number[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const configPath = join(tasksRoot, entry.name, TASK_LOCAL_PACKAGE_CONFIG_FILENAME);\n if (await pathExists(configPath)) {\n const configStat = await stat(configPath);\n configMtims.push(configStat.mtimeMs);\n }\n }\n\n configMtims.sort((a, b) => a - b);\n return `${rootConfigPath}:${rootStat.mtimeMs}:${tasksRoot}:${tasksRootStat.mtimeMs}:${configMtims.join(\",\")}`;\n}\n\nfunction canUseCachedBootstrap(\n fingerprint: string,\n forTaskTypeKey: string | undefined,\n): BootstrapLocalTasksResult | null {\n if (bootstrapCache.fingerprint !== fingerprint || bootstrapCache.lastResult == null) {\n return null;\n }\n\n if (forTaskTypeKey != null && forTaskTypeKey !== \"\") {\n if (!RepoManager.hasLocalRepo(forTaskTypeKey)) {\n return null;\n }\n }\n\n return { ...bootstrapCache.lastResult, cached: true };\n}\n\nasync function runBootstrapScan(options: BootstrapLocalTasksOptions): Promise<BootstrapLocalTasksResult> {\n const cwd = options.cwd ?? process.cwd();\n\n const rootConfigPath = await resolveFirstExistingPath(cwd, {\n explicitPath: options.rootConfigPath,\n candidatePaths: [TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH, TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH],\n });\n if (rootConfigPath == null) {\n const result: BootstrapLocalTasksResult = {\n ...EMPTY_RESULT,\n message: `No root config (tried ${TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH}, ${TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH})`,\n };\n bootstrapCache = { fingerprint: null, lastResult: result };\n return result;\n }\n\n const result: Omit<BootstrapLocalTasksResult, \"status\"> = {\n registered: [],\n skipped: [],\n errors: [],\n };\n\n try {\n const rootRaw = await importJsConfigModule(rootConfigPath);\n const { taskDir } = parseRootConfig(rootRaw, rootConfigPath);\n\n const tasksRoot = resolvePathFromConfigFile(rootConfigPath, taskDir);\n if (!(await pathExists(tasksRoot))) {\n const failed: BootstrapLocalTasksResult = {\n status: \"failed\",\n message: `taskDir does not exist: ${tasksRoot}`,\n ...result,\n };\n bootstrapCache = { fingerprint: null, lastResult: failed };\n return failed;\n }\n\n const fingerprint = await computeConfigFingerprint(rootConfigPath, tasksRoot);\n const cached = canUseCachedBootstrap(fingerprint, options.forTaskTypeKey);\n if (cached != null) {\n return cached;\n }\n\n const entries = await readdir(tasksRoot, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const taskPackageDir = join(tasksRoot, entry.name);\n const taskConfigPath = join(taskPackageDir, TASK_LOCAL_PACKAGE_CONFIG_FILENAME);\n\n if (!(await pathExists(taskConfigPath))) {\n result.skipped.push({ taskDir: taskPackageDir, reason: \"missing task.config.js\" });\n continue;\n }\n\n try {\n const taskRaw = await importJsConfigModule(taskConfigPath);\n const taskConfig = parseTaskPackageConfig(taskRaw, taskConfigPath);\n\n if (taskConfig.enabled === false) {\n result.skipped.push({ taskDir: taskPackageDir, reason: \"disabled in task.config.js\" });\n continue;\n }\n\n const entryPath = resolvePathFromBaseDir(taskPackageDir, taskConfig.entry);\n if (!(await pathExists(entryPath))) {\n throw new Error(`entry module not found: ${entryPath}`);\n }\n\n RepoManager.registerLocalModule(taskConfig.taskTypeKey, entryPath, taskConfig.exportName);\n result.registered.push(taskConfig.taskTypeKey);\n } catch (error) {\n result.errors.push({\n taskDir: taskPackageDir,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const status = finalizeStatus(result);\n const finalResult: BootstrapLocalTasksResult = {\n status,\n message: status === \"empty\" ? `Root config loaded but no tasks registered under ${tasksRoot}` : undefined,\n ...result,\n };\n bootstrapCache = { fingerprint, lastResult: finalResult };\n return finalResult;\n } catch (error) {\n const failed: BootstrapLocalTasksResult = {\n status: \"failed\",\n message: error instanceof Error ? error.message : String(error),\n ...result,\n };\n bootstrapCache = { fingerprint: null, lastResult: failed };\n return failed;\n }\n}\n\n/**\n * Discover local task packages from config files and register them with {@link RepoManager}.\n *\n * **Never throws** for missing root config — returns `{ status: \"not_configured\" }`.\n *\n * Re-scans are skipped when the config fingerprint is unchanged (root config + taskDir mtimes).\n * Concurrent calls share a single in-flight scan (single-flight).\n *\n * Host app layout (recommended):\n * ```\n * ./config/task.config.js → { taskDir: \"../tasks\" }\n * ./tasks/my-task/task.config.js\n * ./tasks/my-task/index.mjs\n * ```\n *\n * `taskDir` / `entry` paths are relative to **their config file's directory** (see config-file-relative-paths skill).\n *\n * Legacy fallback: `./task.config.js` at project root (`taskDir: \"./tasks\"`).\n */\nexport async function bootstrapLocalTasks(\n options: BootstrapLocalTasksOptions = {},\n): Promise<BootstrapLocalTasksResult> {\n if (bootstrapInFlight != null) {\n return bootstrapInFlight;\n }\n\n bootstrapInFlight = runBootstrapScan(options).finally(() => {\n bootstrapInFlight = null;\n });\n return bootstrapInFlight;\n}\n\n/** Clear fingerprint cache (tests / hot-reload tooling). */\nexport function clearBootstrapLocalTasksCache(): void {\n bootstrapCache = { fingerprint: null, lastResult: null };\n bootstrapInFlight = null;\n}\n\nexport function getRegisteredLocalTaskTypeKeys(): string[] {\n return RepoManager.getRegisteredLocalTaskTypeKeys();\n}\n\nexport { TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH };\n","import { type RepoContextFailureReason, RepoManager } from \"../repo/repo-manager\";\nimport type { LoggerWithScope } from \"../shared/log\";\nimport { type BootstrapLocalTasksOptions, bootstrapLocalTasks } from \"./local-task-registry\";\nimport { ResultCode } from \"./task.interface\";\nimport type { TaskRepoContext } from \"./task-repo-context\";\n\nexport type TaskRepoValidationFailureReason =\n | \"MISSING_PARAMS\"\n | RepoContextFailureReason\n | \"PARAMS_VALIDATION_FAILED\"\n | \"TASK_TYPE_KEY_MISMATCH\";\n\nexport type ValidateTaskRepoAndParamsInput = {\n logger: LoggerWithScope;\n taskTypeKey: string;\n params: unknown;\n /**\n * When true, run {@link bootstrapLocalTasks} before resolve (CLI / Trigger / postTaskWithValidation).\n * Worker paths should omit — {@link TaskManager.registerTasks} already bootstrapped.\n */\n bootstrapLocal?: boolean;\n bootstrapLocalOptions?: BootstrapLocalTasksOptions;\n /**\n * When false, do not fetch Repo from Supabase if the task type is not locally registered.\n * Default `true`. Align with {@link RegisterTasksOptions.includeRemote}.\n */\n includeRemote?: boolean;\n};\n\nexport type ValidateTaskRepoAndParamsFailure = {\n isValid: false;\n code: ResultCode;\n message: string;\n reason: TaskRepoValidationFailureReason;\n step: string;\n};\n\nexport type ValidateTaskRepoAndParamsSuccess = {\n isValid: true;\n repoContext: TaskRepoContext;\n};\n\nexport type ValidateTaskRepoAndParamsResult = ValidateTaskRepoAndParamsFailure | ValidateTaskRepoAndParamsSuccess;\n\nfunction validateTaskParams(\n validator: TaskRepoContext[\"taskParamsValidator\"],\n taskParams: unknown,\n logger: LoggerWithScope,\n): boolean {\n try {\n return validator(taskParams) === true;\n } catch (error) {\n logger.warn(\"taskParamsValidator 拋出異常\", {\n topic: \"task\",\n data: { error: error instanceof Error ? error.message : error },\n });\n return false;\n }\n}\n\nfunction invalid(params: {\n reason: TaskRepoValidationFailureReason;\n code: ResultCode;\n message: string;\n step: string;\n}): ValidateTaskRepoAndParamsFailure {\n return { isValid: false, ...params };\n}\n\n/**\n * Resolve task Repo context and validate `params` via `taskParamsValidator`.\n *\n * Repo resolution uses {@link RepoManager.getRepoContext}:\n * local registry first; when no local entry and `includeRemote`, loads from Supabase.\n */\nasync function validateTaskRepoAndParams({\n logger,\n taskTypeKey,\n params,\n bootstrapLocal = false,\n bootstrapLocalOptions,\n includeRemote = true,\n}: ValidateTaskRepoAndParamsInput): Promise<ValidateTaskRepoAndParamsResult> {\n if (params == null) {\n return invalid({\n reason: \"MISSING_PARAMS\",\n code: ResultCode.PARAMS_NOT_VALID,\n message: \"任務缺少 params\",\n step: \"params\",\n });\n }\n\n if (bootstrapLocal) {\n const bootstrap = await bootstrapLocalTasks({\n ...bootstrapLocalOptions,\n forTaskTypeKey: taskTypeKey,\n });\n logger.debug(\"本地任務 bootstrap 完成\", {\n topic: \"task\",\n data: {\n taskTypeKey,\n step: \"local_bootstrap\",\n status: bootstrap.status,\n registered: bootstrap.registered,\n cached: bootstrap.cached ?? false,\n message: bootstrap.message,\n },\n });\n }\n\n logger.debug(\"開始解析 Repo 上下文\", {\n topic: \"task\",\n data: { taskTypeKey, step: \"repo_load\", includeRemote },\n });\n\n const {\n context: repoContext,\n error: repoError,\n failureReason,\n resolvedVia,\n } = await RepoManager.getRepoContext<TaskRepoContext>({\n logger,\n taskTypeKey,\n includeRemote,\n });\n\n if (repoContext == null) {\n return invalid({\n reason: failureReason ?? \"REMOTE_REPO_LOAD_FAILED\",\n code: ResultCode.REPO_NOT_VALID,\n message: repoError ?? \"無法加載 Repo 上下文\",\n step: \"repo_load\",\n });\n }\n\n logger.debug(\"Repo 上下文解析完成\", {\n topic: \"task\",\n data: { taskTypeKey, step: \"repo_load\", resolvedVia },\n });\n\n if (repoContext.taskFn.taskTypeKey !== taskTypeKey) {\n return invalid({\n reason: \"TASK_TYPE_KEY_MISMATCH\",\n code: ResultCode.REPO_NOT_VALID,\n message: `taskFn.taskTypeKey (${repoContext.taskFn.taskTypeKey}) 與 task.value (${taskTypeKey}) 不一致`,\n step: \"task_type_key\",\n });\n }\n\n logger.debug(\"開始校驗任務參數\", { topic: \"task\", data: { taskTypeKey, step: \"params_validation\" } });\n if (!validateTaskParams(repoContext.taskParamsValidator, params, logger)) {\n return invalid({\n reason: \"PARAMS_VALIDATION_FAILED\",\n code: ResultCode.PARAMS_NOT_VALID,\n message: \"任務參數校驗失敗\",\n step: \"params_validation\",\n });\n }\n\n logger.debug(\"任務參數校驗通過\", { topic: \"task\", data: { taskTypeKey, step: \"params_validation\" } });\n\n return { isValid: true, repoContext };\n}\n\nconst TaskRepoValidation = {\n validate: validateTaskRepoAndParams,\n};\n\nexport { TaskRepoValidation, validateTaskRepoAndParams };\n","import { getScanRemoteRepoValues } from \"../repo/repo.api\";\nimport { TASK_REPO_USAGE } from \"../repo/repo.interface\";\nimport type { LoggerWithScope } from \"../shared/log\";\nimport type { ResultCode, Task } from \"./task.interface\";\nimport type { ExecutableTaskFn, TaskFn } from \"./task-repo-context\";\n\nexport type {\n BootstrapLocalTasksResult,\n BootstrapLocalTasksStatus,\n ExecutableTaskFn,\n TaskFn,\n TaskLocalPackageConfig,\n TaskRepoContext,\n TaskRepoScriptDetails,\n TaskRepoScriptRecord,\n TaskRunnerRootConfig,\n TaskRunResult,\n} from \"./task-repo-context\";\nexport {\n TASK_LOCAL_PACKAGE_CONFIG_FILENAME,\n TASK_REPO_SCRIPT_CATEGORY,\n TASK_RUNNER_CONFIG_DIR,\n TASK_RUNNER_ROOT_CONFIG_FILENAME,\n TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH,\n TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH,\n} from \"./task-repo-context\";\n\nimport {\n type BootstrapLocalTasksOptions,\n bootstrapLocalTasks,\n clearBootstrapLocalTasksCache,\n getRegisteredLocalTaskTypeKeys,\n} from \"./local-task-registry\";\nimport { LOG_TOPIC_TASK } from \"./task.constant\";\nimport type { BootstrapLocalTasksResult } from \"./task-repo-context\";\nimport { TaskRepoValidation, type TaskRepoValidationFailureReason } from \"./task-repo-validation\";\n\nexport type {\n TaskRepoValidationFailureReason,\n ValidateTaskRepoAndParamsInput,\n ValidateTaskRepoAndParamsResult,\n} from \"./task-repo-validation\";\nexport { TaskRepoValidation } from \"./task-repo-validation\";\n\nexport interface PrepareTaskResponse {\n isSuccess: boolean;\n taskFn: ExecutableTaskFn | null;\n code?: ResultCode;\n message?: string;\n reason?: TaskRepoValidationFailureReason;\n /** Pipeline step for log aggregation */\n step?: string;\n}\n\nexport interface PrepareTaskParams {\n logger: LoggerWithScope;\n task: Task;\n /**\n * When false, do not fetch Repo from Supabase during validation.\n * Should match {@link RegisterTasksOptions.includeRemote} on the worker.\n */\n includeRemote?: boolean;\n bootstrapLocalOptions?: BootstrapLocalTasksOptions;\n}\n\nexport interface RegisterTasksOptions {\n logger: LoggerWithScope;\n local?: BootstrapLocalTasksOptions;\n /** When `true` (default), union local keys with remote `Repo.value` from Supabase. */\n includeRemote?: boolean;\n}\n\nexport interface RegisterTasksResult {\n availableTaskList: string[];\n local: BootstrapLocalTasksResult;\n remote: { values: string[] };\n includeRemote: boolean;\n}\n\nfunction logLocalBootstrap(logger: LoggerWithScope, bootstrap: BootstrapLocalTasksResult): void {\n switch (bootstrap.status) {\n case \"not_configured\":\n logger.info(\"未找到本地任務配置,跳過本地註冊\", {\n topic: LOG_TOPIC_TASK,\n data: { message: bootstrap.message },\n });\n break;\n case \"failed\":\n logger.warn(\"本地任務註冊失敗\", {\n topic: LOG_TOPIC_TASK,\n data: { message: bootstrap.message, errors: bootstrap.errors },\n });\n break;\n case \"empty\":\n logger.info(\"本地任務掃描完成,無已註冊任務\", {\n topic: LOG_TOPIC_TASK,\n data: { message: bootstrap.message, skipped: bootstrap.skipped },\n });\n break;\n case \"loaded\":\n logger.info(\"本地任務註冊完成\", {\n topic: LOG_TOPIC_TASK,\n data: {\n registered: bootstrap.registered,\n skipped: bootstrap.skipped,\n errors: bootstrap.errors,\n },\n });\n break;\n }\n}\n\n/**\n * Worker startup: discover local task packages + remote Repo rows, merge into `availableTaskList`.\n *\n * - Local: {@link bootstrapLocalTasks} → registers modules in {@link RepoManager}\n * - Remote: {@link getScanRemoteRepoValues} with {@link TASK_REPO_USAGE}\n * - Merge: union of both; execution still prefers local registry in {@link RepoManager.getRepoContext}\n *\n * @throws When merged list is empty (no task types to claim).\n */\nasync function registerTasks({\n logger,\n local: localOptions,\n includeRemote = true,\n}: RegisterTasksOptions): Promise<RegisterTasksResult> {\n logger.debug(\"開始註冊任務(本地 + 遠程)\", { topic: LOG_TOPIC_TASK });\n\n const local = await bootstrapLocalTasks(localOptions ?? {});\n logLocalBootstrap(logger, local);\n\n let remoteValues: string[] = [];\n if (includeRemote) {\n logger.debug(\"查詢遠程 Repo 列表\", {\n topic: LOG_TOPIC_TASK,\n data: { usage: TASK_REPO_USAGE },\n });\n const { data, error: remoteError } = await getScanRemoteRepoValues({ usage: TASK_REPO_USAGE });\n if (remoteError) {\n throw new Error(remoteError.message);\n }\n remoteValues = data ?? [];\n logger.debug(\"遠程 Repo 查詢完成\", {\n topic: LOG_TOPIC_TASK,\n data: { count: remoteValues.length, values: remoteValues },\n });\n }\n\n const availableTaskList = [...new Set([...local.registered, ...remoteValues])];\n if (availableTaskList.length === 0) {\n throw new Error(\"任務註冊失敗:本地與遠程均無可用任務類型\");\n }\n\n logger.success(\"任務註冊完成\", {\n topic: LOG_TOPIC_TASK,\n data: {\n availableTaskList,\n localRegistered: local.registered,\n remoteValues,\n },\n });\n\n return {\n availableTaskList,\n local,\n remote: { values: remoteValues },\n includeRemote,\n };\n}\n\n/** 将 taskFn 与 params 闭包绑定,供 TaskNode 无参调用 `await taskFn()` */\nfunction bindTaskFn(taskFn: TaskFn, taskParams: unknown): ExecutableTaskFn {\n const run = async () => taskFn(taskParams);\n return Object.assign(run, {\n displayName: taskFn.displayName,\n taskTypeKey: taskFn.taskTypeKey,\n });\n}\n\n/**\n * 將 Supabase 認領到的 Task 解析為可執行的 `ExecutableTaskFn`。\n *\n * 流程:\n * 1. 從 task.details 取出 `params`;`task.value` 作為 taskTypeKey(同 {@link Repo.value})\n * 2. {@link TaskRepoValidation.validate} — 本地註冊優先;未命中時可選遠端(`includeRemote`)\n * Worker 在 registry 未命中時會補掃本地(`local_bootstrap_on_miss`)\n * 3. bindTaskFn,返回閉包後的無參執行函數\n *\n * 失敗時返回 `{ isSuccess: false, code, message, reason, step }`(不 throw)。\n */\nconst prepareTask = async ({\n logger,\n task,\n includeRemote = true,\n bootstrapLocalOptions,\n}: PrepareTaskParams): Promise<PrepareTaskResponse> => {\n const fail = (params: {\n reason: TaskRepoValidationFailureReason;\n code: ResultCode;\n message: string;\n step: string;\n }): PrepareTaskResponse => {\n logger.warn(params.message, {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskTypeKey: task.value,\n reason: params.reason,\n step: params.step,\n },\n });\n return {\n isSuccess: false,\n taskFn: null,\n code: params.code,\n message: params.message,\n reason: params.reason,\n step: params.step,\n };\n };\n\n const { id: taskId, name: taskName, value: taskTypeKey, details } = task;\n logger.debug(`開始準備任務 ${taskName}-${taskTypeKey}`, {\n topic: LOG_TOPIC_TASK,\n data: { taskId, taskName, taskTypeKey },\n });\n\n const { params: taskParams } = details;\n\n if (!getRegisteredLocalTaskTypeKeys().includes(taskTypeKey)) {\n const bootstrap = await bootstrapLocalTasks({\n ...bootstrapLocalOptions,\n forTaskTypeKey: taskTypeKey,\n });\n logger.debug(\"本地 registry 未命中,補掃本地任務\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId,\n taskTypeKey,\n step: \"local_bootstrap_on_miss\",\n status: bootstrap.status,\n registered: bootstrap.registered,\n cached: bootstrap.cached ?? false,\n message: bootstrap.message,\n },\n });\n }\n\n const validation = await TaskRepoValidation.validate({\n logger,\n taskTypeKey,\n params: taskParams,\n includeRemote,\n });\n if (!validation.isValid) {\n return fail({\n reason: validation.reason,\n code: validation.code,\n message: validation.message,\n step: validation.step,\n });\n }\n\n const { repoContext } = validation;\n\n logger.debug(\"Repo 上下文加載成功\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskTypeKey,\n taskFnDisplayName: repoContext.taskFn.displayName,\n step: \"repo_load\",\n },\n });\n\n const boundTaskFn = bindTaskFn(repoContext.taskFn, taskParams);\n logger.debug(\"任務準備完成\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId,\n taskTypeKey,\n displayName: boundTaskFn.displayName,\n step: \"bind\",\n },\n });\n\n return {\n isSuccess: true,\n taskFn: boundTaskFn,\n };\n};\n\nconst TaskManager = {\n registerTasks,\n prepareTask,\n bootstrapLocalTasks,\n getRegisteredLocalTaskTypeKeys,\n clearBootstrapLocalTasksCache,\n};\n\nexport { TaskManager };\n","import { isOptimisticLockResponse } from \"../core.api\";\nimport { BaseNodeRuntime, LOG_TOPIC_NODE, type NodeLoopContext } from \"../node/node-runtime.base\";\nimport { createLogger, createScope, type LoggerWithScope, withModule } from \"../shared/log\";\nimport { getErrorMessage, toError } from \"../shared/utils/error.utils\";\nimport { patchChangeTaskStatus, patchClaimTask } from \"./task.api\";\nimport { CRITICAL_UNKNOWN_TASK_TRACE_ID, LOG_TOPIC_TASK } from \"./task.constant\";\nimport { TaskStatusAction } from \"./task.interface\";\nimport { TaskManager, type TaskRunResult } from \"./task-manager\";\n\n/**\n * Task worker node: commands → heartbeat → claim & execute tasks.\n * Built on {@link BaseNodeRuntime}.\n */\nclass TaskNode extends BaseNodeRuntime {\n private _availableTaskList: string[] = [];\n private _includeRemote = true;\n\n get availableTaskList(): readonly string[] {\n return [...this._availableTaskList];\n }\n\n constructor() {\n super(\"taskNode\");\n }\n\n protected async onBeforeRegisterNode(logger: LoggerWithScope): Promise<void> {\n const { availableTaskList, includeRemote } = await TaskManager.registerTasks({ logger });\n this._availableTaskList = availableTaskList;\n this._includeRemote = includeRemote;\n }\n\n protected async runLoopSteps(ctx: NodeLoopContext, heartbeatOk: boolean): Promise<void> {\n if (!heartbeatOk) {\n const logger = createLogger({\n scope: createScope({\n module: `${this.runtimeModule}-runLoopSteps`,\n traceId: ctx.loopTraceId,\n labels: { nodeId: ctx.nodeId },\n }),\n });\n logger.warn(\"心跳失敗,本輪跳過任務認領\", { topic: LOG_TOPIC_NODE });\n return;\n }\n await this.runAsWorker(ctx);\n }\n\n private async runAsWorker(ctx: NodeLoopContext): Promise<void> {\n const { loopTraceId, nodeId } = ctx;\n const loopScope = createScope({ module: \"runAsWorker\", traceId: loopTraceId, labels: { nodeId } });\n const logger = createLogger({ scope: loopScope });\n\n const availableTaskList = this.availableTaskList;\n if (availableTaskList.length === 0) {\n logger.warn(\"未配置可認領任務類型,跳過本輪\", { topic: LOG_TOPIC_TASK });\n return;\n }\n\n logger.debug(\"向 Supabase 認領任務\", {\n topic: LOG_TOPIC_TASK,\n data: { availableTaskList },\n });\n const { data: task, error: claimError } = await patchClaimTask({\n nodeId,\n availableTaskList: [...availableTaskList],\n traceId: loopTraceId,\n });\n if (claimError) {\n if (isOptimisticLockResponse(claimError)) {\n logger.debug(\"認領競爭失敗,本輪無可認領任務\", {\n topic: LOG_TOPIC_TASK,\n data: { availableTaskList },\n });\n return;\n }\n logger.error(\"認領任務失敗\", {\n topic: LOG_TOPIC_TASK,\n data: {\n availableTaskList,\n error: claimError.message,\n code: claimError.code,\n },\n });\n return;\n }\n if (task == null) {\n logger.debug(\"本輪無匹配的 TODO 任務\", {\n topic: LOG_TOPIC_TASK,\n data: { availableTaskList },\n });\n return;\n }\n\n const taskTraceId = task.details.traceId ?? CRITICAL_UNKNOWN_TASK_TRACE_ID;\n const taskScope = createScope({\n module: \"runAsWorker\",\n traceId: loopTraceId,\n labels: { nodeId },\n traceParentId: taskTraceId,\n });\n const taskLogger = createLogger({ scope: taskScope });\n taskLogger.success(\"認領任務成功,準備執行\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskName: task.name,\n taskTypeKey: task.value,\n taskStatus: task.details.status,\n },\n });\n\n const prepareLogger = createLogger({ scope: withModule(taskScope, \"prepareTask\") });\n const prepareResult = await TaskManager.prepareTask({\n logger: prepareLogger,\n task,\n includeRemote: this._includeRemote,\n });\n const { isSuccess: isPrepareSuccess, taskFn, code, message, reason, step } = prepareResult;\n if (!isPrepareSuccess || taskFn == null) {\n prepareLogger.critical(\"任務準備失敗,無法繼續執行,中止任務並 RESET 為 OPEN\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskTypeKey: task.value,\n code,\n message,\n reason,\n step,\n },\n });\n await this.abortTaskRun({\n logger: prepareLogger,\n taskId: task.id,\n nodeId,\n traceId: taskTraceId,\n });\n return;\n }\n logger.success(\"任務準備完成\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskName: task.name,\n taskTypeKey: task.value,\n displayName: taskFn.displayName,\n },\n });\n\n const executeLogger = createLogger({ scope: withModule(taskScope, \"executeTask\") });\n const onExecuteAbort = async (error?: Error) => {\n executeLogger.critical(\"任務執行遇到未知錯誤,中止任務並 RESET 為 OPEN\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskTypeKey: task.value,\n taskName: task.name,\n displayName: taskFn.displayName,\n error: getErrorMessage(error),\n },\n });\n await this.abortTaskRun({\n logger: executeLogger,\n taskId: task.id,\n nodeId,\n traceId: taskTraceId,\n });\n };\n\n executeLogger.info(\"開始執行業務邏輯\", {\n topic: LOG_TOPIC_TASK,\n data: { taskId: task.id, displayName: taskFn.displayName },\n });\n const startTime = Date.now();\n let result: TaskRunResult | null = null;\n try {\n result = await taskFn();\n } catch (error) {\n await onExecuteAbort(toError(error));\n return;\n }\n if (result == null) {\n await onExecuteAbort(new Error(\"任務執行結果為空\"));\n return;\n }\n\n const { isSuccess: isTaskSuccess, cost, extra } = result ?? { isSuccess: false, cost: 0, extra: null };\n if (isTaskSuccess) {\n await this.finalizeTaskRun(\"success\", {\n logger: executeLogger,\n taskId: task.id,\n taskTypeKey: task.value,\n nodeId,\n cost,\n extra,\n traceId: taskTraceId,\n });\n } else {\n await this.finalizeTaskRun(\"failure\", {\n logger: executeLogger,\n taskId: task.id,\n taskTypeKey: task.value,\n nodeId,\n cost,\n extra,\n traceId: taskTraceId,\n });\n }\n const duration = Date.now() - startTime;\n executeLogger.info(\"業務邏輯執行結束\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskName: task.name,\n taskTypeKey: task.value,\n displayName: taskFn.displayName,\n durationMs: duration,\n },\n });\n }\n\n private async abortTaskRun(params: {\n logger: LoggerWithScope;\n taskId: string;\n nodeId: string;\n traceId: string;\n extra?: TaskRunResult[\"extra\"];\n }): Promise<boolean> {\n const { logger, taskId, nodeId, traceId, extra } = params;\n const logData = { taskId, nodeId };\n const extraValue = typeof extra === \"string\" ? extra : undefined;\n\n const { error } = await patchChangeTaskStatus({\n id: taskId,\n action: TaskStatusAction.RESET,\n nodeId,\n extra: extraValue,\n traceId,\n });\n\n if (error) {\n logger.error(error.message, { topic: LOG_TOPIC_TASK, data: logData });\n return false;\n }\n logger.info(\"任務已中止並 RESET 為 OPEN\", { topic: LOG_TOPIC_TASK, data: logData });\n return true;\n }\n\n private async finalizeTaskRun(\n outcome: \"success\" | \"failure\",\n params: {\n logger: LoggerWithScope;\n taskId: string;\n taskTypeKey: string;\n nodeId: string;\n cost: TaskRunResult[\"cost\"];\n extra: TaskRunResult[\"extra\"];\n traceId: string;\n },\n ): Promise<void> {\n const { logger, taskId, nodeId, taskTypeKey, cost, extra, traceId } = params;\n const outcomePrefix = outcome === \"success\" ? \"任務成功\" : \"任務失敗\";\n const logData = {\n taskTypeKey,\n taskId,\n nodeId,\n ...(extra != null && extra !== \"\" ? { extra } : {}),\n };\n const extraValue = typeof extra === \"string\" ? extra : undefined;\n\n const { error: changeTaskStatusError } =\n outcome === \"success\"\n ? await patchChangeTaskStatus({\n id: taskId,\n action: TaskStatusAction.FINISH,\n nodeId,\n cost,\n extra: extraValue,\n traceId,\n })\n : await patchChangeTaskStatus({\n id: taskId,\n action: TaskStatusAction.RESET,\n nodeId,\n extra: extraValue,\n traceId,\n });\n\n if (changeTaskStatusError) {\n const upperMessage = `${outcomePrefix}但是更新 TaskStatus 失敗,產生孤兒 Task,請儘快排查問題`;\n logger.critical(upperMessage, { topic: LOG_TOPIC_TASK, data: logData });\n // TODO: 需要處理孤兒 Task\n throw new Error(upperMessage);\n }\n logger.info(\"更新 TaskStatus 成功\", { topic: LOG_TOPIC_TASK, data: logData });\n if (outcome === \"success\") {\n logger.success(\"任務執行結束,業務邏輯成功\", { topic: LOG_TOPIC_TASK, data: logData });\n } else {\n logger.warn(\"任務執行結束,業務邏輯失敗\", { topic: LOG_TOPIC_TASK, data: logData });\n }\n }\n}\n\nexport { TaskNode };\n","import { validateWithSchema } from \"../core.api\";\nimport { generateResponse, type SupabaseResponse } from \"../core.interface\";\nimport { createLogger, logManager } from \"../shared/log\";\nimport type { Task } from \"./task.interface\";\nimport { createTaskRow, postTaskSchema } from \"./task-post.api\";\nimport { TaskRepoValidation } from \"./task-repo-validation\";\n\n/**\n * Create a task row with publish-time Repo + params validation.\n * **Node entry only** — requires local Repo bootstrap and {@link TaskRepoValidation}.\n *\n * @see target-supabase-sdk/node\n */\nexport const postTaskWithValidation = validateWithSchema(\n postTaskSchema,\n \"postTaskSchema\",\n)(async ({ name, value, params, taskStatus, tagList, extra, traceId, traceParentId }) => {\n const taskTraceId = traceId?.trim() || logManager.generateTraceId();\n const logger = createLogger({\n module: \"postTaskWithValidation\",\n traceId: taskTraceId,\n traceParentId: traceParentId ?? null,\n });\n\n const validation = await TaskRepoValidation.validate({\n logger,\n taskTypeKey: value,\n params,\n bootstrapLocal: true,\n });\n if (!validation.isValid) {\n logger.warn(validation.message, {\n topic: \"task\",\n data: {\n taskTypeKey: value,\n reason: validation.reason,\n step: validation.step,\n },\n });\n return generateResponse.error(validation.message, undefined, String(validation.code)) as SupabaseResponse<Task>;\n }\n\n return createTaskRow(\n { name, value, params, taskStatus, tagList, extra, traceId, traceParentId, taskTraceId },\n logger,\n );\n});\n","import type { Target } from \"../core.interface\";\nimport type { LoggerWithScope } from \"../shared/log\";\nimport type { TaskStatus } from \"../task/task.interface\";\n\nexport enum CategoryTrigger {\n TRIGGER = \"trigger\",\n}\n\nexport enum TriggerStatus {\n ENABLED = \"ENABLED\",\n DISABLED = \"DISABLED\",\n PAUSED = \"PAUSED\",\n}\n\n/** Phase 1: daily fire at `hour`:`minute` UTC. */\nexport interface TriggerDailySchedule {\n kind: \"daily\";\n hour: number;\n minute: number;\n}\n\nexport type TriggerSchedule = TriggerDailySchedule;\n\nexport interface TriggerPostTaskAction {\n kind: \"post_task\";\n taskTypeKey: string;\n taskParams: unknown;\n taskName?: string;\n taskStatus?: TaskStatus.OPEN | TaskStatus.TODO;\n}\n\nexport type TriggerAction = TriggerPostTaskAction;\n\nexport interface Trigger extends Target {\n /** Human readable */\n name: string;\n /** Unique trigger key */\n value: string;\n details: TriggerDetails;\n category: CategoryTrigger;\n}\n\nexport interface TriggerDetails {\n manifestVersion: number;\n status: TriggerStatus;\n schedule: TriggerSchedule;\n action: TriggerAction;\n lastFiredAt?: number | null;\n /** Idempotency key for the last successful fire, e.g. `daily:2026-06-18` (UTC date). */\n lastFireKey?: string | null;\n}\n\n// ─── TriggerNode local runners ───────────────────────────────────────────────\n\n/** Context passed to each runner invocation. */\nexport interface TriggerRunnerContext {\n loopTraceId: string;\n nodeId: string;\n runnerKey: string;\n logger: LoggerWithScope;\n /** 1-based attempt index within this tick (includes retries). */\n attempt: number;\n maxAttempts: number;\n}\n\nexport type TriggerRunnerFn = (ctx: TriggerRunnerContext) => void | Promise<void>;\n\nexport interface RegisterTriggerRunnerOptions {\n /** Unique runner key within this process (trimmed; must be non-empty). */\n key: string;\n /** Minimum ms between tick starts for this runner. */\n intervalMs: number;\n fn: TriggerRunnerFn;\n /** Delay first run after registration. Default `0`. */\n initialDelayMs?: number;\n /**\n * Extra attempts after the first failure within the same tick.\n * Default {@link TRIGGER_RUNNER_DEFAULT_RETRY_COUNT} from `./trigger.constant`.\n */\n retryCount?: number;\n /**\n * Delay between retry attempts within the same tick (ms).\n * Default {@link TRIGGER_RUNNER_DEFAULT_RETRY_DELAY_MS} (`0` = immediate).\n */\n retryDelayMs?: number;\n /**\n * Max ms per fn invocation; rejects when exceeded.\n * Does not cancel in-flight work — fn may still run after timeout. Omit for no limit.\n */\n timeoutMs?: number;\n}\n\n/** Options for {@link TriggerNode}. */\nexport interface TriggerNodeOptions {\n /**\n * When true, bootstrap aborts if no runners were registered before `start()`.\n * Default `false` (warn and idle loop).\n */\n requireRunners?: boolean;\n}\n","import { z } from \"zod\";\nimport { createTarget, scanTargetList, updateTargetDetails, validateWithSchema } from \"../core.api\";\nimport { generateResponse, type SupabaseResponse } from \"../core.interface\";\nimport { createLogger } from \"../shared/log\";\nimport { TaskStatus } from \"../task/task.interface\";\nimport {\n CategoryTrigger,\n type Trigger,\n type TriggerAction,\n type TriggerSchedule,\n TriggerStatus,\n} from \"./trigger.interface\";\n\nconst TRIGGER_STATUS_FIELD = \"details->>status\" as const;\n\nconst traceIdSchema = z.string().trim().min(1).optional();\n\nconst dailyScheduleSchema = z.object({\n kind: z.literal(\"daily\"),\n hour: z.number().int().min(0).max(23),\n minute: z.number().int().min(0).max(59),\n});\n\nconst postTaskActionSchema = z.object({\n kind: z.literal(\"post_task\"),\n taskTypeKey: z.string().trim().min(1),\n taskParams: z.unknown(),\n taskName: z.string().trim().min(1).optional(),\n taskStatus: z.enum([TaskStatus.OPEN, TaskStatus.TODO]).optional(),\n});\n\nexport const postTriggerSchema = z.object({\n name: z.string().trim().min(1),\n value: z.string().trim().min(1),\n status: z.nativeEnum(TriggerStatus).optional().default(TriggerStatus.ENABLED),\n schedule: dailyScheduleSchema,\n action: postTaskActionSchema,\n tagList: z.array(z.string()).optional().default([]),\n traceId: traceIdSchema,\n});\n\nexport type PostTriggerPayload = z.infer<typeof postTriggerSchema>;\n\nexport const scanEnabledTriggersSchema = z.object({\n traceId: traceIdSchema,\n});\n\nexport type ScanEnabledTriggersPayload = z.infer<typeof scanEnabledTriggersSchema>;\n\nexport const patchTriggerFiredSchema = z.object({\n triggerId: z.string().trim().min(1),\n fireKey: z.string().trim().min(1),\n expectedLastFireKey: z.string().nullable().optional(),\n traceId: traceIdSchema,\n});\n\nexport type PatchTriggerFiredPayload = z.infer<typeof patchTriggerFiredSchema>;\n\nfunction enabledTriggerFilter() {\n return [{ field: TRIGGER_STATUS_FIELD, operator: \"eq\" as const, value: TriggerStatus.ENABLED }];\n}\n\n/** List all ENABLED triggers (Phase 1: in-memory due check). */\nexport const scanEnabledTriggers = validateWithSchema(\n scanEnabledTriggersSchema,\n \"scanEnabledTriggersSchema\",\n)(async ({ traceId }) => {\n const logger = createLogger({ module: \"scanEnabledTriggers\", traceId });\n\n try {\n const { data: triggerList } = await scanTargetList<Trigger>({\n category: CategoryTrigger.TRIGGER,\n filterList: enabledTriggerFilter(),\n orderBy: { field: \"created_at\", ascending: true },\n });\n\n const rows = triggerList ?? [];\n logger.debug(\"已掃描 ENABLED Trigger\", {\n topic: \"trigger\",\n data: { count: rows.length },\n });\n\n return generateResponse.success(rows);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return generateResponse.error(message) as SupabaseResponse<Trigger[]>;\n }\n});\n\n/** Create a trigger row (scheduler / admin). */\nexport const postTrigger = validateWithSchema(\n postTriggerSchema,\n \"postTriggerSchema\",\n)(async ({ name, value, status, schedule, action, tagList, traceId }) => {\n const logger = createLogger({ module: \"postTrigger\", traceId });\n\n const details = {\n manifestVersion: 0,\n status,\n schedule: schedule as TriggerSchedule,\n action: action as TriggerAction,\n lastFiredAt: null,\n lastFireKey: null,\n };\n\n const result = await createTarget<Trigger, PostTriggerPayload>({\n payload: { name, value, status, schedule, action, tagList, traceId },\n createFn: () => ({\n name,\n value,\n category: CategoryTrigger.TRIGGER,\n tagList,\n details,\n }),\n });\n\n logger.info(\"Trigger 已創建\", {\n topic: \"trigger\",\n data: { triggerId: result.data?.id, triggerKey: value, status },\n });\n\n return result;\n});\n\n/**\n * Mark trigger as fired for `fireKey`.\n * When `expectedLastFireKey` is set, uses optimistic lock on that field.\n */\nexport const patchTriggerFired = validateWithSchema(\n patchTriggerFiredSchema,\n \"patchTriggerFiredSchema\",\n)(async ({ triggerId, fireKey, expectedLastFireKey, traceId }) => {\n const logger = createLogger({ module: \"patchTriggerFired\", traceId });\n const now = Date.now();\n\n try {\n const optimisticLockFilterList =\n expectedLastFireKey != null && expectedLastFireKey !== \"\"\n ? [{ field: \"details->>lastFireKey\" as const, operator: \"eq\" as const, value: expectedLastFireKey }]\n : [];\n\n const data = await updateTargetDetails<Trigger, Trigger[\"details\"]>({\n id: triggerId,\n optimisticLockFilterList,\n updateFn: (current) => ({\n ...current,\n lastFireKey: fireKey,\n lastFiredAt: now,\n }),\n });\n\n logger.success(\"Trigger 觸發記錄已更新\", {\n topic: \"trigger\",\n data: { triggerId, fireKey },\n });\n\n return generateResponse.success(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn(\"Trigger 觸發記錄更新失敗\", {\n topic: \"trigger\",\n data: { triggerId, fireKey, error: message },\n });\n return generateResponse.error(message);\n }\n});\n","export const LOG_TOPIC_TRIGGER = \"trigger\";\n\n/** Fixed main-loop interval for {@link TriggerNode} (ms). */\nexport const TRIGGER_LOOP_INTERVAL_MS = 60_000;\n\n/** Default extra retries after first failure within one runner tick. */\nexport const TRIGGER_RUNNER_DEFAULT_RETRY_COUNT = 3;\n\n/** Default delay between retry attempts within the same tick (ms). */\nexport const TRIGGER_RUNNER_DEFAULT_RETRY_DELAY_MS = 0;\n","import type { NodeLoopContext } from \"../node/node-runtime.base\";\nimport { createLogger, createScope, withModule } from \"../shared/log\";\nimport { getErrorMessage } from \"../shared/utils/error.utils\";\nimport {\n LOG_TOPIC_TRIGGER,\n TRIGGER_LOOP_INTERVAL_MS,\n TRIGGER_RUNNER_DEFAULT_RETRY_COUNT,\n TRIGGER_RUNNER_DEFAULT_RETRY_DELAY_MS,\n} from \"./trigger.constant\";\nimport type { RegisterTriggerRunnerOptions, TriggerRunnerContext, TriggerRunnerFn } from \"./trigger.interface\";\n\nexport type { RegisterTriggerRunnerOptions, TriggerRunnerContext, TriggerRunnerFn } from \"./trigger.interface\";\n\ninterface TriggerRunnerState {\n key: string;\n intervalMs: number;\n fn: TriggerRunnerFn;\n retryCount: number;\n retryDelayMs: number;\n timeoutMs: number | undefined;\n nextRunAt: number;\n running: boolean;\n}\n\nconst runnerRegistry = new Map<string, TriggerRunnerState>();\nlet registrationClosed = false;\n\nfunction normalizeRunnerKey(key: string): string {\n const normalized = key.trim();\n if (normalized.length === 0) {\n throw new Error(\"[TriggerManager] key must be a non-empty string\");\n }\n return normalized;\n}\n\nfunction tryNormalizeRunnerKey(key: string): string | null {\n const normalized = key.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction validateRunnerOptions(options: RegisterTriggerRunnerOptions): void {\n if (!Number.isFinite(options.intervalMs) || options.intervalMs < 1) {\n throw new Error(`[TriggerManager] intervalMs must be a positive number, got ${options.intervalMs}`);\n }\n const retryCount = options.retryCount ?? TRIGGER_RUNNER_DEFAULT_RETRY_COUNT;\n if (!Number.isInteger(retryCount) || retryCount < 0) {\n throw new Error(`[TriggerManager] retryCount must be a non-negative integer, got ${retryCount}`);\n }\n const initialDelayMs = options.initialDelayMs ?? 0;\n if (!Number.isFinite(initialDelayMs) || initialDelayMs < 0) {\n throw new Error(`[TriggerManager] initialDelayMs must be a non-negative number, got ${initialDelayMs}`);\n }\n const retryDelayMs = options.retryDelayMs ?? TRIGGER_RUNNER_DEFAULT_RETRY_DELAY_MS;\n if (!Number.isFinite(retryDelayMs) || retryDelayMs < 0) {\n throw new Error(`[TriggerManager] retryDelayMs must be a non-negative number, got ${retryDelayMs}`);\n }\n if (options.timeoutMs != null) {\n if (!Number.isFinite(options.timeoutMs) || options.timeoutMs < 1) {\n throw new Error(`[TriggerManager] timeoutMs must be a positive number when set, got ${options.timeoutMs}`);\n }\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function invokeRunnerFn(\n fn: TriggerRunnerFn,\n ctx: TriggerRunnerContext,\n timeoutMs: number | undefined,\n): Promise<void> {\n if (timeoutMs == null) {\n await fn(ctx);\n return;\n }\n\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutHandle = setTimeout(() => {\n reject(new Error(`Runner timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n try {\n await Promise.race([Promise.resolve(fn(ctx)), timeoutPromise]);\n } finally {\n if (timeoutHandle != null) {\n clearTimeout(timeoutHandle);\n }\n }\n}\n\n/** In-process registry and tick loop for {@link TriggerNode}. */\nexport const TriggerManager = {\n registerRunner(options: RegisterTriggerRunnerOptions): void {\n if (registrationClosed) {\n throw new Error(\"[TriggerManager] Registration closed — call registerRunner before TriggerNode.start()\");\n }\n\n const key = normalizeRunnerKey(options.key);\n validateRunnerOptions(options);\n if (typeof options.fn !== \"function\") {\n throw new Error(`[TriggerManager] fn must be a function (runner key: ${key})`);\n }\n if (runnerRegistry.has(key)) {\n throw new Error(`[TriggerManager] Duplicate runner key: ${key}`);\n }\n\n const now = Date.now();\n runnerRegistry.set(key, {\n key,\n intervalMs: options.intervalMs,\n fn: options.fn,\n retryCount: options.retryCount ?? TRIGGER_RUNNER_DEFAULT_RETRY_COUNT,\n retryDelayMs: options.retryDelayMs ?? TRIGGER_RUNNER_DEFAULT_RETRY_DELAY_MS,\n timeoutMs: options.timeoutMs,\n nextRunAt: now + (options.initialDelayMs ?? 0),\n running: false,\n });\n },\n\n hasRunner(key: string): boolean {\n const normalized = tryNormalizeRunnerKey(key);\n return normalized != null && runnerRegistry.has(normalized);\n },\n\n unregisterRunner(key: string): boolean {\n const normalized = tryNormalizeRunnerKey(key);\n if (normalized == null) {\n return false;\n }\n const runner = runnerRegistry.get(normalized);\n if (runner == null) {\n return false;\n }\n if (runner.running) {\n throw new Error(`[TriggerManager] Cannot unregister running runner: ${normalized}`);\n }\n return runnerRegistry.delete(normalized);\n },\n\n getRunnerKeys(): string[] {\n return [...runnerRegistry.keys()];\n },\n\n getRunnersBelowLoopInterval(): Array<{ key: string; intervalMs: number }> {\n return [...runnerRegistry.values()]\n .filter((runner) => runner.intervalMs < TRIGGER_LOOP_INTERVAL_MS)\n .map((runner) => ({ key: runner.key, intervalMs: runner.intervalMs }));\n },\n\n /** Called by TriggerNode during bootstrap — blocks further registerRunner calls. */\n closeRegistration(): void {\n registrationClosed = true;\n },\n\n /** Re-open registration (tests only). */\n _resetRegistrationForTests(): void {\n registrationClosed = false;\n },\n\n /**\n * Remove all runners. Throws if any runner is still executing.\n * Wait for in-flight ticks to finish before calling in tests.\n */\n clearRunners(): void {\n for (const runner of runnerRegistry.values()) {\n if (runner.running) {\n throw new Error(`[TriggerManager] Cannot clearRunners while runner is running: ${runner.key}`);\n }\n }\n runnerRegistry.clear();\n registrationClosed = false;\n },\n\n async tick(ctx: NodeLoopContext): Promise<void> {\n const { loopTraceId, nodeId } = ctx;\n const loopScope = createScope({ module: \"tickRunners\", traceId: loopTraceId, labels: { nodeId } });\n const logger = createLogger({ scope: loopScope });\n\n const now = Date.now();\n const runners = [...runnerRegistry.values()];\n if (runners.length === 0) {\n logger.debug(\"無 runner 可調度\", { topic: LOG_TOPIC_TRIGGER });\n return;\n }\n\n // Overlap: if fn is still running when due, skip that tick (no catch-up / backlog).\n // Safe while intervals are large; missed ticks increase if fn duration exceeds intervalMs.\n const dueRunners = runners.filter((runner) => !runner.running && now >= runner.nextRunAt);\n if (dueRunners.length === 0) {\n logger.debug(\"本輪無到期 runner\", { topic: LOG_TOPIC_TRIGGER });\n return;\n }\n\n logger.debug(\"調度到期 runner\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { due: dueRunners.map((r) => r.key) },\n });\n\n const results = await Promise.all(dueRunners.map((runner) => runRunner(ctx, runner)));\n const executed = results.filter(Boolean).length;\n if (executed > 0) {\n logger.info(\"Runner 調度完成\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { due: dueRunners.length, executed },\n });\n } else {\n logger.warn(\"本輪到期 runner 均未成功\", {\n topic: LOG_TOPIC_TRIGGER,\n data: {\n due: dueRunners.length,\n runnerKeys: dueRunners.map((r) => r.key),\n },\n });\n }\n },\n};\n\nasync function runRunner(ctx: NodeLoopContext, runner: TriggerRunnerState): Promise<boolean> {\n const { loopTraceId, nodeId } = ctx;\n if (runner.running) {\n return false;\n }\n\n runner.running = true;\n const runnerLogger = createLogger({\n scope: withModule(\n createScope({ module: \"runRunner\", traceId: loopTraceId, labels: { nodeId, runnerKey: runner.key } }),\n runner.key,\n ),\n });\n\n const maxAttempts = 1 + runner.retryCount;\n let succeeded = false;\n\n try {\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n runnerLogger.info(\"Runner 觸發\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { attempt, maxAttempts },\n });\n await invokeRunnerFn(\n runner.fn,\n {\n loopTraceId,\n nodeId,\n runnerKey: runner.key,\n logger: runnerLogger,\n attempt,\n maxAttempts,\n },\n runner.timeoutMs,\n );\n runnerLogger.success(\"Runner 完成\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { attempt, maxAttempts },\n });\n succeeded = true;\n break;\n } catch (error) {\n const message = getErrorMessage(error);\n if (attempt < maxAttempts) {\n runnerLogger.warn(\"Runner 失敗,準備重試\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { attempt, maxAttempts, error: message },\n });\n if (runner.retryDelayMs > 0) {\n await delay(runner.retryDelayMs);\n }\n } else {\n runnerLogger.error(\"Runner 重試用盡仍失敗\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { attempt, maxAttempts, error: message },\n });\n }\n }\n }\n } finally {\n runner.running = false;\n runner.nextRunAt = Date.now() + runner.intervalMs;\n }\n\n return succeeded;\n}\n","import { BaseNodeRuntime, LOG_TOPIC_NODE, type NodeLoopContext } from \"../node/node-runtime.base\";\nimport { createLogger, createScope, type LoggerWithScope, LogLevel } from \"../shared/log\";\nimport { LOG_TOPIC_TRIGGER, TRIGGER_LOOP_INTERVAL_MS } from \"./trigger.constant\";\nimport type { TriggerNodeOptions } from \"./trigger.interface\";\nimport { TriggerManager } from \"./trigger-manager\";\n\n/**\n * Local interval scheduler node.\n * Main loop: commands → heartbeat → {@link TriggerManager.tick}.\n *\n * Register runners via {@link TriggerManager.registerRunner} before {@link start}.\n * Does not scan Supabase trigger rows — see `trigger.api.ts` for remote admin APIs.\n *\n * Deploy **one** TriggerNode per logical scheduler — multiple processes duplicate runner work.\n */\nclass TriggerNode extends BaseNodeRuntime {\n private readonly requireRunners: boolean;\n\n constructor(options?: TriggerNodeOptions) {\n super(\"triggerNode\");\n this.requireRunners = options?.requireRunners ?? false;\n }\n\n protected getLoopIntervalMs(): number {\n return TRIGGER_LOOP_INTERVAL_MS;\n }\n\n protected loopLoggerMinLevel(): LogLevel {\n return LogLevel.WARN;\n }\n\n protected async onBeforeRegisterNode(logger: LoggerWithScope): Promise<void> {\n TriggerManager.closeRegistration();\n\n const runnerKeys = TriggerManager.getRunnerKeys();\n if (runnerKeys.length === 0) {\n if (this.requireRunners) {\n throw new Error(\"[TriggerNode] requireRunners is true but no runners are registered\");\n }\n logger.warn(\"未注册任何 Trigger runner,主循環將空轉\", {\n topic: LOG_TOPIC_TRIGGER,\n });\n return;\n }\n\n for (const { key, intervalMs } of TriggerManager.getRunnersBelowLoopInterval()) {\n logger.warn(\"Runner interval 小於主循環 tick 間隔,實際觸發精度受限\", {\n topic: LOG_TOPIC_TRIGGER,\n data: {\n runnerKey: key,\n intervalMs,\n loopIntervalMs: TRIGGER_LOOP_INTERVAL_MS,\n },\n });\n }\n\n logger.success(\"Trigger 節點啟動\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { runnerKeys },\n });\n }\n\n protected async runLoopSteps(ctx: NodeLoopContext, heartbeatOk: boolean): Promise<void> {\n if (!heartbeatOk) {\n const logger = createLogger({\n scope: createScope({\n module: `${this.runtimeModule}-runLoopSteps`,\n traceId: ctx.loopTraceId,\n labels: { nodeId: ctx.nodeId },\n }),\n });\n logger.warn(\"心跳失敗,本輪跳過 runner\", { topic: LOG_TOPIC_NODE });\n return;\n }\n await TriggerManager.tick(ctx);\n }\n}\n\nexport type { TriggerNodeOptions } from \"./trigger.interface\";\nexport { TriggerNode };\n"],"names":["traceIdSchema","getRegisteredLocalTaskTypeKeys"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node.js","sources":["../src/command/command.interface.ts","../src/command/command.api.ts","../src/node/env/init-supabase-from-env.ts","../src/node/env/public-base-url.ts","../src/node/fs/read-source-file.ts","../src/node/node.utils.ts","../src/node/node-runtime.base.ts","../src/node/process/process-spawn.ts","../src/node/process/managed-child-processes.ts","../src/node/readiness/readiness-checks.ts","../src/node/readiness/run-readiness-checks.ts","../src/node/readiness/service-ready-gate.ts","../src/task/task-repo-context.ts","../src/shared/utils/config-path.utils.ts","../src/repo/repo-context.utils.ts","../src/repo/repo.script-loader.ts","../src/repo/repo-manager.ts","../src/task/local-task-registry.ts","../src/task/task-repo-validation.ts","../src/task/task-manager.ts","../src/task/task-node.ts","../src/task/task-post-validated.api.ts","../src/trigger/trigger.interface.ts","../src/trigger/trigger.api.ts","../src/trigger/trigger.constant.ts","../src/trigger/trigger-manager.ts","../src/trigger/trigger-node.ts"],"sourcesContent":["import type { Target } from \"../core.interface\";\n\nexport enum CategoryCommand {\n COMMAND = \"command\",\n}\n\nexport enum CommandType {\n STOP_NODE = \"stop-node\",\n}\n\nexport interface Command extends Target {\n name: CommandType;\n /** Node.id */\n value: string;\n category: CategoryCommand;\n}\n","import { z } from \"zod\";\nimport { createTarget, MAX_POLL_TARGET_LIST_SIZE, pollTargetList, validateWithSchema } from \"../core.api\";\nimport { generateResponse } from \"../core.interface\";\nimport { createLogger } from \"../shared/log\";\nimport { CategoryCommand, type Command, CommandType } from \"./command.interface\";\n\nconst nodeIdSchema = z.string().trim().min(1);\nconst traceIdSchema = z.string().trim().min(1).optional();\n\n// ─── Zod schemas ─────────────────────────────────────────────────────────────\n\nexport const postCommandSchema = z.object({\n nodeId: nodeIdSchema,\n command: z.nativeEnum(CommandType),\n traceId: traceIdSchema,\n});\n\nexport type PostCommandPayload = z.infer<typeof postCommandSchema>;\n\nexport const getPollCommandListSchema = z.object({\n nodeId: nodeIdSchema,\n size: z.number().int().min(1).max(MAX_POLL_TARGET_LIST_SIZE).optional(),\n traceId: traceIdSchema,\n});\n\nexport type GetPollCommandListPayload = z.infer<typeof getPollCommandListSchema>;\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction commandNodeFilter(nodeId: string) {\n return [{ field: \"value\", operator: \"eq\" as const, value: nodeId }];\n}\n\n// ─── postCommand ─────────────────────────────────────────────────────────────\n\n/** Enqueue a control command for `nodeId` (scheduler / admin). */\nexport const postCommand = validateWithSchema(\n postCommandSchema,\n \"postCommandSchema\",\n)(async ({ nodeId, command, traceId }) => {\n const logger = createLogger({ module: \"postCommand\", traceId, labels: { nodeId } });\n\n const result = await createTarget<Command, PostCommandPayload>({\n payload: { nodeId, command, traceId },\n createFn: () => ({\n name: command,\n value: nodeId,\n category: CategoryCommand.COMMAND,\n tagList: [],\n }),\n });\n\n logger.info(\"Command已入隊\", {\n topic: \"command\",\n data: { nodeId, command },\n });\n\n return result;\n});\n\n// ─── getPollCommandList ──────────────────────────────────────────────────────\n\n/** Dequeue control commands for `nodeId` (oldest first). */\nexport const getPollCommandList = validateWithSchema(\n getPollCommandListSchema,\n \"getPollCommandListSchema\",\n)(async ({ nodeId, size, traceId }) => {\n const logger = createLogger({ module: \"getPollCommandList\", traceId, labels: { nodeId } });\n\n const { data: dequeuedList = [] } = await pollTargetList<Command>({\n category: CategoryCommand.COMMAND,\n size: size ?? 50,\n filterList: commandNodeFilter(nodeId),\n ascending: true,\n });\n\n if (dequeuedList.length === 0) {\n logger.debug(\"Command\", {\n topic: \"command\",\n data: { nodeId, dequeued: dequeuedList.length },\n });\n } else {\n logger.info(\"Command\", {\n topic: \"command\",\n data: { nodeId, dequeued: dequeuedList.length },\n });\n }\n\n return generateResponse.success(dequeuedList);\n});\n","import { supabase } from \"../../supabase\";\nimport { loadEnvFiles } from \"./load-env\";\nimport { readEnv, requireEnv } from \"./require-env\";\n\nexport interface InitSupabaseFromStandardEnvOptions {\n /** Project root for `.env` files (required when `loadEnv` is true). */\n root?: string;\n /** Load env files before initialize (default true). Uses `.env.prod` when profile is `prod`. */\n loadEnv?: boolean;\n /** Hook after env files loaded (legacy aliases, etc.). */\n afterLoadEnv?: () => void;\n env?: NodeJS.ProcessEnv;\n}\n\n/**\n * Load standard Supabase env vars and initialize the process-wide Supabase holder.\n *\n * Required: `SUPABASE_URL`, `SUPABASE_ANON_KEY`\n * Optional: `SUPABASE_NEED_AUTH_URL`, `SUPABASE_NEED_AUTH_ANON_KEY`\n */\nexport async function initSupabaseFromStandardEnv(options: InitSupabaseFromStandardEnvOptions = {}): Promise<void> {\n const env = options.env ?? process.env;\n const loadEnv = options.loadEnv ?? true;\n\n if (loadEnv) {\n if (options.root == null || options.root === \"\") {\n throw new Error(\"initSupabaseFromStandardEnv: root is required when loadEnv is true\");\n }\n loadEnvFiles(options.root, { env, afterLoad: options.afterLoadEnv });\n }\n\n await supabase.initialize({\n supabaseUrl: requireEnv(\"SUPABASE_URL\", env),\n supabaseAnonKey: requireEnv(\"SUPABASE_ANON_KEY\", env),\n supabaseNeedAuthUrl: readEnv(\"SUPABASE_NEED_AUTH_URL\", env),\n supabaseNeedAuthAnonKey: readEnv(\"SUPABASE_NEED_AUTH_ANON_KEY\", env),\n });\n}\n","import { readEnv } from \"./require-env\";\n\nexport interface PublicBaseUrlFromEnvOptions {\n /** Env var for public URL override (e.g. `STORAGE_PUBLIC_URL`). */\n envKey: string;\n env?: NodeJS.ProcessEnv;\n}\n\n/**\n * Public base URL: `envKey` if set (trailing slash stripped), else `http://localhost:{port}`.\n */\nexport function publicBaseUrlFromEnv(port: number, options: PublicBaseUrlFromEnvOptions): string {\n const configured = readEnv(options.envKey, options.env ?? process.env);\n if (configured != null) {\n return configured.replace(/\\/$/, \"\");\n }\n return `http://localhost:${port}`;\n}\n","import { access, readFile, stat } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport { sha256Hex } from \"../../shared/utils/sha256\";\n\nexport interface SourceFilePayload {\n absolutePath: string;\n buffer: ArrayBuffer;\n size: number;\n sha256: string;\n}\n\nexport interface ReadAndVerifySourceFileOptions {\n /** When set, digest must match or an error is thrown. */\n expectedSha256?: string;\n /** Reject files larger than this many bytes. */\n maxBytes?: number;\n /** When false, allow zero-byte files (default rejects empty). */\n allowEmpty?: boolean;\n}\n\n/** Copy a Node.js Buffer view to a standalone ArrayBuffer. */\nexport function nodeBufferToArrayBuffer(nodeBuffer: Buffer): ArrayBuffer {\n return nodeBuffer.buffer.slice(nodeBuffer.byteOffset, nodeBuffer.byteOffset + nodeBuffer.byteLength) as ArrayBuffer;\n}\n\n/** Read a local file with basic validation and SHA-256 digest. */\nexport async function readAndVerifySourceFile(\n filePath: string,\n options: ReadAndVerifySourceFileOptions = {},\n): Promise<SourceFilePayload> {\n const absolutePath = resolve(filePath);\n const allowEmpty = options.allowEmpty === true;\n\n try {\n await access(absolutePath);\n } catch {\n throw new Error(`Source file not found: ${absolutePath}`);\n }\n\n const fileStat = await stat(absolutePath);\n if (!fileStat.isFile()) {\n throw new Error(`Source path is not a file: ${absolutePath}`);\n }\n if (!allowEmpty && fileStat.size <= 0) {\n throw new Error(`Source file is empty: ${absolutePath}`);\n }\n if (options.maxBytes != null && fileStat.size > options.maxBytes) {\n throw new Error(`Source file exceeds maxBytes (${fileStat.size} > ${options.maxBytes}): ${absolutePath}`);\n }\n\n const nodeBuffer = await readFile(absolutePath);\n const buffer = nodeBufferToArrayBuffer(nodeBuffer);\n\n if (buffer.byteLength !== fileStat.size) {\n throw new Error(\n `Source file size mismatch after read (${buffer.byteLength} !== ${fileStat.size}): ${absolutePath}`,\n );\n }\n\n const digest = await sha256Hex(buffer);\n\n if (options.expectedSha256 != null && digest.toLowerCase() !== options.expectedSha256.toLowerCase()) {\n throw new Error(\n `Source file SHA-256 mismatch (expected ${options.expectedSha256}, got ${digest}): ${absolutePath}`,\n );\n }\n\n return {\n absolutePath,\n buffer,\n size: buffer.byteLength,\n sha256: digest,\n };\n}\n","export const formatTimestamp = (timestamp: number): string => {\n return new Intl.DateTimeFormat(\"zh-CN\", {\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n hour12: false,\n fractionalSecondDigits: 3,\n }).format(timestamp);\n};\n\nexport const formatRelativeTime = (timestamp: number): string => {\n const now = Date.now();\n const diff = now - timestamp;\n\n if (diff < 1000) return \"刚刚\";\n if (diff < 60000) return `${Math.floor(diff / 1000)}秒前`;\n if (diff < 3600000) return `${Math.floor(diff / 60000)}分钟前`;\n if (diff < 86400000) return `${Math.floor(diff / 3600000)}小时前`;\n\n return formatTimestamp(timestamp);\n};\n\nexport const getRandomInterval = (): number => {\n const min = 15 * 1000;\n const max = 1 * 60 * 1000;\n return Math.floor(Math.random() * (max - min + 1)) + min;\n};\n\nexport const formatHeartbeat = (timestamp: number): string => {\n const absolute = formatTimestamp(timestamp);\n const relative = formatRelativeTime(timestamp);\n return `${absolute} (${relative})`;\n};\n","import { getPollCommandList } from \"../command/command.api\";\nimport { CommandType } from \"../command/command.interface\";\nimport { MAX_POLL_TARGET_LIST_SIZE } from \"../core.api\";\nimport {\n createLogger,\n createScope,\n type LoggerWithScope,\n LogLevel,\n type LogScope,\n logManager,\n patchScope,\n} from \"../shared/log\";\nimport { getErrorMessage } from \"../shared/utils/error.utils\";\nimport { patchChangeNodeStatus, patchNodeHeartBeat, patchStopNode, postRegisterNode } from \"./node.api\";\nimport { NodeStatus } from \"./node.interface\";\nimport { formatHeartbeat, getRandomInterval } from \"./node.utils\";\n\n/** 主循环单轮运行时上下文 — 由 start() 创建并向下传递 */\nexport interface NodeLoopContext {\n loopTraceId: string;\n nodeId: string;\n}\n\nexport const LOG_TOPIC_NODE = \"node\";\nconst LOG_TOPIC_COMMAND = \"command\";\nconst LOG_TOPIC_PROCESS = \"process\";\n\n/**\n * Shared node process runtime: bootstrap, main-loop frame, heartbeat, commands, shutdown.\n * Subclasses implement {@link onBeforeRegisterNode} and {@link runLoopSteps}.\n */\nabstract class BaseNodeRuntime {\n protected static readonly HEARTBEAT_FAILURE_THRESHOLD = 3;\n /** Log `nodeId` label while startup has not yet received an assigned id from Supabase. */\n private static readonly NODE_ID_PENDING_ASSIGNMENT = \"pending-node-id\";\n\n protected readonly runtimeModule: string;\n\n private _localNodeId: string | null = null;\n private _isNodeIdLocked = false;\n\n private isRunning: boolean;\n private loopCount: number;\n private consecutiveHeartbeatFailures = 0;\n private readonly startupTraceId: string;\n private readonly startupScope: LogScope;\n private shutdownPromise: Promise<void> | null = null;\n private startPromise: Promise<void> | null = null;\n\n get localNodeId(): string | null {\n return this._localNodeId;\n }\n\n protected set localNodeId(value: string) {\n if (this._isNodeIdLocked) {\n throw new Error(\"Node ID cannot be modified after initial assignment\");\n }\n if (typeof value !== \"string\" || value.trim() === \"\") {\n throw new Error(\"Invalid node ID\");\n }\n\n this._localNodeId = value;\n this._isNodeIdLocked = true;\n }\n\n protected constructor(runtimeModule: string) {\n this.runtimeModule = runtimeModule;\n this.isRunning = false;\n this.loopCount = 0;\n this.startupTraceId = logManager.generateTraceId();\n this.startupScope = createScope({ module: runtimeModule, traceId: this.startupTraceId });\n }\n\n /** Hook: task registration, trigger config load, etc. Throw to abort bootstrap. */\n protected abstract onBeforeRegisterNode(logger: LoggerWithScope): Promise<void>;\n\n /** Hook: one iteration body after commands + heartbeat gate. */\n protected abstract runLoopSteps(ctx: NodeLoopContext, heartbeatOk: boolean): Promise<void>;\n\n /** Hook: minimum log level for main-loop scoped loggers (heartbeat, batchCommand, iteration). */\n protected loopLoggerMinLevel(): LogLevel {\n return LogLevel.INFO;\n }\n\n /** Hook: ms to wait between loop iterations. Default: random 15–60s. */\n protected getLoopIntervalMs(): number {\n return getRandomInterval();\n }\n\n private getLogNodeId(): string {\n return this.localNodeId ?? BaseNodeRuntime.NODE_ID_PENDING_ASSIGNMENT;\n }\n\n protected isShuttingDown(): boolean {\n return this.shutdownPromise != null;\n }\n\n protected requestShutdown(trigger: string): void {\n void this.shutdown({ trigger });\n }\n\n private registerProcessLifecycle(logger: LoggerWithScope): void {\n process.on(\"SIGTERM\", () => {\n logger.warn(\"收到 SIGTERM 信號,準備關閉節點\", { topic: LOG_TOPIC_PROCESS });\n this.requestShutdown(\"SIGTERM\");\n });\n process.on(\"SIGINT\", () => {\n logger.warn(\"收到 SIGINT 信號,準備關閉節點\", { topic: LOG_TOPIC_PROCESS });\n this.requestShutdown(\"SIGINT\");\n });\n process.on(\"uncaughtException\", (error) => {\n if (this.shutdownPromise != null) {\n logger.critical(\"shutdown 進行中發生未捕獲異常,立即關閉節點\", {\n topic: LOG_TOPIC_PROCESS,\n data: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n },\n });\n process.exit(1);\n return;\n }\n logger.critical(\"未捕獲的異常,準備關閉節點\", {\n topic: LOG_TOPIC_PROCESS,\n data: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n },\n });\n this.requestShutdown(\"uncaughtException\");\n });\n process.on(\"unhandledRejection\", (reason) => {\n if (this.shutdownPromise != null) {\n logger.error(\"shutdown 進行中發生未處理的 Promise 拒絕\", {\n topic: LOG_TOPIC_PROCESS,\n data: {\n reason: getErrorMessage(reason),\n stack: reason instanceof Error ? reason.stack : undefined,\n },\n });\n return;\n }\n logger.error(\"未處理的 Promise 拒絕,準備關閉節點\", {\n topic: LOG_TOPIC_PROCESS,\n data: {\n reason: getErrorMessage(reason),\n stack: reason instanceof Error ? reason.stack : undefined,\n },\n });\n this.requestShutdown(\"unhandledRejection\");\n });\n }\n\n async start(): Promise<void> {\n if (this.startPromise != null) {\n return this.startPromise;\n }\n this.startPromise = this.runStart();\n return this.startPromise;\n }\n\n private async runStart(): Promise<void> {\n const logger = createLogger({\n scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),\n });\n\n logger.debug(\"節點進程啟動中\", {\n topic: LOG_TOPIC_NODE,\n data: {\n pid: process.pid,\n env: process.env.NODE_ENV ?? \"development\",\n runtime: this.runtimeModule,\n },\n });\n this.registerProcessLifecycle(logger);\n\n try {\n await this.onBeforeRegisterNode(logger);\n } catch (error) {\n logger.error(\"節點啟動前置步驟失敗\", {\n topic: LOG_TOPIC_NODE,\n data: { error: getErrorMessage(error) },\n });\n this.requestShutdown(\"bootstrap:pre-register\");\n return;\n }\n\n logger.debug(\"開始向 Supabase 註冊節點\", { topic: LOG_TOPIC_NODE });\n try {\n const { data, error } = await postRegisterNode({ traceId: this.startupTraceId });\n if (data == null || error) {\n throw error ?? new Error(\"postRegisterNode 失敗\");\n }\n this.localNodeId = data.id;\n logger.resetScope({ labels: { nodeId: data.id } });\n logger.success(\"節點註冊成功\", {\n topic: LOG_TOPIC_NODE,\n data: {\n nodeId: data.id,\n details: data.details,\n },\n });\n } catch (error) {\n logger.error(\"節點註冊失敗\", {\n topic: LOG_TOPIC_NODE,\n data: { error: getErrorMessage(error) },\n });\n this.requestShutdown(\"bootstrap:register-node\");\n return;\n }\n\n const nodeId = this.localNodeId!;\n logger.debug(\"節點準備進入主循環\", { topic: LOG_TOPIC_NODE });\n const { error: enterBusyError } = await patchChangeNodeStatus({\n nodeId,\n status: NodeStatus.BUSY,\n fromStatus: NodeStatus.READY,\n traceId: this.startupTraceId,\n });\n if (enterBusyError) {\n logger.error(\"節點進入主循環失敗,無法更新節點狀態為 BUSY\", {\n topic: LOG_TOPIC_NODE,\n data: { error: enterBusyError.message },\n });\n this.requestShutdown(\"bootstrap:enter-busy\");\n return;\n }\n logger.debug(\"節點狀態已設為 BUSY 進入主循環\", { topic: LOG_TOPIC_NODE, data: { nodeId } });\n await this.runLoop(nodeId);\n }\n\n private async runLoop(nodeId: string): Promise<void> {\n this.isRunning = true;\n\n while (this.isRunning) {\n this.loopCount++;\n const loopTraceId = logManager.generateTraceId();\n const loopScope = createScope({\n module: `${this.runtimeModule}-loop-iteration`,\n traceId: loopTraceId,\n labels: { nodeId },\n });\n const loopCtx: NodeLoopContext = { loopTraceId, nodeId };\n const iterLogger = createLogger({\n scope: loopScope,\n minLevel: this.loopLoggerMinLevel(),\n });\n\n iterLogger.debug(`主循環第 ${this.loopCount} 輪開始`, {\n topic: LOG_TOPIC_NODE,\n data: { nodeId, loopCount: this.loopCount },\n });\n try {\n await this.batchCommand(loopCtx);\n if (this.isShuttingDown()) {\n iterLogger.debug(\"節點關閉中,跳過本輪剩餘步驟\", { topic: LOG_TOPIC_NODE });\n break;\n }\n const heartbeatOk = await this.heartbeat(loopCtx);\n if (this.isShuttingDown()) {\n iterLogger.debug(\"節點關閉中,跳過本輪剩餘步驟\", { topic: LOG_TOPIC_NODE });\n break;\n }\n await this.runLoopSteps(loopCtx, heartbeatOk);\n } catch (error) {\n iterLogger.critical(`主循環第 ${this.loopCount} 輪遇到未知錯誤`, {\n topic: LOG_TOPIC_NODE,\n data: { error: getErrorMessage(error) },\n });\n }\n if (this.isShuttingDown()) {\n iterLogger.debug(\"節點關閉中,跳過等待間隔\", { topic: LOG_TOPIC_NODE });\n break;\n }\n const interval = this.getLoopIntervalMs();\n iterLogger.debug(`主循環第 ${this.loopCount} 輪完成,等待下一輪`, {\n topic: LOG_TOPIC_NODE,\n data: { intervalMs: interval },\n });\n await new Promise((resolve) => setTimeout(resolve, interval));\n }\n }\n\n async shutdown(options?: { trigger?: string }): Promise<void> {\n if (this.shutdownPromise != null) {\n const logger = createLogger({\n scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),\n });\n logger.debug(\"shutdown 已在進行,跳過重複調用\", {\n topic: LOG_TOPIC_NODE,\n data: { trigger: options?.trigger ?? \"unknown\" },\n });\n return this.shutdownPromise;\n }\n\n this.isRunning = false;\n this.shutdownPromise = this.runShutdown(options?.trigger).catch((error) => {\n const logger = createLogger({\n scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),\n });\n logger.error(\"shutdown 流程異常\", {\n topic: LOG_TOPIC_NODE,\n data: {\n trigger: options?.trigger ?? \"explicit\",\n error: getErrorMessage(error),\n },\n });\n process.exit(1);\n });\n return this.shutdownPromise;\n }\n\n private async runShutdown(trigger?: string): Promise<void> {\n const logger = createLogger({\n scope: patchScope({ scope: this.startupScope, patch: { labels: { nodeId: this.getLogNodeId() } } }),\n });\n\n logger.debug(\"正在關閉節點進程\", {\n topic: LOG_TOPIC_NODE,\n data: { trigger: trigger ?? \"explicit\" },\n });\n\n if (this.localNodeId == null) {\n logger.warn(\"本地節點未註冊,進程退出\", { topic: LOG_TOPIC_NODE });\n process.exit(0);\n return;\n }\n\n logger.debug(\"正在登出節點\", { topic: LOG_TOPIC_NODE, data: { nodeId: this.localNodeId } });\n try {\n const { error } = await patchStopNode({\n nodeId: this.localNodeId,\n traceId: this.startupTraceId,\n });\n if (error) {\n throw new Error(`patchStopNode 失敗: ${error.message}`);\n }\n logger.success(\"節點正常關閉,進程退出\", { topic: LOG_TOPIC_NODE });\n } catch (error) {\n logger.critical(\"登出節點失敗,進程退出\", {\n topic: LOG_TOPIC_NODE,\n data: { error: getErrorMessage(error) },\n });\n } finally {\n process.exit(0);\n }\n }\n\n async heartbeat(ctx: NodeLoopContext): Promise<boolean> {\n const { loopTraceId, nodeId } = ctx;\n const logger = createLogger({\n scope: createScope({\n module: \"heartbeat\",\n traceId: loopTraceId,\n labels: { nodeId },\n }),\n minLevel: this.loopLoggerMinLevel(),\n });\n\n logger.debug(\"開始發送心跳\", { topic: LOG_TOPIC_NODE });\n let error: { message: string } | undefined;\n let lastHeartBeat: number | null | undefined;\n try {\n const response = await patchNodeHeartBeat({ nodeId, traceId: loopTraceId });\n error = response.error;\n lastHeartBeat = response.data;\n } catch (caught) {\n error = { message: getErrorMessage(caught) };\n lastHeartBeat = null;\n }\n if (error || lastHeartBeat == null) {\n this.consecutiveHeartbeatFailures++;\n const failureCount = this.consecutiveHeartbeatFailures;\n const logData = {\n error: getErrorMessage(error),\n consecutiveFailures: failureCount,\n threshold: BaseNodeRuntime.HEARTBEAT_FAILURE_THRESHOLD,\n };\n if (failureCount >= BaseNodeRuntime.HEARTBEAT_FAILURE_THRESHOLD) {\n logger.critical(\"連續心跳失敗達上限,準備關閉節點\", {\n topic: LOG_TOPIC_NODE,\n data: logData,\n });\n this.requestShutdown(\"heartbeat:consecutive-failures\");\n } else {\n logger.warn(\"心跳更新失敗\", { topic: LOG_TOPIC_NODE, data: logData });\n }\n return false;\n }\n\n this.consecutiveHeartbeatFailures = 0;\n logger.success(\"心跳更新成功\", {\n topic: LOG_TOPIC_NODE,\n data: { lastHeartBeat: formatHeartbeat(lastHeartBeat) },\n });\n return true;\n }\n\n async batchCommand(ctx: NodeLoopContext): Promise<void> {\n const { loopTraceId, nodeId } = ctx;\n const cmdLogger = createLogger({\n scope: createScope({\n module: \"batchCommand\",\n traceId: loopTraceId,\n labels: { nodeId },\n }),\n minLevel: this.loopLoggerMinLevel(),\n });\n\n cmdLogger.debug(\"開始檢查控制指令\", { topic: LOG_TOPIC_COMMAND });\n const { data: commandList = [], error: pollError } = await getPollCommandList({\n nodeId,\n traceId: loopTraceId,\n size: MAX_POLL_TARGET_LIST_SIZE,\n });\n if (pollError) {\n cmdLogger.warn(\"獲取指令失敗\", {\n topic: LOG_TOPIC_COMMAND,\n data: { error: pollError.message },\n });\n return;\n }\n if (commandList.length === 0) {\n cmdLogger.debug(\"獲取指令數量為0 無需執行\", { topic: LOG_TOPIC_COMMAND });\n return;\n }\n cmdLogger.debug(`獲取到控制指令數量為${commandList.length}`, {\n topic: LOG_TOPIC_COMMAND,\n data: { count: commandList.length, commandList: commandList.map((command) => command.name) },\n });\n\n for (const command of commandList) {\n const cmd = command.name;\n cmdLogger.info(\"執行控制指令\", {\n topic: LOG_TOPIC_COMMAND,\n data: { commandId: command.id, cmd },\n });\n try {\n await this.executeCommand(cmd, ctx);\n cmdLogger.success(\"控制指令執行成功\", {\n topic: LOG_TOPIC_COMMAND,\n data: { commandId: command.id, cmd },\n });\n } catch (error) {\n cmdLogger.warn(\"控制指令執行失敗\", {\n topic: LOG_TOPIC_COMMAND,\n data: {\n commandId: command.id,\n cmd,\n error: getErrorMessage(error),\n },\n });\n }\n }\n\n cmdLogger.debug(\"控制指令批次處理完成\", {\n topic: LOG_TOPIC_COMMAND,\n });\n }\n\n /** Shared commands, then {@link resolveNodeCommand} for subclass-specific handling. */\n protected async executeCommand(cmd: CommandType, ctx: NodeLoopContext): Promise<void> {\n if (cmd === CommandType.STOP_NODE) {\n this.requestShutdown(\"cmd:STOP_NODE\");\n return;\n }\n await this.resolveNodeCommand(cmd, ctx);\n }\n\n /**\n * Hook: handle node-type-specific {@link CommandType} values.\n * Default rejects anything not handled in {@link executeCommand}.\n */\n protected async resolveNodeCommand(cmd: CommandType, _ctx: NodeLoopContext): Promise<void> {\n throw new Error(`無法解析的 cmd: ${cmd}`);\n }\n}\n\nexport { BaseNodeRuntime };\n","import { type ChildProcess, type StdioOptions, spawn } from \"node:child_process\";\n\nexport interface BuildNodeImportArgsInput {\n /** Relative `--import` paths (e.g. `./scripts/preload-env.mjs`). */\n preloadModules?: readonly string[];\n /** When true (default), inserts `--import tsx` before the entry script. */\n useTsx?: boolean;\n /** Entry script relative to `projectRoot` when spawning. */\n entryScript: string;\n}\n\n/**\n * Build argv for `node --import … --import tsx <entry>`.\n * Use **relative** preload paths with `cwd: projectRoot` — Node 24 on Windows rejects\n * absolute paths like `D:\\…` for `--import` (ESM URL scheme error).\n */\nexport function buildNodeImportArgs(input: BuildNodeImportArgsInput): string[] {\n const preloadModules = input.preloadModules ?? [];\n const useTsx = input.useTsx ?? true;\n const args: string[] = [];\n\n for (const modulePath of preloadModules) {\n args.push(\"--import\", modulePath);\n }\n if (useTsx) {\n args.push(\"--import\", \"tsx\");\n }\n args.push(input.entryScript);\n return args;\n}\n\nexport interface SpawnTsxChildOptions {\n projectRoot: string;\n entryScript: string;\n preloadModules?: readonly string[];\n useTsx?: boolean;\n env?: NodeJS.ProcessEnv;\n stdio?: StdioOptions;\n}\n\n/** Spawn `node` with preload chain + tsx + TypeScript entry (relative to projectRoot). */\nexport function spawnTsxChild(options: SpawnTsxChildOptions): ChildProcess {\n return spawn(\n process.execPath,\n buildNodeImportArgs({\n preloadModules: options.preloadModules,\n useTsx: options.useTsx,\n entryScript: options.entryScript,\n }),\n {\n cwd: options.projectRoot,\n env: options.env ?? process.env,\n stdio: options.stdio ?? \"inherit\",\n shell: false,\n },\n );\n}\n\nexport function isChildProcessRunning(child: ChildProcess | null | undefined): child is ChildProcess {\n return child != null && child.exitCode == null && !child.killed;\n}\n","import type { ChildProcess } from \"node:child_process\";\nimport { resolve } from \"node:path\";\nimport type { LoggerWithScope } from \"../../shared/log\";\nimport { isChildProcessRunning, spawnTsxChild } from \"./process-spawn\";\n\nexport interface ManagedChildProcessesOptions {\n projectRoot: string;\n preloadModules?: readonly string[];\n /** SIGTERM -> wait -> SIGKILL delay (default 5000 ms). */\n graceMs?: number;\n logger?: Pick<LoggerWithScope, \"info\" | \"warn\" | \"error\">;\n}\n\nexport interface SpawnChildResult {\n child: ChildProcess;\n /** false when an equivalent label was already running. */\n created: boolean;\n}\n\nexport interface StopAllChildrenOptions {\n /** PIDs to SIGTERM when not tracked by this registry (cross-process cleanup). */\n extraPids?: readonly number[];\n}\n\n/**\n * Process-local registry for tsx child processes (supervisor, worker, etc.).\n * Each OS process has its own instance - do not expect cross-process PID tracking.\n */\nexport class ManagedChildProcesses {\n private readonly projectRoot: string;\n private readonly preloadModules: readonly string[];\n private readonly graceMs: number;\n private readonly logger?: Pick<LoggerWithScope, \"info\" | \"warn\" | \"error\">;\n private readonly byLabel = new Map<string, ChildProcess>();\n\n constructor(options: ManagedChildProcessesOptions) {\n this.projectRoot = options.projectRoot;\n this.preloadModules = options.preloadModules ?? [];\n this.graceMs = options.graceMs ?? 5_000;\n this.logger = options.logger;\n }\n\n get(label: string): ChildProcess | null {\n return this.byLabel.get(label) ?? null;\n }\n\n getRunning(label: string): ChildProcess | null {\n const child = this.byLabel.get(label);\n return isChildProcessRunning(child) ? child : null;\n }\n\n runningLabels(): string[] {\n return [...this.byLabel.entries()]\n .filter((entry): entry is [string, ChildProcess] => isChildProcessRunning(entry[1]))\n .map(([label]) => label);\n }\n\n spawn(label: string, entryScript: string): SpawnChildResult {\n const existing = this.getRunning(label);\n if (existing != null) {\n return { child: existing, created: false };\n }\n\n const child = spawnTsxChild({\n projectRoot: this.projectRoot,\n entryScript,\n preloadModules: this.preloadModules,\n });\n\n child.on(\"exit\", (code, signal) => {\n this.logger?.info(\"child exited\", { topic: \"process\", data: { label, code, signal } });\n const current = this.byLabel.get(label);\n if (current === child) {\n this.byLabel.delete(label);\n }\n });\n\n this.byLabel.set(label, child);\n\n this.logger?.info(\"child started\", {\n topic: \"process\",\n data: {\n label,\n pid: child.pid,\n script: resolve(this.projectRoot, entryScript),\n },\n });\n\n return { child, created: true };\n }\n\n async stopAll(options?: StopAllChildrenOptions): Promise<void> {\n const tracked = [...this.byLabel.values()].filter((child) => isChildProcessRunning(child));\n\n await Promise.all(tracked.map((child) => this.stopChild(child)));\n\n const extraPids = options?.extraPids ?? [];\n for (const pid of extraPids) {\n if (pid == null || tracked.some((child) => child.pid === pid)) {\n continue;\n }\n try {\n process.kill(pid, \"SIGTERM\");\n } catch {\n // already exited\n }\n }\n }\n\n private stopChild(child: ChildProcess): Promise<void> {\n return new Promise((resolvePromise) => {\n child.once(\"exit\", () => resolvePromise());\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (isChildProcessRunning(child)) {\n child.kill(\"SIGKILL\");\n }\n }, this.graceMs);\n });\n }\n}\n","import { access } from \"node:fs/promises\";\nimport { scanTargetList } from \"../../core.api\";\nimport { requireEnv } from \"../env/require-env\";\nimport type { ReadinessCheck, ReadinessCheckResult } from \"./readiness.types\";\n\nexport interface RequiredEnvCheckOptions {\n env?: NodeJS.ProcessEnv;\n}\n\n/** Factory: all listed env keys must be non-empty. */\nexport function createRequiredEnvCheck(\n name: string,\n keys: string[],\n options?: RequiredEnvCheckOptions,\n): ReadinessCheck {\n return () => {\n const env = options?.env ?? process.env;\n try {\n for (const key of keys) {\n requireEnv(key, env);\n }\n return { name, ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { name, ok: false, detail: message };\n }\n };\n}\n\nexport interface PathsExistCheckOptions {\n /** Detail string when all paths exist (default: last path). */\n successDetail?: string;\n /** Detail prefix when a path is missing. */\n missingDetail?: string;\n}\n\n/** Factory: every path must exist on disk. */\nexport function createPathsExistCheck(name: string, paths: string[], options?: PathsExistCheckOptions): ReadinessCheck {\n return async () => {\n for (const filePath of paths) {\n try {\n await access(filePath);\n } catch {\n return {\n name,\n ok: false,\n detail: options?.missingDetail ?? `Missing ${filePath}`,\n };\n }\n }\n\n const detail = options?.successDetail ?? paths[paths.length - 1] ?? paths.join(\", \");\n\n return { name, ok: true, detail };\n };\n}\n\nexport interface SupabaseReachableCheckOptions {\n name?: string;\n category?: string;\n maxRows?: number;\n}\n\n/** Factory: lightweight Supabase query via {@link scanTargetList}. */\nexport function createSupabaseReachableCheck(options?: SupabaseReachableCheckOptions): ReadinessCheck {\n const name = options?.name ?? \"supabase_connectivity\";\n const category = options?.category ?? \"node\";\n const maxRows = options?.maxRows ?? 1;\n\n return async (): Promise<ReadinessCheckResult> => {\n try {\n await scanTargetList({ category, maxRows });\n return { name, ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { name, ok: false, detail: message };\n }\n };\n}\n","import type { ReadinessCheck, ReadinessReport } from \"./readiness.types\";\n\nfunction formatFailureMessage(checks: ReadinessReport[\"checks\"]): string {\n return checks\n .filter((check) => !check.ok)\n .map((check) => `${check.name}: ${check.detail ?? \"failed\"}`)\n .join(\"; \");\n}\n\n/** Run checks in order and aggregate into a {@link ReadinessReport}. */\nexport async function runReadinessChecks(checks: ReadinessCheck[]): Promise<ReadinessReport> {\n const results = await Promise.all(checks.map((check) => check()));\n const failed = results.filter((check) => !check.ok);\n\n return {\n ok: failed.length === 0,\n checks: results,\n message: failed.length === 0 ? null : formatFailureMessage(results),\n };\n}\n","import type { LoggerWithScope } from \"../../shared/log\";\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface ServiceReadySnapshot {\n failed: boolean;\n ready: boolean;\n failureMessage?: string | null;\n /** Logged on success (e.g. worker tasks, pid). */\n readyDetail?: unknown;\n}\n\n/** Cross-process ready gate — service implements by reading shared state (file, RPC, …). */\nexport interface ServiceReadyGate {\n read(): Promise<ServiceReadySnapshot>;\n}\n\nexport interface WaitForServiceReadyOptions {\n timeoutMs: number;\n pollMs?: number;\n logger?: Pick<LoggerWithScope, \"info\">;\n /** Default failure message when gate.read().failureMessage is empty. */\n failureMessage?: string;\n formatTimeoutError?: (last: ServiceReadySnapshot, timeoutMs: number) => string;\n}\n\n/**\n * Poll {@link ServiceReadyGate} until ready, fail fast on `failed`, or timeout.\n * Returns the final ready snapshot.\n */\nexport async function waitForServiceReady(\n gate: ServiceReadyGate,\n options: WaitForServiceReadyOptions,\n): Promise<ServiceReadySnapshot> {\n const pollMs = options.pollMs ?? 500;\n const defaultFailureMessage = options.failureMessage ?? \"Readiness checks failed\";\n const deadline = Date.now() + options.timeoutMs;\n let last: ServiceReadySnapshot = { failed: false, ready: false };\n\n while (Date.now() < deadline) {\n last = await gate.read();\n\n if (last.failed) {\n throw new Error(last.failureMessage ?? defaultFailureMessage);\n }\n\n if (last.ready) {\n options.logger?.info(\"service ready\", {\n topic: \"readiness\",\n data: last.readyDetail ?? {},\n });\n return last;\n }\n\n await sleep(pollMs);\n }\n\n const message =\n options.formatTimeoutError?.(last, options.timeoutMs) ??\n `Service ready timeout after ${options.timeoutMs}ms (failed=${last.failed}, ready=${last.ready})`;\n\n throw new Error(message);\n}\n","export interface TaskRunResult {\n isSuccess: boolean;\n cost: number;\n extra: unknown;\n}\n\nexport interface TaskFn {\n displayName: string;\n taskTypeKey: string;\n (taskParams: unknown): Promise<TaskRunResult>;\n}\n\n/** Params already bound — used by node executor after prepareTask */\nexport type ExecutableTaskFn = (() => Promise<TaskRunResult>) & {\n displayName: string;\n taskTypeKey: string;\n};\n\n/** Repo script module must expose this shape (see repo-context.utils). */\nexport interface TaskRepoContext {\n taskParamsValidator: (taskParams: unknown) => boolean;\n taskFn: TaskFn;\n}\n\n/** Supabase `target.category` for rows that store task script payloads */\nexport const TASK_REPO_SCRIPT_CATEGORY = \"script\" as const;\n\n/**\n * `target.details` for task script rows — not a separate Target subtype in repo.interface.\n * Loaded dynamically to produce {@link TaskRepoContext}.\n */\nexport interface TaskRepoScriptDetails {\n manifestVersion: number;\n /** Inline ESM source — written to temp file then dynamically imported (Node) */\n source?: string;\n /** Absolute path to an ESM module on the worker machine */\n modulePath?: string;\n /** Named export to read TaskRepoContext from; default export if omitted */\n exportName?: string;\n /** Content hash for cache invalidation */\n hash?: string;\n /** Prefer this script as entry when multiple scripts exist for one repo */\n isEntry?: boolean;\n}\n\n/** Minimal target row shape used by script loader (avoids a dedicated Script Target type). */\nexport interface TaskRepoScriptRecord {\n id: string;\n value: string;\n details: TaskRepoScriptDetails;\n}\n\n/** Host app root config at `config/task.config.js` — where to discover local task packages */\nexport interface TaskRunnerRootConfig {\n /** Directory containing one folder per task (relative to root config file), e.g. `\"./tasks\"` */\n taskDir: string;\n}\n\n/** Per-task `task.config.js` inside `<taskDir>/<name>/` */\nexport interface TaskLocalPackageConfig {\n /** Must match `task.value` when claiming from Supabase */\n taskTypeKey: string;\n /** Entry module relative to this task folder, e.g. `\"./index.mjs\"` */\n entry: string;\n /** Named export on entry module; default export if omitted */\n exportName?: string;\n displayName?: string;\n /** Skip registration when `false` (default `true`) */\n enabled?: boolean;\n}\n\nexport type BootstrapLocalTasksStatus =\n /** Root config found and scan finished (individual tasks may still have errors) */\n | \"loaded\"\n /** Root config found but zero tasks registered */\n | \"empty\"\n /** No root config at default/explicit paths — not an error; use remote scripts or manual register */\n | \"not_configured\"\n /** Root config or taskDir invalid */\n | \"failed\";\n\nexport interface BootstrapLocalTasksResult {\n status: BootstrapLocalTasksStatus;\n /** Human-readable summary for logs */\n message?: string;\n registered: string[];\n skipped: { taskDir: string; reason: string }[];\n errors: { taskDir: string; error: string }[];\n /** True when scan was skipped due to unchanged config fingerprint */\n cached?: boolean;\n}\n\n/** Host app config directory (relative to `cwd`) — recommended for library consumers */\nexport const TASK_RUNNER_CONFIG_DIR = \"config\" as const;\n\nexport const TASK_RUNNER_ROOT_CONFIG_FILENAME = \"task.config.js\" as const;\n\n/** Default root config path: `config/task.config.js` */\nexport const TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH =\n `${TASK_RUNNER_CONFIG_DIR}/${TASK_RUNNER_ROOT_CONFIG_FILENAME}` as const;\n\n/** Legacy fallback at project root */\nexport const TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH = TASK_RUNNER_ROOT_CONFIG_FILENAME;\n\n/** Per-task config filename inside each folder under `taskDir` */\nexport const TASK_LOCAL_PACKAGE_CONFIG_FILENAME = \"task.config.js\" as const;\n","import { access } from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\n/**\n * Directory containing a config file — anchor for paths declared **inside** that file.\n */\nexport function getConfigFileDir(configFilePath: string): string {\n return dirname(configFilePath);\n}\n\n/**\n * Resolve a path from a config file's directory.\n *\n * - Absolute `pathInConfig` → returned as-is\n * - Relative `pathInConfig` → `resolve(dirname(configFilePath), pathInConfig)`\n *\n * **Not** relative to `process.cwd()`. See `.cursor/skills/config-file-relative-paths/SKILL.md`.\n */\nexport function resolvePathFromConfigFile(configFilePath: string, pathInConfig: string): string {\n const trimmed = pathInConfig.trim();\n if (isAbsolute(trimmed)) {\n return trimmed;\n }\n return resolve(getConfigFileDir(configFilePath), trimmed);\n}\n\n/**\n * Resolve a path from an explicit base directory (e.g. task package dir for `entry`).\n * Same rules as {@link resolvePathFromConfigFile}, but base is already known.\n */\nexport function resolvePathFromBaseDir(baseDir: string, path: string): string {\n const trimmed = path.trim();\n if (isAbsolute(trimmed)) {\n return trimmed;\n }\n return resolve(baseDir, trimmed);\n}\n\n/**\n * Resolve a path from `cwd` — for **discovering** config files, not for fields inside them.\n */\nexport function resolvePathFromCwd(cwd: string, path: string): string {\n const trimmed = path.trim();\n if (isAbsolute(trimmed)) {\n return trimmed;\n }\n return resolve(cwd, trimmed);\n}\n\nexport async function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface ResolveFirstExistingPathOptions {\n /** When set, only this path is tried (resolved from `cwd` if relative). */\n explicitPath?: string;\n /** Relative to `cwd`, tried in order when `explicitPath` is omitted. */\n candidatePaths: string[];\n}\n\n/**\n * Find the first existing file path: optional explicit path, else scan `candidatePaths` under `cwd`.\n */\nexport async function resolveFirstExistingPath(\n cwd: string,\n options: ResolveFirstExistingPathOptions,\n): Promise<string | null> {\n const { explicitPath, candidatePaths } = options;\n\n if (explicitPath != null && explicitPath.trim() !== \"\") {\n const resolved = resolvePathFromCwd(cwd, explicitPath);\n return (await pathExists(resolved)) ? resolved : null;\n }\n\n for (const candidate of candidatePaths) {\n const resolved = join(cwd, candidate);\n if (await pathExists(resolved)) {\n return resolved;\n }\n }\n\n return null;\n}\n\n/** `file://` href for Node dynamic `import()` of a local module. */\nexport function toFileImportHref(filePath: string): string {\n const trimmed = filePath.trim();\n if (trimmed.includes(\"://\")) {\n return trimmed;\n }\n return pathToFileURL(trimmed).href;\n}\n\n/** Native ESM import of a `.js` / `.mjs` config; supports `export default` or named export object. */\nexport async function importJsConfigModule(configPath: string): Promise<unknown> {\n const mod = await import(toFileImportHref(configPath));\n return mod.default ?? mod;\n}\n","import {\n TASK_REPO_SCRIPT_CATEGORY,\n type TaskRepoContext,\n type TaskRepoScriptDetails,\n type TaskRepoScriptRecord,\n} from \"../task/task-repo-context\";\n\nexport { TASK_REPO_SCRIPT_CATEGORY };\n\nexport interface LoadedRepoContext {\n context: TaskRepoContext;\n /** Cache key segment — typically repo hash or script hash */\n contentHash: string;\n}\n\nexport function isTaskRepoContext(value: unknown): value is TaskRepoContext {\n if (value == null || typeof value !== \"object\") {\n return false;\n }\n const record = value as TaskRepoContext;\n return typeof record.taskParamsValidator === \"function\" && typeof record.taskFn === \"function\";\n}\n\n/**\n * Normalize a dynamically imported module into {@link TaskRepoContext}.\n * Supported shapes:\n * - `export default { taskParamsValidator, taskFn }`\n * - `export { taskParamsValidator, taskFn }`\n * - `export default taskFn` (validator becomes `() => true`)\n */\nexport function normalizeRepoContextModule(\n moduleExports: unknown,\n taskTypeKey: string,\n exportName?: string,\n): TaskRepoContext | null {\n if (moduleExports == null) {\n return null;\n }\n\n const record = moduleExports as Record<string, unknown>;\n const namedExport = exportName != null && exportName !== \"\" ? record[exportName] : undefined;\n const defaultExport = record.default;\n const candidate = namedExport ?? defaultExport ?? moduleExports;\n\n let taskParamsValidator: unknown;\n let taskFn: unknown;\n\n if (typeof candidate === \"function\") {\n taskFn = candidate;\n taskParamsValidator = record.taskParamsValidator;\n } else if (typeof candidate === \"object\" && candidate != null) {\n const ctx = candidate as Record<string, unknown>;\n taskParamsValidator = ctx.taskParamsValidator;\n taskFn = ctx.taskFn;\n }\n\n taskParamsValidator ??= record.taskParamsValidator;\n taskFn ??= record.taskFn;\n\n if (typeof taskFn !== \"function\") {\n return null;\n }\n\n if (typeof taskParamsValidator !== \"function\") {\n taskParamsValidator = () => true;\n }\n\n const fn = taskFn as TaskRepoContext[\"taskFn\"];\n if (fn.displayName == null || fn.displayName === \"\") {\n fn.displayName = taskTypeKey;\n }\n if (fn.taskTypeKey == null || fn.taskTypeKey === \"\") {\n fn.taskTypeKey = taskTypeKey;\n }\n\n return {\n taskParamsValidator: taskParamsValidator as TaskRepoContext[\"taskParamsValidator\"],\n taskFn: fn,\n };\n}\n\nexport function pickEntryScript(scripts: TaskRepoScriptRecord[]): TaskRepoScriptRecord | null {\n if (scripts.length === 0) {\n return null;\n }\n const entry = scripts.find((script) => script.details.isEntry === true);\n return entry ?? scripts[0];\n}\n\nexport function getScriptLoadKey(script: TaskRepoScriptRecord): string {\n const { source, modulePath, hash } = script.details;\n if (hash != null && hash !== \"\") {\n return hash;\n }\n if (source != null && source !== \"\") {\n return `source:${source.length}:${source.slice(0, 64)}`;\n }\n if (modulePath != null && modulePath !== \"\") {\n return `path:${modulePath}`;\n }\n return script.id;\n}\n\nexport function assertScriptLoadable(\n details: TaskRepoScriptDetails,\n): details is TaskRepoScriptDetails & ({ source: string } | { modulePath: string }) {\n const hasSource = details.source != null && details.source.trim() !== \"\";\n const hasModulePath = details.modulePath != null && details.modulePath.trim() !== \"\";\n return hasSource || hasModulePath;\n}\n","import { createHash } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nimport type { LoggerWithScope } from \"../shared/log\";\nimport { resolvePathFromCwd, toFileImportHref } from \"../shared/utils/config-path.utils\";\nimport type { TaskRepoScriptRecord } from \"../task/task-repo-context\";\nimport { getScriptLoadKey, type LoadedRepoContext, normalizeRepoContextModule } from \"./repo-context.utils\";\n\nconst importedModuleCache = new Map<string, LoadedRepoContext>();\n\nasync function importFromFilePath(modulePath: string): Promise<unknown> {\n return import(toFileImportHref(modulePath));\n}\n\n/** Resolve repo `details.url` to a value suitable for dynamic `import()`. */\nexport function resolveRepoEntryHref(url: string, cwd = process.cwd()): string {\n const trimmed = url.trim();\n if (trimmed.includes(\"://\")) {\n return trimmed;\n }\n return toFileImportHref(resolvePathFromCwd(cwd, trimmed));\n}\n\nasync function importFromSource(source: string, cacheKey: string): Promise<unknown> {\n const hash = createHash(\"sha256\").update(source).digest(\"hex\").slice(0, 16);\n const dir = join(tmpdir(), \"target-supabase-sdk\", \"repo-scripts\");\n await mkdir(dir, { recursive: true });\n const filePath = join(dir, `${cacheKey}-${hash}.mjs`);\n await writeFile(filePath, source, \"utf8\");\n return importFromFilePath(filePath);\n}\n\nexport async function loadRepoContextFromScript({\n logger,\n script,\n taskTypeKey,\n}: {\n logger: LoggerWithScope;\n script: TaskRepoScriptRecord;\n taskTypeKey: string;\n}): Promise<LoadedRepoContext | null> {\n const loadKey = getScriptLoadKey(script);\n const cacheKey = `${taskTypeKey}@${loadKey}`;\n const cached = importedModuleCache.get(cacheKey);\n if (cached != null) {\n logger.info(\"命中 Repo 脚本模块缓存\", { topic: \"repo\", data: { cacheKey } });\n return cached;\n }\n\n const { source, modulePath, exportName } = script.details;\n\n try {\n let moduleExports: unknown;\n if (source != null && source.trim() !== \"\") {\n logger.info(\"从 source 动态加载 Repo 脚本\", { topic: \"repo\", data: { scriptId: script.id } });\n moduleExports = await importFromSource(source, cacheKey);\n } else if (modulePath != null && modulePath.trim() !== \"\") {\n logger.info(\"从 modulePath 动态加载 Repo 脚本\", {\n topic: \"repo\",\n data: { scriptId: script.id, modulePath },\n });\n moduleExports = await importFromFilePath(modulePath);\n } else {\n logger.warn(\"脚本缺少 source 或 modulePath\", { topic: \"repo\", data: { scriptId: script.id } });\n return null;\n }\n\n const context = normalizeRepoContextModule(moduleExports, taskTypeKey, exportName);\n if (context == null) {\n logger.warn(\"脚本模块未导出合法的 TaskRepoContext\", {\n topic: \"repo\",\n data: { scriptId: script.id, exportName: exportName ?? \"default\" },\n });\n return null;\n }\n\n const loaded: LoadedRepoContext = { context, contentHash: loadKey };\n importedModuleCache.set(cacheKey, loaded);\n return loaded;\n } catch (error) {\n logger.error(\"动态加载 Repo 脚本失败\", {\n topic: \"repo\",\n data: { scriptId: script.id, error: error instanceof Error ? error.message : error },\n });\n return null;\n }\n}\n\nexport async function loadRepoContextFromUrl({\n logger,\n url,\n taskTypeKey,\n exportName,\n}: {\n logger: LoggerWithScope;\n url: string;\n taskTypeKey: string;\n exportName?: string;\n}): Promise<LoadedRepoContext | null> {\n const href = resolveRepoEntryHref(url);\n const cacheKey = `${taskTypeKey}@url:${href}`;\n const cached = importedModuleCache.get(cacheKey);\n if (cached != null) {\n logger.info(\"命中 Repo URL 模块缓存\", { topic: \"repo\", data: { cacheKey } });\n return cached;\n }\n\n try {\n logger.info(\"从 Repo URL 动态加载脚本\", { topic: \"repo\", data: { url, href } });\n const moduleExports = await import(href);\n const context = normalizeRepoContextModule(moduleExports, taskTypeKey, exportName);\n if (context == null) {\n logger.warn(\"Repo URL 模块未导出合法的 TaskRepoContext\", {\n topic: \"repo\",\n data: { url, exportName: exportName ?? \"default\" },\n });\n return null;\n }\n const loaded: LoadedRepoContext = { context, contentHash: cacheKey };\n importedModuleCache.set(cacheKey, loaded);\n return loaded;\n } catch (error) {\n logger.error(\"从 Repo URL 动态加载失败\", {\n topic: \"repo\",\n data: { url, error: error instanceof Error ? error.message : error },\n });\n return null;\n }\n}\n\n/** Clear in-memory imported module cache (tests / hot reload). */\nexport function clearRepoScriptModuleCache(): void {\n importedModuleCache.clear();\n}\n","import { getPossibleTarget } from \"../core.api\";\nimport type { LoggerWithScope } from \"../shared/log\";\nimport { supabase } from \"../supabase\";\nimport type { TaskRepoContext, TaskRepoScriptRecord } from \"../task/task-repo-context\";\nimport { TASK_REPO_SCRIPT_CATEGORY } from \"../task/task-repo-context\";\nimport { CategoryRepo, type Repo } from \"./repo.interface\";\nimport { clearRepoScriptModuleCache, loadRepoContextFromScript, loadRepoContextFromUrl } from \"./repo.script-loader\";\nimport { assertScriptLoadable, isTaskRepoContext, pickEntryScript } from \"./repo-context.utils\";\n\ntype LocalRepoEntry =\n | { kind: \"context\"; context: TaskRepoContext }\n | { kind: \"modulePath\"; modulePath: string; exportName?: string };\n\nconst localRepoRegistry = new Map<string, LocalRepoEntry>();\nconst remoteContextCache = new Map<string, TaskRepoContext>();\n\nexport type RepoContextFailureReason =\n | \"LOCAL_REPO_LOAD_FAILED\"\n | \"LOCAL_REPO_NOT_FOUND\"\n | \"REMOTE_REPO_NOT_FOUND\"\n | \"REMOTE_REPO_LOAD_FAILED\";\n\nexport type RepoContextResolvedVia = \"local\" | \"remote\";\n\nexport interface GetRepoContextParams {\n logger: LoggerWithScope;\n /** Task type key (`task.value`) — matches {@link Repo.value} for remote lookup; local registry key */\n taskTypeKey: string;\n /**\n * When false, skip Supabase fetch if the task type is not in the local registry.\n * Default `true`.\n */\n includeRemote?: boolean;\n}\n\nexport interface GetRepoContextResult<T extends TaskRepoContext = TaskRepoContext> {\n context: T | null;\n /** Present when `context` is null — import / DB / format failure at repo layer */\n error?: string;\n failureReason?: RepoContextFailureReason;\n resolvedVia?: RepoContextResolvedVia;\n}\n\nfunction buildRemoteCacheKey(taskTypeKey: string, contentHash: string): string {\n return `${taskTypeKey}@${contentHash}`;\n}\n\nasync function fetchRemoteRepo(taskTypeKey: string): Promise<Repo | null> {\n const { data } = await getPossibleTarget({\n filterList: [\n { field: \"category\", operator: \"eq\", value: CategoryRepo.REPO },\n { field: \"value\", operator: \"eq\", value: taskTypeKey },\n ],\n });\n return (data as Repo | null) ?? null;\n}\n\nasync function fetchRemoteScripts(taskTypeKey: string): Promise<TaskRepoScriptRecord[]> {\n const { data, error } = await supabase.client\n .from(\"target\")\n .select(\"id, value, details\")\n .eq(\"category\", TASK_REPO_SCRIPT_CATEGORY)\n .eq(\"value\", taskTypeKey);\n\n if (error) {\n throw error;\n }\n\n return (data ?? []) as TaskRepoScriptRecord[];\n}\n\nasync function loadLocalEntry(\n logger: LoggerWithScope,\n entry: LocalRepoEntry,\n taskTypeKey: string,\n): Promise<TaskRepoContext | null> {\n if (entry.kind === \"context\") {\n return entry.context;\n }\n\n const loaded = await loadRepoContextFromScript({\n logger,\n script: {\n id: `local:${taskTypeKey}`,\n value: taskTypeKey,\n details: {\n manifestVersion: 0,\n modulePath: entry.modulePath,\n exportName: entry.exportName,\n isEntry: true,\n },\n },\n taskTypeKey,\n });\n return loaded?.context ?? null;\n}\n\nasync function loadRemoteRepoContext(logger: LoggerWithScope, taskTypeKey: string): Promise<GetRepoContextResult> {\n logger.info(\"從 Supabase 加載 Repo\", { topic: \"repo\", data: { taskTypeKey } });\n\n const remoteRepo = await fetchRemoteRepo(taskTypeKey);\n if (remoteRepo == null) {\n const error = `Supabase 未找到 Repo (value=${taskTypeKey})`;\n logger.warn(error, { topic: \"repo\", data: { taskTypeKey } });\n return { context: null, error, failureReason: \"REMOTE_REPO_NOT_FOUND\" };\n }\n\n const repoUrl = remoteRepo.details?.url?.trim() ?? \"\";\n const repoHash = remoteRepo.details?.hash?.trim() ?? repoUrl;\n const cacheKey = buildRemoteCacheKey(taskTypeKey, repoHash);\n const cached = remoteContextCache.get(cacheKey);\n if (cached != null) {\n logger.info(\"命中遠程 Repo 上下文緩存\", { topic: \"repo\", data: { cacheKey } });\n return { context: cached, resolvedVia: \"remote\" };\n }\n\n const scripts = await fetchRemoteScripts(taskTypeKey);\n const entryScript = pickEntryScript(scripts);\n\n let loaded =\n entryScript != null && assertScriptLoadable(entryScript.details)\n ? await loadRepoContextFromScript({ logger, script: entryScript, taskTypeKey })\n : null;\n\n if (loaded == null && repoUrl !== \"\") {\n logger.info(\"未找到 script 行,嘗試從 Repo.details.url 加載\", {\n topic: \"repo\",\n data: { taskTypeKey, url: repoUrl },\n });\n loaded = await loadRepoContextFromUrl({ logger, url: repoUrl, taskTypeKey });\n }\n\n if (loaded == null) {\n const error = `無法從 Repo 加載 TaskRepoContext (hasUrl=${repoUrl !== \"\"}, scriptCount=${scripts.length})`;\n logger.warn(error, {\n topic: \"repo\",\n data: { taskTypeKey, hasUrl: repoUrl !== \"\", scriptCount: scripts.length },\n });\n return { context: null, error, failureReason: \"REMOTE_REPO_LOAD_FAILED\" };\n }\n\n remoteContextCache.set(cacheKey, loaded.context);\n return { context: loaded.context, resolvedVia: \"remote\" };\n}\n\nconst getRepoContext = async <RepoContext extends TaskRepoContext>({\n logger,\n taskTypeKey,\n includeRemote = true,\n}: GetRepoContextParams): Promise<GetRepoContextResult<RepoContext>> => {\n const localEntry = localRepoRegistry.get(taskTypeKey);\n if (localEntry != null) {\n logger.info(\"使用本地註冊的 Repo\", { topic: \"repo\", data: { taskTypeKey } });\n const context = await loadLocalEntry(logger, localEntry, taskTypeKey);\n if (context != null && isTaskRepoContext(context)) {\n return { context: context as RepoContext, resolvedVia: \"local\" };\n }\n const error = \"本地 Repo 模組加載失敗或未導出有效的 TaskRepoContext\";\n logger.warn(error, { topic: \"repo\", data: { taskTypeKey } });\n return { context: null, error, failureReason: \"LOCAL_REPO_LOAD_FAILED\" };\n }\n\n if (!includeRemote) {\n const error = `本地未註冊 Repo (value=${taskTypeKey})`;\n logger.warn(error, { topic: \"repo\", data: { taskTypeKey, includeRemote: false } });\n return { context: null, error, failureReason: \"LOCAL_REPO_NOT_FOUND\" };\n }\n\n try {\n const result = await loadRemoteRepoContext(logger, taskTypeKey);\n if (result.context != null && isTaskRepoContext(result.context)) {\n return { context: result.context as RepoContext, resolvedVia: \"remote\" };\n }\n return {\n context: null,\n error: result.error ?? \"遠程 Repo 上下文無效\",\n failureReason: result.failureReason ?? \"REMOTE_REPO_LOAD_FAILED\",\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(\"從 Supabase 加載 Repo 失敗\", {\n topic: \"repo\",\n data: { taskTypeKey, error: message },\n });\n return { context: null, error: message, failureReason: \"REMOTE_REPO_LOAD_FAILED\" };\n }\n};\n\n/** Register an in-process TaskRepoContext (highest priority — no Supabase fetch). */\nfunction registerLocalRepoContext(taskTypeKey: string, context: TaskRepoContext): void {\n if (!isTaskRepoContext(context)) {\n throw new Error(\"[RepoManager] Invalid TaskRepoContext\");\n }\n localRepoRegistry.set(taskTypeKey, { kind: \"context\", context });\n}\n\n/** Register a local ESM module path; loaded via dynamic import when the task runs. */\nfunction registerLocalModule(taskTypeKey: string, modulePath: string, exportName?: string): void {\n if (modulePath.trim() === \"\") {\n throw new Error(\"[RepoManager] modulePath must not be empty\");\n }\n localRepoRegistry.set(taskTypeKey, { kind: \"modulePath\", modulePath, exportName });\n}\n\nfunction unregisterLocalRepo(taskTypeKey: string): void {\n localRepoRegistry.delete(taskTypeKey);\n}\n\nfunction hasLocalRepo(taskTypeKey: string): boolean {\n return localRepoRegistry.has(taskTypeKey);\n}\n\nfunction getRegisteredLocalTaskTypeKeys(): string[] {\n return [...localRepoRegistry.keys()];\n}\n\nfunction clearRemoteContextCache(): void {\n remoteContextCache.clear();\n}\n\nconst RepoManager = {\n getRepoContext,\n registerLocalRepoContext,\n registerLocalModule,\n unregisterLocalRepo,\n hasLocalRepo,\n getRegisteredLocalTaskTypeKeys,\n clearRemoteContextCache,\n clearRepoScriptModuleCache,\n};\n\nexport { RepoManager };\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { RepoManager } from \"../repo/repo-manager\";\nimport {\n importJsConfigModule,\n pathExists,\n resolveFirstExistingPath,\n resolvePathFromBaseDir,\n resolvePathFromConfigFile,\n} from \"../shared/utils/config-path.utils\";\nimport {\n type BootstrapLocalTasksResult,\n TASK_LOCAL_PACKAGE_CONFIG_FILENAME,\n TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH,\n TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH,\n type TaskLocalPackageConfig,\n type TaskRunnerRootConfig,\n} from \"./task-repo-context\";\n\nexport interface BootstrapLocalTasksOptions {\n /** Absolute or cwd-relative path to root config; if omitted, tries default paths under `cwd` */\n rootConfigPath?: string;\n /** Base directory for resolving root config (default `process.cwd()`) */\n cwd?: string;\n /**\n * When set with an unchanged config fingerprint, skip full scan if this key is already\n * registered in {@link RepoManager}.\n */\n forTaskTypeKey?: string;\n}\n\nconst EMPTY_RESULT: BootstrapLocalTasksResult = {\n status: \"not_configured\",\n registered: [],\n skipped: [],\n errors: [],\n};\n\ntype BootstrapCacheState = {\n fingerprint: string | null;\n lastResult: BootstrapLocalTasksResult | null;\n};\n\nlet bootstrapCache: BootstrapCacheState = { fingerprint: null, lastResult: null };\nlet bootstrapInFlight: Promise<BootstrapLocalTasksResult> | null = null;\n\nfunction parseRootConfig(raw: unknown, configPath: string): TaskRunnerRootConfig {\n if (raw == null || typeof raw !== \"object\") {\n throw new Error(`Root config must export an object: ${configPath}`);\n }\n const record = raw as Record<string, unknown>;\n const taskDir = record.taskDir;\n if (typeof taskDir !== \"string\" || taskDir.trim() === \"\") {\n throw new Error(`Root config.taskDir must be a non-empty string: ${configPath}`);\n }\n return { taskDir: taskDir.trim() };\n}\n\nfunction parseTaskPackageConfig(raw: unknown, configPath: string): TaskLocalPackageConfig {\n if (raw == null || typeof raw !== \"object\") {\n throw new Error(`Task config must export an object: ${configPath}`);\n }\n const record = raw as Record<string, unknown>;\n const taskTypeKey = record.taskTypeKey;\n const entry = record.entry;\n\n if (typeof taskTypeKey !== \"string\" || taskTypeKey.trim() === \"\") {\n throw new Error(`taskTypeKey must be a non-empty string: ${configPath}`);\n }\n if (typeof entry !== \"string\" || entry.trim() === \"\") {\n throw new Error(`entry must be a non-empty string: ${configPath}`);\n }\n\n return {\n taskTypeKey: taskTypeKey.trim(),\n entry: entry.trim(),\n exportName: typeof record.exportName === \"string\" ? record.exportName : undefined,\n displayName: typeof record.displayName === \"string\" ? record.displayName : undefined,\n enabled: record.enabled !== false,\n };\n}\n\nfunction finalizeStatus(result: Omit<BootstrapLocalTasksResult, \"status\">): BootstrapLocalTasksResult[\"status\"] {\n if (result.errors.length > 0 && result.registered.length === 0) {\n return \"failed\";\n }\n if (result.registered.length === 0) {\n return \"empty\";\n }\n return \"loaded\";\n}\n\nasync function computeConfigFingerprint(rootConfigPath: string, tasksRoot: string): Promise<string> {\n const rootStat = await stat(rootConfigPath);\n const tasksRootStat = await stat(tasksRoot);\n const entries = await readdir(tasksRoot, { withFileTypes: true });\n const configMtims: number[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const configPath = join(tasksRoot, entry.name, TASK_LOCAL_PACKAGE_CONFIG_FILENAME);\n if (await pathExists(configPath)) {\n const configStat = await stat(configPath);\n configMtims.push(configStat.mtimeMs);\n }\n }\n\n configMtims.sort((a, b) => a - b);\n return `${rootConfigPath}:${rootStat.mtimeMs}:${tasksRoot}:${tasksRootStat.mtimeMs}:${configMtims.join(\",\")}`;\n}\n\nfunction canUseCachedBootstrap(\n fingerprint: string,\n forTaskTypeKey: string | undefined,\n): BootstrapLocalTasksResult | null {\n if (bootstrapCache.fingerprint !== fingerprint || bootstrapCache.lastResult == null) {\n return null;\n }\n\n if (forTaskTypeKey != null && forTaskTypeKey !== \"\") {\n if (!RepoManager.hasLocalRepo(forTaskTypeKey)) {\n return null;\n }\n }\n\n return { ...bootstrapCache.lastResult, cached: true };\n}\n\nasync function runBootstrapScan(options: BootstrapLocalTasksOptions): Promise<BootstrapLocalTasksResult> {\n const cwd = options.cwd ?? process.cwd();\n\n const rootConfigPath = await resolveFirstExistingPath(cwd, {\n explicitPath: options.rootConfigPath,\n candidatePaths: [TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH, TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH],\n });\n if (rootConfigPath == null) {\n const result: BootstrapLocalTasksResult = {\n ...EMPTY_RESULT,\n message: `No root config (tried ${TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH}, ${TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH})`,\n };\n bootstrapCache = { fingerprint: null, lastResult: result };\n return result;\n }\n\n const result: Omit<BootstrapLocalTasksResult, \"status\"> = {\n registered: [],\n skipped: [],\n errors: [],\n };\n\n try {\n const rootRaw = await importJsConfigModule(rootConfigPath);\n const { taskDir } = parseRootConfig(rootRaw, rootConfigPath);\n\n const tasksRoot = resolvePathFromConfigFile(rootConfigPath, taskDir);\n if (!(await pathExists(tasksRoot))) {\n const failed: BootstrapLocalTasksResult = {\n status: \"failed\",\n message: `taskDir does not exist: ${tasksRoot}`,\n ...result,\n };\n bootstrapCache = { fingerprint: null, lastResult: failed };\n return failed;\n }\n\n const fingerprint = await computeConfigFingerprint(rootConfigPath, tasksRoot);\n const cached = canUseCachedBootstrap(fingerprint, options.forTaskTypeKey);\n if (cached != null) {\n return cached;\n }\n\n const entries = await readdir(tasksRoot, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const taskPackageDir = join(tasksRoot, entry.name);\n const taskConfigPath = join(taskPackageDir, TASK_LOCAL_PACKAGE_CONFIG_FILENAME);\n\n if (!(await pathExists(taskConfigPath))) {\n result.skipped.push({ taskDir: taskPackageDir, reason: \"missing task.config.js\" });\n continue;\n }\n\n try {\n const taskRaw = await importJsConfigModule(taskConfigPath);\n const taskConfig = parseTaskPackageConfig(taskRaw, taskConfigPath);\n\n if (taskConfig.enabled === false) {\n result.skipped.push({ taskDir: taskPackageDir, reason: \"disabled in task.config.js\" });\n continue;\n }\n\n const entryPath = resolvePathFromBaseDir(taskPackageDir, taskConfig.entry);\n if (!(await pathExists(entryPath))) {\n throw new Error(`entry module not found: ${entryPath}`);\n }\n\n RepoManager.registerLocalModule(taskConfig.taskTypeKey, entryPath, taskConfig.exportName);\n result.registered.push(taskConfig.taskTypeKey);\n } catch (error) {\n result.errors.push({\n taskDir: taskPackageDir,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const status = finalizeStatus(result);\n const finalResult: BootstrapLocalTasksResult = {\n status,\n message: status === \"empty\" ? `Root config loaded but no tasks registered under ${tasksRoot}` : undefined,\n ...result,\n };\n bootstrapCache = { fingerprint, lastResult: finalResult };\n return finalResult;\n } catch (error) {\n const failed: BootstrapLocalTasksResult = {\n status: \"failed\",\n message: error instanceof Error ? error.message : String(error),\n ...result,\n };\n bootstrapCache = { fingerprint: null, lastResult: failed };\n return failed;\n }\n}\n\n/**\n * Discover local task packages from config files and register them with {@link RepoManager}.\n *\n * **Never throws** for missing root config — returns `{ status: \"not_configured\" }`.\n *\n * Re-scans are skipped when the config fingerprint is unchanged (root config + taskDir mtimes).\n * Concurrent calls share a single in-flight scan (single-flight).\n *\n * Host app layout (recommended):\n * ```\n * ./config/task.config.js → { taskDir: \"../tasks\" }\n * ./tasks/my-task/task.config.js\n * ./tasks/my-task/index.mjs\n * ```\n *\n * `taskDir` / `entry` paths are relative to **their config file's directory** (see config-file-relative-paths skill).\n *\n * Legacy fallback: `./task.config.js` at project root (`taskDir: \"./tasks\"`).\n */\nexport async function bootstrapLocalTasks(\n options: BootstrapLocalTasksOptions = {},\n): Promise<BootstrapLocalTasksResult> {\n if (bootstrapInFlight != null) {\n return bootstrapInFlight;\n }\n\n bootstrapInFlight = runBootstrapScan(options).finally(() => {\n bootstrapInFlight = null;\n });\n return bootstrapInFlight;\n}\n\n/** Clear fingerprint cache (tests / hot-reload tooling). */\nexport function clearBootstrapLocalTasksCache(): void {\n bootstrapCache = { fingerprint: null, lastResult: null };\n bootstrapInFlight = null;\n}\n\nexport function getRegisteredLocalTaskTypeKeys(): string[] {\n return RepoManager.getRegisteredLocalTaskTypeKeys();\n}\n\nexport { TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH };\n","import { type RepoContextFailureReason, RepoManager } from \"../repo/repo-manager\";\nimport type { LoggerWithScope } from \"../shared/log\";\nimport { type BootstrapLocalTasksOptions, bootstrapLocalTasks } from \"./local-task-registry\";\nimport { ResultCode } from \"./task.interface\";\nimport type { TaskRepoContext } from \"./task-repo-context\";\n\nexport type TaskRepoValidationFailureReason =\n | \"MISSING_PARAMS\"\n | RepoContextFailureReason\n | \"PARAMS_VALIDATION_FAILED\"\n | \"TASK_TYPE_KEY_MISMATCH\";\n\nexport type ValidateTaskRepoAndParamsInput = {\n logger: LoggerWithScope;\n taskTypeKey: string;\n params: unknown;\n /**\n * When true, run {@link bootstrapLocalTasks} before resolve (CLI / Trigger / postTaskWithValidation).\n * Worker paths should omit — {@link TaskManager.registerTasks} already bootstrapped.\n */\n bootstrapLocal?: boolean;\n bootstrapLocalOptions?: BootstrapLocalTasksOptions;\n /**\n * When false, do not fetch Repo from Supabase if the task type is not locally registered.\n * Default `true`. Align with {@link RegisterTasksOptions.includeRemote}.\n */\n includeRemote?: boolean;\n};\n\nexport type ValidateTaskRepoAndParamsFailure = {\n isValid: false;\n code: ResultCode;\n message: string;\n reason: TaskRepoValidationFailureReason;\n step: string;\n};\n\nexport type ValidateTaskRepoAndParamsSuccess = {\n isValid: true;\n repoContext: TaskRepoContext;\n};\n\nexport type ValidateTaskRepoAndParamsResult = ValidateTaskRepoAndParamsFailure | ValidateTaskRepoAndParamsSuccess;\n\nfunction validateTaskParams(\n validator: TaskRepoContext[\"taskParamsValidator\"],\n taskParams: unknown,\n logger: LoggerWithScope,\n): boolean {\n try {\n return validator(taskParams) === true;\n } catch (error) {\n logger.warn(\"taskParamsValidator 拋出異常\", {\n topic: \"task\",\n data: { error: error instanceof Error ? error.message : error },\n });\n return false;\n }\n}\n\nfunction invalid(params: {\n reason: TaskRepoValidationFailureReason;\n code: ResultCode;\n message: string;\n step: string;\n}): ValidateTaskRepoAndParamsFailure {\n return { isValid: false, ...params };\n}\n\n/**\n * Resolve task Repo context and validate `params` via `taskParamsValidator`.\n *\n * Repo resolution uses {@link RepoManager.getRepoContext}:\n * local registry first; when no local entry and `includeRemote`, loads from Supabase.\n */\nasync function validateTaskRepoAndParams({\n logger,\n taskTypeKey,\n params,\n bootstrapLocal = false,\n bootstrapLocalOptions,\n includeRemote = true,\n}: ValidateTaskRepoAndParamsInput): Promise<ValidateTaskRepoAndParamsResult> {\n if (params == null) {\n return invalid({\n reason: \"MISSING_PARAMS\",\n code: ResultCode.PARAMS_NOT_VALID,\n message: \"任務缺少 params\",\n step: \"params\",\n });\n }\n\n if (bootstrapLocal) {\n const bootstrap = await bootstrapLocalTasks({\n ...bootstrapLocalOptions,\n forTaskTypeKey: taskTypeKey,\n });\n logger.debug(\"本地任務 bootstrap 完成\", {\n topic: \"task\",\n data: {\n taskTypeKey,\n step: \"local_bootstrap\",\n status: bootstrap.status,\n registered: bootstrap.registered,\n cached: bootstrap.cached ?? false,\n message: bootstrap.message,\n },\n });\n }\n\n logger.debug(\"開始解析 Repo 上下文\", {\n topic: \"task\",\n data: { taskTypeKey, step: \"repo_load\", includeRemote },\n });\n\n const {\n context: repoContext,\n error: repoError,\n failureReason,\n resolvedVia,\n } = await RepoManager.getRepoContext<TaskRepoContext>({\n logger,\n taskTypeKey,\n includeRemote,\n });\n\n if (repoContext == null) {\n return invalid({\n reason: failureReason ?? \"REMOTE_REPO_LOAD_FAILED\",\n code: ResultCode.REPO_NOT_VALID,\n message: repoError ?? \"無法加載 Repo 上下文\",\n step: \"repo_load\",\n });\n }\n\n logger.debug(\"Repo 上下文解析完成\", {\n topic: \"task\",\n data: { taskTypeKey, step: \"repo_load\", resolvedVia },\n });\n\n if (repoContext.taskFn.taskTypeKey !== taskTypeKey) {\n return invalid({\n reason: \"TASK_TYPE_KEY_MISMATCH\",\n code: ResultCode.REPO_NOT_VALID,\n message: `taskFn.taskTypeKey (${repoContext.taskFn.taskTypeKey}) 與 task.value (${taskTypeKey}) 不一致`,\n step: \"task_type_key\",\n });\n }\n\n logger.debug(\"開始校驗任務參數\", { topic: \"task\", data: { taskTypeKey, step: \"params_validation\" } });\n if (!validateTaskParams(repoContext.taskParamsValidator, params, logger)) {\n return invalid({\n reason: \"PARAMS_VALIDATION_FAILED\",\n code: ResultCode.PARAMS_NOT_VALID,\n message: \"任務參數校驗失敗\",\n step: \"params_validation\",\n });\n }\n\n logger.debug(\"任務參數校驗通過\", { topic: \"task\", data: { taskTypeKey, step: \"params_validation\" } });\n\n return { isValid: true, repoContext };\n}\n\nconst TaskRepoValidation = {\n validate: validateTaskRepoAndParams,\n};\n\nexport { TaskRepoValidation, validateTaskRepoAndParams };\n","import { getScanRemoteRepoValues } from \"../repo/repo.api\";\nimport { TASK_REPO_USAGE } from \"../repo/repo.interface\";\nimport type { LoggerWithScope } from \"../shared/log\";\nimport type { ResultCode, Task } from \"./task.interface\";\nimport type { ExecutableTaskFn, TaskFn } from \"./task-repo-context\";\n\nexport type {\n BootstrapLocalTasksResult,\n BootstrapLocalTasksStatus,\n ExecutableTaskFn,\n TaskFn,\n TaskLocalPackageConfig,\n TaskRepoContext,\n TaskRepoScriptDetails,\n TaskRepoScriptRecord,\n TaskRunnerRootConfig,\n TaskRunResult,\n} from \"./task-repo-context\";\nexport {\n TASK_LOCAL_PACKAGE_CONFIG_FILENAME,\n TASK_REPO_SCRIPT_CATEGORY,\n TASK_RUNNER_CONFIG_DIR,\n TASK_RUNNER_ROOT_CONFIG_FILENAME,\n TASK_RUNNER_ROOT_CONFIG_LEGACY_RELATIVE_PATH,\n TASK_RUNNER_ROOT_CONFIG_RELATIVE_PATH,\n} from \"./task-repo-context\";\n\nimport {\n type BootstrapLocalTasksOptions,\n bootstrapLocalTasks,\n clearBootstrapLocalTasksCache,\n getRegisteredLocalTaskTypeKeys,\n} from \"./local-task-registry\";\nimport { LOG_TOPIC_TASK } from \"./task.constant\";\nimport type { BootstrapLocalTasksResult } from \"./task-repo-context\";\nimport { TaskRepoValidation, type TaskRepoValidationFailureReason } from \"./task-repo-validation\";\n\nexport type {\n TaskRepoValidationFailureReason,\n ValidateTaskRepoAndParamsInput,\n ValidateTaskRepoAndParamsResult,\n} from \"./task-repo-validation\";\nexport { TaskRepoValidation } from \"./task-repo-validation\";\n\nexport interface PrepareTaskResponse {\n isSuccess: boolean;\n taskFn: ExecutableTaskFn | null;\n code?: ResultCode;\n message?: string;\n reason?: TaskRepoValidationFailureReason;\n /** Pipeline step for log aggregation */\n step?: string;\n}\n\nexport interface PrepareTaskParams {\n logger: LoggerWithScope;\n task: Task;\n /**\n * When false, do not fetch Repo from Supabase during validation.\n * Should match {@link RegisterTasksOptions.includeRemote} on the worker.\n */\n includeRemote?: boolean;\n bootstrapLocalOptions?: BootstrapLocalTasksOptions;\n}\n\nexport interface RegisterTasksOptions {\n logger: LoggerWithScope;\n local?: BootstrapLocalTasksOptions;\n /** When `true` (default), union local keys with remote `Repo.value` from Supabase. */\n includeRemote?: boolean;\n}\n\nexport interface RegisterTasksResult {\n availableTaskList: string[];\n local: BootstrapLocalTasksResult;\n remote: { values: string[] };\n includeRemote: boolean;\n}\n\nfunction logLocalBootstrap(logger: LoggerWithScope, bootstrap: BootstrapLocalTasksResult): void {\n switch (bootstrap.status) {\n case \"not_configured\":\n logger.info(\"未找到本地任務配置,跳過本地註冊\", {\n topic: LOG_TOPIC_TASK,\n data: { message: bootstrap.message },\n });\n break;\n case \"failed\":\n logger.warn(\"本地任務註冊失敗\", {\n topic: LOG_TOPIC_TASK,\n data: { message: bootstrap.message, errors: bootstrap.errors },\n });\n break;\n case \"empty\":\n logger.info(\"本地任務掃描完成,無已註冊任務\", {\n topic: LOG_TOPIC_TASK,\n data: { message: bootstrap.message, skipped: bootstrap.skipped },\n });\n break;\n case \"loaded\":\n logger.info(\"本地任務註冊完成\", {\n topic: LOG_TOPIC_TASK,\n data: {\n registered: bootstrap.registered,\n skipped: bootstrap.skipped,\n errors: bootstrap.errors,\n },\n });\n break;\n }\n}\n\n/**\n * Worker startup: discover local task packages + remote Repo rows, merge into `availableTaskList`.\n *\n * - Local: {@link bootstrapLocalTasks} → registers modules in {@link RepoManager}\n * - Remote: {@link getScanRemoteRepoValues} with {@link TASK_REPO_USAGE}\n * - Merge: union of both; execution still prefers local registry in {@link RepoManager.getRepoContext}\n *\n * @throws When merged list is empty (no task types to claim).\n */\nasync function registerTasks({\n logger,\n local: localOptions,\n includeRemote = true,\n}: RegisterTasksOptions): Promise<RegisterTasksResult> {\n logger.debug(\"開始註冊任務(本地 + 遠程)\", { topic: LOG_TOPIC_TASK });\n\n const local = await bootstrapLocalTasks(localOptions ?? {});\n logLocalBootstrap(logger, local);\n\n let remoteValues: string[] = [];\n if (includeRemote) {\n logger.debug(\"查詢遠程 Repo 列表\", {\n topic: LOG_TOPIC_TASK,\n data: { usage: TASK_REPO_USAGE },\n });\n const { data, error: remoteError } = await getScanRemoteRepoValues({ usage: TASK_REPO_USAGE });\n if (remoteError) {\n throw new Error(remoteError.message);\n }\n remoteValues = data ?? [];\n logger.debug(\"遠程 Repo 查詢完成\", {\n topic: LOG_TOPIC_TASK,\n data: { count: remoteValues.length, values: remoteValues },\n });\n }\n\n const availableTaskList = [...new Set([...local.registered, ...remoteValues])];\n if (availableTaskList.length === 0) {\n throw new Error(\"任務註冊失敗:本地與遠程均無可用任務類型\");\n }\n\n logger.success(\"任務註冊完成\", {\n topic: LOG_TOPIC_TASK,\n data: {\n availableTaskList,\n localRegistered: local.registered,\n remoteValues,\n },\n });\n\n return {\n availableTaskList,\n local,\n remote: { values: remoteValues },\n includeRemote,\n };\n}\n\n/** 将 taskFn 与 params 闭包绑定,供 TaskNode 无参调用 `await taskFn()` */\nfunction bindTaskFn(taskFn: TaskFn, taskParams: unknown): ExecutableTaskFn {\n const run = async () => taskFn(taskParams);\n return Object.assign(run, {\n displayName: taskFn.displayName,\n taskTypeKey: taskFn.taskTypeKey,\n });\n}\n\n/**\n * 將 Supabase 認領到的 Task 解析為可執行的 `ExecutableTaskFn`。\n *\n * 流程:\n * 1. 從 task.details 取出 `params`;`task.value` 作為 taskTypeKey(同 {@link Repo.value})\n * 2. {@link TaskRepoValidation.validate} — 本地註冊優先;未命中時可選遠端(`includeRemote`)\n * Worker 在 registry 未命中時會補掃本地(`local_bootstrap_on_miss`)\n * 3. bindTaskFn,返回閉包後的無參執行函數\n *\n * 失敗時返回 `{ isSuccess: false, code, message, reason, step }`(不 throw)。\n */\nconst prepareTask = async ({\n logger,\n task,\n includeRemote = true,\n bootstrapLocalOptions,\n}: PrepareTaskParams): Promise<PrepareTaskResponse> => {\n const fail = (params: {\n reason: TaskRepoValidationFailureReason;\n code: ResultCode;\n message: string;\n step: string;\n }): PrepareTaskResponse => {\n logger.warn(params.message, {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskTypeKey: task.value,\n reason: params.reason,\n step: params.step,\n },\n });\n return {\n isSuccess: false,\n taskFn: null,\n code: params.code,\n message: params.message,\n reason: params.reason,\n step: params.step,\n };\n };\n\n const { id: taskId, name: taskName, value: taskTypeKey, details } = task;\n logger.debug(`開始準備任務 ${taskName}-${taskTypeKey}`, {\n topic: LOG_TOPIC_TASK,\n data: { taskId, taskName, taskTypeKey },\n });\n\n const { params: taskParams } = details;\n\n if (!getRegisteredLocalTaskTypeKeys().includes(taskTypeKey)) {\n const bootstrap = await bootstrapLocalTasks({\n ...bootstrapLocalOptions,\n forTaskTypeKey: taskTypeKey,\n });\n logger.debug(\"本地 registry 未命中,補掃本地任務\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId,\n taskTypeKey,\n step: \"local_bootstrap_on_miss\",\n status: bootstrap.status,\n registered: bootstrap.registered,\n cached: bootstrap.cached ?? false,\n message: bootstrap.message,\n },\n });\n }\n\n const validation = await TaskRepoValidation.validate({\n logger,\n taskTypeKey,\n params: taskParams,\n includeRemote,\n });\n if (!validation.isValid) {\n return fail({\n reason: validation.reason,\n code: validation.code,\n message: validation.message,\n step: validation.step,\n });\n }\n\n const { repoContext } = validation;\n\n logger.debug(\"Repo 上下文加載成功\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskTypeKey,\n taskFnDisplayName: repoContext.taskFn.displayName,\n step: \"repo_load\",\n },\n });\n\n const boundTaskFn = bindTaskFn(repoContext.taskFn, taskParams);\n logger.debug(\"任務準備完成\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId,\n taskTypeKey,\n displayName: boundTaskFn.displayName,\n step: \"bind\",\n },\n });\n\n return {\n isSuccess: true,\n taskFn: boundTaskFn,\n };\n};\n\nconst TaskManager = {\n registerTasks,\n prepareTask,\n bootstrapLocalTasks,\n getRegisteredLocalTaskTypeKeys,\n clearBootstrapLocalTasksCache,\n};\n\nexport { TaskManager };\n","import { isOptimisticLockResponse } from \"../core.api\";\nimport { BaseNodeRuntime, LOG_TOPIC_NODE, type NodeLoopContext } from \"../node/node-runtime.base\";\nimport { createLogger, createScope, type LoggerWithScope, withModule } from \"../shared/log\";\nimport { getErrorMessage, toError } from \"../shared/utils/error.utils\";\nimport { patchChangeTaskStatus, patchClaimTask } from \"./task.api\";\nimport { CRITICAL_UNKNOWN_TASK_TRACE_ID, LOG_TOPIC_TASK } from \"./task.constant\";\nimport { TaskStatusAction } from \"./task.interface\";\nimport { TaskManager, type TaskRunResult } from \"./task-manager\";\n\n/**\n * Task worker node: commands → heartbeat → claim & execute tasks.\n * Built on {@link BaseNodeRuntime}.\n */\nclass TaskNode extends BaseNodeRuntime {\n private _availableTaskList: string[] = [];\n private _includeRemote = true;\n\n get availableTaskList(): readonly string[] {\n return [...this._availableTaskList];\n }\n\n constructor() {\n super(\"taskNode\");\n }\n\n protected async onBeforeRegisterNode(logger: LoggerWithScope): Promise<void> {\n const { availableTaskList, includeRemote } = await TaskManager.registerTasks({ logger });\n this._availableTaskList = availableTaskList;\n this._includeRemote = includeRemote;\n }\n\n protected async runLoopSteps(ctx: NodeLoopContext, heartbeatOk: boolean): Promise<void> {\n if (!heartbeatOk) {\n const logger = createLogger({\n scope: createScope({\n module: `${this.runtimeModule}-runLoopSteps`,\n traceId: ctx.loopTraceId,\n labels: { nodeId: ctx.nodeId },\n }),\n });\n logger.warn(\"心跳失敗,本輪跳過任務認領\", { topic: LOG_TOPIC_NODE });\n return;\n }\n await this.runAsWorker(ctx);\n }\n\n private async runAsWorker(ctx: NodeLoopContext): Promise<void> {\n const { loopTraceId, nodeId } = ctx;\n const loopScope = createScope({ module: \"runAsWorker\", traceId: loopTraceId, labels: { nodeId } });\n const logger = createLogger({ scope: loopScope });\n\n const availableTaskList = this.availableTaskList;\n if (availableTaskList.length === 0) {\n logger.warn(\"未配置可認領任務類型,跳過本輪\", { topic: LOG_TOPIC_TASK });\n return;\n }\n\n logger.debug(\"向 Supabase 認領任務\", {\n topic: LOG_TOPIC_TASK,\n data: { availableTaskList },\n });\n const { data: task, error: claimError } = await patchClaimTask({\n nodeId,\n availableTaskList: [...availableTaskList],\n traceId: loopTraceId,\n });\n if (claimError) {\n if (isOptimisticLockResponse(claimError)) {\n logger.debug(\"認領競爭失敗,本輪無可認領任務\", {\n topic: LOG_TOPIC_TASK,\n data: { availableTaskList },\n });\n return;\n }\n logger.error(\"認領任務失敗\", {\n topic: LOG_TOPIC_TASK,\n data: {\n availableTaskList,\n error: claimError.message,\n code: claimError.code,\n },\n });\n return;\n }\n if (task == null) {\n logger.debug(\"本輪無匹配的 TODO 任務\", {\n topic: LOG_TOPIC_TASK,\n data: { availableTaskList },\n });\n return;\n }\n\n const taskTraceId = task.details.traceId ?? CRITICAL_UNKNOWN_TASK_TRACE_ID;\n const taskScope = createScope({\n module: \"runAsWorker\",\n traceId: loopTraceId,\n labels: { nodeId },\n traceParentId: taskTraceId,\n });\n const taskLogger = createLogger({ scope: taskScope });\n taskLogger.success(\"認領任務成功,準備執行\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskName: task.name,\n taskTypeKey: task.value,\n taskStatus: task.details.status,\n },\n });\n\n const prepareLogger = createLogger({ scope: withModule(taskScope, \"prepareTask\") });\n const prepareResult = await TaskManager.prepareTask({\n logger: prepareLogger,\n task,\n includeRemote: this._includeRemote,\n });\n const { isSuccess: isPrepareSuccess, taskFn, code, message, reason, step } = prepareResult;\n if (!isPrepareSuccess || taskFn == null) {\n prepareLogger.critical(\"任務準備失敗,無法繼續執行,中止任務並 RESET 為 OPEN\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskTypeKey: task.value,\n code,\n message,\n reason,\n step,\n },\n });\n await this.abortTaskRun({\n logger: prepareLogger,\n taskId: task.id,\n nodeId,\n traceId: taskTraceId,\n });\n return;\n }\n logger.success(\"任務準備完成\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskName: task.name,\n taskTypeKey: task.value,\n displayName: taskFn.displayName,\n },\n });\n\n const executeLogger = createLogger({ scope: withModule(taskScope, \"executeTask\") });\n const onExecuteAbort = async (error?: Error) => {\n executeLogger.critical(\"任務執行遇到未知錯誤,中止任務並 RESET 為 OPEN\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskTypeKey: task.value,\n taskName: task.name,\n displayName: taskFn.displayName,\n error: getErrorMessage(error),\n },\n });\n await this.abortTaskRun({\n logger: executeLogger,\n taskId: task.id,\n nodeId,\n traceId: taskTraceId,\n });\n };\n\n executeLogger.info(\"開始執行業務邏輯\", {\n topic: LOG_TOPIC_TASK,\n data: { taskId: task.id, displayName: taskFn.displayName },\n });\n const startTime = Date.now();\n let result: TaskRunResult | null = null;\n try {\n result = await taskFn();\n } catch (error) {\n await onExecuteAbort(toError(error));\n return;\n }\n if (result == null) {\n await onExecuteAbort(new Error(\"任務執行結果為空\"));\n return;\n }\n\n const { isSuccess: isTaskSuccess, cost, extra } = result ?? { isSuccess: false, cost: 0, extra: null };\n if (isTaskSuccess) {\n await this.finalizeTaskRun(\"success\", {\n logger: executeLogger,\n taskId: task.id,\n taskTypeKey: task.value,\n nodeId,\n cost,\n extra,\n traceId: taskTraceId,\n });\n } else {\n await this.finalizeTaskRun(\"failure\", {\n logger: executeLogger,\n taskId: task.id,\n taskTypeKey: task.value,\n nodeId,\n cost,\n extra,\n traceId: taskTraceId,\n });\n }\n const duration = Date.now() - startTime;\n executeLogger.info(\"業務邏輯執行結束\", {\n topic: LOG_TOPIC_TASK,\n data: {\n taskId: task.id,\n taskName: task.name,\n taskTypeKey: task.value,\n displayName: taskFn.displayName,\n durationMs: duration,\n },\n });\n }\n\n private async abortTaskRun(params: {\n logger: LoggerWithScope;\n taskId: string;\n nodeId: string;\n traceId: string;\n extra?: TaskRunResult[\"extra\"];\n }): Promise<boolean> {\n const { logger, taskId, nodeId, traceId, extra } = params;\n const logData = { taskId, nodeId };\n const extraValue = typeof extra === \"string\" ? extra : undefined;\n\n const { error } = await patchChangeTaskStatus({\n id: taskId,\n action: TaskStatusAction.RESET,\n nodeId,\n extra: extraValue,\n traceId,\n });\n\n if (error) {\n logger.error(error.message, { topic: LOG_TOPIC_TASK, data: logData });\n return false;\n }\n logger.info(\"任務已中止並 RESET 為 OPEN\", { topic: LOG_TOPIC_TASK, data: logData });\n return true;\n }\n\n private async finalizeTaskRun(\n outcome: \"success\" | \"failure\",\n params: {\n logger: LoggerWithScope;\n taskId: string;\n taskTypeKey: string;\n nodeId: string;\n cost: TaskRunResult[\"cost\"];\n extra: TaskRunResult[\"extra\"];\n traceId: string;\n },\n ): Promise<void> {\n const { logger, taskId, nodeId, taskTypeKey, cost, extra, traceId } = params;\n const outcomePrefix = outcome === \"success\" ? \"任務成功\" : \"任務失敗\";\n const logData = {\n taskTypeKey,\n taskId,\n nodeId,\n ...(extra != null && extra !== \"\" ? { extra } : {}),\n };\n const extraValue = typeof extra === \"string\" ? extra : undefined;\n\n const { error: changeTaskStatusError } =\n outcome === \"success\"\n ? await patchChangeTaskStatus({\n id: taskId,\n action: TaskStatusAction.FINISH,\n nodeId,\n cost,\n extra: extraValue,\n traceId,\n })\n : await patchChangeTaskStatus({\n id: taskId,\n action: TaskStatusAction.RESET,\n nodeId,\n extra: extraValue,\n traceId,\n });\n\n if (changeTaskStatusError) {\n const upperMessage = `${outcomePrefix}但是更新 TaskStatus 失敗,產生孤兒 Task,請儘快排查問題`;\n logger.critical(upperMessage, { topic: LOG_TOPIC_TASK, data: logData });\n // TODO: 需要處理孤兒 Task\n throw new Error(upperMessage);\n }\n logger.info(\"更新 TaskStatus 成功\", { topic: LOG_TOPIC_TASK, data: logData });\n if (outcome === \"success\") {\n logger.success(\"任務執行結束,業務邏輯成功\", { topic: LOG_TOPIC_TASK, data: logData });\n } else {\n logger.warn(\"任務執行結束,業務邏輯失敗\", { topic: LOG_TOPIC_TASK, data: logData });\n }\n }\n}\n\nexport { TaskNode };\n","import { validateWithSchema } from \"../core.api\";\nimport { generateResponse, type SupabaseResponse } from \"../core.interface\";\nimport { createLogger, logManager } from \"../shared/log\";\nimport type { Task } from \"./task.interface\";\nimport { createTaskRow, postTaskSchema } from \"./task-post.api\";\nimport { TaskRepoValidation } from \"./task-repo-validation\";\n\n/**\n * Create a task row with publish-time Repo + params validation.\n * **Node entry only** — requires local Repo bootstrap and {@link TaskRepoValidation}.\n *\n * @see target-supabase-sdk/node\n */\nexport const postTaskWithValidation = validateWithSchema(\n postTaskSchema,\n \"postTaskSchema\",\n)(async ({ name, value, params, taskStatus, tagList, extra, traceId, traceParentId }) => {\n const taskTraceId = traceId?.trim() || logManager.generateTraceId();\n const logger = createLogger({\n module: \"postTaskWithValidation\",\n traceId: taskTraceId,\n traceParentId: traceParentId ?? null,\n });\n\n const validation = await TaskRepoValidation.validate({\n logger,\n taskTypeKey: value,\n params,\n bootstrapLocal: true,\n });\n if (!validation.isValid) {\n logger.warn(validation.message, {\n topic: \"task\",\n data: {\n taskTypeKey: value,\n reason: validation.reason,\n step: validation.step,\n },\n });\n return generateResponse.error(validation.message, undefined, String(validation.code)) as SupabaseResponse<Task>;\n }\n\n return createTaskRow(\n { name, value, params, taskStatus, tagList, extra, traceId, traceParentId, taskTraceId },\n logger,\n );\n});\n","import type { Target } from \"../core.interface\";\nimport type { LoggerWithScope } from \"../shared/log\";\nimport type { TaskStatus } from \"../task/task.interface\";\n\nexport enum CategoryTrigger {\n TRIGGER = \"trigger\",\n}\n\nexport enum TriggerStatus {\n ENABLED = \"ENABLED\",\n DISABLED = \"DISABLED\",\n PAUSED = \"PAUSED\",\n}\n\n/** Phase 1: daily fire at `hour`:`minute` UTC. */\nexport interface TriggerDailySchedule {\n kind: \"daily\";\n hour: number;\n minute: number;\n}\n\nexport type TriggerSchedule = TriggerDailySchedule;\n\nexport interface TriggerPostTaskAction {\n kind: \"post_task\";\n taskTypeKey: string;\n taskParams: unknown;\n taskName?: string;\n taskStatus?: TaskStatus.OPEN | TaskStatus.TODO;\n}\n\nexport type TriggerAction = TriggerPostTaskAction;\n\nexport interface Trigger extends Target {\n /** Human readable */\n name: string;\n /** Unique trigger key */\n value: string;\n details: TriggerDetails;\n category: CategoryTrigger;\n}\n\nexport interface TriggerDetails {\n manifestVersion: number;\n status: TriggerStatus;\n schedule: TriggerSchedule;\n action: TriggerAction;\n lastFiredAt?: number | null;\n /** Idempotency key for the last successful fire, e.g. `daily:2026-06-18` (UTC date). */\n lastFireKey?: string | null;\n}\n\n// ─── TriggerNode local runners ───────────────────────────────────────────────\n\n/** Context passed to each runner invocation. */\nexport interface TriggerRunnerContext {\n loopTraceId: string;\n nodeId: string;\n runnerKey: string;\n logger: LoggerWithScope;\n /** 1-based attempt index within this tick (includes retries). */\n attempt: number;\n maxAttempts: number;\n}\n\nexport type TriggerRunnerFn = (ctx: TriggerRunnerContext) => void | Promise<void>;\n\nexport interface RegisterTriggerRunnerOptions {\n /** Unique runner key within this process (trimmed; must be non-empty). */\n key: string;\n /** Minimum ms between tick starts for this runner. */\n intervalMs: number;\n fn: TriggerRunnerFn;\n /** Delay first run after registration. Default `0`. */\n initialDelayMs?: number;\n /**\n * Extra attempts after the first failure within the same tick.\n * Default {@link TRIGGER_RUNNER_DEFAULT_RETRY_COUNT} from `./trigger.constant`.\n */\n retryCount?: number;\n /**\n * Delay between retry attempts within the same tick (ms).\n * Default {@link TRIGGER_RUNNER_DEFAULT_RETRY_DELAY_MS} (`0` = immediate).\n */\n retryDelayMs?: number;\n /**\n * Max ms per fn invocation; rejects when exceeded.\n * Does not cancel in-flight work — fn may still run after timeout. Omit for no limit.\n */\n timeoutMs?: number;\n}\n\n/** Options for {@link TriggerNode}. */\nexport interface TriggerNodeOptions {\n /**\n * When true, bootstrap aborts if no runners were registered before `start()`.\n * Default `false` (warn and idle loop).\n */\n requireRunners?: boolean;\n}\n","import { z } from \"zod\";\nimport { createTarget, scanTargetList, updateTargetDetails, validateWithSchema } from \"../core.api\";\nimport { generateResponse, type SupabaseResponse } from \"../core.interface\";\nimport { createLogger } from \"../shared/log\";\nimport { TaskStatus } from \"../task/task.interface\";\nimport {\n CategoryTrigger,\n type Trigger,\n type TriggerAction,\n type TriggerSchedule,\n TriggerStatus,\n} from \"./trigger.interface\";\n\nconst TRIGGER_STATUS_FIELD = \"details->>status\" as const;\n\nconst traceIdSchema = z.string().trim().min(1).optional();\n\nconst dailyScheduleSchema = z.object({\n kind: z.literal(\"daily\"),\n hour: z.number().int().min(0).max(23),\n minute: z.number().int().min(0).max(59),\n});\n\nconst postTaskActionSchema = z.object({\n kind: z.literal(\"post_task\"),\n taskTypeKey: z.string().trim().min(1),\n taskParams: z.unknown(),\n taskName: z.string().trim().min(1).optional(),\n taskStatus: z.enum([TaskStatus.OPEN, TaskStatus.TODO]).optional(),\n});\n\nexport const postTriggerSchema = z.object({\n name: z.string().trim().min(1),\n value: z.string().trim().min(1),\n status: z.nativeEnum(TriggerStatus).optional().default(TriggerStatus.ENABLED),\n schedule: dailyScheduleSchema,\n action: postTaskActionSchema,\n tagList: z.array(z.string()).optional().default([]),\n traceId: traceIdSchema,\n});\n\nexport type PostTriggerPayload = z.infer<typeof postTriggerSchema>;\n\nexport const scanEnabledTriggersSchema = z.object({\n traceId: traceIdSchema,\n});\n\nexport type ScanEnabledTriggersPayload = z.infer<typeof scanEnabledTriggersSchema>;\n\nexport const patchTriggerFiredSchema = z.object({\n triggerId: z.string().trim().min(1),\n fireKey: z.string().trim().min(1),\n expectedLastFireKey: z.string().nullable().optional(),\n traceId: traceIdSchema,\n});\n\nexport type PatchTriggerFiredPayload = z.infer<typeof patchTriggerFiredSchema>;\n\nfunction enabledTriggerFilter() {\n return [{ field: TRIGGER_STATUS_FIELD, operator: \"eq\" as const, value: TriggerStatus.ENABLED }];\n}\n\n/** List all ENABLED triggers (Phase 1: in-memory due check). */\nexport const scanEnabledTriggers = validateWithSchema(\n scanEnabledTriggersSchema,\n \"scanEnabledTriggersSchema\",\n)(async ({ traceId }) => {\n const logger = createLogger({ module: \"scanEnabledTriggers\", traceId });\n\n try {\n const { data: triggerList } = await scanTargetList<Trigger>({\n category: CategoryTrigger.TRIGGER,\n filterList: enabledTriggerFilter(),\n orderBy: { field: \"created_at\", ascending: true },\n });\n\n const rows = triggerList ?? [];\n logger.debug(\"已掃描 ENABLED Trigger\", {\n topic: \"trigger\",\n data: { count: rows.length },\n });\n\n return generateResponse.success(rows);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return generateResponse.error(message) as SupabaseResponse<Trigger[]>;\n }\n});\n\n/** Create a trigger row (scheduler / admin). */\nexport const postTrigger = validateWithSchema(\n postTriggerSchema,\n \"postTriggerSchema\",\n)(async ({ name, value, status, schedule, action, tagList, traceId }) => {\n const logger = createLogger({ module: \"postTrigger\", traceId });\n\n const details = {\n manifestVersion: 0,\n status,\n schedule: schedule as TriggerSchedule,\n action: action as TriggerAction,\n lastFiredAt: null,\n lastFireKey: null,\n };\n\n const result = await createTarget<Trigger, PostTriggerPayload>({\n payload: { name, value, status, schedule, action, tagList, traceId },\n createFn: () => ({\n name,\n value,\n category: CategoryTrigger.TRIGGER,\n tagList,\n details,\n }),\n });\n\n logger.info(\"Trigger 已創建\", {\n topic: \"trigger\",\n data: { triggerId: result.data?.id, triggerKey: value, status },\n });\n\n return result;\n});\n\n/**\n * Mark trigger as fired for `fireKey`.\n * When `expectedLastFireKey` is set, uses optimistic lock on that field.\n */\nexport const patchTriggerFired = validateWithSchema(\n patchTriggerFiredSchema,\n \"patchTriggerFiredSchema\",\n)(async ({ triggerId, fireKey, expectedLastFireKey, traceId }) => {\n const logger = createLogger({ module: \"patchTriggerFired\", traceId });\n const now = Date.now();\n\n try {\n const optimisticLockFilterList =\n expectedLastFireKey != null && expectedLastFireKey !== \"\"\n ? [{ field: \"details->>lastFireKey\" as const, operator: \"eq\" as const, value: expectedLastFireKey }]\n : [];\n\n const data = await updateTargetDetails<Trigger, Trigger[\"details\"]>({\n id: triggerId,\n optimisticLockFilterList,\n updateFn: (current) => ({\n ...current,\n lastFireKey: fireKey,\n lastFiredAt: now,\n }),\n });\n\n logger.success(\"Trigger 觸發記錄已更新\", {\n topic: \"trigger\",\n data: { triggerId, fireKey },\n });\n\n return generateResponse.success(data);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn(\"Trigger 觸發記錄更新失敗\", {\n topic: \"trigger\",\n data: { triggerId, fireKey, error: message },\n });\n return generateResponse.error(message);\n }\n});\n","export const LOG_TOPIC_TRIGGER = \"trigger\";\n\n/** Fixed main-loop interval for {@link TriggerNode} (ms). */\nexport const TRIGGER_LOOP_INTERVAL_MS = 60_000;\n\n/** Default extra retries after first failure within one runner tick. */\nexport const TRIGGER_RUNNER_DEFAULT_RETRY_COUNT = 3;\n\n/** Default delay between retry attempts within the same tick (ms). */\nexport const TRIGGER_RUNNER_DEFAULT_RETRY_DELAY_MS = 0;\n","import type { NodeLoopContext } from \"../node/node-runtime.base\";\nimport { createLogger, createScope, withModule } from \"../shared/log\";\nimport { getErrorMessage } from \"../shared/utils/error.utils\";\nimport {\n LOG_TOPIC_TRIGGER,\n TRIGGER_LOOP_INTERVAL_MS,\n TRIGGER_RUNNER_DEFAULT_RETRY_COUNT,\n TRIGGER_RUNNER_DEFAULT_RETRY_DELAY_MS,\n} from \"./trigger.constant\";\nimport type { RegisterTriggerRunnerOptions, TriggerRunnerContext, TriggerRunnerFn } from \"./trigger.interface\";\n\nexport type { RegisterTriggerRunnerOptions, TriggerRunnerContext, TriggerRunnerFn } from \"./trigger.interface\";\n\ninterface TriggerRunnerState {\n key: string;\n intervalMs: number;\n fn: TriggerRunnerFn;\n retryCount: number;\n retryDelayMs: number;\n timeoutMs: number | undefined;\n nextRunAt: number;\n running: boolean;\n}\n\nconst runnerRegistry = new Map<string, TriggerRunnerState>();\nlet registrationClosed = false;\n\nfunction normalizeRunnerKey(key: string): string {\n const normalized = key.trim();\n if (normalized.length === 0) {\n throw new Error(\"[TriggerManager] key must be a non-empty string\");\n }\n return normalized;\n}\n\nfunction tryNormalizeRunnerKey(key: string): string | null {\n const normalized = key.trim();\n return normalized.length > 0 ? normalized : null;\n}\n\nfunction validateRunnerOptions(options: RegisterTriggerRunnerOptions): void {\n if (!Number.isFinite(options.intervalMs) || options.intervalMs < 1) {\n throw new Error(`[TriggerManager] intervalMs must be a positive number, got ${options.intervalMs}`);\n }\n const retryCount = options.retryCount ?? TRIGGER_RUNNER_DEFAULT_RETRY_COUNT;\n if (!Number.isInteger(retryCount) || retryCount < 0) {\n throw new Error(`[TriggerManager] retryCount must be a non-negative integer, got ${retryCount}`);\n }\n const initialDelayMs = options.initialDelayMs ?? 0;\n if (!Number.isFinite(initialDelayMs) || initialDelayMs < 0) {\n throw new Error(`[TriggerManager] initialDelayMs must be a non-negative number, got ${initialDelayMs}`);\n }\n const retryDelayMs = options.retryDelayMs ?? TRIGGER_RUNNER_DEFAULT_RETRY_DELAY_MS;\n if (!Number.isFinite(retryDelayMs) || retryDelayMs < 0) {\n throw new Error(`[TriggerManager] retryDelayMs must be a non-negative number, got ${retryDelayMs}`);\n }\n if (options.timeoutMs != null) {\n if (!Number.isFinite(options.timeoutMs) || options.timeoutMs < 1) {\n throw new Error(`[TriggerManager] timeoutMs must be a positive number when set, got ${options.timeoutMs}`);\n }\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nasync function invokeRunnerFn(\n fn: TriggerRunnerFn,\n ctx: TriggerRunnerContext,\n timeoutMs: number | undefined,\n): Promise<void> {\n if (timeoutMs == null) {\n await fn(ctx);\n return;\n }\n\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutHandle = setTimeout(() => {\n reject(new Error(`Runner timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n });\n\n try {\n await Promise.race([Promise.resolve(fn(ctx)), timeoutPromise]);\n } finally {\n if (timeoutHandle != null) {\n clearTimeout(timeoutHandle);\n }\n }\n}\n\n/** In-process registry and tick loop for {@link TriggerNode}. */\nexport const TriggerManager = {\n registerRunner(options: RegisterTriggerRunnerOptions): void {\n if (registrationClosed) {\n throw new Error(\"[TriggerManager] Registration closed — call registerRunner before TriggerNode.start()\");\n }\n\n const key = normalizeRunnerKey(options.key);\n validateRunnerOptions(options);\n if (typeof options.fn !== \"function\") {\n throw new Error(`[TriggerManager] fn must be a function (runner key: ${key})`);\n }\n if (runnerRegistry.has(key)) {\n throw new Error(`[TriggerManager] Duplicate runner key: ${key}`);\n }\n\n const now = Date.now();\n runnerRegistry.set(key, {\n key,\n intervalMs: options.intervalMs,\n fn: options.fn,\n retryCount: options.retryCount ?? TRIGGER_RUNNER_DEFAULT_RETRY_COUNT,\n retryDelayMs: options.retryDelayMs ?? TRIGGER_RUNNER_DEFAULT_RETRY_DELAY_MS,\n timeoutMs: options.timeoutMs,\n nextRunAt: now + (options.initialDelayMs ?? 0),\n running: false,\n });\n },\n\n hasRunner(key: string): boolean {\n const normalized = tryNormalizeRunnerKey(key);\n return normalized != null && runnerRegistry.has(normalized);\n },\n\n unregisterRunner(key: string): boolean {\n const normalized = tryNormalizeRunnerKey(key);\n if (normalized == null) {\n return false;\n }\n const runner = runnerRegistry.get(normalized);\n if (runner == null) {\n return false;\n }\n if (runner.running) {\n throw new Error(`[TriggerManager] Cannot unregister running runner: ${normalized}`);\n }\n return runnerRegistry.delete(normalized);\n },\n\n getRunnerKeys(): string[] {\n return [...runnerRegistry.keys()];\n },\n\n getRunnersBelowLoopInterval(): Array<{ key: string; intervalMs: number }> {\n return [...runnerRegistry.values()]\n .filter((runner) => runner.intervalMs < TRIGGER_LOOP_INTERVAL_MS)\n .map((runner) => ({ key: runner.key, intervalMs: runner.intervalMs }));\n },\n\n /** Called by TriggerNode during bootstrap — blocks further registerRunner calls. */\n closeRegistration(): void {\n registrationClosed = true;\n },\n\n /** Re-open registration (tests only). */\n _resetRegistrationForTests(): void {\n registrationClosed = false;\n },\n\n /**\n * Remove all runners. Throws if any runner is still executing.\n * Wait for in-flight ticks to finish before calling in tests.\n */\n clearRunners(): void {\n for (const runner of runnerRegistry.values()) {\n if (runner.running) {\n throw new Error(`[TriggerManager] Cannot clearRunners while runner is running: ${runner.key}`);\n }\n }\n runnerRegistry.clear();\n registrationClosed = false;\n },\n\n async tick(ctx: NodeLoopContext): Promise<void> {\n const { loopTraceId, nodeId } = ctx;\n const loopScope = createScope({ module: \"tickRunners\", traceId: loopTraceId, labels: { nodeId } });\n const logger = createLogger({ scope: loopScope });\n\n const now = Date.now();\n const runners = [...runnerRegistry.values()];\n if (runners.length === 0) {\n logger.debug(\"無 runner 可調度\", { topic: LOG_TOPIC_TRIGGER });\n return;\n }\n\n // Overlap: if fn is still running when due, skip that tick (no catch-up / backlog).\n // Safe while intervals are large; missed ticks increase if fn duration exceeds intervalMs.\n const dueRunners = runners.filter((runner) => !runner.running && now >= runner.nextRunAt);\n if (dueRunners.length === 0) {\n logger.debug(\"本輪無到期 runner\", { topic: LOG_TOPIC_TRIGGER });\n return;\n }\n\n logger.debug(\"調度到期 runner\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { due: dueRunners.map((r) => r.key) },\n });\n\n const results = await Promise.all(dueRunners.map((runner) => runRunner(ctx, runner)));\n const executed = results.filter(Boolean).length;\n if (executed > 0) {\n logger.info(\"Runner 調度完成\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { due: dueRunners.length, executed },\n });\n } else {\n logger.warn(\"本輪到期 runner 均未成功\", {\n topic: LOG_TOPIC_TRIGGER,\n data: {\n due: dueRunners.length,\n runnerKeys: dueRunners.map((r) => r.key),\n },\n });\n }\n },\n};\n\nasync function runRunner(ctx: NodeLoopContext, runner: TriggerRunnerState): Promise<boolean> {\n const { loopTraceId, nodeId } = ctx;\n if (runner.running) {\n return false;\n }\n\n runner.running = true;\n const runnerLogger = createLogger({\n scope: withModule(\n createScope({ module: \"runRunner\", traceId: loopTraceId, labels: { nodeId, runnerKey: runner.key } }),\n runner.key,\n ),\n });\n\n const maxAttempts = 1 + runner.retryCount;\n let succeeded = false;\n\n try {\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n runnerLogger.info(\"Runner 觸發\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { attempt, maxAttempts },\n });\n await invokeRunnerFn(\n runner.fn,\n {\n loopTraceId,\n nodeId,\n runnerKey: runner.key,\n logger: runnerLogger,\n attempt,\n maxAttempts,\n },\n runner.timeoutMs,\n );\n runnerLogger.success(\"Runner 完成\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { attempt, maxAttempts },\n });\n succeeded = true;\n break;\n } catch (error) {\n const message = getErrorMessage(error);\n if (attempt < maxAttempts) {\n runnerLogger.warn(\"Runner 失敗,準備重試\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { attempt, maxAttempts, error: message },\n });\n if (runner.retryDelayMs > 0) {\n await delay(runner.retryDelayMs);\n }\n } else {\n runnerLogger.error(\"Runner 重試用盡仍失敗\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { attempt, maxAttempts, error: message },\n });\n }\n }\n }\n } finally {\n runner.running = false;\n runner.nextRunAt = Date.now() + runner.intervalMs;\n }\n\n return succeeded;\n}\n","import { BaseNodeRuntime, LOG_TOPIC_NODE, type NodeLoopContext } from \"../node/node-runtime.base\";\nimport { createLogger, createScope, type LoggerWithScope, LogLevel } from \"../shared/log\";\nimport { LOG_TOPIC_TRIGGER, TRIGGER_LOOP_INTERVAL_MS } from \"./trigger.constant\";\nimport type { TriggerNodeOptions } from \"./trigger.interface\";\nimport { TriggerManager } from \"./trigger-manager\";\n\n/**\n * Local interval scheduler node.\n * Main loop: commands → heartbeat → {@link TriggerManager.tick}.\n *\n * Register runners via {@link TriggerManager.registerRunner} before {@link start}.\n * Does not scan Supabase trigger rows — see `trigger.api.ts` for remote admin APIs.\n *\n * Deploy **one** TriggerNode per logical scheduler — multiple processes duplicate runner work.\n */\nclass TriggerNode extends BaseNodeRuntime {\n private readonly requireRunners: boolean;\n\n constructor(options?: TriggerNodeOptions) {\n super(\"triggerNode\");\n this.requireRunners = options?.requireRunners ?? false;\n }\n\n protected getLoopIntervalMs(): number {\n return TRIGGER_LOOP_INTERVAL_MS;\n }\n\n protected loopLoggerMinLevel(): LogLevel {\n return LogLevel.WARN;\n }\n\n protected async onBeforeRegisterNode(logger: LoggerWithScope): Promise<void> {\n TriggerManager.closeRegistration();\n\n const runnerKeys = TriggerManager.getRunnerKeys();\n if (runnerKeys.length === 0) {\n if (this.requireRunners) {\n throw new Error(\"[TriggerNode] requireRunners is true but no runners are registered\");\n }\n logger.warn(\"未注册任何 Trigger runner,主循環將空轉\", {\n topic: LOG_TOPIC_TRIGGER,\n });\n return;\n }\n\n for (const { key, intervalMs } of TriggerManager.getRunnersBelowLoopInterval()) {\n logger.warn(\"Runner interval 小於主循環 tick 間隔,實際觸發精度受限\", {\n topic: LOG_TOPIC_TRIGGER,\n data: {\n runnerKey: key,\n intervalMs,\n loopIntervalMs: TRIGGER_LOOP_INTERVAL_MS,\n },\n });\n }\n\n logger.success(\"Trigger 節點啟動\", {\n topic: LOG_TOPIC_TRIGGER,\n data: { runnerKeys },\n });\n }\n\n protected async runLoopSteps(ctx: NodeLoopContext, heartbeatOk: boolean): Promise<void> {\n if (!heartbeatOk) {\n const logger = createLogger({\n scope: createScope({\n module: `${this.runtimeModule}-runLoopSteps`,\n traceId: ctx.loopTraceId,\n labels: { nodeId: ctx.nodeId },\n }),\n });\n logger.warn(\"心跳失敗,本輪跳過 runner\", { topic: LOG_TOPIC_NODE });\n return;\n }\n await TriggerManager.tick(ctx);\n }\n}\n\nexport type { TriggerNodeOptions } from \"./trigger.interface\";\nexport { TriggerNode };\n"],"names":["traceIdSchema","getRegisteredLocalTaskTypeKeys"],"mappings":"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"}
|