@zooique/memora 0.3.0 → 2.0.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 (188) hide show
  1. package/README.md +8 -8
  2. package/dist/agent/agent.d.ts +69 -92
  3. package/dist/agent/agent.d.ts.map +1 -1
  4. package/dist/agent/agent.js +267 -197
  5. package/dist/agent/agent.js.map +1 -1
  6. package/dist/agent/assembler.d.ts +3 -0
  7. package/dist/agent/assembler.d.ts.map +1 -1
  8. package/dist/agent/assembler.js +14 -4
  9. package/dist/agent/assembler.js.map +1 -1
  10. package/dist/agent/builtinToolHandlers.d.ts +1 -1
  11. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  12. package/dist/agent/builtinToolHandlers.js +5 -4
  13. package/dist/agent/builtinToolHandlers.js.map +1 -1
  14. package/dist/agent/guardrail.d.ts +47 -0
  15. package/dist/agent/guardrail.d.ts.map +1 -0
  16. package/dist/agent/guardrail.js +51 -0
  17. package/dist/agent/guardrail.js.map +1 -0
  18. package/dist/agent/loop.d.ts +79 -18
  19. package/dist/agent/loop.d.ts.map +1 -1
  20. package/dist/agent/loop.js +317 -231
  21. package/dist/agent/loop.js.map +1 -1
  22. package/dist/agent/managers/chatLockManager.d.ts +116 -0
  23. package/dist/agent/managers/chatLockManager.d.ts.map +1 -0
  24. package/dist/agent/managers/chatLockManager.js +191 -0
  25. package/dist/agent/managers/chatLockManager.js.map +1 -0
  26. package/dist/agent/managers/insightExtractor.d.ts +34 -69
  27. package/dist/agent/managers/insightExtractor.d.ts.map +1 -1
  28. package/dist/agent/managers/insightExtractor.js +133 -189
  29. package/dist/agent/managers/insightExtractor.js.map +1 -1
  30. package/dist/agent/managers/memoryAdvisor.d.ts +102 -2
  31. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
  32. package/dist/agent/managers/memoryAdvisor.js +262 -4
  33. package/dist/agent/managers/memoryAdvisor.js.map +1 -1
  34. package/dist/agent/managers/memoryDecayScheduler.d.ts +85 -0
  35. package/dist/agent/managers/memoryDecayScheduler.d.ts.map +1 -1
  36. package/dist/agent/managers/memoryDecayScheduler.js +215 -0
  37. package/dist/agent/managers/memoryDecayScheduler.js.map +1 -1
  38. package/dist/agent/managers/memoryInspector.d.ts +230 -64
  39. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  40. package/dist/agent/managers/memoryInspector.js +439 -81
  41. package/dist/agent/managers/memoryInspector.js.map +1 -1
  42. package/dist/agent/managers/relationBuilder.d.ts +131 -0
  43. package/dist/agent/managers/relationBuilder.d.ts.map +1 -0
  44. package/dist/agent/managers/relationBuilder.js +192 -0
  45. package/dist/agent/managers/relationBuilder.js.map +1 -0
  46. package/dist/agent/managers/sessionArchiver.d.ts +6 -0
  47. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  48. package/dist/agent/managers/sessionArchiver.js +68 -8
  49. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  50. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  51. package/dist/agent/managers/sessionManager.js +9 -17
  52. package/dist/agent/managers/sessionManager.js.map +1 -1
  53. package/dist/agent/managers/textPolishManager.d.ts +62 -0
  54. package/dist/agent/managers/textPolishManager.d.ts.map +1 -0
  55. package/dist/agent/managers/textPolishManager.js +99 -0
  56. package/dist/agent/managers/textPolishManager.js.map +1 -0
  57. package/dist/agent/personaMatcher.d.ts +29 -0
  58. package/dist/agent/personaMatcher.d.ts.map +1 -0
  59. package/dist/agent/personaMatcher.js +60 -0
  60. package/dist/agent/personaMatcher.js.map +1 -0
  61. package/dist/agent/toolExecutor.d.ts +2 -2
  62. package/dist/agent/toolExecutor.d.ts.map +1 -1
  63. package/dist/agent/toolExecutor.js +2 -1
  64. package/dist/agent/toolExecutor.js.map +1 -1
  65. package/dist/agent/tracer.d.ts +31 -0
  66. package/dist/agent/tracer.d.ts.map +1 -1
  67. package/dist/agent/tracer.js +31 -0
  68. package/dist/agent/tracer.js.map +1 -1
  69. package/dist/agent/types.d.ts +132 -0
  70. package/dist/agent/types.d.ts.map +1 -1
  71. package/dist/agent/types.js +38 -0
  72. package/dist/agent/types.js.map +1 -1
  73. package/dist/config/loader.d.ts +52 -40
  74. package/dist/config/loader.d.ts.map +1 -1
  75. package/dist/config/loader.js +52 -32
  76. package/dist/config/loader.js.map +1 -1
  77. package/dist/eval/evalRunner.d.ts +94 -0
  78. package/dist/eval/evalRunner.d.ts.map +1 -0
  79. package/dist/eval/evalRunner.js +141 -0
  80. package/dist/eval/evalRunner.js.map +1 -0
  81. package/dist/eval/evalTypes.d.ts +33 -3
  82. package/dist/eval/evalTypes.d.ts.map +1 -1
  83. package/dist/eval/evalTypes.js +18 -2
  84. package/dist/eval/evalTypes.js.map +1 -1
  85. package/dist/eval/scenarios.d.ts +33 -0
  86. package/dist/eval/scenarios.d.ts.map +1 -0
  87. package/dist/eval/scenarios.js +109 -0
  88. package/dist/eval/scenarios.js.map +1 -0
  89. package/dist/index.d.ts +51 -9
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +46 -6
  92. package/dist/index.js.map +1 -1
  93. package/dist/llm/abortSignal.d.ts +27 -0
  94. package/dist/llm/abortSignal.d.ts.map +1 -0
  95. package/dist/llm/abortSignal.js +44 -0
  96. package/dist/llm/abortSignal.js.map +1 -0
  97. package/dist/llm/embedding.d.ts +7 -2
  98. package/dist/llm/embedding.d.ts.map +1 -1
  99. package/dist/llm/embedding.js +66 -46
  100. package/dist/llm/embedding.js.map +1 -1
  101. package/dist/llm/factory.js +1 -1
  102. package/dist/llm/factory.js.map +1 -1
  103. package/dist/llm/openaiCompatible.d.ts.map +1 -1
  104. package/dist/llm/openaiCompatible.js +26 -27
  105. package/dist/llm/openaiCompatible.js.map +1 -1
  106. package/dist/llm/provider.d.ts +0 -14
  107. package/dist/llm/provider.d.ts.map +1 -1
  108. package/dist/llm/provider.js.map +1 -1
  109. package/dist/logging/logger.d.ts +1 -0
  110. package/dist/logging/logger.d.ts.map +1 -1
  111. package/dist/logging/logger.js +43 -37
  112. package/dist/logging/logger.js.map +1 -1
  113. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  114. package/dist/memory/inMemoryStorage.js +8 -7
  115. package/dist/memory/inMemoryStorage.js.map +1 -1
  116. package/dist/memory/lockManager.d.ts +48 -0
  117. package/dist/memory/lockManager.d.ts.map +1 -0
  118. package/dist/memory/lockManager.js +159 -0
  119. package/dist/memory/lockManager.js.map +1 -0
  120. package/dist/memory/projectManager.d.ts +23 -53
  121. package/dist/memory/projectManager.d.ts.map +1 -1
  122. package/dist/memory/projectManager.js +46 -227
  123. package/dist/memory/projectManager.js.map +1 -1
  124. package/dist/memory/projectRegistry.d.ts +62 -0
  125. package/dist/memory/projectRegistry.d.ts.map +1 -0
  126. package/dist/memory/projectRegistry.js +158 -0
  127. package/dist/memory/projectRegistry.js.map +1 -0
  128. package/dist/memory/recall.d.ts +3 -3
  129. package/dist/memory/recall.d.ts.map +1 -1
  130. package/dist/memory/recall.js +3 -3
  131. package/dist/memory/recall.js.map +1 -1
  132. package/dist/memory/sourceValidation.d.ts +49 -0
  133. package/dist/memory/sourceValidation.d.ts.map +1 -0
  134. package/dist/memory/sourceValidation.js +141 -0
  135. package/dist/memory/sourceValidation.js.map +1 -0
  136. package/dist/memory/store.d.ts.map +1 -1
  137. package/dist/memory/store.js +2 -1
  138. package/dist/memory/store.js.map +1 -1
  139. package/dist/memory/types.d.ts +0 -47
  140. package/dist/memory/types.d.ts.map +1 -1
  141. package/dist/memory/types.js +0 -138
  142. package/dist/memory/types.js.map +1 -1
  143. package/dist/memory/vectorStore.d.ts +82 -7
  144. package/dist/memory/vectorStore.d.ts.map +1 -1
  145. package/dist/memory/vectorStore.js +12 -8
  146. package/dist/memory/vectorStore.js.map +1 -1
  147. package/dist/persona/personaManager.d.ts +30 -4
  148. package/dist/persona/personaManager.d.ts.map +1 -1
  149. package/dist/persona/personaManager.js +47 -14
  150. package/dist/persona/personaManager.js.map +1 -1
  151. package/dist/security/pathGuard.d.ts.map +1 -1
  152. package/dist/security/pathGuard.js +3 -1
  153. package/dist/security/pathGuard.js.map +1 -1
  154. package/dist/skill/skillManager.d.ts.map +1 -1
  155. package/dist/skill/skillManager.js +2 -1
  156. package/dist/skill/skillManager.js.map +1 -1
  157. package/dist/utils/array.d.ts +24 -0
  158. package/dist/utils/array.d.ts.map +1 -0
  159. package/dist/utils/array.js +24 -0
  160. package/dist/utils/array.js.map +1 -0
  161. package/dist/utils/errors.d.ts +10 -8
  162. package/dist/utils/errors.d.ts.map +1 -1
  163. package/dist/utils/errors.js +12 -9
  164. package/dist/utils/errors.js.map +1 -1
  165. package/dist/utils/eventEmitter.d.ts +7 -0
  166. package/dist/utils/eventEmitter.d.ts.map +1 -1
  167. package/dist/utils/eventEmitter.js.map +1 -1
  168. package/dist/utils/objects.d.ts +17 -0
  169. package/dist/utils/objects.d.ts.map +1 -0
  170. package/dist/utils/objects.js +19 -0
  171. package/dist/utils/objects.js.map +1 -0
  172. package/dist/utils/segmenter.d.ts +17 -0
  173. package/dist/utils/segmenter.d.ts.map +1 -1
  174. package/dist/utils/segmenter.js +26 -0
  175. package/dist/utils/segmenter.js.map +1 -1
  176. package/dist/utils/strings.d.ts +22 -1
  177. package/dist/utils/strings.d.ts.map +1 -1
  178. package/dist/utils/strings.js +29 -1
  179. package/dist/utils/strings.js.map +1 -1
  180. package/dist/utils/time.d.ts +18 -3
  181. package/dist/utils/time.d.ts.map +1 -1
  182. package/dist/utils/time.js +24 -8
  183. package/dist/utils/time.js.map +1 -1
  184. package/dist/utils/toError.d.ts +8 -4
  185. package/dist/utils/toError.d.ts.map +1 -1
  186. package/dist/utils/toError.js +25 -5
  187. package/dist/utils/toError.js.map +1 -1
  188. package/package.json +11 -1
