@google/gemini-cli-core 0.23.0-preview.4 → 0.24.0-nightly.20251231.05049b5ab

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 (230) hide show
  1. package/dist/docs/cli/settings.md +7 -6
  2. package/dist/docs/get-started/configuration.md +79 -8
  3. package/dist/google-gemini-cli-core-0.24.0-nightly.20251227.37be16243.tgz +0 -0
  4. package/dist/src/agents/a2a-client-manager.d.ts +73 -0
  5. package/dist/src/agents/a2a-client-manager.js +165 -0
  6. package/dist/src/agents/a2a-client-manager.js.map +1 -0
  7. package/dist/src/agents/a2a-client-manager.test.d.ts +6 -0
  8. package/dist/src/agents/a2a-client-manager.test.js +211 -0
  9. package/dist/src/agents/a2a-client-manager.test.js.map +1 -0
  10. package/dist/src/agents/local-executor.js +1 -0
  11. package/dist/src/agents/local-executor.js.map +1 -1
  12. package/dist/src/agents/registry.d.ts +9 -1
  13. package/dist/src/agents/registry.js +74 -34
  14. package/dist/src/agents/registry.js.map +1 -1
  15. package/dist/src/agents/registry.test.js +79 -30
  16. package/dist/src/agents/registry.test.js.map +1 -1
  17. package/dist/src/agents/toml-loader.d.ts +14 -5
  18. package/dist/src/agents/toml-loader.js +98 -26
  19. package/dist/src/agents/toml-loader.js.map +1 -1
  20. package/dist/src/agents/toml-loader.test.js +121 -2
  21. package/dist/src/agents/toml-loader.test.js.map +1 -1
  22. package/dist/src/availability/policyHelpers.js +0 -2
  23. package/dist/src/availability/policyHelpers.js.map +1 -1
  24. package/dist/src/code_assist/server.js +7 -2
  25. package/dist/src/code_assist/server.js.map +1 -1
  26. package/dist/src/code_assist/server.test.js +3 -0
  27. package/dist/src/code_assist/server.test.js.map +1 -1
  28. package/dist/src/config/config.d.ts +47 -7
  29. package/dist/src/config/config.js +59 -28
  30. package/dist/src/config/config.js.map +1 -1
  31. package/dist/src/config/config.test.js +20 -1
  32. package/dist/src/config/config.test.js.map +1 -1
  33. package/dist/src/config/models.d.ts +1 -9
  34. package/dist/src/config/models.js +1 -11
  35. package/dist/src/config/models.js.map +1 -1
  36. package/dist/src/config/models.test.js +16 -16
  37. package/dist/src/config/models.test.js.map +1 -1
  38. package/dist/src/config/storage.d.ts +2 -0
  39. package/dist/src/config/storage.js +6 -0
  40. package/dist/src/config/storage.js.map +1 -1
  41. package/dist/src/config/storage.test.js +8 -0
  42. package/dist/src/config/storage.test.js.map +1 -1
  43. package/dist/src/confirmation-bus/message-bus.js +2 -1
  44. package/dist/src/confirmation-bus/message-bus.js.map +1 -1
  45. package/dist/src/core/client.d.ts +5 -1
  46. package/dist/src/core/client.js +159 -73
  47. package/dist/src/core/client.js.map +1 -1
  48. package/dist/src/core/client.test.js +110 -5
  49. package/dist/src/core/client.test.js.map +1 -1
  50. package/dist/src/core/contentGenerator.js +2 -2
  51. package/dist/src/core/contentGenerator.js.map +1 -1
  52. package/dist/src/core/coreToolHookTriggers.d.ts +2 -2
  53. package/dist/src/core/coreToolHookTriggers.js +74 -14
  54. package/dist/src/core/coreToolHookTriggers.js.map +1 -1
  55. package/dist/src/core/coreToolHookTriggers.test.d.ts +6 -0
  56. package/dist/src/core/coreToolHookTriggers.test.js +189 -0
  57. package/dist/src/core/coreToolHookTriggers.test.js.map +1 -0
  58. package/dist/src/core/coreToolScheduler.d.ts +5 -85
  59. package/dist/src/core/coreToolScheduler.js +33 -206
  60. package/dist/src/core/coreToolScheduler.js.map +1 -1
  61. package/dist/src/core/coreToolScheduler.test.js +19 -367
  62. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  63. package/dist/src/core/nonInteractiveToolExecutor.test.js +0 -1
  64. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  65. package/dist/src/core/turn.d.ts +3 -21
  66. package/dist/src/core/turn.js +1 -0
  67. package/dist/src/core/turn.js.map +1 -1
  68. package/dist/src/fallback/handler.js +0 -6
  69. package/dist/src/fallback/handler.js.map +1 -1
  70. package/dist/src/generated/git-commit.d.ts +2 -2
  71. package/dist/src/generated/git-commit.js +2 -2
  72. package/dist/src/generated/git-commit.js.map +1 -1
  73. package/dist/src/hooks/hookAggregator.js +7 -0
  74. package/dist/src/hooks/hookAggregator.js.map +1 -1
  75. package/dist/src/hooks/hookPlanner.d.ts +1 -5
  76. package/dist/src/hooks/hookPlanner.js +2 -9
  77. package/dist/src/hooks/hookPlanner.js.map +1 -1
  78. package/dist/src/hooks/hookPlanner.test.js +1 -2
  79. package/dist/src/hooks/hookPlanner.test.js.map +1 -1
  80. package/dist/src/hooks/hookRegistry.d.ts +5 -10
  81. package/dist/src/hooks/hookRegistry.js +39 -12
  82. package/dist/src/hooks/hookRegistry.js.map +1 -1
  83. package/dist/src/hooks/hookRegistry.test.js +93 -2
  84. package/dist/src/hooks/hookRegistry.test.js.map +1 -1
  85. package/dist/src/hooks/hookRunner.d.ts +3 -1
  86. package/dist/src/hooks/hookRunner.js +31 -3
  87. package/dist/src/hooks/hookRunner.js.map +1 -1
  88. package/dist/src/hooks/hookRunner.test.js +58 -2
  89. package/dist/src/hooks/hookRunner.test.js.map +1 -1
  90. package/dist/src/hooks/hookSystem.js +1 -1
  91. package/dist/src/hooks/hookSystem.js.map +1 -1
  92. package/dist/src/hooks/index.d.ts +1 -1
  93. package/dist/src/hooks/index.js +1 -1
  94. package/dist/src/hooks/index.js.map +1 -1
  95. package/dist/src/hooks/trustedHooks.d.ts +28 -0
  96. package/dist/src/hooks/trustedHooks.js +90 -0
  97. package/dist/src/hooks/trustedHooks.js.map +1 -0
  98. package/dist/src/hooks/trustedHooks.test.d.ts +6 -0
  99. package/dist/src/hooks/trustedHooks.test.js +154 -0
  100. package/dist/src/hooks/trustedHooks.test.js.map +1 -0
  101. package/dist/src/hooks/types.d.ts +18 -9
  102. package/dist/src/hooks/types.js +31 -26
  103. package/dist/src/hooks/types.js.map +1 -1
  104. package/dist/src/hooks/types.test.js +5 -24
  105. package/dist/src/hooks/types.test.js.map +1 -1
  106. package/dist/src/ide/ide-client.js +4 -1
  107. package/dist/src/ide/ide-client.js.map +1 -1
  108. package/dist/src/index.d.ts +1 -0
  109. package/dist/src/index.js +1 -0
  110. package/dist/src/index.js.map +1 -1
  111. package/dist/src/mcp/oauth-utils.js +1 -1
  112. package/dist/src/mcp/oauth-utils.js.map +1 -1
  113. package/dist/src/mcp/token-storage/keychain-token-storage.js +1 -1
  114. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  115. package/dist/src/policy/config.js +4 -2
  116. package/dist/src/policy/config.js.map +1 -1
  117. package/dist/src/policy/persistence.test.js +6 -1
  118. package/dist/src/policy/persistence.test.js.map +1 -1
  119. package/dist/src/policy/policy-engine.d.ts +10 -1
  120. package/dist/src/policy/policy-engine.js +24 -4
  121. package/dist/src/policy/policy-engine.js.map +1 -1
  122. package/dist/src/policy/policy-engine.test.js +26 -2
  123. package/dist/src/policy/policy-engine.test.js.map +1 -1
  124. package/dist/src/policy/shell-safety.test.js +2 -1
  125. package/dist/src/policy/shell-safety.test.js.map +1 -1
  126. package/dist/src/policy/toml-loader.d.ts +3 -5
  127. package/dist/src/policy/toml-loader.js +35 -20
  128. package/dist/src/policy/toml-loader.js.map +1 -1
  129. package/dist/src/policy/toml-loader.test.js +28 -7
  130. package/dist/src/policy/toml-loader.test.js.map +1 -1
  131. package/dist/src/policy/types.d.ts +15 -0
  132. package/dist/src/routing/strategies/compositeStrategy.js +4 -2
  133. package/dist/src/routing/strategies/compositeStrategy.js.map +1 -1
  134. package/dist/src/routing/strategies/compositeStrategy.test.js +11 -10
  135. package/dist/src/routing/strategies/compositeStrategy.test.js.map +1 -1
  136. package/dist/src/routing/strategies/overrideStrategy.js +2 -2
  137. package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
  138. package/dist/src/scheduler/types.d.ts +95 -0
  139. package/dist/src/scheduler/types.js +7 -0
  140. package/dist/src/scheduler/types.js.map +1 -0
  141. package/dist/src/services/environmentSanitization.d.ts +15 -0
  142. package/dist/src/services/environmentSanitization.js +141 -0
  143. package/dist/src/services/environmentSanitization.js.map +1 -0
  144. package/dist/src/services/environmentSanitization.test.d.ts +6 -0
  145. package/dist/src/services/environmentSanitization.test.js +284 -0
  146. package/dist/src/services/environmentSanitization.test.js.map +1 -0
  147. package/dist/src/services/gitService.js +10 -1
  148. package/dist/src/services/gitService.js.map +1 -1
  149. package/dist/src/services/gitService.test.js +18 -0
  150. package/dist/src/services/gitService.test.js.map +1 -1
  151. package/dist/src/services/shellExecutionService.d.ts +2 -0
  152. package/dist/src/services/shellExecutionService.js +5 -65
  153. package/dist/src/services/shellExecutionService.js.map +1 -1
  154. package/dist/src/services/shellExecutionService.test.js +26 -3
  155. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  156. package/dist/src/services/skillManager.d.ts +61 -0
  157. package/dist/src/services/skillManager.js +157 -0
  158. package/dist/src/services/skillManager.js.map +1 -0
  159. package/dist/src/services/skillManager.test.d.ts +6 -0
  160. package/dist/src/services/skillManager.test.js +169 -0
  161. package/dist/src/services/skillManager.test.js.map +1 -0
  162. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +4 -6
  163. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  164. package/dist/src/telemetry/loggers.test.circular.js +1 -0
  165. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  166. package/dist/src/telemetry/sdk.js +3 -4
  167. package/dist/src/telemetry/sdk.js.map +1 -1
  168. package/dist/src/tools/edit.test.js +1 -1
  169. package/dist/src/tools/edit.test.js.map +1 -1
  170. package/dist/src/tools/mcp-client.d.ts +3 -2
  171. package/dist/src/tools/mcp-client.js +7 -6
  172. package/dist/src/tools/mcp-client.js.map +1 -1
  173. package/dist/src/tools/mcp-client.test.js +47 -42
  174. package/dist/src/tools/mcp-client.test.js.map +1 -1
  175. package/dist/src/tools/memoryTool.js +0 -2
  176. package/dist/src/tools/memoryTool.js.map +1 -1
  177. package/dist/src/tools/shell.js +6 -1
  178. package/dist/src/tools/shell.js.map +1 -1
  179. package/dist/src/tools/smart-edit.test.js +1 -1
  180. package/dist/src/tools/smart-edit.test.js.map +1 -1
  181. package/dist/src/tools/tool-error.d.ts +2 -1
  182. package/dist/src/tools/tool-error.js +2 -0
  183. package/dist/src/tools/tool-error.js.map +1 -1
  184. package/dist/src/tools/tool-registry.js +1 -1
  185. package/dist/src/tools/tool-registry.js.map +1 -1
  186. package/dist/src/tools/tools.d.ts +1 -1
  187. package/dist/src/tools/tools.js +1 -1
  188. package/dist/src/tools/web-search.js +2 -1
  189. package/dist/src/tools/web-search.js.map +1 -1
  190. package/dist/src/tools/write-file.js +2 -1
  191. package/dist/src/tools/write-file.js.map +1 -1
  192. package/dist/src/utils/checkpointUtils.d.ts +1 -1
  193. package/dist/src/utils/debugLogger.js +1 -0
  194. package/dist/src/utils/debugLogger.js.map +1 -1
  195. package/dist/src/utils/editCorrector.js +5 -4
  196. package/dist/src/utils/editCorrector.js.map +1 -1
  197. package/dist/src/utils/errorReporting.d.ts +1 -1
  198. package/dist/src/utils/errorReporting.js +13 -12
  199. package/dist/src/utils/errorReporting.js.map +1 -1
  200. package/dist/src/utils/errorReporting.test.js +17 -14
  201. package/dist/src/utils/errorReporting.test.js.map +1 -1
  202. package/dist/src/utils/fileUtils.d.ts +4 -0
  203. package/dist/src/utils/fileUtils.js +53 -0
  204. package/dist/src/utils/fileUtils.js.map +1 -1
  205. package/dist/src/utils/fileUtils.test.js +112 -1
  206. package/dist/src/utils/fileUtils.test.js.map +1 -1
  207. package/dist/src/utils/generateContentResponseUtilities.d.ts +2 -1
  208. package/dist/src/utils/generateContentResponseUtilities.js +96 -0
  209. package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
  210. package/dist/src/utils/generateContentResponseUtilities.test.js +221 -1
  211. package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
  212. package/dist/src/utils/getFolderStructure.js +1 -1
  213. package/dist/src/utils/getFolderStructure.js.map +1 -1
  214. package/dist/src/utils/memoryDiscovery.js +1 -1
  215. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  216. package/dist/src/utils/retry.js +3 -3
  217. package/dist/src/utils/retry.js.map +1 -1
  218. package/dist/src/utils/summarizer.test.js +3 -2
  219. package/dist/src/utils/summarizer.test.js.map +1 -1
  220. package/dist/src/utils/terminal.d.ts +2 -0
  221. package/dist/src/utils/terminal.js +6 -0
  222. package/dist/src/utils/terminal.js.map +1 -1
  223. package/dist/src/utils/tool-utils.d.ts +9 -0
  224. package/dist/src/utils/tool-utils.js +29 -0
  225. package/dist/src/utils/tool-utils.js.map +1 -1
  226. package/dist/src/utils/tool-utils.test.js +15 -1
  227. package/dist/src/utils/tool-utils.test.js.map +1 -1
  228. package/dist/tsconfig.tsbuildinfo +1 -1
  229. package/package.json +5 -1
  230. package/dist/google-gemini-cli-core-0.23.0-preview.3.tgz +0 -0
