@zooique/memora 2.0.3 → 3.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 (588) hide show
  1. package/CHANGELOG.md +1028 -0
  2. package/README.en.md +305 -272
  3. package/README.md +303 -260
  4. package/config.example.json +43 -0
  5. package/dist/agent/agent.d.ts +376 -408
  6. package/dist/agent/agent.d.ts.map +1 -1
  7. package/dist/agent/agent.js +1166 -926
  8. package/dist/agent/agent.js.map +1 -1
  9. package/dist/agent/assembler.d.ts +105 -43
  10. package/dist/agent/assembler.d.ts.map +1 -1
  11. package/dist/agent/assembler.js +543 -75
  12. package/dist/agent/assembler.js.map +1 -1
  13. package/dist/agent/budget.d.ts +131 -0
  14. package/dist/agent/budget.d.ts.map +1 -0
  15. package/dist/agent/budget.js +128 -0
  16. package/dist/agent/budget.js.map +1 -0
  17. package/dist/agent/builtinToolHandlers.d.ts +225 -38
  18. package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
  19. package/dist/agent/builtinToolHandlers.js +748 -132
  20. package/dist/agent/builtinToolHandlers.js.map +1 -1
  21. package/dist/agent/builtinTools.d.ts +198 -7
  22. package/dist/agent/builtinTools.d.ts.map +1 -1
  23. package/dist/agent/builtinTools.js +646 -14
  24. package/dist/agent/builtinTools.js.map +1 -1
  25. package/dist/agent/compaction.d.ts +93 -0
  26. package/dist/agent/compaction.d.ts.map +1 -0
  27. package/dist/agent/compaction.js +192 -0
  28. package/dist/agent/compaction.js.map +1 -0
  29. package/dist/agent/constants.d.ts +137 -20
  30. package/dist/agent/constants.d.ts.map +1 -1
  31. package/dist/agent/constants.js +152 -20
  32. package/dist/agent/constants.js.map +1 -1
  33. package/dist/agent/contextManager.d.ts +119 -77
  34. package/dist/agent/contextManager.d.ts.map +1 -1
  35. package/dist/agent/contextManager.js +192 -135
  36. package/dist/agent/contextManager.js.map +1 -1
  37. package/dist/agent/contextPreparer.d.ts +78 -0
  38. package/dist/agent/contextPreparer.d.ts.map +1 -0
  39. package/dist/agent/contextPreparer.js +128 -0
  40. package/dist/agent/contextPreparer.js.map +1 -0
  41. package/dist/agent/duplicateInterceptor.d.ts +67 -0
  42. package/dist/agent/duplicateInterceptor.d.ts.map +1 -0
  43. package/dist/agent/duplicateInterceptor.js +82 -0
  44. package/dist/agent/duplicateInterceptor.js.map +1 -0
  45. package/dist/agent/guardRail.d.ts +166 -0
  46. package/dist/agent/guardRail.d.ts.map +1 -0
  47. package/dist/agent/guardRail.js +333 -0
  48. package/dist/agent/guardRail.js.map +1 -0
  49. package/dist/agent/loop.d.ts +716 -295
  50. package/dist/agent/loop.d.ts.map +1 -1
  51. package/dist/agent/loop.js +2178 -664
  52. package/dist/agent/loop.js.map +1 -1
  53. package/dist/agent/managers/archiveCoordinator.d.ts +14 -171
  54. package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
  55. package/dist/agent/managers/archiveCoordinator.js +19 -287
  56. package/dist/agent/managers/archiveCoordinator.js.map +1 -1
  57. package/dist/agent/managers/chatLockManager.d.ts +20 -88
  58. package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
  59. package/dist/agent/managers/chatLockManager.js +31 -103
  60. package/dist/agent/managers/chatLockManager.js.map +1 -1
  61. package/dist/agent/managers/dedupManager.d.ts +31 -115
  62. package/dist/agent/managers/dedupManager.d.ts.map +1 -1
  63. package/dist/agent/managers/dedupManager.js +48 -136
  64. package/dist/agent/managers/dedupManager.js.map +1 -1
  65. package/dist/agent/managers/goalConsistencyChecker.d.ts +42 -0
  66. package/dist/agent/managers/goalConsistencyChecker.d.ts.map +1 -0
  67. package/dist/agent/managers/goalConsistencyChecker.js +178 -0
  68. package/dist/agent/managers/goalConsistencyChecker.js.map +1 -0
  69. package/dist/agent/managers/llmCaller.d.ts +124 -0
  70. package/dist/agent/managers/llmCaller.d.ts.map +1 -0
  71. package/dist/agent/managers/llmCaller.js +417 -0
  72. package/dist/agent/managers/llmCaller.js.map +1 -0
  73. package/dist/agent/managers/llmJudgeHelper.d.ts +8 -25
  74. package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -1
  75. package/dist/agent/managers/llmJudgeHelper.js +7 -24
  76. package/dist/agent/managers/llmJudgeHelper.js.map +1 -1
  77. package/dist/agent/managers/loopMetrics.d.ts +58 -0
  78. package/dist/agent/managers/loopMetrics.d.ts.map +1 -0
  79. package/dist/agent/managers/loopMetrics.js +68 -0
  80. package/dist/agent/managers/loopMetrics.js.map +1 -0
  81. package/dist/agent/managers/memoryAdvisor.d.ts +27 -120
  82. package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
  83. package/dist/agent/managers/memoryAdvisor.js +85 -207
  84. package/dist/agent/managers/memoryAdvisor.js.map +1 -1
  85. package/dist/agent/managers/memoryGovernance.d.ts +10 -42
  86. package/dist/agent/managers/memoryGovernance.d.ts.map +1 -1
  87. package/dist/agent/managers/memoryGovernance.js +19 -36
  88. package/dist/agent/managers/memoryGovernance.js.map +1 -1
  89. package/dist/agent/managers/memoryInspector.d.ts +59 -268
  90. package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
  91. package/dist/agent/managers/memoryInspector.js +91 -442
  92. package/dist/agent/managers/memoryInspector.js.map +1 -1
  93. package/dist/agent/managers/roundSummaryGenerator.d.ts +56 -0
  94. package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -0
  95. package/dist/agent/managers/roundSummaryGenerator.js +201 -0
  96. package/dist/agent/managers/roundSummaryGenerator.js.map +1 -0
  97. package/dist/agent/managers/sessionArchiver.d.ts +19 -68
  98. package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
  99. package/dist/agent/managers/sessionArchiver.js +76 -147
  100. package/dist/agent/managers/sessionArchiver.js.map +1 -1
  101. package/dist/agent/managers/sessionManager.d.ts +286 -57
  102. package/dist/agent/managers/sessionManager.d.ts.map +1 -1
  103. package/dist/agent/managers/sessionManager.js +846 -85
  104. package/dist/agent/managers/sessionManager.js.map +1 -1
  105. package/dist/agent/managers/sessionNamer.d.ts +35 -0
  106. package/dist/agent/managers/sessionNamer.d.ts.map +1 -0
  107. package/dist/agent/managers/sessionNamer.js +104 -0
  108. package/dist/agent/managers/sessionNamer.js.map +1 -0
  109. package/dist/agent/managers/streamAccumulator.d.ts +8 -33
  110. package/dist/agent/managers/streamAccumulator.d.ts.map +1 -1
  111. package/dist/agent/managers/streamAccumulator.js +4 -29
  112. package/dist/agent/managers/streamAccumulator.js.map +1 -1
  113. package/dist/agent/managers/textPolishManager.d.ts +8 -44
  114. package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
  115. package/dist/agent/managers/textPolishManager.js +9 -41
  116. package/dist/agent/managers/textPolishManager.js.map +1 -1
  117. package/dist/agent/managers/toolCallHelpers.d.ts +105 -0
  118. package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -0
  119. package/dist/agent/managers/toolCallHelpers.js +161 -0
  120. package/dist/agent/managers/toolCallHelpers.js.map +1 -0
  121. package/dist/agent/managers/workProjection.d.ts +55 -100
  122. package/dist/agent/managers/workProjection.d.ts.map +1 -1
  123. package/dist/agent/managers/workProjection.js +164 -268
  124. package/dist/agent/managers/workProjection.js.map +1 -1
  125. package/dist/agent/messageHistory.d.ts +134 -84
  126. package/dist/agent/messageHistory.d.ts.map +1 -1
  127. package/dist/agent/messageHistory.js +419 -133
  128. package/dist/agent/messageHistory.js.map +1 -1
  129. package/dist/agent/needsPlanning.d.ts +28 -0
  130. package/dist/agent/needsPlanning.d.ts.map +1 -0
  131. package/dist/agent/needsPlanning.js +68 -0
  132. package/dist/agent/needsPlanning.js.map +1 -0
  133. package/dist/agent/seed/index.d.ts +11 -0
  134. package/dist/agent/seed/index.d.ts.map +1 -0
  135. package/dist/agent/seed/index.js +10 -0
  136. package/dist/agent/seed/index.js.map +1 -0
  137. package/dist/agent/seed/orchestrator.d.ts +83 -0
  138. package/dist/agent/seed/orchestrator.d.ts.map +1 -0
  139. package/dist/agent/seed/orchestrator.js +260 -0
  140. package/dist/agent/seed/orchestrator.js.map +1 -0
  141. package/dist/agent/seed/prepare.d.ts +49 -0
  142. package/dist/agent/seed/prepare.d.ts.map +1 -0
  143. package/dist/agent/seed/prepare.js +107 -0
  144. package/dist/agent/seed/prepare.js.map +1 -0
  145. package/dist/agent/seed/types.d.ts +115 -0
  146. package/dist/agent/seed/types.d.ts.map +1 -0
  147. package/dist/agent/seed/types.js +15 -0
  148. package/dist/agent/seed/types.js.map +1 -0
  149. package/dist/agent/sessionStateMachine.d.ts +78 -0
  150. package/dist/agent/sessionStateMachine.d.ts.map +1 -0
  151. package/dist/agent/sessionStateMachine.js +182 -0
  152. package/dist/agent/sessionStateMachine.js.map +1 -0
  153. package/dist/agent/taskTableRenderer.d.ts +51 -0
  154. package/dist/agent/taskTableRenderer.d.ts.map +1 -0
  155. package/dist/agent/taskTableRenderer.js +115 -0
  156. package/dist/agent/taskTableRenderer.js.map +1 -0
  157. package/dist/agent/toolExecutor.d.ts +236 -10
  158. package/dist/agent/toolExecutor.d.ts.map +1 -1
  159. package/dist/agent/toolExecutor.js +932 -21
  160. package/dist/agent/toolExecutor.js.map +1 -1
  161. package/dist/agent/toolLedger.d.ts +120 -0
  162. package/dist/agent/toolLedger.d.ts.map +1 -0
  163. package/dist/agent/toolLedger.js +149 -0
  164. package/dist/agent/toolLedger.js.map +1 -0
  165. package/dist/agent/toolResultCache.d.ts +134 -0
  166. package/dist/agent/toolResultCache.d.ts.map +1 -0
  167. package/dist/agent/toolResultCache.js +243 -0
  168. package/dist/agent/toolResultCache.js.map +1 -0
  169. package/dist/agent/toolResultOffload.d.ts +59 -0
  170. package/dist/agent/toolResultOffload.d.ts.map +1 -0
  171. package/dist/agent/toolResultOffload.js +70 -0
  172. package/dist/agent/toolResultOffload.js.map +1 -0
  173. package/dist/agent/toolRunner.d.ts +59 -0
  174. package/dist/agent/toolRunner.d.ts.map +1 -0
  175. package/dist/agent/toolRunner.js +147 -0
  176. package/dist/agent/toolRunner.js.map +1 -0
  177. package/dist/agent/tracer.d.ts +99 -107
  178. package/dist/agent/tracer.d.ts.map +1 -1
  179. package/dist/agent/tracer.js +24 -69
  180. package/dist/agent/tracer.js.map +1 -1
  181. package/dist/agent/types.d.ts +510 -169
  182. package/dist/agent/types.d.ts.map +1 -1
  183. package/dist/agent/types.js +2 -51
  184. package/dist/agent/types.js.map +1 -1
  185. package/dist/code-exec/codeExecutionProvider.d.ts +16 -0
  186. package/dist/code-exec/codeExecutionProvider.d.ts.map +1 -0
  187. package/dist/code-exec/codeExecutionProvider.js +57 -0
  188. package/dist/code-exec/codeExecutionProvider.js.map +1 -0
  189. package/dist/code-exec/types.d.ts +37 -0
  190. package/dist/code-exec/types.d.ts.map +1 -0
  191. package/dist/code-exec/types.js +12 -0
  192. package/dist/code-exec/types.js.map +1 -0
  193. package/dist/config/expandEnvVars.d.ts +22 -0
  194. package/dist/config/expandEnvVars.d.ts.map +1 -0
  195. package/dist/config/expandEnvVars.js +38 -0
  196. package/dist/config/expandEnvVars.js.map +1 -0
  197. package/dist/config/loader.d.ts +27 -98
  198. package/dist/config/loader.d.ts.map +1 -1
  199. package/dist/config/loader.js +110 -223
  200. package/dist/config/loader.js.map +1 -1
  201. package/dist/index.d.ts +67 -77
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +90 -69
  204. package/dist/index.js.map +1 -1
  205. package/dist/llm/abortSignal.d.ts +2 -3
  206. package/dist/llm/abortSignal.d.ts.map +1 -1
  207. package/dist/llm/abortSignal.js +2 -3
  208. package/dist/llm/abortSignal.js.map +1 -1
  209. package/dist/llm/factory.d.ts +22 -32
  210. package/dist/llm/factory.d.ts.map +1 -1
  211. package/dist/llm/factory.js +29 -46
  212. package/dist/llm/factory.js.map +1 -1
  213. package/dist/llm/openaiCompatible.d.ts +25 -40
  214. package/dist/llm/openaiCompatible.d.ts.map +1 -1
  215. package/dist/llm/openaiCompatible.js +179 -120
  216. package/dist/llm/openaiCompatible.js.map +1 -1
  217. package/dist/llm/provider.d.ts +29 -42
  218. package/dist/llm/provider.d.ts.map +1 -1
  219. package/dist/llm/provider.js +11 -10
  220. package/dist/llm/provider.js.map +1 -1
  221. package/dist/llm/types.d.ts +54 -11
  222. package/dist/llm/types.d.ts.map +1 -1
  223. package/dist/llm/types.js +0 -5
  224. package/dist/llm/types.js.map +1 -1
  225. package/dist/logging/logger.d.ts +8 -31
  226. package/dist/logging/logger.d.ts.map +1 -1
  227. package/dist/logging/logger.js +28 -215
  228. package/dist/logging/logger.js.map +1 -1
  229. package/dist/logging/loggerInterface.d.ts +9 -8
  230. package/dist/logging/loggerInterface.d.ts.map +1 -1
  231. package/dist/memory/gcService.d.ts +164 -0
  232. package/dist/memory/gcService.d.ts.map +1 -0
  233. package/dist/memory/gcService.js +215 -0
  234. package/dist/memory/gcService.js.map +1 -0
  235. package/dist/memory/governance.d.ts +11 -44
  236. package/dist/memory/governance.d.ts.map +1 -1
  237. package/dist/memory/governance.js +11 -64
  238. package/dist/memory/governance.js.map +1 -1
  239. package/dist/memory/inMemoryRoundStore.d.ts +124 -0
  240. package/dist/memory/inMemoryRoundStore.d.ts.map +1 -0
  241. package/dist/memory/inMemoryRoundStore.js +216 -0
  242. package/dist/memory/inMemoryRoundStore.js.map +1 -0
  243. package/dist/memory/inMemorySessionStore.d.ts +92 -0
  244. package/dist/memory/inMemorySessionStore.d.ts.map +1 -0
  245. package/dist/memory/inMemorySessionStore.js +219 -0
  246. package/dist/memory/inMemorySessionStore.js.map +1 -0
  247. package/dist/memory/inMemorySessionViewLoader.d.ts +89 -0
  248. package/dist/memory/inMemorySessionViewLoader.d.ts.map +1 -0
  249. package/dist/memory/inMemorySessionViewLoader.js +183 -0
  250. package/dist/memory/inMemorySessionViewLoader.js.map +1 -0
  251. package/dist/memory/inMemoryStorage.d.ts +25 -175
  252. package/dist/memory/inMemoryStorage.d.ts.map +1 -1
  253. package/dist/memory/inMemoryStorage.js +32 -221
  254. package/dist/memory/inMemoryStorage.js.map +1 -1
  255. package/dist/memory/keywordsTouch.d.ts +20 -0
  256. package/dist/memory/keywordsTouch.d.ts.map +1 -0
  257. package/dist/memory/keywordsTouch.js +25 -0
  258. package/dist/memory/keywordsTouch.js.map +1 -0
  259. package/dist/memory/lockManager.d.ts +2 -2
  260. package/dist/memory/lockManager.d.ts.map +1 -1
  261. package/dist/memory/lockManager.js +6 -8
  262. package/dist/memory/lockManager.js.map +1 -1
  263. package/dist/memory/projectManager.d.ts +30 -129
  264. package/dist/memory/projectManager.d.ts.map +1 -1
  265. package/dist/memory/projectManager.js +39 -189
  266. package/dist/memory/projectManager.js.map +1 -1
  267. package/dist/memory/projectRegistry.d.ts +14 -62
  268. package/dist/memory/projectRegistry.d.ts.map +1 -1
  269. package/dist/memory/projectRegistry.js +27 -111
  270. package/dist/memory/projectRegistry.js.map +1 -1
  271. package/dist/memory/roundStore.d.ts +629 -0
  272. package/dist/memory/roundStore.d.ts.map +1 -0
  273. package/dist/memory/roundStore.js +116 -0
  274. package/dist/memory/roundStore.js.map +1 -0
  275. package/dist/memory/sessionStore.d.ts +70 -61
  276. package/dist/memory/sessionStore.d.ts.map +1 -1
  277. package/dist/memory/sessionStore.js +23 -1
  278. package/dist/memory/sessionStore.js.map +1 -1
  279. package/dist/memory/sessionViewLoader.d.ts +141 -0
  280. package/dist/memory/sessionViewLoader.d.ts.map +1 -0
  281. package/dist/memory/sessionViewLoader.js +65 -0
  282. package/dist/memory/sessionViewLoader.js.map +1 -0
  283. package/dist/memory/sourceValidation.d.ts +10 -12
  284. package/dist/memory/sourceValidation.d.ts.map +1 -1
  285. package/dist/memory/sourceValidation.js +16 -32
  286. package/dist/memory/sourceValidation.js.map +1 -1
  287. package/dist/memory/storageInterface.d.ts +44 -150
  288. package/dist/memory/storageInterface.d.ts.map +1 -1
  289. package/dist/memory/types.d.ts +65 -164
  290. package/dist/memory/types.d.ts.map +1 -1
  291. package/dist/memory/types.js +81 -83
  292. package/dist/memory/types.js.map +1 -1
  293. package/dist/project-search/projectSearchProvider.d.ts +29 -0
  294. package/dist/project-search/projectSearchProvider.d.ts.map +1 -0
  295. package/dist/project-search/projectSearchProvider.js +57 -0
  296. package/dist/project-search/projectSearchProvider.js.map +1 -0
  297. package/dist/project-search/terms.d.ts +14 -0
  298. package/dist/project-search/terms.d.ts.map +1 -0
  299. package/dist/project-search/terms.js +68 -0
  300. package/dist/project-search/terms.js.map +1 -0
  301. package/dist/project-search/types.d.ts +139 -0
  302. package/dist/project-search/types.d.ts.map +1 -0
  303. package/dist/project-search/types.js +8 -0
  304. package/dist/project-search/types.js.map +1 -0
  305. package/dist/role-pack/capabilityMap.d.ts +28 -0
  306. package/dist/role-pack/capabilityMap.d.ts.map +1 -0
  307. package/dist/role-pack/capabilityMap.js +56 -0
  308. package/dist/role-pack/capabilityMap.js.map +1 -0
  309. package/dist/role-pack/constants.d.ts +21 -0
  310. package/dist/role-pack/constants.d.ts.map +1 -0
  311. package/dist/role-pack/constants.js +21 -0
  312. package/dist/role-pack/constants.js.map +1 -0
  313. package/dist/role-pack/rolePackManager.d.ts +269 -0
  314. package/dist/role-pack/rolePackManager.d.ts.map +1 -0
  315. package/dist/role-pack/rolePackManager.js +1082 -0
  316. package/dist/role-pack/rolePackManager.js.map +1 -0
  317. package/dist/role-pack/strategyKeys.d.ts +100 -0
  318. package/dist/role-pack/strategyKeys.d.ts.map +1 -0
  319. package/dist/role-pack/strategyKeys.js +184 -0
  320. package/dist/role-pack/strategyKeys.js.map +1 -0
  321. package/dist/role-pack/strategyResolver.d.ts +109 -0
  322. package/dist/role-pack/strategyResolver.d.ts.map +1 -0
  323. package/dist/role-pack/strategyResolver.js +304 -0
  324. package/dist/role-pack/strategyResolver.js.map +1 -0
  325. package/dist/role-pack/types.d.ts +237 -0
  326. package/dist/role-pack/types.d.ts.map +1 -0
  327. package/dist/role-pack/types.js +8 -0
  328. package/dist/role-pack/types.js.map +1 -0
  329. package/dist/role-pack/validator.d.ts +38 -0
  330. package/dist/role-pack/validator.d.ts.map +1 -0
  331. package/dist/role-pack/validator.js +436 -0
  332. package/dist/role-pack/validator.js.map +1 -0
  333. package/dist/security/pathGuard.d.ts +69 -72
  334. package/dist/security/pathGuard.d.ts.map +1 -1
  335. package/dist/security/pathGuard.js +151 -131
  336. package/dist/security/pathGuard.js.map +1 -1
  337. package/dist/skill/skillLayer3.d.ts +91 -0
  338. package/dist/skill/skillLayer3.d.ts.map +1 -0
  339. package/dist/skill/skillLayer3.js +104 -0
  340. package/dist/skill/skillLayer3.js.map +1 -0
  341. package/dist/skill/skillManager.d.ts +136 -19
  342. package/dist/skill/skillManager.d.ts.map +1 -1
  343. package/dist/skill/skillManager.js +312 -61
  344. package/dist/skill/skillManager.js.map +1 -1
  345. package/dist/skill/skillScriptRunner.d.ts +97 -0
  346. package/dist/skill/skillScriptRunner.d.ts.map +1 -0
  347. package/dist/skill/skillScriptRunner.js +271 -0
  348. package/dist/skill/skillScriptRunner.js.map +1 -0
  349. package/dist/skill/types.d.ts +73 -16
  350. package/dist/skill/types.d.ts.map +1 -1
  351. package/dist/skill/types.js +5 -1
  352. package/dist/skill/types.js.map +1 -1
  353. package/dist/utils/array.d.ts +5 -6
  354. package/dist/utils/array.d.ts.map +1 -1
  355. package/dist/utils/array.js +6 -6
  356. package/dist/utils/array.js.map +1 -1
  357. package/dist/utils/atomicWrite.d.ts +8 -0
  358. package/dist/utils/atomicWrite.d.ts.map +1 -0
  359. package/dist/utils/atomicWrite.js +31 -0
  360. package/dist/utils/atomicWrite.js.map +1 -0
  361. package/dist/utils/backgroundTask.d.ts +38 -0
  362. package/dist/utils/backgroundTask.d.ts.map +1 -0
  363. package/dist/utils/backgroundTask.js +117 -0
  364. package/dist/utils/backgroundTask.js.map +1 -0
  365. package/dist/utils/configResourceManager.d.ts +40 -72
  366. package/dist/utils/configResourceManager.d.ts.map +1 -1
  367. package/dist/utils/configResourceManager.js +78 -76
  368. package/dist/utils/configResourceManager.js.map +1 -1
  369. package/dist/utils/errors.d.ts +44 -69
  370. package/dist/utils/errors.d.ts.map +1 -1
  371. package/dist/utils/errors.js +54 -71
  372. package/dist/utils/errors.js.map +1 -1
  373. package/dist/utils/eventEmitter.d.ts +104 -103
  374. package/dist/utils/eventEmitter.d.ts.map +1 -1
  375. package/dist/utils/eventEmitter.js +37 -45
  376. package/dist/utils/eventEmitter.js.map +1 -1
  377. package/dist/utils/fileSafe.d.ts +20 -0
  378. package/dist/utils/fileSafe.d.ts.map +1 -0
  379. package/dist/utils/fileSafe.js +56 -0
  380. package/dist/utils/fileSafe.js.map +1 -0
  381. package/dist/utils/frontmatter.d.ts +2 -3
  382. package/dist/utils/frontmatter.d.ts.map +1 -1
  383. package/dist/utils/frontmatter.js +2 -3
  384. package/dist/utils/frontmatter.js.map +1 -1
  385. package/dist/utils/hash.d.ts +12 -0
  386. package/dist/utils/hash.d.ts.map +1 -0
  387. package/dist/utils/hash.js +27 -0
  388. package/dist/utils/hash.js.map +1 -0
  389. package/dist/utils/http.d.ts +17 -0
  390. package/dist/utils/http.d.ts.map +1 -0
  391. package/dist/utils/http.js +29 -0
  392. package/dist/utils/http.js.map +1 -0
  393. package/dist/utils/json.d.ts +1 -1
  394. package/dist/utils/json.js +1 -1
  395. package/dist/utils/math.d.ts +25 -3
  396. package/dist/utils/math.d.ts.map +1 -1
  397. package/dist/utils/math.js +32 -16
  398. package/dist/utils/math.js.map +1 -1
  399. package/dist/utils/objects.d.ts +2 -3
  400. package/dist/utils/objects.d.ts.map +1 -1
  401. package/dist/utils/objects.js +2 -3
  402. package/dist/utils/objects.js.map +1 -1
  403. package/dist/utils/recallDefaults.d.ts +16 -0
  404. package/dist/utils/recallDefaults.d.ts.map +1 -0
  405. package/dist/utils/recallDefaults.js +16 -0
  406. package/dist/utils/recallDefaults.js.map +1 -0
  407. package/dist/utils/safeTimer.d.ts +8 -36
  408. package/dist/utils/safeTimer.d.ts.map +1 -1
  409. package/dist/utils/safeTimer.js +9 -37
  410. package/dist/utils/safeTimer.js.map +1 -1
  411. package/dist/utils/scanner.d.ts +97 -17
  412. package/dist/utils/scanner.d.ts.map +1 -1
  413. package/dist/utils/scanner.js +269 -47
  414. package/dist/utils/scanner.js.map +1 -1
  415. package/dist/utils/segmenter.d.ts +20 -19
  416. package/dist/utils/segmenter.d.ts.map +1 -1
  417. package/dist/utils/segmenter.js +230 -97
  418. package/dist/utils/segmenter.js.map +1 -1
  419. package/dist/utils/strings.d.ts +15 -32
  420. package/dist/utils/strings.d.ts.map +1 -1
  421. package/dist/utils/strings.js +25 -44
  422. package/dist/utils/strings.js.map +1 -1
  423. package/dist/utils/time.d.ts +37 -0
  424. package/dist/utils/time.d.ts.map +1 -1
  425. package/dist/utils/time.js +56 -0
  426. package/dist/utils/time.js.map +1 -1
  427. package/dist/utils/toError.d.ts +13 -1
  428. package/dist/utils/toError.d.ts.map +1 -1
  429. package/dist/utils/toError.js +18 -1
  430. package/dist/utils/toError.js.map +1 -1
  431. package/dist/web-fetch/fetchWebFetchProvider.d.ts +14 -0
  432. package/dist/web-fetch/fetchWebFetchProvider.d.ts.map +1 -0
  433. package/dist/web-fetch/fetchWebFetchProvider.js +69 -0
  434. package/dist/web-fetch/fetchWebFetchProvider.js.map +1 -0
  435. package/dist/web-fetch/types.d.ts +30 -0
  436. package/dist/web-fetch/types.d.ts.map +1 -0
  437. package/dist/web-fetch/types.js +7 -0
  438. package/dist/web-fetch/types.js.map +1 -0
  439. package/dist/web-fetch/webFetchProvider.d.ts +10 -0
  440. package/dist/web-fetch/webFetchProvider.d.ts.map +1 -0
  441. package/dist/web-fetch/webFetchProvider.js +28 -0
  442. package/dist/web-fetch/webFetchProvider.js.map +1 -0
  443. package/dist/web-search/fetchWebSearchProvider.d.ts +27 -0
  444. package/dist/web-search/fetchWebSearchProvider.d.ts.map +1 -0
  445. package/dist/web-search/fetchWebSearchProvider.js +199 -0
  446. package/dist/web-search/fetchWebSearchProvider.js.map +1 -0
  447. package/dist/web-search/types.d.ts +46 -0
  448. package/dist/web-search/types.d.ts.map +1 -0
  449. package/dist/web-search/types.js +2 -0
  450. package/dist/{persona → web-search}/types.js.map +1 -1
  451. package/dist/web-search/webSearchProvider.d.ts +10 -0
  452. package/dist/web-search/webSearchProvider.d.ts.map +1 -0
  453. package/dist/web-search/webSearchProvider.js +30 -0
  454. package/dist/web-search/webSearchProvider.js.map +1 -0
  455. package/docs/architecture/role-pack-authoring-guide.md +243 -0
  456. package/docs/architecture/role-pack-spec.md +767 -0
  457. package/docs/memora-api-reference.md +416 -476
  458. package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +841 -806
  459. package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -0
  460. package/package.json +105 -100
  461. package/role-packs/README.md +41 -0
  462. package/role-packs/memora/345/212/251/346/211/213/manifest.json +12 -0
  463. package/role-packs/memora/345/212/251/346/211/213/persona.md +12 -0
  464. package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -0
  465. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +44 -0
  466. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -0
  467. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +15 -0
  468. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/character-sheet.md +34 -0
  469. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/core-extractor.md +37 -0
  470. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/craft-review.md +69 -0
  471. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/dialogue-craft.md +45 -0
  472. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -0
  473. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/empathy-craft.md +79 -0
  474. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -0
  475. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/hotspot-mapping.md +121 -0
  476. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/idea-lever.md +42 -0
  477. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/logline-craft.md +47 -0
  478. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/longform-guard.md +64 -0
  479. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/need-finder.md +40 -0
  480. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +46 -0
  481. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pacing-hook.md +34 -0
  482. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/polish-method.md +113 -0
  483. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pov-discipline.md +79 -0
  484. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/SKILL.md +112 -0
  485. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/scripts/init-novel-project.mjs +441 -0
  486. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/relationship-web.md +47 -0
  487. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/scene-craft.md +46 -0
  488. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +60 -0
  489. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-structure.md +36 -0
  490. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/style-weaver.md +109 -0
  491. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/three-layer-check.md +27 -0
  492. package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/world-builder.md +41 -0
  493. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/manifest.json +48 -0
  494. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/persona.md +73 -0
  495. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/rules.md +19 -0
  496. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/api-doc-writer.md +40 -0
  497. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/doc-planner.md +42 -0
  498. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/nutrient-search.md +28 -0
  499. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/seed-finder.md +28 -0
  500. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/ssot-audit.md +34 -0
  501. package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/style-guide.md +40 -0
  502. package/dist/agent/guardrail.d.ts +0 -49
  503. package/dist/agent/guardrail.d.ts.map +0 -1
  504. package/dist/agent/guardrail.js +0 -59
  505. package/dist/agent/guardrail.js.map +0 -1
  506. package/dist/agent/managers/autoConfigRefiner.d.ts +0 -39
  507. package/dist/agent/managers/autoConfigRefiner.d.ts.map +0 -1
  508. package/dist/agent/managers/autoConfigRefiner.js +0 -146
  509. package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
  510. package/dist/agent/managers/configManager.d.ts +0 -209
  511. package/dist/agent/managers/configManager.d.ts.map +0 -1
  512. package/dist/agent/managers/configManager.js +0 -331
  513. package/dist/agent/managers/configManager.js.map +0 -1
  514. package/dist/agent/managers/insightExtractor.d.ts +0 -139
  515. package/dist/agent/managers/insightExtractor.d.ts.map +0 -1
  516. package/dist/agent/managers/insightExtractor.js +0 -401
  517. package/dist/agent/managers/insightExtractor.js.map +0 -1
  518. package/dist/agent/managers/memoryDecayScheduler.d.ts +0 -239
  519. package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
  520. package/dist/agent/managers/memoryDecayScheduler.js +0 -413
  521. package/dist/agent/managers/memoryDecayScheduler.js.map +0 -1
  522. package/dist/agent/managers/relationBuilder.d.ts +0 -131
  523. package/dist/agent/managers/relationBuilder.d.ts.map +0 -1
  524. package/dist/agent/managers/relationBuilder.js +0 -192
  525. package/dist/agent/managers/relationBuilder.js.map +0 -1
  526. package/dist/agent/personaMatcher.d.ts +0 -29
  527. package/dist/agent/personaMatcher.d.ts.map +0 -1
  528. package/dist/agent/personaMatcher.js +0 -60
  529. package/dist/agent/personaMatcher.js.map +0 -1
  530. package/dist/agent/userFactExtractor.d.ts +0 -25
  531. package/dist/agent/userFactExtractor.d.ts.map +0 -1
  532. package/dist/agent/userFactExtractor.js +0 -88
  533. package/dist/agent/userFactExtractor.js.map +0 -1
  534. package/dist/eval/evalRunner.d.ts +0 -94
  535. package/dist/eval/evalRunner.d.ts.map +0 -1
  536. package/dist/eval/evalRunner.js +0 -141
  537. package/dist/eval/evalRunner.js.map +0 -1
  538. package/dist/eval/evalTypes.d.ts +0 -148
  539. package/dist/eval/evalTypes.d.ts.map +0 -1
  540. package/dist/eval/evalTypes.js +0 -118
  541. package/dist/eval/evalTypes.js.map +0 -1
  542. package/dist/eval/scenarios.d.ts +0 -33
  543. package/dist/eval/scenarios.d.ts.map +0 -1
  544. package/dist/eval/scenarios.js +0 -109
  545. package/dist/eval/scenarios.js.map +0 -1
  546. package/dist/llm/embedding.d.ts +0 -79
  547. package/dist/llm/embedding.d.ts.map +0 -1
  548. package/dist/llm/embedding.js +0 -184
  549. package/dist/llm/embedding.js.map +0 -1
  550. package/dist/memory/hybridMerge.d.ts +0 -50
  551. package/dist/memory/hybridMerge.d.ts.map +0 -1
  552. package/dist/memory/hybridMerge.js +0 -51
  553. package/dist/memory/hybridMerge.js.map +0 -1
  554. package/dist/memory/inMemoryRelationStore.d.ts +0 -58
  555. package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
  556. package/dist/memory/inMemoryRelationStore.js +0 -80
  557. package/dist/memory/inMemoryRelationStore.js.map +0 -1
  558. package/dist/memory/loader.d.ts +0 -51
  559. package/dist/memory/loader.d.ts.map +0 -1
  560. package/dist/memory/loader.js +0 -100
  561. package/dist/memory/loader.js.map +0 -1
  562. package/dist/memory/recall.d.ts +0 -82
  563. package/dist/memory/recall.d.ts.map +0 -1
  564. package/dist/memory/recall.js +0 -157
  565. package/dist/memory/recall.js.map +0 -1
  566. package/dist/memory/relationStore.d.ts +0 -95
  567. package/dist/memory/relationStore.d.ts.map +0 -1
  568. package/dist/memory/relationStore.js +0 -2
  569. package/dist/memory/relationStore.js.map +0 -1
  570. package/dist/memory/store.d.ts +0 -71
  571. package/dist/memory/store.d.ts.map +0 -1
  572. package/dist/memory/store.js +0 -199
  573. package/dist/memory/store.js.map +0 -1
  574. package/dist/memory/userProfile.d.ts +0 -180
  575. package/dist/memory/userProfile.d.ts.map +0 -1
  576. package/dist/memory/userProfile.js +0 -381
  577. package/dist/memory/userProfile.js.map +0 -1
  578. package/dist/memory/vectorStore.d.ts +0 -179
  579. package/dist/memory/vectorStore.d.ts.map +0 -1
  580. package/dist/memory/vectorStore.js +0 -284
  581. package/dist/memory/vectorStore.js.map +0 -1
  582. package/dist/persona/personaManager.d.ts +0 -109
  583. package/dist/persona/personaManager.d.ts.map +0 -1
  584. package/dist/persona/personaManager.js +0 -315
  585. package/dist/persona/personaManager.js.map +0 -1
  586. package/dist/persona/types.d.ts +0 -32
  587. package/dist/persona/types.d.ts.map +0 -1
  588. package/dist/persona/types.js +0 -5
