@zooique/memora 1.0.1 → 2.0.0
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.md +4 -4
- package/dist/agent/agent.d.ts +66 -99
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +263 -208
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +3 -3
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +10 -9
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/builtinToolHandlers.d.ts +1 -1
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +5 -4
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/loop.d.ts +79 -1
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +315 -189
- package/dist/agent/loop.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/insightExtractor.d.ts +31 -3
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
- package/dist/agent/managers/insightExtractor.js +122 -51
- package/dist/agent/managers/insightExtractor.js.map +1 -1
- 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 +262 -4
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +85 -0
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
- package/dist/agent/managers/memoryDecayScheduler.js +215 -0
- package/dist/agent/managers/memoryDecayScheduler.js.map +1 -1
- package/dist/agent/managers/memoryInspector.d.ts +222 -14
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +436 -10
- 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 +3 -2
- package/dist/agent/managers/relationBuilder.js.map +1 -1
- package/dist/agent/managers/sessionArchiver.d.ts +6 -0
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +68 -8
- 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/textPolishManager.d.ts +62 -0
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -0
- package/dist/agent/managers/textPolishManager.js +99 -0
- package/dist/agent/managers/textPolishManager.js.map +1 -0
- 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 +2 -2
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +2 -1
- 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 +124 -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/config/loader.d.ts +4 -4
- package/dist/config/loader.js +23 -1
- 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 +41 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -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 +1 -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/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +15 -25
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +7 -6
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +4 -12
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +6 -6
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +12 -12
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +4 -12
- package/dist/memory/projectRegistry.js.map +1 -1
- package/dist/memory/recall.js +2 -2
- package/dist/memory/recall.js.map +1 -1
- package/dist/memory/sourceValidation.d.ts +6 -0
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +3 -1
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/vectorStore.d.ts +16 -2
- package/dist/memory/vectorStore.d.ts.map +1 -1
- package/dist/memory/vectorStore.js.map +1 -1
- package/dist/persona/personaManager.d.ts +30 -4
- package/dist/persona/personaManager.d.ts.map +1 -1
- package/dist/persona/personaManager.js +47 -14
- package/dist/persona/personaManager.js.map +1 -1
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +2 -1
- package/dist/skill/skillManager.js.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/errors.d.ts +10 -8
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +12 -9
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +7 -0
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.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 -0
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +13 -0
- 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/package.json +11 -1
- 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
|
@@ -0,0 +1,141 @@
|
|
|
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 { collectAgentChunks, evaluateResult } from './evalTypes.js';
|
|
16
|
+
/** 默认场景超时_ms */
|
|
17
|
+
const DEFAULT_SCENARIO_TIMEOUT_MS = 10_000;
|
|
18
|
+
/**
|
|
19
|
+
* Agent 行为评估执行器
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* const runner = new EvalRunner({
|
|
24
|
+
* createAgent: () => new Agent({ projectPath, provider, configDir, dataDir, ... }),
|
|
25
|
+
* scenarioTimeoutMs: 15000,
|
|
26
|
+
* });
|
|
27
|
+
* const summary = await runner.runScenarios(EVAL_SCENARIOS);
|
|
28
|
+
* console.log(`通过 ${summary.passed}/${summary.total},耗时 ${summary.durationMs}ms`);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export class EvalRunner {
|
|
32
|
+
/** Agent 工厂函数 */
|
|
33
|
+
#createAgent;
|
|
34
|
+
/** 单场景超时_ms */
|
|
35
|
+
#scenarioTimeoutMs;
|
|
36
|
+
constructor(opts) {
|
|
37
|
+
this.#createAgent = opts.createAgent;
|
|
38
|
+
this.#scenarioTimeoutMs = opts.scenarioTimeoutMs ?? DEFAULT_SCENARIO_TIMEOUT_MS;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 执行单个评估场景
|
|
42
|
+
*
|
|
43
|
+
* 流程:创建 Agent → init() → chat(input) → collectAgentChunks → evaluateResult
|
|
44
|
+
*
|
|
45
|
+
* 错误隔离:任何异常(超时、Agent 抛错)都返回 passed=false 的 EvalResult,
|
|
46
|
+
* 不向上抛出,确保 runScenarios 批量执行时单个失败不中断其他场景。
|
|
47
|
+
*
|
|
48
|
+
* Agent 生命周期:每个场景执行后 close(),避免资源泄漏(try/finally 保证)。
|
|
49
|
+
*
|
|
50
|
+
* @param scenario 评估场景定义
|
|
51
|
+
* @returns 评估结果(始终返回,不抛异常)
|
|
52
|
+
*/
|
|
53
|
+
async runScenario(scenario) {
|
|
54
|
+
const agent = this.#createAgent();
|
|
55
|
+
try {
|
|
56
|
+
await agent.init();
|
|
57
|
+
const collected = await this.#runWithTimeout(agent, scenario.input);
|
|
58
|
+
return evaluateResult(scenario.name, collected, scenario.expect);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
// 错误隔离:返回 passed=false 的 EvalResult,不向上抛出
|
|
62
|
+
return {
|
|
63
|
+
name: scenario.name,
|
|
64
|
+
passed: false,
|
|
65
|
+
collected: {
|
|
66
|
+
toolsCalled: [],
|
|
67
|
+
recallCount: 0,
|
|
68
|
+
guardrailBlocked: false,
|
|
69
|
+
done: false,
|
|
70
|
+
},
|
|
71
|
+
failures: [
|
|
72
|
+
`场景执行异常:${err instanceof Error ? err.message : String(err)}`,
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
await agent.close();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* 批量执行评估场景并汇总报告
|
|
82
|
+
*
|
|
83
|
+
* 顺序执行(非并行),每个场景创建独立 Agent,避免状态污染。
|
|
84
|
+
* 错误隔离:单个场景失败不中断其他场景(由 runScenario 保证)。
|
|
85
|
+
*
|
|
86
|
+
* @param scenarios 场景列表
|
|
87
|
+
* @returns 汇总报告
|
|
88
|
+
*/
|
|
89
|
+
async runScenarios(scenarios) {
|
|
90
|
+
const start = Date.now();
|
|
91
|
+
const results = [];
|
|
92
|
+
for (const scenario of scenarios) {
|
|
93
|
+
const result = await this.runScenario(scenario);
|
|
94
|
+
results.push(result);
|
|
95
|
+
}
|
|
96
|
+
const passed = results.filter((r) => r.passed).length;
|
|
97
|
+
const failed = results.length - passed;
|
|
98
|
+
return {
|
|
99
|
+
results,
|
|
100
|
+
passed,
|
|
101
|
+
failed,
|
|
102
|
+
total: results.length,
|
|
103
|
+
durationMs: Date.now() - start,
|
|
104
|
+
failedScenarios: results.filter((r) => !r.passed).map((r) => r.name),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* 带超时执行单个场景的 chat
|
|
109
|
+
*
|
|
110
|
+
* 使用 Promise.race 实现超时:
|
|
111
|
+
* - 正常完成 → 返回 collected 行为数据
|
|
112
|
+
* - 超时 → reject Error(被 runScenario 的 catch 捕获)
|
|
113
|
+
*
|
|
114
|
+
* 超时后通过 AbortController.abort() 中断 agent.chat,
|
|
115
|
+
* 避免后台 generator 无限挂起。agent.close() 在 runScenario 的 finally 中调用,
|
|
116
|
+
* 确保即使超时后资源也被正确清理。
|
|
117
|
+
*/
|
|
118
|
+
async #runWithTimeout(agent, input) {
|
|
119
|
+
const controller = new AbortController();
|
|
120
|
+
let timer;
|
|
121
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
122
|
+
timer = setTimeout(() => {
|
|
123
|
+
controller.abort();
|
|
124
|
+
reject(new Error(`场景超时(${this.#scenarioTimeoutMs}ms)`));
|
|
125
|
+
}, this.#scenarioTimeoutMs);
|
|
126
|
+
});
|
|
127
|
+
const runPromise = collectAgentChunks(agent.chat(input, controller.signal));
|
|
128
|
+
// 抑制超时后 runPromise 可能产生的 unhandled rejection
|
|
129
|
+
// (超时后 agent.chat 被 abort,collectAgentChunks 可能在后台 resolve/reject,
|
|
130
|
+
// 但 Promise.race 已通过 timeoutPromise 返回,runPromise 的结果被丢弃)
|
|
131
|
+
void runPromise.catch(() => { });
|
|
132
|
+
try {
|
|
133
|
+
return await Promise.race([runPromise, timeoutPromise]);
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
if (timer)
|
|
137
|
+
clearTimeout(timer);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=evalRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evalRunner.js","sourceRoot":"","sources":["../../src/eval/evalRunner.ts"],"names":[],"mappings":"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"}
|
package/dist/eval/evalTypes.d.ts
CHANGED
|
@@ -68,6 +68,17 @@ export interface EvalExpectation {
|
|
|
68
68
|
* 若需验证 source 分布,请在宿主层自行实现。
|
|
69
69
|
*/
|
|
70
70
|
recallSources?: Record<string, number>;
|
|
71
|
+
/**
|
|
72
|
+
* 期望的召回记忆数量范围
|
|
73
|
+
*
|
|
74
|
+
* 验证召回管线是否返回了预期数量的记忆。
|
|
75
|
+
* 例如:{ min: 1 } 表示应至少召回 1 条记忆;
|
|
76
|
+
* { max: 0 } 表示不应召回任何记忆(空召回降级场景)。
|
|
77
|
+
*/
|
|
78
|
+
recallCount?: {
|
|
79
|
+
min?: number;
|
|
80
|
+
max?: number;
|
|
81
|
+
};
|
|
71
82
|
/**
|
|
72
83
|
* 工具调用次数范围
|
|
73
84
|
*/
|
|
@@ -86,6 +97,16 @@ export interface EvalExpectation {
|
|
|
86
97
|
* AgentChunk.guardrailBlocked 收集,而非中文文案匹配。
|
|
87
98
|
*/
|
|
88
99
|
guardrailBlocked?: boolean;
|
|
100
|
+
/**
|
|
101
|
+
* 期望对话是否正常完成
|
|
102
|
+
*
|
|
103
|
+
* true 表示期望对话正常完成(收到 done chunk);
|
|
104
|
+
* false 表示期望对话未正常完成(如被中断、出错);
|
|
105
|
+
* undefined 表示不检查(默认)。
|
|
106
|
+
*
|
|
107
|
+
* 与 collected.done 比对。
|
|
108
|
+
*/
|
|
109
|
+
done?: boolean;
|
|
89
110
|
}
|
|
90
111
|
/**
|
|
91
112
|
* 评估结果
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evalTypes.d.ts","sourceRoot":"","sources":["../../src/eval/evalTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,gBAAgB,CAAC,EAAE,KAAK,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH;;;;OAIG;IACH,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvC;;OAEG;IACH,aAAa,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAE/C;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"evalTypes.d.ts","sourceRoot":"","sources":["../../src/eval/evalTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,gBAAgB,CAAC,EAAE,KAAK,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH;;;;OAIG;IACH,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAE7C;;OAEG;IACH,aAAa,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAE/C;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,sBAAsB;IACtB,SAAS,EAAE;QACT,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,IAAI,EAAE,OAAO,CAAC;KACf,CAAC;IACF,kBAAkB;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,GAChD,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAiClC;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,EAClC,MAAM,EAAE,eAAe,GACtB,UAAU,CAgEZ"}
|
package/dist/eval/evalTypes.js
CHANGED
|
@@ -87,12 +87,27 @@ export function evaluateResult(name, collected, expect) {
|
|
|
87
87
|
failures.push(`工具调用次数 ${count} > 期望最大值 ${expect.toolCallCount.max}`);
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
|
+
// 检查召回数量
|
|
91
|
+
if (expect.recallCount) {
|
|
92
|
+
if (expect.recallCount.min !== undefined && collected.recallCount < expect.recallCount.min) {
|
|
93
|
+
failures.push(`召回数量 ${collected.recallCount} < 期望最小值 ${expect.recallCount.min}`);
|
|
94
|
+
}
|
|
95
|
+
if (expect.recallCount.max !== undefined && collected.recallCount > expect.recallCount.max) {
|
|
96
|
+
failures.push(`召回数量 ${collected.recallCount} > 期望最大值 ${expect.recallCount.max}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
90
99
|
// 检查护栏阻断
|
|
91
100
|
if (expect.guardrailBlocked !== undefined) {
|
|
92
101
|
if (expect.guardrailBlocked !== collected.guardrailBlocked) {
|
|
93
102
|
failures.push(`期望护栏阻断=${expect.guardrailBlocked},实际=${collected.guardrailBlocked}`);
|
|
94
103
|
}
|
|
95
104
|
}
|
|
105
|
+
// 检查完成状态
|
|
106
|
+
if (expect.done !== undefined) {
|
|
107
|
+
if (expect.done !== collected.done) {
|
|
108
|
+
failures.push(`期望完成状态=${expect.done},实际=${collected.done}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
96
111
|
return {
|
|
97
112
|
name,
|
|
98
113
|
passed: failures.length === 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evalTypes.js","sourceRoot":"","sources":["../../src/eval/evalTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"evalTypes.js","sourceRoot":"","sources":["../../src/eval/evalTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent 行为评估场景库
|
|
3
|
+
*
|
|
4
|
+
* 定义标准 EvalScenario,用于 Agent 行为回归测试。
|
|
5
|
+
* 场景定义是"期望契约"——描述 Agent 在特定输入下应有的行为特征,
|
|
6
|
+
* 由 EvalRunner 负责构造条件(MockProvider 返回值 + guardrail 规则配置)执行验证。
|
|
7
|
+
*
|
|
8
|
+
* 设计原则:
|
|
9
|
+
* - 场景通用,不耦合任何领域逻辑
|
|
10
|
+
* - 每个场景聚焦一个验证维度,失败原因可定位
|
|
11
|
+
* - input 是真实用户输入风格,非人造测试桩
|
|
12
|
+
* - expect 至少定义一项检查
|
|
13
|
+
*
|
|
14
|
+
* 当前覆盖的 EvalExpectation 维度(8 个场景):
|
|
15
|
+
* - guardrailBlocked(场景 1, 5, 7)
|
|
16
|
+
* - toolsCalled + toolsNotCalled(场景 2, 5)
|
|
17
|
+
* - toolCallCount(场景 3)
|
|
18
|
+
* - recallCount(场景 4, 8)
|
|
19
|
+
* - done(场景 6, 7, 8)
|
|
20
|
+
* - recalledMemories 预设(场景 4)
|
|
21
|
+
*
|
|
22
|
+
* 未覆盖 recallSources:当前 evaluateResult 不检查该字段(见 evalTypes.ts 注释),
|
|
23
|
+
* 待宿主层按需扩展。
|
|
24
|
+
*/
|
|
25
|
+
import type { EvalScenario } from './evalTypes.js';
|
|
26
|
+
/**
|
|
27
|
+
* 评估场景集(8 个场景)
|
|
28
|
+
*
|
|
29
|
+
* 覆盖护栏阻断 / 工具调用决策 / 调用次数范围 / 召回数量 / 完成状态 / 长输入处理六个维度。
|
|
30
|
+
* EvalRunner 实现后可在 CI 中运行这些场景作为回归基线。
|
|
31
|
+
*/
|
|
32
|
+
export declare const EVAL_SCENARIOS: readonly EvalScenario[];
|
|
33
|
+
//# sourceMappingURL=scenarios.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenarios.d.ts","sourceRoot":"","sources":["../../src/eval/scenarios.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EA8EjD,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent 行为评估场景库
|
|
3
|
+
*
|
|
4
|
+
* 定义标准 EvalScenario,用于 Agent 行为回归测试。
|
|
5
|
+
* 场景定义是"期望契约"——描述 Agent 在特定输入下应有的行为特征,
|
|
6
|
+
* 由 EvalRunner 负责构造条件(MockProvider 返回值 + guardrail 规则配置)执行验证。
|
|
7
|
+
*
|
|
8
|
+
* 设计原则:
|
|
9
|
+
* - 场景通用,不耦合任何领域逻辑
|
|
10
|
+
* - 每个场景聚焦一个验证维度,失败原因可定位
|
|
11
|
+
* - input 是真实用户输入风格,非人造测试桩
|
|
12
|
+
* - expect 至少定义一项检查
|
|
13
|
+
*
|
|
14
|
+
* 当前覆盖的 EvalExpectation 维度(8 个场景):
|
|
15
|
+
* - guardrailBlocked(场景 1, 5, 7)
|
|
16
|
+
* - toolsCalled + toolsNotCalled(场景 2, 5)
|
|
17
|
+
* - toolCallCount(场景 3)
|
|
18
|
+
* - recallCount(场景 4, 8)
|
|
19
|
+
* - done(场景 6, 7, 8)
|
|
20
|
+
* - recalledMemories 预设(场景 4)
|
|
21
|
+
*
|
|
22
|
+
* 未覆盖 recallSources:当前 evaluateResult 不检查该字段(见 evalTypes.ts 注释),
|
|
23
|
+
* 待宿主层按需扩展。
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* 评估场景集(8 个场景)
|
|
27
|
+
*
|
|
28
|
+
* 覆盖护栏阻断 / 工具调用决策 / 调用次数范围 / 召回数量 / 完成状态 / 长输入处理六个维度。
|
|
29
|
+
* EvalRunner 实现后可在 CI 中运行这些场景作为回归基线。
|
|
30
|
+
*/
|
|
31
|
+
export const EVAL_SCENARIOS = [
|
|
32
|
+
{
|
|
33
|
+
name: 'empty-input-guardrail',
|
|
34
|
+
description: '空输入应被输入护栏阻断(需配置匹配空白输入的 guardrail 规则)',
|
|
35
|
+
input: '',
|
|
36
|
+
expect: {
|
|
37
|
+
guardrailBlocked: true,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'read-file-tool-call',
|
|
42
|
+
description: '用户请求读取文件时,Agent 应调用 read_file 且不调用 write_file',
|
|
43
|
+
input: '请读取 README.md 文件',
|
|
44
|
+
expect: {
|
|
45
|
+
toolsCalled: ['read_file'],
|
|
46
|
+
toolsNotCalled: ['write_file'],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'multi-tool-call-count',
|
|
51
|
+
description: '复合请求应触发多个工具调用(读取文件 + 搜索记忆)',
|
|
52
|
+
input: '读取项目配置并搜索相关记忆',
|
|
53
|
+
expect: {
|
|
54
|
+
toolCallCount: { min: 2 },
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: 'recall-memory-present',
|
|
59
|
+
description: '用户提问时应有记忆召回(需预写入匹配记忆到存储)',
|
|
60
|
+
input: '根据之前的记忆,帮我回忆上次讨论的架构设计内容',
|
|
61
|
+
recalledMemories: [
|
|
62
|
+
{
|
|
63
|
+
name: '架构设计讨论',
|
|
64
|
+
content: '上次讨论了分层架构和模块解耦方案',
|
|
65
|
+
source: 'insight',
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
expect: {
|
|
69
|
+
recallCount: { min: 1 },
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'readonly-query-guardrail',
|
|
74
|
+
description: '只读查询场景不应调用 write_file(防止误写),且不被护栏阻断',
|
|
75
|
+
input: '查询当前项目的目录结构,列出所有文件',
|
|
76
|
+
expect: {
|
|
77
|
+
toolsNotCalled: ['write_file'],
|
|
78
|
+
guardrailBlocked: false,
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'normal-completion',
|
|
83
|
+
description: '正常对话应正常完成(收到 done 事件)',
|
|
84
|
+
input: '你好,请介绍一下自己',
|
|
85
|
+
expect: {
|
|
86
|
+
done: true,
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: 'long-input-handling',
|
|
91
|
+
description: '较长输入应被正常处理(不触发长度限制,不崩溃,正常完成)',
|
|
92
|
+
input: '请分析以下需求文档的可行性并给出技术方案建议:\n' +
|
|
93
|
+
'系统需要支持高并发、低延迟的实时数据处理,同时保证数据一致性。'.repeat(200),
|
|
94
|
+
expect: {
|
|
95
|
+
done: true,
|
|
96
|
+
guardrailBlocked: false,
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: 'empty-recall-degrade',
|
|
101
|
+
description: '无匹配记忆时不应崩溃,正常完成对话(空召回降级)',
|
|
102
|
+
input: 'asdfqwerty 无意义输入不匹配任何记忆',
|
|
103
|
+
expect: {
|
|
104
|
+
recallCount: { max: 0 },
|
|
105
|
+
done: true,
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
];
|
|
109
|
+
//# sourceMappingURL=scenarios.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenarios.js","sourceRoot":"","sources":["../../src/eval/scenarios.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,sCAAsC;QACnD,KAAK,EAAE,EAAE;QACT,MAAM,EAAE;YACN,gBAAgB,EAAE,IAAI;SACvB;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,+CAA+C;QAC5D,KAAK,EAAE,kBAAkB;QACzB,MAAM,EAAE;YACN,WAAW,EAAE,CAAC,WAAW,CAAC;YAC1B,cAAc,EAAE,CAAC,YAAY,CAAC;SAC/B;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,4BAA4B;QACzC,KAAK,EAAE,eAAe;QACtB,MAAM,EAAE;YACN,aAAa,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE;SAC1B;KACF;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,WAAW,EAAE,0BAA0B;QACvC,KAAK,EAAE,yBAAyB;QAChC,gBAAgB,EAAE;YAChB;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,kBAAkB;gBAC3B,MAAM,EAAE,SAAS;aAClB;SACF;QACD,MAAM,EAAE;YACN,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE;SACxB;KACF;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,WAAW,EAAE,qCAAqC;QAClD,KAAK,EAAE,oBAAoB;QAC3B,MAAM,EAAE;YACN,cAAc,EAAE,CAAC,YAAY,CAAC;YAC9B,gBAAgB,EAAE,KAAK;SACxB;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,uBAAuB;QACpC,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;SACX;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,8BAA8B;QAC3C,KAAK,EACH,2BAA2B;YAC3B,iCAAiC,CAAC,MAAM,CAAC,GAAG,CAAC;QAC/C,MAAM,EAAE;YACN,IAAI,EAAE,IAAI;YACV,gBAAgB,EAAE,KAAK;SACxB;KACF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,0BAA0B;QACvC,KAAK,EAAE,yBAAyB;QAChC,MAAM,EAAE;YACN,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE;YACvB,IAAI,EAAE,IAAI;SACX;KACF;CACF,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,28 +1,57 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Memora — 通用 Agent 架构(纯逻辑库)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Node.js 专用纯逻辑库(零 native 编译依赖,详见 ADR-002 §定位澄清)。
|
|
5
|
+
* 宿主项目通过注入 IMemoryStorage 实现持久化。
|
|
5
6
|
* CLI 由宿主项目提供(hosts/memora-sprite/)。
|
|
6
7
|
*
|
|
7
8
|
* 设计哲学:万物皆记忆(详见 architecture_philosophy_rules.md §1)
|
|
8
9
|
* 决策追溯:详见 .trae/rules/decisions/ 下的 ADR
|
|
10
|
+
*
|
|
11
|
+
* ─── 类型依赖图 ────────────────────────────────────────────
|
|
12
|
+
*
|
|
13
|
+
* 各模块独立 types.ts,跨模块类型追踪可按以下依赖图定位:
|
|
14
|
+
*
|
|
15
|
+
* agent/types.ts ─┬─→ llm/provider.ts (LlmProvider, ChatOptions)
|
|
16
|
+
* ├─→ memory/vectorStore.ts (IVectorStore, EmbeddingService)
|
|
17
|
+
* ├─→ memory/storageInterface.ts (IMemoryStorage)
|
|
18
|
+
* ├─→ memory/relationStore.ts (IMemoryRelationStore)
|
|
19
|
+
* ├─→ memory/sessionStore.ts (ISessionStore, SessionMessage)
|
|
20
|
+
* ├─→ agent/tracer.ts (ITracer, ISpan, AgentMetrics)
|
|
21
|
+
* └─→ memory/projectManager.ts (AgentProjectEntry)
|
|
22
|
+
*
|
|
23
|
+
* memory/types.ts ──→ 纯类型定义(Memory, MemoryRelation, SOURCE_LABELS 等)
|
|
24
|
+
*
|
|
25
|
+
* llm/types.ts ─────→ 纯类型定义(LlmChunk)
|
|
26
|
+
*
|
|
27
|
+
* persona/types.ts ─→ 纯类型定义(Persona, PersonaMode)
|
|
28
|
+
*
|
|
29
|
+
* skill/types.ts ───→ 纯类型定义(SkillEntry, SkillMatch)
|
|
30
|
+
*
|
|
31
|
+
* eval/evalTypes.ts ─→ 纯类型定义(EvalScenario, EvalResult)
|
|
32
|
+
*
|
|
33
|
+
* security/pathGuard.ts ─→ AuditEvent 等安全类型(与 agent/types.ts 解耦)
|
|
34
|
+
*
|
|
35
|
+
* 依赖方向(单向):agent → memory → utils;agent → llm;agent → security
|
|
36
|
+
* 内核不反向依赖宿主,所有宿主交互通过接口注入(ADR-002 §三层架构)
|
|
9
37
|
*/
|
|
10
38
|
export { Agent } from './agent/agent.js';
|
|
11
|
-
export type { AgentChunk, ThinkingPhase, UIMessages, ArchiveMode, RecalledMemorySummary } from './agent/types.js';
|
|
39
|
+
export type { AgentChunk, ThinkingPhase, UIMessages, ArchiveMode, RecalledMemorySummary, AgentOptions, AgentContext, AgentProjectEntry } from './agent/types.js';
|
|
12
40
|
export { AGENT_CONSTANTS, LOOP_CONSTANTS } from './agent/constants.js';
|
|
13
|
-
export type { AgentOptions, AgentContext, AgentProjectEntry, } from './agent/agent.js';
|
|
14
41
|
export { type AgentForkResult } from './agent/managers/sessionManager.js';
|
|
15
42
|
export type { ToolDefinition, ToolHandler, ToolContext, WriteExtensions } from './agent/toolExecutor.js';
|
|
16
43
|
export type { PersonaMode, Persona } from './persona/types.js';
|
|
17
44
|
export type { MemoryKeywords } from './agent/managers/insightExtractor.js';
|
|
18
45
|
export { RelationBuilder } from './agent/managers/relationBuilder.js';
|
|
19
46
|
export type { ConflictInfo } from './agent/managers/relationBuilder.js';
|
|
20
|
-
export type { MemorySnapshot, WorkingMemorySnapshot, BootstrapSnapshot, ArchiveSnapshot, AgentSearchHit, AgentStats, SuggestOptions, SuggestHit, SourceHealthStatus, SourceHealthEntry, SourceHealthReport, } from './agent/managers/memoryInspector.js';
|
|
21
|
-
export type { MemoryMutator } from './agent/managers/memoryMutator.js';
|
|
47
|
+
export type { MemorySnapshot, WorkingMemorySnapshot, BootstrapSnapshot, ArchiveSnapshot, AgentSearchHit, AgentStats, SuggestOptions, SuggestHit, SourceHealthStatus, SourceHealthEntry, SourceHealthReport, DedupPair, DedupVerdict, DedupVerdictSummary, DedupReport, } from './agent/managers/memoryInspector.js';
|
|
22
48
|
export type { ConfigSuggestion, ConfigSuggestionHandler } from './agent/managers/configManager.js';
|
|
23
49
|
export type { AutoConfigRefinerOptions } from './agent/managers/autoConfigRefiner.js';
|
|
24
50
|
export type { SessionArchiveResult } from './agent/managers/sessionArchiver.js';
|
|
51
|
+
export type { TimelinessVerdict, TimelinessReport } from './agent/managers/memoryDecayScheduler.js';
|
|
52
|
+
export type { ConflictVerdict, ConflictReport } from './agent/managers/memoryAdvisor.js';
|
|
25
53
|
export type { WorkProjectionEntry } from './agent/managers/workProjection.js';
|
|
54
|
+
export type { PolishResult } from './agent/managers/textPolishManager.js';
|
|
26
55
|
export { loadConfig } from './config/loader.js';
|
|
27
56
|
export { createLlmProvider, createProviderFromConfig } from './llm/factory.js';
|
|
28
57
|
export type { ProviderConfig } from './llm/factory.js';
|
|
@@ -52,14 +81,16 @@ export type { UserProfileEntry, ProfileCategory, ExtractedFact } from './memory/
|
|
|
52
81
|
export { JsonVectorStore } from './memory/vectorStore.js';
|
|
53
82
|
export type { IVectorStore, EmbeddingService } from './memory/vectorStore.js';
|
|
54
83
|
export { EmbeddingProvider } from './llm/embedding.js';
|
|
55
|
-
export type { EmbeddingConfig, EmbeddingResult
|
|
84
|
+
export type { EmbeddingConfig, EmbeddingResult } from './llm/embedding.js';
|
|
85
|
+
export type { EmbeddingOptions } from './memory/vectorStore.js';
|
|
56
86
|
export type { ISessionStore, SessionMessage } from './memory/sessionStore.js';
|
|
57
87
|
export type { ForkResult } from './agent/messageHistory.js';
|
|
58
88
|
export { recall, extractKeywords } from './memory/recall.js';
|
|
59
89
|
export type { RecallOptions } from './memory/recall.js';
|
|
60
90
|
export type { ILogger } from './logging/loggerInterface.js';
|
|
61
91
|
export { setLogger, logger } from './logging/logger.js';
|
|
62
|
-
export { segmentText } from './utils/segmenter.js';
|
|
92
|
+
export { segmentText, segmentLower } from './utils/segmenter.js';
|
|
93
|
+
export { isPlainObject } from './utils/objects.js';
|
|
63
94
|
export { parseFrontmatter, serializeFrontmatter } from './utils/frontmatter.js';
|
|
64
95
|
export { safeSetTimeout, safeSetInterval, clearSafeTimeout, clearSafeInterval } from './utils/safeTimer.js';
|
|
65
96
|
export type { SkillEntry, SkillMatch } from './skill/types.js';
|
|
@@ -69,4 +100,7 @@ export { toError } from './utils/toError.js';
|
|
|
69
100
|
export type { ToolErrorCodeValue } from './utils/errors.js';
|
|
70
101
|
export type { EvalScenario, EvalExpectation, EvalResult } from './eval/evalTypes.js';
|
|
71
102
|
export { collectAgentChunks, evaluateResult } from './eval/evalTypes.js';
|
|
103
|
+
export { EVAL_SCENARIOS } from './eval/scenarios.js';
|
|
104
|
+
export { EvalRunner } from './eval/evalRunner.js';
|
|
105
|
+
export type { EvalRunnerOptions, EvalSummary } from './eval/evalRunner.js';
|
|
72
106
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,16 +1,44 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Memora — 通用 Agent 架构(纯逻辑库)
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Node.js 专用纯逻辑库(零 native 编译依赖,详见 ADR-002 §定位澄清)。
|
|
5
|
+
* 宿主项目通过注入 IMemoryStorage 实现持久化。
|
|
5
6
|
* CLI 由宿主项目提供(hosts/memora-sprite/)。
|
|
6
7
|
*
|
|
7
8
|
* 设计哲学:万物皆记忆(详见 architecture_philosophy_rules.md §1)
|
|
8
9
|
* 决策追溯:详见 .trae/rules/decisions/ 下的 ADR
|
|
10
|
+
*
|
|
11
|
+
* ─── 类型依赖图 ────────────────────────────────────────────
|
|
12
|
+
*
|
|
13
|
+
* 各模块独立 types.ts,跨模块类型追踪可按以下依赖图定位:
|
|
14
|
+
*
|
|
15
|
+
* agent/types.ts ─┬─→ llm/provider.ts (LlmProvider, ChatOptions)
|
|
16
|
+
* ├─→ memory/vectorStore.ts (IVectorStore, EmbeddingService)
|
|
17
|
+
* ├─→ memory/storageInterface.ts (IMemoryStorage)
|
|
18
|
+
* ├─→ memory/relationStore.ts (IMemoryRelationStore)
|
|
19
|
+
* ├─→ memory/sessionStore.ts (ISessionStore, SessionMessage)
|
|
20
|
+
* ├─→ agent/tracer.ts (ITracer, ISpan, AgentMetrics)
|
|
21
|
+
* └─→ memory/projectManager.ts (AgentProjectEntry)
|
|
22
|
+
*
|
|
23
|
+
* memory/types.ts ──→ 纯类型定义(Memory, MemoryRelation, SOURCE_LABELS 等)
|
|
24
|
+
*
|
|
25
|
+
* llm/types.ts ─────→ 纯类型定义(LlmChunk)
|
|
26
|
+
*
|
|
27
|
+
* persona/types.ts ─→ 纯类型定义(Persona, PersonaMode)
|
|
28
|
+
*
|
|
29
|
+
* skill/types.ts ───→ 纯类型定义(SkillEntry, SkillMatch)
|
|
30
|
+
*
|
|
31
|
+
* eval/evalTypes.ts ─→ 纯类型定义(EvalScenario, EvalResult)
|
|
32
|
+
*
|
|
33
|
+
* security/pathGuard.ts ─→ AuditEvent 等安全类型(与 agent/types.ts 解耦)
|
|
34
|
+
*
|
|
35
|
+
* 依赖方向(单向):agent → memory → utils;agent → llm;agent → security
|
|
36
|
+
* 内核不反向依赖宿主,所有宿主交互通过接口注入(ADR-002 §三层架构)
|
|
9
37
|
*/
|
|
10
38
|
// ─── 库导出:供宿主项目 import 接入 ──────────────────────
|
|
11
39
|
export { Agent } from './agent/agent.js';
|
|
12
40
|
export { AGENT_CONSTANTS, LOOP_CONSTANTS } from './agent/constants.js';
|
|
13
|
-
//
|
|
41
|
+
// RelationBuilder 从 InsightExtractor 提取,封装 ADR-014 关系构建逻辑
|
|
14
42
|
export { RelationBuilder } from './agent/managers/relationBuilder.js';
|
|
15
43
|
export { loadConfig } from './config/loader.js';
|
|
16
44
|
export { createLlmProvider, createProviderFromConfig } from './llm/factory.js';
|
|
@@ -26,7 +54,7 @@ export { inferSource, escapeLike, validateSource } from './memory/sourceValidati
|
|
|
26
54
|
export { RELATION_TYPES, RELATION_WEIGHTS } from './memory/types.js';
|
|
27
55
|
export { InMemoryStorage } from './memory/inMemoryStorage.js';
|
|
28
56
|
export { InMemoryRelationStore } from './memory/inMemoryRelationStore.js';
|
|
29
|
-
// 项目注册表 +
|
|
57
|
+
// 项目注册表 + 锁文件管理(从 ProjectManager 提取)
|
|
30
58
|
// 宿主可直接使用 ProjectRegistry/LockManager 管理多项目,或通过 ProjectManager 间接委托
|
|
31
59
|
export { ProjectRegistry } from './memory/projectRegistry.js';
|
|
32
60
|
export { LockManager } from './memory/lockManager.js';
|
|
@@ -40,8 +68,9 @@ export { recall, extractKeywords } from './memory/recall.js';
|
|
|
40
68
|
export { setLogger, logger } from './logging/logger.js';
|
|
41
69
|
// ─── 工具导出 ────────────────────────────────────────────
|
|
42
70
|
// 分词工具:宿主项目(如 SqliteStorage)依赖
|
|
43
|
-
|
|
44
|
-
|
|
71
|
+
export { segmentText, segmentLower } from './utils/segmenter.js';
|
|
72
|
+
// 对象类型守卫:宿主项目(如 spriteConfig)依赖,校验 JSON.parse 结果
|
|
73
|
+
export { isPlainObject } from './utils/objects.js';
|
|
45
74
|
// Frontmatter 解析/序列化:宿主项目(如 skillInstaller)依赖
|
|
46
75
|
export { parseFrontmatter, serializeFrontmatter } from './utils/frontmatter.js';
|
|
47
76
|
// 安全定时器:宿主主进程统一使用 safeSetTimeout/safeSetInterval 跟踪清理
|
|
@@ -51,4 +80,6 @@ export { MemoraError, ToolErrorCode, isRetryableErrorCode } from './utils/errors
|
|
|
51
80
|
// toError 独立导出,浏览器端可直接 import 而不引入 logging(pino)依赖
|
|
52
81
|
export { toError } from './utils/toError.js';
|
|
53
82
|
export { collectAgentChunks, evaluateResult } from './eval/evalTypes.js';
|
|
83
|
+
export { EVAL_SCENARIOS } from './eval/scenarios.js';
|
|
84
|
+
export { EvalRunner } from './eval/evalRunner.js';
|
|
54
85
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,iDAAiD;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGzC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAMvE,0DAA0D;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAgCtE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAI/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAGrE,OAAO;AACP,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAK5D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE7D,uDAAuD;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,4DAA4D;AAC5D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAEvF,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIrE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,qCAAqC;AACrC,oEAAoE;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGtD,wEAAwE;AACxE,2EAA2E;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,wEAAwE;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAQvD,eAAe;AACf,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAK7D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAExD,wDAAwD;AACxD,+BAA+B;AAC/B,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACjE,iDAAiD;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,8CAA8C;AAC9C,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAChF,sDAAsD;AACtD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAc5G,sDAAsD;AACtD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACrF,mDAAmD;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAO7C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AbortSignal 合并工具
|
|
3
|
+
*
|
|
4
|
+
* 从 openaiCompatible.ts 和 embedding.ts 提取的公共"外部信号 + 超时信号"合并逻辑
|
|
5
|
+
* (ADR-017 枝叶层 2 次提取原则,embedding.ts 原注释已自证"与 openaiCompatible.ts 同构")。
|
|
6
|
+
*
|
|
7
|
+
* 确保用户取消(optsSignal)和请求超时都能中断 fetch 和流读取。
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* 合并外部 AbortSignal + 超时 AbortSignal
|
|
11
|
+
*
|
|
12
|
+
* 创建内部 AbortController,将外部 optsSignal 和超时信号合并到其 signal 上。
|
|
13
|
+
* 返回 signal 供 fetch 使用,以及两个清理函数:
|
|
14
|
+
* - clearTimer:只清超时定时器(流式读取前调用,保留 optsSignal 监听用于 SSE 取消)
|
|
15
|
+
* - dispose:完整清理(清超时 + 移除 optsSignal 监听,最终清理时调用)
|
|
16
|
+
*
|
|
17
|
+
* @param optsSignal 外部传入的 AbortSignal(可选,用户取消信号)
|
|
18
|
+
* @param timeoutMs 超时毫秒数
|
|
19
|
+
* @param timeoutErrorName 超时错误名称(如 'LLM 请求超时' / 'Embedding 请求超时')
|
|
20
|
+
* @returns { signal, clearTimer, dispose } 合并后的 signal 和清理函数
|
|
21
|
+
*/
|
|
22
|
+
export declare function mergeAbortSignals(optsSignal: AbortSignal | undefined, timeoutMs: number, timeoutErrorName: string): {
|
|
23
|
+
signal: AbortSignal;
|
|
24
|
+
clearTimer: () => void;
|
|
25
|
+
dispose: () => void;
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=abortSignal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abortSignal.d.ts","sourceRoot":"","sources":["../../src/llm/abortSignal.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,SAAS,EAAE,MAAM,EACjB,gBAAgB,EAAE,MAAM,GACvB;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAwBA"}
|