@agent-relay/resiliency 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.
Files changed (49) hide show
  1. package/dist/context-persistence.d.ts +140 -0
  2. package/dist/context-persistence.d.ts.map +1 -0
  3. package/dist/context-persistence.js +397 -0
  4. package/dist/context-persistence.js.map +1 -0
  5. package/dist/crash-insights.d.ts +156 -0
  6. package/dist/crash-insights.d.ts.map +1 -0
  7. package/dist/crash-insights.js +492 -0
  8. package/dist/crash-insights.js.map +1 -0
  9. package/dist/gossip-health.d.ts +137 -0
  10. package/dist/gossip-health.d.ts.map +1 -0
  11. package/dist/gossip-health.js +241 -0
  12. package/dist/gossip-health.js.map +1 -0
  13. package/dist/health-monitor.d.ts +97 -0
  14. package/dist/health-monitor.d.ts.map +1 -0
  15. package/dist/health-monitor.js +291 -0
  16. package/dist/health-monitor.js.map +1 -0
  17. package/dist/index.d.ts +68 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +68 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/leader-watchdog.d.ts +109 -0
  22. package/dist/leader-watchdog.d.ts.map +1 -0
  23. package/dist/leader-watchdog.js +189 -0
  24. package/dist/leader-watchdog.js.map +1 -0
  25. package/dist/logger.d.ts +114 -0
  26. package/dist/logger.d.ts.map +1 -0
  27. package/dist/logger.js +250 -0
  28. package/dist/logger.js.map +1 -0
  29. package/dist/memory-monitor.d.ts +172 -0
  30. package/dist/memory-monitor.d.ts.map +1 -0
  31. package/dist/memory-monitor.js +599 -0
  32. package/dist/memory-monitor.js.map +1 -0
  33. package/dist/metrics.d.ts +115 -0
  34. package/dist/metrics.d.ts.map +1 -0
  35. package/dist/metrics.js +239 -0
  36. package/dist/metrics.js.map +1 -0
  37. package/dist/provider-context.d.ts +100 -0
  38. package/dist/provider-context.d.ts.map +1 -0
  39. package/dist/provider-context.js +362 -0
  40. package/dist/provider-context.js.map +1 -0
  41. package/dist/stateless-lead.d.ts +149 -0
  42. package/dist/stateless-lead.d.ts.map +1 -0
  43. package/dist/stateless-lead.js +308 -0
  44. package/dist/stateless-lead.js.map +1 -0
  45. package/dist/supervisor.d.ts +147 -0
  46. package/dist/supervisor.d.ts.map +1 -0
  47. package/dist/supervisor.js +459 -0
  48. package/dist/supervisor.js.map +1 -0
  49. package/package.json +28 -0
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Leader Watchdog
3
+ *
4
+ * Implements P3: Monitor lead health, trigger promotion if lead dies.
5
+ * Integrates with AgentSupervisor and heartbeat system.
6
+ *
7
+ * Features:
8
+ * - Monitors leader heartbeat file
9
+ * - Detects stale/missing leader
10
+ * - Triggers leader election or self-promotion
11
+ * - Integrates with supervisor events
12
+ */
13
+ import * as path from 'path';
14
+ import { EventEmitter } from 'events';
15
+ import { StatelessLeadCoordinator } from './stateless-lead.js';
16
+ const DEFAULT_CONFIG = {
17
+ checkIntervalMs: 5000,
18
+ staleThresholdMs: 30000,
19
+ };
20
+ /**
21
+ * Leader Watchdog
22
+ *
23
+ * Runs on each agent, monitors leader health, triggers election if needed.
24
+ */
25
+ export class LeaderWatchdog extends EventEmitter {
26
+ config;
27
+ heartbeatPath;
28
+ checkInterval;
29
+ isRunning = false;
30
+ currentLeader = null;
31
+ isLeader = false;
32
+ constructor(config) {
33
+ super();
34
+ this.config = { ...DEFAULT_CONFIG, ...config };
35
+ this.heartbeatPath = path.join(this.config.beadsDir, 'leader-heartbeat.json');
36
+ }
37
+ /**
38
+ * Start watching for leader health
39
+ */
40
+ start() {
41
+ if (this.isRunning)
42
+ return;
43
+ this.isRunning = true;
44
+ console.log(`[watchdog] Started monitoring leader health (${this.config.agentName})`);
45
+ this.checkInterval = setInterval(async () => {
46
+ try {
47
+ await this.checkLeaderHealth();
48
+ }
49
+ catch (err) {
50
+ console.error('[watchdog] Check error:', err);
51
+ this.emit('error', err);
52
+ }
53
+ }, this.config.checkIntervalMs);
54
+ // Initial check
55
+ this.checkLeaderHealth().catch((err) => {
56
+ console.error('[watchdog] Initial check error:', err);
57
+ });
58
+ this.emit('started');
59
+ }
60
+ /**
61
+ * Stop watching
62
+ */
63
+ stop() {
64
+ if (!this.isRunning)
65
+ return;
66
+ this.isRunning = false;
67
+ if (this.checkInterval) {
68
+ clearInterval(this.checkInterval);
69
+ this.checkInterval = undefined;
70
+ }
71
+ console.log(`[watchdog] Stopped monitoring (${this.config.agentName})`);
72
+ this.emit('stopped');
73
+ }
74
+ /**
75
+ * Check if current leader is healthy
76
+ */
77
+ async checkLeaderHealth() {
78
+ const heartbeat = await StatelessLeadCoordinator.readHeartbeat(this.config.beadsDir);
79
+ // No leader - trigger election
80
+ if (!heartbeat) {
81
+ console.log('[watchdog] No leader detected, triggering election');
82
+ await this.triggerElection('no_leader');
83
+ return;
84
+ }
85
+ // Check if this is us
86
+ if (heartbeat.leadId === this.config.agentId) {
87
+ this.isLeader = true;
88
+ this.currentLeader = heartbeat;
89
+ return;
90
+ }
91
+ this.isLeader = false;
92
+ // Check if stale
93
+ const age = Date.now() - heartbeat.timestamp;
94
+ if (age > this.config.staleThresholdMs) {
95
+ console.log(`[watchdog] Leader ${heartbeat.leadName} is stale (${Math.round(age / 1000)}s old)`);
96
+ this.emit('leaderStale', { leader: heartbeat, age });
97
+ await this.triggerElection('stale_leader');
98
+ return;
99
+ }
100
+ // Leader is healthy
101
+ if (!this.currentLeader || this.currentLeader.leadId !== heartbeat.leadId) {
102
+ console.log(`[watchdog] Leader detected: ${heartbeat.leadName}`);
103
+ this.emit('leaderDetected', heartbeat);
104
+ }
105
+ this.currentLeader = heartbeat;
106
+ }
107
+ /**
108
+ * Trigger leader election
109
+ */
110
+ async triggerElection(reason) {
111
+ console.log(`[watchdog] Triggering election (reason: ${reason})`);
112
+ this.emit('electionStarted', { reason });
113
+ const result = await this.electLeader();
114
+ if (result.method === 'none') {
115
+ console.log('[watchdog] No candidates for election');
116
+ this.emit('electionFailed', { reason: 'no_candidates' });
117
+ return;
118
+ }
119
+ console.log(`[watchdog] Election result: ${result.winner} (method: ${result.method})`);
120
+ this.emit('electionComplete', result);
121
+ // If we won, become leader
122
+ if (result.winnerId === this.config.agentId) {
123
+ console.log(`[watchdog] This agent (${this.config.agentName}) won the election, becoming leader`);
124
+ this.isLeader = true;
125
+ await this.config.onBecomeLeader();
126
+ this.emit('becameLeader');
127
+ }
128
+ }
129
+ /**
130
+ * Simple leader election: oldest healthy agent wins
131
+ */
132
+ async electLeader() {
133
+ const candidates = await this.config.getHealthyAgents();
134
+ if (candidates.length === 0) {
135
+ return {
136
+ winner: '',
137
+ winnerId: '',
138
+ candidates: [],
139
+ method: 'none',
140
+ };
141
+ }
142
+ // Sort by spawn time (oldest first)
143
+ candidates.sort((a, b) => a.spawnedAt.getTime() - b.spawnedAt.getTime());
144
+ const winner = candidates[0];
145
+ return {
146
+ winner: winner.name,
147
+ winnerId: winner.id,
148
+ candidates: candidates.map((c) => c.name),
149
+ method: 'oldest',
150
+ };
151
+ }
152
+ /**
153
+ * Check if this agent is currently the leader
154
+ */
155
+ isCurrentLeader() {
156
+ return this.isLeader;
157
+ }
158
+ /**
159
+ * Get current leader info
160
+ */
161
+ getCurrentLeader() {
162
+ return this.currentLeader;
163
+ }
164
+ /**
165
+ * Get watchdog status
166
+ */
167
+ getStatus() {
168
+ return {
169
+ isRunning: this.isRunning,
170
+ isLeader: this.isLeader,
171
+ currentLeader: this.currentLeader,
172
+ agentName: this.config.agentName,
173
+ };
174
+ }
175
+ }
176
+ /**
177
+ * Create a leader watchdog with defaults
178
+ */
179
+ export function createLeaderWatchdog(beadsDir, agentName, agentId, callbacks) {
180
+ return new LeaderWatchdog({
181
+ beadsDir,
182
+ agentName,
183
+ agentId,
184
+ ...callbacks,
185
+ checkIntervalMs: 5000,
186
+ staleThresholdMs: 30000,
187
+ });
188
+ }
189
+ //# sourceMappingURL=leader-watchdog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leader-watchdog.js","sourceRoot":"","sources":["../src/leader-watchdog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Structured Logger
3
+ *
4
+ * Provides consistent, structured logging across agent-relay components.
5
+ * - JSON format for machine parsing
6
+ * - Log levels with filtering
7
+ * - Context propagation (correlation IDs, agent names)
8
+ * - File rotation support
9
+ */
10
+ import { EventEmitter } from 'events';
11
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'fatal';
12
+ export interface LogEntry {
13
+ timestamp: string;
14
+ level: LogLevel;
15
+ component: string;
16
+ message: string;
17
+ correlationId?: string;
18
+ agentName?: string;
19
+ pid?: number;
20
+ duration?: number;
21
+ error?: {
22
+ name: string;
23
+ message: string;
24
+ stack?: string;
25
+ };
26
+ [key: string]: unknown;
27
+ }
28
+ export interface LoggerConfig {
29
+ level: LogLevel;
30
+ json: boolean;
31
+ file?: string;
32
+ maxFileSize?: number;
33
+ maxFiles?: number;
34
+ console: boolean;
35
+ }
36
+ export declare class Logger extends EventEmitter {
37
+ private config;
38
+ private component;
39
+ private context;
40
+ private fileStream?;
41
+ private currentFileSize;
42
+ constructor(component: string, config?: Partial<LoggerConfig>);
43
+ /**
44
+ * Create a child logger with additional context
45
+ */
46
+ child(context: Record<string, unknown>): Logger;
47
+ /**
48
+ * Set context that will be included in all log entries
49
+ */
50
+ setContext(context: Record<string, unknown>): void;
51
+ /**
52
+ * Log at debug level
53
+ */
54
+ debug(message: string, context?: Record<string, unknown>): void;
55
+ /**
56
+ * Log at info level
57
+ */
58
+ info(message: string, context?: Record<string, unknown>): void;
59
+ /**
60
+ * Log at warn level
61
+ */
62
+ warn(message: string, context?: Record<string, unknown>): void;
63
+ /**
64
+ * Log at error level
65
+ */
66
+ error(message: string, context?: Record<string, unknown>): void;
67
+ /**
68
+ * Log at fatal level
69
+ */
70
+ fatal(message: string, context?: Record<string, unknown>): void;
71
+ /**
72
+ * Log with timing (returns function to end timing)
73
+ */
74
+ time(message: string, context?: Record<string, unknown>): () => void;
75
+ /**
76
+ * Log an error with stack trace
77
+ */
78
+ logError(error: Error, message?: string, context?: Record<string, unknown>): void;
79
+ /**
80
+ * Core log method
81
+ */
82
+ private log;
83
+ /**
84
+ * Write to console
85
+ */
86
+ private writeConsole;
87
+ /**
88
+ * Write to file with rotation
89
+ */
90
+ private writeFile;
91
+ /**
92
+ * Initialize file stream
93
+ */
94
+ private initFileStream;
95
+ /**
96
+ * Rotate log file
97
+ */
98
+ private rotateFile;
99
+ /**
100
+ * Close the logger
101
+ */
102
+ close(): void;
103
+ }
104
+ export declare function configure(config: Partial<LoggerConfig>): void;
105
+ export declare function createLogger(component: string, config?: Partial<LoggerConfig>): Logger;
106
+ export declare const loggers: {
107
+ daemon: () => Logger;
108
+ spawner: () => Logger;
109
+ router: () => Logger;
110
+ agent: (name: string) => Logger;
111
+ health: () => Logger;
112
+ connection: (id: string) => Logger;
113
+ };
114
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
package/dist/logger.js ADDED
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Structured Logger
3
+ *
4
+ * Provides consistent, structured logging across agent-relay components.
5
+ * - JSON format for machine parsing
6
+ * - Log levels with filtering
7
+ * - Context propagation (correlation IDs, agent names)
8
+ * - File rotation support
9
+ */
10
+ import { EventEmitter } from 'events';
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ const LOG_LEVELS = {
14
+ debug: 0,
15
+ info: 1,
16
+ warn: 2,
17
+ error: 3,
18
+ fatal: 4,
19
+ };
20
+ const LEVEL_COLORS = {
21
+ debug: '\x1b[90m', // gray
22
+ info: '\x1b[36m', // cyan
23
+ warn: '\x1b[33m', // yellow
24
+ error: '\x1b[31m', // red
25
+ fatal: '\x1b[35m', // magenta
26
+ };
27
+ const RESET = '\x1b[0m';
28
+ const DEFAULT_CONFIG = {
29
+ level: 'info',
30
+ json: process.env.NODE_ENV === 'production',
31
+ console: true,
32
+ maxFileSize: 10 * 1024 * 1024, // 10MB
33
+ maxFiles: 5,
34
+ };
35
+ export class Logger extends EventEmitter {
36
+ config;
37
+ component;
38
+ context = {};
39
+ fileStream;
40
+ currentFileSize = 0;
41
+ constructor(component, config = {}) {
42
+ super();
43
+ this.component = component;
44
+ this.config = { ...DEFAULT_CONFIG, ...config };
45
+ if (this.config.file) {
46
+ this.initFileStream();
47
+ }
48
+ }
49
+ /**
50
+ * Create a child logger with additional context
51
+ */
52
+ child(context) {
53
+ const child = new Logger(this.component, this.config);
54
+ child.context = { ...this.context, ...context };
55
+ return child;
56
+ }
57
+ /**
58
+ * Set context that will be included in all log entries
59
+ */
60
+ setContext(context) {
61
+ this.context = { ...this.context, ...context };
62
+ }
63
+ /**
64
+ * Log at debug level
65
+ */
66
+ debug(message, context) {
67
+ this.log('debug', message, context);
68
+ }
69
+ /**
70
+ * Log at info level
71
+ */
72
+ info(message, context) {
73
+ this.log('info', message, context);
74
+ }
75
+ /**
76
+ * Log at warn level
77
+ */
78
+ warn(message, context) {
79
+ this.log('warn', message, context);
80
+ }
81
+ /**
82
+ * Log at error level
83
+ */
84
+ error(message, context) {
85
+ this.log('error', message, context);
86
+ }
87
+ /**
88
+ * Log at fatal level
89
+ */
90
+ fatal(message, context) {
91
+ this.log('fatal', message, context);
92
+ }
93
+ /**
94
+ * Log with timing (returns function to end timing)
95
+ */
96
+ time(message, context) {
97
+ const start = Date.now();
98
+ return () => {
99
+ const duration = Date.now() - start;
100
+ this.info(message, { ...context, duration });
101
+ };
102
+ }
103
+ /**
104
+ * Log an error with stack trace
105
+ */
106
+ logError(error, message, context) {
107
+ this.log('error', message || error.message, {
108
+ ...context,
109
+ error: {
110
+ name: error.name,
111
+ message: error.message,
112
+ stack: error.stack,
113
+ },
114
+ });
115
+ }
116
+ /**
117
+ * Core log method
118
+ */
119
+ log(level, message, context) {
120
+ if (LOG_LEVELS[level] < LOG_LEVELS[this.config.level]) {
121
+ return;
122
+ }
123
+ const entry = {
124
+ timestamp: new Date().toISOString(),
125
+ level,
126
+ component: this.component,
127
+ message,
128
+ ...this.context,
129
+ ...context,
130
+ };
131
+ // Emit for external handlers
132
+ this.emit('log', entry);
133
+ // Console output
134
+ if (this.config.console) {
135
+ this.writeConsole(entry);
136
+ }
137
+ // File output
138
+ if (this.fileStream) {
139
+ this.writeFile(entry);
140
+ }
141
+ }
142
+ /**
143
+ * Write to console
144
+ */
145
+ writeConsole(entry) {
146
+ if (this.config.json) {
147
+ console.log(JSON.stringify(entry));
148
+ }
149
+ else {
150
+ const color = LEVEL_COLORS[entry.level];
151
+ const levelStr = entry.level.toUpperCase().padEnd(5);
152
+ const componentStr = `[${entry.component}]`.padEnd(20);
153
+ let line = `${entry.timestamp} ${color}${levelStr}${RESET} ${componentStr} ${entry.message}`;
154
+ // Add context fields (exclude standard log entry fields)
155
+ const { timestamp: _t, level: _l, component: _c, message: _m, ...contextFields } = entry;
156
+ if (Object.keys(contextFields).length > 0) {
157
+ line += ` ${JSON.stringify(contextFields)}`;
158
+ }
159
+ console.log(line);
160
+ }
161
+ }
162
+ /**
163
+ * Write to file with rotation
164
+ */
165
+ writeFile(entry) {
166
+ if (!this.fileStream)
167
+ return;
168
+ const line = JSON.stringify(entry) + '\n';
169
+ const lineBytes = Buffer.byteLength(line);
170
+ // Check if rotation needed
171
+ if (this.config.maxFileSize &&
172
+ this.currentFileSize + lineBytes > this.config.maxFileSize) {
173
+ this.rotateFile();
174
+ }
175
+ this.fileStream.write(line);
176
+ this.currentFileSize += lineBytes;
177
+ }
178
+ /**
179
+ * Initialize file stream
180
+ */
181
+ initFileStream() {
182
+ if (!this.config.file)
183
+ return;
184
+ const dir = path.dirname(this.config.file);
185
+ if (!fs.existsSync(dir)) {
186
+ fs.mkdirSync(dir, { recursive: true });
187
+ }
188
+ // Get current file size
189
+ if (fs.existsSync(this.config.file)) {
190
+ const stats = fs.statSync(this.config.file);
191
+ this.currentFileSize = stats.size;
192
+ }
193
+ this.fileStream = fs.createWriteStream(this.config.file, { flags: 'a' });
194
+ }
195
+ /**
196
+ * Rotate log file
197
+ */
198
+ rotateFile() {
199
+ if (!this.config.file || !this.fileStream)
200
+ return;
201
+ this.fileStream.end();
202
+ // Rotate existing files
203
+ for (let i = (this.config.maxFiles || 5) - 1; i >= 1; i--) {
204
+ const oldPath = `${this.config.file}.${i}`;
205
+ const newPath = `${this.config.file}.${i + 1}`;
206
+ if (fs.existsSync(oldPath)) {
207
+ if (i === (this.config.maxFiles || 5) - 1) {
208
+ fs.unlinkSync(oldPath); // Delete oldest
209
+ }
210
+ else {
211
+ fs.renameSync(oldPath, newPath);
212
+ }
213
+ }
214
+ }
215
+ // Rename current to .1
216
+ if (fs.existsSync(this.config.file)) {
217
+ fs.renameSync(this.config.file, `${this.config.file}.1`);
218
+ }
219
+ // Create new stream
220
+ this.currentFileSize = 0;
221
+ this.fileStream = fs.createWriteStream(this.config.file, { flags: 'a' });
222
+ }
223
+ /**
224
+ * Close the logger
225
+ */
226
+ close() {
227
+ if (this.fileStream) {
228
+ this.fileStream.end();
229
+ this.fileStream = undefined;
230
+ }
231
+ }
232
+ }
233
+ // Logger factory with global configuration
234
+ let globalConfig = {};
235
+ export function configure(config) {
236
+ globalConfig = config;
237
+ }
238
+ export function createLogger(component, config) {
239
+ return new Logger(component, { ...globalConfig, ...config });
240
+ }
241
+ // Pre-configured loggers for common components
242
+ export const loggers = {
243
+ daemon: () => createLogger('daemon'),
244
+ spawner: () => createLogger('spawner'),
245
+ router: () => createLogger('router'),
246
+ agent: (name) => createLogger('agent').child({ agentName: name }),
247
+ health: () => createLogger('health-monitor'),
248
+ connection: (id) => createLogger('connection').child({ connectionId: id }),
249
+ };
250
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}