target-supabase-sdk 0.2.24 → 0.3.0
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/browser.d.ts +3 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +3 -2
- package/dist/browser.js.map +1 -1
- package/dist/chunks/{list.api-BzbTJBsM.js → config-BNxsVKR4.js} +163 -10
- package/dist/chunks/config-BNxsVKR4.js.map +1 -0
- package/dist/chunks/{enable-C7lFooTG.js → enable-CF77OsXr.js} +20 -238
- package/dist/chunks/enable-CF77OsXr.js.map +1 -0
- package/dist/chunks/{task-queue-C_nUaM2S.js → task-queue-BL-KwAGW.js} +39 -13
- package/dist/chunks/task-queue-BL-KwAGW.js.map +1 -0
- package/dist/node/{node-runtime.base.d.ts → base-node-runtime.d.ts} +4 -1
- package/dist/node/base-node-runtime.d.ts.map +1 -0
- package/dist/node/node-liveness.d.ts +2 -0
- package/dist/node/node-liveness.d.ts.map +1 -1
- package/dist/node/node-service-id.d.ts +3 -0
- package/dist/node/node-service-id.d.ts.map +1 -0
- package/dist/node/node.api.d.ts +9 -1
- package/dist/node/node.api.d.ts.map +1 -1
- package/dist/node/node.interface.d.ts +9 -2
- package/dist/node/node.interface.d.ts.map +1 -1
- package/dist/node/service-guard/run-service-guard-tick.d.ts.map +1 -1
- package/dist/node/service-guard/service-guard-node.d.ts +3 -1
- package/dist/node/service-guard/service-guard-node.d.ts.map +1 -1
- package/dist/node/service-host/service-host.d.ts.map +1 -1
- package/dist/node/service-host/single-process-service.d.ts.map +1 -1
- package/dist/node.d.ts +2 -2
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +244 -198
- package/dist/node.js.map +1 -1
- package/dist/preload.js +3 -3
- package/dist/service/service.interface.d.ts +2 -2
- package/dist/service/service.interface.d.ts.map +1 -1
- package/dist/shared/log/core/log-batch.d.ts +4 -4
- package/dist/shared/log/core/log-batch.d.ts.map +1 -1
- package/dist/shared/log/index.d.ts +2 -1
- package/dist/shared/log/index.d.ts.map +1 -1
- package/dist/shared/log/spool/collector.d.ts +1 -1
- package/dist/shared/log/spool/collector.d.ts.map +1 -1
- package/dist/shared/log/spool/file.d.ts +2 -8
- package/dist/shared/log/spool/file.d.ts.map +1 -1
- package/dist/shared/log/spool/writer.d.ts.map +1 -1
- package/dist/shared/log/upload/flush.d.ts.map +1 -1
- package/dist/shared/log/upload/interface.d.ts +3 -11
- package/dist/shared/log/upload/interface.d.ts.map +1 -1
- package/dist/task/task-node.d.ts +3 -1
- package/dist/task/task-node.d.ts.map +1 -1
- package/dist/trigger/trigger-manager.d.ts +1 -1
- package/dist/trigger/trigger-node.d.ts +3 -1
- package/dist/trigger/trigger-node.d.ts.map +1 -1
- package/dist/trigger/trigger.api.d.ts +10 -10
- package/package.json +1 -1
- package/src/browser.ts +4 -3
- package/src/node/{node-runtime.base.ts → base-node-runtime.ts} +11 -2
- package/src/node/node-liveness.ts +6 -1
- package/src/node/node-service-id.ts +12 -0
- package/src/node/node.api.ts +7 -5
- package/src/node/node.interface.ts +10 -2
- package/src/node/service-guard/run-service-guard-tick.ts +12 -6
- package/src/node/service-guard/service-guard-node.ts +6 -1
- package/src/node/service-host/service-host.ts +2 -1
- package/src/node/service-host/single-process-service.ts +3 -0
- package/src/node.ts +2 -2
- package/src/service/service.interface.ts +2 -2
- package/src/shared/log/README.md +2 -3
- package/src/shared/log/core/log-batch.ts +12 -10
- package/src/shared/log/index.ts +2 -1
- package/src/shared/log/spool/collector.ts +46 -20
- package/src/shared/log/spool/file.ts +12 -25
- package/src/shared/log/spool/writer.ts +2 -7
- package/src/shared/log/upload/flush.ts +23 -38
- package/src/shared/log/upload/interface.ts +3 -12
- package/src/task/task-node.ts +6 -1
- package/src/trigger/trigger-manager.ts +1 -1
- package/src/trigger/trigger-node.ts +6 -1
- package/dist/chunks/enable-C7lFooTG.js.map +0 -1
- package/dist/chunks/list.api-BzbTJBsM.js.map +0 -1
- package/dist/chunks/task-queue-C_nUaM2S.js.map +0 -1
- package/dist/node/node-runtime.base.d.ts.map +0 -1
- package/dist/shared/log/upload/batch-id.d.ts +0 -13
- package/dist/shared/log/upload/batch-id.d.ts.map +0 -1
- package/src/shared/log/upload/batch-id.ts +0 -43
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/file-write-queue.ts","../src/node/fs/json-state-store.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/process/create-managed-child-processes.ts","../src/node/readiness/poll-until.ts","../src/node/readiness/readiness-checks.ts","../src/node/readiness/run-readiness-checks.ts","../src/node/readiness/run-readiness-gate.ts","../src/node/readiness/service-ready-gate.ts","../src/node/fs/runtime-state-path.ts","../src/node/fs/sharded-json-state-store.ts","../src/node/runtime-state/create-service-runtime-state-store.ts","../src/trigger/trigger.constant.ts","../src/trigger/trigger-manager.ts","../src/node/service-guard/registry-slot-guard-step.ts","../src/node/service-guard/worker-spawn-cooldown.ts","../src/node/service-guard/run-service-guard-tick.ts","../src/node/service-guard/service-guard.interface.ts","../src/node/service-guard/register-service-guard-runner.ts","../src/shared/log/spool/collector.ts","../src/shared/log/spool/register-collect-log-runner.ts","../src/trigger/trigger-node.ts","../src/node/service-guard/service-guard-node.ts","../src/node/service-host/create-l3-child-launcher.ts","../src/node/service-host/claim-registry-slot.ts","../src/node/service-host/service-host.ts","../src/node/service-host/single-process-service.ts","../src/node/telegram/api-client.ts","../src/node/telegram/chunk.ts","../src/node/telegram/chunk-locator.ts","../src/node/telegram/types.ts","../src/node/telegram/storage-provider.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/shared/feed/node/feed.access.ts","../src/shared/feed/node/feed.service.ts","../src/shared/idea/node/idea.hash.ts","../src/shared/idea/node/idea.locator.ts","../src/shared/log/spool/coordinator.ts","../src/shared/log/spool/service-lifecycle.ts","../src/shared/media/node/media.access.ts","../src/shared/media/node/media.service.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.utils.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","/** Per-file write queue — serializes read-modify-write for a single JSON path within one process. */\nconst writeChains = new Map<string, Promise<unknown>>();\n\nexport function withSerializedFileWrites<T>(filePath: string, operation: () => Promise<T>): Promise<T> {\n const previous = writeChains.get(filePath) ?? Promise.resolve();\n const next = previous.then(operation, operation);\n writeChains.set(\n filePath,\n next.then(\n () => undefined,\n () => undefined,\n ),\n );\n return next;\n}\n","import { randomBytes } from \"node:crypto\";\nimport { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { withSerializedFileWrites } from \"./file-write-queue\";\n\nexport type JsonStatePatch<T extends object, NK extends keyof T> = Partial<Omit<T, NK>> & {\n [K in NK]?: T[K] extends object ? Partial<T[K]> : T[K];\n};\n\nexport interface JsonFileStateStore<T extends object, NK extends keyof T = never> {\n read(): Promise<T>;\n write(patch: JsonStatePatch<T, NK>): Promise<T>;\n reset(): Promise<T>;\n}\n\nexport interface CreateJsonFileStateStoreOptions<T extends object, NK extends keyof T = never> {\n filePath: string;\n defaultState: T;\n /** Top-level keys shallow-merged one level deep on read and write. */\n nestedKeys?: NK[];\n /** When set, assigned `new Date().toISOString()` on write and reset. */\n updatedAtKey?: keyof T;\n}\n\nfunction mergeWithNested<T extends object>(\n defaults: T,\n current: Partial<T> | undefined,\n patch: Partial<T>,\n nestedKeys: (keyof T)[],\n): T {\n const merged = {\n ...defaults,\n ...current,\n ...patch,\n } as T;\n\n for (const key of nestedKeys) {\n const defaultNested = defaults[key];\n if (defaultNested != null && typeof defaultNested === \"object\") {\n (merged as Record<keyof T, unknown>)[key] = {\n ...defaultNested,\n ...(current?.[key] as object | undefined),\n ...(patch[key] as object | undefined),\n };\n }\n }\n\n return merged;\n}\n\nasync function atomicWriteJson(filePath: string, data: unknown): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n const content = `${JSON.stringify(data, null, 2)}\\n`;\n JSON.parse(content);\n const tempPath = `${filePath}.${process.pid}.${randomBytes(4).toString(\"hex\")}.tmp`;\n try {\n await writeFile(tempPath, content, \"utf8\");\n await rename(tempPath, filePath);\n } catch (error) {\n await unlink(tempPath).catch(() => undefined);\n throw error;\n }\n}\n\n/** JSON file-backed state with optional nested key merge and atomic writes. */\nexport function createJsonFileStateStore<T extends object, NK extends keyof T = never>(\n options: CreateJsonFileStateStoreOptions<T, NK>,\n): JsonFileStateStore<T, NK> {\n const { filePath, defaultState, nestedKeys = [] as NK[], updatedAtKey } = options;\n\n function touchUpdatedAt(state: T): T {\n if (updatedAtKey == null) {\n return state;\n }\n return {\n ...state,\n [updatedAtKey]: new Date().toISOString(),\n };\n }\n\n async function readFromDisk(): Promise<T> {\n try {\n const raw = await readFile(filePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<T>;\n return mergeWithNested(defaultState, parsed, {}, nestedKeys);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return mergeWithNested(defaultState, {}, {}, nestedKeys);\n }\n if (error instanceof SyntaxError) {\n await unlink(filePath).catch(() => undefined);\n return mergeWithNested(defaultState, {}, {}, nestedKeys);\n }\n throw error;\n }\n }\n\n return {\n read(): Promise<T> {\n return readFromDisk();\n },\n\n write(patch: JsonStatePatch<T, NK>): Promise<T> {\n return withSerializedFileWrites(filePath, async () => {\n const current = await readFromDisk();\n const next = touchUpdatedAt(mergeWithNested(defaultState, current, patch as Partial<T>, nestedKeys));\n await atomicWriteJson(filePath, next);\n return next;\n });\n },\n\n reset(): Promise<T> {\n return withSerializedFileWrites(filePath, async () => {\n const next = touchUpdatedAt({ ...defaultState });\n await atomicWriteJson(filePath, next);\n return next;\n });\n },\n };\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","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\nconst 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 { LOG_TOPIC_NODE } from \"./node.constant\";\nimport { NodeStatus } from \"./node.interface\";\nimport { formatHeartbeat, getRandomInterval } from \"./node.utils\";\n\nexport { LOG_TOPIC_NODE };\n\n/** 主循环单轮运行时上下文 — 由 start() 创建并向下传递 */\nexport interface NodeLoopContext {\n loopTraceId: string;\n nodeId: string;\n}\n\n/** Shared options for {@link BaseNodeRuntime} and subclasses (e.g. TriggerNode). */\nexport interface BaseNodeRuntimeOptions {\n /**\n * Called after node logout (or when the node was never registered),\n * immediately before `process.exit`. Use for best-effort cleanup such as\n * {@link unregisterServiceAtShutdown}. Errors are logged and ignored.\n */\n beforeProcessExit?: () => void | Promise<void>;\n}\n\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 private readonly beforeProcessExitHook: (() => void | Promise<void>) | null;\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, options?: BaseNodeRuntimeOptions) {\n this.runtimeModule = runtimeModule;\n this.beforeProcessExitHook = options?.beforeProcessExit ?? null;\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 private async runBeforeProcessExit(logger: LoggerWithScope): Promise<void> {\n if (this.beforeProcessExitHook == null) {\n return;\n }\n try {\n await this.beforeProcessExitHook();\n } catch (error) {\n logger.warn(\"beforeProcessExit 钩子失败(best-effort)\", {\n topic: LOG_TOPIC_PROCESS,\n data: { error: getErrorMessage(error) },\n });\n }\n }\n\n private async exitProcess(code: number, logger: LoggerWithScope): Promise<never> {\n await this.runBeforeProcessExit(logger);\n process.exit(code);\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 /**\n * When true, the main loop skips commands and {@link runLoopSteps} (heartbeat only).\n * Used by the L3 guard process while waiting for connectivity to recover.\n */\n protected isSilenced(): boolean {\n return false;\n }\n\n /**\n * Consecutive heartbeat failures reached {@link HEARTBEAT_FAILURE_THRESHOLD}.\n * Default: shut down the node. Override to wait for recovery instead of exiting.\n */\n protected async onHealthCheckFailed(_ctx: NodeLoopContext): Promise<void> {\n this.requestShutdown(\"heartbeat:consecutive-failures\");\n }\n\n /** Heartbeat succeeded while {@link isSilenced} is true. Default: no-op. */\n protected async onHeartbeatRecovered(_ctx: NodeLoopContext): Promise<void> {}\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 if (!this.isSilenced()) {\n await this.batchCommand(loopCtx);\n }\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 if (!this.isSilenced()) {\n await this.runLoopSteps(loopCtx, heartbeatOk);\n }\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(async (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 await this.exitProcess(1, logger);\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 await this.exitProcess(0, logger);\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 await this.exitProcess(0, logger);\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 await this.onHealthCheckFailed(ctx);\n } else {\n logger.warn(\"心跳更新失敗\", { topic: LOG_TOPIC_NODE, data: logData });\n }\n return false;\n }\n\n this.consecutiveHeartbeatFailures = 0;\n if (this.isSilenced()) {\n await this.onHeartbeatRecovered(ctx);\n }\n // Success is the steady state every loop — do not INFO-spam; failures already warn/critical.\n logger.debug(\"心跳更新成功\", {\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 let commandList: Awaited<ReturnType<typeof getPollCommandList>>[\"data\"] = [];\n try {\n const polled = await getPollCommandList({\n nodeId,\n traceId: loopTraceId,\n size: MAX_POLL_TARGET_LIST_SIZE,\n });\n if (polled.error) {\n cmdLogger.warn(\"獲取指令失敗\", {\n topic: LOG_TOPIC_COMMAND,\n data: { error: polled.error.message },\n });\n return;\n }\n commandList = polled.data ?? [];\n } catch (error) {\n // pollTargetList throws on transport/DB failures — treat as soft miss, not loop CRITICAL.\n cmdLogger.warn(\"獲取指令失敗\", {\n topic: LOG_TOPIC_COMMAND,\n data: { error: getErrorMessage(error) },\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 { resolveLogSpoolSpawnEnvForLabel } from \"../../shared/log/spool/enable\";\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\" | \"critical\">;\n useTsx?: boolean;\n}\n\nexport interface SpawnChildOptions {\n env?: Record<string, string>;\n useTsx?: boolean;\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\nexport interface CriticalExitHandler {\n labels: readonly string[];\n onCriticalExit: (label: string, code: number | null, signal: NodeJS.Signals | null) => void;\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 defaultUseTsx: boolean;\n private readonly logger?: Pick<LoggerWithScope, \"info\" | \"warn\" | \"error\" | \"critical\">;\n private readonly byLabel = new Map<string, ChildProcess>();\n private criticalExitHandler: CriticalExitHandler | null = null;\n private suppressCriticalExit = false;\n\n constructor(options: ManagedChildProcessesOptions) {\n this.projectRoot = options.projectRoot;\n this.preloadModules = options.preloadModules ?? [];\n this.graceMs = options.graceMs ?? 5_000;\n this.defaultUseTsx = options.useTsx ?? true;\n this.logger = options.logger;\n }\n\n setCriticalExitHandler(handler: CriticalExitHandler): void {\n this.criticalExitHandler = handler;\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, spawnOptions?: SpawnChildOptions): SpawnChildResult {\n const existing = this.getRunning(label);\n if (existing != null) {\n return { child: existing, created: false };\n }\n\n const logSpoolEnv = resolveLogSpoolSpawnEnvForLabel(label);\n const childEnv =\n spawnOptions?.env != null\n ? { ...process.env, ...logSpoolEnv, ...spawnOptions.env }\n : { ...process.env, ...logSpoolEnv };\n\n const child = spawnTsxChild({\n projectRoot: this.projectRoot,\n entryScript,\n preloadModules: this.preloadModules,\n useTsx: spawnOptions?.useTsx ?? this.defaultUseTsx,\n env: childEnv,\n });\n\n child.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\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 if (\n !this.suppressCriticalExit &&\n this.criticalExitHandler != null &&\n this.criticalExitHandler.labels.includes(label)\n ) {\n this.criticalExitHandler.onCriticalExit(label, code, signal);\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 this.suppressCriticalExit = true;\n try {\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 } finally {\n this.suppressCriticalExit = false;\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 { createLogger } from \"../../shared/log/core/create-logger\";\nimport type { ManagedChildProcessesOptions } from \"./managed-child-processes\";\nimport { ManagedChildProcesses } from \"./managed-child-processes\";\n\nexport type CreateManagedChildProcessesOptions = Pick<\n ManagedChildProcessesOptions,\n \"projectRoot\" | \"preloadModules\" | \"useTsx\" | \"graceMs\"\n> & {\n /** Defaults to `createLogger({ module: \"launcher\" })`. */\n logger?: ManagedChildProcessesOptions[\"logger\"];\n};\n\nconst DEFAULT_PRELOAD_MODULES = [\"./scripts/preload.mjs\"] as const;\n\n/**\n * Standard L3 service child-process registry: node (not tsx), service preload, launcher logger.\n * Each service keeps a singleton in `src/startup/child-processes.ts`.\n */\nexport function createManagedChildProcesses(options: CreateManagedChildProcessesOptions): ManagedChildProcesses {\n return new ManagedChildProcesses({\n projectRoot: options.projectRoot,\n preloadModules: options.preloadModules ?? DEFAULT_PRELOAD_MODULES,\n useTsx: options.useTsx ?? false,\n graceMs: options.graceMs,\n logger: options.logger ?? createLogger({ module: \"launcher\" }),\n });\n}\n","function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface PollUntilOptions {\n timeoutMs: number;\n intervalMs?: number;\n until: () => boolean | Promise<boolean>;\n}\n\n/**\n * Poll `until()` until it returns true or `timeoutMs` elapses.\n * @throws Error on timeout\n */\nexport async function pollUntil(options: PollUntilOptions): Promise<void> {\n const intervalMs = options.intervalMs ?? 500;\n const deadline = Date.now() + options.timeoutMs;\n\n while (Date.now() < deadline) {\n if (await options.until()) {\n return;\n }\n await sleep(intervalMs);\n }\n\n throw new Error(`pollUntil timeout after ${options.timeoutMs}ms`);\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\";\nimport type { ReadinessCheck, ReadinessReport } from \"./readiness.types\";\nimport { runReadinessChecks } from \"./run-readiness-checks\";\n\nexport interface RunReadinessGateInput {\n checks: ReadinessCheck[];\n onReport: (report: ReadinessReport) => Promise<void>;\n logger: LoggerWithScope;\n logTopic?: string;\n}\n\n/** Run readiness checks, persist report via callback, fail-fast when not ok. */\nexport async function runReadinessGate(input: RunReadinessGateInput): Promise<ReadinessReport> {\n const { checks, onReport, logger, logTopic = \"guard\" } = input;\n\n logger.info(\"Running readiness checks\", { topic: logTopic });\n const report = await runReadinessChecks(checks);\n await onReport(report);\n\n if (!report.ok) {\n logger.error(\"Readiness checks failed\", {\n topic: logTopic,\n data: { message: report.message, checks: report.checks },\n });\n throw new Error(report.message ?? \"Readiness checks failed\");\n }\n\n logger.debug(\"Readiness checks passed\", {\n topic: logTopic,\n data: { checks: report.checks.map((check) => check.name) },\n });\n\n return report;\n}\n","import type { LoggerWithScope } from \"../../shared/log\";\nimport { pollUntil } from \"./poll-until\";\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 let last: ServiceReadySnapshot = { failed: false, ready: false };\n\n try {\n await pollUntil({\n timeoutMs: options.timeoutMs,\n intervalMs: pollMs,\n until: async () => {\n last = await gate.read();\n if (last.failed) {\n throw new Error(last.failureMessage ?? defaultFailureMessage);\n }\n return last.ready;\n },\n });\n } catch (error) {\n if (last.failed) {\n throw error instanceof Error ? error : new Error(defaultFailureMessage);\n }\n const isPollTimeout = error instanceof Error && error.message.startsWith(\"pollUntil timeout after\");\n if (!isPollTimeout) {\n throw error;\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 throw new Error(message);\n }\n\n options.logger?.info(\"service ready\", {\n topic: \"readiness\",\n data: last.readyDetail ?? {},\n });\n return last;\n}\n","import { dirname, join } from \"node:path\";\n\nconst RUNTIME_STATE_SHARD_DIR = \"runtime-state\";\n\nexport interface ResolvedRuntimeStatePaths {\n /** Directory holding one JSON file per top-level slice. */\n stateDir: string;\n /** Legacy monolithic `state.json` — migrated on read/reset when present. */\n legacyFilePath: string | null;\n}\n\n/**\n * Resolve sharded runtime state layout from {@link CreateServiceRuntimeStateStoreOptions.filePath}.\n *\n * | `filePath` | Shard dir | Legacy |\n * |-------------------------|-----------------------------------|---------------|\n * | `.../state.json` | `.../runtime-state/` | `state.json` |\n * | `.../runtime-state/` | same directory | none |\n */\nexport function resolveRuntimeStatePaths(filePath: string): ResolvedRuntimeStatePaths {\n if (filePath.endsWith(\".json\")) {\n return {\n stateDir: join(dirname(filePath), RUNTIME_STATE_SHARD_DIR),\n legacyFilePath: filePath,\n };\n }\n return {\n stateDir: filePath,\n legacyFilePath: null,\n };\n}\n\nexport function runtimeStateShardPath(stateDir: string, sliceKey: string): string {\n return join(stateDir, `${sliceKey}.json`);\n}\n","import { mkdir, readFile, stat, unlink } from \"node:fs/promises\";\nimport { createJsonFileStateStore, type JsonStatePatch } from \"./json-state-store\";\nimport { resolveRuntimeStatePaths, runtimeStateShardPath } from \"./runtime-state-path\";\n\nexport interface CreateShardedJsonFileStateStoreOptions<T extends object, NK extends keyof T> {\n /** Monolithic legacy path or shard directory root (see {@link resolveRuntimeStatePaths}). */\n filePath: string;\n defaultState: T;\n /** Top-level keys persisted as separate shard files. */\n nestedKeys: NK[];\n updatedAtKey?: keyof T;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction mergeSlice<T extends object>(defaults: T, key: keyof T, patchValue: unknown): T[keyof T] {\n const base = defaults[key];\n if (isPlainObject(base) && isPlainObject(patchValue)) {\n return { ...base, ...patchValue } as T[keyof T];\n }\n return patchValue as T[keyof T];\n}\n\n/**\n * JSON runtime state with **one file per top-level slice** (log-persist registry pattern).\n * Eliminates cross-slice lost updates when guard/scheduler/worker write concurrently.\n */\nexport function createShardedJsonFileStateStore<T extends object, NK extends keyof T>(\n options: CreateShardedJsonFileStateStoreOptions<T, NK>,\n): {\n read(): Promise<T>;\n write(patch: JsonStatePatch<T, NK>): Promise<T>;\n reset(): Promise<T>;\n} {\n const { defaultState, nestedKeys, updatedAtKey } = options;\n const { stateDir, legacyFilePath } = resolveRuntimeStatePaths(options.filePath);\n\n type ShardStore = ReturnType<typeof createJsonFileStateStore<object>>;\n const shardStores = new Map<string, ShardStore>();\n\n function shardStore(sliceKey: NK): ShardStore {\n const key = String(sliceKey);\n let store = shardStores.get(key);\n if (store == null) {\n store = createJsonFileStateStore({\n filePath: runtimeStateShardPath(stateDir, key),\n defaultState: defaultState[sliceKey] as object,\n });\n shardStores.set(key, store);\n }\n return store;\n }\n\n async function readUpdatedAtFromShardMtimes(): Promise<string> {\n let maxMtimeMs = 0;\n for (const sliceKey of nestedKeys) {\n try {\n const shardStat = await stat(runtimeStateShardPath(stateDir, String(sliceKey)));\n maxMtimeMs = Math.max(maxMtimeMs, shardStat.mtimeMs);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n if (maxMtimeMs <= 0) {\n return defaultState[updatedAtKey as keyof T] as string;\n }\n return new Date(maxMtimeMs).toISOString();\n }\n\n async function migrateLegacyMonolithicIfPresent(): Promise<void> {\n if (legacyFilePath == null) {\n return;\n }\n\n let raw: string;\n try {\n raw = await readFile(legacyFilePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n\n let parsed: Partial<T>;\n try {\n parsed = JSON.parse(raw) as Partial<T>;\n } catch {\n await unlink(legacyFilePath).catch(() => undefined);\n return;\n }\n\n await mkdir(stateDir, { recursive: true });\n for (const sliceKey of nestedKeys) {\n const slice = parsed[sliceKey];\n if (slice != null) {\n await shardStore(sliceKey).write(slice as object);\n }\n }\n\n await unlink(legacyFilePath).catch(() => undefined);\n }\n\n return {\n async read(): Promise<T> {\n await mkdir(stateDir, { recursive: true });\n await migrateLegacyMonolithicIfPresent();\n\n const merged = { ...defaultState } as T;\n for (const sliceKey of nestedKeys) {\n merged[sliceKey] = (await shardStore(sliceKey).read()) as T[NK];\n }\n if (updatedAtKey != null) {\n merged[updatedAtKey] = (await readUpdatedAtFromShardMtimes()) as T[keyof T];\n }\n return merged;\n },\n\n async write(patch: JsonStatePatch<T, NK>): Promise<T> {\n await mkdir(stateDir, { recursive: true });\n await migrateLegacyMonolithicIfPresent();\n\n for (const sliceKey of nestedKeys) {\n const patchSlice = patch[sliceKey];\n if (patchSlice == null) {\n continue;\n }\n const current = await shardStore(sliceKey).read();\n const nextSlice = mergeSlice(defaultState, sliceKey, {\n ...(current as object),\n ...(patchSlice as object),\n });\n await shardStore(sliceKey).write(nextSlice as object);\n }\n\n return this.read();\n },\n\n async reset(): Promise<T> {\n await mkdir(stateDir, { recursive: true });\n\n for (const sliceKey of nestedKeys) {\n await shardStore(sliceKey).reset();\n }\n\n if (legacyFilePath != null) {\n await unlink(legacyFilePath).catch(() => undefined);\n }\n\n return this.read();\n },\n };\n}\n","import { EMPTY_REGISTRY_SLOT_RUNTIME_STATE } from \"../../service/registry/registry-lifecycle\";\nimport type { JsonStatePatch } from \"../fs/json-state-store\";\nimport { createShardedJsonFileStateStore } from \"../fs/sharded-json-state-store\";\nimport type {\n DefaultExtraRuntimeSlices,\n GuardRuntimeSlice,\n ReadinessRuntimeSlice,\n SchedulerRuntimeSlice,\n ServiceRuntimeExtraSlicePatch,\n ServiceRuntimeNestedKeys,\n ServiceRuntimeState,\n WorkerRuntimeSlice,\n} from \"./service-runtime-state.types\";\n\nconst EPOCH_ISO = new Date(0).toISOString();\n\nexport interface CreateServiceRuntimeStateStoreOptions<\n TExtraSlices extends Record<string, object> = DefaultExtraRuntimeSlices,\n> {\n /**\n * Monolithic legacy path (`…/state.json`) or shard directory (`…/runtime-state/`).\n * Legacy files migrate automatically to `dirname/state.json → runtime-state/*.json`.\n */\n filePath: string;\n /** Default values for service-specific top-level nested slices. */\n extraDefaults?: TExtraSlices;\n}\n\nexport interface FinishRunnerTickOptions<TExtraSlices extends Record<string, object> = DefaultExtraRuntimeSlices> {\n nowMs: number;\n lastFired: Record<string, string>;\n postedCount?: number;\n /** Patch extra slices in the same atomic write as the scheduler tick. */\n extra?: ServiceRuntimeExtraSlicePatch<TExtraSlices>;\n}\n\nexport interface ServiceRuntimeStateStore<TExtraSlices extends Record<string, object> = DefaultExtraRuntimeSlices> {\n readRuntimeState(): Promise<ServiceRuntimeState<TExtraSlices>>;\n writeRuntimeState(\n patch: JsonStatePatch<ServiceRuntimeState<TExtraSlices>, ServiceRuntimeNestedKeys<TExtraSlices>>,\n ): Promise<ServiceRuntimeState<TExtraSlices>>;\n resetRuntimeStateForStartup(): Promise<ServiceRuntimeState<TExtraSlices>>;\n finishRunnerTick(options: FinishRunnerTickOptions<TExtraSlices>): Promise<void>;\n}\n\nfunction createDefaultServiceRuntimeState<TExtraSlices extends Record<string, object>>(options: {\n extraDefaults?: TExtraSlices;\n}): ServiceRuntimeState<TExtraSlices> {\n const readiness: ReadinessRuntimeSlice = {\n status: \"pending\",\n checkedAt: null,\n message: null,\n checks: [],\n };\n const guard: GuardRuntimeSlice = {\n nodeId: null,\n lastCheckAt: null,\n lastDecision: null,\n lastSpawnAt: null,\n spawnCount: 0,\n mode: \"healthy\",\n silentEnteredAt: null,\n silentLastHeartbeatAt: null,\n silentBackoffMs: 0,\n silentConsecutiveFailures: 0,\n silentRecoveryAttempt: 0,\n silentEvents: [],\n };\n const scheduler: SchedulerRuntimeSlice = {\n lastTickAt: null,\n lastPostedCount: 0,\n lastFired: {},\n pid: null,\n spawnedAt: null,\n ready: false,\n readyAt: null,\n };\n const worker: WorkerRuntimeSlice = {\n pid: null,\n spawnedAt: null,\n ready: false,\n registeredTasks: [],\n readyAt: null,\n };\n\n return {\n updatedAt: EPOCH_ISO,\n readiness,\n guard,\n scheduler,\n worker,\n registry: { ...EMPTY_REGISTRY_SLOT_RUNTIME_STATE },\n ...(options.extraDefaults ?? ({} as TExtraSlices)),\n };\n}\n\n/** Sharded JSON runtime state (L3 blueprint) — one file per slice under `runtime-state/`. */\nexport function createServiceRuntimeStateStore<TExtraSlices extends Record<string, object> = DefaultExtraRuntimeSlices>(\n options: CreateServiceRuntimeStateStoreOptions<TExtraSlices>,\n): ServiceRuntimeStateStore<TExtraSlices> {\n type State = ServiceRuntimeState<TExtraSlices>;\n type NK = ServiceRuntimeNestedKeys<TExtraSlices>;\n\n const defaultState = createDefaultServiceRuntimeState(options);\n const nestedKeys = [\n \"readiness\",\n \"guard\",\n \"scheduler\",\n \"worker\",\n \"registry\",\n ...(Object.keys(options.extraDefaults ?? {}) as (keyof TExtraSlices & string)[]),\n ] as NK[];\n\n const store = createShardedJsonFileStateStore<State, NK>({\n filePath: options.filePath,\n defaultState,\n nestedKeys,\n updatedAtKey: \"updatedAt\",\n });\n\n return {\n readRuntimeState: () => store.read(),\n writeRuntimeState: (patch) => store.write(patch),\n resetRuntimeStateForStartup: () => store.reset(),\n finishRunnerTick: async ({ nowMs, lastFired, postedCount, extra }) => {\n await store.write({\n scheduler: {\n lastTickAt: new Date(nowMs).toISOString(),\n lastFired,\n ...(postedCount != null ? { lastPostedCount: postedCount } : {}),\n },\n ...extra,\n } as JsonStatePatch<State, NK>);\n },\n };\n}\n","export const LOG_TOPIC_TRIGGER = \"trigger\";\n\n/** Default main-loop interval for {@link TriggerNode} when `loopIntervalMs` is omitted (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(\n loopIntervalMs: number = TRIGGER_LOOP_INTERVAL_MS,\n ): Array<{ key: string; intervalMs: number }> {\n return [...runnerRegistry.values()]\n .filter((runner) => runner.intervalMs < loopIntervalMs)\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 {\n registrySlotRuntimePatchFromGuardResult,\n runRegistrySlotGuardCheck,\n} from \"../../service/registry/registry-lifecycle\";\nimport type { LoggerWithScope } from \"../../shared/log\";\n\nexport interface ApplyRegistrySlotGuardInput {\n serviceValue: string;\n serviceId: string;\n checkedAt: string;\n logger: Pick<LoggerWithScope, \"critical\" | \"warn\">;\n logTopic?: string;\n traceId?: string;\n}\n\nexport interface ApplyRegistrySlotGuardResult {\n /** When false, caller should abort the supervisor tick (slot lost shutdown initiated). */\n continueTick: boolean;\n registryPatch: ReturnType<typeof registrySlotRuntimePatchFromGuardResult>;\n}\n\n/**\n * Run registry slot ownership check and optionally SIGTERM the parent main process.\n * Used by guard / supervisor TriggerNode runners across L3 services.\n */\nexport async function applyRegistrySlotGuardStep(\n input: ApplyRegistrySlotGuardInput,\n): Promise<ApplyRegistrySlotGuardResult> {\n const result = await runRegistrySlotGuardCheck({\n serviceValue: input.serviceValue,\n serviceId: input.serviceId,\n });\n const registryPatch = registrySlotRuntimePatchFromGuardResult(result, input.checkedAt);\n\n if (result.shouldShutdown) {\n input.logger.critical(\"Registry slot lost — shutting down service\", {\n topic: input.logTopic ?? \"guard\",\n data: {\n traceId: input.traceId,\n serviceId: input.serviceId,\n serviceValue: input.serviceValue,\n },\n });\n process.kill(process.ppid, \"SIGTERM\");\n return { continueTick: false, registryPatch };\n }\n\n if (result.error != null) {\n input.logger.warn(\"Registry slot check failed (transient) — skipping enforcement this tick\", {\n topic: input.logTopic ?? \"guard\",\n data: {\n traceId: input.traceId,\n serviceId: input.serviceId,\n message: result.error,\n },\n });\n }\n\n return { continueTick: true, registryPatch };\n}\n","let lastWorkerSpawnAt = 0;\n\nexport function getWorkerSpawnCooldownLastAt(): number {\n return lastWorkerSpawnAt;\n}\n\nexport function markWorkerSpawned(at = Date.now()): void {\n lastWorkerSpawnAt = at;\n}\n\nexport function resetWorkerSpawnCooldownForTests(): void {\n lastWorkerSpawnAt = 0;\n}\n","import { scanTargetList } from \"../../core.api\";\nimport { patchServiceRuntime } from \"../../service/registry/registry.service\";\nimport { CategoryNode, type Node } from \"../node.interface\";\nimport { evaluateBusyNodeLiveness } from \"../node-liveness\";\nimport { applyRegistrySlotGuardStep } from \"./registry-slot-guard-step\";\nimport type { ServiceGuardTickInput, ServiceGuardTickResult } from \"./service-guard.interface\";\nimport { getWorkerSpawnCooldownLastAt, markWorkerSpawned } from \"./worker-spawn-cooldown\";\n\n/**\n * One guard-runner tick: registry slot check, TaskNode liveness, optional worker\n * respawn, Service runtime heartbeat rollup.\n */\nexport async function runServiceGuardTick(input: ServiceGuardTickInput): Promise<ServiceGuardTickResult> {\n const {\n serviceValue,\n serviceId,\n nodeId,\n loopTraceId,\n logger,\n logTopic = \"guard\",\n checkedAt,\n nowMs,\n taskNodeStaleMs,\n workerSpawnCooldownMs,\n maxNodes = 200,\n spawnWorker,\n getLastWorkerSpawnAt = getWorkerSpawnCooldownLastAt,\n markWorkerSpawned: markWorkerSpawnedAt = markWorkerSpawned,\n } = input;\n\n const continueTick = true;\n let registryPatch: ServiceGuardTickResult[\"registryPatch\"];\n let decision = \"idle\";\n\n if (serviceId != null) {\n const guard = await applyRegistrySlotGuardStep({\n serviceValue,\n serviceId,\n checkedAt,\n logger,\n logTopic,\n traceId: loopTraceId,\n });\n registryPatch = guard.registryPatch;\n if (!guard.continueTick) {\n return { continueTick: false, decision: \"slot_lost\", nodes: [], registryPatch };\n }\n decision = \"slot_ok\";\n }\n\n const { data: nodes = [] } = await scanTargetList<Node>({\n category: CategoryNode.NODE,\n maxRows: maxNodes,\n });\n\n const liveness = evaluateBusyNodeLiveness(nodes, {\n staleMs: taskNodeStaleMs,\n now: nowMs,\n excludeNodeId: nodeId,\n onlyFreshCandidates: true,\n });\n\n const ageMs = liveness.freshest?.ageMs ?? Number.POSITIVE_INFINITY;\n\n if (liveness.healthy) {\n decision = \"healthy\";\n } else if (nowMs - getLastWorkerSpawnAt() < workerSpawnCooldownMs) {\n decision = \"spawn_cooldown\";\n logger.warn(\"TaskNode unavailable but spawn cooldown active\", {\n topic: logTopic,\n data: {\n traceId: loopTraceId,\n ageMs,\n staleMs: taskNodeStaleMs,\n cooldownMs: workerSpawnCooldownMs,\n },\n });\n } else {\n decision = \"spawn_worker\";\n logger.warn(\"TaskNode stale — restarting worker\", {\n topic: logTopic,\n data: {\n traceId: loopTraceId,\n peerWorkerCount: liveness.busyWorkerCount,\n freshPeerCount: liveness.freshWorkerCount,\n staleMs: taskNodeStaleMs,\n },\n });\n await spawnWorker(\"guard:restart-unhealthy-tasknode\");\n markWorkerSpawnedAt(nowMs);\n }\n\n try {\n await patchServiceRuntime({\n serviceValue,\n serviceId: serviceId ?? undefined,\n nodes,\n lastHeartBeat: nowMs,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn(\"Failed to patch Service runtime rollup\", {\n topic: logTopic,\n data: { traceId: loopTraceId, message },\n });\n }\n\n return { continueTick, decision, nodes, registryPatch };\n}\n","import type { RegistrySlotRuntimeState } from \"../../service/registry/registry-lifecycle\";\nimport type { LoggerWithScope } from \"../../shared/log\";\nimport type { Node } from \"../node.interface\";\nimport type { ReadinessCheck, ReadinessReport } from \"../readiness/readiness.types\";\nimport type { GuardRuntimeSlice } from \"../runtime-state/service-runtime-state.types\";\n\n/** Default TriggerManager runner key for {@link registerServiceGuardRunner}. */\nexport const SERVICE_GUARD_RUNNER_KEY = \"service-guard\";\n\nexport interface ServiceGuardTickInput {\n serviceValue: string;\n serviceId: string | null;\n nodeId: string;\n loopTraceId: string;\n logger: LoggerWithScope;\n logTopic?: string;\n checkedAt: string;\n nowMs: number;\n taskNodeStaleMs: number;\n workerSpawnCooldownMs: number;\n maxNodes?: number;\n spawnWorker: (reason: string) => Promise<void>;\n getLastWorkerSpawnAt?: () => number;\n markWorkerSpawned?: (at: number) => void;\n}\n\nexport interface ServiceGuardTickResult {\n continueTick: boolean;\n decision: string;\n nodes: Node[];\n registryPatch?: Pick<RegistrySlotRuntimeState, \"slotOwned\" | \"lastSlotCheckAt\" | \"lastSlotCheckError\">;\n}\n\nexport interface RegisterServiceGuardRunnerOptions {\n serviceValue: string;\n getServiceId: () => Promise<string | null>;\n logTopic?: string;\n runnerKey?: string;\n intervalMs: number;\n initialDelayMs?: number;\n taskNodeStaleMs: number;\n workerSpawnCooldownMs: number;\n maxNodes?: number;\n spawnWorker: (reason: string) => Promise<void>;\n onRegistryPatch: (\n patch: Pick<RegistrySlotRuntimeState, \"slotOwned\" | \"lastSlotCheckAt\" | \"lastSlotCheckError\">,\n ) => Promise<void>;\n onGuardPatch: (patch: Partial<GuardRuntimeSlice>) => Promise<void>;\n onDecision?: (decision: string) => Promise<void>;\n}\n\nexport interface ServiceGuardNodeOptions {\n serviceValue: string;\n logTopic?: string;\n readinessChecks: ReadinessCheck[];\n onReadinessReport: (report: ReadinessReport) => Promise<void>;\n guardRunner: Omit<RegisterServiceGuardRunnerOptions, \"serviceValue\" | \"logTopic\" | \"runnerKey\" | \"spawnWorker\">;\n /**\n * Idempotent spawn of all business nodes (scheduler + worker, etc.).\n * Used at bootstrap, silent recovery, and healthy-mode TaskNode respawn.\n */\n spawnBusinessNodes: (reason: string) => Promise<void>;\n /** Stop business nodes only (never the guard process). */\n stopBusinessNodes: () => Promise<void>;\n /** Local runtime gate: all business nodes registered and ready. */\n isBusinessReady: () => Promise<boolean>;\n /** Timeout for {@link isBusinessReady} during bootstrap and recovery. Default 180s. */\n businessReadyTimeoutMs?: number;\n /** Extra hook after the initial business spawn (cooldown is recorded automatically). */\n onWorkerSpawned?: () => void;\n beforeProcessExit?: () => void | Promise<void>;\n}\n\n/** True when the guard slice is serving traffic (`mode` omitted = legacy healthy). */\nexport function isGuardAvailable(guard: Pick<GuardRuntimeSlice, \"mode\">): boolean {\n return guard.mode == null || guard.mode === \"healthy\";\n}\n\n/**\n * Seconds for `Retry-After` when the guard is not serving traffic.\n * `null` when {@link isGuardAvailable} is true.\n */\nexport function guardRetryAfterSec(guard: Pick<GuardRuntimeSlice, \"mode\" | \"silentBackoffMs\">): number | null {\n if (isGuardAvailable(guard)) {\n return null;\n }\n const backoffMs = guard.silentBackoffMs > 0 ? guard.silentBackoffMs : 15_000;\n return Math.max(1, Math.ceil(backoffMs / 1000));\n}\n","import type { TriggerRunnerContext } from \"../../trigger/trigger.interface\";\nimport { TriggerManager } from \"../../trigger/trigger-manager\";\nimport { runServiceGuardTick } from \"./run-service-guard-tick\";\nimport { type RegisterServiceGuardRunnerOptions, SERVICE_GUARD_RUNNER_KEY } from \"./service-guard.interface\";\n\nasync function runServiceGuardRunner(\n ctx: TriggerRunnerContext,\n options: RegisterServiceGuardRunnerOptionsWithClock,\n): Promise<void> {\n const { loopTraceId, nodeId, logger } = ctx;\n const nowMs = options.now?.() ?? Date.now();\n const checkedAt = new Date(nowMs).toISOString();\n const serviceId = await options.getServiceId();\n\n const result = await runServiceGuardTick({\n serviceValue: options.serviceValue,\n serviceId,\n nodeId,\n loopTraceId,\n logger,\n logTopic: options.logTopic,\n checkedAt,\n nowMs,\n taskNodeStaleMs: options.taskNodeStaleMs,\n workerSpawnCooldownMs: options.workerSpawnCooldownMs,\n maxNodes: options.maxNodes,\n spawnWorker: options.spawnWorker,\n });\n\n if (result.registryPatch != null) {\n await options.onRegistryPatch(result.registryPatch);\n }\n\n if (!result.continueTick) {\n return;\n }\n\n await options.onGuardPatch({\n nodeId,\n lastCheckAt: checkedAt,\n lastDecision: result.decision,\n });\n\n if (options.onDecision != null) {\n await options.onDecision(result.decision);\n }\n}\n\nexport interface RegisterServiceGuardRunnerOptionsWithClock extends RegisterServiceGuardRunnerOptions {\n /** Test hook — defaults to Date.now(). */\n now?: () => number;\n}\n\n/** Register the standard L3 guard runner (registry slot + TaskNode + Service runtime). */\nexport function registerServiceGuardRunner(options: RegisterServiceGuardRunnerOptionsWithClock): void {\n TriggerManager.registerRunner({\n key: options.runnerKey ?? SERVICE_GUARD_RUNNER_KEY,\n intervalMs: options.intervalMs,\n initialDelayMs: options.initialDelayMs,\n fn: (ctx) => runServiceGuardRunner(ctx, options),\n });\n}\n","import { access, constants, readdir, readFile, rename, stat, unlink } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { isLogEntry } from \"../core/log-batch\";\nimport { computeLogBatchIdempotencyKey } from \"../upload/batch-id\";\nimport { buildLogListDraft, postLogBatch } from \"../upload/flush\";\nimport { spoolLogger } from \"../upload/logger\";\nimport { type DEFAULT_LOG_SPOOL_CONFIG, resolveLogSpoolConfig } from \"./config\";\nimport { parseLogSpoolBatchFilename } from \"./file\";\nimport type { LogSpoolBatchFile, LogSpoolProcessRole } from \"./interface\";\nimport { logSpoolProcessDir, resolveLogSpoolRoot } from \"./paths\";\nimport { resolveAllLogSpoolProcessRoles } from \"./process-roles\";\n\nconst UPLOAD_LANE = \"slow\";\n\n/** Per serviceId — guard collect-log tick runs GC at most once per `gc.intervalMs`. */\nconst lastGcAtMsByServiceId = new Map<string, number>();\n\nexport interface RunCollectLogTickInput {\n serviceId: string;\n serviceValue: string;\n spoolRoot?: string;\n config?: Partial<typeof DEFAULT_LOG_SPOOL_CONFIG>;\n nowMs?: number;\n}\n\nexport interface RunCollectLogTickResult {\n uploaded: number;\n skipped: number;\n failed: number;\n gcTmpRemoved: number;\n gcSyncedRemoved: number;\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readBatchTmpFile(tmpPath: string): Promise<LogSpoolBatchFile | null> {\n try {\n const raw = await readFile(tmpPath, \"utf8\");\n const parsed = JSON.parse(raw) as LogSpoolBatchFile;\n if (!Array.isArray(parsed.entries) || parsed.entries.length === 0) {\n return null;\n }\n const entries = parsed.entries.filter(isLogEntry);\n if (entries.length === 0) {\n return null;\n }\n return { entries, meta: parsed.meta };\n } catch {\n return null;\n }\n}\n\nfunction processMetaKey(serviceId: string, processRole: LogSpoolProcessRole): string {\n return `${serviceId}:${processRole}`;\n}\n\nasync function uploadTmpBatch(input: {\n serviceId: string;\n serviceValue: string;\n processRole: LogSpoolProcessRole;\n tmpPath: string;\n fileName: string;\n spoolRoot: string;\n postTimeoutMs: number;\n}): Promise<\"uploaded\" | \"skipped\" | \"failed\"> {\n const parsed = parseLogSpoolBatchFilename(input.fileName);\n if (parsed == null) {\n spoolLogger.warn(\"collect-log skipped — invalid tmp filename\", { fileName: input.fileName });\n return \"failed\";\n }\n\n const jsonFileName = input.fileName.replace(/\\.tmp$/, \".json\");\n const jsonPath = join(logSpoolProcessDir(input.spoolRoot, input.serviceId, input.processRole), jsonFileName);\n\n if (await pathExists(jsonPath)) {\n try {\n await unlink(input.tmpPath);\n spoolLogger.info(\"collect-log removed orphan tmp (json exists)\", {\n tmpPath: input.tmpPath,\n jsonPath,\n });\n } catch {\n // best-effort\n }\n return \"skipped\";\n }\n\n const batch = await readBatchTmpFile(input.tmpPath);\n if (batch == null) {\n spoolLogger.warn(\"collect-log skipped — tmp failed validation\", {\n tmpPath: input.tmpPath,\n fileName: input.fileName,\n });\n try {\n await unlink(input.tmpPath);\n spoolLogger.info(\"collect-log removed invalid tmp\", { tmpPath: input.tmpPath });\n } catch {\n // best-effort\n }\n return \"failed\";\n }\n\n const processKey = processMetaKey(input.serviceId, input.processRole);\n // TODO: `lane` is legacy transport metadata — scheduled for removal; fixed to \"slow\" for downstream decode compatibility.\n const idempotencyKey = computeLogBatchIdempotencyKey({\n service: input.serviceValue,\n process: processKey,\n lane: UPLOAD_LANE,\n entries: batch.entries,\n });\n\n const draft = buildLogListDraft({\n service: input.serviceValue,\n process: processKey,\n lane: UPLOAD_LANE,\n idempotencyKey,\n entries: batch.entries,\n });\n\n try {\n await postLogBatch(draft, input.postTimeoutMs);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n spoolLogger.error(\"collect-log upload failed\", {\n fileName: input.fileName,\n processRole: input.processRole,\n error: message,\n });\n return \"failed\";\n }\n\n try {\n await rename(input.tmpPath, jsonPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n spoolLogger.error(\"collect-log rename tmp→json failed after upload\", {\n tmpPath: input.tmpPath,\n jsonPath,\n error: message,\n });\n return \"failed\";\n }\n\n spoolLogger.info(\"collect-log uploaded batch\", {\n processRole: input.processRole,\n fileName: jsonFileName,\n entryCount: batch.entries.length,\n idempotencyKey,\n });\n\n return \"uploaded\";\n}\n\nasync function gcTmpFiles(input: {\n spoolRoot: string;\n serviceId: string;\n processRole: LogSpoolProcessRole;\n tmpRetentionMs: number;\n nowMs: number;\n}): Promise<number> {\n const processDir = logSpoolProcessDir(input.spoolRoot, input.serviceId, input.processRole);\n let removed = 0;\n\n try {\n const names = await readdir(processDir);\n for (const name of names) {\n if (!name.endsWith(\".tmp\")) {\n continue;\n }\n const parsed = parseLogSpoolBatchFilename(name);\n if (parsed == null) {\n continue;\n }\n if (input.nowMs - parsed.timestampMs <= input.tmpRetentionMs) {\n continue;\n }\n try {\n await unlink(join(processDir, name));\n removed += 1;\n spoolLogger.info(\"collect-log gc removed stale tmp\", {\n fileName: name,\n processRole: input.processRole,\n });\n } catch {\n // best-effort\n }\n }\n } catch {\n // directory may not exist yet\n }\n\n return removed;\n}\n\nasync function gcSyncedJsonFiles(input: {\n spoolRoot: string;\n serviceId: string;\n syncedRetentionMs: number;\n nowMs: number;\n}): Promise<number> {\n let removed = 0;\n\n for (const processRole of resolveAllLogSpoolProcessRoles()) {\n const processDir = logSpoolProcessDir(input.spoolRoot, input.serviceId, processRole);\n let names: string[] = [];\n try {\n names = await readdir(processDir);\n } catch {\n continue;\n }\n\n for (const name of names) {\n if (!name.endsWith(\".json\")) {\n continue;\n }\n if (parseLogSpoolBatchFilename(name) == null) {\n continue;\n }\n\n const jsonPath = join(processDir, name);\n try {\n const fileStat = await stat(jsonPath);\n if (input.nowMs - fileStat.mtimeMs <= input.syncedRetentionMs) {\n continue;\n }\n await unlink(jsonPath);\n removed += 1;\n spoolLogger.info(\"collect-log gc removed synced json\", {\n fileName: name,\n processRole,\n });\n } catch {\n // best-effort\n }\n }\n }\n\n return removed;\n}\n\nfunction shouldRunGc(serviceId: string, nowMs: number, intervalMs: number): boolean {\n const lastAt = lastGcAtMsByServiceId.get(serviceId) ?? 0;\n if (nowMs - lastAt < intervalMs) {\n return false;\n }\n lastGcAtMsByServiceId.set(serviceId, nowMs);\n return true;\n}\n\n/**\n * Guard-only: upload pending `.tmp` batches, rename to `.json`, then periodic GC.\n * Upload completion is implied by `.json` presence; no sync-state file.\n */\nexport async function runCollectLogTick(input: RunCollectLogTickInput): Promise<RunCollectLogTickResult> {\n const config = resolveLogSpoolConfig(input.config);\n const spoolRoot = input.spoolRoot ?? resolveLogSpoolRoot();\n const nowMs = input.nowMs ?? Date.now();\n\n const result: RunCollectLogTickResult = {\n uploaded: 0,\n skipped: 0,\n failed: 0,\n gcTmpRemoved: 0,\n gcSyncedRemoved: 0,\n };\n\n for (const processRole of resolveAllLogSpoolProcessRoles()) {\n const processDir = logSpoolProcessDir(spoolRoot, input.serviceId, processRole);\n let names: string[] = [];\n try {\n names = await readdir(processDir);\n } catch {\n continue;\n }\n\n for (const name of names) {\n if (!name.endsWith(\".tmp\")) {\n continue;\n }\n const status = await uploadTmpBatch({\n serviceId: input.serviceId,\n serviceValue: input.serviceValue,\n processRole,\n tmpPath: join(processDir, name),\n fileName: name,\n spoolRoot,\n postTimeoutMs: config.writer.postTimeoutMs,\n });\n if (status === \"uploaded\") {\n result.uploaded += 1;\n } else if (status === \"skipped\") {\n result.skipped += 1;\n } else {\n result.failed += 1;\n }\n }\n }\n\n if (shouldRunGc(input.serviceId, nowMs, config.gc.intervalMs)) {\n for (const processRole of resolveAllLogSpoolProcessRoles()) {\n result.gcTmpRemoved += await gcTmpFiles({\n spoolRoot,\n serviceId: input.serviceId,\n processRole,\n tmpRetentionMs: config.gc.tmpRetentionMs,\n nowMs,\n });\n }\n\n result.gcSyncedRemoved = await gcSyncedJsonFiles({\n spoolRoot,\n serviceId: input.serviceId,\n syncedRetentionMs: config.gc.syncedRetentionMs,\n nowMs,\n });\n }\n\n if (result.uploaded > 0 || result.failed > 0) {\n spoolLogger.info(\"collect-log tick complete\", { ...result, serviceId: input.serviceId });\n }\n\n return result;\n}\n","import { LOG_TOPIC_TRIGGER } from \"../../../trigger/trigger.constant\";\nimport { TriggerManager } from \"../../../trigger/trigger-manager\";\nimport { logSpoolEnabledFromEnv } from \"../upload/env\";\nimport { spoolLogger } from \"../upload/logger\";\nimport { runCollectLogTick } from \"./collector\";\nimport { logSpoolConfigFromEnv } from \"./config\";\n\nexport const COLLECT_LOG_RUNNER_KEY = \"collect-log\";\n\nexport interface RegisterCollectLogRunnerOptions {\n serviceValue: string;\n getServiceId: () => Promise<string | null>;\n runnerKey?: string;\n intervalMs?: number;\n initialDelayMs?: number;\n spoolRoot?: string;\n}\n\n/**\n * Guard process only — uploads `.tmp` spool batches and runs GC.\n * Register before {@link TriggerNode.start} (e.g. in {@link ServiceGuardNode.create}).\n */\nexport function registerCollectLogRunner(options: RegisterCollectLogRunnerOptions): void {\n if (!logSpoolEnabledFromEnv()) {\n return;\n }\n\n const config = logSpoolConfigFromEnv();\n const intervalMs = options.intervalMs ?? config.collectIntervalMs;\n\n TriggerManager.registerRunner({\n key: options.runnerKey ?? COLLECT_LOG_RUNNER_KEY,\n intervalMs,\n initialDelayMs: options.initialDelayMs ?? 0,\n retryCount: 1,\n fn: async (ctx) => {\n const serviceId = await options.getServiceId();\n if (serviceId == null) {\n ctx.logger.warn(\"collect-log skipped — serviceId unavailable\", { topic: LOG_TOPIC_TRIGGER });\n return;\n }\n\n const result = await runCollectLogTick({\n serviceId,\n serviceValue: options.serviceValue,\n spoolRoot: options.spoolRoot,\n config,\n });\n\n if (result.uploaded > 0 || result.failed > 0) {\n ctx.logger.info(\"collect-log runner finished\", {\n topic: LOG_TOPIC_TRIGGER,\n data: result,\n });\n }\n },\n });\n\n spoolLogger.info(\"collect-log runner registered\", {\n intervalMs,\n serviceValue: options.serviceValue,\n });\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 private readonly loopIntervalMs: number;\n\n constructor(options?: TriggerNodeOptions) {\n super(\"triggerNode\", { beforeProcessExit: options?.beforeProcessExit });\n this.requireRunners = options?.requireRunners ?? false;\n const loopIntervalMs = options?.loopIntervalMs ?? TRIGGER_LOOP_INTERVAL_MS;\n if (!Number.isFinite(loopIntervalMs) || loopIntervalMs < 1) {\n throw new Error(`[TriggerNode] loopIntervalMs must be a positive number, got ${loopIntervalMs}`);\n }\n this.loopIntervalMs = loopIntervalMs;\n }\n\n protected getLoopIntervalMs(): number {\n return this.loopIntervalMs;\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(this.loopIntervalMs)) {\n logger.warn(\"Runner interval 小於主循環 tick 間隔,實際觸發精度受限\", {\n topic: LOG_TOPIC_TRIGGER,\n data: {\n runnerKey: key,\n intervalMs,\n loopIntervalMs: this.loopIntervalMs,\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","import { createLogger, type LoggerWithScope } from \"../../shared/log\";\nimport { registerCollectLogRunner } from \"../../shared/log/spool/register-collect-log-runner\";\nimport { getErrorMessage } from \"../../shared/utils/error.utils\";\nimport { TriggerNode } from \"../../trigger/trigger-node\";\nimport type { NodeLoopContext } from \"../node-runtime.base\";\nimport { pollUntil } from \"../readiness/poll-until\";\nimport { runReadinessGate } from \"../readiness/run-readiness-gate\";\nimport type { GuardRuntimeSlice } from \"../runtime-state/service-runtime-state.types\";\nimport { registerServiceGuardRunner } from \"./register-service-guard-runner\";\nimport type { ServiceGuardNodeOptions } from \"./service-guard.interface\";\nimport { markWorkerSpawned } from \"./worker-spawn-cooldown\";\n\nconst SILENT_BACKOFF_MS = [15_000, 30_000, 60_000, 120_000, 240_000, 300_000] as const;\nconst SILENT_EVENT_LIMIT = 32;\nconst DEFAULT_BUSINESS_READY_TIMEOUT_MS = 180_000;\n\n/**\n * L3 guard process TriggerNode: readiness gate, business-node spawn owner,\n * and {@link registerServiceGuardRunner} tick (registry slot + liveness + runtime).\n *\n * Consecutive heartbeat failure enters silent mode (no process exit). Recovery\n * respawns business nodes; leaving silent requires heartbeat + all nodes ready.\n *\n * Use {@link ServiceGuardNode.create} so the guard runner is registered before `start()`.\n */\nclass ServiceGuardNode extends TriggerNode {\n private readonly options: ServiceGuardNodeOptions;\n private readonly businessReadyTimeoutMs: number;\n private mode: GuardRuntimeSlice[\"mode\"] = \"healthy\";\n private silentBackoffIndex = 0;\n private silentEvents: GuardRuntimeSlice[\"silentEvents\"] = [];\n private recoverPromise: Promise<void> | null = null;\n\n private constructor(options: ServiceGuardNodeOptions) {\n super({\n requireRunners: true,\n beforeProcessExit: options.beforeProcessExit,\n });\n this.options = options;\n this.businessReadyTimeoutMs = options.businessReadyTimeoutMs ?? DEFAULT_BUSINESS_READY_TIMEOUT_MS;\n }\n\n /** Register the guard runner and return a ready-to-start node. */\n static create(options: ServiceGuardNodeOptions): ServiceGuardNode {\n registerServiceGuardRunner({\n ...options.guardRunner,\n serviceValue: options.serviceValue,\n logTopic: options.logTopic,\n spawnWorker: options.spawnBusinessNodes,\n });\n registerCollectLogRunner({\n serviceValue: options.serviceValue,\n getServiceId: options.guardRunner.getServiceId,\n });\n return new ServiceGuardNode(options);\n }\n\n protected isSilenced(): boolean {\n return this.mode !== \"healthy\";\n }\n\n protected getLoopIntervalMs(): number {\n if (this.mode === \"silent\") {\n return SILENT_BACKOFF_MS[this.silentBackoffIndex] ?? 300_000;\n }\n return super.getLoopIntervalMs();\n }\n\n protected async onHealthCheckFailed(_ctx: NodeLoopContext): Promise<void> {\n if (this.mode !== \"healthy\") {\n this.bumpSilentBackoff();\n await this.persistGuard({\n lastDecision: \"silent_heartbeat_fail\",\n silentConsecutiveFailures: this.silentConsecutiveFailures(),\n silentBackoffMs: this.getLoopIntervalMs(),\n silentLastHeartbeatAt: new Date().toISOString(),\n });\n return;\n }\n await this.enterSilent(\"heartbeat:consecutive-failures\");\n }\n\n protected async onHeartbeatRecovered(ctx: NodeLoopContext): Promise<void> {\n if (this.mode !== \"silent\") {\n return;\n }\n await this.recoverFromSilent(ctx);\n }\n\n protected async onBeforeRegisterNode(nodeLogger: LoggerWithScope): Promise<void> {\n await runReadinessGate({\n checks: this.options.readinessChecks,\n onReport: this.options.onReadinessReport,\n logger: nodeLogger,\n logTopic: this.options.logTopic,\n });\n\n await super.onBeforeRegisterNode(nodeLogger);\n\n nodeLogger.info(\"Spawning business nodes\", {\n topic: this.options.logTopic ?? \"guard\",\n });\n await this.options.spawnBusinessNodes(\"guard:readiness-passed\");\n markWorkerSpawned();\n this.options.onWorkerSpawned?.();\n\n await this.waitUntilBusinessReady();\n await this.persistGuard({\n mode: \"healthy\",\n lastDecision: \"bootstrap_ready\",\n });\n }\n\n protected async runLoopSteps(ctx: NodeLoopContext, heartbeatOk: boolean): Promise<void> {\n await super.runLoopSteps(ctx, heartbeatOk);\n if (this.mode !== \"healthy\" || !heartbeatOk) {\n return;\n }\n // Idempotent — respawn exited children without entering silent (worker stale is the runner's job).\n try {\n await this.options.spawnBusinessNodes(\"guard:ensure-business\");\n } catch (error) {\n this.createGuardLogger().warn(\"ensure-business spawn failed\", {\n topic: this.options.logTopic ?? \"guard\",\n data: { error: getErrorMessage(error) },\n });\n }\n }\n\n private silentConsecutiveFailures(): number {\n return this.silentBackoffIndex + 1;\n }\n\n private bumpSilentBackoff(): void {\n if (this.silentBackoffIndex < SILENT_BACKOFF_MS.length - 1) {\n this.silentBackoffIndex += 1;\n }\n }\n\n private async enterSilent(reason: string): Promise<void> {\n this.mode = \"silent\";\n this.silentBackoffIndex = 0;\n const enteredAt = new Date().toISOString();\n this.pushEvent(\"enter\", reason);\n await this.persistGuard({\n mode: \"silent\",\n lastDecision: `silent:${reason}`,\n silentEnteredAt: enteredAt,\n silentLastHeartbeatAt: enteredAt,\n silentBackoffMs: SILENT_BACKOFF_MS[0],\n silentConsecutiveFailures: 1,\n silentRecoveryAttempt: 0,\n silentEvents: this.silentEvents,\n });\n\n const logger = this.createGuardLogger();\n logger.warn(\"Entering silent mode — service unavailable until heartbeat + business nodes recover\", {\n topic: this.options.logTopic ?? \"guard\",\n data: { reason },\n });\n\n try {\n await this.options.stopBusinessNodes();\n } catch (error) {\n logger.warn(\"stopBusinessNodes failed (best-effort)\", {\n topic: this.options.logTopic ?? \"guard\",\n data: { error: getErrorMessage(error) },\n });\n }\n }\n\n private async recoverFromSilent(ctx: NodeLoopContext): Promise<void> {\n if (this.recoverPromise != null) {\n return this.recoverPromise;\n }\n this.recoverPromise = this.runRecover(ctx).finally(() => {\n this.recoverPromise = null;\n });\n return this.recoverPromise;\n }\n\n private async runRecover(ctx: NodeLoopContext): Promise<void> {\n this.mode = \"recovering\";\n this.pushEvent(\"recover_start\", ctx.loopTraceId);\n await this.persistGuard({\n mode: \"recovering\",\n lastDecision: \"recovering\",\n silentLastHeartbeatAt: new Date().toISOString(),\n silentRecoveryAttempt: this.silentEvents.filter((event) => event.type === \"recover_start\").length,\n silentEvents: this.silentEvents,\n });\n\n const logger = this.createGuardLogger();\n logger.info(\"Heartbeat restored — recovering business nodes\", {\n topic: this.options.logTopic ?? \"guard\",\n });\n\n try {\n await this.options.stopBusinessNodes();\n } catch (error) {\n logger.warn(\"stopBusinessNodes failed before respawn\", {\n topic: this.options.logTopic ?? \"guard\",\n data: { error: getErrorMessage(error) },\n });\n }\n\n try {\n await this.options.spawnBusinessNodes(\"guard:silent-recover\");\n markWorkerSpawned();\n await this.waitUntilBusinessReady();\n } catch (error) {\n this.pushEvent(\"recover_fail\", getErrorMessage(error));\n this.mode = \"silent\";\n this.bumpSilentBackoff();\n await this.persistGuard({\n mode: \"silent\",\n lastDecision: \"recover_fail\",\n silentBackoffMs: this.getLoopIntervalMs(),\n silentEvents: this.silentEvents,\n });\n logger.warn(\"Recovery failed — returning to silent\", {\n topic: this.options.logTopic ?? \"guard\",\n data: { error: getErrorMessage(error) },\n });\n try {\n await this.options.stopBusinessNodes();\n } catch {\n // best-effort — leftover children are stopped again on the next recover\n }\n return;\n }\n\n this.mode = \"healthy\";\n this.silentBackoffIndex = 0;\n this.pushEvent(\"recover_ok\");\n await this.persistGuard({\n mode: \"healthy\",\n lastDecision: \"recover_ok\",\n silentEnteredAt: null,\n silentBackoffMs: 0,\n silentConsecutiveFailures: 0,\n silentEvents: this.silentEvents,\n });\n logger.success(\"Left silent mode — business nodes ready\", {\n topic: this.options.logTopic ?? \"guard\",\n });\n }\n\n private async waitUntilBusinessReady(): Promise<void> {\n try {\n await pollUntil({\n timeoutMs: this.businessReadyTimeoutMs,\n intervalMs: 500,\n until: () => this.options.isBusinessReady(),\n });\n } catch {\n throw new Error(`Business nodes not ready within ${this.businessReadyTimeoutMs}ms`);\n }\n }\n\n private pushEvent(type: string, detail?: string): void {\n this.silentEvents = [...this.silentEvents, { at: new Date().toISOString(), type, detail }].slice(\n -SILENT_EVENT_LIMIT,\n );\n }\n\n private async persistGuard(patch: Partial<GuardRuntimeSlice>): Promise<void> {\n try {\n await this.options.guardRunner.onGuardPatch(patch);\n } catch {\n // best-effort — disk/runtime state must not take down the guard loop\n }\n }\n\n private createGuardLogger(): LoggerWithScope {\n return createLogger({ module: \"service-guard\" });\n }\n}\n\nexport { ServiceGuardNode };\n","import type { ChildProcess } from \"node:child_process\";\nimport type { ManagedChildProcesses } from \"../process/managed-child-processes\";\nimport type {\n GuardRuntimeSlice,\n SchedulerRuntimeSlice,\n WorkerRuntimeSlice,\n} from \"../runtime-state/service-runtime-state.types\";\n\nconst WORKER_SCRIPT = \"./dist/processes/worker.js\";\nconst GUARD_SCRIPT = \"./dist/processes/guard.js\";\nconst SCHEDULER_SCRIPT = \"./dist/processes/scheduler.js\";\n\nexport interface L3ChildLauncherRuntimeStore {\n readRuntimeState(): Promise<{\n worker: WorkerRuntimeSlice;\n scheduler: SchedulerRuntimeSlice;\n guard: GuardRuntimeSlice;\n }>;\n writeRuntimeState(patch: {\n worker?: Partial<WorkerRuntimeSlice>;\n scheduler?: Partial<SchedulerRuntimeSlice>;\n guard?: Partial<GuardRuntimeSlice>;\n }): Promise<unknown>;\n}\n\nexport interface CreateL3ChildLauncherOptions {\n childProcesses: ManagedChildProcesses;\n readRuntimeState: L3ChildLauncherRuntimeStore[\"readRuntimeState\"];\n writeRuntimeState: L3ChildLauncherRuntimeStore[\"writeRuntimeState\"];\n /** Merged onto the child env. Default: `{ LOG_PERSIST_PROCESS: label }`. */\n spawnEnv?: (label: string) => Record<string, string>;\n}\n\nexport interface L3ChildLauncher {\n spawnGuard: () => ChildProcess;\n spawnTaskWorker: (reason: string) => Promise<ChildProcess>;\n spawnScheduler: (reason: string) => Promise<ChildProcess>;\n spawnBusinessNodes: (reason: string) => Promise<void>;\n stopBusinessNodes: () => Promise<void>;\n isBusinessReady: () => Promise<boolean>;\n stopChildProcesses: () => Promise<void>;\n}\n\nfunction defaultSpawnEnv(label: string): Record<string, string> {\n return { LOG_PERSIST_PROCESS: label };\n}\n\n/**\n * Guard-owned scheduler + worker spawn/stop, plus main-owned Guard spawn.\n * `stopBusinessNodes` must run in the Guard process (that instance's children only).\n * `stopChildProcesses` is for main shutdown (`extraPids` for Guard-spawned PIDs).\n */\nexport function createL3ChildLauncher(options: CreateL3ChildLauncherOptions): L3ChildLauncher {\n const { childProcesses, readRuntimeState, writeRuntimeState } = options;\n const spawnEnv = options.spawnEnv ?? defaultSpawnEnv;\n\n function nowIso(): string {\n return new Date().toISOString();\n }\n\n async function spawnTaskWorker(reason: string): Promise<ChildProcess> {\n const { child, created } = childProcesses.spawn(\"worker\", WORKER_SCRIPT, {\n env: spawnEnv(\"worker\"),\n });\n if (!created) {\n return child;\n }\n\n const current = await readRuntimeState();\n await writeRuntimeState({\n worker: {\n pid: child.pid ?? null,\n spawnedAt: nowIso(),\n ready: false,\n registeredTasks: [],\n readyAt: null,\n },\n guard: {\n lastSpawnAt: nowIso(),\n lastDecision: reason,\n spawnCount: current.guard.spawnCount + 1,\n },\n });\n\n return child;\n }\n\n function spawnGuard(): ChildProcess {\n return childProcesses.spawn(\"guard\", GUARD_SCRIPT, { env: spawnEnv(\"guard\") }).child;\n }\n\n async function spawnScheduler(reason: string): Promise<ChildProcess> {\n const { child, created } = childProcesses.spawn(\"scheduler\", SCHEDULER_SCRIPT, {\n env: spawnEnv(\"scheduler\"),\n });\n if (!created) {\n return child;\n }\n\n await writeRuntimeState({\n scheduler: {\n pid: child.pid ?? null,\n spawnedAt: nowIso(),\n ready: false,\n readyAt: null,\n },\n guard: {\n lastDecision: reason,\n },\n });\n\n return child;\n }\n\n async function spawnBusinessNodes(reason: string): Promise<void> {\n await spawnScheduler(reason);\n await spawnTaskWorker(reason);\n }\n\n async function stopBusinessNodes(): Promise<void> {\n await childProcesses.stopAll();\n await writeRuntimeState({\n worker: {\n pid: null,\n ready: false,\n readyAt: null,\n registeredTasks: [],\n },\n scheduler: {\n pid: null,\n ready: false,\n readyAt: null,\n },\n });\n }\n\n async function isBusinessReady(): Promise<boolean> {\n const state = await readRuntimeState();\n return state.worker.ready && state.scheduler.ready;\n }\n\n async function stopChildProcesses(): Promise<void> {\n const state = await readRuntimeState();\n const extraPids = [state.worker.pid, state.scheduler.pid].filter((pid): pid is number => pid != null);\n await childProcesses.stopAll({ extraPids });\n }\n\n return {\n spawnGuard,\n spawnTaskWorker,\n spawnScheduler,\n spawnBusinessNodes,\n stopBusinessNodes,\n isBusinessReady,\n stopChildProcesses,\n };\n}\n","import { ServiceRegistryError } from \"../../service/registry/registry.service\";\nimport { claimServiceRegistrySlot, type ServiceRegistrySession } from \"../../service/registry/registry-lifecycle\";\nimport type { Service } from \"../../service/service.interface\";\nimport type { LoggerWithScope } from \"../../shared/log\";\n\nexport interface ClaimRegistrySlotOrExitInput {\n serviceValue: string;\n createInstance: () => Promise<Service>;\n logger: LoggerWithScope;\n logTopic: string;\n}\n\n/**\n * Claim a registry slot, or `process.exit(1)` when no EMPTY slot remains.\n * Other errors propagate.\n */\nexport async function claimRegistrySlotOrExit(input: ClaimRegistrySlotOrExitInput): Promise<ServiceRegistrySession> {\n try {\n return await claimServiceRegistrySlot({\n serviceValue: input.serviceValue,\n createInstance: input.createInstance,\n });\n } catch (error) {\n if (error instanceof ServiceRegistryError && error.code === \"SERVICE_SLOTS_FULL\") {\n input.logger.critical(\"No EMPTY registry slot — refusing to start\", {\n topic: input.logTopic,\n data: { serviceValue: input.serviceValue, code: error.code },\n });\n process.exit(1);\n }\n throw error;\n }\n}\n","import { ServiceRegistryError } from \"../../service/registry/registry.service\";\nimport type { ServiceRegistrySession } from \"../../service/registry/registry-lifecycle\";\nimport type { Service } from \"../../service/service.interface\";\nimport { createLogger, type LoggerWithScope } from \"../../shared/log\";\nimport { LOG_SPOOL_SERVICE_ID_ENV } from \"../../shared/log/spool/config\";\nimport { ensureLogSpoolFromEnv } from \"../../shared/log/spool/enable\";\nimport { logSpoolEnabledFromEnv } from \"../../shared/log/upload/env\";\nimport type { ManagedChildProcesses } from \"../process/managed-child-processes\";\nimport { claimRegistrySlotOrExit } from \"./claim-registry-slot\";\n\nexport interface ServiceHostClosable {\n close: () => Promise<void>;\n}\n\nexport interface ServiceHostContext {\n service: Service;\n session: ServiceRegistrySession;\n /** Registry instance id — same as `service.id`; children inherit via spawn env injection. */\n serviceId: string;\n}\n\nexport interface ServiceHostOptions {\n serviceValue: string;\n logger?: LoggerWithScope;\n logTopic?: string;\n childProcesses?: ManagedChildProcesses;\n /** Labels that trigger host shutdown when the child exits unexpectedly. */\n criticalSupervisors?: readonly string[];\n\n prepare?: () => Promise<void>;\n createInstance: () => Promise<Service | { service: Service; baseUrl?: string }>;\n onRegistryClaimed?: (ctx: ServiceHostContext) => Promise<void>;\n startSupervisors?: (ctx: ServiceHostContext) => void | Promise<void>;\n waitUntilReady?: () => Promise<void>;\n startServer?: () => Promise<ServiceHostClosable>;\n /** When true (default), enable file log spool for main after registry claim. */\n enableLogSpoolAfterClaim?: boolean;\n /** Stop child processes and other local resources (not registry release). */\n onShutdown?: (signal: string) => Promise<void>;\n}\n\nconst DEFAULT_CRITICAL_SUPERVISORS = [\"guard\", \"supervisor\"] as const;\n\nexport interface ServiceHost {\n run: () => Promise<void>;\n requestShutdown: (signal: string, exitCode?: number) => void;\n}\n\nfunction unwrapService(created: Service | { service: Service; baseUrl?: string }): Service {\n return typeof created === \"object\" && created != null && \"service\" in created ? created.service : created;\n}\n\nexport function createServiceHost(options: ServiceHostOptions): ServiceHost {\n const logger = options.logger ?? createLogger({ module: \"service-host\" });\n const logTopic = options.logTopic ?? \"startup\";\n const criticalSupervisors = options.criticalSupervisors ?? DEFAULT_CRITICAL_SUPERVISORS;\n\n let session: ServiceRegistrySession | null = null;\n let httpServer: ServiceHostClosable | null = null;\n let shuttingDown = false;\n\n async function shutdown(signal: string, exitCode = 0): Promise<void> {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n\n logger.info(\"shutting down\", { topic: logTopic, data: { signal, exitCode } });\n\n if (httpServer != null) {\n await httpServer.close().catch(() => undefined);\n httpServer = null;\n }\n\n if (options.onShutdown != null) {\n await options.onShutdown(signal).catch(() => undefined);\n }\n\n if (session != null) {\n await session.release();\n session = null;\n }\n\n process.exit(exitCode);\n }\n\n function requestShutdown(signal: string, exitCode = 0): void {\n void shutdown(signal, exitCode);\n }\n\n function installProcessHandlers(): void {\n process.on(\"SIGINT\", () => void shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n\n options.childProcesses?.setCriticalExitHandler({\n labels: criticalSupervisors,\n onCriticalExit: (label, code, signal) => {\n if (shuttingDown) {\n return;\n }\n logger.critical(\"Critical supervisor exited — shutting down service\", {\n topic: logTopic,\n data: { label, code, signal },\n });\n void shutdown(\"supervisor-exit\", 1);\n },\n });\n }\n\n async function run(): Promise<void> {\n installProcessHandlers();\n\n if (options.prepare != null) {\n await options.prepare();\n }\n\n session = await claimRegistrySlotOrExit({\n serviceValue: options.serviceValue,\n createInstance: async () => unwrapService(await options.createInstance()),\n logger,\n logTopic,\n });\n\n const hostCtx: ServiceHostContext = { service: session.service, session, serviceId: session.service.id };\n\n if (options.onRegistryClaimed != null) {\n await options.onRegistryClaimed(hostCtx);\n }\n\n const enableSpool = options.enableLogSpoolAfterClaim ?? true;\n if (enableSpool && logSpoolEnabledFromEnv()) {\n process.env[LOG_SPOOL_SERVICE_ID_ENV] = session.service.id;\n await ensureLogSpoolFromEnv({\n serviceId: session.service.id,\n serviceValue: options.serviceValue,\n processRole: \"main\",\n });\n }\n\n if (options.startSupervisors != null) {\n await options.startSupervisors(hostCtx);\n }\n\n if (options.waitUntilReady != null) {\n await options.waitUntilReady();\n }\n\n if (options.startServer != null) {\n httpServer = await options.startServer();\n }\n }\n\n async function runWithFatalHandling(): Promise<void> {\n try {\n await run();\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n const code = error instanceof ServiceRegistryError ? error.code : undefined;\n logger.error(\"fatal\", { topic: logTopic, data: { message, code } });\n\n if (httpServer != null) {\n await httpServer.close().catch(() => undefined);\n httpServer = null;\n }\n\n if (options.onShutdown != null) {\n await options.onShutdown(\"fatal\").catch(() => undefined);\n }\n\n if (session != null) {\n await session.release().catch(() => undefined);\n session = null;\n }\n\n process.exit(1);\n }\n }\n\n return { run: runWithFatalHandling, requestShutdown };\n}\n","import type { ServiceRegistrySession } from \"../../service/registry/registry-lifecycle\";\nimport type { Service } from \"../../service/service.interface\";\nimport { createLogger, type LoggerWithScope } from \"../../shared/log\";\nimport { claimRegistrySlotOrExit } from \"./claim-registry-slot\";\n\nexport interface SingleProcessServiceContext {\n service: Service;\n session: ServiceRegistrySession;\n}\n\nexport interface SingleProcessServiceOptions {\n serviceValue: string;\n logger?: LoggerWithScope;\n logTopic?: string;\n\n prepare?: () => Promise<void>;\n createInstance: () => Promise<Service>;\n run: (ctx: SingleProcessServiceContext) => Promise<void>;\n}\n\n/**\n * Single-process L3 entry (e.g. log-service): claim registry slot then run the service body.\n * Registry release is the caller's responsibility inside `run` (e.g. TriggerNode `beforeProcessExit`).\n */\nexport async function runSingleProcessService(options: SingleProcessServiceOptions): Promise<void> {\n const logger = options.logger ?? createLogger({ module: \"single-process-service\" });\n const logTopic = options.logTopic ?? \"startup\";\n\n if (options.prepare != null) {\n await options.prepare();\n }\n\n const session = await claimRegistrySlotOrExit({\n serviceValue: options.serviceValue,\n createInstance: options.createInstance,\n logger,\n logTopic,\n });\n\n try {\n await options.run({ service: session.service, session });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(\"fatal\", { topic: logTopic, data: { message } });\n await session.release().catch(() => undefined);\n process.exit(1);\n }\n}\n","import { type Dispatcher, ProxyAgent } from \"undici\";\nimport {\n createLogger,\n type FetchInitFactory,\n fetchBinaryWithRetry,\n fetchWithRetry,\n isRetryableHttpStatus,\n} from \"../../browser\";\nimport type { ResolvedTelegramStorageOptions, TelegramApiResponse } from \"./types\";\n\nconst logger = createLogger({ module: \"telegram\" });\n\nlet cachedDispatcher: Dispatcher | undefined;\nlet cachedProxyUrl: string | undefined;\n\n/** Per-request undici dispatcher when proxyUrl is set (Supabase stays direct). */\nfunction telegramFetchDispatcher(proxyUrl: string | undefined): Dispatcher | undefined {\n if (proxyUrl == null) {\n return undefined;\n }\n if (cachedDispatcher != null && cachedProxyUrl === proxyUrl) {\n return cachedDispatcher;\n }\n cachedDispatcher = new ProxyAgent(proxyUrl);\n cachedProxyUrl = proxyUrl;\n return cachedDispatcher;\n}\n\nfunction telegramNetworkHint(proxyUrl: string | undefined): string {\n return proxyUrl\n ? ` (proxy=${proxyUrl}, ensure Clash/V2Ray is running)`\n : \" (set proxyUrl / TELEGRAM_PROXY if api.telegram.org is blocked)\";\n}\n\nexport interface CallTelegramOptions {\n timeoutMs?: number;\n retryAttempts?: number;\n retryBaseMs?: number;\n}\n\nfunction botApiUrl(options: ResolvedTelegramStorageOptions, method: string): string {\n return `${options.apiBaseUrl}/bot${options.botToken}/${method}`;\n}\n\nexport function telegramFileDownloadUrl(options: ResolvedTelegramStorageOptions, filePath: string): string {\n const normalized = filePath.replace(/^\\/+/, \"\");\n return `${options.apiBaseUrl}/file/bot${options.botToken}/${normalized}`;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction telegramBackoff(attempt: number, retryBaseMs: number): Promise<void> {\n return sleep(retryBaseMs * 2 ** (attempt - 1));\n}\n\n/** Bot API JSON call — transport retry via SDK fetch; outer loop retries Telegram `{ ok: false }`. */\nexport async function callTelegramApi<T>(\n options: ResolvedTelegramStorageOptions,\n method: string,\n initOrFactory: RequestInit | FetchInitFactory,\n callOptions: CallTelegramOptions = {},\n): Promise<T> {\n const timeoutMs = callOptions.timeoutMs ?? options.fetchTimeoutMs;\n const maxAttempts = callOptions.retryAttempts ?? 1;\n const retryBaseMs = callOptions.retryBaseMs ?? options.uploadRetryBaseMs;\n const url = botApiUrl(options, method);\n const label = `Telegram ${method}`;\n const dispatcher = telegramFetchDispatcher(options.proxyUrl);\n const hint = telegramNetworkHint(options.proxyUrl);\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const response = await fetchWithRetry(url, initOrFactory, {\n label,\n timeoutMs,\n maxAttempts: attempt === 1 ? maxAttempts : 1,\n retryBaseMs,\n dispatcher,\n hint,\n logger,\n });\n\n let payload: TelegramApiResponse<T>;\n try {\n payload = (await response.json()) as TelegramApiResponse<T>;\n } catch {\n lastError = new Error(`${label}: invalid JSON response (HTTP ${response.status})`);\n if (attempt < maxAttempts && isRetryableHttpStatus(response.status)) {\n await telegramBackoff(attempt, retryBaseMs);\n continue;\n }\n throw lastError;\n }\n\n if (!payload.ok) {\n const description = payload.description ?? `HTTP ${response.status}`;\n lastError = new Error(`${label}: ${description}`);\n if (attempt < maxAttempts && isRetryableHttpStatus(response.status)) {\n logger.warn(\"retrying after API error\", {\n topic: \"telegram\",\n data: { method, attempt, description },\n });\n await telegramBackoff(attempt, retryBaseMs);\n continue;\n }\n throw lastError;\n }\n\n if (payload.result == null) {\n throw new Error(`${label}: empty result in response`);\n }\n\n if (attempt > 1) {\n logger.info(\"request succeeded after retry\", { topic: \"telegram\", data: { method, attempt } });\n }\n\n return payload.result;\n }\n\n throw lastError ?? new Error(`${label}: request failed`);\n}\n\nexport async function telegramDownloadBinary(\n options: ResolvedTelegramStorageOptions,\n url: string,\n label: string,\n callOptions: CallTelegramOptions = {},\n): Promise<ArrayBuffer> {\n const dispatcher = telegramFetchDispatcher(options.proxyUrl);\n return fetchBinaryWithRetry(\n url,\n { method: \"GET\" },\n {\n label: `Telegram ${label}`,\n timeoutMs: callOptions.timeoutMs ?? options.fetchTimeoutMs,\n maxAttempts: callOptions.retryAttempts ?? 1,\n retryBaseMs: callOptions.retryBaseMs ?? options.uploadRetryBaseMs,\n dispatcher,\n hint: telegramNetworkHint(options.proxyUrl),\n logger,\n },\n );\n}\n","import { callTelegramApi, telegramDownloadBinary, telegramFileDownloadUrl } from \"./api-client\";\nimport type { ResolvedTelegramStorageOptions, TelegramFile } from \"./types\";\n\n/** Download chunk bytes by Telegram `file_id` stored in Chunk.url. */\nexport async function downloadTelegramChunk(\n options: ResolvedTelegramStorageOptions,\n fileId: string,\n): Promise<ArrayBuffer> {\n const file = await callTelegramApi<TelegramFile>(\n options,\n `getFile?file_id=${encodeURIComponent(fileId)}`,\n { method: \"GET\" },\n {\n retryAttempts: options.uploadRetryAttempts,\n retryBaseMs: options.uploadRetryBaseMs,\n },\n );\n\n if (file.file_path == null || file.file_path === \"\") {\n throw new Error(`Telegram getFile: missing file_path for file_id ${fileId}`);\n }\n\n return telegramDownloadBinary(\n options,\n telegramFileDownloadUrl(options, file.file_path),\n `download:${fileId.slice(0, 12)}…`,\n {\n timeoutMs: options.uploadTimeoutMs,\n retryAttempts: options.uploadRetryAttempts,\n retryBaseMs: options.uploadRetryBaseMs,\n },\n );\n}\n","/**\n * Telegram chunk URL encoding: `${messageId}|${fileId}`.\n * Legacy parcels store bare `file_id` (no messageId → cannot deleteMessage).\n */\n\nconst SEPARATOR = \"|\";\n\nexport function encodeTelegramChunkUrl(messageId: number, fileId: string): string {\n return `${messageId}${SEPARATOR}${fileId}`;\n}\n\nexport function parseTelegramChunkUrl(locator: string): { messageId: number | null; fileId: string } {\n const idx = locator.indexOf(SEPARATOR);\n if (idx <= 0) {\n return { messageId: null, fileId: locator };\n }\n const mid = Number(locator.slice(0, idx));\n const fileId = locator.slice(idx + 1);\n if (!Number.isInteger(mid) || mid <= 0 || fileId === \"\") {\n return { messageId: null, fileId: locator };\n }\n return { messageId: mid, fileId };\n}\n","export interface TelegramApiResponse<T> {\n ok: boolean;\n description?: string;\n result?: T;\n}\n\nexport interface TelegramDocument {\n file_id: string;\n file_unique_id: string;\n file_size?: number;\n}\n\nexport interface TelegramMessage {\n message_id: number;\n document?: TelegramDocument;\n}\n\nexport interface TelegramFile {\n file_id: string;\n file_unique_id: string;\n file_size?: number;\n file_path?: string;\n}\n\nexport interface TelegramUploadResult {\n fileId: string;\n messageId: number;\n}\n\n/** Injected config for Telegram Bot API storage — do not read process.env inside SDK. */\nexport interface TelegramStorageProviderOptions {\n botToken: string;\n chatId: string;\n /** Default `https://api.telegram.org`. */\n apiBaseUrl?: string;\n /** HTTP(S) proxy for Telegram only (e.g. Clash). Supabase stays direct. */\n proxyUrl?: string;\n /** Default 30s — getMe / getFile. */\n fetchTimeoutMs?: number;\n /** Default 120s — sendDocument / file download. */\n uploadTimeoutMs?: number;\n /** Default 3. */\n uploadRetryAttempts?: number;\n /** Default 2000 — backoff base for attempt N: base * 2^(N-1). */\n uploadRetryBaseMs?: number;\n}\n\nexport interface ResolvedTelegramStorageOptions {\n botToken: string;\n chatId: string;\n apiBaseUrl: string;\n proxyUrl?: string;\n fetchTimeoutMs: number;\n uploadTimeoutMs: number;\n uploadRetryAttempts: number;\n uploadRetryBaseMs: number;\n}\n\nexport function resolveTelegramStorageOptions(options: TelegramStorageProviderOptions): ResolvedTelegramStorageOptions {\n const botToken = options.botToken.trim();\n const chatId = options.chatId.trim();\n if (botToken === \"\") {\n throw new Error(\"TelegramStorageProviderOptions.botToken is required\");\n }\n if (chatId === \"\") {\n throw new Error(\"TelegramStorageProviderOptions.chatId is required\");\n }\n\n const apiBaseUrl = (options.apiBaseUrl?.trim() || \"https://api.telegram.org\").replace(/\\/$/, \"\");\n const proxyUrl = options.proxyUrl?.trim() || undefined;\n\n return {\n botToken,\n chatId,\n apiBaseUrl,\n proxyUrl: proxyUrl !== \"\" ? proxyUrl : undefined,\n fetchTimeoutMs: options.fetchTimeoutMs ?? 30_000,\n uploadTimeoutMs: options.uploadTimeoutMs ?? 120_000,\n uploadRetryAttempts: options.uploadRetryAttempts ?? 3,\n uploadRetryBaseMs: options.uploadRetryBaseMs ?? 2_000,\n };\n}\n","import type { CreateUploadAdapterOptions, Parcel, StorageProviderModule, UploadTracker } from \"../../browser\";\nimport { isOpaqueChunkUrl } from \"../../browser\";\nimport { callTelegramApi } from \"./api-client\";\nimport { downloadTelegramChunk } from \"./chunk\";\nimport { encodeTelegramChunkUrl, parseTelegramChunkUrl } from \"./chunk-locator\";\nimport {\n type ResolvedTelegramStorageOptions,\n resolveTelegramStorageOptions,\n type TelegramMessage,\n type TelegramStorageProviderOptions,\n type TelegramUploadResult,\n} from \"./types\";\n\nexport const PROVIDER_TELEGRAM = \"telegram\";\n\nexport interface TelegramChunkDeleteResult {\n deleted: number;\n failed: number;\n skipped: number;\n}\n\nexport interface TelegramStorageProvider extends StorageProviderModule {\n readonly provider: typeof PROVIDER_TELEGRAM;\n /** Low-level upload for probes/CLIs. */\n uploadChunk(data: ArrayBuffer, filename: string): Promise<TelegramUploadResult>;\n /** Best-effort deleteMessage for rollback / probe cleanup. */\n deleteMessage(messageId: number): Promise<void>;\n /**\n * Best-effort delete Telegram messages for parcel chunks.\n * Chunks without an encoded messageId (legacy bare file_id) are skipped.\n */\n deleteChunkBlobs(parcel: Parcel): Promise<TelegramChunkDeleteResult>;\n}\n\nasync function uploadChunkToTelegram(\n options: ResolvedTelegramStorageOptions,\n data: ArrayBuffer,\n filename: string,\n): Promise<TelegramUploadResult> {\n const sizeMb = (data.byteLength / (1024 * 1024)).toFixed(2);\n\n const message = await callTelegramApi<TelegramMessage>(\n options,\n \"sendDocument\",\n () => {\n const form = new FormData();\n form.append(\"chat_id\", options.chatId);\n form.append(\"document\", new Blob([data]), filename);\n return { method: \"POST\", body: form };\n },\n {\n timeoutMs: options.uploadTimeoutMs,\n retryAttempts: options.uploadRetryAttempts,\n retryBaseMs: options.uploadRetryBaseMs,\n },\n );\n\n const fileId = message.document?.file_id;\n if (fileId == null || fileId === \"\") {\n throw new Error(`Telegram sendDocument: missing file_id (chunk ${filename}, ${sizeMb} MB)`);\n }\n\n return { fileId, messageId: message.message_id };\n}\n\nasync function deleteTelegramMessage(options: ResolvedTelegramStorageOptions, messageId: number): Promise<void> {\n await callTelegramApi<boolean>(\n options,\n \"deleteMessage\",\n () => {\n const form = new FormData();\n form.append(\"chat_id\", options.chatId);\n form.append(\"message_id\", String(messageId));\n return { method: \"POST\", body: form };\n },\n {\n retryAttempts: 3,\n retryBaseMs: 1_000,\n },\n );\n}\n\nasync function rollbackTelegramUploads(options: ResolvedTelegramStorageOptions, handles: unknown[]): Promise<void> {\n for (const item of handles) {\n const upload = item as TelegramUploadResult;\n if (upload?.messageId == null) {\n continue;\n }\n try {\n await deleteTelegramMessage(options, upload.messageId);\n } catch {\n // Best-effort cleanup\n }\n }\n}\n\nfunction assertTelegramParcel(parcel: Parcel): void {\n const chunks = parcel.details.chunkList;\n if (chunks.length === 0) {\n throw new Error(\"Parcel has no chunks\");\n }\n\n const nonTelegram = chunks.filter((chunk) => chunk.provider != null && chunk.provider !== PROVIDER_TELEGRAM);\n if (nonTelegram.length > 0) {\n const providers = [...new Set(nonTelegram.map((chunk) => chunk.provider))];\n throw new Error(\n `Parcel is not telegram-only (found providers: ${providers.join(\", \")}). ` +\n \"Multi-provider restore is not yet supported for this parcel.\",\n );\n }\n}\n\n/**\n * Build a Telegram {@link StorageProviderModule}. Caller registers it — no side effects.\n *\n * @example\n * ```ts\n * import { createStorageProviderRegistry, createTelegramStorageProvider } from \"target-supabase-sdk/node\";\n * const registry = createStorageProviderRegistry();\n * registry.register(createTelegramStorageProvider({ botToken, chatId, proxyUrl }));\n * ```\n */\nexport function createTelegramStorageProvider(input: TelegramStorageProviderOptions): TelegramStorageProvider {\n const options = resolveTelegramStorageOptions(input);\n\n return {\n provider: PROVIDER_TELEGRAM,\n uploadChunk: (data, filename) => uploadChunkToTelegram(options, data, filename),\n deleteMessage: (messageId) => deleteTelegramMessage(options, messageId),\n async deleteChunkBlobs(parcel) {\n let deleted = 0;\n let failed = 0;\n let skipped = 0;\n for (const chunk of parcel.details.chunkList) {\n if (chunk.provider != null && chunk.provider !== PROVIDER_TELEGRAM) {\n skipped += 1;\n continue;\n }\n const { messageId } = parseTelegramChunkUrl(chunk.url);\n if (messageId == null) {\n skipped += 1;\n continue;\n }\n try {\n await deleteTelegramMessage(options, messageId);\n deleted += 1;\n } catch {\n failed += 1;\n }\n }\n return { deleted, failed, skipped };\n },\n createUploadAdapter(adapterOptions?: CreateUploadAdapterOptions) {\n const tracker = adapterOptions?.tracker as UploadTracker<TelegramUploadResult> | undefined;\n return {\n provider: PROVIDER_TELEGRAM,\n async upload(data, pathOrKey) {\n const result = await uploadChunkToTelegram(options, data, pathOrKey);\n tracker?.push(result);\n // Persist messageId so later deleteParcel can call deleteMessage.\n return { url: encodeTelegramChunkUrl(result.messageId, result.fileId) };\n },\n };\n },\n resolveChunk: (locator) => {\n const { fileId } = parseTelegramChunkUrl(locator);\n return downloadTelegramChunk(options, fileId);\n },\n matchesOpaqueUrl: isOpaqueChunkUrl,\n async probe() {\n try {\n const me = await callTelegramApi<{ username?: string }>(options, \"getMe\", { method: \"GET\" });\n return { ok: true as const, detail: { username: me.username ?? \"unknown\" } };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false as const, error: message };\n }\n },\n rollbackUpload: (handles) => rollbackTelegramUploads(options, handles),\n assertParcelRestorable: assertTelegramParcel,\n };\n}\n","export interface TaskRunResult {\n isSuccess: boolean;\n cost: number;\n extra: unknown;\n}\n\nexport interface TaskExecutionContext {\n taskId: string;\n taskName: string;\n taskTypeKey: string;\n traceId: string;\n}\n\nexport interface TaskFn {\n displayName: string;\n taskTypeKey: string;\n (taskParams: unknown, ctx: TaskExecutionContext): 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/task-local-discovery/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\nexport interface ConfigSchema<T> {\n safeParse(input: unknown): { success: true; data: T } | { success: false; error: { message: string } };\n}\n\nexport interface LoadCachedJsConfigOptions<T> {\n path: string;\n schema: ConfigSchema<T>;\n force?: boolean;\n}\n\nconst jsConfigCache = new Map<string, { mtimeMs: number; data: unknown }>();\n\n/**\n * Import a JS config module, validate with a schema, cache by file mtime.\n * For hot-reload, pass `{ force: true }` or rely on mtime change.\n */\nexport async function loadCachedJsConfigModule<T>(options: LoadCachedJsConfigOptions<T>): Promise<T> {\n const { stat } = await import(\"node:fs/promises\");\n const { path, schema, force } = options;\n const fileStat = await stat(path);\n const cached = jsConfigCache.get(path);\n if (!force && cached != null && cached.mtimeMs === fileStat.mtimeMs) {\n return cached.data as T;\n }\n\n const raw = await importJsConfigModule(path);\n const parsed = schema.safeParse(raw);\n if (!parsed.success) {\n throw new Error(`Invalid config ${path}: ${parsed.error.message}`);\n }\n\n jsConfigCache.set(path, { mtimeMs: fileStat.mtimeMs, data: parsed.data });\n return parsed.data;\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 { stat } from \"node:fs/promises\";\nimport { isAbsolute, resolve } from \"node:path\";\n\nimport { fetchWithRetry } from \"../../http/fetch-retry\";\nimport { isHttpUrl } from \"../../utils/fetch-url\";\nimport type { FeedValue } from \"../feed.interface\";\n\nexport interface CheckFeedLocalAvailabilityInput {\n value: FeedValue;\n storageProvider: string;\n locator: string;\n /** This host id (e.g. `process.env.LOCAL_STORAGE_PROVIDER`). */\n localStorageProvider: string;\n}\n\nexport interface FeedAvailabilityResult {\n ok: boolean;\n /** Absolute path when the locator was resolved on this host. */\n absolutePath?: string;\n reason?: string;\n}\n\nfunction sameStorageHost(storageProvider: string, localStorageProvider: string): boolean {\n return storageProvider.trim() === localStorageProvider.trim();\n}\n\nfunction isFeedDirectoryValue(value: FeedValue): boolean {\n return value === \"feed.image-list\";\n}\n\n/**\n * Local reachability for feed ingest (`.local` source).\n *\n * - Requires `storageProvider === localStorageProvider`.\n * - `locator` must be an absolute path.\n * - `feed.image-list`: directory exists.\n * - Other feed values: non-empty file.\n *\n * **Node-only**\n */\nexport async function checkFeedLocalAvailability(\n input: CheckFeedLocalAvailabilityInput,\n): Promise<FeedAvailabilityResult> {\n const storageProvider = input.storageProvider.trim();\n const localStorageProvider = input.localStorageProvider.trim();\n const locator = input.locator.trim();\n\n if (storageProvider === \"\" || localStorageProvider === \"\") {\n return { ok: false, reason: \"storageProvider and localStorageProvider are required\" };\n }\n if (locator === \"\") {\n return { ok: false, reason: \"locator is empty\" };\n }\n if (!sameStorageHost(storageProvider, localStorageProvider)) {\n return {\n ok: false,\n reason: `storageProvider not on this host (${storageProvider} !== ${localStorageProvider})`,\n };\n }\n if (!isAbsolute(locator)) {\n return { ok: false, reason: `locator must be an absolute path: ${locator}` };\n }\n\n const absolutePath = resolve(locator);\n\n try {\n const info = await stat(absolutePath);\n if (isFeedDirectoryValue(input.value)) {\n if (!info.isDirectory()) {\n return { ok: false, reason: `feed.image-list locator is not a directory: ${absolutePath}` };\n }\n return { ok: true, absolutePath };\n }\n if (!info.isFile()) {\n return { ok: false, reason: `locator is not a file: ${absolutePath}` };\n }\n if (info.size <= 0) {\n return { ok: false, reason: `file is empty: ${absolutePath}` };\n }\n return { ok: true, absolutePath };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: `locator not reachable: ${absolutePath} (${message})` };\n }\n}\n\nconst OSS_CHECK_TIMEOUT_MS = 15_000;\nconst OSS_CHECK_MAX_ATTEMPTS = 2;\n\nexport interface CheckFeedOssAvailabilityOptions {\n /** Override global `fetch` (proxied outbound, etc.). Default: SDK `fetchWithRetry`. */\n fetch?: (url: string, init?: RequestInit) => Promise<Response>;\n /** When true, skip HTTP (co-located Files sandbox, etc.). */\n tryLocalResolve?: (locator: string) => Promise<boolean>;\n timeoutMs?: number;\n}\n\nasync function probeHttpLocator(\n locator: string,\n method: \"HEAD\" | \"GET\",\n options?: CheckFeedOssAvailabilityOptions,\n): Promise<Response> {\n return fetchWithRetry(\n locator,\n {\n method,\n ...(method === \"GET\" ? { headers: { Range: \"bytes=0-0\" } } : {}),\n },\n {\n label: \"feed-oss-check\",\n timeoutMs: options?.timeoutMs ?? OSS_CHECK_TIMEOUT_MS,\n maxAttempts: OSS_CHECK_MAX_ATTEMPTS,\n ...(options?.fetch != null ? { fetch: options.fetch } : {}),\n },\n );\n}\n\n/**\n * Remote reachability for feed ingest (`.oss` source) via HTTP(S).\n *\n * Optional `tryLocalResolve` first (same-host Files). Then `HEAD`, then `GET` with\n * `Range: bytes=0-0` when `HEAD` is not allowed. Pass `fetch` for proxied outbound.\n *\n * **Node-only**\n */\nexport async function checkFeedOssAvailability(\n locator: string,\n options?: CheckFeedOssAvailabilityOptions,\n): Promise<FeedAvailabilityResult> {\n const trimmed = locator.trim();\n if (trimmed === \"\") {\n return { ok: false, reason: \"locator is empty\" };\n }\n if (!isHttpUrl(trimmed)) {\n return { ok: false, reason: `oss locator must be an http(s) URL: ${trimmed}` };\n }\n\n if (options?.tryLocalResolve != null) {\n try {\n if (await options.tryLocalResolve(trimmed)) {\n return { ok: true };\n }\n } catch {\n // fall through to HTTP\n }\n }\n\n try {\n let response = await probeHttpLocator(trimmed, \"HEAD\", options);\n if (response.status === 405 || response.status === 501) {\n response = await probeHttpLocator(trimmed, \"GET\", options);\n }\n if (response.ok || (response.status >= 200 && response.status < 400)) {\n return { ok: true };\n }\n return { ok: false, reason: `oss locator HTTP ${response.status}: ${trimmed}` };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: `oss locator request failed: ${trimmed} (${message})` };\n }\n}\n","import {\n getPossibleTarget,\n getTarget,\n isCreateTargetAlreadyExistsError,\n postTarget,\n updateTarget,\n} from \"../../../core.api\";\nimport type { Target } from \"../../../core.interface\";\nimport { CategoryLink, type Link, type LinkDetails } from \"../../../link/link.interface\";\nimport { createLogger } from \"../../log/core/create-logger\";\nimport { buildFeedLinkDraft, buildFeedTagList, resolveFeedOriginalStorageProvider } from \"../feed.build\";\nimport {\n type FeedIngestSource,\n type FeedOriginal,\n type FeedValue,\n isFeedIngestSource,\n isFeedValue,\n} from \"../feed.interface\";\nimport { feedLinkDedupFilters } from \"../feed.query\";\nimport {\n type CheckFeedOssAvailabilityOptions,\n checkFeedLocalAvailability,\n checkFeedOssAvailability,\n} from \"./feed.access\";\n\nconst logger = createLogger({ module: \"feed\" });\n\nexport interface RegisterFeedInput {\n /** Existing feed Link row id (must still be `.public` unless already ingested with same payload). */\n id: string;\n source: FeedIngestSource;\n storageProvider: string;\n locator: string;\n /** Required when `source` is `.local` (e.g. `process.env.LOCAL_STORAGE_PROVIDER`). Ignored for `.oss`. */\n localStorageProvider?: string;\n /** `.oss` HTTP check: inject `fetch` / same-host resolve. */\n ossCheck?: CheckFeedOssAvailabilityOptions;\n}\n\nexport interface RegisterFeedResult {\n id: string;\n /** `false` when row was already ingested with the same source, storageProvider, and locator. */\n updated: boolean;\n}\n\nfunction parseFeedOriginal(original: unknown): FeedOriginal | null {\n if (original == null || typeof original !== \"object\") {\n return null;\n }\n const record = original as Record<string, unknown>;\n const storageProvider = typeof record.storageProvider === \"string\" ? record.storageProvider : null;\n const locator = typeof record.locator === \"string\" ? record.locator : null;\n if (storageProvider == null || locator == null) {\n return null;\n }\n const twinList = Array.isArray(record.twinList)\n ? record.twinList.filter((entry): entry is string => typeof entry === \"string\")\n : undefined;\n return {\n storageProvider,\n locator,\n ...(twinList !== undefined ? { twinList } : {}),\n };\n}\n\nfunction assertFeedLink(target: Target): Link {\n if (target.category !== CategoryLink.LINK) {\n throw new Error(`registerFeed: target is not a link (category=${target.category})`);\n }\n if (!isFeedValue(target.value)) {\n throw new Error(`registerFeed: target value is not a feed loader: ${target.value}`);\n }\n const details = target.details as LinkDetails | undefined;\n if (details == null || details.loaderKey !== target.value) {\n throw new Error(\"registerFeed: invalid feed link details (loaderKey must equal value)\");\n }\n return target as Link;\n}\n\nfunction hasIngestSourceTag(tagList: string[]): boolean {\n return tagList.some((tag) => tag === \".local\" || tag === \".oss\");\n}\n\nfunction isSameIngestState(link: Link, source: FeedIngestSource, storageProvider: string, locator: string): boolean {\n if (!link.tagList.includes(source)) {\n return false;\n }\n const original = parseFeedOriginal(link.details.original);\n if (original == null) {\n return false;\n }\n return original.storageProvider === storageProvider && original.locator === locator;\n}\n\n/**\n * Ingest a `.public` feed Link: validate locator, then promote `tagList` source to `.local` or `.oss`\n * and update `details.original.storageProvider` + `locator`.\n *\n * **Node-only** — under `shared/feed/node/`; do not import from the browser entry.\n */\nexport async function registerFeed(input: RegisterFeedInput): Promise<RegisterFeedResult> {\n const id = input.id.trim();\n if (id === \"\") {\n throw new Error(\"registerFeed: id is empty\");\n }\n if (!isFeedIngestSource(input.source)) {\n throw new Error(`registerFeed: source must be .local or .oss, got ${String(input.source)}`);\n }\n\n const resolvedStorageProvider = resolveFeedOriginalStorageProvider(input.source, input.storageProvider);\n const locator = input.locator.trim();\n if (locator === \"\") {\n throw new Error(\"registerFeed: locator is empty\");\n }\n\n const { data: target } = await getTarget({ id });\n if (target == null) {\n throw new Error(`registerFeed: target not found: ${id}`);\n }\n\n const link = assertFeedLink(target);\n const feedValue = link.value as FeedValue;\n\n if (!link.tagList.includes(\".public\")) {\n if (isSameIngestState(link, input.source, resolvedStorageProvider, locator)) {\n logger.info(\"feed already ingested\", {\n topic: \"dedup\",\n data: { id, source: input.source, locator },\n });\n return { id, updated: false };\n }\n if (hasIngestSourceTag(link.tagList)) {\n throw new Error(\"registerFeed: feed already ingested with different source, storageProvider, or locator\");\n }\n throw new Error(\"registerFeed: feed is not .public — cannot ingest\");\n }\n\n if (input.source === \".local\") {\n const localStorageProvider = input.localStorageProvider?.trim() ?? \"\";\n if (localStorageProvider === \"\") {\n throw new Error(\"registerFeed: localStorageProvider is required when source is .local\");\n }\n const availability = await checkFeedLocalAvailability({\n value: feedValue,\n storageProvider: resolvedStorageProvider,\n locator,\n localStorageProvider,\n });\n if (!availability.ok) {\n throw new Error(`registerFeed: local locator unavailable — ${availability.reason ?? \"unknown\"}`);\n }\n } else {\n const availability = await checkFeedOssAvailability(locator, input.ossCheck);\n if (!availability.ok) {\n throw new Error(`registerFeed: oss locator unavailable — ${availability.reason ?? \"unknown\"}`);\n }\n }\n\n await updateTarget<Link, LinkDetails>({\n id,\n optimisticLockFilterList: [\n { field: \"category\", operator: \"eq\", value: CategoryLink.LINK },\n { field: \"details->original->>storageProvider\", operator: \"eq\", value: \"\" },\n ],\n updateFn: (row) => {\n if (!row.tagList.includes(\".public\")) {\n throw new Error(\"registerFeed: optimistic lock failed — .public tag missing\");\n }\n if (hasIngestSourceTag(row.tagList) && !row.tagList.includes(\".public\")) {\n throw new Error(\"registerFeed: feed already ingested\");\n }\n\n const details = row.details;\n const prior = parseFeedOriginal(details.original);\n const nextOriginal: FeedOriginal = {\n storageProvider: resolvedStorageProvider,\n locator,\n ...(prior?.twinList !== undefined ? { twinList: prior.twinList } : {}),\n };\n\n return {\n tagList: buildFeedTagList(input.source, row.tagList),\n details: {\n ...details,\n original: nextOriginal,\n },\n };\n },\n });\n\n logger.info(\"feed ingested\", {\n topic: \"register\",\n data: { id, source: input.source, storageProvider: resolvedStorageProvider, locator },\n });\n return { id, updated: true };\n}\n\nexport interface CreateFeedInput {\n /** Full Link `name` (Filter itemName, etc.). */\n name: string;\n value: FeedValue;\n source: FeedIngestSource;\n storageProvider: string;\n locator: string;\n description?: string;\n preview?: string;\n tagList?: string[];\n localStorageProvider?: string;\n ossCheck?: CheckFeedOssAvailabilityOptions;\n}\n\nexport interface CreateFeedResult {\n id: string;\n created: boolean;\n}\n\n/**\n * Insert a new feed Link already on `.local` or `.oss` (not a `.public` promote).\n * Dedup: `category` + `value` + `name`. Same original → `{ created: false }`.\n */\nexport async function createFeed(input: CreateFeedInput): Promise<CreateFeedResult> {\n if (!isFeedValue(input.value)) {\n throw new Error(`createFeed: unsupported feed value: ${String(input.value)}`);\n }\n if (!isFeedIngestSource(input.source)) {\n throw new Error(`createFeed: source must be .local or .oss, got ${String(input.source)}`);\n }\n\n const name = input.name.trim();\n if (name === \"\") {\n throw new Error(\"createFeed: name is empty\");\n }\n\n const resolvedStorageProvider = resolveFeedOriginalStorageProvider(input.source, input.storageProvider);\n const locator = input.locator.trim();\n if (locator === \"\") {\n throw new Error(\"createFeed: locator is empty\");\n }\n\n const { data: existing } = await getPossibleTarget({\n filterList: feedLinkDedupFilters({ value: input.value, name }),\n });\n if (existing != null) {\n const link = existing as Link;\n if (isSameIngestState(link, input.source, resolvedStorageProvider, locator)) {\n return { id: existing.id, created: false };\n }\n throw new Error(\"createFeed: feed name already exists with different source, storageProvider, or locator\");\n }\n\n if (input.source === \".local\") {\n const localStorageProvider = input.localStorageProvider?.trim() ?? \"\";\n if (localStorageProvider === \"\") {\n throw new Error(\"createFeed: localStorageProvider is required when source is .local\");\n }\n const availability = await checkFeedLocalAvailability({\n value: input.value,\n storageProvider: resolvedStorageProvider,\n locator,\n localStorageProvider,\n });\n if (!availability.ok) {\n throw new Error(`createFeed: local locator unavailable — ${availability.reason ?? \"unknown\"}`);\n }\n } else {\n const availability = await checkFeedOssAvailability(locator, input.ossCheck);\n if (!availability.ok) {\n throw new Error(`createFeed: oss locator unavailable — ${availability.reason ?? \"unknown\"}`);\n }\n }\n\n const draft = buildFeedLinkDraft({\n name,\n value: input.value,\n source: input.source,\n storageProvider: resolvedStorageProvider,\n locator,\n description: input.description,\n preview: input.preview ?? locator,\n tagList: input.tagList,\n });\n\n try {\n const { data, error } = await postTarget({\n name: draft.name,\n value: draft.value,\n category: draft.category,\n tagList: draft.tagList,\n details: draft.details,\n });\n if (error != null || data == null) {\n throw new Error(error?.message ?? \"createFeed: postTarget failed\");\n }\n logger.info(\"feed created\", {\n topic: \"register\",\n data: { id: data.id, source: input.source, name, locator },\n });\n return { id: data.id, created: true };\n } catch (error) {\n if (isCreateTargetAlreadyExistsError(error)) {\n const raced = await getPossibleTarget({\n filterList: feedLinkDedupFilters({ value: input.value, name }),\n });\n if (raced.data != null) {\n return { id: raced.data.id, created: false };\n }\n }\n throw error;\n }\n}\n","import { createHash } from \"node:crypto\";\n\n/** SHA-256 hex of image bytes (filename + `details.original.content` for paste-image ideas). */\nexport function hashIdeaPasteImage(buffer: Buffer): string {\n return createHash(\"sha256\").update(buffer).digest(\"hex\");\n}\n","import { IDEA_IMAGE_TEMP_DIR } from \"../idea.interface\";\n\n/** Path suffix on upload-service public URL for temp file download. */\nexport const IDEA_TEMP_DOWNLOAD_PATH_SUFFIX = \"/v0/upload/temp/download\";\n\n/** Flat path under temp sandbox: `idea/paste/{sha256}.{ext}`. */\nexport function buildIdeaPasteRelativePath(contentHash: string, ext: string): string {\n const hash = contentHash.trim();\n const extension = ext.trim().replace(/^\\./, \"\");\n if (hash === \"\" || extension === \"\") {\n throw new Error(\"buildIdeaPasteRelativePath: contentHash and ext are required\");\n }\n return `${IDEA_IMAGE_TEMP_DIR}/${hash}.${extension}`;\n}\n\nfunction normalizeRelativeSandboxPath(path: string): string | null {\n const normalized = path.replace(/\\\\/g, \"/\").trim();\n if (normalized === \"\" || normalized.startsWith(\"/\") || normalized.includes(\"..\")) {\n return null;\n }\n return normalized;\n}\n\n/** Build absolute locator stored in `details.original.url`. */\nexport function buildIdeaTempDownloadLocator(relativePath: string, publicBaseUrl: string): string {\n const sanitized = normalizeRelativeSandboxPath(relativePath);\n if (sanitized == null) {\n throw new Error(\"buildIdeaTempDownloadLocator: invalid relativePath\");\n }\n const base = publicBaseUrl.trim().replace(/\\/+$/, \"\");\n const url = new URL(`${base}${IDEA_TEMP_DOWNLOAD_PATH_SUFFIX}`);\n url.searchParams.set(\"path\", sanitized);\n return url.href;\n}\n\n/** Parse temp download URL → sandbox-relative path, or null when not a temp download URL. */\nexport function parseIdeaTempDownloadLocator(locator: string): string | null {\n const trimmed = locator.trim();\n if (trimmed === \"\") {\n return null;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed, \"http://localhost\");\n } catch {\n return null;\n }\n\n const pathname = parsed.pathname.replace(/\\\\/g, \"/\");\n if (!pathname.endsWith(IDEA_TEMP_DOWNLOAD_PATH_SUFFIX)) {\n return null;\n }\n\n const pathParam = parsed.searchParams.get(\"path\");\n if (pathParam == null || pathParam.trim() === \"\") {\n return null;\n }\n\n return normalizeRelativeSandboxPath(pathParam.trim());\n}\n","import { ensureLogSpoolFromEnv, getLogSpoolStats, logSpoolEnabledFromEnv, shutdownLogSpoolFromEnv } from \"./enable\";\nimport type { LogSpoolWriterStats } from \"./interface\";\n\nexport interface LogSpoolCoordinatorOptions {\n /** Logical service value (e.g. `watch-service`). */\n serviceValue: string;\n /** Instance id after registry claim — passed to child spawn env. */\n serviceId: string;\n}\n\n/** Service-bound facade for file log spool writer lifecycle. */\nexport interface LogSpoolCoordinator {\n isEnabled(): boolean;\n getServiceId(): string;\n /** Enable spool writer in this process. */\n registerProcess(process?: string): Promise<boolean>;\n getWriterStats(): LogSpoolWriterStats | null;\n shutdownLogSpool(): Promise<void>;\n}\n\nexport function createLogSpoolCoordinator(options: LogSpoolCoordinatorOptions): LogSpoolCoordinator {\n const { serviceValue, serviceId } = options;\n\n return {\n isEnabled() {\n return logSpoolEnabledFromEnv();\n },\n\n getServiceId() {\n return serviceId;\n },\n\n registerProcess(process?: string) {\n return ensureLogSpoolFromEnv({\n serviceValue,\n serviceId,\n processRole: process,\n });\n },\n\n getWriterStats() {\n if (!logSpoolEnabledFromEnv()) {\n return null;\n }\n return getLogSpoolStats();\n },\n\n async shutdownLogSpool() {\n if (!logSpoolEnabledFromEnv()) {\n return;\n }\n await shutdownLogSpoolFromEnv();\n },\n };\n}\n","import { logSpoolEnabledFromEnv } from \"../upload/env\";\nimport { ensureLogSpoolFromEnv, getLogSpoolStats, shutdownLogSpoolFromEnv } from \"./enable\";\nimport type { LogSpoolWriterStats } from \"./interface\";\n\n/** Whether file log spool is enabled (`LOG_PERSIST_ENABLED=true`). */\nexport function isLogSpoolEnabled(env: NodeJS.ProcessEnv = process.env): boolean {\n return logSpoolEnabledFromEnv(env);\n}\n\n/**\n * Guard / scheduler / worker (and extra roles) — enable writer from spawn env.\n * Main is enabled by `createServiceHost` after registry claim.\n */\nexport async function enableLogSpoolFromEnvInChild(): Promise<void> {\n if (!logSpoolEnabledFromEnv()) {\n return;\n }\n await ensureLogSpoolFromEnv();\n}\n\n/** Writer buffer stats when spool enabled; `null` when disabled. Typical use: main observability. */\nexport function getMainLogSpoolWriterStats(): LogSpoolWriterStats | null {\n if (!logSpoolEnabledFromEnv()) {\n return null;\n }\n return getLogSpoolStats();\n}\n\n/** Flush memory buffer and disable writer when spool enabled; no-op otherwise. */\nexport async function shutdownLogSpool(): Promise<void> {\n if (!logSpoolEnabledFromEnv()) {\n return;\n }\n await shutdownLogSpoolFromEnv();\n}\n","import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport { isAbsolute, resolve } from \"node:path\";\n\nimport { MEDIA_CONTENT_HASH_ALGORITHM, type MediaOriginal, type MediaValue } from \"../media.interface\";\nimport { guessMediaMime } from \"../media.mime\";\n\nexport interface CheckMediaAvailabilityInput {\n value: MediaValue;\n storageProvider: string;\n locator: string;\n /**\n * This host's storage id (e.g. from `LOCAL_STORAGE_PROVIDER`).\n * Local path checks only run when it equals `storageProvider`.\n */\n localStorageProvider: string;\n}\n\nexport interface MediaAvailabilityResult {\n ok: boolean;\n /** Absolute path when the locator was resolved on this host. */\n absolutePath?: string;\n reason?: string;\n}\n\nfunction sameStorageHost(storageProvider: string, localStorageProvider: string): boolean {\n return storageProvider.trim() === localStorageProvider.trim();\n}\n\nasync function sha256FileStreaming(absolutePath: string): Promise<string> {\n return await new Promise((resolveHash, reject) => {\n const hash = createHash(MEDIA_CONTENT_HASH_ALGORITHM);\n const stream = createReadStream(absolutePath);\n stream.on(\"data\", (chunk) => {\n hash.update(chunk);\n });\n stream.on(\"error\", reject);\n stream.on(\"end\", () => {\n resolveHash(hash.digest(\"hex\"));\n });\n });\n}\n\nasync function countFilesOneLevel(dirPath: string): Promise<number> {\n const entries = await readdir(dirPath, { withFileTypes: true });\n let count = 0;\n for (const entry of entries) {\n if (entry.isFile()) {\n count += 1;\n }\n }\n return count;\n}\n\n/**\n * Fast local reachability check for a media locator.\n *\n * - Requires `storageProvider === localStorageProvider` (cross-host → not ok).\n * - `locator` must be an absolute path.\n * - `image-list`: directory exists; only immediate children are considered.\n * - other values: path exists and is a non-empty file.\n *\n * **Node-only** — under `shared/media/node/`; do not import from the browser entry.\n */\nexport async function checkMediaAvailability(input: CheckMediaAvailabilityInput): Promise<MediaAvailabilityResult> {\n const storageProvider = input.storageProvider.trim();\n const localStorageProvider = input.localStorageProvider.trim();\n const locator = input.locator.trim();\n\n if (storageProvider === \"\" || localStorageProvider === \"\") {\n return { ok: false, reason: \"storageProvider and localStorageProvider are required\" };\n }\n if (locator === \"\") {\n return { ok: false, reason: \"locator is empty\" };\n }\n if (!sameStorageHost(storageProvider, localStorageProvider)) {\n return {\n ok: false,\n reason: `storageProvider not on this host (${storageProvider} !== ${localStorageProvider})`,\n };\n }\n if (!isAbsolute(locator)) {\n return { ok: false, reason: `locator must be an absolute path: ${locator}` };\n }\n\n const absolutePath = resolve(locator);\n\n try {\n const info = await stat(absolutePath);\n if (input.value === \"image-list\") {\n if (!info.isDirectory()) {\n return { ok: false, reason: `image-list locator is not a directory: ${absolutePath}` };\n }\n return { ok: true, absolutePath };\n }\n if (!info.isFile()) {\n return { ok: false, reason: `locator is not a file: ${absolutePath}` };\n }\n if (info.size <= 0) {\n return { ok: false, reason: `file is empty: ${absolutePath}` };\n }\n return { ok: true, absolutePath };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: `locator not reachable: ${absolutePath} (${message})` };\n }\n}\n\n/**\n * Derive `contentHash` / `size` / `mimeType` for {@link MediaOriginal} after availability succeeds.\n *\n * **Node-only** — under `shared/media/node/`; do not import from the browser entry.\n */\nexport async function probeMediaOriginal(input: {\n value: MediaValue;\n storageProvider: string;\n locator: string;\n absolutePath: string;\n}): Promise<MediaOriginal> {\n const storageProvider = input.storageProvider.trim();\n const locator = input.locator.trim();\n\n if (input.value === \"image-list\") {\n const size = await countFilesOneLevel(input.absolutePath);\n return {\n storageProvider,\n locator,\n contentHash: \"\",\n size,\n mimeType: \"\",\n };\n }\n\n const info = await stat(input.absolutePath);\n const mimeType = guessMediaMime(input.absolutePath, input.value);\n if (mimeType == null) {\n throw new Error(`probeMediaOriginal: cannot guess mimeType for ${input.value}: ${input.absolutePath}`);\n }\n const contentHash = await sha256FileStreaming(input.absolutePath);\n return {\n storageProvider,\n locator,\n contentHash,\n size: info.size,\n mimeType,\n };\n}\n","import { getPossibleTarget, isCreateTargetAlreadyExistsError, postTarget, updateTarget } from \"../../../core.api\";\nimport { CategoryLink, type Link, type LinkDetails } from \"../../../link/link.interface\";\nimport { createLogger } from \"../../log/core/create-logger\";\nimport { isHttpUrl } from \"../../utils/fetch-url\";\nimport { buildMediaLinkDraft } from \"../media.build\";\nimport { isMediaValue, type MediaValue } from \"../media.interface\";\nimport { mediaLinkDedupFilters } from \"../media.query\";\nimport { checkMediaAvailability, probeMediaOriginal } from \"./media.access\";\n\nconst logger = createLogger({ module: \"media\" });\n\nexport interface FindMediaLinkInput {\n value: MediaValue;\n name: string;\n}\n\n/** Dedup lookup: same `category` + `value` + `name`. */\nexport async function findMediaLink(input: FindMediaLinkInput): Promise<Link | null> {\n if (!isMediaValue(input.value)) {\n throw new Error(`findMediaLink: unsupported media value: ${String(input.value)}`);\n }\n const name = input.name.trim();\n if (name === \"\") {\n throw new Error(\"findMediaLink: name is empty\");\n }\n const { data } = await getPossibleTarget({\n filterList: mediaLinkDedupFilters({ value: input.value, name }),\n });\n return data != null ? (data as Link) : null;\n}\n\nexport interface RegisterMediaLinkInput {\n value: MediaValue;\n name: string;\n storageProvider: string;\n locator: string;\n /** This host id for availability (e.g. `process.env.LOCAL_STORAGE_PROVIDER`). */\n localStorageProvider: string;\n /**\n * Local file to probe when `locator` is http(s) (OSS ingest).\n * Availability uses this path + `localStorageProvider`.\n */\n localLocator?: string;\n description?: string;\n tagList?: string[];\n}\n\nexport interface RegisterMediaLinkResult {\n id: string;\n created: boolean;\n}\n\nfunction mediaOriginalFromRow(row: { details?: unknown }): { storageProvider?: string; locator?: string } {\n const details = row.details as LinkDetails | undefined;\n const original = details?.original as { storageProvider?: string; locator?: string } | undefined;\n return original ?? {};\n}\n\nasync function patchMediaOriginal(\n existing: Link,\n storageProvider: string,\n locator: string,\n): Promise<RegisterMediaLinkResult> {\n const original = mediaOriginalFromRow(existing);\n if (original.storageProvider === storageProvider && original.locator === locator) {\n return { id: existing.id, created: false };\n }\n await updateTarget({\n id: existing.id,\n optimisticLockFilterList: [\n { field: \"category\", operator: \"eq\", value: CategoryLink.LINK },\n { field: \"value\", operator: \"eq\", value: existing.value },\n ],\n updateFn: (row) => {\n const details = row.details as LinkDetails;\n const prev = (details.original ?? {}) as Record<string, unknown>;\n return {\n details: {\n ...details,\n original: {\n ...prev,\n storageProvider,\n locator,\n },\n },\n };\n },\n });\n logger.info(\"media original patched\", {\n topic: \"register\",\n data: { id: existing.id, locator },\n });\n return { id: existing.id, created: false };\n}\n\n/**\n * Register a media Link: dedup → availability → probe → `postTarget`.\n * Idempotent when `category`+`value`+`name` already exist (local path).\n * HTTP `locator` + `localLocator`: probe local file, persist remote URL; patch if name exists.\n *\n * **Node-only** — under `shared/media/node/`; do not import from the browser entry.\n */\nexport async function registerMediaLink(input: RegisterMediaLinkInput): Promise<RegisterMediaLinkResult> {\n if (!isMediaValue(input.value)) {\n throw new Error(`registerMediaLink: unsupported media value: ${String(input.value)}`);\n }\n const name = input.name.trim();\n if (name === \"\") {\n throw new Error(\"registerMediaLink: name is empty\");\n }\n\n const storageProvider = input.storageProvider.trim();\n const locator = input.locator.trim();\n const localLocator = input.localLocator?.trim() ?? \"\";\n const httpLocator = isHttpUrl(locator);\n\n const existing = await findMediaLink({ value: input.value, name });\n if (existing != null && !httpLocator) {\n logger.info(\"media already registered\", {\n topic: \"dedup\",\n data: { id: existing.id, value: input.value, name },\n });\n return { id: existing.id, created: false };\n }\n if (existing != null && httpLocator) {\n return patchMediaOriginal(existing, storageProvider, locator);\n }\n\n const probeStorageProvider = httpLocator ? input.localStorageProvider.trim() : storageProvider;\n const probeLocator = httpLocator ? localLocator : locator;\n if (httpLocator && probeLocator === \"\") {\n throw new Error(\"registerMediaLink: localLocator is required when locator is http(s)\");\n }\n\n const availability = await checkMediaAvailability({\n value: input.value,\n storageProvider: probeStorageProvider,\n locator: probeLocator,\n localStorageProvider: input.localStorageProvider,\n });\n if (!availability.ok || availability.absolutePath == null) {\n throw new Error(`registerMediaLink: unavailable — ${availability.reason ?? \"unknown\"}`);\n }\n\n const probed = await probeMediaOriginal({\n value: input.value,\n storageProvider: probeStorageProvider,\n locator: probeLocator,\n absolutePath: availability.absolutePath,\n });\n\n const draft = buildMediaLinkDraft({\n value: input.value,\n name,\n storageProvider: httpLocator ? storageProvider : probed.storageProvider,\n locator: httpLocator ? locator : probed.locator,\n contentHash: probed.contentHash,\n size: probed.size,\n mimeType: probed.mimeType,\n description: input.description,\n tagList: input.tagList,\n });\n\n try {\n const { data, error } = await postTarget({\n name: draft.name,\n value: draft.value,\n category: draft.category,\n tagList: draft.tagList,\n details: draft.details,\n });\n if (error != null || data == null) {\n throw new Error(error?.message ?? \"registerMediaLink: postTarget failed\");\n }\n logger.info(\"media registered\", {\n topic: \"register\",\n data: { id: data.id, value: input.value, name, size: probed.size },\n });\n return { id: data.id, created: true };\n } catch (error) {\n if (isCreateTargetAlreadyExistsError(error)) {\n const raced = await findMediaLink({ value: input.value, name });\n if (raced != null) {\n if (httpLocator) {\n return patchMediaOriginal(raced, storageProvider, locator);\n }\n logger.info(\"media register race — using existing\", {\n topic: \"dedup\",\n data: { id: raced.id, value: input.value, name },\n });\n return { id: raced.id, created: false };\n }\n }\n throw error;\n }\n}\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 task-local-discovery 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, TaskExecutionContext, TaskFn } from \"./task-repo-context\";\n\nexport type {\n BootstrapLocalTasksResult,\n BootstrapLocalTasksStatus,\n ExecutableTaskFn,\n TaskExecutionContext,\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, ctx: TaskExecutionContext): ExecutableTaskFn {\n const run = async () => taskFn(taskParams, ctx);\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 taskId,\n taskName,\n taskTypeKey,\n traceId: details.traceId ?? taskId,\n });\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 { type PatchClaimTaskPayload, 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 /** Optional claim filters passed to {@link patchClaimTask} (e.g. name prefix per task type). */\n protected getPatchClaimTaskOptions(): Pick<PatchClaimTaskPayload, \"namePrefixList\"> {\n return {};\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 ...this.getPatchClaimTaskOptions(),\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 * Main loop tick interval (ms). Runners are evaluated each tick; effective runner\n * precision is bounded by this value. Default {@link TRIGGER_LOOP_INTERVAL_MS} (60s).\n */\n loopIntervalMs?: number;\n /**\n * Called after node logout, immediately before `process.exit`.\n * Typical use: {@link unregisterServiceAtShutdown} for single-process L3 services.\n */\n beforeProcessExit?: () => void | Promise<void>;\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/**\n * List all ENABLED triggers. Due-check is in-memory on the caller:\n * filter with `isTriggerDue`, then `patchTriggerFired` with `buildFireKey`\n * (both from `trigger.utils`, exported on `/node`).\n * Do not call this from TriggerNode (local interval runners only).\n */\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","import type { Trigger, TriggerDailySchedule } from \"./trigger.interface\";\n\ninterface UtcDateParts {\n year: number;\n month: number;\n day: number;\n hour: number;\n minute: number;\n}\n\nfunction parseUtcDateParts(now: Date): UtcDateParts {\n return {\n year: now.getUTCFullYear(),\n month: now.getUTCMonth() + 1,\n day: now.getUTCDate(),\n hour: now.getUTCHours(),\n minute: now.getUTCMinutes(),\n };\n}\n\nexport function buildDailyFireKey(_schedule: TriggerDailySchedule, now: Date): string {\n const { year, month, day } = parseUtcDateParts(now);\n const yyyy = String(year).padStart(4, \"0\");\n const mm = String(month).padStart(2, \"0\");\n const dd = String(day).padStart(2, \"0\");\n return `daily:${yyyy}-${mm}-${dd}`;\n}\n\nexport function isDailyScheduleDue(\n schedule: TriggerDailySchedule,\n now: Date,\n lastFireKey: string | null | undefined,\n): boolean {\n const parts = parseUtcDateParts(now);\n if (parts.hour !== schedule.hour || parts.minute !== schedule.minute) {\n return false;\n }\n const fireKey = buildDailyFireKey(schedule, now);\n return lastFireKey !== fireKey;\n}\n\nexport function isTriggerDue(trigger: Trigger, now: Date = new Date()): boolean {\n const { schedule, lastFireKey } = trigger.details;\n if (schedule.kind !== \"daily\") {\n throw new Error(`Unsupported trigger schedule kind: ${String((schedule as { kind?: string }).kind)}`);\n }\n return isDailyScheduleDue(schedule, now, lastFireKey);\n}\n\nexport function buildFireKey(trigger: Trigger, now: Date = new Date()): string {\n const { schedule } = trigger.details;\n if (schedule.kind !== \"daily\") {\n throw new Error(`Unsupported trigger schedule kind: ${String((schedule as { kind?: string }).kind)}`);\n }\n return buildDailyFireKey(schedule, now);\n}\n"],"names":["traceIdSchema","sleep","pathExists","logger","getRegisteredLocalTaskTypeKeys","sameStorageHost"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node.js","sources":["../src/command/command.interface.ts","../src/command/command.api.ts","../src/node/node.utils.ts","../src/node/base-node-runtime.ts","../src/node/env/init-supabase-from-env.ts","../src/node/env/public-base-url.ts","../src/node/fs/file-write-queue.ts","../src/node/fs/json-state-store.ts","../src/node/fs/read-source-file.ts","../src/node/process/process-spawn.ts","../src/node/process/managed-child-processes.ts","../src/node/process/create-managed-child-processes.ts","../src/node/readiness/poll-until.ts","../src/node/readiness/readiness-checks.ts","../src/node/readiness/run-readiness-checks.ts","../src/node/readiness/run-readiness-gate.ts","../src/node/readiness/service-ready-gate.ts","../src/node/fs/runtime-state-path.ts","../src/node/fs/sharded-json-state-store.ts","../src/node/runtime-state/create-service-runtime-state-store.ts","../src/trigger/trigger.constant.ts","../src/trigger/trigger-manager.ts","../src/node/service-guard/registry-slot-guard-step.ts","../src/node/service-guard/worker-spawn-cooldown.ts","../src/node/service-guard/run-service-guard-tick.ts","../src/node/service-guard/service-guard.interface.ts","../src/node/service-guard/register-service-guard-runner.ts","../src/shared/log/spool/collector.ts","../src/shared/log/spool/register-collect-log-runner.ts","../src/trigger/trigger-node.ts","../src/node/service-guard/service-guard-node.ts","../src/node/service-host/create-l3-child-launcher.ts","../src/node/service-host/claim-registry-slot.ts","../src/node/service-host/service-host.ts","../src/node/service-host/single-process-service.ts","../src/node/telegram/api-client.ts","../src/node/telegram/chunk.ts","../src/node/telegram/chunk-locator.ts","../src/node/telegram/types.ts","../src/node/telegram/storage-provider.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/shared/feed/node/feed.access.ts","../src/shared/feed/node/feed.service.ts","../src/shared/idea/node/idea.hash.ts","../src/shared/idea/node/idea.locator.ts","../src/shared/log/spool/coordinator.ts","../src/shared/log/spool/service-lifecycle.ts","../src/shared/media/node/media.access.ts","../src/shared/media/node/media.service.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.utils.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","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\nconst 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 { LOG_TOPIC_NODE } from \"./node.constant\";\nimport { type NodeKind, NodeStatus } from \"./node.interface\";\nimport { formatHeartbeat, getRandomInterval } from \"./node.utils\";\nimport { requireNodeServiceIdFromEnv } from \"./node-service-id\";\n\nexport { LOG_TOPIC_NODE };\n\n/** 主循环单轮运行时上下文 — 由 start() 创建并向下传递 */\nexport interface NodeLoopContext {\n loopTraceId: string;\n nodeId: string;\n}\n\n/** Shared options for {@link BaseNodeRuntime} and subclasses (e.g. TriggerNode). */\nexport interface BaseNodeRuntimeOptions {\n /**\n * Called after node logout (or when the node was never registered),\n * immediately before `process.exit`. Use for best-effort cleanup such as\n * {@link unregisterServiceAtShutdown}. Errors are logged and ignored.\n */\n beforeProcessExit?: () => void | Promise<void>;\n}\n\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\n /** Role written to {@link Node.value} at registration. */\n protected abstract getNodeKind(): NodeKind;\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 private readonly beforeProcessExitHook: (() => void | Promise<void>) | null;\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, options?: BaseNodeRuntimeOptions) {\n this.runtimeModule = runtimeModule;\n this.beforeProcessExitHook = options?.beforeProcessExit ?? null;\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 private async runBeforeProcessExit(logger: LoggerWithScope): Promise<void> {\n if (this.beforeProcessExitHook == null) {\n return;\n }\n try {\n await this.beforeProcessExitHook();\n } catch (error) {\n logger.warn(\"beforeProcessExit 钩子失败(best-effort)\", {\n topic: LOG_TOPIC_PROCESS,\n data: { error: getErrorMessage(error) },\n });\n }\n }\n\n private async exitProcess(code: number, logger: LoggerWithScope): Promise<never> {\n await this.runBeforeProcessExit(logger);\n process.exit(code);\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 /**\n * When true, the main loop skips commands and {@link runLoopSteps} (heartbeat only).\n * Used by the L3 guard process while waiting for connectivity to recover.\n */\n protected isSilenced(): boolean {\n return false;\n }\n\n /**\n * Consecutive heartbeat failures reached {@link HEARTBEAT_FAILURE_THRESHOLD}.\n * Default: shut down the node. Override to wait for recovery instead of exiting.\n */\n protected async onHealthCheckFailed(_ctx: NodeLoopContext): Promise<void> {\n this.requestShutdown(\"heartbeat:consecutive-failures\");\n }\n\n /** Heartbeat succeeded while {@link isSilenced} is true. Default: no-op. */\n protected async onHeartbeatRecovered(_ctx: NodeLoopContext): Promise<void> {}\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 serviceId = requireNodeServiceIdFromEnv();\n const { data, error } = await postRegisterNode({\n serviceId,\n kind: this.getNodeKind(),\n traceId: this.startupTraceId,\n });\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 if (!this.isSilenced()) {\n await this.batchCommand(loopCtx);\n }\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 if (!this.isSilenced()) {\n await this.runLoopSteps(loopCtx, heartbeatOk);\n }\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(async (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 await this.exitProcess(1, logger);\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 await this.exitProcess(0, logger);\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 await this.exitProcess(0, logger);\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 await this.onHealthCheckFailed(ctx);\n } else {\n logger.warn(\"心跳更新失敗\", { topic: LOG_TOPIC_NODE, data: logData });\n }\n return false;\n }\n\n this.consecutiveHeartbeatFailures = 0;\n if (this.isSilenced()) {\n await this.onHeartbeatRecovered(ctx);\n }\n // Success is the steady state every loop — do not INFO-spam; failures already warn/critical.\n logger.debug(\"心跳更新成功\", {\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 let commandList: Awaited<ReturnType<typeof getPollCommandList>>[\"data\"] = [];\n try {\n const polled = await getPollCommandList({\n nodeId,\n traceId: loopTraceId,\n size: MAX_POLL_TARGET_LIST_SIZE,\n });\n if (polled.error) {\n cmdLogger.warn(\"獲取指令失敗\", {\n topic: LOG_TOPIC_COMMAND,\n data: { error: polled.error.message },\n });\n return;\n }\n commandList = polled.data ?? [];\n } catch (error) {\n // pollTargetList throws on transport/DB failures — treat as soft miss, not loop CRITICAL.\n cmdLogger.warn(\"獲取指令失敗\", {\n topic: LOG_TOPIC_COMMAND,\n data: { error: getErrorMessage(error) },\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 { 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","/** Per-file write queue — serializes read-modify-write for a single JSON path within one process. */\nconst writeChains = new Map<string, Promise<unknown>>();\n\nexport function withSerializedFileWrites<T>(filePath: string, operation: () => Promise<T>): Promise<T> {\n const previous = writeChains.get(filePath) ?? Promise.resolve();\n const next = previous.then(operation, operation);\n writeChains.set(\n filePath,\n next.then(\n () => undefined,\n () => undefined,\n ),\n );\n return next;\n}\n","import { randomBytes } from \"node:crypto\";\nimport { mkdir, readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { withSerializedFileWrites } from \"./file-write-queue\";\n\nexport type JsonStatePatch<T extends object, NK extends keyof T> = Partial<Omit<T, NK>> & {\n [K in NK]?: T[K] extends object ? Partial<T[K]> : T[K];\n};\n\nexport interface JsonFileStateStore<T extends object, NK extends keyof T = never> {\n read(): Promise<T>;\n write(patch: JsonStatePatch<T, NK>): Promise<T>;\n reset(): Promise<T>;\n}\n\nexport interface CreateJsonFileStateStoreOptions<T extends object, NK extends keyof T = never> {\n filePath: string;\n defaultState: T;\n /** Top-level keys shallow-merged one level deep on read and write. */\n nestedKeys?: NK[];\n /** When set, assigned `new Date().toISOString()` on write and reset. */\n updatedAtKey?: keyof T;\n}\n\nfunction mergeWithNested<T extends object>(\n defaults: T,\n current: Partial<T> | undefined,\n patch: Partial<T>,\n nestedKeys: (keyof T)[],\n): T {\n const merged = {\n ...defaults,\n ...current,\n ...patch,\n } as T;\n\n for (const key of nestedKeys) {\n const defaultNested = defaults[key];\n if (defaultNested != null && typeof defaultNested === \"object\") {\n (merged as Record<keyof T, unknown>)[key] = {\n ...defaultNested,\n ...(current?.[key] as object | undefined),\n ...(patch[key] as object | undefined),\n };\n }\n }\n\n return merged;\n}\n\nasync function atomicWriteJson(filePath: string, data: unknown): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n const content = `${JSON.stringify(data, null, 2)}\\n`;\n JSON.parse(content);\n const tempPath = `${filePath}.${process.pid}.${randomBytes(4).toString(\"hex\")}.tmp`;\n try {\n await writeFile(tempPath, content, \"utf8\");\n await rename(tempPath, filePath);\n } catch (error) {\n await unlink(tempPath).catch(() => undefined);\n throw error;\n }\n}\n\n/** JSON file-backed state with optional nested key merge and atomic writes. */\nexport function createJsonFileStateStore<T extends object, NK extends keyof T = never>(\n options: CreateJsonFileStateStoreOptions<T, NK>,\n): JsonFileStateStore<T, NK> {\n const { filePath, defaultState, nestedKeys = [] as NK[], updatedAtKey } = options;\n\n function touchUpdatedAt(state: T): T {\n if (updatedAtKey == null) {\n return state;\n }\n return {\n ...state,\n [updatedAtKey]: new Date().toISOString(),\n };\n }\n\n async function readFromDisk(): Promise<T> {\n try {\n const raw = await readFile(filePath, \"utf8\");\n const parsed = JSON.parse(raw) as Partial<T>;\n return mergeWithNested(defaultState, parsed, {}, nestedKeys);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return mergeWithNested(defaultState, {}, {}, nestedKeys);\n }\n if (error instanceof SyntaxError) {\n await unlink(filePath).catch(() => undefined);\n return mergeWithNested(defaultState, {}, {}, nestedKeys);\n }\n throw error;\n }\n }\n\n return {\n read(): Promise<T> {\n return readFromDisk();\n },\n\n write(patch: JsonStatePatch<T, NK>): Promise<T> {\n return withSerializedFileWrites(filePath, async () => {\n const current = await readFromDisk();\n const next = touchUpdatedAt(mergeWithNested(defaultState, current, patch as Partial<T>, nestedKeys));\n await atomicWriteJson(filePath, next);\n return next;\n });\n },\n\n reset(): Promise<T> {\n return withSerializedFileWrites(filePath, async () => {\n const next = touchUpdatedAt({ ...defaultState });\n await atomicWriteJson(filePath, next);\n return next;\n });\n },\n };\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","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 { resolveLogSpoolSpawnEnvForLabel } from \"../../shared/log/spool/enable\";\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\" | \"critical\">;\n useTsx?: boolean;\n}\n\nexport interface SpawnChildOptions {\n env?: Record<string, string>;\n useTsx?: boolean;\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\nexport interface CriticalExitHandler {\n labels: readonly string[];\n onCriticalExit: (label: string, code: number | null, signal: NodeJS.Signals | null) => void;\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 defaultUseTsx: boolean;\n private readonly logger?: Pick<LoggerWithScope, \"info\" | \"warn\" | \"error\" | \"critical\">;\n private readonly byLabel = new Map<string, ChildProcess>();\n private criticalExitHandler: CriticalExitHandler | null = null;\n private suppressCriticalExit = false;\n\n constructor(options: ManagedChildProcessesOptions) {\n this.projectRoot = options.projectRoot;\n this.preloadModules = options.preloadModules ?? [];\n this.graceMs = options.graceMs ?? 5_000;\n this.defaultUseTsx = options.useTsx ?? true;\n this.logger = options.logger;\n }\n\n setCriticalExitHandler(handler: CriticalExitHandler): void {\n this.criticalExitHandler = handler;\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, spawnOptions?: SpawnChildOptions): SpawnChildResult {\n const existing = this.getRunning(label);\n if (existing != null) {\n return { child: existing, created: false };\n }\n\n const logSpoolEnv = resolveLogSpoolSpawnEnvForLabel(label);\n const childEnv =\n spawnOptions?.env != null\n ? { ...process.env, ...logSpoolEnv, ...spawnOptions.env }\n : { ...process.env, ...logSpoolEnv };\n\n const child = spawnTsxChild({\n projectRoot: this.projectRoot,\n entryScript,\n preloadModules: this.preloadModules,\n useTsx: spawnOptions?.useTsx ?? this.defaultUseTsx,\n env: childEnv,\n });\n\n child.on(\"exit\", (code: number | null, signal: NodeJS.Signals | null) => {\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 if (\n !this.suppressCriticalExit &&\n this.criticalExitHandler != null &&\n this.criticalExitHandler.labels.includes(label)\n ) {\n this.criticalExitHandler.onCriticalExit(label, code, signal);\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 this.suppressCriticalExit = true;\n try {\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 } finally {\n this.suppressCriticalExit = false;\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 { createLogger } from \"../../shared/log/core/create-logger\";\nimport type { ManagedChildProcessesOptions } from \"./managed-child-processes\";\nimport { ManagedChildProcesses } from \"./managed-child-processes\";\n\nexport type CreateManagedChildProcessesOptions = Pick<\n ManagedChildProcessesOptions,\n \"projectRoot\" | \"preloadModules\" | \"useTsx\" | \"graceMs\"\n> & {\n /** Defaults to `createLogger({ module: \"launcher\" })`. */\n logger?: ManagedChildProcessesOptions[\"logger\"];\n};\n\nconst DEFAULT_PRELOAD_MODULES = [\"./scripts/preload.mjs\"] as const;\n\n/**\n * Standard L3 service child-process registry: node (not tsx), service preload, launcher logger.\n * Each service keeps a singleton in `src/startup/child-processes.ts`.\n */\nexport function createManagedChildProcesses(options: CreateManagedChildProcessesOptions): ManagedChildProcesses {\n return new ManagedChildProcesses({\n projectRoot: options.projectRoot,\n preloadModules: options.preloadModules ?? DEFAULT_PRELOAD_MODULES,\n useTsx: options.useTsx ?? false,\n graceMs: options.graceMs,\n logger: options.logger ?? createLogger({ module: \"launcher\" }),\n });\n}\n","function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface PollUntilOptions {\n timeoutMs: number;\n intervalMs?: number;\n until: () => boolean | Promise<boolean>;\n}\n\n/**\n * Poll `until()` until it returns true or `timeoutMs` elapses.\n * @throws Error on timeout\n */\nexport async function pollUntil(options: PollUntilOptions): Promise<void> {\n const intervalMs = options.intervalMs ?? 500;\n const deadline = Date.now() + options.timeoutMs;\n\n while (Date.now() < deadline) {\n if (await options.until()) {\n return;\n }\n await sleep(intervalMs);\n }\n\n throw new Error(`pollUntil timeout after ${options.timeoutMs}ms`);\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\";\nimport type { ReadinessCheck, ReadinessReport } from \"./readiness.types\";\nimport { runReadinessChecks } from \"./run-readiness-checks\";\n\nexport interface RunReadinessGateInput {\n checks: ReadinessCheck[];\n onReport: (report: ReadinessReport) => Promise<void>;\n logger: LoggerWithScope;\n logTopic?: string;\n}\n\n/** Run readiness checks, persist report via callback, fail-fast when not ok. */\nexport async function runReadinessGate(input: RunReadinessGateInput): Promise<ReadinessReport> {\n const { checks, onReport, logger, logTopic = \"guard\" } = input;\n\n logger.info(\"Running readiness checks\", { topic: logTopic });\n const report = await runReadinessChecks(checks);\n await onReport(report);\n\n if (!report.ok) {\n logger.error(\"Readiness checks failed\", {\n topic: logTopic,\n data: { message: report.message, checks: report.checks },\n });\n throw new Error(report.message ?? \"Readiness checks failed\");\n }\n\n logger.debug(\"Readiness checks passed\", {\n topic: logTopic,\n data: { checks: report.checks.map((check) => check.name) },\n });\n\n return report;\n}\n","import type { LoggerWithScope } from \"../../shared/log\";\nimport { pollUntil } from \"./poll-until\";\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 let last: ServiceReadySnapshot = { failed: false, ready: false };\n\n try {\n await pollUntil({\n timeoutMs: options.timeoutMs,\n intervalMs: pollMs,\n until: async () => {\n last = await gate.read();\n if (last.failed) {\n throw new Error(last.failureMessage ?? defaultFailureMessage);\n }\n return last.ready;\n },\n });\n } catch (error) {\n if (last.failed) {\n throw error instanceof Error ? error : new Error(defaultFailureMessage);\n }\n const isPollTimeout = error instanceof Error && error.message.startsWith(\"pollUntil timeout after\");\n if (!isPollTimeout) {\n throw error;\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 throw new Error(message);\n }\n\n options.logger?.info(\"service ready\", {\n topic: \"readiness\",\n data: last.readyDetail ?? {},\n });\n return last;\n}\n","import { dirname, join } from \"node:path\";\n\nconst RUNTIME_STATE_SHARD_DIR = \"runtime-state\";\n\nexport interface ResolvedRuntimeStatePaths {\n /** Directory holding one JSON file per top-level slice. */\n stateDir: string;\n /** Legacy monolithic `state.json` — migrated on read/reset when present. */\n legacyFilePath: string | null;\n}\n\n/**\n * Resolve sharded runtime state layout from {@link CreateServiceRuntimeStateStoreOptions.filePath}.\n *\n * | `filePath` | Shard dir | Legacy |\n * |-------------------------|-----------------------------------|---------------|\n * | `.../state.json` | `.../runtime-state/` | `state.json` |\n * | `.../runtime-state/` | same directory | none |\n */\nexport function resolveRuntimeStatePaths(filePath: string): ResolvedRuntimeStatePaths {\n if (filePath.endsWith(\".json\")) {\n return {\n stateDir: join(dirname(filePath), RUNTIME_STATE_SHARD_DIR),\n legacyFilePath: filePath,\n };\n }\n return {\n stateDir: filePath,\n legacyFilePath: null,\n };\n}\n\nexport function runtimeStateShardPath(stateDir: string, sliceKey: string): string {\n return join(stateDir, `${sliceKey}.json`);\n}\n","import { mkdir, readFile, stat, unlink } from \"node:fs/promises\";\nimport { createJsonFileStateStore, type JsonStatePatch } from \"./json-state-store\";\nimport { resolveRuntimeStatePaths, runtimeStateShardPath } from \"./runtime-state-path\";\n\nexport interface CreateShardedJsonFileStateStoreOptions<T extends object, NK extends keyof T> {\n /** Monolithic legacy path or shard directory root (see {@link resolveRuntimeStatePaths}). */\n filePath: string;\n defaultState: T;\n /** Top-level keys persisted as separate shard files. */\n nestedKeys: NK[];\n updatedAtKey?: keyof T;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction mergeSlice<T extends object>(defaults: T, key: keyof T, patchValue: unknown): T[keyof T] {\n const base = defaults[key];\n if (isPlainObject(base) && isPlainObject(patchValue)) {\n return { ...base, ...patchValue } as T[keyof T];\n }\n return patchValue as T[keyof T];\n}\n\n/**\n * JSON runtime state with **one file per top-level slice** (log-persist registry pattern).\n * Eliminates cross-slice lost updates when guard/scheduler/worker write concurrently.\n */\nexport function createShardedJsonFileStateStore<T extends object, NK extends keyof T>(\n options: CreateShardedJsonFileStateStoreOptions<T, NK>,\n): {\n read(): Promise<T>;\n write(patch: JsonStatePatch<T, NK>): Promise<T>;\n reset(): Promise<T>;\n} {\n const { defaultState, nestedKeys, updatedAtKey } = options;\n const { stateDir, legacyFilePath } = resolveRuntimeStatePaths(options.filePath);\n\n type ShardStore = ReturnType<typeof createJsonFileStateStore<object>>;\n const shardStores = new Map<string, ShardStore>();\n\n function shardStore(sliceKey: NK): ShardStore {\n const key = String(sliceKey);\n let store = shardStores.get(key);\n if (store == null) {\n store = createJsonFileStateStore({\n filePath: runtimeStateShardPath(stateDir, key),\n defaultState: defaultState[sliceKey] as object,\n });\n shardStores.set(key, store);\n }\n return store;\n }\n\n async function readUpdatedAtFromShardMtimes(): Promise<string> {\n let maxMtimeMs = 0;\n for (const sliceKey of nestedKeys) {\n try {\n const shardStat = await stat(runtimeStateShardPath(stateDir, String(sliceKey)));\n maxMtimeMs = Math.max(maxMtimeMs, shardStat.mtimeMs);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n if (maxMtimeMs <= 0) {\n return defaultState[updatedAtKey as keyof T] as string;\n }\n return new Date(maxMtimeMs).toISOString();\n }\n\n async function migrateLegacyMonolithicIfPresent(): Promise<void> {\n if (legacyFilePath == null) {\n return;\n }\n\n let raw: string;\n try {\n raw = await readFile(legacyFilePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n\n let parsed: Partial<T>;\n try {\n parsed = JSON.parse(raw) as Partial<T>;\n } catch {\n await unlink(legacyFilePath).catch(() => undefined);\n return;\n }\n\n await mkdir(stateDir, { recursive: true });\n for (const sliceKey of nestedKeys) {\n const slice = parsed[sliceKey];\n if (slice != null) {\n await shardStore(sliceKey).write(slice as object);\n }\n }\n\n await unlink(legacyFilePath).catch(() => undefined);\n }\n\n return {\n async read(): Promise<T> {\n await mkdir(stateDir, { recursive: true });\n await migrateLegacyMonolithicIfPresent();\n\n const merged = { ...defaultState } as T;\n for (const sliceKey of nestedKeys) {\n merged[sliceKey] = (await shardStore(sliceKey).read()) as T[NK];\n }\n if (updatedAtKey != null) {\n merged[updatedAtKey] = (await readUpdatedAtFromShardMtimes()) as T[keyof T];\n }\n return merged;\n },\n\n async write(patch: JsonStatePatch<T, NK>): Promise<T> {\n await mkdir(stateDir, { recursive: true });\n await migrateLegacyMonolithicIfPresent();\n\n for (const sliceKey of nestedKeys) {\n const patchSlice = patch[sliceKey];\n if (patchSlice == null) {\n continue;\n }\n const current = await shardStore(sliceKey).read();\n const nextSlice = mergeSlice(defaultState, sliceKey, {\n ...(current as object),\n ...(patchSlice as object),\n });\n await shardStore(sliceKey).write(nextSlice as object);\n }\n\n return this.read();\n },\n\n async reset(): Promise<T> {\n await mkdir(stateDir, { recursive: true });\n\n for (const sliceKey of nestedKeys) {\n await shardStore(sliceKey).reset();\n }\n\n if (legacyFilePath != null) {\n await unlink(legacyFilePath).catch(() => undefined);\n }\n\n return this.read();\n },\n };\n}\n","import { EMPTY_REGISTRY_SLOT_RUNTIME_STATE } from \"../../service/registry/registry-lifecycle\";\nimport type { JsonStatePatch } from \"../fs/json-state-store\";\nimport { createShardedJsonFileStateStore } from \"../fs/sharded-json-state-store\";\nimport type {\n DefaultExtraRuntimeSlices,\n GuardRuntimeSlice,\n ReadinessRuntimeSlice,\n SchedulerRuntimeSlice,\n ServiceRuntimeExtraSlicePatch,\n ServiceRuntimeNestedKeys,\n ServiceRuntimeState,\n WorkerRuntimeSlice,\n} from \"./service-runtime-state.types\";\n\nconst EPOCH_ISO = new Date(0).toISOString();\n\nexport interface CreateServiceRuntimeStateStoreOptions<\n TExtraSlices extends Record<string, object> = DefaultExtraRuntimeSlices,\n> {\n /**\n * Monolithic legacy path (`…/state.json`) or shard directory (`…/runtime-state/`).\n * Legacy files migrate automatically to `dirname/state.json → runtime-state/*.json`.\n */\n filePath: string;\n /** Default values for service-specific top-level nested slices. */\n extraDefaults?: TExtraSlices;\n}\n\nexport interface FinishRunnerTickOptions<TExtraSlices extends Record<string, object> = DefaultExtraRuntimeSlices> {\n nowMs: number;\n lastFired: Record<string, string>;\n postedCount?: number;\n /** Patch extra slices in the same atomic write as the scheduler tick. */\n extra?: ServiceRuntimeExtraSlicePatch<TExtraSlices>;\n}\n\nexport interface ServiceRuntimeStateStore<TExtraSlices extends Record<string, object> = DefaultExtraRuntimeSlices> {\n readRuntimeState(): Promise<ServiceRuntimeState<TExtraSlices>>;\n writeRuntimeState(\n patch: JsonStatePatch<ServiceRuntimeState<TExtraSlices>, ServiceRuntimeNestedKeys<TExtraSlices>>,\n ): Promise<ServiceRuntimeState<TExtraSlices>>;\n resetRuntimeStateForStartup(): Promise<ServiceRuntimeState<TExtraSlices>>;\n finishRunnerTick(options: FinishRunnerTickOptions<TExtraSlices>): Promise<void>;\n}\n\nfunction createDefaultServiceRuntimeState<TExtraSlices extends Record<string, object>>(options: {\n extraDefaults?: TExtraSlices;\n}): ServiceRuntimeState<TExtraSlices> {\n const readiness: ReadinessRuntimeSlice = {\n status: \"pending\",\n checkedAt: null,\n message: null,\n checks: [],\n };\n const guard: GuardRuntimeSlice = {\n nodeId: null,\n lastCheckAt: null,\n lastDecision: null,\n lastSpawnAt: null,\n spawnCount: 0,\n mode: \"healthy\",\n silentEnteredAt: null,\n silentLastHeartbeatAt: null,\n silentBackoffMs: 0,\n silentConsecutiveFailures: 0,\n silentRecoveryAttempt: 0,\n silentEvents: [],\n };\n const scheduler: SchedulerRuntimeSlice = {\n lastTickAt: null,\n lastPostedCount: 0,\n lastFired: {},\n pid: null,\n spawnedAt: null,\n ready: false,\n readyAt: null,\n };\n const worker: WorkerRuntimeSlice = {\n pid: null,\n spawnedAt: null,\n ready: false,\n registeredTasks: [],\n readyAt: null,\n };\n\n return {\n updatedAt: EPOCH_ISO,\n readiness,\n guard,\n scheduler,\n worker,\n registry: { ...EMPTY_REGISTRY_SLOT_RUNTIME_STATE },\n ...(options.extraDefaults ?? ({} as TExtraSlices)),\n };\n}\n\n/** Sharded JSON runtime state (L3 blueprint) — one file per slice under `runtime-state/`. */\nexport function createServiceRuntimeStateStore<TExtraSlices extends Record<string, object> = DefaultExtraRuntimeSlices>(\n options: CreateServiceRuntimeStateStoreOptions<TExtraSlices>,\n): ServiceRuntimeStateStore<TExtraSlices> {\n type State = ServiceRuntimeState<TExtraSlices>;\n type NK = ServiceRuntimeNestedKeys<TExtraSlices>;\n\n const defaultState = createDefaultServiceRuntimeState(options);\n const nestedKeys = [\n \"readiness\",\n \"guard\",\n \"scheduler\",\n \"worker\",\n \"registry\",\n ...(Object.keys(options.extraDefaults ?? {}) as (keyof TExtraSlices & string)[]),\n ] as NK[];\n\n const store = createShardedJsonFileStateStore<State, NK>({\n filePath: options.filePath,\n defaultState,\n nestedKeys,\n updatedAtKey: \"updatedAt\",\n });\n\n return {\n readRuntimeState: () => store.read(),\n writeRuntimeState: (patch) => store.write(patch),\n resetRuntimeStateForStartup: () => store.reset(),\n finishRunnerTick: async ({ nowMs, lastFired, postedCount, extra }) => {\n await store.write({\n scheduler: {\n lastTickAt: new Date(nowMs).toISOString(),\n lastFired,\n ...(postedCount != null ? { lastPostedCount: postedCount } : {}),\n },\n ...extra,\n } as JsonStatePatch<State, NK>);\n },\n };\n}\n","export const LOG_TOPIC_TRIGGER = \"trigger\";\n\n/** Default main-loop interval for {@link TriggerNode} when `loopIntervalMs` is omitted (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/base-node-runtime\";\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(\n loopIntervalMs: number = TRIGGER_LOOP_INTERVAL_MS,\n ): Array<{ key: string; intervalMs: number }> {\n return [...runnerRegistry.values()]\n .filter((runner) => runner.intervalMs < loopIntervalMs)\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 {\n registrySlotRuntimePatchFromGuardResult,\n runRegistrySlotGuardCheck,\n} from \"../../service/registry/registry-lifecycle\";\nimport type { LoggerWithScope } from \"../../shared/log\";\n\nexport interface ApplyRegistrySlotGuardInput {\n serviceValue: string;\n serviceId: string;\n checkedAt: string;\n logger: Pick<LoggerWithScope, \"critical\" | \"warn\">;\n logTopic?: string;\n traceId?: string;\n}\n\nexport interface ApplyRegistrySlotGuardResult {\n /** When false, caller should abort the supervisor tick (slot lost shutdown initiated). */\n continueTick: boolean;\n registryPatch: ReturnType<typeof registrySlotRuntimePatchFromGuardResult>;\n}\n\n/**\n * Run registry slot ownership check and optionally SIGTERM the parent main process.\n * Used by guard / supervisor TriggerNode runners across L3 services.\n */\nexport async function applyRegistrySlotGuardStep(\n input: ApplyRegistrySlotGuardInput,\n): Promise<ApplyRegistrySlotGuardResult> {\n const result = await runRegistrySlotGuardCheck({\n serviceValue: input.serviceValue,\n serviceId: input.serviceId,\n });\n const registryPatch = registrySlotRuntimePatchFromGuardResult(result, input.checkedAt);\n\n if (result.shouldShutdown) {\n input.logger.critical(\"Registry slot lost — shutting down service\", {\n topic: input.logTopic ?? \"guard\",\n data: {\n traceId: input.traceId,\n serviceId: input.serviceId,\n serviceValue: input.serviceValue,\n },\n });\n process.kill(process.ppid, \"SIGTERM\");\n return { continueTick: false, registryPatch };\n }\n\n if (result.error != null) {\n input.logger.warn(\"Registry slot check failed (transient) — skipping enforcement this tick\", {\n topic: input.logTopic ?? \"guard\",\n data: {\n traceId: input.traceId,\n serviceId: input.serviceId,\n message: result.error,\n },\n });\n }\n\n return { continueTick: true, registryPatch };\n}\n","let lastWorkerSpawnAt = 0;\n\nexport function getWorkerSpawnCooldownLastAt(): number {\n return lastWorkerSpawnAt;\n}\n\nexport function markWorkerSpawned(at = Date.now()): void {\n lastWorkerSpawnAt = at;\n}\n\nexport function resetWorkerSpawnCooldownForTests(): void {\n lastWorkerSpawnAt = 0;\n}\n","import { scanTargetList } from \"../../core.api\";\nimport { patchServiceRuntime } from \"../../service/registry/registry.service\";\nimport { CategoryNode, type Node } from \"../node.interface\";\nimport { evaluateBusyNodeLiveness, nodesForTaskLiveness } from \"../node-liveness\";\nimport { applyRegistrySlotGuardStep } from \"./registry-slot-guard-step\";\nimport type { ServiceGuardTickInput, ServiceGuardTickResult } from \"./service-guard.interface\";\nimport { getWorkerSpawnCooldownLastAt, markWorkerSpawned } from \"./worker-spawn-cooldown\";\n\n/**\n * One guard-runner tick: registry slot check, TaskNode liveness, optional worker\n * respawn, Service runtime heartbeat rollup.\n */\nexport async function runServiceGuardTick(input: ServiceGuardTickInput): Promise<ServiceGuardTickResult> {\n const {\n serviceValue,\n serviceId,\n nodeId,\n loopTraceId,\n logger,\n logTopic = \"guard\",\n checkedAt,\n nowMs,\n taskNodeStaleMs,\n workerSpawnCooldownMs,\n maxNodes = 200,\n spawnWorker,\n getLastWorkerSpawnAt = getWorkerSpawnCooldownLastAt,\n markWorkerSpawned: markWorkerSpawnedAt = markWorkerSpawned,\n } = input;\n\n const continueTick = true;\n let registryPatch: ServiceGuardTickResult[\"registryPatch\"];\n let decision = \"idle\";\n\n if (serviceId != null) {\n const guard = await applyRegistrySlotGuardStep({\n serviceValue,\n serviceId,\n checkedAt,\n logger,\n logTopic,\n traceId: loopTraceId,\n });\n registryPatch = guard.registryPatch;\n if (!guard.continueTick) {\n return { continueTick: false, decision: \"slot_lost\", nodes: [], registryPatch };\n }\n decision = \"slot_ok\";\n }\n\n const nodes =\n serviceId == null\n ? []\n : ((\n await scanTargetList<Node>({\n category: CategoryNode.NODE,\n filterList: [{ field: \"name\", operator: \"eq\", value: serviceId }],\n maxRows: maxNodes,\n })\n ).data ?? []);\n\n const liveness = evaluateBusyNodeLiveness(nodesForTaskLiveness(nodes), {\n staleMs: taskNodeStaleMs,\n now: nowMs,\n excludeNodeId: nodeId,\n onlyFreshCandidates: true,\n });\n\n const ageMs = liveness.freshest?.ageMs ?? Number.POSITIVE_INFINITY;\n\n if (liveness.healthy) {\n decision = \"healthy\";\n } else if (nowMs - getLastWorkerSpawnAt() < workerSpawnCooldownMs) {\n decision = \"spawn_cooldown\";\n logger.warn(\"TaskNode unavailable but spawn cooldown active\", {\n topic: logTopic,\n data: {\n traceId: loopTraceId,\n ageMs,\n staleMs: taskNodeStaleMs,\n cooldownMs: workerSpawnCooldownMs,\n },\n });\n } else {\n decision = \"spawn_worker\";\n logger.warn(\"TaskNode stale — restarting worker\", {\n topic: logTopic,\n data: {\n traceId: loopTraceId,\n peerWorkerCount: liveness.busyWorkerCount,\n freshPeerCount: liveness.freshWorkerCount,\n staleMs: taskNodeStaleMs,\n },\n });\n await spawnWorker(\"guard:restart-unhealthy-tasknode\");\n markWorkerSpawnedAt(nowMs);\n }\n\n try {\n await patchServiceRuntime({\n serviceValue,\n serviceId: serviceId ?? undefined,\n nodes,\n lastHeartBeat: nowMs,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.warn(\"Failed to patch Service runtime rollup\", {\n topic: logTopic,\n data: { traceId: loopTraceId, message },\n });\n }\n\n return { continueTick, decision, nodes, registryPatch };\n}\n","import type { RegistrySlotRuntimeState } from \"../../service/registry/registry-lifecycle\";\nimport type { LoggerWithScope } from \"../../shared/log\";\nimport type { Node } from \"../node.interface\";\nimport type { ReadinessCheck, ReadinessReport } from \"../readiness/readiness.types\";\nimport type { GuardRuntimeSlice } from \"../runtime-state/service-runtime-state.types\";\n\n/** Default TriggerManager runner key for {@link registerServiceGuardRunner}. */\nexport const SERVICE_GUARD_RUNNER_KEY = \"service-guard\";\n\nexport interface ServiceGuardTickInput {\n serviceValue: string;\n serviceId: string | null;\n nodeId: string;\n loopTraceId: string;\n logger: LoggerWithScope;\n logTopic?: string;\n checkedAt: string;\n nowMs: number;\n taskNodeStaleMs: number;\n workerSpawnCooldownMs: number;\n maxNodes?: number;\n spawnWorker: (reason: string) => Promise<void>;\n getLastWorkerSpawnAt?: () => number;\n markWorkerSpawned?: (at: number) => void;\n}\n\nexport interface ServiceGuardTickResult {\n continueTick: boolean;\n decision: string;\n nodes: Node[];\n registryPatch?: Pick<RegistrySlotRuntimeState, \"slotOwned\" | \"lastSlotCheckAt\" | \"lastSlotCheckError\">;\n}\n\nexport interface RegisterServiceGuardRunnerOptions {\n serviceValue: string;\n getServiceId: () => Promise<string | null>;\n logTopic?: string;\n runnerKey?: string;\n intervalMs: number;\n initialDelayMs?: number;\n taskNodeStaleMs: number;\n workerSpawnCooldownMs: number;\n maxNodes?: number;\n spawnWorker: (reason: string) => Promise<void>;\n onRegistryPatch: (\n patch: Pick<RegistrySlotRuntimeState, \"slotOwned\" | \"lastSlotCheckAt\" | \"lastSlotCheckError\">,\n ) => Promise<void>;\n onGuardPatch: (patch: Partial<GuardRuntimeSlice>) => Promise<void>;\n onDecision?: (decision: string) => Promise<void>;\n}\n\nexport interface ServiceGuardNodeOptions {\n serviceValue: string;\n logTopic?: string;\n readinessChecks: ReadinessCheck[];\n onReadinessReport: (report: ReadinessReport) => Promise<void>;\n guardRunner: Omit<RegisterServiceGuardRunnerOptions, \"serviceValue\" | \"logTopic\" | \"runnerKey\" | \"spawnWorker\">;\n /**\n * Idempotent spawn of all business nodes (scheduler + worker, etc.).\n * Used at bootstrap, silent recovery, and healthy-mode TaskNode respawn.\n */\n spawnBusinessNodes: (reason: string) => Promise<void>;\n /** Stop business nodes only (never the guard process). */\n stopBusinessNodes: () => Promise<void>;\n /** Local runtime gate: all business nodes registered and ready. */\n isBusinessReady: () => Promise<boolean>;\n /** Timeout for {@link isBusinessReady} during bootstrap and recovery. Default 180s. */\n businessReadyTimeoutMs?: number;\n /** Extra hook after the initial business spawn (cooldown is recorded automatically). */\n onWorkerSpawned?: () => void;\n beforeProcessExit?: () => void | Promise<void>;\n}\n\n/** True when the guard slice is serving traffic (`mode` omitted = legacy healthy). */\nexport function isGuardAvailable(guard: Pick<GuardRuntimeSlice, \"mode\">): boolean {\n return guard.mode == null || guard.mode === \"healthy\";\n}\n\n/**\n * Seconds for `Retry-After` when the guard is not serving traffic.\n * `null` when {@link isGuardAvailable} is true.\n */\nexport function guardRetryAfterSec(guard: Pick<GuardRuntimeSlice, \"mode\" | \"silentBackoffMs\">): number | null {\n if (isGuardAvailable(guard)) {\n return null;\n }\n const backoffMs = guard.silentBackoffMs > 0 ? guard.silentBackoffMs : 15_000;\n return Math.max(1, Math.ceil(backoffMs / 1000));\n}\n","import type { TriggerRunnerContext } from \"../../trigger/trigger.interface\";\nimport { TriggerManager } from \"../../trigger/trigger-manager\";\nimport { runServiceGuardTick } from \"./run-service-guard-tick\";\nimport { type RegisterServiceGuardRunnerOptions, SERVICE_GUARD_RUNNER_KEY } from \"./service-guard.interface\";\n\nasync function runServiceGuardRunner(\n ctx: TriggerRunnerContext,\n options: RegisterServiceGuardRunnerOptionsWithClock,\n): Promise<void> {\n const { loopTraceId, nodeId, logger } = ctx;\n const nowMs = options.now?.() ?? Date.now();\n const checkedAt = new Date(nowMs).toISOString();\n const serviceId = await options.getServiceId();\n\n const result = await runServiceGuardTick({\n serviceValue: options.serviceValue,\n serviceId,\n nodeId,\n loopTraceId,\n logger,\n logTopic: options.logTopic,\n checkedAt,\n nowMs,\n taskNodeStaleMs: options.taskNodeStaleMs,\n workerSpawnCooldownMs: options.workerSpawnCooldownMs,\n maxNodes: options.maxNodes,\n spawnWorker: options.spawnWorker,\n });\n\n if (result.registryPatch != null) {\n await options.onRegistryPatch(result.registryPatch);\n }\n\n if (!result.continueTick) {\n return;\n }\n\n await options.onGuardPatch({\n nodeId,\n lastCheckAt: checkedAt,\n lastDecision: result.decision,\n });\n\n if (options.onDecision != null) {\n await options.onDecision(result.decision);\n }\n}\n\nexport interface RegisterServiceGuardRunnerOptionsWithClock extends RegisterServiceGuardRunnerOptions {\n /** Test hook — defaults to Date.now(). */\n now?: () => number;\n}\n\n/** Register the standard L3 guard runner (registry slot + TaskNode + Service runtime). */\nexport function registerServiceGuardRunner(options: RegisterServiceGuardRunnerOptionsWithClock): void {\n TriggerManager.registerRunner({\n key: options.runnerKey ?? SERVICE_GUARD_RUNNER_KEY,\n intervalMs: options.intervalMs,\n initialDelayMs: options.initialDelayMs,\n fn: (ctx) => runServiceGuardRunner(ctx, options),\n });\n}\n","import { access, constants, readdir, readFile, rename, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { isLogEntry } from \"../core/log-batch\";\nimport { buildLogListDraft, postLogBatch } from \"../upload/flush\";\nimport { spoolLogger } from \"../upload/logger\";\nimport { type DEFAULT_LOG_SPOOL_CONFIG, resolveLogSpoolConfig } from \"./config\";\nimport { parseLogSpoolBatchFilename } from \"./file\";\nimport type { LogSpoolBatchFile, LogSpoolProcessRole } from \"./interface\";\nimport { logSpoolProcessDir, resolveLogSpoolRoot } from \"./paths\";\nimport { resolveAllLogSpoolProcessRoles } from \"./process-roles\";\n\nconst UPLOAD_LANE = \"slow\";\nconst MAX_UPLOADS_PER_COLLECT_TICK = 20;\n\n/** Per serviceId — guard collect-log tick runs GC at most once per `gc.intervalMs`. */\nconst lastGcAtMsByServiceId = new Map<string, number>();\n\nexport interface RunCollectLogTickInput {\n serviceId: string;\n serviceValue: string;\n spoolRoot?: string;\n config?: Partial<typeof DEFAULT_LOG_SPOOL_CONFIG>;\n nowMs?: number;\n}\n\nexport interface RunCollectLogTickResult {\n uploaded: number;\n skipped: number;\n failed: number;\n gcTmpRemoved: number;\n gcSyncedRemoved: number;\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readBatchTmpFile(tmpPath: string): Promise<LogSpoolBatchFile | null> {\n try {\n const raw = await readFile(tmpPath, \"utf8\");\n const parsed = JSON.parse(raw) as LogSpoolBatchFile;\n if (!Array.isArray(parsed.entries) || parsed.entries.length === 0) {\n return null;\n }\n const entries = parsed.entries.filter(isLogEntry);\n if (entries.length === 0) {\n return null;\n }\n return { entries, meta: parsed.meta };\n } catch {\n return null;\n }\n}\n\nfunction processMetaKey(serviceId: string, processRole: LogSpoolProcessRole): string {\n return `${serviceId}:${processRole}`;\n}\n\nfunction syncedMarkerPath(jsonPath: string): string {\n return jsonPath.replace(/\\.json$/, \".synced\");\n}\n\nasync function uploadTmpBatch(input: {\n serviceId: string;\n serviceValue: string;\n processRole: LogSpoolProcessRole;\n tmpPath: string;\n fileName: string;\n spoolRoot: string;\n postTimeoutMs: number;\n}): Promise<\"uploaded\" | \"skipped\" | \"failed\"> {\n const parsed = parseLogSpoolBatchFilename(input.fileName);\n if (parsed == null) {\n spoolLogger.warn(\"collect-log skipped — invalid tmp filename\", { fileName: input.fileName });\n return \"failed\";\n }\n\n const jsonFileName = input.fileName.replace(/\\.tmp$/, \".json\");\n const jsonPath = join(logSpoolProcessDir(input.spoolRoot, input.serviceId, input.processRole), jsonFileName);\n const syncedPath = syncedMarkerPath(jsonPath);\n\n if (await pathExists(jsonPath)) {\n try {\n await unlink(input.tmpPath);\n spoolLogger.info(\"collect-log removed orphan tmp (json exists)\", {\n tmpPath: input.tmpPath,\n jsonPath,\n });\n } catch {\n // best-effort\n }\n return \"skipped\";\n }\n\n if (await pathExists(syncedPath)) {\n try {\n await rename(input.tmpPath, jsonPath);\n } catch {\n try {\n await unlink(input.tmpPath);\n } catch {\n // best-effort\n }\n }\n return \"skipped\";\n }\n\n const batch = await readBatchTmpFile(input.tmpPath);\n if (batch == null) {\n spoolLogger.warn(\"collect-log skipped — tmp failed validation\", {\n tmpPath: input.tmpPath,\n fileName: input.fileName,\n });\n try {\n await unlink(input.tmpPath);\n spoolLogger.info(\"collect-log removed invalid tmp\", { tmpPath: input.tmpPath });\n } catch {\n // best-effort\n }\n return \"failed\";\n }\n\n const processKey = processMetaKey(input.serviceId, input.processRole);\n const draft = buildLogListDraft({\n service: input.serviceValue,\n process: processKey,\n lane: UPLOAD_LANE,\n entries: batch.entries,\n });\n\n try {\n await postLogBatch(draft, input.postTimeoutMs);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n spoolLogger.error(\"collect-log upload failed\", {\n fileName: input.fileName,\n processRole: input.processRole,\n error: message,\n });\n return \"failed\";\n }\n\n try {\n await writeFile(syncedPath, `${Date.now()}\\n`, \"utf8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n spoolLogger.warn(\"collect-log synced marker write failed\", { syncedPath, error: message });\n }\n\n try {\n await rename(input.tmpPath, jsonPath);\n try {\n await unlink(syncedPath);\n } catch {\n // best-effort\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n spoolLogger.error(\"collect-log rename tmp→json failed after upload\", {\n tmpPath: input.tmpPath,\n jsonPath,\n error: message,\n });\n return \"uploaded\";\n }\n\n spoolLogger.info(\"collect-log uploaded batch\", {\n processRole: input.processRole,\n fileName: jsonFileName,\n entryCount: batch.entries.length,\n });\n\n return \"uploaded\";\n}\n\nasync function gcTmpFiles(input: {\n spoolRoot: string;\n serviceId: string;\n processRole: LogSpoolProcessRole;\n tmpRetentionMs: number;\n nowMs: number;\n}): Promise<number> {\n const processDir = logSpoolProcessDir(input.spoolRoot, input.serviceId, input.processRole);\n let removed = 0;\n\n try {\n const names = await readdir(processDir);\n for (const name of names) {\n if (!name.endsWith(\".tmp\")) {\n continue;\n }\n const parsed = parseLogSpoolBatchFilename(name);\n if (parsed == null) {\n continue;\n }\n if (input.nowMs - parsed.timestampMs <= input.tmpRetentionMs) {\n continue;\n }\n try {\n await unlink(join(processDir, name));\n removed += 1;\n spoolLogger.info(\"collect-log gc removed stale tmp\", {\n fileName: name,\n processRole: input.processRole,\n });\n } catch {\n // best-effort\n }\n }\n } catch {\n // directory may not exist yet\n }\n\n return removed;\n}\n\nasync function gcSyncedJsonFiles(input: {\n spoolRoot: string;\n serviceId: string;\n syncedRetentionMs: number;\n nowMs: number;\n}): Promise<number> {\n let removed = 0;\n\n for (const processRole of resolveAllLogSpoolProcessRoles()) {\n const processDir = logSpoolProcessDir(input.spoolRoot, input.serviceId, processRole);\n let names: string[] = [];\n try {\n names = await readdir(processDir);\n } catch {\n continue;\n }\n\n for (const name of names) {\n if (!name.endsWith(\".json\") && !name.endsWith(\".synced\")) {\n continue;\n }\n if (parseLogSpoolBatchFilename(name) == null && !name.endsWith(\".synced\")) {\n continue;\n }\n\n const filePath = join(processDir, name);\n try {\n const fileStat = await stat(filePath);\n if (input.nowMs - fileStat.mtimeMs <= input.syncedRetentionMs) {\n continue;\n }\n await unlink(filePath);\n removed += 1;\n spoolLogger.info(\"collect-log gc removed synced file\", {\n fileName: name,\n processRole,\n });\n } catch {\n // best-effort\n }\n }\n }\n\n return removed;\n}\n\nfunction shouldRunGc(serviceId: string, nowMs: number, intervalMs: number): boolean {\n const lastAt = lastGcAtMsByServiceId.get(serviceId) ?? 0;\n if (nowMs - lastAt < intervalMs) {\n return false;\n }\n lastGcAtMsByServiceId.set(serviceId, nowMs);\n return true;\n}\n\n/**\n * Guard-only: upload pending `.tmp` batches, rename to `.json`, then periodic GC.\n * Post success is tracked via `.json` or `.synced` marker (prevents duplicate DB inserts).\n */\nexport async function runCollectLogTick(input: RunCollectLogTickInput): Promise<RunCollectLogTickResult> {\n const config = resolveLogSpoolConfig(input.config);\n const spoolRoot = input.spoolRoot ?? resolveLogSpoolRoot();\n const nowMs = input.nowMs ?? Date.now();\n\n const result: RunCollectLogTickResult = {\n uploaded: 0,\n skipped: 0,\n failed: 0,\n gcTmpRemoved: 0,\n gcSyncedRemoved: 0,\n };\n\n let uploadsThisTick = 0;\n\n for (const processRole of resolveAllLogSpoolProcessRoles()) {\n const processDir = logSpoolProcessDir(spoolRoot, input.serviceId, processRole);\n let names: string[] = [];\n try {\n names = await readdir(processDir);\n } catch {\n continue;\n }\n\n for (const name of names) {\n if (!name.endsWith(\".tmp\")) {\n continue;\n }\n if (uploadsThisTick >= MAX_UPLOADS_PER_COLLECT_TICK) {\n break;\n }\n const status = await uploadTmpBatch({\n serviceId: input.serviceId,\n serviceValue: input.serviceValue,\n processRole,\n tmpPath: join(processDir, name),\n fileName: name,\n spoolRoot,\n postTimeoutMs: config.writer.postTimeoutMs,\n });\n if (status === \"uploaded\") {\n result.uploaded += 1;\n uploadsThisTick += 1;\n } else if (status === \"skipped\") {\n result.skipped += 1;\n } else {\n result.failed += 1;\n }\n }\n }\n\n if (shouldRunGc(input.serviceId, nowMs, config.gc.intervalMs)) {\n for (const processRole of resolveAllLogSpoolProcessRoles()) {\n result.gcTmpRemoved += await gcTmpFiles({\n spoolRoot,\n serviceId: input.serviceId,\n processRole,\n tmpRetentionMs: config.gc.tmpRetentionMs,\n nowMs,\n });\n }\n\n result.gcSyncedRemoved = await gcSyncedJsonFiles({\n spoolRoot,\n serviceId: input.serviceId,\n syncedRetentionMs: config.gc.syncedRetentionMs,\n nowMs,\n });\n }\n\n if (result.uploaded > 0 || result.failed > 0) {\n spoolLogger.info(\"collect-log tick complete\", { ...result, serviceId: input.serviceId });\n }\n\n return result;\n}\n","import { LOG_TOPIC_TRIGGER } from \"../../../trigger/trigger.constant\";\nimport { TriggerManager } from \"../../../trigger/trigger-manager\";\nimport { logSpoolEnabledFromEnv } from \"../upload/env\";\nimport { spoolLogger } from \"../upload/logger\";\nimport { runCollectLogTick } from \"./collector\";\nimport { logSpoolConfigFromEnv } from \"./config\";\n\nexport const COLLECT_LOG_RUNNER_KEY = \"collect-log\";\n\nexport interface RegisterCollectLogRunnerOptions {\n serviceValue: string;\n getServiceId: () => Promise<string | null>;\n runnerKey?: string;\n intervalMs?: number;\n initialDelayMs?: number;\n spoolRoot?: string;\n}\n\n/**\n * Guard process only — uploads `.tmp` spool batches and runs GC.\n * Register before {@link TriggerNode.start} (e.g. in {@link ServiceGuardNode.create}).\n */\nexport function registerCollectLogRunner(options: RegisterCollectLogRunnerOptions): void {\n if (!logSpoolEnabledFromEnv()) {\n return;\n }\n\n const config = logSpoolConfigFromEnv();\n const intervalMs = options.intervalMs ?? config.collectIntervalMs;\n\n TriggerManager.registerRunner({\n key: options.runnerKey ?? COLLECT_LOG_RUNNER_KEY,\n intervalMs,\n initialDelayMs: options.initialDelayMs ?? 0,\n retryCount: 1,\n fn: async (ctx) => {\n const serviceId = await options.getServiceId();\n if (serviceId == null) {\n ctx.logger.warn(\"collect-log skipped — serviceId unavailable\", { topic: LOG_TOPIC_TRIGGER });\n return;\n }\n\n const result = await runCollectLogTick({\n serviceId,\n serviceValue: options.serviceValue,\n spoolRoot: options.spoolRoot,\n config,\n });\n\n if (result.uploaded > 0 || result.failed > 0) {\n ctx.logger.info(\"collect-log runner finished\", {\n topic: LOG_TOPIC_TRIGGER,\n data: result,\n });\n }\n },\n });\n\n spoolLogger.info(\"collect-log runner registered\", {\n intervalMs,\n serviceValue: options.serviceValue,\n });\n}\n","import { BaseNodeRuntime, LOG_TOPIC_NODE, type NodeLoopContext } from \"../node/base-node-runtime\";\nimport { NodeKind } from \"../node/node.interface\";\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 private readonly loopIntervalMs: number;\n\n constructor(options?: TriggerNodeOptions) {\n super(\"triggerNode\", { beforeProcessExit: options?.beforeProcessExit });\n this.requireRunners = options?.requireRunners ?? false;\n const loopIntervalMs = options?.loopIntervalMs ?? TRIGGER_LOOP_INTERVAL_MS;\n if (!Number.isFinite(loopIntervalMs) || loopIntervalMs < 1) {\n throw new Error(`[TriggerNode] loopIntervalMs must be a positive number, got ${loopIntervalMs}`);\n }\n this.loopIntervalMs = loopIntervalMs;\n }\n\n protected getNodeKind(): NodeKind {\n return NodeKind.TRIGGER;\n }\n\n protected getLoopIntervalMs(): number {\n return this.loopIntervalMs;\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(this.loopIntervalMs)) {\n logger.warn(\"Runner interval 小於主循環 tick 間隔,實際觸發精度受限\", {\n topic: LOG_TOPIC_TRIGGER,\n data: {\n runnerKey: key,\n intervalMs,\n loopIntervalMs: this.loopIntervalMs,\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","import { createLogger, type LoggerWithScope } from \"../../shared/log\";\nimport { registerCollectLogRunner } from \"../../shared/log/spool/register-collect-log-runner\";\nimport { getErrorMessage } from \"../../shared/utils/error.utils\";\nimport { TriggerNode } from \"../../trigger/trigger-node\";\nimport type { NodeLoopContext } from \"../base-node-runtime\";\nimport { NodeKind } from \"../node.interface\";\nimport { pollUntil } from \"../readiness/poll-until\";\nimport { runReadinessGate } from \"../readiness/run-readiness-gate\";\nimport type { GuardRuntimeSlice } from \"../runtime-state/service-runtime-state.types\";\nimport { registerServiceGuardRunner } from \"./register-service-guard-runner\";\nimport type { ServiceGuardNodeOptions } from \"./service-guard.interface\";\nimport { markWorkerSpawned } from \"./worker-spawn-cooldown\";\n\nconst SILENT_BACKOFF_MS = [15_000, 30_000, 60_000, 120_000, 240_000, 300_000] as const;\nconst SILENT_EVENT_LIMIT = 32;\nconst DEFAULT_BUSINESS_READY_TIMEOUT_MS = 180_000;\n\n/**\n * L3 guard process TriggerNode: readiness gate, business-node spawn owner,\n * and {@link registerServiceGuardRunner} tick (registry slot + liveness + runtime).\n *\n * Consecutive heartbeat failure enters silent mode (no process exit). Recovery\n * respawns business nodes; leaving silent requires heartbeat + all nodes ready.\n *\n * Use {@link ServiceGuardNode.create} so the guard runner is registered before `start()`.\n */\nclass ServiceGuardNode extends TriggerNode {\n private readonly options: ServiceGuardNodeOptions;\n private readonly businessReadyTimeoutMs: number;\n private mode: GuardRuntimeSlice[\"mode\"] = \"healthy\";\n private silentBackoffIndex = 0;\n private silentEvents: GuardRuntimeSlice[\"silentEvents\"] = [];\n private recoverPromise: Promise<void> | null = null;\n\n private constructor(options: ServiceGuardNodeOptions) {\n super({\n requireRunners: true,\n beforeProcessExit: options.beforeProcessExit,\n });\n this.options = options;\n this.businessReadyTimeoutMs = options.businessReadyTimeoutMs ?? DEFAULT_BUSINESS_READY_TIMEOUT_MS;\n }\n\n protected getNodeKind(): NodeKind {\n return NodeKind.GUARD;\n }\n\n /** Register the guard runner and return a ready-to-start node. */\n static create(options: ServiceGuardNodeOptions): ServiceGuardNode {\n registerServiceGuardRunner({\n ...options.guardRunner,\n serviceValue: options.serviceValue,\n logTopic: options.logTopic,\n spawnWorker: options.spawnBusinessNodes,\n });\n registerCollectLogRunner({\n serviceValue: options.serviceValue,\n getServiceId: options.guardRunner.getServiceId,\n });\n return new ServiceGuardNode(options);\n }\n\n protected isSilenced(): boolean {\n return this.mode !== \"healthy\";\n }\n\n protected getLoopIntervalMs(): number {\n if (this.mode === \"silent\") {\n return SILENT_BACKOFF_MS[this.silentBackoffIndex] ?? 300_000;\n }\n return super.getLoopIntervalMs();\n }\n\n protected async onHealthCheckFailed(_ctx: NodeLoopContext): Promise<void> {\n if (this.mode !== \"healthy\") {\n this.bumpSilentBackoff();\n await this.persistGuard({\n lastDecision: \"silent_heartbeat_fail\",\n silentConsecutiveFailures: this.silentConsecutiveFailures(),\n silentBackoffMs: this.getLoopIntervalMs(),\n silentLastHeartbeatAt: new Date().toISOString(),\n });\n return;\n }\n await this.enterSilent(\"heartbeat:consecutive-failures\");\n }\n\n protected async onHeartbeatRecovered(ctx: NodeLoopContext): Promise<void> {\n if (this.mode !== \"silent\") {\n return;\n }\n await this.recoverFromSilent(ctx);\n }\n\n protected async onBeforeRegisterNode(nodeLogger: LoggerWithScope): Promise<void> {\n await runReadinessGate({\n checks: this.options.readinessChecks,\n onReport: this.options.onReadinessReport,\n logger: nodeLogger,\n logTopic: this.options.logTopic,\n });\n\n await super.onBeforeRegisterNode(nodeLogger);\n\n nodeLogger.info(\"Spawning business nodes\", {\n topic: this.options.logTopic ?? \"guard\",\n });\n await this.options.spawnBusinessNodes(\"guard:readiness-passed\");\n markWorkerSpawned();\n this.options.onWorkerSpawned?.();\n\n await this.waitUntilBusinessReady();\n await this.persistGuard({\n mode: \"healthy\",\n lastDecision: \"bootstrap_ready\",\n });\n }\n\n protected async runLoopSteps(ctx: NodeLoopContext, heartbeatOk: boolean): Promise<void> {\n await super.runLoopSteps(ctx, heartbeatOk);\n if (this.mode !== \"healthy\" || !heartbeatOk) {\n return;\n }\n // Idempotent — respawn exited children without entering silent (worker stale is the runner's job).\n try {\n await this.options.spawnBusinessNodes(\"guard:ensure-business\");\n } catch (error) {\n this.createGuardLogger().warn(\"ensure-business spawn failed\", {\n topic: this.options.logTopic ?? \"guard\",\n data: { error: getErrorMessage(error) },\n });\n }\n }\n\n private silentConsecutiveFailures(): number {\n return this.silentBackoffIndex + 1;\n }\n\n private bumpSilentBackoff(): void {\n if (this.silentBackoffIndex < SILENT_BACKOFF_MS.length - 1) {\n this.silentBackoffIndex += 1;\n }\n }\n\n private async enterSilent(reason: string): Promise<void> {\n this.mode = \"silent\";\n this.silentBackoffIndex = 0;\n const enteredAt = new Date().toISOString();\n this.pushEvent(\"enter\", reason);\n await this.persistGuard({\n mode: \"silent\",\n lastDecision: `silent:${reason}`,\n silentEnteredAt: enteredAt,\n silentLastHeartbeatAt: enteredAt,\n silentBackoffMs: SILENT_BACKOFF_MS[0],\n silentConsecutiveFailures: 1,\n silentRecoveryAttempt: 0,\n silentEvents: this.silentEvents,\n });\n\n const logger = this.createGuardLogger();\n logger.warn(\"Entering silent mode — service unavailable until heartbeat + business nodes recover\", {\n topic: this.options.logTopic ?? \"guard\",\n data: { reason },\n });\n\n try {\n await this.options.stopBusinessNodes();\n } catch (error) {\n logger.warn(\"stopBusinessNodes failed (best-effort)\", {\n topic: this.options.logTopic ?? \"guard\",\n data: { error: getErrorMessage(error) },\n });\n }\n }\n\n private async recoverFromSilent(ctx: NodeLoopContext): Promise<void> {\n if (this.recoverPromise != null) {\n return this.recoverPromise;\n }\n this.recoverPromise = this.runRecover(ctx).finally(() => {\n this.recoverPromise = null;\n });\n return this.recoverPromise;\n }\n\n private async runRecover(ctx: NodeLoopContext): Promise<void> {\n this.mode = \"recovering\";\n this.pushEvent(\"recover_start\", ctx.loopTraceId);\n await this.persistGuard({\n mode: \"recovering\",\n lastDecision: \"recovering\",\n silentLastHeartbeatAt: new Date().toISOString(),\n silentRecoveryAttempt: this.silentEvents.filter((event) => event.type === \"recover_start\").length,\n silentEvents: this.silentEvents,\n });\n\n const logger = this.createGuardLogger();\n logger.info(\"Heartbeat restored — recovering business nodes\", {\n topic: this.options.logTopic ?? \"guard\",\n });\n\n try {\n await this.options.stopBusinessNodes();\n } catch (error) {\n logger.warn(\"stopBusinessNodes failed before respawn\", {\n topic: this.options.logTopic ?? \"guard\",\n data: { error: getErrorMessage(error) },\n });\n }\n\n try {\n await this.options.spawnBusinessNodes(\"guard:silent-recover\");\n markWorkerSpawned();\n await this.waitUntilBusinessReady();\n } catch (error) {\n this.pushEvent(\"recover_fail\", getErrorMessage(error));\n this.mode = \"silent\";\n this.bumpSilentBackoff();\n await this.persistGuard({\n mode: \"silent\",\n lastDecision: \"recover_fail\",\n silentBackoffMs: this.getLoopIntervalMs(),\n silentEvents: this.silentEvents,\n });\n logger.warn(\"Recovery failed — returning to silent\", {\n topic: this.options.logTopic ?? \"guard\",\n data: { error: getErrorMessage(error) },\n });\n try {\n await this.options.stopBusinessNodes();\n } catch {\n // best-effort — leftover children are stopped again on the next recover\n }\n return;\n }\n\n this.mode = \"healthy\";\n this.silentBackoffIndex = 0;\n this.pushEvent(\"recover_ok\");\n await this.persistGuard({\n mode: \"healthy\",\n lastDecision: \"recover_ok\",\n silentEnteredAt: null,\n silentBackoffMs: 0,\n silentConsecutiveFailures: 0,\n silentEvents: this.silentEvents,\n });\n logger.success(\"Left silent mode — business nodes ready\", {\n topic: this.options.logTopic ?? \"guard\",\n });\n }\n\n private async waitUntilBusinessReady(): Promise<void> {\n try {\n await pollUntil({\n timeoutMs: this.businessReadyTimeoutMs,\n intervalMs: 500,\n until: () => this.options.isBusinessReady(),\n });\n } catch {\n throw new Error(`Business nodes not ready within ${this.businessReadyTimeoutMs}ms`);\n }\n }\n\n private pushEvent(type: string, detail?: string): void {\n this.silentEvents = [...this.silentEvents, { at: new Date().toISOString(), type, detail }].slice(\n -SILENT_EVENT_LIMIT,\n );\n }\n\n private async persistGuard(patch: Partial<GuardRuntimeSlice>): Promise<void> {\n try {\n await this.options.guardRunner.onGuardPatch(patch);\n } catch {\n // best-effort — disk/runtime state must not take down the guard loop\n }\n }\n\n private createGuardLogger(): LoggerWithScope {\n return createLogger({ module: \"service-guard\" });\n }\n}\n\nexport { ServiceGuardNode };\n","import type { ChildProcess } from \"node:child_process\";\nimport type { ManagedChildProcesses } from \"../process/managed-child-processes\";\nimport type {\n GuardRuntimeSlice,\n SchedulerRuntimeSlice,\n WorkerRuntimeSlice,\n} from \"../runtime-state/service-runtime-state.types\";\n\nconst WORKER_SCRIPT = \"./dist/processes/worker.js\";\nconst GUARD_SCRIPT = \"./dist/processes/guard.js\";\nconst SCHEDULER_SCRIPT = \"./dist/processes/scheduler.js\";\n\nexport interface L3ChildLauncherRuntimeStore {\n readRuntimeState(): Promise<{\n worker: WorkerRuntimeSlice;\n scheduler: SchedulerRuntimeSlice;\n guard: GuardRuntimeSlice;\n }>;\n writeRuntimeState(patch: {\n worker?: Partial<WorkerRuntimeSlice>;\n scheduler?: Partial<SchedulerRuntimeSlice>;\n guard?: Partial<GuardRuntimeSlice>;\n }): Promise<unknown>;\n}\n\nexport interface CreateL3ChildLauncherOptions {\n childProcesses: ManagedChildProcesses;\n readRuntimeState: L3ChildLauncherRuntimeStore[\"readRuntimeState\"];\n writeRuntimeState: L3ChildLauncherRuntimeStore[\"writeRuntimeState\"];\n /** Merged onto the child env. Default: `{ LOG_PERSIST_PROCESS: label }`. */\n spawnEnv?: (label: string) => Record<string, string>;\n}\n\nexport interface L3ChildLauncher {\n spawnGuard: () => ChildProcess;\n spawnTaskWorker: (reason: string) => Promise<ChildProcess>;\n spawnScheduler: (reason: string) => Promise<ChildProcess>;\n spawnBusinessNodes: (reason: string) => Promise<void>;\n stopBusinessNodes: () => Promise<void>;\n isBusinessReady: () => Promise<boolean>;\n stopChildProcesses: () => Promise<void>;\n}\n\nfunction defaultSpawnEnv(label: string): Record<string, string> {\n return { LOG_PERSIST_PROCESS: label };\n}\n\n/**\n * Guard-owned scheduler + worker spawn/stop, plus main-owned Guard spawn.\n * `stopBusinessNodes` must run in the Guard process (that instance's children only).\n * `stopChildProcesses` is for main shutdown (`extraPids` for Guard-spawned PIDs).\n */\nexport function createL3ChildLauncher(options: CreateL3ChildLauncherOptions): L3ChildLauncher {\n const { childProcesses, readRuntimeState, writeRuntimeState } = options;\n const spawnEnv = options.spawnEnv ?? defaultSpawnEnv;\n\n function nowIso(): string {\n return new Date().toISOString();\n }\n\n async function spawnTaskWorker(reason: string): Promise<ChildProcess> {\n const { child, created } = childProcesses.spawn(\"worker\", WORKER_SCRIPT, {\n env: spawnEnv(\"worker\"),\n });\n if (!created) {\n return child;\n }\n\n const current = await readRuntimeState();\n await writeRuntimeState({\n worker: {\n pid: child.pid ?? null,\n spawnedAt: nowIso(),\n ready: false,\n registeredTasks: [],\n readyAt: null,\n },\n guard: {\n lastSpawnAt: nowIso(),\n lastDecision: reason,\n spawnCount: current.guard.spawnCount + 1,\n },\n });\n\n return child;\n }\n\n function spawnGuard(): ChildProcess {\n return childProcesses.spawn(\"guard\", GUARD_SCRIPT, { env: spawnEnv(\"guard\") }).child;\n }\n\n async function spawnScheduler(reason: string): Promise<ChildProcess> {\n const { child, created } = childProcesses.spawn(\"scheduler\", SCHEDULER_SCRIPT, {\n env: spawnEnv(\"scheduler\"),\n });\n if (!created) {\n return child;\n }\n\n await writeRuntimeState({\n scheduler: {\n pid: child.pid ?? null,\n spawnedAt: nowIso(),\n ready: false,\n readyAt: null,\n },\n guard: {\n lastDecision: reason,\n },\n });\n\n return child;\n }\n\n async function spawnBusinessNodes(reason: string): Promise<void> {\n await spawnScheduler(reason);\n await spawnTaskWorker(reason);\n }\n\n async function stopBusinessNodes(): Promise<void> {\n await childProcesses.stopAll();\n await writeRuntimeState({\n worker: {\n pid: null,\n ready: false,\n readyAt: null,\n registeredTasks: [],\n },\n scheduler: {\n pid: null,\n ready: false,\n readyAt: null,\n },\n });\n }\n\n async function isBusinessReady(): Promise<boolean> {\n const state = await readRuntimeState();\n return state.worker.ready && state.scheduler.ready;\n }\n\n async function stopChildProcesses(): Promise<void> {\n const state = await readRuntimeState();\n const extraPids = [state.worker.pid, state.scheduler.pid].filter((pid): pid is number => pid != null);\n await childProcesses.stopAll({ extraPids });\n }\n\n return {\n spawnGuard,\n spawnTaskWorker,\n spawnScheduler,\n spawnBusinessNodes,\n stopBusinessNodes,\n isBusinessReady,\n stopChildProcesses,\n };\n}\n","import { ServiceRegistryError } from \"../../service/registry/registry.service\";\nimport { claimServiceRegistrySlot, type ServiceRegistrySession } from \"../../service/registry/registry-lifecycle\";\nimport type { Service } from \"../../service/service.interface\";\nimport type { LoggerWithScope } from \"../../shared/log\";\n\nexport interface ClaimRegistrySlotOrExitInput {\n serviceValue: string;\n createInstance: () => Promise<Service>;\n logger: LoggerWithScope;\n logTopic: string;\n}\n\n/**\n * Claim a registry slot, or `process.exit(1)` when no EMPTY slot remains.\n * Other errors propagate.\n */\nexport async function claimRegistrySlotOrExit(input: ClaimRegistrySlotOrExitInput): Promise<ServiceRegistrySession> {\n try {\n return await claimServiceRegistrySlot({\n serviceValue: input.serviceValue,\n createInstance: input.createInstance,\n });\n } catch (error) {\n if (error instanceof ServiceRegistryError && error.code === \"SERVICE_SLOTS_FULL\") {\n input.logger.critical(\"No EMPTY registry slot — refusing to start\", {\n topic: input.logTopic,\n data: { serviceValue: input.serviceValue, code: error.code },\n });\n process.exit(1);\n }\n throw error;\n }\n}\n","import { ServiceRegistryError } from \"../../service/registry/registry.service\";\nimport type { ServiceRegistrySession } from \"../../service/registry/registry-lifecycle\";\nimport type { Service } from \"../../service/service.interface\";\nimport { createLogger, type LoggerWithScope } from \"../../shared/log\";\nimport { LOG_SPOOL_SERVICE_ID_ENV } from \"../../shared/log/spool/config\";\nimport { ensureLogSpoolFromEnv } from \"../../shared/log/spool/enable\";\nimport { logSpoolEnabledFromEnv } from \"../../shared/log/upload/env\";\nimport type { ManagedChildProcesses } from \"../process/managed-child-processes\";\nimport { claimRegistrySlotOrExit } from \"./claim-registry-slot\";\n\nexport interface ServiceHostClosable {\n close: () => Promise<void>;\n}\n\nexport interface ServiceHostContext {\n service: Service;\n session: ServiceRegistrySession;\n /** Registry instance id — same as `service.id`; children inherit via spawn env injection. */\n serviceId: string;\n}\n\nexport interface ServiceHostOptions {\n serviceValue: string;\n logger?: LoggerWithScope;\n logTopic?: string;\n childProcesses?: ManagedChildProcesses;\n /** Labels that trigger host shutdown when the child exits unexpectedly. */\n criticalSupervisors?: readonly string[];\n\n prepare?: () => Promise<void>;\n createInstance: () => Promise<Service | { service: Service; baseUrl?: string }>;\n onRegistryClaimed?: (ctx: ServiceHostContext) => Promise<void>;\n startSupervisors?: (ctx: ServiceHostContext) => void | Promise<void>;\n waitUntilReady?: () => Promise<void>;\n startServer?: () => Promise<ServiceHostClosable>;\n /** When true (default), enable file log spool for main after registry claim. */\n enableLogSpoolAfterClaim?: boolean;\n /** Stop child processes and other local resources (not registry release). */\n onShutdown?: (signal: string) => Promise<void>;\n}\n\nconst DEFAULT_CRITICAL_SUPERVISORS = [\"guard\", \"supervisor\"] as const;\n\nexport interface ServiceHost {\n run: () => Promise<void>;\n requestShutdown: (signal: string, exitCode?: number) => void;\n}\n\nfunction unwrapService(created: Service | { service: Service; baseUrl?: string }): Service {\n return typeof created === \"object\" && created != null && \"service\" in created ? created.service : created;\n}\n\nexport function createServiceHost(options: ServiceHostOptions): ServiceHost {\n const logger = options.logger ?? createLogger({ module: \"service-host\" });\n const logTopic = options.logTopic ?? \"startup\";\n const criticalSupervisors = options.criticalSupervisors ?? DEFAULT_CRITICAL_SUPERVISORS;\n\n let session: ServiceRegistrySession | null = null;\n let httpServer: ServiceHostClosable | null = null;\n let shuttingDown = false;\n\n async function shutdown(signal: string, exitCode = 0): Promise<void> {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n\n logger.info(\"shutting down\", { topic: logTopic, data: { signal, exitCode } });\n\n if (httpServer != null) {\n await httpServer.close().catch(() => undefined);\n httpServer = null;\n }\n\n if (options.onShutdown != null) {\n await options.onShutdown(signal).catch(() => undefined);\n }\n\n if (session != null) {\n await session.release();\n session = null;\n }\n\n process.exit(exitCode);\n }\n\n function requestShutdown(signal: string, exitCode = 0): void {\n void shutdown(signal, exitCode);\n }\n\n function installProcessHandlers(): void {\n process.on(\"SIGINT\", () => void shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => void shutdown(\"SIGTERM\"));\n\n options.childProcesses?.setCriticalExitHandler({\n labels: criticalSupervisors,\n onCriticalExit: (label, code, signal) => {\n if (shuttingDown) {\n return;\n }\n logger.critical(\"Critical supervisor exited — shutting down service\", {\n topic: logTopic,\n data: { label, code, signal },\n });\n void shutdown(\"supervisor-exit\", 1);\n },\n });\n }\n\n async function run(): Promise<void> {\n installProcessHandlers();\n\n if (options.prepare != null) {\n await options.prepare();\n }\n\n session = await claimRegistrySlotOrExit({\n serviceValue: options.serviceValue,\n createInstance: async () => unwrapService(await options.createInstance()),\n logger,\n logTopic,\n });\n\n const hostCtx: ServiceHostContext = { service: session.service, session, serviceId: session.service.id };\n\n if (options.onRegistryClaimed != null) {\n await options.onRegistryClaimed(hostCtx);\n }\n\n process.env[LOG_SPOOL_SERVICE_ID_ENV] = session.service.id;\n\n const enableSpool = options.enableLogSpoolAfterClaim ?? true;\n if (enableSpool && logSpoolEnabledFromEnv()) {\n await ensureLogSpoolFromEnv({\n serviceId: session.service.id,\n serviceValue: options.serviceValue,\n processRole: \"main\",\n });\n }\n\n if (options.startSupervisors != null) {\n await options.startSupervisors(hostCtx);\n }\n\n if (options.waitUntilReady != null) {\n await options.waitUntilReady();\n }\n\n if (options.startServer != null) {\n httpServer = await options.startServer();\n }\n }\n\n async function runWithFatalHandling(): Promise<void> {\n try {\n await run();\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n const code = error instanceof ServiceRegistryError ? error.code : undefined;\n logger.error(\"fatal\", { topic: logTopic, data: { message, code } });\n\n if (httpServer != null) {\n await httpServer.close().catch(() => undefined);\n httpServer = null;\n }\n\n if (options.onShutdown != null) {\n await options.onShutdown(\"fatal\").catch(() => undefined);\n }\n\n if (session != null) {\n await session.release().catch(() => undefined);\n session = null;\n }\n\n process.exit(1);\n }\n }\n\n return { run: runWithFatalHandling, requestShutdown };\n}\n","import type { ServiceRegistrySession } from \"../../service/registry/registry-lifecycle\";\nimport type { Service } from \"../../service/service.interface\";\nimport { createLogger, type LoggerWithScope } from \"../../shared/log\";\nimport { LOG_SPOOL_SERVICE_ID_ENV } from \"../../shared/log/spool/config\";\nimport { claimRegistrySlotOrExit } from \"./claim-registry-slot\";\n\nexport interface SingleProcessServiceContext {\n service: Service;\n session: ServiceRegistrySession;\n}\n\nexport interface SingleProcessServiceOptions {\n serviceValue: string;\n logger?: LoggerWithScope;\n logTopic?: string;\n\n prepare?: () => Promise<void>;\n createInstance: () => Promise<Service>;\n run: (ctx: SingleProcessServiceContext) => Promise<void>;\n}\n\n/**\n * Single-process L3 entry (e.g. log-service): claim registry slot then run the service body.\n * Registry release is the caller's responsibility inside `run` (e.g. TriggerNode `beforeProcessExit`).\n */\nexport async function runSingleProcessService(options: SingleProcessServiceOptions): Promise<void> {\n const logger = options.logger ?? createLogger({ module: \"single-process-service\" });\n const logTopic = options.logTopic ?? \"startup\";\n\n if (options.prepare != null) {\n await options.prepare();\n }\n\n const session = await claimRegistrySlotOrExit({\n serviceValue: options.serviceValue,\n createInstance: options.createInstance,\n logger,\n logTopic,\n });\n\n process.env[LOG_SPOOL_SERVICE_ID_ENV] = session.service.id;\n\n try {\n await options.run({ service: session.service, session });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(\"fatal\", { topic: logTopic, data: { message } });\n await session.release().catch(() => undefined);\n process.exit(1);\n }\n}\n","import { type Dispatcher, ProxyAgent } from \"undici\";\nimport {\n createLogger,\n type FetchInitFactory,\n fetchBinaryWithRetry,\n fetchWithRetry,\n isRetryableHttpStatus,\n} from \"../../browser\";\nimport type { ResolvedTelegramStorageOptions, TelegramApiResponse } from \"./types\";\n\nconst logger = createLogger({ module: \"telegram\" });\n\nlet cachedDispatcher: Dispatcher | undefined;\nlet cachedProxyUrl: string | undefined;\n\n/** Per-request undici dispatcher when proxyUrl is set (Supabase stays direct). */\nfunction telegramFetchDispatcher(proxyUrl: string | undefined): Dispatcher | undefined {\n if (proxyUrl == null) {\n return undefined;\n }\n if (cachedDispatcher != null && cachedProxyUrl === proxyUrl) {\n return cachedDispatcher;\n }\n cachedDispatcher = new ProxyAgent(proxyUrl);\n cachedProxyUrl = proxyUrl;\n return cachedDispatcher;\n}\n\nfunction telegramNetworkHint(proxyUrl: string | undefined): string {\n return proxyUrl\n ? ` (proxy=${proxyUrl}, ensure Clash/V2Ray is running)`\n : \" (set proxyUrl / TELEGRAM_PROXY if api.telegram.org is blocked)\";\n}\n\nexport interface CallTelegramOptions {\n timeoutMs?: number;\n retryAttempts?: number;\n retryBaseMs?: number;\n}\n\nfunction botApiUrl(options: ResolvedTelegramStorageOptions, method: string): string {\n return `${options.apiBaseUrl}/bot${options.botToken}/${method}`;\n}\n\nexport function telegramFileDownloadUrl(options: ResolvedTelegramStorageOptions, filePath: string): string {\n const normalized = filePath.replace(/^\\/+/, \"\");\n return `${options.apiBaseUrl}/file/bot${options.botToken}/${normalized}`;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction telegramBackoff(attempt: number, retryBaseMs: number): Promise<void> {\n return sleep(retryBaseMs * 2 ** (attempt - 1));\n}\n\n/** Bot API JSON call — transport retry via SDK fetch; outer loop retries Telegram `{ ok: false }`. */\nexport async function callTelegramApi<T>(\n options: ResolvedTelegramStorageOptions,\n method: string,\n initOrFactory: RequestInit | FetchInitFactory,\n callOptions: CallTelegramOptions = {},\n): Promise<T> {\n const timeoutMs = callOptions.timeoutMs ?? options.fetchTimeoutMs;\n const maxAttempts = callOptions.retryAttempts ?? 1;\n const retryBaseMs = callOptions.retryBaseMs ?? options.uploadRetryBaseMs;\n const url = botApiUrl(options, method);\n const label = `Telegram ${method}`;\n const dispatcher = telegramFetchDispatcher(options.proxyUrl);\n const hint = telegramNetworkHint(options.proxyUrl);\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const response = await fetchWithRetry(url, initOrFactory, {\n label,\n timeoutMs,\n maxAttempts: attempt === 1 ? maxAttempts : 1,\n retryBaseMs,\n dispatcher,\n hint,\n logger,\n });\n\n let payload: TelegramApiResponse<T>;\n try {\n payload = (await response.json()) as TelegramApiResponse<T>;\n } catch {\n lastError = new Error(`${label}: invalid JSON response (HTTP ${response.status})`);\n if (attempt < maxAttempts && isRetryableHttpStatus(response.status)) {\n await telegramBackoff(attempt, retryBaseMs);\n continue;\n }\n throw lastError;\n }\n\n if (!payload.ok) {\n const description = payload.description ?? `HTTP ${response.status}`;\n lastError = new Error(`${label}: ${description}`);\n if (attempt < maxAttempts && isRetryableHttpStatus(response.status)) {\n logger.warn(\"retrying after API error\", {\n topic: \"telegram\",\n data: { method, attempt, description },\n });\n await telegramBackoff(attempt, retryBaseMs);\n continue;\n }\n throw lastError;\n }\n\n if (payload.result == null) {\n throw new Error(`${label}: empty result in response`);\n }\n\n if (attempt > 1) {\n logger.info(\"request succeeded after retry\", { topic: \"telegram\", data: { method, attempt } });\n }\n\n return payload.result;\n }\n\n throw lastError ?? new Error(`${label}: request failed`);\n}\n\nexport async function telegramDownloadBinary(\n options: ResolvedTelegramStorageOptions,\n url: string,\n label: string,\n callOptions: CallTelegramOptions = {},\n): Promise<ArrayBuffer> {\n const dispatcher = telegramFetchDispatcher(options.proxyUrl);\n return fetchBinaryWithRetry(\n url,\n { method: \"GET\" },\n {\n label: `Telegram ${label}`,\n timeoutMs: callOptions.timeoutMs ?? options.fetchTimeoutMs,\n maxAttempts: callOptions.retryAttempts ?? 1,\n retryBaseMs: callOptions.retryBaseMs ?? options.uploadRetryBaseMs,\n dispatcher,\n hint: telegramNetworkHint(options.proxyUrl),\n logger,\n },\n );\n}\n","import { callTelegramApi, telegramDownloadBinary, telegramFileDownloadUrl } from \"./api-client\";\nimport type { ResolvedTelegramStorageOptions, TelegramFile } from \"./types\";\n\n/** Download chunk bytes by Telegram `file_id` stored in Chunk.url. */\nexport async function downloadTelegramChunk(\n options: ResolvedTelegramStorageOptions,\n fileId: string,\n): Promise<ArrayBuffer> {\n const file = await callTelegramApi<TelegramFile>(\n options,\n `getFile?file_id=${encodeURIComponent(fileId)}`,\n { method: \"GET\" },\n {\n retryAttempts: options.uploadRetryAttempts,\n retryBaseMs: options.uploadRetryBaseMs,\n },\n );\n\n if (file.file_path == null || file.file_path === \"\") {\n throw new Error(`Telegram getFile: missing file_path for file_id ${fileId}`);\n }\n\n return telegramDownloadBinary(\n options,\n telegramFileDownloadUrl(options, file.file_path),\n `download:${fileId.slice(0, 12)}…`,\n {\n timeoutMs: options.uploadTimeoutMs,\n retryAttempts: options.uploadRetryAttempts,\n retryBaseMs: options.uploadRetryBaseMs,\n },\n );\n}\n","/**\n * Telegram chunk URL encoding: `${messageId}|${fileId}`.\n * Legacy parcels store bare `file_id` (no messageId → cannot deleteMessage).\n */\n\nconst SEPARATOR = \"|\";\n\nexport function encodeTelegramChunkUrl(messageId: number, fileId: string): string {\n return `${messageId}${SEPARATOR}${fileId}`;\n}\n\nexport function parseTelegramChunkUrl(locator: string): { messageId: number | null; fileId: string } {\n const idx = locator.indexOf(SEPARATOR);\n if (idx <= 0) {\n return { messageId: null, fileId: locator };\n }\n const mid = Number(locator.slice(0, idx));\n const fileId = locator.slice(idx + 1);\n if (!Number.isInteger(mid) || mid <= 0 || fileId === \"\") {\n return { messageId: null, fileId: locator };\n }\n return { messageId: mid, fileId };\n}\n","export interface TelegramApiResponse<T> {\n ok: boolean;\n description?: string;\n result?: T;\n}\n\nexport interface TelegramDocument {\n file_id: string;\n file_unique_id: string;\n file_size?: number;\n}\n\nexport interface TelegramMessage {\n message_id: number;\n document?: TelegramDocument;\n}\n\nexport interface TelegramFile {\n file_id: string;\n file_unique_id: string;\n file_size?: number;\n file_path?: string;\n}\n\nexport interface TelegramUploadResult {\n fileId: string;\n messageId: number;\n}\n\n/** Injected config for Telegram Bot API storage — do not read process.env inside SDK. */\nexport interface TelegramStorageProviderOptions {\n botToken: string;\n chatId: string;\n /** Default `https://api.telegram.org`. */\n apiBaseUrl?: string;\n /** HTTP(S) proxy for Telegram only (e.g. Clash). Supabase stays direct. */\n proxyUrl?: string;\n /** Default 30s — getMe / getFile. */\n fetchTimeoutMs?: number;\n /** Default 120s — sendDocument / file download. */\n uploadTimeoutMs?: number;\n /** Default 3. */\n uploadRetryAttempts?: number;\n /** Default 2000 — backoff base for attempt N: base * 2^(N-1). */\n uploadRetryBaseMs?: number;\n}\n\nexport interface ResolvedTelegramStorageOptions {\n botToken: string;\n chatId: string;\n apiBaseUrl: string;\n proxyUrl?: string;\n fetchTimeoutMs: number;\n uploadTimeoutMs: number;\n uploadRetryAttempts: number;\n uploadRetryBaseMs: number;\n}\n\nexport function resolveTelegramStorageOptions(options: TelegramStorageProviderOptions): ResolvedTelegramStorageOptions {\n const botToken = options.botToken.trim();\n const chatId = options.chatId.trim();\n if (botToken === \"\") {\n throw new Error(\"TelegramStorageProviderOptions.botToken is required\");\n }\n if (chatId === \"\") {\n throw new Error(\"TelegramStorageProviderOptions.chatId is required\");\n }\n\n const apiBaseUrl = (options.apiBaseUrl?.trim() || \"https://api.telegram.org\").replace(/\\/$/, \"\");\n const proxyUrl = options.proxyUrl?.trim() || undefined;\n\n return {\n botToken,\n chatId,\n apiBaseUrl,\n proxyUrl: proxyUrl !== \"\" ? proxyUrl : undefined,\n fetchTimeoutMs: options.fetchTimeoutMs ?? 30_000,\n uploadTimeoutMs: options.uploadTimeoutMs ?? 120_000,\n uploadRetryAttempts: options.uploadRetryAttempts ?? 3,\n uploadRetryBaseMs: options.uploadRetryBaseMs ?? 2_000,\n };\n}\n","import type { CreateUploadAdapterOptions, Parcel, StorageProviderModule, UploadTracker } from \"../../browser\";\nimport { isOpaqueChunkUrl } from \"../../browser\";\nimport { callTelegramApi } from \"./api-client\";\nimport { downloadTelegramChunk } from \"./chunk\";\nimport { encodeTelegramChunkUrl, parseTelegramChunkUrl } from \"./chunk-locator\";\nimport {\n type ResolvedTelegramStorageOptions,\n resolveTelegramStorageOptions,\n type TelegramMessage,\n type TelegramStorageProviderOptions,\n type TelegramUploadResult,\n} from \"./types\";\n\nexport const PROVIDER_TELEGRAM = \"telegram\";\n\nexport interface TelegramChunkDeleteResult {\n deleted: number;\n failed: number;\n skipped: number;\n}\n\nexport interface TelegramStorageProvider extends StorageProviderModule {\n readonly provider: typeof PROVIDER_TELEGRAM;\n /** Low-level upload for probes/CLIs. */\n uploadChunk(data: ArrayBuffer, filename: string): Promise<TelegramUploadResult>;\n /** Best-effort deleteMessage for rollback / probe cleanup. */\n deleteMessage(messageId: number): Promise<void>;\n /**\n * Best-effort delete Telegram messages for parcel chunks.\n * Chunks without an encoded messageId (legacy bare file_id) are skipped.\n */\n deleteChunkBlobs(parcel: Parcel): Promise<TelegramChunkDeleteResult>;\n}\n\nasync function uploadChunkToTelegram(\n options: ResolvedTelegramStorageOptions,\n data: ArrayBuffer,\n filename: string,\n): Promise<TelegramUploadResult> {\n const sizeMb = (data.byteLength / (1024 * 1024)).toFixed(2);\n\n const message = await callTelegramApi<TelegramMessage>(\n options,\n \"sendDocument\",\n () => {\n const form = new FormData();\n form.append(\"chat_id\", options.chatId);\n form.append(\"document\", new Blob([data]), filename);\n return { method: \"POST\", body: form };\n },\n {\n timeoutMs: options.uploadTimeoutMs,\n retryAttempts: options.uploadRetryAttempts,\n retryBaseMs: options.uploadRetryBaseMs,\n },\n );\n\n const fileId = message.document?.file_id;\n if (fileId == null || fileId === \"\") {\n throw new Error(`Telegram sendDocument: missing file_id (chunk ${filename}, ${sizeMb} MB)`);\n }\n\n return { fileId, messageId: message.message_id };\n}\n\nasync function deleteTelegramMessage(options: ResolvedTelegramStorageOptions, messageId: number): Promise<void> {\n await callTelegramApi<boolean>(\n options,\n \"deleteMessage\",\n () => {\n const form = new FormData();\n form.append(\"chat_id\", options.chatId);\n form.append(\"message_id\", String(messageId));\n return { method: \"POST\", body: form };\n },\n {\n retryAttempts: 3,\n retryBaseMs: 1_000,\n },\n );\n}\n\nasync function rollbackTelegramUploads(options: ResolvedTelegramStorageOptions, handles: unknown[]): Promise<void> {\n for (const item of handles) {\n const upload = item as TelegramUploadResult;\n if (upload?.messageId == null) {\n continue;\n }\n try {\n await deleteTelegramMessage(options, upload.messageId);\n } catch {\n // Best-effort cleanup\n }\n }\n}\n\nfunction assertTelegramParcel(parcel: Parcel): void {\n const chunks = parcel.details.chunkList;\n if (chunks.length === 0) {\n throw new Error(\"Parcel has no chunks\");\n }\n\n const nonTelegram = chunks.filter((chunk) => chunk.provider != null && chunk.provider !== PROVIDER_TELEGRAM);\n if (nonTelegram.length > 0) {\n const providers = [...new Set(nonTelegram.map((chunk) => chunk.provider))];\n throw new Error(\n `Parcel is not telegram-only (found providers: ${providers.join(\", \")}). ` +\n \"Multi-provider restore is not yet supported for this parcel.\",\n );\n }\n}\n\n/**\n * Build a Telegram {@link StorageProviderModule}. Caller registers it — no side effects.\n *\n * @example\n * ```ts\n * import { createStorageProviderRegistry, createTelegramStorageProvider } from \"target-supabase-sdk/node\";\n * const registry = createStorageProviderRegistry();\n * registry.register(createTelegramStorageProvider({ botToken, chatId, proxyUrl }));\n * ```\n */\nexport function createTelegramStorageProvider(input: TelegramStorageProviderOptions): TelegramStorageProvider {\n const options = resolveTelegramStorageOptions(input);\n\n return {\n provider: PROVIDER_TELEGRAM,\n uploadChunk: (data, filename) => uploadChunkToTelegram(options, data, filename),\n deleteMessage: (messageId) => deleteTelegramMessage(options, messageId),\n async deleteChunkBlobs(parcel) {\n let deleted = 0;\n let failed = 0;\n let skipped = 0;\n for (const chunk of parcel.details.chunkList) {\n if (chunk.provider != null && chunk.provider !== PROVIDER_TELEGRAM) {\n skipped += 1;\n continue;\n }\n const { messageId } = parseTelegramChunkUrl(chunk.url);\n if (messageId == null) {\n skipped += 1;\n continue;\n }\n try {\n await deleteTelegramMessage(options, messageId);\n deleted += 1;\n } catch {\n failed += 1;\n }\n }\n return { deleted, failed, skipped };\n },\n createUploadAdapter(adapterOptions?: CreateUploadAdapterOptions) {\n const tracker = adapterOptions?.tracker as UploadTracker<TelegramUploadResult> | undefined;\n return {\n provider: PROVIDER_TELEGRAM,\n async upload(data, pathOrKey) {\n const result = await uploadChunkToTelegram(options, data, pathOrKey);\n tracker?.push(result);\n // Persist messageId so later deleteParcel can call deleteMessage.\n return { url: encodeTelegramChunkUrl(result.messageId, result.fileId) };\n },\n };\n },\n resolveChunk: (locator) => {\n const { fileId } = parseTelegramChunkUrl(locator);\n return downloadTelegramChunk(options, fileId);\n },\n matchesOpaqueUrl: isOpaqueChunkUrl,\n async probe() {\n try {\n const me = await callTelegramApi<{ username?: string }>(options, \"getMe\", { method: \"GET\" });\n return { ok: true as const, detail: { username: me.username ?? \"unknown\" } };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false as const, error: message };\n }\n },\n rollbackUpload: (handles) => rollbackTelegramUploads(options, handles),\n assertParcelRestorable: assertTelegramParcel,\n };\n}\n","export interface TaskRunResult {\n isSuccess: boolean;\n cost: number;\n extra: unknown;\n}\n\nexport interface TaskExecutionContext {\n taskId: string;\n taskName: string;\n taskTypeKey: string;\n traceId: string;\n}\n\nexport interface TaskFn {\n displayName: string;\n taskTypeKey: string;\n (taskParams: unknown, ctx: TaskExecutionContext): 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/task-local-discovery/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\nexport interface ConfigSchema<T> {\n safeParse(input: unknown): { success: true; data: T } | { success: false; error: { message: string } };\n}\n\nexport interface LoadCachedJsConfigOptions<T> {\n path: string;\n schema: ConfigSchema<T>;\n force?: boolean;\n}\n\nconst jsConfigCache = new Map<string, { mtimeMs: number; data: unknown }>();\n\n/**\n * Import a JS config module, validate with a schema, cache by file mtime.\n * For hot-reload, pass `{ force: true }` or rely on mtime change.\n */\nexport async function loadCachedJsConfigModule<T>(options: LoadCachedJsConfigOptions<T>): Promise<T> {\n const { stat } = await import(\"node:fs/promises\");\n const { path, schema, force } = options;\n const fileStat = await stat(path);\n const cached = jsConfigCache.get(path);\n if (!force && cached != null && cached.mtimeMs === fileStat.mtimeMs) {\n return cached.data as T;\n }\n\n const raw = await importJsConfigModule(path);\n const parsed = schema.safeParse(raw);\n if (!parsed.success) {\n throw new Error(`Invalid config ${path}: ${parsed.error.message}`);\n }\n\n jsConfigCache.set(path, { mtimeMs: fileStat.mtimeMs, data: parsed.data });\n return parsed.data;\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 { stat } from \"node:fs/promises\";\nimport { isAbsolute, resolve } from \"node:path\";\n\nimport { fetchWithRetry } from \"../../http/fetch-retry\";\nimport { isHttpUrl } from \"../../utils/fetch-url\";\nimport type { FeedValue } from \"../feed.interface\";\n\nexport interface CheckFeedLocalAvailabilityInput {\n value: FeedValue;\n storageProvider: string;\n locator: string;\n /** This host id (e.g. `process.env.LOCAL_STORAGE_PROVIDER`). */\n localStorageProvider: string;\n}\n\nexport interface FeedAvailabilityResult {\n ok: boolean;\n /** Absolute path when the locator was resolved on this host. */\n absolutePath?: string;\n reason?: string;\n}\n\nfunction sameStorageHost(storageProvider: string, localStorageProvider: string): boolean {\n return storageProvider.trim() === localStorageProvider.trim();\n}\n\nfunction isFeedDirectoryValue(value: FeedValue): boolean {\n return value === \"feed.image-list\";\n}\n\n/**\n * Local reachability for feed ingest (`.local` source).\n *\n * - Requires `storageProvider === localStorageProvider`.\n * - `locator` must be an absolute path.\n * - `feed.image-list`: directory exists.\n * - Other feed values: non-empty file.\n *\n * **Node-only**\n */\nexport async function checkFeedLocalAvailability(\n input: CheckFeedLocalAvailabilityInput,\n): Promise<FeedAvailabilityResult> {\n const storageProvider = input.storageProvider.trim();\n const localStorageProvider = input.localStorageProvider.trim();\n const locator = input.locator.trim();\n\n if (storageProvider === \"\" || localStorageProvider === \"\") {\n return { ok: false, reason: \"storageProvider and localStorageProvider are required\" };\n }\n if (locator === \"\") {\n return { ok: false, reason: \"locator is empty\" };\n }\n if (!sameStorageHost(storageProvider, localStorageProvider)) {\n return {\n ok: false,\n reason: `storageProvider not on this host (${storageProvider} !== ${localStorageProvider})`,\n };\n }\n if (!isAbsolute(locator)) {\n return { ok: false, reason: `locator must be an absolute path: ${locator}` };\n }\n\n const absolutePath = resolve(locator);\n\n try {\n const info = await stat(absolutePath);\n if (isFeedDirectoryValue(input.value)) {\n if (!info.isDirectory()) {\n return { ok: false, reason: `feed.image-list locator is not a directory: ${absolutePath}` };\n }\n return { ok: true, absolutePath };\n }\n if (!info.isFile()) {\n return { ok: false, reason: `locator is not a file: ${absolutePath}` };\n }\n if (info.size <= 0) {\n return { ok: false, reason: `file is empty: ${absolutePath}` };\n }\n return { ok: true, absolutePath };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: `locator not reachable: ${absolutePath} (${message})` };\n }\n}\n\nconst OSS_CHECK_TIMEOUT_MS = 15_000;\nconst OSS_CHECK_MAX_ATTEMPTS = 2;\n\nexport interface CheckFeedOssAvailabilityOptions {\n /** Override global `fetch` (proxied outbound, etc.). Default: SDK `fetchWithRetry`. */\n fetch?: (url: string, init?: RequestInit) => Promise<Response>;\n /** When true, skip HTTP (co-located Files sandbox, etc.). */\n tryLocalResolve?: (locator: string) => Promise<boolean>;\n timeoutMs?: number;\n}\n\nasync function probeHttpLocator(\n locator: string,\n method: \"HEAD\" | \"GET\",\n options?: CheckFeedOssAvailabilityOptions,\n): Promise<Response> {\n return fetchWithRetry(\n locator,\n {\n method,\n ...(method === \"GET\" ? { headers: { Range: \"bytes=0-0\" } } : {}),\n },\n {\n label: \"feed-oss-check\",\n timeoutMs: options?.timeoutMs ?? OSS_CHECK_TIMEOUT_MS,\n maxAttempts: OSS_CHECK_MAX_ATTEMPTS,\n ...(options?.fetch != null ? { fetch: options.fetch } : {}),\n },\n );\n}\n\n/**\n * Remote reachability for feed ingest (`.oss` source) via HTTP(S).\n *\n * Optional `tryLocalResolve` first (same-host Files). Then `HEAD`, then `GET` with\n * `Range: bytes=0-0` when `HEAD` is not allowed. Pass `fetch` for proxied outbound.\n *\n * **Node-only**\n */\nexport async function checkFeedOssAvailability(\n locator: string,\n options?: CheckFeedOssAvailabilityOptions,\n): Promise<FeedAvailabilityResult> {\n const trimmed = locator.trim();\n if (trimmed === \"\") {\n return { ok: false, reason: \"locator is empty\" };\n }\n if (!isHttpUrl(trimmed)) {\n return { ok: false, reason: `oss locator must be an http(s) URL: ${trimmed}` };\n }\n\n if (options?.tryLocalResolve != null) {\n try {\n if (await options.tryLocalResolve(trimmed)) {\n return { ok: true };\n }\n } catch {\n // fall through to HTTP\n }\n }\n\n try {\n let response = await probeHttpLocator(trimmed, \"HEAD\", options);\n if (response.status === 405 || response.status === 501) {\n response = await probeHttpLocator(trimmed, \"GET\", options);\n }\n if (response.ok || (response.status >= 200 && response.status < 400)) {\n return { ok: true };\n }\n return { ok: false, reason: `oss locator HTTP ${response.status}: ${trimmed}` };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: `oss locator request failed: ${trimmed} (${message})` };\n }\n}\n","import {\n getPossibleTarget,\n getTarget,\n isCreateTargetAlreadyExistsError,\n postTarget,\n updateTarget,\n} from \"../../../core.api\";\nimport type { Target } from \"../../../core.interface\";\nimport { CategoryLink, type Link, type LinkDetails } from \"../../../link/link.interface\";\nimport { createLogger } from \"../../log/core/create-logger\";\nimport { buildFeedLinkDraft, buildFeedTagList, resolveFeedOriginalStorageProvider } from \"../feed.build\";\nimport {\n type FeedIngestSource,\n type FeedOriginal,\n type FeedValue,\n isFeedIngestSource,\n isFeedValue,\n} from \"../feed.interface\";\nimport { feedLinkDedupFilters } from \"../feed.query\";\nimport {\n type CheckFeedOssAvailabilityOptions,\n checkFeedLocalAvailability,\n checkFeedOssAvailability,\n} from \"./feed.access\";\n\nconst logger = createLogger({ module: \"feed\" });\n\nexport interface RegisterFeedInput {\n /** Existing feed Link row id (must still be `.public` unless already ingested with same payload). */\n id: string;\n source: FeedIngestSource;\n storageProvider: string;\n locator: string;\n /** Required when `source` is `.local` (e.g. `process.env.LOCAL_STORAGE_PROVIDER`). Ignored for `.oss`. */\n localStorageProvider?: string;\n /** `.oss` HTTP check: inject `fetch` / same-host resolve. */\n ossCheck?: CheckFeedOssAvailabilityOptions;\n}\n\nexport interface RegisterFeedResult {\n id: string;\n /** `false` when row was already ingested with the same source, storageProvider, and locator. */\n updated: boolean;\n}\n\nfunction parseFeedOriginal(original: unknown): FeedOriginal | null {\n if (original == null || typeof original !== \"object\") {\n return null;\n }\n const record = original as Record<string, unknown>;\n const storageProvider = typeof record.storageProvider === \"string\" ? record.storageProvider : null;\n const locator = typeof record.locator === \"string\" ? record.locator : null;\n if (storageProvider == null || locator == null) {\n return null;\n }\n const twinList = Array.isArray(record.twinList)\n ? record.twinList.filter((entry): entry is string => typeof entry === \"string\")\n : undefined;\n return {\n storageProvider,\n locator,\n ...(twinList !== undefined ? { twinList } : {}),\n };\n}\n\nfunction assertFeedLink(target: Target): Link {\n if (target.category !== CategoryLink.LINK) {\n throw new Error(`registerFeed: target is not a link (category=${target.category})`);\n }\n if (!isFeedValue(target.value)) {\n throw new Error(`registerFeed: target value is not a feed loader: ${target.value}`);\n }\n const details = target.details as LinkDetails | undefined;\n if (details == null || details.loaderKey !== target.value) {\n throw new Error(\"registerFeed: invalid feed link details (loaderKey must equal value)\");\n }\n return target as Link;\n}\n\nfunction hasIngestSourceTag(tagList: string[]): boolean {\n return tagList.some((tag) => tag === \".local\" || tag === \".oss\");\n}\n\nfunction isSameIngestState(link: Link, source: FeedIngestSource, storageProvider: string, locator: string): boolean {\n if (!link.tagList.includes(source)) {\n return false;\n }\n const original = parseFeedOriginal(link.details.original);\n if (original == null) {\n return false;\n }\n return original.storageProvider === storageProvider && original.locator === locator;\n}\n\n/**\n * Ingest a `.public` feed Link: validate locator, then promote `tagList` source to `.local` or `.oss`\n * and update `details.original.storageProvider` + `locator`.\n *\n * **Node-only** — under `shared/feed/node/`; do not import from the browser entry.\n */\nexport async function registerFeed(input: RegisterFeedInput): Promise<RegisterFeedResult> {\n const id = input.id.trim();\n if (id === \"\") {\n throw new Error(\"registerFeed: id is empty\");\n }\n if (!isFeedIngestSource(input.source)) {\n throw new Error(`registerFeed: source must be .local or .oss, got ${String(input.source)}`);\n }\n\n const resolvedStorageProvider = resolveFeedOriginalStorageProvider(input.source, input.storageProvider);\n const locator = input.locator.trim();\n if (locator === \"\") {\n throw new Error(\"registerFeed: locator is empty\");\n }\n\n const { data: target } = await getTarget({ id });\n if (target == null) {\n throw new Error(`registerFeed: target not found: ${id}`);\n }\n\n const link = assertFeedLink(target);\n const feedValue = link.value as FeedValue;\n\n if (!link.tagList.includes(\".public\")) {\n if (isSameIngestState(link, input.source, resolvedStorageProvider, locator)) {\n logger.info(\"feed already ingested\", {\n topic: \"dedup\",\n data: { id, source: input.source, locator },\n });\n return { id, updated: false };\n }\n if (hasIngestSourceTag(link.tagList)) {\n throw new Error(\"registerFeed: feed already ingested with different source, storageProvider, or locator\");\n }\n throw new Error(\"registerFeed: feed is not .public — cannot ingest\");\n }\n\n if (input.source === \".local\") {\n const localStorageProvider = input.localStorageProvider?.trim() ?? \"\";\n if (localStorageProvider === \"\") {\n throw new Error(\"registerFeed: localStorageProvider is required when source is .local\");\n }\n const availability = await checkFeedLocalAvailability({\n value: feedValue,\n storageProvider: resolvedStorageProvider,\n locator,\n localStorageProvider,\n });\n if (!availability.ok) {\n throw new Error(`registerFeed: local locator unavailable — ${availability.reason ?? \"unknown\"}`);\n }\n } else {\n const availability = await checkFeedOssAvailability(locator, input.ossCheck);\n if (!availability.ok) {\n throw new Error(`registerFeed: oss locator unavailable — ${availability.reason ?? \"unknown\"}`);\n }\n }\n\n await updateTarget<Link, LinkDetails>({\n id,\n optimisticLockFilterList: [\n { field: \"category\", operator: \"eq\", value: CategoryLink.LINK },\n { field: \"details->original->>storageProvider\", operator: \"eq\", value: \"\" },\n ],\n updateFn: (row) => {\n if (!row.tagList.includes(\".public\")) {\n throw new Error(\"registerFeed: optimistic lock failed — .public tag missing\");\n }\n if (hasIngestSourceTag(row.tagList) && !row.tagList.includes(\".public\")) {\n throw new Error(\"registerFeed: feed already ingested\");\n }\n\n const details = row.details;\n const prior = parseFeedOriginal(details.original);\n const nextOriginal: FeedOriginal = {\n storageProvider: resolvedStorageProvider,\n locator,\n ...(prior?.twinList !== undefined ? { twinList: prior.twinList } : {}),\n };\n\n return {\n tagList: buildFeedTagList(input.source, row.tagList),\n details: {\n ...details,\n original: nextOriginal,\n },\n };\n },\n });\n\n logger.info(\"feed ingested\", {\n topic: \"register\",\n data: { id, source: input.source, storageProvider: resolvedStorageProvider, locator },\n });\n return { id, updated: true };\n}\n\nexport interface CreateFeedInput {\n /** Full Link `name` (Filter itemName, etc.). */\n name: string;\n value: FeedValue;\n source: FeedIngestSource;\n storageProvider: string;\n locator: string;\n description?: string;\n preview?: string;\n tagList?: string[];\n localStorageProvider?: string;\n ossCheck?: CheckFeedOssAvailabilityOptions;\n}\n\nexport interface CreateFeedResult {\n id: string;\n created: boolean;\n}\n\n/**\n * Insert a new feed Link already on `.local` or `.oss` (not a `.public` promote).\n * Dedup: `category` + `value` + `name`. Same original → `{ created: false }`.\n */\nexport async function createFeed(input: CreateFeedInput): Promise<CreateFeedResult> {\n if (!isFeedValue(input.value)) {\n throw new Error(`createFeed: unsupported feed value: ${String(input.value)}`);\n }\n if (!isFeedIngestSource(input.source)) {\n throw new Error(`createFeed: source must be .local or .oss, got ${String(input.source)}`);\n }\n\n const name = input.name.trim();\n if (name === \"\") {\n throw new Error(\"createFeed: name is empty\");\n }\n\n const resolvedStorageProvider = resolveFeedOriginalStorageProvider(input.source, input.storageProvider);\n const locator = input.locator.trim();\n if (locator === \"\") {\n throw new Error(\"createFeed: locator is empty\");\n }\n\n const { data: existing } = await getPossibleTarget({\n filterList: feedLinkDedupFilters({ value: input.value, name }),\n });\n if (existing != null) {\n const link = existing as Link;\n if (isSameIngestState(link, input.source, resolvedStorageProvider, locator)) {\n return { id: existing.id, created: false };\n }\n throw new Error(\"createFeed: feed name already exists with different source, storageProvider, or locator\");\n }\n\n if (input.source === \".local\") {\n const localStorageProvider = input.localStorageProvider?.trim() ?? \"\";\n if (localStorageProvider === \"\") {\n throw new Error(\"createFeed: localStorageProvider is required when source is .local\");\n }\n const availability = await checkFeedLocalAvailability({\n value: input.value,\n storageProvider: resolvedStorageProvider,\n locator,\n localStorageProvider,\n });\n if (!availability.ok) {\n throw new Error(`createFeed: local locator unavailable — ${availability.reason ?? \"unknown\"}`);\n }\n } else {\n const availability = await checkFeedOssAvailability(locator, input.ossCheck);\n if (!availability.ok) {\n throw new Error(`createFeed: oss locator unavailable — ${availability.reason ?? \"unknown\"}`);\n }\n }\n\n const draft = buildFeedLinkDraft({\n name,\n value: input.value,\n source: input.source,\n storageProvider: resolvedStorageProvider,\n locator,\n description: input.description,\n preview: input.preview ?? locator,\n tagList: input.tagList,\n });\n\n try {\n const { data, error } = await postTarget({\n name: draft.name,\n value: draft.value,\n category: draft.category,\n tagList: draft.tagList,\n details: draft.details,\n });\n if (error != null || data == null) {\n throw new Error(error?.message ?? \"createFeed: postTarget failed\");\n }\n logger.info(\"feed created\", {\n topic: \"register\",\n data: { id: data.id, source: input.source, name, locator },\n });\n return { id: data.id, created: true };\n } catch (error) {\n if (isCreateTargetAlreadyExistsError(error)) {\n const raced = await getPossibleTarget({\n filterList: feedLinkDedupFilters({ value: input.value, name }),\n });\n if (raced.data != null) {\n return { id: raced.data.id, created: false };\n }\n }\n throw error;\n }\n}\n","import { createHash } from \"node:crypto\";\n\n/** SHA-256 hex of image bytes (filename + `details.original.content` for paste-image ideas). */\nexport function hashIdeaPasteImage(buffer: Buffer): string {\n return createHash(\"sha256\").update(buffer).digest(\"hex\");\n}\n","import { IDEA_IMAGE_TEMP_DIR } from \"../idea.interface\";\n\n/** Path suffix on upload-service public URL for temp file download. */\nexport const IDEA_TEMP_DOWNLOAD_PATH_SUFFIX = \"/v0/upload/temp/download\";\n\n/** Flat path under temp sandbox: `idea/paste/{sha256}.{ext}`. */\nexport function buildIdeaPasteRelativePath(contentHash: string, ext: string): string {\n const hash = contentHash.trim();\n const extension = ext.trim().replace(/^\\./, \"\");\n if (hash === \"\" || extension === \"\") {\n throw new Error(\"buildIdeaPasteRelativePath: contentHash and ext are required\");\n }\n return `${IDEA_IMAGE_TEMP_DIR}/${hash}.${extension}`;\n}\n\nfunction normalizeRelativeSandboxPath(path: string): string | null {\n const normalized = path.replace(/\\\\/g, \"/\").trim();\n if (normalized === \"\" || normalized.startsWith(\"/\") || normalized.includes(\"..\")) {\n return null;\n }\n return normalized;\n}\n\n/** Build absolute locator stored in `details.original.url`. */\nexport function buildIdeaTempDownloadLocator(relativePath: string, publicBaseUrl: string): string {\n const sanitized = normalizeRelativeSandboxPath(relativePath);\n if (sanitized == null) {\n throw new Error(\"buildIdeaTempDownloadLocator: invalid relativePath\");\n }\n const base = publicBaseUrl.trim().replace(/\\/+$/, \"\");\n const url = new URL(`${base}${IDEA_TEMP_DOWNLOAD_PATH_SUFFIX}`);\n url.searchParams.set(\"path\", sanitized);\n return url.href;\n}\n\n/** Parse temp download URL → sandbox-relative path, or null when not a temp download URL. */\nexport function parseIdeaTempDownloadLocator(locator: string): string | null {\n const trimmed = locator.trim();\n if (trimmed === \"\") {\n return null;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(trimmed, \"http://localhost\");\n } catch {\n return null;\n }\n\n const pathname = parsed.pathname.replace(/\\\\/g, \"/\");\n if (!pathname.endsWith(IDEA_TEMP_DOWNLOAD_PATH_SUFFIX)) {\n return null;\n }\n\n const pathParam = parsed.searchParams.get(\"path\");\n if (pathParam == null || pathParam.trim() === \"\") {\n return null;\n }\n\n return normalizeRelativeSandboxPath(pathParam.trim());\n}\n","import { ensureLogSpoolFromEnv, getLogSpoolStats, logSpoolEnabledFromEnv, shutdownLogSpoolFromEnv } from \"./enable\";\nimport type { LogSpoolWriterStats } from \"./interface\";\n\nexport interface LogSpoolCoordinatorOptions {\n /** Logical service value (e.g. `watch-service`). */\n serviceValue: string;\n /** Instance id after registry claim — passed to child spawn env. */\n serviceId: string;\n}\n\n/** Service-bound facade for file log spool writer lifecycle. */\nexport interface LogSpoolCoordinator {\n isEnabled(): boolean;\n getServiceId(): string;\n /** Enable spool writer in this process. */\n registerProcess(process?: string): Promise<boolean>;\n getWriterStats(): LogSpoolWriterStats | null;\n shutdownLogSpool(): Promise<void>;\n}\n\nexport function createLogSpoolCoordinator(options: LogSpoolCoordinatorOptions): LogSpoolCoordinator {\n const { serviceValue, serviceId } = options;\n\n return {\n isEnabled() {\n return logSpoolEnabledFromEnv();\n },\n\n getServiceId() {\n return serviceId;\n },\n\n registerProcess(process?: string) {\n return ensureLogSpoolFromEnv({\n serviceValue,\n serviceId,\n processRole: process,\n });\n },\n\n getWriterStats() {\n if (!logSpoolEnabledFromEnv()) {\n return null;\n }\n return getLogSpoolStats();\n },\n\n async shutdownLogSpool() {\n if (!logSpoolEnabledFromEnv()) {\n return;\n }\n await shutdownLogSpoolFromEnv();\n },\n };\n}\n","import { logSpoolEnabledFromEnv } from \"../upload/env\";\nimport { ensureLogSpoolFromEnv, getLogSpoolStats, shutdownLogSpoolFromEnv } from \"./enable\";\nimport type { LogSpoolWriterStats } from \"./interface\";\n\n/** Whether file log spool is enabled (`LOG_PERSIST_ENABLED=true`). */\nexport function isLogSpoolEnabled(env: NodeJS.ProcessEnv = process.env): boolean {\n return logSpoolEnabledFromEnv(env);\n}\n\n/**\n * Guard / scheduler / worker (and extra roles) — enable writer from spawn env.\n * Main is enabled by `createServiceHost` after registry claim.\n */\nexport async function enableLogSpoolFromEnvInChild(): Promise<void> {\n if (!logSpoolEnabledFromEnv()) {\n return;\n }\n await ensureLogSpoolFromEnv();\n}\n\n/** Writer buffer stats when spool enabled; `null` when disabled. Typical use: main observability. */\nexport function getMainLogSpoolWriterStats(): LogSpoolWriterStats | null {\n if (!logSpoolEnabledFromEnv()) {\n return null;\n }\n return getLogSpoolStats();\n}\n\n/** Flush memory buffer and disable writer when spool enabled; no-op otherwise. */\nexport async function shutdownLogSpool(): Promise<void> {\n if (!logSpoolEnabledFromEnv()) {\n return;\n }\n await shutdownLogSpoolFromEnv();\n}\n","import { createHash } from \"node:crypto\";\nimport { createReadStream } from \"node:fs\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport { isAbsolute, resolve } from \"node:path\";\n\nimport { MEDIA_CONTENT_HASH_ALGORITHM, type MediaOriginal, type MediaValue } from \"../media.interface\";\nimport { guessMediaMime } from \"../media.mime\";\n\nexport interface CheckMediaAvailabilityInput {\n value: MediaValue;\n storageProvider: string;\n locator: string;\n /**\n * This host's storage id (e.g. from `LOCAL_STORAGE_PROVIDER`).\n * Local path checks only run when it equals `storageProvider`.\n */\n localStorageProvider: string;\n}\n\nexport interface MediaAvailabilityResult {\n ok: boolean;\n /** Absolute path when the locator was resolved on this host. */\n absolutePath?: string;\n reason?: string;\n}\n\nfunction sameStorageHost(storageProvider: string, localStorageProvider: string): boolean {\n return storageProvider.trim() === localStorageProvider.trim();\n}\n\nasync function sha256FileStreaming(absolutePath: string): Promise<string> {\n return await new Promise((resolveHash, reject) => {\n const hash = createHash(MEDIA_CONTENT_HASH_ALGORITHM);\n const stream = createReadStream(absolutePath);\n stream.on(\"data\", (chunk) => {\n hash.update(chunk);\n });\n stream.on(\"error\", reject);\n stream.on(\"end\", () => {\n resolveHash(hash.digest(\"hex\"));\n });\n });\n}\n\nasync function countFilesOneLevel(dirPath: string): Promise<number> {\n const entries = await readdir(dirPath, { withFileTypes: true });\n let count = 0;\n for (const entry of entries) {\n if (entry.isFile()) {\n count += 1;\n }\n }\n return count;\n}\n\n/**\n * Fast local reachability check for a media locator.\n *\n * - Requires `storageProvider === localStorageProvider` (cross-host → not ok).\n * - `locator` must be an absolute path.\n * - `image-list`: directory exists; only immediate children are considered.\n * - other values: path exists and is a non-empty file.\n *\n * **Node-only** — under `shared/media/node/`; do not import from the browser entry.\n */\nexport async function checkMediaAvailability(input: CheckMediaAvailabilityInput): Promise<MediaAvailabilityResult> {\n const storageProvider = input.storageProvider.trim();\n const localStorageProvider = input.localStorageProvider.trim();\n const locator = input.locator.trim();\n\n if (storageProvider === \"\" || localStorageProvider === \"\") {\n return { ok: false, reason: \"storageProvider and localStorageProvider are required\" };\n }\n if (locator === \"\") {\n return { ok: false, reason: \"locator is empty\" };\n }\n if (!sameStorageHost(storageProvider, localStorageProvider)) {\n return {\n ok: false,\n reason: `storageProvider not on this host (${storageProvider} !== ${localStorageProvider})`,\n };\n }\n if (!isAbsolute(locator)) {\n return { ok: false, reason: `locator must be an absolute path: ${locator}` };\n }\n\n const absolutePath = resolve(locator);\n\n try {\n const info = await stat(absolutePath);\n if (input.value === \"image-list\") {\n if (!info.isDirectory()) {\n return { ok: false, reason: `image-list locator is not a directory: ${absolutePath}` };\n }\n return { ok: true, absolutePath };\n }\n if (!info.isFile()) {\n return { ok: false, reason: `locator is not a file: ${absolutePath}` };\n }\n if (info.size <= 0) {\n return { ok: false, reason: `file is empty: ${absolutePath}` };\n }\n return { ok: true, absolutePath };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, reason: `locator not reachable: ${absolutePath} (${message})` };\n }\n}\n\n/**\n * Derive `contentHash` / `size` / `mimeType` for {@link MediaOriginal} after availability succeeds.\n *\n * **Node-only** — under `shared/media/node/`; do not import from the browser entry.\n */\nexport async function probeMediaOriginal(input: {\n value: MediaValue;\n storageProvider: string;\n locator: string;\n absolutePath: string;\n}): Promise<MediaOriginal> {\n const storageProvider = input.storageProvider.trim();\n const locator = input.locator.trim();\n\n if (input.value === \"image-list\") {\n const size = await countFilesOneLevel(input.absolutePath);\n return {\n storageProvider,\n locator,\n contentHash: \"\",\n size,\n mimeType: \"\",\n };\n }\n\n const info = await stat(input.absolutePath);\n const mimeType = guessMediaMime(input.absolutePath, input.value);\n if (mimeType == null) {\n throw new Error(`probeMediaOriginal: cannot guess mimeType for ${input.value}: ${input.absolutePath}`);\n }\n const contentHash = await sha256FileStreaming(input.absolutePath);\n return {\n storageProvider,\n locator,\n contentHash,\n size: info.size,\n mimeType,\n };\n}\n","import { getPossibleTarget, isCreateTargetAlreadyExistsError, postTarget, updateTarget } from \"../../../core.api\";\nimport { CategoryLink, type Link, type LinkDetails } from \"../../../link/link.interface\";\nimport { createLogger } from \"../../log/core/create-logger\";\nimport { isHttpUrl } from \"../../utils/fetch-url\";\nimport { buildMediaLinkDraft } from \"../media.build\";\nimport { isMediaValue, type MediaValue } from \"../media.interface\";\nimport { mediaLinkDedupFilters } from \"../media.query\";\nimport { checkMediaAvailability, probeMediaOriginal } from \"./media.access\";\n\nconst logger = createLogger({ module: \"media\" });\n\nexport interface FindMediaLinkInput {\n value: MediaValue;\n name: string;\n}\n\n/** Dedup lookup: same `category` + `value` + `name`. */\nexport async function findMediaLink(input: FindMediaLinkInput): Promise<Link | null> {\n if (!isMediaValue(input.value)) {\n throw new Error(`findMediaLink: unsupported media value: ${String(input.value)}`);\n }\n const name = input.name.trim();\n if (name === \"\") {\n throw new Error(\"findMediaLink: name is empty\");\n }\n const { data } = await getPossibleTarget({\n filterList: mediaLinkDedupFilters({ value: input.value, name }),\n });\n return data != null ? (data as Link) : null;\n}\n\nexport interface RegisterMediaLinkInput {\n value: MediaValue;\n name: string;\n storageProvider: string;\n locator: string;\n /** This host id for availability (e.g. `process.env.LOCAL_STORAGE_PROVIDER`). */\n localStorageProvider: string;\n /**\n * Local file to probe when `locator` is http(s) (OSS ingest).\n * Availability uses this path + `localStorageProvider`.\n */\n localLocator?: string;\n description?: string;\n tagList?: string[];\n}\n\nexport interface RegisterMediaLinkResult {\n id: string;\n created: boolean;\n}\n\nfunction mediaOriginalFromRow(row: { details?: unknown }): { storageProvider?: string; locator?: string } {\n const details = row.details as LinkDetails | undefined;\n const original = details?.original as { storageProvider?: string; locator?: string } | undefined;\n return original ?? {};\n}\n\nasync function patchMediaOriginal(\n existing: Link,\n storageProvider: string,\n locator: string,\n): Promise<RegisterMediaLinkResult> {\n const original = mediaOriginalFromRow(existing);\n if (original.storageProvider === storageProvider && original.locator === locator) {\n return { id: existing.id, created: false };\n }\n await updateTarget({\n id: existing.id,\n optimisticLockFilterList: [\n { field: \"category\", operator: \"eq\", value: CategoryLink.LINK },\n { field: \"value\", operator: \"eq\", value: existing.value },\n ],\n updateFn: (row) => {\n const details = row.details as LinkDetails;\n const prev = (details.original ?? {}) as Record<string, unknown>;\n return {\n details: {\n ...details,\n original: {\n ...prev,\n storageProvider,\n locator,\n },\n },\n };\n },\n });\n logger.info(\"media original patched\", {\n topic: \"register\",\n data: { id: existing.id, locator },\n });\n return { id: existing.id, created: false };\n}\n\n/**\n * Register a media Link: dedup → availability → probe → `postTarget`.\n * Idempotent when `category`+`value`+`name` already exist (local path).\n * HTTP `locator` + `localLocator`: probe local file, persist remote URL; patch if name exists.\n *\n * **Node-only** — under `shared/media/node/`; do not import from the browser entry.\n */\nexport async function registerMediaLink(input: RegisterMediaLinkInput): Promise<RegisterMediaLinkResult> {\n if (!isMediaValue(input.value)) {\n throw new Error(`registerMediaLink: unsupported media value: ${String(input.value)}`);\n }\n const name = input.name.trim();\n if (name === \"\") {\n throw new Error(\"registerMediaLink: name is empty\");\n }\n\n const storageProvider = input.storageProvider.trim();\n const locator = input.locator.trim();\n const localLocator = input.localLocator?.trim() ?? \"\";\n const httpLocator = isHttpUrl(locator);\n\n const existing = await findMediaLink({ value: input.value, name });\n if (existing != null && !httpLocator) {\n logger.info(\"media already registered\", {\n topic: \"dedup\",\n data: { id: existing.id, value: input.value, name },\n });\n return { id: existing.id, created: false };\n }\n if (existing != null && httpLocator) {\n return patchMediaOriginal(existing, storageProvider, locator);\n }\n\n const probeStorageProvider = httpLocator ? input.localStorageProvider.trim() : storageProvider;\n const probeLocator = httpLocator ? localLocator : locator;\n if (httpLocator && probeLocator === \"\") {\n throw new Error(\"registerMediaLink: localLocator is required when locator is http(s)\");\n }\n\n const availability = await checkMediaAvailability({\n value: input.value,\n storageProvider: probeStorageProvider,\n locator: probeLocator,\n localStorageProvider: input.localStorageProvider,\n });\n if (!availability.ok || availability.absolutePath == null) {\n throw new Error(`registerMediaLink: unavailable — ${availability.reason ?? \"unknown\"}`);\n }\n\n const probed = await probeMediaOriginal({\n value: input.value,\n storageProvider: probeStorageProvider,\n locator: probeLocator,\n absolutePath: availability.absolutePath,\n });\n\n const draft = buildMediaLinkDraft({\n value: input.value,\n name,\n storageProvider: httpLocator ? storageProvider : probed.storageProvider,\n locator: httpLocator ? locator : probed.locator,\n contentHash: probed.contentHash,\n size: probed.size,\n mimeType: probed.mimeType,\n description: input.description,\n tagList: input.tagList,\n });\n\n try {\n const { data, error } = await postTarget({\n name: draft.name,\n value: draft.value,\n category: draft.category,\n tagList: draft.tagList,\n details: draft.details,\n });\n if (error != null || data == null) {\n throw new Error(error?.message ?? \"registerMediaLink: postTarget failed\");\n }\n logger.info(\"media registered\", {\n topic: \"register\",\n data: { id: data.id, value: input.value, name, size: probed.size },\n });\n return { id: data.id, created: true };\n } catch (error) {\n if (isCreateTargetAlreadyExistsError(error)) {\n const raced = await findMediaLink({ value: input.value, name });\n if (raced != null) {\n if (httpLocator) {\n return patchMediaOriginal(raced, storageProvider, locator);\n }\n logger.info(\"media register race — using existing\", {\n topic: \"dedup\",\n data: { id: raced.id, value: input.value, name },\n });\n return { id: raced.id, created: false };\n }\n }\n throw error;\n }\n}\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 task-local-discovery 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, TaskExecutionContext, TaskFn } from \"./task-repo-context\";\n\nexport type {\n BootstrapLocalTasksResult,\n BootstrapLocalTasksStatus,\n ExecutableTaskFn,\n TaskExecutionContext,\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, ctx: TaskExecutionContext): ExecutableTaskFn {\n const run = async () => taskFn(taskParams, ctx);\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 taskId,\n taskName,\n taskTypeKey,\n traceId: details.traceId ?? taskId,\n });\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/base-node-runtime\";\nimport { NodeKind } from \"../node/node.interface\";\nimport { createLogger, createScope, type LoggerWithScope, withModule } from \"../shared/log\";\nimport { getErrorMessage, toError } from \"../shared/utils/error.utils\";\nimport { type PatchClaimTaskPayload, 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 /** Optional claim filters passed to {@link patchClaimTask} (e.g. name prefix per task type). */\n protected getPatchClaimTaskOptions(): Pick<PatchClaimTaskPayload, \"namePrefixList\"> {\n return {};\n }\n\n constructor() {\n super(\"taskNode\");\n }\n\n protected getNodeKind(): NodeKind {\n return NodeKind.TASK;\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 ...this.getPatchClaimTaskOptions(),\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 * Main loop tick interval (ms). Runners are evaluated each tick; effective runner\n * precision is bounded by this value. Default {@link TRIGGER_LOOP_INTERVAL_MS} (60s).\n */\n loopIntervalMs?: number;\n /**\n * Called after node logout, immediately before `process.exit`.\n * Typical use: {@link unregisterServiceAtShutdown} for single-process L3 services.\n */\n beforeProcessExit?: () => void | Promise<void>;\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/**\n * List all ENABLED triggers. Due-check is in-memory on the caller:\n * filter with `isTriggerDue`, then `patchTriggerFired` with `buildFireKey`\n * (both from `trigger.utils`, exported on `/node`).\n * Do not call this from TriggerNode (local interval runners only).\n */\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","import type { Trigger, TriggerDailySchedule } from \"./trigger.interface\";\n\ninterface UtcDateParts {\n year: number;\n month: number;\n day: number;\n hour: number;\n minute: number;\n}\n\nfunction parseUtcDateParts(now: Date): UtcDateParts {\n return {\n year: now.getUTCFullYear(),\n month: now.getUTCMonth() + 1,\n day: now.getUTCDate(),\n hour: now.getUTCHours(),\n minute: now.getUTCMinutes(),\n };\n}\n\nexport function buildDailyFireKey(_schedule: TriggerDailySchedule, now: Date): string {\n const { year, month, day } = parseUtcDateParts(now);\n const yyyy = String(year).padStart(4, \"0\");\n const mm = String(month).padStart(2, \"0\");\n const dd = String(day).padStart(2, \"0\");\n return `daily:${yyyy}-${mm}-${dd}`;\n}\n\nexport function isDailyScheduleDue(\n schedule: TriggerDailySchedule,\n now: Date,\n lastFireKey: string | null | undefined,\n): boolean {\n const parts = parseUtcDateParts(now);\n if (parts.hour !== schedule.hour || parts.minute !== schedule.minute) {\n return false;\n }\n const fireKey = buildDailyFireKey(schedule, now);\n return lastFireKey !== fireKey;\n}\n\nexport function isTriggerDue(trigger: Trigger, now: Date = new Date()): boolean {\n const { schedule, lastFireKey } = trigger.details;\n if (schedule.kind !== \"daily\") {\n throw new Error(`Unsupported trigger schedule kind: ${String((schedule as { kind?: string }).kind)}`);\n }\n return isDailyScheduleDue(schedule, now, lastFireKey);\n}\n\nexport function buildFireKey(trigger: Trigger, now: Date = new Date()): string {\n const { schedule } = trigger.details;\n if (schedule.kind !== \"daily\") {\n throw new Error(`Unsupported trigger schedule kind: ${String((schedule as { kind?: string }).kind)}`);\n }\n return buildDailyFireKey(schedule, now);\n}\n"],"names":["traceIdSchema","sleep","pathExists","logger","getRegisteredLocalTaskTypeKeys","sameStorageHost"],"mappings":"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"}
|