@h-ai/core 1.0.0-beta.18 → 1.0.0-beta.19

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/node.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/functions/core-function-access.node.ts","../src/functions/core-function-environment.node.ts","../src/functions/core-function-config.node.ts","../src/functions/core-function-logger.node.ts","../src/core-main.node.ts"],"names":["process","config","path","segment","parse","nodeParseEnv","result","Buffer","logger","existsSync","join"],"mappings":"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","file":"node.js","sourcesContent":["/**\n * @h-ai/core — Node 端可信地址解析与编译后的访问检查。\n * @module core-function-access.node\n */\nimport type { AccessCondition, AccessDecision, AccessFunctions, RequestAccessCheck, RequestAccessConfigInput, RequestAccessPolicy, RequestEncryptionMode, TrustedProxies } from '../core-types.js'\nimport { Buffer } from 'node:buffer'\nimport { closeSync, constants, fstatSync, openSync, readSync } from 'node:fs'\nimport { BlockList, isIP } from 'node:net'\nimport { networkInterfaces } from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { parse } from 'yaml'\nimport { AccessConditionSchema, RequestAccessConfigSchema, RequestAccessPolicySchema } from '../core-access-config.js'\n\nconst allowed: AccessDecision = Object.freeze({ allowed: true })\nconst invalidPath: AccessDecision = Object.freeze({ allowed: false, reason: 'path' })\nconst maximumPolicyBytes = 1024 * 1024\n\n/**\n * 规范化可信宿主给出的 IP;不接受端口、主机名或带区域的地址。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const ip = core.access.normalizeClientIp('::ffff:192.0.2.10')\n * ```\n */\nfunction normalizeClientIp(value?: string): string | undefined {\n if (!value)\n return undefined\n const address = value.trim()\n if (address.includes('%') || !isIP(address))\n return undefined\n return address.match(/^::ffff:(\\d+\\.\\d+\\.\\d+\\.\\d+)$/i)?.[1] ?? address\n}\n\nfunction addAddress(list: BlockList, entry: string): void {\n const [address, prefix, extra] = entry.split('/')\n const family = address ? isIP(address) : 0\n if (!family || address?.includes('%') || extra !== undefined)\n throw new Error('Expected an IP address or CIDR')\n const type = family === 4 ? 'ipv4' : 'ipv6'\n if (prefix === undefined) {\n list.addAddress(address!, type)\n return\n }\n const bits = Number(prefix)\n if (!/^\\d+$/.test(prefix) || bits < 0 || bits > (family === 4 ? 32 : 128))\n throw new Error('Invalid CIDR prefix')\n list.addSubnet(address!, bits, type)\n}\n\n/**\n * 启动编译可信代理;仅从可信对端接收 XFF,由右向左取首个非可信地址。\n * @param trustedProxies - 代理 IP/CIDR;auto 在受管私有 Compose 中编译本容器网段,其他宿主不信任转发头。\n * @returns 第二参数必须来自 socket/受信平台的解析函数;无效转发链返回 undefined。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const resolve = core.access.createClientIpResolver(['192.0.2.10'])\n * const ip = resolve(new Request('https://example.test', { headers: { 'x-forwarded-for': '198.51.100.2' } }), '192.0.2.10')\n * ```\n */\nfunction createClientIpResolver(trustedProxies: TrustedProxies | readonly string[] = 'auto'): (request: Request, remoteAddress?: string) => string | undefined {\n const entries = trustedProxies === 'auto'\n ? process.env.HAI_DEPLOY_PRIVATE_PROXY === '1'\n ? Object.values(networkInterfaces()).flatMap(interfaces => interfaces?.filter(value => !value.internal && value.cidr && !value.cidr.includes('%')).map(value => value.cidr!) ?? [])\n : []\n : trustedProxies\n if (trustedProxies === 'auto' && process.env.HAI_DEPLOY_PRIVATE_PROXY === '1' && !entries.length)\n throw new Error('Private proxy mode requires an isolated container network')\n const proxies = new BlockList()\n for (const entry of entries)\n addAddress(proxies, entry)\n const trusted = (address: string): boolean => proxies.check(address, isIP(address) === 4 ? 'ipv4' : 'ipv6')\n return (request, remoteAddress) => {\n const peer = normalizeClientIp(remoteAddress)\n if (!peer || !entries.length || !trusted(peer))\n return peer\n const forwarded = request.headers.get('x-forwarded-for')\n if (forwarded === null) {\n const realIp = request.headers.get('x-real-ip')\n return realIp === null ? peer : normalizeClientIp(realIp)\n }\n if (forwarded.length > 2048)\n return undefined\n const chain = forwarded.split(',')\n if (chain.length > 32)\n return undefined\n let current = peer\n for (let index = chain.length - 1; index >= 0 && trusted(current); index--) {\n const address = normalizeClientIp(chain[index])\n if (!address)\n return undefined\n current = address\n }\n return current\n }\n}\n\n/**\n * 时区转换后用于窗口比较的星期和分钟。\n * @example 模块内部上下文\n * ```ts\n * const minute: LocalMinute = { day: 1, time: '09:00' }\n * ```\n */\ninterface LocalMinute { day: number, time: string }\n\n/**\n * 按 UTC 分钟缓存转换结果的读取函数。\n * @example 模块内部上下文\n * ```ts\n * const read: TimeReader = timeReader('UTC')\n * const minute = read(Date.now())\n * ```\n */\ntype TimeReader = (now: number) => LocalMinute\n\nfunction timeReader(timezone: string): TimeReader {\n const formatter = new Intl.DateTimeFormat('en-US', { timeZone: timezone, weekday: 'short', hour: '2-digit', minute: '2-digit', hourCycle: 'h23' })\n const weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']\n let lastMinute = Number.NaN\n let local: LocalMinute\n return (now) => {\n const minute = Math.floor(now / 60_000)\n if (minute !== lastMinute) {\n const parts = Object.fromEntries(formatter.formatToParts(now).map(part => [part.type, part.value]))\n local = { day: weekdays.indexOf(parts.weekday!) + 1, time: `${parts.hour}:${parts.minute}` }\n lastMinute = minute\n }\n return local\n }\n}\n\nfunction compileCondition(condition: AccessCondition, readTime?: TimeReader, ruleId?: string): (ip?: string) => AccessDecision {\n const allow = new BlockList()\n const deny = new BlockList()\n for (const entry of condition.allowIps)\n addAddress(allow, entry)\n for (const entry of condition.denyIps)\n addAddress(deny, entry)\n const addressDenied: AccessDecision = Object.freeze({ allowed: false, reason: 'address', ruleId })\n const timeDenied: AccessDecision = Object.freeze({ allowed: false, reason: 'time', ruleId })\n const checksAddress = condition.allowIps.length > 0 || condition.denyIps.length > 0\n return (ip) => {\n if (checksAddress) {\n const address = normalizeClientIp(ip)\n if (!address)\n return addressDenied\n const family = isIP(address) === 4 ? 'ipv4' : 'ipv6'\n if (deny.check(address, family) || (condition.allowIps.length && !allow.check(address, family)))\n return addressDenied\n }\n if (readTime) {\n const { day, time } = readTime(Date.now())\n const previous = day === 1 ? 7 : day - 1\n if (!condition.windows.some(window => window.start < window.end\n ? window.days.includes(day) && time >= window.start && time < window.end\n : (window.days.includes(day) && time >= window.start) || (window.days.includes(previous) && time < window.end))) {\n return timeDenied\n }\n }\n return allowed\n }\n}\n\n/**\n * 编译单个 IP/时间条件,供登录与请求策略共用;请求期间不再解析 CIDR 或创建格式化器。\n * @example\n * ```ts\n * import { core, AccessConditionSchema } from '@h-ai/core'\n * const check = core.access.createConditionCheck(AccessConditionSchema.parse({ allowIps: ['192.0.2.0/24'] }))\n * const decision = check('192.0.2.10')\n * ```\n */\nfunction createConditionCheck(input: AccessCondition): (ip?: string) => AccessDecision {\n const condition = AccessConditionSchema.parse(input)\n return compileCondition(condition, condition.windows.length ? timeReader(condition.timezone) : undefined)\n}\n\n/**\n * 启动时读取并验证独立 YAML 策略,不在请求中访问文件;最大 1 MiB,拒绝 YAML 别名与未知字段。\n * @param input - false、内联策略或 { file },二者不能混用。\n * @param baseDirectory - 相对文件路径的基准目录,默认服务进程工作目录。\n * @returns 已验证策略或 false;读取/解析失败抛出不含策略正文的配置错误,宿主必须停止启动。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const policy = core.access.loadPolicy({ rules: [] })\n * ```\n */\nfunction loadPolicy(input: RequestAccessConfigInput = false, baseDirectory = process.cwd()): RequestAccessPolicy | false {\n const config = RequestAccessConfigSchema.parse(input)\n if (config === false || !('file' in config))\n return config\n let descriptor: number | undefined\n let content: string\n try {\n // 非阻塞打开保证 FIFO 等特殊文件能先被 fstat 拒绝,不在启动时等候写入者。\n descriptor = openSync(path.resolve(baseDirectory, config.file), constants.O_RDONLY | constants.O_NONBLOCK)\n const stat = fstatSync(descriptor)\n if (!stat.isFile() || stat.size > maximumPolicyBytes)\n throw new Error('Invalid policy file size or type')\n const bytes = Buffer.alloc(Math.min(stat.size + 1, maximumPolicyBytes + 1))\n let length = 0\n while (length < bytes.length) {\n const read = readSync(descriptor, bytes, length, bytes.length - length, null)\n if (!read)\n break\n length += read\n }\n if (length > maximumPolicyBytes || length !== stat.size)\n throw new Error('Policy file changed while reading')\n content = bytes.subarray(0, length).toString('utf8')\n }\n catch {\n throw new Error('Request access policy file could not be read; use a regular YAML file no larger than 1 MiB')\n }\n finally {\n if (descriptor !== undefined)\n closeSync(descriptor)\n }\n let parsed: unknown\n try {\n parsed = parse(content, { maxAliasCount: 0, uniqueKeys: true })\n }\n catch { throw new Error('Request access policy YAML is invalid; aliases and duplicate keys are not allowed') }\n const validated = RequestAccessPolicySchema.safeParse(parsed)\n if (!validated.success)\n throw new Error(`Request access policy is invalid at ${validated.error.issues.map(issue => issue.path.join('.') || 'root').join(', ')}`)\n return validated.data\n}\n\n/**\n * 已编译方法和访问条件,不在请求期解释配置。\n * @example 模块内部上下文\n * ```ts\n * const rule: CompiledRule = { methods: new Set(['POST']), check: () => allowed }\n * ```\n */\ninterface CompiledRule {\n methods: ReadonlySet<string>\n check: (ip?: string) => AccessDecision\n}\n/**\n * 按路径段索引的前缀节点,只访问命中的分支。\n * @example 模块内部上下文\n * ```ts\n * const node: PathNode = { children: new Map(), rules: [] }\n * ```\n */\ninterface PathNode {\n children: Map<string, PathNode>\n rules: CompiledRule[]\n encryption?: Map<string, RequestEncryptionMode>\n exactEncryption?: Map<string, RequestEncryptionMode>\n /** 仅在启动插入时用于检查子路径冲突,1 表示 required,2 表示 disabled。 */\n encryptionBelow?: Map<string, number>\n}\n\nfunction normalizeRequestPath(value: string): string | undefined {\n if (value.length > 8192)\n return undefined\n let decoded = value\n if (value.includes('%')) {\n if (/%(?:2f|5c|00)/i.test(value))\n return undefined\n try {\n decoded = decodeURIComponent(value)\n }\n catch { return undefined }\n }\n // eslint-disable-next-line no-control-regex -- 运行期拒绝控制字符及编码绕过,不能只校验配置端。\n if (!decoded.startsWith('/') || /[\\\\%?#\\u0000-\\u0020\\u007F]/.test(decoded) || decoded.includes('//'))\n return undefined\n if (/(?:^|\\/)\\.\\.?(?:\\/|$)/.test(decoded))\n return undefined\n return decoded.length > 1 && decoded.endsWith('/') ? decoded.slice(0, -1) : decoded\n}\n\n/**\n * 编译按路径索引的请求检查器;全局与所有匹配规则取交集,不进行全规则扫描。\n * @param input - 启动时已装配的访问策略;独立文件也只在此时读取一次。\n * @returns 输入为实际 URL pathname、HTTP 方法和可信 IP 的纯请求检查函数。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const check = core.access.createRequestCheck({ rules: [{ id: 'external', paths: ['/api/v1/external/**'], allowIps: ['192.0.2.0/24'] }] })\n * const decision = check('/api/v1/external/sync', 'POST', '192.0.2.10')\n * ```\n */\nfunction createRequestCheck(input: RequestAccessConfigInput = false): RequestAccessCheck {\n const policy = loadPolicy(input)\n if (policy === false)\n return Object.assign(() => allowed, { encryption: () => undefined, requiresEncryption: false })\n const clocks = new Map<string, TimeReader>()\n const compile = (condition: AccessCondition, id?: string) => {\n let readTime: TimeReader | undefined\n if (condition.windows.length) {\n readTime = clocks.get(condition.timezone) ?? timeReader(condition.timezone)\n clocks.set(condition.timezone, readTime)\n }\n return compileCondition(condition, readTime, id)\n }\n const globalCheck = policy.global ? compile(policy.global) : () => allowed\n const exact = new Map<string, CompiledRule[]>()\n const prefixes: PathNode = { children: new Map(), rules: [] }\n const allMethods = ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS', 'CONNECT', 'TRACE', '*']\n let requiresEncryption = false\n let hasEncryption = false\n for (const rule of policy.rules) {\n const compiled = { methods: new Set(rule.methods), check: compile(rule, rule.id) }\n for (const pattern of new Set(rule.paths)) {\n if (rule.encryption) {\n hasEncryption = true\n requiresEncryption ||= rule.encryption === 'required'\n const prefix = pattern.endsWith('/**')\n const nodes = [prefixes]\n let node = prefixes\n const path = normalizeRequestPath(prefix ? pattern.slice(0, -3) || '/' : pattern)!\n for (const segment of path.split('/').filter(Boolean)) {\n let child = node.children.get(segment)\n if (!child) {\n child = { children: new Map(), rules: [] }\n node.children.set(segment, child)\n }\n node = child\n nodes.push(node)\n }\n const bit = rule.encryption === 'required' ? 1 : 2\n const opposite = bit === 1 ? 2 : 1\n const methods = rule.methods.length ? rule.methods : allMethods\n for (const method of methods) {\n // 冲突与声明顺序无关;不以时间/IP 不同为由接受含糊的传输协议。\n if (nodes.some(parent => parent.encryption?.has(method) && parent.encryption.get(method) !== rule.encryption)\n || (prefix ? (node.encryptionBelow?.get(method) ?? 0) & opposite : node.exactEncryption?.has(method) && node.exactEncryption.get(method) !== rule.encryption)) {\n throw new Error(`Request access encryption conflicts at rule ${rule.id}`)\n }\n const modes = prefix ? node.encryption ??= new Map() : node.exactEncryption ??= new Map()\n modes.set(method, rule.encryption)\n for (const parent of nodes) {\n parent.encryptionBelow ??= new Map()\n parent.encryptionBelow.set(method, (parent.encryptionBelow.get(method) ?? 0) | bit)\n }\n }\n }\n if (pattern.endsWith('/**')) {\n let node = prefixes\n for (const segment of pattern.slice(0, -3).split('/').filter(Boolean)) {\n let child = node.children.get(segment)\n if (!child) {\n child = { children: new Map(), rules: [] }\n node.children.set(segment, child)\n }\n node = child\n }\n node.rules.push(compiled)\n }\n else {\n const path = normalizeRequestPath(pattern)!\n const rules = exact.get(path) ?? []\n rules.push(compiled)\n exact.set(path, rules)\n }\n }\n }\n const check = (pathname: string, method: string, ip?: string): AccessDecision => {\n const global = globalCheck(ip)\n if (!global.allowed)\n return global\n const path = normalizeRequestPath(pathname)\n if (!path)\n return invalidPath\n for (const rule of exact.get(path) ?? []) {\n if (!rule.methods.size || rule.methods.has(method)) {\n const decision = rule.check(ip)\n if (!decision.allowed)\n return decision\n }\n }\n let node: PathNode | undefined = prefixes\n for (const rule of node.rules) {\n if (!rule.methods.size || rule.methods.has(method)) {\n const decision = rule.check(ip)\n if (!decision.allowed)\n return decision\n }\n }\n if (node.children.size) {\n for (const segment of path.split('/').filter(Boolean)) {\n node = node.children.get(segment)\n if (!node)\n break\n for (const rule of node.rules) {\n if (!rule.methods.size || rule.methods.has(method)) {\n const decision = rule.check(ip)\n if (!decision.allowed)\n return decision\n }\n }\n }\n }\n return allowed\n }\n const encryption = (pathname: string, method: string): RequestEncryptionMode | undefined => {\n const path = normalizeRequestPath(pathname)\n if (!path)\n return undefined\n let node: PathNode | undefined = prefixes\n let mode = node.encryption?.get(method) ?? node.encryption?.get('*')\n for (const segment of path.split('/').filter(Boolean)) {\n node = node.children.get(segment)\n if (!node)\n return mode\n mode ??= node.encryption?.get(method) ?? node.encryption?.get('*')\n }\n return mode ?? node?.exactEncryption?.get(method) ?? node?.exactEncryption?.get('*')\n }\n return Object.assign(check, { encryption: hasEncryption ? encryption : () => undefined, requiresEncryption })\n}\n\n/**\n * Node 访问工具统一由 core-main 注册,不作为包级函数导出。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const decision = core.access.createRequestCheck(false)('/api/v1/example', 'GET')\n * ```\n */\nexport const access: AccessFunctions = { normalizeClientIp, createClientIpResolver, createConditionCheck, createRequestCheck, loadPolicy }\n","/** 通用环境配置:来源合并、结构覆盖与无损 dotenv 编解码,不依赖业务模块。 */\nimport type { ZodType } from 'zod'\nimport type { HaiResult } from '../core-types.js'\nimport process from 'node:process'\nimport { parseEnv as nodeParseEnv } from 'node:util'\nimport { parse } from 'yaml'\nimport { err, HaiConfigError, ok } from '../core-types.js'\nimport { i18n } from '../i18n/core-i18n-utils.js'\n\n/**\n * 仅供结构遍历的 JSON Schema 节点,不代替模块业务 Schema。\n * @example 模块内部上下文\n * ```ts\n * const shape: Shape = { type: 'object', properties: { name: { type: 'string' } } }\n * ```\n */\ntype Shape = Record<string, unknown>\n/**\n * 单个环境来源中的字面变量,undefined 表示未设置。\n * @example 模块内部上下文\n * ```ts\n * const values: Environment = { HAI_APP_NAME: 'Example' }\n * ```\n */\ntype Environment = Record<string, string | undefined>\n\n/** 只接受普通数据对象,路径写入不经过对象原型。 */\nfunction object(value: unknown): Shape | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Shape : undefined\n}\n\n/** camelCase 保持连写;实际字段名来自结构或 Schema,不从大写变量猜测。 */\nfunction segment(value: string): string {\n return value.replace(/[^a-z0-9]+/gi, '_').replace(/^_+|_+$/g, '').toUpperCase()\n}\n\n/** JSON Schema 的本地引用与联合分支只提供结构提示,最终仍由原始 Zod 校验。 */\nfunction shapes(node: Shape, root: Shape, value?: unknown, depth = 0): Shape[] {\n if (depth > 32)\n return []\n const result = [node]\n if (typeof node.$ref === 'string' && node.$ref.startsWith('#/')) {\n let target: unknown = root\n for (const key of node.$ref.slice(2).split('/').map(item => item.replaceAll('~1', '/').replaceAll('~0', '~')))\n target = object(target)?.[key]\n if (object(target))\n result.push(...shapes(object(target)!, root, value, depth + 1))\n }\n for (const keyword of ['anyOf', 'oneOf', 'allOf']) {\n if (!Array.isArray(node[keyword]))\n continue\n for (const item of node[keyword]) {\n const branch = object(item)\n if (!branch)\n continue\n const fields = object(branch.properties)\n const input = object(value)\n if (fields && input && Object.entries(fields).some(([key, field]) => input[key] !== undefined && object(field)?.const !== undefined && object(field)!.const !== input[key]))\n continue\n result.push(...shapes(branch, root, value, depth + 1))\n }\n }\n return result\n}\n\n/** 合并同一路径的结构提示,保持 Provider 的联合定义。 */\nfunction combined(nodes: unknown[]): Shape {\n const entries = nodes.map(object).filter((item): item is Shape => item !== undefined)\n return entries.length === 1 ? entries[0]! : { anyOf: entries }\n}\n\n/** 字符串字段保留前导零等字面内容,其余值沿用 YAML 类型还原。 */\nfunction scalar(text: string, node: Shape, root: Shape): unknown {\n const types = new Set(shapes(node, root).flatMap(item => Array.isArray(item.type) ? item.type : typeof item.type === 'string' ? [item.type] : []))\n if (types.has('string') && [...types].every(type => type === 'string' || type === 'null') && !(text === 'null' && types.has('null')))\n return text\n if (text === '')\n return ''\n try {\n return parse(text) ?? (text === 'null' ? null : text)\n }\n catch { return text }\n}\n\n/**\n * 从低到高合并来源;高来源父项删除旧结构细项,同来源始终先父后子。\n * @example 模块内部上下文\n * ```ts\n * const values = mergeEnv([{ HAI_APP_NAME: 'base' }, { HAI_APP_NAME: 'test' }])\n * ```\n */\nexport function mergeEnv(layers: readonly Environment[]): Record<string, string> {\n const values: Record<string, string> = {}\n for (const layer of layers) {\n for (const name of Object.keys(layer).sort((left, right) => left.length - right.length || left.localeCompare(right))) {\n if (layer[name] === undefined)\n continue\n if (name.startsWith('HAI_')) {\n for (const previous of Object.keys(values)) {\n // 该开关由 Serv 直接读取进程变量,不属于 HAI_SERV 配置对象。\n if (previous !== 'HAI_SERV_REFRESH_COOKIE_SECURE' && previous.startsWith(`${name}_`))\n delete values[previous]\n }\n }\n values[name] = layer[name]\n }\n }\n return values\n}\n\n/**\n * dotenv 使用 Node 字面规则;补齐生成器双引号的 JSON 转义,拒绝同文件重复键。\n * @example 模块内部上下文\n * ```ts\n * const values = parseEnvironment('HAI_APP_NAME=Example\\n')\n * ```\n */\nexport function parseEnvironment(text: string): Record<string, string> {\n const result = nodeParseEnv(text)\n const names = new Set<string>()\n const assignments = /^[ \\t]*(?:export[ \\t]+)?([A-Z_]\\w*)[ \\t]*=[ \\t]*('[^']*'|\"(?:[^\"\\\\]|\\\\.)*\"|`[^`]*`|[^\\r\\n]*)/gim\n for (const match of text.matchAll(assignments)) {\n const name = match[1]!\n if (names.has(name))\n throw new Error(`Duplicate environment variable: ${name}`)\n names.add(name)\n if (match[2]!.startsWith('\"') && (match[2]!.includes('\\\\\"') || match[2]!.includes('\\\\u0027'))) {\n try {\n result[name] = JSON.parse(match[2]!)\n }\n catch { /* 普通 dotenv 双引号仍按 Node 规则解析。 */ }\n }\n }\n return Object.fromEntries(Object.entries(result).filter((entry): entry is [string, string] => entry[1] !== undefined))\n}\n\n/**\n * 所有值均按字面量编码;排序让模块 JSON 位于其细项之前。\n * @example 模块内部上下文\n * ```ts\n * const text = stringifyEnv({ HAI_APP_NAME: 'Example' })\n * ```\n */\nexport function stringifyEnv(values: Record<string, string>, options: { target?: 'node' | 'compose' } = {}): string {\n return `${Object.keys(values).sort().map((name) => {\n if (!/^[A-Z_]\\w*$/i.test(name))\n throw new Error('Invalid environment variable name')\n const value = values[name]!\n let literal: string\n if (!value.includes('\\''))\n literal = `'${value}'`\n else if (options.target === 'compose')\n literal = JSON.stringify(value).replaceAll('$', () => '$$')\n else literal = JSON.stringify(value).replaceAll('\\'', '\\\\u0027')\n return `${name}=${literal}`\n }).join('\\n')}\\n`\n}\n\n/**\n * 在给定结构上解析环境变量;父对象提供基础值,具体路径继续覆盖。\n * @example 模块内部上下文\n * ```ts\n * const result = resolveEnvironment({ name: 'app', value: { name: 'Example' }, environment: { HAI_APP_NAME: 'Test' } })\n * ```\n */\nexport function resolveEnvironment(options: { name: string, value: unknown, environment?: Environment, schema?: ZodType, shape?: Readonly<Record<string, unknown>>, missing?: 'error' | 'empty' }, literal = false): HaiResult<unknown> {\n const environment = options.environment ?? process.env\n const missingNames = new Set<string>()\n let root: Shape\n try {\n root = options.schema ? options.schema.toJSONSchema({ io: 'input', unrepresentable: 'any' }) : options.shape ?? {}\n }\n catch { root = {} }\n const prefix = `HAI_${segment(options.name)}`\n function visit(original: unknown, name: string, node: Shape, inheritedLiteral: boolean, depth: number, declaration: unknown = original): unknown {\n if (depth > 32)\n throw new Error(name)\n let value = original\n let fromEnvironment = inheritedLiteral\n if (environment[name] !== undefined) {\n value = scalar(environment[name], node, root)\n fromEnvironment = true\n }\n // 先应用判别字段的细项,再选择联合分支,避免旧 Provider 隐藏新分支字段。\n const alternatives = shapes(node, root)\n const discriminators = new Map<string, unknown[]>()\n for (const candidate of alternatives) {\n for (const [key, field] of Object.entries(object(candidate.properties) ?? {})) {\n if (shapes(object(field) ?? {}, root).some(item => Object.hasOwn(item, 'const')))\n discriminators.set(key, [...discriminators.get(key) ?? [], field])\n }\n }\n const selection = { ...object(value) }\n for (const [key, fields] of discriminators) {\n const text = environment[`${name}_${segment(key)}`]\n if (text !== undefined)\n selection[key] = scalar(text, combined(fields), root)\n }\n const candidates = shapes(node, root, Object.keys(selection).length ? selection : value)\n const synthesized = value === undefined\n // 更细字段可替换粗粒度的 false/标量节点;来源合并已先清除低来源细项。\n const valueType: string = typeof value\n const primitiveOverride = value === undefined || candidates.some(candidate => (value !== null && candidate.type === valueType) || candidate.const === value || (value === null && candidate.type === 'null'))\n if (primitiveOverride && !object(value) && !Array.isArray(value)) {\n const declared = new Set([...Object.keys(object(declaration) ?? {}), ...candidates.flatMap(candidate => Object.keys(object(candidate.properties) ?? {}))])\n const specified = [...declared].filter(key => Object.keys(environment).some(candidate => environment[candidate] !== undefined && (candidate === `${name}_${segment(key)}` || candidate.startsWith(`${name}_${segment(key)}_`))))\n if (specified.length)\n value = Object.fromEntries(specified.map(key => [key, undefined]))\n }\n if (value === undefined && Object.keys(environment).some(key => environment[key] !== undefined && key.startsWith(`${name}_`))) {\n if (candidates.some(item => item.type === 'object' || object(item.properties)))\n value = {}\n }\n const indexed = Object.keys(environment).filter(key => environment[key] !== undefined && key.startsWith(`${name}_`) && /^\\d+(?:_|$)/.test(key.slice(name.length + 1)))\n if (value === undefined && indexed.length && candidates.some(candidate => candidate.type === 'array')) {\n const defaults = candidates.find(candidate => Array.isArray(candidate.default))?.default\n if (!Array.isArray(defaults))\n throw new Error(indexed[0])\n value = structuredClone(defaults)\n }\n if (Array.isArray(value)) {\n const itemShape = combined(candidates.map(item => item.items))\n for (const key of indexed) {\n const index = key.slice(name.length + 1).split('_')[0]!\n if (/^\\d+$/.test(index) && (String(Number(index)) !== index || Number(index) >= value.length))\n throw new Error(key)\n }\n return value.map((item, index) => visit(item, `${name}_${index}`, itemShape, fromEnvironment, depth + 1, Array.isArray(declaration) ? declaration[index] : undefined))\n }\n const input = object(value)\n if (input) {\n const properties = new Map<string, unknown[]>()\n for (const candidate of candidates) {\n for (const [key, field] of Object.entries(object(candidate.properties) ?? {}))\n properties.set(key, [...properties.get(key) ?? [], field])\n }\n const declaredKeys = new Set([...Object.keys(object(declaration) ?? {}), ...properties.keys()])\n const keys = new Set([...Object.keys(input), ...[...declaredKeys].filter(key => Object.keys(environment).some(nameInEnv => environment[nameInEnv] !== undefined && (nameInEnv === `${name}_${segment(key)}` || nameInEnv.startsWith(`${name}_${segment(key)}_`))))])\n const entries = [...keys].map((key) => {\n if (['__proto__', 'prototype', 'constructor'].includes(key))\n throw new Error(name)\n return [key, visit(input[key], `${name}_${segment(key)}`, combined(properties.get(key) ?? candidates.map(candidate => candidate.additionalProperties)), fromEnvironment, depth + 1, object(declaration)?.[key])]\n }).filter(([, child]) => child !== undefined)\n return synthesized && !entries.length ? undefined : Object.fromEntries(entries)\n }\n if (typeof value !== 'string' || fromEnvironment)\n return value\n const full = /^\\$\\{[^}:]+(?::[^}]*)?\\}$/.test(value)\n const resolved = value.replace(/\\$\\{([^}:]+)(?::([^}]*))?\\}/g, (_match, key: string, fallback?: string) => {\n if (environment[key] === undefined && fallback === undefined && options.missing !== 'empty') {\n missingNames.add(key)\n throw new Error(key)\n }\n return environment[key] ?? fallback ?? ''\n })\n return full ? scalar(resolved, node, root) : resolved\n }\n try {\n return ok(visit(options.value, prefix, root, literal, 0))\n }\n catch (failure) {\n const name = failure instanceof Error && /^[A-Z_]\\w*$/i.test(failure.message) ? failure.message : prefix\n if (!missingNames.has(name))\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'), { fields: [name] })\n return err(HaiConfigError.CONFIG_ENV_VAR_MISSING, i18n.coreM('core_configEnvVarMissing', { params: { varName: name } }))\n }\n}\n\n/**\n * 默认展开对象,数组与动态键字典保留 JSON;不做模块名称判断。\n * @example 模块内部上下文\n * ```ts\n * const values = toEnv({ prefix: 'HAI_APP', value: { name: 'Example', tags: ['demo'] } })\n * ```\n */\nexport function toEnv(options: { prefix: string, value: unknown, schema?: ZodType, shape?: Readonly<Record<string, unknown>> }): Record<string, string> {\n const result: Record<string, string> = {}\n const root: Shape = options.schema ? options.schema.toJSONSchema({ io: 'input', unrepresentable: 'any' }) : options.shape ?? {}\n function visit(value: unknown, name: string, node: Shape): void {\n if (!/^[A-Z][A-Z0-9_]*$/.test(name))\n throw new Error('Invalid environment variable name')\n if (value === undefined)\n return\n const input = object(value)\n const candidates = shapes(node, root, value)\n const properties = Object.assign({}, ...candidates.map(candidate => object(candidate.properties) ?? {})) as Shape\n const dynamic = candidates.some(candidate => candidate.additionalProperties === true || object(candidate.additionalProperties))\n if (input && Object.keys(input).length && !dynamic && Object.keys(input).every(key => /^[a-z][a-zA-Z0-9]*$/.test(key))) {\n for (const [key, item] of Object.entries(input))\n visit(item, `${name}_${segment(key)}`, object(properties[key]) ?? {})\n }\n else {\n result[name] = value === null || typeof value === 'object' ? JSON.stringify(value) : String(value)\n }\n }\n visit(options.value, options.prefix, root)\n return result\n}\n","import type { ZodType } from 'zod'\n/**\n * @h-ai/core — 配置管理(Node.js 专用)\n *\n * 提供 YAML 配置文件加载、约定式环境变量映射、显式环境变量插值、缓存管理。\n * @module core-function-config.node\n */\n\nimport type { HaiError, HaiResult, WatchCallback } from '../core-types.js'\n\nimport { existsSync, readFileSync, watch } from 'node:fs'\nimport { basename, dirname, join, resolve } from 'node:path'\nimport process from 'node:process'\nimport { parse } from 'yaml'\n\n// ─── 配置文件监听 ───\n\nimport { err, HaiConfigError, ok } from '../core-types.js'\nimport { i18n } from '../i18n/core-i18n-utils.js'\nimport { mergeEnv, parseEnvironment, resolveEnvironment, stringifyEnv, toEnv } from './core-function-environment.node.js'\n\n/**\n * 缓存项(存储已加载的配置及其元信息)\n * @example 模块内部上下文\n * ```ts\n * const entry: CacheEntry<{ enabled: boolean }> = { data: { enabled: true }, filePath: '/srv/app/config/app.yml', loadedAt: Date.now() }\n * const enabled = entry.data.enabled\n * ```\n */\ninterface CacheEntry<T = unknown> {\n /** 解析后的配置数据 */\n data: T\n /** 配置文件路径 */\n filePath: string\n /** Zod 校验 Schema(重载时复用,无 Schema 加载时为 undefined) */\n schema?: ZodType<T>\n /** 宿主提供的结构提示;模块仍自行执行完整业务校验。 */\n schemaHint?: ZodType\n /** 加载时间戳(毫秒) */\n loadedAt: number\n}\n\n// ─── 内部工具 ───\n\n// ─── 配置管理器 ───\n\n/** 配置缓存 */\nconst configCache = new Map<string, CacheEntry>()\n\n/**\n * 配置监听条目(包含文件 watcher 和回调集合)\n * @example 模块内部上下文\n * ```ts\n * const watcher = watch('/srv/app/config/app.yml', () => {})\n * const entry: WatchEntry = { watcher, callbacks: new Set(), debounceTimer: null }\n * entry.watcher.close()\n * ```\n */\ninterface WatchEntry {\n /** fs.watch 返回的 watcher 实例 */\n watcher: ReturnType<typeof watch>\n /** 已注册的回调函数集合 */\n callbacks: Set<WatchCallback<unknown>>\n /** 防抖定时器(用于 stopWatching 时清理) */\n debounceTimer: ReturnType<typeof setTimeout> | null\n}\n\n/** 配置监听映射 */\nconst watchEntries = new Map<string, WatchEntry>()\n\n/**\n * 创建未加载错误。\n *\n * @param name - 配置名称\n * @returns HaiError,错误码为 NOT_LOADED\n */\nfunction createNotLoadedError(name: string): HaiError {\n const result = err(HaiConfigError.CONFIG_NOT_LOADED, i18n.coreM('core_configNotLoaded', { params: { name } }))\n if (!result.success)\n return result.error\n\n throw new Error('unreachable')\n}\n\n/**\n * 通知监听回调。\n *\n * @param name - 配置名称\n * @param result - 重载结果(成功时传配置数据,失败时传错误)\n */\nfunction notifyWatchCallbacks(name: string, result: HaiResult<unknown>): void {\n const entry = watchEntries.get(name)\n if (!entry)\n return\n\n if (result.success) {\n for (const callback of entry.callbacks) {\n try {\n callback(result.data, undefined)\n }\n catch { /* 隔离单个回调异常,不影响其他回调 */ }\n }\n }\n else {\n for (const callback of entry.callbacks) {\n try {\n callback(null, result.error)\n }\n catch { /* 隔离单个回调异常,不影响其他回调 */ }\n }\n }\n}\n\n/**\n * 加载 YAML 配置文件(不带 Schema 验证)。\n *\n * 流程:检查文件存在 → 读取 YAML → 约定式环境变量映射与显式插值。\n *\n * @param name - 配置名称,用于生成 `HAI_<配置名>_<YAML 路径>` 环境变量名\n * @param filePath - YAML 文件路径\n * @returns 解析结果;可能的错误码:FILE_NOT_FOUND / PARSE_ERROR / ENV_VAR_MISSING\n */\nfunction loadYaml(name: string, filePath: string, schema?: ZodType): HaiResult<unknown> {\n if (!existsSync(filePath)) {\n return err(HaiConfigError.CONFIG_FILE_NOT_FOUND, i18n.coreM('core_configFileNotExist', { params: { filePath } }))\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n const parsed = parse(content)\n return resolveEnvironment({ name, value: parsed, schema })\n }\n catch (error) {\n return err(HaiConfigError.CONFIG_PARSE_ERROR, i18n.coreM('core_configParseFailed', { params: { filePath } }), error)\n }\n}\n\n/**\n * 加载并验证配置文件。\n *\n * 流程:加载 YAML → 环境变量映射与插值 → Zod Schema 校验。\n *\n * @param name - 配置名称\n * @param filePath - YAML 文件路径\n * @param schema - Zod 校验 Schema\n * @returns 校验后的配置数据;可能的错误码:FILE_NOT_FOUND / PARSE_ERROR / ENV_VAR_MISSING / VALIDATION_ERROR\n */\nfunction loadConfig<T>(\n name: string,\n filePath: string,\n schema: ZodType<T>,\n): HaiResult<T> {\n const yamlResult = loadYaml(name, filePath, schema)\n if (!yamlResult.success)\n return yamlResult\n\n const parseResult = schema.safeParse(yamlResult.data)\n if (!parseResult.success) {\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'), parseResult.error.issues)\n }\n\n return ok(parseResult.data)\n}\n\n/**\n * 加载配置并写入缓存。\n *\n * @param name - 配置名称(缓存 key)\n * @param filePath - YAML 文件路径\n * @param schema - 可选 Zod Schema(不传则跳过校验)\n * @returns 加载结果;成功时同时更新缓存\n */\nfunction loadAndCache<T>(\n name: string,\n filePath: string,\n schema?: ZodType<T>,\n): HaiResult<T> {\n const result = schema ? loadConfig(name, filePath, schema) : loadYaml(name, filePath) as HaiResult<T>\n if (result.success) {\n configCache.set(name, {\n data: result.data,\n filePath,\n schema: schema as ZodType<unknown> | undefined,\n loadedAt: Date.now(),\n })\n }\n return result\n}\n\n/**\n * 扫描时仅借助宿主 Schema 识别路径和类型,保留原有模块初始化校验边界。\n * @example 模块内部上下文\n * ```ts\n * const loaded = loadConfigStructure('app', '/srv/app/config/app.yml')\n * if (!loaded.success) loaded.error.message\n * ```\n */\nexport function loadConfigStructure(name: string, filePath: string, schemaHint?: ZodType): HaiResult<unknown> {\n const result = loadYaml(name, filePath, schemaHint)\n if (result.success)\n configCache.set(name, { data: result.data, filePath, schemaHint, loadedAt: Date.now() })\n return result\n}\n\n/**\n * 校验已加载的配置并写回缓存。\n *\n * 从缓存中取出原始数据重新用 Schema 校验,校验通过后更新缓存。\n *\n * @param name - 配置名称\n * @param schema - Zod Schema\n * @returns 校验结果;未加载时返回 NOT_LOADED,校验失败返回 VALIDATION_ERROR\n */\nfunction validateLoadedConfig<T>(name: string, schema: ZodType<T>): HaiResult<T> {\n const entry = configCache.get(name)\n if (!entry) {\n return err(createNotLoadedError(name))\n }\n\n const resolved = resolveEnvironment({ name, value: entry.data, schema }, true)\n if (!resolved.success)\n return resolved\n const parseResult = schema.safeParse(resolved.data)\n if (!parseResult.success) {\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'), parseResult.error.issues)\n }\n\n const validated = parseResult.data\n configCache.set(name, {\n ...entry,\n data: validated,\n schema,\n loadedAt: Date.now(),\n })\n\n return ok(validated)\n}\n\n/**\n * 重新加载配置并通知监听器。\n *\n * 从缓存中获取文件路径和 Schema,重新加载并触发所有 watch 回调。\n *\n * @param name - 配置名称\n * @returns 重载结果;未加载时返回 NOT_LOADED\n */\nfunction reloadAndNotify(name: string): HaiResult<unknown> {\n const entry = configCache.get(name)\n if (!entry) {\n const result = err(createNotLoadedError(name))\n notifyWatchCallbacks(name, result)\n return result\n }\n\n // 无 Schema 时直接加载 YAML(不做校验),避免 schema 为 undefined 导致运行时崩溃\n const result = entry.schema ? loadConfig(name, entry.filePath, entry.schema) : loadYaml(name, entry.filePath, entry.schemaHint)\n if (result.success) {\n configCache.set(name, {\n ...entry,\n data: result.data,\n loadedAt: Date.now(),\n })\n }\n notifyWatchCallbacks(name, result)\n return result\n}\n\n/**\n * 启动配置文件监听。\n *\n * 使用 `fs.watch` 监听父目录并筛选目标文件,支持原子替换及删除后重建。\n * 同一配置名只会创建一个 watcher,多次调用返回同一实例。\n *\n * @param name - 配置名称\n * @returns WatchEntry 实例;配置未加载时返回 null\n */\nfunction startFileWatcher(name: string): WatchEntry | null {\n const existing = watchEntries.get(name)\n if (existing)\n return existing\n\n const entry = configCache.get(name)\n if (!entry)\n return null\n\n try {\n const watchEntry: WatchEntry = {\n watcher: null!,\n callbacks: new Set(),\n debounceTimer: null,\n }\n\n const filePath = resolve(entry.filePath)\n const fileName = basename(filePath)\n // 监听目录避免绑定已被 rename 替换的旧文件;无文件名时保守地检查目标配置。\n const watcher = watch(dirname(filePath), (_eventType, changedName) => {\n if (changedName !== null && changedName.toString() !== fileName)\n return\n if (watchEntry.debounceTimer)\n clearTimeout(watchEntry.debounceTimer)\n watchEntry.debounceTimer = setTimeout(() => {\n watchEntry.debounceTimer = null\n if (watchEntries.get(name) === watchEntry)\n reloadAndNotify(name)\n }, 100)\n })\n\n watchEntry.watcher = watcher\n watchEntries.set(name, watchEntry)\n return watchEntry\n }\n catch {\n return null\n }\n}\n\n/**\n * 注册监听回调。\n *\n * 启动文件 watcher(若尚未启动)并注册回调。\n * 配置未加载时立即回调 NOT_LOADED 错误。\n *\n * @param name - 配置名称\n * @param callback - 变更回调\n * @returns 取消监听函数;调用后自动清理(无回调时关闭 watcher)\n */\nfunction registerWatch<T>(name: string, callback: WatchCallback<T>): () => void {\n const entry = startFileWatcher(name)\n if (!entry) {\n callback(null, createNotLoadedError(name))\n return () => { }\n }\n\n entry.callbacks.add(callback as WatchCallback<unknown>)\n\n return () => {\n const current = watchEntries.get(name)\n if (current !== entry)\n return\n\n current.callbacks.delete(callback as WatchCallback<unknown>)\n if (current.callbacks.size === 0) {\n if (current.debounceTimer)\n clearTimeout(current.debounceTimer)\n current.watcher.close()\n watchEntries.delete(name)\n }\n }\n}\n\n/**\n * 停止监听(内部实现)。\n *\n * @param name - 配置名称;不传则停止所有监听并清空映射\n */\nfunction stopWatching(name?: string): void {\n if (name) {\n const entry = watchEntries.get(name)\n if (entry) {\n if (entry.debounceTimer)\n clearTimeout(entry.debounceTimer)\n entry.watcher.close()\n watchEntries.delete(name)\n }\n }\n else {\n for (const entry of watchEntries.values()) {\n if (entry.debounceTimer)\n clearTimeout(entry.debounceTimer)\n entry.watcher.close()\n }\n watchEntries.clear()\n }\n}\n\n/**\n * 清理缓存(同时停止对应监听)。\n *\n * @param name - 配置名称;不传则清理全部缓存并停止所有监听\n */\nfunction clearCache(name?: string): void {\n if (name) {\n configCache.delete(name)\n stopWatching(name)\n }\n else {\n configCache.clear()\n stopWatching()\n }\n}\n\n/**\n * 配置管理对象。\n * @example 模块内部上下文\n * ```ts\n * const result = config.load('app', '/srv/app/config/app.yml')\n * if (!result.success) result.error.message\n * ```\n */\nexport const config = {\n /**\n * 合并从低到高的环境来源;高来源父项替换旧节点,同来源细项覆盖父 JSON。\n * @param layers - 按优先级排列的字面变量。\n * @returns 合并后的变量,可能含秘密。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const value = core.config.mergeEnv([{ HAI_APP_NAME: 'base' }, { HAI_APP_NAME: 'test' }])\n * ```\n */\n mergeEnv,\n /**\n * 解析 dotenv 字面文本,拒绝重复键,不执行 shell 或变量展开。\n * @param text - dotenv 文本,可能包含秘密。\n * @returns 字面变量;重复键抛出不含变量值的错误。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const value = core.config.parseEnv('HAI_APP_NAME=Example\\n')\n * ```\n */\n parseEnv: parseEnvironment,\n /**\n * 无损编码 dotenv,父变量排在细项前;含秘密时只能写入受保护文件。\n * @param values - 字面变量,不进行脱敏。\n * @param options - 输出语法目标,默认 Node dotenv。\n * @param options.target - Compose 目标同时处理其美元符号插值规则。\n * @returns dotenv 文本;非法变量名抛错。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const value = core.config.stringifyEnv({ HAI_APP_NAME: 'Example' })\n * ```\n */\n stringifyEnv,\n /**\n * 按已有结构或 Schema 解析父 JSON 和细项,不修改缓存或进程环境。\n * @param options - 配置名、原始结构、变量、可选 Schema 和缺失插值规则。\n * @returns 解析结果;调用方仍须执行最终 Schema 校验。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const value = core.config.resolve({ name: 'app', value: { name: 'Example' }, environment: { HAI_APP_NAME: 'Test' } })\n * ```\n */\n resolve: (options: Parameters<typeof resolveEnvironment>[0]) => resolveEnvironment(options),\n /**\n * 默认将对象展开为细项;数组、动态字典和空对象保留 JSON。\n * @param options - 完整变量前缀、配置值和可选 Schema。\n * @returns 字面环境变量,不脱敏;非法名称抛错。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const value = core.config.toEnv({ prefix: 'HAI_APP', value: { name: 'Example', tags: ['demo'] } })\n * ```\n */\n toEnv,\n /**\n * 读取 dotenv 文件并按统一顺序合并,不修改进程环境。\n *\n * 优先级:已有进程环境 > .env.<mode>.local > .env.local > .env.<mode> > .env。\n * development/production 分别映射到 dev/prod;不存在的文件跳过。\n * 返回值可能包含私有配置,仅在 Node 启动/构建边界注入,不下发浏览器。\n * @param options - 文件所在目录及环境模式\n * @param options.mode - dev/test/prod 或 Vite 的 development/production\n * @param options.envDir - dotenv 所在目录,默认进程工作目录\n * @returns 已合并的变量;非法模式或读取失败返回配置错误,不包含文件内容\n * @example\n * ```ts\n * const env = core.config.loadEnvFiles({ mode: 'dev', envDir: '.' })\n * if (!env.success) throw new Error(env.error.message)\n * Object.assign(process.env, env.data)\n * core.init({ configDir: './config' })\n * ```\n */\n loadEnvFiles(options: { mode: string, envDir?: string }): HaiResult<Record<string, string>> {\n const mode = options.mode === 'development' ? 'dev' : options.mode === 'production' ? 'prod' : options.mode\n if (!/^[a-z0-9][\\w-]*$/i.test(mode))\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'))\n const envDir = options.envDir ?? process.cwd()\n try {\n const layers: Array<Record<string, string | undefined>> = []\n for (const name of ['.env', `.env.${mode}`, '.env.local', `.env.${mode}.local`]) {\n const file = join(envDir, name)\n if (existsSync(file))\n layers.push(parseEnvironment(readFileSync(file, 'utf8')))\n }\n const declared = new Set(layers.flatMap(layer => Object.keys(layer)))\n layers.push(Object.fromEntries(Object.entries(process.env).filter(([name]) => declared.has(name) || name.startsWith('HAI_'))))\n const merged = mergeEnv(layers)\n return ok(merged)\n }\n catch {\n // dotenv 解析异常可能携带原始行,错误边界不暴露文件内容。\n return err(HaiConfigError.CONFIG_PARSE_ERROR, i18n.coreM('core_configParseFailed', { params: { filePath: envDir } }))\n }\n },\n\n /**\n * 加载配置到缓存。\n *\n * 加载 YAML 文件并可选地用 Zod Schema 校验,成功后写入缓存。\n *\n * @param name - 配置名称(缓存 key)\n * @param filePath - YAML 文件路径\n * @param schema - 可选 Zod Schema(不传则跳过校验)\n * @returns 成功时返回解析后的配置数据;失败时返回 HaiError\n *\n * @example\n * ```ts\n * const result = config.load('core', './config/_core.yml', CoreConfigSchema)\n * if (result.success) {\n * // result.data 为校验后的配置\n * }\n * ```\n */\n load<T>(name: string, filePath: string, schema?: ZodType<T>): HaiResult<T> {\n return loadAndCache(name, filePath, schema)\n },\n\n /**\n * 验证已加载的配置数据。\n *\n * 对缓存中的配置数据重新用 Schema 校验,校验通过后更新缓存。\n *\n * @param name - 配置名称\n * @param schema - Zod 验证模式\n * @returns 校验结果;未加载时返回 NOT_LOADED,格式错误返回 VALIDATION_ERROR\n *\n * @example\n * ```ts\n * const result = config.validate('app', AppSchema)\n * if (!result.success) {\n * // result.error.code 可能为 NOT_LOADED 或 VALIDATION_ERROR\n * }\n * ```\n */\n validate<T>(name: string, schema: ZodType<T>): HaiResult<T> {\n return validateLoadedConfig(name, schema)\n },\n\n /**\n * 获取已加载的配置。\n *\n * @param name - 配置名称\n * @returns 配置数据;未加载时返回 undefined\n *\n * @example\n * ```ts\n * const cfg = config.get<CoreConfig>('core')\n * if (cfg) {\n * // 使用 cfg\n * }\n * ```\n */\n get<T>(name: string): T | undefined {\n return configCache.get(name)?.data as T | undefined\n },\n\n /**\n * 获取配置,不存在时抛出错误。\n *\n * @param name - 配置名称\n * @returns 配置数据\n * @throws 配置未加载时抛出 Error\n *\n * @example\n * ```ts\n * try {\n * const cfg = config.getOrThrow<CoreConfig>('core')\n * } catch (e) {\n * // 配置未加载\n * }\n * ```\n */\n getOrThrow<T>(name: string): T {\n const data = this.get<T>(name)\n if (data === undefined) {\n throw new Error(i18n.coreM('core_configNotLoaded', { params: { name } }))\n }\n return data\n },\n\n /**\n * 重新加载配置。\n *\n * 从磁盘重新读取配置文件并更新缓存,同时通知所有 watch 回调。\n *\n * @param name - 配置名称\n * @returns 重载结果;未加载时返回 NOT_LOADED\n *\n * @example\n * ```ts\n * const result = config.reload('app')\n * ```\n */\n reload(name: string): HaiResult<unknown> {\n return reloadAndNotify(name)\n },\n\n /**\n * 检查配置是否已加载。\n *\n * @param name - 配置名称\n * @returns 是否已加载到缓存\n *\n * @example\n * ```ts\n * if (config.has('db')) {\n * const dbCfg = config.get('db')\n * }\n * ```\n */\n has(name: string): boolean {\n return configCache.has(name)\n },\n\n /**\n * 清除配置缓存(同时停止对应监听)。\n *\n * @param name - 配置名称;不传则清除全部\n *\n * @example\n * ```ts\n * config.clear('app') // 清除单个\n * config.clear() // 清除全部\n * ```\n */\n clear(name?: string): void {\n clearCache(name)\n },\n\n /**\n * 获取所有已加载的配置名称。\n *\n * @returns 配置名称数组\n *\n * @example\n * ```ts\n * const names = config.keys() // ['core', 'db', 'app']\n * ```\n */\n keys(): string[] {\n return Array.from(configCache.keys())\n },\n\n /**\n * 监听配置文件变更并自动重载。\n *\n * 普通写入、原子替换及删除重建均触发重载;失败保留最近成功的缓存并通知错误。\n * 配置未加载时立即回调 NOT_LOADED 错误。\n *\n * @param name - 配置名称\n * @param callback - 配置变更回调,接收新配置或错误\n * @returns 取消监听函数\n *\n * @example\n * ```ts\n * const unwatch = config.watch('app', (cfg, error) => {\n * if (error) { core.logger.error('reload failed', { error }); return }\n * core.logger.info('config updated', { cfg })\n * })\n * // 取消监听\n * unwatch()\n * ```\n */\n watch<T = unknown>(name: string, callback: WatchCallback<T>): () => void {\n return registerWatch(name, callback)\n },\n\n /**\n * 停止配置文件监听。\n *\n * @param name - 配置名称;不传则停止所有监听\n *\n * @example\n * ```ts\n * config.unwatch('app') // 停止单个\n * config.unwatch() // 停止全部\n * ```\n */\n unwatch(name?: string): void {\n stopWatching(name)\n },\n\n /**\n * 检查是否正在监听某个配置。\n *\n * @param name - 配置名称\n * @returns 是否有活跃的 watcher\n *\n * @example\n * ```ts\n * if (config.isWatching('app')) {\n * config.unwatch('app')\n * }\n * ```\n */\n isWatching(name: string): boolean {\n return watchEntries.has(name)\n },\n}\n","/**\n * @h-ai/core — Logger(Node.js 版本,基于 pino)\n *\n * 提供统一的日志接口,Node.js 环境使用 pino 实现。\n * @module core-function-logger.node\n */\n\nimport type { LogContext, LogFormat, Logger, LoggerFunctions, LoggerOptions, LoggingConfig, LogLevel } from '../core-types.js'\n\nimport { execSync } from 'node:child_process'\nimport { createRequire } from 'node:module'\nimport process from 'node:process'\nimport pino from 'pino'\nimport { sanitize } from '../utils/core-util-sanitize.js'\nimport { requestContext } from './core-function-context.js'\nimport { emitLogRecord, sanitizeLogFields } from './core-function-log-observer.js'\n\n// ESM 场景下通过 createRequire 复用 CommonJS 的 resolve 能力,用来探测可选依赖是否存在。\nconst nodeRequire = createRequire(import.meta.url)\n\nif (process.platform === 'win32' && process.stdout.isTTY) {\n try {\n // 强制切换控制台代码页为 UTF-8(避免 GBK/GB2312 导致的乱码)\n execSync('chcp 65001 > nul', { stdio: 'ignore' })\n\n // 设置 stdout/stderr 编码为 UTF-8\n if (process.stdout.setDefaultEncoding) {\n process.stdout.setDefaultEncoding('utf8')\n }\n if (process.stderr.setDefaultEncoding) {\n process.stderr.setDefaultEncoding('utf8')\n }\n\n // 仅调整当前终端,不改写调用方语言或子进程编码环境。\n }\n // eslint-disable-next-line unused-imports/no-unused-vars\n catch (_e) {\n // 忽略错误,某些环境可能不支持\n }\n}\n\n// ─── 全局配置 ───\n\n/** 全局日志级别(默认 'info') */\nlet globalLevel: LogLevel = 'info'\n\n/** 全局日志格式(默认 'pretty',适合开发环境) */\nlet globalFormat: LogFormat = 'pretty'\n\n/** 全局默认上下文(每条日志自动附带) */\nlet globalContext: Record<string, unknown> = {}\n\n/** 全局脱敏字段路径列表(如 ['password', 'token']) */\nlet globalRedact: string[] = []\n\n/** 格式和脱敏规则变化时,已有 Logger 在下次输出时更新底层实例。 */\nlet outputRevision = 0\n\n/** 默认 Logger 单例缓存 */\nlet defaultLogger: Logger | null = null\n\n/**\n * 配置全局 Logger 选项。\n *\n * @param config - 日志配置\n *\n * @example\n * ```ts\n * logger.configureLogger({ level: 'debug' })\n * ```\n */\nfunction configureLogger(config: Partial<LoggingConfig>): void {\n if (config.level)\n globalLevel = config.level\n if (config.format) {\n globalFormat = config.format\n outputRevision++\n }\n if (config.context)\n globalContext = { ...globalContext, ...config.context }\n if (config.redact) {\n globalRedact = [...config.redact]\n outputRevision++\n }\n}\n\n/**\n * 设置全局日志级别。\n *\n * @param level - 日志级别\n *\n * @example\n * ```ts\n * logger.setLogLevel('warn')\n * ```\n */\nfunction setLogLevel(level: LogLevel): void {\n globalLevel = level\n}\n\n/**\n * 获取当前全局日志级别。\n *\n * @example\n * ```ts\n * const level = logger.getLogLevel()\n * ```\n */\nfunction getLogLevel(): LogLevel {\n return globalLevel\n}\n\nfunction sanitizeLogContext(ctx?: LogContext): LogContext | undefined {\n if (!ctx || Object.keys(ctx).length === 0) {\n return ctx\n }\n\n return sanitizeLogFields(ctx, globalRedact)\n}\n\n// ─── Logger 实现 ───\n\n/**\n * 包装 pino 实例为统一 Logger 接口。\n *\n * 将 pino 的原生方法映射为 Logger 接口,自动合并上下文。\n *\n * @param resolvePino - 当前配置对应的 pino 实例\n * @param resolveContext - 当前基础上下文(会与每次调用时的 ctx 合并)\n * @returns 统一 Logger 实例\n */\nfunction wrapPino(resolvePino: () => pino.Logger, resolveContext: () => Record<string, unknown>): Logger {\n const write = (level: LogLevel, message: string, ctx?: LogContext): void => {\n const output = resolvePino()\n if (!output.isLevelEnabled(level))\n return\n const context = sanitizeLogContext({ ...resolveContext(), ...ctx, ...requestContext.get() }) ?? {}\n message = sanitize.sanitizeText(message)\n output[level](context, message)\n if (!requestContext.get().suppressLogObservers)\n emitLogRecord({ timestamp: Date.now(), level, message, context })\n }\n return {\n trace(message: string, ctx?: LogContext) {\n write('trace', message, ctx)\n },\n debug(message: string, ctx?: LogContext) {\n write('debug', message, ctx)\n },\n info(message: string, ctx?: LogContext) {\n write('info', message, ctx)\n },\n warn(message: string, ctx?: LogContext) {\n write('warn', message, ctx)\n },\n error(message: string, ctx?: LogContext) {\n write('error', message, ctx)\n },\n fatal(message: string, ctx?: LogContext) {\n write('fatal', message, ctx)\n },\n child(childContext: Record<string, unknown>): Logger {\n // 只保存本地上下文,输出时继承父级的当前配置;不绑定旧 pino child。\n return wrapPino(resolvePino, () => ({ ...resolveContext(), ...childContext }))\n },\n }\n}\n\n/**\n * 创建 Logger 实例。\n *\n * @param options - Logger 选项\n * @returns Logger 实例\n *\n * @example\n * ```ts\n * const appLogger = logger.createLogger({ name: 'api', level: 'info' })\n * appLogger.info('ready')\n * ```\n */\nfunction createLogger(options: LoggerOptions = {}): Logger {\n const localOptions = { ...options, context: { ...options.context } }\n let revision = outputRevision\n let output = createPinoOutput(localOptions)\n const resolvePino = (): pino.Logger => {\n if (revision !== outputRevision) {\n const updated = createPinoOutput(localOptions)\n output.close()\n output = updated\n revision = outputRevision\n }\n const level = localOptions.level ?? globalLevel\n if (output.instance.level !== level)\n output.instance.level = level\n return output.instance\n }\n return wrapPino(resolvePino, () => ({ ...globalContext, ...localOptions.context }))\n}\n\n/** 底层输出只负责格式和脱敏;已有包装在输出时应用当前全局配置。 */\nfunction createPinoOutput(options: LoggerOptions): { instance: pino.Logger, close: () => void } {\n const level = options.level ?? globalLevel\n const format = options.format ?? globalFormat\n\n // 先构造一份与输出介质无关的基础配置,后面再按 transport 能力决定是否启用 pretty。\n const pinoOptions: pino.LoggerOptions = {\n level,\n name: options.name,\n formatters: {\n level: label => ({ level: label }),\n },\n }\n\n // redact 支持\n if (globalRedact.length > 0) {\n pinoOptions.redact = {\n paths: globalRedact,\n censor: '[REDACTED]',\n }\n }\n\n let pinoInstance: pino.Logger\n let transport: ReturnType<typeof pino.transport> | undefined\n\n if (format === 'pretty' && isPrettyTransportAvailable()) {\n // 只有在 pino-pretty 可解析时才挂载 transport,避免可选依赖缺失直接导致 logger 初始化失败。\n try {\n transport = pino.transport({\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'pid,hostname',\n },\n })\n pinoInstance = pino(pinoOptions, transport)\n // 日志 worker 不拥有应用生命周期;启动失败时仍由 pino 的退出钩子同步排空日志。\n // pino 的 ThreadStream 声明未包含运行时 unref,使用能力检查兼容该声明。\n if ('unref' in transport && typeof transport.unref === 'function')\n transport.unref()\n }\n catch (error) {\n // 其他初始化异常应重新抛出,便于排查\n if (isPrettyTransportUnavailable(error)) {\n pinoInstance = pino(pinoOptions)\n }\n else {\n throw error\n }\n }\n }\n else {\n pinoInstance = pino(pinoOptions)\n }\n\n return { instance: pinoInstance, close: () => transport?.end() }\n}\n\nfunction isPrettyTransportAvailable(): boolean {\n try {\n // pino-pretty 是可选依赖,这里用 resolve 做能力探测,避免在缺失场景下直接 import 失败。\n nodeRequire.resolve('pino-pretty')\n return true\n }\n catch {\n return false\n }\n}\n\nfunction isPrettyTransportUnavailable(error: unknown): boolean {\n const message\n = error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : ''\n\n const normalized = message.toLowerCase()\n\n return normalized.includes('pino-pretty')\n && (normalized.includes('cannot find module')\n || normalized.includes('unable to determine transport target')\n || normalized.includes('cannot load')\n || normalized.includes('not found'))\n}\n\n// ─── 默认 Logger 实例 ───\n\n/**\n * 获取默认 Logger 实例(单例)。\n *\n * @example\n * ```ts\n * const defaultLogger = logger.getLogger()\n * ```\n */\nfunction getLogger(): Logger {\n if (!defaultLogger) {\n defaultLogger = createLogger()\n }\n return defaultLogger\n}\n\n// ─── 对外出口 ───\n\n/**\n * Node.js Logger 函数集合。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const logger = core.logger.create({ name: 'orders' })\n * logger.info('Order created', { orderId: 'order-1' })\n * ```\n */\nexport const logger: LoggerFunctions = {\n configureLogger,\n setLogLevel,\n getLogLevel,\n createLogger,\n getLogger,\n}\n","/**\n * @h-ai/core — Core 服务聚合(Node.js)\n *\n * 提供 Node.js 环境的 core 对象,聚合常用功能。 所有功能统一通过 core 对象访问,并提供配置加载能力。\n * @module core-main.node\n */\n\nimport type { CoreOptions, NodeCoreFunctions } from './core-types.js'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { Buffer } from 'node:buffer'\nimport { timingSafeEqual } from 'node:crypto'\nimport { existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { CoreConfigSchema } from './core-config.js'\nimport { createCore } from './core-main.js'\nimport { access } from './functions/core-function-access.node.js'\nimport { config, loadConfigStructure } from './functions/core-function-config.node.js'\nimport { installRequestContext } from './functions/core-function-context.js'\nimport { logger } from './functions/core-function-logger.node.js'\nimport { installRequestLocales } from './i18n/core-i18n-utils.js'\n\n// 请求语言跨 await 保持隔离,避免并行 SSR 修改另一个请求的默认语言。\ninstallRequestLocales(new AsyncLocalStorage())\ninstallRequestContext(new AsyncLocalStorage())\n\nconst YAML_EXTENSION_REGEX = /\\.ya?ml$/\n// ─── Core 实例 ───\n\n/**\n * 创建 Node.js 版本的 core 对象。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.logger.info('ready')\n * ```\n */\nfunction createNodeCore(): NodeCoreFunctions {\n const baseCore = createCore({\n createLogger: logger.createLogger,\n getLogger: logger.getLogger,\n configureLogger: logger.configureLogger,\n setLogLevel: logger.setLogLevel,\n getLogLevel: logger.getLogLevel,\n })\n\n // 扩展 config 和 init 功能\n return {\n ...baseCore,\n /** Node 专属的可信地址、策略文件读取与已编译访问检查。 */\n access,\n string: {\n ...baseCore.string,\n /**\n * Node 凭证比较使用原生恒时原语;不同长度直接失败,长度本身不受保护。\n * UTF-16LE 保留孤立代理项,避免 UTF-8 替换字符把两个不同字符串误判为相等。\n * @param a - 第一个原始字符串,不做 Unicode 归一化。\n * @param b - 第二个原始字符串,不做 Unicode 归一化。\n * @returns 字符串的 UTF-16 单元是否完全一致。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const matches = core.string.constantTimeEqual('example-only', 'example-only')\n * ```\n */\n constantTimeEqual(a: string, b: string): boolean {\n return a.length === b.length && timingSafeEqual(Buffer.from(a, 'utf16le'), Buffer.from(b, 'utf16le'))\n },\n },\n /** Zod 校验错误 → i18n 消息映射工具(kit / serv / api-client 共享)。 */\n zodValidation: baseCore.zodValidation,\n /** 配置管理 */\n config,\n /** 初始化 Core */\n init: initCore,\n }\n}\n\n/**\n * Core 服务对象 - 聚合常用功能(Node.js)。\n * @example\n * ```ts\n * import { core, CoreConfigSchema } from '@h-ai/core'\n * core.init({ configDir: './config' }) // 单项加载失败记录日志并继续。\n * const required = core.config.validate('core', CoreConfigSchema)\n * if (!required.success) core.logger.error('Required config unavailable', { error: required.error })\n * else core.logger.info('Application ready', { name: required.data.name })\n * ```\n */\nexport const core: NodeCoreFunctions = createNodeCore()\n\n// ─── Initialization ───\n\n/**\n * 配置加载项(描述单个待加载的配置文件)。\n * @example 模块内部上下文\n * ```ts\n * const item: ConfigLoadItem = { name: 'core', filePath: join('/srv/app', 'config', '_core.yml') }\n * const cacheName = item.name\n * ```\n */\ninterface ConfigLoadItem {\n /** 配置名称(用作缓存 key,如 'core'、'db'、'app') */\n name: string\n /** 配置文件绝对路径 */\n filePath: string\n}\n\n/**\n * 扫描配置目录并构建配置加载项列表。\n *\n * 约定:\n * - 以 `_` 开头的文件为内置模块配置(如 `_core.yml` → name='core')\n * - 其他文件为业务配置(如 `app.yml` → name='app')\n *\n * @param configDir - 配置目录路径\n * @returns 配置加载项列表;目录不存在时返回空数组并输出警告\n * @throws 目录存在但不可读取等文件系统异常会向调用方传播。\n *\n * @example 模块内部上下文\n * ```ts\n * const items = scanConfigDir('./config')\n * core.logger.debug('Runtime configs selected', { names: items.map(item => item.name) })\n * ```\n */\nfunction scanConfigDir(\n configDir: string,\n): ConfigLoadItem[] {\n const logger = core.logger\n const items: ConfigLoadItem[] = []\n\n if (!existsSync(configDir)) {\n logger.warn(`[core] Config directory not found: ${configDir}`)\n return items\n }\n\n const files = readdirSync(configDir).filter(f =>\n f.endsWith('.yml') || f.endsWith('.yaml'),\n )\n\n for (const file of files) {\n const filePath = join(configDir, file)\n const baseName = file.replace(YAML_EXTENSION_REGEX, '')\n\n // 判断是否为内置模块配置(以 _ 开头)\n if (baseName.startsWith('_')) {\n const moduleName = baseName.slice(1) // 去掉 _ 前缀\n items.push({\n name: moduleName,\n filePath,\n })\n }\n else {\n // 业务配置(文件名作为配置名)\n items.push({\n name: baseName,\n filePath,\n })\n }\n }\n return items\n}\n\n/**\n * 初始化 Core(内部实现,通过 `core.init()` 调用)。\n *\n * 执行流程:\n * 1. 配置日志(若提供 `options.logging`)\n * 2. 扫描并加载配置目录中的所有 YAML\n * 3. 启用配置文件监听(若 `options.watchConfig` 为 true)\n *\n * 单项 `config.load` 返回失败时记录日志并继续;必需配置由调用方 `config.validate` 并检查 success。\n *\n * @param options - 初始化选项\n * @throws 目录扫描、日志设置等异常仍会传播;不把单项配置的失败结果改为异常。\n *\n * @example 模块内部上下文\n * ```ts\n * core.init({ configDir: './config', watchConfig: true })\n * const required = core.config.validate('core', CoreConfigSchema)\n * if (!required.success) core.logger.error('Required config unavailable', { error: required.error })\n * ```\n */\nfunction initCore(options: CoreOptions = {}): void {\n const startTime = Date.now()\n const logger = core.logger\n\n // 1. Configure logging\n if (options.logging) {\n core.logger.configure(options.logging)\n }\n\n let configItems: ConfigLoadItem[] = []\n\n if (options.configDir) {\n // 约定优于配置模式\n configItems = scanConfigDir(options.configDir)\n }\n\n // 先应用 core 的日志配置,避免其它配置加载日志使用初始化前的级别与格式。\n configItems.sort((left, right) => Number(right.name === 'core') - Number(left.name === 'core'))\n\n // 2. Load config files\n for (const item of configItems) {\n if (item.name === 'core') {\n const result = config.load(item.name, item.filePath, CoreConfigSchema)\n if (result.success) {\n if (!options.logging) {\n core.logger.configure(result.data.logging || {})\n }\n logger.info(`[core] Config loaded: ${item.name} <- ${item.filePath}`)\n }\n else {\n logger.error(`[core] Config load failed: ${item.name}`, {\n error: result.error,\n })\n }\n }\n else {\n const result = loadConfigStructure(item.name, item.filePath, options.configSchemas?.[item.name])\n if (result.success) {\n logger.info(`[core] Config loaded: ${item.name} <- ${item.filePath}`)\n }\n else {\n logger.error(`[core] Config load failed: ${item.name}`, {\n error: result.error,\n })\n }\n }\n }\n\n // 3. Enable config file watching\n if (options.watchConfig && configItems.length > 0) {\n setupConfigWatch(configItems)\n }\n\n const duration = Date.now() - startTime\n logger.info(`[core] Initialized (${duration}ms)`)\n}\n\n/**\n * 启用配置文件监听。\n *\n * 为每个已加载的配置项注册文件 watcher,变更时自动重载并输出日志。\n *\n * @param configs - 需要监听的配置项列表\n */\nfunction setupConfigWatch(configs: ConfigLoadItem[]): void {\n const logger = core.logger\n\n for (const item of configs) {\n config.watch(item.name, (_config, error) => {\n if (error) {\n logger.error(`[core] Config reload failed: ${item.name}`, { error })\n return\n }\n logger.info(`[core] Config reloaded: ${item.name}`)\n })\n\n logger.debug(`[core] Config watch enabled: ${item.name}`)\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/functions/core-function-access.node.ts","../src/functions/core-function-environment.node.ts","../src/functions/core-function-config.node.ts","../src/functions/core-function-logger.node.ts","../src/core-main.node.ts"],"names":["process","config","path","segment","parse","nodeParseEnv","result","Buffer","logger","existsSync","join"],"mappings":"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","file":"node.js","sourcesContent":["/**\n * @h-ai/core — Node 端可信地址解析与编译后的访问检查。\n * @module core-function-access.node\n */\nimport type { AccessCondition, AccessDecision, AccessFunctions, RequestAccessCheck, RequestAccessConfigInput, RequestAccessPolicy, RequestEncryptionMode, TrustedProxies } from '../core-types.js'\nimport { Buffer } from 'node:buffer'\nimport { closeSync, constants, fstatSync, openSync, readSync } from 'node:fs'\nimport { BlockList, isIP } from 'node:net'\nimport { networkInterfaces } from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { parse } from 'yaml'\nimport { AccessConditionSchema, RequestAccessConfigSchema, RequestAccessPolicySchema } from '../core-access-config.js'\n\nconst allowed: AccessDecision = Object.freeze({ allowed: true })\nconst invalidPath: AccessDecision = Object.freeze({ allowed: false, reason: 'path' })\nconst maximumPolicyBytes = 1024 * 1024\n\n/**\n * 规范化可信宿主给出的 IP;不接受端口、主机名或带区域的地址。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const ip = core.access.normalizeClientIp('::ffff:192.0.2.10')\n * ```\n */\nfunction normalizeClientIp(value?: string): string | undefined {\n if (!value)\n return undefined\n const address = value.trim()\n if (address.includes('%') || !isIP(address))\n return undefined\n return address.match(/^::ffff:(\\d+\\.\\d+\\.\\d+\\.\\d+)$/i)?.[1] ?? address\n}\n\nfunction addAddress(list: BlockList, entry: string): void {\n const [address, prefix, extra] = entry.split('/')\n const family = address\n ? isIP(address)\n : 0\n if (!family || address?.includes('%') || extra !== undefined)\n throw new Error('Expected an IP address or CIDR')\n const type = family === 4\n ? 'ipv4'\n : 'ipv6'\n if (prefix === undefined) {\n list.addAddress(address!, type)\n return\n }\n const bits = Number(prefix)\n if (!/^\\d+$/.test(prefix) || bits < 0 || bits > (family === 4\n ? 32\n : 128)) {\n throw new Error('Invalid CIDR prefix')\n }\n list.addSubnet(address!, bits, type)\n}\n\n/**\n * 启动编译可信代理;仅从可信对端接收 XFF,由右向左取首个非可信地址。\n * @param trustedProxies - 代理 IP/CIDR;auto 在受管私有 Compose 中编译本容器网段,其他宿主不信任转发头。\n * @returns 第二参数必须来自 socket/受信平台的解析函数;无效转发链返回 undefined。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const resolve = core.access.createClientIpResolver(['192.0.2.10'])\n * const ip = resolve(new Request('https://example.test', { headers: { 'x-forwarded-for': '198.51.100.2' } }), '192.0.2.10')\n * ```\n */\nfunction createClientIpResolver(trustedProxies: TrustedProxies | readonly string[] = 'auto'): (request: Request, remoteAddress?: string) => string | undefined {\n const entries = trustedProxies === 'auto'\n ? process.env.HAI_DEPLOY_PRIVATE_PROXY === '1'\n ? Object.values(networkInterfaces()).flatMap(interfaces => interfaces?.filter(value => !value.internal && value.cidr && !value.cidr.includes('%')).map(value => value.cidr!) ?? [])\n : []\n : trustedProxies\n if (trustedProxies === 'auto' && process.env.HAI_DEPLOY_PRIVATE_PROXY === '1' && !entries.length)\n throw new Error('Private proxy mode requires an isolated container network')\n const proxies = new BlockList()\n for (const entry of entries)\n addAddress(proxies, entry)\n const trusted = (address: string): boolean => proxies.check(address, isIP(address) === 4\n ? 'ipv4'\n : 'ipv6')\n return (request, remoteAddress) => {\n const peer = normalizeClientIp(remoteAddress)\n if (!peer || !entries.length || !trusted(peer))\n return peer\n const forwarded = request.headers.get('x-forwarded-for')\n if (forwarded === null) {\n const realIp = request.headers.get('x-real-ip')\n return realIp === null\n ? peer\n : normalizeClientIp(realIp)\n }\n if (forwarded.length > 2048)\n return undefined\n const chain = forwarded.split(',')\n if (chain.length > 32)\n return undefined\n let current = peer\n for (let index = chain.length - 1; index >= 0 && trusted(current); index--) {\n const address = normalizeClientIp(chain[index])\n if (!address)\n return undefined\n current = address\n }\n return current\n }\n}\n\n/**\n * 时区转换后用于窗口比较的星期和分钟。\n * @example 模块内部上下文\n * ```ts\n * const minute: LocalMinute = { day: 1, time: '09:00' }\n * ```\n */\ninterface LocalMinute { day: number, time: string }\n\n/**\n * 按 UTC 分钟缓存转换结果的读取函数。\n * @example 模块内部上下文\n * ```ts\n * const read: TimeReader = timeReader('UTC')\n * const minute = read(Date.now())\n * ```\n */\ntype TimeReader = (now: number) => LocalMinute\n\nfunction timeReader(timezone: string): TimeReader {\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n weekday: 'short',\n hour: '2-digit',\n minute: '2-digit',\n hourCycle: 'h23',\n })\n const weekdays = [\n 'Mon',\n 'Tue',\n 'Wed',\n 'Thu',\n 'Fri',\n 'Sat',\n 'Sun',\n ]\n let lastMinute = Number.NaN\n let local: LocalMinute\n return (now) => {\n const minute = Math.floor(now / 60_000)\n if (minute !== lastMinute) {\n const parts = Object.fromEntries(formatter.formatToParts(now).map(part => [part.type, part.value]))\n local = { day: weekdays.indexOf(parts.weekday!) + 1, time: `${parts.hour}:${parts.minute}` }\n lastMinute = minute\n }\n return local\n }\n}\n\nfunction compileCondition(condition: AccessCondition, readTime?: TimeReader, ruleId?: string): (ip?: string) => AccessDecision {\n const allow = new BlockList()\n const deny = new BlockList()\n for (const entry of condition.allowIps)\n addAddress(allow, entry)\n for (const entry of condition.denyIps)\n addAddress(deny, entry)\n const addressDenied: AccessDecision = Object.freeze({ allowed: false, reason: 'address', ruleId })\n const timeDenied: AccessDecision = Object.freeze({ allowed: false, reason: 'time', ruleId })\n const checksAddress = condition.allowIps.length > 0 || condition.denyIps.length > 0\n return (ip) => {\n if (checksAddress) {\n const address = normalizeClientIp(ip)\n if (!address)\n return addressDenied\n const family = isIP(address) === 4\n ? 'ipv4'\n : 'ipv6'\n if (deny.check(address, family) || (condition.allowIps.length && !allow.check(address, family)))\n return addressDenied\n }\n if (readTime) {\n const { day, time } = readTime(Date.now())\n const previous = day === 1\n ? 7\n : day - 1\n if (!condition.windows.some(window => window.start < window.end\n ? window.days.includes(day) && time >= window.start && time < window.end\n : (window.days.includes(day) && time >= window.start) || (window.days.includes(previous) && time < window.end))) {\n return timeDenied\n }\n }\n return allowed\n }\n}\n\n/**\n * 编译单个 IP/时间条件,供登录与请求策略共用;请求期间不再解析 CIDR 或创建格式化器。\n * @example\n * ```ts\n * import { core, AccessConditionSchema } from '@h-ai/core'\n * const check = core.access.createConditionCheck(AccessConditionSchema.parse({ allowIps: ['192.0.2.0/24'] }))\n * const decision = check('192.0.2.10')\n * ```\n */\nfunction createConditionCheck(input: AccessCondition): (ip?: string) => AccessDecision {\n const condition = AccessConditionSchema.parse(input)\n return compileCondition(condition, condition.windows.length\n ? timeReader(condition.timezone)\n : undefined)\n}\n\n/**\n * 启动时读取并验证独立 YAML 策略,不在请求中访问文件;最大 1 MiB,拒绝 YAML 别名与未知字段。\n * @param input - false、内联策略或 { file },二者不能混用。\n * @param baseDirectory - 相对文件路径的基准目录,默认服务进程工作目录。\n * @returns 已验证策略或 false;读取/解析失败抛出不含策略正文的配置错误,宿主必须停止启动。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const policy = core.access.loadPolicy({ rules: [] })\n * ```\n */\nfunction loadPolicy(input: RequestAccessConfigInput = false, baseDirectory = process.cwd()): RequestAccessPolicy | false {\n const config = RequestAccessConfigSchema.parse(input)\n if (config === false || !('file' in config))\n return config\n let descriptor: number | undefined\n let content: string\n try {\n // 非阻塞打开保证 FIFO 等特殊文件能先被 fstat 拒绝,不在启动时等候写入者。\n descriptor = openSync(path.resolve(baseDirectory, config.file), constants.O_RDONLY | constants.O_NONBLOCK)\n const stat = fstatSync(descriptor)\n if (!stat.isFile() || stat.size > maximumPolicyBytes)\n throw new Error('Invalid policy file size or type')\n const bytes = Buffer.alloc(Math.min(stat.size + 1, maximumPolicyBytes + 1))\n let length = 0\n while (length < bytes.length) {\n const read = readSync(descriptor, bytes, length, bytes.length - length, null)\n if (!read)\n break\n length += read\n }\n if (length > maximumPolicyBytes || length !== stat.size)\n throw new Error('Policy file changed while reading')\n content = bytes.subarray(0, length).toString('utf8')\n }\n catch {\n throw new Error('Request access policy file could not be read; use a regular YAML file no larger than 1 MiB')\n }\n finally {\n if (descriptor !== undefined)\n closeSync(descriptor)\n }\n let parsed: unknown\n try {\n parsed = parse(content, { maxAliasCount: 0, uniqueKeys: true })\n }\n catch { throw new Error('Request access policy YAML is invalid; aliases and duplicate keys are not allowed') }\n const validated = RequestAccessPolicySchema.safeParse(parsed)\n if (!validated.success)\n throw new Error(`Request access policy is invalid at ${validated.error.issues.map(issue => issue.path.join('.') || 'root').join(', ')}`)\n return validated.data\n}\n\n/**\n * 已编译方法和访问条件,不在请求期解释配置。\n * @example 模块内部上下文\n * ```ts\n * const rule: CompiledRule = { methods: new Set(['POST']), check: () => allowed }\n * ```\n */\ninterface CompiledRule {\n methods: ReadonlySet<string>\n check: (ip?: string) => AccessDecision\n}\n/**\n * 按路径段索引的前缀节点,只访问命中的分支。\n * @example 模块内部上下文\n * ```ts\n * const node: PathNode = { children: new Map(), rules: [] }\n * ```\n */\ninterface PathNode {\n children: Map<string, PathNode>\n rules: CompiledRule[]\n encryption?: Map<string, RequestEncryptionMode>\n exactEncryption?: Map<string, RequestEncryptionMode>\n /** 仅在启动插入时用于检查子路径冲突,1 表示 required,2 表示 disabled。 */\n encryptionBelow?: Map<string, number>\n}\n\nfunction normalizeRequestPath(value: string): string | undefined {\n if (value.length > 8192)\n return undefined\n let decoded = value\n if (value.includes('%')) {\n if (/%(?:2f|5c|00)/i.test(value))\n return undefined\n try {\n decoded = decodeURIComponent(value)\n }\n catch { return undefined }\n }\n // eslint-disable-next-line no-control-regex -- 运行期拒绝控制字符及编码绕过,不能只校验配置端。\n if (!decoded.startsWith('/') || /[\\\\%?#\\u0000-\\u0020\\u007F]/.test(decoded) || decoded.includes('//'))\n return undefined\n if (/(?:^|\\/)\\.\\.?(?:\\/|$)/.test(decoded))\n return undefined\n return decoded.length > 1 && decoded.endsWith('/')\n ? decoded.slice(0, -1)\n : decoded\n}\n\n/**\n * 编译按路径索引的请求检查器;全局与所有匹配规则取交集,不进行全规则扫描。\n * @param input - 启动时已装配的访问策略;独立文件也只在此时读取一次。\n * @returns 输入为实际 URL pathname、HTTP 方法和可信 IP 的纯请求检查函数。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const check = core.access.createRequestCheck({ rules: [{ id: 'external', paths: ['/api/v1/external/**'], allowIps: ['192.0.2.0/24'] }] })\n * const decision = check('/api/v1/external/sync', 'POST', '192.0.2.10')\n * ```\n */\nfunction createRequestCheck(input: RequestAccessConfigInput = false): RequestAccessCheck {\n const policy = loadPolicy(input)\n if (policy === false) {\n return Object.assign(() => allowed, {\n encryption: () => undefined,\n requiresEncryption: false,\n })\n }\n const clocks = new Map<string, TimeReader>()\n const compile = (condition: AccessCondition, id?: string) => {\n let readTime: TimeReader | undefined\n if (condition.windows.length) {\n readTime = clocks.get(condition.timezone) ?? timeReader(condition.timezone)\n clocks.set(condition.timezone, readTime)\n }\n return compileCondition(condition, readTime, id)\n }\n const globalCheck = policy.global\n ? compile(policy.global)\n : () => allowed\n const exact = new Map<string, CompiledRule[]>()\n const prefixes: PathNode = {\n children: new Map(),\n rules: [],\n }\n const allMethods = [\n 'GET',\n 'HEAD',\n 'POST',\n 'PUT',\n 'PATCH',\n 'DELETE',\n 'OPTIONS',\n 'CONNECT',\n 'TRACE',\n '*',\n ]\n let requiresEncryption = false\n let hasEncryption = false\n for (const rule of policy.rules) {\n const compiled = {\n methods: new Set(rule.methods),\n check: compile(rule, rule.id),\n }\n for (const pattern of new Set(rule.paths)) {\n if (rule.encryption) {\n hasEncryption = true\n requiresEncryption ||= rule.encryption === 'required'\n const prefix = pattern.endsWith('/**')\n const nodes = [prefixes]\n let node = prefixes\n const path = normalizeRequestPath(prefix\n ? pattern.slice(0, -3) || '/'\n : pattern)!\n for (const segment of path.split('/').filter(Boolean)) {\n let child = node.children.get(segment)\n if (!child) {\n child = {\n children: new Map(),\n rules: [],\n }\n node.children.set(segment, child)\n }\n node = child\n nodes.push(node)\n }\n const bit = rule.encryption === 'required'\n ? 1\n : 2\n const opposite = bit === 1\n ? 2\n : 1\n const methods = rule.methods.length ? rule.methods : allMethods\n for (const method of methods) {\n // 冲突与声明顺序无关;不以时间/IP 不同为由接受含糊的传输协议。\n if (nodes.some(parent => parent.encryption?.has(method) && parent.encryption.get(method) !== rule.encryption)\n || (prefix\n ? (node.encryptionBelow?.get(method) ?? 0) & opposite\n : node.exactEncryption?.has(method) && node.exactEncryption.get(method) !== rule.encryption)) {\n throw new Error(`Request access encryption conflicts at rule ${rule.id}`)\n }\n const modes = prefix\n ? node.encryption ??= new Map()\n : node.exactEncryption ??= new Map()\n modes.set(method, rule.encryption)\n for (const parent of nodes) {\n parent.encryptionBelow ??= new Map()\n parent.encryptionBelow.set(method, (parent.encryptionBelow.get(method) ?? 0) | bit)\n }\n }\n }\n if (pattern.endsWith('/**')) {\n let node = prefixes\n for (const segment of pattern.slice(0, -3).split('/').filter(Boolean)) {\n let child = node.children.get(segment)\n if (!child) {\n child = {\n children: new Map(),\n rules: [],\n }\n node.children.set(segment, child)\n }\n node = child\n }\n node.rules.push(compiled)\n }\n else {\n const path = normalizeRequestPath(pattern)!\n const rules = exact.get(path) ?? []\n rules.push(compiled)\n exact.set(path, rules)\n }\n }\n }\n const check = (pathname: string, method: string, ip?: string): AccessDecision => {\n const global = globalCheck(ip)\n if (!global.allowed)\n return global\n const path = normalizeRequestPath(pathname)\n if (!path)\n return invalidPath\n for (const rule of exact.get(path) ?? []) {\n if (!rule.methods.size || rule.methods.has(method)) {\n const decision = rule.check(ip)\n if (!decision.allowed)\n return decision\n }\n }\n let node: PathNode | undefined = prefixes\n for (const rule of node.rules) {\n if (!rule.methods.size || rule.methods.has(method)) {\n const decision = rule.check(ip)\n if (!decision.allowed)\n return decision\n }\n }\n if (node.children.size) {\n for (const segment of path.split('/').filter(Boolean)) {\n node = node.children.get(segment)\n if (!node)\n break\n for (const rule of node.rules) {\n if (!rule.methods.size || rule.methods.has(method)) {\n const decision = rule.check(ip)\n if (!decision.allowed)\n return decision\n }\n }\n }\n }\n return allowed\n }\n const encryption = (pathname: string, method: string): RequestEncryptionMode | undefined => {\n const path = normalizeRequestPath(pathname)\n if (!path)\n return undefined\n let node: PathNode | undefined = prefixes\n let mode = node.encryption?.get(method) ?? node.encryption?.get('*')\n for (const segment of path.split('/').filter(Boolean)) {\n node = node.children.get(segment)\n if (!node)\n return mode\n mode ??= node.encryption?.get(method) ?? node.encryption?.get('*')\n }\n return mode ?? node?.exactEncryption?.get(method) ?? node?.exactEncryption?.get('*')\n }\n return Object.assign(check, {\n encryption: hasEncryption\n ? encryption\n : () => undefined,\n requiresEncryption,\n })\n}\n\n/**\n * Node 访问工具统一由 core-main 注册,不作为包级函数导出。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const decision = core.access.createRequestCheck(false)('/api/v1/example', 'GET')\n * ```\n */\nexport const access: AccessFunctions = {\n normalizeClientIp,\n createClientIpResolver,\n createConditionCheck,\n createRequestCheck,\n loadPolicy,\n}\n","/** 通用环境配置:来源合并、结构覆盖与无损 dotenv 编解码,不依赖业务模块。 */\nimport type { ZodType } from 'zod'\nimport type { HaiResult } from '../core-types.js'\nimport process from 'node:process'\nimport { parseEnv as nodeParseEnv } from 'node:util'\nimport { parse } from 'yaml'\nimport { err, HaiConfigError, ok } from '../core-types.js'\nimport { i18n } from '../i18n/core-i18n-utils.js'\n\n/**\n * 仅供结构遍历的 JSON Schema 节点,不代替模块业务 Schema。\n * @example 模块内部上下文\n * ```ts\n * const shape: Shape = { type: 'object', properties: { name: { type: 'string' } } }\n * ```\n */\ntype Shape = Record<string, unknown>\n/**\n * 单个环境来源中的字面变量,undefined 表示未设置。\n * @example 模块内部上下文\n * ```ts\n * const values: Environment = { HAI_APP_NAME: 'Example' }\n * ```\n */\ntype Environment = Record<string, string | undefined>\n\n/** 只接受普通数据对象,路径写入不经过对象原型。 */\nfunction object(value: unknown): Shape | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as Shape\n : undefined\n}\n\n/** camelCase 保持连写;实际字段名来自结构或 Schema,不从大写变量猜测。 */\nfunction segment(value: string): string {\n return value.replace(/[^a-z0-9]+/gi, '_').replace(/^_|_$/g, '').toUpperCase()\n}\n\n/** JSON Schema 的本地引用与联合分支只提供结构提示,最终仍由原始 Zod 校验。 */\nfunction shapes(node: Shape, root: Shape, value?: unknown, depth = 0): Shape[] {\n if (depth > 32)\n return []\n const result = [node]\n if (typeof node.$ref === 'string' && node.$ref.startsWith('#/')) {\n let target: unknown = root\n for (const key of node.$ref.slice(2).split('/').map(item => item.replaceAll('~1', '/').replaceAll('~0', '~')))\n target = object(target)?.[key]\n if (object(target))\n result.push(...shapes(object(target)!, root, value, depth + 1))\n }\n for (const keyword of ['anyOf', 'oneOf', 'allOf']) {\n if (!Array.isArray(node[keyword]))\n continue\n for (const item of node[keyword]) {\n const branch = object(item)\n if (!branch)\n continue\n const fields = object(branch.properties)\n const input = object(value)\n if (fields && input && Object.entries(fields).some(([key, field]) => input[key] !== undefined && object(field)?.const !== undefined && object(field)!.const !== input[key]))\n continue\n result.push(...shapes(branch, root, value, depth + 1))\n }\n }\n return result\n}\n\n/** 合并同一路径的结构提示,保持 Provider 的联合定义。 */\nfunction combined(nodes: unknown[]): Shape {\n const entries = nodes.map(object).filter((item): item is Shape => item !== undefined)\n return entries.length === 1\n ? entries[0]!\n : { anyOf: entries }\n}\n\n/** 字符串字段保留前导零等字面内容,其余值沿用 YAML 类型还原。 */\nfunction scalar(text: string, node: Shape, root: Shape): unknown {\n const types = new Set(shapes(node, root).flatMap(item => Array.isArray(item.type)\n ? item.type\n : typeof item.type === 'string'\n ? [item.type]\n : []))\n if (types.has('string') && [...types].every(type => type === 'string' || type === 'null') && !(text === 'null' && types.has('null')))\n return text\n if (text === '')\n return ''\n try {\n return parse(text) ?? (text === 'null'\n ? null\n : text)\n }\n catch { return text }\n}\n\n/**\n * 从低到高合并来源;高来源父项删除旧结构细项,同来源始终先父后子。\n * @example 模块内部上下文\n * ```ts\n * const values = mergeEnv([{ HAI_APP_NAME: 'base' }, { HAI_APP_NAME: 'test' }])\n * ```\n */\nexport function mergeEnv(layers: readonly Environment[]): Record<string, string> {\n const values: Record<string, string> = {}\n for (const layer of layers) {\n for (const name of Object.keys(layer).sort((left, right) => left.length - right.length || left.localeCompare(right))) {\n if (layer[name] === undefined)\n continue\n if (name.startsWith('HAI_')) {\n for (const previous of Object.keys(values)) {\n // 该开关由 Serv 直接读取进程变量,不属于 HAI_SERV 配置对象。\n if (previous !== 'HAI_SERV_REFRESH_COOKIE_SECURE' && previous.startsWith(`${name}_`))\n delete values[previous]\n }\n }\n values[name] = layer[name]\n }\n }\n return values\n}\n\n/**\n * dotenv 使用 Node 字面规则;补齐生成器双引号的 JSON 转义,拒绝同文件重复键。\n * @example 模块内部上下文\n * ```ts\n * const values = parseEnvironment('HAI_APP_NAME=Example\\n')\n * ```\n */\nexport function parseEnvironment(text: string): Record<string, string> {\n const result = nodeParseEnv(text)\n const names = new Set<string>()\n const assignments = /^[ \\t]*(?:export[ \\t]+)?([A-Z_]\\w*)[ \\t]*=[ \\t]*('[^']*'|\"(?:[^\"\\\\]|\\\\.)*\"|`[^`]*`|[^\\r\\n]*)/gim\n for (const match of text.matchAll(assignments)) {\n const name = match[1]!\n if (names.has(name))\n throw new Error(`Duplicate environment variable: ${name}`)\n names.add(name)\n if (match[2]!.startsWith('\"') && (match[2]!.includes('\\\\\"') || match[2]!.includes('\\\\u0027'))) {\n try {\n result[name] = JSON.parse(match[2]!)\n }\n catch { /* 普通 dotenv 双引号仍按 Node 规则解析。 */ }\n }\n }\n return Object.fromEntries(Object.entries(result).filter((entry): entry is [string, string] => entry[1] !== undefined))\n}\n\n/**\n * 所有值均按字面量编码;排序让模块 JSON 位于其细项之前。\n * @example 模块内部上下文\n * ```ts\n * const text = stringifyEnv({ HAI_APP_NAME: 'Example' })\n * ```\n */\nexport function stringifyEnv(values: Record<string, string>, options: { target?: 'node' | 'compose' } = {}): string {\n return `${Object.keys(values).sort().map((name) => {\n if (!/^[A-Z_]\\w*$/i.test(name))\n throw new Error('Invalid environment variable name')\n const value = values[name]!\n let literal: string\n if (!value.includes('\\''))\n literal = `'${value}'`\n else if (options.target === 'compose')\n literal = JSON.stringify(value).replaceAll('$', () => '$$')\n else literal = JSON.stringify(value).replaceAll('\\'', '\\\\u0027')\n return `${name}=${literal}`\n }).join('\\n')}\\n`\n}\n\n/**\n * 在给定结构上解析环境变量;父对象提供基础值,具体路径继续覆盖。\n * @example 模块内部上下文\n * ```ts\n * const result = resolveEnvironment({ name: 'app', value: { name: 'Example' }, environment: { HAI_APP_NAME: 'Test' } })\n * ```\n */\nexport function resolveEnvironment(options: { name: string, value: unknown, environment?: Environment, schema?: ZodType, shape?: Readonly<Record<string, unknown>>, missing?: 'error' | 'empty' }, literal = false): HaiResult<unknown> {\n const environment = options.environment ?? process.env\n const missingNames = new Set<string>()\n let root: Shape\n try {\n root = options.schema\n ? options.schema.toJSONSchema({ io: 'input', unrepresentable: 'any' })\n : options.shape ?? {}\n }\n catch { root = {} }\n const prefix = `HAI_${segment(options.name)}`\n function visit(original: unknown, name: string, node: Shape, inheritedLiteral: boolean, depth: number, declaration: unknown = original): unknown {\n if (depth > 32)\n throw new Error(name)\n let value = original\n let fromEnvironment = inheritedLiteral\n if (environment[name] !== undefined) {\n value = scalar(environment[name], node, root)\n fromEnvironment = true\n }\n // 先应用判别字段的细项,再选择联合分支,避免旧 Provider 隐藏新分支字段。\n const alternatives = shapes(node, root)\n const discriminators = new Map<string, unknown[]>()\n for (const candidate of alternatives) {\n for (const [key, field] of Object.entries(object(candidate.properties) ?? {})) {\n if (shapes(object(field) ?? {}, root).some(item => Object.hasOwn(item, 'const'))) {\n discriminators.set(key, [\n ...discriminators.get(key) ?? [],\n field,\n ])\n }\n }\n }\n const selection = {\n ...object(value),\n }\n for (const [key, fields] of discriminators) {\n const text = environment[`${name}_${segment(key)}`]\n if (text !== undefined)\n selection[key] = scalar(text, combined(fields), root)\n }\n const candidates = shapes(node, root, Object.keys(selection).length\n ? selection\n : value)\n const synthesized = value === undefined\n // 更细字段可替换粗粒度的 false/标量节点;来源合并已先清除低来源细项。\n const valueType: string = typeof value\n const primitiveOverride = value === undefined || candidates.some(candidate => (value !== null && candidate.type === valueType) || candidate.const === value || (value === null && candidate.type === 'null'))\n if (primitiveOverride && !object(value) && !Array.isArray(value)) {\n const declared = new Set([\n ...Object.keys(object(declaration) ?? {}),\n ...candidates.flatMap(candidate => Object.keys(object(candidate.properties) ?? {})),\n ])\n const specified = [...declared].filter(key => Object.keys(environment).some(candidate => environment[candidate] !== undefined && (candidate === `${name}_${segment(key)}` || candidate.startsWith(`${name}_${segment(key)}_`))))\n if (specified.length)\n value = Object.fromEntries(specified.map(key => [key, undefined]))\n }\n if (value === undefined && Object.keys(environment).some(key => environment[key] !== undefined && key.startsWith(`${name}_`))) {\n if (candidates.some(item => item.type === 'object' || object(item.properties)))\n value = {}\n }\n const indexed = Object.keys(environment).filter(key => environment[key] !== undefined && key.startsWith(`${name}_`) && /^\\d+(?:_|$)/.test(key.slice(name.length + 1)))\n if (value === undefined && indexed.length && candidates.some(candidate => candidate.type === 'array')) {\n const defaults = candidates.find(candidate => Array.isArray(candidate.default))?.default\n if (!Array.isArray(defaults))\n throw new TypeError(indexed[0])\n value = structuredClone(defaults)\n }\n if (Array.isArray(value)) {\n const itemShape = combined(candidates.map(item => item.items))\n for (const key of indexed) {\n const index = key.slice(name.length + 1).split('_')[0]!\n if (/^\\d+$/.test(index) && (String(Number(index)) !== index || Number(index) >= value.length))\n throw new Error(key)\n }\n return value.map((item, index) => visit(item, `${name}_${index}`, itemShape, fromEnvironment, depth + 1, Array.isArray(declaration)\n ? declaration[index]\n : undefined))\n }\n const input = object(value)\n if (input) {\n const properties = new Map<string, unknown[]>()\n for (const candidate of candidates) {\n for (const [key, field] of Object.entries(object(candidate.properties) ?? {})) {\n properties.set(key, [\n ...properties.get(key) ?? [],\n field,\n ])\n }\n }\n const declaredKeys = new Set([\n ...Object.keys(object(declaration) ?? {}),\n ...properties.keys(),\n ])\n const keys = new Set([\n ...Object.keys(input),\n ...[...declaredKeys].filter(key => Object.keys(environment).some(nameInEnv => environment[nameInEnv] !== undefined && (nameInEnv === `${name}_${segment(key)}` || nameInEnv.startsWith(`${name}_${segment(key)}_`)))),\n ])\n const entries = [...keys].map((key) => {\n if (['__proto__', 'prototype', 'constructor'].includes(key))\n throw new Error(name)\n return [\n key,\n visit(input[key], `${name}_${segment(key)}`, combined(properties.get(key) ?? candidates.map(candidate => candidate.additionalProperties)), fromEnvironment, depth + 1, object(declaration)?.[key]),\n ]\n }).filter(([, child]) => child !== undefined)\n return synthesized && !entries.length\n ? undefined\n : Object.fromEntries(entries)\n }\n if (typeof value !== 'string' || fromEnvironment)\n return value\n // 按占位符边界单次扫描;缺失结束符时不从每个 ${ 起点重复回溯。\n const parts: string[] = []\n let consumed = 0\n let search = 0\n let full = false\n while (search < value.length) {\n const start = value.indexOf('${', search)\n if (start < 0)\n break\n if (value[start + 2] === ':' || value[start + 2] === '}') {\n search = start + 2\n continue\n }\n const end = value.indexOf('}', start + 2)\n if (end < 0)\n break\n const expression = value.slice(start + 2, end)\n const separator = expression.indexOf(':')\n const key = separator < 0\n ? expression\n : expression.slice(0, separator)\n const fallback = separator < 0\n ? undefined\n : expression.slice(separator + 1)\n if (environment[key] === undefined && fallback === undefined && options.missing !== 'empty') {\n missingNames.add(key)\n throw new Error(key)\n }\n parts.push(value.slice(consumed, start), environment[key] ?? fallback ?? '')\n consumed = end + 1\n search = consumed\n full = start === 0 && consumed === value.length\n }\n const resolved = parts.join('') + value.slice(consumed)\n return full\n ? scalar(resolved, node, root)\n : resolved\n }\n try {\n return ok(visit(options.value, prefix, root, literal, 0))\n }\n catch (failure) {\n const name = failure instanceof Error && /^[A-Z_]\\w*$/i.test(failure.message)\n ? failure.message\n : prefix\n if (!missingNames.has(name)) {\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'), {\n fields: [name],\n })\n }\n return err(HaiConfigError.CONFIG_ENV_VAR_MISSING, i18n.coreM('core_configEnvVarMissing', {\n params: { varName: name },\n }))\n }\n}\n\n/**\n * 默认展开对象,数组与动态键字典保留 JSON;不做模块名称判断。\n * @example 模块内部上下文\n * ```ts\n * const values = toEnv({ prefix: 'HAI_APP', value: { name: 'Example', tags: ['demo'] } })\n * ```\n */\nexport function toEnv(options: { prefix: string, value: unknown, schema?: ZodType, shape?: Readonly<Record<string, unknown>> }): Record<string, string> {\n const result: Record<string, string> = {}\n const root: Shape = options.schema\n ? options.schema.toJSONSchema({ io: 'input', unrepresentable: 'any' })\n : options.shape ?? {}\n function visit(value: unknown, name: string, node: Shape): void {\n if (!/^[A-Z][A-Z0-9_]*$/.test(name))\n throw new Error('Invalid environment variable name')\n if (value === undefined)\n return\n const input = object(value)\n const candidates = shapes(node, root, value)\n const properties = Object.assign({}, ...candidates.map(candidate => object(candidate.properties) ?? {})) as Shape\n const dynamic = candidates.some(candidate => candidate.additionalProperties === true || object(candidate.additionalProperties))\n if (input && Object.keys(input).length && !dynamic && Object.keys(input).every(key => /^[a-z][a-zA-Z0-9]*$/.test(key))) {\n for (const [key, item] of Object.entries(input))\n visit(item, `${name}_${segment(key)}`, object(properties[key]) ?? {})\n }\n else {\n result[name] = value === null || typeof value === 'object'\n ? JSON.stringify(value)\n : String(value)\n }\n }\n visit(options.value, options.prefix, root)\n return result\n}\n","import type { ZodType } from 'zod'\n/**\n * @h-ai/core — 配置管理(Node.js 专用)\n *\n * 提供 YAML 配置文件加载、约定式环境变量映射、显式环境变量插值、缓存管理。\n * @module core-function-config.node\n */\n\nimport type { HaiError, HaiResult, WatchCallback } from '../core-types.js'\n\nimport { existsSync, readFileSync, watch } from 'node:fs'\nimport { basename, dirname, join, resolve } from 'node:path'\nimport process from 'node:process'\nimport { parse } from 'yaml'\n\n// ─── 配置文件监听 ───\n\nimport { err, HaiConfigError, ok } from '../core-types.js'\nimport { i18n } from '../i18n/core-i18n-utils.js'\nimport { mergeEnv, parseEnvironment, resolveEnvironment, stringifyEnv, toEnv } from './core-function-environment.node.js'\n\n/**\n * 缓存项(存储已加载的配置及其元信息)\n * @example 模块内部上下文\n * ```ts\n * const entry: CacheEntry<{ enabled: boolean }> = { data: { enabled: true }, filePath: '/srv/app/config/app.yml', loadedAt: Date.now() }\n * const enabled = entry.data.enabled\n * ```\n */\ninterface CacheEntry<T = unknown> {\n /** 解析后的配置数据 */\n data: T\n /** 配置文件路径 */\n filePath: string\n /** Zod 校验 Schema(重载时复用,无 Schema 加载时为 undefined) */\n schema?: ZodType<T>\n /** 宿主提供的结构提示;模块仍自行执行完整业务校验。 */\n schemaHint?: ZodType\n /** 加载时间戳(毫秒) */\n loadedAt: number\n}\n\n// ─── 内部工具 ───\n\n// ─── 配置管理器 ───\n\n/** 配置缓存 */\nconst configCache = new Map<string, CacheEntry>()\n\n/**\n * 配置监听条目(包含文件 watcher 和回调集合)\n * @example 模块内部上下文\n * ```ts\n * const watcher = watch('/srv/app/config/app.yml', () => {})\n * const entry: WatchEntry = { watcher, callbacks: new Set(), debounceTimer: null }\n * entry.watcher.close()\n * ```\n */\ninterface WatchEntry {\n /** fs.watch 返回的 watcher 实例 */\n watcher: ReturnType<typeof watch>\n /** 已注册的回调函数集合 */\n callbacks: Set<WatchCallback<unknown>>\n /** 防抖定时器(用于 stopWatching 时清理) */\n debounceTimer: ReturnType<typeof setTimeout> | null\n}\n\n/** 配置监听映射 */\nconst watchEntries = new Map<string, WatchEntry>()\n\n/**\n * 创建未加载错误。\n *\n * @param name - 配置名称\n * @returns HaiError,错误码为 NOT_LOADED\n */\nfunction createNotLoadedError(name: string): HaiError {\n const result = err(HaiConfigError.CONFIG_NOT_LOADED, i18n.coreM('core_configNotLoaded', {\n params: { name },\n }))\n if (!result.success)\n return result.error\n\n throw new Error('unreachable')\n}\n\n/**\n * 通知监听回调。\n *\n * @param name - 配置名称\n * @param result - 重载结果(成功时传配置数据,失败时传错误)\n */\nfunction notifyWatchCallbacks(name: string, result: HaiResult<unknown>): void {\n const entry = watchEntries.get(name)\n if (!entry)\n return\n\n if (result.success) {\n for (const callback of entry.callbacks) {\n try {\n callback(result.data, undefined)\n }\n catch { /* 隔离单个回调异常,不影响其他回调 */ }\n }\n }\n else {\n for (const callback of entry.callbacks) {\n try {\n callback(null, result.error)\n }\n catch { /* 隔离单个回调异常,不影响其他回调 */ }\n }\n }\n}\n\n/**\n * 加载 YAML 配置文件(不带 Schema 验证)。\n *\n * 流程:检查文件存在 → 读取 YAML → 约定式环境变量映射与显式插值。\n *\n * @param name - 配置名称,用于生成 `HAI_<配置名>_<YAML 路径>` 环境变量名\n * @param filePath - YAML 文件路径\n * @returns 解析结果;可能的错误码:FILE_NOT_FOUND / PARSE_ERROR / ENV_VAR_MISSING\n */\nfunction loadYaml(name: string, filePath: string, schema?: ZodType): HaiResult<unknown> {\n if (!existsSync(filePath)) {\n return err(HaiConfigError.CONFIG_FILE_NOT_FOUND, i18n.coreM('core_configFileNotExist', {\n params: { filePath },\n }))\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8')\n const parsed = parse(content)\n return resolveEnvironment({ name, value: parsed, schema })\n }\n catch (error) {\n return err(HaiConfigError.CONFIG_PARSE_ERROR, i18n.coreM('core_configParseFailed', {\n params: { filePath },\n }), error)\n }\n}\n\n/**\n * 加载并验证配置文件。\n *\n * 流程:加载 YAML → 环境变量映射与插值 → Zod Schema 校验。\n *\n * @param name - 配置名称\n * @param filePath - YAML 文件路径\n * @param schema - Zod 校验 Schema\n * @returns 校验后的配置数据;可能的错误码:FILE_NOT_FOUND / PARSE_ERROR / ENV_VAR_MISSING / VALIDATION_ERROR\n */\nfunction loadConfig<T>(\n name: string,\n filePath: string,\n schema: ZodType<T>,\n): HaiResult<T> {\n const yamlResult = loadYaml(name, filePath, schema)\n if (!yamlResult.success)\n return yamlResult\n\n const parseResult = schema.safeParse(yamlResult.data)\n if (!parseResult.success) {\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'), parseResult.error.issues)\n }\n\n return ok(parseResult.data)\n}\n\n/**\n * 加载配置并写入缓存。\n *\n * @param name - 配置名称(缓存 key)\n * @param filePath - YAML 文件路径\n * @param schema - 可选 Zod Schema(不传则跳过校验)\n * @returns 加载结果;成功时同时更新缓存\n */\nfunction loadAndCache<T>(\n name: string,\n filePath: string,\n schema?: ZodType<T>,\n): HaiResult<T> {\n const result = schema\n ? loadConfig(name, filePath, schema)\n : loadYaml(name, filePath) as HaiResult<T>\n if (result.success) {\n configCache.set(name, {\n data: result.data,\n filePath,\n schema: schema as ZodType<unknown> | undefined,\n loadedAt: Date.now(),\n })\n }\n return result\n}\n\n/**\n * 扫描时仅借助宿主 Schema 识别路径和类型,保留原有模块初始化校验边界。\n * @example 模块内部上下文\n * ```ts\n * const loaded = loadConfigStructure('app', '/srv/app/config/app.yml')\n * if (!loaded.success) loaded.error.message\n * ```\n */\nexport function loadConfigStructure(name: string, filePath: string, schemaHint?: ZodType): HaiResult<unknown> {\n const result = loadYaml(name, filePath, schemaHint)\n if (result.success) {\n configCache.set(name, {\n data: result.data,\n filePath,\n schemaHint,\n loadedAt: Date.now(),\n })\n }\n return result\n}\n\n/**\n * 校验已加载的配置并写回缓存。\n *\n * 从缓存中取出原始数据重新用 Schema 校验,校验通过后更新缓存。\n *\n * @param name - 配置名称\n * @param schema - Zod Schema\n * @returns 校验结果;未加载时返回 NOT_LOADED,校验失败返回 VALIDATION_ERROR\n */\nfunction validateLoadedConfig<T>(name: string, schema: ZodType<T>): HaiResult<T> {\n const entry = configCache.get(name)\n if (!entry) {\n return err(createNotLoadedError(name))\n }\n\n const resolved = resolveEnvironment({ name, value: entry.data, schema }, true)\n if (!resolved.success)\n return resolved\n const parseResult = schema.safeParse(resolved.data)\n if (!parseResult.success) {\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'), parseResult.error.issues)\n }\n\n const validated = parseResult.data\n configCache.set(name, {\n ...entry,\n data: validated,\n schema,\n loadedAt: Date.now(),\n })\n\n return ok(validated)\n}\n\n/**\n * 重新加载配置并通知监听器。\n *\n * 从缓存中获取文件路径和 Schema,重新加载并触发所有 watch 回调。\n *\n * @param name - 配置名称\n * @returns 重载结果;未加载时返回 NOT_LOADED\n */\nfunction reloadAndNotify(name: string): HaiResult<unknown> {\n const entry = configCache.get(name)\n if (!entry) {\n const result = err(createNotLoadedError(name))\n notifyWatchCallbacks(name, result)\n return result\n }\n\n // 无 Schema 时直接加载 YAML(不做校验),避免 schema 为 undefined 导致运行时崩溃\n const result = entry.schema\n ? loadConfig(name, entry.filePath, entry.schema)\n : loadYaml(name, entry.filePath, entry.schemaHint)\n if (result.success) {\n configCache.set(name, {\n ...entry,\n data: result.data,\n loadedAt: Date.now(),\n })\n }\n notifyWatchCallbacks(name, result)\n return result\n}\n\n/**\n * 启动配置文件监听。\n *\n * 使用 `fs.watch` 监听父目录并筛选目标文件,支持原子替换及删除后重建。\n * 同一配置名只会创建一个 watcher,多次调用返回同一实例。\n *\n * @param name - 配置名称\n * @returns WatchEntry 实例;配置未加载时返回 null\n */\nfunction startFileWatcher(name: string): WatchEntry | null {\n const existing = watchEntries.get(name)\n if (existing)\n return existing\n\n const entry = configCache.get(name)\n if (!entry)\n return null\n\n try {\n const watchEntry: WatchEntry = {\n watcher: null!,\n callbacks: new Set(),\n debounceTimer: null,\n }\n\n const filePath = resolve(entry.filePath)\n const fileName = basename(filePath)\n // 监听目录避免绑定已被 rename 替换的旧文件;无文件名时保守地检查目标配置。\n const watcher = watch(dirname(filePath), (_eventType, changedName) => {\n if (changedName !== null && changedName.toString() !== fileName)\n return\n if (watchEntry.debounceTimer)\n clearTimeout(watchEntry.debounceTimer)\n watchEntry.debounceTimer = setTimeout(() => {\n watchEntry.debounceTimer = null\n if (watchEntries.get(name) === watchEntry)\n reloadAndNotify(name)\n }, 100)\n })\n\n watchEntry.watcher = watcher\n watchEntries.set(name, watchEntry)\n return watchEntry\n }\n catch {\n return null\n }\n}\n\n/**\n * 注册监听回调。\n *\n * 启动文件 watcher(若尚未启动)并注册回调。\n * 配置未加载时立即回调 NOT_LOADED 错误。\n *\n * @param name - 配置名称\n * @param callback - 变更回调\n * @returns 取消监听函数;调用后自动清理(无回调时关闭 watcher)\n */\nfunction registerWatch<T>(name: string, callback: WatchCallback<T>): () => void {\n const entry = startFileWatcher(name)\n if (!entry) {\n callback(null, createNotLoadedError(name))\n return () => { }\n }\n\n entry.callbacks.add(callback as WatchCallback<unknown>)\n\n return () => {\n const current = watchEntries.get(name)\n if (current !== entry)\n return\n\n current.callbacks.delete(callback as WatchCallback<unknown>)\n if (current.callbacks.size === 0) {\n if (current.debounceTimer)\n clearTimeout(current.debounceTimer)\n current.watcher.close()\n watchEntries.delete(name)\n }\n }\n}\n\n/**\n * 停止监听(内部实现)。\n *\n * @param name - 配置名称;不传则停止所有监听并清空映射\n */\nfunction stopWatching(name?: string): void {\n if (name) {\n const entry = watchEntries.get(name)\n if (entry) {\n if (entry.debounceTimer)\n clearTimeout(entry.debounceTimer)\n entry.watcher.close()\n watchEntries.delete(name)\n }\n }\n else {\n for (const entry of watchEntries.values()) {\n if (entry.debounceTimer)\n clearTimeout(entry.debounceTimer)\n entry.watcher.close()\n }\n watchEntries.clear()\n }\n}\n\n/**\n * 清理缓存(同时停止对应监听)。\n *\n * @param name - 配置名称;不传则清理全部缓存并停止所有监听\n */\nfunction clearCache(name?: string): void {\n if (name) {\n configCache.delete(name)\n stopWatching(name)\n }\n else {\n configCache.clear()\n stopWatching()\n }\n}\n\n/**\n * 配置管理对象。\n * @example 模块内部上下文\n * ```ts\n * const result = config.load('app', '/srv/app/config/app.yml')\n * if (!result.success) result.error.message\n * ```\n */\nexport const config = {\n /**\n * 合并从低到高的环境来源;高来源父项替换旧节点,同来源细项覆盖父 JSON。\n * @param layers - 按优先级排列的字面变量。\n * @returns 合并后的变量,可能含秘密。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const value = core.config.mergeEnv([{ HAI_APP_NAME: 'base' }, { HAI_APP_NAME: 'test' }])\n * ```\n */\n mergeEnv,\n /**\n * 解析 dotenv 字面文本,拒绝重复键,不执行 shell 或变量展开。\n * @param text - dotenv 文本,可能包含秘密。\n * @returns 字面变量;重复键抛出不含变量值的错误。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const value = core.config.parseEnv('HAI_APP_NAME=Example\\n')\n * ```\n */\n parseEnv: parseEnvironment,\n /**\n * 无损编码 dotenv,父变量排在细项前;含秘密时只能写入受保护文件。\n * @param values - 字面变量,不进行脱敏。\n * @param options - 输出语法目标,默认 Node dotenv。\n * @param options.target - Compose 目标同时处理其美元符号插值规则。\n * @returns dotenv 文本;非法变量名抛错。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const value = core.config.stringifyEnv({ HAI_APP_NAME: 'Example' })\n * ```\n */\n stringifyEnv,\n /**\n * 按已有结构或 Schema 解析父 JSON 和细项,不修改缓存或进程环境。\n * @param options - 配置名、原始结构、变量、可选 Schema 和缺失插值规则。\n * @returns 解析结果;调用方仍须执行最终 Schema 校验。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const value = core.config.resolve({ name: 'app', value: { name: 'Example' }, environment: { HAI_APP_NAME: 'Test' } })\n * ```\n */\n resolve: (options: Parameters<typeof resolveEnvironment>[0]) => resolveEnvironment(options),\n /**\n * 默认将对象展开为细项;数组、动态字典和空对象保留 JSON。\n * @param options - 完整变量前缀、配置值和可选 Schema。\n * @returns 字面环境变量,不脱敏;非法名称抛错。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const value = core.config.toEnv({ prefix: 'HAI_APP', value: { name: 'Example', tags: ['demo'] } })\n * ```\n */\n toEnv,\n /**\n * 读取 dotenv 文件并按统一顺序合并,不修改进程环境。\n *\n * 优先级:已有进程环境 > .env.<mode>.local > .env.local > .env.<mode> > .env。\n * development/production 分别映射到 dev/prod;不存在的文件跳过。\n * 返回值可能包含私有配置,仅在 Node 启动/构建边界注入,不下发浏览器。\n * @param options - 文件所在目录及环境模式\n * @param options.mode - dev/test/prod 或 Vite 的 development/production\n * @param options.envDir - dotenv 所在目录,默认进程工作目录\n * @returns 已合并的变量;非法模式或读取失败返回配置错误,不包含文件内容\n * @example\n * ```ts\n * const env = core.config.loadEnvFiles({ mode: 'dev', envDir: '.' })\n * if (!env.success) throw new Error(env.error.message)\n * Object.assign(process.env, env.data)\n * core.init({ configDir: './config' })\n * ```\n */\n loadEnvFiles(options: { mode: string, envDir?: string }): HaiResult<Record<string, string>> {\n const mode = options.mode === 'development'\n ? 'dev'\n : options.mode === 'production'\n ? 'prod'\n : options.mode\n if (!/^[a-z0-9][\\w-]*$/i.test(mode))\n return err(HaiConfigError.CONFIG_VALIDATION_ERROR, i18n.coreM('core_configValidationFailed'))\n const envDir = options.envDir ?? process.cwd()\n try {\n const layers: Array<Record<string, string | undefined>> = []\n for (const name of [\n '.env',\n `.env.${mode}`,\n '.env.local',\n `.env.${mode}.local`,\n ]) {\n const file = join(envDir, name)\n if (existsSync(file))\n layers.push(parseEnvironment(readFileSync(file, 'utf8')))\n }\n const declared = new Set(layers.flatMap(layer => Object.keys(layer)))\n layers.push(Object.fromEntries(Object.entries(process.env).filter(([name]) => declared.has(name) || name.startsWith('HAI_'))))\n const merged = mergeEnv(layers)\n return ok(merged)\n }\n catch {\n // dotenv 解析异常可能携带原始行,错误边界不暴露文件内容。\n return err(HaiConfigError.CONFIG_PARSE_ERROR, i18n.coreM('core_configParseFailed', {\n params: { filePath: envDir },\n }))\n }\n },\n\n /**\n * 加载配置到缓存。\n *\n * 加载 YAML 文件并可选地用 Zod Schema 校验,成功后写入缓存。\n *\n * @param name - 配置名称(缓存 key)\n * @param filePath - YAML 文件路径\n * @param schema - 可选 Zod Schema(不传则跳过校验)\n * @returns 成功时返回解析后的配置数据;失败时返回 HaiError\n *\n * @example\n * ```ts\n * const result = config.load('core', './config/_core.yml', CoreConfigSchema)\n * if (result.success) {\n * // result.data 为校验后的配置\n * }\n * ```\n */\n load<T>(name: string, filePath: string, schema?: ZodType<T>): HaiResult<T> {\n return loadAndCache(name, filePath, schema)\n },\n\n /**\n * 验证已加载的配置数据。\n *\n * 对缓存中的配置数据重新用 Schema 校验,校验通过后更新缓存。\n *\n * @param name - 配置名称\n * @param schema - Zod 验证模式\n * @returns 校验结果;未加载时返回 NOT_LOADED,格式错误返回 VALIDATION_ERROR\n *\n * @example\n * ```ts\n * const result = config.validate('app', AppSchema)\n * if (!result.success) {\n * // result.error.code 可能为 NOT_LOADED 或 VALIDATION_ERROR\n * }\n * ```\n */\n validate<T>(name: string, schema: ZodType<T>): HaiResult<T> {\n return validateLoadedConfig(name, schema)\n },\n\n /**\n * 获取已加载的配置。\n *\n * @param name - 配置名称\n * @returns 配置数据;未加载时返回 undefined\n *\n * @example\n * ```ts\n * const cfg = config.get<CoreConfig>('core')\n * if (cfg) {\n * // 使用 cfg\n * }\n * ```\n */\n get<T>(name: string): T | undefined {\n return configCache.get(name)?.data as T | undefined\n },\n\n /**\n * 获取配置,不存在时抛出错误。\n *\n * @param name - 配置名称\n * @returns 配置数据\n * @throws 配置未加载时抛出 Error\n *\n * @example\n * ```ts\n * try {\n * const cfg = config.getOrThrow<CoreConfig>('core')\n * } catch (e) {\n * // 配置未加载\n * }\n * ```\n */\n getOrThrow<T>(name: string): T {\n const data = this.get<T>(name)\n if (data === undefined) {\n throw new Error(i18n.coreM('core_configNotLoaded', {\n params: { name },\n }))\n }\n return data\n },\n\n /**\n * 重新加载配置。\n *\n * 从磁盘重新读取配置文件并更新缓存,同时通知所有 watch 回调。\n *\n * @param name - 配置名称\n * @returns 重载结果;未加载时返回 NOT_LOADED\n *\n * @example\n * ```ts\n * const result = config.reload('app')\n * ```\n */\n reload(name: string): HaiResult<unknown> {\n return reloadAndNotify(name)\n },\n\n /**\n * 检查配置是否已加载。\n *\n * @param name - 配置名称\n * @returns 是否已加载到缓存\n *\n * @example\n * ```ts\n * if (config.has('db')) {\n * const dbCfg = config.get('db')\n * }\n * ```\n */\n has(name: string): boolean {\n return configCache.has(name)\n },\n\n /**\n * 清除配置缓存(同时停止对应监听)。\n *\n * @param name - 配置名称;不传则清除全部\n *\n * @example\n * ```ts\n * config.clear('app') // 清除单个\n * config.clear() // 清除全部\n * ```\n */\n clear(name?: string): void {\n clearCache(name)\n },\n\n /**\n * 获取所有已加载的配置名称。\n *\n * @returns 配置名称数组\n *\n * @example\n * ```ts\n * const names = config.keys() // ['core', 'db', 'app']\n * ```\n */\n keys(): string[] {\n return Array.from(configCache.keys())\n },\n\n /**\n * 监听配置文件变更并自动重载。\n *\n * 普通写入、原子替换及删除重建均触发重载;失败保留最近成功的缓存并通知错误。\n * 配置未加载时立即回调 NOT_LOADED 错误。\n *\n * @param name - 配置名称\n * @param callback - 配置变更回调,接收新配置或错误\n * @returns 取消监听函数\n *\n * @example\n * ```ts\n * const unwatch = config.watch('app', (cfg, error) => {\n * if (error) { core.logger.error('reload failed', { error }); return }\n * core.logger.info('config updated', { cfg })\n * })\n * // 取消监听\n * unwatch()\n * ```\n */\n watch<T = unknown>(name: string, callback: WatchCallback<T>): () => void {\n return registerWatch(name, callback)\n },\n\n /**\n * 停止配置文件监听。\n *\n * @param name - 配置名称;不传则停止所有监听\n *\n * @example\n * ```ts\n * config.unwatch('app') // 停止单个\n * config.unwatch() // 停止全部\n * ```\n */\n unwatch(name?: string): void {\n stopWatching(name)\n },\n\n /**\n * 检查是否正在监听某个配置。\n *\n * @param name - 配置名称\n * @returns 是否有活跃的 watcher\n *\n * @example\n * ```ts\n * if (config.isWatching('app')) {\n * config.unwatch('app')\n * }\n * ```\n */\n isWatching(name: string): boolean {\n return watchEntries.has(name)\n },\n}\n","/**\n * @h-ai/core — Logger(Node.js 版本,基于 pino)\n *\n * 提供统一的日志接口,Node.js 环境使用 pino 实现。\n * @module core-function-logger.node\n */\n\nimport type { LogContext, LogFormat, Logger, LoggerFunctions, LoggerOptions, LoggingConfig, LogLevel } from '../core-types.js'\n\nimport { execSync } from 'node:child_process'\nimport { createRequire } from 'node:module'\nimport process from 'node:process'\nimport pino from 'pino'\nimport { sanitize } from '../utils/core-util-sanitize.js'\nimport { requestContext } from './core-function-context.js'\nimport { emitLogRecord, sanitizeLogFields } from './core-function-log-observer.js'\n\n// ESM 场景下通过 createRequire 复用 CommonJS 的 resolve 能力,用来探测可选依赖是否存在。\nconst nodeRequire = createRequire(import.meta.url)\n\nif (process.platform === 'win32' && process.stdout.isTTY) {\n try {\n // 强制切换控制台代码页为 UTF-8(避免 GBK/GB2312 导致的乱码)\n execSync('chcp 65001 > nul', { stdio: 'ignore' })\n\n // 设置 stdout/stderr 编码为 UTF-8\n if (process.stdout.setDefaultEncoding) {\n process.stdout.setDefaultEncoding('utf8')\n }\n if (process.stderr.setDefaultEncoding) {\n process.stderr.setDefaultEncoding('utf8')\n }\n\n // 仅调整当前终端,不改写调用方语言或子进程编码环境。\n }\n // eslint-disable-next-line unused-imports/no-unused-vars\n catch (_e) {\n // 忽略错误,某些环境可能不支持\n }\n}\n\n// ─── 全局配置 ───\n\n/** 全局日志级别(默认 'info') */\nlet globalLevel: LogLevel = 'info'\n\n/** 全局日志格式(默认 'pretty',适合开发环境) */\nlet globalFormat: LogFormat = 'pretty'\n\n/** 全局默认上下文(每条日志自动附带) */\nlet globalContext: Record<string, unknown> = {}\n\n/** 全局脱敏字段路径列表(如 ['password', 'token']) */\nlet globalRedact: string[] = []\n\n/** 格式和脱敏规则变化时,已有 Logger 在下次输出时更新底层实例。 */\nlet outputRevision = 0\n\n/** 默认 Logger 单例缓存 */\nlet defaultLogger: Logger | null = null\n\n/**\n * 配置全局 Logger 选项。\n *\n * @param config - 日志配置\n *\n * @example\n * ```ts\n * logger.configureLogger({ level: 'debug' })\n * ```\n */\nfunction configureLogger(config: Partial<LoggingConfig>): void {\n if (config.level)\n globalLevel = config.level\n if (config.format) {\n globalFormat = config.format\n outputRevision++\n }\n if (config.context) {\n globalContext = {\n ...globalContext,\n ...config.context,\n }\n }\n if (config.redact) {\n globalRedact = [...config.redact]\n outputRevision++\n }\n}\n\n/**\n * 设置全局日志级别。\n *\n * @param level - 日志级别\n *\n * @example\n * ```ts\n * logger.setLogLevel('warn')\n * ```\n */\nfunction setLogLevel(level: LogLevel): void {\n globalLevel = level\n}\n\n/**\n * 获取当前全局日志级别。\n *\n * @example\n * ```ts\n * const level = logger.getLogLevel()\n * ```\n */\nfunction getLogLevel(): LogLevel {\n return globalLevel\n}\n\nfunction sanitizeLogContext(ctx?: LogContext): LogContext | undefined {\n if (!ctx || Object.keys(ctx).length === 0) {\n return ctx\n }\n\n return sanitizeLogFields(ctx, globalRedact)\n}\n\n// ─── Logger 实现 ───\n\n/**\n * 包装 pino 实例为统一 Logger 接口。\n *\n * 将 pino 的原生方法映射为 Logger 接口,自动合并上下文。\n *\n * @param resolvePino - 当前配置对应的 pino 实例\n * @param resolveContext - 当前基础上下文(会与每次调用时的 ctx 合并)\n * @returns 统一 Logger 实例\n */\nfunction wrapPino(resolvePino: () => pino.Logger, resolveContext: () => Record<string, unknown>): Logger {\n const write = (level: LogLevel, message: string, ctx?: LogContext): void => {\n const output = resolvePino()\n if (!output.isLevelEnabled(level))\n return\n const context = sanitizeLogContext({\n ...resolveContext(),\n ...ctx,\n ...requestContext.get(),\n }) ?? {}\n message = sanitize.sanitizeText(message)\n output[level](context, message)\n if (!requestContext.get().suppressLogObservers) {\n emitLogRecord({\n timestamp: Date.now(),\n level,\n message,\n context,\n })\n }\n }\n return {\n trace(message: string, ctx?: LogContext) {\n write('trace', message, ctx)\n },\n debug(message: string, ctx?: LogContext) {\n write('debug', message, ctx)\n },\n info(message: string, ctx?: LogContext) {\n write('info', message, ctx)\n },\n warn(message: string, ctx?: LogContext) {\n write('warn', message, ctx)\n },\n error(message: string, ctx?: LogContext) {\n write('error', message, ctx)\n },\n fatal(message: string, ctx?: LogContext) {\n write('fatal', message, ctx)\n },\n child(childContext: Record<string, unknown>): Logger {\n // 只保存本地上下文,输出时继承父级的当前配置;不绑定旧 pino child。\n return wrapPino(resolvePino, () => ({\n ...resolveContext(),\n ...childContext,\n }))\n },\n }\n}\n\n/**\n * 创建 Logger 实例。\n *\n * @param options - Logger 选项\n * @returns Logger 实例\n *\n * @example\n * ```ts\n * const appLogger = logger.createLogger({ name: 'api', level: 'info' })\n * appLogger.info('ready')\n * ```\n */\nfunction createLogger(options: LoggerOptions = {}): Logger {\n const localOptions = {\n ...options,\n context: { ...options.context },\n }\n let revision = outputRevision\n let output = createPinoOutput(localOptions)\n const resolvePino = (): pino.Logger => {\n if (revision !== outputRevision) {\n const updated = createPinoOutput(localOptions)\n output.close()\n output = updated\n revision = outputRevision\n }\n const level = localOptions.level ?? globalLevel\n if (output.instance.level !== level)\n output.instance.level = level\n return output.instance\n }\n return wrapPino(resolvePino, () => ({\n ...globalContext,\n ...localOptions.context,\n }))\n}\n\n/** 底层输出只负责格式和脱敏;已有包装在输出时应用当前全局配置。 */\nfunction createPinoOutput(options: LoggerOptions): { instance: pino.Logger, close: () => void } {\n const level = options.level ?? globalLevel\n const format = options.format ?? globalFormat\n\n // 先构造一份与输出介质无关的基础配置,后面再按 transport 能力决定是否启用 pretty。\n const pinoOptions: pino.LoggerOptions = {\n level,\n name: options.name,\n formatters: {\n level: label => ({ level: label }),\n },\n }\n\n // redact 支持\n if (globalRedact.length > 0) {\n pinoOptions.redact = {\n paths: globalRedact,\n censor: '[REDACTED]',\n }\n }\n\n let pinoInstance: pino.Logger\n let transport: ReturnType<typeof pino.transport> | undefined\n\n if (format === 'pretty' && isPrettyTransportAvailable()) {\n // 只有在 pino-pretty 可解析时才挂载 transport,避免可选依赖缺失直接导致 logger 初始化失败。\n try {\n transport = pino.transport({\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'pid,hostname',\n },\n })\n pinoInstance = pino(pinoOptions, transport)\n // 日志 worker 不拥有应用生命周期;启动失败时仍由 pino 的退出钩子同步排空日志。\n // pino 的 ThreadStream 声明未包含运行时 unref,使用能力检查兼容该声明。\n if ('unref' in transport && typeof transport.unref === 'function')\n transport.unref()\n }\n catch (error) {\n // 其他初始化异常应重新抛出,便于排查\n if (isPrettyTransportUnavailable(error)) {\n pinoInstance = pino(pinoOptions)\n }\n else {\n throw error\n }\n }\n }\n else {\n pinoInstance = pino(pinoOptions)\n }\n\n return {\n instance: pinoInstance,\n close: () => transport?.end(),\n }\n}\n\nfunction isPrettyTransportAvailable(): boolean {\n try {\n // pino-pretty 是可选依赖,这里用 resolve 做能力探测,避免在缺失场景下直接 import 失败。\n nodeRequire.resolve('pino-pretty')\n return true\n }\n catch {\n return false\n }\n}\n\nfunction isPrettyTransportUnavailable(error: unknown): boolean {\n const message\n = error instanceof Error\n ? error.message\n : typeof error === 'string'\n ? error\n : ''\n\n const normalized = message.toLowerCase()\n\n return normalized.includes('pino-pretty')\n && (normalized.includes('cannot find module')\n || normalized.includes('unable to determine transport target')\n || normalized.includes('cannot load')\n || normalized.includes('not found'))\n}\n\n// ─── 默认 Logger 实例 ───\n\n/**\n * 获取默认 Logger 实例(单例)。\n *\n * @example\n * ```ts\n * const defaultLogger = logger.getLogger()\n * ```\n */\nfunction getLogger(): Logger {\n if (!defaultLogger) {\n defaultLogger = createLogger()\n }\n return defaultLogger\n}\n\n// ─── 对外出口 ───\n\n/**\n * Node.js Logger 函数集合。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const logger = core.logger.create({ name: 'orders' })\n * logger.info('Order created', { orderId: 'order-1' })\n * ```\n */\nexport const logger: LoggerFunctions = {\n configureLogger,\n setLogLevel,\n getLogLevel,\n createLogger,\n getLogger,\n}\n","/**\n * @h-ai/core — Core 服务聚合(Node.js)\n *\n * 提供 Node.js 环境的 core 对象,聚合常用功能。 所有功能统一通过 core 对象访问,并提供配置加载能力。\n * @module core-main.node\n */\n\nimport type { CoreOptions, NodeCoreFunctions } from './core-types.js'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { Buffer } from 'node:buffer'\nimport { timingSafeEqual } from 'node:crypto'\nimport { existsSync, readdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { CoreConfigSchema } from './core-config.js'\nimport { createCore } from './core-main.js'\nimport { access } from './functions/core-function-access.node.js'\nimport { config, loadConfigStructure } from './functions/core-function-config.node.js'\nimport { installRequestContext } from './functions/core-function-context.js'\nimport { logger } from './functions/core-function-logger.node.js'\nimport { installRequestLocales } from './i18n/core-i18n-utils.js'\n\n// 请求语言跨 await 保持隔离,避免并行 SSR 修改另一个请求的默认语言。\ninstallRequestLocales(new AsyncLocalStorage())\ninstallRequestContext(new AsyncLocalStorage())\n\nconst YAML_EXTENSION_REGEX = /\\.ya?ml$/\n// ─── Core 实例 ───\n\n/**\n * 创建 Node.js 版本的 core 对象。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.logger.info('ready')\n * ```\n */\nfunction createNodeCore(): NodeCoreFunctions {\n const baseCore = createCore({\n createLogger: logger.createLogger,\n getLogger: logger.getLogger,\n configureLogger: logger.configureLogger,\n setLogLevel: logger.setLogLevel,\n getLogLevel: logger.getLogLevel,\n })\n\n // 扩展 config 和 init 功能\n return {\n ...baseCore,\n /** Node 专属的可信地址、策略文件读取与已编译访问检查。 */\n access,\n string: {\n ...baseCore.string,\n /**\n * Node 凭证比较使用原生恒时原语;不同长度直接失败,长度本身不受保护。\n * UTF-16LE 保留孤立代理项,避免 UTF-8 替换字符把两个不同字符串误判为相等。\n * @param a - 第一个原始字符串,不做 Unicode 归一化。\n * @param b - 第二个原始字符串,不做 Unicode 归一化。\n * @returns 字符串的 UTF-16 单元是否完全一致。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * const matches = core.string.constantTimeEqual('example-only', 'example-only')\n * ```\n */\n constantTimeEqual(a: string, b: string): boolean {\n return a.length === b.length && timingSafeEqual(Buffer.from(a, 'utf16le'), Buffer.from(b, 'utf16le'))\n },\n },\n /** Zod 校验错误 → i18n 消息映射工具(kit / serv / api-client 共享)。 */\n zodValidation: baseCore.zodValidation,\n /** 配置管理 */\n config,\n /** 初始化 Core */\n init: initCore,\n }\n}\n\n/**\n * Core 服务对象 - 聚合常用功能(Node.js)。\n * @example\n * ```ts\n * import { core, CoreConfigSchema } from '@h-ai/core'\n * core.init({ configDir: './config' }) // 单项加载失败记录日志并继续。\n * const required = core.config.validate('core', CoreConfigSchema)\n * if (!required.success) core.logger.error('Required config unavailable', { error: required.error })\n * else core.logger.info('Application ready', { name: required.data.name })\n * ```\n */\nexport const core: NodeCoreFunctions = createNodeCore()\n\n// ─── Initialization ───\n\n/**\n * 配置加载项(描述单个待加载的配置文件)。\n * @example 模块内部上下文\n * ```ts\n * const item: ConfigLoadItem = { name: 'core', filePath: join('/srv/app', 'config', '_core.yml') }\n * const cacheName = item.name\n * ```\n */\ninterface ConfigLoadItem {\n /** 配置名称(用作缓存 key,如 'core'、'db'、'app') */\n name: string\n /** 配置文件绝对路径 */\n filePath: string\n}\n\n/**\n * 扫描配置目录并构建配置加载项列表。\n *\n * 约定:\n * - 以 `_` 开头的文件为内置模块配置(如 `_core.yml` → name='core')\n * - 其他文件为业务配置(如 `app.yml` → name='app')\n *\n * @param configDir - 配置目录路径\n * @returns 配置加载项列表;目录不存在时返回空数组并输出警告\n * @throws 目录存在但不可读取等文件系统异常会向调用方传播。\n *\n * @example 模块内部上下文\n * ```ts\n * const items = scanConfigDir('./config')\n * core.logger.debug('Runtime configs selected', { names: items.map(item => item.name) })\n * ```\n */\nfunction scanConfigDir(\n configDir: string,\n): ConfigLoadItem[] {\n const logger = core.logger\n const items: ConfigLoadItem[] = []\n\n if (!existsSync(configDir)) {\n logger.warn(`[core] Config directory not found: ${configDir}`)\n return items\n }\n\n const files = readdirSync(configDir).filter(f =>\n f.endsWith('.yml') || f.endsWith('.yaml'),\n )\n\n for (const file of files) {\n const filePath = join(configDir, file)\n const baseName = file.replace(YAML_EXTENSION_REGEX, '')\n\n // 判断是否为内置模块配置(以 _ 开头)\n if (baseName.startsWith('_')) {\n const moduleName = baseName.slice(1) // 去掉 _ 前缀\n items.push({\n name: moduleName,\n filePath,\n })\n }\n else {\n // 业务配置(文件名作为配置名)\n items.push({\n name: baseName,\n filePath,\n })\n }\n }\n return items\n}\n\n/**\n * 初始化 Core(内部实现,通过 `core.init()` 调用)。\n *\n * 执行流程:\n * 1. 配置日志(若提供 `options.logging`)\n * 2. 扫描并加载配置目录中的所有 YAML\n * 3. 启用配置文件监听(若 `options.watchConfig` 为 true)\n *\n * 单项 `config.load` 返回失败时记录日志并继续;必需配置由调用方 `config.validate` 并检查 success。\n *\n * @param options - 初始化选项\n * @throws 目录扫描、日志设置等异常仍会传播;不把单项配置的失败结果改为异常。\n *\n * @example 模块内部上下文\n * ```ts\n * core.init({ configDir: './config', watchConfig: true })\n * const required = core.config.validate('core', CoreConfigSchema)\n * if (!required.success) core.logger.error('Required config unavailable', { error: required.error })\n * ```\n */\nfunction initCore(options: CoreOptions = {}): void {\n const startTime = Date.now()\n const logger = core.logger\n\n // 1. Configure logging\n if (options.logging) {\n core.logger.configure(options.logging)\n }\n\n let configItems: ConfigLoadItem[] = []\n\n if (options.configDir) {\n // 约定优于配置模式\n configItems = scanConfigDir(options.configDir)\n }\n\n // 先应用 core 的日志配置,避免其它配置加载日志使用初始化前的级别与格式。\n configItems.sort((left, right) => Number(right.name === 'core') - Number(left.name === 'core'))\n\n // 2. Load config files\n for (const item of configItems) {\n if (item.name === 'core') {\n const result = config.load(item.name, item.filePath, CoreConfigSchema)\n if (result.success) {\n if (!options.logging) {\n core.logger.configure(result.data.logging || {})\n }\n logger.info(`[core] Config loaded: ${item.name} <- ${item.filePath}`)\n }\n else {\n logger.error(`[core] Config load failed: ${item.name}`, {\n error: result.error,\n })\n }\n }\n else {\n const result = loadConfigStructure(item.name, item.filePath, options.configSchemas?.[item.name])\n if (result.success) {\n logger.info(`[core] Config loaded: ${item.name} <- ${item.filePath}`)\n }\n else {\n logger.error(`[core] Config load failed: ${item.name}`, {\n error: result.error,\n })\n }\n }\n }\n\n // 3. Enable config file watching\n if (options.watchConfig && configItems.length > 0) {\n setupConfigWatch(configItems)\n }\n\n const duration = Date.now() - startTime\n logger.info(`[core] Initialized (${duration}ms)`)\n}\n\n/**\n * 启用配置文件监听。\n *\n * 为每个已加载的配置项注册文件 watcher,变更时自动重载并输出日志。\n *\n * @param configs - 需要监听的配置项列表\n */\nfunction setupConfigWatch(configs: ConfigLoadItem[]): void {\n const logger = core.logger\n\n for (const item of configs) {\n config.watch(item.name, (_config, error) => {\n if (error) {\n logger.error(`[core] Config reload failed: ${item.name}`, { error })\n return\n }\n logger.info(`[core] Config reloaded: ${item.name}`)\n })\n\n logger.debug(`[core] Config watch enabled: ${item.name}`)\n }\n}\n"]}