@zooique/memora 1.0.1 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +272 -0
- package/README.md +150 -38
- package/dist/agent/agent.d.ts +257 -115
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +747 -400
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +32 -16
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +83 -47
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +27 -2
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +78 -5
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/constants.d.ts +4 -0
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +4 -0
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +8 -0
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +7 -2
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/guardrail.d.ts +4 -2
- package/dist/agent/guardrail.d.ts.map +1 -1
- package/dist/agent/guardrail.js +13 -5
- package/dist/agent/guardrail.js.map +1 -1
- package/dist/agent/loop.d.ts +137 -15
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +449 -270
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +126 -22
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +239 -44
- package/dist/agent/managers/archiveCoordinator.js.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -1
- package/dist/agent/managers/autoConfigRefiner.js +4 -8
- package/dist/agent/managers/autoConfigRefiner.js.map +1 -1
- package/dist/agent/managers/chatLockManager.d.ts +116 -0
- package/dist/agent/managers/chatLockManager.d.ts.map +1 -0
- package/dist/agent/managers/chatLockManager.js +191 -0
- package/dist/agent/managers/chatLockManager.js.map +1 -0
- package/dist/agent/managers/configManager.d.ts +87 -3
- package/dist/agent/managers/configManager.d.ts.map +1 -1
- package/dist/agent/managers/configManager.js +139 -2
- package/dist/agent/managers/configManager.js.map +1 -1
- package/dist/agent/managers/dedupManager.d.ts +169 -0
- package/dist/agent/managers/dedupManager.d.ts.map +1 -0
- package/dist/agent/managers/dedupManager.js +336 -0
- package/dist/agent/managers/dedupManager.js.map +1 -0
- package/dist/agent/managers/insightExtractor.d.ts +31 -3
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
- package/dist/agent/managers/insightExtractor.js +130 -59
- package/dist/agent/managers/insightExtractor.js.map +1 -1
- package/dist/agent/managers/llmJudgeHelper.d.ts +38 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.js +49 -0
- package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
- package/dist/agent/managers/memoryAdvisor.d.ts +102 -2
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +254 -10
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +127 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.js +283 -4
- package/dist/agent/managers/memoryDecayScheduler.js.map +1 -1
- package/dist/agent/managers/memoryGovernance.d.ts +56 -0
- package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
- package/dist/agent/managers/memoryGovernance.js +63 -0
- package/dist/agent/managers/memoryGovernance.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +113 -30
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +165 -32
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/relationBuilder.d.ts +4 -4
- package/dist/agent/managers/relationBuilder.d.ts.map +1 -1
- package/dist/agent/managers/relationBuilder.js +5 -4
- package/dist/agent/managers/relationBuilder.js.map +1 -1
- package/dist/agent/managers/sessionArchiver.d.ts +12 -1
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +87 -30
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +9 -17
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/streamAccumulator.d.ts +45 -0
- package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
- package/dist/agent/managers/streamAccumulator.js +40 -0
- package/dist/agent/managers/streamAccumulator.js.map +1 -0
- package/dist/agent/managers/textPolishManager.d.ts +62 -0
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -0
- package/dist/agent/managers/textPolishManager.js +96 -0
- package/dist/agent/managers/textPolishManager.js.map +1 -0
- package/dist/agent/managers/workProjection.d.ts +16 -1
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +48 -24
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/personaMatcher.d.ts +29 -0
- package/dist/agent/personaMatcher.d.ts.map +1 -0
- package/dist/agent/personaMatcher.js +60 -0
- package/dist/agent/personaMatcher.js.map +1 -0
- package/dist/agent/toolExecutor.d.ts +24 -4
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +30 -4
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/tracer.d.ts +31 -0
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +31 -0
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +133 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +38 -0
- package/dist/agent/types.js.map +1 -1
- package/dist/agent/userFactExtractor.d.ts.map +1 -1
- package/dist/agent/userFactExtractor.js +7 -0
- package/dist/agent/userFactExtractor.js.map +1 -1
- package/dist/config/loader.d.ts +124 -236
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +296 -118
- package/dist/config/loader.js.map +1 -1
- package/dist/eval/evalRunner.d.ts +94 -0
- package/dist/eval/evalRunner.d.ts.map +1 -0
- package/dist/eval/evalRunner.js +141 -0
- package/dist/eval/evalRunner.js.map +1 -0
- package/dist/eval/evalTypes.d.ts +21 -0
- package/dist/eval/evalTypes.d.ts.map +1 -1
- package/dist/eval/evalTypes.js +15 -0
- package/dist/eval/evalTypes.js.map +1 -1
- package/dist/eval/scenarios.d.ts +33 -0
- package/dist/eval/scenarios.d.ts.map +1 -0
- package/dist/eval/scenarios.js +109 -0
- package/dist/eval/scenarios.js.map +1 -0
- package/dist/index.d.ts +45 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -5
- package/dist/index.js.map +1 -1
- package/dist/llm/abortSignal.d.ts +27 -0
- package/dist/llm/abortSignal.d.ts.map +1 -0
- package/dist/llm/abortSignal.js +44 -0
- package/dist/llm/abortSignal.js.map +1 -0
- package/dist/llm/embedding.d.ts +13 -12
- package/dist/llm/embedding.d.ts.map +1 -1
- package/dist/llm/embedding.js +5 -17
- package/dist/llm/embedding.js.map +1 -1
- package/dist/llm/factory.d.ts +19 -5
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +19 -37
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +17 -34
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/logging/logger.d.ts +3 -1
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +47 -50
- package/dist/logging/logger.js.map +1 -1
- package/dist/memory/governance.d.ts +50 -0
- package/dist/memory/governance.d.ts.map +1 -0
- package/dist/memory/governance.js +70 -0
- package/dist/memory/governance.js.map +1 -0
- package/dist/memory/hybridMerge.d.ts +0 -4
- package/dist/memory/hybridMerge.d.ts.map +1 -1
- package/dist/memory/hybridMerge.js +19 -4
- package/dist/memory/hybridMerge.js.map +1 -1
- package/dist/memory/inMemoryRelationStore.d.ts +7 -0
- package/dist/memory/inMemoryRelationStore.d.ts.map +1 -1
- package/dist/memory/inMemoryRelationStore.js +15 -0
- package/dist/memory/inMemoryRelationStore.js.map +1 -1
- package/dist/memory/inMemoryStorage.d.ts +36 -1
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +70 -19
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/loader.d.ts +2 -0
- package/dist/memory/loader.d.ts.map +1 -1
- package/dist/memory/loader.js +8 -1
- package/dist/memory/loader.js.map +1 -1
- package/dist/memory/lockManager.d.ts +7 -2
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +35 -17
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +8 -7
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +33 -15
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +34 -1
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +100 -31
- package/dist/memory/projectRegistry.js.map +1 -1
- package/dist/memory/recall.d.ts +16 -0
- package/dist/memory/recall.d.ts.map +1 -1
- package/dist/memory/recall.js +35 -20
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/relationStore.d.ts +20 -3
- package/dist/memory/relationStore.d.ts.map +1 -1
- package/dist/memory/sourceValidation.d.ts +17 -0
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +27 -3
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +26 -1
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/store.d.ts +22 -1
- package/dist/memory/store.d.ts.map +1 -1
- package/dist/memory/store.js +58 -20
- package/dist/memory/store.js.map +1 -1
- package/dist/memory/types.d.ts +44 -31
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +63 -24
- package/dist/memory/types.js.map +1 -1
- package/dist/memory/userProfile.d.ts +32 -8
- package/dist/memory/userProfile.d.ts.map +1 -1
- package/dist/memory/userProfile.js +105 -44
- package/dist/memory/userProfile.js.map +1 -1
- package/dist/memory/vectorStore.d.ts +16 -8
- package/dist/memory/vectorStore.d.ts.map +1 -1
- package/dist/memory/vectorStore.js +49 -22
- package/dist/memory/vectorStore.js.map +1 -1
- package/dist/persona/personaManager.d.ts +38 -63
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +136 -202
- package/dist/persona/personaManager.js.map +1 -1
- package/dist/skill/skillManager.d.ts +11 -57
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +46 -141
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/types.d.ts +2 -3
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/utils/array.d.ts +24 -0
- package/dist/utils/array.d.ts.map +1 -0
- package/dist/utils/array.js +24 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/configResourceManager.d.ts +111 -0
- package/dist/utils/configResourceManager.d.ts.map +1 -0
- package/dist/utils/configResourceManager.js +148 -0
- package/dist/utils/configResourceManager.js.map +1 -0
- package/dist/utils/errors.d.ts +27 -8
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +31 -9
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +88 -4
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +23 -0
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +4 -2
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/math.d.ts +11 -0
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +17 -0
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/objects.d.ts +17 -0
- package/dist/utils/objects.d.ts.map +1 -0
- package/dist/utils/objects.js +19 -0
- package/dist/utils/objects.js.map +1 -0
- package/dist/utils/segmenter.d.ts +11 -10
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +23 -1
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +22 -1
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +29 -1
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/time.d.ts +18 -3
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +24 -8
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/toError.d.ts +8 -4
- package/dist/utils/toError.d.ts.map +1 -1
- package/dist/utils/toError.js +25 -5
- package/dist/utils/toError.js.map +1 -1
- package/docs/memora-api-reference.md +1235 -0
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +808 -0
- package/package.json +49 -22
- package/dist/agent/managers/memoryMutator.d.ts +0 -92
- package/dist/agent/managers/memoryMutator.d.ts.map +0 -1
- package/dist/agent/managers/memoryMutator.js +0 -94
- package/dist/agent/managers/memoryMutator.js.map +0 -1
package/dist/config/loader.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* 配置加载
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* 1.
|
|
4
|
+
* 查找顺序(高 → 低):
|
|
5
|
+
* 1. 显式 configPath(由宿主传入,如用户级配置路径)
|
|
6
6
|
* 2. 项目级 .memora/config.json
|
|
7
|
-
* 3.
|
|
8
|
-
* 4. 内置默认值
|
|
7
|
+
* 3. 内置默认值(仅提供机制,不预设厂商/路径策略——ADR-002 + ADR-003)
|
|
9
8
|
*
|
|
10
9
|
* API Key 从环境变量读取(不写入配置文件)
|
|
11
10
|
*
|
|
@@ -16,8 +15,9 @@
|
|
|
16
15
|
*/
|
|
17
16
|
import { readFile } from 'node:fs/promises';
|
|
18
17
|
import { resolve } from 'node:path';
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
18
|
+
import { configError } from '../utils/errors.js';
|
|
19
|
+
import { toError } from '../utils/toError.js';
|
|
20
|
+
import { logger } from '../logging/logger.js';
|
|
21
21
|
/**
|
|
22
22
|
* 默认上下文 token 数(120K)
|
|
23
23
|
*
|
|
@@ -27,102 +27,250 @@ import { z } from 'zod';
|
|
|
27
27
|
* 修改时需同步两处。
|
|
28
28
|
*/
|
|
29
29
|
const DEFAULT_MAX_CONTEXT_TOKENS = 120_000;
|
|
30
|
-
//
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
30
|
+
// 单一真理源:所有默认值由 DEFAULT_CONFIG 声明,parseConfig({}) 即可得到完整默认配置。
|
|
31
|
+
// 嵌套对象(llm/memory/security)必须有完整默认值,
|
|
32
|
+
// 否则会在对象缺失时使用内部字段的默认值。
|
|
33
|
+
const DEFAULT_CONFIG = {
|
|
34
|
+
llm: {
|
|
35
|
+
provider: 'mock',
|
|
36
|
+
// model 留空:factory.ts 会校验并抛出 'LLM model 未配置',由宿主显式填充
|
|
37
|
+
model: '',
|
|
38
|
+
temperature: 0.7,
|
|
39
|
+
},
|
|
40
|
+
memory: {
|
|
41
|
+
// dataDir 留空:由宿主显式注入,内核不硬编码具体目录路径(ADR-002 v0.6)
|
|
42
|
+
dataDir: '',
|
|
43
|
+
maxContextTokens: DEFAULT_MAX_CONTEXT_TOKENS,
|
|
44
|
+
},
|
|
45
|
+
security: {
|
|
46
|
+
permission: 'owner',
|
|
47
|
+
confirmWrites: false,
|
|
48
|
+
},
|
|
49
|
+
allowedPaths: [],
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* 解析并验证配置
|
|
53
|
+
*
|
|
54
|
+
* 将原始 JSON 解析结果转换为完整的 Config 对象,
|
|
55
|
+
* 验证类型并应用默认值。
|
|
56
|
+
*
|
|
57
|
+
* @param raw 原始 JSON 解析结果(unknown 类型)
|
|
58
|
+
* @returns 完整的 Config 对象
|
|
59
|
+
* @throws 当类型不匹配时抛出错误
|
|
60
|
+
*/
|
|
61
|
+
function parseConfig(raw) {
|
|
62
|
+
// 如果 raw 不是对象,使用空对象(MIND-C2:守卫+断言合一为 asRecordIfObject)
|
|
63
|
+
const input = asRecordIfObject(raw);
|
|
64
|
+
// 解析 llm 配置
|
|
65
|
+
const llmInput = asRecordIfObject(input.llm);
|
|
66
|
+
const llm = {
|
|
67
|
+
provider: typeof llmInput.provider === 'string' ? llmInput.provider : DEFAULT_CONFIG.llm.provider,
|
|
68
|
+
model: typeof llmInput.model === 'string' ? llmInput.model : DEFAULT_CONFIG.llm.model,
|
|
69
|
+
// 过滤空字符串:空字符串视为未配置,避免旧格式分支中 resolvedBaseUrl = '' 触发误报
|
|
70
|
+
baseUrl: typeof llmInput.baseUrl === 'string' && llmInput.baseUrl ? llmInput.baseUrl : undefined,
|
|
71
|
+
apiKey: typeof llmInput.apiKey === 'string' && llmInput.apiKey ? llmInput.apiKey : undefined,
|
|
72
|
+
temperature: validateTemperature(llmInput.temperature, DEFAULT_CONFIG.llm.temperature),
|
|
73
|
+
providers: parseProviders(llmInput.providers),
|
|
74
|
+
active: typeof llmInput.active === 'string' ? llmInput.active : undefined,
|
|
75
|
+
background: parseBackground(llmInput.background),
|
|
76
|
+
};
|
|
77
|
+
// 解析 memory 配置
|
|
78
|
+
const memoryInput = asRecordIfObject(input.memory);
|
|
79
|
+
const memory = {
|
|
80
|
+
dataDir: typeof memoryInput.dataDir === 'string' ? memoryInput.dataDir : DEFAULT_CONFIG.memory.dataDir,
|
|
81
|
+
maxContextTokens: (typeof memoryInput.maxContextTokens === 'number' && Number.isFinite(memoryInput.maxContextTokens))
|
|
82
|
+
? memoryInput.maxContextTokens
|
|
83
|
+
: DEFAULT_CONFIG.memory.maxContextTokens,
|
|
84
|
+
};
|
|
85
|
+
// 解析 security 配置
|
|
86
|
+
const securityInput = asRecordIfObject(input.security);
|
|
87
|
+
const security = {
|
|
88
|
+
permission: validatePermission(securityInput.permission),
|
|
89
|
+
confirmWrites: typeof securityInput.confirmWrites === 'boolean' ? securityInput.confirmWrites : DEFAULT_CONFIG.security.confirmWrites,
|
|
90
|
+
};
|
|
91
|
+
// 解析 allowedPaths
|
|
92
|
+
const allowedPaths = validateAllowedPaths(input.allowedPaths);
|
|
93
|
+
// 解析 persona
|
|
94
|
+
const persona = typeof input.persona === 'string' ? input.persona : undefined;
|
|
95
|
+
// 解析 embedding 配置
|
|
96
|
+
const embedding = parseEmbedding(input.embedding);
|
|
97
|
+
return {
|
|
98
|
+
llm,
|
|
99
|
+
memory,
|
|
100
|
+
security,
|
|
101
|
+
allowedPaths,
|
|
102
|
+
persona,
|
|
103
|
+
embedding,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 类型守卫辅助:非空对象 → Record,否则 → 空对象
|
|
108
|
+
*
|
|
109
|
+
* 收紧 MIND-C2 的 8 处 `as Record<string, unknown>` 隐式断言:
|
|
110
|
+
* 守卫与断言合一,避免守卫变更时编译器不报警的类型安全风险。
|
|
111
|
+
*
|
|
112
|
+
* @param value 待收窄的值
|
|
113
|
+
* @returns 非空对象返回 value as Record;否则返回空对象 {}
|
|
114
|
+
*/
|
|
115
|
+
function asRecordIfObject(value) {
|
|
116
|
+
return (value && typeof value === 'object' && !Array.isArray(value))
|
|
117
|
+
? value
|
|
118
|
+
: {};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* 断言值为字符串,否则抛出 configError
|
|
122
|
+
*
|
|
123
|
+
* 消除 loader.ts 中重复的"typeof x !== 'string' → throw"模式(ADR-017 枝叶层 2 次提取原则,6 处重复)。
|
|
124
|
+
*
|
|
125
|
+
* @param value 待校验的值
|
|
126
|
+
* @param field 字段名(用于错误信息,如 "providers.openai.model")
|
|
127
|
+
* @returns 类型收窄后的字符串
|
|
128
|
+
* @throws MemoraError(category: 'config')当值不是字符串时
|
|
129
|
+
*/
|
|
130
|
+
function assertString(value, field) {
|
|
131
|
+
if (typeof value !== 'string') {
|
|
132
|
+
throw configError(`配置项 ${field} 必须是字符串`, `当前类型: ${typeof value},当前值: ${JSON.stringify(value)}`, [
|
|
133
|
+
`检查配置文件中 ${field} 字段是否被引号包裹`,
|
|
134
|
+
'参考 README 或 default-config.json 中的字段类型约定',
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
137
|
+
return value;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 验证 temperature 值
|
|
141
|
+
*
|
|
142
|
+
* @param value 待验证的值
|
|
143
|
+
* @param defaultValue 默认值
|
|
144
|
+
* @returns 有效的 temperature 值
|
|
145
|
+
* @throws MemoraError 当值超出范围时抛出
|
|
146
|
+
*/
|
|
147
|
+
function validateTemperature(value, defaultValue) {
|
|
148
|
+
// Number.isFinite 同时排除 NaN/Infinity(对齐 zod z.number() 行为)
|
|
149
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
150
|
+
if (value < 0 || value > 2) {
|
|
151
|
+
throw configError('temperature 配置项超出范围', `当前值: ${value}(合法范围 0-2)`, ['将 temperature 调整为 0-2 之间的数字']);
|
|
152
|
+
}
|
|
153
|
+
return value;
|
|
154
|
+
}
|
|
155
|
+
return defaultValue;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* 验证 permission 值
|
|
159
|
+
*
|
|
160
|
+
* @param value 待验证的值
|
|
161
|
+
* @returns 有效的 permission 值
|
|
162
|
+
* @throws MemoraError 当值无效时抛出
|
|
163
|
+
*/
|
|
164
|
+
function validatePermission(value) {
|
|
165
|
+
if (value === undefined || value === null) {
|
|
166
|
+
return DEFAULT_CONFIG.security.permission;
|
|
167
|
+
}
|
|
168
|
+
if (value === 'owner' || value === 'guest') {
|
|
169
|
+
return value;
|
|
170
|
+
}
|
|
171
|
+
throw configError('security.permission 配置项无效', `当前值: ${JSON.stringify(value)}(仅允许 "owner" 或 "guest")`, ['将 security.permission 修改为 "owner" 或 "guest"']);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 验证 allowedPaths 数组
|
|
175
|
+
*
|
|
176
|
+
* @param value 待验证的值
|
|
177
|
+
* @returns 有效的路径数组
|
|
178
|
+
* @throws MemoraError 当数组元素类型不匹配时抛出
|
|
179
|
+
*/
|
|
180
|
+
function validateAllowedPaths(value) {
|
|
181
|
+
if (!Array.isArray(value)) {
|
|
182
|
+
return DEFAULT_CONFIG.allowedPaths;
|
|
183
|
+
}
|
|
184
|
+
// 验证每个元素都是字符串(断言失败抛 configError)
|
|
185
|
+
for (let i = 0; i < value.length; i++) {
|
|
186
|
+
assertString(value[i], `allowedPaths[${i}]`);
|
|
187
|
+
}
|
|
188
|
+
return value;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* 解析 Provider 配置映射表
|
|
192
|
+
*
|
|
193
|
+
* @param value 待解析的值
|
|
194
|
+
* @returns 有效的 Provider 配置映射表或 undefined
|
|
195
|
+
* @throws MemoraError 当 Provider 配置无效时抛出
|
|
196
|
+
*/
|
|
197
|
+
function parseProviders(value) {
|
|
198
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
const providers = {};
|
|
202
|
+
const entries = Object.entries(value);
|
|
203
|
+
for (const [key, providerValue] of entries) {
|
|
204
|
+
if (!providerValue || typeof providerValue !== 'object' || Array.isArray(providerValue)) {
|
|
205
|
+
throw configError(`配置项 providers.${key} 必须是对象`, `当前类型: ${providerValue === null ? 'null' : Array.isArray(providerValue) ? 'array' : typeof providerValue}`, [`将 providers.${key} 配置为包含 provider/model 等字段的对象`]);
|
|
206
|
+
}
|
|
207
|
+
const p = providerValue;
|
|
208
|
+
// 验证必需字段(断言失败抛 configError,返回值类型收窄为 string)
|
|
209
|
+
const providerName = assertString(p.provider, `providers.${key}.provider`);
|
|
210
|
+
const modelName = assertString(p.model, `providers.${key}.model`);
|
|
211
|
+
providers[key] = {
|
|
212
|
+
provider: providerName,
|
|
213
|
+
model: modelName,
|
|
214
|
+
// 过滤空字符串:与 parseConfig 顶层逻辑保持一致
|
|
215
|
+
baseUrl: typeof p.baseUrl === 'string' && p.baseUrl ? p.baseUrl : undefined,
|
|
216
|
+
apiKey: typeof p.apiKey === 'string' && p.apiKey ? p.apiKey : undefined,
|
|
217
|
+
temperature: p.temperature !== undefined ? validateTemperature(p.temperature, 0) : undefined,
|
|
218
|
+
contextWindow: (typeof p.contextWindow === 'number' && Number.isFinite(p.contextWindow)) ? p.contextWindow : undefined,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
return Object.keys(providers).length > 0 ? providers : undefined;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* 解析后台通道配置
|
|
225
|
+
*
|
|
226
|
+
* @param value 待解析的值
|
|
227
|
+
* @returns 有效的后台通道配置或 undefined
|
|
228
|
+
* @throws MemoraError 当配置无效时抛出
|
|
229
|
+
*/
|
|
230
|
+
function parseBackground(value) {
|
|
231
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
const bg = value;
|
|
235
|
+
// 验证必需字段(断言失败抛 configError,返回值类型收窄为 string)
|
|
236
|
+
const bgProvider = assertString(bg.provider, 'background.provider');
|
|
237
|
+
const bgModel = assertString(bg.model, 'background.model');
|
|
238
|
+
return {
|
|
239
|
+
provider: bgProvider,
|
|
240
|
+
model: bgModel,
|
|
241
|
+
baseUrl: typeof bg.baseUrl === 'string' ? bg.baseUrl : undefined,
|
|
242
|
+
apiKey: typeof bg.apiKey === 'string' ? bg.apiKey : undefined,
|
|
243
|
+
temperature: bg.temperature !== undefined ? validateTemperature(bg.temperature, 0.5) : 0.5,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* 解析 Embedding 配置
|
|
248
|
+
*
|
|
249
|
+
* @param value 待解析的值
|
|
250
|
+
* @returns 有效的 Embedding 配置或 undefined
|
|
251
|
+
* @throws MemoraError 当配置无效时抛出
|
|
252
|
+
*/
|
|
253
|
+
function parseEmbedding(value) {
|
|
254
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
255
|
+
return undefined;
|
|
256
|
+
}
|
|
257
|
+
const emb = value;
|
|
258
|
+
// 验证必需字段(断言失败抛 configError,返回值类型收窄为 string)
|
|
259
|
+
const embModel = assertString(emb.model, 'embedding.model');
|
|
260
|
+
return {
|
|
261
|
+
model: embModel,
|
|
262
|
+
baseUrl: typeof emb.baseUrl === 'string' ? emb.baseUrl : undefined,
|
|
263
|
+
apiKey: typeof emb.apiKey === 'string' ? emb.apiKey : undefined,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
121
266
|
/**
|
|
122
267
|
* 加载配置
|
|
123
268
|
*
|
|
124
|
-
* 单一真理源:所有默认值由
|
|
125
|
-
* 不再维护独立的
|
|
269
|
+
* 单一真理源:所有默认值由 DEFAULT_CONFIG 声明,
|
|
270
|
+
* 不再维护独立的 schema(避免两处真理源打架)。
|
|
271
|
+
*
|
|
272
|
+
* 查找顺序:显式 configPath → 项目级 .memora/config.json → 内置默认值。
|
|
273
|
+
* 用户级配置路径由宿主通过 configPath 显式传入。
|
|
126
274
|
*
|
|
127
275
|
* @param configPath 显式指定的配置文件路径
|
|
128
276
|
*/
|
|
@@ -138,43 +286,56 @@ export async function loadConfig(configPath) {
|
|
|
138
286
|
const config = await readJsonFile(projectPath);
|
|
139
287
|
return expandEnvVars(mergeWithDefaults(config));
|
|
140
288
|
}
|
|
141
|
-
catch {
|
|
142
|
-
//
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
const config = await readJsonFile(userPath);
|
|
148
|
-
return expandEnvVars(mergeWithDefaults(config));
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
// 用户级不存在,使用 schema 默认值(单一真理源)
|
|
289
|
+
catch (err) {
|
|
290
|
+
// 项目级不可用(不存在/损坏/权限),使用内置默认值
|
|
291
|
+
// 排除 ENOENT(正常情况),其他错误应暴露根因供诊断
|
|
292
|
+
if (!isEnoent(err)) {
|
|
293
|
+
logger.warn({ path: projectPath, err: toError(err) }, '项目级配置加载失败,使用默认值');
|
|
294
|
+
}
|
|
152
295
|
}
|
|
153
|
-
//
|
|
154
|
-
return expandEnvVars(
|
|
296
|
+
// 3. 内置默认:parseConfig({}) 让默认值生效
|
|
297
|
+
return expandEnvVars(parseConfig({}));
|
|
155
298
|
}
|
|
156
299
|
/**
|
|
157
300
|
* 读取并解析 JSON 文件
|
|
301
|
+
*
|
|
302
|
+
* 将 JSON.parse 的 SyntaxError 包装为 configError,
|
|
303
|
+
* 防止裸 Error 通过显式 --config 路径传播。
|
|
158
304
|
*/
|
|
159
305
|
async function readJsonFile(path) {
|
|
160
306
|
const content = await readFile(path, 'utf-8');
|
|
161
|
-
|
|
307
|
+
try {
|
|
308
|
+
return JSON.parse(content);
|
|
309
|
+
}
|
|
310
|
+
catch (err) {
|
|
311
|
+
throw configError(`配置文件 JSON 格式错误: ${path}`, toError(err).message, ['检查配置文件语法(逗号、引号配对、尾随逗号)']);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* 判断错误是否为 ENOENT(文件不存在)
|
|
316
|
+
*/
|
|
317
|
+
function isEnoent(err) {
|
|
318
|
+
return err instanceof Object && 'code' in err && err.code === 'ENOENT';
|
|
162
319
|
}
|
|
163
320
|
/**
|
|
164
321
|
* 合并用户配置与默认值
|
|
165
322
|
*
|
|
166
|
-
* 直接用
|
|
323
|
+
* 直接用 parseConfig(userConfig),让默认值填充缺失字段。
|
|
167
324
|
* 不再 spread DEFAULT_CONFIG,避免覆盖 schema default。
|
|
168
325
|
*/
|
|
169
326
|
function mergeWithDefaults(userConfig) {
|
|
170
|
-
return
|
|
327
|
+
return parseConfig(userConfig);
|
|
171
328
|
}
|
|
172
329
|
/**
|
|
173
330
|
* 展开 ${ENV_VAR} 占位符
|
|
174
331
|
* 配置文件可写 "apiKey": "${MEMORA_LLM_API_KEY}"
|
|
175
332
|
* 实际读取时展开为环境变量值
|
|
176
333
|
*
|
|
177
|
-
*
|
|
334
|
+
* 展开范围覆盖所有可能包含敏感信息的通道:
|
|
335
|
+
* - llm(前台主通道):apiKey / baseUrl
|
|
336
|
+
* - llm.providers(多 Provider 映射表):每个 Provider 的 apiKey / baseUrl
|
|
337
|
+
* - llm.background(后台通道):apiKey / baseUrl
|
|
338
|
+
* - embedding(向量嵌入通道):apiKey / baseUrl
|
|
178
339
|
*/
|
|
179
340
|
function expandEnvVars(config) {
|
|
180
341
|
const expand = (val) => {
|
|
@@ -183,13 +344,28 @@ function expandEnvVars(config) {
|
|
|
183
344
|
return val.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/g, (_, name) => process.env[name] ?? '');
|
|
184
345
|
};
|
|
185
346
|
// 展开 providers 映射表中的环境变量
|
|
186
|
-
const expandedProviders = config
|
|
187
|
-
.llm.providers
|
|
347
|
+
const expandedProviders = config.llm.providers
|
|
188
348
|
? Object.fromEntries(Object.entries(config.llm.providers).map(([key, p]) => [
|
|
189
349
|
key,
|
|
190
350
|
{ ...p, apiKey: expand(p.apiKey), baseUrl: expand(p.baseUrl) },
|
|
191
351
|
]))
|
|
192
352
|
: undefined;
|
|
353
|
+
// 展开 background 后台通道的环境变量(与前台 llm 通道同模式)
|
|
354
|
+
const expandedBackground = config.llm.background
|
|
355
|
+
? {
|
|
356
|
+
...config.llm.background,
|
|
357
|
+
apiKey: expand(config.llm.background.apiKey),
|
|
358
|
+
baseUrl: expand(config.llm.background.baseUrl),
|
|
359
|
+
}
|
|
360
|
+
: undefined;
|
|
361
|
+
// 展开 embedding 向量嵌入通道的环境变量
|
|
362
|
+
const expandedEmbedding = config.embedding
|
|
363
|
+
? {
|
|
364
|
+
...config.embedding,
|
|
365
|
+
apiKey: expand(config.embedding.apiKey),
|
|
366
|
+
baseUrl: expand(config.embedding.baseUrl),
|
|
367
|
+
}
|
|
368
|
+
: undefined;
|
|
193
369
|
return {
|
|
194
370
|
...config,
|
|
195
371
|
llm: {
|
|
@@ -197,7 +373,9 @@ function expandEnvVars(config) {
|
|
|
197
373
|
apiKey: expand(config.llm.apiKey),
|
|
198
374
|
baseUrl: expand(config.llm.baseUrl),
|
|
199
375
|
providers: expandedProviders,
|
|
376
|
+
background: expandedBackground,
|
|
200
377
|
},
|
|
378
|
+
embedding: expandedEmbedding,
|
|
201
379
|
};
|
|
202
380
|
}
|
|
203
381
|
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EvalRunner — Agent 行为评估执行器
|
|
3
|
+
*
|
|
4
|
+
* 职责:通过 createAgent 工厂构造测试条件 → 执行场景 →
|
|
5
|
+
* 收集 AgentChunk → 评估结果 → 汇总报告
|
|
6
|
+
*
|
|
7
|
+
* 设计要点:
|
|
8
|
+
* - 每个场景创建独立 Agent(通过工厂函数),避免状态污染
|
|
9
|
+
* - 场景执行后 close(),避免资源泄漏
|
|
10
|
+
* - 错误隔离:单个场景失败不中断其他场景
|
|
11
|
+
* - 超时保护:scenarioTimeoutMs 防止卡死(Promise.race + AbortController)
|
|
12
|
+
*
|
|
13
|
+
* 内核零依赖约束:仅使用 memora 内部模块,不引入新依赖。
|
|
14
|
+
*/
|
|
15
|
+
import type { Agent } from '../agent/agent.js';
|
|
16
|
+
import type { EvalScenario, EvalResult } from './evalTypes.js';
|
|
17
|
+
/**
|
|
18
|
+
* EvalRunner 构造选项
|
|
19
|
+
*/
|
|
20
|
+
export interface EvalRunnerOptions {
|
|
21
|
+
/**
|
|
22
|
+
* Agent 工厂函数(每个场景创建新 Agent)
|
|
23
|
+
*
|
|
24
|
+
* 工厂函数负责配置 MockProvider、guardrail 规则、预写入记忆等测试条件。
|
|
25
|
+
* EvalRunner 负责调用 init() / chat() / close() 管理 Agent 生命周期。
|
|
26
|
+
*/
|
|
27
|
+
createAgent: () => Agent;
|
|
28
|
+
/**
|
|
29
|
+
* 单个场景超时_ms(默认 10000)
|
|
30
|
+
*
|
|
31
|
+
* 超时后通过 AbortController 中断 agent.chat,
|
|
32
|
+
* 返回 passed=false 的 EvalResult。
|
|
33
|
+
*/
|
|
34
|
+
scenarioTimeoutMs?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 批量执行汇总报告
|
|
38
|
+
*/
|
|
39
|
+
export interface EvalSummary {
|
|
40
|
+
/** 每个场景的评估结果(按执行顺序) */
|
|
41
|
+
results: EvalResult[];
|
|
42
|
+
/** 通过场景数 */
|
|
43
|
+
passed: number;
|
|
44
|
+
/** 失败场景数 */
|
|
45
|
+
failed: number;
|
|
46
|
+
/** 场景总数 */
|
|
47
|
+
total: number;
|
|
48
|
+
/** 执行总耗时_ms */
|
|
49
|
+
durationMs: number;
|
|
50
|
+
/** 失败场景名列表 */
|
|
51
|
+
failedScenarios: string[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Agent 行为评估执行器
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* const runner = new EvalRunner({
|
|
59
|
+
* createAgent: () => new Agent({ projectPath, provider, configDir, dataDir, ... }),
|
|
60
|
+
* scenarioTimeoutMs: 15000,
|
|
61
|
+
* });
|
|
62
|
+
* const summary = await runner.runScenarios(EVAL_SCENARIOS);
|
|
63
|
+
* console.log(`通过 ${summary.passed}/${summary.total},耗时 ${summary.durationMs}ms`);
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare class EvalRunner {
|
|
67
|
+
#private;
|
|
68
|
+
constructor(opts: EvalRunnerOptions);
|
|
69
|
+
/**
|
|
70
|
+
* 执行单个评估场景
|
|
71
|
+
*
|
|
72
|
+
* 流程:创建 Agent → init() → chat(input) → collectAgentChunks → evaluateResult
|
|
73
|
+
*
|
|
74
|
+
* 错误隔离:任何异常(超时、Agent 抛错)都返回 passed=false 的 EvalResult,
|
|
75
|
+
* 不向上抛出,确保 runScenarios 批量执行时单个失败不中断其他场景。
|
|
76
|
+
*
|
|
77
|
+
* Agent 生命周期:每个场景执行后 close(),避免资源泄漏(try/finally 保证)。
|
|
78
|
+
*
|
|
79
|
+
* @param scenario 评估场景定义
|
|
80
|
+
* @returns 评估结果(始终返回,不抛异常)
|
|
81
|
+
*/
|
|
82
|
+
runScenario(scenario: EvalScenario): Promise<EvalResult>;
|
|
83
|
+
/**
|
|
84
|
+
* 批量执行评估场景并汇总报告
|
|
85
|
+
*
|
|
86
|
+
* 顺序执行(非并行),每个场景创建独立 Agent,避免状态污染。
|
|
87
|
+
* 错误隔离:单个场景失败不中断其他场景(由 runScenario 保证)。
|
|
88
|
+
*
|
|
89
|
+
* @param scenarios 场景列表
|
|
90
|
+
* @returns 汇总报告
|
|
91
|
+
*/
|
|
92
|
+
runScenarios(scenarios: readonly EvalScenario[]): Promise<EvalSummary>;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=evalRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evalRunner.d.ts","sourceRoot":"","sources":["../../src/eval/evalRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG/D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,WAAW,EAAE,MAAM,KAAK,CAAC;IAEzB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,YAAY;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,eAAe;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc;IACd,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAKD;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAU;;gBAMT,IAAI,EAAE,iBAAiB;IAKnC;;;;;;;;;;;;OAYG;IACG,WAAW,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IA0B9D;;;;;;;;OAQG;IACG,YAAY,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;CA6D7E"}
|