@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.
Files changed (239) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/dist/agent/agent.d.ts +343 -0
  4. package/dist/agent/agent.d.ts.map +1 -0
  5. package/dist/agent/agent.js +893 -0
  6. package/dist/agent/agent.js.map +1 -0
  7. package/dist/agent/assembler.d.ts +77 -0
  8. package/dist/agent/assembler.d.ts.map +1 -0
  9. package/dist/agent/assembler.js +115 -0
  10. package/dist/agent/assembler.js.map +1 -0
  11. package/dist/agent/builtinToolHandlers.d.ts +96 -0
  12. package/dist/agent/builtinToolHandlers.d.ts.map +1 -0
  13. package/dist/agent/builtinToolHandlers.js +388 -0
  14. package/dist/agent/builtinToolHandlers.js.map +1 -0
  15. package/dist/agent/builtinTools.d.ts +35 -0
  16. package/dist/agent/builtinTools.d.ts.map +1 -0
  17. package/dist/agent/builtinTools.js +75 -0
  18. package/dist/agent/builtinTools.js.map +1 -0
  19. package/dist/agent/constants.d.ts +67 -0
  20. package/dist/agent/constants.d.ts.map +1 -0
  21. package/dist/agent/constants.js +67 -0
  22. package/dist/agent/constants.js.map +1 -0
  23. package/dist/agent/contextManager.d.ts +130 -0
  24. package/dist/agent/contextManager.d.ts.map +1 -0
  25. package/dist/agent/contextManager.js +287 -0
  26. package/dist/agent/contextManager.js.map +1 -0
  27. package/dist/agent/loop.d.ts +288 -0
  28. package/dist/agent/loop.d.ts.map +1 -0
  29. package/dist/agent/loop.js +756 -0
  30. package/dist/agent/loop.js.map +1 -0
  31. package/dist/agent/managers/autoConfigRefiner.d.ts +39 -0
  32. package/dist/agent/managers/autoConfigRefiner.d.ts.map +1 -0
  33. package/dist/agent/managers/autoConfigRefiner.js +150 -0
  34. package/dist/agent/managers/autoConfigRefiner.js.map +1 -0
  35. package/dist/agent/managers/configManager.d.ts +114 -0
  36. package/dist/agent/managers/configManager.d.ts.map +1 -0
  37. package/dist/agent/managers/configManager.js +186 -0
  38. package/dist/agent/managers/configManager.js.map +1 -0
  39. package/dist/agent/managers/insightExtractor.d.ts +141 -0
  40. package/dist/agent/managers/insightExtractor.d.ts.map +1 -0
  41. package/dist/agent/managers/insightExtractor.js +420 -0
  42. package/dist/agent/managers/insightExtractor.js.map +1 -0
  43. package/dist/agent/managers/memoryAdvisor.d.ts +96 -0
  44. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -0
  45. package/dist/agent/managers/memoryAdvisor.js +198 -0
  46. package/dist/agent/managers/memoryAdvisor.js.map +1 -0
  47. package/dist/agent/managers/memoryInspector.d.ts +231 -0
  48. package/dist/agent/managers/memoryInspector.d.ts.map +1 -0
  49. package/dist/agent/managers/memoryInspector.js +327 -0
  50. package/dist/agent/managers/memoryInspector.js.map +1 -0
  51. package/dist/agent/managers/sessionManager.d.ts +89 -0
  52. package/dist/agent/managers/sessionManager.d.ts.map +1 -0
  53. package/dist/agent/managers/sessionManager.js +178 -0
  54. package/dist/agent/managers/sessionManager.js.map +1 -0
  55. package/dist/agent/managers/userFactExtractor.d.ts +25 -0
  56. package/dist/agent/managers/userFactExtractor.d.ts.map +1 -0
  57. package/dist/agent/managers/userFactExtractor.js +81 -0
  58. package/dist/agent/managers/userFactExtractor.js.map +1 -0
  59. package/dist/agent/managers/workProjection.d.ts +117 -0
  60. package/dist/agent/managers/workProjection.d.ts.map +1 -0
  61. package/dist/agent/managers/workProjection.js +290 -0
  62. package/dist/agent/managers/workProjection.js.map +1 -0
  63. package/dist/agent/messageHistory.d.ts +157 -0
  64. package/dist/agent/messageHistory.d.ts.map +1 -0
  65. package/dist/agent/messageHistory.js +288 -0
  66. package/dist/agent/messageHistory.js.map +1 -0
  67. package/dist/agent/toolExecutor.d.ts +137 -0
  68. package/dist/agent/toolExecutor.d.ts.map +1 -0
  69. package/dist/agent/toolExecutor.js +209 -0
  70. package/dist/agent/toolExecutor.js.map +1 -0
  71. package/dist/agent/tracer.d.ts +122 -0
  72. package/dist/agent/tracer.d.ts.map +1 -0
  73. package/dist/agent/tracer.js +64 -0
  74. package/dist/agent/tracer.js.map +1 -0
  75. package/dist/agent/types.d.ts +98 -0
  76. package/dist/agent/types.d.ts.map +1 -0
  77. package/dist/agent/types.js +19 -0
  78. package/dist/agent/types.js.map +1 -0
  79. package/dist/config/loader.d.ts +229 -0
  80. package/dist/config/loader.d.ts.map +1 -0
  81. package/dist/config/loader.js +194 -0
  82. package/dist/config/loader.js.map +1 -0
  83. package/dist/eval/evalTypes.d.ts +118 -0
  84. package/dist/eval/evalTypes.d.ts.map +1 -0
  85. package/dist/eval/evalTypes.js +102 -0
  86. package/dist/eval/evalTypes.js.map +1 -0
  87. package/dist/index.d.ts +61 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +44 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/llm/embedding.d.ts +62 -0
  92. package/dist/llm/embedding.d.ts.map +1 -0
  93. package/dist/llm/embedding.js +162 -0
  94. package/dist/llm/embedding.js.map +1 -0
  95. package/dist/llm/factory.d.ts +39 -0
  96. package/dist/llm/factory.d.ts.map +1 -0
  97. package/dist/llm/factory.js +108 -0
  98. package/dist/llm/factory.js.map +1 -0
  99. package/dist/llm/openaiCompatible.d.ts +63 -0
  100. package/dist/llm/openaiCompatible.d.ts.map +1 -0
  101. package/dist/llm/openaiCompatible.js +340 -0
  102. package/dist/llm/openaiCompatible.js.map +1 -0
  103. package/dist/llm/provider.d.ts +91 -0
  104. package/dist/llm/provider.d.ts.map +1 -0
  105. package/dist/llm/provider.js +14 -0
  106. package/dist/llm/provider.js.map +1 -0
  107. package/dist/llm/types.d.ts +25 -0
  108. package/dist/llm/types.d.ts.map +1 -0
  109. package/dist/llm/types.js +7 -0
  110. package/dist/llm/types.js.map +1 -0
  111. package/dist/logging/logger.d.ts +39 -0
  112. package/dist/logging/logger.d.ts.map +1 -0
  113. package/dist/logging/logger.js +279 -0
  114. package/dist/logging/logger.js.map +1 -0
  115. package/dist/logging/loggerInterface.d.ts +33 -0
  116. package/dist/logging/loggerInterface.d.ts.map +1 -0
  117. package/dist/logging/loggerInterface.js +2 -0
  118. package/dist/logging/loggerInterface.js.map +1 -0
  119. package/dist/memory/inMemoryRelationStore.d.ts +51 -0
  120. package/dist/memory/inMemoryRelationStore.d.ts.map +1 -0
  121. package/dist/memory/inMemoryRelationStore.js +65 -0
  122. package/dist/memory/inMemoryRelationStore.js.map +1 -0
  123. package/dist/memory/inMemoryStorage.d.ts +97 -0
  124. package/dist/memory/inMemoryStorage.d.ts.map +1 -0
  125. package/dist/memory/inMemoryStorage.js +177 -0
  126. package/dist/memory/inMemoryStorage.js.map +1 -0
  127. package/dist/memory/loader.d.ts +49 -0
  128. package/dist/memory/loader.d.ts.map +1 -0
  129. package/dist/memory/loader.js +93 -0
  130. package/dist/memory/loader.js.map +1 -0
  131. package/dist/memory/projectManager.d.ts +182 -0
  132. package/dist/memory/projectManager.d.ts.map +1 -0
  133. package/dist/memory/projectManager.js +441 -0
  134. package/dist/memory/projectManager.js.map +1 -0
  135. package/dist/memory/recall.d.ts +77 -0
  136. package/dist/memory/recall.d.ts.map +1 -0
  137. package/dist/memory/recall.js +147 -0
  138. package/dist/memory/recall.js.map +1 -0
  139. package/dist/memory/relationStore.d.ts +78 -0
  140. package/dist/memory/relationStore.d.ts.map +1 -0
  141. package/dist/memory/relationStore.js +2 -0
  142. package/dist/memory/relationStore.js.map +1 -0
  143. package/dist/memory/sessionStore.d.ts +84 -0
  144. package/dist/memory/sessionStore.d.ts.map +1 -0
  145. package/dist/memory/sessionStore.js +2 -0
  146. package/dist/memory/sessionStore.js.map +1 -0
  147. package/dist/memory/storageInterface.d.ts +107 -0
  148. package/dist/memory/storageInterface.d.ts.map +1 -0
  149. package/dist/memory/storageInterface.js +2 -0
  150. package/dist/memory/storageInterface.js.map +1 -0
  151. package/dist/memory/store.d.ts +50 -0
  152. package/dist/memory/store.d.ts.map +1 -0
  153. package/dist/memory/store.js +160 -0
  154. package/dist/memory/store.js.map +1 -0
  155. package/dist/memory/types.d.ts +189 -0
  156. package/dist/memory/types.d.ts.map +1 -0
  157. package/dist/memory/types.js +230 -0
  158. package/dist/memory/types.js.map +1 -0
  159. package/dist/memory/userProfile.d.ts +156 -0
  160. package/dist/memory/userProfile.d.ts.map +1 -0
  161. package/dist/memory/userProfile.js +315 -0
  162. package/dist/memory/userProfile.js.map +1 -0
  163. package/dist/memory/vectorStore.d.ts +75 -0
  164. package/dist/memory/vectorStore.d.ts.map +1 -0
  165. package/dist/memory/vectorStore.js +144 -0
  166. package/dist/memory/vectorStore.js.map +1 -0
  167. package/dist/persona/personaManager.d.ts +121 -0
  168. package/dist/persona/personaManager.d.ts.map +1 -0
  169. package/dist/persona/personaManager.js +349 -0
  170. package/dist/persona/personaManager.js.map +1 -0
  171. package/dist/persona/types.d.ts +32 -0
  172. package/dist/persona/types.d.ts.map +1 -0
  173. package/dist/persona/types.js +5 -0
  174. package/dist/persona/types.js.map +1 -0
  175. package/dist/security/pathGuard.d.ts +121 -0
  176. package/dist/security/pathGuard.d.ts.map +1 -0
  177. package/dist/security/pathGuard.js +276 -0
  178. package/dist/security/pathGuard.js.map +1 -0
  179. package/dist/skill/skillManager.d.ts +82 -0
  180. package/dist/skill/skillManager.d.ts.map +1 -0
  181. package/dist/skill/skillManager.js +198 -0
  182. package/dist/skill/skillManager.js.map +1 -0
  183. package/dist/skill/types.d.ts +28 -0
  184. package/dist/skill/types.d.ts.map +1 -0
  185. package/dist/skill/types.js +5 -0
  186. package/dist/skill/types.js.map +1 -0
  187. package/dist/utils/errors.d.ts +86 -0
  188. package/dist/utils/errors.d.ts.map +1 -0
  189. package/dist/utils/errors.js +143 -0
  190. package/dist/utils/errors.js.map +1 -0
  191. package/dist/utils/eventEmitter.d.ts +87 -0
  192. package/dist/utils/eventEmitter.d.ts.map +1 -0
  193. package/dist/utils/eventEmitter.js +79 -0
  194. package/dist/utils/eventEmitter.js.map +1 -0
  195. package/dist/utils/frontmatter.d.ts +24 -0
  196. package/dist/utils/frontmatter.d.ts.map +1 -0
  197. package/dist/utils/frontmatter.js +44 -0
  198. package/dist/utils/frontmatter.js.map +1 -0
  199. package/dist/utils/json.d.ts +20 -0
  200. package/dist/utils/json.d.ts.map +1 -0
  201. package/dist/utils/json.js +65 -0
  202. package/dist/utils/json.js.map +1 -0
  203. package/dist/utils/loggerHolder.d.ts +37 -0
  204. package/dist/utils/loggerHolder.d.ts.map +1 -0
  205. package/dist/utils/loggerHolder.js +49 -0
  206. package/dist/utils/loggerHolder.js.map +1 -0
  207. package/dist/utils/math.d.ts +5 -0
  208. package/dist/utils/math.d.ts.map +1 -0
  209. package/dist/utils/math.js +19 -0
  210. package/dist/utils/math.js.map +1 -0
  211. package/dist/utils/path.d.ts +28 -0
  212. package/dist/utils/path.d.ts.map +1 -0
  213. package/dist/utils/path.js +33 -0
  214. package/dist/utils/path.js.map +1 -0
  215. package/dist/utils/safeTimer.d.ts +26 -0
  216. package/dist/utils/safeTimer.d.ts.map +1 -0
  217. package/dist/utils/safeTimer.js +49 -0
  218. package/dist/utils/safeTimer.js.map +1 -0
  219. package/dist/utils/scanner.d.ts +54 -0
  220. package/dist/utils/scanner.d.ts.map +1 -0
  221. package/dist/utils/scanner.js +115 -0
  222. package/dist/utils/scanner.js.map +1 -0
  223. package/dist/utils/segmenter.d.ts +30 -0
  224. package/dist/utils/segmenter.d.ts.map +1 -0
  225. package/dist/utils/segmenter.js +80 -0
  226. package/dist/utils/segmenter.js.map +1 -0
  227. package/dist/utils/strings.d.ts +18 -0
  228. package/dist/utils/strings.d.ts.map +1 -0
  229. package/dist/utils/strings.js +25 -0
  230. package/dist/utils/strings.js.map +1 -0
  231. package/dist/utils/time.d.ts +23 -0
  232. package/dist/utils/time.d.ts.map +1 -0
  233. package/dist/utils/time.js +31 -0
  234. package/dist/utils/time.js.map +1 -0
  235. package/dist/utils/toError.d.ts +13 -0
  236. package/dist/utils/toError.d.ts.map +1 -0
  237. package/dist/utils/toError.js +22 -0
  238. package/dist/utils/toError.js.map +1 -0
  239. package/package.json +73 -0
