@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,194 @@
1
+ /**
2
+ * 配置加载
3
+ *
4
+ * 优先级(高 → 低):
5
+ * 1. --config 命令行参数
6
+ * 2. 项目级 .memora/config.json
7
+ * 3. 用户级 ~/.memora/config.json
8
+ * 4. 内置默认值
9
+ *
10
+ * API Key 从环境变量读取(不写入配置文件)
11
+ *
12
+ * 多 Provider 管理(v1.2):
13
+ * - providers:命名 Provider 映射表,key 为别名(如 "deepseek"、"openai")
14
+ * - active:当前激活的 Provider 别名
15
+ * - 不配置 providers 时,回退到旧的单 provider 扁平字段(向后兼容)
16
+ */
17
+ import { readFile } from 'node:fs/promises';
18
+ import { resolve } from 'node:path';
19
+ import { homedir } from 'node:os';
20
+ import { z } from 'zod';
21
+ // 单个 Provider 配置 schema(用于 providers 映射表的值)
22
+ const ProviderConfigSchema = z.object({
23
+ provider: z.string(),
24
+ model: z.string(),
25
+ baseUrl: z.string().optional(),
26
+ apiKey: z.string().optional(),
27
+ });
28
+ // 配置 schema(运行时校验)
29
+ // provider 允许任意字符串:预设(mock/deepseek/doubao/openai)开箱即用,
30
+ // 自定义 provider(如 mimo、自部署模型)只要显式配 baseUrl + model 即可
31
+ // 详见 ADR-003
32
+ const ConfigSchema = z.object({
33
+ llm: z.object({
34
+ // 旧格式:单一 provider 扁平字段(向后兼容,providers 未配置时生效)
35
+ provider: z.string().default('mock'),
36
+ model: z.string().default('deepseek-chat'),
37
+ baseUrl: z.string().optional(),
38
+ apiKey: z.string().optional(),
39
+ temperature: z.number().min(0).max(2).default(0.7),
40
+ /**
41
+ * 多 Provider 映射表
42
+ *
43
+ * key 为 Provider 别名(如 "deepseek"、"openai"),value 为 Provider 配置。
44
+ * 配置后,旧扁平字段(provider/model/baseUrl/apiKey)被忽略。
45
+ * 不配置时回退到旧的单 provider 行为——完全向后兼容。
46
+ */
47
+ providers: z.record(z.string(), ProviderConfigSchema).optional(),
48
+ /**
49
+ * 当前激活的 Provider 别名
50
+ *
51
+ * 必须与 providers 中的某个 key 一致。
52
+ * 不配置时默认使用 providers 的第一个 key。
53
+ */
54
+ active: z.string().optional(),
55
+ /**
56
+ * 后台通道配置(多 Provider 路由预留)
57
+ *
58
+ * 不配时所有消费者复用前台(llm)配置——零破坏性,完全向后兼容。
59
+ * 配置后,归档/投影/画像等后台操作使用此通道,降低成本。
60
+ * 详见接入指南 §九
61
+ */
62
+ background: z
63
+ .object({
64
+ provider: z.string(),
65
+ model: z.string(),
66
+ baseUrl: z.string().optional(),
67
+ apiKey: z.string().optional(),
68
+ temperature: z.number().min(0).max(2).default(0.5),
69
+ })
70
+ .optional(),
71
+ }),
72
+ memory: z.object({
73
+ dataDir: z.string().default('~/.memora'),
74
+ maxContextTokens: z.number().default(120000),
75
+ }),
76
+ security: z.object({
77
+ permission: z.enum(['owner', 'guest']).default('owner'),
78
+ confirmWrites: z.boolean().default(false),
79
+ }),
80
+ // 允许的路径白名单(绝对路径)
81
+ allowedPaths: z.array(z.string()).default([]),
82
+ // 默认角色名(对应 personas/*.md)
83
+ persona: z.string().optional(),
84
+ /**
85
+ * Embedding 配置(可选,配置后启用向量语义召回)
86
+ *
87
+ * 复用 OpenAI 兼容协议的 /embeddings 端点。
88
+ * 不配置时降级为纯关键词召回(当前行为)。
89
+ */
90
+ embedding: z
91
+ .object({
92
+ model: z.string(),
93
+ baseUrl: z.string().optional(),
94
+ apiKey: z.string().optional(),
95
+ })
96
+ .optional(),
97
+ });
98
+ const DEFAULT_CONFIG = {
99
+ llm: {
100
+ provider: 'mock',
101
+ model: 'mock-model',
102
+ temperature: 0.7,
103
+ },
104
+ memory: {
105
+ dataDir: '~/.memora',
106
+ maxContextTokens: 120000,
107
+ },
108
+ security: {
109
+ permission: 'owner',
110
+ confirmWrites: false,
111
+ },
112
+ allowedPaths: [],
113
+ persona: undefined,
114
+ embedding: undefined,
115
+ };
116
+ /**
117
+ * 加载配置
118
+ * @param configPath 显式指定的配置文件路径
119
+ */
120
+ export async function loadConfig(configPath) {
121
+ // 1. 显式指定
122
+ if (configPath) {
123
+ const config = await readJsonFile(configPath);
124
+ return expandEnvVars(mergeWithDefaults(config));
125
+ }
126
+ // 2. 项目级
127
+ const projectPath = resolve(process.cwd(), '.memora/config.json');
128
+ try {
129
+ const config = await readJsonFile(projectPath);
130
+ return expandEnvVars(mergeWithDefaults(config));
131
+ }
132
+ catch {
133
+ // 项目级不存在,继续尝试用户级
134
+ }
135
+ // 3. 用户级
136
+ const userPath = resolve(homedir(), '.memora/config.json');
137
+ try {
138
+ const config = await readJsonFile(userPath);
139
+ return expandEnvVars(mergeWithDefaults(config));
140
+ }
141
+ catch {
142
+ // 用户级不存在,使用默认值
143
+ }
144
+ // 4. 内置默认
145
+ return expandEnvVars(DEFAULT_CONFIG);
146
+ }
147
+ /**
148
+ * 读取并解析 JSON 文件
149
+ */
150
+ async function readJsonFile(path) {
151
+ const content = await readFile(path, 'utf-8');
152
+ return JSON.parse(content);
153
+ }
154
+ /**
155
+ * 合并用户配置与默认值
156
+ */
157
+ function mergeWithDefaults(userConfig) {
158
+ return ConfigSchema.parse({
159
+ ...DEFAULT_CONFIG,
160
+ ...userConfig,
161
+ });
162
+ }
163
+ /**
164
+ * 展开 ${ENV_VAR} 占位符
165
+ * 配置文件可写 "apiKey": "${MEMORA_LLM_API_KEY}"
166
+ * 实际读取时展开为环境变量值
167
+ *
168
+ * 同时展开 providers 映射表中每个 Provider 的 apiKey/baseUrl
169
+ */
170
+ function expandEnvVars(config) {
171
+ const expand = (val) => {
172
+ if (!val)
173
+ return val;
174
+ return val.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/g, (_, name) => process.env[name] ?? '');
175
+ };
176
+ // 展开 providers 映射表中的环境变量
177
+ const expandedProviders = config
178
+ .llm.providers
179
+ ? Object.fromEntries(Object.entries(config.llm.providers).map(([key, p]) => [
180
+ key,
181
+ { ...p, apiKey: expand(p.apiKey), baseUrl: expand(p.baseUrl) },
182
+ ]))
183
+ : undefined;
184
+ return {
185
+ ...config,
186
+ llm: {
187
+ ...config.llm,
188
+ apiKey: expand(config.llm.apiKey),
189
+ baseUrl: expand(config.llm.baseUrl),
190
+ providers: expandedProviders,
191
+ },
192
+ };
193
+ }
194
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Agent 行为评估类型定义
3
+ *
4
+ * 定义 EvalScenario 类型,用于 Agent 行为回归测试。
5
+ * 评估验证的是 Agent 的**行为决策**(工具调用、召回来源),
6
+ * 而非文本质量(文本质量由宿主项目用真实 LLM 评估)。
7
+ *
8
+ * 设计约束(详见 docs/agent-harness-增强方案-v1.0.md §3.5):
9
+ * - 仅使用 Mock LLM(MSW),不发起真实 API 调用
10
+ * - 评估运行在 CI 中,作为测试套件的一部分
11
+ * - 场景定义通用,不耦合任何领域逻辑
12
+ */
13
+ import type { AgentChunk } from '../agent/types.js';
14
+ /**
15
+ * 评估场景定义
16
+ *
17
+ * 每个场景描述一个输入 + 期望的 Agent 行为,
18
+ * 验证召回管线、工具调用决策、护栏效果等维度。
19
+ */
20
+ export interface EvalScenario {
21
+ /** 场景名称(用于测试报告) */
22
+ name: string;
23
+ /** 场景描述 */
24
+ description: string;
25
+ /** 用户输入 */
26
+ input: string;
27
+ /** 预设的召回记忆(模拟召回结果) */
28
+ recalledMemories?: Array<{
29
+ name: string;
30
+ content: string;
31
+ source: string;
32
+ }>;
33
+ /**
34
+ * 期望的行为特征
35
+ *
36
+ * 至少定义一项。所有检查项都通过才算场景通过。
37
+ */
38
+ expect: EvalExpectation;
39
+ }
40
+ /**
41
+ * 评估期望
42
+ *
43
+ * 定义 Agent 应该(或不应该)表现出的行为。
44
+ * 所有字段都是可选的——只检查有定义的字段。
45
+ */
46
+ export interface EvalExpectation {
47
+ /**
48
+ * 期望的工具调用名列表
49
+ *
50
+ * 如果定义,Agent 在对话过程中必须至少调用这些工具。
51
+ * 例如:['read_file', 'search_memories']
52
+ */
53
+ toolsCalled?: string[];
54
+ /**
55
+ * 不应调用的工具名列表
56
+ *
57
+ * 例如:不应调用 write_file 的只读场景
58
+ */
59
+ toolsNotCalled?: string[];
60
+ /**
61
+ * 期望的召回 source 分布
62
+ *
63
+ * 验证召回管线是否排除了应排除的 source 类型。
64
+ * 例如:{ 'rule': 0 } 表示不应召回 rule 类型的记忆
65
+ */
66
+ recallSources?: Record<string, number>;
67
+ /**
68
+ * 护栏阻断检查
69
+ *
70
+ * 如果为 true,期望输入被护栏规则阻断
71
+ */
72
+ guardrailBlocked?: boolean;
73
+ /**
74
+ * 工具调用次数范围
75
+ */
76
+ toolCallCount?: {
77
+ min?: number;
78
+ max?: number;
79
+ };
80
+ }
81
+ /**
82
+ * 评估结果
83
+ */
84
+ export interface EvalResult {
85
+ /** 场景名称 */
86
+ name: string;
87
+ /** 是否通过 */
88
+ passed: boolean;
89
+ /** 收集到的 Agent 行为数据 */
90
+ collected: {
91
+ toolsCalled: string[];
92
+ recallCount: number;
93
+ guardrailBlocked: boolean;
94
+ done: boolean;
95
+ };
96
+ /** 失败原因(如果未通过) */
97
+ failures: string[];
98
+ }
99
+ /**
100
+ * 从 AgentChunk 流中收集行为数据
101
+ *
102
+ * 消费 AgentLoop 的 AsyncGenerator 输出,
103
+ * 提取工具调用名、召回数量、护栏状态等关键信息。
104
+ *
105
+ * @param chunks AgentChunk 异步迭代器
106
+ * @returns 收集到的行为数据
107
+ */
108
+ export declare function collectAgentChunks(chunks: AsyncGenerator<AgentChunk, void, unknown>): Promise<EvalResult['collected']>;
109
+ /**
110
+ * 将收集到的行为数据与期望进行比对
111
+ *
112
+ * @param name 场景名称
113
+ * @param collected 收集到的行为数据
114
+ * @param expect 期望的行为特征
115
+ * @returns 评估结果
116
+ */
117
+ export declare function evaluateResult(name: string, collected: EvalResult['collected'], expect: EvalExpectation): EvalResult;
118
+ //# sourceMappingURL=evalTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evalTypes.d.ts","sourceRoot":"","sources":["../../src/eval/evalTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,KAAK,EAAE,MAAM,CAAC;IACd,sBAAsB;IACtB,gBAAgB,CAAC,EAAE,KAAK,CAAC;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH;;;;OAIG;IACH,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAEvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,aAAa,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,sBAAsB;IACtB,SAAS,EAAE;QACT,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,IAAI,EAAE,OAAO,CAAC;KACf,CAAC;IACF,kBAAkB;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,GAChD,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAgClC;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,EAClC,MAAM,EAAE,eAAe,GACtB,UAAU,CA+CZ"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Agent 行为评估类型定义
3
+ *
4
+ * 定义 EvalScenario 类型,用于 Agent 行为回归测试。
5
+ * 评估验证的是 Agent 的**行为决策**(工具调用、召回来源),
6
+ * 而非文本质量(文本质量由宿主项目用真实 LLM 评估)。
7
+ *
8
+ * 设计约束(详见 docs/agent-harness-增强方案-v1.0.md §3.5):
9
+ * - 仅使用 Mock LLM(MSW),不发起真实 API 调用
10
+ * - 评估运行在 CI 中,作为测试套件的一部分
11
+ * - 场景定义通用,不耦合任何领域逻辑
12
+ */
13
+ /**
14
+ * 从 AgentChunk 流中收集行为数据
15
+ *
16
+ * 消费 AgentLoop 的 AsyncGenerator 输出,
17
+ * 提取工具调用名、召回数量、护栏状态等关键信息。
18
+ *
19
+ * @param chunks AgentChunk 异步迭代器
20
+ * @returns 收集到的行为数据
21
+ */
22
+ export async function collectAgentChunks(chunks) {
23
+ const collected = {
24
+ toolsCalled: [],
25
+ recallCount: 0,
26
+ guardrailBlocked: false,
27
+ done: false,
28
+ };
29
+ for await (const chunk of chunks) {
30
+ switch (chunk.type) {
31
+ case 'recall':
32
+ // MS-12:recall chunk 改为携带 memories 数组,count 由数组长度得出
33
+ collected.recallCount = chunk.memories.length;
34
+ break;
35
+ case 'tool_start':
36
+ if (!collected.toolsCalled.includes(chunk.name)) {
37
+ collected.toolsCalled.push(chunk.name);
38
+ }
39
+ break;
40
+ case 'text':
41
+ // 检查护栏阻断/警告消息
42
+ if (chunk.content.includes('输入被护栏规则') || chunk.content.includes('输出被护栏规则')) {
43
+ collected.guardrailBlocked = true;
44
+ }
45
+ break;
46
+ case 'done':
47
+ collected.done = true;
48
+ break;
49
+ }
50
+ }
51
+ return collected;
52
+ }
53
+ /**
54
+ * 将收集到的行为数据与期望进行比对
55
+ *
56
+ * @param name 场景名称
57
+ * @param collected 收集到的行为数据
58
+ * @param expect 期望的行为特征
59
+ * @returns 评估结果
60
+ */
61
+ export function evaluateResult(name, collected, expect) {
62
+ const failures = [];
63
+ // 检查工具调用
64
+ if (expect.toolsCalled) {
65
+ for (const tool of expect.toolsCalled) {
66
+ if (!collected.toolsCalled.includes(tool)) {
67
+ failures.push(`期望调用工具 "${tool}",但未调用(已调用:${collected.toolsCalled.join(', ') || '无'})`);
68
+ }
69
+ }
70
+ }
71
+ // 检查不应调用的工具
72
+ if (expect.toolsNotCalled) {
73
+ for (const tool of expect.toolsNotCalled) {
74
+ if (collected.toolsCalled.includes(tool)) {
75
+ failures.push(`不应调用工具 "${tool}",但实际调用了`);
76
+ }
77
+ }
78
+ }
79
+ // 检查工具调用次数
80
+ if (expect.toolCallCount) {
81
+ const count = collected.toolsCalled.length;
82
+ if (expect.toolCallCount.min !== undefined && count < expect.toolCallCount.min) {
83
+ failures.push(`工具调用次数 ${count} < 期望最小值 ${expect.toolCallCount.min}`);
84
+ }
85
+ if (expect.toolCallCount.max !== undefined && count > expect.toolCallCount.max) {
86
+ failures.push(`工具调用次数 ${count} > 期望最大值 ${expect.toolCallCount.max}`);
87
+ }
88
+ }
89
+ // 检查护栏阻断
90
+ if (expect.guardrailBlocked !== undefined) {
91
+ if (expect.guardrailBlocked !== collected.guardrailBlocked) {
92
+ failures.push(`期望护栏阻断=${expect.guardrailBlocked},实际=${collected.guardrailBlocked}`);
93
+ }
94
+ }
95
+ return {
96
+ name,
97
+ passed: failures.length === 0,
98
+ collected,
99
+ failures,
100
+ };
101
+ }
102
+ //# sourceMappingURL=evalTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evalTypes.js","sourceRoot":"","sources":["../../src/eval/evalTypes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Memora — 通用 Agent 架构(纯逻辑库)
3
+ *
4
+ * 零 native 依赖。宿主项目通过注入 IMemoryStorage 实现持久化。
5
+ * CLI 由宿主项目提供(hosts/memora-sprite/)。
6
+ *
7
+ * 设计哲学:万物皆记忆(详见 architecture_philosophy_rules.md §1)
8
+ * 决策追溯:详见 .trae/rules/decisions/ 下的 ADR
9
+ */
10
+ export { Agent } from './agent/agent.js';
11
+ export type { AgentChunk, ThinkingPhase, UIMessages } from './agent/types.js';
12
+ export { AGENT_CONSTANTS, LOOP_CONSTANTS } from './agent/constants.js';
13
+ export type { AgentOptions, AgentContext, AgentProjectEntry, } from './agent/agent.js';
14
+ export { type AgentForkResult } from './agent/managers/sessionManager.js';
15
+ export type { ToolDefinition, ToolHandler, ToolContext, WriteExtensions } from './agent/toolExecutor.js';
16
+ export type { PersonaMode, Persona } from './persona/types.js';
17
+ export type { MemoryKeywords } from './agent/managers/insightExtractor.js';
18
+ export type { MemorySnapshot, WorkingMemorySnapshot, BootstrapSnapshot, ArchiveSnapshot, AgentSearchHit, AgentStats, SuggestOptions, SuggestHit, SourceHealthStatus, SourceHealthEntry, SourceHealthReport, } from './agent/managers/memoryInspector.js';
19
+ export type { ConfigSuggestion, ConfigSuggestionHandler } from './agent/managers/configManager.js';
20
+ export type { AutoConfigRefinerOptions } from './agent/managers/autoConfigRefiner.js';
21
+ export type { WorkProjectionEntry } from './agent/managers/workProjection.js';
22
+ export { loadConfig } from './config/loader.js';
23
+ export { createLlmProvider, createProviderFromConfig } from './llm/factory.js';
24
+ export type { ProviderConfig } from './llm/factory.js';
25
+ export type { LlmProvider, ChatOptions } from './llm/provider.js';
26
+ export type { LlmChunk } from './llm/types.js';
27
+ export type { Config } from './config/loader.js';
28
+ export { TypedEventEmitter } from './utils/eventEmitter.js';
29
+ export type { AgentEventMap, AgentEventName, AgentEventHandler } from './utils/eventEmitter.js';
30
+ export type { ITracer, ISpan, AgentMetrics } from './agent/tracer.js';
31
+ export { NOOP_TRACER, TRACE_SPANS } from './agent/tracer.js';
32
+ export { SOURCE_LABELS, inferSource, escapeLike, validateSource } from './memory/types.js';
33
+ export type { Memory, SourceValidationSeverity } from './memory/types.js';
34
+ export { RELATION_TYPES, RELATION_WEIGHTS } from './memory/types.js';
35
+ export type { MemoryRelation, RelationDirection } from './memory/types.js';
36
+ export type { IMemoryStorage } from './memory/storageInterface.js';
37
+ export { InMemoryStorage } from './memory/inMemoryStorage.js';
38
+ export type { IMemoryRelationStore } from './memory/relationStore.js';
39
+ export { InMemoryRelationStore } from './memory/inMemoryRelationStore.js';
40
+ export type { UserProfileEntry, ProfileCategory, ExtractedFact } from './memory/userProfile.js';
41
+ export { VectorStore } from './memory/vectorStore.js';
42
+ export type { EmbeddingService } from './memory/vectorStore.js';
43
+ export { EmbeddingProvider } from './llm/embedding.js';
44
+ export type { EmbeddingConfig, EmbeddingResult } from './llm/embedding.js';
45
+ export type { ISessionStore, SessionMessage } from './memory/sessionStore.js';
46
+ export type { ForkResult } from './agent/messageHistory.js';
47
+ export { recall, extractKeywords } from './memory/recall.js';
48
+ export type { RecallOptions } from './memory/recall.js';
49
+ export type { ILogger } from './logging/loggerInterface.js';
50
+ export { setLogger, logger } from './logging/logger.js';
51
+ export { segmentText, tokenizeKeywords } from './utils/segmenter.js';
52
+ export { parseFrontmatter, serializeFrontmatter } from './utils/frontmatter.js';
53
+ export { safeSetTimeout, safeSetInterval, clearSafeTimeout, clearSafeInterval } from './utils/safeTimer.js';
54
+ export type { SkillEntry, SkillMatch } from './skill/types.js';
55
+ export type { AuditEvent, AuditListener, Permission, WriteDecision, WriteConfirmationInfo, WriteConfirmationRequest, } from './security/pathGuard.js';
56
+ export { MemoraError, ToolErrorCode, isRetryableErrorCode } from './utils/errors.js';
57
+ export { toError } from './utils/toError.js';
58
+ export type { ToolErrorCodeValue } from './utils/errors.js';
59
+ export type { EvalScenario, EvalExpectation, EvalResult } from './eval/evalTypes.js';
60
+ export { collectAgentChunks, evaluateResult } from './eval/evalTypes.js';
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Memora — 通用 Agent 架构(纯逻辑库)
3
+ *
4
+ * 零 native 依赖。宿主项目通过注入 IMemoryStorage 实现持久化。
5
+ * CLI 由宿主项目提供(hosts/memora-sprite/)。
6
+ *
7
+ * 设计哲学:万物皆记忆(详见 architecture_philosophy_rules.md §1)
8
+ * 决策追溯:详见 .trae/rules/decisions/ 下的 ADR
9
+ */
10
+ // ─── 库导出:供宿主项目 import 接入 ──────────────────────
11
+ export { Agent } from './agent/agent.js';
12
+ export { AGENT_CONSTANTS, LOOP_CONSTANTS } from './agent/constants.js';
13
+ export { loadConfig } from './config/loader.js';
14
+ export { createLlmProvider, createProviderFromConfig } from './llm/factory.js';
15
+ // 事件系统
16
+ export { TypedEventEmitter } from './utils/eventEmitter.js';
17
+ export { NOOP_TRACER, TRACE_SPANS } from './agent/tracer.js';
18
+ // ─── 记忆层导出 ──────────────────────────────────────────
19
+ export { SOURCE_LABELS, inferSource, escapeLike, validateSource } from './memory/types.js';
20
+ // 记忆关系图谱(ADR-014 侧车模型)
21
+ export { RELATION_TYPES, RELATION_WEIGHTS } from './memory/types.js';
22
+ export { InMemoryStorage } from './memory/inMemoryStorage.js';
23
+ export { InMemoryRelationStore } from './memory/inMemoryRelationStore.js';
24
+ // 向量存储:宿主注入 EmbeddingService 后创建 VectorStore,传入 AgentOptions 启用语义搜索
25
+ export { VectorStore } from './memory/vectorStore.js';
26
+ // Embedding Provider:OpenAI 兼容 /embeddings 端点实现(满足 EmbeddingService 接口)
27
+ export { EmbeddingProvider } from './llm/embedding.js';
28
+ // 召回函数:简化关键词搜索
29
+ export { recall, extractKeywords } from './memory/recall.js';
30
+ export { setLogger, logger } from './logging/logger.js';
31
+ // ─── 工具导出 ────────────────────────────────────────────
32
+ // 分词工具:宿主项目(如 SqliteStorage)依赖
33
+ // 工具导出
34
+ export { segmentText, tokenizeKeywords } from './utils/segmenter.js';
35
+ // Frontmatter 解析/序列化:宿主项目(如 skillInstaller)依赖
36
+ export { parseFrontmatter, serializeFrontmatter } from './utils/frontmatter.js';
37
+ // 安全定时器:宿主主进程统一使用 safeSetTimeout/safeSetInterval 跟踪清理
38
+ export { safeSetTimeout, safeSetInterval, clearSafeTimeout, clearSafeInterval } from './utils/safeTimer.js';
39
+ // ─── 错误类型导出 ────────────────────────────────────────
40
+ export { MemoraError, ToolErrorCode, isRetryableErrorCode } from './utils/errors.js';
41
+ // toError 独立导出,浏览器端可直接 import 而不引入 logging(pino)依赖
42
+ export { toError } from './utils/toError.js';
43
+ export { collectAgentChunks, evaluateResult } from './eval/evalTypes.js';
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,iDAAiD;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA4BvE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAK/E,OAAO;AACP,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAK5D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE7D,uDAAuD;AACvD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE3F,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIrE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,oEAAoE;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,wEAAwE;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAMvD,eAAe;AACf,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAK7D,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAExD,wDAAwD;AACxD,+BAA+B;AAC/B,OAAO;AACP,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACrE,8CAA8C;AAC9C,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAChF,sDAAsD;AACtD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAc5G,sDAAsD;AACtD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACrF,mDAAmD;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAK7C,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Embedding 配置(与 OpenAICompatibleConfig 共用 baseUrl/apiKey)
3
+ */
4
+ export interface EmbeddingConfig {
5
+ baseUrl: string;
6
+ apiKey: string;
7
+ model: string;
8
+ }
9
+ /**
10
+ * 单条 embedding 结果
11
+ */
12
+ export interface EmbeddingResult {
13
+ /** 原始文本 */
14
+ text: string;
15
+ /** 向量(浮点数组,维度由模型决定) */
16
+ vector: number[];
17
+ }
18
+ /**
19
+ * Embedding Provider
20
+ *
21
+ * 调用 /embeddings 端点将文本转为向量
22
+ * 支持批量嵌入和本地缓存
23
+ */
24
+ export declare class EmbeddingProvider {
25
+ private readonly config;
26
+ /** 缓存最大条目数(LRU 上限,防止无界增长导致内存泄漏) */
27
+ private static readonly CACHE_MAX_SIZE;
28
+ /** 本地缓存:text → vector(LRU,Map 迭代顺序 = 最近访问顺序) */
29
+ private readonly cache;
30
+ constructor(config: EmbeddingConfig);
31
+ /**
32
+ * LRU 读取:命中时把条目移到末尾,标记为最近访问
33
+ * Map 保持插入顺序,末尾即最近访问,首部即最久未访问(淘汰候选)
34
+ */
35
+ private getCached;
36
+ /**
37
+ * LRU 写入:超过容量时淘汰最旧条目(首部)
38
+ */
39
+ private setCache;
40
+ /**
41
+ * 嵌入单条文本
42
+ * @param text 待嵌入的文本
43
+ * @returns 向量
44
+ */
45
+ embed(text: string): Promise<number[]>;
46
+ /**
47
+ * 批量嵌入多条文本
48
+ * OpenAI 兼容 API 支持一次请求嵌入多条文本,减少 API 调用
49
+ * @param texts 待嵌入的文本数组
50
+ * @returns 嵌入结果数组(顺序与输入一致)
51
+ */
52
+ batchEmbed(texts: string[]): Promise<EmbeddingResult[]>;
53
+ /**
54
+ * 获取缓存大小(调试用)
55
+ */
56
+ get cacheSize(): number;
57
+ /**
58
+ * 清空缓存
59
+ */
60
+ clearCache(): void;
61
+ }
62
+ //# sourceMappingURL=embedding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding.d.ts","sourceRoot":"","sources":["../../src/llm/embedding.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IAOhB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,mCAAmC;IACnC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAQ;IAE9C,gDAAgD;IAChD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAExB,MAAM,EAAE,eAAe;IAEpD;;;OAGG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAQhB;;;;OAIG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAW5C;;;;;OAKG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAkF7D;;OAEG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB"}