@@ -33,14 +33,6 @@ export declare const ToolErrorCode: {
33
33
  readonly PERMISSION_DENIED: "PERMISSION_DENIED";
34
34
  /** 工具参数错误(可重试 — LLM 可以修正参数格式) */
35
35
  readonly ARGUMENT_ERROR: "ARGUMENT_ERROR";
36
- /**
37
- * 工具执行超时(可重试)
38
- *
39
- * 预留错误码,当前无业务代码抛出。
40
- * 待 toolExecutor 实现工具执行超时机制后启用(如 Promise.race + AbortSignal)。
41
- * 保留在 RETRYABLE_ERROR_CODES 中以维持公共 API 契约稳定。
42
- */
43
- readonly TOOL_TIMEOUT: "TOOL_TIMEOUT";
44
36
  /** 用户拒绝写入(不可重试) */
45
37
  readonly WRITE_REJECTED: "WRITE_REJECTED";
46
38
  /** 目录不存在(可重试 — LLM 可能用错了路径) */
@@ -86,6 +78,16 @@ export declare class MemoraError extends Error {
86
78
  * 工厂:配置错误
87
79
  */
88
80
  export declare function configError(title: string, detail: string | undefined, suggestions: string[], cause?: Error): MemoraError;
81
+ /**
82
+ * 工厂:对话繁忙错误
83
+ *
84
+ * 用于 chat() 进行中时拒绝其他需要独占 Agent 的操作(切换项目/Provider/会话/重载配置等)。
85
+ * 12 处调用点统一使用此工厂,消除 `configError('对话繁忙', ...)` 的重复模板(ADR-017 枝叶层 2 次提取)。
86
+ *
87
+ * @param action 被拒绝的操作描述(如"切换项目"),拼接到"请等待其结束后再"之后
88
+ * @returns MemoraError(config 类别)
89
+ */
90
+ export declare function chatBusyError(action: string): MemoraError;
89
91
  /**
90
92
  * 工厂:网络错误
91
93
  */
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,KAAK,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAEpF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;IACxB,qBAAqB;;IAErB,+BAA+B;;IAE/B,iBAAiB;;IAEjB,iCAAiC;;IAEjC;;;;;;OAMG;;IAEH,mBAAmB;;IAEnB,+BAA+B;;IAE/B,yBAAyB;;IAEzB,qBAAqB;;IAErB,iBAAiB;;CAET,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAapF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAEtE;AAGD,UAAU,oBAAoB;IAC5B,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,qBAAqB;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;gBAEtB,IAAI,EAAE,oBAAoB;IAWtC;;OAEG;IACH,MAAM,IAAI,MAAM;CAYjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,EACb,SAAS,CAAC,EAAE,kBAAkB,GAC7B,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAG7C,KAAK,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAEpF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa;IACxB,qBAAqB;;IAErB,+BAA+B;;IAE/B,iBAAiB;;IAEjB,iCAAiC;;IAEjC,mBAAmB;;IAEnB,+BAA+B;;IAE/B,yBAAyB;;IAEzB,qBAAqB;;IAErB,iBAAiB;;CAET,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAYpF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAEtE;AAGD,UAAU,oBAAoB;IAC5B,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW;IACX,QAAQ,EAAE,aAAa,CAAC;IACxB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,qBAAqB;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;gBAEtB,IAAI,EAAE,oBAAoB;IAWtC;;OAEG;IACH,MAAM,IAAI,MAAM;CAYjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAMzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,EACb,SAAS,CAAC,EAAE,kBAAkB,GAC7B,WAAW,CAEb;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,KAAK,GACZ,WAAW,CAEb"}
@@ -34,14 +34,6 @@ export const ToolErrorCode = {
34
34
  PERMISSION_DENIED: 'PERMISSION_DENIED',
35
35
  /** 工具参数错误(可重试 — LLM 可以修正参数格式) */
36
36
  ARGUMENT_ERROR: 'ARGUMENT_ERROR',
37
- /**
38
- * 工具执行超时(可重试)
39
- *
40
- * 预留错误码,当前无业务代码抛出。
41
- * 待 toolExecutor 实现工具执行超时机制后启用(如 Promise.race + AbortSignal)。
42
- * 保留在 RETRYABLE_ERROR_CODES 中以维持公共 API 契约稳定。
43
- */
44
- TOOL_TIMEOUT: 'TOOL_TIMEOUT',
45
37
  /** 用户拒绝写入(不可重试) */
46
38
  WRITE_REJECTED: 'WRITE_REJECTED',
47
39
  /** 目录不存在(可重试 — LLM 可能用错了路径) */
@@ -59,7 +51,6 @@ export const ToolErrorCode = {
59
51
  const RETRYABLE_ERROR_CODES = new Set([
60
52
  ToolErrorCode.FILE_NOT_FOUND,
61
53
  ToolErrorCode.ARGUMENT_ERROR,
62
- ToolErrorCode.TOOL_TIMEOUT,
63
54
  ToolErrorCode.DIR_NOT_FOUND,
64
55
  ToolErrorCode.CUSTOM_TOOL_FAILED,
65
56
  ]);
@@ -107,6 +98,18 @@ export class MemoraError extends Error {
107
98
  export function configError(title, detail, suggestions, cause) {
108
99
  return new MemoraError({ title, detail, suggestions, category: 'config', cause });
109
100
  }
101
+ /**
102
+ * 工厂:对话繁忙错误
103
+ *
104
+ * 用于 chat() 进行中时拒绝其他需要独占 Agent 的操作(切换项目/Provider/会话/重载配置等)。
105
+ * 12 处调用点统一使用此工厂,消除 `configError('对话繁忙', ...)` 的重复模板(ADR-017 枝叶层 2 次提取)。
106
+ *
107
+ * @param action 被拒绝的操作描述(如"切换项目"),拼接到"请等待其结束后再"之后
108
+ * @returns MemoraError(config 类别)
109
+ */
110
+ export function chatBusyError(action) {
111
+ return configError('对话繁忙', `上一轮对话尚未完成,请等待其结束后再${action}`, ['等待上一轮 chat() 的 AsyncGenerator 耗尽(收到 done 事件)']);
112
+ }
110
113
  /**
111
114
  * 工厂:网络错误
112
115
  */
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,13 @@ export interface AgentEventMap {
49
49
  skill: string;
50
50
  score: number;
51
51
  };
52
+ /** 归档操作失败(fire-and-forget catch 分支发射,宿主可通知用户) */
53
+ archiveFailed: {
54
+ /** 失败阶段:profile(用户画像)/ insight(洞察提取) */
55
+ stage: 'profile' | 'insight';
56
+ /** 失败原因摘要(error.message,截断 200 字符避免 payload 过大) */
57
+ message: string;
58
+ };
52
59
  }
53
60
  /** 事件名联合类型 */
54
61
  export type AgentEventName = keyof AgentEventMap;
@@ -1 +1 @@
1
- {"version":3,"file":"eventEmitter.d.ts","sourceRoot":"","sources":["../../src/utils/eventEmitter.ts"],"names":[],"mappings":"AAaA,gCAAgC;AAChC,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,uBAAuB;IACvB,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,aAAa;IACb,cAAc,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,kCAAkC;IAClC,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,YAAY;IACZ,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,YAAY;IACZ,gBAAgB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,4CAA4C;IAC5C,gBAAgB,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IACvG,+BAA+B;IAC/B,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,+BAA+B;IAC/B,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED,cAAc;AACd,MAAM,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC;AAEjD,cAAc;AACd,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAEtD;;;;;GAKG;AACH,qBAAa,iBAAiB,CAAC,QAAQ,SAAS,MAAM;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoD;IAE9E;;;;OAIG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAS5F;;;;OAIG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAI7F;;;;OAIG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EACpC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GACpC,IAAI;IAQP;;;;OAIG;IACH,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IAYvF;;OAEG;IACH,SAAS,CAAC,kBAAkB,IAAI,IAAI;CAGrC"}
1
+ {"version":3,"file":"eventEmitter.d.ts","sourceRoot":"","sources":["../../src/utils/eventEmitter.ts"],"names":[],"mappings":"AAaA,gCAAgC;AAChC,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,uBAAuB;IACvB,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,aAAa;IACb,cAAc,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,kCAAkC;IAClC,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,YAAY;IACZ,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,YAAY;IACZ,gBAAgB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,4CAA4C;IAC5C,gBAAgB,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;IACvG,+BAA+B;IAC/B,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1E,+BAA+B;IAC/B,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,iDAAiD;IACjD,aAAa,EAAE;QACb,wCAAwC;QACxC,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC;QAC7B,mDAAmD;QACnD,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,cAAc;AACd,MAAM,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC;AAEjD,cAAc;AACd,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAEtD;;;;;GAKG;AACH,qBAAa,iBAAiB,CAAC,QAAQ,SAAS,MAAM;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoD;IAE9E;;;;OAIG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAS5F;;;;OAIG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI;IAI7F;;;;OAIG;IACH,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EACpC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,GACpC,IAAI;IAQP;;;;OAIG;IACH,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,MAAM,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI;IAYvF;;OAEG;IACH,SAAS,CAAC,kBAAkB,IAAI,IAAI;CAGrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"eventEmitter.js","sourceRoot":"","sources":["../../src/utils/eventEmitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AA8B7C;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACX,SAAS,GAAG,IAAI,GAAG,EAAyC,CAAC;IAE9E;;;;OAIG;IACH,EAAE,CAAoC,KAAQ,EAAE,OAAqC;QACnF,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,OAAmC,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAoC,KAAQ,EAAE,OAAqC;QACpF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAmC,CAAC,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACH,IAAI,CACF,KAAQ,EACR,OAAqC;QAErC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAiB,EAAE,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAuC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAiC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACO,IAAI,CAAoC,KAAQ,EAAE,OAAoB;QAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACnC,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACO,kBAAkB;QAC1B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF"}
1
+ {"version":3,"file":"eventEmitter.js","sourceRoot":"","sources":["../../src/utils/eventEmitter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAqC7C;;;;;GAKG;AACH,MAAM,OAAO,iBAAiB;IACX,SAAS,GAAG,IAAI,GAAG,EAAyC,CAAC;IAE9E;;;;OAIG;IACH,EAAE,CAAoC,KAAQ,EAAE,OAAqC;QACnF,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,OAAmC,CAAC,CAAC;IAC/C,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAoC,KAAQ,EAAE,OAAqC;QACpF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,OAAmC,CAAC,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACH,IAAI,CACF,KAAQ,EACR,OAAqC;QAErC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAiB,EAAE,EAAE;YACrC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAuC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAiC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACO,IAAI,CAAoC,KAAQ,EAAE,OAAoB;QAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QACnC,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACO,kBAAkB;QAC1B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 对象类型守卫工具函数
3
+ *
4
+ * 从 lockManager / projectRegistry / spriteConfig 提取的公共对象类型校验函数,
5
+ * 消除跨模块重复的类型守卫代码(ADR-017 枝叶层 2 次提取原则)。
6
+ */
7
+ /**
8
+ * 判断值是否为普通对象(非 null、非数组)
9
+ *
10
+ * 用于校验 JSON.parse 的结果,避免对非对象类型执行展开或属性访问。
11
+ * 三处原私有实现完全一致(lockManager / projectRegistry / spriteConfig)。
12
+ *
13
+ * @param value 待校验的值
14
+ * @returns true 表示是普通对象(类型收窄为 Record<string, unknown>)
15
+ */
16
+ export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
17
+ //# sourceMappingURL=objects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects.d.ts","sourceRoot":"","sources":["../../src/utils/objects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9E"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 对象类型守卫工具函数
3
+ *
4
+ * 从 lockManager / projectRegistry / spriteConfig 提取的公共对象类型校验函数,
5
+ * 消除跨模块重复的类型守卫代码(ADR-017 枝叶层 2 次提取原则)。
6
+ */
7
+ /**
8
+ * 判断值是否为普通对象(非 null、非数组)
9
+ *
10
+ * 用于校验 JSON.parse 的结果,避免对非对象类型执行展开或属性访问。
11
+ * 三处原私有实现完全一致(lockManager / projectRegistry / spriteConfig)。
12
+ *
13
+ * @param value 待校验的值
14
+ * @returns true 表示是普通对象(类型收窄为 Record<string, unknown>)
15
+ */
16
+ export function isPlainObject(value) {
17
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
18
+ }
19
+ //# sourceMappingURL=objects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects.js","sourceRoot":"","sources":["../../src/utils/objects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -15,4 +15,21 @@ export declare function scoreByKeywords(userInput: string, keywordList: string[]
15
15
  * @returns 分词数组(去标点、去空白、保留中英文 + 数字)
16
16
  */
17
17
  export declare function segmentText(text: string): string[];
18
+ /**
19
+ * 分词后小写化(文本预处理快捷方法)
20
+ *
21
+ * 组合 segmentText + toLowerCase,消除 6 处散落的 `.map((t) => t.toLowerCase())` 模式
22
+ * (ADR-017 枝叶层 2 次提取原则)。
23
+ * 用于关键词匹配/召回场景的文本预处理(大小写不敏感匹配)。
24
+ *
25
+ * @param text 原文
26
+ * @returns 分词后的小写 token 数组
27
+ */
28
+ export declare function segmentLower(text: string): string[];
29
+ /**
30
+ * 中文停用词集合
31
+ * 用于关键词提取时过滤无意义词汇(从 memory/types.ts 迁入,
32
+ * 因为停用词是分词/关键词提取的关注点,而非记忆类型定义)
33
+ */
34
+ export declare const STOPWORDS: Set<string>;
18
35
  //# sourceMappingURL=segmenter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"segmenter.d.ts","sourceRoot":"","sources":["../../src/utils/segmenter.ts"],"names":[],"mappings":"AAyCA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAehF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAclD"}
1
+ {"version":3,"file":"segmenter.d.ts","sourceRoot":"","sources":["../../src/utils/segmenter.ts"],"names":[],"mappings":"AAyCA;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAehF;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAclD;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEnD;AAED;;;;GAIG;AACH,eAAO,MAAM,SAAS,aAOpB,CAAC"}
@@ -82,4 +82,30 @@ export function segmentText(text) {
82
82
  }
83
83
  return tokens;
84
84
  }
85
+ /**
86
+ * 分词后小写化(文本预处理快捷方法)
87
+ *
88
+ * 组合 segmentText + toLowerCase,消除 6 处散落的 `.map((t) => t.toLowerCase())` 模式
89
+ * (ADR-017 枝叶层 2 次提取原则)。
90
+ * 用于关键词匹配/召回场景的文本预处理(大小写不敏感匹配)。
91
+ *
92
+ * @param text 原文
93
+ * @returns 分词后的小写 token 数组
94
+ */
95
+ export function segmentLower(text) {
96
+ return segmentText(text).map((t) => t.toLowerCase());
97
+ }
98
+ /**
99
+ * 中文停用词集合
100
+ * 用于关键词提取时过滤无意义词汇(从 memory/types.ts 迁入,
101
+ * 因为停用词是分词/关键词提取的关注点,而非记忆类型定义)
102
+ */
103
+ export const STOPWORDS = new Set([
104
+ '的', '了', '是', '在', '我', '有', '和', '就', '不', '人', '都',
105
+ '一', '一个', '上', '也', '很', '到', '说', '要', '去', '你', '会',
106
+ '着', '没有', '看', '好', '自己', '这', '那', '什么', '怎么', '可以',
107
+ '这个', '那个', '他们', '我们', '因为', '所以', '但是', '如果', '虽然',
108
+ '能', '把', '被', '让', '给', '对', '从', '为', '比', '与', '或',
109
+ '吗', '呢', '吧', '啊', '哦', '嗯', '呀', '哈',
110
+ ]);
85
111
  //# sourceMappingURL=segmenter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"segmenter.js","sourceRoot":"","sources":["../../src/utils/segmenter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;AAE1E;;;;;;;;;;;;;;GAcG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,0BAA0B;IAC1B,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC;IAClE,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;IAChC,QAAQ;IACR,MAAM,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;IAChC,4CAA4C;IAC5C,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,WAAqB;IACtE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEvC,MAAM,eAAe,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAEjD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACjF,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,2BAA2B;IAC3B,4BAA4B;IAC5B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"segmenter.js","sourceRoot":"","sources":["../../src/utils/segmenter.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,32 @@
8
8
  *
9
9
  * 规则:
10
10
  * - 冒号和空白替换为连字符
11
- * - 只保留字母、数字、中文、连字符、下划线
11
+ * - 只保留字母、数字、中文、连字符、下划号
12
12
  * - 截断到 MAX_SLUG_LENGTH 字符
13
13
  *
14
14
  * @param value 输入字符串
15
15
  * @returns slug 格式的字符串
16
16
  */
17
17
  export declare function slugify(value: string): string;
18
+ /**
19
+ * 截断文本到指定长度,超长时追加后缀(省略号)
20
+ *
21
+ * 统一内核中 15 处散落的 `slice + suffix` 模式(ADR-017 枝叶层 2 次提取)。
22
+ *
23
+ * 与 sprite 的 `shared/truncate.ts` 独立(ADR-002 内核零依赖约束,kernel/sprite 各自维护)。
24
+ *
25
+ * 后缀约定:
26
+ * - 默认 '…'(Unicode U+2026,1 字符):UI 预览场景,简洁
27
+ * - '…[截断]':LLM prompt 场景,明确告知模型"此处被截断,非原文结束"
28
+ * - 调用方可通过 suffix 参数自定义
29
+ *
30
+ * ellipsis 统一:将散落的 '...'(ASCII 3 字符)统一为 '…'(Unicode 1 字符),
31
+ * 与 sprite truncate.ts 保持一致。
32
+ *
33
+ * @param text 原始文本
34
+ * @param maxLen 最大保留长度(后缀不计入;截断后总长度 = maxLen + suffix.length)
35
+ * @param suffix 超长时追加的后缀,默认 '…'
36
+ * @returns 截断后的文本(含后缀),或原文本(未超长时原样返回)
37
+ */
38
+ export declare function truncate(text: string, maxLen: number, suffix?: string): string;
18
39
  //# sourceMappingURL=strings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/utils/strings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO7C"}
1
+ {"version":3,"file":"strings.d.ts","sourceRoot":"","sources":["../../src/utils/strings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO7C;AAID;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAY,GAAG,MAAM,CAKnF"}
@@ -10,7 +10,7 @@ const MAX_SLUG_LENGTH = 40;
10
10
  *
11
11
  * 规则:
12
12
  * - 冒号和空白替换为连字符
13
- * - 只保留字母、数字、中文、连字符、下划线
13
+ * - 只保留字母、数字、中文、连字符、下划号
14
14
  * - 截断到 MAX_SLUG_LENGTH 字符
15
15
  *
16
16
  * @param value 输入字符串
@@ -24,4 +24,32 @@ export function slugify(value) {
24
24
  .replace(/^-|-$/g, '')
25
25
  .slice(0, MAX_SLUG_LENGTH);
26
26
  }
27
+ // ─── 文本截断 ─────────────────────────────────────────
28
+ /**
29
+ * 截断文本到指定长度,超长时追加后缀(省略号)
30
+ *
31
+ * 统一内核中 15 处散落的 `slice + suffix` 模式(ADR-017 枝叶层 2 次提取)。
32
+ *
33
+ * 与 sprite 的 `shared/truncate.ts` 独立(ADR-002 内核零依赖约束,kernel/sprite 各自维护)。
34
+ *
35
+ * 后缀约定:
36
+ * - 默认 '…'(Unicode U+2026,1 字符):UI 预览场景,简洁
37
+ * - '…[截断]':LLM prompt 场景,明确告知模型"此处被截断,非原文结束"
38
+ * - 调用方可通过 suffix 参数自定义
39
+ *
40
+ * ellipsis 统一:将散落的 '...'(ASCII 3 字符)统一为 '…'(Unicode 1 字符),
41
+ * 与 sprite truncate.ts 保持一致。
42
+ *
43
+ * @param text 原始文本
44
+ * @param maxLen 最大保留长度(后缀不计入;截断后总长度 = maxLen + suffix.length)
45
+ * @param suffix 超长时追加的后缀,默认 '…'
46
+ * @returns 截断后的文本(含后缀),或原文本(未超长时原样返回)
47
+ */
48
+ export function truncate(text, maxLen, suffix = '…') {
49
+ // 未超长直接返回原文本(含 text.length === maxLen 的边界情况)
50
+ if (text.length <= maxLen)
51
+ return text;
52
+ // 超长时截断到 maxLen 并追加后缀
53
+ return text.slice(0, maxLen) + suffix;
54
+ }
27
55
  //# sourceMappingURL=strings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/utils/strings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;;;;;;;;;GAUG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC;SAC5C,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"strings.js","sourceRoot":"","sources":["../../src/utils/strings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,gBAAgB;AAChB,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B;;;;;;;;;;GAUG;AACH,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,OAAO,KAAK;SACT,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC;SAC5C,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;AAC/B,CAAC;AAED,qDAAqD;AAErD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,MAAc,EAAE,SAAiB,GAAG;IACzE,6CAA6C;IAC7C,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IACvC,sBAAsB;IACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;AACxC,CAAC"}
@@ -3,6 +3,9 @@
3
3
  *
4
4
  * 从 messageHistory.ts 提取的公共时间格式化函数,
5
5
  * 消除跨模块 `new Date().toISOString()` 内联重复。
6
+ *
7
+ * API 对齐:formatDateKey(date) 与精灵 shared/dateUtils.ts 语义一致,
8
+ * 用于格式化任意 Date 为 YYYY-MM-DD(本地时区)。
6
9
  */
7
10
  /**
8
11
  * 获取当前时间的 ISO 8601 时间戳
@@ -10,12 +13,24 @@
10
13
  * @returns 如 "2026-06-21T12:34:56.789Z"
11
14
  */
12
15
  export declare function nowIso(): string;
16
+ /**
17
+ * 格式化 Date 为 YYYY-MM-DD 日期键(本地时区)
18
+ *
19
+ * 使用 getFullYear/getMonth/getDate(本地时区),替代 toISOString().slice(0,10)(UTC)。
20
+ * 修复场景:Asia/Shanghai 凌晨 00:00-08:00 期间 UTC 仍是前一天,导致按日期分组的
21
+ * 计数(chatTurns / dailyMessageCount)写入错误的日期 key。
22
+ *
23
+ * 与精灵 shared/dateUtils.ts:formatDateKey 行为完全对齐。
24
+ *
25
+ * @param date Date 对象
26
+ * @returns YYYY-MM-DD 字符串(本地日期)
27
+ */
28
+ export declare function formatDateKey(date: Date): string;
13
29
  /**
14
30
  * 获取当前日期字符串(YYYY-MM-DD,本地时区)
15
31
  *
16
- * 使用本地时区日期,避免 UTC 偏移导致跨天错位
17
- * (如 Asia/Shanghai 00:00-08:00 期间 UTC 仍是前一天,
18
- * 会话文件会写入"昨天"导致跨天 reset 与 UI 错乱)
32
+ * 委托 formatDateKey(new Date()),避免逻辑重复。
33
+ * 保留无参形态是因为多数调用点只关心"今天",无需先构造 new Date()。
19
34
  *
20
35
  * @returns 如 "2026-06-21"
21
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAMlC"}
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;GAIG;AACH,wBAAgB,MAAM,IAAI,MAAM,CAE/B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAKhD;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAElC"}
@@ -3,6 +3,9 @@
3
3
  *
4
4
  * 从 messageHistory.ts 提取的公共时间格式化函数,
5
5
  * 消除跨模块 `new Date().toISOString()` 内联重复。
6
+ *
7
+ * API 对齐:formatDateKey(date) 与精灵 shared/dateUtils.ts 语义一致,
8
+ * 用于格式化任意 Date 为 YYYY-MM-DD(本地时区)。
6
9
  */
7
10
  /**
8
11
  * 获取当前时间的 ISO 8601 时间戳
@@ -12,20 +15,33 @@
12
15
  export function nowIso() {
13
16
  return new Date().toISOString();
14
17
  }
18
+ /**
19
+ * 格式化 Date 为 YYYY-MM-DD 日期键(本地时区)
20
+ *
21
+ * 使用 getFullYear/getMonth/getDate(本地时区),替代 toISOString().slice(0,10)(UTC)。
22
+ * 修复场景:Asia/Shanghai 凌晨 00:00-08:00 期间 UTC 仍是前一天,导致按日期分组的
23
+ * 计数(chatTurns / dailyMessageCount)写入错误的日期 key。
24
+ *
25
+ * 与精灵 shared/dateUtils.ts:formatDateKey 行为完全对齐。
26
+ *
27
+ * @param date Date 对象
28
+ * @returns YYYY-MM-DD 字符串(本地日期)
29
+ */
30
+ export function formatDateKey(date) {
31
+ const y = date.getFullYear();
32
+ const m = String(date.getMonth() + 1).padStart(2, '0');
33
+ const d = String(date.getDate()).padStart(2, '0');
34
+ return `${y}-${m}-${d}`;
35
+ }
15
36
  /**
16
37
  * 获取当前日期字符串(YYYY-MM-DD,本地时区)
17
38
  *
18
- * 使用本地时区日期,避免 UTC 偏移导致跨天错位
19
- * (如 Asia/Shanghai 00:00-08:00 期间 UTC 仍是前一天,
20
- * 会话文件会写入"昨天"导致跨天 reset 与 UI 错乱)
39
+ * 委托 formatDateKey(new Date()),避免逻辑重复。
40
+ * 保留无参形态是因为多数调用点只关心"今天",无需先构造 new Date()。
21
41
  *
22
42
  * @returns 如 "2026-06-21"
23
43
  */
24
44
  export function todayDate() {
25
- const now = new Date();
26
- const year = now.getFullYear();
27
- const month = String(now.getMonth() + 1).padStart(2, '0');
28
- const day = String(now.getDate()).padStart(2, '0');
29
- return `${year}-${month}-${day}`;
45
+ return formatDateKey(new Date());
30
46
  }
31
47
  //# sourceMappingURL=time.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnD,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;GAIG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,IAAU;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS;IACvB,OAAO,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AACnC,CAAC"}
@@ -4,10 +4,14 @@
4
4
  * 将 catch 块中的 unknown 值安全转换为 Error 对象。
5
5
  * 从 errors.ts 中提取,确保浏览器端可直接 import 而不引入 logging(pino)依赖。
6
6
  *
7
- * 转换规则:
8
- * - Error 实例:原样返回
9
- * - 对象且含 message 属性:包装为 Error
10
- * - 其他:调用 String() 转为 message
7
+ * 转换规则(5 分支,与精灵 shared/toError.ts 行为对齐):
8
+ * 1. Error 实例:原样返回
9
+ * 2. 字符串:包装为 Error
10
+ * 3. 含 message 属性的对象:提取 message 包装为 Error
11
+ * 4. 普通对象(无 message):JSON 序列化(try-catch 防循环引用)
12
+ * 5. 其他类型(number/boolean/symbol/null/undefined):String() 转换
13
+ *
14
+ * null/undefined 返回 '未知错误',比 'null'/'undefined' 更友好。
11
15
  */
12
16
  export declare function toError(err: unknown): Error;
13
17
  //# sourceMappingURL=toError.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toError.d.ts","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAU3C"}
1
+ {"version":3,"file":"toError.d.ts","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAwB3C"}
@@ -4,19 +4,39 @@
4
4
  * 将 catch 块中的 unknown 值安全转换为 Error 对象。
5
5
  * 从 errors.ts 中提取,确保浏览器端可直接 import 而不引入 logging(pino)依赖。
6
6
  *
7
- * 转换规则:
8
- * - Error 实例:原样返回
9
- * - 对象且含 message 属性:包装为 Error
10
- * - 其他:调用 String() 转为 message
7
+ * 转换规则(5 分支,与精灵 shared/toError.ts 行为对齐):
8
+ * 1. Error 实例:原样返回
9
+ * 2. 字符串:包装为 Error
10
+ * 3. 含 message 属性的对象:提取 message 包装为 Error
11
+ * 4. 普通对象(无 message):JSON 序列化(try-catch 防循环引用)
12
+ * 5. 其他类型(number/boolean/symbol/null/undefined):String() 转换
13
+ *
14
+ * null/undefined 返回 '未知错误',比 'null'/'undefined' 更友好。
11
15
  */
12
16
  export function toError(err) {
17
+ // 1. Error 实例直接返回(最常见路径)
13
18
  if (err instanceof Error)
14
19
  return err;
20
+ // 2. 字符串包装为 Error
21
+ if (typeof err === 'string')
22
+ return new Error(err);
23
+ // 3. 含 message 属性的对象(如 IPC 序列化错误)提取 message
15
24
  if (typeof err === 'object' &&
16
25
  err !== null &&
17
26
  typeof err.message === 'string') {
18
27
  return new Error(err.message);
19
28
  }
20
- return new Error(String(err));
29
+ // 4. 普通对象(无 message 属性):JSON 序列化保留调试信息,try-catch 防止循环引用抛错
30
+ if (typeof err === 'object' && err !== null) {
31
+ try {
32
+ return new Error(JSON.stringify(err));
33
+ }
34
+ catch {
35
+ // 循环引用等无法序列化的情况,降级到 String()
36
+ return new Error(String(err));
37
+ }
38
+ }
39
+ // 5. 基础类型(number/boolean/symbol/null/undefined)
40
+ return new Error(String(err ?? '未知错误'));
21
41
  }
22
42
  //# sourceMappingURL=toError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toError.js","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,OAAO,CAAC,GAAY;IAClC,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC;IACrC,IACE,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAQ,GAA6B,CAAC,OAAO,KAAK,QAAQ,EAC1D,CAAC;QACD,OAAO,IAAI,KAAK,CAAE,GAA2B,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"toError.js","sourceRoot":"","sources":["../../src/utils/toError.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,OAAO,CAAC,GAAY;IAClC,yBAAyB;IACzB,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC;IACrC,kBAAkB;IAClB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,4CAA4C;IAC5C,IACE,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,OAAQ,GAA6B,CAAC,OAAO,KAAK,QAAQ,EAC1D,CAAC;QACD,OAAO,IAAI,KAAK,CAAE,GAA2B,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,0DAA0D;IAC1D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;YAC7B,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,gDAAgD;IAChD,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;AAC1C,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,11 @@
1
1
  {
2
2
  "name": "@zooique/memora",
3
- "version": "0.3.0",
3
+ "version": "2.0.0",
4
4
  "description": "通用 Agent 架构(纯逻辑库)— 本地、私有、领域无关,万物皆记忆",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "sideEffects": false,
7
9
  "files": [
8
10
  "dist",
9
11
  "README.md",
@@ -15,6 +17,14 @@
15
17
  "types": "./dist/index.d.ts"
16
18
  }
17
19
  },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://gitee.com/zooique/memora.git"
23
+ },
24
+ "homepage": "https://gitee.com/zooique/memora#readme",
25
+ "bugs": {
26
+ "url": "https://gitee.com/zooique/memora/issues"
27
+ },
18
28
  "scripts": {
19
29
  "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
20
30
  "test": "vitest run",