@@ -0,0 +1,117 @@
1
+ /**
2
+ * 后台任务统一收口门面 —— 一个「后台副作用」的单一启动/观测入口。
3
+ *
4
+ * 收敛散落的 `fire-and-forget`(摘要生成 round-summary / 命中刷新 search_memories.touch / 会话命名 session-title):
5
+ * - 统一启动:不阻塞调用方,业务 Promise 交给门面兜底;
6
+ * - 统一观测:按 label 累计 pending/completed/failed,宿主可读后台健康度;
7
+ * - 统一兜底:失败统一记日志,业务侧补救经 onFailure 挂载(如宿主事件 emit);
8
+ * 统一限流:最大并发槽位防止上述三类任务无界并发耗尽资源。
9
+ *
10
+ * 与模块级 logger 同模式(全局单例,组件直接 import,零注入成本)。
11
+ */
12
+ import { logger } from '../logging/logger.js';
13
+ /** 后台任务累计统计(模块级单例状态) */
14
+ const stats = { pending: 0, completed: 0, failed: 0 };
15
+ /** 后台任务最大并发数(生产安全性:防止无界并发耗尽资源) */
16
+ const MAX_CONCURRENT_BACKGROUND_TASKS = 5;
17
+ /** 当前正在执行的任务数(不含排队中的) */
18
+ let activeCount = 0;
19
+ const pendingQueue = [];
20
+ /**
21
+ * 启动一个后台任务(不阻塞调用方)。统一计数 + 兜底失败日志 + 并发槽位控制。
22
+ * 保留「调用即纳入在途计数」的契约——无论立即执行还是排队等待。
23
+ *
24
+ * @param label 任务标签(日志/观测区分用途)
25
+ * @param factory 返回业务 Promise 的工厂;内部不要自行 `catch`,交给本门面统一兜底计数
26
+ * @param onFailure 失败时的业务侧补救(如宿主事件 emit);缺省仅记日志
27
+ */
28
+ export function backgroundTask(label, factory, onFailure) {
29
+ stats.pending++;
30
+ if (activeCount < MAX_CONCURRENT_BACKGROUND_TASKS) {
31
+ // 有空闲槽位 → 立即执行
32
+ executeTask(label, factory, onFailure);
33
+ }
34
+ else {
35
+ // 槽位已满 → 排队等待
36
+ logger.debug({ label }, '后台任务排队等待执行');
37
+ pendingQueue.push({ label, factory, onFailure });
38
+ }
39
+ }
40
+ /**
41
+ * 执行一个任务(内部方法)。在有空闲槽位时调用。
42
+ * 任务完成后自动释放槽位并消费排队中的下一个任务。
43
+ */
44
+ function executeTask(label, factory, onFailure) {
45
+ activeCount++;
46
+ const task = factory();
47
+ task.then(() => {
48
+ stats.pending--;
49
+ stats.completed++;
50
+ activeCount--;
51
+ logger.debug({ label }, '后台任务完成');
52
+ drainQueue();
53
+ }, (err) => {
54
+ stats.pending--;
55
+ stats.failed++;
56
+ activeCount--;
57
+ logger.warn({ err, label }, '后台任务失败');
58
+ onFailure?.(err);
59
+ drainQueue();
60
+ });
61
+ }
62
+ /**
63
+ * 从排队队列中消费一个任务执行(并发槽位释放时调用)。
64
+ * 保证不超过 MAX_CONCURRENT_BACKGROUND_TASKS 上限。
65
+ */
66
+ function drainQueue() {
67
+ if (activeCount >= MAX_CONCURRENT_BACKGROUND_TASKS)
68
+ return;
69
+ const next = pendingQueue.shift();
70
+ if (!next)
71
+ return;
72
+ // 排队任务启动时仍计入 pending(已在入队时计数),这里仅消费槽位
73
+ executeTask(next.label, next.factory, next.onFailure);
74
+ }
75
+ /** 读取后台任务累计统计快照(只读副本,宿主可观测后台健康度) */
76
+ export function getBackgroundTaskStats() {
77
+ return { ...stats };
78
+ }
79
+ /**
80
+ * 等待所有在途后台任务完成(带超时保护,防止任务永不返回阻塞 close)。
81
+ * Agent.close() 必须调用此函数——否则后台命中刷新/摘要生成等任务可能在 storage 关闭后 upsert 失效。
82
+ *
83
+ * @param timeoutMs 超时时间(毫秒),默认 5000ms
84
+ * @returns **等待开始时**的在途任务数(0 = 进入本函数时无在途任务)。
85
+ * ⚠️ 该值是「曾经在途」而非「已等到完成」:超时放弃剩余任务时返回值仍为初始在途数,
86
+ * 不代表实际完成数。调用方据此判断「是否有在途任务」是正确的(如 `Agent.close()` 的
87
+ * `awaited > 0`),但**不可当作已完成计数**使用。
88
+ */
89
+ export async function awaitBackgroundTasks(timeoutMs = 5000) {
90
+ const initialPending = stats.pending;
91
+ if (initialPending === 0)
92
+ return 0;
93
+ logger.debug({ pending: initialPending }, '等待后台任务完成...');
94
+ const startTime = Date.now();
95
+ while (stats.pending > 0) {
96
+ if (Date.now() - startTime > timeoutMs) {
97
+ logger.warn({ pending: stats.pending, timeoutMs }, '等待后台任务超时,放弃剩余任务');
98
+ break;
99
+ }
100
+ // 等待下一个微任务周期,让 pending 计数有机会被更新
101
+ await new Promise((resolve) => setTimeout(resolve, 50));
102
+ }
103
+ return initialPending;
104
+ }
105
+ /**
106
+ * 重置模块级状态(仅测试使用,生产代码禁止调用)。
107
+ * 清理 activeCount、pendingQueue、stats,确保测试用例间状态隔离。
108
+ * @internal
109
+ */
110
+ export function _resetBackgroundTaskState() {
111
+ stats.pending = 0;
112
+ stats.completed = 0;
113
+ stats.failed = 0;
114
+ activeCount = 0;
115
+ pendingQueue.length = 0;
116
+ }
117
+ //# sourceMappingURL=backgroundTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backgroundTask.js","sourceRoot":"","sources":["../../src/utils/backgroundTask.ts"],"names":[],"mappings":"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"}
@@ -1,40 +1,13 @@
1
- /**
2
- * 配置资源管理器抽象基类 — 消除 SkillManager 与 PersonaManager 的重复结构
3
- *
4
- * 共同模式(DRY):
5
- * - 扫描 configDir/<subdir>/ 中的 .md 文件
6
- * - 解析 frontmatter keywords
7
- * - scoreByKeywords 关键词匹配
8
- * - load → reload → deleteItem 生命周期
9
- *
10
- * 分叉点(子类差异化):
11
- * - createEntry() → 条目构造(Persona 需要 traits 解析,Skill 需要 layer/trigger)
12
- * - buildSystemPrompt() → 系统提示格式
13
- * - PersonaManager 额外状态:activePersona / mode / 切换缓冲 → 保留在子类
14
- * - SkillManager 额外能力:trigger 正则匹配 / register() → 保留在子类
15
- *
16
- * 抽象收益验证(§2.2 技术债务的阈值判断):
17
- * - 2 个使用场景,领域规则大概率会变 → 抽象收益 > 复制成本
18
- * - 扫描 + 匹配 + 生命周期共 ~60 行重复 → 消除后的维护成本显著降低
19
- *
20
- * 复杂度控制(§1.3):
21
- * - 泛型参数 T 由子类具体化,基类不假设 T 的具体形状
22
- * - 基类只提供公共基础设施,不引入新概念
23
- */
24
1
  import type { ScannedMarkdownEntry } from '../utils/scanner.js';
