@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,122 @@
1
+ /**
2
+ * Agent 可观测性接口 — 零依赖的轻量 Span/Trace 抽象
3
+ *
4
+ * 定义 ITracer 和 ISpan 接口,让宿主项目注入 OpenTelemetry 等实现。
5
+ * 默认 NoopTracer 静默丢弃所有 span,不引入任何运行时开销。
6
+ *
7
+ * 设计约束(详见 ADR-001 · 运行时栈,零依赖原则):
8
+ * - 禁止直接 import OpenTelemetry SDK(违反零依赖原则)
9
+ * - Span 收集为 fire-and-forget,不阻塞 AgentLoop 主流程
10
+ * - Tracer 未注入时自动降级,不抛异常
11
+ *
12
+ * 使用方式:
13
+ * // 宿主侧(泊文等)
14
+ * const otelTracer = new OpenTelemetryTracer(tracerProvider); // 宿主实现 ITracer
15
+ * const agent = new Agent({ ..., tracer: otelTracer });
16
+ *
17
+ * // memora 内部
18
+ * const span = this.opts.tracer.startSpan('llm.call', { model: 'gpt-4o' });
19
+ * // ... LLM 调用 ...
20
+ * span.end();
21
+ */
22
+ /** Span 属性值类型 */
23
+ type SpanAttributeValue = string | number | boolean;
24
+ /** Span 接口 — 一次可观测操作的基本单元 */
25
+ export interface ISpan {
26
+ /** 设置 Span 属性(键值对元数据) */
27
+ setAttribute(key: string, value: SpanAttributeValue): void;
28
+ /** 标记 Span 结束 */
29
+ end(): void;
30
+ /** 记录异常(不中断 span,标记错误状态) */
31
+ recordException(error: Error): void;
32
+ }
33
+ /** Tracer 接口 — 宿主注入的可观测性实现 */
34
+ export interface ITracer {
35
+ /**
36
+ * 开始一个新的 Span
37
+ *
38
+ * @param name - Span 名称(如 'llm.call'、'tool.execute')
39
+ * @param attributes - 初始属性(可选)
40
+ * @returns ISpan 实例
41
+ */
42
+ startSpan(name: string, attributes?: Record<string, SpanAttributeValue>): ISpan;
43
+ }
44
+ /** NoopTracer 单例(在未注入 tracer 时使用) */
45
+ export declare const NOOP_TRACER: ITracer;
46
+ /**
47
+ * AgentLoop 关键节点的 Span 名称常量
48
+ *
49
+ * 供宿主项目按名称过滤 span 做监控面板。
50
+ */
51
+ export declare const TRACE_SPANS: {
52
+ /** 记忆召回阶段 */
53
+ readonly RECALL: "recall.recall";
54
+ /** LLM API 调用 */
55
+ readonly LLM_CALL: "llm.call";
56
+ /** 工具执行 */
57
+ readonly TOOL_EXEC: "tool.execute";
58
+ /** 最终响应生成 */
59
+ readonly RESPONSE: "response.generate";
60
+ /** 记忆衰减执行(R-103 新增,补全衰减可观测性缺口) */
61
+ readonly DECAY: "memory.decay";
62
+ };
63
+ /**
64
+ * Agent 运行时指标快照
65
+ *
66
+ * 由 Agent.getMetrics() 聚合 AgentLoop + Agent 两层指标产出,
67
+ * 供宿主项目构建监控面板或健康度诊断面板。
68
+ *
69
+ * 设计原则:
70
+ * - 纯只读快照——调用时不修改任何状态
71
+ * - 同步返回——不触发 LLM 或 IO
72
+ * - 累计值——指标从 Agent 初始化起累加,close() 后清零
73
+ *
74
+ * 分 5 个维度:LLM 调用、记忆召回、工具调用、上下文管理、记忆衰减。
75
+ */
76
+ export interface AgentMetrics {
77
+ /** LLM 调用相关指标 */
78
+ llm: {
79
+ /** LLM 调用总次数(含重试,每次 provider.chat 调用算一次) */
80
+ callCount: number;
81
+ /** 累计输入 token 数(基于 estimateTokens 粗略估算) */
82
+ totalInputTokens: number;
83
+ /** 累计输出 token 数(基于 estimateTokens 粗略估算) */
84
+ totalOutputTokens: number;
85
+ };
86
+ /** 记忆召回相关指标 */
87
+ recall: {
88
+ /** 召回总次数(每轮对话 processUserInput 算一次) */
89
+ totalCount: number;
90
+ /** 命中次数(召回结果非空算命中) */
91
+ hitCount: number;
92
+ /** 命中率(0-1,hitCount / totalCount,totalCount 为 0 时返回 0) */
93
+ hitRate: number;
94
+ };
95
+ /** 工具调用相关指标 */
96
+ tools: {
97
+ /** 工具调用总次数 */
98
+ callCount: number;
99
+ /** 工具调用失败次数(结果以 [ERR 开头) */
100
+ failureCount: number;
101
+ };
102
+ /** 上下文管理指标 */
103
+ context: {
104
+ /** 上下文截断次数(messages 超过 maxContextTokens 触发截断的次数) */
105
+ truncationCount: number;
106
+ /** 当前工作记忆消息数 */
107
+ messageCount: number;
108
+ /** 当前估算 token 数(基于 estimateTokens) */
109
+ estimatedTokens: number;
110
+ };
111
+ /** 记忆衰减指标(由 Agent 层填充,AgentLoop 层此字段为 null) */
112
+ decay: {
113
+ /** 衰减执行次数 */
114
+ runCount: number;
115
+ /** 累计衰减记忆数(score 被调低的记忆条数) */
116
+ totalDecayedCount: number;
117
+ /** 上次衰减时间(ISO 8601,null 表示从未执行过) */
118
+ lastRunAt: string | null;
119
+ } | null;
120
+ }
121
+ export {};
122
+ //# sourceMappingURL=tracer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/agent/tracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,iBAAiB;AACjB,KAAK,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAIpD,6BAA6B;AAC7B,MAAM,WAAW,KAAK;IACpB,yBAAyB;IACzB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC3D,iBAAiB;IACjB,GAAG,IAAI,IAAI,CAAC;IACZ,4BAA4B;IAC5B,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrC;AAID,8BAA8B;AAC9B,MAAM,WAAW,OAAO;IACtB;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAAG,KAAK,CAAC;CACjF;AA4BD,qCAAqC;AACrC,eAAO,MAAM,WAAW,EAAE,OAA0B,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,WAAW;IACtB,aAAa;;IAEb,iBAAiB;;IAEjB,WAAW;;IAEX,aAAa;;IAEb,kCAAkC;;CAE1B,CAAC;AAIX;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB;IACjB,GAAG,EAAE;QACH,4CAA4C;QAC5C,SAAS,EAAE,MAAM,CAAC;QAClB,2CAA2C;QAC3C,gBAAgB,EAAE,MAAM,CAAC;QACzB,2CAA2C;QAC3C,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,eAAe;IACf,MAAM,EAAE;QACN,uCAAuC;QACvC,UAAU,EAAE,MAAM,CAAC;QACnB,sBAAsB;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,0DAA0D;QAC1D,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,eAAe;IACf,KAAK,EAAE;QACL,cAAc;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,4BAA4B;QAC5B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,cAAc;IACd,OAAO,EAAE;QACP,oDAAoD;QACpD,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,sCAAsC;QACtC,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,+CAA+C;IAC/C,KAAK,EAAE;QACL,aAAa;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,8BAA8B;QAC9B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,oCAAoC;QACpC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,GAAG,IAAI,CAAC;CACV"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Agent 可观测性接口 — 零依赖的轻量 Span/Trace 抽象
3
+ *
4
+ * 定义 ITracer 和 ISpan 接口,让宿主项目注入 OpenTelemetry 等实现。
5
+ * 默认 NoopTracer 静默丢弃所有 span,不引入任何运行时开销。
6
+ *
7
+ * 设计约束(详见 ADR-001 · 运行时栈,零依赖原则):
8
+ * - 禁止直接 import OpenTelemetry SDK(违反零依赖原则)
9
+ * - Span 收集为 fire-and-forget,不阻塞 AgentLoop 主流程
10
+ * - Tracer 未注入时自动降级,不抛异常
11
+ *
12
+ * 使用方式:
13
+ * // 宿主侧(泊文等)
14
+ * const otelTracer = new OpenTelemetryTracer(tracerProvider); // 宿主实现 ITracer
15
+ * const agent = new Agent({ ..., tracer: otelTracer });
16
+ *
17
+ * // memora 内部
18
+ * const span = this.opts.tracer.startSpan('llm.call', { model: 'gpt-4o' });
19
+ * // ... LLM 调用 ...
20
+ * span.end();
21
+ */
22
+ // ─── Noop 实现(默认,零开销)───────────────────────
23
+ /** 空 Span 实现(静默丢弃所有操作) */
24
+ class NoopSpan {
25
+ setAttribute(_key, _value) {
26
+ // noop
27
+ }
28
+ end() {
29
+ // noop
30
+ }
31
+ recordException(_error) {
32
+ // noop
33
+ }
34
+ }
35
+ /** 空 Tracer 实现(始终返回 NoopSpan) */
36
+ class NoopTracer {
37
+ startSpan(_name, _attributes) {
38
+ // 共享同一个 NoopSpan 实例,避免分配开销
39
+ return NOOP_SPAN;
40
+ }
41
+ }
42
+ /** 共享的 NoopSpan 单例(避免每次 startSpan 分配新对象) */
43
+ const NOOP_SPAN = new NoopSpan();
44
+ /** NoopTracer 单例(在未注入 tracer 时使用) */
45
+ export const NOOP_TRACER = new NoopTracer();
46
+ // ─── AgentLoop 预定义 Span 名称 ─────────────────────
47
+ /**
48
+ * AgentLoop 关键节点的 Span 名称常量
49
+ *
50
+ * 供宿主项目按名称过滤 span 做监控面板。
51
+ */
52
+ export const TRACE_SPANS = {
53
+ /** 记忆召回阶段 */
54
+ RECALL: 'recall.recall',
55
+ /** LLM API 调用 */
56
+ LLM_CALL: 'llm.call',
57
+ /** 工具执行 */
58
+ TOOL_EXEC: 'tool.execute',
59
+ /** 最终响应生成 */
60
+ RESPONSE: 'response.generate',
61
+ /** 记忆衰减执行(R-103 新增,补全衰减可观测性缺口) */
62
+ DECAY: 'memory.decay',
63
+ };
64
+ //# sourceMappingURL=tracer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../src/agent/tracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAiCH,6CAA6C;AAE7C,0BAA0B;AAC1B,MAAM,QAAQ;IACZ,YAAY,CAAC,IAAY,EAAE,MAA0B;QACnD,OAAO;IACT,CAAC;IACD,GAAG;QACD,OAAO;IACT,CAAC;IACD,eAAe,CAAC,MAAa;QAC3B,OAAO;IACT,CAAC;CACF;AAED,iCAAiC;AACjC,MAAM,UAAU;IACd,SAAS,CAAC,KAAa,EAAE,WAAgD;QACvE,2BAA2B;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAED,4CAA4C;AAC5C,MAAM,SAAS,GAAG,IAAI,QAAQ,EAAE,CAAC;AAEjC,qCAAqC;AACrC,MAAM,CAAC,MAAM,WAAW,GAAY,IAAI,UAAU,EAAE,CAAC;AAErD,kDAAkD;AAElD;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,aAAa;IACb,MAAM,EAAE,eAAe;IACvB,iBAAiB;IACjB,QAAQ,EAAE,UAAU;IACpB,WAAW;IACX,SAAS,EAAE,cAAc;IACzB,aAAa;IACb,QAAQ,EAAE,mBAAmB;IAC7B,kCAAkC;IAClC,KAAK,EAAE,cAAc;CACb,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Agent 流式输出事件类型
3
+ *
4
+ * 核心库向上层 emit 结构化事件,让 CLI/Web/TUI 等宿主项目
5
+ * 能区分"思考中"、"输出文本"、"调用工具"等阶段,给用户实时反馈。
6
+ *
7
+ * 自然生长原则:这是核心库的"机制"——所有宿主项目都需要进度反馈,
8
+ * 不是 demo 的"策略"。
9
+ *
10
+ * thinking 事件的 phase 取值:
11
+ * - 'recalling':正在召回会话记忆(recall 双通道:语义 + 关键词)
12
+ * - 'processing':正在写入历史/注入技能 prompt
13
+ * - 'archiving':正在归档用户画像/匹配角色/匹配技能
14
+ *
15
+ * error 事件:流式过程中发生错误(如 LLM 超时、连接断开),
16
+ * 替代裸 throw 让宿主能优雅展示错误并清理 UI(避免未处理 rejection 静默卡死)。
17
+ */
18
+ /** thinking 事件的阶段标识 */
19
+ export type ThinkingPhase = 'recalling' | 'processing' | 'archiving';
20
+ /**
21
+ * 召回记忆摘要(用于 UI 展示"召回透明度")
22
+ *
23
+ * 仅暴露 UI 展示所需字段,不包含 content(避免向 UI 层泄露完整记忆内容)。
24
+ * - name:可读名称,点击跳转记忆详情
25
+ * - score:相似度分数(0-1),展示召回质量
26
+ * - source:来源标签,可选展示(如 rule/insight/profile)
27
+ */
28
+ export interface RecalledMemorySummary {
29
+ /** 记忆可读名称(点击跳转记忆详情用) */
30
+ name: string;
31
+ /** 相似度分数(0-1) */
32
+ score: number;
33
+ /** 来源标签(开放字符串,如 'rule'、'insight'、'profile') */
34
+ source: string;
35
+ }
36
+ export type AgentChunk = {
37
+ type: 'recall';
38
+ memories: RecalledMemorySummary[];
39
+ } | {
40
+ type: 'thinking';
41
+ phase: ThinkingPhase;
42
+ } | {
43
+ type: 'text';
44
+ content: string;
45
+ } | {
46
+ type: 'tool_start';
47
+ toolCallId: string;
48
+ name: string;
49
+ args?: string;
50
+ } | {
51
+ type: 'tool_result';
52
+ toolCallId: string;
53
+ name: string;
54
+ ok: boolean;
55
+ summary?: string;
56
+ } | {
57
+ type: 'aborted';
58
+ reason: string;
59
+ } | {
60
+ type: 'error';
61
+ message: string;
62
+ } | {
63
+ type: 'done';
64
+ };
65
+ /**
66
+ * 宿主可覆盖的 UI 消息文本
67
+ *
68
+ * 核心库内置英文默认值,宿主可通过 AgentOptions.messages
69
+ * 覆盖为任意语言(中文/日文/自定义)。
70
+ *
71
+ * 遵循领域无关原则:核心库不耦合特定语言。
72
+ */
73
+ export interface UIMessages {
74
+ /** 对话取消提示(默认 "User cancelled the conversation") */
75
+ abortedByUser?: string;
76
+ /** 达到最大迭代次数提示(默认 "\n\n[Max iterations reached]") */
77
+ maxIterationsReached?: string;
78
+ /**
79
+ * 上下文窗口截断提示生成函数
80
+ * @param skipped 被裁剪的消息数
81
+ * @param kept 保留的消息数
82
+ * @returns 系统消息内容
83
+ */
84
+ contextTruncated?: (skipped: number, kept: number) => string;
85
+ /** 最近对话标签(默认 "[Recent conversation]") */
86
+ recentConversationLabel?: string;
87
+ /** 用户角色标签(默认 "User") */
88
+ userLabel?: string;
89
+ /** 助手角色标签(默认 "Assistant") */
90
+ assistantLabel?: string;
91
+ /** 护栏阻断提示模板({rule} 会被替换为规则名) */
92
+ inputBlockedByGuard?: (rule: string) => string;
93
+ /** 护栏警告前缀(默认 "[Guardrail Warning]") */
94
+ guardrailWarningPrefix?: string;
95
+ /** 输出被护栏阻断提示模板 */
96
+ outputBlockedByGuard?: (rule: string) => string;
97
+ }
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,uBAAuB;AACvB,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,qBAAqB,EAAE,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,aAAa,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACxF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAIrB;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC7D,yCAAyC;IACzC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,uCAAuC;IACvC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB;IAClB,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACjD"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Agent 流式输出事件类型
3
+ *
4
+ * 核心库向上层 emit 结构化事件,让 CLI/Web/TUI 等宿主项目
5
+ * 能区分"思考中"、"输出文本"、"调用工具"等阶段,给用户实时反馈。
6
+ *
7
+ * 自然生长原则:这是核心库的"机制"——所有宿主项目都需要进度反馈,
8
+ * 不是 demo 的"策略"。
9
+ *
10
+ * thinking 事件的 phase 取值:
11
+ * - 'recalling':正在召回会话记忆(recall 双通道:语义 + 关键词)
12
+ * - 'processing':正在写入历史/注入技能 prompt
13
+ * - 'archiving':正在归档用户画像/匹配角色/匹配技能
14
+ *
15
+ * error 事件:流式过程中发生错误(如 LLM 超时、连接断开),
16
+ * 替代裸 throw 让宿主能优雅展示错误并清理 UI(避免未处理 rejection 静默卡死)。
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,229 @@
1
+ import { z } from 'zod';
2
+ declare const ConfigSchema: z.ZodObject<{
3
+ llm: z.ZodObject<{
4
+ provider: z.ZodDefault<z.ZodString>;
5
+ model: z.ZodDefault<z.ZodString>;
6
+ baseUrl: z.ZodOptional<z.ZodString>;
7
+ apiKey: z.ZodOptional<z.ZodString>;
8
+ temperature: z.ZodDefault<z.ZodNumber>;
9
+ /**
10
+ * 多 Provider 映射表
11
+ *
12
+ * key 为 Provider 别名(如 "deepseek"、"openai"),value 为 Provider 配置。
13
+ * 配置后,旧扁平字段(provider/model/baseUrl/apiKey)被忽略。
14
+ * 不配置时回退到旧的单 provider 行为——完全向后兼容。
15
+ */
16
+ providers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
17
+ provider: z.ZodString;
18
+ model: z.ZodString;
19
+ baseUrl: z.ZodOptional<z.ZodString>;
20
+ apiKey: z.ZodOptional<z.ZodString>;
21
+ }, "strip", z.ZodTypeAny, {
22
+ model: string;
23
+ provider: string;
24
+ apiKey?: string | undefined;
25
+ baseUrl?: string | undefined;
26
+ }, {
27
+ model: string;
28
+ provider: string;
29
+ apiKey?: string | undefined;
30
+ baseUrl?: string | undefined;
31
+ }>>>;
32
+ /**
33
+ * 当前激活的 Provider 别名
34
+ *
35
+ * 必须与 providers 中的某个 key 一致。
36
+ * 不配置时默认使用 providers 的第一个 key。
37
+ */
38
+ active: z.ZodOptional<z.ZodString>;
39
+ /**
40
+ * 后台通道配置(多 Provider 路由预留)
41
+ *
42
+ * 不配时所有消费者复用前台(llm)配置——零破坏性,完全向后兼容。
43
+ * 配置后,归档/投影/画像等后台操作使用此通道,降低成本。
44
+ * 详见接入指南 §九
45
+ */
46
+ background: z.ZodOptional<z.ZodObject<{
47
+ provider: z.ZodString;
48
+ model: z.ZodString;
49
+ baseUrl: z.ZodOptional<z.ZodString>;
50
+ apiKey: z.ZodOptional<z.ZodString>;
51
+ temperature: z.ZodDefault<z.ZodNumber>;
52
+ }, "strip", z.ZodTypeAny, {
53
+ temperature: number;
54
+ model: string;
55
+ provider: string;
56
+ apiKey?: string | undefined;
57
+ baseUrl?: string | undefined;
58
+ }, {
59
+ model: string;
60
+ provider: string;
61
+ apiKey?: string | undefined;
62
+ temperature?: number | undefined;
63
+ baseUrl?: string | undefined;
64
+ }>>;
65
+ }, "strip", z.ZodTypeAny, {
66
+ temperature: number;
67
+ model: string;
68
+ provider: string;
69
+ background?: {
70
+ temperature: number;
71
+ model: string;
72
+ provider: string;
73
+ apiKey?: string | undefined;
74
+ baseUrl?: string | undefined;
75
+ } | undefined;
76
+ apiKey?: string | undefined;
77
+ baseUrl?: string | undefined;
78
+ providers?: Record<string, {
79
+ model: string;
80
+ provider: string;
81
+ apiKey?: string | undefined;
82
+ baseUrl?: string | undefined;
83
+ }> | undefined;
84
+ active?: string | undefined;
85
+ }, {
86
+ background?: {
87
+ model: string;
88
+ provider: string;
89
+ apiKey?: string | undefined;
90
+ temperature?: number | undefined;
91
+ baseUrl?: string | undefined;
92
+ } | undefined;
93
+ apiKey?: string | undefined;
94
+ temperature?: number | undefined;
95
+ model?: string | undefined;
96
+ provider?: string | undefined;
97
+ baseUrl?: string | undefined;
98
+ providers?: Record<string, {
99
+ model: string;
100
+ provider: string;
101
+ apiKey?: string | undefined;
102
+ baseUrl?: string | undefined;
103
+ }> | undefined;
104
+ active?: string | undefined;
105
+ }>;
106
+ memory: z.ZodObject<{
107
+ dataDir: z.ZodDefault<z.ZodString>;
108
+ maxContextTokens: z.ZodDefault<z.ZodNumber>;
109
+ }, "strip", z.ZodTypeAny, {
110
+ maxContextTokens: number;
111
+ dataDir: string;
112
+ }, {
113
+ maxContextTokens?: number | undefined;
114
+ dataDir?: string | undefined;
115
+ }>;
116
+ security: z.ZodObject<{
117
+ permission: z.ZodDefault<z.ZodEnum<["owner", "guest"]>>;
118
+ confirmWrites: z.ZodDefault<z.ZodBoolean>;
119
+ }, "strip", z.ZodTypeAny, {
120
+ permission: "owner" | "guest";
121
+ confirmWrites: boolean;
122
+ }, {
123
+ permission?: "owner" | "guest" | undefined;
124
+ confirmWrites?: boolean | undefined;
125
+ }>;
126
+ allowedPaths: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
127
+ persona: z.ZodOptional<z.ZodString>;
128
+ /**
129
+ * Embedding 配置(可选,配置后启用向量语义召回)
130
+ *
131
+ * 复用 OpenAI 兼容协议的 /embeddings 端点。
132
+ * 不配置时降级为纯关键词召回(当前行为)。
133
+ */
134
+ embedding: z.ZodOptional<z.ZodObject<{
135
+ model: z.ZodString;
136
+ baseUrl: z.ZodOptional<z.ZodString>;
137
+ apiKey: z.ZodOptional<z.ZodString>;
138
+ }, "strip", z.ZodTypeAny, {
139
+ model: string;
140
+ apiKey?: string | undefined;
141
+ baseUrl?: string | undefined;
142
+ }, {
143
+ model: string;
144
+ apiKey?: string | undefined;
145
+ baseUrl?: string | undefined;
146
+ }>>;
147
+ }, "strip", z.ZodTypeAny, {
148
+ llm: {
149
+ temperature: number;
150
+ model: string;
151
+ provider: string;
152
+ background?: {
153
+ temperature: number;
154
+ model: string;
155
+ provider: string;
156
+ apiKey?: string | undefined;
157
+ baseUrl?: string | undefined;
158
+ } | undefined;
159
+ apiKey?: string | undefined;
160
+ baseUrl?: string | undefined;
161
+ providers?: Record<string, {
162
+ model: string;
163
+ provider: string;
164
+ apiKey?: string | undefined;
165
+ baseUrl?: string | undefined;
166
+ }> | undefined;
167
+ active?: string | undefined;
168
+ };
169
+ security: {
170
+ permission: "owner" | "guest";
171
+ confirmWrites: boolean;
172
+ };
173
+ memory: {
174
+ maxContextTokens: number;
175
+ dataDir: string;
176
+ };
177
+ allowedPaths: string[];
178
+ persona?: string | undefined;
179
+ embedding?: {
180
+ model: string;
181
+ apiKey?: string | undefined;
182
+ baseUrl?: string | undefined;
183
+ } | undefined;
184
+ }, {
185
+ llm: {
186
+ background?: {
187
+ model: string;
188
+ provider: string;
189
+ apiKey?: string | undefined;
190
+ temperature?: number | undefined;
191
+ baseUrl?: string | undefined;
192
+ } | undefined;
193
+ apiKey?: string | undefined;
194
+ temperature?: number | undefined;
195
+ model?: string | undefined;
196
+ provider?: string | undefined;
197
+ baseUrl?: string | undefined;
198
+ providers?: Record<string, {
199
+ model: string;
200
+ provider: string;
201
+ apiKey?: string | undefined;
202
+ baseUrl?: string | undefined;
203
+ }> | undefined;
204
+ active?: string | undefined;
205
+ };
206
+ security: {
207
+ permission?: "owner" | "guest" | undefined;
208
+ confirmWrites?: boolean | undefined;
209
+ };
210
+ memory: {
211
+ maxContextTokens?: number | undefined;
212
+ dataDir?: string | undefined;
213
+ };
214
+ persona?: string | undefined;
215
+ allowedPaths?: string[] | undefined;
216
+ embedding?: {
217
+ model: string;
218
+ apiKey?: string | undefined;
219
+ baseUrl?: string | undefined;
220
+ } | undefined;
221
+ }>;
222
+ export type Config = z.infer<typeof ConfigSchema>;
223
+ /**
224
+ * 加载配置
225
+ * @param configPath 显式指定的配置文件路径
226
+ */
227
+ export declare function loadConfig(configPath?: string): Promise<Config>;
228
+ export {};
229
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAcxB,QAAA,MAAM,YAAY;;;;;;;QAQd;;;;;;WAMG;;;;;;;;;;;;;;;;;QAEH;;;;;WAKG;;QAEH;;;;;;WAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuBL;;;;;OAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQH,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAqBlD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BrE"}