@praveencs/agent 0.2.0 → 0.3.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/dist/src/cli/commands/daemon.d.ts.map +1 -1
- package/dist/src/cli/commands/daemon.js +147 -7
- package/dist/src/cli/commands/daemon.js.map +1 -1
- package/dist/src/cli/index.js +1 -1
- package/dist/src/daemon/manager.d.ts +9 -3
- package/dist/src/daemon/manager.d.ts.map +1 -1
- package/dist/src/daemon/manager.js +31 -10
- package/dist/src/daemon/manager.js.map +1 -1
- package/dist/src/daemon/service.d.ts +76 -0
- package/dist/src/daemon/service.d.ts.map +1 -0
- package/dist/src/daemon/service.js +284 -0
- package/dist/src/daemon/service.js.map +1 -0
- package/dist/src/daemon/triggers.d.ts +34 -0
- package/dist/src/daemon/triggers.d.ts.map +1 -0
- package/dist/src/daemon/triggers.js +76 -0
- package/dist/src/daemon/triggers.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,mBAAmB,IAAI,OAAO,CA0L7C"}
|
|
@@ -1,41 +1,181 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import { DaemonManager } from '../../daemon/manager.js';
|
|
4
|
+
import { MemoryStore } from '../../memory/store.js';
|
|
5
|
+
import { GoalStore } from '../../goals/store.js';
|
|
6
|
+
import { loadTriggers, getDefaultTriggersYaml } from '../../daemon/triggers.js';
|
|
7
|
+
import { writeFile, access } from 'node:fs/promises';
|
|
8
|
+
import path from 'node:path';
|
|
4
9
|
export function createDaemonCommand() {
|
|
5
10
|
const cmd = new Command('daemon')
|
|
6
|
-
.description('Manage the agent daemon');
|
|
11
|
+
.description('Manage the autonomous agent daemon');
|
|
7
12
|
const manager = new DaemonManager();
|
|
13
|
+
// ─── Start daemon ───
|
|
8
14
|
cmd
|
|
9
15
|
.command('start')
|
|
10
|
-
.description('Start the agent daemon')
|
|
16
|
+
.description('Start the autonomous agent daemon')
|
|
11
17
|
.action(async () => {
|
|
18
|
+
// Ensure triggers.yaml exists
|
|
19
|
+
const triggersPath = path.join(process.cwd(), '.agent', 'triggers.yaml');
|
|
20
|
+
try {
|
|
21
|
+
await access(triggersPath);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
await writeFile(triggersPath, getDefaultTriggersYaml(), 'utf-8');
|
|
25
|
+
console.log(chalk.dim(' Created .agent/triggers.yaml with defaults'));
|
|
26
|
+
}
|
|
12
27
|
try {
|
|
13
28
|
const result = await manager.start();
|
|
14
|
-
console.log(chalk.green(`\n✓ ${result.message}
|
|
29
|
+
console.log(chalk.green(`\n✓ ${result.message}`));
|
|
30
|
+
console.log(chalk.dim(' View logs: agent daemon logs'));
|
|
31
|
+
console.log(chalk.dim(' Status: agent daemon status'));
|
|
32
|
+
console.log(chalk.dim(' Stop: agent daemon stop\n'));
|
|
15
33
|
}
|
|
16
34
|
catch (err) {
|
|
17
35
|
console.error(chalk.red(`\n✗ Failed to start daemon: ${err.message}\n`));
|
|
18
36
|
process.exit(1);
|
|
19
37
|
}
|
|
20
38
|
});
|
|
39
|
+
// ─── Stop daemon ───
|
|
21
40
|
cmd
|
|
22
41
|
.command('stop')
|
|
23
42
|
.description('Stop the agent daemon')
|
|
24
43
|
.action(async () => {
|
|
25
44
|
const result = await manager.stop();
|
|
26
|
-
|
|
45
|
+
if (result.message.includes('not running')) {
|
|
46
|
+
console.log(chalk.yellow(`\n○ ${result.message}\n`));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log(chalk.green(`\n✓ ${result.message}\n`));
|
|
50
|
+
}
|
|
27
51
|
});
|
|
52
|
+
// ─── Status (full dashboard) ───
|
|
28
53
|
cmd
|
|
29
54
|
.command('status')
|
|
30
|
-
.description('
|
|
55
|
+
.description('Show daemon and agent status dashboard')
|
|
31
56
|
.action(async () => {
|
|
32
57
|
const status = await manager.status();
|
|
58
|
+
console.log(chalk.bold.cyan('\n🤖 Agent Daemon Status\n'));
|
|
33
59
|
if (status.running) {
|
|
34
|
-
console.log(chalk.green(
|
|
60
|
+
console.log(` ${chalk.green('●')} ${chalk.green('Running')} (PID: ${status.pid})`);
|
|
35
61
|
}
|
|
36
62
|
else {
|
|
37
|
-
console.log(chalk.
|
|
63
|
+
console.log(` ${chalk.red('○')} ${chalk.yellow('Stopped')}`);
|
|
38
64
|
console.log(chalk.dim(' Start with: agent daemon start\n'));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Load triggers info
|
|
68
|
+
const triggers = await loadTriggers(process.cwd());
|
|
69
|
+
console.log(` ${chalk.dim('Triggers:')} ${triggers.length} active`);
|
|
70
|
+
for (const t of triggers) {
|
|
71
|
+
const eventIcon = t.event === 'cron' || t.event === 'goal.check'
|
|
72
|
+
? '📅'
|
|
73
|
+
: t.event === 'file.changed'
|
|
74
|
+
? '👁️'
|
|
75
|
+
: '🔗';
|
|
76
|
+
console.log(chalk.dim(` ${eventIcon} ${t.name} → ${t.schedule ?? t.watch ?? t.event}`));
|
|
77
|
+
}
|
|
78
|
+
// Show goal/task summary
|
|
79
|
+
try {
|
|
80
|
+
const mem = MemoryStore.open(process.cwd());
|
|
81
|
+
const goals = new GoalStore(mem);
|
|
82
|
+
const stats = goals.stats();
|
|
83
|
+
console.log();
|
|
84
|
+
console.log(` ${chalk.dim('Goals:')} ${stats.activeGoals} active, ${stats.completedGoals} completed`);
|
|
85
|
+
console.log(` ${chalk.dim('Tasks:')} ${stats.pendingTasks} pending, ${stats.runningTasks} running, ${stats.completedTasks} done`);
|
|
86
|
+
if (stats.awaitingApproval > 0) {
|
|
87
|
+
console.log(chalk.yellow(` ${chalk.bold('⚠️ Approval:')} ${stats.awaitingApproval} task(s) waiting for your approval`));
|
|
88
|
+
console.log(chalk.dim(' Run: agent goal status'));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// No memory DB yet, that's fine
|
|
93
|
+
}
|
|
94
|
+
// Show recent logs
|
|
95
|
+
const logs = await manager.getLogs(5);
|
|
96
|
+
if (logs.length > 0 && logs[0] !== 'No daemon logs found.') {
|
|
97
|
+
console.log();
|
|
98
|
+
console.log(` ${chalk.dim('Recent Activity:')}`);
|
|
99
|
+
for (const line of logs) {
|
|
100
|
+
console.log(chalk.dim(` ${line.replace(/^\[.*?\]\s*/, '')}`));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
});
|
|
105
|
+
// ─── View logs ───
|
|
106
|
+
cmd
|
|
107
|
+
.command('logs')
|
|
108
|
+
.description('View daemon activity logs')
|
|
109
|
+
.option('-n, --lines <n>', 'Number of lines', '30')
|
|
110
|
+
.option('-f, --follow', 'Follow log output (live tail)')
|
|
111
|
+
.action(async (opts) => {
|
|
112
|
+
if (opts.follow) {
|
|
113
|
+
// Live tail using child process
|
|
114
|
+
const logPath = path.join(process.cwd(), '.agent', 'daemon.log');
|
|
115
|
+
console.log(chalk.dim(`\n📜 Tailing ${logPath} (Ctrl+C to stop)\n`));
|
|
116
|
+
const { spawn } = await import('node:child_process');
|
|
117
|
+
const tail = spawn('tail', ['-f', '-n', opts.lines, logPath], {
|
|
118
|
+
stdio: 'inherit',
|
|
119
|
+
});
|
|
120
|
+
process.on('SIGINT', () => {
|
|
121
|
+
tail.kill();
|
|
122
|
+
process.exit(0);
|
|
123
|
+
});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const logs = await manager.getLogs(parseInt(opts.lines));
|
|
127
|
+
console.log(chalk.bold.cyan('\n📜 Daemon Logs\n'));
|
|
128
|
+
for (const line of logs) {
|
|
129
|
+
// Color-code by log level
|
|
130
|
+
if (line.includes('✅') || line.includes('🟢')) {
|
|
131
|
+
console.log(chalk.green(` ${line}`));
|
|
132
|
+
}
|
|
133
|
+
else if (line.includes('❌') || line.includes('🔴')) {
|
|
134
|
+
console.log(chalk.red(` ${line}`));
|
|
135
|
+
}
|
|
136
|
+
else if (line.includes('⚡') || line.includes('💡')) {
|
|
137
|
+
console.log(chalk.yellow(` ${line}`));
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
console.log(chalk.dim(` ${line}`));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
console.log();
|
|
144
|
+
});
|
|
145
|
+
// ─── Show triggers ───
|
|
146
|
+
cmd
|
|
147
|
+
.command('triggers')
|
|
148
|
+
.description('Show configured daemon triggers')
|
|
149
|
+
.action(async () => {
|
|
150
|
+
const triggers = await loadTriggers(process.cwd());
|
|
151
|
+
if (triggers.length === 0) {
|
|
152
|
+
console.log(chalk.yellow('\nNo triggers configured.'));
|
|
153
|
+
console.log(chalk.dim(' Create .agent/triggers.yaml to define triggers'));
|
|
154
|
+
console.log(chalk.dim(' Or run: agent daemon start (creates default triggers)\n'));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
console.log(chalk.bold.cyan('\n⚡ Daemon Triggers\n'));
|
|
158
|
+
for (const t of triggers) {
|
|
159
|
+
const icon = t.event === 'cron' || t.event === 'goal.check'
|
|
160
|
+
? '📅'
|
|
161
|
+
: t.event === 'file.changed'
|
|
162
|
+
? '👁️'
|
|
163
|
+
: t.event === 'webhook'
|
|
164
|
+
? '🔗'
|
|
165
|
+
: '📡';
|
|
166
|
+
console.log(` ${icon} ${chalk.white.bold(t.name)} ${chalk.dim(`[${t.event}]`)}` +
|
|
167
|
+
(t.enabled ? chalk.green(' ✓') : chalk.red(' ✗ disabled')));
|
|
168
|
+
if (t.schedule)
|
|
169
|
+
console.log(chalk.dim(` Schedule: ${t.schedule}`));
|
|
170
|
+
if (t.watch)
|
|
171
|
+
console.log(chalk.dim(` Watch: ${Array.isArray(t.watch) ? t.watch.join(', ') : t.watch}`));
|
|
172
|
+
if (t.action.skill)
|
|
173
|
+
console.log(chalk.dim(` Action: skill → ${t.action.skill}`));
|
|
174
|
+
if (t.action.run)
|
|
175
|
+
console.log(chalk.dim(` Action: run → ${t.action.run}`));
|
|
176
|
+
if (t.action.type)
|
|
177
|
+
console.log(chalk.dim(` Action: ${t.action.type}`));
|
|
178
|
+
console.log();
|
|
39
179
|
}
|
|
40
180
|
});
|
|
41
181
|
return cmd;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -17,7 +17,7 @@ export function createCLI() {
|
|
|
17
17
|
program
|
|
18
18
|
.name('agent')
|
|
19
19
|
.description('Agent Runtime — autonomous, goal-oriented AI agent with skills, plans, memory, and permissioned tools')
|
|
20
|
-
.version('0.
|
|
20
|
+
.version('0.3.0')
|
|
21
21
|
.option('--verbose', 'Enable verbose output')
|
|
22
22
|
.option('--no-color', 'Disable colored output')
|
|
23
23
|
.option('--config <path>', 'Path to config file');
|
|
@@ -3,16 +3,17 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export declare class DaemonManager {
|
|
5
5
|
private pidFile;
|
|
6
|
-
|
|
6
|
+
private logFile;
|
|
7
|
+
constructor();
|
|
7
8
|
/**
|
|
8
|
-
* Start the daemon
|
|
9
|
+
* Start the daemon as a detached background process
|
|
9
10
|
*/
|
|
10
11
|
start(): Promise<{
|
|
11
12
|
pid: number;
|
|
12
13
|
message: string;
|
|
13
14
|
}>;
|
|
14
15
|
/**
|
|
15
|
-
* Stop the daemon
|
|
16
|
+
* Stop the daemon gracefully
|
|
16
17
|
*/
|
|
17
18
|
stop(): Promise<{
|
|
18
19
|
message: string;
|
|
@@ -23,6 +24,11 @@ export declare class DaemonManager {
|
|
|
23
24
|
status(): Promise<{
|
|
24
25
|
running: boolean;
|
|
25
26
|
pid?: number;
|
|
27
|
+
uptime?: string;
|
|
26
28
|
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Get recent daemon log lines
|
|
31
|
+
*/
|
|
32
|
+
getLogs(lines?: number): Promise<string[]>;
|
|
27
33
|
}
|
|
28
34
|
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/daemon/manager.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/daemon/manager.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,qBAAa,aAAa;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;;IAOxB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoCxD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAe1C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC;QACpB,OAAO,EAAE,OAAO,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IAoBF;;OAEG;IACG,OAAO,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAS/C"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { readFile, writeFile, access } from 'node:fs/promises';
|
|
1
|
+
import { readFile, writeFile, access, unlink, mkdir } from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { fork } from 'node:child_process';
|
|
4
4
|
import { getAgentDir } from '../utils/paths.js';
|
|
@@ -7,11 +7,13 @@ import { getAgentDir } from '../utils/paths.js';
|
|
|
7
7
|
*/
|
|
8
8
|
export class DaemonManager {
|
|
9
9
|
pidFile;
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
logFile;
|
|
11
|
+
constructor() {
|
|
12
|
+
this.pidFile = path.join(getAgentDir(), 'daemon.pid');
|
|
13
|
+
this.logFile = path.join(getAgentDir(), 'daemon.log');
|
|
12
14
|
}
|
|
13
15
|
/**
|
|
14
|
-
* Start the daemon
|
|
16
|
+
* Start the daemon as a detached background process
|
|
15
17
|
*/
|
|
16
18
|
async start() {
|
|
17
19
|
// Check if already running
|
|
@@ -19,11 +21,20 @@ export class DaemonManager {
|
|
|
19
21
|
if (existing.running) {
|
|
20
22
|
return { pid: existing.pid, message: `Daemon already running (PID: ${existing.pid})` };
|
|
21
23
|
}
|
|
24
|
+
// Ensure .agent dir exists
|
|
25
|
+
await mkdir(path.dirname(this.pidFile), { recursive: true });
|
|
26
|
+
// Resolve to the compiled service.js
|
|
27
|
+
const daemonScript = path.resolve(path.dirname(new URL(import.meta.url).pathname), 'service.js');
|
|
22
28
|
// Fork the daemon process
|
|
23
|
-
const daemonScript = path.resolve(path.dirname(new URL(import.meta.url).pathname), 'scheduler.js');
|
|
24
29
|
const child = fork(daemonScript, [], {
|
|
25
30
|
detached: true,
|
|
26
31
|
stdio: 'ignore',
|
|
32
|
+
cwd: process.cwd(),
|
|
33
|
+
env: {
|
|
34
|
+
...process.env,
|
|
35
|
+
AGENT_DAEMON: '1',
|
|
36
|
+
AGENT_WORK_DIR: process.cwd(),
|
|
37
|
+
},
|
|
27
38
|
});
|
|
28
39
|
child.unref();
|
|
29
40
|
const pid = child.pid;
|
|
@@ -31,7 +42,7 @@ export class DaemonManager {
|
|
|
31
42
|
return { pid, message: `Daemon started (PID: ${pid})` };
|
|
32
43
|
}
|
|
33
44
|
/**
|
|
34
|
-
* Stop the daemon
|
|
45
|
+
* Stop the daemon gracefully
|
|
35
46
|
*/
|
|
36
47
|
async stop() {
|
|
37
48
|
const status = await this.status();
|
|
@@ -40,8 +51,6 @@ export class DaemonManager {
|
|
|
40
51
|
}
|
|
41
52
|
try {
|
|
42
53
|
process.kill(status.pid, 'SIGTERM');
|
|
43
|
-
// Clean up PID file
|
|
44
|
-
const { unlink } = await import('node:fs/promises');
|
|
45
54
|
await unlink(this.pidFile).catch(() => { });
|
|
46
55
|
return { message: `Daemon stopped (PID: ${status.pid})` };
|
|
47
56
|
}
|
|
@@ -63,8 +72,7 @@ export class DaemonManager {
|
|
|
63
72
|
return { running: true, pid };
|
|
64
73
|
}
|
|
65
74
|
catch {
|
|
66
|
-
// PID file exists but process is dead
|
|
67
|
-
const { unlink } = await import('node:fs/promises');
|
|
75
|
+
// PID file exists but process is dead — clean up
|
|
68
76
|
await unlink(this.pidFile).catch(() => { });
|
|
69
77
|
return { running: false };
|
|
70
78
|
}
|
|
@@ -73,5 +81,18 @@ export class DaemonManager {
|
|
|
73
81
|
return { running: false };
|
|
74
82
|
}
|
|
75
83
|
}
|
|
84
|
+
/**
|
|
85
|
+
* Get recent daemon log lines
|
|
86
|
+
*/
|
|
87
|
+
async getLogs(lines = 30) {
|
|
88
|
+
try {
|
|
89
|
+
const content = await readFile(this.logFile, 'utf-8');
|
|
90
|
+
const allLines = content.split('\n').filter(l => l.trim());
|
|
91
|
+
return allLines.slice(-lines);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return ['No daemon logs found.'];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
76
97
|
}
|
|
77
98
|
//# sourceMappingURL=manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/daemon/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/daemon/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daemon Service — The autonomous agent heartbeat
|
|
3
|
+
*
|
|
4
|
+
* Runs as a long-lived background process that:
|
|
5
|
+
* - Processes the goal/task queue
|
|
6
|
+
* - Watches files for changes
|
|
7
|
+
* - Runs cron-scheduled tasks
|
|
8
|
+
* - Logs all activity
|
|
9
|
+
*/
|
|
10
|
+
export declare class DaemonService {
|
|
11
|
+
private workDir;
|
|
12
|
+
private cronJobs;
|
|
13
|
+
private fileWatchers;
|
|
14
|
+
private heartbeatTimer;
|
|
15
|
+
private memoryStore;
|
|
16
|
+
private goalStore;
|
|
17
|
+
private logPath;
|
|
18
|
+
private running;
|
|
19
|
+
private startedAt;
|
|
20
|
+
private stats;
|
|
21
|
+
constructor(workDir?: string);
|
|
22
|
+
/**
|
|
23
|
+
* Start the daemon service
|
|
24
|
+
*/
|
|
25
|
+
start(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Register a trigger
|
|
28
|
+
*/
|
|
29
|
+
private registerTrigger;
|
|
30
|
+
/**
|
|
31
|
+
* Handle a trigger firing
|
|
32
|
+
*/
|
|
33
|
+
private onTriggerFired;
|
|
34
|
+
/**
|
|
35
|
+
* Process the goal/task queue
|
|
36
|
+
*/
|
|
37
|
+
private processGoalQueue;
|
|
38
|
+
/**
|
|
39
|
+
* Execute a single task
|
|
40
|
+
*/
|
|
41
|
+
private executeTask;
|
|
42
|
+
/**
|
|
43
|
+
* Heartbeat — periodic health check
|
|
44
|
+
*/
|
|
45
|
+
private heartbeat;
|
|
46
|
+
/**
|
|
47
|
+
* Graceful shutdown
|
|
48
|
+
*/
|
|
49
|
+
private shutdown;
|
|
50
|
+
/**
|
|
51
|
+
* Get daemon uptime as human-readable string
|
|
52
|
+
*/
|
|
53
|
+
private getUptime;
|
|
54
|
+
/**
|
|
55
|
+
* Get current daemon status
|
|
56
|
+
*/
|
|
57
|
+
getStatus(): {
|
|
58
|
+
running: boolean;
|
|
59
|
+
startedAt: string | null;
|
|
60
|
+
uptime: string;
|
|
61
|
+
stats: {
|
|
62
|
+
tasksProcessed: number;
|
|
63
|
+
tasksCompleted: number;
|
|
64
|
+
tasksFailed: number;
|
|
65
|
+
triggersFireCount: number;
|
|
66
|
+
heartbeats: number;
|
|
67
|
+
};
|
|
68
|
+
cronJobs: number;
|
|
69
|
+
fileWatchers: number;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Log a message to the daemon log file
|
|
73
|
+
*/
|
|
74
|
+
private log;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/daemon/service.ts"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AACH,qBAAa,aAAa;IAiBV,OAAO,CAAC,OAAO;IAhB3B,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,KAAK,CAMX;gBAEkB,OAAO,GAAE,MAAsB;IAMnD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B5B;;OAEG;YACW,eAAe;IA8C7B;;OAEG;YACW,cAAc;IAiC5B;;OAEG;YACW,gBAAgB;IAoC9B;;OAEG;YACW,WAAW;IAWzB;;OAEG;YACW,SAAS;IAoBvB;;OAEG;YACW,QAAQ;IA+BtB;;OAEG;IACH,OAAO,CAAC,SAAS;IAgBjB;;OAEG;IACH,SAAS;;;;;;;;;;;;;;IAWT;;OAEG;YACW,GAAG;CAWpB"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { Cron } from 'croner';
|
|
2
|
+
import { watch } from 'chokidar';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { appendFile, mkdir } from 'node:fs/promises';
|
|
5
|
+
import { MemoryStore } from '../memory/store.js';
|
|
6
|
+
import { GoalStore } from '../goals/store.js';
|
|
7
|
+
import { loadTriggers } from './triggers.js';
|
|
8
|
+
import { getAgentDir } from '../utils/paths.js';
|
|
9
|
+
/**
|
|
10
|
+
* Daemon Service — The autonomous agent heartbeat
|
|
11
|
+
*
|
|
12
|
+
* Runs as a long-lived background process that:
|
|
13
|
+
* - Processes the goal/task queue
|
|
14
|
+
* - Watches files for changes
|
|
15
|
+
* - Runs cron-scheduled tasks
|
|
16
|
+
* - Logs all activity
|
|
17
|
+
*/
|
|
18
|
+
export class DaemonService {
|
|
19
|
+
workDir;
|
|
20
|
+
cronJobs = [];
|
|
21
|
+
fileWatchers = [];
|
|
22
|
+
heartbeatTimer = null;
|
|
23
|
+
memoryStore;
|
|
24
|
+
goalStore;
|
|
25
|
+
logPath;
|
|
26
|
+
running = false;
|
|
27
|
+
startedAt = null;
|
|
28
|
+
stats = {
|
|
29
|
+
tasksProcessed: 0,
|
|
30
|
+
tasksCompleted: 0,
|
|
31
|
+
tasksFailed: 0,
|
|
32
|
+
triggersFireCount: 0,
|
|
33
|
+
heartbeats: 0,
|
|
34
|
+
};
|
|
35
|
+
constructor(workDir = process.cwd()) {
|
|
36
|
+
this.workDir = workDir;
|
|
37
|
+
this.memoryStore = MemoryStore.open(workDir);
|
|
38
|
+
this.goalStore = new GoalStore(this.memoryStore);
|
|
39
|
+
this.logPath = path.join(getAgentDir(), 'daemon.log');
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Start the daemon service
|
|
43
|
+
*/
|
|
44
|
+
async start() {
|
|
45
|
+
if (this.running)
|
|
46
|
+
return;
|
|
47
|
+
this.running = true;
|
|
48
|
+
this.startedAt = new Date();
|
|
49
|
+
await this.log('🟢 Agent daemon started');
|
|
50
|
+
await this.log(` Working directory: ${this.workDir}`);
|
|
51
|
+
// Load and register triggers
|
|
52
|
+
const triggers = await loadTriggers(this.workDir);
|
|
53
|
+
await this.log(` Loaded ${triggers.length} trigger(s)`);
|
|
54
|
+
for (const trigger of triggers) {
|
|
55
|
+
await this.registerTrigger(trigger);
|
|
56
|
+
}
|
|
57
|
+
// Start heartbeat (every 60 seconds)
|
|
58
|
+
this.heartbeatTimer = setInterval(() => this.heartbeat(), 60_000);
|
|
59
|
+
// Run initial goal check
|
|
60
|
+
await this.processGoalQueue();
|
|
61
|
+
// Keep the process alive
|
|
62
|
+
process.on('SIGTERM', () => this.shutdown());
|
|
63
|
+
process.on('SIGINT', () => this.shutdown());
|
|
64
|
+
await this.log(' Daemon is ready. Waiting for events...');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Register a trigger
|
|
68
|
+
*/
|
|
69
|
+
async registerTrigger(trigger) {
|
|
70
|
+
switch (trigger.event) {
|
|
71
|
+
case 'cron':
|
|
72
|
+
case 'goal.check':
|
|
73
|
+
if (trigger.schedule) {
|
|
74
|
+
const job = new Cron(trigger.schedule, async () => {
|
|
75
|
+
await this.onTriggerFired(trigger);
|
|
76
|
+
});
|
|
77
|
+
this.cronJobs.push(job);
|
|
78
|
+
await this.log(` 📅 Cron registered: "${trigger.name}" → ${trigger.schedule}`);
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
81
|
+
case 'file.changed':
|
|
82
|
+
if (trigger.watch) {
|
|
83
|
+
const paths = Array.isArray(trigger.watch) ? trigger.watch : [trigger.watch];
|
|
84
|
+
const watcher = watch(paths, {
|
|
85
|
+
cwd: this.workDir,
|
|
86
|
+
ignoreInitial: true,
|
|
87
|
+
awaitWriteFinish: {
|
|
88
|
+
stabilityThreshold: trigger.debounce ?? 2000,
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
let debounceTimer = null;
|
|
92
|
+
const handleChange = (filePath) => {
|
|
93
|
+
if (debounceTimer)
|
|
94
|
+
clearTimeout(debounceTimer);
|
|
95
|
+
debounceTimer = setTimeout(async () => {
|
|
96
|
+
await this.onTriggerFired(trigger, { changedFile: filePath });
|
|
97
|
+
}, trigger.debounce ?? 2000);
|
|
98
|
+
};
|
|
99
|
+
watcher.on('change', handleChange);
|
|
100
|
+
watcher.on('add', handleChange);
|
|
101
|
+
this.fileWatchers.push(watcher);
|
|
102
|
+
await this.log(` 👁️ Watcher registered: "${trigger.name}" → ${paths.join(', ')}`);
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
default:
|
|
106
|
+
await this.log(` ⚠️ Unknown trigger event: ${trigger.event}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Handle a trigger firing
|
|
111
|
+
*/
|
|
112
|
+
async onTriggerFired(trigger, _context) {
|
|
113
|
+
this.stats.triggersFireCount++;
|
|
114
|
+
if (trigger.action.type === 'goal-progress') {
|
|
115
|
+
await this.processGoalQueue();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (trigger.action.skill) {
|
|
119
|
+
await this.log(`⚡ Trigger "${trigger.name}" fired → skill: ${trigger.action.skill}`);
|
|
120
|
+
// In a full implementation, this would invoke the skill runner
|
|
121
|
+
// For now, log the trigger and create a task if there's an active goal
|
|
122
|
+
await this.log(` Skill execution: ${trigger.action.skill} (queued)`);
|
|
123
|
+
}
|
|
124
|
+
if (trigger.action.run) {
|
|
125
|
+
await this.log(`⚡ Trigger "${trigger.name}" fired → run: ${trigger.action.run}`);
|
|
126
|
+
try {
|
|
127
|
+
const { exec } = await import('node:child_process');
|
|
128
|
+
const { promisify } = await import('node:util');
|
|
129
|
+
const execAsync = promisify(exec);
|
|
130
|
+
const { stdout, stderr } = await execAsync(trigger.action.run, {
|
|
131
|
+
cwd: this.workDir,
|
|
132
|
+
timeout: 30_000,
|
|
133
|
+
});
|
|
134
|
+
if (stdout)
|
|
135
|
+
await this.log(` stdout: ${stdout.trim()}`);
|
|
136
|
+
if (stderr)
|
|
137
|
+
await this.log(` stderr: ${stderr.trim()}`);
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
await this.log(` ✗ Command failed: ${err.message}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Process the goal/task queue
|
|
146
|
+
*/
|
|
147
|
+
async processGoalQueue() {
|
|
148
|
+
const task = this.goalStore.getNextTask();
|
|
149
|
+
if (!task)
|
|
150
|
+
return;
|
|
151
|
+
this.stats.tasksProcessed++;
|
|
152
|
+
await this.log(`🔄 Processing task #${task.id}: "${task.title}"`);
|
|
153
|
+
this.goalStore.startTask(task.id);
|
|
154
|
+
try {
|
|
155
|
+
// Execute the task
|
|
156
|
+
const result = await this.executeTask(task);
|
|
157
|
+
this.goalStore.completeTask(task.id, result);
|
|
158
|
+
this.stats.tasksCompleted++;
|
|
159
|
+
await this.log(`✅ Task #${task.id} completed: ${result.slice(0, 100)}`);
|
|
160
|
+
// Auto-save completion as a memory
|
|
161
|
+
this.memoryStore.save(`Completed task: "${task.title}" — ${result.slice(0, 200)}`, 'learned', 'agent', ['task', 'completed']);
|
|
162
|
+
// Check if there are more tasks to process
|
|
163
|
+
await this.processGoalQueue();
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
const error = err.message;
|
|
167
|
+
this.goalStore.failTask(task.id, error);
|
|
168
|
+
this.stats.tasksFailed++;
|
|
169
|
+
await this.log(`❌ Task #${task.id} failed: ${error}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Execute a single task
|
|
174
|
+
*/
|
|
175
|
+
async executeTask(task) {
|
|
176
|
+
if (task.skill) {
|
|
177
|
+
// In full implementation, this invokes the skill runner with the LLM
|
|
178
|
+
// For now, use shell execution for skills that have runnable commands
|
|
179
|
+
return `Task "${task.title}" processed (skill: ${task.skill})`;
|
|
180
|
+
}
|
|
181
|
+
// If no skill, treat as a simple logged action
|
|
182
|
+
return `Task "${task.title}" processed`;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Heartbeat — periodic health check
|
|
186
|
+
*/
|
|
187
|
+
async heartbeat() {
|
|
188
|
+
if (!this.running)
|
|
189
|
+
return;
|
|
190
|
+
this.stats.heartbeats++;
|
|
191
|
+
// Check for pending approvals
|
|
192
|
+
const approvals = this.goalStore.getPendingApprovals();
|
|
193
|
+
if (approvals.length > 0) {
|
|
194
|
+
await this.log(`💡 ${approvals.length} task(s) awaiting approval`);
|
|
195
|
+
}
|
|
196
|
+
// Check for active goals
|
|
197
|
+
const goalStats = this.goalStore.stats();
|
|
198
|
+
if (goalStats.runningTasks > 0 || goalStats.pendingTasks > 0) {
|
|
199
|
+
await this.log(`📊 Heartbeat: ${goalStats.activeGoals} goals, ` +
|
|
200
|
+
`${goalStats.pendingTasks} pending, ${goalStats.runningTasks} running`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Graceful shutdown
|
|
205
|
+
*/
|
|
206
|
+
async shutdown() {
|
|
207
|
+
await this.log('🔴 Daemon shutting down...');
|
|
208
|
+
this.running = false;
|
|
209
|
+
// Stop heartbeat
|
|
210
|
+
if (this.heartbeatTimer) {
|
|
211
|
+
clearInterval(this.heartbeatTimer);
|
|
212
|
+
}
|
|
213
|
+
// Stop cron jobs
|
|
214
|
+
for (const job of this.cronJobs) {
|
|
215
|
+
job.stop();
|
|
216
|
+
}
|
|
217
|
+
// Stop file watchers
|
|
218
|
+
for (const watcher of this.fileWatchers) {
|
|
219
|
+
await watcher.close();
|
|
220
|
+
}
|
|
221
|
+
const uptime = this.getUptime();
|
|
222
|
+
await this.log(` Uptime: ${uptime} | ` +
|
|
223
|
+
`Tasks: ${this.stats.tasksProcessed} processed, ` +
|
|
224
|
+
`${this.stats.tasksCompleted} completed, ` +
|
|
225
|
+
`${this.stats.tasksFailed} failed`);
|
|
226
|
+
await this.log(' Goodbye.\n');
|
|
227
|
+
process.exit(0);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get daemon uptime as human-readable string
|
|
231
|
+
*/
|
|
232
|
+
getUptime() {
|
|
233
|
+
if (!this.startedAt)
|
|
234
|
+
return '0s';
|
|
235
|
+
const ms = Date.now() - this.startedAt.getTime();
|
|
236
|
+
const seconds = Math.floor(ms / 1000) % 60;
|
|
237
|
+
const minutes = Math.floor(ms / 60000) % 60;
|
|
238
|
+
const hours = Math.floor(ms / 3600000) % 24;
|
|
239
|
+
const days = Math.floor(ms / 86400000);
|
|
240
|
+
const parts = [];
|
|
241
|
+
if (days > 0)
|
|
242
|
+
parts.push(`${days}d`);
|
|
243
|
+
if (hours > 0)
|
|
244
|
+
parts.push(`${hours}h`);
|
|
245
|
+
if (minutes > 0)
|
|
246
|
+
parts.push(`${minutes}m`);
|
|
247
|
+
parts.push(`${seconds}s`);
|
|
248
|
+
return parts.join(' ');
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get current daemon status
|
|
252
|
+
*/
|
|
253
|
+
getStatus() {
|
|
254
|
+
return {
|
|
255
|
+
running: this.running,
|
|
256
|
+
startedAt: this.startedAt?.toISOString() ?? null,
|
|
257
|
+
uptime: this.getUptime(),
|
|
258
|
+
stats: { ...this.stats },
|
|
259
|
+
cronJobs: this.cronJobs.length,
|
|
260
|
+
fileWatchers: this.fileWatchers.length,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Log a message to the daemon log file
|
|
265
|
+
*/
|
|
266
|
+
async log(message) {
|
|
267
|
+
const timestamp = new Date().toISOString();
|
|
268
|
+
const line = `[${timestamp}] ${message}\n`;
|
|
269
|
+
// Ensure log directory exists
|
|
270
|
+
await mkdir(path.dirname(this.logPath), { recursive: true });
|
|
271
|
+
await appendFile(this.logPath, line, 'utf-8');
|
|
272
|
+
// Also print to stdout (visible in daemon logs)
|
|
273
|
+
console.log(`${timestamp.slice(11, 19)} ${message}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Auto-start if run as the daemon process
|
|
277
|
+
if (process.argv[1]?.endsWith('service.js')) {
|
|
278
|
+
const service = new DaemonService();
|
|
279
|
+
service.start().catch(err => {
|
|
280
|
+
console.error('Fatal daemon error:', err);
|
|
281
|
+
process.exit(1);
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/daemon/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trigger types supported by the daemon
|
|
3
|
+
*/
|
|
4
|
+
export interface TriggerConfig {
|
|
5
|
+
name: string;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
event: 'file.changed' | 'cron' | 'webhook' | 'git.push' | 'goal.check';
|
|
8
|
+
watch?: string | string[];
|
|
9
|
+
debounce?: number;
|
|
10
|
+
schedule?: string;
|
|
11
|
+
path?: string;
|
|
12
|
+
secret?: string;
|
|
13
|
+
branch?: string;
|
|
14
|
+
action: {
|
|
15
|
+
skill?: string;
|
|
16
|
+
run?: string;
|
|
17
|
+
type?: string;
|
|
18
|
+
input?: Record<string, any>;
|
|
19
|
+
report?: boolean;
|
|
20
|
+
block?: boolean;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface TriggersFile {
|
|
24
|
+
triggers: TriggerConfig[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Load triggers from .agent/triggers.yaml
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadTriggers(workDir?: string): Promise<TriggerConfig[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Get the default triggers template
|
|
32
|
+
*/
|
|
33
|
+
export declare function getDefaultTriggersYaml(): string;
|
|
34
|
+
//# sourceMappingURL=triggers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.d.ts","sourceRoot":"","sources":["../../../src/daemon/triggers.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC;IAEvE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,MAAM,EAAE;QACJ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACL;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAsB7E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CA4C/C"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parse as parseYaml } from 'yaml';
|
|
4
|
+
/**
|
|
5
|
+
* Load triggers from .agent/triggers.yaml
|
|
6
|
+
*/
|
|
7
|
+
export async function loadTriggers(workDir) {
|
|
8
|
+
const dir = workDir ?? process.cwd();
|
|
9
|
+
const triggersPath = path.join(dir, '.agent', 'triggers.yaml');
|
|
10
|
+
try {
|
|
11
|
+
const content = await readFile(triggersPath, 'utf-8');
|
|
12
|
+
const parsed = parseYaml(content);
|
|
13
|
+
if (!parsed?.triggers || !Array.isArray(parsed.triggers)) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
return parsed.triggers
|
|
17
|
+
.filter(t => t.enabled !== false)
|
|
18
|
+
.map(t => ({
|
|
19
|
+
...t,
|
|
20
|
+
enabled: t.enabled !== false,
|
|
21
|
+
debounce: t.debounce ?? 2000,
|
|
22
|
+
}));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Get the default triggers template
|
|
30
|
+
*/
|
|
31
|
+
export function getDefaultTriggersYaml() {
|
|
32
|
+
return `# Agent Daemon Triggers
|
|
33
|
+
# These define what the daemon watches and automates.
|
|
34
|
+
# Event types: file.changed, cron, webhook, git.push, goal.check
|
|
35
|
+
|
|
36
|
+
triggers:
|
|
37
|
+
# Process the goal/task queue every 2 minutes
|
|
38
|
+
- name: goal-processor
|
|
39
|
+
event: goal.check
|
|
40
|
+
schedule: "*/2 * * * *"
|
|
41
|
+
enabled: true
|
|
42
|
+
action:
|
|
43
|
+
type: goal-progress
|
|
44
|
+
|
|
45
|
+
# Daily standup report from git log
|
|
46
|
+
# - name: morning-standup
|
|
47
|
+
# event: cron
|
|
48
|
+
# schedule: "0 9 * * 1-5"
|
|
49
|
+
# enabled: false
|
|
50
|
+
# action:
|
|
51
|
+
# skill: git-commit
|
|
52
|
+
# input:
|
|
53
|
+
# type: standup-report
|
|
54
|
+
|
|
55
|
+
# Auto code-review on file changes
|
|
56
|
+
# - name: auto-review
|
|
57
|
+
# event: file.changed
|
|
58
|
+
# watch: "src/**/*.ts"
|
|
59
|
+
# debounce: 5000
|
|
60
|
+
# enabled: false
|
|
61
|
+
# action:
|
|
62
|
+
# skill: code-review
|
|
63
|
+
# input:
|
|
64
|
+
# scope: changed-files
|
|
65
|
+
|
|
66
|
+
# System health check every hour
|
|
67
|
+
# - name: health-check
|
|
68
|
+
# event: cron
|
|
69
|
+
# schedule: "0 * * * *"
|
|
70
|
+
# enabled: false
|
|
71
|
+
# action:
|
|
72
|
+
# skill: system-monitor
|
|
73
|
+
# report: true
|
|
74
|
+
`;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=triggers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triggers.js","sourceRoot":"","sources":["../../../src/daemon/triggers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAmC1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB;IAC/C,MAAM,GAAG,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IAE/D,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAiB,CAAC;QAElD,IAAI,CAAC,MAAM,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvD,OAAO,EAAE,CAAC;QACd,CAAC;QAED,OAAO,MAAM,CAAC,QAAQ;aACjB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACP,GAAG,CAAC;YACJ,OAAO,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK;YAC5B,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,IAAI;SAC/B,CAAC,CAAC,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IAClC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0CV,CAAC;AACF,CAAC"}
|