@google/gemini-cli-core 0.21.0-nightly.20251217.db643e916 → 0.21.0-nightly.20251219.70696e364
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/google-gemini-cli-core-0.21.0-nightly.20251218.739c02bd6.tgz +0 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/src/agents/codebase-investigator.d.ts +2 -2
- package/dist/src/agents/codebase-investigator.js +6 -5
- package/dist/src/agents/codebase-investigator.js.map +1 -1
- package/dist/src/agents/codebase-investigator.test.js +2 -2
- package/dist/src/agents/codebase-investigator.test.js.map +1 -1
- package/dist/src/agents/delegate-to-agent-tool.js +8 -4
- package/dist/src/agents/delegate-to-agent-tool.js.map +1 -1
- package/dist/src/agents/delegate-to-agent-tool.test.js +5 -4
- package/dist/src/agents/delegate-to-agent-tool.test.js.map +1 -1
- package/dist/src/agents/{executor.d.ts → local-executor.d.ts} +5 -11
- package/dist/src/agents/{executor.js → local-executor.js} +75 -51
- package/dist/src/agents/local-executor.js.map +1 -0
- package/dist/src/agents/{executor.test.js → local-executor.test.js} +61 -45
- package/dist/src/agents/local-executor.test.js.map +1 -0
- package/dist/src/agents/{invocation.d.ts → local-invocation.d.ts} +5 -6
- package/dist/src/agents/{invocation.js → local-invocation.js} +8 -9
- package/dist/src/agents/local-invocation.js.map +1 -0
- package/dist/src/agents/{invocation.test.js → local-invocation.test.js} +18 -17
- package/dist/src/agents/local-invocation.test.js.map +1 -0
- package/dist/src/agents/registry.d.ts +1 -0
- package/dist/src/agents/registry.js +77 -28
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +130 -5
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.d.ts +21 -0
- package/dist/src/agents/remote-invocation.js +31 -0
- package/dist/src/agents/remote-invocation.js.map +1 -0
- package/dist/src/agents/remote-invocation.test.d.ts +6 -0
- package/dist/src/agents/remote-invocation.test.js +35 -0
- package/dist/src/agents/remote-invocation.test.js.map +1 -0
- package/dist/src/agents/subagent-tool-wrapper.js +7 -3
- package/dist/src/agents/subagent-tool-wrapper.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.test.js +10 -9
- package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
- package/dist/src/agents/toml-loader.d.ts +65 -0
- package/dist/src/agents/toml-loader.js +176 -0
- package/dist/src/agents/toml-loader.js.map +1 -0
- package/dist/src/agents/toml-loader.test.d.ts +6 -0
- package/dist/src/agents/toml-loader.test.js +190 -0
- package/dist/src/agents/toml-loader.test.js.map +1 -0
- package/dist/src/agents/types.d.ts +12 -4
- package/dist/src/availability/modelAvailabilityService.d.ts +2 -1
- package/dist/src/availability/policyCatalog.d.ts +1 -0
- package/dist/src/availability/policyCatalog.js +6 -8
- package/dist/src/availability/policyCatalog.js.map +1 -1
- package/dist/src/availability/policyCatalog.test.js +2 -2
- package/dist/src/availability/policyCatalog.test.js.map +1 -1
- package/dist/src/availability/policyHelpers.d.ts +9 -5
- package/dist/src/availability/policyHelpers.js +43 -37
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +58 -20
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +1 -1
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +6 -8
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.js +3 -9
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/server.test.js +18 -3
- package/dist/src/code_assist/server.test.js.map +1 -1
- package/dist/src/code_assist/telemetry.d.ts +6 -1
- package/dist/src/code_assist/telemetry.js +92 -3
- package/dist/src/code_assist/telemetry.js.map +1 -1
- package/dist/src/code_assist/telemetry.test.js +206 -18
- package/dist/src/code_assist/telemetry.test.js.map +1 -1
- package/dist/src/config/config.d.ts +9 -13
- package/dist/src/config/config.js +68 -38
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +134 -22
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +11 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +0 -37
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/config/models.d.ts +23 -10
- package/dist/src/config/models.js +65 -23
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +57 -76
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/config/storage.d.ts +2 -0
- package/dist/src/config/storage.js +6 -0
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/config/storage.test.js +8 -0
- package/dist/src/config/storage.test.js.map +1 -1
- package/dist/src/core/baseLlmClient.d.ts +3 -1
- package/dist/src/core/baseLlmClient.js +51 -43
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +12 -19
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.js +18 -33
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +14 -65
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +1 -1
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +0 -6
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/geminiChat.js +29 -88
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +35 -257
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +6 -6
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/prompts.js +6 -7
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +10 -7
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +1 -0
- package/dist/src/core/turn.js +3 -2
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/fallback/handler.js +54 -121
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/fallback/handler.test.js +80 -285
- package/dist/src/fallback/handler.test.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/hooks/hookPlanner.js +3 -1
- package/dist/src/hooks/hookPlanner.js.map +1 -1
- package/dist/src/hooks/hookPlanner.test.js +61 -0
- package/dist/src/hooks/hookPlanner.test.js.map +1 -1
- package/dist/src/hooks/hookRegistry.d.ts +1 -1
- package/dist/src/hooks/hookRegistry.js +2 -2
- package/dist/src/hooks/hookRegistry.js.map +1 -1
- package/dist/src/hooks/hookRegistry.test.js +73 -0
- package/dist/src/hooks/hookRegistry.test.js.map +1 -1
- package/dist/src/hooks/hookRunner.js +2 -2
- package/dist/src/hooks/hookRunner.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +23 -0
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/hooks/types.d.ts +2 -0
- package/dist/src/hooks/types.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/routing/modelRouterService.js +0 -15
- package/dist/src/routing/modelRouterService.js.map +1 -1
- package/dist/src/routing/modelRouterService.test.js +0 -62
- package/dist/src/routing/modelRouterService.test.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js +10 -21
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +2 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js +20 -12
- package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.test.js +63 -39
- package/dist/src/routing/strategies/fallbackStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js +4 -3
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/services/chatCompressionService.js +3 -1
- package/dist/src/services/chatCompressionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +2 -1
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +14 -8
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/services/modelConfig.integration.test.js +1 -1
- package/dist/src/services/modelConfig.integration.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +18 -2
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +16 -0
- package/dist/src/services/test-data/resolved-aliases.golden.json +16 -0
- package/dist/src/telemetry/sdk.js +2 -2
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/tools/ripGrep.js +2 -2
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +13 -0
- package/dist/src/tools/tool-names.js +54 -0
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tool-names.test.d.ts +6 -0
- package/dist/src/tools/tool-names.test.js +43 -0
- package/dist/src/tools/tool-names.test.js.map +1 -0
- package/dist/src/tools/tool-registry.d.ts +0 -1
- package/dist/src/tools/tool-registry.js +1 -1
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +2 -1
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/utils/checkpointUtils.js +1 -1
- package/dist/src/utils/checkpointUtils.js.map +1 -1
- package/dist/src/utils/checkpointUtils.test.js +1 -1
- package/dist/src/utils/checkpointUtils.test.js.map +1 -1
- package/dist/src/utils/editCorrector.js +1 -1
- package/dist/src/utils/editCorrector.js.map +1 -1
- package/dist/src/utils/editCorrector.test.js +2 -2
- package/dist/src/utils/editCorrector.test.js.map +1 -1
- package/dist/src/utils/environmentContext.d.ts +1 -0
- package/dist/src/utils/environmentContext.js +1 -0
- package/dist/src/utils/environmentContext.js.map +1 -1
- package/dist/src/utils/events.d.ts +0 -16
- package/dist/src/utils/events.js +0 -9
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/flashFallback.test.js +1 -1
- package/dist/src/utils/flashFallback.test.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.js +20 -0
- package/dist/src/utils/googleQuotaErrors.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.test.js +53 -2
- package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
- package/dist/src/utils/retry.js +2 -16
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +7 -22
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -6
- package/dist/google-gemini-cli-core-0.21.0-nightly.20251216.bb0c0d8ee.tgz +0 -0
- package/dist/src/agents/executor.js.map +0 -1
- package/dist/src/agents/executor.test.js.map +0 -1
- package/dist/src/agents/invocation.js.map +0 -1
- package/dist/src/agents/invocation.test.js.map +0 -1
- /package/dist/src/agents/{executor.test.d.ts → local-executor.test.d.ts} +0 -0
- /package/dist/src/agents/{invocation.test.d.ts → local-invocation.test.d.ts} +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import { RemoteAgentInvocation } from './remote-invocation.js';
|
|
8
|
+
class TestableRemoteAgentInvocation extends RemoteAgentInvocation {
|
|
9
|
+
async getConfirmationDetails(abortSignal) {
|
|
10
|
+
return super.getConfirmationDetails(abortSignal);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
describe('RemoteAgentInvocation', () => {
|
|
14
|
+
const mockDefinition = {
|
|
15
|
+
kind: 'remote',
|
|
16
|
+
name: 'test-remote-agent',
|
|
17
|
+
description: 'A test remote agent',
|
|
18
|
+
displayName: 'Test Remote Agent',
|
|
19
|
+
agentCardUrl: 'https://example.com/agent-card',
|
|
20
|
+
inputConfig: {
|
|
21
|
+
inputs: {},
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
it('should be instantiated with correct params', () => {
|
|
25
|
+
const invocation = new RemoteAgentInvocation(mockDefinition, {});
|
|
26
|
+
expect(invocation).toBeDefined();
|
|
27
|
+
expect(invocation.getDescription()).toBe('Calling remote agent Test Remote Agent');
|
|
28
|
+
});
|
|
29
|
+
it('should return false for confirmation details (not yet implemented)', async () => {
|
|
30
|
+
const invocation = new TestableRemoteAgentInvocation(mockDefinition, {});
|
|
31
|
+
const details = await invocation.getConfirmationDetails(new AbortController().signal);
|
|
32
|
+
expect(details).toBe(false);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=remote-invocation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-invocation.test.js","sourceRoot":"","sources":["../../../src/agents/remote-invocation.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,MAAM,6BAA8B,SAAQ,qBAAqB;IACtD,KAAK,CAAC,sBAAsB,CACnC,WAAwB;QAExB,OAAO,KAAK,CAAC,sBAAsB,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;CACF;AAED,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,MAAM,cAAc,GAA0B;QAC5C,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,qBAAqB;QAClC,WAAW,EAAE,mBAAmB;QAChC,YAAY,EAAE,gCAAgC;QAC9C,WAAW,EAAE;YACX,MAAM,EAAE,EAAE;SACX;KACF,CAAC;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,CACtC,wCAAwC,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,UAAU,GAAG,IAAI,6BAA6B,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,sBAAsB,CACrD,IAAI,eAAe,EAAE,CAAC,MAAM,CAC7B,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { BaseDeclarativeTool, Kind, } from '../tools/tools.js';
|
|
7
7
|
import { convertInputConfigToJsonSchema } from './schema-utils.js';
|
|
8
|
-
import {
|
|
8
|
+
import { LocalSubagentInvocation } from './local-invocation.js';
|
|
9
|
+
import { RemoteAgentInvocation } from './remote-invocation.js';
|
|
9
10
|
/**
|
|
10
11
|
* A tool wrapper that dynamically exposes a subagent as a standard,
|
|
11
12
|
* strongly-typed `DeclarativeTool`.
|
|
@@ -24,7 +25,6 @@ export class SubagentToolWrapper extends BaseDeclarativeTool {
|
|
|
24
25
|
* @param messageBus Optional message bus for policy enforcement.
|
|
25
26
|
*/
|
|
26
27
|
constructor(definition, config, messageBus) {
|
|
27
|
-
// Dynamically generate the JSON schema required for the tool definition.
|
|
28
28
|
const parameterSchema = convertInputConfigToJsonSchema(definition.inputConfig);
|
|
29
29
|
super(definition.name, definition.displayName ?? definition.name, definition.description, Kind.Think, parameterSchema,
|
|
30
30
|
/* isOutputMarkdown */ true,
|
|
@@ -42,7 +42,11 @@ export class SubagentToolWrapper extends BaseDeclarativeTool {
|
|
|
42
42
|
* @returns A `ToolInvocation` instance ready for execution.
|
|
43
43
|
*/
|
|
44
44
|
createInvocation(params) {
|
|
45
|
-
|
|
45
|
+
const definition = this.definition;
|
|
46
|
+
if (definition.kind === 'remote') {
|
|
47
|
+
return new RemoteAgentInvocation(definition, params, this.messageBus);
|
|
48
|
+
}
|
|
49
|
+
return new LocalSubagentInvocation(definition, this.config, params, this.messageBus);
|
|
46
50
|
}
|
|
47
51
|
}
|
|
48
52
|
//# sourceMappingURL=subagent-tool-wrapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-tool-wrapper.js","sourceRoot":"","sources":["../../../src/agents/subagent-tool-wrapper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,IAAI,GAGL,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"subagent-tool-wrapper.js","sourceRoot":"","sources":["../../../src/agents/subagent-tool-wrapper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,IAAI,GAGL,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAG/D;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,mBAGxC;IAYoB;IACA;IAZnB;;;;;;;;;OASG;IACH,YACmB,UAA2B,EAC3B,MAAc,EAC/B,UAAuB;QAEvB,MAAM,eAAe,GAAG,8BAA8B,CACpD,UAAU,CAAC,WAAW,CACvB,CAAC;QAEF,KAAK,CACH,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,IAAI,EACzC,UAAU,CAAC,WAAW,EACtB,IAAI,CAAC,KAAK,EACV,eAAe;QACf,sBAAsB,CAAC,IAAI;QAC3B,qBAAqB,CAAC,IAAI,EAC1B,UAAU,CACX,CAAC;QAjBe,eAAU,GAAV,UAAU,CAAiB;QAC3B,WAAM,GAAN,MAAM,CAAQ;IAiBjC,CAAC;IAED;;;;;;;;OAQG;IACO,gBAAgB,CACxB,MAAmB;QAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,IAAI,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,IAAI,uBAAuB,CAChC,UAAU,EACV,IAAI,CAAC,MAAM,EACX,MAAM,EACN,IAAI,CAAC,UAAU,CAChB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -5,18 +5,19 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
7
|
import { SubagentToolWrapper } from './subagent-tool-wrapper.js';
|
|
8
|
-
import {
|
|
8
|
+
import { LocalSubagentInvocation } from './local-invocation.js';
|
|
9
9
|
import { convertInputConfigToJsonSchema } from './schema-utils.js';
|
|
10
10
|
import { makeFakeConfig } from '../test-utils/config.js';
|
|
11
11
|
import { Kind } from '../tools/tools.js';
|
|
12
12
|
// Mock dependencies to isolate the SubagentToolWrapper class
|
|
13
|
-
vi.mock('./invocation.js');
|
|
13
|
+
vi.mock('./local-invocation.js');
|
|
14
14
|
vi.mock('./schema-utils.js');
|
|
15
|
-
const
|
|
15
|
+
const MockedLocalSubagentInvocation = vi.mocked(LocalSubagentInvocation);
|
|
16
16
|
const mockConvertInputConfigToJsonSchema = vi.mocked(convertInputConfigToJsonSchema);
|
|
17
17
|
// Define reusable test data
|
|
18
18
|
let mockConfig;
|
|
19
19
|
const mockDefinition = {
|
|
20
|
+
kind: 'local',
|
|
20
21
|
name: 'TestAgent',
|
|
21
22
|
displayName: 'Test Agent Display Name',
|
|
22
23
|
description: 'An agent for testing.',
|
|
@@ -81,20 +82,20 @@ describe('SubagentToolWrapper', () => {
|
|
|
81
82
|
});
|
|
82
83
|
});
|
|
83
84
|
describe('createInvocation', () => {
|
|
84
|
-
it('should create a
|
|
85
|
+
it('should create a LocalSubagentInvocation with the correct parameters', () => {
|
|
85
86
|
const wrapper = new SubagentToolWrapper(mockDefinition, mockConfig);
|
|
86
87
|
const params = { goal: 'Test the invocation', priority: 1 };
|
|
87
88
|
// The public `build` method calls the protected `createInvocation` after validation
|
|
88
89
|
const invocation = wrapper.build(params);
|
|
89
|
-
expect(invocation).toBeInstanceOf(
|
|
90
|
-
expect(
|
|
90
|
+
expect(invocation).toBeInstanceOf(LocalSubagentInvocation);
|
|
91
|
+
expect(MockedLocalSubagentInvocation).toHaveBeenCalledExactlyOnceWith(mockDefinition, mockConfig, params, undefined);
|
|
91
92
|
});
|
|
92
|
-
it('should pass the messageBus to the
|
|
93
|
+
it('should pass the messageBus to the LocalSubagentInvocation constructor', () => {
|
|
93
94
|
const mockMessageBus = {};
|
|
94
95
|
const wrapper = new SubagentToolWrapper(mockDefinition, mockConfig, mockMessageBus);
|
|
95
96
|
const params = { goal: 'Test the invocation', priority: 1 };
|
|
96
97
|
wrapper.build(params);
|
|
97
|
-
expect(
|
|
98
|
+
expect(MockedLocalSubagentInvocation).toHaveBeenCalledWith(mockDefinition, mockConfig, params, mockMessageBus);
|
|
98
99
|
});
|
|
99
100
|
it('should throw a validation error for invalid parameters before creating an invocation', () => {
|
|
100
101
|
const wrapper = new SubagentToolWrapper(mockDefinition, mockConfig);
|
|
@@ -103,7 +104,7 @@ describe('SubagentToolWrapper', () => {
|
|
|
103
104
|
// The `build` method in the base class performs JSON schema validation
|
|
104
105
|
// before calling the protected `createInvocation` method.
|
|
105
106
|
expect(() => wrapper.build(invalidParams)).toThrow("params must have required property 'goal'");
|
|
106
|
-
expect(
|
|
107
|
+
expect(MockedLocalSubagentInvocation).not.toHaveBeenCalled();
|
|
107
108
|
});
|
|
108
109
|
});
|
|
109
110
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-tool-wrapper.test.js","sourceRoot":"","sources":["../../../src/agents/subagent-tool-wrapper.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"subagent-tool-wrapper.test.js","sourceRoot":"","sources":["../../../src/agents/subagent-tool-wrapper.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { AgentDefinition } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* DTO for TOML parsing - represents the raw structure of the TOML file.
|
|
9
|
+
*/
|
|
10
|
+
interface TomlAgentDefinition {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
display_name?: string;
|
|
14
|
+
tools?: string[];
|
|
15
|
+
prompts: {
|
|
16
|
+
system_prompt: string;
|
|
17
|
+
query?: string;
|
|
18
|
+
};
|
|
19
|
+
model?: {
|
|
20
|
+
model?: string;
|
|
21
|
+
temperature?: number;
|
|
22
|
+
};
|
|
23
|
+
run?: {
|
|
24
|
+
max_turns?: number;
|
|
25
|
+
timeout_mins?: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Error thrown when an agent definition is invalid or cannot be loaded.
|
|
30
|
+
*/
|
|
31
|
+
export declare class AgentLoadError extends Error {
|
|
32
|
+
filePath: string;
|
|
33
|
+
constructor(filePath: string, message: string);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Result of loading agents from a directory.
|
|
37
|
+
*/
|
|
38
|
+
export interface AgentLoadResult {
|
|
39
|
+
agents: AgentDefinition[];
|
|
40
|
+
errors: AgentLoadError[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Parses and validates an agent TOML file.
|
|
44
|
+
*
|
|
45
|
+
* @param filePath Path to the TOML file.
|
|
46
|
+
* @returns The parsed and validated TomlAgentDefinition.
|
|
47
|
+
* @throws AgentLoadError if parsing or validation fails.
|
|
48
|
+
*/
|
|
49
|
+
export declare function parseAgentToml(filePath: string): Promise<TomlAgentDefinition>;
|
|
50
|
+
/**
|
|
51
|
+
* Converts a TomlAgentDefinition DTO to the internal AgentDefinition structure.
|
|
52
|
+
*
|
|
53
|
+
* @param toml The parsed TOML definition.
|
|
54
|
+
* @returns The internal AgentDefinition.
|
|
55
|
+
*/
|
|
56
|
+
export declare function tomlToAgentDefinition(toml: TomlAgentDefinition): AgentDefinition;
|
|
57
|
+
/**
|
|
58
|
+
* Loads all agents from a specific directory.
|
|
59
|
+
* Ignores non-TOML files and files starting with _.
|
|
60
|
+
*
|
|
61
|
+
* @param dir Directory path to scan.
|
|
62
|
+
* @returns Object containing successfully loaded agents and any errors.
|
|
63
|
+
*/
|
|
64
|
+
export declare function loadAgentsFromDirectory(dir: string): Promise<AgentLoadResult>;
|
|
65
|
+
export {};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import TOML from '@iarna/toml';
|
|
7
|
+
import * as fs from 'node:fs/promises';
|
|
8
|
+
import {} from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { isValidToolName, DELEGATE_TO_AGENT_TOOL_NAME, } from '../tools/tool-names.js';
|
|
12
|
+
/**
|
|
13
|
+
* Error thrown when an agent definition is invalid or cannot be loaded.
|
|
14
|
+
*/
|
|
15
|
+
export class AgentLoadError extends Error {
|
|
16
|
+
filePath;
|
|
17
|
+
constructor(filePath, message) {
|
|
18
|
+
super(`Failed to load agent from ${filePath}: ${message}`);
|
|
19
|
+
this.filePath = filePath;
|
|
20
|
+
this.name = 'AgentLoadError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const tomlSchema = z.object({
|
|
24
|
+
name: z.string().regex(/^[a-z0-9-_]+$/, 'Name must be a valid slug'),
|
|
25
|
+
description: z.string().min(1),
|
|
26
|
+
display_name: z.string().optional(),
|
|
27
|
+
tools: z
|
|
28
|
+
.array(z.string().refine((val) => isValidToolName(val), {
|
|
29
|
+
message: 'Invalid tool name',
|
|
30
|
+
}))
|
|
31
|
+
.optional(),
|
|
32
|
+
prompts: z.object({
|
|
33
|
+
system_prompt: z.string().min(1),
|
|
34
|
+
query: z.string().optional(),
|
|
35
|
+
}),
|
|
36
|
+
model: z
|
|
37
|
+
.object({
|
|
38
|
+
model: z.string().optional(),
|
|
39
|
+
temperature: z.number().optional(),
|
|
40
|
+
})
|
|
41
|
+
.optional(),
|
|
42
|
+
run: z
|
|
43
|
+
.object({
|
|
44
|
+
max_turns: z.number().int().positive().optional(),
|
|
45
|
+
timeout_mins: z.number().int().positive().optional(),
|
|
46
|
+
})
|
|
47
|
+
.optional(),
|
|
48
|
+
});
|
|
49
|
+
/**
|
|
50
|
+
* Parses and validates an agent TOML file.
|
|
51
|
+
*
|
|
52
|
+
* @param filePath Path to the TOML file.
|
|
53
|
+
* @returns The parsed and validated TomlAgentDefinition.
|
|
54
|
+
* @throws AgentLoadError if parsing or validation fails.
|
|
55
|
+
*/
|
|
56
|
+
export async function parseAgentToml(filePath) {
|
|
57
|
+
let content;
|
|
58
|
+
try {
|
|
59
|
+
content = await fs.readFile(filePath, 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
throw new AgentLoadError(filePath, `Could not read file: ${error.message}`);
|
|
63
|
+
}
|
|
64
|
+
let raw;
|
|
65
|
+
try {
|
|
66
|
+
raw = TOML.parse(content);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw new AgentLoadError(filePath, `TOML parsing failed: ${error.message}`);
|
|
70
|
+
}
|
|
71
|
+
const result = tomlSchema.safeParse(raw);
|
|
72
|
+
if (!result.success) {
|
|
73
|
+
const issues = result.error.issues
|
|
74
|
+
.map((i) => `${i.path.join('.')}: ${i.message}`)
|
|
75
|
+
.join(', ');
|
|
76
|
+
throw new AgentLoadError(filePath, `Validation failed: ${issues}`);
|
|
77
|
+
}
|
|
78
|
+
const definition = result.data;
|
|
79
|
+
// Prevent sub-agents from delegating to other agents (to prevent recursion/complexity)
|
|
80
|
+
if (definition.tools?.includes(DELEGATE_TO_AGENT_TOOL_NAME)) {
|
|
81
|
+
throw new AgentLoadError(filePath, `Validation failed: tools list cannot include '${DELEGATE_TO_AGENT_TOOL_NAME}'. Sub-agents cannot delegate to other agents.`);
|
|
82
|
+
}
|
|
83
|
+
return definition;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Converts a TomlAgentDefinition DTO to the internal AgentDefinition structure.
|
|
87
|
+
*
|
|
88
|
+
* @param toml The parsed TOML definition.
|
|
89
|
+
* @returns The internal AgentDefinition.
|
|
90
|
+
*/
|
|
91
|
+
export function tomlToAgentDefinition(toml) {
|
|
92
|
+
// If a model is specified, use it. Otherwise, inherit
|
|
93
|
+
const modelName = toml.model?.model || 'inherit';
|
|
94
|
+
return {
|
|
95
|
+
kind: 'local',
|
|
96
|
+
name: toml.name,
|
|
97
|
+
description: toml.description,
|
|
98
|
+
displayName: toml.display_name,
|
|
99
|
+
promptConfig: {
|
|
100
|
+
systemPrompt: toml.prompts.system_prompt,
|
|
101
|
+
query: toml.prompts.query,
|
|
102
|
+
},
|
|
103
|
+
modelConfig: {
|
|
104
|
+
model: modelName,
|
|
105
|
+
temp: toml.model?.temperature ?? 1,
|
|
106
|
+
top_p: 0.95,
|
|
107
|
+
},
|
|
108
|
+
runConfig: {
|
|
109
|
+
max_turns: toml.run?.max_turns,
|
|
110
|
+
max_time_minutes: toml.run?.timeout_mins || 5,
|
|
111
|
+
},
|
|
112
|
+
toolConfig: toml.tools
|
|
113
|
+
? {
|
|
114
|
+
tools: toml.tools,
|
|
115
|
+
}
|
|
116
|
+
: undefined,
|
|
117
|
+
// Default input config for MVA
|
|
118
|
+
inputConfig: {
|
|
119
|
+
inputs: {
|
|
120
|
+
query: {
|
|
121
|
+
type: 'string',
|
|
122
|
+
description: 'The task for the agent.',
|
|
123
|
+
required: false,
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Loads all agents from a specific directory.
|
|
131
|
+
* Ignores non-TOML files and files starting with _.
|
|
132
|
+
*
|
|
133
|
+
* @param dir Directory path to scan.
|
|
134
|
+
* @returns Object containing successfully loaded agents and any errors.
|
|
135
|
+
*/
|
|
136
|
+
export async function loadAgentsFromDirectory(dir) {
|
|
137
|
+
const result = {
|
|
138
|
+
agents: [],
|
|
139
|
+
errors: [],
|
|
140
|
+
};
|
|
141
|
+
let dirEntries;
|
|
142
|
+
try {
|
|
143
|
+
dirEntries = await fs.readdir(dir, { withFileTypes: true });
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
// If directory doesn't exist, just return empty
|
|
147
|
+
if (error.code === 'ENOENT') {
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
result.errors.push(new AgentLoadError(dir, `Could not list directory: ${error.message}`));
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
const files = dirEntries
|
|
154
|
+
.filter((entry) => entry.isFile() &&
|
|
155
|
+
entry.name.endsWith('.toml') &&
|
|
156
|
+
!entry.name.startsWith('_'))
|
|
157
|
+
.map((entry) => entry.name);
|
|
158
|
+
for (const file of files) {
|
|
159
|
+
const filePath = path.join(dir, file);
|
|
160
|
+
try {
|
|
161
|
+
const toml = await parseAgentToml(filePath);
|
|
162
|
+
const agent = tomlToAgentDefinition(toml);
|
|
163
|
+
result.agents.push(agent);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
if (error instanceof AgentLoadError) {
|
|
167
|
+
result.errors.push(error);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
result.errors.push(new AgentLoadError(filePath, `Unexpected error: ${error.message}`));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=toml-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toml-loader.js","sourceRoot":"","sources":["../../../src/agents/toml-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import * as fs from 'node:fs/promises';
|
|
8
|
+
import * as path from 'node:path';
|
|
9
|
+
import * as os from 'node:os';
|
|
10
|
+
import { parseAgentToml, tomlToAgentDefinition, loadAgentsFromDirectory, AgentLoadError, } from './toml-loader.js';
|
|
11
|
+
import { GEMINI_MODEL_ALIAS_PRO } from '../config/models.js';
|
|
12
|
+
describe('toml-loader', () => {
|
|
13
|
+
let tempDir;
|
|
14
|
+
beforeEach(async () => {
|
|
15
|
+
tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'agent-test-'));
|
|
16
|
+
});
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
if (tempDir) {
|
|
19
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
async function writeAgentToml(content, fileName = 'test.toml') {
|
|
23
|
+
const filePath = path.join(tempDir, fileName);
|
|
24
|
+
await fs.writeFile(filePath, content);
|
|
25
|
+
return filePath;
|
|
26
|
+
}
|
|
27
|
+
describe('parseAgentToml', () => {
|
|
28
|
+
it('should parse a valid MVA TOML file', async () => {
|
|
29
|
+
const filePath = await writeAgentToml(`
|
|
30
|
+
name = "test-agent"
|
|
31
|
+
description = "A test agent"
|
|
32
|
+
[prompts]
|
|
33
|
+
system_prompt = "You are a test agent."
|
|
34
|
+
`);
|
|
35
|
+
const result = await parseAgentToml(filePath);
|
|
36
|
+
expect(result).toEqual({
|
|
37
|
+
name: 'test-agent',
|
|
38
|
+
description: 'A test agent',
|
|
39
|
+
prompts: {
|
|
40
|
+
system_prompt: 'You are a test agent.',
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it('should throw AgentLoadError if file reading fails', async () => {
|
|
45
|
+
const filePath = path.join(tempDir, 'non-existent.toml');
|
|
46
|
+
await expect(parseAgentToml(filePath)).rejects.toThrow(AgentLoadError);
|
|
47
|
+
});
|
|
48
|
+
it('should throw AgentLoadError if TOML parsing fails', async () => {
|
|
49
|
+
const filePath = await writeAgentToml('invalid toml [');
|
|
50
|
+
await expect(parseAgentToml(filePath)).rejects.toThrow(AgentLoadError);
|
|
51
|
+
});
|
|
52
|
+
it('should throw AgentLoadError if validation fails (missing required field)', async () => {
|
|
53
|
+
const filePath = await writeAgentToml(`
|
|
54
|
+
name = "test-agent"
|
|
55
|
+
# missing description
|
|
56
|
+
[prompts]
|
|
57
|
+
system_prompt = "You are a test agent."
|
|
58
|
+
`);
|
|
59
|
+
await expect(parseAgentToml(filePath)).rejects.toThrow(/Validation failed/);
|
|
60
|
+
});
|
|
61
|
+
it('should throw AgentLoadError if name is not a slug', async () => {
|
|
62
|
+
const filePath = await writeAgentToml(`
|
|
63
|
+
name = "Test Agent!"
|
|
64
|
+
description = "A test agent"
|
|
65
|
+
[prompts]
|
|
66
|
+
system_prompt = "You are a test agent."
|
|
67
|
+
`);
|
|
68
|
+
await expect(parseAgentToml(filePath)).rejects.toThrow(/Name must be a valid slug/);
|
|
69
|
+
});
|
|
70
|
+
it('should throw AgentLoadError if delegate_to_agent is included in tools', async () => {
|
|
71
|
+
const filePath = await writeAgentToml(`
|
|
72
|
+
name = "test-agent"
|
|
73
|
+
description = "A test agent"
|
|
74
|
+
tools = ["run_shell_command", "delegate_to_agent"]
|
|
75
|
+
[prompts]
|
|
76
|
+
system_prompt = "You are a test agent."
|
|
77
|
+
`);
|
|
78
|
+
await expect(parseAgentToml(filePath)).rejects.toThrow(/tools list cannot include 'delegate_to_agent'/);
|
|
79
|
+
});
|
|
80
|
+
it('should throw AgentLoadError if tools contains invalid names', async () => {
|
|
81
|
+
const filePath = await writeAgentToml(`
|
|
82
|
+
name = "test-agent"
|
|
83
|
+
description = "A test agent"
|
|
84
|
+
tools = ["not-a-tool"]
|
|
85
|
+
[prompts]
|
|
86
|
+
system_prompt = "You are a test agent."
|
|
87
|
+
`);
|
|
88
|
+
await expect(parseAgentToml(filePath)).rejects.toThrow(/Validation failed: tools.0: Invalid tool name/);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('tomlToAgentDefinition', () => {
|
|
92
|
+
it('should convert valid TOML to AgentDefinition with defaults', () => {
|
|
93
|
+
const toml = {
|
|
94
|
+
name: 'test-agent',
|
|
95
|
+
description: 'A test agent',
|
|
96
|
+
prompts: {
|
|
97
|
+
system_prompt: 'You are a test agent.',
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
const result = tomlToAgentDefinition(toml);
|
|
101
|
+
expect(result).toMatchObject({
|
|
102
|
+
name: 'test-agent',
|
|
103
|
+
description: 'A test agent',
|
|
104
|
+
promptConfig: {
|
|
105
|
+
systemPrompt: 'You are a test agent.',
|
|
106
|
+
},
|
|
107
|
+
modelConfig: {
|
|
108
|
+
model: 'inherit',
|
|
109
|
+
top_p: 0.95,
|
|
110
|
+
},
|
|
111
|
+
runConfig: {
|
|
112
|
+
max_time_minutes: 5,
|
|
113
|
+
},
|
|
114
|
+
inputConfig: {
|
|
115
|
+
inputs: {
|
|
116
|
+
query: {
|
|
117
|
+
type: 'string',
|
|
118
|
+
required: false,
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
it('should pass through model aliases', () => {
|
|
125
|
+
const toml = {
|
|
126
|
+
name: 'test-agent',
|
|
127
|
+
description: 'A test agent',
|
|
128
|
+
model: {
|
|
129
|
+
model: GEMINI_MODEL_ALIAS_PRO,
|
|
130
|
+
},
|
|
131
|
+
prompts: {
|
|
132
|
+
system_prompt: 'You are a test agent.',
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
const result = tomlToAgentDefinition(toml);
|
|
136
|
+
expect(result.modelConfig.model).toBe(GEMINI_MODEL_ALIAS_PRO);
|
|
137
|
+
});
|
|
138
|
+
it('should pass through unknown model names (e.g. auto)', () => {
|
|
139
|
+
const toml = {
|
|
140
|
+
name: 'test-agent',
|
|
141
|
+
description: 'A test agent',
|
|
142
|
+
model: {
|
|
143
|
+
model: 'auto',
|
|
144
|
+
},
|
|
145
|
+
prompts: {
|
|
146
|
+
system_prompt: 'You are a test agent.',
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
const result = tomlToAgentDefinition(toml);
|
|
150
|
+
expect(result.modelConfig.model).toBe('auto');
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
describe('loadAgentsFromDirectory', () => {
|
|
154
|
+
it('should load definitions from a directory', async () => {
|
|
155
|
+
await writeAgentToml(`
|
|
156
|
+
name = "agent-1"
|
|
157
|
+
description = "Agent 1"
|
|
158
|
+
[prompts]
|
|
159
|
+
system_prompt = "Prompt 1"
|
|
160
|
+
`, 'valid.toml');
|
|
161
|
+
// Create a non-TOML file
|
|
162
|
+
await fs.writeFile(path.join(tempDir, 'other.txt'), 'content');
|
|
163
|
+
// Create a hidden file
|
|
164
|
+
await writeAgentToml(`
|
|
165
|
+
name = "hidden"
|
|
166
|
+
description = "Hidden"
|
|
167
|
+
[prompts]
|
|
168
|
+
system_prompt = "Hidden"
|
|
169
|
+
`, '_hidden.toml');
|
|
170
|
+
const result = await loadAgentsFromDirectory(tempDir);
|
|
171
|
+
expect(result.agents).toHaveLength(1);
|
|
172
|
+
expect(result.agents[0].name).toBe('agent-1');
|
|
173
|
+
expect(result.errors).toHaveLength(0);
|
|
174
|
+
});
|
|
175
|
+
it('should return empty result if directory does not exist', async () => {
|
|
176
|
+
const nonExistentDir = path.join(tempDir, 'does-not-exist');
|
|
177
|
+
const result = await loadAgentsFromDirectory(nonExistentDir);
|
|
178
|
+
expect(result.agents).toHaveLength(0);
|
|
179
|
+
expect(result.errors).toHaveLength(0);
|
|
180
|
+
});
|
|
181
|
+
it('should capture errors for malformed individual files', async () => {
|
|
182
|
+
// Create a malformed TOML file
|
|
183
|
+
await writeAgentToml('invalid toml [', 'malformed.toml');
|
|
184
|
+
const result = await loadAgentsFromDirectory(tempDir);
|
|
185
|
+
expect(result.agents).toHaveLength(0);
|
|
186
|
+
expect(result.errors).toHaveLength(1);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=toml-loader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toml-loader.test.js","sourceRoot":"","sources":["../../../src/agents/toml-loader.test.ts"],"names":[],"mappings":"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"}
|