@zooique/memora 0.2.1 → 1.0.1

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.
Files changed (104) hide show
  1. package/README.md +5 -5
  2. package/dist/agent/agent.d.ts +13 -3
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/agent.js +15 -0
  5. package/dist/agent/agent.js.map +1 -1
  6. package/dist/agent/assembler.d.ts +3 -0
  7. package/dist/agent/assembler.d.ts.map +1 -1
  8. package/dist/agent/assembler.js +11 -2
  9. package/dist/agent/assembler.js.map +1 -1
  10. package/dist/agent/guardrail.d.ts +47 -0
  11. package/dist/agent/guardrail.d.ts.map +1 -0
  12. package/dist/agent/guardrail.js +51 -0
  13. package/dist/agent/guardrail.js.map +1 -0
  14. package/dist/agent/loop.d.ts +0 -17
  15. package/dist/agent/loop.d.ts.map +1 -1
  16. package/dist/agent/loop.js +16 -56
  17. package/dist/agent/loop.js.map +1 -1
  18. package/dist/agent/managers/insightExtractor.d.ts +10 -73
  19. package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
  20. package/dist/agent/managers/insightExtractor.js +27 -154
  21. package/dist/agent/managers/insightExtractor.js.map +1 -1
  22. package/dist/agent/managers/memoryInspector.d.ts +37 -49
  23. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  24. package/dist/agent/managers/memoryInspector.js +116 -63
  25. package/dist/agent/managers/memoryInspector.js.map +1 -1
  26. package/dist/agent/managers/memoryMutator.d.ts +92 -0
  27. package/dist/agent/managers/memoryMutator.d.ts.map +1 -0
  28. package/dist/agent/managers/memoryMutator.js +94 -0
  29. package/dist/agent/managers/memoryMutator.js.map +1 -0
  30. package/dist/agent/managers/relationBuilder.d.ts +131 -0
  31. package/dist/agent/managers/relationBuilder.d.ts.map +1 -0
  32. package/dist/agent/managers/relationBuilder.js +191 -0
  33. package/dist/agent/managers/relationBuilder.js.map +1 -0
  34. package/dist/agent/types.d.ts +8 -0
  35. package/dist/agent/types.d.ts.map +1 -1
  36. package/dist/config/loader.d.ts +48 -36
  37. package/dist/config/loader.d.ts.map +1 -1
  38. package/dist/config/loader.js +29 -31
  39. package/dist/config/loader.js.map +1 -1
  40. package/dist/eval/evalTypes.d.ts +15 -6
  41. package/dist/eval/evalTypes.d.ts.map +1 -1
  42. package/dist/eval/evalTypes.js +3 -2
  43. package/dist/eval/evalTypes.js.map +1 -1
  44. package/dist/index.d.ts +15 -7
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +12 -3
  47. package/dist/index.js.map +1 -1
  48. package/dist/llm/embedding.d.ts +18 -2
  49. package/dist/llm/embedding.d.ts.map +1 -1
  50. package/dist/llm/embedding.js +78 -46
  51. package/dist/llm/embedding.js.map +1 -1
  52. package/dist/llm/factory.js +1 -1
  53. package/dist/llm/factory.js.map +1 -1
  54. package/dist/llm/openaiCompatible.d.ts.map +1 -1
  55. package/dist/llm/openaiCompatible.js +11 -2
  56. package/dist/llm/openaiCompatible.js.map +1 -1
  57. package/dist/llm/provider.d.ts +0 -14
  58. package/dist/llm/provider.d.ts.map +1 -1
  59. package/dist/llm/provider.js.map +1 -1
  60. package/dist/logging/logger.d.ts +1 -0
  61. package/dist/logging/logger.d.ts.map +1 -1
  62. package/dist/logging/logger.js +43 -37
  63. package/dist/logging/logger.js.map +1 -1
  64. package/dist/memory/inMemoryStorage.js +1 -1
  65. package/dist/memory/inMemoryStorage.js.map +1 -1
  66. package/dist/memory/lockManager.d.ts +48 -0
  67. package/dist/memory/lockManager.d.ts.map +1 -0
  68. package/dist/memory/lockManager.js +167 -0
  69. package/dist/memory/lockManager.js.map +1 -0
  70. package/dist/memory/projectManager.d.ts +23 -53
  71. package/dist/memory/projectManager.d.ts.map +1 -1
  72. package/dist/memory/projectManager.js +47 -228
  73. package/dist/memory/projectManager.js.map +1 -1
  74. package/dist/memory/projectRegistry.d.ts +62 -0
  75. package/dist/memory/projectRegistry.d.ts.map +1 -0
  76. package/dist/memory/projectRegistry.js +166 -0
  77. package/dist/memory/projectRegistry.js.map +1 -0
  78. package/dist/memory/recall.d.ts +3 -3
  79. package/dist/memory/recall.d.ts.map +1 -1
  80. package/dist/memory/recall.js +2 -2
  81. package/dist/memory/recall.js.map +1 -1
  82. package/dist/memory/sourceValidation.d.ts +43 -0
  83. package/dist/memory/sourceValidation.d.ts.map +1 -0
  84. package/dist/memory/sourceValidation.js +139 -0
  85. package/dist/memory/sourceValidation.js.map +1 -0
  86. package/dist/memory/store.d.ts.map +1 -1
  87. package/dist/memory/store.js +2 -1
  88. package/dist/memory/store.js.map +1 -1
  89. package/dist/memory/types.d.ts +44 -47
  90. package/dist/memory/types.d.ts.map +1 -1
  91. package/dist/memory/types.js +0 -138
  92. package/dist/memory/types.js.map +1 -1
  93. package/dist/memory/vectorStore.d.ts +68 -7
  94. package/dist/memory/vectorStore.d.ts.map +1 -1
  95. package/dist/memory/vectorStore.js +12 -8
  96. package/dist/memory/vectorStore.js.map +1 -1
  97. package/dist/security/pathGuard.d.ts.map +1 -1
  98. package/dist/security/pathGuard.js +3 -1
  99. package/dist/security/pathGuard.js.map +1 -1
  100. package/dist/utils/segmenter.d.ts +6 -0
  101. package/dist/utils/segmenter.d.ts.map +1 -1
  102. package/dist/utils/segmenter.js +13 -0
  103. package/dist/utils/segmenter.js.map +1 -1
  104. package/package.json +1 -1
