@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.
Files changed (66) hide show
  1. package/package.json +1 -1
  2. package/AGENTS.md +0 -28
  3. package/dist/src/db/checkpoint-storage.d.ts +0 -19
  4. package/dist/src/db/checkpoint-storage.d.ts.map +0 -1
  5. package/dist/src/db/checkpoint-storage.js +0 -355
  6. package/dist/src/db/checkpoint-storage.js.map +0 -1
  7. package/dist/src/db/index.d.ts +0 -30
  8. package/dist/src/db/index.d.ts.map +0 -1
  9. package/dist/src/db/index.js +0 -329
  10. package/dist/src/db/index.js.map +0 -1
  11. package/dist/src/db/sqlite.d.ts +0 -31
  12. package/dist/src/db/sqlite.d.ts.map +0 -1
  13. package/dist/src/db/sqlite.js +0 -558
  14. package/dist/src/db/sqlite.js.map +0 -1
  15. package/dist/src/db/types.d.ts +0 -611
  16. package/dist/src/db/types.d.ts.map +0 -1
  17. package/dist/src/db/types.js +0 -4
  18. package/dist/src/db/types.js.map +0 -1
  19. package/dist/src/index.d.ts +0 -2
  20. package/dist/src/index.d.ts.map +0 -1
  21. package/dist/src/index.js +0 -285
  22. package/dist/src/index.js.map +0 -1
  23. package/dist/src/recovery/checkpointing.d.ts +0 -244
  24. package/dist/src/recovery/checkpointing.d.ts.map +0 -1
  25. package/dist/src/recovery/checkpointing.js +0 -511
  26. package/dist/src/recovery/checkpointing.js.map +0 -1
  27. package/dist/src/recovery/detection.d.ts +0 -137
  28. package/dist/src/recovery/detection.d.ts.map +0 -1
  29. package/dist/src/recovery/detection.js +0 -240
  30. package/dist/src/recovery/detection.js.map +0 -1
  31. package/dist/src/recovery/detector.d.ts +0 -34
  32. package/dist/src/recovery/detector.d.ts.map +0 -1
  33. package/dist/src/recovery/detector.js +0 -42
  34. package/dist/src/recovery/detector.js.map +0 -1
  35. package/dist/src/recovery/index.d.ts +0 -3
  36. package/dist/src/recovery/index.d.ts.map +0 -1
  37. package/dist/src/recovery/index.js +0 -3
  38. package/dist/src/recovery/index.js.map +0 -1
  39. package/dist/src/recovery/restorer.d.ts +0 -51
  40. package/dist/src/recovery/restorer.d.ts.map +0 -1
  41. package/dist/src/recovery/restorer.js +0 -266
  42. package/dist/src/recovery/restorer.js.map +0 -1
  43. package/dist/src/schemas.d.ts +0 -142
  44. package/dist/src/schemas.d.ts.map +0 -1
  45. package/dist/src/schemas.js +0 -110
  46. package/dist/src/schemas.js.map +0 -1
  47. package/src/db/checkpoint-storage.ts +0 -443
  48. package/src/db/index.d.ts +0 -30
  49. package/src/db/index.d.ts.map +0 -1
  50. package/src/db/index.js.map +0 -1
  51. package/src/db/index.ts +0 -417
  52. package/src/db/schema.sql +0 -112
  53. package/src/db/sqlite.d.ts +0 -31
  54. package/src/db/sqlite.d.ts.map +0 -1
  55. package/src/db/sqlite.js +0 -667
  56. package/src/db/sqlite.js.map +0 -1
  57. package/src/db/sqlite.ts +0 -677
  58. package/src/db/types.d.ts +0 -612
  59. package/src/db/types.d.ts.map +0 -1
  60. package/src/db/types.js +0 -4
  61. package/src/db/types.js.map +0 -1
  62. package/src/db/types.ts +0 -771
  63. package/src/index.ts +0 -332
  64. package/src/recovery/detector.ts +0 -82
  65. package/src/recovery/index.ts +0 -3
  66. 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,3 +0,0 @@
1
- export { RecoveryDetector, type RecoveryCandidate, type DetectionOptions } from './detector.js';
2
- export { StateRestorer, type RestoreResult, type RestoreOptions } from './restorer.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -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,3 +0,0 @@
1
- export { RecoveryDetector } from './detector.js';
2
- export { StateRestorer } from './restorer.js';
3
- //# sourceMappingURL=index.js.map
@@ -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"}