@ghostwater/soulforge 0.1.0
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/LICENSE +21 -0
- package/README.md +115 -0
- package/dist/cli/cli.d.ts +2 -0
- package/dist/cli/cli.js +483 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/daemon/daemon-entry.d.ts +2 -0
- package/dist/daemon/daemon-entry.js +8 -0
- package/dist/daemon/daemon-entry.js.map +1 -0
- package/dist/daemon/daemon.d.ts +9 -0
- package/dist/daemon/daemon.js +88 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/runner.d.ts +3 -0
- package/dist/daemon/runner.js +310 -0
- package/dist/daemon/runner.js.map +1 -0
- package/dist/db/database.d.ts +95 -0
- package/dist/db/database.js +277 -0
- package/dist/db/database.js.map +1 -0
- package/dist/executors/claude-code.d.ts +9 -0
- package/dist/executors/claude-code.js +86 -0
- package/dist/executors/claude-code.js.map +1 -0
- package/dist/executors/codex.d.ts +9 -0
- package/dist/executors/codex.js +66 -0
- package/dist/executors/codex.js.map +1 -0
- package/dist/executors/openclaw.d.ts +10 -0
- package/dist/executors/openclaw.js +19 -0
- package/dist/executors/openclaw.js.map +1 -0
- package/dist/executors/registry.d.ts +4 -0
- package/dist/executors/registry.js +20 -0
- package/dist/executors/registry.js.map +1 -0
- package/dist/executors/self.d.ts +10 -0
- package/dist/executors/self.js +25 -0
- package/dist/executors/self.js.map +1 -0
- package/dist/executors/types.d.ts +41 -0
- package/dist/executors/types.js +2 -0
- package/dist/executors/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/logger.d.ts +7 -0
- package/dist/lib/logger.js +56 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/worktree.d.ts +30 -0
- package/dist/lib/worktree.js +131 -0
- package/dist/lib/worktree.js.map +1 -0
- package/dist/workflow/parser.d.ts +2 -0
- package/dist/workflow/parser.js +95 -0
- package/dist/workflow/parser.js.map +1 -0
- package/dist/workflow/template.d.ts +14 -0
- package/dist/workflow/template.js +71 -0
- package/dist/workflow/template.js.map +1 -0
- package/dist/workflow/types.d.ts +65 -0
- package/dist/workflow/types.js +2 -0
- package/dist/workflow/types.js.map +1 -0
- package/package.json +46 -0
- package/workflows/feature-dev/workflow.yml +169 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { DatabaseSync } from "node:sqlite";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import crypto from "node:crypto";
|
|
6
|
+
// ── Paths ──────────────────────────────────────────────────────────
|
|
7
|
+
const DATA_DIR = path.join(os.homedir(), ".soulforge");
|
|
8
|
+
const DB_PATH = path.join(DATA_DIR, "soulforge.db");
|
|
9
|
+
export const EVENTS_DIR = path.join(DATA_DIR, "events");
|
|
10
|
+
export function getDataDir() {
|
|
11
|
+
return DATA_DIR;
|
|
12
|
+
}
|
|
13
|
+
// ── DB Singleton ────────────────────────────────────────────────────
|
|
14
|
+
let _db = null;
|
|
15
|
+
export function getDb() {
|
|
16
|
+
if (_db)
|
|
17
|
+
return _db;
|
|
18
|
+
fs.mkdirSync(DATA_DIR, { recursive: true });
|
|
19
|
+
_db = new DatabaseSync(DB_PATH);
|
|
20
|
+
_db.exec("PRAGMA journal_mode=WAL");
|
|
21
|
+
_db.exec("PRAGMA foreign_keys=ON");
|
|
22
|
+
migrate(_db);
|
|
23
|
+
return _db;
|
|
24
|
+
}
|
|
25
|
+
export function closeDb() {
|
|
26
|
+
if (_db) {
|
|
27
|
+
try {
|
|
28
|
+
_db.close();
|
|
29
|
+
}
|
|
30
|
+
catch { }
|
|
31
|
+
_db = null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// ── Schema ──────────────────────────────────────────────────────────
|
|
35
|
+
function migrate(db) {
|
|
36
|
+
db.exec(`
|
|
37
|
+
CREATE TABLE IF NOT EXISTS runs (
|
|
38
|
+
id TEXT PRIMARY KEY,
|
|
39
|
+
workflow_id TEXT NOT NULL,
|
|
40
|
+
workflow_path TEXT NOT NULL,
|
|
41
|
+
task TEXT NOT NULL,
|
|
42
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
43
|
+
context TEXT NOT NULL DEFAULT '{}',
|
|
44
|
+
callback TEXT,
|
|
45
|
+
worktree TEXT,
|
|
46
|
+
created_at TEXT NOT NULL,
|
|
47
|
+
updated_at TEXT NOT NULL
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
CREATE TABLE IF NOT EXISTS steps (
|
|
51
|
+
id TEXT PRIMARY KEY,
|
|
52
|
+
run_id TEXT NOT NULL REFERENCES runs(id),
|
|
53
|
+
step_id TEXT NOT NULL,
|
|
54
|
+
executor TEXT NOT NULL DEFAULT 'openclaw',
|
|
55
|
+
model TEXT,
|
|
56
|
+
agent_id TEXT,
|
|
57
|
+
step_index INTEGER NOT NULL,
|
|
58
|
+
input_template TEXT NOT NULL,
|
|
59
|
+
expects TEXT,
|
|
60
|
+
status TEXT NOT NULL DEFAULT 'waiting',
|
|
61
|
+
output TEXT,
|
|
62
|
+
error TEXT,
|
|
63
|
+
retry_count INTEGER DEFAULT 0,
|
|
64
|
+
max_retries INTEGER DEFAULT 2,
|
|
65
|
+
duration_ms INTEGER,
|
|
66
|
+
type TEXT NOT NULL DEFAULT 'single',
|
|
67
|
+
loop_config TEXT,
|
|
68
|
+
current_story_id TEXT,
|
|
69
|
+
workdir TEXT,
|
|
70
|
+
created_at TEXT NOT NULL,
|
|
71
|
+
updated_at TEXT NOT NULL
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
CREATE TABLE IF NOT EXISTS stories (
|
|
75
|
+
id TEXT PRIMARY KEY,
|
|
76
|
+
run_id TEXT NOT NULL REFERENCES runs(id),
|
|
77
|
+
story_index INTEGER NOT NULL,
|
|
78
|
+
story_id TEXT NOT NULL,
|
|
79
|
+
title TEXT NOT NULL,
|
|
80
|
+
description TEXT NOT NULL,
|
|
81
|
+
acceptance_criteria TEXT NOT NULL,
|
|
82
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
83
|
+
output TEXT,
|
|
84
|
+
retry_count INTEGER DEFAULT 0,
|
|
85
|
+
max_retries INTEGER DEFAULT 2,
|
|
86
|
+
created_at TEXT NOT NULL,
|
|
87
|
+
updated_at TEXT NOT NULL
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
CREATE TABLE IF NOT EXISTS events (
|
|
91
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
92
|
+
run_id TEXT NOT NULL,
|
|
93
|
+
step_id TEXT,
|
|
94
|
+
type TEXT NOT NULL,
|
|
95
|
+
summary TEXT NOT NULL,
|
|
96
|
+
details TEXT,
|
|
97
|
+
created_at TEXT NOT NULL
|
|
98
|
+
);
|
|
99
|
+
`);
|
|
100
|
+
// Add callback column for existing databases
|
|
101
|
+
try {
|
|
102
|
+
db.exec("ALTER TABLE runs ADD COLUMN callback TEXT");
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Column already exists, ignore
|
|
106
|
+
}
|
|
107
|
+
// Add worktree column for existing databases
|
|
108
|
+
try {
|
|
109
|
+
db.exec("ALTER TABLE runs ADD COLUMN worktree TEXT");
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Column already exists, ignore
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// ── Run Operations ──────────────────────────────────────────────────
|
|
116
|
+
export function createRun(workflowSpec, workflowPath, task, callback, worktreeMetadata) {
|
|
117
|
+
const db = getDb();
|
|
118
|
+
const now = new Date().toISOString();
|
|
119
|
+
const runId = crypto.randomUUID();
|
|
120
|
+
const initialContext = {
|
|
121
|
+
task,
|
|
122
|
+
...workflowSpec.context,
|
|
123
|
+
};
|
|
124
|
+
db.exec("BEGIN");
|
|
125
|
+
try {
|
|
126
|
+
db.prepare("INSERT INTO runs (id, workflow_id, workflow_path, task, status, context, callback, worktree, created_at, updated_at) VALUES (?, ?, ?, ?, 'pending', ?, ?, ?, ?, ?)").run(runId, workflowSpec.id, workflowPath, task, JSON.stringify(initialContext), callback ? JSON.stringify(callback) : null, worktreeMetadata ? JSON.stringify(worktreeMetadata) : null, now, now);
|
|
127
|
+
const insertStep = db.prepare("INSERT INTO steps (id, run_id, step_id, executor, model, agent_id, step_index, input_template, expects, status, max_retries, type, loop_config, workdir, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
|
128
|
+
for (let i = 0; i < workflowSpec.steps.length; i++) {
|
|
129
|
+
const step = workflowSpec.steps[i];
|
|
130
|
+
const stepUuid = crypto.randomUUID();
|
|
131
|
+
const agentId = step.agent ? `${workflowSpec.id}/${step.agent}` : null;
|
|
132
|
+
const status = i === 0 ? "pending" : "waiting";
|
|
133
|
+
const maxRetries = step.max_retries ?? step.on_fail?.max_retries ?? 2;
|
|
134
|
+
const stepType = step.type ?? "single";
|
|
135
|
+
const loopConfig = step.loop ? JSON.stringify(step.loop) : null;
|
|
136
|
+
insertStep.run(stepUuid, runId, step.id, step.executor ?? "openclaw", step.model ?? null, agentId, i, step.input ?? "", step.expects ?? null, status, maxRetries, stepType, loopConfig, step.workdir ?? null, now, now);
|
|
137
|
+
}
|
|
138
|
+
db.exec("COMMIT");
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
db.exec("ROLLBACK");
|
|
142
|
+
throw err;
|
|
143
|
+
}
|
|
144
|
+
return getRun(runId);
|
|
145
|
+
}
|
|
146
|
+
export function getRun(runId) {
|
|
147
|
+
const db = getDb();
|
|
148
|
+
const row = db.prepare("SELECT * FROM runs WHERE id = ? OR id LIKE ?").get(runId, `${runId}%`);
|
|
149
|
+
return row ?? null;
|
|
150
|
+
}
|
|
151
|
+
export function listRuns(limit = 50) {
|
|
152
|
+
const db = getDb();
|
|
153
|
+
return db.prepare("SELECT * FROM runs ORDER BY created_at DESC LIMIT ?").all(limit);
|
|
154
|
+
}
|
|
155
|
+
export function updateRunStatus(runId, status) {
|
|
156
|
+
const db = getDb();
|
|
157
|
+
db.prepare("UPDATE runs SET status = ?, updated_at = ? WHERE id = ?").run(status, new Date().toISOString(), runId);
|
|
158
|
+
}
|
|
159
|
+
export function updateRunContext(runId, context) {
|
|
160
|
+
const db = getDb();
|
|
161
|
+
db.prepare("UPDATE runs SET context = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(context), new Date().toISOString(), runId);
|
|
162
|
+
}
|
|
163
|
+
// ── Step Operations ─────────────────────────────────────────────────
|
|
164
|
+
export function getStepsForRun(runId) {
|
|
165
|
+
const db = getDb();
|
|
166
|
+
return db.prepare("SELECT * FROM steps WHERE run_id = ? ORDER BY step_index ASC").all(runId);
|
|
167
|
+
}
|
|
168
|
+
export function getStep(stepId) {
|
|
169
|
+
const db = getDb();
|
|
170
|
+
return db.prepare("SELECT * FROM steps WHERE id = ?").get(stepId) ?? null;
|
|
171
|
+
}
|
|
172
|
+
export function getNextPendingStep(runId) {
|
|
173
|
+
const db = getDb();
|
|
174
|
+
return db.prepare("SELECT * FROM steps WHERE run_id = ? AND status = 'pending' ORDER BY step_index ASC LIMIT 1").get(runId) ?? null;
|
|
175
|
+
}
|
|
176
|
+
export function updateStepStatus(stepId, status, extra) {
|
|
177
|
+
const db = getDb();
|
|
178
|
+
const now = new Date().toISOString();
|
|
179
|
+
let sql = "UPDATE steps SET status = ?, updated_at = ?";
|
|
180
|
+
const params = [status, now];
|
|
181
|
+
if (extra?.output !== undefined) {
|
|
182
|
+
sql += ", output = ?";
|
|
183
|
+
params.push(extra.output);
|
|
184
|
+
}
|
|
185
|
+
if (extra?.error !== undefined) {
|
|
186
|
+
sql += ", error = ?";
|
|
187
|
+
params.push(extra.error);
|
|
188
|
+
}
|
|
189
|
+
if (extra?.duration_ms !== undefined) {
|
|
190
|
+
sql += ", duration_ms = ?";
|
|
191
|
+
params.push(extra.duration_ms);
|
|
192
|
+
}
|
|
193
|
+
if (extra?.current_story_id !== undefined) {
|
|
194
|
+
sql += ", current_story_id = ?";
|
|
195
|
+
params.push(extra.current_story_id);
|
|
196
|
+
}
|
|
197
|
+
sql += " WHERE id = ?";
|
|
198
|
+
params.push(stepId);
|
|
199
|
+
db.prepare(sql).run(...params);
|
|
200
|
+
}
|
|
201
|
+
export function incrementStepRetry(stepId) {
|
|
202
|
+
const db = getDb();
|
|
203
|
+
const step = getStep(stepId);
|
|
204
|
+
if (!step)
|
|
205
|
+
throw new Error(`Step not found: ${stepId}`);
|
|
206
|
+
const newCount = step.retry_count + 1;
|
|
207
|
+
db.prepare("UPDATE steps SET retry_count = ?, updated_at = ? WHERE id = ?").run(newCount, new Date().toISOString(), stepId);
|
|
208
|
+
return newCount;
|
|
209
|
+
}
|
|
210
|
+
export function advancePipeline(runId) {
|
|
211
|
+
const db = getDb();
|
|
212
|
+
const next = db.prepare("SELECT id FROM steps WHERE run_id = ? AND status = 'waiting' ORDER BY step_index ASC LIMIT 1").get(runId);
|
|
213
|
+
if (next) {
|
|
214
|
+
updateStepStatus(next.id, "pending");
|
|
215
|
+
return { advanced: true, runCompleted: false };
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
updateRunStatus(runId, "completed");
|
|
219
|
+
return { advanced: false, runCompleted: true };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// ── Story Operations ────────────────────────────────────────────────
|
|
223
|
+
export function insertStories(runId, stories) {
|
|
224
|
+
const db = getDb();
|
|
225
|
+
const now = new Date().toISOString();
|
|
226
|
+
const insert = db.prepare("INSERT INTO stories (id, run_id, story_index, story_id, title, description, acceptance_criteria, status, retry_count, max_retries, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', 0, 2, ?, ?)");
|
|
227
|
+
for (let i = 0; i < stories.length; i++) {
|
|
228
|
+
const s = stories[i];
|
|
229
|
+
const ac = s.acceptanceCriteria ?? s.acceptance_criteria;
|
|
230
|
+
insert.run(crypto.randomUUID(), runId, i, s.id, s.title, s.description, JSON.stringify(ac), now, now);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
export function getStoriesForRun(runId) {
|
|
234
|
+
const db = getDb();
|
|
235
|
+
return db.prepare("SELECT * FROM stories WHERE run_id = ? ORDER BY story_index ASC").all(runId);
|
|
236
|
+
}
|
|
237
|
+
export function getNextPendingStory(runId) {
|
|
238
|
+
const db = getDb();
|
|
239
|
+
return db.prepare("SELECT * FROM stories WHERE run_id = ? AND status = 'pending' ORDER BY story_index ASC LIMIT 1").get(runId) ?? null;
|
|
240
|
+
}
|
|
241
|
+
export function updateStoryStatus(storyId, status, output) {
|
|
242
|
+
const db = getDb();
|
|
243
|
+
const now = new Date().toISOString();
|
|
244
|
+
if (output !== undefined) {
|
|
245
|
+
db.prepare("UPDATE stories SET status = ?, output = ?, updated_at = ? WHERE id = ?").run(status, output, now, storyId);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
db.prepare("UPDATE stories SET status = ?, updated_at = ? WHERE id = ?").run(status, now, storyId);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
export function incrementStoryRetry(storyId) {
|
|
252
|
+
const db = getDb();
|
|
253
|
+
const story = db.prepare("SELECT retry_count FROM stories WHERE id = ?").get(storyId);
|
|
254
|
+
if (!story)
|
|
255
|
+
throw new Error(`Story not found: ${storyId}`);
|
|
256
|
+
const newCount = story.retry_count + 1;
|
|
257
|
+
db.prepare("UPDATE stories SET retry_count = ?, updated_at = ? WHERE id = ?").run(newCount, new Date().toISOString(), storyId);
|
|
258
|
+
return newCount;
|
|
259
|
+
}
|
|
260
|
+
// ── Event Operations ────────────────────────────────────────────────
|
|
261
|
+
export function insertEvent(runId, type, summary, stepId, details) {
|
|
262
|
+
const db = getDb();
|
|
263
|
+
db.prepare("INSERT INTO events (run_id, step_id, type, summary, details, created_at) VALUES (?, ?, ?, ?, ?, ?)").run(runId, stepId ?? null, type, summary, details ?? null, new Date().toISOString());
|
|
264
|
+
// Also write to events directory
|
|
265
|
+
fs.mkdirSync(EVENTS_DIR, { recursive: true });
|
|
266
|
+
const filename = `${new Date().toISOString().replace(/[:.]/g, "-")}-${type}.json`;
|
|
267
|
+
const event = { runId, stepId, type, summary, details, timestamp: new Date().toISOString() };
|
|
268
|
+
fs.writeFileSync(path.join(EVENTS_DIR, filename), JSON.stringify(event, null, 2));
|
|
269
|
+
}
|
|
270
|
+
export function getEvents(runId, limit = 50) {
|
|
271
|
+
const db = getDb();
|
|
272
|
+
if (runId) {
|
|
273
|
+
return db.prepare("SELECT * FROM events WHERE run_id = ? ORDER BY id DESC LIMIT ?").all(runId, limit);
|
|
274
|
+
}
|
|
275
|
+
return db.prepare("SELECT * FROM events ORDER BY id DESC LIMIT ?").all(limit);
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/db/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ExecuteParams, ExecuteResult, ExecutorAdapter } from "./types.js";
|
|
2
|
+
export declare class ClaudeCodeExecutor implements ExecutorAdapter {
|
|
3
|
+
readonly name = "claude-code";
|
|
4
|
+
check(): Promise<{
|
|
5
|
+
ok: boolean;
|
|
6
|
+
error?: string;
|
|
7
|
+
}>;
|
|
8
|
+
execute(params: ExecuteParams): Promise<ExecuteResult>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { extractContext } from "../workflow/template.js";
|
|
3
|
+
export class ClaudeCodeExecutor {
|
|
4
|
+
name = "claude-code";
|
|
5
|
+
async check() {
|
|
6
|
+
return new Promise((resolve) => {
|
|
7
|
+
const proc = spawn("claude", ["--version"], { stdio: ["ignore", "pipe", "pipe"] });
|
|
8
|
+
let output = "";
|
|
9
|
+
proc.stdout.on("data", (d) => (output += d));
|
|
10
|
+
proc.on("error", () => resolve({ ok: false, error: "claude CLI not found" }));
|
|
11
|
+
proc.on("close", (code) => {
|
|
12
|
+
if (code === 0) {
|
|
13
|
+
resolve({ ok: true });
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
resolve({ ok: false, error: `claude --version exited with code ${code}` });
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async execute(params) {
|
|
22
|
+
const startTime = Date.now();
|
|
23
|
+
const timeout = (params.timeout ?? 600) * 1000;
|
|
24
|
+
const args = [
|
|
25
|
+
"--print",
|
|
26
|
+
"--dangerously-skip-permissions",
|
|
27
|
+
"--output-format", "text",
|
|
28
|
+
];
|
|
29
|
+
if (params.model) {
|
|
30
|
+
args.push("--model", params.model);
|
|
31
|
+
}
|
|
32
|
+
// Add the prompt as the last argument
|
|
33
|
+
args.push(params.input);
|
|
34
|
+
return new Promise((resolve) => {
|
|
35
|
+
const proc = spawn("claude", args, {
|
|
36
|
+
cwd: params.workdir,
|
|
37
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
38
|
+
env: {
|
|
39
|
+
...process.env,
|
|
40
|
+
...params.env,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
let stdout = "";
|
|
44
|
+
let stderr = "";
|
|
45
|
+
proc.stdout.on("data", (data) => {
|
|
46
|
+
stdout += data.toString();
|
|
47
|
+
});
|
|
48
|
+
proc.stderr.on("data", (data) => {
|
|
49
|
+
stderr += data.toString();
|
|
50
|
+
});
|
|
51
|
+
const timer = setTimeout(() => {
|
|
52
|
+
proc.kill("SIGTERM");
|
|
53
|
+
setTimeout(() => proc.kill("SIGKILL"), 5000);
|
|
54
|
+
}, timeout);
|
|
55
|
+
proc.on("close", (code) => {
|
|
56
|
+
clearTimeout(timer);
|
|
57
|
+
const durationMs = Date.now() - startTime;
|
|
58
|
+
const output = stdout.trim();
|
|
59
|
+
const context = extractContext(output);
|
|
60
|
+
// Check expects
|
|
61
|
+
let success = code === 0;
|
|
62
|
+
if (success && params.expects) {
|
|
63
|
+
success = output.includes(params.expects);
|
|
64
|
+
}
|
|
65
|
+
resolve({
|
|
66
|
+
output,
|
|
67
|
+
success,
|
|
68
|
+
context,
|
|
69
|
+
error: success ? undefined : stderr.trim() || `Exit code ${code}`,
|
|
70
|
+
durationMs,
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
proc.on("error", (err) => {
|
|
74
|
+
clearTimeout(timer);
|
|
75
|
+
resolve({
|
|
76
|
+
output: "",
|
|
77
|
+
success: false,
|
|
78
|
+
context: {},
|
|
79
|
+
error: `Failed to spawn claude: ${err.message}`,
|
|
80
|
+
durationMs: Date.now() - startTime,
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/executors/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ExecuteParams, ExecuteResult, ExecutorAdapter } from "./types.js";
|
|
2
|
+
export declare class CodexExecutor implements ExecutorAdapter {
|
|
3
|
+
readonly name = "codex";
|
|
4
|
+
check(): Promise<{
|
|
5
|
+
ok: boolean;
|
|
6
|
+
error?: string;
|
|
7
|
+
}>;
|
|
8
|
+
execute(params: ExecuteParams): Promise<ExecuteResult>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { extractContext } from "../workflow/template.js";
|
|
3
|
+
export class CodexExecutor {
|
|
4
|
+
name = "codex";
|
|
5
|
+
async check() {
|
|
6
|
+
return new Promise((resolve) => {
|
|
7
|
+
const proc = spawn("codex", ["--version"], { stdio: ["ignore", "pipe", "pipe"] });
|
|
8
|
+
proc.on("error", () => resolve({ ok: false, error: "codex CLI not found" }));
|
|
9
|
+
proc.on("close", (code) => {
|
|
10
|
+
resolve(code === 0 ? { ok: true } : { ok: false, error: `codex --version exited ${code}` });
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
async execute(params) {
|
|
15
|
+
const startTime = Date.now();
|
|
16
|
+
const timeout = (params.timeout ?? 600) * 1000;
|
|
17
|
+
const args = ["--quiet", "--full-auto"];
|
|
18
|
+
if (params.model) {
|
|
19
|
+
args.push("--model", params.model);
|
|
20
|
+
}
|
|
21
|
+
args.push(params.input);
|
|
22
|
+
return new Promise((resolve) => {
|
|
23
|
+
const proc = spawn("codex", args, {
|
|
24
|
+
cwd: params.workdir,
|
|
25
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
26
|
+
env: { ...process.env, ...params.env },
|
|
27
|
+
});
|
|
28
|
+
let stdout = "";
|
|
29
|
+
let stderr = "";
|
|
30
|
+
proc.stdout.on("data", (d) => (stdout += d.toString()));
|
|
31
|
+
proc.stderr.on("data", (d) => (stderr += d.toString()));
|
|
32
|
+
const timer = setTimeout(() => {
|
|
33
|
+
proc.kill("SIGTERM");
|
|
34
|
+
setTimeout(() => proc.kill("SIGKILL"), 5000);
|
|
35
|
+
}, timeout);
|
|
36
|
+
proc.on("close", (code) => {
|
|
37
|
+
clearTimeout(timer);
|
|
38
|
+
const durationMs = Date.now() - startTime;
|
|
39
|
+
const output = stdout.trim();
|
|
40
|
+
const context = extractContext(output);
|
|
41
|
+
let success = code === 0;
|
|
42
|
+
if (success && params.expects) {
|
|
43
|
+
success = output.includes(params.expects);
|
|
44
|
+
}
|
|
45
|
+
resolve({
|
|
46
|
+
output,
|
|
47
|
+
success,
|
|
48
|
+
context,
|
|
49
|
+
error: success ? undefined : stderr.trim() || `Exit code ${code}`,
|
|
50
|
+
durationMs,
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
proc.on("error", (err) => {
|
|
54
|
+
clearTimeout(timer);
|
|
55
|
+
resolve({
|
|
56
|
+
output: "",
|
|
57
|
+
success: false,
|
|
58
|
+
context: {},
|
|
59
|
+
error: `Failed to spawn codex: ${err.message}`,
|
|
60
|
+
durationMs: Date.now() - startTime,
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/executors/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExecuteParams, ExecuteResult, ExecutorAdapter } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* OpenClaw executor — placeholder for Phase 2.
|
|
4
|
+
* Will use sessions_spawn to create isolated sub-agent sessions.
|
|
5
|
+
* For now, returns an error indicating it's not yet implemented.
|
|
6
|
+
*/
|
|
7
|
+
export declare class OpenClawExecutor implements ExecutorAdapter {
|
|
8
|
+
readonly name = "openclaw";
|
|
9
|
+
execute(params: ExecuteParams): Promise<ExecuteResult>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw executor — placeholder for Phase 2.
|
|
3
|
+
* Will use sessions_spawn to create isolated sub-agent sessions.
|
|
4
|
+
* For now, returns an error indicating it's not yet implemented.
|
|
5
|
+
*/
|
|
6
|
+
export class OpenClawExecutor {
|
|
7
|
+
name = "openclaw";
|
|
8
|
+
async execute(params) {
|
|
9
|
+
// TODO Phase 2: implement via openclaw sessions_spawn API
|
|
10
|
+
return {
|
|
11
|
+
output: "",
|
|
12
|
+
success: false,
|
|
13
|
+
context: {},
|
|
14
|
+
error: "OpenClaw executor not yet implemented. Use claude-code or codex executor instead.",
|
|
15
|
+
durationMs: 0,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=openclaw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/executors/openclaw.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,OAAO,gBAAgB;IAClB,IAAI,GAAG,UAAU,CAAC;IAE3B,KAAK,CAAC,OAAO,CAAC,MAAqB;QACjC,0DAA0D;QAC1D,OAAO;YACL,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,mFAAmF;YAC1F,UAAU,EAAE,CAAC;SACd,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ClaudeCodeExecutor } from "./claude-code.js";
|
|
2
|
+
import { CodexExecutor } from "./codex.js";
|
|
3
|
+
import { OpenClawExecutor } from "./openclaw.js";
|
|
4
|
+
import { SelfExecutor } from "./self.js";
|
|
5
|
+
const executors = new Map();
|
|
6
|
+
executors.set("claude-code", new ClaudeCodeExecutor());
|
|
7
|
+
executors.set("codex", new CodexExecutor());
|
|
8
|
+
executors.set("openclaw", new OpenClawExecutor());
|
|
9
|
+
executors.set("self", new SelfExecutor());
|
|
10
|
+
export function getExecutor(type) {
|
|
11
|
+
const executor = executors.get(type);
|
|
12
|
+
if (!executor) {
|
|
13
|
+
throw new Error(`Unknown executor type: ${type}`);
|
|
14
|
+
}
|
|
15
|
+
return executor;
|
|
16
|
+
}
|
|
17
|
+
export function listExecutors() {
|
|
18
|
+
return [...executors.keys()];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/executors/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiC,CAAC;AAC3D,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,kBAAkB,EAAE,CAAC,CAAC;AACvD,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,aAAa,EAAE,CAAC,CAAC;AAC5C,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,gBAAgB,EAAE,CAAC,CAAC;AAClD,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC,CAAC;AAE1C,MAAM,UAAU,WAAW,CAAC,IAAkB;IAC5C,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ExecuteParams, ExecuteResult, ExecutorAdapter } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Self executor — pauses the pipeline for human/orchestrator review.
|
|
4
|
+
* Sets step to waiting_approval, fires notification, and returns.
|
|
5
|
+
* The daemon will not advance until `soulforge approve <run-id>` is called.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SelfExecutor implements ExecutorAdapter {
|
|
8
|
+
readonly name = "self";
|
|
9
|
+
execute(params: ExecuteParams): Promise<ExecuteResult>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { updateStepStatus, insertEvent } from "../db/database.js";
|
|
2
|
+
/**
|
|
3
|
+
* Self executor — pauses the pipeline for human/orchestrator review.
|
|
4
|
+
* Sets step to waiting_approval, fires notification, and returns.
|
|
5
|
+
* The daemon will not advance until `soulforge approve <run-id>` is called.
|
|
6
|
+
*/
|
|
7
|
+
export class SelfExecutor {
|
|
8
|
+
name = "self";
|
|
9
|
+
async execute(params) {
|
|
10
|
+
const startTime = Date.now();
|
|
11
|
+
// Set step to waiting_approval
|
|
12
|
+
updateStepStatus(params.step.id, "waiting_approval");
|
|
13
|
+
// Fire checkpoint event
|
|
14
|
+
insertEvent(params.run.id, "checkpoint", `Step "${params.step.step_id}" awaiting approval`, params.step.step_id, params.input);
|
|
15
|
+
// Return a special result — the runner will detect waiting_approval
|
|
16
|
+
// and skip advancing the pipeline
|
|
17
|
+
return {
|
|
18
|
+
output: `CHECKPOINT: Step "${params.step.step_id}" is awaiting approval.\nRun: soulforge approve ${params.run.id.slice(0, 8)}`,
|
|
19
|
+
success: true,
|
|
20
|
+
context: {},
|
|
21
|
+
durationMs: Date.now() - startTime,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=self.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"self.js","sourceRoot":"","sources":["../../src/executors/self.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;GAIG;AACH,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,MAAM,CAAC;IAEvB,KAAK,CAAC,OAAO,CAAC,MAAqB;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,+BAA+B;QAC/B,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAErD,wBAAwB;QACxB,WAAW,CACT,MAAM,CAAC,GAAG,CAAC,EAAE,EACb,YAAY,EACZ,SAAS,MAAM,CAAC,IAAI,CAAC,OAAO,qBAAqB,EACjD,MAAM,CAAC,IAAI,CAAC,OAAO,EACnB,MAAM,CAAC,KAAK,CACb,CAAC;QAEF,oEAAoE;QACpE,kCAAkC;QAClC,OAAO;YACL,MAAM,EAAE,qBAAqB,MAAM,CAAC,IAAI,CAAC,OAAO,mDAAmD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YAC9H,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACnC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { RunRecord, StepRecord } from "../db/database.js";
|
|
2
|
+
export interface ExecuteParams {
|
|
3
|
+
/** Resolved step input (all {{vars}} replaced) */
|
|
4
|
+
input: string;
|
|
5
|
+
/** Working directory for the step */
|
|
6
|
+
workdir: string;
|
|
7
|
+
/** Model override */
|
|
8
|
+
model?: string;
|
|
9
|
+
/** Extra environment variables */
|
|
10
|
+
env?: Record<string, string>;
|
|
11
|
+
/** Step timeout in seconds (default: 600) */
|
|
12
|
+
timeout?: number;
|
|
13
|
+
/** Expected output marker */
|
|
14
|
+
expects?: string;
|
|
15
|
+
/** Full step record */
|
|
16
|
+
step: StepRecord;
|
|
17
|
+
/** Full run record */
|
|
18
|
+
run: RunRecord;
|
|
19
|
+
}
|
|
20
|
+
export interface ExecuteResult {
|
|
21
|
+
/** Raw output text */
|
|
22
|
+
output: string;
|
|
23
|
+
/** Did step succeed? */
|
|
24
|
+
success: boolean;
|
|
25
|
+
/** Extracted KEY: value pairs */
|
|
26
|
+
context: Record<string, string>;
|
|
27
|
+
/** Error message if !success */
|
|
28
|
+
error?: string;
|
|
29
|
+
/** Execution duration in ms */
|
|
30
|
+
durationMs: number;
|
|
31
|
+
}
|
|
32
|
+
export interface ExecutorAdapter {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
/** Execute a step */
|
|
35
|
+
execute(params: ExecuteParams): Promise<ExecuteResult>;
|
|
36
|
+
/** Optional: check if this executor is available */
|
|
37
|
+
check?(): Promise<{
|
|
38
|
+
ok: boolean;
|
|
39
|
+
error?: string;
|
|
40
|
+
}>;
|
|
41
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/executors/types.ts"],"names":[],"mappings":""}
|