@@ -94,15 +94,16 @@ they appear in the UI.
94
94
  | Enable Tool Output Truncation | `tools.enableToolOutputTruncation` | Enable truncation of large tool outputs. | `true` |
95
95
  | Tool Output Truncation Threshold | `tools.truncateToolOutputThreshold` | Truncate tool output if it is larger than this many characters. Set to -1 to disable. | `10000` |
96
96
  | Tool Output Truncation Lines | `tools.truncateToolOutputLines` | The number of lines to keep when truncating tool output. | `100` |
97
- | Enable Message Bus Integration | `tools.enableMessageBusIntegration` | Enable policy-based tool confirmation via message bus integration. | `true` |
98
97
 
99
98
  ### Security
100
99
 
101
- | UI Label | Setting | Description | Default |
102
- | -------------------------- | ------------------------------ | -------------------------------------------------- | ------- |
103
- | Disable YOLO Mode | `security.disableYoloMode` | Disable YOLO mode, even if enabled by a flag. | `false` |
104
- | Blocks extensions from Git | `security.blockGitExtensions` | Blocks installing and loading extensions from Git. | `false` |
105
- | Folder Trust | `security.folderTrust.enabled` | Setting to track whether Folder trust is enabled. | `false` |
100
+ | UI Label | Setting | Description | Default |
101
+ | ----------------------------- | ----------------------------------------------- | --------------------------------------------------------- | ------- |
102
+ | Disable YOLO Mode | `security.disableYoloMode` | Disable YOLO mode, even if enabled by a flag. | `false` |
103
+ | Blocks extensions from Git | `security.blockGitExtensions` | Blocks installing and loading extensions from Git. | `false` |
104
+ | Folder Trust | `security.folderTrust.enabled` | Setting to track whether Folder trust is enabled. | `false` |
105
+ | Allowed Environment Variables | `security.environmentVariableRedaction.allowed` | Environment variables to always allow (bypass redaction). | `[]` |
106
+ | Blocked Environment Variables | `security.environmentVariableRedaction.blocked` | Environment variables to always redact. | `[]` |
106
107
 
