@zooique/memora 2.0.0 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/README.en.md +272 -0
  2. package/README.md +150 -38
  3. package/dist/agent/agent.d.ts +233 -58
  4. package/dist/agent/agent.d.ts.map +1 -1
  5. package/dist/agent/agent.js +651 -359
  6. package/dist/agent/agent.js.map +1 -1
  7. package/dist/agent/assembler.d.ts +29 -13
  8. package/dist/agent/assembler.d.ts.map +1 -1
  9. package/dist/agent/assembler.js +79 -44
  10. package/dist/agent/assembler.js.map +1 -1
  11. package/dist/agent/builtinToolHandlers.d.ts +26 -1
  12. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  13. package/dist/agent/builtinToolHandlers.js +73 -1
  14. package/dist/agent/builtinToolHandlers.js.map +1 -1
  15. package/dist/agent/constants.d.ts +4 -0
  16. package/dist/agent/constants.d.ts.map +1 -1
  17. package/dist/agent/constants.js +4 -0
  18. package/dist/agent/constants.js.map +1 -1
  19. package/dist/agent/contextManager.d.ts +8 -0
  20. package/dist/agent/contextManager.d.ts.map +1 -1
  21. package/dist/agent/contextManager.js +7 -2
  22. package/dist/agent/contextManager.js.map +1 -1
  23. package/dist/agent/guardrail.d.ts +4 -2
  24. package/dist/agent/guardrail.d.ts.map +1 -1
  25. package/dist/agent/guardrail.js +13 -5
  26. package/dist/agent/guardrail.js.map +1 -1
  27. package/dist/agent/loop.d.ts +58 -14
  28. package/dist/agent/loop.d.ts.map +1 -1
  29. package/dist/agent/loop.js +184 -131
  30. package/dist/agent/loop.js.map +1 -1
  31. package/dist/agent/managers/archiveCoordinator.d.ts +126 -22
  32. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  33. package/dist/agent/managers/archiveCoordinator.js +239 -44
  34. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  35. package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -1
  36. package/dist/agent/managers/autoConfigRefiner.js +4 -8
  37. package/dist/agent/managers/autoConfigRefiner.js.map +1 -1
  38. package/dist/agent/managers/configManager.d.ts +87 -3
  39. package/dist/agent/managers/configManager.d.ts.map +1 -1
  40. package/dist/agent/managers/configManager.js +139 -2
  41. package/dist/agent/managers/configManager.js.map +1 -1
  42. package/dist/agent/managers/dedupManager.d.ts +169 -0
  43. package/dist/agent/managers/dedupManager.d.ts.map +1 -0
  44. package/dist/agent/managers/dedupManager.js +336 -0
  45. package/dist/agent/managers/dedupManager.js.map +1 -0
  46. package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
  47. package/dist/agent/managers/insightExtractor.js +11 -11
  48. package/dist/agent/managers/insightExtractor.js.map +1 -1
  49. package/dist/agent/managers/llmJudgeHelper.d.ts +38 -0
  50. package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -0
  51. package/dist/agent/managers/llmJudgeHelper.js +49 -0
  52. package/dist/agent/managers/llmJudgeHelper.js.map +1 -0
  53. package/dist/agent/managers/memoryAdvisor.d.ts +3 -3
  54. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
  55. package/dist/agent/managers/memoryAdvisor.js +53 -67
  56. package/dist/agent/managers/memoryAdvisor.js.map +1 -1
  57. package/dist/agent/managers/memoryDecayScheduler.d.ts +46 -5
  58. package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
  59. package/dist/agent/managers/memoryDecayScheduler.js +127 -63
  60. package/dist/agent/managers/memoryDecayScheduler.js.map +1 -1
  61. package/dist/agent/managers/memoryGovernance.d.ts +56 -0
  62. package/dist/agent/managers/memoryGovernance.d.ts.map +1 -0
  63. package/dist/agent/managers/memoryGovernance.js +63 -0
  64. package/dist/agent/managers/memoryGovernance.js.map +1 -0
  65. package/dist/agent/managers/memoryInspector.d.ts +32 -157
  66. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  67. package/dist/agent/managers/memoryInspector.js +70 -363
  68. package/dist/agent/managers/memoryInspector.js.map +1 -1
  69. package/dist/agent/managers/relationBuilder.js +2 -2
  70. package/dist/agent/managers/relationBuilder.js.map +1 -1
  71. package/dist/agent/managers/sessionArchiver.d.ts +6 -1
  72. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  73. package/dist/agent/managers/sessionArchiver.js +19 -22
  74. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  75. package/dist/agent/managers/streamAccumulator.d.ts +45 -0
  76. package/dist/agent/managers/streamAccumulator.d.ts.map +1 -0
  77. package/dist/agent/managers/streamAccumulator.js +40 -0
  78. package/dist/agent/managers/streamAccumulator.js.map +1 -0
  79. package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
  80. package/dist/agent/managers/textPolishManager.js +4 -7
  81. package/dist/agent/managers/textPolishManager.js.map +1 -1
  82. package/dist/agent/managers/workProjection.d.ts +16 -1
  83. package/dist/agent/managers/workProjection.d.ts.map +1 -1
  84. package/dist/agent/managers/workProjection.js +48 -24
  85. package/dist/agent/managers/workProjection.js.map +1 -1
  86. package/dist/agent/toolExecutor.d.ts +22 -2
  87. package/dist/agent/toolExecutor.d.ts.map +1 -1
  88. package/dist/agent/toolExecutor.js +28 -3
  89. package/dist/agent/toolExecutor.js.map +1 -1
  90. package/dist/agent/types.d.ts +10 -1
  91. package/dist/agent/types.d.ts.map +1 -1
  92. package/dist/agent/userFactExtractor.d.ts.map +1 -1
  93. package/dist/agent/userFactExtractor.js +7 -0
  94. package/dist/agent/userFactExtractor.js.map +1 -1
  95. package/dist/config/loader.d.ts +124 -236
  96. package/dist/config/loader.d.ts.map +1 -1
  97. package/dist/config/loader.js +273 -117
  98. package/dist/config/loader.js.map +1 -1
  99. package/dist/index.d.ts +7 -2
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +9 -0
  102. package/dist/index.js.map +1 -1
  103. package/dist/llm/embedding.d.ts +13 -1
  104. package/dist/llm/embedding.d.ts.map +1 -1
  105. package/dist/llm/embedding.js.map +1 -1
  106. package/dist/llm/factory.d.ts +19 -5
  107. package/dist/llm/factory.d.ts.map +1 -1
  108. package/dist/llm/factory.js +19 -37
  109. package/dist/llm/factory.js.map +1 -1
  110. package/dist/llm/openaiCompatible.d.ts.map +1 -1
  111. package/dist/llm/openaiCompatible.js +2 -9
  112. package/dist/llm/openaiCompatible.js.map +1 -1
  113. package/dist/logging/logger.d.ts +3 -1
  114. package/dist/logging/logger.d.ts.map +1 -1
  115. package/dist/logging/logger.js +47 -50
  116. package/dist/logging/logger.js.map +1 -1
  117. package/dist/memory/governance.d.ts +50 -0
  118. package/dist/memory/governance.d.ts.map +1 -0
  119. package/dist/memory/governance.js +70 -0
  120. package/dist/memory/governance.js.map +1 -0
  121. package/dist/memory/hybridMerge.d.ts +0 -4
  122. package/dist/memory/hybridMerge.d.ts.map +1 -1
  123. package/dist/memory/hybridMerge.js +19 -4
  124. package/dist/memory/hybridMerge.js.map +1 -1
  125. package/dist/memory/inMemoryRelationStore.d.ts +7 -0
  126. package/dist/memory/inMemoryRelationStore.d.ts.map +1 -1
  127. package/dist/memory/inMemoryRelationStore.js +15 -0
  128. package/dist/memory/inMemoryRelationStore.js.map +1 -1
  129. package/dist/memory/inMemoryStorage.d.ts +36 -1
  130. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  131. package/dist/memory/inMemoryStorage.js +66 -16
  132. package/dist/memory/inMemoryStorage.js.map +1 -1
  133. package/dist/memory/loader.d.ts +2 -0
  134. package/dist/memory/loader.d.ts.map +1 -1
  135. package/dist/memory/loader.js +8 -1
  136. package/dist/memory/loader.js.map +1 -1
  137. package/dist/memory/lockManager.d.ts +7 -2
  138. package/dist/memory/lockManager.d.ts.map +1 -1
  139. package/dist/memory/lockManager.js +31 -5
  140. package/dist/memory/lockManager.js.map +1 -1
  141. package/dist/memory/projectManager.d.ts +2 -1
  142. package/dist/memory/projectManager.d.ts.map +1 -1
  143. package/dist/memory/projectManager.js +21 -3
  144. package/dist/memory/projectManager.js.map +1 -1
  145. package/dist/memory/projectRegistry.d.ts +34 -1
  146. package/dist/memory/projectRegistry.d.ts.map +1 -1
  147. package/dist/memory/projectRegistry.js +99 -22
  148. package/dist/memory/projectRegistry.js.map +1 -1
  149. package/dist/memory/recall.d.ts +16 -0
  150. package/dist/memory/recall.d.ts.map +1 -1
  151. package/dist/memory/recall.js +33 -18
  152. package/dist/memory/recall.js.map +1 -1
  153. package/dist/memory/relationStore.d.ts +20 -3
  154. package/dist/memory/relationStore.d.ts.map +1 -1
  155. package/dist/memory/sourceValidation.d.ts +11 -0
  156. package/dist/memory/sourceValidation.d.ts.map +1 -1
  157. package/dist/memory/sourceValidation.js +24 -2
  158. package/dist/memory/sourceValidation.js.map +1 -1
  159. package/dist/memory/storageInterface.d.ts +26 -1
  160. package/dist/memory/storageInterface.d.ts.map +1 -1
  161. package/dist/memory/store.d.ts +22 -1
  162. package/dist/memory/store.d.ts.map +1 -1
  163. package/dist/memory/store.js +58 -20
  164. package/dist/memory/store.js.map +1 -1
  165. package/dist/memory/types.d.ts +44 -31
  166. package/dist/memory/types.d.ts.map +1 -1
  167. package/dist/memory/types.js +63 -24
  168. package/dist/memory/types.js.map +1 -1
  169. package/dist/memory/userProfile.d.ts +32 -8
  170. package/dist/memory/userProfile.d.ts.map +1 -1
  171. package/dist/memory/userProfile.js +105 -44
  172. package/dist/memory/userProfile.js.map +1 -1
  173. package/dist/memory/vectorStore.d.ts +16 -22
  174. package/dist/memory/vectorStore.d.ts.map +1 -1
  175. package/dist/memory/vectorStore.js +49 -22
  176. package/dist/memory/vectorStore.js.map +1 -1
  177. package/dist/persona/personaManager.d.ts +36 -87
  178. package/dist/persona/personaManager.d.ts.map +1 -1
  179. package/dist/persona/personaManager.js +131 -230
  180. package/dist/persona/personaManager.js.map +1 -1
  181. package/dist/skill/skillManager.d.ts +11 -57
  182. package/dist/skill/skillManager.d.ts.map +1 -1
  183. package/dist/skill/skillManager.js +46 -142
  184. package/dist/skill/skillManager.js.map +1 -1
  185. package/dist/skill/types.d.ts +2 -3
  186. package/dist/skill/types.d.ts.map +1 -1
  187. package/dist/utils/configResourceManager.d.ts +111 -0
  188. package/dist/utils/configResourceManager.d.ts.map +1 -0
  189. package/dist/utils/configResourceManager.js +148 -0
  190. package/dist/utils/configResourceManager.js.map +1 -0
  191. package/dist/utils/errors.d.ts +17 -0
  192. package/dist/utils/errors.d.ts.map +1 -1
  193. package/dist/utils/errors.js +19 -0
  194. package/dist/utils/errors.js.map +1 -1
  195. package/dist/utils/eventEmitter.d.ts +83 -6
  196. package/dist/utils/eventEmitter.d.ts.map +1 -1
  197. package/dist/utils/eventEmitter.js +23 -0
  198. package/dist/utils/eventEmitter.js.map +1 -1
  199. package/dist/utils/frontmatter.d.ts.map +1 -1
  200. package/dist/utils/frontmatter.js +4 -2
  201. package/dist/utils/frontmatter.js.map +1 -1
  202. package/dist/utils/math.d.ts +11 -0
  203. package/dist/utils/math.d.ts.map +1 -1
  204. package/dist/utils/math.js +17 -0
  205. package/dist/utils/math.js.map +1 -1
  206. package/dist/utils/segmenter.d.ts +0 -10
  207. package/dist/utils/segmenter.d.ts.map +1 -1
  208. package/dist/utils/segmenter.js +10 -1
  209. package/dist/utils/segmenter.js.map +1 -1
  210. package/docs/memora-api-reference.md +1235 -0
  211. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +808 -0
  212. package/package.json +39 -22
