@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.
@@ -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;AAIpC,wBAAgB,mBAAmB,IAAI,OAAO,CAyC7C"}
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}\n`));
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
- console.log(chalk.cyan(`\n${result.message}\n`));
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('Check daemon status')
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(`\n✓ Daemon is running (PID: ${status.pid})\n`));
60
+ console.log(` ${chalk.green('●')} ${chalk.green('Running')} (PID: ${status.pid})`);
35
61
  }
36
62
  else {
37
- console.log(chalk.yellow(`\nDaemon is not running\n`));
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;AAExD,MAAM,UAAU,mBAAmB;IAC/B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SAC5B,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;IAEpC,GAAG;SACE,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,+BAAgC,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;YACpF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC,CAAC,CAAC;IAEP,GAAG;SACE,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEP,GAAG;SACE,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,KAAK,IAAI,EAAE;QACf,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;QACjE,CAAC;IACL,CAAC,CAAC,CAAC;IAEP,OAAO,GAAG,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"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"}
@@ -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.2.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
- constructor(pidFile?: string);
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;gBAEZ,OAAO,CAAC,EAAE,MAAM;IAI5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA0BxD;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB1C;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAoB9D"}
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
- constructor(pidFile) {
11
- this.pidFile = pidFile ?? path.join(getAgentDir(), 'daemon.pid');
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":"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"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praveencs/agent",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "files": [
5
5
  "dist",
6
6
  "bin",
@@ -76,4 +76,4 @@
76
76
  "tsx": "^4.19.2",
77
77
  "typescript": "^5.7.3"
78
78
  }
79
- }
79
+ }