@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.
- package/dist/context-persistence.d.ts +140 -0
- package/dist/context-persistence.d.ts.map +1 -0
- package/dist/context-persistence.js +397 -0
- package/dist/context-persistence.js.map +1 -0
- package/dist/crash-insights.d.ts +156 -0
- package/dist/crash-insights.d.ts.map +1 -0
- package/dist/crash-insights.js +492 -0
- package/dist/crash-insights.js.map +1 -0
- package/dist/gossip-health.d.ts +137 -0
- package/dist/gossip-health.d.ts.map +1 -0
- package/dist/gossip-health.js +241 -0
- package/dist/gossip-health.js.map +1 -0
- package/dist/health-monitor.d.ts +97 -0
- package/dist/health-monitor.d.ts.map +1 -0
- package/dist/health-monitor.js +291 -0
- package/dist/health-monitor.js.map +1 -0
- package/dist/index.d.ts +68 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +68 -0
- package/dist/index.js.map +1 -0
- package/dist/leader-watchdog.d.ts +109 -0
- package/dist/leader-watchdog.d.ts.map +1 -0
- package/dist/leader-watchdog.js +189 -0
- package/dist/leader-watchdog.js.map +1 -0
- package/dist/logger.d.ts +114 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +250 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory-monitor.d.ts +172 -0
- package/dist/memory-monitor.d.ts.map +1 -0
- package/dist/memory-monitor.js +599 -0
- package/dist/memory-monitor.js.map +1 -0
- package/dist/metrics.d.ts +115 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +239 -0
- package/dist/metrics.js.map +1 -0
- package/dist/provider-context.d.ts +100 -0
- package/dist/provider-context.d.ts.map +1 -0
- package/dist/provider-context.js +362 -0
- package/dist/provider-context.js.map +1 -0
- package/dist/stateless-lead.d.ts +149 -0
- package/dist/stateless-lead.d.ts.map +1 -0
- package/dist/stateless-lead.js +308 -0
- package/dist/stateless-lead.js.map +1 -0
- package/dist/supervisor.d.ts +147 -0
- package/dist/supervisor.d.ts.map +1 -0
- package/dist/supervisor.js +459 -0
- package/dist/supervisor.js.map +1 -0
- 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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"}
|