dot-agents 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 +238 -0
- package/dist/cli/commands/daemon.d.ts +3 -0
- package/dist/cli/commands/daemon.d.ts.map +1 -0
- package/dist/cli/commands/daemon.js +179 -0
- package/dist/cli/commands/daemon.js.map +1 -0
- package/dist/cli/commands/index.d.ts +6 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +6 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/list.d.ts +3 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +100 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/run.d.ts +3 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +107 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/schedule.d.ts +3 -0
- package/dist/cli/commands/schedule.d.ts.map +1 -0
- package/dist/cli/commands/schedule.js +172 -0
- package/dist/cli/commands/schedule.js.map +1 -0
- package/dist/cli/commands/show.d.ts +3 -0
- package/dist/cli/commands/show.d.ts.map +1 -0
- package/dist/cli/commands/show.js +122 -0
- package/dist/cli/commands/show.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +38 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/lib/index.d.ts +2 -0
- package/dist/cli/lib/index.d.ts.map +1 -0
- package/dist/cli/lib/index.js +2 -0
- package/dist/cli/lib/index.js.map +1 -0
- package/dist/cli/lib/runner.d.ts +41 -0
- package/dist/cli/lib/runner.d.ts.map +1 -0
- package/dist/cli/lib/runner.js +179 -0
- package/dist/cli/lib/runner.js.map +1 -0
- package/dist/daemon/api/index.d.ts +2 -0
- package/dist/daemon/api/index.d.ts.map +1 -0
- package/dist/daemon/api/index.js +2 -0
- package/dist/daemon/api/index.js.map +1 -0
- package/dist/daemon/api/server.d.ts +12 -0
- package/dist/daemon/api/server.d.ts.map +1 -0
- package/dist/daemon/api/server.js +111 -0
- package/dist/daemon/api/server.js.map +1 -0
- package/dist/daemon/daemon.d.ts +95 -0
- package/dist/daemon/daemon.d.ts.map +1 -0
- package/dist/daemon/daemon.js +265 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/index.d.ts +4 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +4 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/lib/executor.d.ts +17 -0
- package/dist/daemon/lib/executor.d.ts.map +1 -0
- package/dist/daemon/lib/executor.js +169 -0
- package/dist/daemon/lib/executor.js.map +1 -0
- package/dist/daemon/lib/index.d.ts +4 -0
- package/dist/daemon/lib/index.d.ts.map +1 -0
- package/dist/daemon/lib/index.js +4 -0
- package/dist/daemon/lib/index.js.map +1 -0
- package/dist/daemon/lib/scheduler.d.ts +90 -0
- package/dist/daemon/lib/scheduler.d.ts.map +1 -0
- package/dist/daemon/lib/scheduler.js +176 -0
- package/dist/daemon/lib/scheduler.js.map +1 -0
- package/dist/daemon/lib/watcher.d.ts +48 -0
- package/dist/daemon/lib/watcher.d.ts.map +1 -0
- package/dist/daemon/lib/watcher.js +77 -0
- package/dist/daemon/lib/watcher.js.map +1 -0
- package/dist/lib/config.d.ts +14 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +76 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +18 -0
- package/dist/lib/frontmatter.d.ts.map +1 -0
- package/dist/lib/frontmatter.js +26 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/index.d.ts +7 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/persona.d.ts +32 -0
- package/dist/lib/persona.d.ts.map +1 -0
- package/dist/lib/persona.js +177 -0
- package/dist/lib/persona.js.map +1 -0
- package/dist/lib/types/index.d.ts +69 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/index.js +4 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/lib/types/persona.d.ts +46 -0
- package/dist/lib/types/persona.d.ts.map +1 -0
- package/dist/lib/types/persona.js +2 -0
- package/dist/lib/types/persona.js.map +1 -0
- package/dist/lib/types/triggers.d.ts +96 -0
- package/dist/lib/types/triggers.d.ts.map +1 -0
- package/dist/lib/types/triggers.js +2 -0
- package/dist/lib/types/triggers.js.map +1 -0
- package/dist/lib/types/workflow.d.ts +75 -0
- package/dist/lib/types/workflow.d.ts.map +1 -0
- package/dist/lib/types/workflow.js +2 -0
- package/dist/lib/types/workflow.js.map +1 -0
- package/dist/lib/variables.d.ts +28 -0
- package/dist/lib/variables.d.ts.map +1 -0
- package/dist/lib/variables.js +113 -0
- package/dist/lib/variables.js.map +1 -0
- package/dist/lib/workflow.d.ts +29 -0
- package/dist/lib/workflow.d.ts.map +1 -0
- package/dist/lib/workflow.js +155 -0
- package/dist/lib/workflow.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import { requireConfig, listWorkflows, loadWorkflow, listPersonas, loadPersona, } from "../lib/index.js";
|
|
3
|
+
import { Scheduler } from "./lib/scheduler.js";
|
|
4
|
+
import { Executor } from "./lib/executor.js";
|
|
5
|
+
import { Watcher } from "./lib/watcher.js";
|
|
6
|
+
import { createApiServer, startApiServer } from "./api/server.js";
|
|
7
|
+
/**
|
|
8
|
+
* Main daemon class
|
|
9
|
+
*/
|
|
10
|
+
export class Daemon {
|
|
11
|
+
config = null;
|
|
12
|
+
scheduler;
|
|
13
|
+
executor = null;
|
|
14
|
+
watcher = null;
|
|
15
|
+
apiServer = null;
|
|
16
|
+
app = null;
|
|
17
|
+
startTime = null;
|
|
18
|
+
running = false;
|
|
19
|
+
port;
|
|
20
|
+
watchEnabled;
|
|
21
|
+
constructor(options = {}) {
|
|
22
|
+
this.port = options.port ?? 3141;
|
|
23
|
+
this.watchEnabled = options.watch ?? true;
|
|
24
|
+
this.scheduler = new Scheduler();
|
|
25
|
+
if (options.config) {
|
|
26
|
+
this.config = options.config;
|
|
27
|
+
}
|
|
28
|
+
// Wire up scheduler events
|
|
29
|
+
this.scheduler.on("job:trigger", async ({ job, workflow }) => {
|
|
30
|
+
console.log(`[trigger] ${workflow.name} (${job.cron})`);
|
|
31
|
+
try {
|
|
32
|
+
const result = await this.executor.run(workflow, job.inputs);
|
|
33
|
+
this.scheduler.updateJobStatus(job.id, result.success);
|
|
34
|
+
console.log(`[complete] ${workflow.name}: ${result.success ? "success" : "failure"} (${result.duration}ms)`);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
this.scheduler.updateJobStatus(job.id, false);
|
|
38
|
+
console.error(`[error] ${workflow.name}: ${error.message}`);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Start the daemon
|
|
44
|
+
*/
|
|
45
|
+
async start() {
|
|
46
|
+
if (this.running)
|
|
47
|
+
return;
|
|
48
|
+
console.log("[daemon] Starting...");
|
|
49
|
+
// Load config if not provided
|
|
50
|
+
if (!this.config) {
|
|
51
|
+
this.config = await requireConfig();
|
|
52
|
+
}
|
|
53
|
+
this.executor = new Executor(this.config);
|
|
54
|
+
this.startTime = new Date();
|
|
55
|
+
// Load and schedule workflows
|
|
56
|
+
await this.loadWorkflows();
|
|
57
|
+
// Start scheduler
|
|
58
|
+
this.scheduler.start();
|
|
59
|
+
console.log(`[scheduler] Started with ${this.scheduler.getJobCount()} jobs`);
|
|
60
|
+
// Start file watcher
|
|
61
|
+
if (this.watchEnabled) {
|
|
62
|
+
this.watcher = new Watcher(this.config.workflowsDir, this.config.personasDir);
|
|
63
|
+
this.setupWatcherEvents();
|
|
64
|
+
this.watcher.start();
|
|
65
|
+
console.log("[watcher] Watching for file changes");
|
|
66
|
+
}
|
|
67
|
+
// Start API server
|
|
68
|
+
this.app = createApiServer(this);
|
|
69
|
+
this.apiServer = await startApiServer(this.app, this.port);
|
|
70
|
+
console.log(`[api] Listening on http://localhost:${this.port}`);
|
|
71
|
+
this.running = true;
|
|
72
|
+
console.log("[daemon] Ready");
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Stop the daemon
|
|
76
|
+
*/
|
|
77
|
+
async stop() {
|
|
78
|
+
if (!this.running)
|
|
79
|
+
return;
|
|
80
|
+
console.log("[daemon] Stopping...");
|
|
81
|
+
// Stop scheduler
|
|
82
|
+
this.scheduler.stop();
|
|
83
|
+
// Stop watcher
|
|
84
|
+
if (this.watcher) {
|
|
85
|
+
await this.watcher.stop();
|
|
86
|
+
}
|
|
87
|
+
// Stop API server
|
|
88
|
+
if (this.apiServer) {
|
|
89
|
+
await new Promise((resolve) => {
|
|
90
|
+
this.apiServer.close(() => resolve());
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
this.running = false;
|
|
94
|
+
console.log("[daemon] Stopped");
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Load all workflows and add to scheduler
|
|
98
|
+
*/
|
|
99
|
+
async loadWorkflows() {
|
|
100
|
+
const workflowPaths = await listWorkflows(this.config.workflowsDir);
|
|
101
|
+
for (const path of workflowPaths) {
|
|
102
|
+
try {
|
|
103
|
+
const workflow = await loadWorkflow(path);
|
|
104
|
+
this.scheduler.addWorkflow(workflow);
|
|
105
|
+
console.log(`[loaded] ${workflow.name}`);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.error(`[error] Failed to load workflow at ${path}: ${error.message}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Reload all workflows
|
|
114
|
+
*/
|
|
115
|
+
async reloadWorkflows() {
|
|
116
|
+
console.log("[reload] Reloading workflows...");
|
|
117
|
+
// Get current workflow names
|
|
118
|
+
const currentJobs = this.scheduler.getJobs();
|
|
119
|
+
const currentWorkflows = new Set(currentJobs.map((j) => j.workflowName));
|
|
120
|
+
// Remove all current workflows
|
|
121
|
+
for (const name of currentWorkflows) {
|
|
122
|
+
this.scheduler.removeWorkflow(name);
|
|
123
|
+
}
|
|
124
|
+
// Reload
|
|
125
|
+
await this.loadWorkflows();
|
|
126
|
+
console.log(`[reload] Complete. ${this.scheduler.getJobCount()} jobs scheduled.`);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Set up file watcher event handlers
|
|
130
|
+
*/
|
|
131
|
+
setupWatcherEvents() {
|
|
132
|
+
if (!this.watcher)
|
|
133
|
+
return;
|
|
134
|
+
this.watcher.on("workflow:added", async ({ path }) => {
|
|
135
|
+
console.log(`[watcher] Workflow added: ${path}`);
|
|
136
|
+
try {
|
|
137
|
+
const workflow = await loadWorkflow(path);
|
|
138
|
+
this.scheduler.addWorkflow(workflow);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
console.error(`[error] Failed to load new workflow: ${error.message}`);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
this.watcher.on("workflow:changed", async ({ path }) => {
|
|
145
|
+
console.log(`[watcher] Workflow changed: ${path}`);
|
|
146
|
+
try {
|
|
147
|
+
const workflow = await loadWorkflow(path);
|
|
148
|
+
this.scheduler.reloadWorkflow(workflow);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
console.error(`[error] Failed to reload workflow: ${error.message}`);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
this.watcher.on("workflow:removed", ({ path }) => {
|
|
155
|
+
console.log(`[watcher] Workflow removed: ${path}`);
|
|
156
|
+
// Extract workflow name from path - this is a bit fragile
|
|
157
|
+
const parts = path.split("/");
|
|
158
|
+
const name = parts[parts.length - 1];
|
|
159
|
+
this.scheduler.removeWorkflow(name);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Manually trigger a workflow
|
|
164
|
+
*/
|
|
165
|
+
async triggerWorkflow(name, inputs) {
|
|
166
|
+
const workflowPaths = await listWorkflows(this.config.workflowsDir);
|
|
167
|
+
for (const path of workflowPaths) {
|
|
168
|
+
const workflow = await loadWorkflow(path);
|
|
169
|
+
if (workflow.name === name) {
|
|
170
|
+
return this.executor.run(workflow, inputs);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
throw new Error(`Workflow not found: ${name}`);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get all workflows
|
|
177
|
+
*/
|
|
178
|
+
async getWorkflows() {
|
|
179
|
+
const workflowPaths = await listWorkflows(this.config.workflowsDir);
|
|
180
|
+
const workflows = [];
|
|
181
|
+
for (const path of workflowPaths) {
|
|
182
|
+
try {
|
|
183
|
+
const workflow = await loadWorkflow(path);
|
|
184
|
+
workflows.push(workflow);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// Skip invalid workflows
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return workflows;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Get all personas (just basic info, not resolved)
|
|
194
|
+
*/
|
|
195
|
+
async getPersonas() {
|
|
196
|
+
const personaPaths = await listPersonas(this.config.personasDir);
|
|
197
|
+
const personas = [];
|
|
198
|
+
for (const path of personaPaths) {
|
|
199
|
+
try {
|
|
200
|
+
const persona = await loadPersona(path);
|
|
201
|
+
personas.push({
|
|
202
|
+
path,
|
|
203
|
+
name: persona.name,
|
|
204
|
+
description: persona.description,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Skip invalid personas
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return personas;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get recent session logs
|
|
215
|
+
*/
|
|
216
|
+
async getRecentSessions(limit = 20) {
|
|
217
|
+
const sessions = [];
|
|
218
|
+
try {
|
|
219
|
+
const files = await readdir(this.config.sessionsDir);
|
|
220
|
+
const logFiles = files.filter((f) => f.endsWith(".log"));
|
|
221
|
+
// Sort by filename (which includes timestamp)
|
|
222
|
+
logFiles.sort().reverse();
|
|
223
|
+
for (const file of logFiles.slice(0, limit)) {
|
|
224
|
+
// Parse timestamp from filename: YYYYMMDD-HHMMSS.log
|
|
225
|
+
const match = file.match(/^(\d{8})-(\d{6})\.log$/);
|
|
226
|
+
if (match) {
|
|
227
|
+
const [, date, time] = match;
|
|
228
|
+
const timestamp = new Date(`${date.slice(0, 4)}-${date.slice(4, 6)}-${date.slice(6, 8)}T${time.slice(0, 2)}:${time.slice(2, 4)}:${time.slice(4, 6)}`);
|
|
229
|
+
sessions.push({ filename: file, timestamp });
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// Sessions directory might not exist yet
|
|
235
|
+
}
|
|
236
|
+
return sessions;
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Get the scheduler instance
|
|
240
|
+
*/
|
|
241
|
+
getScheduler() {
|
|
242
|
+
return this.scheduler;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Check if daemon is running
|
|
246
|
+
*/
|
|
247
|
+
isRunning() {
|
|
248
|
+
return this.running;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get uptime in seconds
|
|
252
|
+
*/
|
|
253
|
+
getUptime() {
|
|
254
|
+
if (!this.startTime)
|
|
255
|
+
return 0;
|
|
256
|
+
return Math.floor((Date.now() - this.startTime.getTime()) / 1000);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get the API port
|
|
260
|
+
*/
|
|
261
|
+
getPort() {
|
|
262
|
+
return this.port;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/daemon/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Workflow, type ExecutionResult, type DotAgentsConfig } from "../../lib/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Executor for running workflows
|
|
4
|
+
*/
|
|
5
|
+
export declare class Executor {
|
|
6
|
+
private config;
|
|
7
|
+
constructor(config: DotAgentsConfig);
|
|
8
|
+
/**
|
|
9
|
+
* Execute a workflow
|
|
10
|
+
*/
|
|
11
|
+
run(workflow: Workflow, inputOverrides?: Record<string, unknown>): Promise<ExecutionResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Write execution log to sessions directory
|
|
14
|
+
*/
|
|
15
|
+
private writeSessionLog;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/daemon/lib/executor.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,QAAQ,EAEb,KAAK,eAAe,EACpB,KAAK,eAAe,EAMrB,MAAM,oBAAoB,CAAC;AAyD5B;;GAEG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAE3C;;OAEG;IACG,GAAG,CACP,QAAQ,EAAE,QAAQ,EAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,OAAO,CAAC,eAAe,CAAC;IA8H3B;;OAEG;YACW,eAAe;CAmC9B"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { execa } from "execa";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { resolvePersona, createExecutionContext, processTemplate, expandVariables, getInputDefaults, } from "../../lib/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Parse duration string to milliseconds
|
|
7
|
+
*/
|
|
8
|
+
function parseDuration(duration) {
|
|
9
|
+
const match = duration.match(/^(\d+)(s|m|h)$/);
|
|
10
|
+
if (!match) {
|
|
11
|
+
throw new Error(`Invalid duration format: ${duration}`);
|
|
12
|
+
}
|
|
13
|
+
const [, value, unit] = match;
|
|
14
|
+
const num = parseInt(value, 10);
|
|
15
|
+
switch (unit) {
|
|
16
|
+
case "s":
|
|
17
|
+
return num * 1000;
|
|
18
|
+
case "m":
|
|
19
|
+
return num * 60 * 1000;
|
|
20
|
+
case "h":
|
|
21
|
+
return num * 60 * 60 * 1000;
|
|
22
|
+
default:
|
|
23
|
+
throw new Error(`Unknown duration unit: ${unit}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Build the full prompt for the agent
|
|
28
|
+
*/
|
|
29
|
+
function buildPrompt(workflow, persona, context, inputs) {
|
|
30
|
+
const parts = [];
|
|
31
|
+
if (persona.prompt) {
|
|
32
|
+
const expandedPrompt = processTemplate(persona.prompt, { ...context, ...inputs }, persona.env);
|
|
33
|
+
parts.push(expandedPrompt);
|
|
34
|
+
parts.push("\n---\n");
|
|
35
|
+
}
|
|
36
|
+
const expandedTask = processTemplate(workflow.task, { ...context, ...inputs }, { ...persona.env, ...workflow.env });
|
|
37
|
+
parts.push(expandedTask);
|
|
38
|
+
return parts.join("\n");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Executor for running workflows
|
|
42
|
+
*/
|
|
43
|
+
export class Executor {
|
|
44
|
+
config;
|
|
45
|
+
constructor(config) {
|
|
46
|
+
this.config = config;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Execute a workflow
|
|
50
|
+
*/
|
|
51
|
+
async run(workflow, inputOverrides) {
|
|
52
|
+
const startedAt = new Date();
|
|
53
|
+
// Resolve persona
|
|
54
|
+
const persona = await resolvePersona(join(this.config.personasDir, workflow.persona), this.config.personasDir);
|
|
55
|
+
const context = createExecutionContext({
|
|
56
|
+
WORKFLOW_NAME: workflow.name,
|
|
57
|
+
WORKFLOW_DIR: workflow.path,
|
|
58
|
+
PERSONA_NAME: persona.name,
|
|
59
|
+
PERSONA_DIR: persona.path,
|
|
60
|
+
AGENTS_DIR: this.config.agentsDir,
|
|
61
|
+
});
|
|
62
|
+
// Merge inputs
|
|
63
|
+
const inputs = {
|
|
64
|
+
...getInputDefaults(workflow),
|
|
65
|
+
...inputOverrides,
|
|
66
|
+
};
|
|
67
|
+
// Merge environment
|
|
68
|
+
const env = {
|
|
69
|
+
...process.env,
|
|
70
|
+
...persona.env,
|
|
71
|
+
...workflow.env,
|
|
72
|
+
};
|
|
73
|
+
for (const [key, value] of Object.entries(env)) {
|
|
74
|
+
if (value) {
|
|
75
|
+
env[key] = expandVariables(value, context, env);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Working directory
|
|
79
|
+
let workingDir = workflow.working_dir ?? process.cwd();
|
|
80
|
+
workingDir = expandVariables(workingDir, { ...context, ...inputs }, env);
|
|
81
|
+
// Build prompt
|
|
82
|
+
const prompt = buildPrompt(workflow, persona, context, inputs);
|
|
83
|
+
// Timeout
|
|
84
|
+
const timeoutMs = workflow.timeout
|
|
85
|
+
? parseDuration(workflow.timeout)
|
|
86
|
+
: 10 * 60 * 1000;
|
|
87
|
+
// Try each command
|
|
88
|
+
let lastError = null;
|
|
89
|
+
let result = null;
|
|
90
|
+
for (const cmd of persona.cmd) {
|
|
91
|
+
try {
|
|
92
|
+
const expandedCmd = expandVariables(cmd, context, env);
|
|
93
|
+
const [command, ...args] = expandedCmd.split(/\s+/);
|
|
94
|
+
const execResult = await execa(command, args, {
|
|
95
|
+
input: prompt,
|
|
96
|
+
cwd: workingDir,
|
|
97
|
+
env,
|
|
98
|
+
timeout: timeoutMs,
|
|
99
|
+
reject: false,
|
|
100
|
+
});
|
|
101
|
+
const endedAt = new Date();
|
|
102
|
+
result = {
|
|
103
|
+
success: execResult.exitCode === 0,
|
|
104
|
+
exitCode: execResult.exitCode ?? 1,
|
|
105
|
+
stdout: execResult.stdout,
|
|
106
|
+
stderr: execResult.stderr,
|
|
107
|
+
duration: endedAt.getTime() - startedAt.getTime(),
|
|
108
|
+
runId: context.RUN_ID,
|
|
109
|
+
startedAt,
|
|
110
|
+
endedAt,
|
|
111
|
+
};
|
|
112
|
+
if (result.success)
|
|
113
|
+
break;
|
|
114
|
+
lastError = new Error(`Command failed with exit code ${result.exitCode}: ${execResult.stderr}`);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
lastError = error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (!result) {
|
|
121
|
+
const endedAt = new Date();
|
|
122
|
+
result = {
|
|
123
|
+
success: false,
|
|
124
|
+
exitCode: 1,
|
|
125
|
+
stdout: "",
|
|
126
|
+
stderr: lastError?.message ?? "All commands failed",
|
|
127
|
+
duration: endedAt.getTime() - startedAt.getTime(),
|
|
128
|
+
runId: context.RUN_ID,
|
|
129
|
+
startedAt,
|
|
130
|
+
endedAt,
|
|
131
|
+
error: lastError?.message,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// Write session log
|
|
135
|
+
await this.writeSessionLog(workflow.name, persona.name, result);
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Write execution log to sessions directory
|
|
140
|
+
*/
|
|
141
|
+
async writeSessionLog(workflowName, personaName, result) {
|
|
142
|
+
await mkdir(this.config.sessionsDir, { recursive: true });
|
|
143
|
+
const timestamp = result.startedAt
|
|
144
|
+
.toISOString()
|
|
145
|
+
.replace(/[-:]/g, "")
|
|
146
|
+
.replace("T", "-")
|
|
147
|
+
.split(".")[0];
|
|
148
|
+
const filename = `${timestamp}.log`;
|
|
149
|
+
const logPath = join(this.config.sessionsDir, filename);
|
|
150
|
+
const logContent = `Run ID: ${result.runId}
|
|
151
|
+
Workflow: ${workflowName}
|
|
152
|
+
Persona: ${personaName}
|
|
153
|
+
Started: ${result.startedAt.toISOString()}
|
|
154
|
+
Ended: ${result.endedAt.toISOString()}
|
|
155
|
+
Duration: ${result.duration}ms
|
|
156
|
+
Exit Code: ${result.exitCode}
|
|
157
|
+
Success: ${result.success}
|
|
158
|
+
${result.error ? `Error: ${result.error}\n` : ""}
|
|
159
|
+
--- STDOUT ---
|
|
160
|
+
${result.stdout}
|
|
161
|
+
|
|
162
|
+
--- STDERR ---
|
|
163
|
+
${result.stderr}
|
|
164
|
+
`;
|
|
165
|
+
await writeFile(logPath, logContent, "utf-8");
|
|
166
|
+
return logPath;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/daemon/lib/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/daemon/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/daemon/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { EventEmitter } from "node:events";
|
|
2
|
+
import type { Workflow } from "../../lib/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Scheduled job info
|
|
5
|
+
*/
|
|
6
|
+
export interface ScheduledJob {
|
|
7
|
+
id: string;
|
|
8
|
+
workflowName: string;
|
|
9
|
+
cron: string;
|
|
10
|
+
nextRun: Date | null;
|
|
11
|
+
lastRun: Date | null;
|
|
12
|
+
lastStatus: "success" | "failure" | null;
|
|
13
|
+
inputs?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Events emitted by the scheduler
|
|
17
|
+
*/
|
|
18
|
+
export interface SchedulerEvents {
|
|
19
|
+
"job:trigger": {
|
|
20
|
+
job: ScheduledJob;
|
|
21
|
+
workflow: Workflow;
|
|
22
|
+
};
|
|
23
|
+
"job:added": {
|
|
24
|
+
job: ScheduledJob;
|
|
25
|
+
};
|
|
26
|
+
"job:removed": {
|
|
27
|
+
jobId: string;
|
|
28
|
+
};
|
|
29
|
+
"scheduler:started": void;
|
|
30
|
+
"scheduler:stopped": void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Scheduler for workflow cron jobs
|
|
34
|
+
*/
|
|
35
|
+
export declare class Scheduler extends EventEmitter {
|
|
36
|
+
private jobs;
|
|
37
|
+
private jobInfo;
|
|
38
|
+
private workflows;
|
|
39
|
+
private running;
|
|
40
|
+
constructor();
|
|
41
|
+
/**
|
|
42
|
+
* Start the scheduler
|
|
43
|
+
*/
|
|
44
|
+
start(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Stop the scheduler
|
|
47
|
+
*/
|
|
48
|
+
stop(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Add a workflow's schedules to the scheduler
|
|
51
|
+
*/
|
|
52
|
+
addWorkflow(workflow: Workflow): void;
|
|
53
|
+
/**
|
|
54
|
+
* Remove a workflow's schedules from the scheduler
|
|
55
|
+
*/
|
|
56
|
+
removeWorkflow(workflowName: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Reload a workflow (remove and re-add)
|
|
59
|
+
*/
|
|
60
|
+
reloadWorkflow(workflow: Workflow): void;
|
|
61
|
+
/**
|
|
62
|
+
* Get all scheduled jobs
|
|
63
|
+
*/
|
|
64
|
+
getJobs(): ScheduledJob[];
|
|
65
|
+
/**
|
|
66
|
+
* Get a specific job by ID
|
|
67
|
+
*/
|
|
68
|
+
getJob(jobId: string): ScheduledJob | null;
|
|
69
|
+
/**
|
|
70
|
+
* Manually trigger a job
|
|
71
|
+
*/
|
|
72
|
+
triggerJob(jobId: string): void;
|
|
73
|
+
/**
|
|
74
|
+
* Manually trigger a workflow by name
|
|
75
|
+
*/
|
|
76
|
+
triggerWorkflow(workflowName: string): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Update job status after execution
|
|
79
|
+
*/
|
|
80
|
+
updateJobStatus(jobId: string, success: boolean): void;
|
|
81
|
+
/**
|
|
82
|
+
* Check if scheduler is running
|
|
83
|
+
*/
|
|
84
|
+
isRunning(): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Get count of scheduled jobs
|
|
87
|
+
*/
|
|
88
|
+
getJobCount(): number;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/daemon/lib/scheduler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE;QAAE,GAAG,EAAE,YAAY,CAAC;QAAC,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC;IACzD,WAAW,EAAE;QAAE,GAAG,EAAE,YAAY,CAAA;KAAE,CAAC;IACnC,aAAa,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,mBAAmB,EAAE,IAAI,CAAC;IAC1B,mBAAmB,EAAE,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,IAAI,CAAmC;IAC/C,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,OAAO,CAAS;;IAMxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAWb;;OAEG;IACH,IAAI,IAAI,IAAI;IAWZ;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAoCrC;;OAEG;IACH,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAa1C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAKxC;;OAEG;IACH,OAAO,IAAI,YAAY,EAAE;IAmBzB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAI1C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAY/B;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IA4B9C;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAOtD;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,WAAW,IAAI,MAAM;CAGtB"}
|