@ymdvsymd/tornado 0.6.0 → 0.6.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.
- package/README.md +17 -4
- package/bin/tornado.js +1054 -523
- package/package.json +1 -1
- package/sdk/parallel-runner.mjs +46 -0
- package/sdk/parallel-runner.mts +70 -0
package/package.json
CHANGED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { runAdapter } from "./agent-runner.mjs";
|
|
2
|
+
import { createClaudeAdapter } from "./claude-adapter.mjs";
|
|
3
|
+
import { createCodexAdapter } from "./codex-adapter.mjs";
|
|
4
|
+
const arg = process.argv[2];
|
|
5
|
+
if (!arg) {
|
|
6
|
+
throw new Error("Missing parallel runner options JSON in argv[2]");
|
|
7
|
+
}
|
|
8
|
+
const input = JSON.parse(arg);
|
|
9
|
+
const adapter = createAdapter(input.runner);
|
|
10
|
+
const results = await Promise.allSettled(input.tasks.map(async (task) => collectTaskOutput(adapter, task)));
|
|
11
|
+
process.stdout.write(`${JSON.stringify(results.map(formatSettledResult))}\n`);
|
|
12
|
+
function createAdapter(runner) {
|
|
13
|
+
switch (runner) {
|
|
14
|
+
case "claude":
|
|
15
|
+
return createClaudeAdapter();
|
|
16
|
+
case "codex":
|
|
17
|
+
return createCodexAdapter();
|
|
18
|
+
default:
|
|
19
|
+
throw new Error(`Unsupported runner: ${runner}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async function collectTaskOutput(adapter, opts) {
|
|
23
|
+
let buffer = "";
|
|
24
|
+
const io = {
|
|
25
|
+
write(event) {
|
|
26
|
+
buffer += `${JSON.stringify(event)}\n`;
|
|
27
|
+
},
|
|
28
|
+
log() {
|
|
29
|
+
// Suppress stderr logging for parallel result aggregation.
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
await runAdapter(adapter, opts, io);
|
|
33
|
+
return buffer;
|
|
34
|
+
}
|
|
35
|
+
function formatSettledResult(result) {
|
|
36
|
+
if (result.status === "fulfilled") {
|
|
37
|
+
return result.value;
|
|
38
|
+
}
|
|
39
|
+
return `ERROR: ${getErrorMessage(result.reason)}`;
|
|
40
|
+
}
|
|
41
|
+
function getErrorMessage(error) {
|
|
42
|
+
if (error instanceof Error) {
|
|
43
|
+
return error.message;
|
|
44
|
+
}
|
|
45
|
+
return String(error);
|
|
46
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { runAdapter } from "./agent-runner.mjs";
|
|
2
|
+
import type { AdapterIO, AgentAdapter, RunnerOptions } from "./agent-adapter.mjs";
|
|
3
|
+
import { createClaudeAdapter } from "./claude-adapter.mjs";
|
|
4
|
+
import { createCodexAdapter } from "./codex-adapter.mjs";
|
|
5
|
+
|
|
6
|
+
type ParallelRunnerName = "claude" | "codex";
|
|
7
|
+
|
|
8
|
+
type ParallelRunnerInput = {
|
|
9
|
+
runner: ParallelRunnerName;
|
|
10
|
+
tasks: RunnerOptions[];
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const arg = process.argv[2];
|
|
14
|
+
if (!arg) {
|
|
15
|
+
throw new Error("Missing parallel runner options JSON in argv[2]");
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const input = JSON.parse(arg) as ParallelRunnerInput;
|
|
19
|
+
const adapter = createAdapter(input.runner);
|
|
20
|
+
const results = await Promise.allSettled(
|
|
21
|
+
input.tasks.map(async (task) => collectTaskOutput(adapter, task)),
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
process.stdout.write(`${JSON.stringify(results.map(formatSettledResult))}\n`);
|
|
25
|
+
|
|
26
|
+
function createAdapter(
|
|
27
|
+
runner: ParallelRunnerName,
|
|
28
|
+
): AgentAdapter<unknown> {
|
|
29
|
+
switch (runner) {
|
|
30
|
+
case "claude":
|
|
31
|
+
return createClaudeAdapter();
|
|
32
|
+
case "codex":
|
|
33
|
+
return createCodexAdapter();
|
|
34
|
+
default:
|
|
35
|
+
throw new Error(`Unsupported runner: ${runner satisfies never}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async function collectTaskOutput(
|
|
40
|
+
adapter: AgentAdapter<unknown>,
|
|
41
|
+
opts: RunnerOptions,
|
|
42
|
+
): Promise<string> {
|
|
43
|
+
let buffer = "";
|
|
44
|
+
const io: AdapterIO = {
|
|
45
|
+
write(event) {
|
|
46
|
+
buffer += `${JSON.stringify(event)}\n`;
|
|
47
|
+
},
|
|
48
|
+
log() {
|
|
49
|
+
// Suppress stderr logging for parallel result aggregation.
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
await runAdapter(adapter, opts, io);
|
|
54
|
+
return buffer;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function formatSettledResult(result: PromiseSettledResult<string>): string {
|
|
58
|
+
if (result.status === "fulfilled") {
|
|
59
|
+
return result.value;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return `ERROR: ${getErrorMessage(result.reason)}`;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function getErrorMessage(error: unknown): string {
|
|
66
|
+
if (error instanceof Error) {
|
|
67
|
+
return error.message;
|
|
68
|
+
}
|
|
69
|
+
return String(error);
|
|
70
|
+
}
|