@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,490 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
7
+ import { OAuth2AuthProvider } from './oauth2-provider.js';
8
+ // Mock DefaultAgentCardResolver from @a2a-js/sdk/client.
9
+ const mockResolve = vi.fn();
10
+ vi.mock('@a2a-js/sdk/client', async (importOriginal) => {
11
+ const actual = await importOriginal();
12
+ return {
13
+ ...actual,
14
+ DefaultAgentCardResolver: vi.fn().mockImplementation(() => ({
15
+ resolve: mockResolve,
16
+ })),
17
+ };
18
+ });
19
+ // Mock all external dependencies.
20
+ vi.mock('../../mcp/oauth-token-storage.js', () => {
21
+ const MCPOAuthTokenStorage = vi.fn().mockImplementation(() => ({
22
+ getCredentials: vi.fn().mockResolvedValue(null),
23
+ saveToken: vi.fn().mockResolvedValue(undefined),
24
+ deleteCredentials: vi.fn().mockResolvedValue(undefined),
25
+ isTokenExpired: vi.fn().mockReturnValue(false),
26
+ }));
27
+ return { MCPOAuthTokenStorage };
28
+ });
29
+ vi.mock('../../utils/oauth-flow.js', () => ({
30
+ generatePKCEParams: vi.fn().mockReturnValue({
31
+ codeVerifier: 'test-verifier',
32
+ codeChallenge: 'test-challenge',
33
+ state: 'test-state',
34
+ }),
35
+ startCallbackServer: vi.fn().mockReturnValue({
36
+ port: Promise.resolve(12345),
37
+ response: Promise.resolve({ code: 'test-code', state: 'test-state' }),
38
+ }),
39
+ getPortFromUrl: vi.fn().mockReturnValue(undefined),
40
+ buildAuthorizationUrl: vi
41
+ .fn()
42
+ .mockReturnValue('https://auth.example.com/authorize?foo=bar'),
43
+ exchangeCodeForToken: vi.fn().mockResolvedValue({
44
+ access_token: 'new-access-token',
45
+ token_type: 'Bearer',
46
+ expires_in: 3600,
47
+ refresh_token: 'new-refresh-token',
48
+ }),
49
+ refreshAccessToken: vi.fn().mockResolvedValue({
50
+ access_token: 'refreshed-access-token',
51
+ token_type: 'Bearer',
52
+ expires_in: 3600,
53
+ refresh_token: 'refreshed-refresh-token',
54
+ }),
55
+ }));
56
+ vi.mock('../../utils/secure-browser-launcher.js', () => ({
57
+ openBrowserSecurely: vi.fn().mockResolvedValue(undefined),
58
+ }));
59
+ vi.mock('../../utils/authConsent.js', () => ({
60
+ getConsentForOauth: vi.fn().mockResolvedValue(true),
61
+ }));
62
+ vi.mock('../../utils/events.js', () => ({
63
+ coreEvents: {
64
+ emitFeedback: vi.fn(),
65
+ },
66
+ }));
67
+ vi.mock('../../utils/debugLogger.js', () => ({
68
+ debugLogger: {
69
+ debug: vi.fn(),
70
+ warn: vi.fn(),
71
+ error: vi.fn(),
72
+ log: vi.fn(),
73
+ },
74
+ }));
75
+ // Re-import mocked modules for assertions.
76
+ const { MCPOAuthTokenStorage } = await import('../../mcp/oauth-token-storage.js');
77
+ const { refreshAccessToken, exchangeCodeForToken, generatePKCEParams, startCallbackServer, buildAuthorizationUrl, } = await import('../../utils/oauth-flow.js');
78
+ const { getConsentForOauth } = await import('../../utils/authConsent.js');
79
+ function createConfig(overrides = {}) {
80
+ return {
81
+ type: 'oauth2',
82
+ client_id: 'test-client-id',
83
+ authorization_url: 'https://auth.example.com/authorize',
84
+ token_url: 'https://auth.example.com/token',
85
+ scopes: ['read', 'write'],
86
+ ...overrides,
87
+ };
88
+ }
89
+ function getTokenStorage() {
90
+ // Access the mocked MCPOAuthTokenStorage instance created in the constructor.
91
+ const instance = vi.mocked(MCPOAuthTokenStorage).mock.results.at(-1).value;
92
+ return instance;
93
+ }
94
+ describe('OAuth2AuthProvider', () => {
95
+ beforeEach(() => {
96
+ vi.clearAllMocks();
97
+ });
98
+ describe('constructor', () => {
99
+ it('should set type to oauth2', () => {
100
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
101
+ expect(provider.type).toBe('oauth2');
102
+ });
103
+ it('should use config values for authorization_url and token_url', () => {
104
+ const config = createConfig({
105
+ authorization_url: 'https://custom.example.com/authorize',
106
+ token_url: 'https://custom.example.com/token',
107
+ });
108
+ const provider = new OAuth2AuthProvider(config, 'test-agent');
109
+ // Verify by calling headers which will trigger interactive flow with these URLs.
110
+ expect(provider.type).toBe('oauth2');
111
+ });
112
+ it('should merge agent card defaults when config values are missing', () => {
113
+ const config = createConfig({
114
+ authorization_url: undefined,
115
+ token_url: undefined,
116
+ scopes: undefined,
117
+ });
118
+ const agentCard = {
119
+ securitySchemes: {
120
+ oauth: {
121
+ type: 'oauth2',
122
+ flows: {
123
+ authorizationCode: {
124
+ authorizationUrl: 'https://card.example.com/authorize',
125
+ tokenUrl: 'https://card.example.com/token',
126
+ scopes: { read: 'Read access', write: 'Write access' },
127
+ },
128
+ },
129
+ },
130
+ },
131
+ };
132
+ const provider = new OAuth2AuthProvider(config, 'test-agent', agentCard);
133
+ expect(provider.type).toBe('oauth2');
134
+ });
135
+ it('should prefer config values over agent card values', async () => {
136
+ const config = createConfig({
137
+ authorization_url: 'https://config.example.com/authorize',
138
+ token_url: 'https://config.example.com/token',
139
+ scopes: ['custom-scope'],
140
+ });
141
+ const agentCard = {
142
+ securitySchemes: {
143
+ oauth: {
144
+ type: 'oauth2',
145
+ flows: {
146
+ authorizationCode: {
147
+ authorizationUrl: 'https://card.example.com/authorize',
148
+ tokenUrl: 'https://card.example.com/token',
149
+ scopes: { read: 'Read access' },
150
+ },
151
+ },
152
+ },
153
+ },
154
+ };
155
+ const provider = new OAuth2AuthProvider(config, 'test-agent', agentCard);
156
+ await provider.headers();
157
+ // The config URLs should be used, not the agent card ones.
158
+ expect(vi.mocked(buildAuthorizationUrl)).toHaveBeenCalledWith(expect.objectContaining({
159
+ authorizationUrl: 'https://config.example.com/authorize',
160
+ tokenUrl: 'https://config.example.com/token',
161
+ scopes: ['custom-scope'],
162
+ }), expect.anything(), expect.anything(), undefined);
163
+ });
164
+ });
165
+ describe('initialize', () => {
166
+ it('should load a valid token from storage', async () => {
167
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
168
+ const storage = getTokenStorage();
169
+ storage.getCredentials.mockResolvedValue({
170
+ serverName: 'test-agent',
171
+ token: {
172
+ accessToken: 'stored-token',
173
+ tokenType: 'Bearer',
174
+ },
175
+ updatedAt: Date.now(),
176
+ });
177
+ storage.isTokenExpired.mockReturnValue(false);
178
+ await provider.initialize();
179
+ const headers = await provider.headers();
180
+ expect(headers).toEqual({ Authorization: 'Bearer stored-token' });
181
+ });
182
+ it('should not cache an expired token from storage', async () => {
183
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
184
+ const storage = getTokenStorage();
185
+ storage.getCredentials.mockResolvedValue({
186
+ serverName: 'test-agent',
187
+ token: {
188
+ accessToken: 'expired-token',
189
+ tokenType: 'Bearer',
190
+ expiresAt: Date.now() - 1000,
191
+ },
192
+ updatedAt: Date.now(),
193
+ });
194
+ storage.isTokenExpired.mockReturnValue(true);
195
+ await provider.initialize();
196
+ // Should trigger interactive flow since cached token is null.
197
+ const headers = await provider.headers();
198
+ expect(headers).toEqual({ Authorization: 'Bearer new-access-token' });
199
+ });
200
+ it('should handle no stored credentials gracefully', async () => {
201
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
202
+ const storage = getTokenStorage();
203
+ storage.getCredentials.mockResolvedValue(null);
204
+ await provider.initialize();
205
+ // Should trigger interactive flow.
206
+ const headers = await provider.headers();
207
+ expect(headers).toEqual({ Authorization: 'Bearer new-access-token' });
208
+ });
209
+ });
210
+ describe('headers', () => {
211
+ it('should return cached token if valid', async () => {
212
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
213
+ const storage = getTokenStorage();
214
+ storage.getCredentials.mockResolvedValue({
215
+ serverName: 'test-agent',
216
+ token: { accessToken: 'cached-token', tokenType: 'Bearer' },
217
+ updatedAt: Date.now(),
218
+ });
219
+ storage.isTokenExpired.mockReturnValue(false);
220
+ await provider.initialize();
221
+ const headers = await provider.headers();
222
+ expect(headers).toEqual({ Authorization: 'Bearer cached-token' });
223
+ expect(vi.mocked(exchangeCodeForToken)).not.toHaveBeenCalled();
224
+ expect(vi.mocked(refreshAccessToken)).not.toHaveBeenCalled();
225
+ });
226
+ it('should refresh token when expired with refresh_token available', async () => {
227
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
228
+ const storage = getTokenStorage();
229
+ // First call: load from storage (expired but with refresh token).
230
+ storage.getCredentials.mockResolvedValue({
231
+ serverName: 'test-agent',
232
+ token: {
233
+ accessToken: 'expired-token',
234
+ tokenType: 'Bearer',
235
+ refreshToken: 'my-refresh-token',
236
+ expiresAt: Date.now() - 1000,
237
+ },
238
+ updatedAt: Date.now(),
239
+ });
240
+ // isTokenExpired: false for initialize (to cache it), true for headers check.
241
+ storage.isTokenExpired
242
+ .mockReturnValueOnce(false) // initialize: cache the token
243
+ .mockReturnValueOnce(true); // headers: token is expired
244
+ await provider.initialize();
245
+ const headers = await provider.headers();
246
+ expect(vi.mocked(refreshAccessToken)).toHaveBeenCalledWith(expect.objectContaining({ clientId: 'test-client-id' }), 'my-refresh-token', 'https://auth.example.com/token');
247
+ expect(headers).toEqual({
248
+ Authorization: 'Bearer refreshed-access-token',
249
+ });
250
+ expect(storage.saveToken).toHaveBeenCalled();
251
+ });
252
+ it('should fall back to interactive flow when refresh fails', async () => {
253
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
254
+ const storage = getTokenStorage();
255
+ storage.getCredentials.mockResolvedValue({
256
+ serverName: 'test-agent',
257
+ token: {
258
+ accessToken: 'expired-token',
259
+ tokenType: 'Bearer',
260
+ refreshToken: 'bad-refresh-token',
261
+ expiresAt: Date.now() - 1000,
262
+ },
263
+ updatedAt: Date.now(),
264
+ });
265
+ storage.isTokenExpired
266
+ .mockReturnValueOnce(false) // initialize
267
+ .mockReturnValueOnce(true); // headers
268
+ vi.mocked(refreshAccessToken).mockRejectedValueOnce(new Error('Refresh failed'));
269
+ await provider.initialize();
270
+ const headers = await provider.headers();
271
+ // Should have deleted stale credentials and done interactive flow.
272
+ expect(storage.deleteCredentials).toHaveBeenCalledWith('test-agent');
273
+ expect(headers).toEqual({ Authorization: 'Bearer new-access-token' });
274
+ });
275
+ it('should trigger interactive flow when no token exists', async () => {
276
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
277
+ const storage = getTokenStorage();
278
+ storage.getCredentials.mockResolvedValue(null);
279
+ await provider.initialize();
280
+ const headers = await provider.headers();
281
+ expect(vi.mocked(generatePKCEParams)).toHaveBeenCalled();
282
+ expect(vi.mocked(startCallbackServer)).toHaveBeenCalled();
283
+ expect(vi.mocked(exchangeCodeForToken)).toHaveBeenCalled();
284
+ expect(storage.saveToken).toHaveBeenCalledWith('test-agent', expect.objectContaining({ accessToken: 'new-access-token' }), 'test-client-id', 'https://auth.example.com/token');
285
+ expect(headers).toEqual({ Authorization: 'Bearer new-access-token' });
286
+ });
287
+ it('should throw when user declines consent', async () => {
288
+ vi.mocked(getConsentForOauth).mockResolvedValueOnce(false);
289
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
290
+ await provider.initialize();
291
+ await expect(provider.headers()).rejects.toThrow('Authentication cancelled by user');
292
+ });
293
+ it('should throw when client_id is missing', async () => {
294
+ const config = createConfig({ client_id: undefined });
295
+ const provider = new OAuth2AuthProvider(config, 'test-agent');
296
+ await provider.initialize();
297
+ await expect(provider.headers()).rejects.toThrow(/requires a client_id/);
298
+ });
299
+ it('should throw when authorization_url and token_url are missing', async () => {
300
+ const config = createConfig({
301
+ authorization_url: undefined,
302
+ token_url: undefined,
303
+ });
304
+ const provider = new OAuth2AuthProvider(config, 'test-agent');
305
+ await provider.initialize();
306
+ await expect(provider.headers()).rejects.toThrow(/requires authorization_url and token_url/);
307
+ });
308
+ });
309
+ describe('shouldRetryWithHeaders', () => {
310
+ it('should clear token and re-authenticate on 401', async () => {
311
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
312
+ const storage = getTokenStorage();
313
+ storage.getCredentials.mockResolvedValue({
314
+ serverName: 'test-agent',
315
+ token: { accessToken: 'old-token', tokenType: 'Bearer' },
316
+ updatedAt: Date.now(),
317
+ });
318
+ storage.isTokenExpired.mockReturnValue(false);
319
+ await provider.initialize();
320
+ const res = new Response(null, { status: 401 });
321
+ const retryHeaders = await provider.shouldRetryWithHeaders({}, res);
322
+ expect(storage.deleteCredentials).toHaveBeenCalledWith('test-agent');
323
+ expect(retryHeaders).toBeDefined();
324
+ expect(retryHeaders).toHaveProperty('Authorization');
325
+ });
326
+ it('should clear token and re-authenticate on 403', async () => {
327
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
328
+ const storage = getTokenStorage();
329
+ storage.getCredentials.mockResolvedValue({
330
+ serverName: 'test-agent',
331
+ token: { accessToken: 'old-token', tokenType: 'Bearer' },
332
+ updatedAt: Date.now(),
333
+ });
334
+ storage.isTokenExpired.mockReturnValue(false);
335
+ await provider.initialize();
336
+ const res = new Response(null, { status: 403 });
337
+ const retryHeaders = await provider.shouldRetryWithHeaders({}, res);
338
+ expect(retryHeaders).toBeDefined();
339
+ });
340
+ it('should return undefined for non-auth errors', async () => {
341
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
342
+ const res = new Response(null, { status: 500 });
343
+ const retryHeaders = await provider.shouldRetryWithHeaders({}, res);
344
+ expect(retryHeaders).toBeUndefined();
345
+ });
346
+ it('should respect MAX_AUTH_RETRIES', async () => {
347
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
348
+ const res401 = new Response(null, { status: 401 });
349
+ // First retry — should succeed.
350
+ const first = await provider.shouldRetryWithHeaders({}, res401);
351
+ expect(first).toBeDefined();
352
+ // Second retry — should succeed.
353
+ const second = await provider.shouldRetryWithHeaders({}, res401);
354
+ expect(second).toBeDefined();
355
+ // Third retry — should be blocked.
356
+ const third = await provider.shouldRetryWithHeaders({}, res401);
357
+ expect(third).toBeUndefined();
358
+ });
359
+ it('should reset retry count on non-auth response', async () => {
360
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
361
+ const res401 = new Response(null, { status: 401 });
362
+ const res200 = new Response(null, { status: 200 });
363
+ await provider.shouldRetryWithHeaders({}, res401);
364
+ await provider.shouldRetryWithHeaders({}, res200); // resets
365
+ // Should be able to retry again.
366
+ const result = await provider.shouldRetryWithHeaders({}, res401);
367
+ expect(result).toBeDefined();
368
+ });
369
+ });
370
+ describe('token persistence', () => {
371
+ it('should persist token after successful interactive auth', async () => {
372
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
373
+ const storage = getTokenStorage();
374
+ await provider.initialize();
375
+ await provider.headers();
376
+ expect(storage.saveToken).toHaveBeenCalledWith('test-agent', expect.objectContaining({
377
+ accessToken: 'new-access-token',
378
+ tokenType: 'Bearer',
379
+ refreshToken: 'new-refresh-token',
380
+ }), 'test-client-id', 'https://auth.example.com/token');
381
+ });
382
+ it('should persist token after successful refresh', async () => {
383
+ const provider = new OAuth2AuthProvider(createConfig(), 'test-agent');
384
+ const storage = getTokenStorage();
385
+ storage.getCredentials.mockResolvedValue({
386
+ serverName: 'test-agent',
387
+ token: {
388
+ accessToken: 'expired-token',
389
+ tokenType: 'Bearer',
390
+ refreshToken: 'my-refresh-token',
391
+ },
392
+ updatedAt: Date.now(),
393
+ });
394
+ storage.isTokenExpired
395
+ .mockReturnValueOnce(false)
396
+ .mockReturnValueOnce(true);
397
+ await provider.initialize();
398
+ await provider.headers();
399
+ expect(storage.saveToken).toHaveBeenCalledWith('test-agent', expect.objectContaining({
400
+ accessToken: 'refreshed-access-token',
401
+ }), 'test-client-id', 'https://auth.example.com/token');
402
+ });
403
+ });
404
+ describe('agent card integration', () => {
405
+ it('should discover URLs from agent card when not in config', async () => {
406
+ const config = createConfig({
407
+ authorization_url: undefined,
408
+ token_url: undefined,
409
+ scopes: undefined,
410
+ });
411
+ const agentCard = {
412
+ securitySchemes: {
413
+ myOauth: {
414
+ type: 'oauth2',
415
+ flows: {
416
+ authorizationCode: {
417
+ authorizationUrl: 'https://card.example.com/auth',
418
+ tokenUrl: 'https://card.example.com/token',
419
+ scopes: { profile: 'View profile', email: 'View email' },
420
+ },
421
+ },
422
+ },
423
+ },
424
+ };
425
+ const provider = new OAuth2AuthProvider(config, 'card-agent', agentCard);
426
+ await provider.initialize();
427
+ await provider.headers();
428
+ expect(vi.mocked(buildAuthorizationUrl)).toHaveBeenCalledWith(expect.objectContaining({
429
+ authorizationUrl: 'https://card.example.com/auth',
430
+ tokenUrl: 'https://card.example.com/token',
431
+ scopes: ['profile', 'email'],
432
+ }), expect.anything(), expect.anything(), undefined);
433
+ });
434
+ it('should discover URLs from agentCardUrl via DefaultAgentCardResolver during initialize', async () => {
435
+ const config = createConfig({
436
+ authorization_url: undefined,
437
+ token_url: undefined,
438
+ scopes: undefined,
439
+ });
440
+ // Simulate a normalized agent card returned by DefaultAgentCardResolver.
441
+ mockResolve.mockResolvedValue({
442
+ securitySchemes: {
443
+ myOauth: {
444
+ type: 'oauth2',
445
+ flows: {
446
+ authorizationCode: {
447
+ authorizationUrl: 'https://discovered.example.com/auth',
448
+ tokenUrl: 'https://discovered.example.com/token',
449
+ scopes: { openid: 'OpenID', profile: 'Profile' },
450
+ },
451
+ },
452
+ },
453
+ },
454
+ });
455
+ // No agentCard passed to constructor — only agentCardUrl.
456
+ const provider = new OAuth2AuthProvider(config, 'discover-agent', undefined, 'https://example.com/.well-known/agent-card.json');
457
+ await provider.initialize();
458
+ await provider.headers();
459
+ expect(mockResolve).toHaveBeenCalledWith('https://example.com/.well-known/agent-card.json', '');
460
+ expect(vi.mocked(buildAuthorizationUrl)).toHaveBeenCalledWith(expect.objectContaining({
461
+ authorizationUrl: 'https://discovered.example.com/auth',
462
+ tokenUrl: 'https://discovered.example.com/token',
463
+ scopes: ['openid', 'profile'],
464
+ }), expect.anything(), expect.anything(), undefined);
465
+ });
466
+ it('should ignore agent card with no authorizationCode flow', () => {
467
+ const config = createConfig({
468
+ authorization_url: undefined,
469
+ token_url: undefined,
470
+ });
471
+ const agentCard = {
472
+ securitySchemes: {
473
+ myOauth: {
474
+ type: 'oauth2',
475
+ flows: {
476
+ clientCredentials: {
477
+ tokenUrl: 'https://card.example.com/token',
478
+ scopes: {},
479
+ },
480
+ },
481
+ },
482
+ },
483
+ };
484
+ // Should not throw — just won't have URLs.
485
+ const provider = new OAuth2AuthProvider(config, 'card-agent', agentCard);
486
+ expect(provider.type).toBe('oauth2');
487
+ });
488
+ });
489
+ });
490
+ //# sourceMappingURL=oauth2-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth2-provider.test.js","sourceRoot":"","sources":["../../../../src/agents/auth-provider/oauth2-provider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * @fileoverview Tool for visual identification via a single model call.
8
+ *
9
+ * The semantic browser agent uses this tool when it needs to identify
10
+ * elements by visual attributes not present in the accessibility tree
11
+ * (e.g., color, layout, precise coordinates).
12
+ *
13
+ * Unlike the semantic agent which works with the accessibility tree,
14
+ * this tool sends a screenshot to a computer-use model for visual analysis.
15
+ * It returns the model's analysis (coordinates, element descriptions) back
16
+ * to the browser agent, which retains full control of subsequent actions.
17
+ */
18
+ import { DeclarativeTool, type ToolResult, type ToolInvocation } from '../../tools/tools.js';
19
+ import type { MessageBus } from '../../confirmation-bus/message-bus.js';
20
+ import type { BrowserManager } from './browserManager.js';
21
+ import type { Config } from '../../config/config.js';
22
+ /**
23
+ * DeclarativeTool for screenshot-based visual analysis.
24
+ */
25
+ declare class AnalyzeScreenshotTool extends DeclarativeTool<Record<string, unknown>, ToolResult> {
26
+ private readonly browserManager;
27
+ private readonly config;
28
+ constructor(browserManager: BrowserManager, config: Config, messageBus: MessageBus);
29
+ build(params: Record<string, unknown>): ToolInvocation<Record<string, unknown>, ToolResult>;
30
+ }
31
+ /**
32
+ * Creates the analyze_screenshot tool for the browser agent.
33
+ */
34
+ export declare function createAnalyzeScreenshotTool(browserManager: BrowserManager, config: Config, messageBus: MessageBus): AnalyzeScreenshotTool;
35
+ export {};