@office-ai/aioncli-core 0.30.0 → 0.30.1

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 (325) hide show
  1. package/dist/docs/assets/theme-ansi-dark.png +0 -0
  2. package/dist/docs/assets/theme-atom-one-dark.png +0 -0
  3. package/dist/docs/assets/theme-ayu-dark.png +0 -0
  4. package/dist/docs/assets/theme-default-dark.png +0 -0
  5. package/dist/docs/assets/theme-dracula-dark.png +0 -0
  6. package/dist/docs/assets/theme-github-dark.png +0 -0
  7. package/dist/docs/assets/theme-holiday-dark.png +0 -0
  8. package/dist/docs/assets/theme-shades-of-purple-dark.png +0 -0
  9. package/dist/docs/assets/theme-solarized-dark.png +0 -0
  10. package/dist/docs/assets/theme-solarized-light.png +0 -0
  11. package/dist/docs/cli/notifications.md +58 -0
  12. package/dist/docs/redirects.json +20 -0
  13. package/dist/docs/reference/commands.md +563 -0
  14. package/dist/docs/reference/configuration.md +1804 -0
  15. package/dist/docs/reference/keyboard-shortcuts.md +168 -0
  16. package/dist/docs/reference/memport.md +246 -0
  17. package/dist/docs/reference/policy-engine.md +386 -0
  18. package/dist/docs/reference/tools.md +106 -0
  19. package/dist/docs/resources/faq.md +175 -0
  20. package/dist/docs/resources/quota-and-pricing.md +199 -0
  21. package/dist/docs/resources/tos-privacy.md +102 -0
  22. package/dist/docs/resources/troubleshooting.md +176 -0
  23. package/dist/docs/resources/uninstall.md +56 -0
  24. package/dist/src/agents/a2a-errors.d.ts +65 -0
  25. package/dist/src/agents/a2a-errors.js +164 -0
  26. package/dist/src/agents/a2a-errors.js.map +1 -0
  27. package/dist/src/agents/a2a-errors.test.d.ts +6 -0
  28. package/dist/src/agents/a2a-errors.test.js +183 -0
  29. package/dist/src/agents/a2a-errors.test.js.map +1 -0
  30. package/dist/src/agents/auth-provider/api-key-provider.d.ts +30 -0
  31. package/dist/src/agents/auth-provider/api-key-provider.js +66 -0
  32. package/dist/src/agents/auth-provider/api-key-provider.js.map +1 -0
  33. package/dist/src/agents/auth-provider/api-key-provider.test.d.ts +6 -0
  34. package/dist/src/agents/auth-provider/api-key-provider.test.js +130 -0
  35. package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -0
  36. package/dist/src/agents/auth-provider/http-provider.d.ts +28 -0
  37. package/dist/src/agents/auth-provider/http-provider.js +73 -0
  38. package/dist/src/agents/auth-provider/http-provider.js.map +1 -0
  39. package/dist/src/agents/auth-provider/http-provider.test.d.ts +6 -0
  40. package/dist/src/agents/auth-provider/http-provider.test.js +112 -0
  41. package/dist/src/agents/auth-provider/http-provider.test.js.map +1 -0
  42. package/dist/src/agents/auth-provider/oauth2-provider.d.ts +65 -0
  43. package/dist/src/agents/auth-provider/oauth2-provider.js +233 -0
  44. package/dist/src/agents/auth-provider/oauth2-provider.js.map +1 -0
  45. package/dist/src/agents/auth-provider/oauth2-provider.test.d.ts +6 -0
  46. package/dist/src/agents/auth-provider/oauth2-provider.test.js +490 -0
  47. package/dist/src/agents/auth-provider/oauth2-provider.test.js.map +1 -0
  48. package/dist/src/agents/browser/analyzeScreenshot.d.ts +35 -0
  49. package/dist/src/agents/browser/analyzeScreenshot.js +183 -0
  50. package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -0
  51. package/dist/src/agents/browser/analyzeScreenshot.test.d.ts +6 -0
  52. package/dist/src/agents/browser/analyzeScreenshot.test.js +161 -0
  53. package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -0
  54. package/dist/src/agents/browser/automationOverlay.d.ts +26 -0
  55. package/dist/src/agents/browser/automationOverlay.js +100 -0
  56. package/dist/src/agents/browser/automationOverlay.js.map +1 -0
  57. package/dist/src/agents/browser/browserAgentDefinition.d.ts +50 -0
  58. package/dist/src/agents/browser/browserAgentDefinition.js +141 -0
  59. package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -0
  60. package/dist/src/agents/browser/browserAgentFactory.d.ts +42 -0
  61. package/dist/src/agents/browser/browserAgentFactory.js +116 -0
  62. package/dist/src/agents/browser/browserAgentFactory.js.map +1 -0
  63. package/dist/src/agents/browser/browserAgentFactory.test.d.ts +6 -0
  64. package/dist/src/agents/browser/browserAgentFactory.test.js +240 -0
  65. package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -0
  66. package/dist/src/agents/browser/browserAgentInvocation.d.ts +34 -0
  67. package/dist/src/agents/browser/browserAgentInvocation.js +386 -0
  68. package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -0
  69. package/dist/src/agents/browser/browserAgentInvocation.test.d.ts +6 -0
  70. package/dist/src/agents/browser/browserAgentInvocation.test.js +382 -0
  71. package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -0
  72. package/dist/src/agents/browser/browserManager.d.ts +115 -0
  73. package/dist/src/agents/browser/browserManager.js +370 -0
  74. package/dist/src/agents/browser/browserManager.js.map +1 -0
  75. package/dist/src/agents/browser/browserManager.test.d.ts +6 -0
  76. package/dist/src/agents/browser/browserManager.test.js +382 -0
  77. package/dist/src/agents/browser/browserManager.test.js.map +1 -0
  78. package/dist/src/agents/browser/mcpToolWrapper.d.ts +45 -0
  79. package/dist/src/agents/browser/mcpToolWrapper.js +358 -0
  80. package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -0
  81. package/dist/src/agents/browser/mcpToolWrapper.test.d.ts +6 -0
  82. package/dist/src/agents/browser/mcpToolWrapper.test.js +126 -0
  83. package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -0
  84. package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.d.ts +6 -0
  85. package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js +59 -0
  86. package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js.map +1 -0
  87. package/dist/src/agents/browser/modelAvailability.d.ts +23 -0
  88. package/dist/src/agents/browser/modelAvailability.js +23 -0
  89. package/dist/src/agents/browser/modelAvailability.js.map +1 -0
  90. package/dist/src/agents/cli-help-agent.d.ts +2 -2
  91. package/dist/src/billing/billing.d.ts +80 -0
  92. package/dist/src/billing/billing.js +128 -0
  93. package/dist/src/billing/billing.js.map +1 -0
  94. package/dist/src/billing/billing.test.d.ts +6 -0
  95. package/dist/src/billing/billing.test.js +182 -0
  96. package/dist/src/billing/billing.test.js.map +1 -0
  97. package/dist/src/billing/index.d.ts +6 -0
  98. package/dist/src/billing/index.js +7 -0
  99. package/dist/src/billing/index.js.map +1 -0
  100. package/dist/src/code_assist/oauth2.d.ts +1 -1
  101. package/dist/src/code_assist/types.d.ts +26 -26
  102. package/dist/src/config/agent-loop-context.d.ts +22 -0
  103. package/dist/src/config/agent-loop-context.js +7 -0
  104. package/dist/src/config/agent-loop-context.js.map +1 -0
  105. package/dist/src/config/trackerFeatureFlag.test.d.ts +6 -0
  106. package/dist/src/config/trackerFeatureFlag.test.js +43 -0
  107. package/dist/src/config/trackerFeatureFlag.test.js.map +1 -0
  108. package/dist/src/config/userHintService.d.ts +46 -0
  109. package/dist/src/config/userHintService.js +81 -0
  110. package/dist/src/config/userHintService.js.map +1 -0
  111. package/dist/src/config/userHintService.test.d.ts +6 -0
  112. package/dist/src/config/userHintService.test.js +62 -0
  113. package/dist/src/config/userHintService.test.js.map +1 -0
  114. package/dist/src/core/localLiteRtLmClient.d.ts +24 -0
  115. package/dist/src/core/localLiteRtLmClient.js +77 -0
  116. package/dist/src/core/localLiteRtLmClient.js.map +1 -0
  117. package/dist/src/core/localLiteRtLmClient.test.d.ts +6 -0
  118. package/dist/src/core/localLiteRtLmClient.test.js +87 -0
  119. package/dist/src/core/localLiteRtLmClient.test.js.map +1 -0
  120. package/dist/src/core/openaiContentGenerator.d.ts +1 -0
  121. package/dist/src/core/openaiContentGenerator.js +13 -13
  122. package/dist/src/core/openaiContentGenerator.js.map +1 -1
  123. package/dist/src/hooks/runtimeHooks.test.d.ts +6 -0
  124. package/dist/src/hooks/runtimeHooks.test.js +100 -0
  125. package/dist/src/hooks/runtimeHooks.test.js.map +1 -0
  126. package/dist/src/ide/types.d.ts +6 -6
  127. package/dist/src/mcp/mcp-oauth-provider.d.ts +43 -0
  128. package/dist/src/mcp/mcp-oauth-provider.js +67 -0
  129. package/dist/src/mcp/mcp-oauth-provider.js.map +1 -0
  130. package/dist/src/mcp/mcp-oauth-provider.test.d.ts +6 -0
  131. package/dist/src/mcp/mcp-oauth-provider.test.js +63 -0
  132. package/dist/src/mcp/mcp-oauth-provider.test.js.map +1 -0
  133. package/dist/src/policy/integrity.d.ts +45 -0
  134. package/dist/src/policy/integrity.js +121 -0
  135. package/dist/src/policy/integrity.js.map +1 -0
  136. package/dist/src/policy/integrity.test.d.ts +6 -0
  137. package/dist/src/policy/integrity.test.js +132 -0
  138. package/dist/src/policy/integrity.test.js.map +1 -0
  139. package/dist/src/policy/policies/conseca.toml +6 -0
  140. package/dist/src/policy/workspace-policy.test.js +231 -0
  141. package/dist/src/policy/workspace-policy.test.js.map +1 -0
  142. package/dist/src/routing/strategies/approvalModeStrategy.d.ts +18 -0
  143. package/dist/src/routing/strategies/approvalModeStrategy.js +59 -0
  144. package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -0
  145. package/dist/src/routing/strategies/approvalModeStrategy.test.d.ts +6 -0
  146. package/dist/src/routing/strategies/approvalModeStrategy.test.js +140 -0
  147. package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -0
  148. package/dist/src/routing/strategies/gemmaClassifierStrategy.d.ts +14 -0
  149. package/dist/src/routing/strategies/gemmaClassifierStrategy.js +182 -0
  150. package/dist/src/routing/strategies/gemmaClassifierStrategy.js.map +1 -0
  151. package/dist/src/routing/strategies/gemmaClassifierStrategy.test.d.ts +6 -0
  152. package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js +218 -0
  153. package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js.map +1 -0
  154. package/dist/src/safety/conseca/conseca.d.ts +31 -0
  155. package/dist/src/safety/conseca/conseca.js +105 -0
  156. package/dist/src/safety/conseca/conseca.js.map +1 -0
  157. package/dist/src/safety/conseca/conseca.test.js +226 -0
  158. package/dist/src/safety/conseca/conseca.test.js.map +1 -0
  159. package/dist/src/safety/conseca/integration.test.js +19 -0
  160. package/dist/src/safety/conseca/integration.test.js.map +1 -0
  161. package/dist/src/safety/conseca/policy-enforcer.d.ts +13 -0
  162. package/dist/src/safety/conseca/policy-enforcer.js +135 -0
  163. package/dist/src/safety/conseca/policy-enforcer.js.map +1 -0
  164. package/dist/src/safety/conseca/policy-enforcer.test.js +141 -0
  165. package/dist/src/safety/conseca/policy-enforcer.test.js.map +1 -0
  166. package/dist/src/safety/conseca/policy-generator.d.ts +15 -0
  167. package/dist/src/safety/conseca/policy-generator.js +144 -0
  168. package/dist/src/safety/conseca/policy-generator.js.map +1 -0
  169. package/dist/src/safety/conseca/policy-generator.test.d.ts +6 -0
  170. package/dist/src/safety/conseca/policy-generator.test.js +84 -0
  171. package/dist/src/safety/conseca/policy-generator.test.js.map +1 -0
  172. package/dist/src/safety/conseca/types.d.ts +15 -0
  173. package/dist/src/safety/conseca/types.js +7 -0
  174. package/dist/src/safety/conseca/types.js.map +1 -0
  175. package/dist/src/scheduler/scheduler_parallel.test.d.ts +6 -0
  176. package/dist/src/scheduler/scheduler_parallel.test.js +401 -0
  177. package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -0
  178. package/dist/src/services/FolderTrustDiscoveryService.d.ts +32 -0
  179. package/dist/src/services/FolderTrustDiscoveryService.js +169 -0
  180. package/dist/src/services/FolderTrustDiscoveryService.js.map +1 -0
  181. package/dist/src/services/FolderTrustDiscoveryService.test.d.ts +6 -0
  182. package/dist/src/services/FolderTrustDiscoveryService.test.js +118 -0
  183. package/dist/src/services/FolderTrustDiscoveryService.test.js.map +1 -0
  184. package/dist/src/services/fileKeychain.d.ts +24 -0
  185. package/dist/src/services/fileKeychain.js +123 -0
  186. package/dist/src/services/fileKeychain.js.map +1 -0
  187. package/dist/src/services/keychainService.d.ts +51 -0
  188. package/dist/src/services/keychainService.js +133 -0
  189. package/dist/src/services/keychainService.js.map +1 -0
  190. package/dist/src/services/keychainService.test.d.ts +6 -0
  191. package/dist/src/services/keychainService.test.js +150 -0
  192. package/dist/src/services/keychainService.test.js.map +1 -0
  193. package/dist/src/services/keychainTypes.d.ts +41 -0
  194. package/dist/src/services/keychainTypes.js +18 -0
  195. package/dist/src/services/keychainTypes.js.map +1 -0
  196. package/dist/src/services/trackerService.d.ts +49 -0
  197. package/dist/src/services/trackerService.js +193 -0
  198. package/dist/src/services/trackerService.js.map +1 -0
  199. package/dist/src/services/trackerService.test.d.ts +6 -0
  200. package/dist/src/services/trackerService.test.js +117 -0
  201. package/dist/src/services/trackerService.test.js.map +1 -0
  202. package/dist/src/services/trackerTypes.d.ts +51 -0
  203. package/dist/src/services/trackerTypes.js +33 -0
  204. package/dist/src/services/trackerTypes.js.map +1 -0
  205. package/dist/src/telemetry/billingEvents.d.ts +75 -0
  206. package/dist/src/telemetry/billingEvents.js +181 -0
  207. package/dist/src/telemetry/billingEvents.js.map +1 -0
  208. package/dist/src/telemetry/billingEvents.test.d.ts +6 -0
  209. package/dist/src/telemetry/billingEvents.test.js +139 -0
  210. package/dist/src/telemetry/billingEvents.test.js.map +1 -0
  211. package/dist/src/telemetry/conseca-logger.d.ts +9 -0
  212. package/dist/src/telemetry/conseca-logger.js +91 -0
  213. package/dist/src/telemetry/conseca-logger.js.map +1 -0
  214. package/dist/src/telemetry/conseca-logger.test.d.ts +6 -0
  215. package/dist/src/telemetry/conseca-logger.test.js +90 -0
  216. package/dist/src/telemetry/conseca-logger.test.js.map +1 -0
  217. package/dist/src/telemetry/trace.test.d.ts +6 -0
  218. package/dist/src/telemetry/trace.test.js +116 -0
  219. package/dist/src/telemetry/trace.test.js.map +1 -0
  220. package/dist/src/tools/definitions/trackerTools.d.ts +12 -0
  221. package/dist/src/tools/definitions/trackerTools.js +146 -0
  222. package/dist/src/tools/definitions/trackerTools.js.map +1 -0
  223. package/dist/src/tools/diff-utils.d.ts +9 -0
  224. package/dist/src/tools/diff-utils.js +66 -0
  225. package/dist/src/tools/diff-utils.js.map +1 -0
  226. package/dist/src/tools/diff-utils.test.d.ts +6 -0
  227. package/dist/src/tools/diff-utils.test.js +53 -0
  228. package/dist/src/tools/diff-utils.test.js.map +1 -0
  229. package/dist/src/tools/grep-utils.d.ts +49 -0
  230. package/dist/src/tools/grep-utils.js +147 -0
  231. package/dist/src/tools/grep-utils.js.map +1 -0
  232. package/dist/src/tools/omissionPlaceholderDetector.d.ts +15 -0
  233. package/dist/src/tools/omissionPlaceholderDetector.js +90 -0
  234. package/dist/src/tools/omissionPlaceholderDetector.js.map +1 -0
  235. package/dist/src/tools/omissionPlaceholderDetector.test.d.ts +6 -0
  236. package/dist/src/tools/omissionPlaceholderDetector.test.js +49 -0
  237. package/dist/src/tools/omissionPlaceholderDetector.test.js.map +1 -0
  238. package/dist/src/tools/trackerTools.d.ts +122 -0
  239. package/dist/src/tools/trackerTools.js +365 -0
  240. package/dist/src/tools/trackerTools.js.map +1 -0
  241. package/dist/src/tools/trackerTools.test.d.ts +6 -0
  242. package/dist/src/tools/trackerTools.test.js +97 -0
  243. package/dist/src/tools/trackerTools.test.js.map +1 -0
  244. package/dist/src/utils/approvalModeUtils.d.ts +14 -0
  245. package/dist/src/utils/approvalModeUtils.js +35 -0
  246. package/dist/src/utils/approvalModeUtils.js.map +1 -0
  247. package/dist/src/utils/approvalModeUtils.test.d.ts +6 -0
  248. package/dist/src/utils/approvalModeUtils.test.js +36 -0
  249. package/dist/src/utils/approvalModeUtils.test.js.map +1 -0
  250. package/dist/src/utils/cache.d.ts +63 -0
  251. package/dist/src/utils/cache.js +103 -0
  252. package/dist/src/utils/cache.js.map +1 -0
  253. package/dist/src/utils/cache.test.d.ts +6 -0
  254. package/dist/src/utils/cache.test.js +158 -0
  255. package/dist/src/utils/cache.test.js.map +1 -0
  256. package/dist/src/utils/checkpointUtils.d.ts +2 -2
  257. package/dist/src/utils/compatibility.d.ts +41 -0
  258. package/dist/src/utils/compatibility.js +112 -0
  259. package/dist/src/utils/compatibility.js.map +1 -0
  260. package/dist/src/utils/compatibility.test.d.ts +6 -0
  261. package/dist/src/utils/compatibility.test.js +233 -0
  262. package/dist/src/utils/compatibility.test.js.map +1 -0
  263. package/dist/src/utils/envExpansion.d.ts +18 -0
  264. package/dist/src/utils/envExpansion.js +46 -0
  265. package/dist/src/utils/envExpansion.js.map +1 -0
  266. package/dist/src/utils/envExpansion.test.d.ts +6 -0
  267. package/dist/src/utils/envExpansion.test.js +110 -0
  268. package/dist/src/utils/envExpansion.test.js.map +1 -0
  269. package/dist/src/utils/errors_timeout.test.d.ts +6 -0
  270. package/dist/src/utils/errors_timeout.test.js +40 -0
  271. package/dist/src/utils/errors_timeout.test.js.map +1 -0
  272. package/dist/src/utils/fetch.test.d.ts +6 -0
  273. package/dist/src/utils/fetch.test.js +206 -0
  274. package/dist/src/utils/fetch.test.js.map +1 -0
  275. package/dist/src/utils/markdownUtils.d.ts +22 -0
  276. package/dist/src/utils/markdownUtils.js +126 -0
  277. package/dist/src/utils/markdownUtils.js.map +1 -0
  278. package/dist/src/utils/markdownUtils.test.d.ts +6 -0
  279. package/dist/src/utils/markdownUtils.test.js +107 -0
  280. package/dist/src/utils/markdownUtils.test.js.map +1 -0
  281. package/dist/src/utils/oauth-flow.d.ts +105 -0
  282. package/dist/src/utils/oauth-flow.js +370 -0
  283. package/dist/src/utils/oauth-flow.js.map +1 -0
  284. package/dist/src/utils/oauth-flow.test.d.ts +6 -0
  285. package/dist/src/utils/oauth-flow.test.js +360 -0
  286. package/dist/src/utils/oauth-flow.test.js.map +1 -0
  287. package/dist/src/utils/sessionUtils.d.ts +14 -0
  288. package/dist/src/utils/sessionUtils.js +122 -0
  289. package/dist/src/utils/sessionUtils.js.map +1 -0
  290. package/dist/src/utils/sessionUtils.test.d.ts +1 -0
  291. package/dist/src/utils/sessionUtils.test.js +171 -0
  292. package/dist/src/utils/sessionUtils.test.js.map +1 -0
  293. package/dist/src/voice/responseFormatter.d.ts +38 -0
  294. package/dist/src/voice/responseFormatter.js +130 -0
  295. package/dist/src/voice/responseFormatter.js.map +1 -0
  296. package/dist/src/voice/responseFormatter.test.d.ts +6 -0
  297. package/dist/src/voice/responseFormatter.test.js +214 -0
  298. package/dist/src/voice/responseFormatter.test.js.map +1 -0
  299. package/dist/tsconfig.tsbuildinfo +1 -1
  300. package/package.json +1 -1
  301. package/dist/docs/CONTRIBUTING.md +0 -555
  302. package/dist/src/agents/executor.d.ts +0 -114
  303. package/dist/src/agents/executor.js +0 -779
  304. package/dist/src/agents/executor.js.map +0 -1
  305. package/dist/src/agents/executor.test.js +0 -1362
  306. package/dist/src/agents/executor.test.js.map +0 -1
  307. package/dist/src/agents/invocation.d.ts +0 -46
  308. package/dist/src/agents/invocation.js +0 -102
  309. package/dist/src/agents/invocation.js.map +0 -1
  310. package/dist/src/agents/invocation.test.js +0 -215
  311. package/dist/src/agents/invocation.test.js.map +0 -1
  312. package/dist/src/core/subagent.d.ts +0 -236
  313. package/dist/src/core/subagent.js +0 -482
  314. package/dist/src/core/subagent.js.map +0 -1
  315. package/dist/src/core/subagent.test.js +0 -530
  316. package/dist/src/core/subagent.test.js.map +0 -1
  317. package/dist/src/tools/smart-edit.d.ts +0 -78
  318. package/dist/src/tools/smart-edit.js +0 -717
  319. package/dist/src/tools/smart-edit.js.map +0 -1
  320. package/dist/src/tools/smart-edit.test.js +0 -592
  321. package/dist/src/tools/smart-edit.test.js.map +0 -1
  322. /package/dist/src/{agents/executor.test.d.ts → policy/workspace-policy.test.d.ts} +0 -0
  323. /package/dist/src/{agents/invocation.test.d.ts → safety/conseca/conseca.test.d.ts} +0 -0
  324. /package/dist/src/{core/subagent.test.d.ts → safety/conseca/integration.test.d.ts} +0 -0
  325. /package/dist/src/{tools/smart-edit.test.d.ts → safety/conseca/policy-enforcer.test.d.ts} +0 -0