@@ -0,0 +1,166 @@
1
+ /**
2
+ * 项目注册表 — 多项目注册信息持久化
3
+ *
4
+ * 从 ProjectManager 拆分出来(P1-4),专职管理 projects.json 注册表:
5
+ * - 读写项目注册表(~/.memora/projects.json 或宿主指定 registryDir)
6
+ * - 注册/注销项目条目(Windows 大小写不敏感去重)
7
+ * - 从路径推断项目名称
8
+ * - 不可信磁盘 JSON 的运行时类型校验(QC-24,替代 `as` 类型断言)
9
+ *
10
+ * 设计原则:
11
+ * - 纯文件系统操作,无锁机制(锁由 LockManager 负责)
12
+ * - 同步 I/O(list getter 契约要求同步返回;注册表操作低频,影响可控)
13
+ * - 损坏降级:解析失败返回空列表 + 警告日志,不抛异常
14
+ *
15
+ * 与 ProjectManager 的分工(P1-4 拆分,1.0 接口稳定化):
16
+ * - ProjectRegistry:注册表读写 + 条目管理 + 名称推断
17
+ * - ProjectManager:项目生命周期编排(加锁 + 资源加载 + 上下文构建)
18
+ *
19
+ * 详见 ADR-008 · 目录结构按"职责分层" + 迭代文档 P1-4
20
+ */
21
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
22
+ import { logger } from '../logging/logger.js';
23
+ import { toError } from '../utils/toError.js';
24
+ import { nowIso } from '../utils/time.js';
25
+ // ─── 类型守卫(QC-24,对不可信磁盘 JSON 运行时校验) ─────
26
+ /**
27
+ * 判断值是否为非数组对象(排除 null)
28
+ *
29
+ * @param value 待校验的值
30
+ * @returns true 表示是普通对象
31
+ */
32
+ function isPlainObject(value) {
33
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
34
+ }
35
+ /**
36
+ * 判断值是否为 ProjectEntry(项目注册表条目)
37
+ *
38
+ * @param value 待校验的值
39
+ * @returns true 表示符合 ProjectEntry 结构
40
+ */
41
+ function isProjectEntry(value) {
42
+ if (!isPlainObject(value))
43
+ return false;
44
+ return (typeof value['path'] === 'string' &&
45
+ typeof value['name'] === 'string' &&
46
+ typeof value['lastOpened'] === 'string');
47
+ }
48
+ /**
49
+ * 判断值是否为 ProjectEntry 数组
50
+ *
51
+ * 过滤掉不符合结构的条目,仅保留合法条目
52
+ *
53
+ * @param value 待校验的值
54
+ * @returns 解析后的合法条目数组(损坏时返回空数组)
55
+ */
56
+ function asProjectEntryArray(value) {
57
+ if (!Array.isArray(value))
58
+ return [];
59
+ return value.filter(isProjectEntry);
60
+ }
61
+ // ─── 类 ──────────────────────────────────────────────────
62
+ /**
63
+ * 项目注册表
64
+ *
65
+ * 管理 projects.json 文件的读写和条目维护。
66
+ * Windows 文件系统不区分大小写,路径大小写不同视为同一项目。
67
+ */
68
+ export class ProjectRegistry {
69
+ registryPath;
70
+ /**
71
+ * @param registryPath - 注册表文件绝对路径(projects.json)
72
+ */
73
+ constructor(registryPath) {
74
+ this.registryPath = registryPath;
75
+ }
76
+ /**
77
+ * 列出已注册的项目(同步读取,契约要求 getter 风格)
78
+ */
79
+ get list() {
80
+ return this.read();
81
+ }
82
+ /**
83
+ * 注册项目到注册表
84
+ *
85
+ * Windows 文件系统不区分大小写,路径大小写不同视为同一项目(更新而非新增)。
86
+ *
87
+ * @param projectPath - 项目根目录绝对路径
88
+ * @param name - 项目名称
89
+ */
90
+ register(projectPath, name) {
91
+ const registry = this.read();
92
+ // Windows 文件系统不区分大小写,路径大小写不同视为同一项目
93
+ const existing = registry.findIndex((e) => e.path.toLowerCase() === projectPath.toLowerCase());
94
+ const entry = {
95
+ path: projectPath,
96
+ name,
97
+ lastOpened: nowIso(),
98
+ };
99
+ if (existing >= 0) {
100
+ registry[existing] = entry;
101
+ }
102
+ else {
103
+ registry.push(entry);
104
+ }
105
+ this.write(registry);
106
+ }
107
+ /**
108
+ * 从注册表移除项目
109
+ *
110
+ * @param projectPath - 项目根目录绝对路径
111
+ */
112
+ unregister(projectPath) {
113
+ const registry = this.read();
114
+ // Windows 文件系统不区分大小写,大小写不同视为同一项目
115
+ const filtered = registry.filter((e) => e.path.toLowerCase() !== projectPath.toLowerCase());
116
+ this.write(filtered);
117
+ }
118
+ /**
119
+ * 从项目路径推断项目名称(取路径最后一段目录名)
120
+ *
121
+ * @param projectPath - 项目根目录绝对路径
122
+ * @returns 项目名称(目录名,无法推断时返回 'unnamed')
123
+ */
124
+ static inferProjectName(projectPath) {
125
+ const parts = projectPath.replace(/[/\\]+$/, '').split(/[/\\]/);
126
+ return parts[parts.length - 1] || 'unnamed';
127
+ }
128
+ /**
129
+ * 读取项目注册表
130
+ *
131
+ * 同步读取:list getter 契约要求同步返回,注册表操作低频,同步 I/O 影响可控。
132
+ * 损坏时返回空数组并记录警告日志,避免静默吞错掩盖磁盘故障。
133
+ */
134
+ read() {
135
+ if (!existsSync(this.registryPath)) {
136
+ return [];
137
+ }
138
+ try {
139
+ const raw = readFileSync(this.registryPath, 'utf-8');
140
+ // QC-24 使用类型守卫校验 JSON.parse 结果,替代 `as ProjectEntry[]` 类型断言
141
+ // 过滤掉不符合结构的条目,仅保留合法条目
142
+ const parsed = JSON.parse(raw);
143
+ const entries = asProjectEntryArray(parsed);
144
+ if (entries.length === 0 && Array.isArray(parsed) && parsed.length > 0) {
145
+ // 数组存在但所有条目都不合法,记录警告
146
+ logger.warn({ path: this.registryPath, totalEntries: parsed.length }, '项目注册表所有条目结构不合法,返回空列表');
147
+ }
148
+ return entries;
149
+ }
150
+ catch (err) {
151
+ // 注册表损坏:记录警告日志便于排查(不存在属正常首次启动,损坏需排查)
152
+ logger.warn({ path: this.registryPath, err: toError(err).message }, '项目注册表解析失败,返回空列表');
153
+ return [];
154
+ }
155
+ }
156
+ /**
157
+ * 写入项目注册表
158
+ */
159
+ write(entries) {
160
+ // 确保目录存在
161
+ const dir = this.registryPath.replace(/[/\\][^/\\]+$/, '');
162
+ mkdirSync(dir, { recursive: true });
163
+ writeFileSync(this.registryPath, JSON.stringify(entries, null, 2), 'utf-8');
164
+ }
165
+ }
166
+ //# sourceMappingURL=projectRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectRegistry.js","sourceRoot":"","sources":["../../src/memory/projectRegistry.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@
11
11
  */
