@vybestack/llxprt-code-core 0.1.12

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 (448) hide show
  1. package/dist/.last_build +0 -0
  2. package/dist/index.d.ts +7 -0
  3. package/dist/index.js +8 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/src/__mocks__/fs/promises.d.ts +11 -0
  6. package/dist/src/__mocks__/fs/promises.js +17 -0
  7. package/dist/src/__mocks__/fs/promises.js.map +1 -0
  8. package/dist/src/code_assist/codeAssist.d.ts +9 -0
  9. package/dist/src/code_assist/codeAssist.js +19 -0
  10. package/dist/src/code_assist/codeAssist.js.map +1 -0
  11. package/dist/src/code_assist/converter.d.ts +68 -0
  12. package/dist/src/code_assist/converter.js +125 -0
  13. package/dist/src/code_assist/converter.js.map +1 -0
  14. package/dist/src/code_assist/converter.test.d.ts +6 -0
  15. package/dist/src/code_assist/converter.test.js +229 -0
  16. package/dist/src/code_assist/converter.test.js.map +1 -0
  17. package/dist/src/code_assist/oauth2.d.ts +20 -0
  18. package/dist/src/code_assist/oauth2.js +339 -0
  19. package/dist/src/code_assist/oauth2.js.map +1 -0
  20. package/dist/src/code_assist/oauth2.test.d.ts +6 -0
  21. package/dist/src/code_assist/oauth2.test.js +249 -0
  22. package/dist/src/code_assist/oauth2.test.js.map +1 -0
  23. package/dist/src/code_assist/server.d.ts +39 -0
  24. package/dist/src/code_assist/server.js +191 -0
  25. package/dist/src/code_assist/server.js.map +1 -0
  26. package/dist/src/code_assist/server.test.d.ts +6 -0
  27. package/dist/src/code_assist/server.test.js +123 -0
  28. package/dist/src/code_assist/server.test.js.map +1 -0
  29. package/dist/src/code_assist/setup.d.ts +15 -0
  30. package/dist/src/code_assist/setup.js +67 -0
  31. package/dist/src/code_assist/setup.js.map +1 -0
  32. package/dist/src/code_assist/setup.test.d.ts +6 -0
  33. package/dist/src/code_assist/setup.test.js +62 -0
  34. package/dist/src/code_assist/setup.test.js.map +1 -0
  35. package/dist/src/code_assist/types.d.ts +148 -0
  36. package/dist/src/code_assist/types.js +46 -0
  37. package/dist/src/code_assist/types.js.map +1 -0
  38. package/dist/src/config/config.d.ts +212 -0
  39. package/dist/src/config/config.js +454 -0
  40. package/dist/src/config/config.js.map +1 -0
  41. package/dist/src/config/config.test.d.ts +6 -0
  42. package/dist/src/config/config.test.js +291 -0
  43. package/dist/src/config/config.test.js.map +1 -0
  44. package/dist/src/config/flashFallback.test.d.ts +6 -0
  45. package/dist/src/config/flashFallback.test.js +115 -0
  46. package/dist/src/config/flashFallback.test.js.map +1 -0
  47. package/dist/src/config/models.d.ts +8 -0
  48. package/dist/src/config/models.js +9 -0
  49. package/dist/src/config/models.js.map +1 -0
  50. package/dist/src/core/client.d.ts +59 -0
  51. package/dist/src/core/client.js +503 -0
  52. package/dist/src/core/client.js.map +1 -0
  53. package/dist/src/core/client.test.d.ts +6 -0
  54. package/dist/src/core/client.test.js +1006 -0
  55. package/dist/src/core/client.test.js.map +1 -0
  56. package/dist/src/core/contentGenerator.d.ts +36 -0
  57. package/dist/src/core/contentGenerator.js +79 -0
  58. package/dist/src/core/contentGenerator.js.map +1 -0
  59. package/dist/src/core/contentGenerator.test.d.ts +6 -0
  60. package/dist/src/core/contentGenerator.test.js +92 -0
  61. package/dist/src/core/contentGenerator.test.js.map +1 -0
  62. package/dist/src/core/coreToolScheduler.d.ts +104 -0
  63. package/dist/src/core/coreToolScheduler.js +413 -0
  64. package/dist/src/core/coreToolScheduler.js.map +1 -0
  65. package/dist/src/core/coreToolScheduler.test.d.ts +6 -0
  66. package/dist/src/core/coreToolScheduler.test.js +347 -0
  67. package/dist/src/core/coreToolScheduler.test.js.map +1 -0
  68. package/dist/src/core/geminiChat.d.ts +116 -0
  69. package/dist/src/core/geminiChat.js +513 -0
  70. package/dist/src/core/geminiChat.js.map +1 -0
  71. package/dist/src/core/geminiChat.test.d.ts +6 -0
  72. package/dist/src/core/geminiChat.test.js +424 -0
  73. package/dist/src/core/geminiChat.test.js.map +1 -0
  74. package/dist/src/core/geminiRequest.d.ts +13 -0
  75. package/dist/src/core/geminiRequest.js +45 -0
  76. package/dist/src/core/geminiRequest.js.map +1 -0
  77. package/dist/src/core/geminiRequest.test.d.ts +6 -0
  78. package/dist/src/core/geminiRequest.test.js +72 -0
  79. package/dist/src/core/geminiRequest.test.js.map +1 -0
  80. package/dist/src/core/logger.d.ts +38 -0
  81. package/dist/src/core/logger.js +237 -0
  82. package/dist/src/core/logger.js.map +1 -0
  83. package/dist/src/core/logger.test.d.ts +6 -0
  84. package/dist/src/core/logger.test.js +387 -0
  85. package/dist/src/core/logger.test.js.map +1 -0
  86. package/dist/src/core/modelCheck.d.ts +14 -0
  87. package/dist/src/core/modelCheck.js +55 -0
  88. package/dist/src/core/modelCheck.js.map +1 -0
  89. package/dist/src/core/nonInteractiveToolExecutor.d.ts +12 -0
  90. package/dist/src/core/nonInteractiveToolExecutor.js +93 -0
  91. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -0
  92. package/dist/src/core/nonInteractiveToolExecutor.test.d.ts +6 -0
  93. package/dist/src/core/nonInteractiveToolExecutor.test.js +180 -0
  94. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -0
  95. package/dist/src/core/prompts.d.ts +12 -0
  96. package/dist/src/core/prompts.js +418 -0
  97. package/dist/src/core/prompts.js.map +1 -0
  98. package/dist/src/core/prompts.test.d.ts +6 -0
  99. package/dist/src/core/prompts.test.js +97 -0
  100. package/dist/src/core/prompts.test.js.map +1 -0
  101. package/dist/src/core/tokenLimits.d.ts +10 -0
  102. package/dist/src/core/tokenLimits.js +75 -0
  103. package/dist/src/core/tokenLimits.js.map +1 -0
  104. package/dist/src/core/tokenLimits.test.d.ts +6 -0
  105. package/dist/src/core/tokenLimits.test.js +66 -0
  106. package/dist/src/core/tokenLimits.test.js.map +1 -0
  107. package/dist/src/core/turn.d.ts +116 -0
  108. package/dist/src/core/turn.js +131 -0
  109. package/dist/src/core/turn.js.map +1 -0
  110. package/dist/src/core/turn.test.d.ts +6 -0
  111. package/dist/src/core/turn.test.js +237 -0
  112. package/dist/src/core/turn.test.js.map +1 -0
  113. package/dist/src/index.d.ts +57 -0
  114. package/dist/src/index.js +64 -0
  115. package/dist/src/index.js.map +1 -0
  116. package/dist/src/index.test.d.ts +6 -0
  117. package/dist/src/index.test.js +12 -0
  118. package/dist/src/index.test.js.map +1 -0
  119. package/dist/src/providers/ProviderContentGenerator.d.ts +21 -0
  120. package/dist/src/providers/ProviderContentGenerator.js +52 -0
  121. package/dist/src/providers/ProviderContentGenerator.js.map +1 -0
  122. package/dist/src/providers/adapters/GeminiCompatibleWrapper.d.ts +68 -0
  123. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js +549 -0
  124. package/dist/src/providers/adapters/GeminiCompatibleWrapper.js.map +1 -0
  125. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.d.ts +6 -0
  126. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js +253 -0
  127. package/dist/src/providers/adapters/GeminiCompatibleWrapper.test.js.map +1 -0
  128. package/dist/src/providers/types.d.ts +82 -0
  129. package/dist/src/providers/types.js +7 -0
  130. package/dist/src/providers/types.js.map +1 -0
  131. package/dist/src/services/fileDiscoveryService.d.ts +35 -0
  132. package/dist/src/services/fileDiscoveryService.js +91 -0
  133. package/dist/src/services/fileDiscoveryService.js.map +1 -0
  134. package/dist/src/services/fileDiscoveryService.test.d.ts +6 -0
  135. package/dist/src/services/fileDiscoveryService.test.js +102 -0
  136. package/dist/src/services/fileDiscoveryService.test.js.map +1 -0
  137. package/dist/src/services/gitService.d.ts +21 -0
  138. package/dist/src/services/gitService.js +102 -0
  139. package/dist/src/services/gitService.js.map +1 -0
  140. package/dist/src/services/gitService.test.d.ts +6 -0
  141. package/dist/src/services/gitService.test.js +246 -0
  142. package/dist/src/services/gitService.test.js.map +1 -0
  143. package/dist/src/services/ideContext.d.ts +124 -0
  144. package/dist/src/services/ideContext.js +90 -0
  145. package/dist/src/services/ideContext.js.map +1 -0
  146. package/dist/src/services/ideContext.test.d.ts +6 -0
  147. package/dist/src/services/ideContext.test.js +101 -0
  148. package/dist/src/services/ideContext.test.js.map +1 -0
  149. package/dist/src/services/loopDetectionService.d.ts +35 -0
  150. package/dist/src/services/loopDetectionService.js +117 -0
  151. package/dist/src/services/loopDetectionService.js.map +1 -0
  152. package/dist/src/services/loopDetectionService.test.d.ts +6 -0
  153. package/dist/src/services/loopDetectionService.test.js +232 -0
  154. package/dist/src/services/loopDetectionService.test.js.map +1 -0
  155. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +35 -0
  156. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +424 -0
  157. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -0
  158. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +47 -0
  159. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +123 -0
  160. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -0
  161. package/dist/src/telemetry/constants.d.ts +20 -0
  162. package/dist/src/telemetry/constants.js +21 -0
  163. package/dist/src/telemetry/constants.js.map +1 -0
  164. package/dist/src/telemetry/index.d.ts +18 -0
  165. package/dist/src/telemetry/index.js +20 -0
  166. package/dist/src/telemetry/index.js.map +1 -0
  167. package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
  168. package/dist/src/telemetry/integration.test.circular.js +53 -0
  169. package/dist/src/telemetry/integration.test.circular.js.map +1 -0
  170. package/dist/src/telemetry/loggers.d.ts +15 -0
  171. package/dist/src/telemetry/loggers.js +229 -0
  172. package/dist/src/telemetry/loggers.js.map +1 -0
  173. package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
  174. package/dist/src/telemetry/loggers.test.circular.js +100 -0
  175. package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
  176. package/dist/src/telemetry/loggers.test.d.ts +6 -0
  177. package/dist/src/telemetry/loggers.test.js +558 -0
  178. package/dist/src/telemetry/loggers.test.js.map +1 -0
  179. package/dist/src/telemetry/metrics.d.ts +19 -0
  180. package/dist/src/telemetry/metrics.js +144 -0
  181. package/dist/src/telemetry/metrics.js.map +1 -0
  182. package/dist/src/telemetry/metrics.test.d.ts +6 -0
  183. package/dist/src/telemetry/metrics.test.js +162 -0
  184. package/dist/src/telemetry/metrics.test.js.map +1 -0
  185. package/dist/src/telemetry/sdk.d.ts +9 -0
  186. package/dist/src/telemetry/sdk.js +120 -0
  187. package/dist/src/telemetry/sdk.js.map +1 -0
  188. package/dist/src/telemetry/telemetry.test.d.ts +6 -0
  189. package/dist/src/telemetry/telemetry.test.js +52 -0
  190. package/dist/src/telemetry/telemetry.test.js.map +1 -0
  191. package/dist/src/telemetry/types.d.ts +115 -0
  192. package/dist/src/telemetry/types.js +217 -0
  193. package/dist/src/telemetry/types.js.map +1 -0
  194. package/dist/src/telemetry/uiTelemetry.d.ts +67 -0
  195. package/dist/src/telemetry/uiTelemetry.js +131 -0
  196. package/dist/src/telemetry/uiTelemetry.js.map +1 -0
  197. package/dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
  198. package/dist/src/telemetry/uiTelemetry.test.js +412 -0
  199. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -0
  200. package/dist/src/tools/diffOptions.d.ts +7 -0
  201. package/dist/src/tools/diffOptions.js +10 -0
  202. package/dist/src/tools/diffOptions.js.map +1 -0
  203. package/dist/src/tools/edit.d.ts +73 -0
  204. package/dist/src/tools/edit.js +343 -0
  205. package/dist/src/tools/edit.js.map +1 -0
  206. package/dist/src/tools/edit.test.d.ts +6 -0
  207. package/dist/src/tools/edit.test.js +500 -0
  208. package/dist/src/tools/edit.test.js.map +1 -0
  209. package/dist/src/tools/glob.d.ts +58 -0
  210. package/dist/src/tools/glob.js +193 -0
  211. package/dist/src/tools/glob.js.map +1 -0
  212. package/dist/src/tools/glob.test.d.ts +6 -0
  213. package/dist/src/tools/glob.test.js +294 -0
  214. package/dist/src/tools/glob.test.js.map +1 -0
  215. package/dist/src/tools/grep.d.ts +78 -0
  216. package/dist/src/tools/grep.js +422 -0
  217. package/dist/src/tools/grep.js.map +1 -0
  218. package/dist/src/tools/grep.test.d.ts +6 -0
  219. package/dist/src/tools/grep.test.js +188 -0
  220. package/dist/src/tools/grep.test.js.map +1 -0
  221. package/dist/src/tools/ls.d.ts +83 -0
  222. package/dist/src/tools/ls.js +194 -0
  223. package/dist/src/tools/ls.js.map +1 -0
  224. package/dist/src/tools/mcp-client.d.ts +112 -0
  225. package/dist/src/tools/mcp-client.js +332 -0
  226. package/dist/src/tools/mcp-client.js.map +1 -0
  227. package/dist/src/tools/mcp-client.test.d.ts +6 -0
  228. package/dist/src/tools/mcp-client.test.js +227 -0
  229. package/dist/src/tools/mcp-client.test.js.map +1 -0
  230. package/dist/src/tools/mcp-tool.d.ts +23 -0
  231. package/dist/src/tools/mcp-tool.js +119 -0
  232. package/dist/src/tools/mcp-tool.js.map +1 -0
  233. package/dist/src/tools/mcp-tool.test.d.ts +6 -0
  234. package/dist/src/tools/mcp-tool.test.js +173 -0
  235. package/dist/src/tools/mcp-tool.test.js.map +1 -0
  236. package/dist/src/tools/memoryTool.d.ts +28 -0
  237. package/dist/src/tools/memoryTool.js +172 -0
  238. package/dist/src/tools/memoryTool.js.map +1 -0
  239. package/dist/src/tools/memoryTool.test.d.ts +6 -0
  240. package/dist/src/tools/memoryTool.test.js +181 -0
  241. package/dist/src/tools/memoryTool.test.js.map +1 -0
  242. package/dist/src/tools/modifiable-tool.d.ts +29 -0
  243. package/dist/src/tools/modifiable-tool.js +85 -0
  244. package/dist/src/tools/modifiable-tool.js.map +1 -0
  245. package/dist/src/tools/modifiable-tool.test.d.ts +6 -0
  246. package/dist/src/tools/modifiable-tool.test.js +204 -0
  247. package/dist/src/tools/modifiable-tool.test.js.map +1 -0
  248. package/dist/src/tools/read-file.d.ts +35 -0
  249. package/dist/src/tools/read-file.js +106 -0
  250. package/dist/src/tools/read-file.js.map +1 -0
  251. package/dist/src/tools/read-file.test.d.ts +6 -0
  252. package/dist/src/tools/read-file.test.js +181 -0
  253. package/dist/src/tools/read-file.test.js.map +1 -0
  254. package/dist/src/tools/read-many-files.d.ts +59 -0
  255. package/dist/src/tools/read-many-files.js +321 -0
  256. package/dist/src/tools/read-many-files.js.map +1 -0
  257. package/dist/src/tools/read-many-files.test.d.ts +6 -0
  258. package/dist/src/tools/read-many-files.test.js +312 -0
  259. package/dist/src/tools/read-many-files.test.js.map +1 -0
  260. package/dist/src/tools/shell.d.ts +43 -0
  261. package/dist/src/tools/shell.js +435 -0
  262. package/dist/src/tools/shell.js.map +1 -0
  263. package/dist/src/tools/shell.test.d.ts +6 -0
  264. package/dist/src/tools/shell.test.js +407 -0
  265. package/dist/src/tools/shell.test.js.map +1 -0
  266. package/dist/src/tools/todo-read.d.ts +15 -0
  267. package/dist/src/tools/todo-read.js +66 -0
  268. package/dist/src/tools/todo-read.js.map +1 -0
  269. package/dist/src/tools/todo-read.test.d.ts +6 -0
  270. package/dist/src/tools/todo-read.test.js +158 -0
  271. package/dist/src/tools/todo-read.test.js.map +1 -0
  272. package/dist/src/tools/todo-schemas.d.ts +43 -0
  273. package/dist/src/tools/todo-schemas.js +16 -0
  274. package/dist/src/tools/todo-schemas.js.map +1 -0
  275. package/dist/src/tools/todo-schemas.test.d.ts +6 -0
  276. package/dist/src/tools/todo-schemas.test.js +152 -0
  277. package/dist/src/tools/todo-schemas.test.js.map +1 -0
  278. package/dist/src/tools/todo-store.d.ts +15 -0
  279. package/dist/src/tools/todo-store.js +59 -0
  280. package/dist/src/tools/todo-store.js.map +1 -0
  281. package/dist/src/tools/todo-store.test.d.ts +6 -0
  282. package/dist/src/tools/todo-store.test.js +175 -0
  283. package/dist/src/tools/todo-store.test.js.map +1 -0
  284. package/dist/src/tools/todo-write.d.ts +17 -0
  285. package/dist/src/tools/todo-write.js +98 -0
  286. package/dist/src/tools/todo-write.js.map +1 -0
  287. package/dist/src/tools/todo-write.test.d.ts +6 -0
  288. package/dist/src/tools/todo-write.test.js +208 -0
  289. package/dist/src/tools/todo-write.test.js.map +1 -0
  290. package/dist/src/tools/tool-registry.d.ts +67 -0
  291. package/dist/src/tools/tool-registry.js +326 -0
  292. package/dist/src/tools/tool-registry.js.map +1 -0
  293. package/dist/src/tools/tool-registry.test.d.ts +6 -0
  294. package/dist/src/tools/tool-registry.test.js +398 -0
  295. package/dist/src/tools/tool-registry.test.js.map +1 -0
  296. package/dist/src/tools/tools.d.ts +184 -0
  297. package/dist/src/tools/tools.js +88 -0
  298. package/dist/src/tools/tools.js.map +1 -0
  299. package/dist/src/tools/web-fetch.d.ts +29 -0
  300. package/dist/src/tools/web-fetch.js +243 -0
  301. package/dist/src/tools/web-fetch.js.map +1 -0
  302. package/dist/src/tools/web-fetch.test.d.ts +6 -0
  303. package/dist/src/tools/web-fetch.test.js +70 -0
  304. package/dist/src/tools/web-fetch.test.js.map +1 -0
  305. package/dist/src/tools/web-search.d.ts +49 -0
  306. package/dist/src/tools/web-search.js +120 -0
  307. package/dist/src/tools/web-search.js.map +1 -0
  308. package/dist/src/tools/write-file.d.ts +42 -0
  309. package/dist/src/tools/write-file.js +248 -0
  310. package/dist/src/tools/write-file.js.map +1 -0
  311. package/dist/src/tools/write-file.test.d.ts +6 -0
  312. package/dist/src/tools/write-file.test.js +413 -0
  313. package/dist/src/tools/write-file.test.js.map +1 -0
  314. package/dist/src/utils/LruCache.d.ts +13 -0
  315. package/dist/src/utils/LruCache.js +38 -0
  316. package/dist/src/utils/LruCache.js.map +1 -0
  317. package/dist/src/utils/bfsFileSearch.d.ts +22 -0
  318. package/dist/src/utils/bfsFileSearch.js +62 -0
  319. package/dist/src/utils/bfsFileSearch.js.map +1 -0
  320. package/dist/src/utils/bfsFileSearch.test.d.ts +6 -0
  321. package/dist/src/utils/bfsFileSearch.test.js +129 -0
  322. package/dist/src/utils/bfsFileSearch.test.js.map +1 -0
  323. package/dist/src/utils/editCorrector.d.ts +53 -0
  324. package/dist/src/utils/editCorrector.js +546 -0
  325. package/dist/src/utils/editCorrector.js.map +1 -0
  326. package/dist/src/utils/editCorrector.test.d.ts +6 -0
  327. package/dist/src/utils/editCorrector.test.js +564 -0
  328. package/dist/src/utils/editCorrector.test.js.map +1 -0
  329. package/dist/src/utils/editor.d.ts +28 -0
  330. package/dist/src/utils/editor.js +163 -0
  331. package/dist/src/utils/editor.js.map +1 -0
  332. package/dist/src/utils/editor.test.d.ts +6 -0
  333. package/dist/src/utils/editor.test.js +293 -0
  334. package/dist/src/utils/editor.test.js.map +1 -0
  335. package/dist/src/utils/errorReporting.d.ts +14 -0
  336. package/dist/src/utils/errorReporting.js +88 -0
  337. package/dist/src/utils/errorReporting.js.map +1 -0
  338. package/dist/src/utils/errorReporting.test.d.ts +6 -0
  339. package/dist/src/utils/errorReporting.test.js +124 -0
  340. package/dist/src/utils/errorReporting.test.js.map +1 -0
  341. package/dist/src/utils/errors.d.ts +14 -0
  342. package/dist/src/utils/errors.js +54 -0
  343. package/dist/src/utils/errors.js.map +1 -0
  344. package/dist/src/utils/fetch.d.ts +11 -0
  345. package/dist/src/utils/fetch.js +51 -0
  346. package/dist/src/utils/fetch.js.map +1 -0
  347. package/dist/src/utils/fileUtils.d.ts +49 -0
  348. package/dist/src/utils/fileUtils.js +286 -0
  349. package/dist/src/utils/fileUtils.js.map +1 -0
  350. package/dist/src/utils/fileUtils.test.d.ts +6 -0
  351. package/dist/src/utils/fileUtils.test.js +321 -0
  352. package/dist/src/utils/fileUtils.test.js.map +1 -0
  353. package/dist/src/utils/flashFallback.integration.test.d.ts +6 -0
  354. package/dist/src/utils/flashFallback.integration.test.js +112 -0
  355. package/dist/src/utils/flashFallback.integration.test.js.map +1 -0
  356. package/dist/src/utils/generateContentResponseUtilities.d.ts +14 -0
  357. package/dist/src/utils/generateContentResponseUtilities.js +92 -0
  358. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -0
  359. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +6 -0
  360. package/dist/src/utils/generateContentResponseUtilities.test.js +273 -0
  361. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -0
  362. package/dist/src/utils/getFolderStructure.d.ts +30 -0
  363. package/dist/src/utils/getFolderStructure.js +247 -0
  364. package/dist/src/utils/getFolderStructure.js.map +1 -0
  365. package/dist/src/utils/getFolderStructure.test.d.ts +6 -0
  366. package/dist/src/utils/getFolderStructure.test.js +298 -0
  367. package/dist/src/utils/getFolderStructure.test.js.map +1 -0
  368. package/dist/src/utils/gitIgnoreParser.d.ts +20 -0
  369. package/dist/src/utils/gitIgnoreParser.js +64 -0
  370. package/dist/src/utils/gitIgnoreParser.js.map +1 -0
  371. package/dist/src/utils/gitIgnoreParser.test.d.ts +6 -0
  372. package/dist/src/utils/gitIgnoreParser.test.js +145 -0
  373. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -0
  374. package/dist/src/utils/gitUtils.d.ts +17 -0
  375. package/dist/src/utils/gitUtils.js +61 -0
  376. package/dist/src/utils/gitUtils.js.map +1 -0
  377. package/dist/src/utils/memoryDiscovery.d.ts +14 -0
  378. package/dist/src/utils/memoryDiscovery.js +219 -0
  379. package/dist/src/utils/memoryDiscovery.js.map +1 -0
  380. package/dist/src/utils/memoryDiscovery.test.d.ts +6 -0
  381. package/dist/src/utils/memoryDiscovery.test.js +432 -0
  382. package/dist/src/utils/memoryDiscovery.test.js.map +1 -0
  383. package/dist/src/utils/memoryImportProcessor.d.ts +35 -0
  384. package/dist/src/utils/memoryImportProcessor.js +141 -0
  385. package/dist/src/utils/memoryImportProcessor.js.map +1 -0
  386. package/dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
  387. package/dist/src/utils/memoryImportProcessor.test.js +170 -0
  388. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -0
  389. package/dist/src/utils/messageInspectors.d.ts +8 -0
  390. package/dist/src/utils/messageInspectors.js +16 -0
  391. package/dist/src/utils/messageInspectors.js.map +1 -0
  392. package/dist/src/utils/nextSpeakerChecker.d.ts +12 -0
  393. package/dist/src/utils/nextSpeakerChecker.js +113 -0
  394. package/dist/src/utils/nextSpeakerChecker.js.map +1 -0
  395. package/dist/src/utils/nextSpeakerChecker.test.d.ts +6 -0
  396. package/dist/src/utils/nextSpeakerChecker.test.js +168 -0
  397. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -0
  398. package/dist/src/utils/paths.d.ts +49 -0
  399. package/dist/src/utils/paths.js +145 -0
  400. package/dist/src/utils/paths.js.map +1 -0
  401. package/dist/src/utils/quotaErrorDetection.d.ts +22 -0
  402. package/dist/src/utils/quotaErrorDetection.js +67 -0
  403. package/dist/src/utils/quotaErrorDetection.js.map +1 -0
  404. package/dist/src/utils/retry.d.ts +21 -0
  405. package/dist/src/utils/retry.js +276 -0
  406. package/dist/src/utils/retry.js.map +1 -0
  407. package/dist/src/utils/retry.test.d.ts +6 -0
  408. package/dist/src/utils/retry.test.js +322 -0
  409. package/dist/src/utils/retry.test.js.map +1 -0
  410. package/dist/src/utils/safeJsonStringify.d.ts +13 -0
  411. package/dist/src/utils/safeJsonStringify.js +25 -0
  412. package/dist/src/utils/safeJsonStringify.js.map +1 -0
  413. package/dist/src/utils/safeJsonStringify.test.d.ts +6 -0
  414. package/dist/src/utils/safeJsonStringify.test.js +61 -0
  415. package/dist/src/utils/safeJsonStringify.test.js.map +1 -0
  416. package/dist/src/utils/schemaValidator.d.ts +23 -0
  417. package/dist/src/utils/schemaValidator.js +142 -0
  418. package/dist/src/utils/schemaValidator.js.map +1 -0
  419. package/dist/src/utils/schemaValidator.test.d.ts +6 -0
  420. package/dist/src/utils/schemaValidator.test.js +146 -0
  421. package/dist/src/utils/schemaValidator.test.js.map +1 -0
  422. package/dist/src/utils/session.d.ts +6 -0
  423. package/dist/src/utils/session.js +8 -0
  424. package/dist/src/utils/session.js.map +1 -0
  425. package/dist/src/utils/summarizer.d.ts +25 -0
  426. package/dist/src/utils/summarizer.js +80 -0
  427. package/dist/src/utils/summarizer.js.map +1 -0
  428. package/dist/src/utils/summarizer.test.d.ts +6 -0
  429. package/dist/src/utils/summarizer.test.js +131 -0
  430. package/dist/src/utils/summarizer.test.js.map +1 -0
  431. package/dist/src/utils/testUtils.d.ts +29 -0
  432. package/dist/src/utils/testUtils.js +70 -0
  433. package/dist/src/utils/testUtils.js.map +1 -0
  434. package/dist/src/utils/user_account.d.ts +9 -0
  435. package/dist/src/utils/user_account.js +99 -0
  436. package/dist/src/utils/user_account.js.map +1 -0
  437. package/dist/src/utils/user_account.test.d.ts +6 -0
  438. package/dist/src/utils/user_account.test.js +153 -0
  439. package/dist/src/utils/user_account.test.js.map +1 -0
  440. package/dist/src/utils/user_id.d.ts +11 -0
  441. package/dist/src/utils/user_id.js +49 -0
  442. package/dist/src/utils/user_id.js.map +1 -0
  443. package/dist/src/utils/user_id.test.d.ts +6 -0
  444. package/dist/src/utils/user_id.test.js +21 -0
  445. package/dist/src/utils/user_id.test.js.map +1 -0
  446. package/dist/tsconfig.tsbuildinfo +1 -0
  447. package/dist/vybestack-llxprt-code-core-0.1.12.tgz +0 -0
  448. package/package.json +62 -0
