@gracefultools/astrid-sdk 0.4.2 → 0.6.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,125 @@
1
+ "use strict";
2
+ /**
3
+ * Astrid API Client
4
+ *
5
+ * Handles outbound communication to Astrid, including callback
6
+ * notifications for session status updates.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.astridClient = exports.AstridClient = void 0;
10
+ const webhook_signature_js_1 = require("./webhook-signature.js");
11
+ class AstridClient {
12
+ callbackUrl;
13
+ webhookSecret;
14
+ timeout;
15
+ constructor(config) {
16
+ this.callbackUrl = config?.callbackUrl || process.env.ASTRID_CALLBACK_URL || '';
17
+ this.webhookSecret = config?.webhookSecret || process.env.ASTRID_WEBHOOK_SECRET || '';
18
+ this.timeout = config?.timeout || 10000;
19
+ }
20
+ /**
21
+ * Check if client is properly configured
22
+ */
23
+ isConfigured() {
24
+ return Boolean(this.callbackUrl && this.webhookSecret);
25
+ }
26
+ /**
27
+ * Send a callback to Astrid
28
+ */
29
+ async sendCallback(payload) {
30
+ if (!this.isConfigured()) {
31
+ console.log(`⚠️ Astrid callback not configured, skipping notification`);
32
+ return { success: false, error: 'Not configured' };
33
+ }
34
+ try {
35
+ const body = JSON.stringify(payload);
36
+ const headers = (0, webhook_signature_js_1.generateCallbackHeaders)(body, this.webhookSecret, payload.event);
37
+ console.log(`📤 Sending callback to Astrid: ${payload.event}`);
38
+ const response = await fetch(this.callbackUrl, {
39
+ method: 'POST',
40
+ headers,
41
+ body,
42
+ signal: AbortSignal.timeout(this.timeout)
43
+ });
44
+ if (!response.ok) {
45
+ const errorText = await response.text();
46
+ throw new Error(`HTTP ${response.status}: ${errorText}`);
47
+ }
48
+ console.log(`✅ Callback sent successfully`);
49
+ return { success: true };
50
+ }
51
+ catch (error) {
52
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
53
+ console.error(`❌ Failed to send callback to Astrid: ${errorMessage}`);
54
+ return { success: false, error: errorMessage };
55
+ }
56
+ }
57
+ /**
58
+ * Notify Astrid that session has started
59
+ */
60
+ async notifyStarted(taskId, sessionId, message) {
61
+ await this.sendCallback({
62
+ event: 'session.started',
63
+ timestamp: new Date().toISOString(),
64
+ sessionId,
65
+ taskId,
66
+ data: { message: message || 'Started working on task' }
67
+ });
68
+ }
69
+ /**
70
+ * Notify Astrid that session has completed
71
+ */
72
+ async notifyCompleted(taskId, sessionId, data) {
73
+ await this.sendCallback({
74
+ event: 'session.completed',
75
+ timestamp: new Date().toISOString(),
76
+ sessionId,
77
+ taskId,
78
+ data
79
+ });
80
+ }
81
+ /**
82
+ * Notify Astrid that session is waiting for user input
83
+ */
84
+ async notifyWaitingInput(taskId, sessionId, question, options, data) {
85
+ await this.sendCallback({
86
+ event: 'session.waiting_input',
87
+ timestamp: new Date().toISOString(),
88
+ sessionId,
89
+ taskId,
90
+ data: {
91
+ question,
92
+ options,
93
+ ...data
94
+ }
95
+ });
96
+ }
97
+ /**
98
+ * Notify Astrid about progress
99
+ */
100
+ async notifyProgress(taskId, sessionId, message) {
101
+ await this.sendCallback({
102
+ event: 'session.progress',
103
+ timestamp: new Date().toISOString(),
104
+ sessionId,
105
+ taskId,
106
+ data: { message }
107
+ });
108
+ }
109
+ /**
110
+ * Notify Astrid that an error occurred
111
+ */
112
+ async notifyError(taskId, sessionId, error, context) {
113
+ await this.sendCallback({
114
+ event: 'session.error',
115
+ timestamp: new Date().toISOString(),
116
+ sessionId,
117
+ taskId,
118
+ data: { error, message: context }
119
+ });
120
+ }
121
+ }
122
+ exports.AstridClient = AstridClient;
123
+ // Export singleton instance
124
+ exports.astridClient = new AstridClient();
125
+ //# sourceMappingURL=astrid-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"astrid-client.js","sourceRoot":"","sources":["../../src/server/astrid-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Astrid SDK Server
3
+ *
4
+ * Express server that receives webhooks from Astrid and executes
5
+ * AI coding agents (Claude, OpenAI, Gemini) with full tool access.
6
+ *
7
+ * Usage:
8
+ * npx astrid-agent serve --port=3001
9
+ */
10
+ interface ExpressResponse {
11
+ json(data: unknown): void;
12
+ status(code: number): ExpressResponse;
13
+ }
14
+ interface ExpressApplication {
15
+ use(handler: unknown): void;
16
+ get(path: string, handler: (req: unknown, res: ExpressResponse) => void | Promise<void>): void;
17
+ post(path: string, handler: (req: unknown, res: ExpressResponse) => void | Promise<void>): void;
18
+ listen(port: number, host: string, callback: () => void): void;
19
+ }
20
+ export interface ServerConfig {
21
+ port: number;
22
+ webhookSecret?: string;
23
+ callbackUrl?: string;
24
+ }
25
+ /**
26
+ * Create and configure the Express server
27
+ */
28
+ export declare function createServer(config: ServerConfig): Promise<ExpressApplication>;
29
+ /**
30
+ * Start the server
31
+ */
32
+ export declare function startServer(config: ServerConfig): Promise<void>;
33
+ export { Session, AIProvider } from './session-manager.js';
34
+ export { AstridClient, AstridClientConfig, CallbackPayload } from './astrid-client.js';
35
+ export { sessionManager } from './session-manager.js';
36
+ export { astridClient } from './astrid-client.js';
37
+ export { repoManager } from './repo-manager.js';
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgCH,UAAU,eAAe;IACvB,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IACzB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAA;CACtC;AAGD,UAAU,kBAAkB;IAC1B,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAC3B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC9F,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAC/F,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAA;CAC/D;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AA4RD;;GAEG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmGpF;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CrE;AAGD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,408 @@
1
+ "use strict";
2
+ /**
3
+ * Astrid SDK Server
4
+ *
5
+ * Express server that receives webhooks from Astrid and executes
6
+ * AI coding agents (Claude, OpenAI, Gemini) with full tool access.
7
+ *
8
+ * Usage:
9
+ * npx astrid-agent serve --port=3001
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.repoManager = exports.astridClient = exports.sessionManager = exports.AstridClient = void 0;
13
+ exports.createServer = createServer;
14
+ exports.startServer = startServer;
15
+ const webhook_signature_js_1 = require("./webhook-signature.js");
16
+ const session_manager_js_1 = require("./session-manager.js");
17
+ const astrid_client_js_1 = require("./astrid-client.js");
18
+ const repo_manager_js_1 = require("./repo-manager.js");
19
+ const claude_js_1 = require("../executors/claude.js");
20
+ const openai_js_1 = require("../executors/openai.js");
21
+ const gemini_js_1 = require("../executors/gemini.js");
22
+ const agent_config_js_1 = require("../utils/agent-config.js");
23
+ /**
24
+ * Get model for provider, handling unknown case
25
+ */
26
+ function getModelForProvider(provider) {
27
+ if (provider === 'unknown') {
28
+ return agent_config_js_1.DEFAULT_MODELS['claude']; // Default to claude
29
+ }
30
+ return agent_config_js_1.DEFAULT_MODELS[provider];
31
+ }
32
+ // Track active executions to prevent concurrent runs for the same task
33
+ const activeExecutions = new Set();
34
+ /**
35
+ * Detect provider from agent info
36
+ */
37
+ function detectProvider(aiAgent) {
38
+ const email = aiAgent?.email?.toLowerCase() || '';
39
+ const type = aiAgent?.type?.toLowerCase() || '';
40
+ if (email.includes('claude') || type.includes('claude'))
41
+ return 'claude';
42
+ if (email.includes('openai') || email.includes('gpt') || type.includes('openai'))
43
+ return 'openai';
44
+ if (email.includes('gemini') || email.includes('google') || type.includes('gemini'))
45
+ return 'gemini';
46
+ return 'claude'; // Default
47
+ }
48
+ /**
49
+ * Get provider display name
50
+ */
51
+ function getProviderName(provider) {
52
+ switch (provider) {
53
+ case 'claude': return 'Claude';
54
+ case 'openai': return 'OpenAI';
55
+ case 'gemini': return 'Gemini';
56
+ default: return 'AI Agent';
57
+ }
58
+ }
59
+ /**
60
+ * Get API key for provider
61
+ */
62
+ function getApiKeyForProvider(provider) {
63
+ switch (provider) {
64
+ case 'claude': return process.env.ANTHROPIC_API_KEY;
65
+ case 'openai': return process.env.OPENAI_API_KEY;
66
+ case 'gemini': return process.env.GEMINI_API_KEY;
67
+ default: return undefined;
68
+ }
69
+ }
70
+ /**
71
+ * Get project path from list configuration
72
+ */
73
+ function getProjectPath(list) {
74
+ if (!list?.id) {
75
+ return process.env.DEFAULT_PROJECT_PATH || undefined;
76
+ }
77
+ // Try to get from environment based on list ID
78
+ const envKey = `PROJECT_PATH_${list.id.replace(/-/g, '_').toUpperCase()}`;
79
+ if (process.env[envKey]) {
80
+ return process.env[envKey];
81
+ }
82
+ return process.env.DEFAULT_PROJECT_PATH || undefined;
83
+ }
84
+ /**
85
+ * Handle new task assignment
86
+ */
87
+ async function handleTaskAssigned(payload) {
88
+ const { task, list, comments, aiAgent } = payload;
89
+ // Prevent concurrent executions for the same task
90
+ if (activeExecutions.has(task.id)) {
91
+ console.log(`⚠️ Task ${task.id} already executing, skipping duplicate`);
92
+ return;
93
+ }
94
+ activeExecutions.add(task.id);
95
+ console.log(`🔒 Acquired execution lock for task ${task.id}`);
96
+ // Detect which AI provider to use based on the agent
97
+ const provider = detectProvider(aiAgent || {});
98
+ const providerName = getProviderName(provider);
99
+ const apiKey = getApiKeyForProvider(provider);
100
+ console.log(`🆕 New task assigned: ${task.title}`);
101
+ console.log(`🤖 AI Provider: ${providerName}`);
102
+ console.log(`📋 List: ${list?.name}, Repo: ${list?.githubRepositoryId || 'none'}`);
103
+ console.log(`💬 Comments provided: ${comments?.length || 0}`);
104
+ if (!apiKey) {
105
+ console.error(`❌ No API key configured for ${providerName}`);
106
+ activeExecutions.delete(task.id);
107
+ return;
108
+ }
109
+ // Check if we already have a session for this task
110
+ let session = await session_manager_js_1.sessionManager.getByTaskId(task.id);
111
+ if (session) {
112
+ console.log(`📂 Session already exists for task ${task.id}, status: ${session.status}`);
113
+ if (session.status === 'interrupted' || session.status === 'error') {
114
+ console.log(`🔄 Restarting session for task ${task.id}`);
115
+ await session_manager_js_1.sessionManager.deleteSession(task.id);
116
+ session = undefined;
117
+ }
118
+ else if (session.status === 'running') {
119
+ // Check if the session is stale
120
+ const thirtyMinutesAgo = Date.now() - 30 * 60 * 1000;
121
+ const lastUpdate = new Date(session.updatedAt).getTime();
122
+ if (lastUpdate < thirtyMinutesAgo) {
123
+ console.log(`⚠️ Session appears stuck, resetting`);
124
+ await session_manager_js_1.sessionManager.deleteSession(task.id);
125
+ session = undefined;
126
+ }
127
+ else {
128
+ console.log(`⚠️ Session already running for task ${task.id}`);
129
+ activeExecutions.delete(task.id);
130
+ return;
131
+ }
132
+ }
133
+ }
134
+ // Clone/update repository if specified
135
+ let projectPath = getProjectPath(list || {});
136
+ if (list?.githubRepositoryId) {
137
+ console.log(`📥 Setting up repository: ${list.githubRepositoryId}`);
138
+ const repoInfo = await repo_manager_js_1.repoManager.getRepo(list.githubRepositoryId);
139
+ if (repoInfo) {
140
+ projectPath = repoInfo.path;
141
+ console.log(`✅ Repository ready at: ${projectPath}`);
142
+ try {
143
+ const branchName = await repo_manager_js_1.repoManager.createTaskBranch(repoInfo.path, task.id);
144
+ console.log(`🌿 Working on branch: ${branchName}`);
145
+ }
146
+ catch (err) {
147
+ console.log(`⚠️ Could not create task branch, working on main`);
148
+ }
149
+ }
150
+ else {
151
+ console.error(`❌ Failed to setup repository: ${list.githubRepositoryId}`);
152
+ }
153
+ }
154
+ if (!projectPath) {
155
+ console.log(`⚠️ No project path - ${providerName} will work without file context`);
156
+ projectPath = process.cwd();
157
+ }
158
+ // Create new session
159
+ session = await session_manager_js_1.sessionManager.createSession({
160
+ taskId: task.id,
161
+ title: task.title,
162
+ description: task.description || '',
163
+ projectPath,
164
+ provider,
165
+ metadata: {
166
+ listId: list?.id,
167
+ listName: list?.name,
168
+ repository: list?.githubRepositoryId,
169
+ aiAgent: aiAgent
170
+ }
171
+ });
172
+ await session_manager_js_1.sessionManager.updateSession(task.id, { status: 'running' });
173
+ await astrid_client_js_1.astridClient.notifyStarted(task.id, session.id, `Starting work on: ${task.title} (using ${providerName})`);
174
+ try {
175
+ const config = {
176
+ repoPath: projectPath,
177
+ apiKey,
178
+ model: getModelForProvider(provider),
179
+ maxBudgetUsd: parseFloat(process.env.MAX_BUDGET_USD || '10.0'),
180
+ maxTurns: 50,
181
+ maxIterations: 50,
182
+ logger: (level, msg) => console.log(`[${level}] ${msg}`),
183
+ onProgress: (msg) => {
184
+ astrid_client_js_1.astridClient.notifyProgress(task.id, session.id, msg);
185
+ },
186
+ };
187
+ // Plan phase
188
+ console.log(`📋 Planning phase starting...`);
189
+ let planResult;
190
+ switch (provider) {
191
+ case 'claude':
192
+ planResult = await (0, claude_js_1.planWithClaude)(task.title, task.description || null, config);
193
+ break;
194
+ case 'openai':
195
+ planResult = await (0, openai_js_1.planWithOpenAI)(task.title, task.description || null, config);
196
+ break;
197
+ case 'gemini':
198
+ planResult = await (0, gemini_js_1.planWithGemini)(task.title, task.description || null, config);
199
+ break;
200
+ }
201
+ if (!planResult?.success || !planResult?.plan) {
202
+ throw new Error(`Planning failed: ${planResult?.error || 'No plan generated'}`);
203
+ }
204
+ console.log(`✅ Plan created: ${planResult.plan.summary}`);
205
+ // Execute phase
206
+ console.log(`🔨 Execution phase starting...`);
207
+ let execResult;
208
+ switch (provider) {
209
+ case 'claude':
210
+ execResult = await (0, claude_js_1.executeWithClaude)(planResult.plan, task.title, task.description || null, config);
211
+ break;
212
+ case 'openai':
213
+ execResult = await (0, openai_js_1.executeWithOpenAI)(planResult.plan, task.title, task.description || null, config);
214
+ break;
215
+ case 'gemini':
216
+ execResult = await (0, gemini_js_1.executeWithGemini)(planResult.plan, task.title, task.description || null, config);
217
+ break;
218
+ }
219
+ if (!execResult?.success) {
220
+ throw new Error(`Execution failed: ${execResult?.error || 'Unknown error'}`);
221
+ }
222
+ console.log(`✅ Execution complete: ${execResult.files.length} files modified`);
223
+ await session_manager_js_1.sessionManager.updateSession(task.id, { status: 'completed' });
224
+ await astrid_client_js_1.astridClient.notifyCompleted(task.id, session.id, {
225
+ summary: execResult.commitMessage || planResult.plan.summary,
226
+ files: execResult.files.map(f => f.path),
227
+ prUrl: execResult.prUrl
228
+ });
229
+ }
230
+ catch (error) {
231
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
232
+ console.error(`❌ ${providerName} execution failed:`, error);
233
+ await session_manager_js_1.sessionManager.updateSession(task.id, { status: 'error' });
234
+ await astrid_client_js_1.astridClient.notifyError(task.id, session.id, errorMessage);
235
+ }
236
+ finally {
237
+ activeExecutions.delete(task.id);
238
+ console.log(`🔓 Released execution lock for task ${task.id}`);
239
+ }
240
+ }
241
+ /**
242
+ * Handle comment on assigned task
243
+ */
244
+ async function handleCommentCreated(payload) {
245
+ const { task, comment, comments, aiAgent } = payload;
246
+ console.log(`💬 Comment received on task ${task.id}: ${comment.content.slice(0, 50)}...`);
247
+ // Get existing session
248
+ const session = await session_manager_js_1.sessionManager.getByTaskId(task.id);
249
+ if (!session) {
250
+ console.log(`⚠️ No session found for task ${task.id}, creating new one`);
251
+ await handleTaskAssigned(payload);
252
+ return;
253
+ }
254
+ // For now, treat comments as continuing the task
255
+ // Could implement specific comment handling (e.g., "retry", "ship it")
256
+ await session_manager_js_1.sessionManager.incrementMessageCount(task.id);
257
+ console.log(`📝 Comment logged for session ${session.id}`);
258
+ }
259
+ /**
260
+ * Create and configure the Express server
261
+ */
262
+ async function createServer(config) {
263
+ // Dynamic import of express
264
+ const expressModule = await import('express');
265
+ const express = expressModule.default || expressModule;
266
+ const app = express();
267
+ const webhookSecret = config.webhookSecret || process.env.ASTRID_WEBHOOK_SECRET;
268
+ if (!webhookSecret) {
269
+ throw new Error('ASTRID_WEBHOOK_SECRET not configured');
270
+ }
271
+ // Parse JSON with raw body preservation for signature verification
272
+ app.use(express.json({
273
+ verify: (req, _res, buf) => {
274
+ req.rawBody = buf;
275
+ }
276
+ }));
277
+ // Health check endpoint
278
+ app.get('/health', async (_req, res) => {
279
+ const claudeAvailable = !!process.env.ANTHROPIC_API_KEY;
280
+ const openaiAvailable = !!process.env.OPENAI_API_KEY;
281
+ const geminiAvailable = !!process.env.GEMINI_API_KEY;
282
+ const activeSessions = await session_manager_js_1.sessionManager.getActiveSessions();
283
+ res.json({
284
+ status: (claudeAvailable || openaiAvailable || geminiAvailable) ? 'healthy' : 'degraded',
285
+ providers: {
286
+ claude: claudeAvailable ? 'available' : 'not configured',
287
+ openai: openaiAvailable ? 'available' : 'not configured',
288
+ gemini: geminiAvailable ? 'available' : 'not configured'
289
+ },
290
+ activeSessions: activeSessions.length,
291
+ timestamp: new Date().toISOString()
292
+ });
293
+ });
294
+ // Webhook endpoint
295
+ app.post('/webhook', async (rawReq, res) => {
296
+ const req = rawReq;
297
+ const signature = req.headers['x-astrid-signature'];
298
+ const timestamp = req.headers['x-astrid-timestamp'];
299
+ const event = req.headers['x-astrid-event'];
300
+ const rawBody = req.rawBody?.toString() || JSON.stringify(req.body);
301
+ const verification = (0, webhook_signature_js_1.verifyWebhookSignature)(rawBody, signature, webhookSecret, timestamp);
302
+ if (!verification.valid) {
303
+ console.error(`❌ Webhook signature verification failed: ${verification.error}`);
304
+ res.status(401).json({ error: verification.error });
305
+ return;
306
+ }
307
+ console.log(`📥 Received webhook: ${event}`);
308
+ // Respond immediately
309
+ res.json({ success: true, event, message: 'Processing started' });
310
+ // Process webhook asynchronously
311
+ setImmediate(async () => {
312
+ try {
313
+ const body = req.body;
314
+ switch (event) {
315
+ case 'task.assigned':
316
+ await handleTaskAssigned(body);
317
+ break;
318
+ case 'comment.created':
319
+ await handleCommentCreated(body);
320
+ break;
321
+ case 'task.updated':
322
+ console.log(`📝 Task updated: ${body.task?.id}`);
323
+ break;
324
+ default:
325
+ console.log(`⚠️ Unknown event type: ${event}`);
326
+ }
327
+ }
328
+ catch (error) {
329
+ console.error(`❌ Error handling webhook:`, error);
330
+ }
331
+ });
332
+ });
333
+ // List sessions endpoint
334
+ app.get('/sessions', async (_req, res) => {
335
+ const sessions = await session_manager_js_1.sessionManager.getAllSessions();
336
+ res.json({
337
+ count: sessions.length,
338
+ sessions: sessions.map(s => ({
339
+ id: s.id,
340
+ taskId: s.taskId,
341
+ title: s.title,
342
+ status: s.status,
343
+ provider: s.provider,
344
+ updatedAt: s.updatedAt
345
+ }))
346
+ });
347
+ });
348
+ return app;
349
+ }
350
+ /**
351
+ * Start the server
352
+ */
353
+ async function startServer(config) {
354
+ const providers = [];
355
+ if (process.env.ANTHROPIC_API_KEY)
356
+ providers.push('Claude');
357
+ if (process.env.OPENAI_API_KEY)
358
+ providers.push('OpenAI');
359
+ if (process.env.GEMINI_API_KEY)
360
+ providers.push('Gemini');
361
+ if (providers.length === 0) {
362
+ console.warn(`⚠️ No AI providers configured! Add at least one:
363
+ ANTHROPIC_API_KEY=sk-ant-... (for Claude)
364
+ OPENAI_API_KEY=sk-... (for OpenAI)
365
+ GEMINI_API_KEY=AIza... (for Gemini)
366
+ `);
367
+ }
368
+ else {
369
+ console.log(`✅ Available providers: ${providers.join(', ')}`);
370
+ }
371
+ // Recover interrupted sessions
372
+ await session_manager_js_1.sessionManager.recoverSessions();
373
+ await session_manager_js_1.sessionManager.cleanupExpired();
374
+ const app = await createServer(config);
375
+ app.listen(config.port, '0.0.0.0', () => {
376
+ const providerStatus = providers.length > 0 ? providers.join(', ') : 'None';
377
+ console.log(`
378
+ ╔════════════════════════════════════════════════════════════════╗
379
+ ║ Astrid SDK Server ║
380
+ ╠════════════════════════════════════════════════════════════════╣
381
+ ║ Status: Running ║
382
+ ║ Providers: ${providerStatus.padEnd(42)} ║
383
+ ║ Address: http://0.0.0.0:${config.port} ║
384
+ ║ Webhook: http://0.0.0.0:${config.port}/webhook ║
385
+ ║ Health: http://0.0.0.0:${config.port}/health ║
386
+ ╠════════════════════════════════════════════════════════════════╣
387
+ ║ Supported AI Agents: ║
388
+ ║ - claude@astrid.cc → Claude Agent SDK ║
389
+ ║ - openai@astrid.cc → OpenAI API (GPT-4o) ║
390
+ ║ - gemini@astrid.cc → Google Gemini API ║
391
+ ╠════════════════════════════════════════════════════════════════╣
392
+ ║ Configure in Astrid: ║
393
+ ║ 1. Go to Settings → AI Agent Settings ║
394
+ ║ 2. Set URL to your server's /webhook endpoint ║
395
+ ║ 3. Copy the webhook secret to ASTRID_WEBHOOK_SECRET ║
396
+ ╚════════════════════════════════════════════════════════════════╝
397
+ `);
398
+ });
399
+ }
400
+ var astrid_client_js_2 = require("./astrid-client.js");
401
+ Object.defineProperty(exports, "AstridClient", { enumerable: true, get: function () { return astrid_client_js_2.AstridClient; } });
402
+ var session_manager_js_2 = require("./session-manager.js");
403
+ Object.defineProperty(exports, "sessionManager", { enumerable: true, get: function () { return session_manager_js_2.sessionManager; } });
404
+ var astrid_client_js_3 = require("./astrid-client.js");
405
+ Object.defineProperty(exports, "astridClient", { enumerable: true, get: function () { return astrid_client_js_3.astridClient; } });
406
+ var repo_manager_js_2 = require("./repo-manager.js");
407
+ Object.defineProperty(exports, "repoManager", { enumerable: true, get: function () { return repo_manager_js_2.repoManager; } });
408
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Repository Manager
3
+ *
4
+ * Handles cloning and updating GitHub repositories for AI agents to work on.
5
+ */
6
+ export interface RepoInfo {
7
+ path: string;
8
+ url: string;
9
+ branch: string;
10
+ }
11
+ declare class RepoManager {
12
+ private reposDir;
13
+ constructor();
14
+ /**
15
+ * Get or clone a repository
16
+ */
17
+ getRepo(repoId: string): Promise<RepoInfo | null>;
18
+ /**
19
+ * Build repository URL (supports GitHub token for private repos)
20
+ */
21
+ private buildRepoUrl;
22
+ /**
23
+ * Clone a repository
24
+ */
25
+ private cloneRepo;
26
+ /**
27
+ * Pull latest changes
28
+ */
29
+ private pullLatest;
30
+ /**
31
+ * Get current branch name
32
+ */
33
+ private getCurrentBranch;
34
+ /**
35
+ * Create a new branch for the task
36
+ */
37
+ createTaskBranch(repoPath: string, taskId: string): Promise<string>;
38
+ }
39
+ export declare const repoManager: RepoManager;
40
+ export {};
41
+ //# sourceMappingURL=repo-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-manager.d.ts","sourceRoot":"","sources":["../../src/server/repo-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AAED,cAAM,WAAW;IACf,OAAO,CAAC,QAAQ,CAAQ;;IAUxB;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IA0CvD;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;OAEG;YACW,SAAS;IA0CvB;;OAEG;YACW,UAAU;IA0BxB;;OAEG;YACW,gBAAgB;IAY9B;;OAEG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAoB1E;AAED,eAAO,MAAM,WAAW,aAAoB,CAAA"}