@machina.ai/cell-cli-core 1.0.13-rc3

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 (435) 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 +329 -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 +244 -0
  22. package/dist/src/code_assist/oauth2.test.js.map +1 -0
  23. package/dist/src/code_assist/server.d.ts +37 -0
  24. package/dist/src/code_assist/server.js +125 -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 +131 -0
  28. package/dist/src/code_assist/server.test.js.map +1 -0
  29. package/dist/src/code_assist/setup.d.ts +20 -0
  30. package/dist/src/code_assist/setup.js +70 -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 +65 -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 +239 -0
  39. package/dist/src/config/config.js +484 -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 +304 -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 +60 -0
  51. package/dist/src/core/client.js +502 -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 +853 -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 +110 -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 +225 -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 +410 -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 +402 -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 +511 -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 +35 -0
  81. package/dist/src/core/logger.js +235 -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 +62 -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 +97 -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 +189 -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 +335 -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 +27 -0
  103. package/dist/src/core/tokenLimits.js.map +1 -0
  104. package/dist/src/core/turn.d.ts +111 -0
  105. package/dist/src/core/turn.js +139 -0
  106. package/dist/src/core/turn.js.map +1 -0
  107. package/dist/src/core/turn.test.d.ts +6 -0
  108. package/dist/src/core/turn.test.js +365 -0
  109. package/dist/src/core/turn.test.js.map +1 -0
  110. package/dist/src/index.d.ts +57 -0
  111. package/dist/src/index.js +64 -0
  112. package/dist/src/index.js.map +1 -0
  113. package/dist/src/index.test.d.ts +6 -0
  114. package/dist/src/index.test.js +12 -0
  115. package/dist/src/index.test.js.map +1 -0
  116. package/dist/src/mcp/oauth-provider.d.ts +142 -0
  117. package/dist/src/mcp/oauth-provider.js +446 -0
  118. package/dist/src/mcp/oauth-provider.js.map +1 -0
  119. package/dist/src/mcp/oauth-provider.test.d.ts +6 -0
  120. package/dist/src/mcp/oauth-provider.test.js +520 -0
  121. package/dist/src/mcp/oauth-provider.test.js.map +1 -0
  122. package/dist/src/mcp/oauth-token-storage.d.ts +81 -0
  123. package/dist/src/mcp/oauth-token-storage.js +149 -0
  124. package/dist/src/mcp/oauth-token-storage.js.map +1 -0
  125. package/dist/src/mcp/oauth-token-storage.test.d.ts +6 -0
  126. package/dist/src/mcp/oauth-token-storage.test.js +205 -0
  127. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -0
  128. package/dist/src/mcp/oauth-utils.d.ts +109 -0
  129. package/dist/src/mcp/oauth-utils.js +183 -0
  130. package/dist/src/mcp/oauth-utils.js.map +1 -0
  131. package/dist/src/mcp/oauth-utils.test.d.ts +6 -0
  132. package/dist/src/mcp/oauth-utils.test.js +144 -0
  133. package/dist/src/mcp/oauth-utils.test.js.map +1 -0
  134. package/dist/src/services/fileDiscoveryService.d.ts +35 -0
  135. package/dist/src/services/fileDiscoveryService.js +91 -0
  136. package/dist/src/services/fileDiscoveryService.js.map +1 -0
  137. package/dist/src/services/fileDiscoveryService.test.d.ts +6 -0
  138. package/dist/src/services/fileDiscoveryService.test.js +102 -0
  139. package/dist/src/services/fileDiscoveryService.test.js.map +1 -0
  140. package/dist/src/services/gitService.d.ts +21 -0
  141. package/dist/src/services/gitService.js +101 -0
  142. package/dist/src/services/gitService.js.map +1 -0
  143. package/dist/src/services/gitService.test.d.ts +6 -0
  144. package/dist/src/services/gitService.test.js +228 -0
  145. package/dist/src/services/gitService.test.js.map +1 -0
  146. package/dist/src/services/ideContext.d.ts +178 -0
  147. package/dist/src/services/ideContext.js +105 -0
  148. package/dist/src/services/ideContext.js.map +1 -0
  149. package/dist/src/services/ideContext.test.d.ts +6 -0
  150. package/dist/src/services/ideContext.test.js +111 -0
  151. package/dist/src/services/ideContext.test.js.map +1 -0
  152. package/dist/src/services/loopDetectionService.d.ts +51 -0
  153. package/dist/src/services/loopDetectionService.js +232 -0
  154. package/dist/src/services/loopDetectionService.js.map +1 -0
  155. package/dist/src/services/loopDetectionService.test.d.ts +6 -0
  156. package/dist/src/services/loopDetectionService.test.js +339 -0
  157. package/dist/src/services/loopDetectionService.test.js.map +1 -0
  158. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +37 -0
  159. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +456 -0
  160. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -0
  161. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +49 -0
  162. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +127 -0
  163. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -0
  164. package/dist/src/telemetry/constants.d.ts +20 -0
  165. package/dist/src/telemetry/constants.js +21 -0
  166. package/dist/src/telemetry/constants.js.map +1 -0
  167. package/dist/src/telemetry/index.d.ts +18 -0
  168. package/dist/src/telemetry/index.js +20 -0
  169. package/dist/src/telemetry/index.js.map +1 -0
  170. package/dist/src/telemetry/integration.test.circular.d.ts +6 -0
  171. package/dist/src/telemetry/integration.test.circular.js +53 -0
  172. package/dist/src/telemetry/integration.test.circular.js.map +1 -0
  173. package/dist/src/telemetry/loggers.d.ts +15 -0
  174. package/dist/src/telemetry/loggers.js +220 -0
  175. package/dist/src/telemetry/loggers.js.map +1 -0
  176. package/dist/src/telemetry/loggers.test.circular.d.ts +6 -0
  177. package/dist/src/telemetry/loggers.test.circular.js +100 -0
  178. package/dist/src/telemetry/loggers.test.circular.js.map +1 -0
  179. package/dist/src/telemetry/loggers.test.d.ts +6 -0
  180. package/dist/src/telemetry/loggers.test.js +558 -0
  181. package/dist/src/telemetry/loggers.test.js.map +1 -0
  182. package/dist/src/telemetry/metrics.d.ts +19 -0
  183. package/dist/src/telemetry/metrics.js +144 -0
  184. package/dist/src/telemetry/metrics.js.map +1 -0
  185. package/dist/src/telemetry/metrics.test.d.ts +6 -0
  186. package/dist/src/telemetry/metrics.test.js +162 -0
  187. package/dist/src/telemetry/metrics.test.js.map +1 -0
  188. package/dist/src/telemetry/sdk.d.ts +9 -0
  189. package/dist/src/telemetry/sdk.js +116 -0
  190. package/dist/src/telemetry/sdk.js.map +1 -0
  191. package/dist/src/telemetry/telemetry.test.d.ts +6 -0
  192. package/dist/src/telemetry/telemetry.test.js +50 -0
  193. package/dist/src/telemetry/telemetry.test.js.map +1 -0
  194. package/dist/src/telemetry/types.d.ts +116 -0
  195. package/dist/src/telemetry/types.js +218 -0
  196. package/dist/src/telemetry/types.js.map +1 -0
  197. package/dist/src/telemetry/uiTelemetry.d.ts +68 -0
  198. package/dist/src/telemetry/uiTelemetry.js +138 -0
  199. package/dist/src/telemetry/uiTelemetry.js.map +1 -0
  200. package/dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
  201. package/dist/src/telemetry/uiTelemetry.test.js +504 -0
  202. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -0
  203. package/dist/src/tools/diffOptions.d.ts +7 -0
  204. package/dist/src/tools/diffOptions.js +10 -0
  205. package/dist/src/tools/diffOptions.js.map +1 -0
  206. package/dist/src/tools/edit.d.ts +79 -0
  207. package/dist/src/tools/edit.js +362 -0
  208. package/dist/src/tools/edit.js.map +1 -0
  209. package/dist/src/tools/edit.test.d.ts +6 -0
  210. package/dist/src/tools/edit.test.js +512 -0
  211. package/dist/src/tools/edit.test.js.map +1 -0
  212. package/dist/src/tools/glob.d.ts +58 -0
  213. package/dist/src/tools/glob.js +193 -0
  214. package/dist/src/tools/glob.js.map +1 -0
  215. package/dist/src/tools/glob.test.d.ts +6 -0
  216. package/dist/src/tools/glob.test.js +294 -0
  217. package/dist/src/tools/glob.test.js.map +1 -0
  218. package/dist/src/tools/grep.d.ts +78 -0
  219. package/dist/src/tools/grep.js +422 -0
  220. package/dist/src/tools/grep.js.map +1 -0
  221. package/dist/src/tools/grep.test.d.ts +6 -0
  222. package/dist/src/tools/grep.test.js +188 -0
  223. package/dist/src/tools/grep.test.js.map +1 -0
  224. package/dist/src/tools/ls.d.ts +86 -0
  225. package/dist/src/tools/ls.js +223 -0
  226. package/dist/src/tools/ls.js.map +1 -0
  227. package/dist/src/tools/mcp-client.d.ts +110 -0
  228. package/dist/src/tools/mcp-client.js +319 -0
  229. package/dist/src/tools/mcp-client.js.map +1 -0
  230. package/dist/src/tools/mcp-client.test.d.ts +6 -0
  231. package/dist/src/tools/mcp-client.test.js +156 -0
  232. package/dist/src/tools/mcp-client.test.js.map +1 -0
  233. package/dist/src/tools/mcp-tool.d.ts +29 -0
  234. package/dist/src/tools/mcp-tool.js +143 -0
  235. package/dist/src/tools/mcp-tool.js.map +1 -0
  236. package/dist/src/tools/mcp-tool.test.d.ts +6 -0
  237. package/dist/src/tools/mcp-tool.test.js +189 -0
  238. package/dist/src/tools/mcp-tool.test.js.map +1 -0
  239. package/dist/src/tools/memoryTool.d.ts +28 -0
  240. package/dist/src/tools/memoryTool.js +172 -0
  241. package/dist/src/tools/memoryTool.js.map +1 -0
  242. package/dist/src/tools/memoryTool.test.d.ts +6 -0
  243. package/dist/src/tools/memoryTool.test.js +181 -0
  244. package/dist/src/tools/memoryTool.test.js.map +1 -0
  245. package/dist/src/tools/modifiable-tool.d.ts +29 -0
  246. package/dist/src/tools/modifiable-tool.js +85 -0
  247. package/dist/src/tools/modifiable-tool.js.map +1 -0
  248. package/dist/src/tools/modifiable-tool.test.d.ts +6 -0
  249. package/dist/src/tools/modifiable-tool.test.js +204 -0
  250. package/dist/src/tools/modifiable-tool.test.js.map +1 -0
  251. package/dist/src/tools/read-file.d.ts +36 -0
  252. package/dist/src/tools/read-file.js +102 -0
  253. package/dist/src/tools/read-file.js.map +1 -0
  254. package/dist/src/tools/read-file.test.d.ts +6 -0
  255. package/dist/src/tools/read-file.test.js +181 -0
  256. package/dist/src/tools/read-file.test.js.map +1 -0
  257. package/dist/src/tools/read-many-files.d.ts +62 -0
  258. package/dist/src/tools/read-many-files.js +362 -0
  259. package/dist/src/tools/read-many-files.js.map +1 -0
  260. package/dist/src/tools/read-many-files.test.d.ts +6 -0
  261. package/dist/src/tools/read-many-files.test.js +315 -0
  262. package/dist/src/tools/read-many-files.test.js.map +1 -0
  263. package/dist/src/tools/shell.d.ts +43 -0
  264. package/dist/src/tools/shell.js +435 -0
  265. package/dist/src/tools/shell.js.map +1 -0
  266. package/dist/src/tools/shell.test.d.ts +6 -0
  267. package/dist/src/tools/shell.test.js +406 -0
  268. package/dist/src/tools/shell.test.js.map +1 -0
  269. package/dist/src/tools/tool-registry.d.ts +66 -0
  270. package/dist/src/tools/tool-registry.js +329 -0
  271. package/dist/src/tools/tool-registry.js.map +1 -0
  272. package/dist/src/tools/tool-registry.test.d.ts +6 -0
  273. package/dist/src/tools/tool-registry.test.js +424 -0
  274. package/dist/src/tools/tool-registry.test.js.map +1 -0
  275. package/dist/src/tools/tools.d.ts +219 -0
  276. package/dist/src/tools/tools.js +111 -0
  277. package/dist/src/tools/tools.js.map +1 -0
  278. package/dist/src/tools/web-fetch.d.ts +29 -0
  279. package/dist/src/tools/web-fetch.js +246 -0
  280. package/dist/src/tools/web-fetch.js.map +1 -0
  281. package/dist/src/tools/web-fetch.test.d.ts +6 -0
  282. package/dist/src/tools/web-fetch.test.js +71 -0
  283. package/dist/src/tools/web-fetch.test.js.map +1 -0
  284. package/dist/src/tools/web-search.d.ts +49 -0
  285. package/dist/src/tools/web-search.js +120 -0
  286. package/dist/src/tools/web-search.js.map +1 -0
  287. package/dist/src/tools/write-file.d.ts +42 -0
  288. package/dist/src/tools/write-file.js +253 -0
  289. package/dist/src/tools/write-file.js.map +1 -0
  290. package/dist/src/tools/write-file.test.d.ts +6 -0
  291. package/dist/src/tools/write-file.test.js +413 -0
  292. package/dist/src/tools/write-file.test.js.map +1 -0
  293. package/dist/src/utils/LruCache.d.ts +13 -0
  294. package/dist/src/utils/LruCache.js +38 -0
  295. package/dist/src/utils/LruCache.js.map +1 -0
  296. package/dist/src/utils/bfsFileSearch.d.ts +24 -0
  297. package/dist/src/utils/bfsFileSearch.js +65 -0
  298. package/dist/src/utils/bfsFileSearch.js.map +1 -0
  299. package/dist/src/utils/bfsFileSearch.test.d.ts +6 -0
  300. package/dist/src/utils/bfsFileSearch.test.js +162 -0
  301. package/dist/src/utils/bfsFileSearch.test.js.map +1 -0
  302. package/dist/src/utils/browser.d.ts +13 -0
  303. package/dist/src/utils/browser.js +49 -0
  304. package/dist/src/utils/browser.js.map +1 -0
  305. package/dist/src/utils/editCorrector.d.ts +53 -0
  306. package/dist/src/utils/editCorrector.js +546 -0
  307. package/dist/src/utils/editCorrector.js.map +1 -0
  308. package/dist/src/utils/editCorrector.test.d.ts +6 -0
  309. package/dist/src/utils/editCorrector.test.js +564 -0
  310. package/dist/src/utils/editCorrector.test.js.map +1 -0
  311. package/dist/src/utils/editor.d.ts +28 -0
  312. package/dist/src/utils/editor.js +169 -0
  313. package/dist/src/utils/editor.js.map +1 -0
  314. package/dist/src/utils/editor.test.d.ts +6 -0
  315. package/dist/src/utils/editor.test.js +393 -0
  316. package/dist/src/utils/editor.test.js.map +1 -0
  317. package/dist/src/utils/errorReporting.d.ts +14 -0
  318. package/dist/src/utils/errorReporting.js +88 -0
  319. package/dist/src/utils/errorReporting.js.map +1 -0
  320. package/dist/src/utils/errorReporting.test.d.ts +6 -0
  321. package/dist/src/utils/errorReporting.test.js +124 -0
  322. package/dist/src/utils/errorReporting.test.js.map +1 -0
  323. package/dist/src/utils/errors.d.ts +14 -0
  324. package/dist/src/utils/errors.js +54 -0
  325. package/dist/src/utils/errors.js.map +1 -0
  326. package/dist/src/utils/fetch.d.ts +11 -0
  327. package/dist/src/utils/fetch.js +51 -0
  328. package/dist/src/utils/fetch.js.map +1 -0
  329. package/dist/src/utils/fileUtils.d.ts +49 -0
  330. package/dist/src/utils/fileUtils.js +300 -0
  331. package/dist/src/utils/fileUtils.js.map +1 -0
  332. package/dist/src/utils/fileUtils.test.d.ts +6 -0
  333. package/dist/src/utils/fileUtils.test.js +321 -0
  334. package/dist/src/utils/fileUtils.test.js.map +1 -0
  335. package/dist/src/utils/flashFallback.integration.test.d.ts +6 -0
  336. package/dist/src/utils/flashFallback.integration.test.js +112 -0
  337. package/dist/src/utils/flashFallback.integration.test.js.map +1 -0
  338. package/dist/src/utils/generateContentResponseUtilities.d.ts +14 -0
  339. package/dist/src/utils/generateContentResponseUtilities.js +92 -0
  340. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -0
  341. package/dist/src/utils/generateContentResponseUtilities.test.d.ts +6 -0
  342. package/dist/src/utils/generateContentResponseUtilities.test.js +273 -0
  343. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -0
  344. package/dist/src/utils/getFolderStructure.d.ts +31 -0
  345. package/dist/src/utils/getFolderStructure.js +246 -0
  346. package/dist/src/utils/getFolderStructure.js.map +1 -0
  347. package/dist/src/utils/getFolderStructure.test.d.ts +6 -0
  348. package/dist/src/utils/getFolderStructure.test.js +284 -0
  349. package/dist/src/utils/getFolderStructure.test.js.map +1 -0
  350. package/dist/src/utils/gitIgnoreParser.d.ts +20 -0
  351. package/dist/src/utils/gitIgnoreParser.js +67 -0
  352. package/dist/src/utils/gitIgnoreParser.js.map +1 -0
  353. package/dist/src/utils/gitIgnoreParser.test.d.ts +6 -0
  354. package/dist/src/utils/gitIgnoreParser.test.js +157 -0
  355. package/dist/src/utils/gitIgnoreParser.test.js.map +1 -0
  356. package/dist/src/utils/gitUtils.d.ts +17 -0
  357. package/dist/src/utils/gitUtils.js +61 -0
  358. package/dist/src/utils/gitUtils.js.map +1 -0
  359. package/dist/src/utils/memoryDiscovery.d.ts +15 -0
  360. package/dist/src/utils/memoryDiscovery.js +226 -0
  361. package/dist/src/utils/memoryDiscovery.js.map +1 -0
  362. package/dist/src/utils/memoryDiscovery.test.d.ts +6 -0
  363. package/dist/src/utils/memoryDiscovery.test.js +432 -0
  364. package/dist/src/utils/memoryDiscovery.test.js.map +1 -0
  365. package/dist/src/utils/memoryImportProcessor.d.ts +35 -0
  366. package/dist/src/utils/memoryImportProcessor.js +141 -0
  367. package/dist/src/utils/memoryImportProcessor.js.map +1 -0
  368. package/dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
  369. package/dist/src/utils/memoryImportProcessor.test.js +170 -0
  370. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -0
  371. package/dist/src/utils/messageInspectors.d.ts +8 -0
  372. package/dist/src/utils/messageInspectors.js +16 -0
  373. package/dist/src/utils/messageInspectors.js.map +1 -0
  374. package/dist/src/utils/nextSpeakerChecker.d.ts +12 -0
  375. package/dist/src/utils/nextSpeakerChecker.js +112 -0
  376. package/dist/src/utils/nextSpeakerChecker.js.map +1 -0
  377. package/dist/src/utils/nextSpeakerChecker.test.d.ts +6 -0
  378. package/dist/src/utils/nextSpeakerChecker.test.js +168 -0
  379. package/dist/src/utils/nextSpeakerChecker.test.js.map +1 -0
  380. package/dist/src/utils/paths.d.ts +59 -0
  381. package/dist/src/utils/paths.js +153 -0
  382. package/dist/src/utils/paths.js.map +1 -0
  383. package/dist/src/utils/quotaErrorDetection.d.ts +22 -0
  384. package/dist/src/utils/quotaErrorDetection.js +65 -0
  385. package/dist/src/utils/quotaErrorDetection.js.map +1 -0
  386. package/dist/src/utils/retry.d.ts +27 -0
  387. package/dist/src/utils/retry.js +276 -0
  388. package/dist/src/utils/retry.js.map +1 -0
  389. package/dist/src/utils/retry.test.d.ts +6 -0
  390. package/dist/src/utils/retry.test.js +322 -0
  391. package/dist/src/utils/retry.test.js.map +1 -0
  392. package/dist/src/utils/safeJsonStringify.d.ts +13 -0
  393. package/dist/src/utils/safeJsonStringify.js +25 -0
  394. package/dist/src/utils/safeJsonStringify.js.map +1 -0
  395. package/dist/src/utils/safeJsonStringify.test.d.ts +6 -0
  396. package/dist/src/utils/safeJsonStringify.test.js +61 -0
  397. package/dist/src/utils/safeJsonStringify.test.js.map +1 -0
  398. package/dist/src/utils/schemaValidator.d.ts +22 -0
  399. package/dist/src/utils/schemaValidator.js +65 -0
  400. package/dist/src/utils/schemaValidator.js.map +1 -0
  401. package/dist/src/utils/session.d.ts +6 -0
  402. package/dist/src/utils/session.js +8 -0
  403. package/dist/src/utils/session.js.map +1 -0
  404. package/dist/src/utils/stripJsonCodeBlock.d.ts +13 -0
  405. package/dist/src/utils/stripJsonCodeBlock.js +21 -0
  406. package/dist/src/utils/stripJsonCodeBlock.js.map +1 -0
  407. package/dist/src/utils/summarizer.d.ts +25 -0
  408. package/dist/src/utils/summarizer.js +80 -0
  409. package/dist/src/utils/summarizer.js.map +1 -0
  410. package/dist/src/utils/summarizer.test.d.ts +6 -0
  411. package/dist/src/utils/summarizer.test.js +131 -0
  412. package/dist/src/utils/summarizer.test.js.map +1 -0
  413. package/dist/src/utils/systemEncoding.d.ts +40 -0
  414. package/dist/src/utils/systemEncoding.js +149 -0
  415. package/dist/src/utils/systemEncoding.js.map +1 -0
  416. package/dist/src/utils/systemEncoding.test.d.ts +6 -0
  417. package/dist/src/utils/systemEncoding.test.js +368 -0
  418. package/dist/src/utils/systemEncoding.test.js.map +1 -0
  419. package/dist/src/utils/testUtils.d.ts +29 -0
  420. package/dist/src/utils/testUtils.js +70 -0
  421. package/dist/src/utils/testUtils.js.map +1 -0
  422. package/dist/src/utils/user_account.d.ts +9 -0
  423. package/dist/src/utils/user_account.js +99 -0
  424. package/dist/src/utils/user_account.js.map +1 -0
  425. package/dist/src/utils/user_account.test.d.ts +6 -0
  426. package/dist/src/utils/user_account.test.js +153 -0
  427. package/dist/src/utils/user_account.test.js.map +1 -0
  428. package/dist/src/utils/user_id.d.ts +11 -0
  429. package/dist/src/utils/user_id.js +49 -0
  430. package/dist/src/utils/user_id.js.map +1 -0
  431. package/dist/src/utils/user_id.test.d.ts +6 -0
  432. package/dist/src/utils/user_id.test.js +21 -0
  433. package/dist/src/utils/user_id.test.js.map +1 -0
  434. package/dist/tsconfig.tsbuildinfo +1 -0
  435. package/package.json +62 -0
