@ariso-ai/ivan 1.0.4 → 1.0.6
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 +7 -21
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +245 -4
- package/dist/config.js.map +1 -1
- package/dist/database/migrations/009_create_memory_tables.d.ts +3 -0
- package/dist/database/migrations/009_create_memory_tables.d.ts.map +1 -0
- package/dist/database/migrations/009_create_memory_tables.js +35 -0
- package/dist/database/migrations/009_create_memory_tables.js.map +1 -0
- package/dist/database/migrations/{006_add_comment_url_and_commit_to_tasks.d.ts → 009_create_repository_table.d.ts} +1 -1
- package/dist/database/migrations/009_create_repository_table.d.ts.map +1 -0
- package/dist/database/migrations/009_create_repository_table.js +15 -0
- package/dist/database/migrations/009_create_repository_table.js.map +1 -0
- package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.d.ts +3 -0
- package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.d.ts.map +1 -0
- package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.js +13 -0
- package/dist/database/migrations/010_add_repository_id_to_jobs_and_tasks.js.map +1 -0
- package/dist/database/migrations/011_create_learnings_table.d.ts +3 -0
- package/dist/database/migrations/011_create_learnings_table.d.ts.map +1 -0
- package/dist/database/migrations/011_create_learnings_table.js +16 -0
- package/dist/database/migrations/011_create_learnings_table.js.map +1 -0
- package/dist/database/migrations/012_create_learning_embeddings_table.d.ts +3 -0
- package/dist/database/migrations/012_create_learning_embeddings_table.d.ts.map +1 -0
- package/dist/database/migrations/012_create_learning_embeddings_table.js +13 -0
- package/dist/database/migrations/012_create_learning_embeddings_table.js.map +1 -0
- package/dist/database/migrations/index.d.ts.map +1 -1
- package/dist/database/migrations/index.js +5 -1
- package/dist/database/migrations/index.js.map +1 -1
- package/dist/database/types.d.ts +11 -0
- package/dist/database/types.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/services/address-executor.d.ts.map +1 -1
- package/dist/services/address-executor.js +8 -21
- package/dist/services/address-executor.js.map +1 -1
- package/dist/services/address-task-executor.d.ts.map +1 -1
- package/dist/services/address-task-executor.js +10 -9
- package/dist/services/address-task-executor.js.map +1 -1
- package/dist/services/embedding-service.d.ts +12 -0
- package/dist/services/embedding-service.d.ts.map +1 -0
- package/dist/services/embedding-service.js +51 -0
- package/dist/services/embedding-service.js.map +1 -0
- package/dist/services/git-interfaces.d.ts +67 -0
- package/dist/services/git-interfaces.d.ts.map +1 -0
- package/dist/services/git-interfaces.js +2 -0
- package/dist/services/git-interfaces.js.map +1 -0
- package/dist/services/git-manager-cli.d.ts +33 -0
- package/dist/services/git-manager-cli.d.ts.map +1 -0
- package/dist/services/git-manager-cli.js +734 -0
- package/dist/services/git-manager-cli.js.map +1 -0
- package/dist/services/git-manager-pat.d.ts +36 -0
- package/dist/services/git-manager-pat.d.ts.map +1 -0
- package/dist/services/git-manager-pat.js +667 -0
- package/dist/services/git-manager-pat.js.map +1 -0
- package/dist/services/git-manager.d.ts +1 -0
- package/dist/services/git-manager.d.ts.map +1 -1
- package/dist/services/git-manager.js +10 -4
- package/dist/services/git-manager.js.map +1 -1
- package/dist/services/github-api-client.d.ts +115 -0
- package/dist/services/github-api-client.d.ts.map +1 -0
- package/dist/services/github-api-client.js +256 -0
- package/dist/services/github-api-client.js.map +1 -0
- package/dist/services/index.d.ts +9 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +12 -2
- package/dist/services/index.js.map +1 -1
- package/dist/services/job-manager.d.ts +3 -4
- package/dist/services/job-manager.d.ts.map +1 -1
- package/dist/services/job-manager.js +14 -19
- package/dist/services/job-manager.js.map +1 -1
- package/dist/services/learn-executor.d.ts +13 -0
- package/dist/services/learn-executor.d.ts.map +1 -0
- package/dist/services/learn-executor.js +293 -0
- package/dist/services/learn-executor.js.map +1 -0
- package/dist/services/learning-service.d.ts +30 -0
- package/dist/services/learning-service.d.ts.map +1 -0
- package/dist/services/learning-service.js +88 -0
- package/dist/services/learning-service.js.map +1 -0
- package/dist/services/memory-service.d.ts +26 -0
- package/dist/services/memory-service.d.ts.map +1 -0
- package/dist/services/memory-service.js +128 -0
- package/dist/services/memory-service.js.map +1 -0
- package/dist/services/pr-service-cli.d.ts +12 -0
- package/dist/services/pr-service-cli.d.ts.map +1 -0
- package/dist/services/pr-service-cli.js +291 -0
- package/dist/services/pr-service-cli.js.map +1 -0
- package/dist/services/pr-service-pat.d.ts +15 -0
- package/dist/services/pr-service-pat.d.ts.map +1 -0
- package/dist/services/pr-service-pat.js +255 -0
- package/dist/services/pr-service-pat.js.map +1 -0
- package/dist/services/repository-manager-cli.d.ts +17 -0
- package/dist/services/repository-manager-cli.d.ts.map +1 -0
- package/dist/services/repository-manager-cli.js +148 -0
- package/dist/services/repository-manager-cli.js.map +1 -0
- package/dist/services/repository-manager-pat.d.ts +17 -0
- package/dist/services/repository-manager-pat.d.ts.map +1 -0
- package/dist/services/repository-manager-pat.js +148 -0
- package/dist/services/repository-manager-pat.js.map +1 -0
- package/dist/services/repository-manager.d.ts +7 -0
- package/dist/services/repository-manager.d.ts.map +1 -1
- package/dist/services/repository-manager.js +47 -0
- package/dist/services/repository-manager.js.map +1 -1
- package/dist/services/service-factory.d.ts +27 -0
- package/dist/services/service-factory.d.ts.map +1 -0
- package/dist/services/service-factory.js +79 -0
- package/dist/services/service-factory.js.map +1 -0
- package/dist/services/task-executor.d.ts.map +1 -1
- package/dist/services/task-executor.js +42 -75
- package/dist/services/task-executor.js.map +1 -1
- package/package.json +2 -2
- package/dist/agent.d.ts +0 -11
- package/dist/agent.d.ts.map +0 -1
- package/dist/agent.js +0 -48
- package/dist/agent.js.map +0 -1
- package/dist/config/config.d.ts +0 -20
- package/dist/config/config.d.ts.map +0 -1
- package/dist/config/config.js +0 -187
- package/dist/config/config.js.map +0 -1
- package/dist/database/database.d.ts +0 -12
- package/dist/database/database.d.ts.map +0 -1
- package/dist/database/database.js +0 -45
- package/dist/database/database.js.map +0 -1
- package/dist/database/migrations/001_initial_schema.d.ts +0 -3
- package/dist/database/migrations/001_initial_schema.d.ts.map +0 -1
- package/dist/database/migrations/001_initial_schema.js +0 -66
- package/dist/database/migrations/001_initial_schema.js.map +0 -1
- package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.d.ts.map +0 -1
- package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.js +0 -15
- package/dist/database/migrations/006_add_comment_url_and_commit_to_tasks.js.map +0 -1
- package/dist/scripts/task-executor.d.ts +0 -3
- package/dist/scripts/task-executor.d.ts.map +0 -1
- package/dist/scripts/task-executor.js +0 -139
- package/dist/scripts/task-executor.js.map +0 -1
- package/dist/scripts/task-planner.d.ts +0 -3
- package/dist/scripts/task-planner.d.ts.map +0 -1
- package/dist/scripts/task-planner.js +0 -81
- package/dist/scripts/task-planner.js.map +0 -1
- package/dist/services/claude-planner.d.ts +0 -15
- package/dist/services/claude-planner.d.ts.map +0 -1
- package/dist/services/claude-planner.js +0 -107
- package/dist/services/claude-planner.js.map +0 -1
- package/dist/services/docker-orchestrator.d.ts +0 -11
- package/dist/services/docker-orchestrator.d.ts.map +0 -1
- package/dist/services/docker-orchestrator.js +0 -85
- package/dist/services/docker-orchestrator.js.map +0 -1
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { spawn } from 'child_process';
|
|
3
|
-
import { exec } from 'child_process';
|
|
4
|
-
import { promisify } from 'util';
|
|
5
|
-
const execAsync = promisify(exec);
|
|
6
|
-
async function executeCommand(command) {
|
|
7
|
-
try {
|
|
8
|
-
const { stdout, stderr } = await execAsync(command);
|
|
9
|
-
return { stdout, stderr };
|
|
10
|
-
}
|
|
11
|
-
catch (error) {
|
|
12
|
-
console.error(`Command failed: ${command}`);
|
|
13
|
-
console.error(error);
|
|
14
|
-
throw error;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
async function main() {
|
|
18
|
-
const env = process.env;
|
|
19
|
-
console.log('📋 Task Planner Starting');
|
|
20
|
-
console.log(`Request: ${env.USER_REQUEST}\n`);
|
|
21
|
-
try {
|
|
22
|
-
// Clone repository
|
|
23
|
-
console.log('📥 Cloning repository...');
|
|
24
|
-
await executeCommand(`git clone ${env.REPOSITORY} /workspace/repo`);
|
|
25
|
-
process.chdir('/workspace/repo');
|
|
26
|
-
const prompt = 'Say the word "maximum"';
|
|
27
|
-
console.log('🤔 Planning tasks with Claude...');
|
|
28
|
-
// Use spawn to call Claude with real-time output
|
|
29
|
-
const claudeProcess = spawn('claude', [
|
|
30
|
-
'-p',
|
|
31
|
-
`"${prompt}"`,
|
|
32
|
-
'--output-format',
|
|
33
|
-
'json',
|
|
34
|
-
'--permission-mode',
|
|
35
|
-
'plan'
|
|
36
|
-
]);
|
|
37
|
-
let stdout = '';
|
|
38
|
-
let stderr = '';
|
|
39
|
-
claudeProcess.stdout.on('data', (data) => {
|
|
40
|
-
const chunk = data.toString();
|
|
41
|
-
stdout += chunk;
|
|
42
|
-
process.stdout.write(chunk);
|
|
43
|
-
});
|
|
44
|
-
claudeProcess.stderr.on('data', (data) => {
|
|
45
|
-
const chunk = data.toString();
|
|
46
|
-
stderr += chunk;
|
|
47
|
-
process.stderr.write(chunk);
|
|
48
|
-
});
|
|
49
|
-
await new Promise((resolve, reject) => {
|
|
50
|
-
claudeProcess.on('close', (code) => {
|
|
51
|
-
if (code !== 0) {
|
|
52
|
-
reject(new Error(`Claude CLI exited with code ${code}: ${stderr}`));
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
resolve();
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
claudeProcess.on('error', (error) => {
|
|
59
|
-
reject(new Error(`Failed to start Claude CLI: ${error}`));
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
// Parse the Claude CLI response
|
|
63
|
-
const claudeResponse = JSON.parse(stdout);
|
|
64
|
-
// Extract the JSON from the result field (may be wrapped in ```json blocks)
|
|
65
|
-
let resultContent = claudeResponse.result;
|
|
66
|
-
// Remove markdown code blocks if present
|
|
67
|
-
resultContent = resultContent.replace(/^```json\s*/, '').replace(/\s*```$/, '');
|
|
68
|
-
const response = JSON.parse(resultContent);
|
|
69
|
-
console.log(`✓ Planned ${response.tasks.length} tasks`);
|
|
70
|
-
// Output the result as JSON for the parent process to read
|
|
71
|
-
console.log('TASK_PLAN_START');
|
|
72
|
-
console.log(JSON.stringify(response));
|
|
73
|
-
console.log('TASK_PLAN_END');
|
|
74
|
-
}
|
|
75
|
-
catch (error) {
|
|
76
|
-
console.error('❌ Task planning failed:', error);
|
|
77
|
-
process.exit(1);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
main().catch(console.error);
|
|
81
|
-
//# sourceMappingURL=task-planner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"task-planner.js","sourceRoot":"","sources":["../../src/scripts/task-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export interface TaskPlan {
|
|
2
|
-
title: string;
|
|
3
|
-
description: string;
|
|
4
|
-
order: number;
|
|
5
|
-
}
|
|
6
|
-
export interface TaskPlanResponse {
|
|
7
|
-
tasks: TaskPlan[];
|
|
8
|
-
}
|
|
9
|
-
export declare class ClaudePlannerService {
|
|
10
|
-
private repository;
|
|
11
|
-
private anthropicApiKey;
|
|
12
|
-
constructor(repository: string, anthropicApiKey: string);
|
|
13
|
-
planTasks(userRequest: string): Promise<TaskPlanResponse>;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=claude-planner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-planner.d.ts","sourceRoot":"","sources":["../../src/services/claude-planner.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,eAAe,CAAS;gBAEpB,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;IAKjD,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA+GhE"}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { exec, spawn } from 'child_process';
|
|
2
|
-
import { promisify } from 'util';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import * as os from 'os';
|
|
5
|
-
import chalk from 'chalk';
|
|
6
|
-
const execAsync = promisify(exec);
|
|
7
|
-
export class ClaudePlannerService {
|
|
8
|
-
repository;
|
|
9
|
-
anthropicApiKey;
|
|
10
|
-
constructor(repository, anthropicApiKey) {
|
|
11
|
-
this.repository = repository;
|
|
12
|
-
this.anthropicApiKey = anthropicApiKey;
|
|
13
|
-
}
|
|
14
|
-
async planTasks(userRequest) {
|
|
15
|
-
console.log(chalk.gray('🤔 Planning tasks with Claude Code...'));
|
|
16
|
-
try {
|
|
17
|
-
const homeDir = os.homedir();
|
|
18
|
-
const scriptPath = path.join(process.cwd(), 'dist', 'scripts', 'task-planner.js');
|
|
19
|
-
console.log(chalk.gray('Starting planning container...'));
|
|
20
|
-
// Start container in background
|
|
21
|
-
const containerName = `ivan-planner-${Date.now()}`;
|
|
22
|
-
const startCommand = `docker run -d --name ${containerName} \
|
|
23
|
-
-e USER_REQUEST="${userRequest.replace(/"/g, '\\"')}" \
|
|
24
|
-
-e REPOSITORY="${this.repository}" \
|
|
25
|
-
-e HOST_HOME="${homeDir}" \
|
|
26
|
-
-e ANTHROPIC_API_KEY="${this.anthropicApiKey}" \
|
|
27
|
-
-w /workspace \
|
|
28
|
-
node:24-alpine \
|
|
29
|
-
sleep 300`;
|
|
30
|
-
await execAsync(startCommand);
|
|
31
|
-
let stdout = '';
|
|
32
|
-
let stderr = '';
|
|
33
|
-
try {
|
|
34
|
-
// Create app directory and copy scripts to container
|
|
35
|
-
await execAsync(`docker exec ${containerName} mkdir -p /app`);
|
|
36
|
-
await execAsync(`docker cp "${scriptPath}" ${containerName}:/app/task-planner.js`);
|
|
37
|
-
const setupScript = path.join(process.cwd(), 'src', 'scripts', 'setup-container.sh');
|
|
38
|
-
await execAsync(`docker cp "${setupScript}" ${containerName}:/app/setup-container.sh`);
|
|
39
|
-
// Copy SSH and git configs
|
|
40
|
-
await execAsync(`docker exec ${containerName} mkdir -p /root/.ssh /root/.claude/plugins`);
|
|
41
|
-
await execAsync(`docker cp "${homeDir}/.ssh/." ${containerName}:/root/.ssh/`).catch(() => { });
|
|
42
|
-
await execAsync(`docker cp "${homeDir}/.claude/." ${containerName}:/root/.claude/`).catch(() => { });
|
|
43
|
-
await execAsync(`docker cp "${homeDir}/.gitconfig" ${containerName}:/root/.gitconfig`).catch(() => { });
|
|
44
|
-
console.log('running docker');
|
|
45
|
-
// Execute setup and task planning with streaming output
|
|
46
|
-
const dockerProcess = spawn('docker', [
|
|
47
|
-
'exec', containerName, 'sh', '-c',
|
|
48
|
-
'chmod +x /app/setup-container.sh && /app/setup-container.sh && echo "Starting task planner..." && CLAUDE_CONFIG_DIR=/root/.claude node /app/task-planner.js'
|
|
49
|
-
]);
|
|
50
|
-
dockerProcess.stdout.on('data', (data) => {
|
|
51
|
-
const chunk = data.toString();
|
|
52
|
-
stdout += chunk;
|
|
53
|
-
process.stdout.write(chunk);
|
|
54
|
-
});
|
|
55
|
-
dockerProcess.stderr.on('data', (data) => {
|
|
56
|
-
const chunk = data.toString();
|
|
57
|
-
stderr += chunk;
|
|
58
|
-
process.stderr.write(chunk);
|
|
59
|
-
});
|
|
60
|
-
await new Promise((resolve, reject) => {
|
|
61
|
-
dockerProcess.on('close', (code) => {
|
|
62
|
-
if (code !== 0) {
|
|
63
|
-
reject(new Error(`Docker exec exited with code ${code}`));
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
resolve();
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
dockerProcess.on('error', (error) => {
|
|
70
|
-
reject(new Error(`Failed to execute docker command: ${error}`));
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
console.log(chalk.gray('=== CONTAINER OUTPUT START ==='));
|
|
74
|
-
console.log(stdout);
|
|
75
|
-
console.log(chalk.gray('=== CONTAINER OUTPUT END ==='));
|
|
76
|
-
if (stderr) {
|
|
77
|
-
console.log(chalk.yellow('=== CONTAINER STDERR START ==='));
|
|
78
|
-
console.log(stderr);
|
|
79
|
-
console.log(chalk.yellow('=== CONTAINER STDERR END ==='));
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
finally {
|
|
83
|
-
// Clean up container
|
|
84
|
-
await execAsync(`docker rm -f ${containerName}`).catch(() => { });
|
|
85
|
-
}
|
|
86
|
-
// Extract the JSON response from between the markers
|
|
87
|
-
const startMarker = 'TASK_PLAN_START';
|
|
88
|
-
const endMarker = 'TASK_PLAN_END';
|
|
89
|
-
const startIndex = stdout.indexOf(startMarker);
|
|
90
|
-
const endIndex = stdout.indexOf(endMarker);
|
|
91
|
-
if (startIndex === -1 || endIndex === -1) {
|
|
92
|
-
console.log(chalk.red('Failed to find task plan in output:'));
|
|
93
|
-
console.log(stdout);
|
|
94
|
-
throw new Error('Task plan markers not found in output');
|
|
95
|
-
}
|
|
96
|
-
const jsonString = stdout.substring(startIndex + startMarker.length, endIndex).trim();
|
|
97
|
-
const response = JSON.parse(jsonString);
|
|
98
|
-
console.log(chalk.green(`✓ Planned ${response.tasks.length} tasks`));
|
|
99
|
-
return response;
|
|
100
|
-
}
|
|
101
|
-
catch (error) {
|
|
102
|
-
console.error(chalk.red('Failed to plan tasks:'), error);
|
|
103
|
-
throw new Error('Task planning failed');
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
//# sourceMappingURL=claude-planner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-planner.js","sourceRoot":"","sources":["../../src/services/claude-planner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { TaskTable } from '../database/types.js';
|
|
2
|
-
import { JobManager } from './job-manager.js';
|
|
3
|
-
export declare class DockerOrchestrator {
|
|
4
|
-
private jobManager;
|
|
5
|
-
private repository;
|
|
6
|
-
private openAiApiKey;
|
|
7
|
-
constructor(jobManager: JobManager, repository: string, openAiApiKey: string);
|
|
8
|
-
runTask(task: TaskTable): Promise<void>;
|
|
9
|
-
runAllTasks(jobId: number): Promise<void>;
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=docker-orchestrator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docker-orchestrator.d.ts","sourceRoot":"","sources":["../../src/services/docker-orchestrator.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;gBAEjB,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM;IAMtE,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA8DvC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAchD"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { exec } from 'child_process';
|
|
2
|
-
import { promisify } from 'util';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import * as os from 'os';
|
|
5
|
-
import chalk from 'chalk';
|
|
6
|
-
const execAsync = promisify(exec);
|
|
7
|
-
export class DockerOrchestrator {
|
|
8
|
-
jobManager;
|
|
9
|
-
repository;
|
|
10
|
-
openAiApiKey;
|
|
11
|
-
constructor(jobManager, repository, openAiApiKey) {
|
|
12
|
-
this.jobManager = jobManager;
|
|
13
|
-
this.repository = repository;
|
|
14
|
-
this.openAiApiKey = openAiApiKey;
|
|
15
|
-
}
|
|
16
|
-
async runTask(task) {
|
|
17
|
-
console.log(chalk.blue(`\n🐳 Running task: ${task.title}`));
|
|
18
|
-
if (!task.id) {
|
|
19
|
-
throw new Error('Task ID is required');
|
|
20
|
-
}
|
|
21
|
-
await this.jobManager.updateTaskStatus(task.id, 'in_progress');
|
|
22
|
-
try {
|
|
23
|
-
const containerName = `ivan-task-${task.id}`;
|
|
24
|
-
const branchName = `ivan/${task.title}`;
|
|
25
|
-
const homeDir = os.homedir();
|
|
26
|
-
const scriptPath = path.join(process.cwd(), 'dist', 'scripts', 'task-executor.js');
|
|
27
|
-
// Build Docker command
|
|
28
|
-
const dockerCommand = `docker run --rm \
|
|
29
|
-
--name ${containerName} \
|
|
30
|
-
-v ${scriptPath}:/app/task-executor.js:ro \
|
|
31
|
-
-v ${homeDir}/.ivan/db.sqlite:${homeDir}/.ivan/db.sqlite \
|
|
32
|
-
-e TASK_ID="${task.id}" \
|
|
33
|
-
-e TASK_TITLE="${task.title}" \
|
|
34
|
-
-e TASK_DESCRIPTION="${task.description}" \
|
|
35
|
-
-e BRANCH_NAME="${branchName}" \
|
|
36
|
-
-e REPOSITORY="${this.repository}" \
|
|
37
|
-
-e OPENAI_API_KEY="${this.openAiApiKey}" \
|
|
38
|
-
-e IVAN_DB_PATH="${homeDir}/.ivan/db.sqlite" \
|
|
39
|
-
-e CLAUDE_DIR="${homeDir}/.claude" \
|
|
40
|
-
-e SSH_DIR="${homeDir}/.ssh" \
|
|
41
|
-
-e GIT_CONFIG="${homeDir}/.gitconfig" \
|
|
42
|
-
-w /workspace \
|
|
43
|
-
node:24-alpine \
|
|
44
|
-
sh -c "apk add --no-cache git openssh && \
|
|
45
|
-
mkdir -p /root/.ssh /root/.claude/plugins && \
|
|
46
|
-
cp -r \${CLAUDE_DIR}/* /root/.claude/ 2>/dev/null || true && \
|
|
47
|
-
cp -r \${SSH_DIR}/* /root/.ssh/ 2>/dev/null || true && \
|
|
48
|
-
cp \${GIT_CONFIG} /root/.gitconfig 2>/dev/null || true && \
|
|
49
|
-
chmod 600 /root/.ssh/* 2>/dev/null || true && \
|
|
50
|
-
ssh-keyscan -H github.com >> /root/.ssh/known_hosts 2>/dev/null || true && \
|
|
51
|
-
git config --global user.name 'Ivan Agent' 2>/dev/null || true && \
|
|
52
|
-
git config --global user.email 'ivan@agent.local' 2>/dev/null || true && \
|
|
53
|
-
npm i -g @anthropic-ai/claude-code && \
|
|
54
|
-
echo 'Starting task executor...' && \
|
|
55
|
-
CLAUDE_CONFIG_DIR=/root/.claude node /app/task-executor.js"`;
|
|
56
|
-
console.log(chalk.gray('Starting Docker container...'));
|
|
57
|
-
const { stdout, stderr } = await execAsync(dockerCommand);
|
|
58
|
-
if (stdout)
|
|
59
|
-
console.log(chalk.gray(stdout));
|
|
60
|
-
if (stderr)
|
|
61
|
-
console.error(chalk.yellow(stderr));
|
|
62
|
-
await this.jobManager.updateTaskStatus(task.id, 'completed');
|
|
63
|
-
console.log(chalk.green(`✓ Task ${task.title} completed`));
|
|
64
|
-
}
|
|
65
|
-
catch (error) {
|
|
66
|
-
console.error(chalk.red(`✗ Task ${task.title} failed:`), error);
|
|
67
|
-
await this.jobManager.updateTaskStatus(task.id, 'failed');
|
|
68
|
-
throw error;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
async runAllTasks(jobId) {
|
|
72
|
-
const tasks = await this.jobManager.getJobTasks(jobId);
|
|
73
|
-
console.log(chalk.cyan(`\n🚀 Running ${tasks.length} tasks for job #${jobId}\n`));
|
|
74
|
-
for (const task of tasks) {
|
|
75
|
-
try {
|
|
76
|
-
await this.runTask(task);
|
|
77
|
-
console.log(chalk.gray('─'.repeat(50)));
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
console.error(chalk.red(`Failed to run task ${task.title}, continuing with next task...`));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
//# sourceMappingURL=docker-orchestrator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"docker-orchestrator.js","sourceRoot":"","sources":["../../src/services/docker-orchestrator.ts"],"names":[],"mappings":"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"}
|