cursor-agent-a2a 1.0.0
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/LICENSE +21 -0
- package/README.md +306 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/routes/__tests__/cursorAgent.test.d.ts +14 -0
- package/dist/routes/__tests__/cursorAgent.test.d.ts.map +1 -0
- package/dist/routes/__tests__/cursorAgent.test.js +486 -0
- package/dist/routes/__tests__/cursorAgent.test.js.map +1 -0
- package/dist/routes/cursorAgent.d.ts +20 -0
- package/dist/routes/cursorAgent.d.ts.map +1 -0
- package/dist/routes/cursorAgent.js +722 -0
- package/dist/routes/cursorAgent.js.map +1 -0
- package/dist/services/__tests__/cursorAgentService.test.d.ts +12 -0
- package/dist/services/__tests__/cursorAgentService.test.d.ts.map +1 -0
- package/dist/services/__tests__/cursorAgentService.test.js +421 -0
- package/dist/services/__tests__/cursorAgentService.test.js.map +1 -0
- package/dist/services/cursorAgentService.d.ts +60 -0
- package/dist/services/cursorAgentService.d.ts.map +1 -0
- package/dist/services/cursorAgentService.js +392 -0
- package/dist/services/cursorAgentService.js.map +1 -0
- package/dist/types/a2a.d.ts +89 -0
- package/dist/types/a2a.d.ts.map +1 -0
- package/dist/types/a2a.js +7 -0
- package/dist/types/a2a.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for cursorAgent.ts - Cursor Agent A2A Routes
|
|
3
|
+
*
|
|
4
|
+
* Tests cover:
|
|
5
|
+
* - Homepage endpoint
|
|
6
|
+
* - Agent Card discovery
|
|
7
|
+
* - Message endpoints (sync and streaming)
|
|
8
|
+
* - Task management (create, query, cancel)
|
|
9
|
+
* - Authentication
|
|
10
|
+
* - Session management
|
|
11
|
+
* - Webhook callbacks
|
|
12
|
+
*/
|
|
13
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
14
|
+
import express from 'express';
|
|
15
|
+
import request from 'supertest';
|
|
16
|
+
import cursorAgentRouter from '../cursorAgent.js';
|
|
17
|
+
// Mock the cursor agent service
|
|
18
|
+
vi.mock('../../services/cursorAgentService.js', () => ({
|
|
19
|
+
generateCursorAgentCard: vi.fn().mockReturnValue({
|
|
20
|
+
name: 'Cursor Agent',
|
|
21
|
+
description: 'AI-powered code assistant via Cursor CLI',
|
|
22
|
+
version: '1.0.0',
|
|
23
|
+
url: 'http://localhost:4300',
|
|
24
|
+
skills: [
|
|
25
|
+
{
|
|
26
|
+
name: 'code_generation',
|
|
27
|
+
description: 'Generate and modify code files',
|
|
28
|
+
inputSchema: { type: 'object' },
|
|
29
|
+
outputSchema: { type: 'object' },
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
securitySchemes: [
|
|
33
|
+
{
|
|
34
|
+
type: 'apiKey',
|
|
35
|
+
in: 'header',
|
|
36
|
+
name: 'Authorization',
|
|
37
|
+
scheme: 'bearer',
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
context: {
|
|
41
|
+
a2aAgentId: 'cursor-agent',
|
|
42
|
+
projectId: 'cursor-agent',
|
|
43
|
+
projectName: 'Cursor Agent',
|
|
44
|
+
workingDirectory: process.cwd(),
|
|
45
|
+
agentType: 'cursor-agent',
|
|
46
|
+
agentCategory: 'builtin',
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
executeCursorAgent: vi.fn().mockResolvedValue({
|
|
50
|
+
success: true,
|
|
51
|
+
response: 'Test response',
|
|
52
|
+
sessionId: 'test-session-id',
|
|
53
|
+
metadata: {
|
|
54
|
+
processingTimeMs: 1000,
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
executeCursorAgentStream: vi.fn().mockImplementation(async (message, config, onEvent) => {
|
|
58
|
+
// Simulate streaming events
|
|
59
|
+
onEvent({
|
|
60
|
+
type: 'message',
|
|
61
|
+
content: 'Streaming response',
|
|
62
|
+
sessionId: 'test-session-id',
|
|
63
|
+
timestamp: Date.now(),
|
|
64
|
+
});
|
|
65
|
+
onEvent({
|
|
66
|
+
type: 'result',
|
|
67
|
+
sessionId: 'test-session-id',
|
|
68
|
+
timestamp: Date.now(),
|
|
69
|
+
});
|
|
70
|
+
return { sessionId: 'test-session-id' };
|
|
71
|
+
}),
|
|
72
|
+
}));
|
|
73
|
+
describe('Cursor Agent A2A Routes', () => {
|
|
74
|
+
let app;
|
|
75
|
+
const VALID_API_KEY = process.env.CURSOR_AGENT_API_KEY || 'cursor-agent-demo-key';
|
|
76
|
+
beforeEach(() => {
|
|
77
|
+
vi.clearAllMocks();
|
|
78
|
+
app = express();
|
|
79
|
+
app.use(express.json());
|
|
80
|
+
app.use('/', cursorAgentRouter);
|
|
81
|
+
});
|
|
82
|
+
afterEach(() => {
|
|
83
|
+
vi.clearAllMocks();
|
|
84
|
+
});
|
|
85
|
+
// ============================================================================
|
|
86
|
+
// GET / - Homepage
|
|
87
|
+
// ============================================================================
|
|
88
|
+
describe('GET /', () => {
|
|
89
|
+
it('should return HTML homepage with 200 status', async () => {
|
|
90
|
+
const response = await request(app).get('/').expect(200);
|
|
91
|
+
expect(response.headers['content-type']).toMatch(/text\/html/);
|
|
92
|
+
expect(response.text).toContain('Cursor Agent A2A Service');
|
|
93
|
+
expect(response.text).toContain('Agent Card');
|
|
94
|
+
});
|
|
95
|
+
it('should display agent card information', async () => {
|
|
96
|
+
const response = await request(app).get('/').expect(200);
|
|
97
|
+
expect(response.text).toContain('Cursor Agent');
|
|
98
|
+
expect(response.text).toContain('Skills');
|
|
99
|
+
});
|
|
100
|
+
it('should include API endpoint documentation', async () => {
|
|
101
|
+
const response = await request(app).get('/').expect(200);
|
|
102
|
+
expect(response.text).toContain('/messages');
|
|
103
|
+
expect(response.text).toContain('/tasks');
|
|
104
|
+
expect(response.text).toContain('curl');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
// ============================================================================
|
|
108
|
+
// GET /.well-known/agent-card.json - Agent Card Discovery
|
|
109
|
+
// ============================================================================
|
|
110
|
+
describe('GET /.well-known/agent-card.json', () => {
|
|
111
|
+
it('should return agent card with 200 status', async () => {
|
|
112
|
+
const response = await request(app)
|
|
113
|
+
.get('/.well-known/agent-card.json')
|
|
114
|
+
.expect(200);
|
|
115
|
+
expect(response.body).toHaveProperty('name', 'Cursor Agent');
|
|
116
|
+
expect(response.body).toHaveProperty('description');
|
|
117
|
+
expect(response.body).toHaveProperty('version', '1.0.0');
|
|
118
|
+
expect(response.body).toHaveProperty('url');
|
|
119
|
+
expect(response.body).toHaveProperty('skills');
|
|
120
|
+
expect(response.body).toHaveProperty('securitySchemes');
|
|
121
|
+
expect(response.body).toHaveProperty('context');
|
|
122
|
+
});
|
|
123
|
+
it('should include correct context information', async () => {
|
|
124
|
+
const response = await request(app)
|
|
125
|
+
.get('/.well-known/agent-card.json')
|
|
126
|
+
.expect(200);
|
|
127
|
+
expect(response.body.context).toMatchObject({
|
|
128
|
+
a2aAgentId: 'cursor-agent',
|
|
129
|
+
agentType: 'cursor-agent',
|
|
130
|
+
agentCategory: 'builtin',
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
it('should include security schemes', async () => {
|
|
134
|
+
const response = await request(app)
|
|
135
|
+
.get('/.well-known/agent-card.json')
|
|
136
|
+
.expect(200);
|
|
137
|
+
expect(response.body.securitySchemes).toBeInstanceOf(Array);
|
|
138
|
+
expect(response.body.securitySchemes[0]).toMatchObject({
|
|
139
|
+
type: 'apiKey',
|
|
140
|
+
in: 'header',
|
|
141
|
+
name: 'Authorization',
|
|
142
|
+
scheme: 'bearer',
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
// ============================================================================
|
|
147
|
+
// POST /messages - Synchronous Message
|
|
148
|
+
// ============================================================================
|
|
149
|
+
describe('POST /messages', () => {
|
|
150
|
+
it('should require authentication', async () => {
|
|
151
|
+
const response = await request(app)
|
|
152
|
+
.post('/messages')
|
|
153
|
+
.send({ message: 'test' })
|
|
154
|
+
.expect(401);
|
|
155
|
+
expect(response.body).toHaveProperty('error');
|
|
156
|
+
expect(response.body.code).toBe('UNAUTHORIZED');
|
|
157
|
+
});
|
|
158
|
+
it('should reject invalid API key', async () => {
|
|
159
|
+
const response = await request(app)
|
|
160
|
+
.post('/messages')
|
|
161
|
+
.set('Authorization', 'Bearer invalid-key')
|
|
162
|
+
.send({ message: 'test' })
|
|
163
|
+
.expect(401);
|
|
164
|
+
expect(response.body.code).toBe('INVALID_API_KEY');
|
|
165
|
+
});
|
|
166
|
+
it('should require message field', async () => {
|
|
167
|
+
const response = await request(app)
|
|
168
|
+
.post('/messages')
|
|
169
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
170
|
+
.send({})
|
|
171
|
+
.expect(400);
|
|
172
|
+
expect(response.body.code).toBe('VALIDATION_ERROR');
|
|
173
|
+
});
|
|
174
|
+
it('should process message successfully', async () => {
|
|
175
|
+
const response = await request(app)
|
|
176
|
+
.post('/messages')
|
|
177
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
178
|
+
.send({
|
|
179
|
+
message: 'Say hello',
|
|
180
|
+
workspace: '/test/workspace',
|
|
181
|
+
})
|
|
182
|
+
.expect(200);
|
|
183
|
+
expect(response.body).toHaveProperty('response');
|
|
184
|
+
expect(response.body).toHaveProperty('sessionId');
|
|
185
|
+
expect(response.body).toHaveProperty('metadata');
|
|
186
|
+
expect(response.body.metadata).toHaveProperty('processingTimeMs');
|
|
187
|
+
});
|
|
188
|
+
it('should handle session continuation', async () => {
|
|
189
|
+
// First message to create session
|
|
190
|
+
const firstResponse = await request(app)
|
|
191
|
+
.post('/messages')
|
|
192
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
193
|
+
.send({
|
|
194
|
+
message: 'First message',
|
|
195
|
+
workspace: '/test/workspace',
|
|
196
|
+
})
|
|
197
|
+
.expect(200);
|
|
198
|
+
const sessionId = firstResponse.body.sessionId;
|
|
199
|
+
// Second message with sessionId
|
|
200
|
+
const secondResponse = await request(app)
|
|
201
|
+
.post('/messages')
|
|
202
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
203
|
+
.send({
|
|
204
|
+
message: 'Second message',
|
|
205
|
+
sessionId,
|
|
206
|
+
})
|
|
207
|
+
.expect(200);
|
|
208
|
+
expect(secondResponse.body.sessionId).toBe(sessionId);
|
|
209
|
+
});
|
|
210
|
+
it('should use current directory if no workspace provided', async () => {
|
|
211
|
+
const response = await request(app)
|
|
212
|
+
.post('/messages')
|
|
213
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
214
|
+
.send({
|
|
215
|
+
message: 'Test message',
|
|
216
|
+
})
|
|
217
|
+
.expect(200);
|
|
218
|
+
expect(response.body).toHaveProperty('response');
|
|
219
|
+
});
|
|
220
|
+
it('should handle execution errors', async () => {
|
|
221
|
+
const { executeCursorAgent } = await import('../../services/cursorAgentService.js');
|
|
222
|
+
vi.mocked(executeCursorAgent).mockResolvedValueOnce({
|
|
223
|
+
success: false,
|
|
224
|
+
error: 'Execution failed',
|
|
225
|
+
metadata: { processingTimeMs: 100 },
|
|
226
|
+
});
|
|
227
|
+
const response = await request(app)
|
|
228
|
+
.post('/messages')
|
|
229
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
230
|
+
.send({
|
|
231
|
+
message: 'Failing message',
|
|
232
|
+
workspace: '/test/workspace',
|
|
233
|
+
})
|
|
234
|
+
.expect(500);
|
|
235
|
+
expect(response.body.code).toBe('EXECUTION_ERROR');
|
|
236
|
+
});
|
|
237
|
+
it('should handle session not found error', async () => {
|
|
238
|
+
const response = await request(app)
|
|
239
|
+
.post('/messages')
|
|
240
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
241
|
+
.send({
|
|
242
|
+
message: 'Test',
|
|
243
|
+
sessionId: 'non-existent-session',
|
|
244
|
+
})
|
|
245
|
+
.expect(400);
|
|
246
|
+
expect(response.body.code).toBe('SESSION_NOT_FOUND');
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
// ============================================================================
|
|
250
|
+
// POST /messages?stream=true - Streaming Message
|
|
251
|
+
// ============================================================================
|
|
252
|
+
describe('POST /messages?stream=true', () => {
|
|
253
|
+
it('should return SSE stream', async () => {
|
|
254
|
+
const response = await request(app)
|
|
255
|
+
.post('/messages?stream=true')
|
|
256
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
257
|
+
.set('Accept', 'text/event-stream')
|
|
258
|
+
.send({
|
|
259
|
+
message: 'Stream test',
|
|
260
|
+
workspace: '/test/workspace',
|
|
261
|
+
})
|
|
262
|
+
.expect(200);
|
|
263
|
+
expect(response.headers['content-type']).toContain('text/event-stream');
|
|
264
|
+
expect(response.text).toContain('data:');
|
|
265
|
+
});
|
|
266
|
+
it('should stream multiple events', async () => {
|
|
267
|
+
const response = await request(app)
|
|
268
|
+
.post('/messages?stream=true')
|
|
269
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
270
|
+
.set('Accept', 'text/event-stream')
|
|
271
|
+
.send({
|
|
272
|
+
message: 'Stream test',
|
|
273
|
+
workspace: '/test/workspace',
|
|
274
|
+
})
|
|
275
|
+
.expect(200);
|
|
276
|
+
const events = response.text.split('\n\n').filter((line) => line.startsWith('data:'));
|
|
277
|
+
expect(events.length).toBeGreaterThan(0);
|
|
278
|
+
});
|
|
279
|
+
it('should handle streaming errors', async () => {
|
|
280
|
+
const { executeCursorAgentStream } = await import('../../services/cursorAgentService.js');
|
|
281
|
+
vi.mocked(executeCursorAgentStream).mockRejectedValueOnce(new Error('Stream error'));
|
|
282
|
+
const response = await request(app)
|
|
283
|
+
.post('/messages?stream=true')
|
|
284
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
285
|
+
.set('Accept', 'text/event-stream')
|
|
286
|
+
.send({
|
|
287
|
+
message: 'Stream error test',
|
|
288
|
+
workspace: '/test/workspace',
|
|
289
|
+
})
|
|
290
|
+
.expect(200);
|
|
291
|
+
expect(response.text).toContain('error');
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
// ============================================================================
|
|
295
|
+
// POST /tasks - Create Async Task
|
|
296
|
+
// ============================================================================
|
|
297
|
+
describe('POST /tasks', () => {
|
|
298
|
+
it('should require authentication', async () => {
|
|
299
|
+
const response = await request(app)
|
|
300
|
+
.post('/tasks')
|
|
301
|
+
.send({ message: 'test' })
|
|
302
|
+
.expect(401);
|
|
303
|
+
expect(response.body.code).toBe('UNAUTHORIZED');
|
|
304
|
+
});
|
|
305
|
+
it('should require message field', async () => {
|
|
306
|
+
const response = await request(app)
|
|
307
|
+
.post('/tasks')
|
|
308
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
309
|
+
.send({})
|
|
310
|
+
.expect(400);
|
|
311
|
+
expect(response.body.code).toBe('VALIDATION_ERROR');
|
|
312
|
+
});
|
|
313
|
+
it('should create task and return 202', async () => {
|
|
314
|
+
const response = await request(app)
|
|
315
|
+
.post('/tasks')
|
|
316
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
317
|
+
.send({
|
|
318
|
+
message: 'Long running task',
|
|
319
|
+
workspace: '/test/workspace',
|
|
320
|
+
})
|
|
321
|
+
.expect(202);
|
|
322
|
+
expect(response.body).toHaveProperty('taskId');
|
|
323
|
+
expect(response.body).toHaveProperty('status', 'pending');
|
|
324
|
+
expect(response.body).toHaveProperty('checkUrl');
|
|
325
|
+
});
|
|
326
|
+
it('should accept pushNotificationConfig', async () => {
|
|
327
|
+
const response = await request(app)
|
|
328
|
+
.post('/tasks')
|
|
329
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
330
|
+
.send({
|
|
331
|
+
message: 'Task with webhook',
|
|
332
|
+
workspace: '/test/workspace',
|
|
333
|
+
pushNotificationConfig: {
|
|
334
|
+
url: 'https://example.com/webhook',
|
|
335
|
+
token: 'webhook-token',
|
|
336
|
+
},
|
|
337
|
+
})
|
|
338
|
+
.expect(202);
|
|
339
|
+
expect(response.body).toHaveProperty('taskId');
|
|
340
|
+
});
|
|
341
|
+
it('should handle task creation errors', async () => {
|
|
342
|
+
// This tests error handling in task creation
|
|
343
|
+
const response = await request(app)
|
|
344
|
+
.post('/tasks')
|
|
345
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
346
|
+
.send({
|
|
347
|
+
message: 'Task',
|
|
348
|
+
workspace: '/test/workspace',
|
|
349
|
+
})
|
|
350
|
+
.expect(202);
|
|
351
|
+
expect(response.body).toHaveProperty('taskId');
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
// ============================================================================
|
|
355
|
+
// GET /tasks/:taskId - Query Task Status
|
|
356
|
+
// ============================================================================
|
|
357
|
+
describe('GET /tasks/:taskId', () => {
|
|
358
|
+
it('should require authentication', async () => {
|
|
359
|
+
const response = await request(app)
|
|
360
|
+
.get('/tasks/test-task-id')
|
|
361
|
+
.expect(401);
|
|
362
|
+
expect(response.body.code).toBe('UNAUTHORIZED');
|
|
363
|
+
});
|
|
364
|
+
it('should return 404 for non-existent task', async () => {
|
|
365
|
+
const response = await request(app)
|
|
366
|
+
.get('/tasks/non-existent-task-id')
|
|
367
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
368
|
+
.expect(404);
|
|
369
|
+
expect(response.body.code).toBe('TASK_NOT_FOUND');
|
|
370
|
+
});
|
|
371
|
+
it('should return task status for existing task', async () => {
|
|
372
|
+
// Create a task first
|
|
373
|
+
const createResponse = await request(app)
|
|
374
|
+
.post('/tasks')
|
|
375
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
376
|
+
.send({
|
|
377
|
+
message: 'Test task',
|
|
378
|
+
workspace: '/test/workspace',
|
|
379
|
+
})
|
|
380
|
+
.expect(202);
|
|
381
|
+
const taskId = createResponse.body.taskId;
|
|
382
|
+
// Wait a bit for task to start
|
|
383
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
384
|
+
// Query task status
|
|
385
|
+
const statusResponse = await request(app)
|
|
386
|
+
.get(`/tasks/${taskId}`)
|
|
387
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
388
|
+
.expect(200);
|
|
389
|
+
expect(statusResponse.body).toHaveProperty('taskId', taskId);
|
|
390
|
+
expect(statusResponse.body).toHaveProperty('status');
|
|
391
|
+
expect(statusResponse.body).toHaveProperty('createdAt');
|
|
392
|
+
expect(statusResponse.body).toHaveProperty('updatedAt');
|
|
393
|
+
});
|
|
394
|
+
it('should return output.result when task is completed', async () => {
|
|
395
|
+
// Create a task
|
|
396
|
+
const createResponse = await request(app)
|
|
397
|
+
.post('/tasks')
|
|
398
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
399
|
+
.send({
|
|
400
|
+
message: 'Quick task',
|
|
401
|
+
workspace: '/test/workspace',
|
|
402
|
+
})
|
|
403
|
+
.expect(202);
|
|
404
|
+
const taskId = createResponse.body.taskId;
|
|
405
|
+
// Wait for task to complete (mock should complete quickly)
|
|
406
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
407
|
+
// Query task status
|
|
408
|
+
const statusResponse = await request(app)
|
|
409
|
+
.get(`/tasks/${taskId}`)
|
|
410
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`);
|
|
411
|
+
// Task might be running, completed, or failed
|
|
412
|
+
expect(['pending', 'running', 'completed', 'failed']).toContain(statusResponse.body.status);
|
|
413
|
+
if (statusResponse.body.status === 'completed') {
|
|
414
|
+
expect(statusResponse.body).toHaveProperty('output');
|
|
415
|
+
expect(statusResponse.body.output).toHaveProperty('result');
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
// ============================================================================
|
|
420
|
+
// DELETE /tasks/:taskId - Cancel Task
|
|
421
|
+
// ============================================================================
|
|
422
|
+
describe('DELETE /tasks/:taskId', () => {
|
|
423
|
+
it('should require authentication', async () => {
|
|
424
|
+
const response = await request(app)
|
|
425
|
+
.delete('/tasks/test-task-id')
|
|
426
|
+
.expect(401);
|
|
427
|
+
expect(response.body.code).toBe('UNAUTHORIZED');
|
|
428
|
+
});
|
|
429
|
+
it('should return 404 for non-existent task', async () => {
|
|
430
|
+
const response = await request(app)
|
|
431
|
+
.delete('/tasks/non-existent-task-id')
|
|
432
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
433
|
+
.expect(404);
|
|
434
|
+
expect(response.body.code).toBe('TASK_NOT_FOUND');
|
|
435
|
+
});
|
|
436
|
+
it('should cancel a pending task', async () => {
|
|
437
|
+
// Create a task
|
|
438
|
+
const createResponse = await request(app)
|
|
439
|
+
.post('/tasks')
|
|
440
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
441
|
+
.send({
|
|
442
|
+
message: 'Task to cancel',
|
|
443
|
+
workspace: '/test/workspace',
|
|
444
|
+
})
|
|
445
|
+
.expect(202);
|
|
446
|
+
const taskId = createResponse.body.taskId;
|
|
447
|
+
// Cancel immediately (should be pending or running)
|
|
448
|
+
const cancelResponse = await request(app)
|
|
449
|
+
.delete(`/tasks/${taskId}`)
|
|
450
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`);
|
|
451
|
+
// Task might complete quickly, so accept either success or "cannot cancel" error
|
|
452
|
+
if (cancelResponse.status === 200) {
|
|
453
|
+
expect(cancelResponse.body).toHaveProperty('status', 'canceled');
|
|
454
|
+
expect(cancelResponse.body).toHaveProperty('message');
|
|
455
|
+
}
|
|
456
|
+
else {
|
|
457
|
+
// Task already completed
|
|
458
|
+
expect(cancelResponse.status).toBe(400);
|
|
459
|
+
expect(cancelResponse.body.code).toBe('TASK_CANNOT_BE_CANCELED');
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
it('should not cancel completed task', async () => {
|
|
463
|
+
// Create and wait for task to complete
|
|
464
|
+
const createResponse = await request(app)
|
|
465
|
+
.post('/tasks')
|
|
466
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`)
|
|
467
|
+
.send({
|
|
468
|
+
message: 'Quick task',
|
|
469
|
+
workspace: '/test/workspace',
|
|
470
|
+
})
|
|
471
|
+
.expect(202);
|
|
472
|
+
const taskId = createResponse.body.taskId;
|
|
473
|
+
// Wait for completion
|
|
474
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
475
|
+
// Try to cancel (might fail if already completed)
|
|
476
|
+
const cancelResponse = await request(app)
|
|
477
|
+
.delete(`/tasks/${taskId}`)
|
|
478
|
+
.set('Authorization', `Bearer ${VALID_API_KEY}`);
|
|
479
|
+
// Should either succeed (if still running) or fail (if completed)
|
|
480
|
+
if (cancelResponse.status === 400) {
|
|
481
|
+
expect(cancelResponse.body.code).toBe('TASK_CANNOT_BE_CANCELED');
|
|
482
|
+
}
|
|
483
|
+
});
|
|
484
|
+
});
|
|
485
|
+
});
|
|
486
|
+
//# sourceMappingURL=cursorAgent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursorAgent.test.js","sourceRoot":"","sources":["../../../src/routes/__tests__/cursorAgent.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor Agent A2A Routes
|
|
3
|
+
*
|
|
4
|
+
* Independent A2A-compatible service wrapping Cursor CLI agent command.
|
|
5
|
+
* This service is separate from AgentStudio's agent system.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints:
|
|
8
|
+
* - GET / - Homepage with usage instructions and Agent Card display
|
|
9
|
+
* - GET /.well-known/agent-card.json - Agent Card discovery
|
|
10
|
+
* - POST /messages - Send synchronous message
|
|
11
|
+
* - POST /tasks - Create asynchronous task
|
|
12
|
+
* - GET /tasks/:taskId - Query task status
|
|
13
|
+
* - DELETE /tasks/:taskId - Cancel task
|
|
14
|
+
*
|
|
15
|
+
* Authentication: API key via Authorization header (Bearer token)
|
|
16
|
+
*/
|
|
17
|
+
import { Router } from 'express';
|
|
18
|
+
declare const router: Router;
|
|
19
|
+
export default router;
|
|
20
|
+
//# sourceMappingURL=cursorAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursorAgent.d.ts","sourceRoot":"","sources":["../../src/routes/cursorAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAgB,EAAE,MAAM,EAAY,MAAM,SAAS,CAAC;AAKpD,QAAA,MAAM,MAAM,EAAE,MAA8C,CAAC;AAwxB7D,eAAe,MAAM,CAAC"}
|