107
108
  ### Experimental
108
109
 
@@ -621,6 +621,11 @@ their corresponding top-level category object in your `settings.json` file.
621
621
  shell command. Defaults to 5 minutes.
622
622
  - **Default:** `300`
623
623
 
624
+ - **`tools.shell.enableShellOutputEfficiency`** (boolean):
625
+ - **Description:** Enable shell output efficiency optimizations for better
626
+ performance.
627
+ - **Default:** `true`
628
+
624
629
  - **`tools.autoAccept`** (boolean):
625
630
  - **Description:** Automatically accept and execute tool calls that are
626
631
  considered safe (e.g., read-only operations).
@@ -679,14 +684,6 @@ their corresponding top-level category object in your `settings.json` file.
679
684
  - **Default:** `1000`
680
685
  - **Requires restart:** Yes
681
686
 
682
- - **`tools.enableMessageBusIntegration`** (boolean):
683
- - **Description:** Enable policy-based tool confirmation via message bus
684
- integration. When enabled, tools automatically respect policy engine
685
- decisions (ALLOW/DENY/ASK_USER) without requiring individual tool
686
- implementations.
687
- - **Default:** `true`
688
- - **Requires restart:** Yes
689
-
690
687
  - **`tools.enableHooks`** (boolean):
691
688
  - **Description:** Enable the hooks system for intercepting and customizing
