@google/gemini-cli-core 0.23.0-preview.3 → 0.24.0-nightly.20251227.37be16243
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.
- package/dist/docs/cli/settings.md +7 -5
- package/dist/docs/get-started/configuration.md +67 -0
- package/dist/google-gemini-cli-core-0.24.0-nightly.20251226.546baf993.tgz +0 -0
- package/dist/src/agents/a2a-client-manager.d.ts +73 -0
- package/dist/src/agents/a2a-client-manager.js +165 -0
- package/dist/src/agents/a2a-client-manager.js.map +1 -0
- package/dist/src/agents/a2a-client-manager.test.d.ts +6 -0
- package/dist/src/agents/a2a-client-manager.test.js +211 -0
- package/dist/src/agents/a2a-client-manager.test.js.map +1 -0
- package/dist/src/agents/local-executor.js +1 -0
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/availability/policyHelpers.js +0 -2
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/code_assist/server.js +7 -2
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +3 -0
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/config/config.d.ts +25 -4
- package/dist/src/config/config.js +37 -6
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +18 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/models.d.ts +1 -9
- package/dist/src/config/models.js +1 -11
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +16 -16
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/core/client.d.ts +1 -1
- package/dist/src/core/client.js +3 -3
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/contentGenerator.js +2 -2
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +5 -85
- package/dist/src/core/coreToolScheduler.js +13 -184
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +18 -365
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +3 -21
- package/dist/src/core/turn.js +1 -0
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/fallback/handler.js +0 -6
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/hooks/hookPlanner.d.ts +1 -5
- package/dist/src/hooks/hookPlanner.js +2 -9
- package/dist/src/hooks/hookPlanner.js.map +1 -1
- package/dist/src/hooks/hookPlanner.test.js +1 -2
- package/dist/src/hooks/hookPlanner.test.js.map +1 -1
- package/dist/src/hooks/hookRegistry.d.ts +5 -10
- package/dist/src/hooks/hookRegistry.js +39 -12
- package/dist/src/hooks/hookRegistry.js.map +1 -1
- package/dist/src/hooks/hookRegistry.test.js +93 -2
- package/dist/src/hooks/hookRegistry.test.js.map +1 -1
- package/dist/src/hooks/hookRunner.d.ts +3 -1
- package/dist/src/hooks/hookRunner.js +20 -3
- package/dist/src/hooks/hookRunner.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +58 -2
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/hooks/hookSystem.js +1 -1
- package/dist/src/hooks/hookSystem.js.map +1 -1
- package/dist/src/hooks/index.d.ts +1 -1
- package/dist/src/hooks/index.js +1 -1
- package/dist/src/hooks/index.js.map +1 -1
- package/dist/src/hooks/trustedHooks.d.ts +28 -0
- package/dist/src/hooks/trustedHooks.js +90 -0
- package/dist/src/hooks/trustedHooks.js.map +1 -0
- package/dist/src/hooks/trustedHooks.test.d.ts +6 -0
- package/dist/src/hooks/trustedHooks.test.js +154 -0
- package/dist/src/hooks/trustedHooks.test.js.map +1 -0
- package/dist/src/hooks/types.d.ts +15 -11
- package/dist/src/hooks/types.js +19 -30
- package/dist/src/hooks/types.js.map +1 -1
- package/dist/src/hooks/types.test.js +1 -24
- package/dist/src/hooks/types.test.js.map +1 -1
- package/dist/src/ide/ide-client.js +3 -0
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/policy/config.js +2 -1
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/persistence.test.js +6 -1
- package/dist/src/policy/persistence.test.js.map +1 -1
- package/dist/src/policy/policy-engine.d.ts +10 -1
- package/dist/src/policy/policy-engine.js +24 -4
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +26 -2
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/shell-safety.test.js +2 -1
- package/dist/src/policy/shell-safety.test.js.map +1 -1
- package/dist/src/policy/toml-loader.d.ts +3 -5
- package/dist/src/policy/toml-loader.js +35 -20
- package/dist/src/policy/toml-loader.js.map +1 -1
- package/dist/src/policy/toml-loader.test.js +28 -7
- package/dist/src/policy/toml-loader.test.js.map +1 -1
- package/dist/src/policy/types.d.ts +15 -0
- package/dist/src/routing/strategies/overrideStrategy.js +2 -2
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/scheduler/types.d.ts +95 -0
- package/dist/src/scheduler/types.js +7 -0
- package/dist/src/scheduler/types.js.map +1 -0
- package/dist/src/services/environmentSanitization.d.ts +15 -0
- package/dist/src/services/environmentSanitization.js +141 -0
- package/dist/src/services/environmentSanitization.js.map +1 -0
- package/dist/src/services/environmentSanitization.test.d.ts +6 -0
- package/dist/src/services/environmentSanitization.test.js +284 -0
- package/dist/src/services/environmentSanitization.test.js.map +1 -0
- package/dist/src/services/gitService.js +10 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +18 -0
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +2 -0
- package/dist/src/services/shellExecutionService.js +5 -65
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +26 -3
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/telemetry/loggers.test.circular.js +1 -0
- package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +3 -2
- package/dist/src/tools/mcp-client.js +7 -6
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +47 -42
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/shell.js +6 -1
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/tools.d.ts +1 -1
- package/dist/src/tools/tools.js +1 -1
- package/dist/src/utils/checkpointUtils.d.ts +1 -1
- package/dist/src/utils/fileUtils.d.ts +4 -0
- package/dist/src/utils/fileUtils.js +53 -0
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +112 -1
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/generateContentResponseUtilities.d.ts +2 -1
- package/dist/src/utils/generateContentResponseUtilities.js +96 -0
- package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
- package/dist/src/utils/generateContentResponseUtilities.test.js +221 -1
- package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
- package/dist/src/utils/terminal.d.ts +2 -0
- package/dist/src/utils/terminal.js +6 -0
- package/dist/src/utils/terminal.js.map +1 -1
- package/dist/src/utils/tool-utils.d.ts +9 -0
- package/dist/src/utils/tool-utils.js +29 -0
- package/dist/src/utils/tool-utils.js.map +1 -1
- package/dist/src/utils/tool-utils.test.js +15 -1
- package/dist/src/utils/tool-utils.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -1
- package/dist/google-gemini-cli-core-0.23.0-preview.2.tgz +0 -0
|
@@ -98,11 +98,13 @@ they appear in the UI.
|
|
|
98
98
|
|
|
99
99
|
### Security
|
|
100
100
|
|
|
101
|
-
| UI Label
|
|
102
|
-
|
|
|
103
|
-
| Disable YOLO Mode
|
|
104
|
-
| Blocks extensions from Git
|
|
105
|
-
| Folder Trust
|
|
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` |
|
|
106
|
+
| Allowed Environment Variables | `security.environmentVariableRedaction.allowed` | Environment variables to always allow (bypass redaction). | `[]` |
|
|
107
|
+
| Blocked Environment Variables | `security.environmentVariableRedaction.blocked` | Environment variables to always redact. | `[]` |
|
|
106
108
|
|
|
107
109
|
### Experimental
|
|
108
110
|
|
|
@@ -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).
|
|
@@ -746,6 +751,22 @@ their corresponding top-level category object in your `settings.json` file.
|
|
|
746
751
|
- **Default:** `false`
|
|
747
752
|
- **Requires restart:** Yes
|
|
748
753
|
|
|
754
|
+
- **`security.environmentVariableRedaction.allowed`** (array):
|
|
755
|
+
- **Description:** Environment variables to always allow (bypass redaction).
|
|
756
|
+
- **Default:** `[]`
|
|
757
|
+
- **Requires restart:** Yes
|
|
758
|
+
|
|
759
|
+
- **`security.environmentVariableRedaction.blocked`** (array):
|
|
760
|
+
- **Description:** Environment variables to always redact.
|
|
761
|
+
- **Default:** `[]`
|
|
762
|
+
- **Requires restart:** Yes
|
|
763
|
+
|
|
764
|
+
- **`security.environmentVariableRedaction.enabled`** (boolean):
|
|
765
|
+
- **Description:** Enable redaction of environment variables that may contain
|
|
766
|
+
secrets.
|
|
767
|
+
- **Default:** `false`
|
|
768
|
+
- **Requires restart:** Yes
|
|
769
|
+
|
|
749
770
|
- **`security.auth.selectedType`** (string):
|
|
750
771
|
- **Description:** The currently selected authentication type.
|
|
751
772
|
- **Default:** `undefined`
|
|
@@ -1171,6 +1192,52 @@ the `advanced.excludedEnvVars` setting in your `settings.json` file.
|
|
|
1171
1192
|
- Specifies the endpoint for the code assist server.
|
|
1172
1193
|
- This is useful for development and testing.
|
|
1173
1194
|
|
|
1195
|
+
### Environment variable redaction
|
|
1196
|
+
|
|
1197
|
+
To prevent accidental leakage of sensitive information, Gemini CLI automatically
|
|
1198
|
+
redacts potential secrets from environment variables when executing tools (such
|
|
1199
|
+
as shell commands). This "best effort" redaction applies to variables inherited
|
|
1200
|
+
from the system or loaded from `.env` files.
|
|
1201
|
+
|
|
1202
|
+
**Default Redaction Rules:**
|
|
1203
|
+
|
|
1204
|
+
- **By Name:** Variables are redacted if their names contain sensitive terms
|
|
1205
|
+
like `TOKEN`, `SECRET`, `PASSWORD`, `KEY`, `AUTH`, `CREDENTIAL`, `PRIVATE`, or
|
|
1206
|
+
`CERT`.
|
|
1207
|
+
- **By Value:** Variables are redacted if their values match known secret
|
|
1208
|
+
patterns, such as:
|
|
1209
|
+
- Private keys (RSA, OpenSSH, PGP, etc.)
|
|
1210
|
+
- Certificates
|
|
1211
|
+
- URLs containing credentials
|
|
1212
|
+
- API keys and tokens (GitHub, Google, AWS, Stripe, Slack, etc.)
|
|
1213
|
+
- **Specific Blocklist:** Certain variables like `CLIENT_ID`, `DB_URI`,
|
|
1214
|
+
`DATABASE_URL`, and `CONNECTION_STRING` are always redacted by default.
|
|
1215
|
+
|
|
1216
|
+
**Allowlist (Never Redacted):**
|
|
1217
|
+
|
|
1218
|
+
- Common system variables (e.g., `PATH`, `HOME`, `USER`, `SHELL`, `TERM`,
|
|
1219
|
+
`LANG`).
|
|
1220
|
+
- Variables starting with `GEMINI_CLI_`.
|
|
1221
|
+
- GitHub Action specific variables.
|
|
1222
|
+
|
|
1223
|
+
**Configuration:**
|
|
1224
|
+
|
|
1225
|
+
You can customize this behavior in your `settings.json` file:
|
|
1226
|
+
|
|
1227
|
+
- **`security.allowedEnvironmentVariables`**: A list of variable names to
|
|
1228
|
+
_never_ redact, even if they match sensitive patterns.
|
|
1229
|
+
- **`security.blockedEnvironmentVariables`**: A list of variable names to
|
|
1230
|
+
_always_ redact, even if they don't match sensitive patterns.
|
|
1231
|
+
|
|
1232
|
+
```json
|
|
1233
|
+
{
|
|
1234
|
+
"security": {
|
|
1235
|
+
"allowedEnvironmentVariables": ["MY_PUBLIC_KEY", "NOT_A_SECRET_TOKEN"],
|
|
1236
|
+
"blockedEnvironmentVariables": ["INTERNAL_IP_ADDRESS"]
|
|
1237
|
+
}
|
|
1238
|
+
}
|
|
1239
|
+
```
|
|
1240
|
+
|
|
1174
1241
|
## Command-line arguments
|
|
1175
1242
|
|
|
1176
1243
|
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,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';
|