@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,164 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * @fileoverview Custom error types for A2A remote agent operations.
8
+ * Provides structured, user-friendly error messages for common failure modes
9
+ * during agent card fetching, authentication, and communication.
10
+ */
11
+ /**
12
+ * Base class for all A2A agent errors.
13
+ * Provides a `userMessage` field with a human-readable description.
14
+ */
15
+ export class A2AAgentError extends Error {
16
+ /** A user-friendly message suitable for display in the CLI. */
17
+ userMessage;
18
+ /** The agent name associated with this error. */
19
+ agentName;
20
+ constructor(agentName, message, userMessage, options) {
21
+ super(message, options);
22
+ this.name = 'A2AAgentError';
23
+ this.agentName = agentName;
24
+ this.userMessage = userMessage;
25
+ }
26
+ }
27
+ /**
28
+ * Thrown when the agent card URL returns a 404 Not Found response.
29
+ */
30
+ export class AgentCardNotFoundError extends A2AAgentError {
31
+ constructor(agentName, agentCardUrl) {
32
+ const message = `Agent card not found at ${agentCardUrl} (HTTP 404)`;
33
+ const userMessage = `Agent card not found (404) at ${agentCardUrl}. Verify the agent_card_url in your agent definition.`;
34
+ super(agentName, message, userMessage);
35
+ this.name = 'AgentCardNotFoundError';
36
+ }
37
+ }
38
+ /**
39
+ * Thrown when the agent card URL returns a 401/403 response,
40
+ * indicating an authentication or authorization failure.
41
+ */
42
+ export class AgentCardAuthError extends A2AAgentError {
43
+ statusCode;
44
+ constructor(agentName, agentCardUrl, statusCode) {
45
+ const statusText = statusCode === 401 ? 'Unauthorized' : 'Forbidden';
46
+ const message = `Agent card request returned ${statusCode} ${statusText} for ${agentCardUrl}`;
47
+ const userMessage = `Authentication failed (${statusCode} ${statusText}) at ${agentCardUrl}. Check the "auth" configuration in your agent definition.`;
48
+ super(agentName, message, userMessage);
49
+ this.name = 'AgentCardAuthError';
50
+ this.statusCode = statusCode;
51
+ }
52
+ }
53
+ /**
54
+ * Thrown when the agent card's security schemes require authentication
55
+ * but the agent definition does not include the necessary auth configuration.
56
+ */
57
+ export class AgentAuthConfigMissingError extends A2AAgentError {
58
+ /** Human-readable description of required authentication schemes. */
59
+ requiredAuth;
60
+ /** Specific fields or config entries that are missing. */
61
+ missingFields;
62
+ constructor(agentName, requiredAuth, missingFields) {
63
+ const message = `Agent "${agentName}" requires authentication but none is configured`;
64
+ const userMessage = `Agent requires ${requiredAuth} but no auth is configured. Missing: ${missingFields.join(', ')}`;
65
+ super(agentName, message, userMessage);
66
+ this.name = 'AgentAuthConfigMissingError';
67
+ this.requiredAuth = requiredAuth;
68
+ this.missingFields = missingFields;
69
+ }
70
+ }
71
+ /**
72
+ * Thrown when a generic/unexpected network or server error occurs
73
+ * while fetching the agent card or communicating with the remote agent.
74
+ */
75
+ export class AgentConnectionError extends A2AAgentError {
76
+ constructor(agentName, agentCardUrl, cause) {
77
+ const causeMessage = cause instanceof Error ? cause.message : String(cause);
78
+ const message = `Failed to connect to agent "${agentName}" at ${agentCardUrl}: ${causeMessage}`;
79
+ const userMessage = `Connection failed for ${agentCardUrl}: ${causeMessage}`;
80
+ super(agentName, message, userMessage, { cause });
81
+ this.name = 'AgentConnectionError';
82
+ }
83
+ }
84
+ /** Type guard for objects that may carry error metadata (message, code, status, cause). */
85
+ function isErrorLikeObject(val) {
86
+ return typeof val === 'object' && val !== null;
87
+ }
88
+ /**
89
+ * Collects all error messages from an error's cause chain into a single string
90
+ * for pattern matching. This is necessary because the A2A SDK and Node's fetch
91
+ * often wrap the real error (e.g. HTTP status) deep inside nested causes.
92
+ */
93
+ function collectErrorMessages(error) {
94
+ const parts = [];
95
+ let current = error;
96
+ let depth = 0;
97
+ const maxDepth = 10;
98
+ while (current && depth < maxDepth) {
99
+ if (isErrorLikeObject(current)) {
100
+ // Save reference before instanceof narrows the type from ErrorLikeObject to Error.
101
+ const obj = current;
102
+ if (current instanceof Error) {
103
+ parts.push(current.message);
104
+ }
105
+ else if (typeof obj.message === 'string') {
106
+ parts.push(obj.message);
107
+ }
108
+ if (typeof obj.code === 'string') {
109
+ parts.push(obj.code);
110
+ }
111
+ if (typeof obj.status === 'number') {
112
+ parts.push(String(obj.status));
113
+ }
114
+ else if (typeof obj.statusCode === 'number') {
115
+ parts.push(String(obj.statusCode));
116
+ }
117
+ current = obj.cause;
118
+ }
119
+ else if (typeof current === 'string') {
120
+ parts.push(current);
121
+ break;
122
+ }
123
+ else {
124
+ parts.push(String(current));
125
+ break;
126
+ }
127
+ depth++;
128
+ }
129
+ return parts.join(' ');
130
+ }
131
+ /**
132
+ * Attempts to classify a raw error from the A2A SDK into a typed A2AAgentError.
133
+ *
134
+ * Inspects the error message and full cause chain for HTTP status codes and
135
+ * well-known patterns to produce a structured, user-friendly error.
136
+ *
137
+ * @param agentName The name of the agent being loaded.
138
+ * @param agentCardUrl The URL of the agent card.
139
+ * @param error The raw error caught during agent loading.
140
+ * @returns A classified A2AAgentError subclass.
141
+ */
142
+ export function classifyAgentError(agentName, agentCardUrl, error) {
143
+ // Collect messages from the entire cause chain for thorough matching.
144
+ const fullErrorText = collectErrorMessages(error);
145
+ // Check for well-known connection error codes in the cause chain.
146
+ // NOTE: This is checked before the 404 pattern as a defensive measure
147
+ // to prevent DNS errors (ENOTFOUND) from being misclassified as 404s.
148
+ if (/\b(ECONNREFUSED|ENOTFOUND|EHOSTUNREACH|ETIMEDOUT)\b/i.test(fullErrorText)) {
149
+ return new AgentConnectionError(agentName, agentCardUrl, error);
150
+ }
151
+ // Check for HTTP status code patterns across the full cause chain.
152
+ if (/\b404\b|\bnot[\s_-]?found\b/i.test(fullErrorText)) {
153
+ return new AgentCardNotFoundError(agentName, agentCardUrl);
154
+ }
155
+ if (/\b401\b|unauthorized/i.test(fullErrorText)) {
156
+ return new AgentCardAuthError(agentName, agentCardUrl, 401);
157
+ }
158
+ if (/\b403\b|forbidden/i.test(fullErrorText)) {
159
+ return new AgentCardAuthError(agentName, agentCardUrl, 403);
160
+ }
161
+ // Fallback to a generic connection error.
162
+ return new AgentConnectionError(agentName, agentCardUrl, error);
163
+ }
164
+ //# sourceMappingURL=a2a-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-errors.js","sourceRoot":"","sources":["../../../src/agents/a2a-errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,+DAA+D;IACtD,WAAW,CAAS;IAC7B,iDAAiD;IACxC,SAAS,CAAS;IAE3B,YACE,SAAiB,EACjB,OAAe,EACf,WAAmB,EACnB,OAAsB;QAEtB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IACvD,YAAY,SAAiB,EAAE,YAAoB;QACjD,MAAM,OAAO,GAAG,2BAA2B,YAAY,aAAa,CAAC;QACrE,MAAM,WAAW,GAAG,iCAAiC,YAAY,uDAAuD,CAAC;QACzH,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,aAAa;IAC1C,UAAU,CAAS;IAE5B,YAAY,SAAiB,EAAE,YAAoB,EAAE,UAAqB;QACxE,MAAM,UAAU,GAAG,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC;QACrE,MAAM,OAAO,GAAG,+BAA+B,UAAU,IAAI,UAAU,QAAQ,YAAY,EAAE,CAAC;QAC9F,MAAM,WAAW,GAAG,0BAA0B,UAAU,IAAI,UAAU,QAAQ,YAAY,4DAA4D,CAAC;QACvJ,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,2BAA4B,SAAQ,aAAa;IAC5D,qEAAqE;IAC5D,YAAY,CAAS;IAC9B,0DAA0D;IACjD,aAAa,CAAW;IAEjC,YACE,SAAiB,EACjB,YAAoB,EACpB,aAAuB;QAEvB,MAAM,OAAO,GAAG,UAAU,SAAS,kDAAkD,CAAC;QACtF,MAAM,WAAW,GAAG,kBAAkB,YAAY,wCAAwC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACrH,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC1C,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,oBAAqB,SAAQ,aAAa;IACrD,YAAY,SAAiB,EAAE,YAAoB,EAAE,KAAc;QACjE,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,+BAA+B,SAAS,QAAQ,YAAY,KAAK,YAAY,EAAE,CAAC;QAChG,MAAM,WAAW,GAAG,yBAAyB,YAAY,KAAK,YAAY,EAAE,CAAC;QAC7E,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAWD,2FAA2F;AAC3F,SAAS,iBAAiB,CAAC,GAAY;IACrC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,KAAc;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAY,KAAK,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,QAAQ,GAAG,EAAE,CAAC;IAEpB,OAAO,OAAO,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;QACnC,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,mFAAmF;YACnF,MAAM,GAAG,GAAG,OAAO,CAAC;YAEpB,IAAI,OAAO,YAAY,KAAK,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;iBAAM,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;YAED,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;YAED,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;gBAC9C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YACrC,CAAC;YAED,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC;QACtB,CAAC;aAAM,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,MAAM;QACR,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5B,MAAM;QACR,CAAC;QACD,KAAK,EAAE,CAAC;IACV,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,YAAoB,EACpB,KAAc;IAEd,sEAAsE;IACtE,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAElD,kEAAkE;IAClE,sEAAsE;IACtE,sEAAsE;IACtE,IACE,sDAAsD,CAAC,IAAI,CAAC,aAAa,CAAC,EAC1E,CAAC;QACD,OAAO,IAAI,oBAAoB,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,mEAAmE;IACnE,IAAI,8BAA8B,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACvD,OAAO,IAAI,sBAAsB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,kBAAkB,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,kBAAkB,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;IAC9D,CAAC;IAED,0CAA0C;IAC1C,OAAO,IAAI,oBAAoB,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;AAClE,CAAC"}
@@ -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,183 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { A2AAgentError, AgentCardNotFoundError, AgentCardAuthError, AgentAuthConfigMissingError, AgentConnectionError, classifyAgentError, } from './a2a-errors.js';
8
+ describe('A2A Error Types', () => {
9
+ describe('A2AAgentError', () => {
10
+ it('should set name, agentName, and userMessage', () => {
11
+ const error = new A2AAgentError('my-agent', 'internal msg', 'user msg');
12
+ expect(error.name).toBe('A2AAgentError');
13
+ expect(error.agentName).toBe('my-agent');
14
+ expect(error.message).toBe('internal msg');
15
+ expect(error.userMessage).toBe('user msg');
16
+ });
17
+ });
18
+ describe('AgentCardNotFoundError', () => {
19
+ it('should produce a user-friendly 404 message', () => {
20
+ const error = new AgentCardNotFoundError('my-agent', 'https://example.com/card');
21
+ expect(error.name).toBe('AgentCardNotFoundError');
22
+ expect(error.agentName).toBe('my-agent');
23
+ expect(error.userMessage).toContain('404');
24
+ expect(error.userMessage).toContain('https://example.com/card');
25
+ expect(error.userMessage).toContain('agent_card_url');
26
+ });
27
+ });
28
+ describe('AgentCardAuthError', () => {
29
+ it('should produce a user-friendly 401 message', () => {
30
+ const error = new AgentCardAuthError('secure-agent', 'https://example.com/card', 401);
31
+ expect(error.name).toBe('AgentCardAuthError');
32
+ expect(error.statusCode).toBe(401);
33
+ expect(error.userMessage).toContain('401');
34
+ expect(error.userMessage).toContain('Unauthorized');
35
+ expect(error.userMessage).toContain('"auth" configuration');
36
+ });
37
+ it('should produce a user-friendly 403 message', () => {
38
+ const error = new AgentCardAuthError('secure-agent', 'https://example.com/card', 403);
39
+ expect(error.statusCode).toBe(403);
40
+ expect(error.userMessage).toContain('403');
41
+ expect(error.userMessage).toContain('Forbidden');
42
+ });
43
+ });
44
+ describe('AgentAuthConfigMissingError', () => {
45
+ it('should list missing config fields', () => {
46
+ const error = new AgentAuthConfigMissingError('api-agent', 'API Key (x-api-key): Send x-api-key in header', [
47
+ 'Authentication is required but not configured',
48
+ "Scheme 'api_key' requires apiKey authentication",
49
+ ]);
50
+ expect(error.name).toBe('AgentAuthConfigMissingError');
51
+ expect(error.requiredAuth).toContain('API Key');
52
+ expect(error.missingFields).toHaveLength(2);
53
+ expect(error.userMessage).toContain('API Key');
54
+ expect(error.userMessage).toContain('no auth is configured');
55
+ expect(error.userMessage).toContain('Missing:');
56
+ });
57
+ });
58
+ describe('AgentConnectionError', () => {
59
+ it('should wrap the original error cause', () => {
60
+ const cause = new Error('ECONNREFUSED');
61
+ const error = new AgentConnectionError('my-agent', 'https://example.com/card', cause);
62
+ expect(error.name).toBe('AgentConnectionError');
63
+ expect(error.userMessage).toContain('ECONNREFUSED');
64
+ expect(error.userMessage).toContain('https://example.com/card');
65
+ });
66
+ it('should handle non-Error causes', () => {
67
+ const error = new AgentConnectionError('my-agent', 'https://example.com/card', 'raw string error');
68
+ expect(error.userMessage).toContain('raw string error');
69
+ });
70
+ });
71
+ describe('classifyAgentError', () => {
72
+ it('should classify a 404 error message', () => {
73
+ const raw = new Error('HTTP 404: Not Found');
74
+ const result = classifyAgentError('agent-a', 'https://example.com/card', raw);
75
+ expect(result).toBeInstanceOf(AgentCardNotFoundError);
76
+ expect(result.agentName).toBe('agent-a');
77
+ });
78
+ it('should classify a "not found" error message (case-insensitive)', () => {
79
+ const raw = new Error('Agent card not found at the given URL');
80
+ const result = classifyAgentError('agent-a', 'https://example.com/card', raw);
81
+ expect(result).toBeInstanceOf(AgentCardNotFoundError);
82
+ });
83
+ it('should classify a 401 error message', () => {
84
+ const raw = new Error('Request failed with status 401');
85
+ const result = classifyAgentError('agent-b', 'https://example.com/card', raw);
86
+ expect(result).toBeInstanceOf(AgentCardAuthError);
87
+ expect(result.statusCode).toBe(401);
88
+ });
89
+ it('should classify an "unauthorized" error message', () => {
90
+ const raw = new Error('Unauthorized access to agent card');
91
+ const result = classifyAgentError('agent-b', 'https://example.com/card', raw);
92
+ expect(result).toBeInstanceOf(AgentCardAuthError);
93
+ });
94
+ it('should classify a 403 error message', () => {
95
+ const raw = new Error('HTTP 403 Forbidden');
96
+ const result = classifyAgentError('agent-c', 'https://example.com/card', raw);
97
+ expect(result).toBeInstanceOf(AgentCardAuthError);
98
+ expect(result.statusCode).toBe(403);
99
+ });
100
+ it('should fall back to AgentConnectionError for unknown errors', () => {
101
+ const raw = new Error('Something completely unexpected');
102
+ const result = classifyAgentError('agent-d', 'https://example.com/card', raw);
103
+ expect(result).toBeInstanceOf(AgentConnectionError);
104
+ });
105
+ it('should classify ECONNREFUSED as AgentConnectionError', () => {
106
+ const raw = new Error('ECONNREFUSED 127.0.0.1:8080');
107
+ const result = classifyAgentError('agent-d', 'https://example.com/card', raw);
108
+ expect(result).toBeInstanceOf(AgentConnectionError);
109
+ });
110
+ it('should handle non-Error values', () => {
111
+ const result = classifyAgentError('agent-e', 'https://example.com/card', 'some string error');
112
+ expect(result).toBeInstanceOf(AgentConnectionError);
113
+ });
114
+ describe('cause chain inspection', () => {
115
+ it('should detect 404 in a nested cause', () => {
116
+ const inner = new Error('HTTP 404 Not Found');
117
+ const outer = new Error('fetch failed', { cause: inner });
118
+ const result = classifyAgentError('agent-nested', 'https://example.com/card', outer);
119
+ expect(result).toBeInstanceOf(AgentCardNotFoundError);
120
+ });
121
+ it('should detect 401 in a deeply nested cause', () => {
122
+ const innermost = new Error('Server returned 401');
123
+ const middle = new Error('Request error', { cause: innermost });
124
+ const outer = new Error('fetch failed', { cause: middle });
125
+ const result = classifyAgentError('agent-deep', 'https://example.com/card', outer);
126
+ expect(result).toBeInstanceOf(AgentCardAuthError);
127
+ expect(result.statusCode).toBe(401);
128
+ });
129
+ it('should detect ECONNREFUSED error code in cause chain', () => {
130
+ const inner = Object.assign(new Error('connect failed'), {
131
+ code: 'ECONNREFUSED',
132
+ });
133
+ const outer = new Error('fetch failed', { cause: inner });
134
+ const result = classifyAgentError('agent-conn', 'https://example.com/card', outer);
135
+ expect(result).toBeInstanceOf(AgentConnectionError);
136
+ });
137
+ it('should detect status property on error objects in cause chain', () => {
138
+ const inner = Object.assign(new Error('Bad response'), {
139
+ status: 403,
140
+ });
141
+ const outer = new Error('agent card resolution failed', {
142
+ cause: inner,
143
+ });
144
+ const result = classifyAgentError('agent-status', 'https://example.com/card', outer);
145
+ expect(result).toBeInstanceOf(AgentCardAuthError);
146
+ expect(result.statusCode).toBe(403);
147
+ });
148
+ it('should detect status on a plain-object cause (non-Error)', () => {
149
+ const outer = new Error('fetch failed');
150
+ // Some HTTP libs set cause to a plain object, not an Error instance
151
+ outer.cause = {
152
+ message: 'Unauthorized',
153
+ status: 401,
154
+ };
155
+ const result = classifyAgentError('agent-plain-cause', 'https://example.com/card', outer);
156
+ expect(result).toBeInstanceOf(AgentCardAuthError);
157
+ expect(result.statusCode).toBe(401);
158
+ });
159
+ it('should detect statusCode on a plain-object cause (non-Error)', () => {
160
+ const outer = new Error('fetch failed');
161
+ outer.cause = {
162
+ message: 'Forbidden',
163
+ statusCode: 403,
164
+ };
165
+ const result = classifyAgentError('agent-plain-cause-403', 'https://example.com/card', outer);
166
+ expect(result).toBeInstanceOf(AgentCardAuthError);
167
+ expect(result.statusCode).toBe(403);
168
+ });
169
+ it('should classify ENOTFOUND as AgentConnectionError, not 404', () => {
170
+ // ENOTFOUND (DNS resolution failure) should NOT be misclassified
171
+ // as a 404 despite containing "NOTFOUND" in the error code.
172
+ const inner = Object.assign(new Error('getaddrinfo ENOTFOUND example.invalid'), {
173
+ code: 'ENOTFOUND',
174
+ });
175
+ const outer = new Error('fetch failed', { cause: inner });
176
+ const result = classifyAgentError('agent-dns', 'https://example.invalid/card', outer);
177
+ expect(result).toBeInstanceOf(AgentConnectionError);
178
+ expect(result).not.toBeInstanceOf(AgentCardNotFoundError);
179
+ });
180
+ });
181
+ });
182
+ });
183
+ //# sourceMappingURL=a2a-errors.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-errors.test.js","sourceRoot":"","sources":["../../../src/agents/a2a-errors.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,kBAAkB,EAClB,2BAA2B,EAC3B,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;YACxE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,KAAK,GAAG,IAAI,sBAAsB,CACtC,UAAU,EACV,0BAA0B,CAC3B,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAClC,cAAc,EACd,0BAA0B,EAC1B,GAAG,CACJ,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAClC,cAAc,EACd,0BAA0B,EAC1B,GAAG,CACJ,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,KAAK,GAAG,IAAI,2BAA2B,CAC3C,WAAW,EACX,+CAA+C,EAC/C;gBACE,+CAA+C;gBAC/C,iDAAiD;aAClD,CACF,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,IAAI,oBAAoB,CACpC,UAAU,EACV,0BAA0B,EAC1B,KAAK,CACN,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,KAAK,GAAG,IAAI,oBAAoB,CACpC,UAAU,EACV,0BAA0B,EAC1B,kBAAkB,CACnB,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAC7C,MAAM,MAAM,GAAG,kBAAkB,CAC/B,SAAS,EACT,0BAA0B,EAC1B,GAAG,CACJ,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,kBAAkB,CAC/B,SAAS,EACT,0BAA0B,EAC1B,GAAG,CACJ,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,kBAAkB,CAC/B,SAAS,EACT,0BAA0B,EAC1B,GAAG,CACJ,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;YAClD,MAAM,CAAE,MAA6B,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,kBAAkB,CAC/B,SAAS,EACT,0BAA0B,EAC1B,GAAG,CACJ,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,kBAAkB,CAC/B,SAAS,EACT,0BAA0B,EAC1B,GAAG,CACJ,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;YAClD,MAAM,CAAE,MAA6B,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;YACrE,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,kBAAkB,CAC/B,SAAS,EACT,0BAA0B,EAC1B,GAAG,CACJ,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,kBAAkB,CAC/B,SAAS,EACT,0BAA0B,EAC1B,GAAG,CACJ,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,MAAM,GAAG,kBAAkB,CAC/B,SAAS,EACT,0BAA0B,EAC1B,mBAAmB,CACpB,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;YACtC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;gBAC7C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBAC9C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1D,MAAM,MAAM,GAAG,kBAAkB,CAC/B,cAAc,EACd,0BAA0B,EAC1B,KAAK,CACN,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;gBACpD,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;gBACnD,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBAChE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3D,MAAM,MAAM,GAAG,kBAAkB,CAC/B,YAAY,EACZ,0BAA0B,EAC1B,KAAK,CACN,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;gBAClD,MAAM,CAAE,MAA6B,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;gBAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,EAAE;oBACvD,IAAI,EAAE,cAAc;iBACrB,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1D,MAAM,MAAM,GAAG,kBAAkB,CAC/B,YAAY,EACZ,0BAA0B,EAC1B,KAAK,CACN,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;gBACvE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE;oBACrD,MAAM,EAAE,GAAG;iBACZ,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,8BAA8B,EAAE;oBACtD,KAAK,EAAE,KAAK;iBACb,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,kBAAkB,CAC/B,cAAc,EACd,0BAA0B,EAC1B,KAAK,CACN,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;gBAClD,MAAM,CAAE,MAA6B,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;gBAClE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;gBACxC,oEAAoE;gBACnE,KAAuC,CAAC,KAAK,GAAG;oBAC/C,OAAO,EAAE,cAAc;oBACvB,MAAM,EAAE,GAAG;iBACZ,CAAC;gBACF,MAAM,MAAM,GAAG,kBAAkB,CAC/B,mBAAmB,EACnB,0BAA0B,EAC1B,KAAK,CACN,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;gBAClD,MAAM,CAAE,MAA6B,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;gBACtE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;gBACvC,KAAuC,CAAC,KAAK,GAAG;oBAC/C,OAAO,EAAE,WAAW;oBACpB,UAAU,EAAE,GAAG;iBAChB,CAAC;gBACF,MAAM,MAAM,GAAG,kBAAkB,CAC/B,uBAAuB,EACvB,0BAA0B,EAC1B,KAAK,CACN,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;gBAClD,MAAM,CAAE,MAA6B,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;gBACpE,iEAAiE;gBACjE,4DAA4D;gBAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CACzB,IAAI,KAAK,CAAC,uCAAuC,CAAC,EAClD;oBACE,IAAI,EAAE,WAAW;iBAClB,CACF,CAAC;gBACF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC1D,MAAM,MAAM,GAAG,kBAAkB,CAC/B,WAAW,EACX,8BAA8B,EAC9B,KAAK,CACN,CAAC;gBACF,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC;gBACpD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { HttpHeaders } from '@a2a-js/sdk/client';
7
+ import { BaseA2AAuthProvider } from './base-provider.js';
8
+ import type { ApiKeyAuthConfig } from './types.js';
9
+ /**
10
+ * Authentication provider for API Key authentication.
11
+ * Sends the API key as an HTTP header.
12
+ *
13
+ * The API key value can be:
14
+ * - A literal string
15
+ * - An environment variable reference ($ENV_VAR)
16
+ * - A shell command (!command)
17
+ */
18
+ export declare class ApiKeyAuthProvider extends BaseA2AAuthProvider {
19
+ private readonly config;
20
+ readonly type: "apiKey";
21
+ private resolvedKey;
22
+ private readonly headerName;
23
+ constructor(config: ApiKeyAuthConfig);
24
+ initialize(): Promise<void>;
25
+ headers(): Promise<HttpHeaders>;
26
+ /**
27
+ * Re-resolve command-based API keys on auth failure.
28
+ */
29
+ shouldRetryWithHeaders(_req: RequestInit, res: Response): Promise<HttpHeaders | undefined>;
30
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { BaseA2AAuthProvider } from './base-provider.js';
7
+ import { resolveAuthValue, needsResolution } from './value-resolver.js';
8
+ import { debugLogger } from '../../utils/debugLogger.js';
9
+ const DEFAULT_HEADER_NAME = 'X-API-Key';
10
+ /**
11
+ * Authentication provider for API Key authentication.
12
+ * Sends the API key as an HTTP header.
13
+ *
14
+ * The API key value can be:
15
+ * - A literal string
16
+ * - An environment variable reference ($ENV_VAR)
17
+ * - A shell command (!command)
18
+ */
19
+ export class ApiKeyAuthProvider extends BaseA2AAuthProvider {
20
+ config;
21
+ type = 'apiKey';
22
+ resolvedKey;
23
+ headerName;
24
+ constructor(config) {
25
+ super();
26
+ this.config = config;
27
+ this.headerName = config.name ?? DEFAULT_HEADER_NAME;
28
+ }
29
+ async initialize() {
30
+ if (needsResolution(this.config.key)) {
31
+ this.resolvedKey = await resolveAuthValue(this.config.key);
32
+ debugLogger.debug(`[ApiKeyAuthProvider] Resolved API key from: ${this.config.key.startsWith('$') ? 'env var' : 'command'}`);
33
+ }
34
+ else {
35
+ this.resolvedKey = this.config.key;
36
+ }
37
+ }
38
+ async headers() {
39
+ if (!this.resolvedKey) {
40
+ throw new Error('ApiKeyAuthProvider not initialized. Call initialize() first.');
41
+ }
42
+ return { [this.headerName]: this.resolvedKey };
43
+ }
44
+ /**
45
+ * Re-resolve command-based API keys on auth failure.
46
+ */
47
+ async shouldRetryWithHeaders(_req, res) {
48
+ if (res.status !== 401 && res.status !== 403) {
49
+ this.authRetryCount = 0;
50
+ return undefined;
51
+ }
52
+ // Only retry for command-based keys that may resolve to a new value.
53
+ // Literal and env-var keys would just resend the same failing headers.
54
+ if (!this.config.key.startsWith('!') || this.config.key.startsWith('!!')) {
55
+ return undefined;
56
+ }
57
+ if (this.authRetryCount >= BaseA2AAuthProvider.MAX_AUTH_RETRIES) {
58
+ return undefined;
59
+ }
60
+ this.authRetryCount++;
61
+ debugLogger.debug('[ApiKeyAuthProvider] Re-resolving API key after auth failure');
62
+ this.resolvedKey = await resolveAuthValue(this.config.key);
63
+ return this.headers();
64
+ }
65
+ }
66
+ //# sourceMappingURL=api-key-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key-provider.js","sourceRoot":"","sources":["../../../../src/agents/auth-provider/api-key-provider.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAExC;;;;;;;;GAQG;AACH,MAAM,OAAO,kBAAmB,SAAQ,mBAAmB;IAM5B;IALpB,IAAI,GAAG,QAAiB,CAAC;IAE1B,WAAW,CAAqB;IACvB,UAAU,CAAS;IAEpC,YAA6B,MAAwB;QACnD,KAAK,EAAE,CAAC;QADmB,WAAM,GAAN,MAAM,CAAkB;QAEnD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,IAAI,mBAAmB,CAAC;IACvD,CAAC;IAEQ,KAAK,CAAC,UAAU;QACvB,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3D,WAAW,CAAC,KAAK,CACf,+CAA+C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CACzG,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QACrC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IACjD,CAAC;IAED;;OAEG;IACM,KAAK,CAAC,sBAAsB,CACnC,IAAiB,EACjB,GAAa;QAEb,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7C,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;YACxB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,qEAAqE;QACrE,uEAAuE;QACvE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,IAAI,mBAAmB,CAAC,gBAAgB,EAAE,CAAC;YAChE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,WAAW,CAAC,KAAK,CACf,8DAA8D,CAC/D,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE3D,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -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,130 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, afterEach, vi } from 'vitest';
7
+ import { ApiKeyAuthProvider } from './api-key-provider.js';
8
+ describe('ApiKeyAuthProvider', () => {
9
+ afterEach(() => {
10
+ vi.unstubAllEnvs();
11
+ });
12
+ describe('initialization', () => {
13
+ it('should initialize with literal API key', async () => {
14
+ const provider = new ApiKeyAuthProvider({
15
+ type: 'apiKey',
16
+ key: 'my-api-key',
17
+ });
18
+ await provider.initialize();
19
+ const headers = await provider.headers();
20
+ expect(headers).toEqual({ 'X-API-Key': 'my-api-key' });
21
+ });
22
+ it('should resolve API key from environment variable', async () => {
23
+ vi.stubEnv('TEST_API_KEY', 'env-api-key');
24
+ const provider = new ApiKeyAuthProvider({
25
+ type: 'apiKey',
26
+ key: '$TEST_API_KEY',
27
+ });
28
+ await provider.initialize();
29
+ const headers = await provider.headers();
30
+ expect(headers).toEqual({ 'X-API-Key': 'env-api-key' });
31
+ });
32
+ it('should throw if environment variable is not set', async () => {
33
+ const provider = new ApiKeyAuthProvider({
34
+ type: 'apiKey',
35
+ key: '$MISSING_KEY_12345',
36
+ });
37
+ await expect(provider.initialize()).rejects.toThrow("Environment variable 'MISSING_KEY_12345' is not set");
38
+ });
39
+ });
40
+ describe('headers', () => {
41
+ it('should throw if not initialized', async () => {
42
+ const provider = new ApiKeyAuthProvider({
43
+ type: 'apiKey',
44
+ key: 'test-key',
45
+ });
46
+ await expect(provider.headers()).rejects.toThrow('not initialized');
47
+ });
48
+ it('should use custom header name', async () => {
49
+ const provider = new ApiKeyAuthProvider({
50
+ type: 'apiKey',
51
+ key: 'my-key',
52
+ name: 'X-Custom-Auth',
53
+ });
54
+ await provider.initialize();
55
+ const headers = await provider.headers();
56
+ expect(headers).toEqual({ 'X-Custom-Auth': 'my-key' });
57
+ });
58
+ it('should use default header name X-API-Key', async () => {
59
+ const provider = new ApiKeyAuthProvider({
60
+ type: 'apiKey',
61
+ key: 'my-key',
62
+ });
63
+ await provider.initialize();
64
+ const headers = await provider.headers();
65
+ expect(headers).toEqual({ 'X-API-Key': 'my-key' });
66
+ });
67
+ });
68
+ describe('shouldRetryWithHeaders', () => {
69
+ it('should return undefined for non-auth errors', async () => {
70
+ const provider = new ApiKeyAuthProvider({
71
+ type: 'apiKey',
72
+ key: 'test-key',
73
+ });
74
+ await provider.initialize();
75
+ const result = await provider.shouldRetryWithHeaders({}, new Response(null, { status: 500 }));
76
+ expect(result).toBeUndefined();
77
+ });
78
+ it('should return undefined for literal keys on 401 (same headers would fail again)', async () => {
79
+ const provider = new ApiKeyAuthProvider({
80
+ type: 'apiKey',
81
+ key: 'test-key',
82
+ });
83
+ await provider.initialize();
84
+ const result = await provider.shouldRetryWithHeaders({}, new Response(null, { status: 401 }));
85
+ expect(result).toBeUndefined();
86
+ });
87
+ it('should return undefined for env-var keys on 403', async () => {
88
+ vi.stubEnv('RETRY_TEST_KEY', 'some-key');
89
+ const provider = new ApiKeyAuthProvider({
90
+ type: 'apiKey',
91
+ key: '$RETRY_TEST_KEY',
92
+ });
93
+ await provider.initialize();
94
+ const result = await provider.shouldRetryWithHeaders({}, new Response(null, { status: 403 }));
95
+ expect(result).toBeUndefined();
96
+ });
97
+ it('should re-resolve and return headers for command keys on 401', async () => {
98
+ const provider = new ApiKeyAuthProvider({
99
+ type: 'apiKey',
100
+ key: '!echo refreshed-key',
101
+ });
102
+ await provider.initialize();
103
+ const result = await provider.shouldRetryWithHeaders({}, new Response(null, { status: 401 }));
104
+ expect(result).toEqual({ 'X-API-Key': 'refreshed-key' });
105
+ });
106
+ it('should stop retrying after MAX_AUTH_RETRIES', async () => {
107
+ const provider = new ApiKeyAuthProvider({
108
+ type: 'apiKey',
109
+ key: '!echo rotating-key',
110
+ });
111
+ await provider.initialize();
112
+ const r1 = await provider.shouldRetryWithHeaders({}, new Response(null, { status: 401 }));
113
+ expect(r1).toBeDefined();
114
+ const r2 = await provider.shouldRetryWithHeaders({}, new Response(null, { status: 401 }));
115
+ expect(r2).toBeDefined();
116
+ const r3 = await provider.shouldRetryWithHeaders({}, new Response(null, { status: 401 }));
117
+ expect(r3).toBeUndefined();
118
+ });
119
+ });
120
+ describe('type property', () => {
121
+ it('should have type apiKey', () => {
122
+ const provider = new ApiKeyAuthProvider({
123
+ type: 'apiKey',
124
+ key: 'test',
125
+ });
126
+ expect(provider.type).toBe('apiKey');
127
+ });
128
+ });
129
+ });
130
+ //# sourceMappingURL=api-key-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key-provider.test.js","sourceRoot":"","sources":["../../../../src/agents/auth-provider/api-key-provider.test.ts"],"names":[],"mappings":"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"}