692
689
  Gemini CLI behavior. When enabled, hooks configured in settings will execute
@@ -746,6 +743,22 @@ their corresponding top-level category object in your `settings.json` file.
746
743
  - **Default:** `false`
747
744
  - **Requires restart:** Yes
748
745
 
746
+ - **`security.environmentVariableRedaction.allowed`** (array):
747
+ - **Description:** Environment variables to always allow (bypass redaction).
748
+ - **Default:** `[]`
749
+ - **Requires restart:** Yes
750
+
751
+ - **`security.environmentVariableRedaction.blocked`** (array):
752
+ - **Description:** Environment variables to always redact.
753
+ - **Default:** `[]`
754
+ - **Requires restart:** Yes
755
+
756
+ - **`security.environmentVariableRedaction.enabled`** (boolean):
757
+ - **Description:** Enable redaction of environment variables that may contain
758
+ secrets.
759
+ - **Default:** `false`
760
+ - **Requires restart:** Yes
761
+
749
762
  - **`security.auth.selectedType`** (string):
750
763
  - **Description:** The currently selected authentication type.
751
764
  - **Default:** `undefined`
@@ -809,6 +822,11 @@ their corresponding top-level category object in your `settings.json` file.
809
822
  - **Default:** `false`
810
823
  - **Requires restart:** Yes
811
824
 
825
+ - **`experimental.skills`** (boolean):
826
+ - **Description:** Enable Agent Skills (experimental).
827
+ - **Default:** `false`
828
+ - **Requires restart:** Yes
829
+
812
830
  - **`experimental.codebaseInvestigatorSettings.enabled`** (boolean):
813
831
  - **Description:** Enable the Codebase Investigator agent.
814
832
  - **Default:** `true`
@@ -841,6 +859,13 @@ their corresponding top-level category object in your `settings.json` file.
841
859
  - **Default:** `false`
842
860
  - **Requires restart:** Yes
843
861
 
862
+ #### `skills`
863
+
864
+ - **`skills.disabled`** (array):
865
+ - **Description:** List of disabled skills.
866
+ - **Default:** `[]`
867
+ - **Requires restart:** Yes
868
+
844
869
  #### `hooks`
845
870
 
846
871
  - **`hooks.disabled`** (array):
@@ -1171,6 +1196,52 @@ the `advanced.excludedEnvVars` setting in your `settings.json` file.
1171
1196
  - Specifies the endpoint for the code assist server.
1172
1197
  - This is useful for development and testing.
1173
1198
 
