@gracefultools/astrid-sdk 0.6.1 → 0.7.1

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,531 @@
1
+ "use strict";
2
+ /**
3
+ * Terminal OpenAI Executor
4
+ *
5
+ * Executes tasks using OpenAI API with local tool execution.
6
+ * This enables running tasks assigned to openai@astrid.cc in terminal mode.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.terminalOpenAIExecutor = exports.TerminalOpenAIExecutor = void 0;
43
+ const fs = __importStar(require("fs/promises"));
44
+ const path = __importStar(require("path"));
45
+ const child_process_1 = require("child_process");
46
+ const glob_1 = require("glob");
47
+ const terminal_base_js_1 = require("./terminal-base.js");
48
+ const agent_config_js_1 = require("../utils/agent-config.js");
49
+ // ============================================================================
50
+ // TOOL DEFINITIONS (same as openai.ts)
51
+ // ============================================================================
52
+ const TOOLS = [
53
+ {
54
+ type: 'function',
55
+ function: {
56
+ name: 'read_file',
57
+ description: 'Read the contents of a file',
58
+ parameters: {
59
+ type: 'object',
60
+ properties: {
61
+ file_path: { type: 'string', description: 'Path to the file' }
62
+ },
63
+ required: ['file_path']
64
+ }
65
+ }
66
+ },
67
+ {
68
+ type: 'function',
69
+ function: {
70
+ name: 'write_file',
71
+ description: 'Write content to a file',
72
+ parameters: {
73
+ type: 'object',
74
+ properties: {
75
+ file_path: { type: 'string', description: 'Path to the file' },
76
+ content: { type: 'string', description: 'Content to write' }
77
+ },
78
+ required: ['file_path', 'content']
79
+ }
80
+ }
81
+ },
82
+ {
83
+ type: 'function',
84
+ function: {
85
+ name: 'edit_file',
86
+ description: 'Edit a file by replacing old_string with new_string',
87
+ parameters: {
88
+ type: 'object',
89
+ properties: {
90
+ file_path: { type: 'string', description: 'Path to the file' },
91
+ old_string: { type: 'string', description: 'String to find' },
92
+ new_string: { type: 'string', description: 'Replacement string' }
93
+ },
94
+ required: ['file_path', 'old_string', 'new_string']
95
+ }
96
+ }
97
+ },
98
+ {
99
+ type: 'function',
100
+ function: {
101
+ name: 'run_bash',
102
+ description: 'Run a bash command',
103
+ parameters: {
104
+ type: 'object',
105
+ properties: {
106
+ command: { type: 'string', description: 'The bash command' }
107
+ },
108
+ required: ['command']
109
+ }
110
+ }
111
+ },
112
+ {
113
+ type: 'function',
114
+ function: {
115
+ name: 'glob_files',
116
+ description: 'Find files matching a glob pattern',
117
+ parameters: {
118
+ type: 'object',
119
+ properties: {
120
+ pattern: { type: 'string', description: 'Glob pattern' }
121
+ },
122
+ required: ['pattern']
123
+ }
124
+ }
125
+ },
126
+ {
127
+ type: 'function',
128
+ function: {
129
+ name: 'grep_search',
130
+ description: 'Search for a pattern in files',
131
+ parameters: {
132
+ type: 'object',
133
+ properties: {
134
+ pattern: { type: 'string', description: 'Search pattern' },
135
+ file_pattern: { type: 'string', description: 'Optional glob pattern' }
136
+ },
137
+ required: ['pattern']
138
+ }
139
+ }
140
+ },
141
+ {
142
+ type: 'function',
143
+ function: {
144
+ name: 'task_complete',
145
+ description: 'Signal that the task is complete',
146
+ parameters: {
147
+ type: 'object',
148
+ properties: {
149
+ summary: { type: 'string', description: 'Summary of what was done' },
150
+ commit_message: { type: 'string', description: 'Git commit message' },
151
+ pr_title: { type: 'string', description: 'PR title' },
152
+ pr_description: { type: 'string', description: 'PR description' }
153
+ },
154
+ required: ['summary']
155
+ }
156
+ }
157
+ }
158
+ ];
159
+ // Dangerous commands that should be blocked
160
+ const DANGEROUS_COMMANDS = ['rm -rf /', 'sudo', '> /dev/', 'mkfs', 'dd if='];
161
+ async function executeTool(name, args, repoPath) {
162
+ try {
163
+ switch (name) {
164
+ case 'read_file': {
165
+ const filePath = path.join(repoPath, args.file_path);
166
+ const content = await fs.readFile(filePath, 'utf-8');
167
+ return { success: true, result: content };
168
+ }
169
+ case 'write_file': {
170
+ const filePath = path.join(repoPath, args.file_path);
171
+ const content = args.content;
172
+ let action = 'create';
173
+ try {
174
+ await fs.access(filePath);
175
+ action = 'modify';
176
+ }
177
+ catch {
178
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
179
+ }
180
+ await fs.writeFile(filePath, content, 'utf-8');
181
+ return {
182
+ success: true,
183
+ result: `File ${action === 'create' ? 'created' : 'updated'}: ${args.file_path}`,
184
+ fileChange: { path: args.file_path, content, action }
185
+ };
186
+ }
187
+ case 'edit_file': {
188
+ const filePath = path.join(repoPath, args.file_path);
189
+ const oldContent = await fs.readFile(filePath, 'utf-8');
190
+ const oldString = args.old_string;
191
+ const newString = args.new_string;
192
+ if (!oldContent.includes(oldString)) {
193
+ return { success: false, result: `Error: Could not find string in file` };
194
+ }
195
+ const newContent = oldContent.replace(oldString, newString);
196
+ await fs.writeFile(filePath, newContent, 'utf-8');
197
+ return {
198
+ success: true,
199
+ result: `File edited: ${args.file_path}`,
200
+ fileChange: { path: args.file_path, content: newContent, action: 'modify' }
201
+ };
202
+ }
203
+ case 'run_bash': {
204
+ const command = args.command;
205
+ if (DANGEROUS_COMMANDS.some(d => command.includes(d))) {
206
+ return { success: false, result: 'Error: Command blocked by safety policy' };
207
+ }
208
+ try {
209
+ const output = (0, child_process_1.execSync)(command, {
210
+ cwd: repoPath,
211
+ encoding: 'utf-8',
212
+ timeout: 120000, // 2 minute timeout
213
+ maxBuffer: 1024 * 1024
214
+ });
215
+ return { success: true, result: output || '(no output)' };
216
+ }
217
+ catch (error) {
218
+ const err = error;
219
+ return { success: false, result: `Error: ${err.stderr || err.message}` };
220
+ }
221
+ }
222
+ case 'glob_files': {
223
+ const pattern = args.pattern;
224
+ const files = await (0, glob_1.glob)(pattern, { cwd: repoPath, nodir: true });
225
+ return { success: true, result: files.slice(0, 100).join('\n') || '(no matches)' };
226
+ }
227
+ case 'grep_search': {
228
+ const pattern = args.pattern;
229
+ const filePattern = args.file_pattern || '.';
230
+ try {
231
+ const output = (0, child_process_1.execSync)(`grep -rn "${pattern.replace(/"/g, '\\"')}" ${filePattern} | head -50`, { cwd: repoPath, encoding: 'utf-8', timeout: 30000 });
232
+ return { success: true, result: output || '(no matches)' };
233
+ }
234
+ catch {
235
+ return { success: true, result: '(no matches)' };
236
+ }
237
+ }
238
+ case 'task_complete':
239
+ return { success: true, result: 'Task marked complete' };
240
+ default:
241
+ return { success: false, result: `Unknown tool: ${name}` };
242
+ }
243
+ }
244
+ catch (error) {
245
+ return { success: false, result: `Error: ${error instanceof Error ? error.message : String(error)}` };
246
+ }
247
+ }
248
+ async function callOpenAI(messages, apiKey, model) {
249
+ const controller = new AbortController();
250
+ const timeoutId = setTimeout(() => controller.abort(), 120000); // 2 minute timeout
251
+ try {
252
+ const response = await fetch('https://api.openai.com/v1/chat/completions', {
253
+ method: 'POST',
254
+ headers: {
255
+ 'Content-Type': 'application/json',
256
+ 'Authorization': `Bearer ${apiKey}`
257
+ },
258
+ signal: controller.signal,
259
+ body: JSON.stringify({
260
+ model,
261
+ messages,
262
+ tools: TOOLS,
263
+ tool_choice: 'auto',
264
+ max_tokens: 8192,
265
+ temperature: 0.2
266
+ })
267
+ });
268
+ clearTimeout(timeoutId);
269
+ if (!response.ok) {
270
+ const errorText = await response.text();
271
+ throw new Error(`OpenAI API error (${response.status}): ${errorText.substring(0, 200)}`);
272
+ }
273
+ return response.json();
274
+ }
275
+ catch (error) {
276
+ clearTimeout(timeoutId);
277
+ throw error;
278
+ }
279
+ }
280
+ // ============================================================================
281
+ // TERMINAL OPENAI EXECUTOR
282
+ // ============================================================================
283
+ class TerminalOpenAIExecutor {
284
+ apiKey;
285
+ model;
286
+ maxTurns;
287
+ timeout;
288
+ constructor(options = {}) {
289
+ this.apiKey = options.apiKey || process.env.OPENAI_API_KEY || '';
290
+ this.model = options.model || process.env.OPENAI_MODEL || agent_config_js_1.DEFAULT_MODELS.openai;
291
+ this.maxTurns = options.maxTurns || parseInt(process.env.OPENAI_MAX_TURNS || '50', 10);
292
+ this.timeout = options.timeout || parseInt(process.env.OPENAI_TIMEOUT || '900000', 10); // 15 min default
293
+ }
294
+ /**
295
+ * Check if OpenAI API key is configured
296
+ */
297
+ async checkAvailable() {
298
+ return !!this.apiKey;
299
+ }
300
+ /**
301
+ * Read project context files
302
+ */
303
+ async readProjectContext(projectPath) {
304
+ const MAX_CONTEXT_CHARS = 8000;
305
+ const contextFiles = ['ASTRID.md', 'CODEX.md', 'README.md'];
306
+ let context = '';
307
+ for (const file of contextFiles) {
308
+ try {
309
+ const filePath = path.join(projectPath, file);
310
+ let content = await fs.readFile(filePath, 'utf-8');
311
+ if (content.length > MAX_CONTEXT_CHARS) {
312
+ content = content.slice(0, MAX_CONTEXT_CHARS) + '\n\n[... truncated ...]';
313
+ }
314
+ context += `\n\n## Project Instructions (from ${file})\n\n${content}`;
315
+ break; // Only use the first found file
316
+ }
317
+ catch {
318
+ // File doesn't exist, try next
319
+ }
320
+ }
321
+ return context;
322
+ }
323
+ /**
324
+ * Build system prompt for the task
325
+ */
326
+ async buildSystemPrompt(session) {
327
+ const projectContext = await this.readProjectContext(session.projectPath || process.cwd());
328
+ return `You are an expert software engineer working on a coding task.
329
+ You have access to tools for reading, writing, and editing files, running bash commands, and searching the codebase.
330
+
331
+ ${projectContext}
332
+
333
+ ## Your Task
334
+ ${session.title}
335
+ ${session.description ? `\nDetails: ${session.description}` : ''}
336
+
337
+ ## Workflow
338
+
339
+ 1. **Understand** the task by reading relevant files
340
+ 2. **Plan** your approach - identify which files need changes
341
+ 3. **Implement** the changes using the available tools
342
+ 4. **Test** your changes by running build/tests: \`npm run predeploy\` or similar
343
+ 5. **Create PR** using \`gh pr create\` command
344
+ 6. **Complete** the task by calling task_complete with a summary
345
+
346
+ ## Rules
347
+
348
+ - Make ONLY the requested changes - don't over-engineer
349
+ - Follow existing code patterns and style
350
+ - Test your changes before completing
351
+ - Write clear commit messages
352
+ - Always create a PR unless explicitly told not to
353
+
354
+ Begin by reading the relevant files to understand the current state.`;
355
+ }
356
+ /**
357
+ * Start a new session to process a task
358
+ */
359
+ async startSession(session, prompt, context, onProgress) {
360
+ const projectPath = session.projectPath || process.cwd();
361
+ const systemPrompt = await this.buildSystemPrompt(session);
362
+ const userPrompt = prompt || (0, terminal_base_js_1.buildDefaultPrompt)(session, context);
363
+ const commentHistory = (0, terminal_base_js_1.formatCommentHistory)(context?.comments);
364
+ console.log(`🚀 Starting OpenAI terminal session for task: ${session.title}`);
365
+ console.log(`📁 Working directory: ${projectPath}`);
366
+ console.log(`🤖 Model: ${this.model}`);
367
+ const messages = [
368
+ { role: 'system', content: systemPrompt },
369
+ { role: 'user', content: commentHistory ? `${commentHistory}\n\n---\n\n${userPrompt}` : userPrompt }
370
+ ];
371
+ const modifiedFiles = [];
372
+ let stdout = '';
373
+ let prUrl;
374
+ let completeSummary;
375
+ const startTime = Date.now();
376
+ try {
377
+ for (let turn = 0; turn < this.maxTurns; turn++) {
378
+ // Check timeout
379
+ if (Date.now() - startTime > this.timeout) {
380
+ stdout += '\n\n[Execution timed out]';
381
+ break;
382
+ }
383
+ onProgress?.(`Turn ${turn + 1}/${this.maxTurns}...`);
384
+ const response = await callOpenAI(messages, this.apiKey, this.model);
385
+ const choice = response.choices[0];
386
+ const assistantMessage = choice.message;
387
+ // Add assistant message to history
388
+ messages.push({
389
+ role: 'assistant',
390
+ content: assistantMessage.content,
391
+ tool_calls: assistantMessage.tool_calls
392
+ });
393
+ // Log assistant response
394
+ if (assistantMessage.content) {
395
+ stdout += `\n\n${assistantMessage.content}`;
396
+ console.log(`📝 Assistant: ${assistantMessage.content.slice(0, 200)}...`);
397
+ }
398
+ // Handle tool calls
399
+ if (assistantMessage.tool_calls && assistantMessage.tool_calls.length > 0) {
400
+ for (const toolCall of assistantMessage.tool_calls) {
401
+ const toolName = toolCall.function.name;
402
+ const args = JSON.parse(toolCall.function.arguments);
403
+ onProgress?.(`Using tool: ${toolName}`);
404
+ console.log(`🔧 Tool: ${toolName}`);
405
+ // Check for task_complete
406
+ if (toolName === 'task_complete') {
407
+ completeSummary = args.summary;
408
+ stdout += `\n\n[Task Complete]\nSummary: ${completeSummary}`;
409
+ // Capture git changes
410
+ const changes = await (0, terminal_base_js_1.captureGitChanges)(projectPath);
411
+ prUrl = (0, terminal_base_js_1.extractPrUrl)(stdout);
412
+ return {
413
+ exitCode: 0,
414
+ stdout,
415
+ stderr: '',
416
+ modifiedFiles: changes.files.length > 0 ? changes.files : modifiedFiles,
417
+ gitDiff: changes.diff,
418
+ prUrl,
419
+ };
420
+ }
421
+ // Execute tool
422
+ const result = await executeTool(toolName, args, projectPath);
423
+ stdout += `\n\n[${toolName}]: ${result.result.slice(0, 500)}${result.result.length > 500 ? '...' : ''}`;
424
+ // Track modified files
425
+ if (result.fileChange) {
426
+ if (!modifiedFiles.includes(result.fileChange.path)) {
427
+ modifiedFiles.push(result.fileChange.path);
428
+ }
429
+ }
430
+ // Add tool result to messages
431
+ messages.push({
432
+ role: 'tool',
433
+ content: result.result.slice(0, 10000), // Truncate large outputs
434
+ tool_call_id: toolCall.id
435
+ });
436
+ }
437
+ continue;
438
+ }
439
+ // Check for stop condition
440
+ if (choice.finish_reason === 'stop') {
441
+ // Check if we should prompt for completion
442
+ if (!completeSummary) {
443
+ messages.push({
444
+ role: 'user',
445
+ content: 'Please call task_complete to finalize your work, or continue if there is more to do.'
446
+ });
447
+ }
448
+ else {
449
+ break;
450
+ }
451
+ }
452
+ }
453
+ // Capture final git changes
454
+ const changes = await (0, terminal_base_js_1.captureGitChanges)(projectPath);
455
+ prUrl = (0, terminal_base_js_1.extractPrUrl)(stdout);
456
+ return {
457
+ exitCode: 0,
458
+ stdout,
459
+ stderr: '',
460
+ modifiedFiles: changes.files.length > 0 ? changes.files : modifiedFiles,
461
+ gitDiff: changes.diff,
462
+ prUrl,
463
+ };
464
+ }
465
+ catch (error) {
466
+ const errorMsg = error instanceof Error ? error.message : String(error);
467
+ console.error(`❌ OpenAI terminal execution error:`, errorMsg);
468
+ return {
469
+ exitCode: 1,
470
+ stdout,
471
+ stderr: errorMsg,
472
+ modifiedFiles,
473
+ };
474
+ }
475
+ }
476
+ /**
477
+ * Resume a session with new input
478
+ * Note: OpenAI doesn't have native session management, so we rebuild context
479
+ */
480
+ async resumeSession(session, input, context, onProgress) {
481
+ console.log(`🔄 Resuming OpenAI session (rebuilding context)`);
482
+ // For OpenAI, resuming means starting a new conversation with the follow-up
483
+ const fullPrompt = (0, terminal_base_js_1.formatCommentHistory)(context?.comments) +
484
+ `\n\n---\n\n## Follow-up Request\n\n${input}`;
485
+ return this.startSession(session, fullPrompt, context, onProgress);
486
+ }
487
+ /**
488
+ * Parse output to extract key information
489
+ */
490
+ parseOutput(output) {
491
+ const result = {};
492
+ const lines = output.split('\n');
493
+ const files = [];
494
+ for (const line of lines) {
495
+ // Extract modified/created files
496
+ const fileMatch = line.match(/(?:modified|created|edited|wrote):\s*[`'"]*([^`'"]+)[`'"]*/i);
497
+ if (fileMatch) {
498
+ files.push(fileMatch[1].trim());
499
+ }
500
+ // Extract PR URL
501
+ const prMatch = line.match(/(https:\/\/github\.com\/[\w-]+\/[\w-]+\/pull\/\d+)/i);
502
+ if (prMatch) {
503
+ result.prUrl = prMatch[1];
504
+ }
505
+ // Extract error messages
506
+ if (line.toLowerCase().includes('error:') || line.toLowerCase().includes('failed:')) {
507
+ result.error = line.trim();
508
+ }
509
+ }
510
+ if (files.length > 0) {
511
+ result.files = [...new Set(files)];
512
+ }
513
+ // Try to extract summary (look for task_complete summary)
514
+ const summaryMatch = output.match(/\[Task Complete\]\s*Summary:\s*([^\n]+)/i);
515
+ if (summaryMatch) {
516
+ result.summary = summaryMatch[1].trim();
517
+ }
518
+ else {
519
+ // Fallback: last substantial paragraph
520
+ const paragraphs = output.split(/\n\n+/).filter(p => p.trim().length > 50);
521
+ if (paragraphs.length > 0) {
522
+ result.summary = paragraphs[paragraphs.length - 1].trim().slice(0, 500);
523
+ }
524
+ }
525
+ return result;
526
+ }
527
+ }
528
+ exports.TerminalOpenAIExecutor = TerminalOpenAIExecutor;
529
+ // Export singleton for convenience
530
+ exports.terminalOpenAIExecutor = new TerminalOpenAIExecutor();
531
+ //# sourceMappingURL=terminal-openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-openai.js","sourceRoot":"","sources":["../../src/executors/terminal-openai.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -10,4 +10,9 @@ export { planWithClaude, executeWithClaude, prepareRepository, getGitHubUser, ty
10
10
  export { planWithOpenAI, executeWithOpenAI, type OpenAIExecutorConfig, } from './executors/openai.js';
11
11
  export { planWithGemini, executeWithGemini, type GeminiExecutorConfig, } from './executors/gemini.js';
12
12
  export { AstridOAuthClient, type AstridOAuthConfig, type APIResponse, type Comment, type CreateTaskData, type UpdateTaskData, } from './adapters/astrid-oauth.js';
13
+ export type { TerminalExecutor, TerminalExecutionResult, TerminalTaskContext, TerminalProgressCallback, ParsedOutput, } from './executors/terminal-base.js';
14
+ export { extractPrUrl, formatCommentHistory, captureGitChanges, buildDefaultPrompt, } from './executors/terminal-base.js';
15
+ export { TerminalClaudeExecutor, terminalSessionStore, type TerminalClaudeOptions, } from './executors/terminal-claude.js';
16
+ export { TerminalOpenAIExecutor, terminalOpenAIExecutor, type TerminalOpenAIOptions, } from './executors/terminal-openai.js';
17
+ export { TerminalGeminiExecutor, terminalGeminiExecutor, type TerminalGeminiOptions, } from './executors/terminal-gemini.js';
13
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,SAAS,EACT,aAAa,EACb,QAAQ,EACR,MAAM,EACN,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,KAAK,oBAAoB,GAC1B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,SAAS,EACT,aAAa,EACb,QAAQ,EACR,MAAM,EACN,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,yBAAyB,CAAA;AAGhC,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,KAAK,oBAAoB,GAC1B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,KAAK,oBAAoB,GAC1B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,4BAA4B,CAAA;AAGnC,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,YAAY,GACb,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,8BAA8B,CAAA;AAErC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,KAAK,qBAAqB,GAC3B,MAAM,gCAAgC,CAAA;AAEvC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,gCAAgC,CAAA;AAEvC,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,gCAAgC,CAAA"}
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * AI agent SDK for automated coding tasks with Claude, OpenAI, and Gemini
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.AstridOAuthClient = exports.executeWithGemini = exports.planWithGemini = exports.executeWithOpenAI = exports.planWithOpenAI = exports.getGitHubUser = exports.prepareRepository = exports.executeWithClaude = exports.planWithClaude = exports.getAllAgentConfigs = exports.getRegisteredAgentEmails = exports.isRegisteredAgent = exports.getAgentContextFile = exports.getAgentModel = exports.getAgentService = exports.getAgentConfig = exports.DEFAULT_MODELS = exports.SUGGESTED_MODELS = exports.AI_AGENT_CONFIG = exports.CONFIG_DEFAULTS = exports.isProtectedPath = exports.isBlockedCommand = exports.getInitialGlobPattern = exports.generatePlatformHints = exports.generateStructurePrompt = exports.detectPlatform = exports.clearConfigCache = exports.loadAstridConfig = void 0;
8
+ exports.terminalGeminiExecutor = exports.TerminalGeminiExecutor = exports.terminalOpenAIExecutor = exports.TerminalOpenAIExecutor = exports.terminalSessionStore = exports.TerminalClaudeExecutor = exports.buildDefaultPrompt = exports.captureGitChanges = exports.formatCommentHistory = exports.extractPrUrl = exports.AstridOAuthClient = exports.executeWithGemini = exports.planWithGemini = exports.executeWithOpenAI = exports.planWithOpenAI = exports.getGitHubUser = exports.prepareRepository = exports.executeWithClaude = exports.planWithClaude = exports.getAllAgentConfigs = exports.getRegisteredAgentEmails = exports.isRegisteredAgent = exports.getAgentContextFile = exports.getAgentModel = exports.getAgentService = exports.getAgentConfig = exports.DEFAULT_MODELS = exports.SUGGESTED_MODELS = exports.AI_AGENT_CONFIG = exports.CONFIG_DEFAULTS = exports.isProtectedPath = exports.isBlockedCommand = exports.getInitialGlobPattern = exports.generatePlatformHints = exports.generateStructurePrompt = exports.detectPlatform = exports.clearConfigCache = exports.loadAstridConfig = void 0;
9
9
  // Configuration
10
10
  var index_js_1 = require("./config/index.js");
11
11
  Object.defineProperty(exports, "loadAstridConfig", { enumerable: true, get: function () { return index_js_1.loadAstridConfig; } });
@@ -46,4 +46,18 @@ Object.defineProperty(exports, "executeWithGemini", { enumerable: true, get: fun
46
46
  // Astrid OAuth Client
47
47
  var astrid_oauth_js_1 = require("./adapters/astrid-oauth.js");
48
48
  Object.defineProperty(exports, "AstridOAuthClient", { enumerable: true, get: function () { return astrid_oauth_js_1.AstridOAuthClient; } });
49
+ var terminal_base_js_1 = require("./executors/terminal-base.js");
50
+ Object.defineProperty(exports, "extractPrUrl", { enumerable: true, get: function () { return terminal_base_js_1.extractPrUrl; } });
51
+ Object.defineProperty(exports, "formatCommentHistory", { enumerable: true, get: function () { return terminal_base_js_1.formatCommentHistory; } });
52
+ Object.defineProperty(exports, "captureGitChanges", { enumerable: true, get: function () { return terminal_base_js_1.captureGitChanges; } });
53
+ Object.defineProperty(exports, "buildDefaultPrompt", { enumerable: true, get: function () { return terminal_base_js_1.buildDefaultPrompt; } });
54
+ var terminal_claude_js_1 = require("./executors/terminal-claude.js");
55
+ Object.defineProperty(exports, "TerminalClaudeExecutor", { enumerable: true, get: function () { return terminal_claude_js_1.TerminalClaudeExecutor; } });
56
+ Object.defineProperty(exports, "terminalSessionStore", { enumerable: true, get: function () { return terminal_claude_js_1.terminalSessionStore; } });
57
+ var terminal_openai_js_1 = require("./executors/terminal-openai.js");
58
+ Object.defineProperty(exports, "TerminalOpenAIExecutor", { enumerable: true, get: function () { return terminal_openai_js_1.TerminalOpenAIExecutor; } });
59
+ Object.defineProperty(exports, "terminalOpenAIExecutor", { enumerable: true, get: function () { return terminal_openai_js_1.terminalOpenAIExecutor; } });
60
+ var terminal_gemini_js_1 = require("./executors/terminal-gemini.js");
61
+ Object.defineProperty(exports, "TerminalGeminiExecutor", { enumerable: true, get: function () { return terminal_gemini_js_1.TerminalGeminiExecutor; } });
62
+ Object.defineProperty(exports, "terminalGeminiExecutor", { enumerable: true, get: function () { return terminal_gemini_js_1.terminalGeminiExecutor; } });
49
63
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAoBH,gBAAgB;AAChB,8CAkB0B;AAjBxB,4GAAA,gBAAgB,OAAA;AAChB,4GAAA,gBAAgB,OAAA;AAChB,0GAAA,cAAc,OAAA;AACd,mHAAA,uBAAuB,OAAA;AACvB,iHAAA,qBAAqB,OAAA;AACrB,iHAAA,qBAAqB,OAAA;AACrB,4GAAA,gBAAgB,OAAA;AAChB,2GAAA,eAAe,OAAA;AACf,2GAAA,eAAe,OAAA;AAWjB,sBAAsB;AACtB,2DAWgC;AAV9B,kHAAA,eAAe,OAAA;AACf,mHAAA,gBAAgB,OAAA;AAChB,iHAAA,cAAc,OAAA;AACd,iHAAA,cAAc,OAAA;AACd,kHAAA,eAAe,OAAA;AACf,gHAAA,aAAa,OAAA;AACb,sHAAA,mBAAmB,OAAA;AACnB,oHAAA,iBAAiB,OAAA;AACjB,2HAAA,wBAAwB,OAAA;AACxB,qHAAA,kBAAkB,OAAA;AAGpB,kBAAkB;AAClB,mDAM8B;AAL5B,2GAAA,cAAc,OAAA;AACd,8GAAA,iBAAiB,OAAA;AACjB,8GAAA,iBAAiB,OAAA;AACjB,0GAAA,aAAa,OAAA;AAIf,kBAAkB;AAClB,mDAI8B;AAH5B,2GAAA,cAAc,OAAA;AACd,8GAAA,iBAAiB,OAAA;AAInB,kBAAkB;AAClB,mDAI8B;AAH5B,2GAAA,cAAc,OAAA;AACd,8GAAA,iBAAiB,OAAA;AAInB,sBAAsB;AACtB,8DAOmC;AANjC,oHAAA,iBAAiB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAoBH,gBAAgB;AAChB,8CAkB0B;AAjBxB,4GAAA,gBAAgB,OAAA;AAChB,4GAAA,gBAAgB,OAAA;AAChB,0GAAA,cAAc,OAAA;AACd,mHAAA,uBAAuB,OAAA;AACvB,iHAAA,qBAAqB,OAAA;AACrB,iHAAA,qBAAqB,OAAA;AACrB,4GAAA,gBAAgB,OAAA;AAChB,2GAAA,eAAe,OAAA;AACf,2GAAA,eAAe,OAAA;AAWjB,sBAAsB;AACtB,2DAWgC;AAV9B,kHAAA,eAAe,OAAA;AACf,mHAAA,gBAAgB,OAAA;AAChB,iHAAA,cAAc,OAAA;AACd,iHAAA,cAAc,OAAA;AACd,kHAAA,eAAe,OAAA;AACf,gHAAA,aAAa,OAAA;AACb,sHAAA,mBAAmB,OAAA;AACnB,oHAAA,iBAAiB,OAAA;AACjB,2HAAA,wBAAwB,OAAA;AACxB,qHAAA,kBAAkB,OAAA;AAGpB,kBAAkB;AAClB,mDAM8B;AAL5B,2GAAA,cAAc,OAAA;AACd,8GAAA,iBAAiB,OAAA;AACjB,8GAAA,iBAAiB,OAAA;AACjB,0GAAA,aAAa,OAAA;AAIf,kBAAkB;AAClB,mDAI8B;AAH5B,2GAAA,cAAc,OAAA;AACd,8GAAA,iBAAiB,OAAA;AAInB,kBAAkB;AAClB,mDAI8B;AAH5B,2GAAA,cAAc,OAAA;AACd,8GAAA,iBAAiB,OAAA;AAInB,sBAAsB;AACtB,8DAOmC;AANjC,oHAAA,iBAAiB,OAAA;AAiBnB,iEAKqC;AAJnC,gHAAA,YAAY,OAAA;AACZ,wHAAA,oBAAoB,OAAA;AACpB,qHAAA,iBAAiB,OAAA;AACjB,sHAAA,kBAAkB,OAAA;AAGpB,qEAIuC;AAHrC,4HAAA,sBAAsB,OAAA;AACtB,0HAAA,oBAAoB,OAAA;AAItB,qEAIuC;AAHrC,4HAAA,sBAAsB,OAAA;AACtB,4HAAA,sBAAsB,OAAA;AAIxB,qEAIuC;AAHrC,4HAAA,sBAAsB,OAAA;AACtB,4HAAA,sBAAsB,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gracefultools/astrid-sdk",
3
- "version": "0.6.1",
3
+ "version": "0.7.1",
4
4
  "description": "AI agent SDK for automated coding tasks with Claude, OpenAI, and Gemini",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -24,7 +24,8 @@
24
24
  "dev": "tsc --watch",
25
25
  "clean": "rm -rf dist",
26
26
  "prepublishOnly": "npm run clean && npm run build",
27
- "test": "echo \"No tests yet\" && exit 0"
27
+ "test": "vitest run",
28
+ "test:watch": "vitest"
28
29
  },
29
30
  "keywords": [
30
31
  "ai",
@@ -53,8 +54,8 @@
53
54
  "glob": "^10.3.10"
54
55
  },
55
56
  "peerDependencies": {
56
- "typescript": ">=5.0.0",
57
- "express": "^4.18.0 || ^5.0.0"
57
+ "express": "^4.18.0 || ^5.0.0",
58
+ "typescript": ">=5.0.0"
58
59
  },
59
60
  "peerDependenciesMeta": {
60
61
  "typescript": {
@@ -70,6 +71,7 @@
70
71
  "devDependencies": {
71
72
  "@types/express": "^4.17.21",
72
73
  "@types/node": "^20.0.0",
73
- "typescript": "^5.0.0"
74
+ "typescript": "^5.0.0",
75
+ "vitest": "^3.2.4"
74
76
  }
75
77
  }