@@ -0,0 +1,143 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseTool, ToolConfirmationOutcome, Icon, } from './tools.js';
7
+ import { Type, } from '@google/genai';
8
+ export class DiscoveredMCPTool extends BaseTool {
9
+ mcpTool;
10
+ serverName;
11
+ serverToolName;
12
+ parameterSchemaJson;
13
+ timeout;
14
+ trust;
15
+ static allowlist = new Set();
16
+ constructor(mcpTool, serverName, serverToolName, description, parameterSchemaJson, timeout, trust, nameOverride) {
17
+ super(nameOverride ?? generateValidName(serverToolName), `${serverToolName} (${serverName} MCP Server)`, description, Icon.Hammer, { type: Type.OBJECT }, // this is a dummy Schema for MCP, will be not be used to construct the FunctionDeclaration
18
+ true, // isOutputMarkdown
19
+ false);
20
+ this.mcpTool = mcpTool;
21
+ this.serverName = serverName;
22
+ this.serverToolName = serverToolName;
23
+ this.parameterSchemaJson = parameterSchemaJson;
24
+ this.timeout = timeout;
25
+ this.trust = trust;
26
+ }
27
+ asFullyQualifiedTool() {
28
+ return new DiscoveredMCPTool(this.mcpTool, this.serverName, this.serverToolName, this.description, this.parameterSchemaJson, this.timeout, this.trust, `${this.serverName}__${this.serverToolName}`);
29
+ }
30
+ /**
31
+ * Overrides the base schema to use parametersJsonSchema when building
32
+ * FunctionDeclaration
33
+ */
34
+ get schema() {
35
+ return {
36
+ name: this.name,
37
+ description: this.description,
38
+ parametersJsonSchema: this.parameterSchemaJson,
39
+ };
40
+ }
41
+ async shouldConfirmExecute(_params, _abortSignal) {
42
+ const serverAllowListKey = this.serverName;
43
+ const toolAllowListKey = `${this.serverName}.${this.serverToolName}`;
44
+ if (this.trust) {
45
+ return false; // server is trusted, no confirmation needed
46
+ }
47
+ if (DiscoveredMCPTool.allowlist.has(serverAllowListKey) ||
48
+ DiscoveredMCPTool.allowlist.has(toolAllowListKey)) {
49
+ return false; // server and/or tool already allowlisted
50
+ }
51
+ const confirmationDetails = {
52
+ type: 'mcp',
53
+ title: 'Confirm MCP Tool Execution',
54
+ serverName: this.serverName,
55
+ toolName: this.serverToolName, // Display original tool name in confirmation
56
+ toolDisplayName: this.name, // Display global registry name exposed to model and user
57
+ onConfirm: async (outcome) => {
58
+ if (outcome === ToolConfirmationOutcome.ProceedAlwaysServer) {
59
+ DiscoveredMCPTool.allowlist.add(serverAllowListKey);
60
+ }
61
+ else if (outcome === ToolConfirmationOutcome.ProceedAlwaysTool) {
62
+ DiscoveredMCPTool.allowlist.add(toolAllowListKey);
63
+ }
64
+ },
65
+ };
66
+ return confirmationDetails;
67
+ }
68
+ async execute(params) {
69
+ const functionCalls = [
70
+ {
71
+ name: this.serverToolName,
72
+ args: params,
73
+ },
74
+ ];
75
+ const responseParts = await this.mcpTool.callTool(functionCalls);
76
+ return {
77
+ llmContent: responseParts,
78
+ returnDisplay: getStringifiedResultForDisplay(responseParts),
79
+ };
80
+ }
81
+ }
82
+ /**
83
+ * Processes an array of `Part` objects, primarily from a tool's execution result,
84
+ * to generate a user-friendly string representation, typically for display in a CLI.
85
+ *
86
+ * The `result` array can contain various types of `Part` objects:
87
+ * 1. `FunctionResponse` parts:
88
+ * - If the `response.content` of a `FunctionResponse` is an array consisting solely
89
+ * of `TextPart` objects, their text content is concatenated into a single string.
90
+ * This is to present simple textual outputs directly.
91
+ * - If `response.content` is an array but contains other types of `Part` objects (or a mix),
92
+ * the `content` array itself is preserved. This handles structured data like JSON objects or arrays
93
+ * returned by a tool.
94
+ * - If `response.content` is not an array or is missing, the entire `functionResponse`
95
+ * object is preserved.
96
+ * 2. Other `Part` types (e.g., `TextPart` directly in the `result` array):
97
+ * - These are preserved as is.
98
+ *
99
+ * All processed parts are then collected into an array, which is JSON.stringify-ed
100
+ * with indentation and wrapped in a markdown JSON code block.
101
+ */
102
+ function getStringifiedResultForDisplay(result) {
103
+ if (!result || result.length === 0) {
104
+ return '```json\n[]\n```';
105
+ }
106
+ const processFunctionResponse = (part) => {
107
+ if (part.functionResponse) {
108
+ const responseContent = part.functionResponse.response?.content;
109
+ if (responseContent && Array.isArray(responseContent)) {
110
+ // Check if all parts in responseContent are simple TextParts
111
+ const allTextParts = responseContent.every((p) => p.text !== undefined);
112
+ if (allTextParts) {
113
+ return responseContent.map((p) => p.text).join('');
114
+ }
115
+ // If not all simple text parts, return the array of these content parts for JSON stringification
116
+ return responseContent;
117
+ }
118
+ // If no content, or not an array, or not a functionResponse, stringify the whole functionResponse part for inspection
119
+ return part.functionResponse;
120
+ }
121
+ return part; // Fallback for unexpected structure or non-FunctionResponsePart
122
+ };
123
+ const processedResults = result.length === 1
124
+ ? processFunctionResponse(result[0])
125
+ : result.map(processFunctionResponse);
126
+ if (typeof processedResults === 'string') {
127
+ return processedResults;
128
+ }
129
+ return '```json\n' + JSON.stringify(processedResults, null, 2) + '\n```';
130
+ }
131
+ /** Visible for testing */
132
+ export function generateValidName(name) {
133
+ // Replace invalid characters (based on 400 error message from Gemini API) with underscores
134
+ let validToolname = name.replace(/[^a-zA-Z0-9_.-]/g, '_');
135
+ // If longer than 63 characters, replace middle with '___'
136
+ // (Gemini API says max length 64, but actual limit seems to be 63)
137
+ if (validToolname.length > 63) {
138
+ validToolname =
139
+ validToolname.slice(0, 28) + '___' + validToolname.slice(-32);
140
+ }
141
+ return validToolname;
142
+ }
143
+ //# sourceMappingURL=mcp-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool.js","sourceRoot":"","sources":["../../../src/tools/mcp-tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,189 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /* eslint-disable @typescript-eslint/no-explicit-any */
7
+ import { describe, it, expect, vi, beforeEach, afterEach, } from 'vitest';
8
+ import { DiscoveredMCPTool, generateValidName } from './mcp-tool.js'; // Added getStringifiedResultForDisplay
9
+ import { ToolConfirmationOutcome } from './tools.js'; // Added ToolConfirmationOutcome
10
+ // Mock @google/genai mcpToTool and CallableTool
11
+ // We only need to mock the parts of CallableTool that DiscoveredMCPTool uses.
12
+ const mockCallTool = vi.fn();
13
+ const mockToolMethod = vi.fn();
14
+ const mockCallableToolInstance = {
15
+ tool: mockToolMethod, // Not directly used by DiscoveredMCPTool instance methods
16
+ callTool: mockCallTool,
17
+ // Add other methods if DiscoveredMCPTool starts using them
18
+ };
19
+ describe('generateValidName', () => {
20
+ it('should return a valid name for a simple function', () => {
21
+ expect(generateValidName('myFunction')).toBe('myFunction');
22
+ });
23
+ it('should replace invalid characters with underscores', () => {
24
+ expect(generateValidName('invalid-name with spaces')).toBe('invalid-name_with_spaces');
25
+ });
26
+ it('should truncate long names', () => {
27
+ expect(generateValidName('x'.repeat(80))).toBe('xxxxxxxxxxxxxxxxxxxxxxxxxxxx___xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
28
+ });
29
+ it('should handle names with only invalid characters', () => {
30
+ expect(generateValidName('!@#$%^&*()')).toBe('__________');
31
+ });
32
+ it('should handle names that are exactly 63 characters long', () => {
33
+ expect(generateValidName('a'.repeat(63)).length).toBe(63);
34
+ });
35
+ it('should handle names that are exactly 64 characters long', () => {
36
+ expect(generateValidName('a'.repeat(64)).length).toBe(63);
37
+ });
38
+ it('should handle names that are longer than 64 characters', () => {
39
+ expect(generateValidName('a'.repeat(80)).length).toBe(63);
40
+ });
41
+ });
42
+ describe('DiscoveredMCPTool', () => {
43
+ const serverName = 'mock-mcp-server';
44
+ const serverToolName = 'actual-server-tool-name';
45
+ const baseDescription = 'A test MCP tool.';
46
+ const inputSchema = {
47
+ type: 'object',
48
+ properties: { param: { type: 'string' } },
49
+ required: ['param'],
50
+ };
51
+ beforeEach(() => {
52
+ mockCallTool.mockClear();
53
+ mockToolMethod.mockClear();
54
+ // Clear allowlist before each relevant test, especially for shouldConfirmExecute
55
+ DiscoveredMCPTool.allowlist.clear();
56
+ });
57
+ afterEach(() => {
58
+ vi.restoreAllMocks();
59
+ });
60
+ describe('constructor', () => {
61
+ it('should set properties correctly', () => {
62
+ const tool = new DiscoveredMCPTool(mockCallableToolInstance, serverName, serverToolName, baseDescription, inputSchema);
63
+ expect(tool.name).toBe(serverToolName);
64
+ expect(tool.schema.name).toBe(serverToolName);
65
+ expect(tool.schema.description).toBe(baseDescription);
66
+ expect(tool.schema.parameters).toBeUndefined();
67
+ expect(tool.schema.parametersJsonSchema).toEqual(inputSchema);
68
+ expect(tool.serverToolName).toBe(serverToolName);
69
+ expect(tool.timeout).toBeUndefined();
70
+ });
71
+ it('should accept and store a custom timeout', () => {
72
+ const customTimeout = 5000;
73
+ const tool = new DiscoveredMCPTool(mockCallableToolInstance, serverName, serverToolName, baseDescription, inputSchema, customTimeout);
74
+ expect(tool.timeout).toBe(customTimeout);
75
+ });
76
+ });
77
+ describe('execute', () => {
78
+ it('should call mcpTool.callTool with correct parameters and format display output', async () => {
79
+ const tool = new DiscoveredMCPTool(mockCallableToolInstance, serverName, serverToolName, baseDescription, inputSchema);
80
+ const params = { param: 'testValue' };
81
+ const mockToolSuccessResultObject = {
82
+ success: true,
83
+ details: 'executed',
84
+ };
85
+ const mockFunctionResponseContent = [
86
+ { text: JSON.stringify(mockToolSuccessResultObject) },
87
+ ];
88
+ const mockMcpToolResponseParts = [
89
+ {
90
+ functionResponse: {
91
+ name: serverToolName,
92
+ response: { content: mockFunctionResponseContent },
93
+ },
94
+ },
95
+ ];
96
+ mockCallTool.mockResolvedValue(mockMcpToolResponseParts);
97
+ const toolResult = await tool.execute(params);
98
+ expect(mockCallTool).toHaveBeenCalledWith([
99
+ { name: serverToolName, args: params },
100
+ ]);
101
+ expect(toolResult.llmContent).toEqual(mockMcpToolResponseParts);
102
+ const stringifiedResponseContent = JSON.stringify(mockToolSuccessResultObject);
103
+ expect(toolResult.returnDisplay).toBe(stringifiedResponseContent);
104
+ });
105
+ it('should handle empty result from getStringifiedResultForDisplay', async () => {
106
+ const tool = new DiscoveredMCPTool(mockCallableToolInstance, serverName, serverToolName, baseDescription, inputSchema);
107
+ const params = { param: 'testValue' };
108
+ const mockMcpToolResponsePartsEmpty = [];
109
+ mockCallTool.mockResolvedValue(mockMcpToolResponsePartsEmpty);
110
+ const toolResult = await tool.execute(params);
111
+ expect(toolResult.returnDisplay).toBe('```json\n[]\n```');
112
+ });
113
+ it('should propagate rejection if mcpTool.callTool rejects', async () => {
114
+ const tool = new DiscoveredMCPTool(mockCallableToolInstance, serverName, serverToolName, baseDescription, inputSchema);
115
+ const params = { param: 'failCase' };
116
+ const expectedError = new Error('MCP call failed');
117
+ mockCallTool.mockRejectedValue(expectedError);
118
+ await expect(tool.execute(params)).rejects.toThrow(expectedError);
119
+ });
120
+ });
121
+ describe('shouldConfirmExecute', () => {
122
+ // beforeEach is already clearing allowlist
123
+ it('should return false if trust is true', async () => {
124
+ const tool = new DiscoveredMCPTool(mockCallableToolInstance, serverName, serverToolName, baseDescription, inputSchema, undefined, true);
125
+ expect(await tool.shouldConfirmExecute({}, new AbortController().signal)).toBe(false);
126
+ });
127
+ it('should return false if server is allowlisted', async () => {
128
+ DiscoveredMCPTool.allowlist.add(serverName);
129
+ const tool = new DiscoveredMCPTool(mockCallableToolInstance, serverName, serverToolName, baseDescription, inputSchema);
130
+ expect(await tool.shouldConfirmExecute({}, new AbortController().signal)).toBe(false);
131
+ });
132
+ it('should return false if tool is allowlisted', async () => {
133
+ const toolAllowlistKey = `${serverName}.${serverToolName}`;
134
+ DiscoveredMCPTool.allowlist.add(toolAllowlistKey);
135
+ const tool = new DiscoveredMCPTool(mockCallableToolInstance, serverName, serverToolName, baseDescription, inputSchema);
136
+ expect(await tool.shouldConfirmExecute({}, new AbortController().signal)).toBe(false);
137
+ });
138
+ it('should return confirmation details if not trusted and not allowlisted', async () => {
139
+ const tool = new DiscoveredMCPTool(mockCallableToolInstance, serverName, serverToolName, baseDescription, inputSchema);
140
+ const confirmation = await tool.shouldConfirmExecute({}, new AbortController().signal);
141
+ expect(confirmation).not.toBe(false);
142
+ if (confirmation && confirmation.type === 'mcp') {
143
+ // Type guard for ToolMcpConfirmationDetails
144
+ expect(confirmation.type).toBe('mcp');
145
+ expect(confirmation.serverName).toBe(serverName);
146
+ expect(confirmation.toolName).toBe(serverToolName);
147
+ }
148
+ else if (confirmation) {
149
+ // Handle other possible confirmation types if necessary, or strengthen test if only MCP is expected
150
+ throw new Error('Confirmation was not of expected type MCP or was false');
151
+ }
152
+ else {
153
+ throw new Error('Confirmation details not in expected format or was false');
154
+ }
155
+ });
156
+ it('should add server to allowlist on ProceedAlwaysServer', async () => {
157
+ const tool = new DiscoveredMCPTool(mockCallableToolInstance, serverName, serverToolName, baseDescription, inputSchema);
158
+ const confirmation = await tool.shouldConfirmExecute({}, new AbortController().signal);
159
+ expect(confirmation).not.toBe(false);
160
+ if (confirmation &&
161
+ typeof confirmation === 'object' &&
162
+ 'onConfirm' in confirmation &&
163
+ typeof confirmation.onConfirm === 'function') {
164
+ await confirmation.onConfirm(ToolConfirmationOutcome.ProceedAlwaysServer);
165
+ expect(DiscoveredMCPTool.allowlist.has(serverName)).toBe(true);
166
+ }
167
+ else {
168
+ throw new Error('Confirmation details or onConfirm not in expected format');
169
+ }
170
+ });
171
+ it('should add tool to allowlist on ProceedAlwaysTool', async () => {
172
+ const tool = new DiscoveredMCPTool(mockCallableToolInstance, serverName, serverToolName, baseDescription, inputSchema);
173
+ const toolAllowlistKey = `${serverName}.${serverToolName}`;
174
+ const confirmation = await tool.shouldConfirmExecute({}, new AbortController().signal);
175
+ expect(confirmation).not.toBe(false);
176
+ if (confirmation &&
177
+ typeof confirmation === 'object' &&
178
+ 'onConfirm' in confirmation &&
179
+ typeof confirmation.onConfirm === 'function') {
180
+ await confirmation.onConfirm(ToolConfirmationOutcome.ProceedAlwaysTool);
181
+ expect(DiscoveredMCPTool.allowlist.has(toolAllowlistKey)).toBe(true);
182
+ }
183
+ else {
184
+ throw new Error('Confirmation details or onConfirm not in expected format');
185
+ }
186
+ });
187
+ });
188
+ });
189
+ //# sourceMappingURL=mcp-tool.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool.test.js","sourceRoot":"","sources":["../../../src/tools/mcp-tool.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseTool, ToolResult } from './tools.js';
7
+ export declare const GEMINI_CONFIG_DIR = ".gemini";
8
+ export declare const DEFAULT_CONTEXT_FILENAME = "GEMINI.md";
9
+ export declare const MEMORY_SECTION_HEADER = "## Gemini Added Memories";
10
+ export declare function setGeminiMdFilename(newFilename: string | string[]): void;
11
+ export declare function getCurrentGeminiMdFilename(): string;
12
+ export declare function getAllGeminiMdFilenames(): string[];
13
+ interface SaveMemoryParams {
14
+ fact: string;
15
+ }
16
+ export declare class MemoryTool extends BaseTool<SaveMemoryParams, ToolResult> {
17
+ static readonly Name: string;
18
+ constructor();
19
+ static performAddMemoryEntry(text: string, memoryFilePath: string, fsAdapter: {
20
+ readFile: (path: string, encoding: 'utf-8') => Promise<string>;
21
+ writeFile: (path: string, data: string, encoding: 'utf-8') => Promise<void>;
22
+ mkdir: (path: string, options: {
23
+ recursive: boolean;
24
+ }) => Promise<string | undefined>;
25
+ }): Promise<void>;
26
+ execute(params: SaveMemoryParams, _signal: AbortSignal): Promise<ToolResult>;
27
+ }
28
+ export {};
@@ -0,0 +1,172 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseTool, Icon } from './tools.js';
7
+ import { Type } from '@google/genai';
8
+ import * as fs from 'fs/promises';
9
+ import * as path from 'path';
10
+ import { homedir } from 'os';
11
+ const memoryToolSchemaData = {
12
+ name: 'save_memory',
13
+ description: 'Saves a specific piece of information or fact to your long-term memory. Use this when the user explicitly asks you to remember something, or when they state a clear, concise fact that seems important to retain for future interactions.',
14
+ parameters: {
15
+ type: Type.OBJECT,
16
+ properties: {
17
+ fact: {
18
+ type: Type.STRING,
19
+ description: 'The specific fact or piece of information to remember. Should be a clear, self-contained statement.',
20
+ },
21
+ },
22
+ required: ['fact'],
23
+ },
24
+ };
25
+ const memoryToolDescription = `
26
+ Saves a specific piece of information or fact to your long-term memory.
27
+
28
+ Use this tool:
29
+
30
+ - When the user explicitly asks you to remember something (e.g., "Remember that I like pineapple on pizza", "Please save this: my cat's name is Whiskers").
31
+ - When the user states a clear, concise fact about themselves, their preferences, or their environment that seems important for you to retain for future interactions to provide a more personalized and effective assistance.
32
+
33
+ Do NOT use this tool:
34
+
35
+ - To remember conversational context that is only relevant for the current session.
36
+ - To save long, complex, or rambling pieces of text. The fact should be relatively short and to the point.
37
+ - If you are unsure whether the information is a fact worth remembering long-term. If in doubt, you can ask the user, "Should I remember that for you?"
38
+
39
+ ## Parameters
40
+
41
+ - \`fact\` (string, required): The specific fact or piece of information to remember. This should be a clear, self-contained statement. For example, if the user says "My favorite color is blue", the fact would be "My favorite color is blue".
42
+ `;
43
+ export const GEMINI_CONFIG_DIR = '.gemini';
44
+ export const DEFAULT_CONTEXT_FILENAME = 'GEMINI.md';
45
+ export const MEMORY_SECTION_HEADER = '## Gemini Added Memories';
46
+ // This variable will hold the currently configured filename for GEMINI.md context files.
47
+ // It defaults to DEFAULT_CONTEXT_FILENAME but can be overridden by setGeminiMdFilename.
48
+ let currentGeminiMdFilename = DEFAULT_CONTEXT_FILENAME;
49
+ export function setGeminiMdFilename(newFilename) {
50
+ if (Array.isArray(newFilename)) {
51
+ if (newFilename.length > 0) {
52
+ currentGeminiMdFilename = newFilename.map((name) => name.trim());
53
+ }
54
+ }
55
+ else if (newFilename && newFilename.trim() !== '') {
56
+ currentGeminiMdFilename = newFilename.trim();
57
+ }
58
+ }
59
+ export function getCurrentGeminiMdFilename() {
60
+ if (Array.isArray(currentGeminiMdFilename)) {
61
+ return currentGeminiMdFilename[0];
62
+ }
63
+ return currentGeminiMdFilename;
64
+ }
65
+ export function getAllGeminiMdFilenames() {
66
+ if (Array.isArray(currentGeminiMdFilename)) {
67
+ return currentGeminiMdFilename;
68
+ }
69
+ return [currentGeminiMdFilename];
70
+ }
71
+ function getGlobalMemoryFilePath() {
72
+ return path.join(homedir(), GEMINI_CONFIG_DIR, getCurrentGeminiMdFilename());
73
+ }
74
+ /**
75
+ * Ensures proper newline separation before appending content.
76
+ */
77
+ function ensureNewlineSeparation(currentContent) {
78
+ if (currentContent.length === 0)
79
+ return '';
80
+ if (currentContent.endsWith('\n\n') || currentContent.endsWith('\r\n\r\n'))
81
+ return '';
82
+ if (currentContent.endsWith('\n') || currentContent.endsWith('\r\n'))
83
+ return '\n';
84
+ return '\n\n';
85
+ }
86
+ export class MemoryTool extends BaseTool {
87
+ static Name = memoryToolSchemaData.name;
88
+ constructor() {
89
+ super(MemoryTool.Name, 'Save Memory', memoryToolDescription, Icon.LightBulb, memoryToolSchemaData.parameters);
90
+ }
91
+ static async performAddMemoryEntry(text, memoryFilePath, fsAdapter) {
92
+ let processedText = text.trim();
93
+ // Remove leading hyphens and spaces that might be misinterpreted as markdown list items
94
+ processedText = processedText.replace(/^(-+\s*)+/, '').trim();
95
+ const newMemoryItem = `- ${processedText}`;
96
+ try {
97
+ await fsAdapter.mkdir(path.dirname(memoryFilePath), { recursive: true });
98
+ let content = '';
99
+ try {
100
+ content = await fsAdapter.readFile(memoryFilePath, 'utf-8');
101
+ }
102
+ catch (_e) {
103
+ // File doesn't exist, will be created with header and item.
104
+ }
105
+ const headerIndex = content.indexOf(MEMORY_SECTION_HEADER);
106
+ if (headerIndex === -1) {
107
+ // Header not found, append header and then the entry
108
+ const separator = ensureNewlineSeparation(content);
109
+ content += `${separator}${MEMORY_SECTION_HEADER}\n${newMemoryItem}\n`;
110
+ }
111
+ else {
112
+ // Header found, find where to insert the new memory entry
113
+ const startOfSectionContent = headerIndex + MEMORY_SECTION_HEADER.length;
114
+ let endOfSectionIndex = content.indexOf('\n## ', startOfSectionContent);
115
+ if (endOfSectionIndex === -1) {
116
+ endOfSectionIndex = content.length; // End of file
117
+ }
118
+ const beforeSectionMarker = content
119
+ .substring(0, startOfSectionContent)
120
+ .trimEnd();
121
+ let sectionContent = content
122
+ .substring(startOfSectionContent, endOfSectionIndex)
123
+ .trimEnd();
124
+ const afterSectionMarker = content.substring(endOfSectionIndex);
125
+ sectionContent += `\n${newMemoryItem}`;
126
+ content =
127
+ `${beforeSectionMarker}\n${sectionContent.trimStart()}\n${afterSectionMarker}`.trimEnd() +
128
+ '\n';
129
+ }
130
+ await fsAdapter.writeFile(memoryFilePath, content, 'utf-8');
131
+ }
132
+ catch (error) {
133
+ console.error(`[MemoryTool] Error adding memory entry to ${memoryFilePath}:`, error);
134
+ throw new Error(`[MemoryTool] Failed to add memory entry: ${error instanceof Error ? error.message : String(error)}`);
135
+ }
136
+ }
137
+ async execute(params, _signal) {
138
+ const { fact } = params;
139
+ if (!fact || typeof fact !== 'string' || fact.trim() === '') {
140
+ const errorMessage = 'Parameter "fact" must be a non-empty string.';
141
+ return {
142
+ llmContent: JSON.stringify({ success: false, error: errorMessage }),
143
+ returnDisplay: `Error: ${errorMessage}`,
144
+ };
145
+ }
146
+ try {
147
+ // Use the static method with actual fs promises
148
+ await MemoryTool.performAddMemoryEntry(fact, getGlobalMemoryFilePath(), {
149
+ readFile: fs.readFile,
150
+ writeFile: fs.writeFile,
151
+ mkdir: fs.mkdir,
152
+ });
153
+ const successMessage = `Okay, I've remembered that: "${fact}"`;
154
+ return {
155
+ llmContent: JSON.stringify({ success: true, message: successMessage }),
156
+ returnDisplay: successMessage,
157
+ };
158
+ }
159
+ catch (error) {
160
+ const errorMessage = error instanceof Error ? error.message : String(error);
161
+ console.error(`[MemoryTool] Error executing save_memory for fact "${fact}": ${errorMessage}`);
162
+ return {
163
+ llmContent: JSON.stringify({
164
+ success: false,
165
+ error: `Failed to save memory. Detail: ${errorMessage}`,
166
+ }),
167
+ returnDisplay: `Error saving memory: ${errorMessage}`,
168
+ };
169
+ }
170
+ }
171
+ }
172
+ //# sourceMappingURL=memoryTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryTool.js","sourceRoot":"","sources":["../../../src/tools/memoryTool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};