12
12
  import type { Memory } from '../memory/types.js';
13
13
  import type { IMemoryStorage } from '../memory/storageInterface.js';
14
- import type { VectorStore } from '../memory/vectorStore.js';
14
+ import type { IVectorStore } from '../memory/vectorStore.js';
15
15
  /** 一天对应的毫秒数 */
16
16
  export declare const ONE_DAY_MS: number;
17
17
  /**
@@ -32,8 +32,8 @@ export interface RecallOptions {
32
32
  limit?: number;
33
33
  /** 排除的 source 标签(默认排除 persona、rule、skill——已单独注入 system prompt 的记忆) */
34
34
  excludeSources?: string[];
35
- /** 向量存储(可选,提供时启用语义搜索) */
36
- vectorStore?: VectorStore;
35
+ /** 向量存储(可选,提供时启用语义搜索;接受任意 IVectorStore 实现) */
36
+ vectorStore?: IVectorStore;
37
37
  /** 语义搜索相似度阈值(默认 0.3) */
38
38
  minSimilarity?: number;
39
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/memory/recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA2B3D,eAAe;AACf,eAAO,MAAM,UAAU,QAAsB,CAAC;AAE9C;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUvD;AAID;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,yBAAyB;IACzB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,wBAAwB;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC,CAgEnB;AAkBD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAcrE"}
1
+ {"version":3,"file":"recall.d.ts","sourceRoot":"","sources":["../../src/memory/recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AA2B5D,eAAe;AACf,eAAO,MAAM,UAAU,QAAsB,CAAC;AAE9C;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUvD;AAID;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,wBAAwB;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC,CAgEnB;AAkBD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAcrE"}
@@ -1,6 +1,6 @@
1
1
  import { logger } from '../logging/logger.js';
2
- import { STOPWORDS, SOURCE_LABELS } from '../memory/types.js';
3
- import { segmentText } from '../utils/segmenter.js';
2
+ import { SOURCE_LABELS } from '../memory/types.js';
3
+ import { segmentText, STOPWORDS } from '../utils/segmenter.js';
4
4
  import { nowIso } from '../utils/time.js';
5
5
  import { hybridMerge, RECALL_LIMIT_MULTIPLIER } from '../memory/hybridMerge.js';
6
6
  // ─── 召回与衰减常量 ─────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/memory/recall.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"recall.js","sourceRoot":"","sources":["../../src/memory/recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * source 校验严重级别
3
+ *
4
+ * - 'block':安全边界违规,调用方必须拒绝写入(throw)
5
+ * - 'warn':调用方 bug 或疑似 typo,应 warn 但允许写入
6
+ * - undefined:无异常
7
+ */
8
+ export type SourceValidationSeverity = 'block' | 'warn';
9
+ /**
10
+ * 从文件路径自动推断 source(目录映射 + frontmatter 覆盖)
11
+ *
12
+ * @param filePath - 文件路径
13
+ * @param frontmatterSource - frontmatter 中显式声明的 source(可选)
14
+ * @returns source 字符串
15
+ */
16
+ export declare function inferSource(filePath: string, frontmatterSource?: string): string;
17
+ /**
18
+ * 转义 LIKE 通配符,防止注入
19
+ *
20
+ * @param str - 原始字符串
21
+ * @returns 转义后的字符串
22
+ */
23
+ export declare function escapeLike(str: string): string;
24
+ /**
25
+ * 校验 source 字段是否为已知标签
26
+ *
27
+ * 返回校验结果,包含严重级别与警告信息(如有)。
28
+ *
29
+ * 分级策略:
30
+ * - 路径遍历(`..`)与 null 字节 → severity='block'(安全边界,必须拒绝)
31
+ * - 空字符串、非字符串、首尾空格 → severity='block'(调用方 bug,必须拒绝)
32
+ * - 与已知标签 Levenshtein 距离 ≤ 2 的疑似 typo → severity='warn'(保持开放性)
33
+ * - 其他自定义 source → valid: true(完全允许)
34
+ *
35
+ * @param source - 待校验的 source 字符串
36
+ * @returns 校验结果
37
+ */
38
+ export declare function validateSource(source: string): {
39
+ valid: boolean;
40
+ severity?: SourceValidationSeverity;
41
+ warning?: string;
42
+ };
43
+ //# sourceMappingURL=sourceValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceValidation.d.ts","sourceRoot":"","sources":["../../src/memory/sourceValidation.ts"],"names":[],"mappings":"AAgBA;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,MAAM,CAAC;AAUxD;;;;;;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;AAED;;;;;;;;;;;;;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"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Source 校验工具 — 从 memory/types.ts 提取的运行时函数
3
+ *
4
+ * 职责:
5
+ * - inferSource:从文件路径自动推断 source 标签
6
+ * - escapeLike:转义 SQL LIKE 通配符
7
+ * - validateSource:校验 source 字段安全性和拼写
8
+ * - levenshtein:简单编辑距离计算(仅用于短字符串 typo 检测)
9
+ *
10
+ * 设计原则(ADR-004):
11
+ * - source 是开放字符串,新增来源无需改代码
12
+ * - 校验仅做 typo 检测,不阻止写入(保持开放性)
13
+ * - 安全边界(路径遍历、null 字节)必须拒绝
14
+ */
15
+ import { SOURCE_LABELS } from '../memory/types.js';
16
+ /**
17
+ * 已知 source 标签集合(用于运行时校验)
18
+ *
19
+ * 从 SOURCE_LABELS 常量自动派生,保持同步。
20
+ * 不是枚举——只用于 typo 检测,不阻止写入。
21
+ */
22
+ const KNOWN_SOURCES = new Set(Object.values(SOURCE_LABELS));
23
+ /**
24
+ * 从文件路径自动推断 source(目录映射 + frontmatter 覆盖)
25
+ *
26
+ * @param filePath - 文件路径
27
+ * @param frontmatterSource - frontmatter 中显式声明的 source(可选)
28
+ * @returns source 字符串
29
+ */
30
+ export function inferSource(filePath, frontmatterSource) {
31
+ // 优先:frontmatter 中显式声明的 source
32
+ if (frontmatterSource)
33
+ return frontmatterSource;
34
+ // 回退:目录路径映射(使用路径分隔符匹配,避免 'other-personas/' 误匹配)
35
+ if (/[\\/]personas[\\/]/.test(filePath))
36
+ return SOURCE_LABELS.PERSONA;
37
+ if (/[\\/]rules[\\/]/.test(filePath))
38
+ return SOURCE_LABELS.RULE;
39
+ if (/[\\/]skills[\\/]/.test(filePath))
40
+ return SOURCE_LABELS.SKILL;
41
+ // 默认
42
+ return 'unknown';
43
+ }
44
+ /**
45
+ * 转义 LIKE 通配符,防止注入
46
+ *
47
+ * @param str - 原始字符串
48
+ * @returns 转义后的字符串
49
+ */
50
+ export function escapeLike(str) {
51
+ return str.replace(/[%_]/g, '\\$&');
52
+ }
53
+ /**
54
+ * 校验 source 字段是否为已知标签
55
+ *
56
+ * 返回校验结果,包含严重级别与警告信息(如有)。
57
+ *
58
+ * 分级策略:
59
+ * - 路径遍历(`..`)与 null 字节 → severity='block'(安全边界,必须拒绝)
60
+ * - 空字符串、非字符串、首尾空格 → severity='block'(调用方 bug,必须拒绝)
61
+ * - 与已知标签 Levenshtein 距离 ≤ 2 的疑似 typo → severity='warn'(保持开放性)
62
+ * - 其他自定义 source → valid: true(完全允许)
63
+ *
64
+ * @param source - 待校验的 source 字符串
65
+ * @returns 校验结果
66
+ */
67
+ export function validateSource(source) {
68
+ if (!source || typeof source !== 'string') {
69
+ return {
70
+ valid: false,
71
+ severity: 'block',
72
+ warning: `source 不能为空或非字符串,收到:${String(source)}`,
73
+ };
74
+ }
75
+ if (source.trim() !== source) {
76
+ return {
77
+ valid: false,
78
+ severity: 'block',
79
+ warning: `source 包含首尾空格:"${source}"`,
80
+ };
81
+ }
82
+ if (source.includes('..')) {
83
+ return {
84
+ valid: false,
85
+ severity: 'block',
86
+ warning: `source 不能包含路径遍历序列:"${source}"`,
87
+ };
88
+ }
89
+ if (source.includes('\0')) {
90
+ return {
91
+ valid: false,
92
+ severity: 'block',
93
+ warning: `source 不能包含 null 字节`,
94
+ };
95
+ }
96
+ // 检查与已知标签的相似度(简单 Levenshtein 距离 ≤ 2)
97
+ if (!KNOWN_SOURCES.has(source)) {
98
+ const closeMatch = [...KNOWN_SOURCES].find((known) => levenshtein(source, known) <= 2 && source !== known);
99
+ if (closeMatch) {
100
+ return {
101
+ valid: true,
102
+ severity: 'warn',
103
+ warning: `source "${source}" 可能是 "${closeMatch}" 的拼写错误(已知标签:${[...KNOWN_SOURCES].join(', ')})`,
104
+ };
105
+ }
106
+ }
107
+ return { valid: true };
108
+ }
109
+ /**
110
+ * 简单 Levenshtein 距离计算(仅用于短字符串,不做优化)
111
+ */
112
+ function levenshtein(a, b) {
113
+ if (a.length === 0)
114
+ return b.length;
115
+ if (b.length === 0)
116
+ return a.length;
117
+ const matrix = [];
118
+ for (let i = 0; i <= b.length; i++)
119
+ matrix[i] = [i];
120
+ // QC-17 移除非空断言:提取局部变量并 null 检查
121
+ const row0 = matrix[0];
122
+ if (row0)
123
+ for (let j = 0; j <= a.length; j++)
124
+ row0[j] = j;
125
+ for (let i = 1; i <= b.length; i++) {
126
+ // QC-17 移除非空断言:提取局部变量,用 ?? 0 兜底(初始化保证值存在)
127
+ const rowI = matrix[i];
128
+ const rowPrev = matrix[i - 1];
129
+ if (!rowI || !rowPrev)
130
+ continue;
131
+ for (let j = 1; j <= a.length; j++) {
132
+ const cost = b[i - 1] === a[j - 1] ? 0 : 1;
133
+ rowI[j] = Math.min((rowPrev[j] ?? 0) + 1, (rowI[j - 1] ?? 0) + 1, (rowPrev[j - 1] ?? 0) + cost);
134
+ }
135
+ }
136
+ // QC-17 移除非空断言:使用可选链 + 空值合并兜底
137
+ return matrix[b.length]?.[a.length] ?? 0;
138
+ }
139
+ //# sourceMappingURL=sourceValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceValidation.js","sourceRoot":"","sources":["../../src/memory/sourceValidation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAQA,OAAO,EAA8B,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAoB5E;;;;;GAKG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAE5C;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqBhE;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1C;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiB7C;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;;;OAQG;IACH,OAAO,CAAC,WAAW;CA4CpB"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"AAQA,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAqB/D;;;;;GAKG;AACH,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAE5C;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAqBhE;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1C;;;;;OAKG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiB7C;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;;;OAQG;IACH,OAAO,CAAC,WAAW;CA4CpB"}
@@ -6,7 +6,8 @@
6
6
  */
7
7
  import { readFile, writeFile, mkdir, readdir, stat } from 'node:fs/promises';
8
8
  import { join, dirname } from 'node:path';
9
- import { SOURCE_LABELS, inferSource } from '../memory/types.js';
9
+ import { SOURCE_LABELS } from '../memory/types.js';
10
+ import { inferSource } from '../memory/sourceValidation.js';
10
11
  import { parseFrontmatter, serializeFrontmatter as serializeFm } from '../utils/frontmatter.js';
11
12
  import { logger } from '../logging/logger.js';
12
13
  import { toError } from '../utils/toError.js';
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/memory/store.ts"],"names":[],"mappings":"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"}
@@ -71,53 +71,6 @@ export declare const SOURCE_LABELS: {
71
71
  /** 内容护栏规则(configDir/rules/guardrails/ 下的规则文件) */
72
72
  readonly GUARDRAIL: "guardrail";
73
73
  };
74
- /**
75
- * 中文停用词集合
76
- * 用于关键词提取时过滤无意义词汇
77
- */
78
- export declare const STOPWORDS: Set<string>;
79
- /**
80
- * 从文件路径自动推断 source(目录映射 + frontmatter 覆盖)
81
- *
82
- * @param filePath - 文件路径
83
- * @param frontmatterSource - frontmatter 中显式声明的 source(可选)
84
- * @returns source 字符串
85
- */
86
- export declare function inferSource(filePath: string, frontmatterSource?: string): string;
87
- /**
88
- * 转义 LIKE 通配符,防止注入
89
- *
90
- * @param str - 原始字符串
91
- * @returns 转义后的字符串
92
- */
93
- export declare function escapeLike(str: string): string;
94
- /**
95
- * source 校验严重级别
96
- *
97
- * - 'block':安全边界违规,调用方必须拒绝写入(throw)
98
- * - 'warn':调用方 bug 或疑似 typo,应 warn 但允许写入
99
- * - undefined:无异常
100
- */
101
- export type SourceValidationSeverity = 'block' | 'warn';
102
- /**
103
- * 校验 source 字段是否为已知标签
104
- *
105
- * 返回校验结果,包含严重级别与警告信息(如有)。
106
- *
107
- * 分级策略:
108
- * - 路径遍历(`..`)与 null 字节 → severity='block'(安全边界,必须拒绝)
109
- * - 空字符串、非字符串、首尾空格 → severity='block'(调用方 bug,必须拒绝)
110
- * - 与已知标签 Levenshtein 距离 ≤ 2 的疑似 typo → severity='warn'(保持开放性)
111
- * - 其他自定义 source → valid: true(完全允许)
112
- *
113
- * @param source - 待校验的 source 字符串
114
- * @returns 校验结果
115
- */
116
- export declare function validateSource(source: string): {
117
- valid: boolean;
118
- severity?: SourceValidationSeverity;
119
- warning?: string;
120
- };
121
74
  /**
122
75
  * 记忆关系基元 — 独立于 Memory 7 字段的侧车数据结构
123
76
  *
@@ -192,4 +145,48 @@ export declare const RELATION_TYPES: {
192
145
  /** 泛相关(双向对称) */
193
146
  readonly RELATED: "related";
194
147
  };
