@zooique/memora 2.0.0 → 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 +233 -58
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +651 -359
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +29 -13
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +79 -44
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +26 -1
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +73 -1
- 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 +58 -14
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +184 -131
- 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/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.map +1 -1
- package/dist/agent/managers/insightExtractor.js +11 -11
- 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 +3 -3
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +53 -67
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +46 -5
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.js +127 -63
- 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 +32 -157
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +70 -363
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/relationBuilder.js +2 -2
- package/dist/agent/managers/relationBuilder.js.map +1 -1
- package/dist/agent/managers/sessionArchiver.d.ts +6 -1
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +19 -22
- package/dist/agent/managers/sessionArchiver.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.map +1 -1
- package/dist/agent/managers/textPolishManager.js +4 -7
- package/dist/agent/managers/textPolishManager.js.map +1 -1
- 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/toolExecutor.d.ts +22 -2
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +28 -3
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/types.d.ts +10 -1
- package/dist/agent/types.d.ts.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 +273 -117
- package/dist/config/loader.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/llm/embedding.d.ts +13 -1
- package/dist/llm/embedding.d.ts.map +1 -1
- 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 +2 -9
- 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 +66 -16
- 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 +31 -5
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +2 -1
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +21 -3
- 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 +99 -22
- 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 +33 -18
- 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 +11 -0
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +24 -2
- 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 -22
- 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 +36 -87
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +131 -230
- 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 -142
- 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/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 +17 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +19 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +83 -6
- 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/segmenter.d.ts +0 -10
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +10 -1
- package/dist/utils/segmenter.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 +39 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionArchiver.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/sessionArchiver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"sessionArchiver.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/sessionArchiver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,0BAA0B,CAAC;AAK9E,aAAa;AACb,MAAM,WAAW,oBAAoB;IACnC,iCAAiC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc;IACd,YAAY,EAAE,MAAM,CAAC;CACtB;AAgBD;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,2BAA2B;IAC3B,OAAO,CAAC,QAAQ,CAAc;IAC9B,2BAA2B;IAC3B,OAAO,CAAC,KAAK,CAAiB;IAC9B,qBAAqB;IACrB,OAAO,CAAC,YAAY,CAA4B;gBAG9C,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,cAAc,EACrB,YAAY,EAAE,aAAa,GAAG,SAAS;IAOzC;;;;;;;;;;;;;;;;;;OAkBG;IACG,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAuCzF;;;;;;;;;;;;OAYG;YACW,eAAe;CAgF9B"}
|
|
@@ -28,6 +28,7 @@ import { logger } from '../../logging/logger.js';
|
|
|
28
28
|
import { parseLlmJson } from '../../utils/json.js';
|
|
29
29
|
import { nowIso } from '../../utils/time.js';
|
|
30
30
|
import { truncate } from '../../utils/strings.js';
|
|
31
|
+
import { accumulateStream } from '../../agent/managers/streamAccumulator.js';
|
|
31
32
|
/** LLM 摘要提示词中的最大消息数(防止超长会话撑爆 LLM 上下文) */
|
|
32
33
|
const MAX_MESSAGES_FOR_SUMMARY = 50;
|
|
33
34
|
/** 摘要提示词中单条消息的最大字符数(防止超长单条消息) */
|
|
@@ -67,9 +68,14 @@ export class SessionArchiver {
|
|
|
67
68
|
* 4. 写入 source='content' 记忆条目
|
|
68
69
|
* 5. 返回归档结果
|
|
69
70
|
*
|
|
71
|
+
* 错误传播策略:
|
|
72
|
+
* - sessionStore 未注入 / 消息过少 / LLM 判断无价值 → 返回 emptyResult(非错误)
|
|
73
|
+
* - LLM 异常 / 写入失败 → 向上抛错,由 ArchiveCoordinator 统一 catch 并发射 archiveFailed 事件
|
|
74
|
+
*
|
|
70
75
|
* @param date 会话日期 YYYY-MM-DD
|
|
71
76
|
* @param session 会话标识(不含日期前缀)
|
|
72
|
-
* @returns 归档结果(memories
|
|
77
|
+
* @returns 归档结果(memories 可能为空,表示无归档价值)
|
|
78
|
+
* @throws LLM 调用或写入异常时抛出,由调用方决定 catch 策略
|
|
73
79
|
*/
|
|
74
80
|
async archiveSessionContent(date, session) {
|
|
75
81
|
const sessionLabel = `${date}-${session}`;
|
|
@@ -89,24 +95,18 @@ export class SessionArchiver {
|
|
|
89
95
|
logger.debug({ sessionLabel, messageCount: messages.length }, 'SessionArchiver: 消息过少,跳过');
|
|
90
96
|
return { ...emptyResult, messageCount: messages.length };
|
|
91
97
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return { ...emptyResult, messageCount: messages.length };
|
|
97
|
-
}
|
|
98
|
-
logger.info({ sessionLabel, messageCount: messages.length, memoryId: memory.id }, 'SessionArchiver: 会话内容归档完成');
|
|
99
|
-
return {
|
|
100
|
-
memories: [memory],
|
|
101
|
-
sessionLabel,
|
|
102
|
-
messageCount: messages.length,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
catch (err) {
|
|
106
|
-
// best-effort:归档失败不阻塞会话切换
|
|
107
|
-
logger.warn({ err, sessionLabel }, 'SessionArchiver: 会话归档失败');
|
|
98
|
+
// LLM 异常向上抛出,由 ArchiveCoordinator 统一 catch + emit archiveFailed
|
|
99
|
+
const memory = await this.generateSummary(messages, sessionLabel);
|
|
100
|
+
if (!memory) {
|
|
101
|
+
logger.debug({ sessionLabel }, 'SessionArchiver: LLM 判断无摘要价值');
|
|
108
102
|
return { ...emptyResult, messageCount: messages.length };
|
|
109
103
|
}
|
|
104
|
+
logger.info({ sessionLabel, messageCount: messages.length, memoryId: memory.id }, 'SessionArchiver: 会话内容归档完成');
|
|
105
|
+
return {
|
|
106
|
+
memories: [memory],
|
|
107
|
+
sessionLabel,
|
|
108
|
+
messageCount: messages.length,
|
|
109
|
+
};
|
|
110
110
|
}
|
|
111
111
|
/**
|
|
112
112
|
* 调用 LLM 生成会话摘要并写入记忆存储
|
|
@@ -153,11 +153,8 @@ export class SessionArchiver {
|
|
|
153
153
|
${dialogueText}
|
|
154
154
|
=== 会话结束 ===`;
|
|
155
155
|
const llmMessages = [{ role: 'user', content: summaryPrompt }];
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
if (chunk.content)
|
|
159
|
-
llmResponse += chunk.content;
|
|
160
|
-
}
|
|
156
|
+
// 流式累积(复用 accumulateStream 工具函数)
|
|
157
|
+
const llmResponse = await accumulateStream(this.provider, llmMessages);
|
|
161
158
|
// 解析 LLM 响应
|
|
162
159
|
const trimmed = llmResponse.trim();
|
|
163
160
|
if (trimmed === 'null' || !trimmed) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionArchiver.js","sourceRoot":"","sources":["../../../src/agent/managers/sessionArchiver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAK/C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"sessionArchiver.js","sourceRoot":"","sources":["../../../src/agent/managers/sessionArchiver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 流式累积工具 — 纯函数,累积 LLM 流式响应的 chunk.content
|
|
3
|
+
*
|
|
4
|
+
* 消除多个 Manager 中重复的"for await + chunk.content 拼接"模式(ADR-017 枝叶层提取)。
|
|
5
|
+
*
|
|
6
|
+
* 设计原则:
|
|
7
|
+
* - 纯工具函数,不持有业务逻辑
|
|
8
|
+
* - 不解析 JSON(由调用方决定用 parseLlmJson 或其他方式)
|
|
9
|
+
* - 不处理 null(由调用方决定降级或抛错)
|
|
10
|
+
* - 不捕获 provider 异常(由调用方决定 try/catch 或向上抛)
|
|
11
|
+
*
|
|
12
|
+
* 使用示例:
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const raw = await accumulateStream(provider, messages, { maxTokens: 400 });
|
|
15
|
+
* const parsed = parseLlmJson<MyType>(raw.trim());
|
|
16
|
+
* if (!parsed) return defaultValue; // 调用方决定降级策略
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* 与 judgeWithLlm 的关系:
|
|
20
|
+
* - accumulateStream:纯流式累积(容错模式,调用方决定后续处理)
|
|
21
|
+
* - judgeWithLlm:严格模式封装(流式累积 + parseLlmJson + null 抛 configError)
|
|
22
|
+
* - judgeWithLlm 内部也调用 accumulateStream,避免自身重复
|
|
23
|
+
*/
|
|
24
|
+
import type { LlmProvider, Message } from '../../llm/provider.js';
|
|
25
|
+
/** LLM 调用选项(与 provider.chat 的 options 对齐,可选传递) */
|
|
26
|
+
export interface AccumulateOptions {
|
|
27
|
+
/** 流式响应的最大 token 数(控制单次调用成本) */
|
|
28
|
+
maxTokens?: number;
|
|
29
|
+
/** 温度参数(0=确定性,1=创造性) */
|
|
30
|
+
temperature?: number;
|
|
31
|
+
/** LLM 调用超时(ms),超时后中止请求 */
|
|
32
|
+
timeoutMs?: number;
|
|
33
|
+
/** 可选的取消信号(与 timeoutMs 互相独立,任一触发即中止) */
|
|
34
|
+
signal?: AbortSignal;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 累积 LLM 流式响应的 chunk.content
|
|
38
|
+
*
|
|
39
|
+
* @param provider LLM Provider 实例
|
|
40
|
+
* @param messages LLM 消息数组(system + user)
|
|
41
|
+
* @param options 可选的调用参数(maxTokens/temperature/timeoutMs/signal)
|
|
42
|
+
* @returns 累积后的完整字符串(可能为空字符串,调用方需自行处理)
|
|
43
|
+
*/
|
|
44
|
+
export declare function accumulateStream(provider: LlmProvider, messages: Message[], options?: AccumulateOptions): Promise<string>;
|
|
45
|
+
//# sourceMappingURL=streamAccumulator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamAccumulator.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/streamAccumulator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE9D,kDAAkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAMjB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 流式累积工具 — 纯函数,累积 LLM 流式响应的 chunk.content
|
|
3
|
+
*
|
|
4
|
+
* 消除多个 Manager 中重复的"for await + chunk.content 拼接"模式(ADR-017 枝叶层提取)。
|
|
5
|
+
*
|
|
6
|
+
* 设计原则:
|
|
7
|
+
* - 纯工具函数,不持有业务逻辑
|
|
8
|
+
* - 不解析 JSON(由调用方决定用 parseLlmJson 或其他方式)
|
|
9
|
+
* - 不处理 null(由调用方决定降级或抛错)
|
|
10
|
+
* - 不捕获 provider 异常(由调用方决定 try/catch 或向上抛)
|
|
11
|
+
*
|
|
12
|
+
* 使用示例:
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const raw = await accumulateStream(provider, messages, { maxTokens: 400 });
|
|
15
|
+
* const parsed = parseLlmJson<MyType>(raw.trim());
|
|
16
|
+
* if (!parsed) return defaultValue; // 调用方决定降级策略
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* 与 judgeWithLlm 的关系:
|
|
20
|
+
* - accumulateStream:纯流式累积(容错模式,调用方决定后续处理)
|
|
21
|
+
* - judgeWithLlm:严格模式封装(流式累积 + parseLlmJson + null 抛 configError)
|
|
22
|
+
* - judgeWithLlm 内部也调用 accumulateStream,避免自身重复
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* 累积 LLM 流式响应的 chunk.content
|
|
26
|
+
*
|
|
27
|
+
* @param provider LLM Provider 实例
|
|
28
|
+
* @param messages LLM 消息数组(system + user)
|
|
29
|
+
* @param options 可选的调用参数(maxTokens/temperature/timeoutMs/signal)
|
|
30
|
+
* @returns 累积后的完整字符串(可能为空字符串,调用方需自行处理)
|
|
31
|
+
*/
|
|
32
|
+
export async function accumulateStream(provider, messages, options) {
|
|
33
|
+
let result = '';
|
|
34
|
+
for await (const chunk of provider.chat(messages, options)) {
|
|
35
|
+
if (chunk.content)
|
|
36
|
+
result += chunk.content;
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=streamAccumulator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamAccumulator.js","sourceRoot":"","sources":["../../../src/agent/managers/streamAccumulator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAgBH;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAqB,EACrB,QAAmB,EACnB,OAA2B;IAE3B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;QAC3D,IAAI,KAAK,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textPolishManager.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/textPolishManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"textPolishManager.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/textPolishManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAY9D,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;CAClB;AAoCD;;;;;;;;;;GAUG;AACH,qBAAa,iBAAiB;IAC5B,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IAEvC;;OAEG;gBACS,QAAQ,EAAE,WAAW;IAIjC;;;;;;;;;;;;OAYG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CA0BxE"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { logger } from '../../logging/logger.js';
|
|
2
|
+
import { accumulateStream } from '../../agent/managers/streamAccumulator.js';
|
|
2
3
|
/** 润色请求超时(ms),单次润色应快速完成 */
|
|
3
4
|
const POLISH_TIMEOUT_MS = 15_000;
|
|
4
5
|
/** 润色输入文本截断上限(字符),控制 LLM token 消耗 */
|
|
@@ -72,19 +73,15 @@ export class TextPolishManager {
|
|
|
72
73
|
// 截断过长的输入(控制 token 消耗)
|
|
73
74
|
const truncated = text.slice(0, POLISH_INPUT_LIMIT);
|
|
74
75
|
const messages = buildPolishMessages(truncated);
|
|
75
|
-
//
|
|
76
|
+
// 流式累积模式(复用 accumulateStream 工具函数,与 WorkProjectionManager 等一致)
|
|
76
77
|
let result = '';
|
|
77
78
|
try {
|
|
78
|
-
|
|
79
|
+
result = await accumulateStream(this.provider, messages, {
|
|
79
80
|
maxTokens: 500,
|
|
80
81
|
temperature: 0.3,
|
|
81
82
|
timeoutMs: POLISH_TIMEOUT_MS,
|
|
82
83
|
signal,
|
|
83
|
-
})
|
|
84
|
-
if (chunk.content) {
|
|
85
|
-
result += chunk.content;
|
|
86
|
-
}
|
|
87
|
-
}
|
|
84
|
+
});
|
|
88
85
|
}
|
|
89
86
|
catch (error) {
|
|
90
87
|
logger.warn({ error }, '文本润色 LLM 调用失败');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textPolishManager.js","sourceRoot":"","sources":["../../../src/agent/managers/textPolishManager.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"textPolishManager.js","sourceRoot":"","sources":["../../../src/agent/managers/textPolishManager.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,2BAA2B;AAC3B,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,qCAAqC;AACrC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAYhC,0EAA0E;AAE1E;;;;;;;;;;GAUG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO;QACL;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;;;;;;;;6CAQ8B;SACxC;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI;SACd;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,OAAO,iBAAiB;IAC5B,kDAAkD;IACjC,QAAQ,CAAc;IAEvC;;OAEG;IACH,YAAY,QAAqB;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,MAAoB;QAC7C,uBAAuB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAEpD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAEhD,+DAA+D;QAC/D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE;gBACvD,SAAS,EAAE,GAAG;gBACd,WAAW,EAAE,GAAG;gBAChB,SAAS,EAAE,iBAAiB;gBAC5B,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,eAAe,CAAC,CAAC;YACxC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,uBAAuB;QACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAEzD,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1D,CAAC;CACF"}
|
|
@@ -26,7 +26,9 @@ export interface WorkProjectionEntry {
|
|
|
26
26
|
export declare class WorkProjectionManager {
|
|
27
27
|
private readonly index;
|
|
28
28
|
private readonly provider;
|
|
29
|
-
|
|
29
|
+
/** 作品投影生成/更新时的回调(宿主可据此发射事件通知用户) */
|
|
30
|
+
private readonly onGenerated?;
|
|
31
|
+
constructor(index: IMemoryStorage, provider: LlmProvider, onGenerated?: (sourcePath: string, summary: string) => void);
|
|
30
32
|
/**
|
|
31
33
|
* in-flight Promise 缓存,防止同文件并发读取时重复调用 LLM
|
|
32
34
|
* key: sourcePath(同一文件路径只会有一个未完成的生成 Promise)
|
|
@@ -61,6 +63,19 @@ export declare class WorkProjectionManager {
|
|
|
61
63
|
* @returns 投影条目,不存在返回 null
|
|
62
64
|
*/
|
|
63
65
|
getProjection(filePath: string): Promise<WorkProjectionEntry | null>;
|
|
66
|
+
/**
|
|
67
|
+
* 等待所有 inflight 投影生成完成
|
|
68
|
+
*
|
|
69
|
+
* FIX-P0-1:Agent.close() 调用此方法,确保所有正在进行的 LLM 生成 Promise
|
|
70
|
+
* 完成后再关闭 storage,防止 close 后 upsert 写入已关闭的 storage。
|
|
71
|
+
*
|
|
72
|
+
* 实现:等待 inflight Map 中所有 Promise 完成(不论成功失败)。
|
|
73
|
+
* 不 abort LLM 调用——作品投影生成是用户主动触发的高价值操作,
|
|
74
|
+
* 让正在进行的生成完成比快速失败更合理(与 L2 时效性评估的批量场景不同)。
|
|
75
|
+
*
|
|
76
|
+
* @returns 完成 Promise,无 inflight 时立即 resolve
|
|
77
|
+
*/
|
|
78
|
+
awaitInflight(): Promise<void>;
|
|
64
79
|
/**
|
|
65
80
|
* 加载所有作品投影(按 source 标签召回)
|
|
66
81
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workProjection.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/workProjection.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"workProjection.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/workProjection.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAcnE,iBAAiB;AACjB,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS;IACT,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW;IACX,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,qBAAa,qBAAqB;IAK9B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,mCAAmC;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAgD;gBAG1D,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,WAAW,EACtC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI;IAK7D;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+D;IAExF;;;;;;;;;;;;;;;;OAgBG;IACG,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAgBtC;;OAEG;YACW,kBAAkB;IAkDhC;;;;;OAKG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAO1E;;;;;;;;;;;OAWG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAOpC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAO/C;;;;;;OAMG;YACW,QAAQ;IAoDtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAIjB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAoBhB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAclB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAYrB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;CA6CtB"}
|
|
@@ -28,6 +28,7 @@ import { getBaseName } from '../../utils/path.js';
|
|
|
28
28
|
import { toError } from '../../utils/toError.js';
|
|
29
29
|
import { parseLlmJson } from '../../utils/json.js';
|
|
30
30
|
import { nowIso } from '../../utils/time.js';
|
|
31
|
+
import { accumulateStream } from '../../agent/managers/streamAccumulator.js';
|
|
31
32
|
/** 作品投影生成时内容截断长度(字符),控制 LLM token 消耗 */
|
|
32
33
|
const CONTENT_TRUNCATE_CHARS = 3000;
|
|
33
34
|
/**
|
|
@@ -39,9 +40,12 @@ const CONTENT_TRUNCATE_CHARS = 3000;
|
|
|
39
40
|
export class WorkProjectionManager {
|
|
40
41
|
index;
|
|
41
42
|
provider;
|
|
42
|
-
|
|
43
|
+
/** 作品投影生成/更新时的回调(宿主可据此发射事件通知用户) */
|
|
44
|
+
onGenerated;
|
|
45
|
+
constructor(index, provider, onGenerated) {
|
|
43
46
|
this.index = index;
|
|
44
47
|
this.provider = provider;
|
|
48
|
+
this.onGenerated = onGenerated;
|
|
45
49
|
}
|
|
46
50
|
/**
|
|
47
51
|
* in-flight Promise 缓存,防止同文件并发读取时重复调用 LLM
|
|
@@ -113,6 +117,7 @@ export class WorkProjectionManager {
|
|
|
113
117
|
// 写入存储(source = 'work-projection',语义独立)
|
|
114
118
|
this.index.upsert(this.toMemory(entry, hash));
|
|
115
119
|
logger.info({ file: filePath, hash, summaryLen: projection.summary.length }, '作品投影已生成');
|
|
120
|
+
this.onGenerated?.(filePath, projection.summary);
|
|
116
121
|
return entry;
|
|
117
122
|
}
|
|
118
123
|
catch (err) {
|
|
@@ -132,6 +137,25 @@ export class WorkProjectionManager {
|
|
|
132
137
|
const existing = this.index.getById(id);
|
|
133
138
|
return existing ? this.fromMemory(existing) : null;
|
|
134
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* 等待所有 inflight 投影生成完成
|
|
142
|
+
*
|
|
143
|
+
* FIX-P0-1:Agent.close() 调用此方法,确保所有正在进行的 LLM 生成 Promise
|
|
144
|
+
* 完成后再关闭 storage,防止 close 后 upsert 写入已关闭的 storage。
|
|
145
|
+
*
|
|
146
|
+
* 实现:等待 inflight Map 中所有 Promise 完成(不论成功失败)。
|
|
147
|
+
* 不 abort LLM 调用——作品投影生成是用户主动触发的高价值操作,
|
|
148
|
+
* 让正在进行的生成完成比快速失败更合理(与 L2 时效性评估的批量场景不同)。
|
|
149
|
+
*
|
|
150
|
+
* @returns 完成 Promise,无 inflight 时立即 resolve
|
|
151
|
+
*/
|
|
152
|
+
async awaitInflight() {
|
|
153
|
+
if (this.inflight.size === 0)
|
|
154
|
+
return;
|
|
155
|
+
// 收集所有 inflight Promise,等待全部完成
|
|
156
|
+
const promises = Array.from(this.inflight.values());
|
|
157
|
+
await Promise.allSettled(promises);
|
|
158
|
+
}
|
|
135
159
|
/**
|
|
136
160
|
* 加载所有作品投影(按 source 标签召回)
|
|
137
161
|
*/
|
|
@@ -153,28 +177,24 @@ export class WorkProjectionManager {
|
|
|
153
177
|
const promptMessages = [
|
|
154
178
|
{
|
|
155
179
|
role: 'system',
|
|
156
|
-
content: `你是作品分析助手。阅读用户的作品,生成一个"投影"——完整的作品概要、结构和关键决策。
|
|
157
|
-
|
|
158
|
-
输出格式(严格 JSON,不含 markdown 代码块标记):
|
|
159
|
-
{
|
|
160
|
-
"summary": "50-100字的作品概要",
|
|
161
|
-
"structure": ["模块1", "模块2", "..."],
|
|
162
|
-
"keyDecisions": ["关键决策1", "关键决策2", "..."]
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
要求:
|
|
166
|
-
- summary 控制在 50-100 字
|
|
167
|
-
- structure 列出 2-8 个模块名称
|
|
168
|
-
- keyDecisions 列出 1-3 个关键决策(如有)
|
|
180
|
+
content: `你是作品分析助手。阅读用户的作品,生成一个"投影"——完整的作品概要、结构和关键决策。
|
|
181
|
+
|
|
182
|
+
输出格式(严格 JSON,不含 markdown 代码块标记):
|
|
183
|
+
{
|
|
184
|
+
"summary": "50-100字的作品概要",
|
|
185
|
+
"structure": ["模块1", "模块2", "..."],
|
|
186
|
+
"keyDecisions": ["关键决策1", "关键决策2", "..."]
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
要求:
|
|
190
|
+
- summary 控制在 50-100 字
|
|
191
|
+
- structure 列出 2-8 个模块名称
|
|
192
|
+
- keyDecisions 列出 1-3 个关键决策(如有)
|
|
169
193
|
- 不评价优劣,只客观描述`,
|
|
170
194
|
},
|
|
171
195
|
{ role: 'user', content: `# ${name}\n\n${truncated}` },
|
|
172
196
|
];
|
|
173
|
-
|
|
174
|
-
for await (const chunk of this.provider.chat(promptMessages, { maxTokens: 400 })) {
|
|
175
|
-
if (chunk.content)
|
|
176
|
-
result += chunk.content;
|
|
177
|
-
}
|
|
197
|
+
const result = await accumulateStream(this.provider, promptMessages, { maxTokens: 400 });
|
|
178
198
|
const parsed = parseLlmJson(result.trim());
|
|
179
199
|
if (parsed) {
|
|
180
200
|
return {
|
|
@@ -216,7 +236,7 @@ export class WorkProjectionManager {
|
|
|
216
236
|
const fileName = getBaseName(entry.sourcePath);
|
|
217
237
|
return {
|
|
218
238
|
id: entry.id,
|
|
219
|
-
content: this.encodeContent(hash, entry.structure, entry.keyDecisions, entry.summary),
|
|
239
|
+
content: this.encodeContent(hash, entry.sourcePath, entry.structure, entry.keyDecisions, entry.summary),
|
|
220
240
|
source: SOURCE_LABELS.WORK_PROJECTION,
|
|
221
241
|
name: `作品投影: ${fileName}`,
|
|
222
242
|
createdAt: now,
|
|
@@ -230,10 +250,11 @@ export class WorkProjectionManager {
|
|
|
230
250
|
* 从 content 的 HTML 注释中解码 hash / structure / keyDecisions
|
|
231
251
|
*/
|
|
232
252
|
fromMemory(m) {
|
|
233
|
-
const { hash, structure, keyDecisions, summary } = this.decodeContent(m.content);
|
|
253
|
+
const { hash, structure, keyDecisions, summary, sourcePath } = this.decodeContent(m.content);
|
|
234
254
|
return {
|
|
235
255
|
id: m.id,
|
|
236
|
-
sourcePath
|
|
256
|
+
// M1 修复:从 content 还原 sourcePath(旧数据无该字段 → 兜底空串,向后兼容)
|
|
257
|
+
sourcePath: sourcePath ?? '',
|
|
237
258
|
fileHash: hash ?? '',
|
|
238
259
|
summary,
|
|
239
260
|
structure,
|
|
@@ -249,8 +270,9 @@ export class WorkProjectionManager {
|
|
|
249
270
|
* (空行)
|
|
250
271
|
* <summary>
|
|
251
272
|
*/
|
|
252
|
-
encodeContent(hash, structure, keyDecisions, summary) {
|
|
253
|
-
|
|
273
|
+
encodeContent(hash, sourcePath, structure, keyDecisions, summary) {
|
|
274
|
+
// M1 修复:将 sourcePath 编入元数据,使往返(toMemory → fromMemory)不丢字段
|
|
275
|
+
const meta = JSON.stringify({ hash, sourcePath, structure, decisions: keyDecisions });
|
|
254
276
|
return `${meta}\n\n${summary}`;
|
|
255
277
|
}
|
|
256
278
|
/**
|
|
@@ -268,6 +290,7 @@ export class WorkProjectionManager {
|
|
|
268
290
|
const summary = content.slice(firstLine.length).trim();
|
|
269
291
|
return {
|
|
270
292
|
hash: meta.hash ?? null,
|
|
293
|
+
sourcePath: meta.sourcePath ?? '',
|
|
271
294
|
structure: meta.structure ?? [],
|
|
272
295
|
keyDecisions: meta.decisions ?? [],
|
|
273
296
|
summary,
|
|
@@ -284,6 +307,7 @@ export class WorkProjectionManager {
|
|
|
284
307
|
const summary = content.replace(/<!--\s*wp:\S+\s*-->\n?/g, '').trim();
|
|
285
308
|
return {
|
|
286
309
|
hash: hashMatch?.[1] ?? null,
|
|
310
|
+
sourcePath: '',
|
|
287
311
|
structure: structureMatch?.[1]?.split('|') ?? [],
|
|
288
312
|
keyDecisions: decisionsMatch?.[1]?.split('|') ?? [],
|
|
289
313
|
summary,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workProjection.js","sourceRoot":"","sources":["../../../src/agent/managers/workProjection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"workProjection.js","sourceRoot":"","sources":["../../../src/agent/managers/workProjection.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,13 +67,22 @@ export declare class ToolExecutor {
|
|
|
67
67
|
private readonly customTools;
|
|
68
68
|
/** 内置工具处理器(路径安全 + 内置工具实现) */
|
|
69
69
|
private readonly builtinHandlers;
|
|
70
|
+
/**
|
|
71
|
+
* 工具列表变更回调(由 assembleComponents 设置为 loop.refreshToolDefinitions)
|
|
72
|
+
*
|
|
73
|
+
* registerTool 调用后触发,确保 AgentLoop 的 toolDefinitions 快照和 system prompt
|
|
74
|
+
* 同步更新。无 AgentLoop 时为 undefined(如纯 ToolExecutor 单元测试场景)。
|
|
75
|
+
*/
|
|
76
|
+
private onToolsChanged?;
|
|
70
77
|
constructor(projectPath: string, security: SecurityGuard, memoryIndex: IMemoryStorage,
|
|
71
78
|
/** 作品投影管理器(可选,读取文件时自动生成投影) */
|
|
72
|
-
workProjection?: WorkProjectionManager
|
|
79
|
+
workProjection?: WorkProjectionManager,
|
|
80
|
+
/** 配置目录路径(可选,拦截提示中告知 LLM 正确的写入位置) */
|
|
81
|
+
configDir?: string);
|
|
73
82
|
/**
|
|
74
83
|
* 注册自定义工具
|
|
75
84
|
*
|
|
76
|
-
* 宿主项目调用此方法注册领域专属工具(如
|
|
85
|
+
* 宿主项目调用此方法注册领域专属工具(如 run_tests、query_database、send_email 等业务专属操作)。
|
|
77
86
|
* 工具名不能与内置工具重复,也不能重复注册。
|
|
78
87
|
* 注册后工具会出现在 `tools.list` 列表中,
|
|
79
88
|
* LLM 可通过 tool_call 调用,execute() 会路由到 handler。
|
|
@@ -83,6 +92,17 @@ export declare class ToolExecutor {
|
|
|
83
92
|
* @throws 工具名与内置工具冲突或已注册时抛错
|
|
84
93
|
*/
|
|
85
94
|
registerTool(definition: ToolDefinition, handler: ToolHandler): void;
|
|
95
|
+
/**
|
|
96
|
+
* 设置工具列表变更回调
|
|
97
|
+
*
|
|
98
|
+
* 由 assembleComponents 在构造 AgentLoop 后调用,将 loop.refreshToolDefinitions
|
|
99
|
+
* 绑定到 registerTool 的副作用链路中。这样宿主调用 registerTool 注册工具后,
|
|
100
|
+
* AgentLoop 的 toolDefinitions 快照和 system prompt 会自动刷新,
|
|
101
|
+
* 无需宿主手动调用 refreshToolDefinitions。
|
|
102
|
+
*
|
|
103
|
+
* @param callback 工具列表变更时的回调(传 undefined 清除回调)
|
|
104
|
+
*/
|
|
105
|
+
setOnToolsChanged(callback: (() => void) | undefined): void;
|
|
86
106
|
/**
|
|
87
107
|
* 获取所有工具定义(IX-02:统一为 getter 风格,与 persona/skill 一致)
|
|
88
108
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolExecutor.d.ts","sourceRoot":"","sources":["../../src/agent/toolExecutor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE7E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAgB/F;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,2CAA2C;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;
|
|
1
|
+
{"version":3,"file":"toolExecutor.d.ts","sourceRoot":"","sources":["../../src/agent/toolExecutor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE7E,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,KAAK,UAAU,GAAG,MAAM,CAAC;AAEzB;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC,OAAO,CAAC,CAAC;CACvB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAgB/F;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,2CAA2C;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAsB;IACtD;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAAC,CAAa;gBAGlC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,aAAa,EACvB,WAAW,EAAE,cAAc;IAC3B,8BAA8B;IAC9B,cAAc,CAAC,EAAE,qBAAqB;IACtC,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM;IAapB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IA2BpE;;;;;;;;;OASG;IACH,iBAAiB,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,GAAG,IAAI;IAI3D;;OAEG;IACH,IAAI,IAAI,IAAI,cAAc,EAAE,CAE3B;IAED;;;;;;;;;;;;OAYG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAwGhG;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,qBAAqB;CAyE9B"}
|
|
@@ -15,17 +15,26 @@ export class ToolExecutor {
|
|
|
15
15
|
customTools = new Map();
|
|
16
16
|
/** 内置工具处理器(路径安全 + 内置工具实现) */
|
|
17
17
|
builtinHandlers;
|
|
18
|
+
/**
|
|
19
|
+
* 工具列表变更回调(由 assembleComponents 设置为 loop.refreshToolDefinitions)
|
|
20
|
+
*
|
|
21
|
+
* registerTool 调用后触发,确保 AgentLoop 的 toolDefinitions 快照和 system prompt
|
|
22
|
+
* 同步更新。无 AgentLoop 时为 undefined(如纯 ToolExecutor 单元测试场景)。
|
|
23
|
+
*/
|
|
24
|
+
onToolsChanged;
|
|
18
25
|
constructor(projectPath, security, memoryIndex,
|
|
19
26
|
/** 作品投影管理器(可选,读取文件时自动生成投影) */
|
|
20
|
-
workProjection
|
|
27
|
+
workProjection,
|
|
28
|
+
/** 配置目录路径(可选,拦截提示中告知 LLM 正确的写入位置) */
|
|
29
|
+
configDir) {
|
|
21
30
|
// 内置工具实现 + 路径安全委托给 BuiltinToolHandlers
|
|
22
31
|
// 构造参数仅用于初始化 BuiltinToolHandlers,ToolExecutor 自身不再持有这些引用
|
|
23
|
-
this.builtinHandlers = new BuiltinToolHandlers(projectPath, security, memoryIndex, workProjection);
|
|
32
|
+
this.builtinHandlers = new BuiltinToolHandlers(projectPath, security, memoryIndex, workProjection, configDir);
|
|
24
33
|
}
|
|
25
34
|
/**
|
|
26
35
|
* 注册自定义工具
|
|
27
36
|
*
|
|
28
|
-
* 宿主项目调用此方法注册领域专属工具(如
|
|
37
|
+
* 宿主项目调用此方法注册领域专属工具(如 run_tests、query_database、send_email 等业务专属操作)。
|
|
29
38
|
* 工具名不能与内置工具重复,也不能重复注册。
|
|
30
39
|
* 注册后工具会出现在 `tools.list` 列表中,
|
|
31
40
|
* LLM 可通过 tool_call 调用,execute() 会路由到 handler。
|
|
@@ -52,6 +61,22 @@ export class ToolExecutor {
|
|
|
52
61
|
}
|
|
53
62
|
this.customTools.set(definition.name, { definition, handler });
|
|
54
63
|
logger.info({ tool: definition.name }, '自定义工具已注册');
|
|
64
|
+
// 触发 AgentLoop 刷新 toolDefinitions 快照 + system prompt
|
|
65
|
+
// 未设置回调时(如单元测试)静默跳过
|
|
66
|
+
this.onToolsChanged?.();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 设置工具列表变更回调
|
|
70
|
+
*
|
|
71
|
+
* 由 assembleComponents 在构造 AgentLoop 后调用,将 loop.refreshToolDefinitions
|
|
72
|
+
* 绑定到 registerTool 的副作用链路中。这样宿主调用 registerTool 注册工具后,
|
|
73
|
+
* AgentLoop 的 toolDefinitions 快照和 system prompt 会自动刷新,
|
|
74
|
+
* 无需宿主手动调用 refreshToolDefinitions。
|
|
75
|
+
*
|
|
76
|
+
* @param callback 工具列表变更时的回调(传 undefined 清除回调)
|
|
77
|
+
*/
|
|
78
|
+
setOnToolsChanged(callback) {
|
|
79
|
+
this.onToolsChanged = callback;
|
|
55
80
|
}
|
|
56
81
|
/**
|
|
57
82
|
* 获取所有工具定义(IX-02:统一为 getter 风格,与 persona/skill 一致)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolExecutor.js","sourceRoot":"","sources":["../../src/agent/toolExecutor.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,OAAO,EAAE,aAAa,EAAuB,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAoExD;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IACvB,2CAA2C;IAC1B,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClE,6BAA6B;IACZ,eAAe,CAAsB;
|
|
1
|
+
{"version":3,"file":"toolExecutor.js","sourceRoot":"","sources":["../../src/agent/toolExecutor.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,OAAO,EAAE,aAAa,EAAuB,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAoExD;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IACvB,2CAA2C;IAC1B,WAAW,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClE,6BAA6B;IACZ,eAAe,CAAsB;IACtD;;;;;OAKG;IACK,cAAc,CAAc;IAEpC,YACE,WAAmB,EACnB,QAAuB,EACvB,WAA2B;IAC3B,8BAA8B;IAC9B,cAAsC;IACtC,qCAAqC;IACrC,SAAkB;QAElB,uCAAuC;QACvC,yDAAyD;QACzD,IAAI,CAAC,eAAe,GAAG,IAAI,mBAAmB,CAC5C,WAAW,EACX,QAAQ,EACR,WAAW,EACX,cAAc,EACd,SAAS,CACV,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,UAA0B,EAAE,OAAoB;QAC3D,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1E,MAAM,WAAW,CACf,UAAU,UAAU,CAAC,IAAI,GAAG,EAC5B,yBAAyB,EACzB,CAAC,iBAAiB,CAAC,CACpB,CAAC;QACJ,CAAC;QACD,YAAY;QACZ,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,WAAW,CAAC,YAAY,UAAU,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE;gBAC1D,YAAY;aACb,CAAC,CAAC;QACL,CAAC;QACD,UAAU;QACV,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,WAAW,CAAC,SAAS,UAAU,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE;gBACvD,qBAAqB;aACtB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;QACnD,qDAAqD;QACrD,oBAAoB;QACpB,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;IAC1B,CAAC;IAED;;;;;;;;;OASG;IACH,iBAAiB,CAAC,QAAkC;QAClD,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACN,OAAO,CAAC,GAAG,aAAa,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACxF,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,QAAgB,EAAE,UAA4B;QACxE,IAAI,IAA6B,CAAC;QAClC,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAA4B,CAAC;QACzD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,SAAS,CACb,UAAU,EACV,gBAAgB,CAAC,CAAC,OAAO,EAAE,EAC3B,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,EACxC,CAAC,EACD,aAAa,CAAC,cAAc,CAC7B,CAAC;QACJ,CAAC;QAED,gBAAgB;QAChB,mDAAmD;QACnD,8CAA8C;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC1D,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YACnC,CAAC;YACD,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7C,CAAC,CACH,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;QAEpD,8CAA8C;QAC9C,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,QAAiB,EAAU,EAAE;YACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC;QAEF,gCAAgC;QAChC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,WAAW;gBACd,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACvD,KAAK,YAAY;gBACf,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,CACnC,MAAM,CAAC,MAAM,CAAC,EACd,MAAM,CAAC,SAAS,CAAC,EACjB,UAAU,EACV,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAC3B,MAAM,CAAC,aAAa,CAAC,IAAI,SAAS,CACnC,CAAC;YACJ,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CACjC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnB,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,EAC5B,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CACxB,CAAC;YACJ,KAAK,iBAAiB;gBACpB,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,CACxC,MAAM,CAAC,OAAO,CAAC,EACf,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EACrB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CACxB,CAAC;YACJ,OAAO,CAAC,CAAC,CAAC;gBACR,oCAAoC;gBACpC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAC1C,IAAI,MAAM,EAAE,CAAC;oBACX,qCAAqC;oBACrC,8BAA8B;oBAC9B,MAAM,GAAG,GAAgB;wBACvB,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE;4BAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;4BAChE,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;wBACtE,CAAC;qBACF,CAAC;oBACF,IAAI,CAAC;wBACH,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBACzC,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,8BAA8B;wBAC9B,IAAI,GAAG,YAAY,WAAW;4BAAE,MAAM,GAAG,CAAC;wBAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;wBACvB,MAAM,SAAS,CACb,WAAW,EACX,GAAG,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,EACvB,CAAC,YAAY,EAAE,wBAAwB,CAAC,EACxC,CAAC,EACD,aAAa,CAAC,kBAAkB,CACjC,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,MAAM,SAAS,CACb,MAAM,EACN,mBAAmB,IAAI,EAAE,EACzB;oBACE,SAAS,IAAI,CAAC,IAAI;yBACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;yBAClB,IAAI,CAAC,IAAI,CAAC,EAAE;oBACf,4BAA4B;iBAC7B,EACD,SAAS,EACT,aAAa,CAAC,YAAY,CAC3B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACK,qBAAqB,CAC3B,QAAgB,EAChB,IAA6B,EAC7B,UAA0B;QAE1B,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC;QAC/C,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC;QAChD,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;QAE3B,SAAS;QACT,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBACtD,MAAM,SAAS,CACb,QAAQ,EACR,GAAG,QAAQ,aAAa,GAAG,GAAG,EAC9B,CAAC,OAAO,GAAG,UAAU,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC,EACrD,SAAS,EACT,aAAa,CAAC,cAAc,CAC7B,CAAC;YACJ,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAS,CAAC,YAAY;YAEjE,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC;YACjC,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC;YAEhC,wCAAwC;YACxC,IAAI,YAAY,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBACzD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC5B,MAAM,CAAC,KAAK,CACV,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAC9D,UAAU,CACX,CAAC;YACJ,CAAC;YACD,8BAA8B;iBACzB,IAAI,YAAY,KAAK,QAAQ,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;oBAClB,MAAM,CAAC,KAAK,CACV,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAC5D,UAAU,CACX,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,gCAAgC;iBAC3B,IAAI,YAAY,KAAK,SAAS,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC/D,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBACtC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACrB,CAAC;qBAAM,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;oBAC9C,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACtB,CAAC;gBACD,MAAM,CAAC,KAAK,CACV,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAC7D,UAAU,CACX,CAAC;YACJ,CAAC;YACD,qBAAqB;iBAChB,IAAI,YAAY,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3D,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACtB,MAAM,CAAC,KAAK,CACV,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAC7D,UAAU,CACX,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|