@google/gemini-cli-core 0.8.0-nightly.20250930.ddcbd0c2 → 0.8.0-preview.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/src/agents/codebase-investigator.d.ts +11 -0
  2. package/dist/src/agents/codebase-investigator.js +73 -0
  3. package/dist/src/agents/codebase-investigator.js.map +1 -0
  4. package/dist/src/agents/executor.d.ts +88 -0
  5. package/dist/src/agents/executor.js +417 -0
  6. package/dist/src/agents/executor.js.map +1 -0
  7. package/dist/src/agents/executor.test.d.ts +6 -0
  8. package/dist/src/agents/executor.test.js +419 -0
  9. package/dist/src/agents/executor.test.js.map +1 -0
  10. package/dist/src/agents/invocation.d.ts +43 -0
  11. package/dist/src/agents/invocation.js +100 -0
  12. package/dist/src/agents/invocation.js.map +1 -0
  13. package/dist/src/agents/invocation.test.d.ts +6 -0
  14. package/dist/src/agents/invocation.test.js +206 -0
  15. package/dist/src/agents/invocation.test.js.map +1 -0
  16. package/dist/src/agents/registry.d.ts +35 -0
  17. package/dist/src/agents/registry.js +58 -0
  18. package/dist/src/agents/registry.js.map +1 -0
  19. package/dist/src/agents/registry.test.d.ts +6 -0
  20. package/dist/src/agents/registry.test.js +146 -0
  21. package/dist/src/agents/registry.test.js.map +1 -0
  22. package/dist/src/agents/schema-utils.d.ts +39 -0
  23. package/dist/src/agents/schema-utils.js +57 -0
  24. package/dist/src/agents/schema-utils.js.map +1 -0
  25. package/dist/src/agents/schema-utils.test.d.ts +6 -0
  26. package/dist/src/agents/schema-utils.test.js +144 -0
  27. package/dist/src/agents/schema-utils.test.js.map +1 -0
  28. package/dist/src/agents/subagent-tool-wrapper.d.ts +36 -0
  29. package/dist/src/agents/subagent-tool-wrapper.js +47 -0
  30. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -0
  31. package/dist/src/agents/subagent-tool-wrapper.test.d.ts +6 -0
  32. package/dist/src/agents/subagent-tool-wrapper.test.js +105 -0
  33. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -0
  34. package/dist/src/agents/types.d.ts +116 -0
  35. package/dist/src/agents/types.js +17 -0
  36. package/dist/src/agents/types.js.map +1 -0
  37. package/dist/src/agents/utils.d.ts +15 -0
  38. package/dist/src/agents/utils.js +29 -0
  39. package/dist/src/agents/utils.js.map +1 -0
  40. package/dist/src/agents/utils.test.d.ts +6 -0
  41. package/dist/src/agents/utils.test.js +87 -0
  42. package/dist/src/agents/utils.test.js.map +1 -0
  43. package/dist/src/generated/git-commit.d.ts +2 -2
  44. package/dist/src/generated/git-commit.js +2 -2
  45. package/dist/src/generated/git-commit.js.map +1 -1
  46. package/dist/src/ide/detect-ide.d.ts +1 -0
  47. package/dist/src/ide/detect-ide.js +4 -1
  48. package/dist/src/ide/detect-ide.js.map +1 -1
  49. package/dist/src/services/shellExecutionService.d.ts +2 -0
  50. package/dist/src/services/shellExecutionService.js +48 -7
  51. package/dist/src/services/shellExecutionService.js.map +1 -1
  52. package/dist/src/services/shellExecutionService.test.js +13 -4
  53. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  54. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +4 -1
  55. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  56. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +18 -0
  57. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  58. package/dist/src/telemetry/constants.d.ts +0 -24
  59. package/dist/src/telemetry/constants.js +0 -25
  60. package/dist/src/telemetry/constants.js.map +1 -1
  61. package/dist/src/telemetry/loggers.js +42 -9
  62. package/dist/src/telemetry/loggers.js.map +1 -1
  63. package/dist/src/telemetry/loggers.test.js +39 -8
  64. package/dist/src/telemetry/loggers.test.js.map +1 -1
  65. package/dist/src/telemetry/metrics.d.ts +278 -19
  66. package/dist/src/telemetry/metrics.js +303 -235
  67. package/dist/src/telemetry/metrics.js.map +1 -1
  68. package/dist/src/telemetry/metrics.test.js +191 -54
  69. package/dist/src/telemetry/metrics.test.js.map +1 -1
  70. package/dist/src/tools/smart-edit.js +56 -0
  71. package/dist/src/tools/smart-edit.js.map +1 -1
  72. package/dist/src/tools/smart-edit.test.js +19 -0
  73. package/dist/src/tools/smart-edit.test.js.map +1 -1
  74. package/dist/src/utils/llm-edit-fixer.js +10 -1
  75. package/dist/src/utils/llm-edit-fixer.js.map +1 -1
  76. package/dist/src/utils/llm-edit-fixer.test.js +81 -0
  77. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
  78. package/dist/src/utils/memoryImportProcessor.js +13 -20
  79. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  80. package/dist/src/utils/memoryImportProcessor.test.js +14 -0
  81. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  82. package/dist/src/utils/terminalSerializer.d.ts +1 -4
  83. package/dist/src/utils/terminalSerializer.js +3 -3
  84. package/dist/src/utils/terminalSerializer.js.map +1 -1
  85. package/dist/tsconfig.tsbuildinfo +1 -1
  86. package/package.json +1 -1
