@h-ai/core 0.1.0-alpha.68 → 0.1.0-alpha.69

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/README.en.md CHANGED
@@ -284,7 +284,7 @@ if (!result.success) {
284
284
 
285
285
  > Browsers have no filesystem access. `core.config` offers placeholder APIs only: file-related methods return `SERVICE_UNAVAILABLE` and do not load YAML.
286
286
 
287
- Node automatically loads and watches runtime `.yml` / `.yaml` files, excluding exactly `_deploy.yml` and `_deploy.yaml`. The deployment CLI parses those reserved files after loading its target environment and credentials. Business `deploy.yml` and explicit `core.config.load` remain supported. A failed per-file load result is logged and loading continues; applications must validate required configuration and check `success`. Directory scanning, logger setup and other exceptions may still propagate.
287
+ Node automatically loads and watches all `.yml` / `.yaml` files in the configuration directory. The CLI reads `build` / `deploy` from the project root `hai.json`; no YAML filename needs special handling. A failed per-file load result is logged and loading continues; applications must validate required configuration and check `success`. Directory scanning, logger setup and other exceptions may still propagate.
288
288
 
289
289
  ```typescript
290
290
  import { core, HaiConfigError } from '@h-ai/core'
@@ -292,7 +292,7 @@ import { z } from 'zod'
292
292
 
293
293
  // 方式 1:init 时自动加载运行时配置
294
294
  core.init({
295
- configDir: './config', // 扫描 .yml / .yaml,排除 _deploy.yml / _deploy.yaml
295
+ configDir: './config', // 扫描配置目录内所有 .yml / .yaml
296
296
  watchConfig: true, // 监听变更并自动重载
297
297
  })
298
298
 
@@ -583,6 +583,31 @@ pnpm --filter @h-ai/core test
583
583
 
584
584
  See the [module JSDoc conventions (Chinese)](../../.agents/instructions/module-conventions.md#jsdoc-与示例验证) for declaration comments and compilable examples. Node core.init is synchronous and returns void. A failed per-file config.load result is logged and loading continues; validate required configuration and check success. Directory scanning and other exceptions may still throw. Business HaiResult APIs require a success check.
585
585
 
586
+ ## Request correlation and log observation
587
+
588
+ Collection persistence and upload paths can use `core.context.run({ suppressLogObservers: true }, operation)` to prevent observing their own asynchronous logs. Normal output such as stdout remains enabled; observation resumes outside the scope.
589
+
590
+ `core.logger.observe` receives records permitted by the current log level after default and custom field redaction, and returns an unsubscribe function. Subscribers should collect into bounded memory and persist asynchronously; observation does not imply persistence. Observer failures and synchronous reentry are isolated. Free text and images still require capture-specific privacy rules.
591
+
592
+ On Node, `core.context.run` uses AsyncLocalStorage to isolate concurrent requests and child tasks. Existing module loggers inherit requestId/userId/scopeId/jobId. Only trusted server code supplies identities; correlation IDs do not authorize access. The browser exposes the same API but run only establishes a synchronous scope, without isolation across await.
593
+
594
+ ```ts
595
+ import type { LogRecord } from '@h-ai/core'
596
+ import { core } from '@h-ai/core'
597
+
598
+ const records: LogRecord[] = []
599
+ const unsubscribe = core.logger.observe((record) => {
600
+ if (records.length === 100)
601
+ records.shift()
602
+ records.push(record)
603
+ })
604
+ await core.context.run({ requestId: 'request-1', scopeId: 'tenant-1', userId: 'user-1' }, async () => {
605
+ await Promise.resolve()
606
+ core.logger.warn('Business operation failed')
607
+ })
608
+ unsubscribe()
609
+ ```
610
+
586
611
  ## License
587
612
 
588
613
  Apache-2.0
package/README.ja.md CHANGED
@@ -284,7 +284,7 @@ if (!result.success) {
284
284
 
285
285
  > ブラウザーにはファイルシステムがないため、`core.config` は代替 API の形状のみを提供します。ファイル関連メソッドは `SERVICE_UNAVAILABLE` を返し、YAML を読み込みません。
286
286
 
287
- Node は実行時の `.yml` / `.yaml` を自動読み込み・監視しますが、予約名 `_deploy.yml` と `_deploy.yaml` は除外します。これらはデプロイ CLI が対象環境と認証情報の読み込み後に個別解析します。業務用 `deploy.yml` と明示的な `core.config.load` は引き続き利用できます。単一ファイルの失敗結果はログに記録して続行するため、アプリは必須設定を validate して `success` を確認してください。ディレクトリー走査や Logger 設定などの例外は伝播する場合があります。
287
+ Node は設定ディレクトリー内のすべての `.yml` / `.yaml` を自動読み込み・監視します。CLI はプロジェクトルートの `hai.json` から `build` / `deploy` を読み取り、特別扱いする YAML ファイル名はありません。単一ファイルの失敗結果はログに記録して続行するため、アプリは必須設定を validate して `success` を確認してください。ディレクトリー走査や Logger 設定などの例外は伝播する場合があります。
288
288
 
289
289
  ```typescript
290
290
  import { core, HaiConfigError } from '@h-ai/core'
@@ -292,7 +292,7 @@ import { z } from 'zod'
292
292
 
293
293
  // 方式 1:init 时自动加载运行时配置
294
294
  core.init({
295
- configDir: './config', // 扫描 .yml / .yaml,排除 _deploy.yml / _deploy.yaml
295
+ configDir: './config', // 扫描配置目录内所有 .yml / .yaml
296
296
  watchConfig: true, // 监听变更并自动重载
297
297
  })
298
298
 
@@ -583,6 +583,31 @@ pnpm --filter @h-ai/core test
583
583
 
584
584
  宣言の注釈と型検査できる例は [JSDoc 規約(中国語)](../../.agents/instructions/module-conventions.md#jsdoc-与示例验证) を参照してください。Node core.init は同期的に void を返します。単一ファイルの config.load 失敗結果は記録して続行するため、必須設定は validate して success を確認してください。ディレクトリー走査などの例外は伝播する場合があります。業務 HaiResult API は success を先に確認します。
585
585
 
586
+ ## リクエスト関連付けとログの監視
587
+
588
+ 収集側の保存・アップロード処理は `core.context.run({ suppressLogObservers: true }, operation)` で自身の非同期ログ監視を一時停止できます。stdout など通常の出力は維持し、スコープ外では監視を再開します。
589
+
590
+ `core.logger.observe` は現在のレベルと既定・追加フィールドのマスキングを通過したレコードを受け取り、購読解除関数を返します。購読側は上限付きメモリに収集して非同期で保存してください。監視は永続化の完了を意味しません。コールバックの失敗と同期再入は業務処理から隔離されます。自由文や画像には収集側の追加プライバシー処理が必要です。
591
+
592
+ Node の `core.context.run` は AsyncLocalStorage で並行リクエストと子タスクを隔離し、既存 logger に requestId/userId/scopeId/jobId を付加します。認証範囲は信頼できるサーバーからのみ設定し、関連 ID を認可に使用しません。ブラウザーは同じ API を公開しますが、run は同期スコープのみで await をまたぐ隔離を提供しません。
593
+
594
+ ```ts
595
+ import type { LogRecord } from '@h-ai/core'
596
+ import { core } from '@h-ai/core'
597
+
598
+ const records: LogRecord[] = []
599
+ const unsubscribe = core.logger.observe((record) => {
600
+ if (records.length === 100)
601
+ records.shift()
602
+ records.push(record)
603
+ })
604
+ await core.context.run({ requestId: 'request-1', scopeId: 'tenant-1', userId: 'user-1' }, async () => {
605
+ await Promise.resolve()
606
+ core.logger.warn('Business operation failed')
607
+ })
608
+ unsubscribe()
609
+ ```
610
+
586
611
  ## ライセンス
587
612
 
588
613
  Apache-2.0
package/README.md CHANGED
@@ -284,7 +284,7 @@ if (!result.success) {
284
284
 
285
285
  > 浏览器端没有文件系统,`core.config` 仅提供占位 API:文件相关方法返回 `SERVICE_UNAVAILABLE`,不会加载 YAML。
286
286
 
287
- Node 自动加载和监听运行时 `.yml` / `.yaml`,精确跳过保留文件 `_deploy.yml`、`_deploy.yaml`;部署 CLI 在加载目标环境与凭据后独立解析它们。业务 `deploy.yml` 仍自动加载,手动 `core.config.load` 不受影响。单项加载返回失败时记录错误并继续,必需配置由应用调用 `core.config.validate` 并检查 `success`;目录扫描、日志设置等异常仍可能传播。
287
+ Node 自动加载和监听配置目录内所有 `.yml` / `.yaml`,没有保留文件名例外。项目根 `hai.json` 中的 `build` / `deploy` 由 CLI 读取,不进入运行时 YAML 配置。单项加载返回失败时记录错误并继续,必需配置由应用调用 `core.config.validate` 并检查 `success`;目录扫描、日志设置等异常仍可能传播。
288
288
 
289
289
  ```typescript
290
290
  import { core, HaiConfigError } from '@h-ai/core'
@@ -292,7 +292,7 @@ import { z } from 'zod'
292
292
 
293
293
  // 方式 1:init 时自动加载运行时配置
294
294
  core.init({
295
- configDir: './config', // 扫描 .yml / .yaml,排除 _deploy.yml / _deploy.yaml
295
+ configDir: './config', // 扫描配置目录内所有 .yml / .yaml
296
296
  watchConfig: true, // 监听变更并自动重载
297
297
  })
298
298
 
@@ -583,6 +583,31 @@ pnpm --filter @h-ai/core test
583
583
 
584
584
  公开声明和内部结构的注释及可编译示例见[模块 JSDoc 约定](../../.agents/instructions/module-conventions.md#jsdoc-与示例验证)。Node core.init 同步返回 void;单项 config.load 返回失败时记录错误并继续,必需配置须 validate 并检查 success。目录扫描等异常仍可能抛出;模块业务 HaiResult 则先检查 success。
585
585
 
586
+ ## 请求关联与日志观察
587
+
588
+ 采集器内部的持久化/上传路径可使用 `core.context.run({ suppressLogObservers: true }, operation)` 暂停观察回调,避免异步采集自身日志;stdout 等常规日志输出保持生效,退出作用域后恢复。
589
+
590
+ `core.logger.observe` 观察当前级别允许且已执行默认/自定义字段脱敏的记录,返回取消函数。订阅者应只做有界内存收集,再异步持久化;日志观察本身不代表已经保存。回调异常和同步重入不影响业务。自由文本与图像仍需采集侧的专门隐私策略。
591
+
592
+ `core.context.run` 在 Node 中用 AsyncLocalStorage 隔离并发请求和子任务,现有模块 logger 自动附带当前 requestId/userId/scopeId/jobId。身份范围只来自可信服务端代码;关联 ID 不是授权。浏览器保持同一 API,但 run 只建立同步作用域,不能用于跨 await 的身份隔离。
593
+
594
+ ```ts
595
+ import type { LogRecord } from '@h-ai/core'
596
+ import { core } from '@h-ai/core'
597
+
598
+ const records: LogRecord[] = []
599
+ const unsubscribe = core.logger.observe((record) => {
600
+ if (records.length === 100)
601
+ records.shift()
602
+ records.push(record)
603
+ })
604
+ await core.context.run({ requestId: 'request-1', scopeId: 'tenant-1', userId: 'user-1' }, async () => {
605
+ await Promise.resolve()
606
+ core.logger.warn('Business operation failed')
607
+ })
608
+ unsubscribe()
609
+ ```
610
+
586
611
  ## 许可证
587
612
 
588
613
  Apache-2.0
package/dist/browser.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { H as HaiResult, W as WatchCallback, C as CoreOptions, a as CoreLogger, I as I18nFn, z as zodValidation, b as IdFn, T as TypeUtilFn, O as ObjectFn, S as SanitizeFn, c as StringFn, A as ArrayFn, d as AsyncFn, e as TimeFn, E as ErrorFn, M as ModuleFn } from './core-function-config.node-DJ6Hb1ee.js';
2
- export { f as CoreConfig, g as CoreConfigSchema, h as CoreFunctions, i as Env, j as EnvSchema, k as ErrorInfo, l as ErrorInfoValue, m as HaiCommonError, n as HaiConfigError, o as HaiError, p as HaiErrorDef, q as InterpolationParams, L as Locale, r as LocaleInfo, s as LocaleMessages, t as LogContext, u as LogFormat, v as LogFormatSchema, w as LogLevel, x as LogLevelSchema, y as Logger, B as LoggerFunctions, D as LoggerOptions, F as LoggingConfig, G as LoggingConfigSchema, J as MatchHandlers, K as MessageDictionary, N as MessageOptions, P as PaginatedResult, Q as PaginationOptions, R as PaginationOptionsInput, V as ValidationFormError, Z as ZodMessageGetter, U as ZodValidationFn, X as ZodValidationMessageKey, Y as err, _ as ok } from './core-function-config.node-DJ6Hb1ee.js';
1
+ import { H as HaiResult, W as WatchCallback, C as CoreOptions, R as RequestContext, a as CoreLogger, I as I18nFn, z as zodValidation, b as IdFn, T as TypeUtilFn, O as ObjectFn, S as SanitizeFn, c as StringFn, A as ArrayFn, d as AsyncFn, e as TimeFn, E as ErrorFn, M as ModuleFn } from './core-function-config.node-CGXWsohk.js';
2
+ export { f as CoreConfig, g as CoreConfigSchema, h as CoreFunctions, i as Env, j as EnvSchema, k as ErrorInfo, l as ErrorInfoValue, m as HaiCommonError, n as HaiConfigError, o as HaiError, p as HaiErrorDef, q as InterpolationParams, L as Locale, r as LocaleInfo, s as LocaleMessages, t as LogContext, u as LogFormat, v as LogFormatSchema, w as LogLevel, x as LogLevelSchema, y as LogObserver, B as LogRecord, D as Logger, F as LoggerFunctions, G as LoggerOptions, J as LoggingConfig, K as LoggingConfigSchema, N as MatchHandlers, P as MessageDictionary, Q as MessageOptions, U as PaginatedResult, V as PaginationOptions, X as PaginationOptionsInput, Y as ValidationFormError, Z as ZodMessageGetter, _ as ZodValidationFn, $ as ZodValidationMessageKey, a0 as err, a1 as ok } from './core-function-config.node-CGXWsohk.js';
3
3
  import * as zod from 'zod';
4
4
 
5
5
  /**
@@ -32,6 +32,10 @@ declare const core: {
32
32
  };
33
33
  /** 初始化 Core */
34
34
  init: typeof initCore;
35
+ context: {
36
+ readonly get: () => Readonly<RequestContext>;
37
+ readonly run: <T>(context: RequestContext, operation: () => T) => T;
38
+ };
35
39
  logger: CoreLogger;
36
40
  i18n: I18nFn;
37
41
  zodValidation: typeof zodValidation;
@@ -60,4 +64,4 @@ declare const core: {
60
64
  */
61
65
  declare function initCore(options?: CoreOptions): void;
62
66
 
63
- export { CoreLogger, CoreOptions, HaiResult, core };
67
+ export { CoreLogger, CoreOptions, HaiResult, RequestContext, core };
package/dist/browser.js CHANGED
@@ -1,5 +1,5 @@
1
- import { __commonJS, __toESM, createCore, i18n, err, HaiCommonError, sanitize } from './chunk-AWUFXC35.js';
2
- export { CoreConfigSchema, EnvSchema, HaiCommonError, HaiConfigError, LogFormatSchema, LogLevelSchema, LoggingConfigSchema, err, ok } from './chunk-AWUFXC35.js';
1
+ import { __commonJS, __toESM, createCore, i18n, err, HaiCommonError, requestContext, emitLogRecord, sanitize } from './chunk-MUQFCAQ5.js';
2
+ export { CoreConfigSchema, EnvSchema, HaiCommonError, HaiConfigError, LogFormatSchema, LogLevelSchema, LoggingConfigSchema, err, ok } from './chunk-MUQFCAQ5.js';
3
3
 
4
4
  // ../../node_modules/loglevel/lib/loglevel.js
5
5
  var require_loglevel = __commonJS({
@@ -373,25 +373,37 @@ function formatMessage(message, context, format = globalFormat, level = "info")
373
373
  return `${message} ${JSON.stringify(sanitizedContext)}`;
374
374
  }
375
375
  function wrapLoglevel(resolveLogger, resolveContext, resolveFormat) {
376
+ const write = (level, message, ctx) => {
377
+ const output = resolveLogger();
378
+ const priorities = { trace: 0, debug: 1, info: 2, warn: 3, error: 4, fatal: 4 };
379
+ if (priorities[level] < output.getLevel())
380
+ return;
381
+ const context = sanitizeLogContext({ ...resolveContext(), ...ctx, ...requestContext.get() }) ?? {};
382
+ const text = formatMessage(message, context, resolveFormat(), level);
383
+ if (level === "fatal")
384
+ output.error(resolveFormat() === "json" ? text : `[FATAL] ${text}`);
385
+ else output[level](text);
386
+ if (!requestContext.get().suppressLogObservers)
387
+ emitLogRecord({ timestamp: Date.now(), level, message, context });
388
+ };
376
389
  return {
377
390
  trace(message, ctx) {
378
- resolveLogger().trace(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), "trace"));
391
+ write("trace", message, ctx);
379
392
  },
380
393
  debug(message, ctx) {
381
- resolveLogger().debug(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), "debug"));
394
+ write("debug", message, ctx);
382
395
  },
383
396
  info(message, ctx) {
384
- resolveLogger().info(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), "info"));
397
+ write("info", message, ctx);
385
398
  },
386
399
  warn(message, ctx) {
387
- resolveLogger().warn(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), "warn"));
400
+ write("warn", message, ctx);
388
401
  },
389
402
  error(message, ctx) {
390
- resolveLogger().error(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), "error"));
403
+ write("error", message, ctx);
391
404
  },
392
405
  fatal(message, ctx) {
393
- const text = formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), "fatal");
394
- resolveLogger().error(resolveFormat() === "json" ? text : `[FATAL] ${text}`);
406
+ write("fatal", message, ctx);
395
407
  },
396
408
  child(childContext) {
397
409
  return wrapLoglevel(resolveLogger, () => ({ ...resolveContext(), ...childContext }), resolveFormat);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/loglevel/lib/loglevel.js","../src/functions/core-function-config.browser.ts","../src/functions/core-function-logger.browser.ts","../src/core-main.browser.ts"],"names":["defaultLogger","getLogger","logger","config","log"],"mappings":"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","file":"browser.js","sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","/**\n * @h-ai/core — 配置管理(浏览器占位实现)\n *\n * 浏览器环境没有文件系统,不能加载 / 监听 YAML 配置文件。\n * 该实现保持 `core.config` API 形态与 Node.js 一致,但所有文件相关操作\n * 都返回明确的 SERVICE_UNAVAILABLE,避免运行时出现 `core.config` 为 undefined。\n * @module core-function-config.browser\n */\n\nimport type { ZodType } from 'zod'\nimport type { HaiError, HaiResult } from '../core-types.js'\nimport type { ConfigFn, WatchCallback } from './core-function-config.node.js'\nimport { err, HaiCommonError } from '../core-types.js'\nimport { i18n } from '../i18n/core-i18n-utils.js'\n\nfunction unsupported<T>(): HaiResult<T> {\n return err(\n HaiCommonError.SERVICE_UNAVAILABLE,\n i18n.coreM('core_configUnsupportedInBrowser'),\n )\n}\n\nfunction unsupportedError(): HaiError {\n const result = unsupported<never>()\n if (!result.success)\n return result.error\n throw new Error(i18n.coreM('core_configUnsupportedInBrowser'))\n}\n\n/**\n * 浏览器端 config 占位对象,API 与 Node.js config 保持一致。\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: ConfigFn = {\n loadEnvFiles(_options: { mode: string, envDir?: string }): HaiResult<Record<string, string>> {\n return unsupported<Record<string, string>>()\n },\n load<T>(_name: string, _filePath: string, _schema?: ZodType<T>): HaiResult<T> {\n return unsupported<T>()\n },\n\n validate<T>(_name: string, _schema: ZodType<T>): HaiResult<T> {\n return unsupported<T>()\n },\n\n get<T>(_name: string): T | undefined {\n return undefined\n },\n\n getOrThrow<T>(_name: string): T {\n throw new Error(i18n.coreM('core_configUnsupportedInBrowser'))\n },\n\n reload(_name: string): HaiResult<unknown> {\n return unsupported<unknown>()\n },\n\n has(_name: string): boolean {\n return false\n },\n\n clear(_name?: string): void {\n // 浏览器端无配置缓存,无需操作。\n },\n\n keys(): string[] {\n return []\n },\n\n watch<T = unknown>(_name: string, callback: WatchCallback<T>): () => void {\n callback(null, unsupportedError())\n return () => { }\n },\n\n unwatch(_name?: string): void {\n // 浏览器端无 watcher,无需操作。\n },\n\n isWatching(_name: string): boolean {\n return false\n },\n}\n\n/**\n * config 子工具类型\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 type BrowserConfigFn = typeof config\n","/**\n * @h-ai/core — Logger(浏览器版本,基于 loglevel)\n *\n * 提供统一的日志接口,浏览器环境使用 loglevel 实现。\n * @module core-function-logger.browser\n */\n\nimport type { LogFormat, LoggingConfig, LogLevel } from '../core-config.js'\nimport type { LogContext, Logger, LoggerFunctions, LoggerOptions } from '../core-types.js'\nimport log from 'loglevel'\nimport { sanitize as sanitizeUtils } from '../utils/core-util-sanitize.js'\n\n// ─── 全局配置 ───\n\n/** 全局日志级别(默认 'info') */\nlet globalLevel: LogLevel = 'info'\n\n/** 浏览器默认可读输出;可配置 JSON 格式用于采集。 */\nlet globalFormat: LogFormat = 'pretty'\n\n/** 附加脱敏路径,与默认凭据脱敏同时生效。 */\nlet globalRedact: string[] = []\n\n/** 全局默认上下文(每条日志自动附带) */\nlet globalContext: Record<string, unknown> = {}\n\n/** 默认 Logger 单例缓存 */\nlet defaultLogger: Logger | null = null\n\n/**\n * LogLevel 到 loglevel 库级别的映射。\n *\n * loglevel 不支持 fatal,映射为 error。\n */\nconst LEVEL_MAP: Record<LogLevel, log.LogLevelDesc> = {\n trace: 'trace',\n debug: 'debug',\n info: 'info',\n warn: 'warn',\n error: 'error',\n fatal: 'error', // loglevel 没有 fatal\n}\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 log.setLevel(LEVEL_MAP[config.level])\n }\n if (config.context) {\n globalContext = { ...globalContext, ...config.context }\n }\n if (config.format)\n globalFormat = config.format\n if (config.redact)\n globalRedact = [...config.redact]\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 log.setLevel(LEVEL_MAP[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 const sanitized = sanitizeUtils.sanitizeSensitiveFields(ctx)\n for (const path of globalRedact)\n redactPath(sanitized, path.match(/\\*|[^.[\\]\"']+/g) ?? [])\n return sanitized\n}\n\n/** 在已脱敏的副本上处理点/括号路径和通配符,不修改调用方原始对象。 */\nfunction redactPath(value: unknown, segments: string[]): void {\n if (!value || typeof value !== 'object' || segments.length === 0)\n return\n const record = value as Record<string, unknown>\n const [segment, ...rest] = segments\n const keys = segment === '*' ? Object.keys(record) : [segment!]\n for (const key of keys) {\n if (!Object.hasOwn(record, key) || ['__proto__', 'constructor', 'prototype'].includes(key))\n continue\n if (rest.length === 0)\n record[key] = '[REDACTED]'\n else redactPath(record[key], rest)\n }\n}\n\n// ─── Logger 实现 ───\n\n/**\n * 格式化日志消息。\n *\n * 将消息文本与上下文拼接为单行输出(上下文序列化为 JSON)。\n *\n * @param message - 日志文本\n * @param context - 日志上下文(空对象时不输出)\n * @returns 格式化后的字符串\n */\nfunction formatMessage(message: string, context?: LogContext, format: LogFormat = globalFormat, level: LogLevel = 'info'): string {\n const sanitizedContext = sanitizeLogContext(context)\n\n if (format === 'json')\n return JSON.stringify({ ...sanitizedContext, level, msg: message })\n\n if (!sanitizedContext || Object.keys(sanitizedContext).length === 0) {\n return message\n }\n return `${message} ${JSON.stringify(sanitizedContext)}`\n}\n\n/**\n * 创建 Logger 包装。\n *\n * 将 loglevel 实例包装为统一 Logger 接口,自动合并基础上下文。\n *\n * @param resolveLogger - 当前级别的 loglevel 实例\n * @param resolveContext - 当前基础上下文(会与每次调用时的 ctx 合并)\n * @param resolveFormat - 当前输出格式\n * @returns 统一 Logger 实例\n */\nfunction wrapLoglevel(resolveLogger: () => log.Logger, resolveContext: () => Record<string, unknown>, resolveFormat: () => LogFormat): Logger {\n return {\n trace(message: string, ctx?: LogContext) {\n resolveLogger().trace(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'trace'))\n },\n debug(message: string, ctx?: LogContext) {\n resolveLogger().debug(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'debug'))\n },\n info(message: string, ctx?: LogContext) {\n resolveLogger().info(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'info'))\n },\n warn(message: string, ctx?: LogContext) {\n resolveLogger().warn(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'warn'))\n },\n error(message: string, ctx?: LogContext) {\n resolveLogger().error(formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'error'))\n },\n fatal(message: string, ctx?: LogContext) {\n const text = formatMessage(message, { ...resolveContext(), ...ctx }, resolveFormat(), 'fatal')\n resolveLogger().error(resolveFormat() === 'json' ? text : `[FATAL] ${text}`)\n },\n child(childContext: Record<string, unknown>): Logger {\n return wrapLoglevel(resolveLogger, () => ({ ...resolveContext(), ...childContext }), resolveFormat)\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: 'web' })\n * appLogger.info('ready')\n * ```\n */\nfunction createLogger(options: LoggerOptions = {}): Logger {\n const { name, level, format } = options\n const context = { ...options.context }\n\n // 创建或获取 logger 实例\n const loggerInstance = name ? log.getLogger(name) : log\n\n const resolveLogger = (): log.Logger => {\n const effectiveLevel = LEVEL_MAP[level ?? globalLevel]\n if (loggerInstance.getLevel() !== log.levels[String(effectiveLevel).toUpperCase() as keyof typeof log.levels])\n loggerInstance.setLevel(effectiveLevel)\n return loggerInstance\n }\n resolveLogger()\n return wrapLoglevel(resolveLogger, () => ({ ...globalContext, ...context }), () => format ?? globalFormat)\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 * 浏览器 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 服务聚合(浏览器)\n *\n * 提供浏览器环境的 core 对象,聚合常用功能。 所有功能统一通过 core 对象访问;文件配置方法保留明确失败的占位接口。\n * @module core-main.browser\n */\n\nimport type { CoreOptions } from './core-types.js'\nimport { createCore } from './core-main.js'\nimport { config } from './functions/core-function-config.browser.js'\nimport { logger } from './functions/core-function-logger.browser.js'\n\n// ─── Core 实例 ───\n\n/**\n * 创建 Browser 版本的 core 对象。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.logger.info('ready')\n * ```\n */\nfunction createBrowserCore() {\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 功能;浏览器端 config 为占位实现,返回明确不支持错误。\n return {\n ...baseCore,\n /** 配置管理(浏览器端不支持文件配置,方法返回 SERVICE_UNAVAILABLE) */\n config,\n /** 初始化 Core */\n init: initCore,\n }\n}\n\n/**\n * Core 服务对象 - 聚合常用功能(浏览器)。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.init({ logging: { level: 'info' } })\n * core.logger.info('Browser ready')\n * ```\n */\nexport const core = createBrowserCore()\n\n/**\n * 初始化 Core(内部实现,通过 core.init() 调用)。\n * 注意:浏览器环境不支持 config 和 watchConfig 选项。\n *\n * @param options - 初始化选项\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.init({ logging: { level: 'debug' } })\n * ```\n */\nfunction initCore(options: CoreOptions = {}): void {\n const logger = core.logger\n\n // 配置日志\n if (options.logging) {\n core.logger.configure(options.logging)\n }\n\n if (options.watchConfig) {\n logger.warn('[core] Browser does not support watchConfig option')\n }\n\n logger.info('[core] Initialized (browser mode)')\n}\n"]}
1
+ {"version":3,"sources":["../../../node_modules/loglevel/lib/loglevel.js","../src/functions/core-function-config.browser.ts","../src/functions/core-function-logger.browser.ts","../src/core-main.browser.ts"],"names":["defaultLogger","getLogger","logger","config","log"],"mappings":"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","file":"browser.js","sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n \"use strict\";\n if (typeof define === 'function' && define.amd) {\n define(definition);\n } else if (typeof module === 'object' && module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n}(this, function () {\n \"use strict\";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = \"undefined\";\n var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n /Trident\\/|MSIE /.test(window.navigator.userAgent)\n );\n\n var logMethods = [\n \"trace\",\n \"debug\",\n \"info\",\n \"warn\",\n \"error\"\n ];\n\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType || !storageKey) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(\n cookie.slice(location + cookieName.length + 1)\n )[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n \"ERROR\": 4, \"SILENT\": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(\n defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n );\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n\n defaultLogger.getLogger = function getLogger(name) {\n if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name,\n defaultLogger.methodFactory\n );\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n\n return defaultLogger;\n}));\n","/**\n * @h-ai/core — 配置管理(浏览器占位实现)\n *\n * 浏览器环境没有文件系统,不能加载 / 监听 YAML 配置文件。\n * 该实现保持 `core.config` API 形态与 Node.js 一致,但所有文件相关操作\n * 都返回明确的 SERVICE_UNAVAILABLE,避免运行时出现 `core.config` 为 undefined。\n * @module core-function-config.browser\n */\n\nimport type { ZodType } from 'zod'\nimport type { HaiError, HaiResult } from '../core-types.js'\nimport type { ConfigFn, WatchCallback } from './core-function-config.node.js'\nimport { err, HaiCommonError } from '../core-types.js'\nimport { i18n } from '../i18n/core-i18n-utils.js'\n\nfunction unsupported<T>(): HaiResult<T> {\n return err(\n HaiCommonError.SERVICE_UNAVAILABLE,\n i18n.coreM('core_configUnsupportedInBrowser'),\n )\n}\n\nfunction unsupportedError(): HaiError {\n const result = unsupported<never>()\n if (!result.success)\n return result.error\n throw new Error(i18n.coreM('core_configUnsupportedInBrowser'))\n}\n\n/**\n * 浏览器端 config 占位对象,API 与 Node.js config 保持一致。\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: ConfigFn = {\n loadEnvFiles(_options: { mode: string, envDir?: string }): HaiResult<Record<string, string>> {\n return unsupported<Record<string, string>>()\n },\n load<T>(_name: string, _filePath: string, _schema?: ZodType<T>): HaiResult<T> {\n return unsupported<T>()\n },\n\n validate<T>(_name: string, _schema: ZodType<T>): HaiResult<T> {\n return unsupported<T>()\n },\n\n get<T>(_name: string): T | undefined {\n return undefined\n },\n\n getOrThrow<T>(_name: string): T {\n throw new Error(i18n.coreM('core_configUnsupportedInBrowser'))\n },\n\n reload(_name: string): HaiResult<unknown> {\n return unsupported<unknown>()\n },\n\n has(_name: string): boolean {\n return false\n },\n\n clear(_name?: string): void {\n // 浏览器端无配置缓存,无需操作。\n },\n\n keys(): string[] {\n return []\n },\n\n watch<T = unknown>(_name: string, callback: WatchCallback<T>): () => void {\n callback(null, unsupportedError())\n return () => { }\n },\n\n unwatch(_name?: string): void {\n // 浏览器端无 watcher,无需操作。\n },\n\n isWatching(_name: string): boolean {\n return false\n },\n}\n\n/**\n * config 子工具类型\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 type BrowserConfigFn = typeof config\n","/**\n * @h-ai/core — Logger(浏览器版本,基于 loglevel)\n *\n * 提供统一的日志接口,浏览器环境使用 loglevel 实现。\n * @module core-function-logger.browser\n */\n\nimport type { LogFormat, LoggingConfig, LogLevel } from '../core-config.js'\nimport type { LogContext, Logger, LoggerFunctions, LoggerOptions } from '../core-types.js'\nimport log from 'loglevel'\nimport { sanitize as sanitizeUtils } from '../utils/core-util-sanitize.js'\nimport { requestContext } from './core-function-context.js'\nimport { emitLogRecord } from './core-function-log-observer.js'\n\n// ─── 全局配置 ───\n\n/** 全局日志级别(默认 'info') */\nlet globalLevel: LogLevel = 'info'\n\n/** 浏览器默认可读输出;可配置 JSON 格式用于采集。 */\nlet globalFormat: LogFormat = 'pretty'\n\n/** 附加脱敏路径,与默认凭据脱敏同时生效。 */\nlet globalRedact: string[] = []\n\n/** 全局默认上下文(每条日志自动附带) */\nlet globalContext: Record<string, unknown> = {}\n\n/** 默认 Logger 单例缓存 */\nlet defaultLogger: Logger | null = null\n\n/**\n * LogLevel 到 loglevel 库级别的映射。\n *\n * loglevel 不支持 fatal,映射为 error。\n */\nconst LEVEL_MAP: Record<LogLevel, log.LogLevelDesc> = {\n trace: 'trace',\n debug: 'debug',\n info: 'info',\n warn: 'warn',\n error: 'error',\n fatal: 'error', // loglevel 没有 fatal\n}\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 log.setLevel(LEVEL_MAP[config.level])\n }\n if (config.context) {\n globalContext = { ...globalContext, ...config.context }\n }\n if (config.format)\n globalFormat = config.format\n if (config.redact)\n globalRedact = [...config.redact]\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 log.setLevel(LEVEL_MAP[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 const sanitized = sanitizeUtils.sanitizeSensitiveFields(ctx)\n for (const path of globalRedact)\n redactPath(sanitized, path.match(/\\*|[^.[\\]\"']+/g) ?? [])\n return sanitized\n}\n\n/** 在已脱敏的副本上处理点/括号路径和通配符,不修改调用方原始对象。 */\nfunction redactPath(value: unknown, segments: string[]): void {\n if (!value || typeof value !== 'object' || segments.length === 0)\n return\n const record = value as Record<string, unknown>\n const [segment, ...rest] = segments\n const keys = segment === '*' ? Object.keys(record) : [segment!]\n for (const key of keys) {\n if (!Object.hasOwn(record, key) || ['__proto__', 'constructor', 'prototype'].includes(key))\n continue\n if (rest.length === 0)\n record[key] = '[REDACTED]'\n else redactPath(record[key], rest)\n }\n}\n\n// ─── Logger 实现 ───\n\n/**\n * 格式化日志消息。\n *\n * 将消息文本与上下文拼接为单行输出(上下文序列化为 JSON)。\n *\n * @param message - 日志文本\n * @param context - 日志上下文(空对象时不输出)\n * @returns 格式化后的字符串\n */\nfunction formatMessage(message: string, context?: LogContext, format: LogFormat = globalFormat, level: LogLevel = 'info'): string {\n const sanitizedContext = sanitizeLogContext(context)\n\n if (format === 'json')\n return JSON.stringify({ ...sanitizedContext, level, msg: message })\n\n if (!sanitizedContext || Object.keys(sanitizedContext).length === 0) {\n return message\n }\n return `${message} ${JSON.stringify(sanitizedContext)}`\n}\n\n/**\n * 创建 Logger 包装。\n *\n * 将 loglevel 实例包装为统一 Logger 接口,自动合并基础上下文。\n *\n * @param resolveLogger - 当前级别的 loglevel 实例\n * @param resolveContext - 当前基础上下文(会与每次调用时的 ctx 合并)\n * @param resolveFormat - 当前输出格式\n * @returns 统一 Logger 实例\n */\nfunction wrapLoglevel(resolveLogger: () => log.Logger, resolveContext: () => Record<string, unknown>, resolveFormat: () => LogFormat): Logger {\n const write = (level: LogLevel, message: string, ctx?: LogContext): void => {\n const output = resolveLogger()\n const priorities: Record<LogLevel, number> = { trace: 0, debug: 1, info: 2, warn: 3, error: 4, fatal: 4 }\n if (priorities[level] < output.getLevel())\n return\n const context = sanitizeLogContext({ ...resolveContext(), ...ctx, ...requestContext.get() }) ?? {}\n const text = formatMessage(message, context, resolveFormat(), level)\n if (level === 'fatal')\n output.error(resolveFormat() === 'json' ? text : `[FATAL] ${text}`)\n else output[level](text)\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 return wrapLoglevel(resolveLogger, () => ({ ...resolveContext(), ...childContext }), resolveFormat)\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: 'web' })\n * appLogger.info('ready')\n * ```\n */\nfunction createLogger(options: LoggerOptions = {}): Logger {\n const { name, level, format } = options\n const context = { ...options.context }\n\n // 创建或获取 logger 实例\n const loggerInstance = name ? log.getLogger(name) : log\n\n const resolveLogger = (): log.Logger => {\n const effectiveLevel = LEVEL_MAP[level ?? globalLevel]\n if (loggerInstance.getLevel() !== log.levels[String(effectiveLevel).toUpperCase() as keyof typeof log.levels])\n loggerInstance.setLevel(effectiveLevel)\n return loggerInstance\n }\n resolveLogger()\n return wrapLoglevel(resolveLogger, () => ({ ...globalContext, ...context }), () => format ?? globalFormat)\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 * 浏览器 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 服务聚合(浏览器)\n *\n * 提供浏览器环境的 core 对象,聚合常用功能。 所有功能统一通过 core 对象访问;文件配置方法保留明确失败的占位接口。\n * @module core-main.browser\n */\n\nimport type { CoreOptions } from './core-types.js'\nimport { createCore } from './core-main.js'\nimport { config } from './functions/core-function-config.browser.js'\nimport { logger } from './functions/core-function-logger.browser.js'\n\n// ─── Core 实例 ───\n\n/**\n * 创建 Browser 版本的 core 对象。\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.logger.info('ready')\n * ```\n */\nfunction createBrowserCore() {\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 功能;浏览器端 config 为占位实现,返回明确不支持错误。\n return {\n ...baseCore,\n /** 配置管理(浏览器端不支持文件配置,方法返回 SERVICE_UNAVAILABLE) */\n config,\n /** 初始化 Core */\n init: initCore,\n }\n}\n\n/**\n * Core 服务对象 - 聚合常用功能(浏览器)。\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.init({ logging: { level: 'info' } })\n * core.logger.info('Browser ready')\n * ```\n */\nexport const core = createBrowserCore()\n\n/**\n * 初始化 Core(内部实现,通过 core.init() 调用)。\n * 注意:浏览器环境不支持 config 和 watchConfig 选项。\n *\n * @param options - 初始化选项\n *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\n * core.init({ logging: { level: 'debug' } })\n * ```\n */\nfunction initCore(options: CoreOptions = {}): void {\n const logger = core.logger\n\n // 配置日志\n if (options.logging) {\n core.logger.configure(options.logging)\n }\n\n if (options.watchConfig) {\n logger.warn('[core] Browser does not support watchConfig option')\n }\n\n logger.info('[core] Initialized (browser mode)')\n}\n"]}