@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,140 @@
1
+ /**
2
+ * Context Persistence
3
+ *
4
+ * Maintains agent context across restarts using ledger-based state storage.
5
+ * Inspired by Continuous-Claude-v2: "Clear don't compact, save state to ledger."
6
+ *
7
+ * Key concepts:
8
+ * - Ledger: Periodic snapshots of agent state
9
+ * - Handoff: Detailed context for task continuation
10
+ * - Artifact index: Searchable history of decisions/actions
11
+ */
12
+ export interface AgentState {
13
+ name: string;
14
+ cli: string;
15
+ task?: string;
16
+ currentPhase: string;
17
+ completedTasks: string[];
18
+ decisions: Decision[];
19
+ context: Record<string, unknown>;
20
+ artifacts: Artifact[];
21
+ lastCheckpoint: Date;
22
+ sessionCount: number;
23
+ }
24
+ export interface Decision {
25
+ timestamp: Date;
26
+ description: string;
27
+ reasoning: string;
28
+ outcome?: 'success' | 'failure' | 'pending';
29
+ }
30
+ export interface Artifact {
31
+ id: string;
32
+ type: 'code' | 'file' | 'message' | 'error' | 'decision';
33
+ path?: string;
34
+ content: string;
35
+ timestamp: Date;
36
+ tags: string[];
37
+ }
38
+ export interface Handoff {
39
+ fromAgent: string;
40
+ toAgent?: string;
41
+ createdAt: Date;
42
+ task: string;
43
+ summary: string;
44
+ completedSteps: string[];
45
+ nextSteps: string[];
46
+ context: Record<string, unknown>;
47
+ warnings: string[];
48
+ artifacts: string[];
49
+ }
50
+ export interface LedgerEntry {
51
+ timestamp: Date;
52
+ sessionId: string;
53
+ type: 'checkpoint' | 'handoff' | 'crash' | 'complete';
54
+ state: AgentState;
55
+ handoff?: Handoff;
56
+ }
57
+ export declare class ContextPersistence {
58
+ private baseDir;
59
+ private states;
60
+ private saveInterval?;
61
+ private saveIntervalMs;
62
+ constructor(baseDir?: string);
63
+ /**
64
+ * Start periodic state saving
65
+ */
66
+ startAutoSave(): void;
67
+ /**
68
+ * Stop periodic state saving
69
+ */
70
+ stopAutoSave(): void;
71
+ /**
72
+ * Initialize or load state for an agent
73
+ */
74
+ initAgent(name: string, cli: string, task?: string): AgentState;
75
+ /**
76
+ * Update agent's current phase
77
+ */
78
+ updatePhase(name: string, phase: string): void;
79
+ /**
80
+ * Record a completed task
81
+ */
82
+ recordTask(name: string, task: string): void;
83
+ /**
84
+ * Record a decision
85
+ */
86
+ recordDecision(name: string, description: string, reasoning: string, outcome?: 'success' | 'failure' | 'pending'): void;
87
+ /**
88
+ * Add an artifact
89
+ */
90
+ addArtifact(name: string, type: Artifact['type'], content: string, options?: {
91
+ path?: string;
92
+ tags?: string[];
93
+ }): string;
94
+ /**
95
+ * Update context
96
+ */
97
+ updateContext(name: string, context: Record<string, unknown>): void;
98
+ /**
99
+ * Create a handoff document for resumption
100
+ */
101
+ createHandoff(name: string, options?: {
102
+ toAgent?: string;
103
+ }): Handoff;
104
+ /**
105
+ * Load handoff for resumption
106
+ */
107
+ loadHandoff(name: string): Handoff | null;
108
+ /**
109
+ * Record a crash for debugging
110
+ */
111
+ recordCrash(name: string, error: string, stack?: string): void;
112
+ /**
113
+ * Save checkpoint (call before expected context clear)
114
+ */
115
+ checkpoint(name: string): void;
116
+ /**
117
+ * Generate markdown summary for CLAUDE.md injection
118
+ */
119
+ generateResumptionContext(name: string): string;
120
+ /**
121
+ * Get state for an agent
122
+ */
123
+ getState(name: string): AgentState | undefined;
124
+ /**
125
+ * Clean up old ledger entries
126
+ */
127
+ cleanup(name: string, keepDays?: number): void;
128
+ private ensureDir;
129
+ private saveState;
130
+ private saveAllStates;
131
+ private loadLatestState;
132
+ private saveLedgerEntry;
133
+ private saveHandoff;
134
+ private saveArtifact;
135
+ private generateSummary;
136
+ private inferNextSteps;
137
+ private getWarnings;
138
+ }
139
+ export declare function getContextPersistence(baseDir?: string): ContextPersistence;
140
+ //# sourceMappingURL=context-persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-persistence.d.ts","sourceRoot":"","sources":["../src/context-persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,397 @@
1
+ /**
2
+ * Context Persistence
3
+ *
4
+ * Maintains agent context across restarts using ledger-based state storage.
5
+ * Inspired by Continuous-Claude-v2: "Clear don't compact, save state to ledger."
6
+ *
7
+ * Key concepts:
8
+ * - Ledger: Periodic snapshots of agent state
9
+ * - Handoff: Detailed context for task continuation
10
+ * - Artifact index: Searchable history of decisions/actions
11
+ */
12
+ import * as fs from 'fs';
13
+ import * as path from 'path';
14
+ import { createLogger } from './logger.js';
15
+ const logger = createLogger('context-persistence');
16
+ export class ContextPersistence {
17
+ baseDir;
18
+ states = new Map();
19
+ saveInterval;
20
+ saveIntervalMs = 30000; // Save every 30 seconds
21
+ constructor(baseDir) {
22
+ this.baseDir = baseDir || path.join(process.cwd(), '.agent-relay', 'context');
23
+ this.ensureDir(this.baseDir);
24
+ this.ensureDir(path.join(this.baseDir, 'ledgers'));
25
+ this.ensureDir(path.join(this.baseDir, 'handoffs'));
26
+ this.ensureDir(path.join(this.baseDir, 'artifacts'));
27
+ }
28
+ /**
29
+ * Start periodic state saving
30
+ */
31
+ startAutoSave() {
32
+ if (this.saveInterval)
33
+ return;
34
+ this.saveInterval = setInterval(() => {
35
+ this.saveAllStates();
36
+ }, this.saveIntervalMs);
37
+ logger.info('Auto-save started', { intervalMs: this.saveIntervalMs });
38
+ }
39
+ /**
40
+ * Stop periodic state saving
41
+ */
42
+ stopAutoSave() {
43
+ if (this.saveInterval) {
44
+ clearInterval(this.saveInterval);
45
+ this.saveInterval = undefined;
46
+ logger.info('Auto-save stopped');
47
+ }
48
+ }
49
+ /**
50
+ * Initialize or load state for an agent
51
+ */
52
+ initAgent(name, cli, task) {
53
+ // Try to load existing state
54
+ const existing = this.loadLatestState(name);
55
+ if (existing) {
56
+ existing.sessionCount++;
57
+ existing.lastCheckpoint = new Date();
58
+ this.states.set(name, existing);
59
+ logger.info('Loaded existing agent state', {
60
+ name,
61
+ sessionCount: existing.sessionCount,
62
+ completedTasks: existing.completedTasks.length,
63
+ });
64
+ return existing;
65
+ }
66
+ // Create new state
67
+ const state = {
68
+ name,
69
+ cli,
70
+ task,
71
+ currentPhase: 'init',
72
+ completedTasks: [],
73
+ decisions: [],
74
+ context: {},
75
+ artifacts: [],
76
+ lastCheckpoint: new Date(),
77
+ sessionCount: 1,
78
+ };
79
+ this.states.set(name, state);
80
+ this.saveState(name);
81
+ logger.info('Created new agent state', { name, cli, task });
82
+ return state;
83
+ }
84
+ /**
85
+ * Update agent's current phase
86
+ */
87
+ updatePhase(name, phase) {
88
+ const state = this.states.get(name);
89
+ if (state) {
90
+ state.currentPhase = phase;
91
+ state.lastCheckpoint = new Date();
92
+ }
93
+ }
94
+ /**
95
+ * Record a completed task
96
+ */
97
+ recordTask(name, task) {
98
+ const state = this.states.get(name);
99
+ if (state) {
100
+ state.completedTasks.push(task);
101
+ state.lastCheckpoint = new Date();
102
+ logger.debug('Recorded task completion', { name, task });
103
+ }
104
+ }
105
+ /**
106
+ * Record a decision
107
+ */
108
+ recordDecision(name, description, reasoning, outcome) {
109
+ const state = this.states.get(name);
110
+ if (state) {
111
+ state.decisions.push({
112
+ timestamp: new Date(),
113
+ description,
114
+ reasoning,
115
+ outcome,
116
+ });
117
+ state.lastCheckpoint = new Date();
118
+ logger.debug('Recorded decision', { name, description, outcome });
119
+ }
120
+ }
121
+ /**
122
+ * Add an artifact
123
+ */
124
+ addArtifact(name, type, content, options) {
125
+ const state = this.states.get(name);
126
+ if (!state)
127
+ return '';
128
+ const id = `${name}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
129
+ const artifact = {
130
+ id,
131
+ type,
132
+ content: content.substring(0, 10000), // Limit size
133
+ timestamp: new Date(),
134
+ path: options?.path,
135
+ tags: options?.tags || [],
136
+ };
137
+ state.artifacts.push(artifact);
138
+ state.lastCheckpoint = new Date();
139
+ // Save artifact to disk for searchability
140
+ this.saveArtifact(artifact);
141
+ return id;
142
+ }
143
+ /**
144
+ * Update context
145
+ */
146
+ updateContext(name, context) {
147
+ const state = this.states.get(name);
148
+ if (state) {
149
+ state.context = { ...state.context, ...context };
150
+ state.lastCheckpoint = new Date();
151
+ }
152
+ }
153
+ /**
154
+ * Create a handoff document for resumption
155
+ */
156
+ createHandoff(name, options) {
157
+ const state = this.states.get(name);
158
+ if (!state) {
159
+ throw new Error(`Agent ${name} not found`);
160
+ }
161
+ const handoff = {
162
+ fromAgent: name,
163
+ toAgent: options?.toAgent,
164
+ createdAt: new Date(),
165
+ task: state.task || 'Unknown task',
166
+ summary: this.generateSummary(state),
167
+ completedSteps: state.completedTasks,
168
+ nextSteps: this.inferNextSteps(state),
169
+ context: state.context,
170
+ warnings: this.getWarnings(state),
171
+ artifacts: state.artifacts.slice(-10).map((a) => a.id), // Last 10 artifacts
172
+ };
173
+ // Save handoff
174
+ this.saveHandoff(name, handoff);
175
+ logger.info('Created handoff', {
176
+ from: name,
177
+ to: options?.toAgent,
178
+ completedSteps: handoff.completedSteps.length,
179
+ });
180
+ return handoff;
181
+ }
182
+ /**
183
+ * Load handoff for resumption
184
+ */
185
+ loadHandoff(name) {
186
+ const handoffPath = path.join(this.baseDir, 'handoffs', `${name}_latest.json`);
187
+ if (!fs.existsSync(handoffPath)) {
188
+ return null;
189
+ }
190
+ try {
191
+ const content = fs.readFileSync(handoffPath, 'utf8');
192
+ return JSON.parse(content);
193
+ }
194
+ catch (error) {
195
+ logger.error('Failed to load handoff', { name, error });
196
+ return null;
197
+ }
198
+ }
199
+ /**
200
+ * Record a crash for debugging
201
+ */
202
+ recordCrash(name, error, stack) {
203
+ const state = this.states.get(name);
204
+ if (!state)
205
+ return;
206
+ // Add crash as artifact
207
+ this.addArtifact(name, 'error', `${error}\n\n${stack || ''}`, {
208
+ tags: ['crash', 'error'],
209
+ });
210
+ // Save crash ledger entry
211
+ this.saveLedgerEntry(name, 'crash', state);
212
+ // Create handoff for resumption
213
+ this.createHandoff(name);
214
+ logger.error('Recorded crash', { name, error });
215
+ }
216
+ /**
217
+ * Save checkpoint (call before expected context clear)
218
+ */
219
+ checkpoint(name) {
220
+ const state = this.states.get(name);
221
+ if (!state)
222
+ return;
223
+ state.lastCheckpoint = new Date();
224
+ this.saveLedgerEntry(name, 'checkpoint', state);
225
+ this.createHandoff(name);
226
+ logger.info('Created checkpoint', { name, phase: state.currentPhase });
227
+ }
228
+ /**
229
+ * Generate markdown summary for CLAUDE.md injection
230
+ */
231
+ generateResumptionContext(name) {
232
+ const state = this.states.get(name);
233
+ const handoff = this.loadHandoff(name);
234
+ if (!state && !handoff) {
235
+ return '';
236
+ }
237
+ const lines = [
238
+ '# Agent Resumption Context',
239
+ '',
240
+ `**Session**: ${(state?.sessionCount || 0) + 1}`,
241
+ `**Last Checkpoint**: ${state?.lastCheckpoint?.toISOString() || 'Unknown'}`,
242
+ '',
243
+ ];
244
+ if (handoff) {
245
+ lines.push('## Previous Session Summary');
246
+ lines.push(handoff.summary);
247
+ lines.push('');
248
+ if (handoff.completedSteps.length > 0) {
249
+ lines.push('## Completed Steps');
250
+ handoff.completedSteps.forEach((step) => lines.push(`- ✅ ${step}`));
251
+ lines.push('');
252
+ }
253
+ if (handoff.nextSteps.length > 0) {
254
+ lines.push('## Next Steps');
255
+ handoff.nextSteps.forEach((step) => lines.push(`- ⏳ ${step}`));
256
+ lines.push('');
257
+ }
258
+ if (handoff.warnings.length > 0) {
259
+ lines.push('## Warnings');
260
+ handoff.warnings.forEach((w) => lines.push(`- ⚠️ ${w}`));
261
+ lines.push('');
262
+ }
263
+ }
264
+ if (state?.decisions.length) {
265
+ lines.push('## Recent Decisions');
266
+ state.decisions.slice(-5).forEach((d) => {
267
+ const icon = d.outcome === 'success' ? '✅' : d.outcome === 'failure' ? '❌' : '🔄';
268
+ lines.push(`- ${icon} ${d.description}`);
269
+ if (d.reasoning)
270
+ lines.push(` - Reasoning: ${d.reasoning}`);
271
+ });
272
+ lines.push('');
273
+ }
274
+ return lines.join('\n');
275
+ }
276
+ /**
277
+ * Get state for an agent
278
+ */
279
+ getState(name) {
280
+ return this.states.get(name);
281
+ }
282
+ /**
283
+ * Clean up old ledger entries
284
+ */
285
+ cleanup(name, keepDays = 7) {
286
+ const ledgerDir = path.join(this.baseDir, 'ledgers', name);
287
+ if (!fs.existsSync(ledgerDir))
288
+ return;
289
+ const cutoff = Date.now() - keepDays * 24 * 60 * 60 * 1000;
290
+ const files = fs.readdirSync(ledgerDir);
291
+ for (const file of files) {
292
+ const filePath = path.join(ledgerDir, file);
293
+ const stats = fs.statSync(filePath);
294
+ if (stats.mtimeMs < cutoff) {
295
+ fs.unlinkSync(filePath);
296
+ logger.debug('Cleaned up old ledger', { file });
297
+ }
298
+ }
299
+ }
300
+ // Private methods
301
+ ensureDir(dir) {
302
+ if (!fs.existsSync(dir)) {
303
+ fs.mkdirSync(dir, { recursive: true });
304
+ }
305
+ }
306
+ saveState(name) {
307
+ const state = this.states.get(name);
308
+ if (!state)
309
+ return;
310
+ const statePath = path.join(this.baseDir, 'ledgers', `${name}_current.json`);
311
+ fs.writeFileSync(statePath, JSON.stringify(state, null, 2));
312
+ }
313
+ saveAllStates() {
314
+ Array.from(this.states.keys()).forEach((name) => {
315
+ this.saveState(name);
316
+ });
317
+ }
318
+ loadLatestState(name) {
319
+ const statePath = path.join(this.baseDir, 'ledgers', `${name}_current.json`);
320
+ if (!fs.existsSync(statePath)) {
321
+ return null;
322
+ }
323
+ try {
324
+ const content = fs.readFileSync(statePath, 'utf8');
325
+ return JSON.parse(content);
326
+ }
327
+ catch (error) {
328
+ logger.error('Failed to load state', { name, error });
329
+ return null;
330
+ }
331
+ }
332
+ saveLedgerEntry(name, type, state) {
333
+ const ledgerDir = path.join(this.baseDir, 'ledgers', name);
334
+ this.ensureDir(ledgerDir);
335
+ const entry = {
336
+ timestamp: new Date(),
337
+ sessionId: `${name}-${Date.now()}`,
338
+ type,
339
+ state: { ...state },
340
+ };
341
+ const filename = `${type}_${Date.now()}.json`;
342
+ fs.writeFileSync(path.join(ledgerDir, filename), JSON.stringify(entry, null, 2));
343
+ }
344
+ saveHandoff(name, handoff) {
345
+ const handoffDir = path.join(this.baseDir, 'handoffs');
346
+ this.ensureDir(handoffDir);
347
+ // Save as latest
348
+ fs.writeFileSync(path.join(handoffDir, `${name}_latest.json`), JSON.stringify(handoff, null, 2));
349
+ // Also save timestamped version
350
+ fs.writeFileSync(path.join(handoffDir, `${name}_${Date.now()}.json`), JSON.stringify(handoff, null, 2));
351
+ }
352
+ saveArtifact(artifact) {
353
+ const artifactDir = path.join(this.baseDir, 'artifacts');
354
+ this.ensureDir(artifactDir);
355
+ fs.writeFileSync(path.join(artifactDir, `${artifact.id}.json`), JSON.stringify(artifact, null, 2));
356
+ }
357
+ generateSummary(state) {
358
+ const parts = [];
359
+ if (state.task) {
360
+ parts.push(`Task: ${state.task}`);
361
+ }
362
+ parts.push(`Phase: ${state.currentPhase}`);
363
+ parts.push(`Completed ${state.completedTasks.length} tasks`);
364
+ parts.push(`Made ${state.decisions.length} decisions`);
365
+ const successes = state.decisions.filter((d) => d.outcome === 'success').length;
366
+ const failures = state.decisions.filter((d) => d.outcome === 'failure').length;
367
+ if (successes || failures) {
368
+ parts.push(`(${successes} successful, ${failures} failed)`);
369
+ }
370
+ return parts.join('. ');
371
+ }
372
+ inferNextSteps(state) {
373
+ const pending = state.decisions.filter((d) => d.outcome === 'pending');
374
+ return pending.map((d) => d.description);
375
+ }
376
+ getWarnings(state) {
377
+ const warnings = [];
378
+ const recentFailures = state.decisions.filter((d) => d.outcome === 'failure' &&
379
+ new Date(d.timestamp).getTime() > Date.now() - 10 * 60 * 1000);
380
+ if (recentFailures.length > 2) {
381
+ warnings.push(`${recentFailures.length} recent failures - review approach`);
382
+ }
383
+ if (state.sessionCount > 3) {
384
+ warnings.push(`Multiple restarts (${state.sessionCount}) - check for persistent issues`);
385
+ }
386
+ return warnings;
387
+ }
388
+ }
389
+ // Singleton instance
390
+ let _persistence = null;
391
+ export function getContextPersistence(baseDir) {
392
+ if (!_persistence) {
393
+ _persistence = new ContextPersistence(baseDir);
394
+ }
395
+ return _persistence;
396
+ }
397
+ //# sourceMappingURL=context-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-persistence.js","sourceRoot":"","sources":["../src/context-persistence.ts"],"names":[],"mappings":"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"}