1199
+ ### Environment variable redaction
1200
+
1201
+ To prevent accidental leakage of sensitive information, Gemini CLI automatically
1202
+ redacts potential secrets from environment variables when executing tools (such
1203
+ as shell commands). This "best effort" redaction applies to variables inherited
1204
+ from the system or loaded from `.env` files.
1205
+
1206
+ **Default Redaction Rules:**
1207
+
1208
+ - **By Name:** Variables are redacted if their names contain sensitive terms
1209
+ like `TOKEN`, `SECRET`, `PASSWORD`, `KEY`, `AUTH`, `CREDENTIAL`, `PRIVATE`, or
1210
+ `CERT`.
1211
+ - **By Value:** Variables are redacted if their values match known secret
1212
+ patterns, such as:
1213
+ - Private keys (RSA, OpenSSH, PGP, etc.)
1214
+ - Certificates
1215
+ - URLs containing credentials
1216
+ - API keys and tokens (GitHub, Google, AWS, Stripe, Slack, etc.)
1217
+ - **Specific Blocklist:** Certain variables like `CLIENT_ID`, `DB_URI`,
1218
+ `DATABASE_URL`, and `CONNECTION_STRING` are always redacted by default.
1219
+
1220
+ **Allowlist (Never Redacted):**
1221
+
1222
+ - Common system variables (e.g., `PATH`, `HOME`, `USER`, `SHELL`, `TERM`,
1223
+ `LANG`).
1224
+ - Variables starting with `GEMINI_CLI_`.
1225
+ - GitHub Action specific variables.
1226
+
1227
+ **Configuration:**
1228
+
1229
+ You can customize this behavior in your `settings.json` file:
1230
+
1231
+ - **`security.allowedEnvironmentVariables`**: A list of variable names to
1232
+ _never_ redact, even if they match sensitive patterns.
1233
+ - **`security.blockedEnvironmentVariables`**: A list of variable names to
1234
+ _always_ redact, even if they don't match sensitive patterns.
1235
+
1236
+ ```json
1237
+ {
1238
+ "security": {
1239
+ "allowedEnvironmentVariables": ["MY_PUBLIC_KEY", "NOT_A_SECRET_TOKEN"],
1240
+ "blockedEnvironmentVariables": ["INTERNAL_IP_ADDRESS"]
1241
+ }
1242
+ }
1243
+ ```
1244
+
1174
1245
  ## Command-line arguments
1175
1246
 