@@ -0,0 +1,148 @@
1
+ /**
2
+ * 配置资源管理器抽象基类 — 消除 SkillManager 与 PersonaManager 的重复结构
3
+ *
4
+ * 共同模式(DRY):
5
+ * - 扫描 configDir/<subdir>/ 中的 .md 文件
6
+ * - 解析 frontmatter keywords
7
+ * - scoreByKeywords 关键词匹配
8
+ * - load → reload → deleteItem 生命周期
9
+ *
10
+ * 分叉点(子类差异化):
11
+ * - createEntry() → 条目构造(Persona 需要 traits 解析,Skill 需要 layer/trigger)
12
+ * - buildSystemPrompt() → 系统提示格式
13
+ * - PersonaManager 额外状态:activePersona / mode / 切换缓冲 → 保留在子类
14
+ * - SkillManager 额外能力:trigger 正则匹配 / register() → 保留在子类
15
+ *
16
+ * 抽象收益验证(§2.2 技术债务的阈值判断):
17
+ * - 2 个使用场景,领域规则大概率会变 → 抽象收益 > 复制成本
18
+ * - 扫描 + 匹配 + 生命周期共 ~60 行重复 → 消除后的维护成本显著降低
19
+ *
20
+ * 复杂度控制(§1.3):
21
+ * - 泛型参数 T 由子类具体化,基类不假设 T 的具体形状
22
+ * - 基类只提供公共基础设施,不引入新概念
23
+ */
24
+ import { scoreByKeywords } from '../utils/segmenter.js';
25
+ import { logger } from '../logging/logger.js';
26
+ import { resolveSubdir, scanMarkdownDir } from '../utils/scanner.js';
27
+ /**
28
+ * 配置资源管理器 — 抽象基类
29
+ *
30
+ * @typeParam T 子类资源类型(如 Persona / SkillEntry)
31
+ * @typeParam TOptions load() 的可选参数类型
32
+ */
33
+ export class ConfigResourceManager {
34
+ configDir;
35
+ subdir;
36
+ /** 资源列表缓存 */
37
+ items = [];
38
+ /**
39
+ * @param configDir 配置目录(资源文件在 <configDir>/<subdir>/ 下)
40
+ * @param subdir 资源子目录名(如 'skills'、'personas')
41
+ */
42
+ constructor(configDir, subdir) {
43
+ this.configDir = configDir;
44
+ this.subdir = subdir;
45
+ }
46
+ // ── 公共 API ──────────────────────────────────────────
47
+ /** 获取资源列表 */
48
+ get list() {
49
+ return this.items;
50
+ }
51
+ // ── 受保护的基础设施(子类调用) ─────────────────────────
52
+ /**
53
+ * 加载资源到缓存(子类在各自的 load() 中调用)
54
+ *
55
+ * @param options 子类透传参数
56
+ * @returns 加载的资源数量
57
+ */
58
+ async loadItems(options) {
59
+ this.items = await this.scanAndBuild();
60
+ this.onAfterLoad(this.items, options);
61
+ logger.info({ count: this.items.length, names: this.items.map((i) => i.name), subdir: this.subdir }, `${this.subdir} 资源加载完成`);
62
+ return this.items.length;
63
+ }
64
+ /**
65
+ * 重载资源:重新扫描目录 → 更新缓存
66
+ *
67
+ * @returns 重载后的资源数量
68
+ */
69
+ async reload() {
70
+ const oldCount = this.items.length;
71
+ this.items = await this.scanAndBuild();
72
+ this.onAfterReload(this.items);
73
+ logger.info({ oldCount, newCount: this.items.length, subdir: this.subdir }, `${this.subdir} 资源已重载`);
74
+ return this.items.length;
75
+ }
76
+ /**
77
+ * 删除资源(从内存缓存中移除)
78
+ *
79
+ * @param name 资源名
80
+ * @returns true 删除成功;false 资源不存在
81
+ */
82
+ deleteItem(name) {
83
+ const idx = this.items.findIndex((i) => i.name === name);
84
+ if (idx < 0) {
85
+ logger.warn({ name, subdir: this.subdir }, '内存缓存中未找到资源,跳过删除');
86
+ return false;
87
+ }
88
+ this.items.splice(idx, 1);
89
+ logger.info({ name, remaining: this.items.length, subdir: this.subdir }, '资源已从内存缓存删除');
90
+ return true;
91
+ }
92
+ // ── 关键词匹配(共享实现) ──────────────────────────────
93
+ /**
94
+ * 关键词匹配:遍历资源列表,返回得分最高的资源
95
+ *
96
+ * 子类可覆写此方法以添加额外匹配逻辑(如 trigger 正则匹配)。
97
+ *
98
+ * @param userInput 用户输入文本
99
+ * @param threshold 最低激活阈值(低于此值的匹配忽略)
100
+ * @returns 匹配结果(资源 + 得分),无匹配返回 null
101
+ */
102
+ findBestKeywordMatch(userInput, threshold) {
103
+ const matches = [];
104
+ for (const item of this.items) {
105
+ if (item.keywords.length === 0)
106
+ continue;
107
+ const score = scoreByKeywords(userInput, item.keywords);
108
+ if (score >= threshold) {
109
+ matches.push({ item, score });
110
+ }
111
+ }
112
+ if (matches.length === 0)
113
+ return null;
114
+ // 主排序:得分降序;次排序:name 字母序(保证同分时确定性)
115
+ matches.sort((a, b) => b.score - a.score || a.item.name.localeCompare(b.item.name));
116
+ return matches[0] ?? null;
117
+ }
118
+ // ── 生命周期钩子(子类可选覆写) ──────────────────────────
119
+ /**
120
+ * load() 完成后的回调 — 子类可在此做激活选择等逻辑
121
+ */
122
+ onAfterLoad(_items, _options) {
123
+ // 默认空实现
124
+ }
125
+ /**
126
+ * reload() 完成后的回调 — 子类可在此保持当前激活状态
127
+ */
128
+ onAfterReload(_items) {
129
+ // 默认空实现
130
+ }
131
+ // ── 私有方法 ──────────────────────────────────────────
132
+ /**
133
+ * 扫描目录 + 构建条目列表
134
+ */
135
+ async scanAndBuild() {
136
+ const map = new Map();
137
+ const dir = resolveSubdir(this.configDir, this.subdir);
138
+ if (!dir)
139
+ return [];
140
+ const entries = await scanMarkdownDir(dir);
141
+ for (const entry of entries) {
142
+ const item = this.createEntry(entry);
143
+ map.set(entry.name, item);
144
+ }
145
+ return Array.from(map.values());
146
+ }
147
+ }
148
+ //# sourceMappingURL=configResourceManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configResourceManager.js","sourceRoot":"","sources":["../../src/utils/configResourceManager.ts"],"names":[],"mappings":"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"}
@@ -104,4 +104,21 @@ export declare function toolError(title: string, detail: string | undefined, sug
104
104
  * 工厂:安全错误(路径越界、黑名单命中、权限不足等)
105
105
  */
106
106
  export declare function securityError(title: string, detail: string | undefined, suggestions: string[], cause?: Error): MemoraError;
107
+ /**
108
+ * 判断错误是否为 AbortError(用户主动取消或超时中断)
109
+ *
110
+ * AbortError 可能源于:
111
+ * - AbortController.abort() 触发的 fetch 取消(DOMException with name='AbortError')
112
+ * - 超时机制(setTimeout + abort)触发的 AbortError
113
+ * - 用户主动取消(停止生成按钮)
114
+ *
115
+ * 统一基于 `err.name === 'AbortError'` 判定,兼容:
116
+ * - 原生 DOMException(modern Node 18+ / 浏览器中 DOMException 是 Error 子类)
117
+ * - 普通 Error 子类(name 字段被设为 'AbortError')
118
+ * - toError() 规范化后的 Error
119
+ *
120
+ * @param err 未知类型的错误对象
121
+ * @returns 是否为 AbortError
122
+ */
123
+ export declare function isAbortError(err: unknown): boolean;
107
124
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,KAAK,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAEpF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;IACxB,qBAAqB;;IAErB,+BAA+B;;IAE/B,iBAAiB;;IAEjB,iCAAiC;;IAEjC,mBAAmB;;IAEnB,+BAA+B;;IAE/B,yBAAyB;;IAEzB,qBAAqB;;IAErB,iBAAiB;;CAET,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAYpF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAEtE;AAGD,UAAU,oBAAoB;IAC5B,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,qBAAqB;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;gBAEtB,IAAI,EAAE,oBAAoB;IAWtC;;OAEG;IACH,MAAM,IAAI,MAAM;CAYjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAMzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,EACb,SAAS,CAAC,EAAE,kBAAkB,GAC7B,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,KAAK,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAEpF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;IACxB,qBAAqB;;IAErB,+BAA+B;;IAE/B,iBAAiB;;IAEjB,iCAAiC;;IAEjC,mBAAmB;;IAEnB,+BAA+B;;IAE/B,yBAAyB;;IAEzB,qBAAqB;;IAErB,iBAAiB;;CAET,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAYpF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAEtE;AAGD,UAAU,oBAAoB;IAC5B,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,qBAAqB;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;gBAEtB,IAAI,EAAE,oBAAoB;IAWtC;;OAEG;IACH,MAAM,IAAI,MAAM;CAYjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAMzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,EACb,SAAS,CAAC,EAAE,kBAAkB,GAC7B,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAElD"}
@@ -134,5 +134,24 @@ export function toolError(title, detail, suggestions, cause, errorCode) {
134
134
  export function securityError(title, detail, suggestions, cause) {
135
135
  return new MemoraError({ title, detail, suggestions, category: 'security', cause });
136
136
  }
137
+ /**
138
+ * 判断错误是否为 AbortError(用户主动取消或超时中断)
139
+ *
140
+ * AbortError 可能源于:
141
+ * - AbortController.abort() 触发的 fetch 取消(DOMException with name='AbortError')
142
+ * - 超时机制(setTimeout + abort)触发的 AbortError
143
+ * - 用户主动取消(停止生成按钮)
144
+ *
145
+ * 统一基于 `err.name === 'AbortError'` 判定,兼容:
146
+ * - 原生 DOMException(modern Node 18+ / 浏览器中 DOMException 是 Error 子类)
147
+ * - 普通 Error 子类(name 字段被设为 'AbortError')
148
+ * - toError() 规范化后的 Error
149
+ *
150
+ * @param err 未知类型的错误对象
151
+ * @returns 是否为 AbortError
152
+ */
153
+ export function isAbortError(err) {
154
+ return err instanceof Error && err.name === 'AbortError';
155
+ }
137
156
  // toError 实现位于 ./toError.ts(纯逻辑,零依赖),此处 re-export 保持向后兼容
138
157
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,30 @@
1
- /** Agent 事件映射表(事件名 → 事件载荷类型) */
2
- export interface AgentEventMap {
1
+ /** Agent 事件名常量(运行时真理源,与下方 AgentEventMap 键集一致) */
2
+ export declare const AGENT_EVENTS: {
3
+ readonly memoryAdded: "memoryAdded";
4
+ readonly personaSwitched: "personaSwitched";
5
+ readonly decayCompleted: "decayCompleted";
6
+ readonly memoryRecalled: "memoryRecalled";
7
+ readonly sessionForked: "sessionForked";
8
+ readonly insightExtracted: "insightExtracted";
9
+ readonly conflictDetected: "conflictDetected";
10
+ readonly projectSwitched: "projectSwitched";
11
+ readonly skillMatched: "skillMatched";
12
+ readonly archiveFailed: "archiveFailed";
13
+ readonly contextTruncated: "contextTruncated";
14
+ readonly configReloaded: "configReloaded";
15
+ readonly guardrailError: "guardrailError";
16
+ readonly archiveModeChanged: "archiveModeChanged";
17
+ readonly personaSwitchLocked: "personaSwitchLocked";
18
+ readonly workProjectionGenerated: "workProjectionGenerated";
19
+ readonly boostPersistFailed: "boostPersistFailed";
20
+ readonly dedupCompleted: "dedupCompleted";
21
+ };
22
+ /** 事件名联合类型(由 AGENT_EVENTS 推导,单一真理源,新增事件只需在此对象加一项) */
23
+ export type AgentEventName = keyof typeof AGENT_EVENTS;
24
+ /** 运行时校验用 Set(由 AGENT_EVENTS 派生) */
25
+ export declare const AGENT_EVENT_SET: ReadonlySet<string>;
26
+ /** Agent 事件映射表(事件名 → 事件载荷类型),键集受 AgentEventName 约束 */
27
+ export interface AgentEventMap extends Record<AgentEventName, unknown> {
3
28
  /** 记忆被写入存储(insight 提取、rule 注入、skill 注入等) */
4
29
  memoryAdded: {
5
30
  id: string;
@@ -51,14 +76,66 @@ export interface AgentEventMap {
51
76
  };
52
77
  /** 归档操作失败(fire-and-forget catch 分支发射,宿主可通知用户) */
53
78
  archiveFailed: {
54
- /** 失败阶段:profile(用户画像)/ insight(洞察提取) */
55
- stage: 'profile' | 'insight';
79
+ /** 失败阶段:profile(用户画像)/ insight(洞察提取)/ content(会话内容归档) */
80
+ stage: 'profile' | 'insight' | 'content';
56
81
  /** 失败原因摘要(error.message,截断 200 字符避免 payload 过大) */
57
82
  message: string;
58
83
  };
84
+ /** 上下文窗口截断(消息超出 token 上限被裁剪,宿主可通知用户消息被丢弃) */
85
+ contextTruncated: {
86
+ /** 被裁剪掉的消息数量 */
87
+ skippedCount: number;
88
+ /** 保留的消息数量 */
89
+ keptCount: number;
90
+ };
91
+ /** 配置热重载完成(含对话期间暂存后补执行的 reload) */
92
+ configReloaded: {
93
+ /** 重载来源(persona/rule/skill/guardrail) */
94
+ source: string;
95
+ };
96
+ /** Guardrail 规则正则编译失败(安全放行但应通知用户规则未生效) */
97
+ guardrailError: {
98
+ /** 规则原文(截断 100 字符) */
99
+ rule: string;
100
+ /** 编译失败原因 */
101
+ message: string;
102
+ };
103
+ /** 归档模式切换 */
104
+ archiveModeChanged: {
105
+ /** 切换前模式 */
106
+ from: string;
107
+ /** 切换后模式 */
108
+ to: string;
109
+ };
110
+ /** 角色切换锁定状态变化(防抖期间用户尝试切换被拒绝时通知) */
111
+ personaSwitchLocked: {
112
+ /** 锁定原因 */
113
+ reason: string;
114
+ /** 锁定时长(秒) */
115
+ lockedSeconds: number;
116
+ };
117
+ /** 作品投影生成/更新(宿主可据此刷新作品面板) */
118
+ workProjectionGenerated: {
119
+ /** 源文件路径 */
120
+ sourcePath: string;
121
+ /** 投影摘要 */
122
+ summary: string;
123
+ };
124
+ /** boost score 持久化失败(宿主可通知用户记忆权重可能丢失) */
125
+ boostPersistFailed: {
126
+ /** 记忆 ID */
127
+ memoryId: string;
128
+ /** 失败原因 */
129
+ message: string;
130
+ };
131
+ /** 语义去重完成(宿主可据此刷新记忆面板) */
132
+ dedupCompleted: {
133
+ /** 被降级的记忆数 */
134
+ deduplicatedCount: number;
135
+ /** 被降级的记忆 ID 列表 */
136
+ demotedIds: string[];
137
+ };
59
138
  }
60
- /** 事件名联合类型 */
61
- export type AgentEventName = keyof AgentEventMap;
62
139
  /** 事件处理器类型 */
63
140
  export type AgentEventHandler<T> = (event: T) => void;
64
141
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"eventEmitter.d.ts","sourceRoot":"","sources":["../../src/utils/eventEmitter.ts"],"names":[],"mappings":"AAaA,gCAAgC;AAChC,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,uBAAuB;IACvB,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,aAAa;IACb,cAAc,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,kCAAkC;IAClC,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,YAAY;IACZ,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,YAAY;IACZ,gBAAgB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,4CAA4C;IAC5C,gBAAgB,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IACvG,+BAA+B;IAC/B,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,+BAA+B;IAC/B,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,iDAAiD;IACjD,aAAa,EAAE;QACb,wCAAwC;QACxC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;QAC7B,mDAAmD;QACnD,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,cAAc;AACd,MAAM,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC;AAEjD,cAAc;AACd,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAEtD;;;;;GAKG;AACH,qBAAa,iBAAiB,CAAC,QAAQ,SAAS,MAAM;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoD;IAE9E;;;;OAIG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAS5F;;;;OAIG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAI7F;;;;OAIG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EACpC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GACpC,IAAI;IAQP;;;;OAIG;IACH,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IAYvF;;OAEG;IACH,SAAS,CAAC,kBAAkB,IAAI,IAAI;CAGrC"}
1
+ {"version":3,"file":"eventEmitter.d.ts","sourceRoot":"","sources":["../../src/utils/eventEmitter.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,29 @@
10
10
  */
11
11
  import { getLogger } from '../utils/loggerHolder.js';
12
12
  import { toError } from '../utils/toError.js';
13
+ /** Agent 事件名常量(运行时真理源,与下方 AgentEventMap 键集一致) */
14
+ export const AGENT_EVENTS = {
15
+ memoryAdded: 'memoryAdded',
16
+ personaSwitched: 'personaSwitched',
17
+ decayCompleted: 'decayCompleted',
18
+ memoryRecalled: 'memoryRecalled',
19
+ sessionForked: 'sessionForked',
20
+ insightExtracted: 'insightExtracted',
21
+ conflictDetected: 'conflictDetected',
22
+ projectSwitched: 'projectSwitched',
23
+ skillMatched: 'skillMatched',
24
+ archiveFailed: 'archiveFailed',
25
+ contextTruncated: 'contextTruncated',
26
+ configReloaded: 'configReloaded',
27
+ guardrailError: 'guardrailError',
28
+ archiveModeChanged: 'archiveModeChanged',
29
+ personaSwitchLocked: 'personaSwitchLocked',
30
+ workProjectionGenerated: 'workProjectionGenerated',
31
+ boostPersistFailed: 'boostPersistFailed',
32
+ dedupCompleted: 'dedupCompleted',
33
+ };
34
+ /** 运行时校验用 Set(由 AGENT_EVENTS 派生) */
35
+ export const AGENT_EVENT_SET = new Set(Object.values(AGENT_EVENTS));
13
36
  /**
14
37
  * 类型安全的事件发射器
15
38
  *
@@ -1 +1 @@
1
- {"version":3,"file":"eventEmitter.js","sourceRoot":"","sources":["../../src/utils/eventEmitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAqC7C;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACX,SAAS,GAAG,IAAI,GAAG,EAAyC,CAAC;IAE9E;;;;OAIG;IACH,EAAE,CAAoC,KAAQ,EAAE,OAAqC;QACnF,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,OAAmC,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAoC,KAAQ,EAAE,OAAqC;QACpF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAmC,CAAC,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACH,IAAI,CACF,KAAQ,EACR,OAAqC;QAErC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAiB,EAAE,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAuC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAiC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACO,IAAI,CAAoC,KAAQ,EAAE,OAAoB;QAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACnC,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACO,kBAAkB;QAC1B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"eventEmitter.js","sourceRoot":"","sources":["../../src/utils/eventEmitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,iDAAiD;AACjD,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,WAAW,EAAE,aAAa;IAC1B,eAAe,EAAE,iBAAiB;IAClC,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,gBAAgB;IAChC,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,eAAe,EAAE,iBAAiB;IAClC,YAAY,EAAE,cAAc;IAC5B,aAAa,EAAE,eAAe;IAC9B,gBAAgB,EAAE,kBAAkB;IACpC,cAAc,EAAE,gBAAgB;IAChC,cAAc,EAAE,gBAAgB;IAChC,kBAAkB,EAAE,oBAAoB;IACxC,mBAAmB,EAAE,qBAAqB;IAC1C,uBAAuB,EAAE,yBAAyB;IAClD,kBAAkB,EAAE,oBAAoB;IACxC,cAAc,EAAE,gBAAgB;CACxB,CAAC;AAKX,oCAAoC;AACpC,MAAM,CAAC,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;AA0FzF;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACX,SAAS,GAAG,IAAI,GAAG,EAAyC,CAAC;IAE9E;;;;OAIG;IACH,EAAE,CAAoC,KAAQ,EAAE,OAAqC;QACnF,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,OAAmC,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAoC,KAAQ,EAAE,OAAqC;QACpF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAmC,CAAC,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACH,IAAI,CACF,KAAQ,EACR,OAAqC;QAErC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAiB,EAAE,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAuC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAiC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACO,IAAI,CAAoC,KAAQ,EAAE,OAAoB;QAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACnC,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACO,kBAAkB;QAC1B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAC7C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;CACd,CAsBA;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAKhF"}
1
+ {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAC7C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;CACd,CAwBA;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAKhF"}
@@ -18,8 +18,10 @@
18
18
  * @returns `{ frontmatter, body }`——frontmatter 为键值对对象,body 为 frontmatter 之后的内容
19
19
  */
20
20
  export function parseFrontmatter(raw) {
21
- const normalized = raw.replace(/\r\n/g, '\n');
22
- const match = normalized.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
21
+ const normalized = raw.replace(/\r\n/g, '\n').replace(/\n+$/, '');
22
+ // 结束 `---` 后允许可选换行(\n?),兼容"以 --- 收尾无尾随换行"的合法文件;
23
+ // 已先规整掉末尾换行(\n+$),避免"文件以 --- 结尾"被误判为不匹配而整体落入 body。
24
+ const match = normalized.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
23
25
  // 仅当结构不匹配时返回 fallback;空 frontmatter 块和空 body 块为合法输入
24
26
  if (!match) {
25
27
  return { frontmatter: {}, body: raw };
@@ -1 +1 @@
1
- {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAI1C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACpE,oDAAoD;IACpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACxC,CAAC;IAED,mEAAmE;IACnE,8CAA8C;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,GAAG,CAAC;YAAE,SAAS;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC;YAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmC;IACtE,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC;SAChD,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;SAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/utils/frontmatter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAI1C,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClE,gDAAgD;IAChD,mDAAmD;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACrE,oDAAoD;IACpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACxC,CAAC;IAED,mEAAmE;IACnE,8CAA8C;IAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,MAAM,WAAW,GAA2B,EAAE,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,GAAG,CAAC;YAAE,SAAS;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI,CAAC;YAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmC;IACtE,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC;SAChD,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;SAC7B,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -1,5 +1,16 @@
1
1
  /**
2
2
  * 数学工具函数
3
3
  */
4
+ /**
5
+ * 将数值四舍五入到指定小数位数
6
+ *
7
+ * 替代 `Math.round(x * 10^n) / 10^n` 惯用法,消除 4 处重复
8
+ * (ADR-017 枝叶层 2 次提取原则,3 次阈值已满足)。
9
+ *
10
+ * @param value - 待四舍五入的数值
11
+ * @param decimals - 保留的小数位数(0~20,默认 2)
12
+ * @returns 四舍五入后的数值;value 为 NaN/Infinity 时原样返回
13
+ */
14
+ export declare function roundTo(value: number, decimals?: number): number;
4
15
  export declare function cosineSimilarity(a: number[], b: number[]): number;
5
16
  //# sourceMappingURL=math.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAajE"}
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CAK3D;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAajE"}
@@ -1,6 +1,23 @@
1
1
  /**
2
2
  * 数学工具函数
3
3
  */
4
+ /**
5
+ * 将数值四舍五入到指定小数位数
6
+ *
7
+ * 替代 `Math.round(x * 10^n) / 10^n` 惯用法,消除 4 处重复
8
+ * (ADR-017 枝叶层 2 次提取原则,3 次阈值已满足)。
9
+ *
10
+ * @param value - 待四舍五入的数值
11
+ * @param decimals - 保留的小数位数(0~20,默认 2)
12
+ * @returns 四舍五入后的数值;value 为 NaN/Infinity 时原样返回
13
+ */
14
+ export function roundTo(value, decimals = 2) {
15
+ // NaN/Infinity 不参与运算,避免 Math.round 返回意外结果
16
+ if (!Number.isFinite(value))
17
+ return value;
18
+ const factor = 10 ** decimals;
19
+ return Math.round(value * factor) / factor;
20
+ }
4
21
  export function cosineSimilarity(a, b) {
5
22
  if (a.length !== b.length)
6
23
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,iDAAiD;QACjD,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,QAAQ,GAAG,CAAC;IACjD,0CAA0C;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,MAAM,GAAG,EAAE,IAAI,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,iDAAiD;QACjD,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC;AACnD,CAAC"}
@@ -1,13 +1,3 @@
1
- /**
2
- * 关键词匹配评分(Persona/Skill 共享逻辑)
3
- *
4
- * 匹配策略:先分词,再对每个关键词做子串搜索(tokens + 原文双保险)。
5
- * 大小写不敏感,中英文混合友好。
6
- *
7
- * @param userInput - 用户输入文本
8
- * @param keywordList - 待匹配的关键词数组
9
- * @returns 匹配得分 (0~1),0 表示无命中
10
- */
11
1
  export declare function scoreByKeywords(userInput: string, keywordList: string[]): number;
12
2
  /**
13
3
  * 单行分词(用于 LLM 输出的精确切分)
@@ -1 +1 @@
1
- {"version":3,"file":"segmenter.d.ts","sourceRoot":"","sources":["../../src/utils/segmenter.ts"],"names":[],"mappings":"AAyCA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAehF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAclD;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEnD;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,aAOpB,CAAC"}
1
+ {"version":3,"file":"segmenter.d.ts","sourceRoot":"","sources":["../../src/utils/segmenter.ts"],"names":[],"mappings":"AA2DA,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAgBhF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAclD;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEnD;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,aAOpB,CAAC"}
@@ -43,10 +43,18 @@ function tokenizeKeywords(input) {
43
43
  * 匹配策略:先分词,再对每个关键词做子串搜索(tokens + 原文双保险)。
44
44
  * 大小写不敏感,中英文混合友好。
45
45
  *
46
+ * 评分公式:hitCount / Math.min(keywordList.length, KEYWORD_SCORE_DENOMINATOR_MAX)
47
+ *
48
+ * 分母上限 KEYWORD_SCORE_DENOMINATOR_MAX = 3,避免关键词多的角色被惩罚:
49
+ * - 10 个 keywords 命中 2 个:原 2/10=0.2(被误判低置信度),现 2/3=0.67(高置信度)
50
+ * - 2 个 keywords 命中 2 个:原 2/2=1.0,现 2/2=1.0(不变)
51
+ *
46
52
  * @param userInput - 用户输入文本
47
53
  * @param keywordList - 待匹配的关键词数组
48
54
  * @returns 匹配得分 (0~1),0 表示无命中
49
55
  */
56
+ /** 评分分母上限:防止关键词多的角色被惩罚(命中 2 个即视为强匹配) */
57
+ const KEYWORD_SCORE_DENOMINATOR_MAX = 3;
50
58
  export function scoreByKeywords(userInput, keywordList) {
51
59
  if (keywordList.length === 0)
52
60
  return 0;
@@ -59,7 +67,8 @@ export function scoreByKeywords(userInput, keywordList) {
59
67
  hitCount++;
60
68
  }
61
69
  }
62
- return hitCount / keywordList.length;
70
+ // 分母取 min(关键词总数, 3):命中 2+ 个即高置信度,不受关键词总量影响
71
+ return hitCount / Math.min(keywordList.length, KEYWORD_SCORE_DENOMINATOR_MAX);
63
72
  }
64
73
  /**
65
74
  * 单行分词(用于 LLM 输出的精确切分)
@@ -1 +1 @@
1
- {"version":3,"file":"segmenter.js","sourceRoot":"","sources":["../../src/utils/segmenter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"segmenter.js","sourceRoot":"","sources":["../../src/utils/segmenter.ts"],"names":[],"mappings":"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"}