@h-ai/core 0.1.0-alpha.66 → 0.1.0-alpha.68
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 +60 -34
- package/README.ja.md +60 -34
- package/README.md +61 -35
- package/dist/browser.d.ts +4 -4
- package/dist/browser.js +2 -2
- package/dist/browser.js.map +1 -1
- package/dist/{chunk-RXNSRXYF.js → chunk-AWUFXC35.js} +283 -165
- package/dist/chunk-AWUFXC35.js.map +1 -0
- package/dist/{core-function-config.node-7KVlEiFk.d.ts → core-function-config.node-DJ6Hb1ee.d.ts} +499 -175
- package/dist/node.d.ts +23 -7
- package/dist/node.js +26 -5
- package/dist/node.js.map +1 -1
- package/package.json +5 -2
- package/dist/chunk-RXNSRXYF.js.map +0 -1
package/README.md
CHANGED
|
@@ -4,9 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
[框架首页](../../README.md)
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## 简介
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
hai Agent Framework 核心模块 — 提供统一的基础工具、类型定义、配置管理和日志功能。
|
|
10
|
+
|
|
11
|
+
## 核心功能清单
|
|
10
12
|
|
|
11
13
|
- **HaiResult 类型** — 函数式错误处理(`ok` / `err`),所有模块统一返回值
|
|
12
14
|
- **统一日志** — Node.js 基于 pino,浏览器基于 loglevel,API 一致
|
|
@@ -18,9 +20,11 @@
|
|
|
18
20
|
- **模块工具** — NotInitializedKit 代理模式,各模块共用的生命周期基础设施
|
|
19
21
|
- **工具函数库** — 类型检查、对象 / 字符串 / 数组 / 异步 / 时间操作
|
|
20
22
|
|
|
21
|
-
##
|
|
23
|
+
## 使用入门
|
|
24
|
+
|
|
25
|
+
### 快速开始
|
|
22
26
|
|
|
23
|
-
|
|
27
|
+
#### Node.js 环境
|
|
24
28
|
|
|
25
29
|
```typescript
|
|
26
30
|
import { core } from '@h-ai/core'
|
|
@@ -72,7 +76,7 @@ core.time.formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss')
|
|
|
72
76
|
core.typeUtils.isDefined(value)
|
|
73
77
|
```
|
|
74
78
|
|
|
75
|
-
|
|
79
|
+
#### 浏览器环境
|
|
76
80
|
|
|
77
81
|
```typescript
|
|
78
82
|
import { core } from '@h-ai/core'
|
|
@@ -95,13 +99,13 @@ core.array.unique([1, 1, 2])
|
|
|
95
99
|
- `watch()` 会立即用同一错误调用回调,并返回安全的 no-op 取消函数
|
|
96
100
|
- 需要配置时请由服务端读取后通过接口下发,或只在浏览器端用 `core.init({ logging })` 配置日志
|
|
97
101
|
|
|
98
|
-
|
|
102
|
+
### 详细 API
|
|
99
103
|
|
|
100
|
-
|
|
104
|
+
#### 日志(Logger)
|
|
101
105
|
|
|
102
106
|
`core.logger` 既是默认 Logger 实例,也是日志管理的统一入口。
|
|
103
107
|
|
|
104
|
-
|
|
108
|
+
##### 日志记录
|
|
105
109
|
|
|
106
110
|
6 个级别:`trace` / `debug` / `info` / `warn` / `error` / `fatal`
|
|
107
111
|
|
|
@@ -111,7 +115,7 @@ core.logger.error('Failed to connect', { error })
|
|
|
111
115
|
core.logger.debug('Processing item', { id, step: 'validation' })
|
|
112
116
|
```
|
|
113
117
|
|
|
114
|
-
|
|
118
|
+
##### 创建模块级 logger
|
|
115
119
|
|
|
116
120
|
```typescript
|
|
117
121
|
// 独立名称空间,适合模块内全局使用
|
|
@@ -119,7 +123,7 @@ const logger = core.logger.create({ name: 'payment' })
|
|
|
119
123
|
logger.info('Payment processed')
|
|
120
124
|
```
|
|
121
125
|
|
|
122
|
-
|
|
126
|
+
##### 子 logger(child)
|
|
123
127
|
|
|
124
128
|
```typescript
|
|
125
129
|
// 携带固定上下文,每条日志自动附带这些字段
|
|
@@ -135,7 +139,7 @@ opLogger.error('Login failed', { reason: 'invalid_password' })
|
|
|
135
139
|
|
|
136
140
|
> **典型用法**:在请求入口创建 `reqLogger`,传入 service 层,service 层再 `child` 添加操作上下文,最终日志自动串联完整链路。
|
|
137
141
|
|
|
138
|
-
|
|
142
|
+
##### 日志管理
|
|
139
143
|
|
|
140
144
|
```typescript
|
|
141
145
|
// 配置输出格式和级别(Node.js / Browser)
|
|
@@ -154,9 +158,11 @@ const level = core.logger.getLevel() // 'debug'
|
|
|
154
158
|
|
|
155
159
|
浏览器仍输出到 DevTools console:`pretty` 使用可读消息与上下文,`json` 输出包含 `level` / `msg` 的 JSON 字符串。默认凭据脱敏与配置的字段路径脱敏同时生效,支持嵌套点/括号路径和 `*`;消息文本本身需调用方脱敏。
|
|
156
160
|
|
|
157
|
-
`
|
|
161
|
+
日志上下文中的原生 `Error` 会先转为包含 `name`、`message`、`stack`、`cause`、`AggregateError.errors` 与可枚举自有上下文的副本,再执行默认字段/URL 脱敏与配置的 `redact`;两端规则一致,原异常不变。异常子图循环返回 `[Circular]`,32 层上限返回 `[MaxDepth]`;其中的自定义替换值也经同一规范化处理,普通对象的替换语义不变。无 Error 的普通对象循环仍保留原结构,不保证可直接 JSON 序列化。`name/message/stack` 是自由文本,不自动解析其中的秘密;调用方应先清理,或用 `error.message` / `error.stack` 等路径整体遮蔽。
|
|
158
162
|
|
|
159
|
-
|
|
163
|
+
`core.logger` 默认会对日志上下文执行安全脱敏:`password`、`token`、`secret`、`privateKey`、`apiV3Key` 等凭证类字段会替换为 `[REDACTED]`,`url` / `baseUrl` / `endpoint` 这类字段会掩码 URL 中的用户名、密码和敏感查询参数(含 OAuth 键值 fragment);非法 URL 返回固定占位符;邮箱、手机号默认不会被遮盖。
|
|
164
|
+
|
|
165
|
+
##### 日志级别规范
|
|
160
166
|
|
|
161
167
|
| 级别 | 适用场景 |
|
|
162
168
|
| ------- | ---------------------------------- |
|
|
@@ -167,7 +173,9 @@ const level = core.logger.getLevel() // 'debug'
|
|
|
167
173
|
| `error` | 操作失败(需人工排查) |
|
|
168
174
|
| `fatal` | 致命错误(服务无法继续) |
|
|
169
175
|
|
|
170
|
-
|
|
176
|
+
#### 国际化(i18n)
|
|
177
|
+
|
|
178
|
+
内置语言为 `zh-CN`、`en-US`、`ja-JP`;`ja` 简写会规范化为 `ja-JP`,所有模块共用此语言设置。
|
|
171
179
|
|
|
172
180
|
```typescript
|
|
173
181
|
// 设置全局语言(所有 getMessage 函数自动响应)
|
|
@@ -187,13 +195,13 @@ getMessage('welcome', { params: { name: 'Alice' } }) // 'Welcome Alice'
|
|
|
187
195
|
getMessage('welcome', { locale: 'zh-CN', params: { name: 'Alice' } }) // '欢迎 Alice'
|
|
188
196
|
|
|
189
197
|
// 常量
|
|
190
|
-
core.i18n.DEFAULT_LOCALES // [{ code: 'zh-CN', label: '简体中文' }, { code: 'en-US', label: 'English' }]
|
|
198
|
+
core.i18n.DEFAULT_LOCALES // [{ code: 'zh-CN', label: '简体中文' }, { code: 'en-US', label: 'English' }, { code: 'ja-JP', label: '日本語' }]
|
|
191
199
|
core.i18n.DEFAULT_LOCALE // 'zh-CN'
|
|
192
200
|
```
|
|
193
201
|
|
|
194
|
-
|
|
202
|
+
#### 脱敏工具
|
|
195
203
|
|
|
196
|
-
`core.sanitize.sanitizeSensitiveFields()` 可递归脱敏对象/数组中的敏感字段;默认会处理密码、token、secret、privateKey、apiV3Key 等凭证类字段,并自动掩码 `url` / `baseUrl` / `endpoint`
|
|
204
|
+
`core.sanitize.sanitizeSensitiveFields()` 可递归脱敏对象/数组中的敏感字段;默认会处理密码、token、secret、privateKey、apiV3Key 等凭证类字段,并自动掩码 `url` / `baseUrl` / `endpoint` 字段中的内嵌凭证、敏感查询参数和 OAuth 键值 fragment。`core.sanitize.sanitizeUrl(url, options)` 可单独处理 URL,非法 URL 返回 `(invalid url)`;自定义 matcher 同样适用于参数名。
|
|
197
205
|
|
|
198
206
|
```typescript
|
|
199
207
|
core.sanitize.sanitizeSensitiveFields({
|
|
@@ -211,7 +219,7 @@ core.sanitize.sanitizeSensitiveFields({ email: 'user@example.com' }, {
|
|
|
211
219
|
// => { email: '***' }
|
|
212
220
|
```
|
|
213
221
|
|
|
214
|
-
|
|
222
|
+
#### Zod 校验错误 i18n 映射
|
|
215
223
|
|
|
216
224
|
`core.zodValidation` 用于把 Zod `SafeParseError` / `ZodError` 转为扁平表单错误,并将 Zod
|
|
217
225
|
默认英文消息映射为调用方自己的 i18n 文案。
|
|
@@ -272,17 +280,19 @@ if (!result.success) {
|
|
|
272
280
|
}
|
|
273
281
|
```
|
|
274
282
|
|
|
275
|
-
|
|
283
|
+
#### 配置管理(Node.js 专用)
|
|
276
284
|
|
|
277
285
|
> 浏览器端没有文件系统,`core.config` 仅提供占位 API:文件相关方法返回 `SERVICE_UNAVAILABLE`,不会加载 YAML。
|
|
278
286
|
|
|
287
|
+
Node 自动加载和监听运行时 `.yml` / `.yaml`,精确跳过保留文件 `_deploy.yml`、`_deploy.yaml`;部署 CLI 在加载目标环境与凭据后独立解析它们。业务 `deploy.yml` 仍自动加载,手动 `core.config.load` 不受影响。单项加载返回失败时记录错误并继续,必需配置由应用调用 `core.config.validate` 并检查 `success`;目录扫描、日志设置等异常仍可能传播。
|
|
288
|
+
|
|
279
289
|
```typescript
|
|
280
290
|
import { core, HaiConfigError } from '@h-ai/core'
|
|
281
291
|
import { z } from 'zod'
|
|
282
292
|
|
|
283
|
-
// 方式 1:init
|
|
293
|
+
// 方式 1:init 时自动加载运行时配置
|
|
284
294
|
core.init({
|
|
285
|
-
configDir: './config', //
|
|
295
|
+
configDir: './config', // 扫描 .yml / .yaml,排除 _deploy.yml / _deploy.yaml
|
|
286
296
|
watchConfig: true, // 监听变更并自动重载
|
|
287
297
|
})
|
|
288
298
|
|
|
@@ -304,8 +314,8 @@ const validResult = core.config.validate('app', AppSchema)
|
|
|
304
314
|
|
|
305
315
|
// 查询和获取
|
|
306
316
|
if (core.config.has('app')) {
|
|
307
|
-
const cfg = core.config.get<typeof AppSchema
|
|
308
|
-
const cfg2 = core.config.getOrThrow<typeof AppSchema
|
|
317
|
+
const cfg = core.config.get<z.infer<typeof AppSchema>>('app') // undefined 或配置
|
|
318
|
+
const cfg2 = core.config.getOrThrow<z.infer<typeof AppSchema>>('app') // 未加载时抛异常
|
|
309
319
|
}
|
|
310
320
|
core.config.keys() // ['core', 'app', 'db', ...]
|
|
311
321
|
|
|
@@ -327,7 +337,7 @@ core.config.clear('app') // 清除单个
|
|
|
327
337
|
core.config.clear() // 清除全部
|
|
328
338
|
```
|
|
329
339
|
|
|
330
|
-
|
|
340
|
+
##### dotenv 文件与环境切换
|
|
331
341
|
|
|
332
342
|
Node 专用的 `core.config.loadEnvFiles({ mode, envDir })` 返回 HaiResult,读取 `.env` → `.env.<mode>` → `.env.local`,已有进程环境最高;development/production 映射为 dev/prod,文件不存在时跳过。该函数不修改进程,调用方检查 success 后注入。除 `.env.local` 外的公共环境文件及完整说明 `.env.example` 提交 Git。`core.init` 不自动读取 dotenv,浏览器调用返回 SERVICE_UNAVAILABLE。
|
|
333
343
|
|
|
@@ -339,7 +349,7 @@ Object.assign(process.env, env.data)
|
|
|
339
349
|
core.init({ configDir: './config' })
|
|
340
350
|
```
|
|
341
351
|
|
|
342
|
-
|
|
352
|
+
##### 环境变量映射与插值
|
|
343
353
|
|
|
344
354
|
`core.config.load(name, ...)` 会为每个 YAML 叶子配置项自动映射
|
|
345
355
|
`HAI_<配置名>_<YAML 路径>` 环境变量。配置名和每层 key 转成大写,层级以 `_`
|
|
@@ -382,7 +392,7 @@ database: ${DB_CONNECTION} # → 环境变量缺失时报错
|
|
|
382
392
|
url: http://${HOST}:${PORT} # → string(混合文本)
|
|
383
393
|
```
|
|
384
394
|
|
|
385
|
-
|
|
395
|
+
#### ID 生成
|
|
386
396
|
|
|
387
397
|
```typescript
|
|
388
398
|
const id = core.id.generate() // nanoid 21 字符
|
|
@@ -398,7 +408,9 @@ core.id.isValidUUID('f47ac10b-...') // true/false
|
|
|
398
408
|
core.id.isValidNanoId('abc123', 6) // true/false
|
|
399
409
|
```
|
|
400
410
|
|
|
401
|
-
|
|
411
|
+
UUID 只使用密码学安全的 randomUUID/getRandomValues;均不可用时明确抛错,不生成 Math.random 标识。
|
|
412
|
+
|
|
413
|
+
#### 工具函数
|
|
402
414
|
|
|
403
415
|
```typescript
|
|
404
416
|
// 类型检查
|
|
@@ -434,7 +446,7 @@ core.string.isBlank('') // true
|
|
|
434
446
|
core.string.isNotBlank('x') // true
|
|
435
447
|
core.string.padStart('5', 3, '0') // '005'
|
|
436
448
|
core.string.padEnd('5', 3, '0') // '500'
|
|
437
|
-
core.string.constantTimeEqual(a, b) //
|
|
449
|
+
core.string.constantTimeEqual(a, b) // Node 使用原生等长比较;浏览器不保证恒时
|
|
438
450
|
|
|
439
451
|
// 数组操作
|
|
440
452
|
core.array.unique([1, 1, 2]) // [1, 2]
|
|
@@ -470,7 +482,9 @@ core.time.startOfDay(date)
|
|
|
470
482
|
core.time.endOfDay(date)
|
|
471
483
|
```
|
|
472
484
|
|
|
473
|
-
|
|
485
|
+
Node 入口的 core.string.constantTimeEqual 将原始 UTF-16 单元编码后使用 node:crypto.timingSafeEqual 比较等长字节,长度不相同时直接 false,长度本身不受保护。浏览器实现仅避免按内容提前返回,不提供 JavaScript 引擎级恒时保证,不用于服务端凭证校验。外围分支、编码和请求处理不因此自动成为恒时。
|
|
486
|
+
|
|
487
|
+
#### 模块基础工具(module)
|
|
474
488
|
|
|
475
489
|
提供各模块共用的初始化错误处理:
|
|
476
490
|
|
|
@@ -488,9 +502,9 @@ const currentDdl: DdlOperations = notInitialized.proxy<DdlOperations>()
|
|
|
488
502
|
const currentHash: HashOperations = notInitialized.proxy<HashOperations>('sync')
|
|
489
503
|
```
|
|
490
504
|
|
|
491
|
-
|
|
505
|
+
### 错误处理
|
|
492
506
|
|
|
493
|
-
|
|
507
|
+
#### HaiResult 类型
|
|
494
508
|
|
|
495
509
|
所有可能失败的操作返回 `HaiResult<T>`:
|
|
496
510
|
|
|
@@ -513,7 +527,7 @@ else {
|
|
|
513
527
|
}
|
|
514
528
|
```
|
|
515
529
|
|
|
516
|
-
|
|
530
|
+
#### 自定义错误码(模块级)
|
|
517
531
|
|
|
518
532
|
```typescript
|
|
519
533
|
import type { ErrorInfo } from '@h-ai/core'
|
|
@@ -539,7 +553,7 @@ const errorInst = core.error.buildHaiErrorInst(
|
|
|
539
553
|
)
|
|
540
554
|
```
|
|
541
555
|
|
|
542
|
-
|
|
556
|
+
#### 配置错误码
|
|
543
557
|
|
|
544
558
|
```typescript
|
|
545
559
|
import { HaiConfigError } from '@h-ai/core'
|
|
@@ -551,12 +565,24 @@ HaiConfigError.CONFIG_ENV_VAR_MISSING // hai:core:013 - 环境变量缺失
|
|
|
551
565
|
HaiConfigError.CONFIG_NOT_LOADED // hai:core:014 - 配置未加载
|
|
552
566
|
```
|
|
553
567
|
|
|
554
|
-
|
|
568
|
+
### 请求语言隔离
|
|
569
|
+
|
|
570
|
+
Node 请求与 SSR 使用 `core.i18n.runWithLocale(locale, () => handleRequest())`;SvelteKit 可使用 `kit.i18n.runWithLocale(locale, () => resolve(event))`,serv 自动按请求头建立上下文。异步子任务继承请求语言,优先级为显式 `MessageOptions.locale`、请求语言、进程启动默认语言。`setGlobalLocale` 在请求上下文中只更新当前请求;上下文外仅用于启动默认值,不能在请求 hook 中调用它修改默认值。
|
|
571
|
+
|
|
572
|
+
浏览器继续使用应用级 `setGlobalLocale` / `createLocaleStore`。SSR 的 UI store 初始化和 setter 只修改自身状态,不写全局语言;UI 消息从请求上下文读取。`runWithLocale` 仅支持 Node 入口,浏览器通过显式 locale 或应用状态翻译。
|
|
573
|
+
|
|
574
|
+
## 配置的实际消费边界
|
|
575
|
+
|
|
576
|
+
`_core.yml` 仅接受 name/version/env/defaultLocale 元数据与 logging;未知字段加载失败。Core 不提供全局 debug、ID 长度/前缀、业务 features 或语言注册列表;日志级别用 logging.level,ID 选项在每次 core.id 调用传入,业务配置放 app.yml 并由应用 Schema 校验。defaultLocale 是可读取的元数据,不会替应用注册翻译或切换 Paraglide。导入 Logger 不改写 LANG、LC_ALL、PYTHONIOENCODING,包括 Windows TTY。全部模块的配置与环境消费链见[配置对应表](../../.agents/skills/hai-module-create/configuration.md)。
|
|
577
|
+
|
|
578
|
+
## 开发测试
|
|
555
579
|
|
|
556
580
|
```bash
|
|
557
581
|
pnpm --filter @h-ai/core test
|
|
558
582
|
```
|
|
559
583
|
|
|
560
|
-
|
|
584
|
+
公开声明和内部结构的注释及可编译示例见[模块 JSDoc 约定](../../.agents/instructions/module-conventions.md#jsdoc-与示例验证)。Node core.init 同步返回 void;单项 config.load 返回失败时记录错误并继续,必需配置须 validate 并检查 success。目录扫描等异常仍可能抛出;模块业务 HaiResult 则先检查 success。
|
|
585
|
+
|
|
586
|
+
## 许可证
|
|
561
587
|
|
|
562
588
|
Apache-2.0
|
package/dist/browser.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
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-
|
|
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
|
|
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';
|
|
3
3
|
import * as zod from 'zod';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Core 服务对象 - 聚合常用功能(浏览器)。
|
|
7
|
-
*
|
|
8
7
|
* @example
|
|
9
8
|
* ```ts
|
|
10
9
|
* import { core } from '@h-ai/core'
|
|
11
|
-
* core.
|
|
10
|
+
* core.init({ logging: { level: 'info' } })
|
|
11
|
+
* core.logger.info('Browser ready')
|
|
12
12
|
* ```
|
|
13
13
|
*/
|
|
14
14
|
declare const core: {
|
package/dist/browser.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { __commonJS, __toESM, createCore, i18n, err, HaiCommonError, sanitize } from './chunk-
|
|
2
|
-
export { CoreConfigSchema, EnvSchema, HaiCommonError, HaiConfigError,
|
|
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';
|
|
3
3
|
|
|
4
4
|
// ../../node_modules/loglevel/lib/loglevel.js
|
|
5
5
|
var require_loglevel = __commonJS({
|
package/dist/browser.js.map
CHANGED
|
@@ -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/** 浏览器端 config 占位对象,API 与 Node.js config 保持一致。 */\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/** config 子工具类型 */\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 *\n * @example\n * ```ts\n * logger.createLogger({ name: 'ui' }).info('boot')\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 对象访问(不含 config 能力)。\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 *\n * @example\n * ```ts\n * import { core } from '@h-ai/core'\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'\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"]}
|