@@ -0,0 +1,388 @@
1
+ /**
2
+ * 内置工具处理器(从 ToolExecutor 提取的内置工具实现层)
3
+ *
4
+ * 职责:
5
+ * 1. 路径安全解析(resolveSafePath + guardPathOrThrow)—— 内置 + 自定义工具共享
6
+ * 2. 内置工具实现(read_file / write_file / list_dir / search_memories)
7
+ * 3. 文件写入内容计算(computeWriteContent)
8
+ * 4. 目录递归遍历(walkDir + shouldIgnore)
9
+ *
10
+ * 设计理由(QC-R2-10):ToolExecutor 802 行超阈值,内置工具实现(~440 行)
11
+ * 是独立职责——实际文件系统/记忆索引操作,与 ToolExecutor 的注册/分发/校验职责分离。
12
+ *
13
+ * 自然生长原则:BuiltinToolHandlers 不持有 customTools 注册表(避免与 ToolExecutor 状态耦合),
14
+ * 所有方法接收参数,是无状态的纯计算 + I/O 操作。
15
+ */
16
+ import { readFile, writeFile, mkdir, readdir, stat, access } from 'node:fs/promises';
17
+ import { constants } from 'node:fs';
18
+ import { resolve, isAbsolute, join, relative, dirname, basename } from 'node:path';
19
+ import { toolError, MemoraError, ToolErrorCode, toError } from '../utils/errors.js';
20
+ import { logger } from '../logging/logger.js';
21
+ import { segmentText } from '../utils/segmenter.js';
22
+ /**
23
+ * 内置工具处理器
24
+ *
25
+ * 管理 4 个内置工具的实际实现 + 路径安全校验。
26
+ * 从 ToolExecutor 提取,保持无状态设计(不持有 customTools 注册表)。
27
+ */
28
+ export class BuiltinToolHandlers {
29
+ projectPath;
30
+ security;
31
+ memoryIndex;
32
+ workProjection;
33
+ /** list_dir 默认忽略的目录/文件名 */
34
+ static IGNORED_DIR_NAMES = [
35
+ '.git',
36
+ 'node_modules',
37
+ '.memora',
38
+ 'dist',
39
+ 'coverage',
40
+ '.next',
41
+ ];
42
+ /**
43
+ * @param projectPath 项目根路径(用于相对路径解析)
44
+ * @param security 安全守卫(路径白名单 + 写入确认)
45
+ * @param memoryIndex 记忆索引(用于 search_memories 工具)
46
+ * @param workProjection 作品投影管理器(可选,读取文件时自动生成投影)
47
+ */
48
+ constructor(projectPath, security, memoryIndex, workProjection) {
49
+ this.projectPath = projectPath;
50
+ this.security = security;
51
+ this.memoryIndex = memoryIndex;
52
+ this.workProjection = workProjection;
53
+ }
54
+ // ─── 路径安全(内置 + 自定义工具共享) ──────────────────────────
55
+ /**
56
+ * 解析相对路径为绝对路径
57
+ *
58
+ * 绝对路径直接使用(安全校验由下游 guardPathOrThrow → SecurityGuard.assertPathAllowed 完成);
59
+ * 相对路径基于 projectPath 解析。防御纵深:resolveSafePath 只负责路径解析,
60
+ * 白名单拦截由 assertPathAllowed 独立执行。
61
+ */
62
+ resolveSafePath(relativePath) {
63
+ return isAbsolute(relativePath) ? relativePath : resolve(this.projectPath, relativePath);
64
+ }
65
+ /**
66
+ * 路径白名单校验(捕获后包装为 toolError)
67
+ * @param source S-02: 调用链来源标记
68
+ */
69
+ guardPathOrThrow(absolutePath, tool, source = 'builtin') {
70
+ try {
71
+ this.security.assertPathAllowed(absolutePath, tool, source);
72
+ }
73
+ catch (err) {
74
+ const e = toError(err);
75
+ throw toolError('路径不在白名单内', e.message, [
76
+ '确认路径在白名单内(项目目录/数据目录/显式 allowedPaths)',
77
+ '查看审计日志:~/.memora/logs/memora.log',
78
+ ], e, ToolErrorCode.PATH_NOT_ALLOWED);
79
+ }
80
+ }
81
+ // ─── 内置工具实现 ──────────────────────────────────────
82
+ /**
83
+ * 读取文件(带路径白名单校验)
84
+ */
85
+ async readFile(relativePath) {
86
+ if (!relativePath) {
87
+ throw toolError('read_file 工具调用缺少 path 参数', 'LLM 未传 path', ['检查 personality.md 是否明确了 read_file 用法', '检查 LLM 输出'], undefined, ToolErrorCode.ARGUMENT_ERROR);
88
+ }
89
+ const absolutePath = this.resolveSafePath(relativePath);
90
+ this.guardPathOrThrow(absolutePath, 'read_file');
91
+ try {
92
+ const content = await readFile(absolutePath, 'utf-8');
93
+ // 读取文件时自动触发生成/更新作品投影(fire-and-forget,不阻塞读取)
94
+ if (this.workProjection) {
95
+ this.workProjection.ensureProjection(absolutePath, content, relativePath).catch((err) => {
96
+ logger.warn({ err, path: absolutePath }, '作品投影生成失败');
97
+ });
98
+ }
99
+ return content;
100
+ }
101
+ catch (err) {
102
+ const e = toError(err);
103
+ // 区分 ENOENT(文件不存在)和其他 IO 错误
104
+ if (e instanceof MemoraError)
105
+ throw e;
106
+ if (err !== null &&
107
+ typeof err === 'object' &&
108
+ 'code' in err &&
109
+ err.code === 'ENOENT') {
110
+ throw toolError('read_file 文件不存在', `${absolutePath}:文件不存在`, ['确认路径正确', '使用 list_dir 查看目录结构'], e, ToolErrorCode.FILE_NOT_FOUND);
111
+ }
112
+ throw toolError('read_file 读取失败', `${absolutePath}:${e.message}`, ['确认文件权限', '确认路径正确'], e, ToolErrorCode.UNKNOWN);
113
+ }
114
+ }
115
+ /**
116
+ * 写入文件(支持 overwrite / append / insert 三种模式)
117
+ *
118
+ * 安全策略:
119
+ * - 路径必须在白名单内
120
+ * - 写入前需用户确认(WriteExtensions.onBeforeWrite 或 SecurityGuard.requestWriteConfirmation)
121
+ * - 自动创建不存在的父目录
122
+ *
123
+ * @param relativePath 相对项目根的文件路径
124
+ * @param content 要写入的内容
125
+ * @param extensions 写入扩展(可选,用于 diff 确认等)
126
+ * @param mode 写入模式:"overwrite" | "append" | "insert",默认 "overwrite"
127
+ * @param insertLine insert 模式下的目标行号(从 1 开始),省略则插入到末尾
128
+ */
129
+ async writeFile(relativePath, content, extensions, mode = 'overwrite', insertLine) {
130
+ if (!relativePath) {
131
+ throw toolError('write_file 工具调用缺少 path 参数', 'LLM 未传 path', ['检查 personality.md 是否明确了 write_file 用法'], undefined, ToolErrorCode.ARGUMENT_ERROR);
132
+ }
133
+ if (typeof content !== 'string') {
134
+ throw toolError('write_file 工具调用缺少 content 参数', 'LLM 未传 content', ['确认 content 是字符串'], undefined, ToolErrorCode.ARGUMENT_ERROR);
135
+ }
136
+ // 校验 mode 参数合法性
137
+ const validModes = ['overwrite', 'append', 'insert'];
138
+ if (!validModes.includes(mode)) {
139
+ throw toolError('write_file 参数错误', `mode 必须是 ${validModes.join('/')} 之一,收到:${mode}`, ['检查 LLM 输出的 mode 参数'], undefined, ToolErrorCode.ARGUMENT_ERROR);
140
+ }
141
+ // insert 模式必须提供 insert_line
142
+ if (mode === 'insert' && !insertLine) {
143
+ throw toolError('write_file 参数错误', 'insert 模式必须提供 insert_line 参数', ['insert_line 指定插入位置的行号(从 1 开始)'], undefined, ToolErrorCode.ARGUMENT_ERROR);
144
+ }
145
+ const absolutePath = this.resolveSafePath(relativePath);
146
+ this.guardPathOrThrow(absolutePath, 'write_file');
147
+ // 读取文件旧内容(如果存在)
148
+ let beforeContent = null;
149
+ try {
150
+ await access(absolutePath, constants.F_OK);
151
+ beforeContent = await readFile(absolutePath, 'utf-8');
152
+ }
153
+ catch {
154
+ // 文件不存在 → 新文件,beforeContent 保持 null
155
+ }
156
+ // 根据 mode 计算最终写入内容
157
+ const finalContent = this.computeWriteContent(mode, content, beforeContent, insertLine);
158
+ // 写入确认:优先使用 WriteExtensions.onBeforeWrite(diff 确认),
159
+ // 否则回退到 SecurityGuard.requestWriteConfirmation(安全确认)
160
+ if (extensions?.onBeforeWrite) {
161
+ let ok;
162
+ try {
163
+ ok = await extensions.onBeforeWrite(relativePath, beforeContent, finalContent);
164
+ }
165
+ catch (err) {
166
+ const e = toError(err);
167
+ throw toolError('写入确认失败', `写入确认回调异常:${e.message}`, ['重试写入操作', '检查扩展实现是否有 bug'], e, ToolErrorCode.UNKNOWN);
168
+ }
169
+ if (!ok) {
170
+ throw toolError('用户拒绝写入', `用户取消了 write_file 操作:${absolutePath}`, ['如需写入,请重新发起请求并确认'], undefined, ToolErrorCode.WRITE_REJECTED);
171
+ }
172
+ }
173
+ else {
174
+ // 回退到原有安全确认流程
175
+ const description = `写入 ${finalContent.length} 字符到 ${basename(absolutePath)}(模式:${mode})`;
176
+ let confirmed;
177
+ try {
178
+ confirmed = await this.security.requestWriteConfirmation(absolutePath, 'write_file', description);
179
+ }
180
+ catch (err) {
181
+ const e = toError(err);
182
+ throw toolError('写入确认失败', `安全确认异常:${e.message}`, ['重试写入操作'], e, ToolErrorCode.UNKNOWN);
183
+ }
184
+ if (!confirmed) {
185
+ throw toolError('用户拒绝写入', `用户取消了 write_file 操作:${absolutePath}`, ['如需写入,请重新发起请求并确认'], undefined, ToolErrorCode.WRITE_REJECTED);
186
+ }
187
+ }
188
+ // 自动创建父目录(mkdir recursive)
189
+ const parentDir = dirname(absolutePath);
190
+ try {
191
+ await mkdir(parentDir, { recursive: true });
192
+ }
193
+ catch (err) {
194
+ const e = toError(err);
195
+ throw toolError('创建目录失败', `无法创建父目录 ${parentDir}:${e.message}`, ['确认父目录路径可写', '检查磁盘权限'], e, ToolErrorCode.PERMISSION_DENIED);
196
+ }
197
+ try {
198
+ await writeFile(absolutePath, finalContent, 'utf-8');
199
+ // 返回结果包含写入模式、行数变化等信息
200
+ const newLines = finalContent.split('\n').length;
201
+ const oldLines = beforeContent !== null ? beforeContent.split('\n').length : 0;
202
+ const modeLabel = mode === 'overwrite' ? '覆盖' : mode === 'append' ? '追加' : `插入到第${insertLine}行`;
203
+ return (`✅ 已写入(${modeLabel}):${absolutePath}(${finalContent.length} 字符,${newLines} 行)` +
204
+ (beforeContent !== null ? ` [旧文件: ${oldLines} 行]` : ' [新文件]'));
205
+ }
206
+ catch (err) {
207
+ const e = toError(err);
208
+ throw toolError('文件写入失败', `${absolutePath}:${e.message}`, ['确认父目录可写', '确认磁盘空间充足'], e, ToolErrorCode.PERMISSION_DENIED);
209
+ }
210
+ }
211
+ /**
212
+ * 根据写入模式计算最终文件内容
213
+ *
214
+ * @param mode 写入模式
215
+ * @param content LLM 提供的写入内容
216
+ * @param beforeContent 文件旧内容(null 表示新文件)
217
+ * @param insertLine insert 模式下的行号
218
+ * @returns 最终要写入文件的完整内容
219
+ */
220
+ computeWriteContent(mode, content, beforeContent, insertLine) {
221
+ switch (mode) {
222
+ case 'overwrite':
223
+ // 全量覆盖:直接使用 content
224
+ return content;
225
+ case 'append':
226
+ // 追加模式:旧内容 + 新内容
227
+ if (beforeContent === null) {
228
+ // 新文件等同于 overwrite
229
+ return content;
230
+ }
231
+ return beforeContent + content;
232
+ case 'insert': {
233
+ // 插入模式:在指定行号前插入
234
+ if (beforeContent === null) {
235
+ // 新文件等同于 overwrite
236
+ return content;
237
+ }
238
+ const lineNum = Number.parseInt(insertLine ?? '1', 10);
239
+ if (Number.isNaN(lineNum) || lineNum < 1) {
240
+ throw toolError('write_file 参数错误', `insert_line 必须是正整数,收到:${insertLine}`, ['insert_line 从 1 开始计数'], undefined, ToolErrorCode.ARGUMENT_ERROR);
241
+ }
242
+ const lines = beforeContent.split('\n');
243
+ // 行号超出范围时追加到末尾
244
+ const insertIdx = Math.min(lineNum - 1, lines.length);
245
+ lines.splice(insertIdx, 0, content);
246
+ return lines.join('\n');
247
+ }
248
+ default:
249
+ // 理论上不会到达(writeFile 已校验 mode),防御性兜底
250
+ return content;
251
+ }
252
+ }
253
+ /**
254
+ * 列出目录内容
255
+ *
256
+ * 安全策略:
257
+ * - 路径必须在白名单内
258
+ * - 递归深度 ≤ 3(maxDepth 入参强校验)
259
+ * - 自动忽略:.git / node_modules / .memora / dist / coverage
260
+ */
261
+ async listDir(relativePath, recursiveStr, maxDepthStr) {
262
+ const absolutePath = this.resolveSafePath(relativePath);
263
+ this.guardPathOrThrow(absolutePath, 'list_dir');
264
+ const recursive = recursiveStr === 'true' || recursiveStr === '1';
265
+ let maxDepth = Number.parseInt(maxDepthStr, 10);
266
+ if (Number.isNaN(maxDepth) || maxDepth < 1) {
267
+ maxDepth = 2;
268
+ }
269
+ if (maxDepth > 3) {
270
+ maxDepth = 3;
271
+ }
272
+ let stats;
273
+ try {
274
+ stats = await stat(absolutePath);
275
+ }
276
+ catch (err) {
277
+ // stat 调用失败:区分 ENOENT(不存在)和其他 IO 错误
278
+ if (err !== null &&
279
+ typeof err === 'object' &&
280
+ 'code' in err &&
281
+ err.code === 'ENOENT') {
282
+ const e = toError(err);
283
+ throw toolError('list_dir 路径不存在', `${absolutePath}:目录不存在`, ['确认路径存在', '使用 list_dir(".") 列出项目根'], e, ToolErrorCode.DIR_NOT_FOUND);
284
+ }
285
+ // 其他 IO 错误(如权限问题),包装为统一的 TOOL_ERROR
286
+ const e = toError(err);
287
+ throw toolError('list_dir 访问失败', `${absolutePath}:${e.message}`, ['确认目录权限', '尝试其他路径'], e, ToolErrorCode.UNKNOWN);
288
+ }
289
+ // stat 成功,检查是否为目录
290
+ if (!stats.isDirectory()) {
291
+ throw toolError('list_dir 路径不是目录', `${absolutePath} 是文件,不是目录`, ['path 参数必须指向目录'], undefined, ToolErrorCode.DIR_NOT_FOUND);
292
+ }
293
+ const entries = [];
294
+ await this.walkDir(absolutePath, absolutePath, entries, 0, maxDepth, recursive);
295
+ if (entries.length === 0) {
296
+ return `(目录为空或所有条目都被忽略)${absolutePath}`;
297
+ }
298
+ return `目录 ${absolutePath} 共有 ${entries.length} 个条目:\n${entries.map((e) => ` ${e}`).join('\n')}`;
299
+ }
300
+ /**
301
+ * 递归遍历目录(深度受限 + 忽略特定目录)
302
+ */
303
+ async walkDir(root, current, out, depth, maxDepth, recursive) {
304
+ if (depth > maxDepth)
305
+ return;
306
+ let names;
307
+ try {
308
+ names = await readdir(current);
309
+ }
310
+ catch (err) {
311
+ logger.debug({ err, dir: current }, 'readdir 失败,跳过');
312
+ return;
313
+ }
314
+ names.sort();
315
+ for (const name of names) {
316
+ // 忽略:.git / node_modules / .memora / dist / coverage
317
+ if (this.shouldIgnore(name))
318
+ continue;
319
+ const childAbs = join(current, name);
320
+ const childRel = relative(root, childAbs);
321
+ try {
322
+ const childStat = await stat(childAbs);
323
+ if (childStat.isDirectory()) {
324
+ out.push(`📁 ${childRel}/`);
325
+ // 递归条件:未达到 maxDepth(depth+1 < maxDepth)
326
+ // maxDepth=1 → 0+1<1=false 不递归;maxDepth=2 → 0+1<2=true 递归 1 层
327
+ if (recursive && depth + 1 < maxDepth) {
328
+ await this.walkDir(root, childAbs, out, depth + 1, maxDepth, recursive);
329
+ }
330
+ }
331
+ else {
332
+ out.push(`📄 ${childRel}`);
333
+ }
334
+ }
335
+ catch (err) {
336
+ // 跳过无法访问的条目(符号链接断开、权限不足等)
337
+ out.push(`❓ ${childRel}(无法访问:${toError(err).message})`);
338
+ }
339
+ }
340
+ }
341
+ /**
342
+ * 判断目录/文件名是否应被忽略
343
+ */
344
+ shouldIgnore(name) {
345
+ return BuiltinToolHandlers.IGNORED_DIR_NAMES.includes(name);
346
+ }
347
+ /**
348
+ * 在记忆索引中搜索
349
+ *
350
+ * @param query 搜索关键词
351
+ * @param limitStr 返回数量上限
352
+ * @param modeStr 搜索模式:"match"(任一命中,默认)或 "near"(全部命中)
353
+ */
354
+ async searchMemories(query, limitStr, modeStr) {
355
+ if (!query) {
356
+ throw toolError('search_memories 工具调用缺少 query 参数', 'LLM 未传 query', ['query 不能为空'], undefined, ToolErrorCode.ARGUMENT_ERROR);
357
+ }
358
+ let limit = Number.parseInt(limitStr, 10);
359
+ if (Number.isNaN(limit) || limit < 1) {
360
+ limit = 10;
361
+ }
362
+ if (limit > 50) {
363
+ limit = 50;
364
+ }
365
+ const mode = modeStr === 'near' ? 'near' : 'match';
366
+ let results = this.memoryIndex.search(query, limit);
367
+ // near 模式:过滤只保留所有关键词都命中的结果
368
+ if (mode === 'near' && results.length > 0) {
369
+ // 复用 segmentText 分词,与 inMemoryStorage 搜索保持一致
370
+ const keywords = segmentText(query).map((t) => t.toLowerCase());
371
+ if (keywords.length > 1) {
372
+ results = results.filter((m) => {
373
+ const text = `${m.content} ${m.name}`.toLowerCase();
374
+ return keywords.every((kw) => text.includes(kw));
375
+ });
376
+ }
377
+ }
378
+ if (results.length === 0) {
379
+ return `(未找到匹配 "${query}" 的记忆${mode === 'near' ? '(near 模式:所有关键词必须命中)' : ''})`;
380
+ }
381
+ const lines = results.map((m, i) => {
382
+ const preview = m.content.length > 80 ? `${m.content.slice(0, 80)}…` : m.content;
383
+ return `${i + 1}. [${m.source}:${m.name}] (score=${m.score})\n ${preview.replace(/\n/g, ' ')}`;
384
+ });
385
+ return `搜索 "${query}" 找到 ${results.length} 条(${mode} 模式):\n${lines.join('\n')}`;
386
+ }
387
+ }
388
+ //# sourceMappingURL=builtinToolHandlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtinToolHandlers.js","sourceRoot":"","sources":["../../src/agent/builtinToolHandlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * 内置工具定义
3
+ *
4
+ * 工具定义(schema/参数描述)与工具执行逻辑分离:
5
+ * - 本文件只包含工具的"声明"(名称、描述、参数 schema)
6
+ * - 工具的"执行"逻辑留在 toolExecutor.ts
7
+ */
8
+ /**
9
+ * 工具定义接口
10
+ *
11
+ * 描述一个工具的名称、用途和参数 schema,
12
+ * 用于构建 LLM 请求的 tools 参数。
13
+ */
14
+ export interface ToolDefinition {
15
+ name: string;
16
+ description: string;
17
+ parameters: {
18
+ type: 'object';
19
+ properties: Record<string, {
20
+ type: string;
21
+ description: string;
22
+ }>;
23
+ required: string[];
24
+ };
25
+ }
26
+ /**
27
+ * 工具注册表
28
+ * 阶段二(M-204):4 个工具
29
+ * - read_file:读取文件
30
+ * - write_file:写入/创建文件(受写入二次确认保护)
31
+ * - list_dir:列出目录内容
32
+ * - search_memories:在记忆索引中搜索关键词
33
+ */
34
+ export declare const BUILTIN_TOOLS: ToolDefinition[];
35
+ //# sourceMappingURL=builtinTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtinTools.d.ts","sourceRoot":"","sources":["../../src/agent/builtinTools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAClE,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CACH;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,cAAc,EA8DzC,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * 内置工具定义
3
+ *
4
+ * 工具定义(schema/参数描述)与工具执行逻辑分离:
5
+ * - 本文件只包含工具的"声明"(名称、描述、参数 schema)
6
+ * - 工具的"执行"逻辑留在 toolExecutor.ts
7
+ */
8
+ /**
9
+ * 工具注册表
10
+ * 阶段二(M-204):4 个工具
11
+ * - read_file:读取文件
12
+ * - write_file:写入/创建文件(受写入二次确认保护)
13
+ * - list_dir:列出目录内容
14
+ * - search_memories:在记忆索引中搜索关键词
15
+ */
16
+ export const BUILTIN_TOOLS = [
17
+ {
18
+ name: 'read_file',
19
+ description: '读取项目内文件内容。路径必须相对项目根目录。',
20
+ parameters: {
21
+ type: 'object',
22
+ properties: {
23
+ path: { type: 'string', description: '相对项目根目录的文件路径' },
24
+ },
25
+ required: ['path'],
26
+ },
27
+ },
28
+ {
29
+ name: 'write_file',
30
+ description: '写入或创建文件。owner 模式默认自动批准;guest 模式会要求用户确认。受路径白名单保护。支持三种写入模式:overwrite(默认,全量覆盖)、append(追加到末尾)、insert(在指定行号前插入)。',
31
+ parameters: {
32
+ type: 'object',
33
+ properties: {
34
+ path: { type: 'string', description: '相对项目根目录的文件路径' },
35
+ content: { type: 'string', description: '要写入的内容' },
36
+ mode: {
37
+ type: 'string',
38
+ description: '写入模式:"overwrite"(默认,全量覆盖)、"append"(追加到末尾)、"insert"(在 insert_line 行号前插入)',
39
+ },
40
+ insert_line: {
41
+ type: 'string',
42
+ description: 'insert 模式下插入位置的行号(从 1 开始),省略则插入到文件末尾',
43
+ },
44
+ },
45
+ required: ['path', 'content'],
46
+ },
47
+ },
48
+ {
49
+ name: 'list_dir',
50
+ description: '列出目录内容。默认相对项目根目录。受路径白名单保护。递归深度 ≤ 3,自动忽略 .git / node_modules。',
51
+ parameters: {
52
+ type: 'object',
53
+ properties: {
54
+ path: { type: 'string', description: '相对项目根目录的目录路径,默认为 "."(项目根)' },
55
+ recursive: { type: 'string', description: '是否递归("true" / "false"),默认 "false"' },
56
+ maxDepth: { type: 'string', description: '递归最大深度(1-3),默认 "2"' },
57
+ },
58
+ required: [],
59
+ },
60
+ },
61
+ {
62
+ name: 'search_memories',
63
+ description: '在记忆索引中搜索关键词。支持 match(任一命中,默认)和 near(全部命中)两种模式。',
64
+ parameters: {
65
+ type: 'object',
66
+ properties: {
67
+ query: { type: 'string', description: '搜索关键词' },
68
+ limit: { type: 'string', description: '返回结果数量上限,默认 "10"' },
69
+ mode: { type: 'string', description: '"match"(默认,任一)或 "near"(必须全部)' },
70
+ },
71
+ required: ['query'],
72
+ },
73
+ },
74
+ ];
75
+ //# sourceMappingURL=builtinTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtinTools.js","sourceRoot":"","sources":["../../src/agent/builtinTools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkBH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAqB;IAC7C;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,wBAAwB;QACrC,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;aACtD;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,6GAA6G;QAC/G,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;gBACrD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE;gBAClD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,yEAAyE;iBAC5E;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,sCAAsC;iBACpD;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;SAC9B;KACF;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EACT,8DAA8D;QAChE,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;gBAClE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE;gBAC/E,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;aAChE;YACD,QAAQ,EAAE,EAAE;SACb;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,gDAAgD;QAClD,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE;gBAC/C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE;gBAC1D,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;aACtE;YACD,QAAQ,EAAE,CAAC,OAAO,CAAC;SACpB;KACF;CACF,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Agent 模块常量集合
3
+ *
4
+ * 集中管理 agent.ts 与 loop.ts 中的 magic numbers,便于统一调整与审查。
5
+ * 按模块分两个命名空间,不创建全局 constants(避免垃圾桶反模式)。
6
+ *
7
+ * 触发提取的决策记录:A-006(原"暂缓"判断已失效——10 个 magic number 分布在 2 文件,已达提取阈值)。
8
+ */
9
+ /**
10
+ * Agent 门面层常量
11
+ *
12
+ * 用于 agent.ts 中的并发锁、输入限制、记忆衰减周期等。
13
+ */
14
+ export declare const AGENT_CONSTANTS: {
15
+ /**
16
+ * chat() 并发锁超时(毫秒)。超时后中断 generator 并释放锁。
17
+ *
18
+ * BUG-STREAM-05 修复:原值 300_000(5 分钟)与超时体系不匹配:
19
+ * - chunk 级读超时 30s(openaiCompatible parseSseStream)
20
+ * - LLM 请求超时 120s(LLM_TIMEOUT_MS)
21
+ * - 宿主层无进展兜底 60s(chatHandlers STREAM_NO_PROGRESS_TIMEOUT_MS)
22
+ * 现调整为 180s(LLM 120s + 60s 缓冲),作为所有超时失败后的最后兜底。
23
+ */
24
+ readonly CHAT_LOCK_TIMEOUT_MS: 180000;
25
+ /** chat() 输入最大长度(字节)。128KB。 */
26
+ readonly CHAT_INPUT_MAX_LENGTH: number;
27
+ /** 记忆衰减执行间隔(毫秒)。1 小时。 */
28
+ readonly DECAY_INTERVAL_MS: 3600000;
29
+ /** AgentConfig.maxContextTokens 默认值。120K tokens。 */
30
+ readonly DEFAULT_MAX_CONTEXT_TOKENS: 120000;
31
+ /** recallExcludeSources 默认值——永久记忆不参与增量召回。 */
32
+ readonly DEFAULT_RECALL_EXCLUDE_SOURCES: readonly ["persona", "rule", "skill"];
33
+ };
34
+ /**
35
+ * AgentLoop 引擎层常量
36
+ *
37
+ * 用于 loop.ts 中的 token 估算、召回上下文长度、LLM 重试、循环限制等。
38
+ *
39
+ * 注意:AgentLoop 构造选项中的默认值(maxIterations ?? 20 等)保留在 loop.ts 原地,
40
+ * 因为它们是 API 契约的一部分——调用方期望"未传入时使用默认值"。
41
+ * 这里只提取与 UI/重试/估算相关的纯常量。
42
+ */
43
+ export declare const LOOP_CONSTANTS: {
44
+ /** 粗略 token 估算:每 token 约 3 字符(非精确 tokenizer)。 */
45
+ readonly CHARS_PER_TOKEN: 3;
46
+ /** 召回记忆注入到上下文的最大字符数。超出会截断。 */
47
+ readonly RECALL_CONTEXT_MAX_CHARS: 2000;
48
+ /** LLM 调用最大重试次数(不含首次调用)。 */
49
+ readonly MAX_LLM_RETRIES: 2;
50
+ /** LLM 重试基础延迟(毫秒),指数退避 base。 */
51
+ readonly RETRY_BASE_DELAY_MS: 1000;
52
+ /** 单次 LLM 请求超时(毫秒)。120 秒。超时后可重试。 */
53
+ readonly LLM_TIMEOUT_MS: 120000;
54
+ /** 上下文截断时给 LLM 响应预留的缓冲比例。0.9 = 留 10% 给响应。 */
55
+ readonly CONTEXT_TOKENS_BUFFER_RATIO: 0.9;
56
+ /** 摘要缓存 TTL:消息数增长超过此值时缓存过期,需重新生成摘要。 */
57
+ readonly SUMMARY_CACHE_TTL_MSGS: 10;
58
+ /** 召回记忆内容注入上下文时的截断长度(字符)。 */
59
+ readonly RECALL_CONTENT_SLICE: 200;
60
+ /** 上下文摘要:参与摘要的最近消息条数。 */
61
+ readonly SUMMARY_MSG_COUNT: 6;
62
+ /** 上下文摘要:单条消息内容截断长度(字符)。 */
63
+ readonly SUMMARY_CONTENT_SLICE: 200;
64
+ /** 上下文摘要:LLM 调用 maxTokens 参数。 */
65
+ readonly SUMMARY_MAX_TOKENS: 150;
66
+ };
67
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/agent/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;GAIG;AACH,eAAO,MAAM,eAAe;IAC1B;;;;;;;;OAQG;;IAGH,+BAA+B;;IAG/B,yBAAyB;;IAGzB,oDAAoD;;IAGpD,6CAA6C;;CAErC,CAAC;AAEX;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc;IACzB,iDAAiD;;IAGjD,8BAA8B;;IAG9B,4BAA4B;;IAG5B,gCAAgC;;IAGhC,oCAAoC;;IAGpC,6CAA6C;;IAG7C,uCAAuC;;IAGvC,6BAA6B;;IAG7B,yBAAyB;;IAGzB,4BAA4B;;IAG5B,iCAAiC;;CAEzB,CAAC"}