@@ -0,0 +1,116 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { trace, SpanStatusCode, diag } from '@opentelemetry/api';
8
+ import { runInDevTraceSpan } from './trace.js';
9
+ import { GeminiCliOperation, GEN_AI_CONVERSATION_ID, GEN_AI_AGENT_DESCRIPTION, GEN_AI_AGENT_NAME, GEN_AI_INPUT_MESSAGES, GEN_AI_OPERATION_NAME, GEN_AI_OUTPUT_MESSAGES, SERVICE_DESCRIPTION, SERVICE_NAME, } from './constants.js';
10
+ vi.mock('@opentelemetry/api', async (importOriginal) => {
11
+ const original = await importOriginal();
12
+ return {
13
+ ...original,
14
+ trace: {
15
+ getTracer: vi.fn(),
16
+ },
17
+ diag: {
18
+ error: vi.fn(),
19
+ },
20
+ };
21
+ });
22
+ vi.mock('../utils/session.js', () => ({
23
+ sessionId: 'test-session-id',
24
+ }));
25
+ describe('runInDevTraceSpan', () => {
26
+ const mockSpan = {
27
+ setAttribute: vi.fn(),
28
+ setStatus: vi.fn(),
29
+ recordException: vi.fn(),
30
+ end: vi.fn(),
31
+ };
32
+ const mockTracer = {
33
+ startActiveSpan: vi.fn((name, options, callback) => callback(mockSpan)),
34
+ };
35
+ beforeEach(() => {
36
+ vi.clearAllMocks();
37
+ vi.mocked(trace.getTracer).mockReturnValue(mockTracer);
38
+ });
39
+ afterEach(() => {
40
+ vi.unstubAllEnvs();
41
+ });
42
+ it('should start an active span', async () => {
43
+ const fn = vi.fn(async () => 'result');
44
+ const result = await runInDevTraceSpan({ operation: GeminiCliOperation.LLMCall }, fn);
45
+ expect(result).toBe('result');
46
+ expect(trace.getTracer).toHaveBeenCalled();
47
+ expect(mockTracer.startActiveSpan).toHaveBeenCalledWith(GeminiCliOperation.LLMCall, {}, expect.any(Function));
48
+ });
49
+ it('should set default attributes on the span metadata', async () => {
50
+ await runInDevTraceSpan({ operation: GeminiCliOperation.LLMCall }, async ({ metadata }) => {
51
+ expect(metadata.attributes[GEN_AI_OPERATION_NAME]).toBe(GeminiCliOperation.LLMCall);
52
+ expect(metadata.attributes[GEN_AI_AGENT_NAME]).toBe(SERVICE_NAME);
53
+ expect(metadata.attributes[GEN_AI_AGENT_DESCRIPTION]).toBe(SERVICE_DESCRIPTION);
54
+ expect(metadata.attributes[GEN_AI_CONVERSATION_ID]).toBe('test-session-id');
55
+ });
56
+ });
57
+ it('should set span attributes from metadata on completion', async () => {
58
+ await runInDevTraceSpan({ operation: GeminiCliOperation.LLMCall }, async ({ metadata }) => {
59
+ metadata.input = { query: 'hello' };
60
+ metadata.output = { response: 'world' };
61
+ metadata.attributes['custom.attr'] = 'value';
62
+ });
63
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(GEN_AI_INPUT_MESSAGES, JSON.stringify({ query: 'hello' }));
64
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith(GEN_AI_OUTPUT_MESSAGES, JSON.stringify({ response: 'world' }));
65
+ expect(mockSpan.setAttribute).toHaveBeenCalledWith('custom.attr', 'value');
66
+ expect(mockSpan.setStatus).toHaveBeenCalledWith({
67
+ code: SpanStatusCode.OK,
68
+ });
69
+ expect(mockSpan.end).toHaveBeenCalled();
70
+ });
71
+ it('should handle errors in the wrapped function', async () => {
72
+ const error = new Error('test error');
73
+ await expect(runInDevTraceSpan({ operation: GeminiCliOperation.LLMCall }, async () => {
74
+ throw error;
75
+ })).rejects.toThrow(error);
76
+ expect(mockSpan.setStatus).toHaveBeenCalledWith({
77
+ code: SpanStatusCode.ERROR,
78
+ message: 'test error',
79
+ });
80
+ expect(mockSpan.recordException).toHaveBeenCalledWith(error);
81
+ expect(mockSpan.end).toHaveBeenCalled();
82
+ });
83
+ it('should respect noAutoEnd option', async () => {
84
+ let capturedEndSpan = () => { };
85
+ const result = await runInDevTraceSpan({ operation: GeminiCliOperation.LLMCall, noAutoEnd: true }, async ({ endSpan }) => {
86
+ capturedEndSpan = endSpan;
87
+ return 'streaming';
88
+ });
89
+ expect(result).toBe('streaming');
90
+ expect(mockSpan.end).not.toHaveBeenCalled();
91
+ capturedEndSpan();
92
+ expect(mockSpan.end).toHaveBeenCalled();
93
+ });
94
+ it('should automatically end span on error even if noAutoEnd is true', async () => {
95
+ const error = new Error('streaming error');
96
+ await expect(runInDevTraceSpan({ operation: GeminiCliOperation.LLMCall, noAutoEnd: true }, async () => {
97
+ throw error;
98
+ })).rejects.toThrow(error);
99
+ expect(mockSpan.end).toHaveBeenCalled();
100
+ });
101
+ it('should handle exceptions in endSpan gracefully', async () => {
102
+ mockSpan.setAttribute.mockImplementation(() => {
103
+ throw new Error('attribute error');
104
+ });
105
+ await runInDevTraceSpan({ operation: GeminiCliOperation.LLMCall }, async ({ metadata }) => {
106
+ metadata.input = 'trigger error';
107
+ });
108
+ expect(diag.error).toHaveBeenCalled();
109
+ expect(mockSpan.setStatus).toHaveBeenCalledWith(expect.objectContaining({
110
+ code: SpanStatusCode.ERROR,
111
+ message: expect.stringContaining('attribute error'),
112
+ }));
113
+ expect(mockSpan.end).toHaveBeenCalled();
114
+ });
115
+ });
116
+ //# sourceMappingURL=trace.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.test.js","sourceRoot":"","sources":["../../../src/telemetry/trace.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { ToolDefinition } from './types.js';
7
+ export declare const TRACKER_CREATE_TASK_DEFINITION: ToolDefinition;
8
+ export declare const TRACKER_UPDATE_TASK_DEFINITION: ToolDefinition;
9
+ export declare const TRACKER_GET_TASK_DEFINITION: ToolDefinition;
10
+ export declare const TRACKER_LIST_TASKS_DEFINITION: ToolDefinition;
11
+ export declare const TRACKER_ADD_DEPENDENCY_DEFINITION: ToolDefinition;
12
+ export declare const TRACKER_VISUALIZE_DEFINITION: ToolDefinition;
@@ -0,0 +1,146 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { TRACKER_CREATE_TASK_TOOL_NAME, TRACKER_UPDATE_TASK_TOOL_NAME, TRACKER_GET_TASK_TOOL_NAME, TRACKER_LIST_TASKS_TOOL_NAME, TRACKER_ADD_DEPENDENCY_TOOL_NAME, TRACKER_VISUALIZE_TOOL_NAME, } from '../tool-names.js';
7
+ export const TRACKER_CREATE_TASK_DEFINITION = {
8
+ base: {
9
+ name: TRACKER_CREATE_TASK_TOOL_NAME,
10
+ description: 'Creates a new task in the tracker.',
11
+ parametersJsonSchema: {
12
+ type: 'object',
13
+ properties: {
14
+ title: {
15
+ type: 'string',
16
+ description: 'Short title of the task.',
17
+ },
18
+ description: {
19
+ type: 'string',
20
+ description: 'Detailed description of the task.',
21
+ },
22
+ type: {
23
+ type: 'string',
24
+ enum: ['epic', 'task', 'bug'],
25
+ description: 'Type of the task.',
26
+ },
27
+ parentId: {
28
+ type: 'string',
29
+ description: 'Optional ID of the parent task.',
30
+ },
31
+ dependencies: {
32
+ type: 'array',
33
+ items: { type: 'string' },
34
+ description: 'Optional list of task IDs that this task depends on.',
35
+ },
36
+ },
37
+ required: ['title', 'description', 'type'],
38
+ },
39
+ },
40
+ };
41
+ export const TRACKER_UPDATE_TASK_DEFINITION = {
42
+ base: {
43
+ name: TRACKER_UPDATE_TASK_TOOL_NAME,
44
+ description: 'Updates an existing task in the tracker.',
45
+ parametersJsonSchema: {
46
+ type: 'object',
47
+ properties: {
48
+ id: {
49
+ type: 'string',
50
+ description: 'The 6-character hex ID of the task to update.',
51
+ },
52
+ title: {
53
+ type: 'string',
54
+ description: 'New title for the task.',
55
+ },
56
+ description: {
57
+ type: 'string',
58
+ description: 'New description for the task.',
59
+ },
60
+ status: {
61
+ type: 'string',
62
+ enum: ['open', 'in_progress', 'blocked', 'closed'],
63
+ description: 'New status for the task.',
64
+ },
65
+ dependencies: {
66
+ type: 'array',
67
+ items: { type: 'string' },
68
+ description: 'New list of dependency IDs.',
69
+ },
70
+ },
71
+ required: ['id'],
72
+ },
73
+ },
74
+ };
75
+ export const TRACKER_GET_TASK_DEFINITION = {
76
+ base: {
77
+ name: TRACKER_GET_TASK_TOOL_NAME,
78
+ description: 'Retrieves details for a specific task.',
79
+ parametersJsonSchema: {
80
+ type: 'object',
81
+ properties: {
82
+ id: {
83
+ type: 'string',
84
+ description: 'The 6-character hex ID of the task.',
85
+ },
86
+ },
87
+ required: ['id'],
88
+ },
89
+ },
90
+ };
91
+ export const TRACKER_LIST_TASKS_DEFINITION = {
92
+ base: {
93
+ name: TRACKER_LIST_TASKS_TOOL_NAME,
94
+ description: 'Lists tasks in the tracker, optionally filtered by status, type, or parent.',
95
+ parametersJsonSchema: {
96
+ type: 'object',
97
+ properties: {
98
+ status: {
99
+ type: 'string',
100
+ enum: ['open', 'in_progress', 'blocked', 'closed'],
101
+ description: 'Filter by status.',
102
+ },
103
+ type: {
104
+ type: 'string',
105
+ enum: ['epic', 'task', 'bug'],
106
+ description: 'Filter by type.',
107
+ },
108
+ parentId: {
109
+ type: 'string',
110
+ description: 'Filter by parent task ID.',
111
+ },
112
+ },
113
+ },
114
+ },
115
+ };
116
+ export const TRACKER_ADD_DEPENDENCY_DEFINITION = {
117
+ base: {
118
+ name: TRACKER_ADD_DEPENDENCY_TOOL_NAME,
119
+ description: 'Adds a dependency between two tasks.',
120
+ parametersJsonSchema: {
121
+ type: 'object',
122
+ properties: {
123
+ taskId: {
124
+ type: 'string',
125
+ description: 'The ID of the task that has a dependency.',
126
+ },
127
+ dependencyId: {
128
+ type: 'string',
129
+ description: 'The ID of the task that is being depended upon.',
130
+ },
131
+ },
132
+ required: ['taskId', 'dependencyId'],
133
+ },
134
+ },
135
+ };
136
+ export const TRACKER_VISUALIZE_DEFINITION = {
137
+ base: {
138
+ name: TRACKER_VISUALIZE_TOOL_NAME,
139
+ description: 'Renders an ASCII tree visualization of the task graph.',
140
+ parametersJsonSchema: {
141
+ type: 'object',
142
+ properties: {},
143
+ },
144
+ },
145
+ };
146
+ //# sourceMappingURL=trackerTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trackerTools.js","sourceRoot":"","sources":["../../../../src/tools/definitions/trackerTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Generates a snippet of the diff between two strings, including a few lines of context around the changes.
8
+ */
9
+ export declare function getDiffContextSnippet(originalContent: string, newContent: string, contextLines?: number): string;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as Diff from 'diff';
7
+ /**
8
+ * Generates a snippet of the diff between two strings, including a few lines of context around the changes.
9
+ */
10
+ export function getDiffContextSnippet(originalContent, newContent, contextLines = 5) {
11
+ if (!originalContent) {
12
+ return newContent;
13
+ }
14
+ const changes = Diff.diffLines(originalContent, newContent);
15
+ const newLines = newContent.split(/\r?\n/);
16
+ const ranges = [];
17
+ let newLineIdx = 0;
18
+ for (const change of changes) {
19
+ if (change.added) {
20
+ ranges.push({ start: newLineIdx, end: newLineIdx + (change.count ?? 0) });
21
+ newLineIdx += change.count ?? 0;
22
+ }
23
+ else if (change.removed) {
24
+ ranges.push({ start: newLineIdx, end: newLineIdx });
25
+ }
26
+ else {
27
+ newLineIdx += change.count ?? 0;
28
+ }
29
+ }
30
+ if (ranges.length === 0) {
31
+ return newContent;
32
+ }
33
+ const expandedRanges = ranges.map((r) => ({
34
+ start: Math.max(0, r.start - contextLines),
35
+ end: Math.min(newLines.length, r.end + contextLines),
36
+ }));
37
+ expandedRanges.sort((a, b) => a.start - b.start);
38
+ const mergedRanges = [];
39
+ if (expandedRanges.length > 0) {
40
+ let current = expandedRanges[0];
41
+ for (let i = 1; i < expandedRanges.length; i++) {
42
+ const next = expandedRanges[i];
43
+ if (next.start <= current.end) {
44
+ current.end = Math.max(current.end, next.end);
45
+ }
46
+ else {
47
+ mergedRanges.push(current);
48
+ current = next;
49
+ }
50
+ }
51
+ mergedRanges.push(current);
52
+ }
53
+ const outputParts = [];
54
+ let lastEnd = 0;
55
+ for (const range of mergedRanges) {
56
+ if (range.start > lastEnd)
57
+ outputParts.push('...');
58
+ outputParts.push(newLines.slice(range.start, range.end).join('\n'));
59
+ lastEnd = range.end;
60
+ }
61
+ if (lastEnd < newLines.length) {
62
+ outputParts.push('...');
63
+ }
64
+ return outputParts.join('\n');
65
+ }
66
+ //# sourceMappingURL=diff-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-utils.js","sourceRoot":"","sources":["../../../src/tools/diff-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,53 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, expect, it } from 'vitest';
7
+ import { getDiffContextSnippet } from './diff-utils.js';
8
+ describe('getDiffContextSnippet', () => {
9
+ it('should return the whole new content if originalContent is empty', () => {
10
+ const original = '';
11
+ const modified = 'line1\nline2\nline3';
12
+ expect(getDiffContextSnippet(original, modified)).toBe(modified);
13
+ });
14
+ it('should return the whole content if there are no changes', () => {
15
+ const content = 'line1\nline2\nline3';
16
+ expect(getDiffContextSnippet(content, content)).toBe(content);
17
+ });
18
+ it('should show added lines with context', () => {
19
+ const original = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10';
20
+ const modified = '1\n2\n3\n4\n5\nadded\n6\n7\n8\n9\n10';
21
+ // Default context is 5 lines.
22
+ expect(getDiffContextSnippet(original, modified)).toBe(modified);
23
+ });
24
+ it('should use ellipses for changes far apart', () => {
25
+ const original = Array.from({ length: 20 }, (_, i) => `${i + 1}`).join('\n');
26
+ const modified = original
27
+ .replace('2\n', '2\nadded1\n')
28
+ .replace('19', '19\nadded2');
29
+ const snippet = getDiffContextSnippet(original, modified, 2);
30
+ expect(snippet).toContain('1\n2\nadded1\n3\n4');
31
+ expect(snippet).toContain('...');
32
+ expect(snippet).toContain('18\n19\nadded2\n20');
33
+ });
34
+ it('should respect custom contextLines', () => {
35
+ const original = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10';
36
+ const modified = '1\n2\n3\n4\n5\nadded\n6\n7\n8\n9\n10';
37
+ const snippet = getDiffContextSnippet(original, modified, 1);
38
+ expect(snippet).toBe('...\n5\nadded\n6\n...');
39
+ });
40
+ it('should handle multiple changes close together by merging ranges', () => {
41
+ const original = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10';
42
+ const modified = '1\nadded1\n2\nadded2\n3\n4\n5\n6\n7\n8\n9\n10';
43
+ const snippet = getDiffContextSnippet(original, modified, 1);
44
+ expect(snippet).toBe('1\nadded1\n2\nadded2\n3\n...');
45
+ });
46
+ it('should handle removals', () => {
47
+ const original = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10';
48
+ const modified = '1\n2\n3\n4\n6\n7\n8\n9\n10';
49
+ const snippet = getDiffContextSnippet(original, modified, 1);
50
+ expect(snippet).toBe('...\n4\n6\n...');
51
+ });
52
+ });
53
+ //# sourceMappingURL=diff-utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-utils.test.js","sourceRoot":"","sources":["../../../src/tools/diff-utils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Result object for a single grep match
8
+ */
9
+ export interface GrepMatch {
10
+ filePath: string;
11
+ absolutePath: string;
12
+ lineNumber: number;
13
+ line: string;
14
+ isContext?: boolean;
15
+ }
16
+ /**
17
+ * Groups matches by their file path and ensures they are sorted by line number.
18
+ */
19
+ export declare function groupMatchesByFile(allMatches: GrepMatch[]): Record<string, GrepMatch[]>;
20
+ /**
21
+ * Reads the content of a file and splits it into lines.
22
+ * Returns null if the file cannot be read.
23
+ */
24
+ export declare function readFileLines(absolutePath: string): Promise<string[] | null>;
25
+ /**
26
+ * Automatically enriches grep results with surrounding context if the match count is low
27
+ * and no specific context was requested. This optimization can enable the agent
28
+ * to skip turns that would be spent reading files after grep calls.
29
+ */
30
+ export declare function enrichWithAutoContext(matchesByFile: Record<string, GrepMatch[]>, matchCount: number, params: {
31
+ names_only?: boolean;
32
+ context?: number;
33
+ before?: number;
34
+ after?: number;
35
+ }): Promise<void>;
36
+ /**
37
+ * Formats the grep results for the LLM, including optional context.
38
+ */
39
+ export declare function formatGrepResults(allMatches: GrepMatch[], params: {
40
+ pattern: string;
41
+ names_only?: boolean;
42
+ include_pattern?: string;
43
+ context?: number;
44
+ before?: number;
45
+ after?: number;
46
+ }, searchLocationDescription: string, totalMaxMatches: number): Promise<{
47
+ llmContent: string;
48
+ returnDisplay: string;
49
+ }>;
@@ -0,0 +1,147 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import fsPromises from 'node:fs/promises';
7
+ import { debugLogger } from '../utils/debugLogger.js';
8
+ import { MAX_LINE_LENGTH_TEXT_FILE } from '../utils/constants.js';
9
+ /**
10
+ * Groups matches by their file path and ensures they are sorted by line number.
11
+ */
12
+ export function groupMatchesByFile(allMatches) {
13
+ const groups = {};
14
+ for (const match of allMatches) {
15
+ if (!groups[match.filePath]) {
16
+ groups[match.filePath] = [];
17
+ }
18
+ groups[match.filePath].push(match);
19
+ }
20
+ for (const filePath in groups) {
21
+ groups[filePath].sort((a, b) => a.lineNumber - b.lineNumber);
22
+ }
23
+ return groups;
24
+ }
25
+ /**
26
+ * Reads the content of a file and splits it into lines.
27
+ * Returns null if the file cannot be read.
28
+ */
29
+ export async function readFileLines(absolutePath) {
30
+ try {
31
+ const content = await fsPromises.readFile(absolutePath, 'utf8');
32
+ return content.split(/\r?\n/);
33
+ }
34
+ catch (err) {
35
+ debugLogger.warn(`Failed to read file for context: ${absolutePath}`, err);
36
+ return null;
37
+ }
38
+ }
39
+ /**
40
+ * Automatically enriches grep results with surrounding context if the match count is low
41
+ * and no specific context was requested. This optimization can enable the agent
42
+ * to skip turns that would be spent reading files after grep calls.
43
+ */
44
+ export async function enrichWithAutoContext(matchesByFile, matchCount, params) {
45
+ const { names_only, context, before, after } = params;
46
+ if (matchCount >= 1 &&
47
+ matchCount <= 3 &&
48
+ !names_only &&
49
+ context === undefined &&
50
+ before === undefined &&
51
+ after === undefined) {
52
+ const contextLines = matchCount === 1 ? 50 : 15;
53
+ for (const filePath in matchesByFile) {
54
+ const fileMatches = matchesByFile[filePath];
55
+ if (fileMatches.length === 0)
56
+ continue;
57
+ const fileLines = await readFileLines(fileMatches[0].absolutePath);
58
+ if (fileLines) {
59
+ const newFileMatches = [];
60
+ const seenLines = new Set();
61
+ // Sort matches to process them in order
62
+ fileMatches.sort((a, b) => a.lineNumber - b.lineNumber);
63
+ for (const match of fileMatches) {
64
+ const startLine = Math.max(0, match.lineNumber - 1 - contextLines);
65
+ const endLine = Math.min(fileLines.length, match.lineNumber - 1 + contextLines + 1);
66
+ for (let i = startLine; i < endLine; i++) {
67
+ const lineNum = i + 1;
68
+ if (!seenLines.has(lineNum)) {
69
+ newFileMatches.push({
70
+ absolutePath: match.absolutePath,
71
+ filePath: match.filePath,
72
+ lineNumber: lineNum,
73
+ line: fileLines[i],
74
+ isContext: lineNum !== match.lineNumber,
75
+ });
76
+ seenLines.add(lineNum);
77
+ }
78
+ else if (lineNum === match.lineNumber) {
79
+ const existing = newFileMatches.find((m) => m.lineNumber === lineNum);
80
+ if (existing) {
81
+ existing.isContext = false;
82
+ }
83
+ }
84
+ }
85
+ }
86
+ matchesByFile[filePath] = newFileMatches.sort((a, b) => a.lineNumber - b.lineNumber);
87
+ }
88
+ }
89
+ }
90
+ }
91
+ /**
92
+ * Formats the grep results for the LLM, including optional context.
93
+ */
94
+ export async function formatGrepResults(allMatches, params, searchLocationDescription, totalMaxMatches) {
95
+ const { pattern, names_only, include_pattern } = params;
96
+ if (allMatches.length === 0) {
97
+ const noMatchMsg = `No matches found for pattern "${pattern}" ${searchLocationDescription}${include_pattern ? ` (filter: "${include_pattern}")` : ''}.`;
98
+ return { llmContent: noMatchMsg, returnDisplay: `No matches found` };
99
+ }
100
+ const matchesByFile = groupMatchesByFile(allMatches);
101
+ const matchesOnly = allMatches.filter((m) => !m.isContext);
102
+ const matchCount = matchesOnly.length; // Count actual matches, not context lines
103
+ const matchTerm = matchCount === 1 ? 'match' : 'matches';
104
+ // If the result count is low and Gemini didn't request before/after lines of context
105
+ // add a small amount anyways to enable the agent to avoid one or more extra turns
106
+ // reading the matched files. This optimization reduces turns count by ~10% in SWEBench.
107
+ await enrichWithAutoContext(matchesByFile, matchCount, params);
108
+ const wasTruncated = matchCount >= totalMaxMatches;
109
+ if (names_only) {
110
+ const filePaths = Object.keys(matchesByFile).sort();
111
+ let llmContent = `Found ${filePaths.length} files with matches for pattern "${pattern}" ${searchLocationDescription}${include_pattern ? ` (filter: "${include_pattern}")` : ''}${wasTruncated
112
+ ? ` (results limited to ${totalMaxMatches} matches for performance)`
113
+ : ''}:\n`;
114
+ llmContent += filePaths.join('\n');
115
+ return {
116
+ llmContent: llmContent.trim(),
117
+ returnDisplay: `Found ${filePaths.length} files${wasTruncated ? ' (limited)' : ''}`,
118
+ };
119
+ }
120
+ let llmContent = `Found ${matchCount} ${matchTerm} for pattern "${pattern}" ${searchLocationDescription}${include_pattern ? ` (filter: "${include_pattern}")` : ''}`;
121
+ if (wasTruncated) {
122
+ llmContent += ` (results limited to ${totalMaxMatches} matches for performance)`;
123
+ }
124
+ llmContent += `:\n---\n`;
125
+ for (const filePath in matchesByFile) {
126
+ llmContent += `File: ${filePath}\n`;
127
+ matchesByFile[filePath].forEach((match) => {
128
+ // If isContext is undefined, assume it's a match (false)
129
+ const separator = match.isContext ? '-' : ':';
130
+ // trimEnd to avoid double newlines if line has them, but we want to preserve indentation
131
+ let lineContent = match.line.trimEnd();
132
+ const graphemes = Array.from(lineContent);
133
+ if (graphemes.length > MAX_LINE_LENGTH_TEXT_FILE) {
134
+ lineContent =
135
+ graphemes.slice(0, MAX_LINE_LENGTH_TEXT_FILE).join('') +
136
+ '... [truncated]';
137
+ }
138
+ llmContent += `L${match.lineNumber}${separator} ${lineContent}\n`;
139
+ });
140
+ llmContent += '---\n';
141
+ }
142
+ return {
143
+ llmContent: llmContent.trim(),
144
+ returnDisplay: `Found ${matchCount} ${matchTerm}${wasTruncated ? ' (limited)' : ''}`,
145
+ };
146
+ }
147
+ //# sourceMappingURL=grep-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep-utils.js","sourceRoot":"","sources":["../../../src/tools/grep-utils.ts"],"names":[],"mappings":"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"}