@@ -0,0 +1,206 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
7
+ import { SubagentInvocation } from './invocation.js';
8
+ import { AgentExecutor } from './executor.js';
9
+ import { AgentTerminateMode } from './types.js';
10
+ import { makeFakeConfig } from '../test-utils/config.js';
11
+ import { ToolErrorType } from '../tools/tool-error.js';
12
+ vi.mock('./executor.js');
13
+ const MockAgentExecutor = vi.mocked(AgentExecutor);
14
+ let mockConfig;
15
+ const testDefinition = {
16
+ name: 'MockAgent',
17
+ description: 'A mock agent.',
18
+ inputConfig: {
19
+ inputs: {
20
+ task: { type: 'string', required: true, description: 'task' },
21
+ priority: { type: 'number', required: false, description: 'prio' },
22
+ },
23
+ },
24
+ modelConfig: { model: 'test', temp: 0, top_p: 1 },
25
+ runConfig: { max_time_minutes: 1 },
26
+ promptConfig: { systemPrompt: 'test' },
27
+ };
28
+ describe('SubagentInvocation', () => {
29
+ let mockExecutorInstance;
30
+ beforeEach(() => {
31
+ vi.clearAllMocks();
32
+ mockConfig = makeFakeConfig();
33
+ mockExecutorInstance = {
34
+ run: vi.fn(),
35
+ definition: testDefinition,
36
+ };
37
+ MockAgentExecutor.create.mockResolvedValue(mockExecutorInstance);
38
+ });
39
+ describe('getDescription', () => {
40
+ it('should format the description with inputs', () => {
41
+ const params = { task: 'Analyze data', priority: 5 };
42
+ const invocation = new SubagentInvocation(params, testDefinition, mockConfig);
43
+ const description = invocation.getDescription();
44
+ expect(description).toBe("Running subagent 'MockAgent' with inputs: { task: Analyze data, priority: 5 }");
45
+ });
46
+ it('should truncate long input values', () => {
47
+ const longTask = 'A'.repeat(100);
48
+ const params = { task: longTask };
49
+ const invocation = new SubagentInvocation(params, testDefinition, mockConfig);
50
+ const description = invocation.getDescription();
51
+ // Default INPUT_PREVIEW_MAX_LENGTH is 50
52
+ expect(description).toBe(`Running subagent 'MockAgent' with inputs: { task: ${'A'.repeat(50)} }`);
53
+ });
54
+ it('should truncate the overall description if it exceeds the limit', () => {
55
+ // Create a definition and inputs that result in a very long description
56
+ const longNameDef = {
57
+ ...testDefinition,
58
+ name: 'VeryLongAgentNameThatTakesUpSpace',
59
+ };
60
+ const params = {};
61
+ for (let i = 0; i < 20; i++) {
62
+ params[`input${i}`] = `value${i}`;
63
+ }
64
+ const invocation = new SubagentInvocation(params, longNameDef, mockConfig);
65
+ const description = invocation.getDescription();
66
+ // Default DESCRIPTION_MAX_LENGTH is 200
67
+ expect(description.length).toBe(200);
68
+ expect(description.startsWith("Running subagent 'VeryLongAgentNameThatTakesUpSpace'")).toBe(true);
69
+ });
70
+ });
71
+ describe('execute', () => {
72
+ let signal;
73
+ let updateOutput;
74
+ const params = { task: 'Execute task' };
75
+ let invocation;
76
+ beforeEach(() => {
77
+ signal = new AbortController().signal;
78
+ updateOutput = vi.fn();
79
+ invocation = new SubagentInvocation(params, testDefinition, mockConfig);
80
+ });
81
+ it('should initialize and run the executor successfully', async () => {
82
+ const mockOutput = {
83
+ result: 'Analysis complete.',
84
+ terminate_reason: AgentTerminateMode.GOAL,
85
+ };
86
+ mockExecutorInstance.run.mockResolvedValue(mockOutput);
87
+ const result = await invocation.execute(signal, updateOutput);
88
+ expect(MockAgentExecutor.create).toHaveBeenCalledWith(testDefinition, mockConfig, expect.any(Function));
89
+ expect(updateOutput).toHaveBeenCalledWith('Subagent starting...\n');
90
+ expect(mockExecutorInstance.run).toHaveBeenCalledWith(params, signal);
91
+ expect(result.llmContent).toEqual([
92
+ {
93
+ text: expect.stringContaining("Subagent 'MockAgent' finished.\nTermination Reason: GOAL\nResult:\nAnalysis complete."),
94
+ },
95
+ ]);
96
+ expect(result.returnDisplay).toContain('Result:\nAnalysis complete.');
97
+ expect(result.returnDisplay).toContain('Termination Reason:\n GOAL');
98
+ });
99
+ it('should stream THOUGHT_CHUNK activities from the executor', async () => {
100
+ mockExecutorInstance.run.mockImplementation(async () => {
101
+ const onActivity = MockAgentExecutor.create.mock.calls[0][2];
102
+ if (onActivity) {
103
+ onActivity({
104
+ isSubagentActivityEvent: true,
105
+ agentName: 'MockAgent',
106
+ type: 'THOUGHT_CHUNK',
107
+ data: { text: 'Analyzing...' },
108
+ });
109
+ onActivity({
110
+ isSubagentActivityEvent: true,
111
+ agentName: 'MockAgent',
112
+ type: 'THOUGHT_CHUNK',
113
+ data: { text: ' Still thinking.' },
114
+ });
115
+ }
116
+ return { result: 'Done', terminate_reason: AgentTerminateMode.GOAL };
117
+ });
118
+ await invocation.execute(signal, updateOutput);
119
+ expect(updateOutput).toHaveBeenCalledWith('Subagent starting...\n');
120
+ expect(updateOutput).toHaveBeenCalledWith('🤖💭 Analyzing...');
121
+ expect(updateOutput).toHaveBeenCalledWith('🤖💭 Still thinking.');
122
+ expect(updateOutput).toHaveBeenCalledTimes(3); // Initial message + 2 thoughts
123
+ });
124
+ it('should NOT stream other activities (e.g., TOOL_CALL_START, ERROR)', async () => {
125
+ mockExecutorInstance.run.mockImplementation(async () => {
126
+ const onActivity = MockAgentExecutor.create.mock.calls[0][2];
127
+ if (onActivity) {
128
+ onActivity({
129
+ isSubagentActivityEvent: true,
130
+ agentName: 'MockAgent',
131
+ type: 'TOOL_CALL_START',
132
+ data: { name: 'ls' },
133
+ });
134
+ onActivity({
135
+ isSubagentActivityEvent: true,
136
+ agentName: 'MockAgent',
137
+ type: 'ERROR',
138
+ data: { error: 'Failed' },
139
+ });
140
+ }
141
+ return { result: 'Done', terminate_reason: AgentTerminateMode.GOAL };
142
+ });
143
+ await invocation.execute(signal, updateOutput);
144
+ // Should only contain the initial "Subagent starting..." message
145
+ expect(updateOutput).toHaveBeenCalledTimes(1);
146
+ expect(updateOutput).toHaveBeenCalledWith('Subagent starting...\n');
147
+ });
148
+ it('should run successfully without an updateOutput callback', async () => {
149
+ mockExecutorInstance.run.mockImplementation(async () => {
150
+ const onActivity = MockAgentExecutor.create.mock.calls[0][2];
151
+ if (onActivity) {
152
+ // Ensure calling activity doesn't crash when updateOutput is undefined
153
+ onActivity({
154
+ isSubagentActivityEvent: true,
155
+ agentName: 'testAgent',
156
+ type: 'THOUGHT_CHUNK',
157
+ data: { text: 'Thinking silently.' },
158
+ });
159
+ }
160
+ return { result: 'Done', terminate_reason: AgentTerminateMode.GOAL };
161
+ });
162
+ // Execute without the optional callback
163
+ const result = await invocation.execute(signal);
164
+ expect(result.error).toBeUndefined();
165
+ expect(result.returnDisplay).toContain('Result:\nDone');
166
+ });
167
+ it('should handle executor run failure', async () => {
168
+ const error = new Error('Model failed during execution.');
169
+ mockExecutorInstance.run.mockRejectedValue(error);
170
+ const result = await invocation.execute(signal, updateOutput);
171
+ expect(result.error).toEqual({
172
+ message: error.message,
173
+ type: ToolErrorType.EXECUTION_FAILED,
174
+ });
175
+ expect(result.returnDisplay).toBe(`Subagent Failed: MockAgent\nError: ${error.message}`);
176
+ expect(result.llmContent).toBe(`Subagent 'MockAgent' failed. Error: ${error.message}`);
177
+ });
178
+ it('should handle executor creation failure', async () => {
179
+ const creationError = new Error('Failed to initialize tools.');
180
+ MockAgentExecutor.create.mockRejectedValue(creationError);
181
+ const result = await invocation.execute(signal, updateOutput);
182
+ expect(mockExecutorInstance.run).not.toHaveBeenCalled();
183
+ expect(result.error).toEqual({
184
+ message: creationError.message,
185
+ type: ToolErrorType.EXECUTION_FAILED,
186
+ });
187
+ expect(result.returnDisplay).toContain(`Error: ${creationError.message}`);
188
+ });
189
+ /**
190
+ * This test verifies that the AbortSignal is correctly propagated and
191
+ * that a rejection from the executor due to abortion is handled gracefully.
192
+ */
193
+ it('should handle abortion signal during execution', async () => {
194
+ const abortError = new Error('Aborted');
195
+ mockExecutorInstance.run.mockRejectedValue(abortError);
196
+ const controller = new AbortController();
197
+ const executePromise = invocation.execute(controller.signal, updateOutput);
198
+ controller.abort();
199
+ const result = await executePromise;
200
+ expect(mockExecutorInstance.run).toHaveBeenCalledWith(params, controller.signal);
201
+ expect(result.error?.message).toBe('Aborted');
202
+ expect(result.error?.type).toBe(ToolErrorType.EXECUTION_FAILED);
203
+ });
204
+ });
205
+ });
206
+ //# sourceMappingURL=invocation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invocation.test.js","sourceRoot":"","sources":["../../../src/agents/invocation.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAe,MAAM,QAAQ,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAM9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvD,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAEzB,MAAM,iBAAiB,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEnD,IAAI,UAAkB,CAAC;AAEvB,MAAM,cAAc,GAAoB;IACtC,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE;QACX,MAAM,EAAE;YACN,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE;YAC7D,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE;SACnE;KACF;IACD,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;IACjD,SAAS,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE;IAClC,YAAY,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE;CACvC,CAAC;AAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,oBAA2C,CAAC;IAEhD,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,UAAU,GAAG,cAAc,EAAE,CAAC;QAE9B,oBAAoB,GAAG;YACrB,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACZ,UAAU,EAAE,cAAc;SACS,CAAC;QAEtC,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,kBAAkB,CACvC,MAAM,EACN,cAAc,EACd,UAAU,CACX,CAAC;YACF,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;YAChD,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CACtB,+EAA+E,CAChF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,IAAI,kBAAkB,CACvC,MAAM,EACN,cAAc,EACd,UAAU,CACX,CAAC;YACF,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;YAChD,yCAAyC;YACzC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CACtB,qDAAqD,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CACxE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,wEAAwE;YACxE,MAAM,WAAW,GAAG;gBAClB,GAAG,cAAc;gBACjB,IAAI,EAAE,mCAAmC;aAC1C,CAAC;YACF,MAAM,MAAM,GAAgB,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;YACpC,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,kBAAkB,CACvC,MAAM,EACN,WAAW,EACX,UAAU,CACX,CAAC;YACF,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,EAAE,CAAC;YAChD,wCAAwC;YACxC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,CACJ,WAAW,CAAC,UAAU,CACpB,sDAAsD,CACvD,CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,IAAI,MAAmB,CAAC;QACxB,IAAI,YAAsC,CAAC;QAC3C,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;QACxC,IAAI,UAA8B,CAAC;QAEnC,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC,MAAM,CAAC;YACtC,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACvB,UAAU,GAAG,IAAI,kBAAkB,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,UAAU,GAAG;gBACjB,MAAM,EAAE,oBAAoB;gBAC5B,gBAAgB,EAAE,kBAAkB,CAAC,IAAI;aAC1C,CAAC;YACF,oBAAoB,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEvD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAE9D,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,oBAAoB,CACnD,cAAc,EACd,UAAU,EACV,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CACrB,CAAC;YACF,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;YAEpE,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEtE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;gBAChC;oBACE,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAC3B,uFAAuF,CACxF;iBACF;aACF,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,6BAA6B,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,oBAAoB,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBACrD,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE7D,IAAI,UAAU,EAAE,CAAC;oBACf,UAAU,CAAC;wBACT,uBAAuB,EAAE,IAAI;wBAC7B,SAAS,EAAE,WAAW;wBACtB,IAAI,EAAE,eAAe;wBACrB,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;qBACN,CAAC,CAAC;oBAC5B,UAAU,CAAC;wBACT,uBAAuB,EAAE,IAAI;wBAC7B,SAAS,EAAE,WAAW;wBACtB,IAAI,EAAE,eAAe;wBACrB,IAAI,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;qBACV,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC;YACvE,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAE/C,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;YACpE,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;YAC/D,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,uBAAuB,CAAC,CAAC;YACnE,MAAM,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;QAChF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;YACjF,oBAAoB,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBACrD,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE7D,IAAI,UAAU,EAAE,CAAC;oBACf,UAAU,CAAC;wBACT,uBAAuB,EAAE,IAAI;wBAC7B,SAAS,EAAE,WAAW;wBACtB,IAAI,EAAE,iBAAiB;wBACvB,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;qBACI,CAAC,CAAC;oBAC5B,UAAU,CAAC;wBACT,uBAAuB,EAAE,IAAI;wBAC7B,SAAS,EAAE,WAAW;wBACtB,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;qBACD,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC;YACvE,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAE/C,iEAAiE;YACjE,MAAM,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,oBAAoB,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBACrD,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,IAAI,UAAU,EAAE,CAAC;oBACf,uEAAuE;oBACvE,UAAU,CAAC;wBACT,uBAAuB,EAAE,IAAI;wBAC7B,SAAS,EAAE,WAAW;wBACtB,IAAI,EAAE,eAAe;wBACrB,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE;qBACZ,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,IAAI,EAAE,CAAC;YACvE,CAAC,CAAC,CAAC;YAEH,wCAAwC;YACxC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAC1D,oBAAoB,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAElD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;gBAC3B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,aAAa,CAAC,gBAAgB;aACrC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAC/B,sCAAsC,KAAK,CAAC,OAAO,EAAE,CACtD,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAC5B,uCAAuC,KAAK,CAAC,OAAO,EAAE,CACvD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC/D,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAE1D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAE9D,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACxD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;gBAC3B,OAAO,EAAE,aAAa,CAAC,OAAO;gBAC9B,IAAI,EAAE,aAAa,CAAC,gBAAgB;aACrC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,UAAU,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH;;;WAGG;QACH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;YACxC,oBAAoB,CAAC,GAAG,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEvD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CACvC,UAAU,CAAC,MAAM,EACjB,YAAY,CACb,CAAC;YACF,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;YAEpC,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,oBAAoB,CACnD,MAAM,EACN,UAAU,CAAC,MAAM,CAClB,CAAC;YACF,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { Config } from '../config/config.js';
7
+ import type { AgentDefinition } from './types.js';
8
+ /**
9
+ * Manages the discovery, loading, validation, and registration of
10
+ * AgentDefinitions.
11
+ */
12
+ export declare class AgentRegistry {
13
+ private readonly config;
14
+ private readonly agents;
15
+ constructor(config: Config);
16
+ /**
17
+ * Discovers and loads agents.
18
+ */
19
+ initialize(): Promise<void>;
20
+ private loadBuiltInAgents;
21
+ /**
22
+ * Registers an agent definition. If an agent with the same name exists,
23
+ * it will be overwritten, respecting the precedence established by the
24
+ * initialization order.
25
+ */
26
+ protected registerAgent(definition: AgentDefinition): void;
27
+ /**
28
+ * Retrieves an agent definition by name.
29
+ */
30
+ getDefinition(name: string): AgentDefinition | undefined;
31
+ /**
32
+ * Returns all active agent definitions.
33
+ */
34
+ getAllDefinitions(): AgentDefinition[];
35
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { CodebaseInvestigatorAgent } from './codebase-investigator.js';
7
+ /**
8
+ * Manages the discovery, loading, validation, and registration of
9
+ * AgentDefinitions.
10
+ */
11
+ export class AgentRegistry {
12
+ config;
13
+ agents = new Map();
14
+ constructor(config) {
15
+ this.config = config;
16
+ }
17
+ /**
18
+ * Discovers and loads agents.
19
+ */
20
+ async initialize() {
21
+ this.loadBuiltInAgents();
22
+ if (this.config.getDebugMode()) {
23
+ console.log(`[AgentRegistry] Initialized with ${this.agents.size} agents.`);
24
+ }
25
+ }
26
+ loadBuiltInAgents() {
27
+ this.registerAgent(CodebaseInvestigatorAgent);
28
+ }
29
+ /**
30
+ * Registers an agent definition. If an agent with the same name exists,
31
+ * it will be overwritten, respecting the precedence established by the
32
+ * initialization order.
33
+ */
34
+ registerAgent(definition) {
35
+ // Basic validation
36
+ if (!definition.name || !definition.description) {
37
+ console.warn(`[AgentRegistry] Skipping invalid agent definition. Missing name or description.`);
38
+ return;
39
+ }
40
+ if (this.agents.has(definition.name) && this.config.getDebugMode()) {
41
+ console.log(`[AgentRegistry] Overriding agent '${definition.name}'`);
42
+ }
43
+ this.agents.set(definition.name, definition);
44
+ }
45
+ /**
46
+ * Retrieves an agent definition by name.
47
+ */
48
+ getDefinition(name) {
49
+ return this.agents.get(name);
50
+ }
51
+ /**
52
+ * Returns all active agent definitions.
53
+ */
54
+ getAllDefinitions() {
55
+ return Array.from(this.agents.values());
56
+ }
57
+ }
58
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/agents/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEvE;;;GAGG;AACH,MAAM,OAAO,aAAa;IAGK;IAFZ,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE7D,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CACT,oCAAoC,IAAI,CAAC,MAAM,CAAC,IAAI,UAAU,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACO,aAAa,CAAC,UAA2B;QACjD,mBAAmB;QACnB,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAChD,OAAO,CAAC,IAAI,CACV,iFAAiF,CAClF,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,qCAAqC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC;QACvE,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;CACF"}
@@ -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,146 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import { AgentRegistry } from './registry.js';
8
+ import { makeFakeConfig } from '../test-utils/config.js';
9
+ // A test-only subclass to expose the protected `registerAgent` method.
10
+ class TestableAgentRegistry extends AgentRegistry {
11
+ testRegisterAgent(definition) {
12
+ this.registerAgent(definition);
13
+ }
14
+ }
15
+ // Define mock agent structures for testing registration logic
16
+ const MOCK_AGENT_V1 = {
17
+ name: 'MockAgent',
18
+ description: 'Mock Description V1',
19
+ inputConfig: { inputs: {} },
20
+ modelConfig: { model: 'test', temp: 0, top_p: 1 },
21
+ runConfig: { max_time_minutes: 1 },
22
+ promptConfig: { systemPrompt: 'test' },
23
+ };
24
+ const MOCK_AGENT_V2 = {
25
+ ...MOCK_AGENT_V1,
26
+ description: 'Mock Description V2 (Updated)',
27
+ };
28
+ describe('AgentRegistry', () => {
29
+ let mockConfig;
30
+ let registry;
31
+ beforeEach(() => {
32
+ // Default configuration (debugMode: false)
33
+ mockConfig = makeFakeConfig();
34
+ registry = new TestableAgentRegistry(mockConfig);
35
+ });
36
+ afterEach(() => {
37
+ vi.restoreAllMocks(); // Restore spies after each test
38
+ });
39
+ describe('initialize', () => {
40
+ // TODO: Add this test once we actually have a built-in agent configured.
41
+ // it('should load built-in agents upon initialization', async () => {
42
+ // expect(registry.getAllDefinitions()).toHaveLength(0);
43
+ // await registry.initialize();
44
+ // // There are currently no built-in agents.
45
+ // expect(registry.getAllDefinitions()).toEqual([]);
46
+ // });
47
+ it('should log the count of loaded agents in debug mode', async () => {
48
+ const debugConfig = makeFakeConfig({ debugMode: true });
49
+ const debugRegistry = new TestableAgentRegistry(debugConfig);
50
+ const consoleLogSpy = vi
51
+ .spyOn(console, 'log')
52
+ .mockImplementation(() => { });
53
+ await debugRegistry.initialize();
54
+ const agentCount = debugRegistry.getAllDefinitions().length;
55
+ expect(consoleLogSpy).toHaveBeenCalledWith(`[AgentRegistry] Initialized with ${agentCount} agents.`);
56
+ });
57
+ });
58
+ describe('registration logic', () => {
59
+ it('should register a valid agent definition', () => {
60
+ registry.testRegisterAgent(MOCK_AGENT_V1);
61
+ expect(registry.getDefinition('MockAgent')).toEqual(MOCK_AGENT_V1);
62
+ });
63
+ it('should handle special characters in agent names', () => {
64
+ const specialAgent = {
65
+ ...MOCK_AGENT_V1,
66
+ name: 'Agent-123_$pecial.v2',
67
+ };
68
+ registry.testRegisterAgent(specialAgent);
69
+ expect(registry.getDefinition('Agent-123_$pecial.v2')).toEqual(specialAgent);
70
+ });
71
+ it('should reject an agent definition missing a name', () => {
72
+ const invalidAgent = { ...MOCK_AGENT_V1, name: '' };
73
+ const consoleWarnSpy = vi
74
+ .spyOn(console, 'warn')
75
+ .mockImplementation(() => { });
76
+ registry.testRegisterAgent(invalidAgent);
77
+ expect(registry.getDefinition('MockAgent')).toBeUndefined();
78
+ expect(consoleWarnSpy).toHaveBeenCalledWith('[AgentRegistry] Skipping invalid agent definition. Missing name or description.');
79
+ });
80
+ it('should reject an agent definition missing a description', () => {
81
+ const invalidAgent = { ...MOCK_AGENT_V1, description: '' };
82
+ const consoleWarnSpy = vi
83
+ .spyOn(console, 'warn')
84
+ .mockImplementation(() => { });
85
+ registry.testRegisterAgent(invalidAgent);
86
+ expect(registry.getDefinition('MockAgent')).toBeUndefined();
87
+ expect(consoleWarnSpy).toHaveBeenCalledWith('[AgentRegistry] Skipping invalid agent definition. Missing name or description.');
88
+ });
89
+ it('should overwrite an existing agent definition', () => {
90
+ registry.testRegisterAgent(MOCK_AGENT_V1);
91
+ expect(registry.getDefinition('MockAgent')?.description).toBe('Mock Description V1');
92
+ registry.testRegisterAgent(MOCK_AGENT_V2);
93
+ expect(registry.getDefinition('MockAgent')?.description).toBe('Mock Description V2 (Updated)');
94
+ expect(registry.getAllDefinitions()).toHaveLength(1);
95
+ });
96
+ it('should log overwrites when in debug mode', () => {
97
+ const debugConfig = makeFakeConfig({ debugMode: true });
98
+ const debugRegistry = new TestableAgentRegistry(debugConfig);
99
+ const consoleLogSpy = vi
100
+ .spyOn(console, 'log')
101
+ .mockImplementation(() => { });
102
+ debugRegistry.testRegisterAgent(MOCK_AGENT_V1);
103
+ debugRegistry.testRegisterAgent(MOCK_AGENT_V2);
104
+ expect(consoleLogSpy).toHaveBeenCalledWith(`[AgentRegistry] Overriding agent 'MockAgent'`);
105
+ });
106
+ it('should not log overwrites when not in debug mode', () => {
107
+ const consoleLogSpy = vi
108
+ .spyOn(console, 'log')
109
+ .mockImplementation(() => { });
110
+ registry.testRegisterAgent(MOCK_AGENT_V1);
111
+ registry.testRegisterAgent(MOCK_AGENT_V2);
112
+ expect(consoleLogSpy).not.toHaveBeenCalledWith(`[AgentRegistry] Overriding agent 'MockAgent'`);
113
+ });
114
+ it('should handle bulk registrations correctly', async () => {
115
+ const promises = Array.from({ length: 100 }, (_, i) => Promise.resolve(registry.testRegisterAgent({
116
+ ...MOCK_AGENT_V1,
117
+ name: `Agent${i}`,
118
+ })));
119
+ await Promise.all(promises);
120
+ expect(registry.getAllDefinitions()).toHaveLength(100);
121
+ });
122
+ });
123
+ describe('accessors', () => {
124
+ const ANOTHER_AGENT = {
125
+ ...MOCK_AGENT_V1,
126
+ name: 'AnotherAgent',
127
+ };
128
+ beforeEach(() => {
129
+ registry.testRegisterAgent(MOCK_AGENT_V1);
130
+ registry.testRegisterAgent(ANOTHER_AGENT);
131
+ });
132
+ it('getDefinition should return the correct definition', () => {
133
+ expect(registry.getDefinition('MockAgent')).toEqual(MOCK_AGENT_V1);
134
+ expect(registry.getDefinition('AnotherAgent')).toEqual(ANOTHER_AGENT);
135
+ });
136
+ it('getDefinition should return undefined for unknown agents', () => {
137
+ expect(registry.getDefinition('NonExistentAgent')).toBeUndefined();
138
+ });
139
+ it('getAllDefinitions should return all registered definitions', () => {
140
+ const all = registry.getAllDefinitions();
141
+ expect(all).toHaveLength(2);
142
+ expect(all).toEqual(expect.arrayContaining([MOCK_AGENT_V1, ANOTHER_AGENT]));
143
+ });
144
+ });
145
+ });
146
+ //# sourceMappingURL=registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../../src/agents/registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { InputConfig } from './types.js';
7
+ /**
8
+ * Defines the structure for a JSON Schema object, used for tool function
9
+ * declarations.
10
+ */
11
+ interface JsonSchemaObject {
12
+ type: 'object';
13
+ properties: Record<string, JsonSchemaProperty>;
14
+ required?: string[];
15
+ }
16
+ /**
17
+ * Defines the structure for a property within a {@link JsonSchemaObject}.
18
+ */
19
+ interface JsonSchemaProperty {
20
+ type: 'string' | 'number' | 'integer' | 'boolean' | 'array';
21
+ description: string;
22
+ items?: {
23
+ type: 'string' | 'number';
24
+ };
25
+ }
26
+ /**
27
+ * Converts an internal `InputConfig` definition into a standard JSON Schema
28
+ * object suitable for a tool's `FunctionDeclaration`.
29
+ *
30
+ * This utility ensures that the configuration for a subagent's inputs is
31
+ * correctly translated into the format expected by the generative model.
32
+ *
33
+ * @param inputConfig The internal `InputConfig` to convert.
34
+ * @returns A JSON Schema object representing the inputs.
35
+ * @throws An `Error` if an unsupported input type is encountered, ensuring
36
+ * configuration errors are caught early.
37
+ */
38
+ export declare function convertInputConfigToJsonSchema(inputConfig: InputConfig): JsonSchemaObject;
39
+ export {};
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Converts an internal `InputConfig` definition into a standard JSON Schema
8
+ * object suitable for a tool's `FunctionDeclaration`.
9
+ *
10
+ * This utility ensures that the configuration for a subagent's inputs is
11
+ * correctly translated into the format expected by the generative model.
12
+ *
13
+ * @param inputConfig The internal `InputConfig` to convert.
14
+ * @returns A JSON Schema object representing the inputs.
15
+ * @throws An `Error` if an unsupported input type is encountered, ensuring
16
+ * configuration errors are caught early.
17
+ */
18
+ export function convertInputConfigToJsonSchema(inputConfig) {
19
+ const properties = {};
20
+ const required = [];
21
+ for (const [name, definition] of Object.entries(inputConfig.inputs)) {
22
+ const schemaProperty = {
23
+ description: definition.description,
24
+ };
25
+ switch (definition.type) {
26
+ case 'string':
27
+ case 'number':
28
+ case 'integer':
29
+ case 'boolean':
30
+ schemaProperty.type = definition.type;
31
+ break;
32
+ case 'string[]':
33
+ schemaProperty.type = 'array';
34
+ schemaProperty.items = { type: 'string' };
35
+ break;
36
+ case 'number[]':
37
+ schemaProperty.type = 'array';
38
+ schemaProperty.items = { type: 'number' };
39
+ break;
40
+ default: {
41
+ const exhaustiveCheck = definition.type;
42
+ throw new Error(`Unsupported input type '${exhaustiveCheck}' for parameter '${name}'. ` +
43
+ 'Supported types: string, number, integer, boolean, string[], number[]');
44
+ }
45
+ }
46
+ properties[name] = schemaProperty;
47
+ if (definition.required) {
48
+ required.push(name);
49
+ }
50
+ }
51
+ return {
52
+ type: 'object',
53
+ properties,
54
+ required: required.length > 0 ? required : undefined,
55
+ };
56
+ }
57
+ //# sourceMappingURL=schema-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-utils.js","sourceRoot":"","sources":["../../../src/agents/schema-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuBH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,8BAA8B,CAC5C,WAAwB;IAExB,MAAM,UAAU,GAAuC,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,MAAM,cAAc,GAAgC;YAClD,WAAW,EAAE,UAAU,CAAC,WAAW;SACpC,CAAC;QAEF,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;YACxB,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ,CAAC;YACd,KAAK,SAAS,CAAC;YACf,KAAK,SAAS;gBACZ,cAAc,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;gBACtC,MAAM;YAER,KAAK,UAAU;gBACb,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC;gBAC9B,cAAc,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAC1C,MAAM;YAER,KAAK,UAAU;gBACb,cAAc,CAAC,IAAI,GAAG,OAAO,CAAC;gBAC9B,cAAc,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAC1C,MAAM;YAER,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,eAAe,GAAU,UAAU,CAAC,IAAI,CAAC;gBAC/C,MAAM,IAAI,KAAK,CACb,2BAA2B,eAAe,oBAAoB,IAAI,KAAK;oBACrE,uEAAuE,CAC1E,CAAC;YACJ,CAAC;QACH,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,GAAG,cAAoC,CAAC;QAExD,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,UAAU;QACV,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;KACrD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};