spawnee 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.
@@ -0,0 +1,113 @@
1
+ import { EventEmitter } from 'events';
2
+ export class TaskQueue extends EventEmitter {
3
+ tasks = new Map();
4
+ completed = new Set();
5
+ addTask(input) {
6
+ const task = { ...input, status: 'pending', attempts: 0 };
7
+ this.tasks.set(task.id, task);
8
+ // If task is marked as complete, mark it as completed immediately
9
+ if (task.complete) {
10
+ this.markCompleted(task.id, { completedAt: new Date().toISOString() }, false);
11
+ }
12
+ else {
13
+ this.updateReadyTasks();
14
+ }
15
+ }
16
+ addTasks(inputs) {
17
+ inputs.forEach(input => {
18
+ const task = { ...input, status: 'pending', attempts: 0 };
19
+ this.tasks.set(task.id, task);
20
+ // If task is marked as complete, mark it as completed immediately
21
+ if (task.complete) {
22
+ this.markCompleted(task.id, { completedAt: new Date().toISOString() }, false);
23
+ }
24
+ });
25
+ this.updateReadyTasks();
26
+ }
27
+ updateReadyTasks() {
28
+ for (const task of this.tasks.values()) {
29
+ if (task.status !== 'pending')
30
+ continue;
31
+ const depsComplete = task.dependsOn.every(depId => this.completed.has(depId));
32
+ if (!depsComplete)
33
+ continue;
34
+ task.status = 'ready';
35
+ this.emit('taskReady', task);
36
+ }
37
+ }
38
+ getReadyTasks() {
39
+ return Array.from(this.tasks.values())
40
+ .filter(t => t.status === 'ready')
41
+ .sort((a, b) => b.priority - a.priority);
42
+ }
43
+ getTask(id) {
44
+ return this.tasks.get(id);
45
+ }
46
+ getAllTasks() {
47
+ return Array.from(this.tasks.values());
48
+ }
49
+ markRunning(id, agentId) {
50
+ const task = this.tasks.get(id);
51
+ if (!task)
52
+ return;
53
+ task.status = 'running';
54
+ task.agentId = agentId;
55
+ task.attempts++;
56
+ this.emit('taskStarted', task);
57
+ }
58
+ markCompleted(id, result, checkComplete = true) {
59
+ const task = this.tasks.get(id);
60
+ if (!task)
61
+ return;
62
+ task.status = 'completed';
63
+ task.result = { ...result, completedAt: new Date().toISOString() };
64
+ this.completed.add(id);
65
+ this.emit('taskCompleted', task);
66
+ this.updateReadyTasks();
67
+ if (checkComplete) {
68
+ this.checkAllComplete();
69
+ }
70
+ }
71
+ markFailed(id, error, maxRetries = 2) {
72
+ const task = this.tasks.get(id);
73
+ if (!task)
74
+ return;
75
+ task.error = error;
76
+ if (task.attempts < (task.retries ?? maxRetries)) {
77
+ task.status = 'ready';
78
+ this.emit('taskRetry', task);
79
+ return;
80
+ }
81
+ task.status = 'failed';
82
+ this.emit('taskFailed', task);
83
+ this.checkAllComplete();
84
+ }
85
+ checkAllComplete() {
86
+ const allDone = Array.from(this.tasks.values()).every(t => t.status === 'completed' || t.status === 'failed');
87
+ if (allDone)
88
+ this.emit('allComplete', this.getResults());
89
+ }
90
+ getResults() {
91
+ const tasks = Array.from(this.tasks.values());
92
+ return {
93
+ completed: tasks.filter(t => t.status === 'completed'),
94
+ failed: tasks.filter(t => t.status === 'failed'),
95
+ };
96
+ }
97
+ getStatus() {
98
+ const tasks = Array.from(this.tasks.values());
99
+ return {
100
+ pending: tasks.filter(t => t.status === 'pending').length,
101
+ ready: tasks.filter(t => t.status === 'ready').length,
102
+ running: tasks.filter(t => t.status === 'running').length,
103
+ completed: tasks.filter(t => t.status === 'completed').length,
104
+ failed: tasks.filter(t => t.status === 'failed').length,
105
+ total: tasks.length,
106
+ };
107
+ }
108
+ reset() {
109
+ this.tasks.clear();
110
+ this.completed.clear();
111
+ }
112
+ }
113
+ //# sourceMappingURL=task-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-queue.js","sourceRoot":"","sources":["../../src/core/task-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { EventEmitter } from 'events';
2
+ import { CursorAgentConfig, CursorAgent, AgentListResponse } from './types.js';
3
+ import { RetryOptions } from '../utils/retry.js';
4
+ export declare class CursorClient extends EventEmitter {
5
+ private client;
6
+ private pollIntervals;
7
+ private logger;
8
+ private apiKey;
9
+ constructor(apiKey: string, baseUrl?: string);
10
+ createAgent(config: CursorAgentConfig, retryOpts?: RetryOptions): Promise<CursorAgent>;
11
+ getAgent(agentId: string): Promise<CursorAgent>;
12
+ listAgents(limit?: number, cursor?: string): Promise<AgentListResponse>;
13
+ sendFollowUp(agentId: string, message: string): Promise<void>;
14
+ stopAgent(agentId: string): Promise<void>;
15
+ cancelAgent(agentId: string): Promise<void>;
16
+ deleteAgent(agentId: string): Promise<void>;
17
+ startMonitoring(agentId: string, intervalMs?: number): void;
18
+ stopMonitoring(agentId: string): void;
19
+ stopAllMonitoring(): void;
20
+ }
@@ -0,0 +1,133 @@
1
+ import axios from 'axios';
2
+ import { EventEmitter } from 'events';
3
+ import { retry } from '../utils/retry.js';
4
+ import { Logger } from '../utils/logger.js';
5
+ export class CursorClient extends EventEmitter {
6
+ client;
7
+ pollIntervals = new Map();
8
+ logger;
9
+ apiKey;
10
+ constructor(apiKey, baseUrl = 'https://api.cursor.com') {
11
+ super();
12
+ this.apiKey = apiKey;
13
+ this.logger = new Logger('CursorClient');
14
+ // Cursor API uses Basic Auth: apiKey: (empty password)
15
+ const auth = Buffer.from(`${apiKey}:`).toString('base64');
16
+ this.client = axios.create({
17
+ baseURL: baseUrl,
18
+ headers: {
19
+ 'Authorization': `Basic ${auth}`,
20
+ 'Content-Type': 'application/json'
21
+ },
22
+ timeout: 30000,
23
+ });
24
+ this.client.interceptors.response.use(response => response, (error) => {
25
+ const status = error.response?.status;
26
+ const responseData = error.response?.data;
27
+ const message = responseData?.message || responseData?.error || error.message;
28
+ const details = responseData?.details ? JSON.stringify(responseData.details, null, 2) : '';
29
+ this.logger.error(`API Error [${status}]: ${message}${details ? '\n' + details : ''}`);
30
+ return Promise.reject(new Error(`Cursor API Error [${status}]: ${message}${details ? '\n' + details : ''}`));
31
+ });
32
+ }
33
+ async createAgent(config, retryOpts) {
34
+ // Normalize repository URL - remove .git suffix if present, ensure it's a full URL
35
+ let repository = config.repository.trim();
36
+ if (repository.endsWith('.git')) {
37
+ repository = repository.slice(0, -4);
38
+ }
39
+ const request = {
40
+ prompt: { text: config.prompt },
41
+ source: {
42
+ repository: repository,
43
+ ref: config.ref || config.branch || 'main'
44
+ },
45
+ ...(config.model && { model: config.model }),
46
+ ...(config.autoCreatePr !== undefined || config.branchName ? {
47
+ target: {
48
+ ...(config.autoCreatePr !== undefined && { autoCreatePr: config.autoCreatePr }),
49
+ ...(config.branchName && { branchName: config.branchName }),
50
+ }
51
+ } : {}),
52
+ };
53
+ this.logger.debug(`Creating agent with request: ${JSON.stringify(request, null, 2)}`);
54
+ return retry(async () => {
55
+ try {
56
+ const response = await this.client.post('/v0/agents', request);
57
+ return response.data;
58
+ }
59
+ catch (error) {
60
+ // Log the full error for debugging
61
+ if (error.response?.data) {
62
+ this.logger.debug(`API Error Response: ${JSON.stringify(error.response.data, null, 2)}`);
63
+ }
64
+ throw error;
65
+ }
66
+ }, retryOpts);
67
+ }
68
+ async getAgent(agentId) {
69
+ const response = await this.client.get(`/v0/agents/${agentId}`);
70
+ return response.data;
71
+ }
72
+ async listAgents(limit, cursor) {
73
+ const params = {};
74
+ if (limit !== undefined)
75
+ params.limit = limit;
76
+ if (cursor)
77
+ params.cursor = cursor;
78
+ const response = await this.client.get('/v0/agents', { params });
79
+ return response.data;
80
+ }
81
+ async sendFollowUp(agentId, message) {
82
+ await this.client.post(`/v0/agents/${agentId}/followup`, {
83
+ prompt: { text: message }
84
+ });
85
+ }
86
+ async stopAgent(agentId) {
87
+ await this.client.post(`/v0/agents/${agentId}/stop`);
88
+ }
89
+ async cancelAgent(agentId) {
90
+ // Alias for stopAgent for backward compatibility
91
+ await this.stopAgent(agentId);
92
+ }
93
+ async deleteAgent(agentId) {
94
+ await this.client.delete(`/v0/agents/${agentId}`);
95
+ }
96
+ startMonitoring(agentId, intervalMs = 15000) {
97
+ if (this.pollIntervals.has(agentId))
98
+ return;
99
+ const poll = async () => {
100
+ try {
101
+ const agent = await this.getAgent(agentId);
102
+ this.emit('status', { agentId, ...agent });
103
+ // Map Cursor API statuses to our internal statuses
104
+ const finishedStatuses = ['FINISHED', 'FAILED', 'STOPPED', 'EXPIRED'];
105
+ if (finishedStatuses.includes(agent.status)) {
106
+ this.stopMonitoring(agentId);
107
+ // Map FINISHED -> completed, FAILED -> failed, STOPPED/EXPIRED -> cancelled
108
+ const mappedStatus = agent.status === 'FINISHED' ? 'completed' :
109
+ agent.status === 'FAILED' ? 'failed' : 'cancelled';
110
+ this.emit(mappedStatus, { agentId, ...agent });
111
+ }
112
+ }
113
+ catch (error) {
114
+ this.emit('error', { agentId, error });
115
+ }
116
+ };
117
+ poll();
118
+ const interval = setInterval(poll, intervalMs);
119
+ this.pollIntervals.set(agentId, interval);
120
+ }
121
+ stopMonitoring(agentId) {
122
+ const interval = this.pollIntervals.get(agentId);
123
+ if (!interval)
124
+ return;
125
+ clearInterval(interval);
126
+ this.pollIntervals.delete(agentId);
127
+ }
128
+ stopAllMonitoring() {
129
+ for (const agentId of this.pollIntervals.keys())
130
+ this.stopMonitoring(agentId);
131
+ }
132
+ }
133
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cursor/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,KAAK,EAAgB,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,YAAa,SAAQ,YAAY;IACpC,MAAM,CAAgB;IACtB,aAAa,GAAgC,IAAI,GAAG,EAAE,CAAC;IACvD,MAAM,CAAS;IACf,MAAM,CAAS;IAEvB,YAAY,MAAc,EAAE,UAAkB,wBAAwB;QACpE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC;QAEzC,uDAAuD;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAE1D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE;gBACP,eAAe,EAAE,SAAS,IAAI,EAAE;gBAChC,cAAc,EAAE,kBAAkB;aACnC;YACD,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CACnC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EACpB,CAAC,KAAiB,EAAE,EAAE;YACpB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC;YACtC,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAW,CAAC;YACjD,MAAM,OAAO,GAAG,YAAY,EAAE,OAAO,IAAI,YAAY,EAAE,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;YAC9E,MAAM,OAAO,GAAG,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3F,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvF,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,MAAM,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/G,CAAC,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAyB,EAAE,SAAwB;QACnE,mFAAmF;QACnF,IAAI,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,MAAM,OAAO,GAAuB;YAClC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;YAC/B,MAAM,EAAE;gBACN,UAAU,EAAE,UAAU;gBACtB,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM;aAC3C;YACD,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5C,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC3D,MAAM,EAAE;oBACN,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;oBAC/E,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;iBAC5D;aACF,CAAC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAEtF,OAAO,KAAK,CAAC,KAAK,IAAI,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAc,YAAY,EAAE,OAAO,CAAC,CAAC;gBAC5E,OAAO,QAAQ,CAAC,IAAI,CAAC;YACvB,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,mCAAmC;gBACnC,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;oBACzB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3F,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAc,cAAc,OAAO,EAAE,CAAC,CAAC;QAC7E,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAc,EAAE,MAAe;QAC9C,MAAM,MAAM,GAAoC,EAAE,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;QAC9C,IAAI,MAAM;YAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QAEnC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAoB,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,OAAe;QACjD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,OAAO,WAAW,EAAE;YACvD,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAe;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,OAAO,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,iDAAiD;QACjD,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe;QAC/B,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,eAAe,CAAC,OAAe,EAAE,aAAqB,KAAK;QACzD,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO;QAE5C,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;gBAE3C,mDAAmD;gBACnD,MAAM,gBAAgB,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBACtE,IAAI,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;oBAC7B,4EAA4E;oBAC5E,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;wBAC5C,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;oBACvE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,EAAE,CAAC;QACP,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,cAAc,CAAC,OAAe;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,iBAAiB;QACf,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;YAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAChF,CAAC;CACF"}
@@ -0,0 +1,60 @@
1
+ export interface CursorAgentConfig {
2
+ prompt: string;
3
+ repository: string;
4
+ branch?: string;
5
+ ref?: string;
6
+ model?: string;
7
+ autoCreatePr?: boolean;
8
+ branchName?: string;
9
+ }
10
+ export interface CursorAgent {
11
+ id: string;
12
+ name?: string;
13
+ status: AgentStatus;
14
+ source: {
15
+ repository: string;
16
+ ref?: string;
17
+ };
18
+ target?: {
19
+ branchName?: string;
20
+ url?: string;
21
+ prUrl?: string;
22
+ autoCreatePr?: boolean;
23
+ openAsCursorGithubApp?: boolean;
24
+ skipReviewerRequest?: boolean;
25
+ };
26
+ summary?: string;
27
+ createdAt: string;
28
+ }
29
+ export type AgentStatus = 'CREATING' | 'RUNNING' | 'FINISHED' | 'FAILED' | 'STOPPED' | 'EXPIRED';
30
+ export interface AgentListResponse {
31
+ agents: CursorAgent[];
32
+ nextCursor?: string;
33
+ }
34
+ export interface CreateAgentRequest {
35
+ prompt: {
36
+ text: string;
37
+ images?: Array<{
38
+ data: string;
39
+ dimension: {
40
+ width: number;
41
+ height: number;
42
+ };
43
+ }>;
44
+ };
45
+ model?: string;
46
+ source: {
47
+ repository: string;
48
+ ref?: string;
49
+ };
50
+ target?: {
51
+ autoCreatePr?: boolean;
52
+ openAsCursorGithubApp?: boolean;
53
+ skipReviewerRequest?: boolean;
54
+ branchName?: string;
55
+ };
56
+ webhook?: {
57
+ url: string;
58
+ secret?: string;
59
+ };
60
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cursor/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,274 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { existsSync, writeFileSync } from 'fs';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ import { Orchestrator } from './core/orchestrator.js';
7
+ import { parseTemplate, validateTemplateFile } from './parsers/index.js';
8
+ import { FileStateStore } from './storage/file-adapter.js';
9
+ import { loadConfig, generateDefaultConfig, getConfigFilePath } from './utils/config.js';
10
+ import { CursorClient } from './cursor/client.js';
11
+ const program = new Command();
12
+ program
13
+ .name('spawnee')
14
+ .description('Spawn and orchestrate Cursor Cloud Agents from task templates')
15
+ .version('1.0.0')
16
+ .option('--config <path>', 'Path to config file (default: .spawneerc.json)')
17
+ .option('-v, --verbose', 'Enable verbose logging');
18
+ program
19
+ .command('init')
20
+ .description('Initialize a .spawneerc.json config file in the current directory')
21
+ .option('-f, --force', 'Overwrite existing config file')
22
+ .action((options) => {
23
+ const configPath = getConfigFilePath();
24
+ if (existsSync(configPath) && !options.force) {
25
+ console.error(chalk.red(`Config file already exists: ${configPath}`));
26
+ console.log(chalk.gray('Use --force to overwrite'));
27
+ process.exit(1);
28
+ }
29
+ writeFileSync(configPath, generateDefaultConfig(), 'utf-8');
30
+ console.log(chalk.green(`āœ“ Created config file: ${configPath}`));
31
+ console.log(chalk.gray('\nEdit this file to set your API key and other options.'));
32
+ });
33
+ program
34
+ .command('config')
35
+ .description('Show resolved configuration (merges config file, env vars, and defaults)')
36
+ .action((_, cmd) => {
37
+ const globalOpts = cmd.optsWithGlobals();
38
+ try {
39
+ const config = loadConfig({ configFile: globalOpts.config, verbose: globalOpts.verbose });
40
+ console.log(chalk.blue('\nšŸ“‹ Resolved Configuration:\n'));
41
+ const display = { ...config, apiKey: config.apiKey ? '***' + config.apiKey.slice(-4) : '(not set)' };
42
+ for (const [key, value] of Object.entries(display)) {
43
+ const label = key.padEnd(16);
44
+ console.log(chalk.gray(` ${label}`) + chalk.white(String(value)));
45
+ }
46
+ console.log();
47
+ }
48
+ catch (error) {
49
+ console.error(chalk.red(`Configuration error: ${error.message}`));
50
+ process.exit(1);
51
+ }
52
+ });
53
+ program
54
+ .command('run')
55
+ .description('Execute a task template')
56
+ .argument('<template>', 'Path to template file (JSON/YAML)')
57
+ .option('-k, --api-key <key>', 'Cursor API key')
58
+ .option('--api-url <url>', 'Cursor API base URL')
59
+ .option('-c, --concurrency <number>', 'Max concurrent agents')
60
+ .option('--poll-interval <ms>', 'Status poll interval in milliseconds')
61
+ .option('-t, --timeout <ms>', 'Default task timeout in milliseconds')
62
+ .option('--state-file <path>', 'State file path for persistence')
63
+ .option('-d, --dry-run', 'Parse template without spawning agents')
64
+ .option('--no-persist', 'Disable state persistence')
65
+ .action(async (templatePath, options, cmd) => {
66
+ const globalOpts = cmd.optsWithGlobals();
67
+ if (!existsSync(templatePath)) {
68
+ console.error(chalk.red(`Error: Template file not found: ${templatePath}`));
69
+ process.exit(1);
70
+ }
71
+ let template;
72
+ try {
73
+ template = parseTemplate(templatePath);
74
+ }
75
+ catch (error) {
76
+ console.error(chalk.red(`Error parsing template: ${error.message}`));
77
+ process.exit(1);
78
+ }
79
+ const completedTasks = template.tasks.filter(t => t.complete);
80
+ const activeTasks = template.tasks.filter(t => !t.complete);
81
+ console.log(chalk.blue(`\nšŸ“‹ Template: ${template.name}`));
82
+ console.log(chalk.gray(` Repository: ${template.repository.url}`));
83
+ console.log(chalk.gray(` Tasks: ${template.tasks.length}${completedTasks.length > 0 ? ` (${completedTasks.length} already completed, ${activeTasks.length} active)` : ''}`));
84
+ if (completedTasks.length > 0) {
85
+ console.log(chalk.yellow(`\nāœ“ Already completed: ${completedTasks.map(t => t.id).join(', ')}`));
86
+ }
87
+ console.log(chalk.blue('\nšŸ“Š Task Dependency Graph:'));
88
+ displayTaskGraph(template.tasks);
89
+ if (options.dryRun) {
90
+ console.log(chalk.yellow('\nšŸ” Dry run - no agents will be spawned'));
91
+ return;
92
+ }
93
+ const configOverrides = {
94
+ configFile: globalOpts.config,
95
+ verbose: globalOpts.verbose,
96
+ apiKey: options.apiKey,
97
+ apiBaseUrl: options.apiUrl,
98
+ maxConcurrent: options.concurrency ? parseInt(options.concurrency, 10) : undefined,
99
+ pollInterval: options.pollInterval ? parseInt(options.pollInterval, 10) : undefined,
100
+ defaultTimeout: options.timeout ? parseInt(options.timeout, 10) : undefined,
101
+ stateFile: options.stateFile,
102
+ };
103
+ let config;
104
+ try {
105
+ config = loadConfig(configOverrides);
106
+ }
107
+ catch (error) {
108
+ console.error(chalk.red(`Configuration error: ${error.message}`));
109
+ process.exit(1);
110
+ }
111
+ if (config.verbose) {
112
+ console.log(chalk.gray(`\n Config: concurrency=${config.maxConcurrent}, timeout=${config.defaultTimeout}ms, poll=${config.pollInterval}ms`));
113
+ }
114
+ const stateStore = options.persist ? new FileStateStore(config.stateFile) : undefined;
115
+ const orchestrator = new Orchestrator({
116
+ config,
117
+ stateStore,
118
+ repository: template.repository.url,
119
+ baseBranch: template.repository.branch,
120
+ globalContext: template.context.instructions,
121
+ globalFiles: template.context.files,
122
+ });
123
+ const spinner = ora('Starting orchestration...').start();
124
+ orchestrator.on('started', (status) => {
125
+ spinner.succeed('Orchestration started');
126
+ console.log(chalk.gray(` Total tasks: ${status.total}`));
127
+ });
128
+ orchestrator.on('agentSpawned', ({ taskId, agentId }) => {
129
+ console.log(chalk.cyan(` ā–¶ Started: ${taskId} (agent: ${agentId.slice(0, 8)}...)`));
130
+ });
131
+ orchestrator.on('taskCompleted', (task) => {
132
+ console.log(chalk.green(` āœ“ Completed: ${task.id}`));
133
+ if (task.result?.pullRequestUrl)
134
+ console.log(chalk.gray(` PR: ${task.result.pullRequestUrl}`));
135
+ });
136
+ orchestrator.on('taskFailed', (task) => {
137
+ console.log(chalk.red(` āœ— Failed: ${task.id} - ${task.error}`));
138
+ });
139
+ orchestrator.on('taskRetry', (task) => {
140
+ console.log(chalk.yellow(` ↻ Retrying: ${task.id} (attempt ${task.attempts + 1})`));
141
+ });
142
+ orchestrator.on('complete', (results) => {
143
+ console.log(chalk.blue('\nšŸ“Š Final Results:'));
144
+ console.log(chalk.green(` āœ“ Completed: ${results.completed.length}`));
145
+ console.log(chalk.red(` āœ— Failed: ${results.failed.length}`));
146
+ if (results.failed.length > 0) {
147
+ console.log(chalk.red('\n Failed tasks:'));
148
+ results.failed.forEach(t => console.log(chalk.red(` - ${t.id}: ${t.error}`)));
149
+ }
150
+ process.exit(results.failed.length > 0 ? 1 : 0);
151
+ });
152
+ process.on('SIGINT', async () => {
153
+ console.log(chalk.yellow('\n\nGracefully shutting down...'));
154
+ await orchestrator.stop();
155
+ process.exit(0);
156
+ });
157
+ orchestrator.loadTasks(template.name, template.tasks);
158
+ await orchestrator.start();
159
+ });
160
+ program
161
+ .command('validate')
162
+ .description('Validate a task template without running')
163
+ .argument('<template>', 'Path to template file')
164
+ .action((templatePath) => {
165
+ if (!existsSync(templatePath)) {
166
+ console.error(chalk.red(`Error: Template file not found: ${templatePath}`));
167
+ process.exit(1);
168
+ }
169
+ const result = validateTemplateFile(templatePath);
170
+ if (result.valid) {
171
+ console.log(chalk.green('āœ“ Template is valid'));
172
+ process.exit(0);
173
+ }
174
+ console.error(chalk.red('āœ— Template validation failed:'));
175
+ result.errors.forEach(e => console.error(chalk.red(` - ${e}`)));
176
+ process.exit(1);
177
+ });
178
+ program
179
+ .command('status')
180
+ .description('Check status of running agents')
181
+ .option('-k, --api-key <key>', 'Cursor API key')
182
+ .option('--api-url <url>', 'Cursor API base URL')
183
+ .action(async (options, cmd) => {
184
+ const globalOpts = cmd.optsWithGlobals();
185
+ let config;
186
+ try {
187
+ config = loadConfig({
188
+ configFile: globalOpts.config,
189
+ verbose: globalOpts.verbose,
190
+ apiKey: options.apiKey,
191
+ apiBaseUrl: options.apiUrl,
192
+ });
193
+ }
194
+ catch (error) {
195
+ console.error(chalk.red(`Configuration error: ${error.message}`));
196
+ process.exit(1);
197
+ }
198
+ const client = new CursorClient(config.apiKey, config.apiBaseUrl);
199
+ try {
200
+ const response = await client.listAgents();
201
+ console.log(chalk.blue(`\nšŸ“Š Agents: ${response.agents.length}\n`));
202
+ const statusColors = {
203
+ RUNNING: chalk.cyan,
204
+ FINISHED: chalk.green,
205
+ FAILED: chalk.red,
206
+ CREATING: chalk.yellow,
207
+ STOPPED: chalk.gray,
208
+ EXPIRED: chalk.dim,
209
+ };
210
+ response.agents.forEach(agent => {
211
+ const colorFn = statusColors[agent.status] || chalk.white;
212
+ const branch = agent.target?.branchName || '';
213
+ const name = agent.name || agent.id.slice(0, 12);
214
+ console.log(` ${colorFn(agent.status.padEnd(10))} ${name.padEnd(20)} ${branch}`);
215
+ });
216
+ }
217
+ catch (error) {
218
+ const errorMessage = error.message;
219
+ console.error(chalk.red(`Error: ${errorMessage}`));
220
+ if (errorMessage.includes('API endpoint not found')) {
221
+ console.log(chalk.yellow('\nšŸ’” Tip: The Cursor Cloud Agents API endpoints may need to be configured.'));
222
+ console.log(chalk.gray(' Check the Cursor documentation or dashboard for the correct API endpoints.'));
223
+ console.log(chalk.gray(' You can override the base URL with: SPAWNEE_API_URL=https://api.cursor.com'));
224
+ }
225
+ process.exit(1);
226
+ }
227
+ });
228
+ program
229
+ .command('cancel')
230
+ .description('Cancel a running agent')
231
+ .argument('<agent-id>', 'Agent ID to cancel')
232
+ .option('-k, --api-key <key>', 'Cursor API key')
233
+ .option('--api-url <url>', 'Cursor API base URL')
234
+ .action(async (agentId, options, cmd) => {
235
+ const globalOpts = cmd.optsWithGlobals();
236
+ let config;
237
+ try {
238
+ config = loadConfig({
239
+ configFile: globalOpts.config,
240
+ verbose: globalOpts.verbose,
241
+ apiKey: options.apiKey,
242
+ apiBaseUrl: options.apiUrl,
243
+ });
244
+ }
245
+ catch (error) {
246
+ console.error(chalk.red(`Configuration error: ${error.message}`));
247
+ process.exit(1);
248
+ }
249
+ const client = new CursorClient(config.apiKey, config.apiBaseUrl);
250
+ try {
251
+ await client.stopAgent(agentId);
252
+ console.log(chalk.green(`āœ“ Agent ${agentId} stopped`));
253
+ }
254
+ catch (error) {
255
+ console.error(chalk.red(`Error: ${error.message}`));
256
+ process.exit(1);
257
+ }
258
+ });
259
+ function displayTaskGraph(tasks) {
260
+ const roots = tasks.filter(t => t.dependsOn.length === 0);
261
+ function printTask(task, indent, isLast) {
262
+ const prefix = isLast ? '└── ' : 'ā”œā”€ā”€ ';
263
+ const priority = task.priority ? chalk.gray(` [p:${task.priority}]`) : '';
264
+ console.log(chalk.gray(indent + prefix) + task.id + priority);
265
+ const children = tasks.filter(t => t.dependsOn.includes(task.id));
266
+ children.forEach((child, i) => {
267
+ const newIndent = indent + (isLast ? ' ' : '│ ');
268
+ printTask(child, newIndent, i === children.length - 1);
269
+ });
270
+ }
271
+ roots.forEach((root, i) => printTask(root, ' ', i === roots.length - 1));
272
+ }
273
+ program.parse();
274
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}