148
+ /**
149
+ * 关系路径节点 — 路径追溯查询结果
150
+ *
151
+ * 独立于 Memory 和 MemoryRelation,仅作为查询结果投影类型存在。
152
+ * 不侵入 Memory 7 字段基元(ADR-004),不扩展 MemoryRelation 侧车结构(ADR-014)。
153
+ *
154
+ * 用于宿主 UI 展示记忆的演化脉络(如 insight-a → refines → insight-b → follows → insight-c)
155
+ */
156
+ export interface RelationPath {
157
+ /** 当前节点记忆 ID */
158
+ memoryId: string;
159
+ /** 当前节点记忆名称(用于 UI 展示) */
160
+ memoryName: string;
161
+ /** 当前节点记忆来源标签(用于 UI 颜色区分) */
162
+ memorySource: string;
163
+ /** 与上一节点的关系类型(起点节点此字段为 null) */
164
+ relationType: string | null;
165
+ /** 与上一节点的关系权重(起点节点此字段为 null) */
166
+ relationWeight: number | null;
167
+ /** 距离起点的步数(起点为 0,每跳一步 +1) */
168
+ depth: number;
169
+ }
170
+ /**
171
+ * 关系邻居 — 直接关联的记忆查询结果
172
+ *
173
+ * 独立于 Memory 和 MemoryRelation,仅作为查询结果投影类型存在。
174
+ * 用于宿主 UI 展示某记忆的直接关联记忆(如冲突记忆、支持记忆、后续记忆等)
175
+ */
176
+ export interface RelationNeighbor {
177
+ /** 邻居记忆 ID */
178
+ memoryId: string;
179
+ /** 邻居记忆名称 */
180
+ memoryName: string;
181
+ /** 邻居记忆来源标签 */
182
+ memorySource: string;
183
+ /** 邻居记忆权重(0-1,用于 UI 节点大小) */
184
+ memoryScore: number;
185
+ /** 关系类型 */
186
+ relationType: string;
187
+ /** 关系权重 */
188
+ relationWeight: number;
189
+ /** 关系方向:'incoming'(邻居是 sourceId)或 'outgoing'(邻居是 targetId) */
190
+ direction: 'incoming' | 'outgoing';
191
+ }
195
192
  //# sourceMappingURL=types.d.ts.map
@@ -1 +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;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;IACvB,8DAA8D;;IAE9D,wBAAwB;;IAExB,sBAAsB;;IAEtB,qBAAqB;;IAErB,qBAAqB;;IAErB,sBAAsB;;IAEtB,sBAAsB;;IAEtB,8DAA8D;;;;;;;;;;;;;;;;;;;;EAE9D,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"}
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;;;;;;GAMG;AACH,eAAO,MAAM,YAAY;IACvB,8DAA8D;;IAE9D,wBAAwB;;IAExB,sBAAsB;;IAEtB,qBAAqB;;IAErB,qBAAqB;;IAErB,sBAAsB;;IAEtB,sBAAsB;;IAEtB,8DAA8D;;;;;;;;;;;;;;;;;;;;EAE9D,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;AASX;;;;;;;;;;;;;;;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;AAIX;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gCAAgC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC;CACpC"}