@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.
- package/README.md +177 -72
- package/dist/bin/cli.d.ts +2 -1
- package/dist/bin/cli.d.ts.map +1 -1
- package/dist/bin/cli.js +530 -29
- package/dist/bin/cli.js.map +1 -1
- package/dist/executors/terminal-claude.d.ts +109 -0
- package/dist/executors/terminal-claude.d.ts.map +1 -0
- package/dist/executors/terminal-claude.js +493 -0
- package/dist/executors/terminal-claude.js.map +1 -0
- package/dist/server/astrid-client.d.ts +77 -0
- package/dist/server/astrid-client.d.ts.map +1 -0
- package/dist/server/astrid-client.js +125 -0
- package/dist/server/astrid-client.js.map +1 -0
- package/dist/server/index.d.ts +38 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +408 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/repo-manager.d.ts +41 -0
- package/dist/server/repo-manager.d.ts.map +1 -0
- package/dist/server/repo-manager.js +177 -0
- package/dist/server/repo-manager.js.map +1 -0
- package/dist/server/session-manager.d.ts +93 -0
- package/dist/server/session-manager.d.ts.map +1 -0
- package/dist/server/session-manager.js +217 -0
- package/dist/server/session-manager.js.map +1 -0
- package/dist/server/webhook-signature.d.ts +23 -0
- package/dist/server/webhook-signature.d.ts.map +1 -0
- package/dist/server/webhook-signature.js +74 -0
- package/dist/server/webhook-signature.js.map +1 -0
- package/package.json +7 -2
|
@@ -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"}
|