25
- /**
26
- * 配置资源的最小约束:必须有 name、keywords、content、filePath
27
- */
2
+ /** 配置资源最小约束 */
28
3
  export interface ConfigResource {
29
4
  name: string;
30
- keywords: string[];
31
5
  content: string;
32
6
  filePath: string;
33
7
  }
34
8
  /**
35
9
  * 配置资源管理器 — 抽象基类
36
- *
37
- * @typeParam T 子类资源类型(如 Persona / SkillEntry)
10
+ * @typeParam T 子类资源类型
38
11
  * @typeParam TOptions load() 的可选参数类型
39
12
  */
40
13
  export declare abstract class ConfigResourceManager<T extends ConfigResource, TOptions = undefined> {
@@ -43,69 +16,64 @@ export declare abstract class ConfigResourceManager<T extends ConfigResource, TO
43
16
  /** 资源列表缓存 */
44
17
  protected items: T[];
45
18
  /**
46
- * @param configDir 配置目录(资源文件在 <configDir>/<subdir>/ 下)
19
+ * 运行时注入项的名字集合——「是否有磁盘真理源」必须显式记账,不能从 filePath 反推
20
+ * (注入方 filePath 是约定,可填 '<runtime>')。registerRuntimeItem() 登记,deleteItem/loadItems 注销。
21
+ */
22
+ private readonly runtimeNames;
23
+ /**
24
+ * @param configDir 配置目录(资源在 <configDir>/<subdir>/ 下)
47
25
  * @param subdir 资源子目录名(如 'skills'、'personas')
48
26
  */
49
27
  constructor(configDir: string | undefined, subdir: string);
50
- /** 获取资源列表 */
51
- get list(): T[];
52
28
  /**
53
- * 加载资源到缓存(子类在各自的 load() 中调用)
54
- *
55
- * @param options 子类透传参数
56
- * @returns 加载的资源数量
29
+ * 资源列表快照——返回浅拷贝而非内部数组引用,
30
+ * 防止外部 push/splice 绕过 register() 的重名校验与 deleteItem() 记账。
57
31
  */
32
+ get list(): T[];
33
+ /** 加载资源到缓存,items 整体替换、运行时记账作废(子类 load() 中调用) */
58
34
  protected loadItems(options?: TOptions): Promise<number>;
59
35
  /**
60
- * 重载资源:重新扫描目录 → 更新缓存
61
- *
62
- * @returns 重载后的资源数量
36
+ * 重载资源——不能整体覆盖 items:那会抹除无磁盘真理源的运行时注入项
37
+ * (如 SkillManager.register 注入的运行时技能,纯内存态、不进记忆库),两侧就此分叉。
38
+ * 判据取 runtimeNames 显式记账;同名冲突以磁盘(更强真理源)为准并注销登记。
63
39
  */
64
40
  reload(): Promise<number>;
65
41
  /**
66
- * 删除资源(从内存缓存中移除)
42
+ * 子类声明「用户版本覆盖磁盘同名」的条目(默认无)
67
43
  *
68
- * @param name 资源名
69
- * @returns true 删除成功;false 资源不存在
44
+ * 默认语义 = 磁盘(更强真理源)赢:运行时注入项撞磁盘扫描同名时,磁盘版胜出、
45
+ * 运行时记账注销。SkillManager 的用户技能目录(loadExtraDir)则声明为覆盖——
46
+ * reload 时用户版胜出、记账保留、扫描到的内置版被剔除(见 retainRuntimeItems)。
47
+ * RolePackManager 不覆写,保持默认「磁盘赢」。
70
48
  */
71
- deleteItem(name: string): boolean;
49
+ protected isUserOverride(_name: string): boolean;
72
50
  /**
73
- * 关键词匹配:遍历资源列表,返回得分最高的资源
74
- *
75
- * 子类可覆写此方法以添加额外匹配逻辑(如 trigger 正则匹配)。
51
+ * 将磁盘扫描结果与运行时注入项合并(子类自定义扫描的 reload 也应复用本方法):
52
+ * 重新扫描磁盘后,保留无磁盘真理源的运行时注入项(如 loadExtraDir 注入的用户资源),
53
+ * 同名冲突以磁盘(更强真理源)为准并注销运行时记账——除非子类将同名声明为
54
+ * isUserOverride(用户覆盖内置):此时用户版保留、记账保留、磁盘版被剔除。
76
55
  *
77
- * @param userInput 用户输入文本
78
- * @param threshold 最低激活阈值(低于此值的匹配忽略)
79
- * @returns 匹配结果(资源 + 得分),无匹配返回 null
56
+ * @param scanned 本次磁盘扫描得到的资源列表
57
+ * @returns 合并后的完整资源列表(磁盘在前、运行时注入在后)
80
58
  */
81
- protected findBestKeywordMatch(userInput: string, threshold: number): {
82
- item: T;
83
- score: number;
84
- } | null;
59
+ protected retainRuntimeItems(scanned: T[]): T[];
60
+ /** 从内存缓存删除资源(含注销运行时记账) */
61
+ deleteItem(name: string): boolean;
85
62
  /**
86
- * 构建 system prompt 片段
87
- *
88
- * @param name 资源名(可选,不传使用当前激活资源)
63
+ * 登记运行时注入的资源(子类 register() 唯一落点)——必须记账,
64
+ * 否则 reload() 会把无磁盘真理源的注入项当成"磁盘上已删除"而抹掉。
65
+ * 重名校验由子类调用前完成(各自语义不同)。
89
66
  */
67
+ protected registerRuntimeItem(item: T): void;
68
+ /** 构建 system prompt 片段(name 不传则用当前激活资源) */
90
69
  abstract buildSystemPrompt(name?: string): string;
91
- /**
92
- * 从扫描条目构建资源对象(子类实现差异化字段解析)
93
- *
94
- * @param entry 扫描器返回的原始条目
95
- * @returns 子类资源类型
96
- */
97
- protected abstract createEntry(entry: ScannedMarkdownEntry): T;
98
- /**
99
- * load() 完成后的回调 — 子类可在此做激活选择等逻辑
100
- */
70
+ /** 从扫描条目构建资源对象(子类实现差异化字段解析;返回 null 跳过该条目) */
71
+ protected createEntry(_entry: ScannedMarkdownEntry): Promise<T | null>;
72
+ /** load() 完成后的回调(子类可做激活选择) */
101
73
  protected onAfterLoad(_items: T[], _options?: TOptions): void;
102
- /**
103
- * reload() 完成后的回调 — 子类可在此保持当前激活状态
104
- */
74
+ /** reload() 完成后的回调(子类可保持当前激活状态) */
105
75
  protected onAfterReload(_items: T[]): void;
106
- /**
107
- * 扫描目录 + 构建条目列表
108
- */
76
+ /** 扫描目录 + 构建条目列表(按 name 去重) */
109
77
  private scanAndBuild;
110
78
  }
