@zooique/memora 0.1.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/LICENSE +21 -0
- package/README.md +148 -0
- package/dist/agent/agent.d.ts +343 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +893 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/assembler.d.ts +77 -0
- package/dist/agent/assembler.d.ts.map +1 -0
- package/dist/agent/assembler.js +115 -0
- package/dist/agent/assembler.js.map +1 -0
- package/dist/agent/builtinToolHandlers.d.ts +96 -0
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -0
- package/dist/agent/builtinToolHandlers.js +388 -0
- package/dist/agent/builtinToolHandlers.js.map +1 -0
- package/dist/agent/builtinTools.d.ts +35 -0
- package/dist/agent/builtinTools.d.ts.map +1 -0
- package/dist/agent/builtinTools.js +75 -0
- package/dist/agent/builtinTools.js.map +1 -0
- package/dist/agent/constants.d.ts +67 -0
- package/dist/agent/constants.d.ts.map +1 -0
- package/dist/agent/constants.js +67 -0
- package/dist/agent/constants.js.map +1 -0
- package/dist/agent/contextManager.d.ts +130 -0
- package/dist/agent/contextManager.d.ts.map +1 -0
- package/dist/agent/contextManager.js +287 -0
- package/dist/agent/contextManager.js.map +1 -0
- package/dist/agent/loop.d.ts +288 -0
- package/dist/agent/loop.d.ts.map +1 -0
- package/dist/agent/loop.js +756 -0
- package/dist/agent/loop.js.map +1 -0
- package/dist/agent/managers/autoConfigRefiner.d.ts +39 -0
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -0
- package/dist/agent/managers/autoConfigRefiner.js +150 -0
- package/dist/agent/managers/autoConfigRefiner.js.map +1 -0
- package/dist/agent/managers/configManager.d.ts +114 -0
- package/dist/agent/managers/configManager.d.ts.map +1 -0
- package/dist/agent/managers/configManager.js +186 -0
- package/dist/agent/managers/configManager.js.map +1 -0
- package/dist/agent/managers/insightExtractor.d.ts +141 -0
- package/dist/agent/managers/insightExtractor.d.ts.map +1 -0
- package/dist/agent/managers/insightExtractor.js +420 -0
- package/dist/agent/managers/insightExtractor.js.map +1 -0
- package/dist/agent/managers/memoryAdvisor.d.ts +96 -0
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -0
- package/dist/agent/managers/memoryAdvisor.js +198 -0
- package/dist/agent/managers/memoryAdvisor.js.map +1 -0
- package/dist/agent/managers/memoryInspector.d.ts +231 -0
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -0
- package/dist/agent/managers/memoryInspector.js +327 -0
- package/dist/agent/managers/memoryInspector.js.map +1 -0
- package/dist/agent/managers/sessionManager.d.ts +89 -0
- package/dist/agent/managers/sessionManager.d.ts.map +1 -0
- package/dist/agent/managers/sessionManager.js +178 -0
- package/dist/agent/managers/sessionManager.js.map +1 -0
- package/dist/agent/managers/userFactExtractor.d.ts +25 -0
- package/dist/agent/managers/userFactExtractor.d.ts.map +1 -0
- package/dist/agent/managers/userFactExtractor.js +81 -0
- package/dist/agent/managers/userFactExtractor.js.map +1 -0
- package/dist/agent/managers/workProjection.d.ts +117 -0
- package/dist/agent/managers/workProjection.d.ts.map +1 -0
- package/dist/agent/managers/workProjection.js +290 -0
- package/dist/agent/managers/workProjection.js.map +1 -0
- package/dist/agent/messageHistory.d.ts +157 -0
- package/dist/agent/messageHistory.d.ts.map +1 -0
- package/dist/agent/messageHistory.js +288 -0
- package/dist/agent/messageHistory.js.map +1 -0
- package/dist/agent/toolExecutor.d.ts +137 -0
- package/dist/agent/toolExecutor.d.ts.map +1 -0
- package/dist/agent/toolExecutor.js +209 -0
- package/dist/agent/toolExecutor.js.map +1 -0
- package/dist/agent/tracer.d.ts +122 -0
- package/dist/agent/tracer.d.ts.map +1 -0
- package/dist/agent/tracer.js +64 -0
- package/dist/agent/tracer.js.map +1 -0
- package/dist/agent/types.d.ts +98 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +19 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/config/loader.d.ts +229 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +194 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/eval/evalTypes.d.ts +118 -0
- package/dist/eval/evalTypes.d.ts.map +1 -0
- package/dist/eval/evalTypes.js +102 -0
- package/dist/eval/evalTypes.js.map +1 -0
- package/dist/index.d.ts +61 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/embedding.d.ts +62 -0
- package/dist/llm/embedding.d.ts.map +1 -0
- package/dist/llm/embedding.js +162 -0
- package/dist/llm/embedding.js.map +1 -0
- package/dist/llm/factory.d.ts +39 -0
- package/dist/llm/factory.d.ts.map +1 -0
- package/dist/llm/factory.js +108 -0
- package/dist/llm/factory.js.map +1 -0
- package/dist/llm/openaiCompatible.d.ts +63 -0
- package/dist/llm/openaiCompatible.d.ts.map +1 -0
- package/dist/llm/openaiCompatible.js +340 -0
- package/dist/llm/openaiCompatible.js.map +1 -0
- package/dist/llm/provider.d.ts +91 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +14 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/types.d.ts +25 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +7 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/logging/logger.d.ts +39 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +279 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/loggerInterface.d.ts +33 -0
- package/dist/logging/loggerInterface.d.ts.map +1 -0
- package/dist/logging/loggerInterface.js +2 -0
- package/dist/logging/loggerInterface.js.map +1 -0
- package/dist/memory/inMemoryRelationStore.d.ts +51 -0
- package/dist/memory/inMemoryRelationStore.d.ts.map +1 -0
- package/dist/memory/inMemoryRelationStore.js +65 -0
- package/dist/memory/inMemoryRelationStore.js.map +1 -0
- package/dist/memory/inMemoryStorage.d.ts +97 -0
- package/dist/memory/inMemoryStorage.d.ts.map +1 -0
- package/dist/memory/inMemoryStorage.js +177 -0
- package/dist/memory/inMemoryStorage.js.map +1 -0
- package/dist/memory/loader.d.ts +49 -0
- package/dist/memory/loader.d.ts.map +1 -0
- package/dist/memory/loader.js +93 -0
- package/dist/memory/loader.js.map +1 -0
- package/dist/memory/projectManager.d.ts +182 -0
- package/dist/memory/projectManager.d.ts.map +1 -0
- package/dist/memory/projectManager.js +441 -0
- package/dist/memory/projectManager.js.map +1 -0
- package/dist/memory/recall.d.ts +77 -0
- package/dist/memory/recall.d.ts.map +1 -0
- package/dist/memory/recall.js +147 -0
- package/dist/memory/recall.js.map +1 -0
- package/dist/memory/relationStore.d.ts +78 -0
- package/dist/memory/relationStore.d.ts.map +1 -0
- package/dist/memory/relationStore.js +2 -0
- package/dist/memory/relationStore.js.map +1 -0
- package/dist/memory/sessionStore.d.ts +84 -0
- package/dist/memory/sessionStore.d.ts.map +1 -0
- package/dist/memory/sessionStore.js +2 -0
- package/dist/memory/sessionStore.js.map +1 -0
- package/dist/memory/storageInterface.d.ts +107 -0
- package/dist/memory/storageInterface.d.ts.map +1 -0
- package/dist/memory/storageInterface.js +2 -0
- package/dist/memory/storageInterface.js.map +1 -0
- package/dist/memory/store.d.ts +50 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +160 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/types.d.ts +189 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +230 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/memory/userProfile.d.ts +156 -0
- package/dist/memory/userProfile.d.ts.map +1 -0
- package/dist/memory/userProfile.js +315 -0
- package/dist/memory/userProfile.js.map +1 -0
- package/dist/memory/vectorStore.d.ts +75 -0
- package/dist/memory/vectorStore.d.ts.map +1 -0
- package/dist/memory/vectorStore.js +144 -0
- package/dist/memory/vectorStore.js.map +1 -0
- package/dist/persona/personaManager.d.ts +121 -0
- package/dist/persona/personaManager.d.ts.map +1 -0
- package/dist/persona/personaManager.js +349 -0
- package/dist/persona/personaManager.js.map +1 -0
- package/dist/persona/types.d.ts +32 -0
- package/dist/persona/types.d.ts.map +1 -0
- package/dist/persona/types.js +5 -0
- package/dist/persona/types.js.map +1 -0
- package/dist/security/pathGuard.d.ts +121 -0
- package/dist/security/pathGuard.d.ts.map +1 -0
- package/dist/security/pathGuard.js +276 -0
- package/dist/security/pathGuard.js.map +1 -0
- package/dist/skill/skillManager.d.ts +82 -0
- package/dist/skill/skillManager.d.ts.map +1 -0
- package/dist/skill/skillManager.js +198 -0
- package/dist/skill/skillManager.js.map +1 -0
- package/dist/skill/types.d.ts +28 -0
- package/dist/skill/types.d.ts.map +1 -0
- package/dist/skill/types.js +5 -0
- package/dist/skill/types.js.map +1 -0
- package/dist/utils/errors.d.ts +86 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +143 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/eventEmitter.d.ts +87 -0
- package/dist/utils/eventEmitter.d.ts.map +1 -0
- package/dist/utils/eventEmitter.js +79 -0
- package/dist/utils/eventEmitter.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +24 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +44 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/json.d.ts +20 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +65 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/loggerHolder.d.ts +37 -0
- package/dist/utils/loggerHolder.d.ts.map +1 -0
- package/dist/utils/loggerHolder.js +49 -0
- package/dist/utils/loggerHolder.js.map +1 -0
- package/dist/utils/math.d.ts +5 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +19 -0
- package/dist/utils/math.js.map +1 -0
- package/dist/utils/path.d.ts +28 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +33 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/safeTimer.d.ts +26 -0
- package/dist/utils/safeTimer.d.ts.map +1 -0
- package/dist/utils/safeTimer.js +49 -0
- package/dist/utils/safeTimer.js.map +1 -0
- package/dist/utils/scanner.d.ts +54 -0
- package/dist/utils/scanner.d.ts.map +1 -0
- package/dist/utils/scanner.js +115 -0
- package/dist/utils/scanner.js.map +1 -0
- package/dist/utils/segmenter.d.ts +30 -0
- package/dist/utils/segmenter.d.ts.map +1 -0
- package/dist/utils/segmenter.js +80 -0
- package/dist/utils/segmenter.js.map +1 -0
- package/dist/utils/strings.d.ts +18 -0
- package/dist/utils/strings.d.ts.map +1 -0
- package/dist/utils/strings.js +25 -0
- package/dist/utils/strings.js.map +1 -0
- package/dist/utils/time.d.ts +23 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +31 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/utils/toError.d.ts +13 -0
- package/dist/utils/toError.d.ts.map +1 -0
- package/dist/utils/toError.js +22 -0
- package/dist/utils/toError.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 记忆文件存储
|
|
3
|
+
*
|
|
4
|
+
* 冷热分离中的"热":文件承载记忆本体
|
|
5
|
+
* 详见 ADR-002 · IMemoryStorage 接口与宿主注入模式
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, mkdir, readdir, stat } from 'node:fs/promises';
|
|
8
|
+
import { join, dirname } from 'node:path';
|
|
9
|
+
import { SOURCE_LABELS, inferSource } from '../memory/types.js';
|
|
10
|
+
import { parseFrontmatter, serializeFrontmatter as serializeFm } from '../utils/frontmatter.js';
|
|
11
|
+
import { logger } from '../logging/logger.js';
|
|
12
|
+
import { toError } from '../utils/errors.js';
|
|
13
|
+
/**
|
|
14
|
+
* 已知 source 到文件系统目录的映射
|
|
15
|
+
*
|
|
16
|
+
* 仅覆盖配置类记忆(启动时扫描的 persona/rule/skill);
|
|
17
|
+
* 运行时产生的记忆(insight/profile/work-projection)不由 FileStore 管理
|
|
18
|
+
*/
|
|
19
|
+
const SOURCE_TO_DIR = {
|
|
20
|
+
[SOURCE_LABELS.PERSONA]: 'personas',
|
|
21
|
+
[SOURCE_LABELS.RULE]: 'rules',
|
|
22
|
+
[SOURCE_LABELS.SKILL]: 'skills',
|
|
23
|
+
};
|
|
24
|
+
/** 无 frontmatter 或 score 缺失时的默认 score */
|
|
25
|
+
const DEFAULT_MEMORY_SCORE = 0.5;
|
|
26
|
+
/**
|
|
27
|
+
* 文件存储类
|
|
28
|
+
*
|
|
29
|
+
* 每个 source 对应一个子目录(personas/rules/skills/…)
|
|
30
|
+
* 读取时通过 inferSource() 从文件路径推断 source
|
|
31
|
+
*/
|
|
32
|
+
export class FileStore {
|
|
33
|
+
dataDir;
|
|
34
|
+
constructor(dataDir) {
|
|
35
|
+
this.dataDir = dataDir;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 读取记忆文件
|
|
39
|
+
*
|
|
40
|
+
* @param source - 来源标签(如 'rule'、'persona')
|
|
41
|
+
* @param name - 记忆名(不含扩展名)
|
|
42
|
+
*/
|
|
43
|
+
async read(source, name) {
|
|
44
|
+
const filePath = this.getFilePath(source, name);
|
|
45
|
+
// 异步读取:文件不存在时 readFile 抛 ENOENT,捕获后返回 null(避免 existsSync 的 TOCTOU 竞态)
|
|
46
|
+
let content;
|
|
47
|
+
let fileStat;
|
|
48
|
+
try {
|
|
49
|
+
content = await readFile(filePath, 'utf-8');
|
|
50
|
+
fileStat = await stat(filePath);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
// ENOENT 属正常情况(文件不存在),静默返回 null;其他错误(EACCES/EISDIR 等)记录警告
|
|
54
|
+
const error = toError(err);
|
|
55
|
+
if (error.code !== 'ENOENT') {
|
|
56
|
+
logger.warn({ path: filePath, code: error.code, err: error.message }, '记忆文件读取失败');
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
// 从文件路径推断 source(frontmatter 可覆盖)
|
|
61
|
+
return this.parseMemory(source, name, content, filePath, fileStat.mtime);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 写入记忆文件
|
|
65
|
+
*/
|
|
66
|
+
async write(memory) {
|
|
67
|
+
const filePath = this.getFilePath(memory.source, memory.name);
|
|
68
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
69
|
+
const frontmatter = serializeFm({
|
|
70
|
+
id: memory.id,
|
|
71
|
+
source: memory.source,
|
|
72
|
+
score: String(memory.score),
|
|
73
|
+
createdAt: memory.createdAt,
|
|
74
|
+
accessedAt: memory.accessedAt,
|
|
75
|
+
});
|
|
76
|
+
const content = `---\n${frontmatter}\n---\n\n${memory.content}`;
|
|
77
|
+
await writeFile(filePath, content, 'utf-8');
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* 列出某个 source 下的所有记忆
|
|
81
|
+
*
|
|
82
|
+
* @param source - 来源标签(如 'rule'、'persona')
|
|
83
|
+
* @returns 记忆名称列表(不含扩展名)
|
|
84
|
+
*/
|
|
85
|
+
async list(source) {
|
|
86
|
+
const dir = join(this.dataDir, this.sourceToDir(source));
|
|
87
|
+
// 异步读取:目录不存在时 readdir 抛 ENOENT,捕获后返回空数组(避免 existsSync 的 TOCTOU 竞态)
|
|
88
|
+
let files;
|
|
89
|
+
try {
|
|
90
|
+
files = await readdir(dir);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
// ENOENT 属正常情况(目录不存在),静默返回空数组;其他错误(EACCES/EISDIR 等)记录警告
|
|
94
|
+
const error = toError(err);
|
|
95
|
+
if (error.code !== 'ENOENT') {
|
|
96
|
+
logger.warn({ dir, code: error.code, err: error.message }, '记忆目录读取失败');
|
|
97
|
+
}
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
return files.filter((f) => f.endsWith('.md')).map((f) => f.replace(/\.md$/, ''));
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 获取文件路径
|
|
104
|
+
*/
|
|
105
|
+
getFilePath(source, name) {
|
|
106
|
+
return join(this.dataDir, this.sourceToDir(source), `${name}.md`);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* source 到目录名的映射
|
|
110
|
+
*
|
|
111
|
+
* 已知 source 使用预定义目录,未知 source 直接用 source 字符串作目录名
|
|
112
|
+
*/
|
|
113
|
+
sourceToDir(source) {
|
|
114
|
+
return SOURCE_TO_DIR[source] ?? source;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 解析记忆文件为 Memory 对象
|
|
118
|
+
*
|
|
119
|
+
* @param source - 来源标签
|
|
120
|
+
* @param name - 记忆名
|
|
121
|
+
* @param raw - 文件原始内容
|
|
122
|
+
* @param filePath - 文件路径(用于 inferSource 回退)
|
|
123
|
+
* @param mtime - 文件修改时间
|
|
124
|
+
*/
|
|
125
|
+
parseMemory(source, name, raw, filePath, mtime) {
|
|
126
|
+
const { frontmatter: meta, body } = parseFrontmatter(raw);
|
|
127
|
+
// 从 frontmatter 读取 source(如有显式声明则覆盖)
|
|
128
|
+
const resolvedSource = meta['source'] ?? inferSource(filePath, source);
|
|
129
|
+
// 无 frontmatter 时,使用默认值
|
|
130
|
+
if (Object.keys(meta).length === 0) {
|
|
131
|
+
const now = mtime.toISOString();
|
|
132
|
+
return {
|
|
133
|
+
id: `${resolvedSource}:${name}`,
|
|
134
|
+
content: raw,
|
|
135
|
+
source: resolvedSource,
|
|
136
|
+
name,
|
|
137
|
+
createdAt: now,
|
|
138
|
+
accessedAt: now,
|
|
139
|
+
score: DEFAULT_MEMORY_SCORE,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const now = mtime.toISOString();
|
|
143
|
+
// 修复 #34:校验 score,防止 NaN/越界值违反 zod schema(min(0).max(1))
|
|
144
|
+
// frontmatter 中 score 字段若为非数字字符串(如 "abc"),Number 返回 NaN 会破坏后续写入
|
|
145
|
+
const rawScore = Number(meta['score'] ?? DEFAULT_MEMORY_SCORE);
|
|
146
|
+
const score = Number.isFinite(rawScore) && rawScore >= 0 && rawScore <= 1
|
|
147
|
+
? rawScore
|
|
148
|
+
: DEFAULT_MEMORY_SCORE;
|
|
149
|
+
return {
|
|
150
|
+
id: meta['id'] ?? `${resolvedSource}:${name}`,
|
|
151
|
+
content: body.trim(),
|
|
152
|
+
source: resolvedSource,
|
|
153
|
+
name,
|
|
154
|
+
createdAt: meta['createdAt'] ?? now,
|
|
155
|
+
accessedAt: meta['accessedAt'] ?? now,
|
|
156
|
+
score,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 记忆类型定义 — 基元驱动模型
|
|
3
|
+
*
|
|
4
|
+
* 设计哲学:万物皆是记忆,用 source 开放字符串替代封闭枚举
|
|
5
|
+
* 详见 ADR-004 · 记忆统一模型
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
/**
|
|
9
|
+
* 记忆基元 schema
|
|
10
|
+
*
|
|
11
|
+
* 7 个核心字段,无封闭枚举,无额外元数据
|
|
12
|
+
*/
|
|
13
|
+
export declare const MemorySchema: z.ZodObject<{
|
|
14
|
+
/** 唯一标识(source:name,如 'rule:core'、'insight:1718083200000') */
|
|
15
|
+
id: z.ZodString;
|
|
16
|
+
/** 记忆内容(Markdown 文本) */
|
|
17
|
+
content: z.ZodString;
|
|
18
|
+
/** 来源标签(开放字符串,非枚举) */
|
|
19
|
+
source: z.ZodString;
|
|
20
|
+
/** 可读名称(文件名或摘要标题) */
|
|
21
|
+
name: z.ZodString;
|
|
22
|
+
/** 创建时间(ISO 8601) */
|
|
23
|
+
createdAt: z.ZodString;
|
|
24
|
+
/** 最后访问时间(每次召回时刷新) */
|
|
25
|
+
accessedAt: z.ZodString;
|
|
26
|
+
/** 权重(0-1,召回时用于排序) */
|
|
27
|
+
score: z.ZodDefault<z.ZodNumber>;
|
|
28
|
+
}, "strip", z.ZodTypeAny, {
|
|
29
|
+
id: string;
|
|
30
|
+
content: string;
|
|
31
|
+
source: string;
|
|
32
|
+
name: string;
|
|
33
|
+
createdAt: string;
|
|
34
|
+
accessedAt: string;
|
|
35
|
+
score: number;
|
|
36
|
+
}, {
|
|
37
|
+
id: string;
|
|
38
|
+
content: string;
|
|
39
|
+
source: string;
|
|
40
|
+
name: string;
|
|
41
|
+
createdAt: string;
|
|
42
|
+
accessedAt: string;
|
|
43
|
+
score?: number | undefined;
|
|
44
|
+
}>;
|
|
45
|
+
export type Memory = z.infer<typeof MemorySchema>;
|
|
46
|
+
/**
|
|
47
|
+
* 泊文当前使用的 source 标签约定
|
|
48
|
+
*
|
|
49
|
+
* 注意:source 是开放字符串,新增来源无需改代码
|
|
50
|
+
* 只需在存储时指定 source 字符串即可
|
|
51
|
+
*/
|
|
52
|
+
export declare const SOURCE_LABELS: {
|
|
53
|
+
/** 角色人格(agent-config/personas/*.md) */
|
|
54
|
+
readonly PERSONA: "persona";
|
|
55
|
+
/** 创作规则(agent-config/rules/*.md + .memora/rules/*.md) */
|
|
56
|
+
readonly RULE: "rule";
|
|
57
|
+
/** 技能定义(agent-config/skills/*.md) */
|
|
58
|
+
readonly SKILL: "skill";
|
|
59
|
+
/** 对话洞察(每轮问答结束后 LLM 提取) */
|
|
60
|
+
readonly INSIGHT: "insight";
|
|
61
|
+
/** 用户画像(每轮问答中 LLM 实时提取) */
|
|
62
|
+
readonly PROFILE: "profile";
|
|
63
|
+
/** 作品投影(Agent 读取用户作品时生成的概要) */
|
|
64
|
+
readonly WORK_PROJECTION: "work-projection";
|
|
65
|
+
/** 内容护栏规则(configDir/rules/guardrails/ 下的规则文件) */
|
|
66
|
+
readonly GUARDRAIL: "guardrail";
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* 中文停用词集合
|
|
70
|
+
* 用于关键词提取时过滤无意义词汇
|
|
71
|
+
*/
|
|
72
|
+
export declare const STOPWORDS: Set<string>;
|
|
73
|
+
/**
|
|
74
|
+
* 从文件路径自动推断 source(目录映射 + frontmatter 覆盖)
|
|
75
|
+
*
|
|
76
|
+
* @param filePath - 文件路径
|
|
77
|
+
* @param frontmatterSource - frontmatter 中显式声明的 source(可选)
|
|
78
|
+
* @returns source 字符串
|
|
79
|
+
*/
|
|
80
|
+
export declare function inferSource(filePath: string, frontmatterSource?: string): string;
|
|
81
|
+
/**
|
|
82
|
+
* 转义 LIKE 通配符,防止注入
|
|
83
|
+
*
|
|
84
|
+
* @param str - 原始字符串
|
|
85
|
+
* @returns 转义后的字符串
|
|
86
|
+
*/
|
|
87
|
+
export declare function escapeLike(str: string): string;
|
|
88
|
+
/**
|
|
89
|
+
* source 校验严重级别
|
|
90
|
+
*
|
|
91
|
+
* - 'block':安全边界违规,调用方必须拒绝写入(throw)
|
|
92
|
+
* - 'warn':调用方 bug 或疑似 typo,应 warn 但允许写入
|
|
93
|
+
* - undefined:无异常
|
|
94
|
+
*/
|
|
95
|
+
export type SourceValidationSeverity = 'block' | 'warn';
|
|
96
|
+
/**
|
|
97
|
+
* 校验 source 字段是否为已知标签
|
|
98
|
+
*
|
|
99
|
+
* 返回校验结果,包含严重级别与警告信息(如有)。
|
|
100
|
+
*
|
|
101
|
+
* 分级策略:
|
|
102
|
+
* - 路径遍历(`..`)与 null 字节 → severity='block'(安全边界,必须拒绝)
|
|
103
|
+
* - 空字符串、非字符串、首尾空格 → severity='block'(调用方 bug,必须拒绝)
|
|
104
|
+
* - 与已知标签 Levenshtein 距离 ≤ 2 的疑似 typo → severity='warn'(保持开放性)
|
|
105
|
+
* - 其他自定义 source → valid: true(完全允许)
|
|
106
|
+
*
|
|
107
|
+
* @param source - 待校验的 source 字符串
|
|
108
|
+
* @returns 校验结果
|
|
109
|
+
*/
|
|
110
|
+
export declare function validateSource(source: string): {
|
|
111
|
+
valid: boolean;
|
|
112
|
+
severity?: SourceValidationSeverity;
|
|
113
|
+
warning?: string;
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* 记忆关系基元 — 独立于 Memory 7 字段的侧车数据结构
|
|
117
|
+
*
|
|
118
|
+
* 设计原则(ADR-014):
|
|
119
|
+
* - 不侵入 Memory 类型,与 Memory 平行存在
|
|
120
|
+
* - 关系类型是开放字符串(非枚举),宿主可自由扩展
|
|
121
|
+
* - 存储有向(sourceId → targetId),查询时按 direction 参数过滤
|
|
122
|
+
*
|
|
123
|
+
* 预设关系类型建议值(非强制):
|
|
124
|
+
* - 'contradicts':矛盾(双向对称)
|
|
125
|
+
* - 'supports':支持(有向)
|
|
126
|
+
* - 'follows':时间先后(有向)
|
|
127
|
+
* - 'refines':细化/演化(有向)
|
|
128
|
+
* - 'caused':因果(有向)
|
|
129
|
+
* - 'related':泛相关(双向对称)
|
|
130
|
+
*/
|
|
131
|
+
export interface MemoryRelation {
|
|
132
|
+
/** 关系起点(Memory.id) */
|
|
133
|
+
sourceId: string;
|
|
134
|
+
/** 关系终点(Memory.id) */
|
|
135
|
+
targetId: string;
|
|
136
|
+
/** 关系类型(开放字符串,非枚举) */
|
|
137
|
+
type: string;
|
|
138
|
+
/** 关系强度 0-1(LLM 四档:0.0/0.3/0.7/1.0,代码默认 0.5 兜底) */
|
|
139
|
+
weight: number;
|
|
140
|
+
/** 创建时间(ISO 8601) */
|
|
141
|
+
createdAt: string;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 关系查询方向
|
|
145
|
+
* - 'outgoing':只查 sourceId = memoryId 的关系(冲突检测用)
|
|
146
|
+
* - 'incoming':只查 targetId = memoryId 的关系
|
|
147
|
+
* - 'both':合并两个方向并去重(可视化/召回增强用,默认)
|
|
148
|
+
*/
|
|
149
|
+
export type RelationDirection = 'outgoing' | 'incoming' | 'both';
|
|
150
|
+
/**
|
|
151
|
+
* weight 四档离散值常量(LLM 输出约束)
|
|
152
|
+
*
|
|
153
|
+
* 设计理由(ADR-014 §4):
|
|
154
|
+
* - 离散值比连续浮点稳定,LLM 输出可预测
|
|
155
|
+
* - 0.5 兜底避免 LLM 失败时关系数据缺失
|
|
156
|
+
*/
|
|
157
|
+
export declare const RELATION_WEIGHTS: {
|
|
158
|
+
/** 几乎无关(LLM 明确判断无关系) */
|
|
159
|
+
readonly NONE: 0;
|
|
160
|
+
/** 弱相关(关系存在但强度低) */
|
|
161
|
+
readonly WEAK: 0.3;
|
|
162
|
+
/** 未判断(代码默认兜底,LLM 失败或未输出时) */
|
|
163
|
+
readonly UNDEFINED: 0.5;
|
|
164
|
+
/** 强相关(关系明确且强度高) */
|
|
165
|
+
readonly STRONG: 0.7;
|
|
166
|
+
/** 确定关系(矛盾/等价等强关系) */
|
|
167
|
+
readonly CERTAIN: 1;
|
|
168
|
+
};
|
|
169
|
+
/**
|
|
170
|
+
* 预设关系类型建议值(非枚举,仅作约定)
|
|
171
|
+
*
|
|
172
|
+
* 注意:type 是开放字符串,新增关系类型无需改代码
|
|
173
|
+
* 只需在存储时指定 type 字符串即可
|
|
174
|
+
*/
|
|
175
|
+
export declare const RELATION_TYPES: {
|
|
176
|
+
/** 矛盾(双向对称) */
|
|
177
|
+
readonly CONTRADICTS: "contradicts";
|
|
178
|
+
/** 支持(有向) */
|
|
179
|
+
readonly SUPPORTS: "supports";
|
|
180
|
+
/** 时间先后(有向) */
|
|
181
|
+
readonly FOLLOWS: "follows";
|
|
182
|
+
/** 细化/演化(有向) */
|
|
183
|
+
readonly REFINES: "refines";
|
|
184
|
+
/** 因果(有向) */
|
|
185
|
+
readonly CAUSED: "caused";
|
|
186
|
+
/** 泛相关(双向对称) */
|
|
187
|
+
readonly RELATED: "related";
|
|
188
|
+
};
|
|
189
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;;;GAIG;AACH,eAAO,MAAM,YAAY;IACvB,8DAA8D;;IAE9D,wBAAwB;;IAExB,sBAAsB;;IAEtB,qBAAqB;;IAErB,qBAAqB;;IAErB,sBAAsB;;IAEtB,sBAAsB;;;;;;;;;;;;;;;;;;EAEtB,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAIlD;;;;;GAKG;AACH,eAAO,MAAM,aAAa;IACxB,uCAAuC;;IAEvC,yDAAyD;;IAEzD,qCAAqC;;IAErC,2BAA2B;;IAE3B,2BAA2B;;IAE3B,+BAA+B;;IAE/B,iDAAiD;;CAEzC,CAAC;AAIX;;;GAGG;AACH,eAAO,MAAM,SAAS,aAOpB,CAAC;AAIH;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,CAWhF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAYD;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,MAAM,CAAC;AAExD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG;IAC9C,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAgDA;AAoCD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,cAAc;IAC7B,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;AAEjE;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;IAC3B,wBAAwB;;IAExB,oBAAoB;;IAEpB,8BAA8B;;IAE9B,oBAAoB;;IAEpB,sBAAsB;;CAEd,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,cAAc;IACzB,eAAe;;IAEf,aAAa;;IAEb,eAAe;;IAEf,gBAAgB;;IAEhB,aAAa;;IAEb,gBAAgB;;CAER,CAAC"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 记忆类型定义 — 基元驱动模型
|
|
3
|
+
*
|
|
4
|
+
* 设计哲学:万物皆是记忆,用 source 开放字符串替代封闭枚举
|
|
5
|
+
* 详见 ADR-004 · 记忆统一模型
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
// ─── 基元定义 ─────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* 记忆基元 schema
|
|
11
|
+
*
|
|
12
|
+
* 7 个核心字段,无封闭枚举,无额外元数据
|
|
13
|
+
*/
|
|
14
|
+
export const MemorySchema = z.object({
|
|
15
|
+
/** 唯一标识(source:name,如 'rule:core'、'insight:1718083200000') */
|
|
16
|
+
id: z.string(),
|
|
17
|
+
/** 记忆内容(Markdown 文本) */
|
|
18
|
+
content: z.string(),
|
|
19
|
+
/** 来源标签(开放字符串,非枚举) */
|
|
20
|
+
source: z.string(),
|
|
21
|
+
/** 可读名称(文件名或摘要标题) */
|
|
22
|
+
name: z.string(),
|
|
23
|
+
/** 创建时间(ISO 8601) */
|
|
24
|
+
createdAt: z.string().datetime(),
|
|
25
|
+
/** 最后访问时间(每次召回时刷新) */
|
|
26
|
+
accessedAt: z.string().datetime(),
|
|
27
|
+
/** 权重(0-1,召回时用于排序) */
|
|
28
|
+
score: z.number().min(0).max(1).default(0.5),
|
|
29
|
+
});
|
|
30
|
+
// ─── source 标签约定(非枚举,仅为泊文当前使用的约定) ──────
|
|
31
|
+
/**
|
|
32
|
+
* 泊文当前使用的 source 标签约定
|
|
33
|
+
*
|
|
34
|
+
* 注意:source 是开放字符串,新增来源无需改代码
|
|
35
|
+
* 只需在存储时指定 source 字符串即可
|
|
36
|
+
*/
|
|
37
|
+
export const SOURCE_LABELS = {
|
|
38
|
+
/** 角色人格(agent-config/personas/*.md) */
|
|
39
|
+
PERSONA: 'persona',
|
|
40
|
+
/** 创作规则(agent-config/rules/*.md + .memora/rules/*.md) */
|
|
41
|
+
RULE: 'rule',
|
|
42
|
+
/** 技能定义(agent-config/skills/*.md) */
|
|
43
|
+
SKILL: 'skill',
|
|
44
|
+
/** 对话洞察(每轮问答结束后 LLM 提取) */
|
|
45
|
+
INSIGHT: 'insight',
|
|
46
|
+
/** 用户画像(每轮问答中 LLM 实时提取) */
|
|
47
|
+
PROFILE: 'profile',
|
|
48
|
+
/** 作品投影(Agent 读取用户作品时生成的概要) */
|
|
49
|
+
WORK_PROJECTION: 'work-projection',
|
|
50
|
+
/** 内容护栏规则(configDir/rules/guardrails/ 下的规则文件) */
|
|
51
|
+
GUARDRAIL: 'guardrail',
|
|
52
|
+
};
|
|
53
|
+
// ─── 分词相关 ─────────────────────────────────────────────
|
|
54
|
+
/**
|
|
55
|
+
* 中文停用词集合
|
|
56
|
+
* 用于关键词提取时过滤无意义词汇
|
|
57
|
+
*/
|
|
58
|
+
export const STOPWORDS = new Set([
|
|
59
|
+
'的', '了', '是', '在', '我', '有', '和', '就', '不', '人', '都',
|
|
60
|
+
'一', '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会',
|
|
61
|
+
'着', '没有', '看', '好', '自己', '这', '那', '什么', '怎么', '可以',
|
|
62
|
+
'这个', '那个', '他们', '我们', '因为', '所以', '但是', '如果', '虽然',
|
|
63
|
+
'能', '把', '被', '让', '给', '对', '从', '为', '比', '与', '或',
|
|
64
|
+
'吗', '呢', '吧', '啊', '哦', '嗯', '呀', '哈',
|
|
65
|
+
]);
|
|
66
|
+
// ─── 工具函数 ─────────────────────────────────────────────
|
|
67
|
+
/**
|
|
68
|
+
* 从文件路径自动推断 source(目录映射 + frontmatter 覆盖)
|
|
69
|
+
*
|
|
70
|
+
* @param filePath - 文件路径
|
|
71
|
+
* @param frontmatterSource - frontmatter 中显式声明的 source(可选)
|
|
72
|
+
* @returns source 字符串
|
|
73
|
+
*/
|
|
74
|
+
export function inferSource(filePath, frontmatterSource) {
|
|
75
|
+
// 优先:frontmatter 中显式声明的 source
|
|
76
|
+
if (frontmatterSource)
|
|
77
|
+
return frontmatterSource;
|
|
78
|
+
// 回退:目录路径映射(使用路径分隔符匹配,避免 'other-personas/' 误匹配)
|
|
79
|
+
if (/[\\/]personas[\\/]/.test(filePath))
|
|
80
|
+
return SOURCE_LABELS.PERSONA;
|
|
81
|
+
if (/[\\/]rules[\\/]/.test(filePath))
|
|
82
|
+
return SOURCE_LABELS.RULE;
|
|
83
|
+
if (/[\\/]skills[\\/]/.test(filePath))
|
|
84
|
+
return SOURCE_LABELS.SKILL;
|
|
85
|
+
// 默认
|
|
86
|
+
return 'unknown';
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* 转义 LIKE 通配符,防止注入
|
|
90
|
+
*
|
|
91
|
+
* @param str - 原始字符串
|
|
92
|
+
* @returns 转义后的字符串
|
|
93
|
+
*/
|
|
94
|
+
export function escapeLike(str) {
|
|
95
|
+
return str.replace(/[%_]/g, '\\$&');
|
|
96
|
+
}
|
|
97
|
+
// ─── Source 校验 ────────────────────────────────────────────
|
|
98
|
+
/**
|
|
99
|
+
* 已知 source 标签集合(用于运行时校验)
|
|
100
|
+
*
|
|
101
|
+
* 从 SOURCE_LABELS 常量自动派生,保持同步。
|
|
102
|
+
* 不是枚举——只用于 typo 检测,不阻止写入。
|
|
103
|
+
*/
|
|
104
|
+
const KNOWN_SOURCES = new Set(Object.values(SOURCE_LABELS));
|
|
105
|
+
/**
|
|
106
|
+
* 校验 source 字段是否为已知标签
|
|
107
|
+
*
|
|
108
|
+
* 返回校验结果,包含严重级别与警告信息(如有)。
|
|
109
|
+
*
|
|
110
|
+
* 分级策略:
|
|
111
|
+
* - 路径遍历(`..`)与 null 字节 → severity='block'(安全边界,必须拒绝)
|
|
112
|
+
* - 空字符串、非字符串、首尾空格 → severity='block'(调用方 bug,必须拒绝)
|
|
113
|
+
* - 与已知标签 Levenshtein 距离 ≤ 2 的疑似 typo → severity='warn'(保持开放性)
|
|
114
|
+
* - 其他自定义 source → valid: true(完全允许)
|
|
115
|
+
*
|
|
116
|
+
* @param source - 待校验的 source 字符串
|
|
117
|
+
* @returns 校验结果
|
|
118
|
+
*/
|
|
119
|
+
export function validateSource(source) {
|
|
120
|
+
if (!source || typeof source !== 'string') {
|
|
121
|
+
return {
|
|
122
|
+
valid: false,
|
|
123
|
+
severity: 'block',
|
|
124
|
+
warning: `source 不能为空或非字符串,收到:${String(source)}`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (source.trim() !== source) {
|
|
128
|
+
return {
|
|
129
|
+
valid: false,
|
|
130
|
+
severity: 'block',
|
|
131
|
+
warning: `source 包含首尾空格:"${source}"`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (source.includes('..')) {
|
|
135
|
+
return {
|
|
136
|
+
valid: false,
|
|
137
|
+
severity: 'block',
|
|
138
|
+
warning: `source 不能包含路径遍历序列:"${source}"`,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (source.includes('\0')) {
|
|
142
|
+
return {
|
|
143
|
+
valid: false,
|
|
144
|
+
severity: 'block',
|
|
145
|
+
warning: `source 不能包含 null 字节`,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
// 检查与已知标签的相似度(简单 Levenshtein 距离 ≤ 2)
|
|
149
|
+
if (!KNOWN_SOURCES.has(source)) {
|
|
150
|
+
const closeMatch = [...KNOWN_SOURCES].find((known) => levenshtein(source, known) <= 2 && source !== known);
|
|
151
|
+
if (closeMatch) {
|
|
152
|
+
return {
|
|
153
|
+
valid: true,
|
|
154
|
+
severity: 'warn',
|
|
155
|
+
warning: `source "${source}" 可能是 "${closeMatch}" 的拼写错误(已知标签:${[...KNOWN_SOURCES].join(', ')})`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return { valid: true };
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 简单 Levenshtein 距离计算(仅用于短字符串,不做优化)
|
|
163
|
+
*/
|
|
164
|
+
function levenshtein(a, b) {
|
|
165
|
+
if (a.length === 0)
|
|
166
|
+
return b.length;
|
|
167
|
+
if (b.length === 0)
|
|
168
|
+
return a.length;
|
|
169
|
+
const matrix = [];
|
|
170
|
+
for (let i = 0; i <= b.length; i++)
|
|
171
|
+
matrix[i] = [i];
|
|
172
|
+
// QC-17 移除非空断言:提取局部变量并 null 检查
|
|
173
|
+
const row0 = matrix[0];
|
|
174
|
+
if (row0)
|
|
175
|
+
for (let j = 0; j <= a.length; j++)
|
|
176
|
+
row0[j] = j;
|
|
177
|
+
for (let i = 1; i <= b.length; i++) {
|
|
178
|
+
// QC-17 移除非空断言:提取局部变量,用 ?? 0 兜底(初始化保证值存在)
|
|
179
|
+
const rowI = matrix[i];
|
|
180
|
+
const rowPrev = matrix[i - 1];
|
|
181
|
+
if (!rowI || !rowPrev)
|
|
182
|
+
continue;
|
|
183
|
+
for (let j = 1; j <= a.length; j++) {
|
|
184
|
+
const cost = b[i - 1] === a[j - 1] ? 0 : 1;
|
|
185
|
+
rowI[j] = Math.min((rowPrev[j] ?? 0) + 1, (rowI[j - 1] ?? 0) + 1, (rowPrev[j - 1] ?? 0) + cost);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// QC-17 移除非空断言:使用可选链 + 空值合并兜底
|
|
189
|
+
return matrix[b.length]?.[a.length] ?? 0;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* weight 四档离散值常量(LLM 输出约束)
|
|
193
|
+
*
|
|
194
|
+
* 设计理由(ADR-014 §4):
|
|
195
|
+
* - 离散值比连续浮点稳定,LLM 输出可预测
|
|
196
|
+
* - 0.5 兜底避免 LLM 失败时关系数据缺失
|
|
197
|
+
*/
|
|
198
|
+
export const RELATION_WEIGHTS = {
|
|
199
|
+
/** 几乎无关(LLM 明确判断无关系) */
|
|
200
|
+
NONE: 0.0,
|
|
201
|
+
/** 弱相关(关系存在但强度低) */
|
|
202
|
+
WEAK: 0.3,
|
|
203
|
+
/** 未判断(代码默认兜底,LLM 失败或未输出时) */
|
|
204
|
+
UNDEFINED: 0.5,
|
|
205
|
+
/** 强相关(关系明确且强度高) */
|
|
206
|
+
STRONG: 0.7,
|
|
207
|
+
/** 确定关系(矛盾/等价等强关系) */
|
|
208
|
+
CERTAIN: 1.0,
|
|
209
|
+
};
|
|
210
|
+
/**
|
|
211
|
+
* 预设关系类型建议值(非枚举,仅作约定)
|
|
212
|
+
*
|
|
213
|
+
* 注意:type 是开放字符串,新增关系类型无需改代码
|
|
214
|
+
* 只需在存储时指定 type 字符串即可
|
|
215
|
+
*/
|
|
216
|
+
export const RELATION_TYPES = {
|
|
217
|
+
/** 矛盾(双向对称) */
|
|
218
|
+
CONTRADICTS: 'contradicts',
|
|
219
|
+
/** 支持(有向) */
|
|
220
|
+
SUPPORTS: 'supports',
|
|
221
|
+
/** 时间先后(有向) */
|
|
222
|
+
FOLLOWS: 'follows',
|
|
223
|
+
/** 细化/演化(有向) */
|
|
224
|
+
REFINES: 'refines',
|
|
225
|
+
/** 因果(有向) */
|
|
226
|
+
CAUSED: 'caused',
|
|
227
|
+
/** 泛相关(双向对称) */
|
|
228
|
+
RELATED: 'related',
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"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"}
|