paean 0.4.2 → 0.6.2
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/CHANGELOG.md +114 -0
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/worker.d.ts +7 -0
- package/dist/commands/worker.d.ts.map +1 -0
- package/dist/commands/worker.js +321 -0
- package/dist/commands/worker.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/system.d.ts +30 -0
- package/dist/mcp/system.d.ts.map +1 -0
- package/dist/mcp/system.js +530 -0
- package/dist/mcp/system.js.map +1 -0
- package/dist/mcp/tools.d.ts +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +5 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/ui/theme/branding.d.ts.map +1 -1
- package/dist/ui/theme/branding.js +2 -7
- package/dist/ui/theme/branding.js.map +1 -1
- package/dist/worker/executors/claude.d.ts +29 -0
- package/dist/worker/executors/claude.d.ts.map +1 -0
- package/dist/worker/executors/claude.js +114 -0
- package/dist/worker/executors/claude.js.map +1 -0
- package/dist/worker/executors/codex.d.ts +29 -0
- package/dist/worker/executors/codex.d.ts.map +1 -0
- package/dist/worker/executors/codex.js +126 -0
- package/dist/worker/executors/codex.js.map +1 -0
- package/dist/worker/executors/cursor.d.ts +29 -0
- package/dist/worker/executors/cursor.d.ts.map +1 -0
- package/dist/worker/executors/cursor.js +136 -0
- package/dist/worker/executors/cursor.js.map +1 -0
- package/dist/worker/executors/gemini.d.ts +29 -0
- package/dist/worker/executors/gemini.d.ts.map +1 -0
- package/dist/worker/executors/gemini.js +129 -0
- package/dist/worker/executors/gemini.js.map +1 -0
- package/dist/worker/executors/index.d.ts +56 -0
- package/dist/worker/executors/index.d.ts.map +1 -0
- package/dist/worker/executors/index.js +108 -0
- package/dist/worker/executors/index.js.map +1 -0
- package/dist/worker/executors/internal.d.ts +23 -0
- package/dist/worker/executors/internal.d.ts.map +1 -0
- package/dist/worker/executors/internal.js +77 -0
- package/dist/worker/executors/internal.js.map +1 -0
- package/dist/worker/executors/opencode.d.ts +31 -0
- package/dist/worker/executors/opencode.d.ts.map +1 -0
- package/dist/worker/executors/opencode.js +129 -0
- package/dist/worker/executors/opencode.js.map +1 -0
- package/dist/worker/index.d.ts +14 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +17 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/service.d.ts +72 -0
- package/dist/worker/service.d.ts.map +1 -0
- package/dist/worker/service.js +435 -0
- package/dist/worker/service.js.map +1 -0
- package/dist/worker/supervisor.d.ts +83 -0
- package/dist/worker/supervisor.d.ts.map +1 -0
- package/dist/worker/supervisor.js +412 -0
- package/dist/worker/supervisor.js.map +1 -0
- package/dist/worker/types.d.ts +278 -0
- package/dist/worker/types.d.ts.map +1 -0
- package/dist/worker/types.js +71 -0
- package/dist/worker/types.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini CLI Executor
|
|
3
|
+
* Integrates with Gemini CLI for quick analysis and lightweight tasks
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from 'child_process';
|
|
6
|
+
import { promisify } from 'util';
|
|
7
|
+
import { exec as execCallback } from 'child_process';
|
|
8
|
+
const exec = promisify(execCallback);
|
|
9
|
+
export class GeminiExecutor {
|
|
10
|
+
type = 'gemini';
|
|
11
|
+
process = null;
|
|
12
|
+
binaryPath;
|
|
13
|
+
constructor(binaryPath = 'gemini') {
|
|
14
|
+
this.binaryPath = binaryPath;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if Gemini CLI is installed
|
|
18
|
+
*/
|
|
19
|
+
async isAvailable() {
|
|
20
|
+
try {
|
|
21
|
+
await exec(`which ${this.binaryPath}`);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Execute a prompt using Gemini CLI
|
|
30
|
+
*/
|
|
31
|
+
async execute(prompt, options) {
|
|
32
|
+
const startTime = Date.now();
|
|
33
|
+
const args = this.buildArgs(prompt, options);
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
let stdout = '';
|
|
36
|
+
let stderr = '';
|
|
37
|
+
const timeout = options?.timeout ?? 600000; // 10 min default
|
|
38
|
+
this.process = spawn(this.binaryPath, args, {
|
|
39
|
+
cwd: options?.cwd,
|
|
40
|
+
env: { ...process.env, ...options?.env },
|
|
41
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
42
|
+
});
|
|
43
|
+
const timeoutId = setTimeout(() => {
|
|
44
|
+
if (this.process) {
|
|
45
|
+
this.process.kill('SIGTERM');
|
|
46
|
+
resolve({
|
|
47
|
+
success: false,
|
|
48
|
+
output: stdout,
|
|
49
|
+
error: `Execution timed out after ${timeout}ms`,
|
|
50
|
+
durationMs: Date.now() - startTime,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}, timeout);
|
|
54
|
+
this.process.stdout?.on('data', (data) => {
|
|
55
|
+
const text = data.toString();
|
|
56
|
+
stdout += text;
|
|
57
|
+
options?.onOutput?.(text, 'stdout');
|
|
58
|
+
});
|
|
59
|
+
this.process.stderr?.on('data', (data) => {
|
|
60
|
+
const text = data.toString();
|
|
61
|
+
stderr += text;
|
|
62
|
+
options?.onOutput?.(text, 'stderr');
|
|
63
|
+
});
|
|
64
|
+
this.process.on('close', (code) => {
|
|
65
|
+
clearTimeout(timeoutId);
|
|
66
|
+
this.process = null;
|
|
67
|
+
// Try to parse JSON output
|
|
68
|
+
let structured;
|
|
69
|
+
try {
|
|
70
|
+
if (stdout.trim().startsWith('{')) {
|
|
71
|
+
structured = JSON.parse(stdout);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Not JSON
|
|
76
|
+
}
|
|
77
|
+
resolve({
|
|
78
|
+
success: code === 0,
|
|
79
|
+
output: stdout,
|
|
80
|
+
error: code !== 0 ? stderr || `Exit code: ${code}` : undefined,
|
|
81
|
+
exitCode: code ?? undefined,
|
|
82
|
+
durationMs: Date.now() - startTime,
|
|
83
|
+
structured,
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
this.process.on('error', (err) => {
|
|
87
|
+
clearTimeout(timeoutId);
|
|
88
|
+
this.process = null;
|
|
89
|
+
resolve({
|
|
90
|
+
success: false,
|
|
91
|
+
output: stdout,
|
|
92
|
+
error: err.message,
|
|
93
|
+
durationMs: Date.now() - startTime,
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Build Gemini CLI arguments
|
|
100
|
+
*/
|
|
101
|
+
buildArgs(prompt, options) {
|
|
102
|
+
const args = [];
|
|
103
|
+
// Positional prompt for non-interactive mode
|
|
104
|
+
args.push(prompt);
|
|
105
|
+
// Use JSON output format for structured parsing
|
|
106
|
+
if (options?.captureOutput) {
|
|
107
|
+
args.push('--output-format', 'json');
|
|
108
|
+
}
|
|
109
|
+
// YOLO mode for autonomous execution
|
|
110
|
+
if (options?.skipPermissions) {
|
|
111
|
+
args.push('--yolo');
|
|
112
|
+
}
|
|
113
|
+
// Additional args from options
|
|
114
|
+
if (options?.args) {
|
|
115
|
+
args.push(...options.args);
|
|
116
|
+
}
|
|
117
|
+
return args;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Abort current execution
|
|
121
|
+
*/
|
|
122
|
+
abort() {
|
|
123
|
+
if (this.process) {
|
|
124
|
+
this.process.kill('SIGTERM');
|
|
125
|
+
this.process = null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/worker/executors/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executor Framework
|
|
3
|
+
* Base interface and registry for multi-agent executors
|
|
4
|
+
*/
|
|
5
|
+
import type { ExecutorType, ExecutorOptions, ExecutorResult, ExecutorConfig } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Base interface for all agent executors
|
|
8
|
+
*/
|
|
9
|
+
export interface AgentExecutor {
|
|
10
|
+
/** Executor type identifier */
|
|
11
|
+
readonly type: ExecutorType;
|
|
12
|
+
/** Check if the executor is available on this system */
|
|
13
|
+
isAvailable(): Promise<boolean>;
|
|
14
|
+
/** Execute a prompt with this executor */
|
|
15
|
+
execute(prompt: string, options?: ExecutorOptions): Promise<ExecutorResult>;
|
|
16
|
+
/** Abort current execution */
|
|
17
|
+
abort(): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Registry for managing multiple executors
|
|
21
|
+
*/
|
|
22
|
+
export declare class ExecutorRegistry {
|
|
23
|
+
private executors;
|
|
24
|
+
private configs;
|
|
25
|
+
/**
|
|
26
|
+
* Register an executor
|
|
27
|
+
*/
|
|
28
|
+
register(executor: AgentExecutor, config?: ExecutorConfig): void;
|
|
29
|
+
/**
|
|
30
|
+
* Get an executor by type
|
|
31
|
+
*/
|
|
32
|
+
get(type: ExecutorType): AgentExecutor | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Get executor configuration
|
|
35
|
+
*/
|
|
36
|
+
getConfig(type: ExecutorType): ExecutorConfig | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Check if an executor is registered and enabled
|
|
39
|
+
*/
|
|
40
|
+
isEnabled(type: ExecutorType): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Get all available executors (installed and enabled)
|
|
43
|
+
*/
|
|
44
|
+
getAvailable(): Promise<ExecutorType[]>;
|
|
45
|
+
/**
|
|
46
|
+
* Get all registered executor types
|
|
47
|
+
*/
|
|
48
|
+
getRegistered(): ExecutorType[];
|
|
49
|
+
/**
|
|
50
|
+
* Execute with a specific executor
|
|
51
|
+
*/
|
|
52
|
+
execute(type: ExecutorType, prompt: string, options?: ExecutorOptions): Promise<ExecutorResult>;
|
|
53
|
+
}
|
|
54
|
+
export declare function getExecutorRegistry(): ExecutorRegistry;
|
|
55
|
+
export declare function resetExecutorRegistry(): void;
|
|
56
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/worker/executors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjG;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAE5B,wDAAwD;IACxD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC,0CAA0C;IAC1C,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAE5E,8BAA8B;IAC9B,KAAK,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,qBAAa,gBAAgB;IACzB,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,OAAO,CAAgD;IAE/D;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI;IAOhE;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,aAAa,GAAG,SAAS;IAIlD;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,GAAG,SAAS;IAIzD;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAKtC;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmB7C;;OAEG;IACH,aAAa,IAAI,YAAY,EAAE;IAI/B;;OAEG;IACG,OAAO,CACT,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GAC1B,OAAO,CAAC,cAAc,CAAC;CA+B7B;AAKD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executor Framework
|
|
3
|
+
* Base interface and registry for multi-agent executors
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Registry for managing multiple executors
|
|
7
|
+
*/
|
|
8
|
+
export class ExecutorRegistry {
|
|
9
|
+
executors = new Map();
|
|
10
|
+
configs = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Register an executor
|
|
13
|
+
*/
|
|
14
|
+
register(executor, config) {
|
|
15
|
+
this.executors.set(executor.type, executor);
|
|
16
|
+
if (config) {
|
|
17
|
+
this.configs.set(executor.type, config);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get an executor by type
|
|
22
|
+
*/
|
|
23
|
+
get(type) {
|
|
24
|
+
return this.executors.get(type);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get executor configuration
|
|
28
|
+
*/
|
|
29
|
+
getConfig(type) {
|
|
30
|
+
return this.configs.get(type);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if an executor is registered and enabled
|
|
34
|
+
*/
|
|
35
|
+
isEnabled(type) {
|
|
36
|
+
const config = this.configs.get(type);
|
|
37
|
+
return config?.enabled !== false;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get all available executors (installed and enabled)
|
|
41
|
+
*/
|
|
42
|
+
async getAvailable() {
|
|
43
|
+
const available = [];
|
|
44
|
+
for (const [type, executor] of this.executors) {
|
|
45
|
+
if (!this.isEnabled(type))
|
|
46
|
+
continue;
|
|
47
|
+
try {
|
|
48
|
+
const isAvail = await executor.isAvailable();
|
|
49
|
+
if (isAvail) {
|
|
50
|
+
available.push(type);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Not available
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return available;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get all registered executor types
|
|
61
|
+
*/
|
|
62
|
+
getRegistered() {
|
|
63
|
+
return Array.from(this.executors.keys());
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Execute with a specific executor
|
|
67
|
+
*/
|
|
68
|
+
async execute(type, prompt, options) {
|
|
69
|
+
const executor = this.executors.get(type);
|
|
70
|
+
if (!executor) {
|
|
71
|
+
return {
|
|
72
|
+
success: false,
|
|
73
|
+
output: '',
|
|
74
|
+
error: `Executor '${type}' not registered`,
|
|
75
|
+
durationMs: 0,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const available = await executor.isAvailable();
|
|
79
|
+
if (!available) {
|
|
80
|
+
return {
|
|
81
|
+
success: false,
|
|
82
|
+
output: '',
|
|
83
|
+
error: `Executor '${type}' is not available on this system`,
|
|
84
|
+
durationMs: 0,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// Merge with config defaults
|
|
88
|
+
const config = this.configs.get(type);
|
|
89
|
+
const mergedOptions = {
|
|
90
|
+
timeout: config?.timeout,
|
|
91
|
+
args: config?.defaultArgs,
|
|
92
|
+
...options,
|
|
93
|
+
};
|
|
94
|
+
return executor.execute(prompt, mergedOptions);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Export singleton registry
|
|
98
|
+
let registryInstance = null;
|
|
99
|
+
export function getExecutorRegistry() {
|
|
100
|
+
if (!registryInstance) {
|
|
101
|
+
registryInstance = new ExecutorRegistry();
|
|
102
|
+
}
|
|
103
|
+
return registryInstance;
|
|
104
|
+
}
|
|
105
|
+
export function resetExecutorRegistry() {
|
|
106
|
+
registryInstance = null;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/worker/executors/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal Agent Executor
|
|
3
|
+
* Uses Paean's built-in agent service for task execution
|
|
4
|
+
*/
|
|
5
|
+
import type { ExecutorOptions, ExecutorResult } from '../types.js';
|
|
6
|
+
import type { AgentExecutor } from './index.js';
|
|
7
|
+
export declare class InternalExecutor implements AgentExecutor {
|
|
8
|
+
readonly type: "internal";
|
|
9
|
+
private abortController;
|
|
10
|
+
/**
|
|
11
|
+
* Internal executor is always available
|
|
12
|
+
*/
|
|
13
|
+
isAvailable(): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Execute a prompt using the internal agent service
|
|
16
|
+
*/
|
|
17
|
+
execute(prompt: string, options?: ExecutorOptions): Promise<ExecutorResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Abort current execution
|
|
20
|
+
*/
|
|
21
|
+
abort(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../../src/worker/executors/internal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qBAAa,gBAAiB,YAAW,aAAa;IAClD,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,OAAO,CAAC,eAAe,CAAgC;IAEvD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAsDjF;;OAEG;IACH,KAAK,IAAI,IAAI;CAOhB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal Agent Executor
|
|
3
|
+
* Uses Paean's built-in agent service for task execution
|
|
4
|
+
*/
|
|
5
|
+
import { agentService } from '../../agent/service.js';
|
|
6
|
+
export class InternalExecutor {
|
|
7
|
+
type = 'internal';
|
|
8
|
+
abortController = null;
|
|
9
|
+
/**
|
|
10
|
+
* Internal executor is always available
|
|
11
|
+
*/
|
|
12
|
+
async isAvailable() {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Execute a prompt using the internal agent service
|
|
17
|
+
*/
|
|
18
|
+
async execute(prompt, options) {
|
|
19
|
+
const startTime = Date.now();
|
|
20
|
+
this.abortController = new AbortController();
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
let output = '';
|
|
23
|
+
let hasError = false;
|
|
24
|
+
let errorMessage = '';
|
|
25
|
+
const timeout = options?.timeout ?? 600000; // 10 min default
|
|
26
|
+
const timeoutId = setTimeout(() => {
|
|
27
|
+
agentService.abort();
|
|
28
|
+
resolve({
|
|
29
|
+
success: false,
|
|
30
|
+
output,
|
|
31
|
+
error: `Execution timed out after ${timeout}ms`,
|
|
32
|
+
durationMs: Date.now() - startTime,
|
|
33
|
+
});
|
|
34
|
+
}, timeout);
|
|
35
|
+
agentService.streamMessage(prompt, {
|
|
36
|
+
onContent: (text, partial) => {
|
|
37
|
+
if (partial) {
|
|
38
|
+
output += text;
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
output = text;
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
onError: (error) => {
|
|
45
|
+
hasError = true;
|
|
46
|
+
errorMessage = error;
|
|
47
|
+
},
|
|
48
|
+
onDone: () => {
|
|
49
|
+
clearTimeout(timeoutId);
|
|
50
|
+
this.abortController = null;
|
|
51
|
+
resolve({
|
|
52
|
+
success: !hasError,
|
|
53
|
+
output,
|
|
54
|
+
error: hasError ? errorMessage : undefined,
|
|
55
|
+
durationMs: Date.now() - startTime,
|
|
56
|
+
});
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
// Handle abort signal
|
|
60
|
+
this.abortController?.signal.addEventListener('abort', () => {
|
|
61
|
+
clearTimeout(timeoutId);
|
|
62
|
+
agentService.abort();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Abort current execution
|
|
68
|
+
*/
|
|
69
|
+
abort() {
|
|
70
|
+
if (this.abortController) {
|
|
71
|
+
this.abortController.abort();
|
|
72
|
+
this.abortController = null;
|
|
73
|
+
}
|
|
74
|
+
agentService.abort();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/worker/executors/internal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAItD,MAAM,OAAO,gBAAgB;IAChB,IAAI,GAAG,UAAmB,CAAC;IAC5B,eAAe,GAA2B,IAAI,CAAC;IAEvD;;OAEG;IACH,KAAK,CAAC,WAAW;QACb,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc,EAAE,OAAyB;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAE7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,YAAY,GAAG,EAAE,CAAC;YAEtB,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,MAAM,CAAC,CAAC,iBAAiB;YAE7D,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,YAAY,CAAC,KAAK,EAAE,CAAC;gBACrB,OAAO,CAAC;oBACJ,OAAO,EAAE,KAAK;oBACd,MAAM;oBACN,KAAK,EAAE,6BAA6B,OAAO,IAAI;oBAC/C,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACrC,CAAC,CAAC;YACP,CAAC,EAAE,OAAO,CAAC,CAAC;YAEZ,YAAY,CAAC,aAAa,CAAC,MAAM,EAAE;gBAC/B,SAAS,EAAE,CAAC,IAAY,EAAE,OAAgB,EAAE,EAAE;oBAC1C,IAAI,OAAO,EAAE,CAAC;wBACV,MAAM,IAAI,IAAI,CAAC;oBACnB,CAAC;yBAAM,CAAC;wBACJ,MAAM,GAAG,IAAI,CAAC;oBAClB,CAAC;gBACL,CAAC;gBACD,OAAO,EAAE,CAAC,KAAa,EAAE,EAAE;oBACvB,QAAQ,GAAG,IAAI,CAAC;oBAChB,YAAY,GAAG,KAAK,CAAC;gBACzB,CAAC;gBACD,MAAM,EAAE,GAAG,EAAE;oBACT,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;oBAE5B,OAAO,CAAC;wBACJ,OAAO,EAAE,CAAC,QAAQ;wBAClB,MAAM;wBACN,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;wBAC1C,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;qBACrC,CAAC,CAAC;gBACP,CAAC;aACJ,CAAC,CAAC;YAEH,sBAAsB;YACtB,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACxD,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,YAAY,CAAC,KAAK,EAAE,CAAC;YACzB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAChC,CAAC;QACD,YAAY,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACJ"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode CLI Executor
|
|
3
|
+
* Integrates with OpenCode CLI for AI-assisted coding tasks
|
|
4
|
+
* https://github.com/opencode-ai/opencode
|
|
5
|
+
*/
|
|
6
|
+
import type { ExecutorOptions, ExecutorResult } from '../types.js';
|
|
7
|
+
import type { AgentExecutor } from './index.js';
|
|
8
|
+
export declare class OpenCodeExecutor implements AgentExecutor {
|
|
9
|
+
readonly type: "opencode";
|
|
10
|
+
private process;
|
|
11
|
+
private binaryPath;
|
|
12
|
+
constructor(binaryPath?: string);
|
|
13
|
+
/**
|
|
14
|
+
* Check if OpenCode CLI is installed
|
|
15
|
+
*/
|
|
16
|
+
isAvailable(): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Execute a prompt using OpenCode CLI
|
|
19
|
+
*/
|
|
20
|
+
execute(prompt: string, options?: ExecutorOptions): Promise<ExecutorResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Build OpenCode CLI arguments
|
|
23
|
+
* Uses `opencode run [message..]` for non-interactive execution
|
|
24
|
+
*/
|
|
25
|
+
private buildArgs;
|
|
26
|
+
/**
|
|
27
|
+
* Abort current execution
|
|
28
|
+
*/
|
|
29
|
+
abort(): void;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/worker/executors/opencode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAIhD,qBAAa,gBAAiB,YAAW,aAAa;IAClD,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,GAAE,MAAmB;IAI3C;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IA+EjF;;;OAGG;IACH,OAAO,CAAC,SAAS;IAsBjB;;OAEG;IACH,KAAK,IAAI,IAAI;CAMhB"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode CLI Executor
|
|
3
|
+
* Integrates with OpenCode CLI for AI-assisted coding tasks
|
|
4
|
+
* https://github.com/opencode-ai/opencode
|
|
5
|
+
*/
|
|
6
|
+
import { spawn } from 'child_process';
|
|
7
|
+
import { promisify } from 'util';
|
|
8
|
+
import { exec as execCallback } from 'child_process';
|
|
9
|
+
const exec = promisify(execCallback);
|
|
10
|
+
export class OpenCodeExecutor {
|
|
11
|
+
type = 'opencode';
|
|
12
|
+
process = null;
|
|
13
|
+
binaryPath;
|
|
14
|
+
constructor(binaryPath = 'opencode') {
|
|
15
|
+
this.binaryPath = binaryPath;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Check if OpenCode CLI is installed
|
|
19
|
+
*/
|
|
20
|
+
async isAvailable() {
|
|
21
|
+
try {
|
|
22
|
+
await exec(`which ${this.binaryPath}`);
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Execute a prompt using OpenCode CLI
|
|
31
|
+
*/
|
|
32
|
+
async execute(prompt, options) {
|
|
33
|
+
const startTime = Date.now();
|
|
34
|
+
const args = this.buildArgs(prompt, options);
|
|
35
|
+
return new Promise((resolve) => {
|
|
36
|
+
let stdout = '';
|
|
37
|
+
let stderr = '';
|
|
38
|
+
const timeout = options?.timeout ?? 600000; // 10 min default
|
|
39
|
+
this.process = spawn(this.binaryPath, args, {
|
|
40
|
+
cwd: options?.cwd,
|
|
41
|
+
env: { ...process.env, ...options?.env },
|
|
42
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
43
|
+
});
|
|
44
|
+
const timeoutId = setTimeout(() => {
|
|
45
|
+
if (this.process) {
|
|
46
|
+
this.process.kill('SIGTERM');
|
|
47
|
+
resolve({
|
|
48
|
+
success: false,
|
|
49
|
+
output: stdout,
|
|
50
|
+
error: `Execution timed out after ${timeout}ms`,
|
|
51
|
+
durationMs: Date.now() - startTime,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}, timeout);
|
|
55
|
+
this.process.stdout?.on('data', (data) => {
|
|
56
|
+
const text = data.toString();
|
|
57
|
+
stdout += text;
|
|
58
|
+
options?.onOutput?.(text, 'stdout');
|
|
59
|
+
});
|
|
60
|
+
this.process.stderr?.on('data', (data) => {
|
|
61
|
+
const text = data.toString();
|
|
62
|
+
stderr += text;
|
|
63
|
+
options?.onOutput?.(text, 'stderr');
|
|
64
|
+
});
|
|
65
|
+
this.process.on('close', (code) => {
|
|
66
|
+
clearTimeout(timeoutId);
|
|
67
|
+
this.process = null;
|
|
68
|
+
// Try to parse JSON output if available
|
|
69
|
+
let structured;
|
|
70
|
+
try {
|
|
71
|
+
if (stdout.trim().startsWith('{')) {
|
|
72
|
+
structured = JSON.parse(stdout);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Not JSON
|
|
77
|
+
}
|
|
78
|
+
resolve({
|
|
79
|
+
success: code === 0,
|
|
80
|
+
output: stdout,
|
|
81
|
+
error: code !== 0 ? stderr || `Exit code: ${code}` : undefined,
|
|
82
|
+
exitCode: code ?? undefined,
|
|
83
|
+
durationMs: Date.now() - startTime,
|
|
84
|
+
structured,
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
this.process.on('error', (err) => {
|
|
88
|
+
clearTimeout(timeoutId);
|
|
89
|
+
this.process = null;
|
|
90
|
+
resolve({
|
|
91
|
+
success: false,
|
|
92
|
+
output: stdout,
|
|
93
|
+
error: err.message,
|
|
94
|
+
durationMs: Date.now() - startTime,
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Build OpenCode CLI arguments
|
|
101
|
+
* Uses `opencode run [message..]` for non-interactive execution
|
|
102
|
+
*/
|
|
103
|
+
buildArgs(prompt, options) {
|
|
104
|
+
const args = [];
|
|
105
|
+
// Use 'run' subcommand for direct execution
|
|
106
|
+
args.push('run');
|
|
107
|
+
// Add prompt as message
|
|
108
|
+
args.push(prompt);
|
|
109
|
+
// Print logs for debugging
|
|
110
|
+
if (options?.captureOutput) {
|
|
111
|
+
args.push('--print-logs');
|
|
112
|
+
}
|
|
113
|
+
// Additional args from options
|
|
114
|
+
if (options?.args) {
|
|
115
|
+
args.push(...options.args);
|
|
116
|
+
}
|
|
117
|
+
return args;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Abort current execution
|
|
121
|
+
*/
|
|
122
|
+
abort() {
|
|
123
|
+
if (this.process) {
|
|
124
|
+
this.process.kill('SIGTERM');
|
|
125
|
+
this.process = null;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/worker/executors/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Module Exports
|
|
3
|
+
*/
|
|
4
|
+
export { WorkerService, getWorker, resetWorker } from './service.js';
|
|
5
|
+
export { type WorkerConfig, type WorkerState, type TaskContext, type TaskResult, type WorkerEvent, type WorkerEventHandler, type WorkerStatus, DEFAULT_WORKER_CONFIG, buildTaskPrompt, type ExecutorType, type ExecutorConfig, type ExecutorOptions, type ExecutorResult, type SupervisorDecision, type VerificationResult, type RecoveryStrategy, type PromptCommandOptions, type PromptResult, type WorkerExecutorConfig, DEFAULT_EXECUTOR_CONFIG, } from './types.js';
|
|
6
|
+
export { SupervisorAgent, getSupervisor, resetSupervisor } from './supervisor.js';
|
|
7
|
+
export { type AgentExecutor, ExecutorRegistry, getExecutorRegistry, resetExecutorRegistry, } from './executors/index.js';
|
|
8
|
+
export { InternalExecutor } from './executors/internal.js';
|
|
9
|
+
export { ClaudeExecutor } from './executors/claude.js';
|
|
10
|
+
export { GeminiExecutor } from './executors/gemini.js';
|
|
11
|
+
export { CursorExecutor } from './executors/cursor.js';
|
|
12
|
+
export { CodexExecutor } from './executors/codex.js';
|
|
13
|
+
export { OpenCodeExecutor } from './executors/opencode.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EACH,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,qBAAqB,EACrB,eAAe,EAEf,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,uBAAuB,GAC1B,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGlF,OAAO,EACH,KAAK,aAAa,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,GACxB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker Module Exports
|
|
3
|
+
*/
|
|
4
|
+
export { WorkerService, getWorker, resetWorker } from './service.js';
|
|
5
|
+
export { DEFAULT_WORKER_CONFIG, buildTaskPrompt, DEFAULT_EXECUTOR_CONFIG, } from './types.js';
|
|
6
|
+
// Supervisor Agent
|
|
7
|
+
export { SupervisorAgent, getSupervisor, resetSupervisor } from './supervisor.js';
|
|
8
|
+
// Executor Framework
|
|
9
|
+
export { ExecutorRegistry, getExecutorRegistry, resetExecutorRegistry, } from './executors/index.js';
|
|
10
|
+
// Individual Executors
|
|
11
|
+
export { InternalExecutor } from './executors/internal.js';
|
|
12
|
+
export { ClaudeExecutor } from './executors/claude.js';
|
|
13
|
+
export { GeminiExecutor } from './executors/gemini.js';
|
|
14
|
+
export { CursorExecutor } from './executors/cursor.js';
|
|
15
|
+
export { CodexExecutor } from './executors/codex.js';
|
|
16
|
+
export { OpenCodeExecutor } from './executors/opencode.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAQH,qBAAqB,EACrB,eAAe,EAYf,uBAAuB,GAC1B,MAAM,YAAY,CAAC;AAEpB,mBAAmB;AACnB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElF,qBAAqB;AACrB,OAAO,EAEH,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,GACxB,MAAM,sBAAsB,CAAC;AAE9B,uBAAuB;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|