@@ -0,0 +1,432 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { vi, describe, it, expect, beforeEach } from 'vitest';
7
+ import * as fsPromises from 'fs/promises';
8
+ import * as os from 'os';
9
+ import * as path from 'path';
10
+ import { loadServerHierarchicalMemory } from './memoryDiscovery.js';
11
+ import { LLXPRT_CONFIG_DIR, setLlxprtMdFilename, getCurrentLlxprtMdFilename, DEFAULT_CONTEXT_FILENAME, } from '../tools/memoryTool.js';
12
+ import { FileDiscoveryService } from '../services/fileDiscoveryService.js';
13
+ const ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST = DEFAULT_CONTEXT_FILENAME;
14
+ // Mock the entire fs/promises module
15
+ vi.mock('fs/promises');
16
+ // Mock the parts of fsSync we might use (like constants or existsSync if needed)
17
+ vi.mock('fs', async (importOriginal) => {
18
+ const actual = await importOriginal();
19
+ return {
20
+ ...actual, // Spread actual to get all exports, including Stats and Dirent if they are classes/constructors
21
+ constants: { ...actual.constants }, // Preserve constants
22
+ };
23
+ });
24
+ vi.mock('os');
25
+ describe('loadServerHierarchicalMemory', () => {
26
+ const mockFs = fsPromises;
27
+ const mockOs = os;
28
+ const CWD = '/test/project/src';
29
+ const PROJECT_ROOT = '/test/project';
30
+ const USER_HOME = '/test/userhome';
31
+ let GLOBAL_LLXPRT_DIR;
32
+ let GLOBAL_GEMINI_FILE; // Defined in beforeEach
33
+ const fileService = new FileDiscoveryService(PROJECT_ROOT);
34
+ beforeEach(() => {
35
+ vi.resetAllMocks();
36
+ // Set environment variables to indicate test environment
37
+ process.env.NODE_ENV = 'test';
38
+ process.env.VITEST = 'true';
39
+ setLlxprtMdFilename(DEFAULT_CONTEXT_FILENAME); // Use defined const
40
+ mockOs.homedir.mockReturnValue(USER_HOME);
41
+ // Define these here to use potentially reset/updated values from imports
42
+ GLOBAL_LLXPRT_DIR = path.join(USER_HOME, LLXPRT_CONFIG_DIR);
43
+ GLOBAL_GEMINI_FILE = path.join(GLOBAL_LLXPRT_DIR, getCurrentLlxprtMdFilename());
44
+ mockFs.stat.mockRejectedValue(new Error('File not found'));
45
+ mockFs.readdir.mockResolvedValue([]);
46
+ mockFs.readFile.mockRejectedValue(new Error('File not found'));
47
+ mockFs.access.mockRejectedValue(new Error('File not found'));
48
+ });
49
+ it('should return empty memory and count if no context files are found', async () => {
50
+ const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
51
+ expect(memoryContent).toBe('');
52
+ expect(fileCount).toBe(0);
53
+ });
54
+ it('should load only the global context file if present and others are not (default filename)', async () => {
55
+ const globalDefaultFile = path.join(GLOBAL_LLXPRT_DIR, DEFAULT_CONTEXT_FILENAME);
56
+ mockFs.access.mockImplementation(async (p) => {
57
+ if (p === globalDefaultFile) {
58
+ return undefined;
59
+ }
60
+ throw new Error('File not found');
61
+ });
62
+ mockFs.readFile.mockImplementation(async (p) => {
63
+ if (p === globalDefaultFile) {
64
+ return 'Global memory content';
65
+ }
66
+ throw new Error('File not found');
67
+ });
68
+ const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
69
+ expect(memoryContent).toBe(`--- Context from: ${path.relative(CWD, globalDefaultFile)} ---\nGlobal memory content\n--- End of Context from: ${path.relative(CWD, globalDefaultFile)} ---`);
70
+ expect(fileCount).toBe(1);
71
+ expect(mockFs.readFile).toHaveBeenCalledWith(globalDefaultFile, 'utf-8');
72
+ });
73
+ it('should load only the global custom context file if present and filename is changed', async () => {
74
+ const customFilename = 'CUSTOM_AGENTS.md';
75
+ setLlxprtMdFilename(customFilename);
76
+ const globalCustomFile = path.join(GLOBAL_LLXPRT_DIR, customFilename);
77
+ mockFs.access.mockImplementation(async (p) => {
78
+ if (p === globalCustomFile) {
79
+ return undefined;
80
+ }
81
+ throw new Error('File not found');
82
+ });
83
+ mockFs.readFile.mockImplementation(async (p) => {
84
+ if (p === globalCustomFile) {
85
+ return 'Global custom memory';
86
+ }
87
+ throw new Error('File not found');
88
+ });
89
+ const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
90
+ expect(memoryContent).toBe(`--- Context from: ${path.relative(CWD, globalCustomFile)} ---\nGlobal custom memory\n--- End of Context from: ${path.relative(CWD, globalCustomFile)} ---`);
91
+ expect(fileCount).toBe(1);
92
+ expect(mockFs.readFile).toHaveBeenCalledWith(globalCustomFile, 'utf-8');
93
+ });
94
+ it('should load context files by upward traversal with custom filename', async () => {
95
+ const customFilename = 'PROJECT_CONTEXT.md';
96
+ setLlxprtMdFilename(customFilename);
97
+ const projectRootCustomFile = path.join(PROJECT_ROOT, customFilename);
98
+ const srcCustomFile = path.join(CWD, customFilename);
99
+ mockFs.stat.mockImplementation(async (p) => {
100
+ if (p === path.join(PROJECT_ROOT, '.git')) {
101
+ return { isDirectory: () => true };
102
+ }
103
+ throw new Error('File not found');
104
+ });
105
+ mockFs.access.mockImplementation(async (p) => {
106
+ if (p === projectRootCustomFile || p === srcCustomFile) {
107
+ return undefined;
108
+ }
109
+ throw new Error('File not found');
110
+ });
111
+ mockFs.readFile.mockImplementation(async (p) => {
112
+ if (p === projectRootCustomFile) {
113
+ return 'Project root custom memory';
114
+ }
115
+ if (p === srcCustomFile) {
116
+ return 'Src directory custom memory';
117
+ }
118
+ throw new Error('File not found');
119
+ });
120
+ const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
121
+ const expectedContent = `--- Context from: ${path.relative(CWD, projectRootCustomFile)} ---\nProject root custom memory\n--- End of Context from: ${path.relative(CWD, projectRootCustomFile)} ---\n\n` +
122
+ `--- Context from: ${customFilename} ---\nSrc directory custom memory\n--- End of Context from: ${customFilename} ---`;
123
+ expect(memoryContent).toBe(expectedContent);
124
+ expect(fileCount).toBe(2);
125
+ expect(mockFs.readFile).toHaveBeenCalledWith(projectRootCustomFile, 'utf-8');
126
+ expect(mockFs.readFile).toHaveBeenCalledWith(srcCustomFile, 'utf-8');
127
+ });
128
+ it('should load context files by downward traversal with custom filename', async () => {
129
+ const customFilename = 'LOCAL_CONTEXT.md';
130
+ setLlxprtMdFilename(customFilename);
131
+ const subDir = path.join(CWD, 'subdir');
132
+ const subDirCustomFile = path.join(subDir, customFilename);
133
+ const cwdCustomFile = path.join(CWD, customFilename);
134
+ mockFs.access.mockImplementation(async (p) => {
135
+ if (p === cwdCustomFile || p === subDirCustomFile)
136
+ return undefined;
137
+ throw new Error('File not found');
138
+ });
139
+ mockFs.readFile.mockImplementation(async (p) => {
140
+ if (p === cwdCustomFile)
141
+ return 'CWD custom memory';
142
+ if (p === subDirCustomFile)
143
+ return 'Subdir custom memory';
144
+ throw new Error('File not found');
145
+ });
146
+ mockFs.readdir.mockImplementation((async (p) => {
147
+ if (p === CWD) {
148
+ return [
149
+ {
150
+ name: customFilename,
151
+ isFile: () => true,
152
+ isDirectory: () => false,
153
+ },
154
+ {
155
+ name: 'subdir',
156
+ isFile: () => false,
157
+ isDirectory: () => true,
158
+ },
159
+ ];
160
+ }
161
+ if (p === subDir) {
162
+ return [
163
+ {
164
+ name: customFilename,
165
+ isFile: () => true,
166
+ isDirectory: () => false,
167
+ },
168
+ ];
169
+ }
170
+ return [];
171
+ }));
172
+ const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
173
+ const expectedContent = `--- Context from: ${customFilename} ---\nCWD custom memory\n--- End of Context from: ${customFilename} ---\n\n` +
174
+ `--- Context from: ${path.join('subdir', customFilename)} ---\nSubdir custom memory\n--- End of Context from: ${path.join('subdir', customFilename)} ---`;
175
+ expect(memoryContent).toBe(expectedContent);
176
+ expect(fileCount).toBe(2);
177
+ });
178
+ it('should load ORIGINAL_GEMINI_MD_FILENAME files by upward traversal from CWD to project root', async () => {
179
+ const projectRootGeminiFile = path.join(PROJECT_ROOT, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
180
+ const srcGeminiFile = path.join(CWD, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
181
+ mockFs.stat.mockImplementation(async (p) => {
182
+ if (p === path.join(PROJECT_ROOT, '.git')) {
183
+ return { isDirectory: () => true };
184
+ }
185
+ throw new Error('File not found');
186
+ });
187
+ mockFs.access.mockImplementation(async (p) => {
188
+ if (p === projectRootGeminiFile || p === srcGeminiFile) {
189
+ return undefined;
190
+ }
191
+ throw new Error('File not found');
192
+ });
193
+ mockFs.readFile.mockImplementation(async (p) => {
194
+ if (p === projectRootGeminiFile) {
195
+ return 'Project root memory';
196
+ }
197
+ if (p === srcGeminiFile) {
198
+ return 'Src directory memory';
199
+ }
200
+ throw new Error('File not found');
201
+ });
202
+ const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
203
+ const expectedContent = `--- Context from: ${path.relative(CWD, projectRootGeminiFile)} ---\nProject root memory\n--- End of Context from: ${path.relative(CWD, projectRootGeminiFile)} ---\n\n` +
204
+ `--- Context from: ${ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST} ---\nSrc directory memory\n--- End of Context from: ${ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST} ---`;
205
+ expect(memoryContent).toBe(expectedContent);
206
+ expect(fileCount).toBe(2);
207
+ expect(mockFs.readFile).toHaveBeenCalledWith(projectRootGeminiFile, 'utf-8');
208
+ expect(mockFs.readFile).toHaveBeenCalledWith(srcGeminiFile, 'utf-8');
209
+ });
210
+ it('should load ORIGINAL_GEMINI_MD_FILENAME files by downward traversal from CWD', async () => {
211
+ const subDir = path.join(CWD, 'subdir');
212
+ const subDirGeminiFile = path.join(subDir, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
213
+ const cwdGeminiFile = path.join(CWD, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
214
+ mockFs.access.mockImplementation(async (p) => {
215
+ if (p === cwdGeminiFile || p === subDirGeminiFile)
216
+ return undefined;
217
+ throw new Error('File not found');
218
+ });
219
+ mockFs.readFile.mockImplementation(async (p) => {
220
+ if (p === cwdGeminiFile)
221
+ return 'CWD memory';
222
+ if (p === subDirGeminiFile)
223
+ return 'Subdir memory';
224
+ throw new Error('File not found');
225
+ });
226
+ mockFs.readdir.mockImplementation((async (p) => {
227
+ if (p === CWD) {
228
+ return [
229
+ {
230
+ name: ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST,
231
+ isFile: () => true,
232
+ isDirectory: () => false,
233
+ },
234
+ {
235
+ name: 'subdir',
236
+ isFile: () => false,
237
+ isDirectory: () => true,
238
+ },
239
+ ];
240
+ }
241
+ if (p === subDir) {
242
+ return [
243
+ {
244
+ name: ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST,
245
+ isFile: () => true,
246
+ isDirectory: () => false,
247
+ },
248
+ ];
249
+ }
250
+ return [];
251
+ }));
252
+ const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
253
+ const expectedContent = `--- Context from: ${ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST} ---\nCWD memory\n--- End of Context from: ${ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST} ---\n\n` +
254
+ `--- Context from: ${path.join('subdir', ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST)} ---\nSubdir memory\n--- End of Context from: ${path.join('subdir', ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST)} ---`;
255
+ expect(memoryContent).toBe(expectedContent);
256
+ expect(fileCount).toBe(2);
257
+ });
258
+ it('should load and correctly order global, upward, and downward ORIGINAL_GEMINI_MD_FILENAME files', async () => {
259
+ setLlxprtMdFilename(ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST); // Explicitly set for this test
260
+ const globalFileToUse = path.join(GLOBAL_LLXPRT_DIR, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
261
+ const projectParentDir = path.dirname(PROJECT_ROOT);
262
+ const projectParentGeminiFile = path.join(projectParentDir, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
263
+ const projectRootGeminiFile = path.join(PROJECT_ROOT, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
264
+ const cwdGeminiFile = path.join(CWD, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
265
+ const subDir = path.join(CWD, 'sub');
266
+ const subDirGeminiFile = path.join(subDir, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
267
+ mockFs.stat.mockImplementation(async (p) => {
268
+ if (p === path.join(PROJECT_ROOT, '.git')) {
269
+ return { isDirectory: () => true };
270
+ }
271
+ else if (p === path.join(PROJECT_ROOT, '.llxprt')) {
272
+ return { isDirectory: () => true };
273
+ }
274
+ throw new Error('File not found');
275
+ });
276
+ mockFs.access.mockImplementation(async (p) => {
277
+ if (p === globalFileToUse || // Use the dynamically set global file path
278
+ p === projectParentGeminiFile ||
279
+ p === projectRootGeminiFile ||
280
+ p === cwdGeminiFile ||
281
+ p === subDirGeminiFile) {
282
+ return undefined;
283
+ }
284
+ throw new Error('File not found');
285
+ });
286
+ mockFs.readFile.mockImplementation(async (p) => {
287
+ if (p === globalFileToUse)
288
+ return 'Global memory'; // Use the dynamically set global file path
289
+ if (p === projectParentGeminiFile)
290
+ return 'Project parent memory';
291
+ if (p === projectRootGeminiFile)
292
+ return 'Project root memory';
293
+ if (p === cwdGeminiFile)
294
+ return 'CWD memory';
295
+ if (p === subDirGeminiFile)
296
+ return 'Subdir memory';
297
+ throw new Error('File not found');
298
+ });
299
+ mockFs.readdir.mockImplementation((async (p) => {
300
+ if (p === CWD) {
301
+ return [
302
+ {
303
+ name: 'sub',
304
+ isFile: () => false,
305
+ isDirectory: () => true,
306
+ },
307
+ ];
308
+ }
309
+ if (p === subDir) {
310
+ return [
311
+ {
312
+ name: ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST,
313
+ isFile: () => true,
314
+ isDirectory: () => false,
315
+ },
316
+ ];
317
+ }
318
+ return [];
319
+ }));
320
+ const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
321
+ const relPathGlobal = path.relative(CWD, GLOBAL_GEMINI_FILE);
322
+ const relPathProjectParent = path.relative(CWD, projectParentGeminiFile);
323
+ const relPathProjectRoot = path.relative(CWD, projectRootGeminiFile);
324
+ const relPathCwd = ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST;
325
+ const relPathSubDir = path.join('sub', ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
326
+ const expectedContent = [
327
+ `--- Context from: ${relPathGlobal} ---\nGlobal memory\n--- End of Context from: ${relPathGlobal} ---`,
328
+ `--- Context from: ${relPathProjectParent} ---\nProject parent memory\n--- End of Context from: ${relPathProjectParent} ---`,
329
+ `--- Context from: ${relPathProjectRoot} ---\nProject root memory\n--- End of Context from: ${relPathProjectRoot} ---`,
330
+ `--- Context from: ${relPathCwd} ---\nCWD memory\n--- End of Context from: ${relPathCwd} ---`,
331
+ `--- Context from: ${relPathSubDir} ---\nSubdir memory\n--- End of Context from: ${relPathSubDir} ---`,
332
+ ].join('\n\n');
333
+ expect(memoryContent).toBe(expectedContent);
334
+ expect(fileCount).toBe(5);
335
+ });
336
+ it('should ignore specified directories during downward scan', async () => {
337
+ const ignoredDir = path.join(CWD, 'node_modules');
338
+ const ignoredDirGeminiFile = path.join(ignoredDir, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST); // Corrected
339
+ const regularSubDir = path.join(CWD, 'my_code');
340
+ const regularSubDirGeminiFile = path.join(regularSubDir, ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST);
341
+ mockFs.access.mockImplementation(async (p) => {
342
+ if (p === regularSubDirGeminiFile)
343
+ return undefined;
344
+ if (p === ignoredDirGeminiFile)
345
+ throw new Error('Should not access ignored file');
346
+ throw new Error('File not found');
347
+ });
348
+ mockFs.readFile.mockImplementation(async (p) => {
349
+ if (p === regularSubDirGeminiFile)
350
+ return 'My code memory';
351
+ throw new Error('File not found');
352
+ });
353
+ mockFs.readdir.mockImplementation((async (p) => {
354
+ if (p === CWD) {
355
+ return [
356
+ {
357
+ name: 'node_modules',
358
+ isFile: () => false,
359
+ isDirectory: () => true,
360
+ },
361
+ {
362
+ name: 'my_code',
363
+ isFile: () => false,
364
+ isDirectory: () => true,
365
+ },
366
+ ];
367
+ }
368
+ if (p === regularSubDir) {
369
+ return [
370
+ {
371
+ name: ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST,
372
+ isFile: () => true,
373
+ isDirectory: () => false,
374
+ },
375
+ ];
376
+ }
377
+ if (p === ignoredDir) {
378
+ return [];
379
+ }
380
+ return [];
381
+ }));
382
+ const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService);
383
+ const expectedContent = `--- Context from: ${path.join('my_code', ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST)} ---\nMy code memory\n--- End of Context from: ${path.join('my_code', ORIGINAL_LLXPRT_MD_FILENAME_CONST_FOR_TEST)} ---`;
384
+ expect(memoryContent).toBe(expectedContent);
385
+ expect(fileCount).toBe(1);
386
+ expect(mockFs.readFile).not.toHaveBeenCalledWith(ignoredDirGeminiFile, 'utf-8');
387
+ });
388
+ it('should respect MAX_DIRECTORIES_TO_SCAN_FOR_MEMORY during downward scan', async () => {
389
+ const consoleDebugSpy = vi
390
+ .spyOn(console, 'debug')
391
+ .mockImplementation(() => { });
392
+ const dirNames = [];
393
+ for (let i = 0; i < 250; i++) {
394
+ dirNames.push({
395
+ name: `deep_dir_${i}`,
396
+ isFile: () => false,
397
+ isDirectory: () => true,
398
+ });
399
+ }
400
+ mockFs.readdir.mockImplementation((async (p) => {
401
+ if (p === CWD)
402
+ return dirNames;
403
+ if (p.toString().startsWith(path.join(CWD, 'deep_dir_')))
404
+ return [];
405
+ return [];
406
+ }));
407
+ mockFs.access.mockRejectedValue(new Error('not found'));
408
+ await loadServerHierarchicalMemory(CWD, true, fileService);
409
+ expect(consoleDebugSpy).toHaveBeenCalledWith(expect.stringContaining('[DEBUG] [BfsFileSearch]'), expect.stringContaining('Scanning [200/200]:'));
410
+ consoleDebugSpy.mockRestore();
411
+ });
412
+ it('should load extension context file paths', async () => {
413
+ const extensionFilePath = '/test/extensions/ext1/LLXPRT.md';
414
+ mockFs.access.mockImplementation(async (p) => {
415
+ if (p === extensionFilePath) {
416
+ return undefined;
417
+ }
418
+ throw new Error('File not found');
419
+ });
420
+ mockFs.readFile.mockImplementation(async (p) => {
421
+ if (p === extensionFilePath) {
422
+ return 'Extension memory content';
423
+ }
424
+ throw new Error('File not found');
425
+ });
426
+ const { memoryContent, fileCount } = await loadServerHierarchicalMemory(CWD, false, fileService, [extensionFilePath]);
427
+ expect(memoryContent).toBe(`--- Context from: ${path.relative(CWD, extensionFilePath)} ---\nExtension memory content\n--- End of Context from: ${path.relative(CWD, extensionFilePath)} ---`);
428
+ expect(fileCount).toBe(1);
429
+ expect(mockFs.readFile).toHaveBeenCalledWith(extensionFilePath, 'utf-8');
430
+ });
431
+ });
432
+ //# sourceMappingURL=memoryDiscovery.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryDiscovery.test.js","sourceRoot":"","sources":["../../../src/utils/memoryDiscovery.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Interface for tracking import processing state to prevent circular imports
8
+ */
9
+ interface ImportState {
10
+ processedFiles: Set<string>;
11
+ maxDepth: number;
12
+ currentDepth: number;
13
+ currentFile?: string;
14
+ }
15
+ /**
16
+ * Processes import statements in LLXPRT.md content
17
+ * Supports @path/to/file.md syntax for importing content from other files
18
+ *
19
+ * @param content - The content to process for imports
20
+ * @param basePath - The directory path where the current file is located
21
+ * @param debugMode - Whether to enable debug logging
22
+ * @param importState - State tracking for circular import prevention
23
+ * @returns Processed content with imports resolved
24
+ */
25
+ export declare function processImports(content: string, basePath: string, debugMode?: boolean, importState?: ImportState): Promise<string>;
26
+ /**
27
+ * Validates import paths to ensure they are safe and within allowed directories
28
+ *
29
+ * @param importPath - The import path to validate
30
+ * @param basePath - The base directory for resolving relative paths
31
+ * @param allowedDirectories - Array of allowed directory paths
32
+ * @returns Whether the import path is valid
33
+ */
34
+ export declare function validateImportPath(importPath: string, basePath: string, allowedDirectories: string[]): boolean;
35
+ export {};
@@ -0,0 +1,141 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ // Simple console logger for import processing
9
+ const logger = {
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ debug: (...args) => console.debug('[DEBUG] [ImportProcessor]', ...args),
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ warn: (...args) => console.warn('[WARN] [ImportProcessor]', ...args),
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ error: (...args) => console.error('[ERROR] [ImportProcessor]', ...args),
16
+ };
17
+ /**
18
+ * Processes import statements in LLXPRT.md content
19
+ * Supports @path/to/file.md syntax for importing content from other files
20
+ *
21
+ * @param content - The content to process for imports
22
+ * @param basePath - The directory path where the current file is located
23
+ * @param debugMode - Whether to enable debug logging
24
+ * @param importState - State tracking for circular import prevention
25
+ * @returns Processed content with imports resolved
26
+ */
27
+ export async function processImports(content, basePath, debugMode = false, importState = {
28
+ processedFiles: new Set(),
29
+ maxDepth: 10,
30
+ currentDepth: 0,
31
+ }) {
32
+ if (importState.currentDepth >= importState.maxDepth) {
33
+ if (debugMode) {
34
+ logger.warn(`Maximum import depth (${importState.maxDepth}) reached. Stopping import processing.`);
35
+ }
36
+ return content;
37
+ }
38
+ // Regex to match @path/to/file imports (supports any file extension)
39
+ // Supports both @path/to/file.md and @./path/to/file.md syntax
40
+ const importRegex = /@([./]?[^\s\n]+\.[^\s\n]+)/g;
41
+ let processedContent = content;
42
+ let match;
43
+ // Process all imports in the content
44
+ while ((match = importRegex.exec(content)) !== null) {
45
+ const importPath = match[1];
46
+ // Validate import path to prevent path traversal attacks
47
+ if (!validateImportPath(importPath, basePath, [basePath])) {
48
+ processedContent = processedContent.replace(match[0], `<!-- Import failed: ${importPath} - Path traversal attempt -->`);
49
+ continue;
50
+ }
51
+ // Check if the import is for a non-md file and warn
52
+ if (!importPath.endsWith('.md')) {
53
+ logger.warn(`Import processor only supports .md files. Attempting to import non-md file: ${importPath}. This will fail.`);
54
+ // Replace the import with a warning comment
55
+ processedContent = processedContent.replace(match[0], `<!-- Import failed: ${importPath} - Only .md files are supported -->`);
56
+ continue;
57
+ }
58
+ const fullPath = path.resolve(basePath, importPath);
59
+ if (debugMode) {
60
+ logger.debug(`Processing import: ${importPath} -> ${fullPath}`);
61
+ }
62
+ // Check for circular imports - if we're already processing this file
63
+ if (importState.currentFile === fullPath) {
64
+ if (debugMode) {
65
+ logger.warn(`Circular import detected: ${importPath}`);
66
+ }
67
+ // Replace the import with a warning comment
68
+ processedContent = processedContent.replace(match[0], `<!-- Circular import detected: ${importPath} -->`);
69
+ continue;
70
+ }
71
+ // Check if we've already processed this file in this import chain
72
+ if (importState.processedFiles.has(fullPath)) {
73
+ if (debugMode) {
74
+ logger.warn(`File already processed in this chain: ${importPath}`);
75
+ }
76
+ // Replace the import with a warning comment
77
+ processedContent = processedContent.replace(match[0], `<!-- File already processed: ${importPath} -->`);
78
+ continue;
79
+ }
80
+ // Check for potential circular imports by looking at the import chain
81
+ if (importState.currentFile) {
82
+ const currentFileDir = path.dirname(importState.currentFile);
83
+ const potentialCircularPath = path.resolve(currentFileDir, importPath);
84
+ if (potentialCircularPath === importState.currentFile) {
85
+ if (debugMode) {
86
+ logger.warn(`Circular import detected: ${importPath}`);
87
+ }
88
+ // Replace the import with a warning comment
89
+ processedContent = processedContent.replace(match[0], `<!-- Circular import detected: ${importPath} -->`);
90
+ continue;
91
+ }
92
+ }
93
+ try {
94
+ // Check if the file exists
95
+ await fs.access(fullPath);
96
+ // Read the imported file content
97
+ const importedContent = await fs.readFile(fullPath, 'utf-8');
98
+ if (debugMode) {
99
+ logger.debug(`Successfully read imported file: ${fullPath}`);
100
+ }
101
+ // Recursively process imports in the imported content
102
+ const processedImportedContent = await processImports(importedContent, path.dirname(fullPath), debugMode, {
103
+ ...importState,
104
+ processedFiles: new Set([...importState.processedFiles, fullPath]),
105
+ currentDepth: importState.currentDepth + 1,
106
+ currentFile: fullPath, // Set the current file being processed
107
+ });
108
+ // Replace the import statement with the processed content
109
+ processedContent = processedContent.replace(match[0], `<!-- Imported from: ${importPath} -->\n${processedImportedContent}\n<!-- End of import from: ${importPath} -->`);
110
+ }
111
+ catch (error) {
112
+ const errorMessage = error instanceof Error ? error.message : String(error);
113
+ if (debugMode) {
114
+ logger.error(`Failed to import ${importPath}: ${errorMessage}`);
115
+ }
116
+ // Replace the import with an error comment
117
+ processedContent = processedContent.replace(match[0], `<!-- Import failed: ${importPath} - ${errorMessage} -->`);
118
+ }
119
+ }
120
+ return processedContent;
121
+ }
122
+ /**
123
+ * Validates import paths to ensure they are safe and within allowed directories
124
+ *
125
+ * @param importPath - The import path to validate
126
+ * @param basePath - The base directory for resolving relative paths
127
+ * @param allowedDirectories - Array of allowed directory paths
128
+ * @returns Whether the import path is valid
129
+ */
130
+ export function validateImportPath(importPath, basePath, allowedDirectories) {
131
+ // Reject URLs
132
+ if (/^(file|https?):\/\//.test(importPath)) {
133
+ return false;
134
+ }
135
+ const resolvedPath = path.resolve(basePath, importPath);
136
+ return allowedDirectories.some((allowedDir) => {
137
+ const normalizedAllowedDir = path.resolve(allowedDir);
138
+ return resolvedPath.startsWith(normalizedAllowedDir);
139
+ });
140
+ }
141
+ //# sourceMappingURL=memoryImportProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryImportProcessor.js","sourceRoot":"","sources":["../../../src/utils/memoryImportProcessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,8CAA8C;AAC9C,MAAM,MAAM,GAAG;IACb,8DAA8D;IAC9D,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CACxB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,IAAI,CAAC;IACrD,8DAA8D;IAC9D,IAAI,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,IAAI,CAAC;IAC3E,8DAA8D;IAC9D,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CACxB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,IAAI,CAAC;CACtD,CAAC;AAYF;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,QAAgB,EAChB,YAAqB,KAAK,EAC1B,cAA2B;IACzB,cAAc,EAAE,IAAI,GAAG,EAAE;IACzB,QAAQ,EAAE,EAAE;IACZ,YAAY,EAAE,CAAC;CAChB;IAED,IAAI,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;QACrD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CACT,yBAAyB,WAAW,CAAC,QAAQ,wCAAwC,CACtF,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,qEAAqE;IACrE,+DAA+D;IAC/D,MAAM,WAAW,GAAG,6BAA6B,CAAC;IAElD,IAAI,gBAAgB,GAAG,OAAO,CAAC;IAC/B,IAAI,KAA6B,CAAC;IAElC,qCAAqC;IACrC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAE5B,yDAAyD;QACzD,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC1D,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,uBAAuB,UAAU,+BAA+B,CACjE,CAAC;YACF,SAAS;QACX,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CACT,+EAA+E,UAAU,mBAAmB,CAC7G,CAAC;YACF,4CAA4C;YAC5C,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,uBAAuB,UAAU,qCAAqC,CACvE,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEpD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,CAAC,sBAAsB,UAAU,OAAO,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,qEAAqE;QACrE,IAAI,WAAW,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,4CAA4C;YAC5C,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,kCAAkC,UAAU,MAAM,CACnD,CAAC;YACF,SAAS;QACX,CAAC;QAED,kEAAkE;QAClE,IAAI,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7C,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,4CAA4C;YAC5C,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,gCAAgC,UAAU,MAAM,CACjD,CAAC;YACF,SAAS;QACX,CAAC;QAED,sEAAsE;QACtE,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC7D,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YACvE,IAAI,qBAAqB,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;gBACtD,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;gBACzD,CAAC;gBACD,4CAA4C;gBAC5C,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,kCAAkC,UAAU,MAAM,CACnD,CAAC;gBACF,SAAS;YACX,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,2BAA2B;YAC3B,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE1B,iCAAiC;YACjC,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE7D,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,sDAAsD;YACtD,MAAM,wBAAwB,GAAG,MAAM,cAAc,CACnD,eAAe,EACf,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EACtB,SAAS,EACT;gBACE,GAAG,WAAW;gBACd,cAAc,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;gBAClE,YAAY,EAAE,WAAW,CAAC,YAAY,GAAG,CAAC;gBAC1C,WAAW,EAAE,QAAQ,EAAE,uCAAuC;aAC/D,CACF,CAAC;YAEF,0DAA0D;YAC1D,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,uBAAuB,UAAU,SAAS,wBAAwB,8BAA8B,UAAU,MAAM,CACjH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC,oBAAoB,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;YAClE,CAAC;YAED,2CAA2C;YAC3C,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,uBAAuB,UAAU,MAAM,YAAY,MAAM,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAkB,EAClB,QAAgB,EAChB,kBAA4B;IAE5B,cAAc;IACd,IAAI,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAExD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;QAC5C,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACtD,OAAO,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};