111
79
  //# sourceMappingURL=configResourceManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"configResourceManager.d.ts","sourceRoot":"","sources":["../../src/utils/configResourceManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAKH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,8BAAsB,qBAAqB,CACzC,CAAC,SAAS,cAAc,EACxB,QAAQ,GAAG,SAAS;IAUlB,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IAChD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;IATnC,aAAa;IACb,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAM;IAE1B;;;OAGG;gBAEkB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM;IAKnC,aAAa;IACb,IAAI,IAAI,IAAI,CAAC,EAAE,CAEd;IAID;;;;;OAKG;cACa,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAU9D;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAW/B;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAajC;;;;;;;;OAQG;IACH,SAAS,CAAC,oBAAoB,CAC5B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAoBpC;;;;OAIG;IACH,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAEjD;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,CAAC;IAI9D;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI;IAI7D;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI;IAM1C;;OAEG;YACW,YAAY;CAY3B"}
1
+ {"version":3,"file":"configResourceManager.d.ts","sourceRoot":"","sources":["../../src/utils/configResourceManager.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,eAAe;AACf,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,8BAAsB,qBAAqB,CAAC,CAAC,SAAS,cAAc,EAAE,QAAQ,GAAG,SAAS;IAetF,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;IAChD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM;IAfnC,aAAa;IACb,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAM;IAE1B;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAElD;;;OAGG;gBAEkB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM;IAKnC;;;OAGG;IACH,IAAI,IAAI,IAAI,CAAC,EAAE,CAEd;IAID,gDAAgD;cAChC,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAW9D;;;;OAIG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAiB/B;;;;;;;OAOG;IACH,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhD;;;;;;;;OAQG;IACH,SAAS,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAe/C,0BAA0B;IAC1B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAejC;;;;OAIG;IACH,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAO5C,2CAA2C;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAEjD,6CAA6C;cAC7B,WAAW,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IAO5E,8BAA8B;IAC9B,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI;IAI7D,mCAAmC;IACnC,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAI;IAM1C,+BAA+B;YACjB,YAAY;CAc3B"}
@@ -1,33 +1,13 @@
1
1
  /**
2
- * 配置资源管理器抽象基类 — 消除 SkillManager 与 PersonaManager 的重复结构
3
- *
4
- * 共同模式(DRY):
5
- * - 扫描 configDir/<subdir>/ 中的 .md 文件
6
- * - 解析 frontmatter keywords
7
- * - scoreByKeywords 关键词匹配
8
- * - load → reload → deleteItem 生命周期
9
- *
10
- * 分叉点(子类差异化):
11
- * - createEntry() → 条目构造(Persona 需要 traits 解析,Skill 需要 layer/trigger)
12
- * - buildSystemPrompt() → 系统提示格式
13
- * - PersonaManager 额外状态:activePersona / mode / 切换缓冲 → 保留在子类
14
- * - SkillManager 额外能力:trigger 正则匹配 / register() → 保留在子类
15
- *
16
- * 抽象收益验证(§2.2 技术债务的阈值判断):
17
- * - 2 个使用场景,领域规则大概率会变 → 抽象收益 > 复制成本
18
- * - 扫描 + 匹配 + 生命周期共 ~60 行重复 → 消除后的维护成本显著降低
19
- *
20
- * 复杂度控制(§1.3):
21
- * - 泛型参数 T 由子类具体化,基类不假设 T 的具体形状
22
- * - 基类只提供公共基础设施,不引入新概念
2
+ * 配置资源管理器抽象基类 — 消除 SkillManager / RolePackManager 的重复结构:
3
+ * 扫描 <configDir>/<subdir>/ 的 .md、load/reload/deleteItem 生命周期。
4
+ * 差异化保留在子类(createEntry 条目构造、buildSystemPrompt、各自额外状态/能力)。
23
5
  */
24
- import { scoreByKeywords } from '../utils/segmenter.js';
25
6
  import { logger } from '../logging/logger.js';
26
7
  import { resolveSubdir, scanMarkdownDir } from '../utils/scanner.js';
27
8
  /**
28
9
  * 配置资源管理器 — 抽象基类
29
- *
30
- * @typeParam T 子类资源类型(如 Persona / SkillEntry)
10
+ * @typeParam T 子类资源类型
31
11
  * @typeParam TOptions load() 的可选参数类型
32
12
  */
33
13
  export class ConfigResourceManager {
@@ -36,7 +16,12 @@ export class ConfigResourceManager {
36
16
  /** 资源列表缓存 */
37
17
  items = [];
38
18
  /**
39
- * @param configDir 配置目录(资源文件在 <configDir>/<subdir>/ 下)
19
+ * 运行时注入项的名字集合——「是否有磁盘真理源」必须显式记账,不能从 filePath 反推
20
+ * (注入方 filePath 是约定,可填 '<runtime>')。registerRuntimeItem() 登记,deleteItem/loadItems 注销。
21
+ */
22
+ runtimeNames = new Set();
23
+ /**
24
+ * @param configDir 配置目录(资源在 <configDir>/<subdir>/ 下)
40
25
  * @param subdir 资源子目录名(如 'skills'、'personas')
41
26
  */
42
27
  constructor(configDir, subdir) {
@@ -44,41 +29,73 @@ export class ConfigResourceManager {
44
29
  this.subdir = subdir;
45
30
  }
46
31
  // ── 公共 API ──────────────────────────────────────────
47
- /** 获取资源列表 */
48
- get list() {
49
- return this.items;
50
- }
51
- // ── 受保护的基础设施(子类调用) ─────────────────────────
52
32
  /**
53
- * 加载资源到缓存(子类在各自的 load() 中调用)
54
- *
55
- * @param options 子类透传参数
56
- * @returns 加载的资源数量
33
+ * 资源列表快照——返回浅拷贝而非内部数组引用,
34
+ * 防止外部 push/splice 绕过 register() 的重名校验与 deleteItem() 记账。
57
35
  */
36
+ get list() {
37
+ return [...this.items];
38
+ }
39
+ // ── 受保护的基础设施 ──────────────────────────────────
40
+ /** 加载资源到缓存,items 整体替换、运行时记账作废(子类 load() 中调用) */
58
41
  async loadItems(options) {
59
42
  this.items = await this.scanAndBuild();
43
+ this.runtimeNames.clear();
60
44
  this.onAfterLoad(this.items, options);
61
45
  logger.info({ count: this.items.length, names: this.items.map((i) => i.name), subdir: this.subdir }, `${this.subdir} 资源加载完成`);
62
46
  return this.items.length;
63
47
  }
64
48
  /**
65
- * 重载资源:重新扫描目录 → 更新缓存
66
- *
67
- * @returns 重载后的资源数量
49
+ * 重载资源——不能整体覆盖 items:那会抹除无磁盘真理源的运行时注入项
50
+ * (如 SkillManager.register 注入的运行时技能,纯内存态、不进记忆库),两侧就此分叉。
51
+ * 判据取 runtimeNames 显式记账;同名冲突以磁盘(更强真理源)为准并注销登记。
68
52
  */
69
53
  async reload() {
70
54
  const oldCount = this.items.length;
71
- this.items = await this.scanAndBuild();
55
+ const scanned = await this.scanAndBuild();
56
+ this.items = this.retainRuntimeItems(scanned);
72
57
  this.onAfterReload(this.items);
73
- logger.info({ oldCount, newCount: this.items.length, subdir: this.subdir }, `${this.subdir} 资源已重载`);
58
+ logger.info({
59
+ oldCount,
60
+ newCount: this.items.length,
61
+ retainedRuntime: this.items.length - scanned.length,
62
+ subdir: this.subdir,
63
+ }, `${this.subdir} 资源已重载`);
74
64
  return this.items.length;
75
65
  }
76
66
  /**
77
- * 删除资源(从内存缓存中移除)
67
+ * 子类声明「用户版本覆盖磁盘同名」的条目(默认无)
78
68
  *
79
- * @param name 资源名
80
- * @returns true 删除成功;false 资源不存在
69
+ * 默认语义 = 磁盘(更强真理源)赢:运行时注入项撞磁盘扫描同名时,磁盘版胜出、
70
+ * 运行时记账注销。SkillManager 的用户技能目录(loadExtraDir)则声明为覆盖——
71
+ * reload 时用户版胜出、记账保留、扫描到的内置版被剔除(见 retainRuntimeItems)。
72
+ * RolePackManager 不覆写,保持默认「磁盘赢」。
81
73
  */
74
+ isUserOverride(_name) {
75
+ return false;
76
+ }
77
+ /**
78
+ * 将磁盘扫描结果与运行时注入项合并(子类自定义扫描的 reload 也应复用本方法):
79
+ * 重新扫描磁盘后,保留无磁盘真理源的运行时注入项(如 loadExtraDir 注入的用户资源),
80
+ * 同名冲突以磁盘(更强真理源)为准并注销运行时记账——除非子类将同名声明为
81
+ * isUserOverride(用户覆盖内置):此时用户版保留、记账保留、磁盘版被剔除。
82
+ *
83
+ * @param scanned 本次磁盘扫描得到的资源列表
84
+ * @returns 合并后的完整资源列表(磁盘在前、运行时注入在后)
85
+ */
86
+ retainRuntimeItems(scanned) {
87
+ const scannedNames = new Set(scanned.map((i) => i.name));
88
+ const runtimeInjected = this.items.filter((i) => this.runtimeNames.has(i.name) && (!scannedNames.has(i.name) || this.isUserOverride(i.name)));
89
+ for (const name of this.runtimeNames) {
90
+ // 磁盘同名赢(覆盖项已被保留,见上过滤)→ 注销记账;覆盖项保留记账(下次 reload 仍保留)
91
+ if (scannedNames.has(name) && !this.isUserOverride(name))
92
+ this.runtimeNames.delete(name);
93
+ }
94
+ // 覆盖项:剔除本次扫描到的磁盘同名版(用户版保留在后),避免同名双存
95
+ const effectiveScanned = scanned.filter((i) => !this.isUserOverride(i.name));
96
+ return [...effectiveScanned, ...runtimeInjected];
97
+ }
98
+ /** 从内存缓存删除资源(含注销运行时记账) */
82
99
  deleteItem(name) {
83
100
  const idx = this.items.findIndex((i) => i.name === name);
84
101
  if (idx < 0) {
@@ -86,52 +103,35 @@ export class ConfigResourceManager {
86
103
  return false;
87
104
  }
88
105
  this.items.splice(idx, 1);
106
+ this.runtimeNames.delete(name);
89
107
  logger.info({ name, remaining: this.items.length, subdir: this.subdir }, '资源已从内存缓存删除');
90
108
  return true;
91
109
  }
92
- // ── 关键词匹配(共享实现) ──────────────────────────────
93
110
  /**
94
- * 关键词匹配:遍历资源列表,返回得分最高的资源
95
- *
96
- * 子类可覆写此方法以添加额外匹配逻辑(如 trigger 正则匹配)。
97
- *
98
- * @param userInput 用户输入文本
99
- * @param threshold 最低激活阈值(低于此值的匹配忽略)
100
- * @returns 匹配结果(资源 + 得分),无匹配返回 null
111
+ * 登记运行时注入的资源(子类 register() 唯一落点)——必须记账,
112
+ * 否则 reload() 会把无磁盘真理源的注入项当成"磁盘上已删除"而抹掉。
113
+ * 重名校验由子类调用前完成(各自语义不同)。
101
114
  */
102
- findBestKeywordMatch(userInput, threshold) {
103
- const matches = [];
104
- for (const item of this.items) {
105
- if (item.keywords.length === 0)
106
- continue;
107
- const score = scoreByKeywords(userInput, item.keywords);
108
- if (score >= threshold) {
109
- matches.push({ item, score });
110
- }
111
- }
112
- if (matches.length === 0)
113
- return null;
114
- // 主排序:得分降序;次排序:name 字母序(保证同分时确定性)
115
- matches.sort((a, b) => b.score - a.score || a.item.name.localeCompare(b.item.name));
116
- return matches[0] ?? null;
115
+ registerRuntimeItem(item) {
116
+ this.items.push(item);
117
+ this.runtimeNames.add(item.name);
118
+ }
119
+ /** 从扫描条目构建资源对象(子类实现差异化字段解析;返回 null 跳过该条目) */
120
+ async createEntry(_entry) {
121
+ // 默认空实现:不解析任何条目,子类可覆写
122
+ return null;
117
123
  }
118
124
  // ── 生命周期钩子(子类可选覆写) ──────────────────────────
119
- /**
120
- * load() 完成后的回调 — 子类可在此做激活选择等逻辑
121
- */
125
+ /** load() 完成后的回调(子类可做激活选择) */
122
126
  onAfterLoad(_items, _options) {
123
127
  // 默认空实现
124
128
  }
125
- /**
126
- * reload() 完成后的回调 — 子类可在此保持当前激活状态
127
- */
129
+ /** reload() 完成后的回调(子类可保持当前激活状态) */
128
130
  onAfterReload(_items) {
129
131
  // 默认空实现
130
132
  }
131
133
  // ── 私有方法 ──────────────────────────────────────────
132
- /**
133
- * 扫描目录 + 构建条目列表
134
- */
134
+ /** 扫描目录 + 构建条目列表(按 name 去重) */
135
135
  async scanAndBuild() {
136
136
  const map = new Map();
137
137
  const dir = resolveSubdir(this.configDir, this.subdir);
@@ -139,8 +139,10 @@ export class ConfigResourceManager {
139
139
  return [];
140
140
  const entries = await scanMarkdownDir(dir);
141
141
  for (const entry of entries) {
142
- const item = this.createEntry(entry);
143
- map.set(entry.name, item);
142
+ const item = await this.createEntry(entry);
143
+ if (item !== null) {
144
+ map.set(entry.name, item);
145
+ }
144
146
  }
145
147
  return Array.from(map.values());
146
148
  }
@@ -1 +1 @@
1
- {"version":3,"file":"configResourceManager.js","sourceRoot":"","sources":["../../src/utils/configResourceManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"configResourceManager.js","sourceRoot":"","sources":["../../src/utils/configResourceManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAUpE;;;;GAIG;AACH,MAAM,OAAgB,qBAAqB;IAepB;IACA;IAfrB,aAAa;IACH,KAAK,GAAQ,EAAE,CAAC;IAE1B;;;OAGG;IACc,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAElD;;;OAGG;IACH,YACqB,SAA6B,EAC7B,MAAc;QADd,cAAS,GAAT,SAAS,CAAoB;QAC7B,WAAM,GAAN,MAAM,CAAQ;IAChC,CAAC;IAEJ,uDAAuD;IAEvD;;;OAGG;IACH,IAAI,IAAI;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,iDAAiD;IAEjD,gDAAgD;IACtC,KAAK,CAAC,SAAS,CAAC,OAAkB;QAC1C,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CACT,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EACvF,GAAG,IAAI,CAAC,MAAM,SAAS,CACxB,CAAC;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACV,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CACT;YACE,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YAC3B,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;YACnD,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,EACD,GAAG,IAAI,CAAC,MAAM,QAAQ,CACvB,CAAC;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED;;;;;;;OAOG;IACO,cAAc,CAAC,KAAa;QACpC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;;OAQG;IACO,kBAAkB,CAAC,OAAY;QACvC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAC9F,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACrC,mDAAmD;YACnD,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3F,CAAC;QACD,oCAAoC;QACpC,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,gBAAgB,EAAE,GAAG,eAAe,CAAC,CAAC;IACnD,CAAC;IAED,0BAA0B;IAC1B,UAAU,CAAC,IAAY;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACzD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC;YAC9D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAC3D,YAAY,CACb,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACO,mBAAmB,CAAC,IAAO;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAOD,6CAA6C;IACnC,KAAK,CAAC,WAAW,CAAC,MAA4B;QACtD,sBAAsB;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+CAA+C;IAE/C,8BAA8B;IACpB,WAAW,CAAC,MAAW,EAAE,QAAmB;QACpD,QAAQ;IACV,CAAC;IAED,mCAAmC;IACzB,aAAa,CAAC,MAAW;QACjC,QAAQ;IACV,CAAC;IAED,qDAAqD;IAErD,+BAA+B;IACvB,KAAK,CAAC,YAAY;QACxB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAa,CAAC;QACjC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QAEpB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,CAAC;CACF"}