1176
1247
  Arguments passed directly when running the CLI can override other configurations
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { AgentCard, Message, Task } from '@a2a-js/sdk';
7
+ import { type Client, type AuthenticationHandler } from '@a2a-js/sdk/client';
8
+ export type SendMessageResult = Message | Task;
9
+ /**
10
+ * Manages A2A clients and caches loaded agent information.
11
+ * Follows a singleton pattern to ensure a single client instance.
12
+ */
13
+ export declare class A2AClientManager {
14
+ private static instance;
15
+ private clients;
16
+ private agentCards;
17
+ private constructor();
18
+ /**
19
+ * Gets the singleton instance of the A2AClientManager.
20
+ */
21
+ static getInstance(): A2AClientManager;
22
+ /**
23
+ * Resets the singleton instance. Only for testing purposes.
24
+ * @internal
25
+ */
26
+ static resetInstanceForTesting(): void;
27
+ /**
28
+ * Loads an agent by fetching its AgentCard and caches the client.
29
+ * @param name The name to assign to the agent.
30
+ * @param agentCardUrl The full URL to the agent's card.
31
+ * @param authHandler Optional authentication handler to use for this agent.
32
+ * @returns The loaded AgentCard.
33
+ */
34
+ loadAgent(name: string, agentCardUrl: string, authHandler?: AuthenticationHandler): Promise<AgentCard>;
35
+ /**
36
+ * Sends a message to a loaded agent.
37
+ * @param agentName The name of the agent to send the message to.
38
+ * @param message The message content.
39
+ * @param options Optional context and task IDs to maintain conversation state.
40
+ * @returns The response from the agent (Message or Task).
41
+ * @throws Error if the agent returns an error response.
42
+ */
43
+ sendMessage(agentName: string, message: string, options?: {
44
+ contextId?: string;
45
+ taskId?: string;
46
+ }): Promise<SendMessageResult>;
47
+ /**
48
+ * Retrieves a loaded agent card.
49
+ * @param name The name of the agent.
50
+ * @returns The agent card, or undefined if not found.
51
+ */
52
+ getAgentCard(name: string): AgentCard | undefined;
53
+ /**
54
+ * Retrieves a loaded client.
55
+ * @param name The name of the agent.
56
+ * @returns The client, or undefined if not found.
57
+ */
58
+ getClient(name: string): Client | undefined;
59
+ /**
60
+ * Retrieves a task from an agent.
61
+ * @param agentName The name of the agent.
62
+ * @param taskId The ID of the task to retrieve.
63
+ * @returns The task details.
64
+ */
65
+ getTask(agentName: string, taskId: string): Promise<Task>;
66
+ /**
67
+ * Cancels a task on an agent.
68
+ * @param agentName The name of the agent.
69
+ * @param taskId The ID of the task to cancel.
70
+ * @returns The cancellation response.
71
+ */
72
+ cancelTask(agentName: string, taskId: string): Promise<Task>;
73
+ }
@@ -0,0 +1,165 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { ClientFactory, ClientFactoryOptions, DefaultAgentCardResolver, RestTransportFactory, JsonRpcTransportFactory, createAuthenticatingFetchWithRetry, } from '@a2a-js/sdk/client';
7
+ import { v4 as uuidv4 } from 'uuid';
8
+ import { debugLogger } from '../utils/debugLogger.js';
9
+ /**
10
+ * Manages A2A clients and caches loaded agent information.
11
+ * Follows a singleton pattern to ensure a single client instance.
12
+ */
13
+ export class A2AClientManager {
14
+ static instance;
15
+ // Each agent should manage their own context/taskIds/card/etc
16
+ clients = new Map();
17
+ agentCards = new Map();
18
+ constructor() { }
19
+ /**
20
+ * Gets the singleton instance of the A2AClientManager.
21
+ */
22
+ static getInstance() {
23
+ if (!A2AClientManager.instance) {
24
+ A2AClientManager.instance = new A2AClientManager();
25
+ }
26
+ return A2AClientManager.instance;
27
+ }
28
+ /**
29
+ * Resets the singleton instance. Only for testing purposes.
30
+ * @internal
31
+ */
32
+ static resetInstanceForTesting() {
33
+ // @ts-expect-error - Resetting singleton for testing
34
+ A2AClientManager.instance = undefined;
35
+ }
36
+ /**
37
+ * Loads an agent by fetching its AgentCard and caches the client.
38
+ * @param name The name to assign to the agent.
39
+ * @param agentCardUrl The full URL to the agent's card.
40
+ * @param authHandler Optional authentication handler to use for this agent.
41
+ * @returns The loaded AgentCard.
42
+ */
43
+ async loadAgent(name, agentCardUrl, authHandler) {
44
+ if (this.clients.has(name)) {
45
+ throw new Error(`Agent with name '${name}' is already loaded.`);
46
+ }
47
+ let fetchImpl = fetch;
48
+ if (authHandler) {
49
+ fetchImpl = createAuthenticatingFetchWithRetry(fetch, authHandler);
50
+ }
51
+ const resolver = new DefaultAgentCardResolver({ fetchImpl });
52
+ const options = ClientFactoryOptions.createFrom(ClientFactoryOptions.default, {
53
+ transports: [
54
+ new RestTransportFactory({ fetchImpl }),
55
+ new JsonRpcTransportFactory({ fetchImpl }),
56
+ ],
57
+ cardResolver: resolver,
58
+ });
59
+ const factory = new ClientFactory(options);
60
+ const client = await factory.createFromUrl(agentCardUrl, '');
61
+ const agentCard = await client.getAgentCard();
62
+ this.clients.set(name, client);
63
+ this.agentCards.set(name, agentCard);
64
+ debugLogger.debug(`[A2AClientManager] Loaded agent '${name}' from ${agentCardUrl}`);
65
+ return agentCard;
66
+ }
67
+ /**
68
+ * Sends a message to a loaded agent.
69
+ * @param agentName The name of the agent to send the message to.
70
+ * @param message The message content.
71
+ * @param options Optional context and task IDs to maintain conversation state.
72
+ * @returns The response from the agent (Message or Task).
73
+ * @throws Error if the agent returns an error response.
74
+ */
75
+ async sendMessage(agentName, message, options) {
76
+ const client = this.clients.get(agentName);
77
+ if (!client) {
78
+ throw new Error(`Agent '${agentName}' not found.`);
79
+ }
80
+ const messageParams = {
81
+ message: {
82
+ kind: 'message',
83
+ role: 'user',
84
+ messageId: uuidv4(),
85
+ parts: [{ kind: 'text', text: message }],
86
+ contextId: options?.contextId,
87
+ taskId: options?.taskId,
88
+ },
89
+ configuration: {
90
+ blocking: true,
91
+ },
92
+ };
93
+ try {
94
+ return await client.sendMessage(messageParams);
95
+ }
96
+ catch (error) {
97
+ const prefix = `A2AClient SendMessage Error [${agentName}]`;
98
+ if (error instanceof Error) {
99
+ throw new Error(`${prefix}: ${error.message}`, { cause: error });
100
+ }
101
+ throw new Error(`${prefix}: Unexpected error during sendMessage: ${String(error)}`);
102
+ }
103
+ }
104
+ /**
105
+ * Retrieves a loaded agent card.
106
+ * @param name The name of the agent.
107
+ * @returns The agent card, or undefined if not found.
108
+ */
109
+ getAgentCard(name) {
110
+ return this.agentCards.get(name);
111
+ }
112
+ /**
113
+ * Retrieves a loaded client.
114
+ * @param name The name of the agent.
115
+ * @returns The client, or undefined if not found.
116
+ */
117
+ getClient(name) {
118
+ return this.clients.get(name);
119
+ }
120
+ /**
121
+ * Retrieves a task from an agent.
122
+ * @param agentName The name of the agent.
123
+ * @param taskId The ID of the task to retrieve.
124
+ * @returns The task details.
125
+ */
126
+ async getTask(agentName, taskId) {
127
+ const client = this.clients.get(agentName);
128
+ if (!client) {
129
+ throw new Error(`Agent '${agentName}' not found.`);
130
+ }
131
+ try {
132
+ return await client.getTask({ id: taskId });
133
+ }
134
+ catch (error) {
135
+ const prefix = `A2AClient getTask Error [${agentName}]`;
136
+ if (error instanceof Error) {
137
+ throw new Error(`${prefix}: ${error.message}`, { cause: error });
138
+ }
139
+ throw new Error(`${prefix}: Unexpected error: ${String(error)}`);
140
+ }
141
+ }
142
+ /**
143
+ * Cancels a task on an agent.
144
+ * @param agentName The name of the agent.
145
+ * @param taskId The ID of the task to cancel.
146
+ * @returns The cancellation response.
147
+ */
148
+ async cancelTask(agentName, taskId) {
149
+ const client = this.clients.get(agentName);
150
+ if (!client) {
151
+ throw new Error(`Agent '${agentName}' not found.`);
152
+ }
153
+ try {
154
+ return await client.cancelTask({ id: taskId });
155
+ }
156
+ catch (error) {
157
+ const prefix = `A2AClient cancelTask Error [${agentName}]`;
158
+ if (error instanceof Error) {
159
+ throw new Error(`${prefix}: ${error.message}`, { cause: error });
160
+ }
161
+ throw new Error(`${prefix}: Unexpected error: ${String(error)}`);
162
+ }
163
+ }
164
+ }
165
+ //# sourceMappingURL=a2a-client-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-client-manager.js","sourceRoot":"","sources":["../../../src/agents/a2a-client-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,211 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
7
+ import { A2AClientManager, } from './a2a-client-manager.js';
8
+ import { ClientFactory, DefaultAgentCardResolver } from '@a2a-js/sdk/client';
9
+ import { debugLogger } from '../utils/debugLogger.js';
10
+ import { createAuthenticatingFetchWithRetry, ClientFactoryOptions, } from '@a2a-js/sdk/client';
11
+ vi.mock('../utils/debugLogger.js', () => ({
12
+ debugLogger: {
13
+ debug: vi.fn(),
14
+ },
15
+ }));
16
+ vi.mock('@a2a-js/sdk/client', () => {
17
+ const ClientFactory = vi.fn();
18
+ const DefaultAgentCardResolver = vi.fn();
19
+ const RestTransportFactory = vi.fn();
20
+ const JsonRpcTransportFactory = vi.fn();
21
+ const ClientFactoryOptions = {
22
+ default: {},
23
+ createFrom: vi.fn(),
24
+ };
25
+ const createAuthenticatingFetchWithRetry = vi.fn();
26
+ DefaultAgentCardResolver.prototype.resolve = vi.fn();
27
+ ClientFactory.prototype.createFromUrl = vi.fn();
28
+ return {
29
+ ClientFactory,
30
+ ClientFactoryOptions,
31
+ DefaultAgentCardResolver,
32
+ RestTransportFactory,
33
+ JsonRpcTransportFactory,
34
+ createAuthenticatingFetchWithRetry,
35
+ };
36
+ });
37
+ describe('A2AClientManager', () => {
38
+ let manager;
39
+ // Stable mocks initialized once
40
+ const sendMessageMock = vi.fn();
41
+ const getTaskMock = vi.fn();
42
+ const cancelTaskMock = vi.fn();
43
+ const getAgentCardMock = vi.fn();
44
+ const authFetchMock = vi.fn();
45
+ const mockClient = {
46
+ sendMessage: sendMessageMock,
47
+ getTask: getTaskMock,
48
+ cancelTask: cancelTaskMock,
49
+ getAgentCard: getAgentCardMock,
50
+ };
51
+ const mockAgentCard = { name: 'TestAgent' };
52
+ beforeEach(() => {
53
+ vi.clearAllMocks();
54
+ A2AClientManager.resetInstanceForTesting();
55
+ manager = A2AClientManager.getInstance();
56
+ // Default mock implementations
57
+ getAgentCardMock.mockResolvedValue({
58
+ ...mockAgentCard,
59
+ url: 'http://test.agent/real/endpoint',
60
+ });
61
+ vi.mocked(ClientFactory.prototype.createFromUrl).mockResolvedValue(mockClient);
62
+ vi.mocked(DefaultAgentCardResolver.prototype.resolve).mockResolvedValue({
63
+ ...mockAgentCard,
64
+ url: 'http://test.agent/real/endpoint',
65
+ });
66
+ vi.mocked(ClientFactoryOptions.createFrom).mockImplementation((_defaults, overrides) => overrides);
67
+ vi.mocked(createAuthenticatingFetchWithRetry).mockReturnValue(authFetchMock);
68
+ vi.stubGlobal('fetch', vi.fn().mockResolvedValue({
69
+ ok: true,
70
+ json: async () => ({}),
71
+ }));
72
+ });
73
+ afterEach(() => {
74
+ vi.restoreAllMocks();
75
+ vi.unstubAllGlobals();
76
+ });
77
+ it('should enforce the singleton pattern', () => {
78
+ const instance1 = A2AClientManager.getInstance();
79
+ const instance2 = A2AClientManager.getInstance();
80
+ expect(instance1).toBe(instance2);
81
+ });
82
+ describe('loadAgent', () => {
83
+ it('should create and cache an A2AClient', async () => {
84
+ const agentCard = await manager.loadAgent('TestAgent', 'http://test.agent/card');
85
+ expect(agentCard).toMatchObject(mockAgentCard);
86
+ expect(manager.getAgentCard('TestAgent')).toBe(agentCard);
87
+ expect(manager.getClient('TestAgent')).toBeDefined();
88
+ });
89
+ it('should throw an error if an agent with the same name is already loaded', async () => {
90
+ await manager.loadAgent('TestAgent', 'http://test.agent/card');
91
+ await expect(manager.loadAgent('TestAgent', 'http://another.agent/card')).rejects.toThrow("Agent with name 'TestAgent' is already loaded.");
92
+ });
93
+ it('should use native fetch by default', async () => {
94
+ await manager.loadAgent('TestAgent', 'http://test.agent/card');
95
+ expect(createAuthenticatingFetchWithRetry).not.toHaveBeenCalled();
96
+ });
97
+ it('should use provided custom authentication handler', async () => {
98
+ const customAuthHandler = {
99
+ headers: vi.fn(),
100
+ shouldRetryWithHeaders: vi.fn(),
101
+ };
102
+ await manager.loadAgent('CustomAuthAgent', 'http://custom.agent/card', customAuthHandler);
103
+ expect(createAuthenticatingFetchWithRetry).toHaveBeenCalledWith(expect.anything(), customAuthHandler);
104
+ });
105
+ it('should log a debug message upon loading an agent', async () => {
106
+ await manager.loadAgent('TestAgent', 'http://test.agent/card');
107
+ expect(debugLogger.debug).toHaveBeenCalledWith("[A2AClientManager] Loaded agent 'TestAgent' from http://test.agent/card");
108
+ });
109
+ });
110
+ describe('sendMessage', () => {
111
+ beforeEach(async () => {
112
+ await manager.loadAgent('TestAgent', 'http://test.agent');
113
+ });
114
+ it('should send a message to the correct agent', async () => {
115
+ sendMessageMock.mockResolvedValue({
116
+ kind: 'message',
117
+ messageId: 'a',
118
+ parts: [],
119
+ role: 'agent',
120
+ });
121
+ await manager.sendMessage('TestAgent', 'Hello');
122
+ expect(sendMessageMock).toHaveBeenCalledWith(expect.objectContaining({
123
+ message: expect.anything(),
124
+ }));
125
+ });
126
+ it('should use contextId and taskId when provided', async () => {
127
+ sendMessageMock.mockResolvedValue({
128
+ kind: 'message',
129
+ messageId: 'a',
130
+ parts: [],
131
+ role: 'agent',
132
+ });
133
+ const expectedContextId = 'user-context-id';
134
+ const expectedTaskId = 'user-task-id';
135
+ await manager.sendMessage('TestAgent', 'Hello', {
136
+ contextId: expectedContextId,
137
+ taskId: expectedTaskId,
138
+ });
139
+ const call = sendMessageMock.mock.calls[0][0];
140
+ expect(call.message.contextId).toBe(expectedContextId);
141
+ expect(call.message.taskId).toBe(expectedTaskId);
142
+ });
143
+ it('should return result from client', async () => {
144
+ const mockResult = {
145
+ contextId: 'server-context-id',
146
+ id: 'ctx-1',
147
+ kind: 'task',
148
+ status: { state: 'working' },
149
+ };
150
+ sendMessageMock.mockResolvedValueOnce(mockResult);
151
+ const response = await manager.sendMessage('TestAgent', 'Hello');
152
+ expect(response).toEqual(mockResult);
153
+ });
154
+ it('should throw prefixed error on failure', async () => {
155
+ sendMessageMock.mockRejectedValueOnce(new Error('Network error'));
156
+ await expect(manager.sendMessage('TestAgent', 'Hello')).rejects.toThrow('A2AClient SendMessage Error [TestAgent]: Network error');
157
+ });
158
+ it('should throw an error if the agent is not found', async () => {
159
+ await expect(manager.sendMessage('NonExistentAgent', 'Hello')).rejects.toThrow("Agent 'NonExistentAgent' not found.");
160
+ });
161
+ });
162
+ describe('getTask', () => {
163
+ beforeEach(async () => {
164
+ await manager.loadAgent('TestAgent', 'http://test.agent');
165
+ });
166
+ it('should get a task from the correct agent', async () => {
167
+ getTaskMock.mockResolvedValue({
168
+ id: 'task123',
169
+ contextId: 'a',
170
+ kind: 'task',
171
+ status: { state: 'completed' },
172
+ });
173
+ await manager.getTask('TestAgent', 'task123');
174
+ expect(getTaskMock).toHaveBeenCalledWith({
175
+ id: 'task123',
176
+ });
177
+ });
178
+ it('should throw prefixed error on failure', async () => {
179
+ getTaskMock.mockRejectedValueOnce(new Error('Network error'));
180
+ await expect(manager.getTask('TestAgent', 'task123')).rejects.toThrow('A2AClient getTask Error [TestAgent]: Network error');
181
+ });
182
+ it('should throw an error if the agent is not found', async () => {
183
+ await expect(manager.getTask('NonExistentAgent', 'task123')).rejects.toThrow("Agent 'NonExistentAgent' not found.");
184
+ });
185
+ });
186
+ describe('cancelTask', () => {
187
+ beforeEach(async () => {
188
+ await manager.loadAgent('TestAgent', 'http://test.agent');
189
+ });
190
+ it('should cancel a task on the correct agent', async () => {
191
+ cancelTaskMock.mockResolvedValue({
192
+ id: 'task123',
193
+ contextId: 'a',
194
+ kind: 'task',
195
+ status: { state: 'canceled' },
196
+ });
197
+ await manager.cancelTask('TestAgent', 'task123');
198
+ expect(cancelTaskMock).toHaveBeenCalledWith({
199
+ id: 'task123',
200
+ });
201
+ });
202
+ it('should throw prefixed error on failure', async () => {
203
+ cancelTaskMock.mockRejectedValueOnce(new Error('Network error'));
204
+ await expect(manager.cancelTask('TestAgent', 'task123')).rejects.toThrow('A2AClient cancelTask Error [TestAgent]: Network error');
205
+ });
206
+ it('should throw an error if the agent is not found', async () => {
207
+ await expect(manager.cancelTask('NonExistentAgent', 'task123')).rejects.toThrow("Agent 'NonExistentAgent' not found.");
208
+ });
209
+ });
210
+ });
211
+ //# sourceMappingURL=a2a-client-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-client-manager.test.js","sourceRoot":"","sources":["../../../src/agents/a2a-client-manager.test.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ import { Type } from '@google/genai';
9
9
  import { executeToolCall } from '../core/nonInteractiveToolExecutor.js';
10
10
  import { ToolRegistry } from '../tools/tool-registry.js';
11
11
  import { CompressionStatus } from '../core/turn.js';
12
+ import {} from '../scheduler/types.js';
12
13
  import { ChatCompressionService } from '../services/chatCompressionService.js';
13
14
  import { getDirectoryContextString } from '../utils/environmentContext.js';
14
15
  import { promptIdContext } from '../utils/promptIdContext.js';