@ariso-ai/ivan 1.0.4 ā 1.0.5
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 +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +43 -1
- 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/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/services/address-task-executor.d.ts.map +1 -1
- package/dist/services/address-task-executor.js +5 -3
- 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-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/job-manager.d.ts +0 -1
- package/dist/services/job-manager.d.ts.map +1 -1
- package/dist/services/job-manager.js +0 -9
- package/dist/services/job-manager.js.map +1 -1
- 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/task-executor.d.ts.map +1 -1
- package/dist/services/task-executor.js +3 -7
- 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 +0 -3
- 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":";AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAiBlC,KAAK,UAAU,cAAc,CAAC,OAAe;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,OAAO,CAAC,GAA4B,CAAC;IAEjD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,mBAAmB;QACnB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,cAAc,CAAC,aAAa,GAAG,CAAC,UAAU,kBAAkB,CAAC,CAAC;QACpE,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAEjC,MAAM,MAAM,GAAG,wBAAwB,CAAC;QAExC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAEhD,iDAAiD;QACjD,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,EAAE;YACpC,IAAI;YACJ,IAAI,MAAM,GAAG;YACb,iBAAiB;YACjB,MAAM;YACN,mBAAmB;YACnB,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACjC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC;gBACtE,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,gCAAgC;QAChC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE1C,4EAA4E;QAC5E,IAAI,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC;QAE1C,yCAAyC;QACzC,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAEhF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAqB,CAAC;QAE/D,OAAO,CAAC,GAAG,CAAC,aAAa,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAExD,2DAA2D;QAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAE/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -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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"}
|