@fleettools/squawk 0.1.0 → 0.1.1
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/package.json +1 -1
- package/AGENTS.md +0 -28
- package/dist/src/db/checkpoint-storage.d.ts +0 -19
- package/dist/src/db/checkpoint-storage.d.ts.map +0 -1
- package/dist/src/db/checkpoint-storage.js +0 -355
- package/dist/src/db/checkpoint-storage.js.map +0 -1
- package/dist/src/db/index.d.ts +0 -30
- package/dist/src/db/index.d.ts.map +0 -1
- package/dist/src/db/index.js +0 -329
- package/dist/src/db/index.js.map +0 -1
- package/dist/src/db/sqlite.d.ts +0 -31
- package/dist/src/db/sqlite.d.ts.map +0 -1
- package/dist/src/db/sqlite.js +0 -558
- package/dist/src/db/sqlite.js.map +0 -1
- package/dist/src/db/types.d.ts +0 -611
- package/dist/src/db/types.d.ts.map +0 -1
- package/dist/src/db/types.js +0 -4
- package/dist/src/db/types.js.map +0 -1
- package/dist/src/index.d.ts +0 -2
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -285
- package/dist/src/index.js.map +0 -1
- package/dist/src/recovery/checkpointing.d.ts +0 -244
- package/dist/src/recovery/checkpointing.d.ts.map +0 -1
- package/dist/src/recovery/checkpointing.js +0 -511
- package/dist/src/recovery/checkpointing.js.map +0 -1
- package/dist/src/recovery/detection.d.ts +0 -137
- package/dist/src/recovery/detection.d.ts.map +0 -1
- package/dist/src/recovery/detection.js +0 -240
- package/dist/src/recovery/detection.js.map +0 -1
- package/dist/src/recovery/detector.d.ts +0 -34
- package/dist/src/recovery/detector.d.ts.map +0 -1
- package/dist/src/recovery/detector.js +0 -42
- package/dist/src/recovery/detector.js.map +0 -1
- package/dist/src/recovery/index.d.ts +0 -3
- package/dist/src/recovery/index.d.ts.map +0 -1
- package/dist/src/recovery/index.js +0 -3
- package/dist/src/recovery/index.js.map +0 -1
- package/dist/src/recovery/restorer.d.ts +0 -51
- package/dist/src/recovery/restorer.d.ts.map +0 -1
- package/dist/src/recovery/restorer.js +0 -266
- package/dist/src/recovery/restorer.js.map +0 -1
- package/dist/src/schemas.d.ts +0 -142
- package/dist/src/schemas.d.ts.map +0 -1
- package/dist/src/schemas.js +0 -110
- package/dist/src/schemas.js.map +0 -1
- package/src/db/checkpoint-storage.ts +0 -443
- package/src/db/index.d.ts +0 -30
- package/src/db/index.d.ts.map +0 -1
- package/src/db/index.js.map +0 -1
- package/src/db/index.ts +0 -417
- package/src/db/schema.sql +0 -112
- package/src/db/sqlite.d.ts +0 -31
- package/src/db/sqlite.d.ts.map +0 -1
- package/src/db/sqlite.js +0 -667
- package/src/db/sqlite.js.map +0 -1
- package/src/db/sqlite.ts +0 -677
- package/src/db/types.d.ts +0 -612
- package/src/db/types.d.ts.map +0 -1
- package/src/db/types.js +0 -4
- package/src/db/types.js.map +0 -1
- package/src/db/types.ts +0 -771
- package/src/index.ts +0 -332
- package/src/recovery/detector.ts +0 -82
- package/src/recovery/index.ts +0 -3
- package/src/recovery/restorer.ts +0 -377
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 3: Inactivity Detection
|
|
3
|
-
*
|
|
4
|
-
* Monitors mission activity and detects when a mission has been inactive
|
|
5
|
-
* for longer than a threshold. Triggers recovery prompts to help users
|
|
6
|
-
* resume work after context window compaction.
|
|
7
|
-
*
|
|
8
|
-
* @since 1.0.0
|
|
9
|
-
*/
|
|
10
|
-
/**
|
|
11
|
-
* Detects mission inactivity and triggers recovery prompts
|
|
12
|
-
*
|
|
13
|
-
* Monitors:
|
|
14
|
-
* - Time since last event for a mission
|
|
15
|
-
* - Availability of recovery checkpoints
|
|
16
|
-
* - User preference for auto-resume
|
|
17
|
-
*
|
|
18
|
-
* Helps users recover from context window compaction by detecting
|
|
19
|
-
* when a mission has been idle and offering to resume from checkpoint.
|
|
20
|
-
*/
|
|
21
|
-
export class InactivityDetector {
|
|
22
|
-
inactivityThresholdMs;
|
|
23
|
-
autoResumeEnabled;
|
|
24
|
-
constructor(options = {}) {
|
|
25
|
-
this.inactivityThresholdMs = options.inactivityThresholdMs ?? 5 * 60 * 1000; // 5 minutes
|
|
26
|
-
this.autoResumeEnabled = options.autoResumeEnabled ?? true;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Check if a mission is inactive
|
|
30
|
-
*
|
|
31
|
-
* Returns true if no events have been recorded for the mission
|
|
32
|
-
* within the inactivity threshold.
|
|
33
|
-
*/
|
|
34
|
-
isInactive(lastActivityTime) {
|
|
35
|
-
const now = Date.now();
|
|
36
|
-
const inactivityDuration = now - lastActivityTime;
|
|
37
|
-
return inactivityDuration > this.inactivityThresholdMs;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Get inactivity duration in milliseconds
|
|
41
|
-
*/
|
|
42
|
-
getInactivityDuration(lastActivityTime) {
|
|
43
|
-
return Date.now() - lastActivityTime;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Format inactivity duration as human-readable string
|
|
47
|
-
*/
|
|
48
|
-
formatDuration(durationMs) {
|
|
49
|
-
const seconds = Math.floor(durationMs / 1000);
|
|
50
|
-
const minutes = Math.floor(seconds / 60);
|
|
51
|
-
const hours = Math.floor(minutes / 60);
|
|
52
|
-
const days = Math.floor(hours / 24);
|
|
53
|
-
if (days > 0) {
|
|
54
|
-
return `${days} day${days > 1 ? 's' : ''} ago`;
|
|
55
|
-
}
|
|
56
|
-
if (hours > 0) {
|
|
57
|
-
return `${hours} hour${hours > 1 ? 's' : ''} ago`;
|
|
58
|
-
}
|
|
59
|
-
if (minutes > 0) {
|
|
60
|
-
return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;
|
|
61
|
-
}
|
|
62
|
-
return `${seconds} second${seconds > 1 ? 's' : ''} ago`;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Check inactivity status for a mission
|
|
66
|
-
*/
|
|
67
|
-
checkStatus(mission, lastEventTime, hasCheckpoint) {
|
|
68
|
-
const inactivityDuration = this.getInactivityDuration(lastEventTime);
|
|
69
|
-
const isInactive = this.isInactive(lastEventTime);
|
|
70
|
-
return {
|
|
71
|
-
mission_id: mission.id,
|
|
72
|
-
mission_title: mission.title,
|
|
73
|
-
is_inactive: isInactive,
|
|
74
|
-
inactivity_duration_ms: inactivityDuration,
|
|
75
|
-
last_activity_at: new Date(lastEventTime).toISOString(),
|
|
76
|
-
should_prompt_recovery: isInactive && hasCheckpoint,
|
|
77
|
-
recovery_checkpoint_available: hasCheckpoint,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Generate recovery prompt for user
|
|
82
|
-
*/
|
|
83
|
-
generateRecoveryPrompt(status) {
|
|
84
|
-
const duration = this.formatDuration(status.inactivity_duration_ms);
|
|
85
|
-
const lines = [
|
|
86
|
-
`🔄 Mission "${status.mission_title}" has been inactive for ${duration}.`,
|
|
87
|
-
'',
|
|
88
|
-
'Would you like to resume from the last checkpoint?',
|
|
89
|
-
'',
|
|
90
|
-
'Options:',
|
|
91
|
-
' --auto-resume Resume automatically from checkpoint',
|
|
92
|
-
' --manual-resume Review checkpoint before resuming',
|
|
93
|
-
' --start-fresh Start a new mission',
|
|
94
|
-
'',
|
|
95
|
-
'Use: fleet resume --mission <id> [--auto-resume]',
|
|
96
|
-
];
|
|
97
|
-
return lines.join('\n');
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Check if auto-resume should be triggered
|
|
101
|
-
*
|
|
102
|
-
* Returns true if:
|
|
103
|
-
* 1. Mission is inactive
|
|
104
|
-
* 2. Checkpoint is available
|
|
105
|
-
* 3. Auto-resume is enabled
|
|
106
|
-
*/
|
|
107
|
-
shouldAutoResume(status) {
|
|
108
|
-
return (status.is_inactive &&
|
|
109
|
-
status.recovery_checkpoint_available &&
|
|
110
|
-
this.autoResumeEnabled);
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Set inactivity threshold
|
|
114
|
-
*/
|
|
115
|
-
setInactivityThreshold(thresholdMs) {
|
|
116
|
-
this.inactivityThresholdMs = thresholdMs;
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Enable/disable auto-resume
|
|
120
|
-
*/
|
|
121
|
-
setAutoResumeEnabled(enabled) {
|
|
122
|
-
this.autoResumeEnabled = enabled;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Monitors multiple missions for inactivity
|
|
127
|
-
*
|
|
128
|
-
* Periodically checks all in-progress missions and triggers
|
|
129
|
-
* recovery prompts when inactivity is detected.
|
|
130
|
-
*/
|
|
131
|
-
export class InactivityMonitor {
|
|
132
|
-
db;
|
|
133
|
-
detector;
|
|
134
|
-
onInactivityDetected;
|
|
135
|
-
monitoringTimer;
|
|
136
|
-
isMonitoring = false;
|
|
137
|
-
constructor(options) {
|
|
138
|
-
this.db = options.db;
|
|
139
|
-
this.detector = options.detector;
|
|
140
|
-
this.onInactivityDetected = options.onInactivityDetected;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Start monitoring missions for inactivity
|
|
144
|
-
*
|
|
145
|
-
* Runs check every 30 seconds by default
|
|
146
|
-
*/
|
|
147
|
-
startMonitoring(intervalMs = 30000) {
|
|
148
|
-
if (this.isMonitoring) {
|
|
149
|
-
return; // Already monitoring
|
|
150
|
-
}
|
|
151
|
-
this.isMonitoring = true;
|
|
152
|
-
this.monitoringTimer = setInterval(() => {
|
|
153
|
-
this.checkAllMissions().catch((err) => {
|
|
154
|
-
console.error('Inactivity monitoring failed:', err);
|
|
155
|
-
});
|
|
156
|
-
}, intervalMs);
|
|
157
|
-
// Run initial check immediately
|
|
158
|
-
this.checkAllMissions().catch((err) => {
|
|
159
|
-
console.error('Initial inactivity check failed:', err);
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Stop monitoring missions
|
|
164
|
-
*/
|
|
165
|
-
stopMonitoring() {
|
|
166
|
-
if (this.monitoringTimer) {
|
|
167
|
-
clearInterval(this.monitoringTimer);
|
|
168
|
-
this.monitoringTimer = undefined;
|
|
169
|
-
}
|
|
170
|
-
this.isMonitoring = false;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* Check all in-progress missions for inactivity
|
|
174
|
-
*/
|
|
175
|
-
async checkAllMissions() {
|
|
176
|
-
const inactiveStatuses = [];
|
|
177
|
-
try {
|
|
178
|
-
// Get all in-progress missions
|
|
179
|
-
const missions = await this.db.missions.getByStatus('in_progress');
|
|
180
|
-
for (const mission of missions) {
|
|
181
|
-
// Get latest event for this mission
|
|
182
|
-
const latestEvent = await this.db.events.getLatestByStream('mission', mission.id);
|
|
183
|
-
if (!latestEvent) {
|
|
184
|
-
continue; // No events yet
|
|
185
|
-
}
|
|
186
|
-
// Get latest checkpoint
|
|
187
|
-
const checkpoint = await this.db.checkpoints.getLatestByMission(mission.id);
|
|
188
|
-
// Check inactivity status
|
|
189
|
-
const lastActivityTime = new Date(latestEvent.occurred_at).getTime();
|
|
190
|
-
const status = this.detector.checkStatus(mission, lastActivityTime, !!checkpoint);
|
|
191
|
-
if (status.is_inactive) {
|
|
192
|
-
inactiveStatuses.push(status);
|
|
193
|
-
// Trigger callback if provided
|
|
194
|
-
if (this.onInactivityDetected) {
|
|
195
|
-
try {
|
|
196
|
-
await this.onInactivityDetected(status);
|
|
197
|
-
}
|
|
198
|
-
catch (err) {
|
|
199
|
-
console.error('Inactivity callback failed:', err);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
catch (error) {
|
|
206
|
-
console.error('Error checking missions for inactivity:', error);
|
|
207
|
-
}
|
|
208
|
-
return inactiveStatuses;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Check specific mission for inactivity
|
|
212
|
-
*/
|
|
213
|
-
async checkMission(missionId) {
|
|
214
|
-
try {
|
|
215
|
-
const mission = await this.db.missions.getByStatus('in_progress');
|
|
216
|
-
const targetMission = mission.find((m) => m.id === missionId);
|
|
217
|
-
if (!targetMission) {
|
|
218
|
-
return null; // Mission not found or not in progress
|
|
219
|
-
}
|
|
220
|
-
const latestEvent = await this.db.events.getLatestByStream('mission', missionId);
|
|
221
|
-
if (!latestEvent) {
|
|
222
|
-
return null; // No events yet
|
|
223
|
-
}
|
|
224
|
-
const checkpoint = await this.db.checkpoints.getLatestByMission(missionId);
|
|
225
|
-
const lastActivityTime = new Date(latestEvent.occurred_at).getTime();
|
|
226
|
-
return this.detector.checkStatus(targetMission, lastActivityTime, !!checkpoint);
|
|
227
|
-
}
|
|
228
|
-
catch (error) {
|
|
229
|
-
console.error(`Error checking mission ${missionId}:`, error);
|
|
230
|
-
return null;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Get monitoring status
|
|
235
|
-
*/
|
|
236
|
-
isActive() {
|
|
237
|
-
return this.isMonitoring;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
//# sourceMappingURL=detection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detection.js","sourceRoot":"","sources":["../../../src/recovery/detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import type { Mission, Checkpoint } from '../db/types.js';
|
|
2
|
-
export interface RecoveryCandidate {
|
|
3
|
-
mission_id: string;
|
|
4
|
-
mission_title: string;
|
|
5
|
-
last_activity_at: string;
|
|
6
|
-
inactivity_duration_ms: number;
|
|
7
|
-
checkpoint_id?: string;
|
|
8
|
-
checkpoint_progress?: number;
|
|
9
|
-
checkpoint_timestamp?: string;
|
|
10
|
-
}
|
|
11
|
-
export interface DetectionOptions {
|
|
12
|
-
activityThresholdMs?: number;
|
|
13
|
-
includeCompleted?: boolean;
|
|
14
|
-
}
|
|
15
|
-
export declare class RecoveryDetector {
|
|
16
|
-
private db;
|
|
17
|
-
constructor(db: {
|
|
18
|
-
missions: {
|
|
19
|
-
getByStatus: (status: string) => Promise<Mission[]>;
|
|
20
|
-
};
|
|
21
|
-
events: {
|
|
22
|
-
getLatestByStream: (type: string, id: string) => Promise<any | null>;
|
|
23
|
-
};
|
|
24
|
-
checkpoints: {
|
|
25
|
-
getLatestByMission: (missionId: string) => Promise<Checkpoint | null>;
|
|
26
|
-
};
|
|
27
|
-
});
|
|
28
|
-
detectRecoveryCandidates(options?: DetectionOptions): Promise<RecoveryCandidate[]>;
|
|
29
|
-
checkForRecovery(options?: DetectionOptions): Promise<{
|
|
30
|
-
needed: boolean;
|
|
31
|
-
candidates: RecoveryCandidate[];
|
|
32
|
-
}>;
|
|
33
|
-
}
|
|
34
|
-
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../../src/recovery/detector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAID,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE;QACV,QAAQ,EAAE;YAAE,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;SAAE,CAAC;QAClE,MAAM,EAAE;YAAE,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;SAAE,CAAC;QACjF,WAAW,EAAE;YAAE,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;SAAE,CAAC;KACxF;IAGG,wBAAwB,CAC5B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAqCzB,gBAAgB,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC;QAC9D,MAAM,EAAE,OAAO,CAAC;QAChB,UAAU,EAAE,iBAAiB,EAAE,CAAC;KACjC,CAAC;CAUH"}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
const DEFAULT_ACTIVITY_THRESHOLD_MS = 5 * 60 * 1000;
|
|
2
|
-
export class RecoveryDetector {
|
|
3
|
-
db;
|
|
4
|
-
constructor(db) {
|
|
5
|
-
this.db = db;
|
|
6
|
-
}
|
|
7
|
-
async detectRecoveryCandidates(options = {}) {
|
|
8
|
-
const { activityThresholdMs = DEFAULT_ACTIVITY_THRESHOLD_MS, includeCompleted = false, } = options;
|
|
9
|
-
const now = Date.now();
|
|
10
|
-
const candidates = [];
|
|
11
|
-
const activeMissions = await this.db.missions.getByStatus('in_progress');
|
|
12
|
-
for (const mission of activeMissions) {
|
|
13
|
-
const latestEvent = await this.db.events.getLatestByStream('mission', mission.id);
|
|
14
|
-
if (!latestEvent)
|
|
15
|
-
continue;
|
|
16
|
-
const lastActivityAt = new Date(latestEvent.occurred_at).getTime();
|
|
17
|
-
const inactivityDuration = now - lastActivityAt;
|
|
18
|
-
if (inactivityDuration > activityThresholdMs) {
|
|
19
|
-
const checkpoint = await this.db.checkpoints.getLatestByMission(mission.id);
|
|
20
|
-
candidates.push({
|
|
21
|
-
mission_id: mission.id,
|
|
22
|
-
mission_title: mission.title,
|
|
23
|
-
last_activity_at: latestEvent.occurred_at,
|
|
24
|
-
inactivity_duration_ms: inactivityDuration,
|
|
25
|
-
checkpoint_id: checkpoint?.id,
|
|
26
|
-
checkpoint_progress: checkpoint?.progress_percent,
|
|
27
|
-
checkpoint_timestamp: checkpoint?.timestamp,
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return candidates;
|
|
32
|
-
}
|
|
33
|
-
async checkForRecovery(options = {}) {
|
|
34
|
-
const candidates = await this.detectRecoveryCandidates(options);
|
|
35
|
-
const recoverableCandidates = candidates.filter(c => c.checkpoint_id);
|
|
36
|
-
return {
|
|
37
|
-
needed: recoverableCandidates.length > 0,
|
|
38
|
-
candidates: recoverableCandidates,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=detector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../../src/recovery/detector.ts"],"names":[],"mappings":"AAkBA,MAAM,6BAA6B,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpD,MAAM,OAAO,gBAAgB;IAEjB;IADV,YACU,EAIP;QAJO,OAAE,GAAF,EAAE,CAIT;IACA,CAAC;IAEJ,KAAK,CAAC,wBAAwB,CAC5B,UAA4B,EAAE;QAE9B,MAAM,EACJ,mBAAmB,GAAG,6BAA6B,EACnD,gBAAgB,GAAG,KAAK,GACzB,GAAG,OAAO,CAAC;QAEZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,UAAU,GAAwB,EAAE,CAAC;QAE3C,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAEzE,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YAElF,IAAI,CAAC,WAAW;gBAAE,SAAS;YAE3B,MAAM,cAAc,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC;YACnE,MAAM,kBAAkB,GAAG,GAAG,GAAG,cAAc,CAAC;YAEhD,IAAI,kBAAkB,GAAG,mBAAmB,EAAE,CAAC;gBAC7C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAE5E,UAAU,CAAC,IAAI,CAAC;oBACd,UAAU,EAAE,OAAO,CAAC,EAAE;oBACtB,aAAa,EAAE,OAAO,CAAC,KAAK;oBAC5B,gBAAgB,EAAE,WAAW,CAAC,WAAW;oBACzC,sBAAsB,EAAE,kBAAkB;oBAC1C,aAAa,EAAE,UAAU,EAAE,EAAE;oBAC7B,mBAAmB,EAAE,UAAU,EAAE,gBAAgB;oBACjD,oBAAoB,EAAE,UAAU,EAAE,SAAS;iBAC5C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,UAA4B,EAAE;QAInD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAEhE,MAAM,qBAAqB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAEtE,OAAO;YACL,MAAM,EAAE,qBAAqB,CAAC,MAAM,GAAG,CAAC;YACxC,UAAU,EAAE,qBAAqB;SAClC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/recovery/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/recovery/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAiD,MAAM,eAAe,CAAC;AAChG,OAAO,EAAE,aAAa,EAA2C,MAAM,eAAe,CAAC"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import type { Checkpoint, RecoveryContext, LockResult, AppendEventInput } from '../db/types.js';
|
|
2
|
-
export interface RestoreOptions {
|
|
3
|
-
dryRun?: boolean;
|
|
4
|
-
forceLocks?: boolean;
|
|
5
|
-
}
|
|
6
|
-
export interface RestoreResult {
|
|
7
|
-
success: boolean;
|
|
8
|
-
checkpoint_id: string;
|
|
9
|
-
mission_id: string;
|
|
10
|
-
recovery_context: RecoveryContext;
|
|
11
|
-
restored: {
|
|
12
|
-
sorties: number;
|
|
13
|
-
locks: number;
|
|
14
|
-
messages: number;
|
|
15
|
-
};
|
|
16
|
-
errors: string[];
|
|
17
|
-
warnings: string[];
|
|
18
|
-
}
|
|
19
|
-
export declare class StateRestorer {
|
|
20
|
-
private db;
|
|
21
|
-
constructor(db: {
|
|
22
|
-
checkpoints: {
|
|
23
|
-
getById: (id: string) => Promise<Checkpoint | null>;
|
|
24
|
-
getLatestByMission: (missionId: string) => Promise<Checkpoint | null>;
|
|
25
|
-
markConsumed: (id: string) => Promise<void>;
|
|
26
|
-
};
|
|
27
|
-
sorties: {
|
|
28
|
-
update: (id: string, data: any) => Promise<void>;
|
|
29
|
-
};
|
|
30
|
-
locks: {
|
|
31
|
-
acquire: (input: any) => Promise<LockResult>;
|
|
32
|
-
forceRelease: (id: string) => Promise<void>;
|
|
33
|
-
};
|
|
34
|
-
messages: {
|
|
35
|
-
requeue: (id: string) => Promise<void>;
|
|
36
|
-
};
|
|
37
|
-
events: {
|
|
38
|
-
append: (input: AppendEventInput) => Promise<any>;
|
|
39
|
-
};
|
|
40
|
-
beginTransaction: () => Promise<void>;
|
|
41
|
-
commitTransaction: () => Promise<void>;
|
|
42
|
-
rollbackTransaction: () => Promise<void>;
|
|
43
|
-
});
|
|
44
|
-
restoreFromCheckpoint(checkpointId: string, options?: RestoreOptions): Promise<RestoreResult>;
|
|
45
|
-
restoreLatest(missionId: string, options?: RestoreOptions): Promise<RestoreResult>;
|
|
46
|
-
private restore;
|
|
47
|
-
private extractNextSteps;
|
|
48
|
-
private extractModifiedFiles;
|
|
49
|
-
formatRecoveryPrompt(result: RestoreResult): string;
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=restorer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"restorer.d.ts","sourceRoot":"","sources":["../../../src/recovery/restorer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EAIf,UAAU,EACV,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,eAAe,CAAC;IAClC,QAAQ,EAAE;QACR,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,aAAa;IAEtB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE;QACV,WAAW,EAAE;YACX,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;YACpD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;YACtE,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;SAC7C,CAAC;QACF,OAAO,EAAE;YACP,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;SAClD,CAAC;QACF,KAAK,EAAE;YACL,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;YAC7C,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;SAC7C,CAAC;QACF,QAAQ,EAAE;YACR,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;SACxC,CAAC;QACF,MAAM,EAAE;YACN,MAAM,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;SACnD,CAAC;QACF,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACvC,mBAAmB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1C;IAGG,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IA+BjG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;YA+B9E,OAAO;IAgJrB,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,oBAAoB;IAc5B,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM;CAoEpD"}
|