@google/gemini-cli-a2a-server 0.10.0-nightly.20251014.0a3e492e
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/README.md +5 -0
- package/dist/.last_build +0 -0
- package/dist/a2a-server.mjs +354316 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/src/agent/executor.d.ts +40 -0
- package/dist/src/agent/executor.js +406 -0
- package/dist/src/agent/executor.js.map +1 -0
- package/dist/src/agent/task.d.ts +54 -0
- package/dist/src/agent/task.js +652 -0
- package/dist/src/agent/task.js.map +1 -0
- package/dist/src/agent/task.test.d.ts +6 -0
- package/dist/src/agent/task.test.js +44 -0
- package/dist/src/agent/task.test.js.map +1 -0
- package/dist/src/config/config.d.ts +14 -0
- package/dist/src/config/config.js +150 -0
- package/dist/src/config/config.js.map +1 -0
- package/dist/src/config/extension.d.ts +11 -0
- package/dist/src/config/extension.js +104 -0
- package/dist/src/config/extension.js.map +1 -0
- package/dist/src/config/settings.d.ts +38 -0
- package/dist/src/config/settings.js +102 -0
- package/dist/src/config/settings.js.map +1 -0
- package/dist/src/http/app.d.ts +8 -0
- package/dist/src/http/app.js +170 -0
- package/dist/src/http/app.js.map +1 -0
- package/dist/src/http/app.test.d.ts +6 -0
- package/dist/src/http/app.test.js +520 -0
- package/dist/src/http/app.test.js.map +1 -0
- package/dist/src/http/endpoints.test.d.ts +6 -0
- package/dist/src/http/endpoints.test.js +138 -0
- package/dist/src/http/endpoints.test.js.map +1 -0
- package/dist/src/http/requestStorage.d.ts +10 -0
- package/dist/src/http/requestStorage.js +8 -0
- package/dist/src/http/requestStorage.js.map +1 -0
- package/dist/src/http/server.d.ts +7 -0
- package/dist/src/http/server.js +26 -0
- package/dist/src/http/server.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/persistence/gcs.d.ts +24 -0
- package/dist/src/persistence/gcs.js +238 -0
- package/dist/src/persistence/gcs.js.map +1 -0
- package/dist/src/persistence/gcs.test.d.ts +6 -0
- package/dist/src/persistence/gcs.test.js +265 -0
- package/dist/src/persistence/gcs.test.js.map +1 -0
- package/dist/src/types.d.ts +91 -0
- package/dist/src/types.js +44 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/executor_utils.d.ts +7 -0
- package/dist/src/utils/executor_utils.js +41 -0
- package/dist/src/utils/executor_utils.js.map +1 -0
- package/dist/src/utils/logger.d.ts +8 -0
- package/dist/src/utils/logger.js +23 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/testing_utils.d.ts +33 -0
- package/dist/src/utils/testing_utils.js +91 -0
- package/dist/src/utils/testing_utils.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import express from 'express';
|
|
7
|
+
import { DefaultRequestHandler, InMemoryTaskStore } from '@a2a-js/sdk/server';
|
|
8
|
+
import { A2AExpressApp } from '@a2a-js/sdk/server/express'; // Import server components
|
|
9
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
10
|
+
import { logger } from '../utils/logger.js';
|
|
11
|
+
import { GCSTaskStore, NoOpTaskStore } from '../persistence/gcs.js';
|
|
12
|
+
import { CoderAgentExecutor } from '../agent/executor.js';
|
|
13
|
+
import { requestStorage } from './requestStorage.js';
|
|
14
|
+
const coderAgentCard = {
|
|
15
|
+
name: 'Gemini SDLC Agent',
|
|
16
|
+
description: 'An agent that generates code based on natural language instructions and streams file outputs.',
|
|
17
|
+
url: 'http://localhost:41242/',
|
|
18
|
+
provider: {
|
|
19
|
+
organization: 'Google',
|
|
20
|
+
url: 'https://google.com',
|
|
21
|
+
},
|
|
22
|
+
protocolVersion: '0.3.0',
|
|
23
|
+
version: '0.0.2', // Incremented version
|
|
24
|
+
capabilities: {
|
|
25
|
+
streaming: true,
|
|
26
|
+
pushNotifications: false,
|
|
27
|
+
stateTransitionHistory: true,
|
|
28
|
+
},
|
|
29
|
+
securitySchemes: undefined,
|
|
30
|
+
security: undefined,
|
|
31
|
+
defaultInputModes: ['text'],
|
|
32
|
+
defaultOutputModes: ['text'],
|
|
33
|
+
skills: [
|
|
34
|
+
{
|
|
35
|
+
id: 'code_generation',
|
|
36
|
+
name: 'Code Generation',
|
|
37
|
+
description: 'Generates code snippets or complete files based on user requests, streaming the results.',
|
|
38
|
+
tags: ['code', 'development', 'programming'],
|
|
39
|
+
examples: [
|
|
40
|
+
'Write a python function to calculate fibonacci numbers.',
|
|
41
|
+
'Create an HTML file with a basic button that alerts "Hello!" when clicked.',
|
|
42
|
+
],
|
|
43
|
+
inputModes: ['text'],
|
|
44
|
+
outputModes: ['text'],
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
supportsAuthenticatedExtendedCard: false,
|
|
48
|
+
};
|
|
49
|
+
export function updateCoderAgentCardUrl(port) {
|
|
50
|
+
coderAgentCard.url = `http://localhost:${port}/`;
|
|
51
|
+
}
|
|
52
|
+
export async function createApp() {
|
|
53
|
+
try {
|
|
54
|
+
// loadEnvironment() is called within getConfig now
|
|
55
|
+
const bucketName = process.env['GCS_BUCKET_NAME'];
|
|
56
|
+
let taskStoreForExecutor;
|
|
57
|
+
let taskStoreForHandler;
|
|
58
|
+
if (bucketName) {
|
|
59
|
+
logger.info(`Using GCSTaskStore with bucket: ${bucketName}`);
|
|
60
|
+
const gcsTaskStore = new GCSTaskStore(bucketName);
|
|
61
|
+
taskStoreForExecutor = gcsTaskStore;
|
|
62
|
+
taskStoreForHandler = new NoOpTaskStore(gcsTaskStore);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
logger.info('Using InMemoryTaskStore');
|
|
66
|
+
const inMemoryTaskStore = new InMemoryTaskStore();
|
|
67
|
+
taskStoreForExecutor = inMemoryTaskStore;
|
|
68
|
+
taskStoreForHandler = inMemoryTaskStore;
|
|
69
|
+
}
|
|
70
|
+
const agentExecutor = new CoderAgentExecutor(taskStoreForExecutor);
|
|
71
|
+
const requestHandler = new DefaultRequestHandler(coderAgentCard, taskStoreForHandler, agentExecutor);
|
|
72
|
+
let expressApp = express();
|
|
73
|
+
expressApp.use((req, res, next) => {
|
|
74
|
+
requestStorage.run({ req }, next);
|
|
75
|
+
});
|
|
76
|
+
const appBuilder = new A2AExpressApp(requestHandler);
|
|
77
|
+
expressApp = appBuilder.setupRoutes(expressApp, '');
|
|
78
|
+
expressApp.use(express.json());
|
|
79
|
+
expressApp.post('/tasks', async (req, res) => {
|
|
80
|
+
try {
|
|
81
|
+
const taskId = uuidv4();
|
|
82
|
+
const agentSettings = req.body.agentSettings;
|
|
83
|
+
const contextId = req.body.contextId || uuidv4();
|
|
84
|
+
const wrapper = await agentExecutor.createTask(taskId, contextId, agentSettings);
|
|
85
|
+
await taskStoreForExecutor.save(wrapper.toSDKTask());
|
|
86
|
+
res.status(201).json(wrapper.id);
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
logger.error('[CoreAgent] Error creating task:', error);
|
|
90
|
+
const errorMessage = error instanceof Error
|
|
91
|
+
? error.message
|
|
92
|
+
: 'Unknown error creating task';
|
|
93
|
+
res.status(500).send({ error: errorMessage });
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
expressApp.get('/tasks/metadata', async (req, res) => {
|
|
97
|
+
// This endpoint is only meaningful if the task store is in-memory.
|
|
98
|
+
if (!(taskStoreForExecutor instanceof InMemoryTaskStore)) {
|
|
99
|
+
res.status(501).send({
|
|
100
|
+
error: 'Listing all task metadata is only supported when using InMemoryTaskStore.',
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const wrappers = agentExecutor.getAllTasks();
|
|
105
|
+
if (wrappers && wrappers.length > 0) {
|
|
106
|
+
const tasksMetadata = await Promise.all(wrappers.map((wrapper) => wrapper.task.getMetadata()));
|
|
107
|
+
res.status(200).json(tasksMetadata);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
res.status(204).send();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
logger.error('[CoreAgent] Error getting all task metadata:', error);
|
|
115
|
+
const errorMessage = error instanceof Error
|
|
116
|
+
? error.message
|
|
117
|
+
: 'Unknown error getting task metadata';
|
|
118
|
+
res.status(500).send({ error: errorMessage });
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
expressApp.get('/tasks/:taskId/metadata', async (req, res) => {
|
|
122
|
+
const taskId = req.params.taskId;
|
|
123
|
+
let wrapper = agentExecutor.getTask(taskId);
|
|
124
|
+
if (!wrapper) {
|
|
125
|
+
const sdkTask = await taskStoreForExecutor.load(taskId);
|
|
126
|
+
if (sdkTask) {
|
|
127
|
+
wrapper = await agentExecutor.reconstruct(sdkTask);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!wrapper) {
|
|
131
|
+
res.status(404).send({ error: 'Task not found' });
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
res.json({ metadata: await wrapper.task.getMetadata() });
|
|
135
|
+
});
|
|
136
|
+
return expressApp;
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
logger.error('[CoreAgent] Error during startup:', error);
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
export async function main() {
|
|
144
|
+
try {
|
|
145
|
+
const expressApp = await createApp();
|
|
146
|
+
const port = process.env['CODER_AGENT_PORT'] || 0;
|
|
147
|
+
const server = expressApp.listen(port, () => {
|
|
148
|
+
const address = server.address();
|
|
149
|
+
let actualPort;
|
|
150
|
+
if (process.env['CODER_AGENT_PORT']) {
|
|
151
|
+
actualPort = process.env['CODER_AGENT_PORT'];
|
|
152
|
+
}
|
|
153
|
+
else if (address && typeof address !== 'string') {
|
|
154
|
+
actualPort = address.port;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
throw new Error('[Core Agent] Could not find port number.');
|
|
158
|
+
}
|
|
159
|
+
updateCoderAgentCardUrl(Number(actualPort));
|
|
160
|
+
logger.info(`[CoreAgent] Agent Server started on http://localhost:${actualPort}`);
|
|
161
|
+
logger.info(`[CoreAgent] Agent Card: http://localhost:${actualPort}/.well-known/agent-card.json`);
|
|
162
|
+
logger.info('[CoreAgent] Press Ctrl+C to stop the server');
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
logger.error('[CoreAgent] Error during startup:', error);
|
|
167
|
+
process.exit(1);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/http/app.ts"],"names":[],"mappings":"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"}
|