@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
package/dist/src/index.js
DELETED
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
import { closeDatabase, mailboxOps, eventOps, cursorOps, lockOps } from './db/index.js';
|
|
2
|
-
console.log('Squawk API database initialized');
|
|
3
|
-
const server = Bun.serve({
|
|
4
|
-
port: parseInt(process.env.SQUAWK_PORT || '3001', 10),
|
|
5
|
-
async fetch(request) {
|
|
6
|
-
const url = new URL(request.url);
|
|
7
|
-
const path = url.pathname;
|
|
8
|
-
// CORS headers
|
|
9
|
-
const headers = {
|
|
10
|
-
'Access-Control-Allow-Origin': '*',
|
|
11
|
-
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
|
|
12
|
-
'Access-Control-Allow-Headers': 'Content-Type',
|
|
13
|
-
};
|
|
14
|
-
if (request.method === 'OPTIONS') {
|
|
15
|
-
return new Response(null, { headers });
|
|
16
|
-
}
|
|
17
|
-
if (path === '/health') {
|
|
18
|
-
return new Response(JSON.stringify({
|
|
19
|
-
status: 'healthy',
|
|
20
|
-
service: 'squawk',
|
|
21
|
-
timestamp: new Date().toISOString(),
|
|
22
|
-
}), {
|
|
23
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
// === MAILBOX ENDPOINTS ===
|
|
27
|
-
if (path === '/api/v1/mailbox/append' && request.method === 'POST') {
|
|
28
|
-
try {
|
|
29
|
-
const body = await request.json();
|
|
30
|
-
const { stream_id, events } = body;
|
|
31
|
-
if (!stream_id || !Array.isArray(events)) {
|
|
32
|
-
return new Response(JSON.stringify({ error: 'stream_id and events array are required' }), {
|
|
33
|
-
status: 400,
|
|
34
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
if (!(await mailboxOps.exists(stream_id))) {
|
|
38
|
-
await mailboxOps.create(stream_id);
|
|
39
|
-
}
|
|
40
|
-
const formattedEvents = events.map((e) => ({
|
|
41
|
-
type: e.type,
|
|
42
|
-
stream_id,
|
|
43
|
-
data: JSON.stringify(e.data),
|
|
44
|
-
occurred_at: new Date().toISOString(),
|
|
45
|
-
causation_id: e.causation_id || null,
|
|
46
|
-
metadata: e.metadata ? JSON.stringify(e.metadata) : null,
|
|
47
|
-
}));
|
|
48
|
-
const inserted = await eventOps.append(stream_id, formattedEvents);
|
|
49
|
-
const mailbox = await mailboxOps.getById(stream_id);
|
|
50
|
-
const mailboxEvents = await eventOps.getByMailbox(stream_id);
|
|
51
|
-
return new Response(JSON.stringify({
|
|
52
|
-
mailbox: { ...mailbox, events: mailboxEvents },
|
|
53
|
-
inserted: inserted.length
|
|
54
|
-
}), {
|
|
55
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
console.error('Error appending to mailbox:', error);
|
|
60
|
-
return new Response(JSON.stringify({ error: 'Failed to append to mailbox' }), {
|
|
61
|
-
status: 500,
|
|
62
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
if (path.startsWith('/api/v1/mailbox/') && request.method === 'GET') {
|
|
67
|
-
const streamId = path.split('/').pop();
|
|
68
|
-
if (!streamId) {
|
|
69
|
-
return new Response(JSON.stringify({ error: 'Invalid stream ID' }), {
|
|
70
|
-
status: 400,
|
|
71
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
try {
|
|
75
|
-
const mailbox = await mailboxOps.getById(streamId);
|
|
76
|
-
if (!mailbox) {
|
|
77
|
-
return new Response(JSON.stringify({ error: 'Mailbox not found' }), {
|
|
78
|
-
status: 404,
|
|
79
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
const events = eventOps.getByMailbox(streamId);
|
|
83
|
-
return new Response(JSON.stringify({ mailbox: { ...mailbox, events } }), {
|
|
84
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
console.error('Error getting mailbox:', error);
|
|
89
|
-
return new Response(JSON.stringify({ error: 'Failed to get mailbox' }), {
|
|
90
|
-
status: 500,
|
|
91
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
// === CURSOR ENDPOINTS ===
|
|
96
|
-
if (path === '/api/v1/cursor/advance' && request.method === 'POST') {
|
|
97
|
-
try {
|
|
98
|
-
const body = await request.json();
|
|
99
|
-
const { stream_id, position } = body;
|
|
100
|
-
if (!stream_id || typeof position !== 'number') {
|
|
101
|
-
return new Response(JSON.stringify({ error: 'stream_id and position are required' }), {
|
|
102
|
-
status: 400,
|
|
103
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
if (!(await mailboxOps.exists(stream_id))) {
|
|
107
|
-
await mailboxOps.create(stream_id);
|
|
108
|
-
}
|
|
109
|
-
const cursor = await cursorOps.upsert({ stream_id, position: position, updated_at: new Date().toISOString() });
|
|
110
|
-
return new Response(JSON.stringify({ cursor }), {
|
|
111
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
catch (error) {
|
|
115
|
-
console.error('Error advancing cursor:', error);
|
|
116
|
-
return new Response(JSON.stringify({ error: 'Failed to advance cursor' }), {
|
|
117
|
-
status: 500,
|
|
118
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
if (path.startsWith('/api/v1/cursor/') && request.method === 'GET') {
|
|
123
|
-
const cursorId = path.split('/').pop();
|
|
124
|
-
if (!cursorId) {
|
|
125
|
-
return new Response(JSON.stringify({ error: 'Invalid cursor ID' }), {
|
|
126
|
-
status: 400,
|
|
127
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
try {
|
|
131
|
-
const cursor = await cursorOps.getById(cursorId);
|
|
132
|
-
if (!cursor) {
|
|
133
|
-
return new Response(JSON.stringify({ error: 'Cursor not found' }), {
|
|
134
|
-
status: 404,
|
|
135
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
return new Response(JSON.stringify({ cursor }), {
|
|
139
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
catch (error) {
|
|
143
|
-
console.error('Error getting cursor:', error);
|
|
144
|
-
return new Response(JSON.stringify({ error: 'Failed to get cursor' }), {
|
|
145
|
-
status: 500,
|
|
146
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
// === LOCK ENDPOINTS ===
|
|
151
|
-
if (path === '/api/v1/lock/acquire' && request.method === 'POST') {
|
|
152
|
-
try {
|
|
153
|
-
const body = await request.json();
|
|
154
|
-
const { file, specialist_id, timeout_ms = 30000 } = body;
|
|
155
|
-
if (!file || !specialist_id) {
|
|
156
|
-
return new Response(JSON.stringify({ error: 'file and specialist_id are required' }), {
|
|
157
|
-
status: 400,
|
|
158
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
const lock = await lockOps.acquire({
|
|
162
|
-
file: file,
|
|
163
|
-
reserved_by: specialist_id,
|
|
164
|
-
reserved_at: new Date().toISOString(),
|
|
165
|
-
released_at: null,
|
|
166
|
-
purpose: 'edit',
|
|
167
|
-
checksum: null,
|
|
168
|
-
timeout_ms,
|
|
169
|
-
metadata: null,
|
|
170
|
-
});
|
|
171
|
-
return new Response(JSON.stringify({ lock }), {
|
|
172
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
catch (error) {
|
|
176
|
-
console.error('Error acquiring lock:', error);
|
|
177
|
-
return new Response(JSON.stringify({ error: 'Failed to acquire lock' }), {
|
|
178
|
-
status: 500,
|
|
179
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
if (path === '/api/v1/lock/release' && request.method === 'POST') {
|
|
184
|
-
try {
|
|
185
|
-
const body = await request.json();
|
|
186
|
-
const { lock_id, specialist_id } = body;
|
|
187
|
-
if (!lock_id) {
|
|
188
|
-
return new Response(JSON.stringify({ error: 'lock_id is required' }), {
|
|
189
|
-
status: 400,
|
|
190
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
const lock = await lockOps.getById(lock_id);
|
|
194
|
-
if (!lock) {
|
|
195
|
-
return new Response(JSON.stringify({ error: 'Lock not found' }), {
|
|
196
|
-
status: 404,
|
|
197
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
if (lock.reserved_by !== specialist_id) {
|
|
201
|
-
return new Response(JSON.stringify({ error: 'Cannot release lock: wrong specialist' }), {
|
|
202
|
-
status: 403,
|
|
203
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
const updatedLock = await lockOps.release(lock_id);
|
|
207
|
-
return new Response(JSON.stringify({ lock: updatedLock }), {
|
|
208
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
catch (error) {
|
|
212
|
-
console.error('Error releasing lock:', error);
|
|
213
|
-
return new Response(JSON.stringify({ error: 'Failed to release lock' }), {
|
|
214
|
-
status: 500,
|
|
215
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
if (path === '/api/v1/locks' && request.method === 'GET') {
|
|
220
|
-
try {
|
|
221
|
-
const locks = await lockOps.getAll();
|
|
222
|
-
return new Response(JSON.stringify({ locks }), {
|
|
223
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
catch (error) {
|
|
227
|
-
console.error('Error listing locks:', error);
|
|
228
|
-
return new Response(JSON.stringify({ error: 'Failed to list locks' }), {
|
|
229
|
-
status: 500,
|
|
230
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
// === COORDINATOR ENDPOINTS ===
|
|
235
|
-
if (path === '/api/v1/coordinator/status' && request.method === 'GET') {
|
|
236
|
-
try {
|
|
237
|
-
const mailboxes = await mailboxOps.getAll();
|
|
238
|
-
const locks = await lockOps.getAll();
|
|
239
|
-
return new Response(JSON.stringify({
|
|
240
|
-
active_mailboxes: mailboxes.length,
|
|
241
|
-
active_locks: locks.length,
|
|
242
|
-
timestamp: new Date().toISOString(),
|
|
243
|
-
}), {
|
|
244
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
catch (error) {
|
|
248
|
-
console.error('Error getting coordinator status:', error);
|
|
249
|
-
return new Response(JSON.stringify({ error: 'Failed to get status' }), {
|
|
250
|
-
status: 500,
|
|
251
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
// 404
|
|
256
|
-
return new Response(JSON.stringify({ error: 'Not found' }), {
|
|
257
|
-
status: 404,
|
|
258
|
-
headers: { ...headers, 'Content-Type': 'application/json' },
|
|
259
|
-
});
|
|
260
|
-
},
|
|
261
|
-
});
|
|
262
|
-
setInterval(async () => {
|
|
263
|
-
const released = await lockOps.releaseExpired();
|
|
264
|
-
if (released > 0) {
|
|
265
|
-
console.log(`Released ${released} expired locks`);
|
|
266
|
-
}
|
|
267
|
-
}, 30000); // Check every 30 seconds
|
|
268
|
-
console.log(`Squawk API server listening on port ${server.port}`);
|
|
269
|
-
console.log('Endpoints:');
|
|
270
|
-
console.log(' POST /api/v1/mailbox/append - Append events to mailbox');
|
|
271
|
-
console.log(' GET /api/v1/mailbox/:streamId - Get mailbox contents');
|
|
272
|
-
console.log(' POST /api/v1/cursor/advance - Advance cursor position');
|
|
273
|
-
console.log(' GET /api/v1/cursor/:cursorId - Get cursor position');
|
|
274
|
-
console.log(' POST /api/v1/lock/acquire - Acquire file lock (CTK)');
|
|
275
|
-
console.log(' POST /api/v1/lock/release - Release file lock (CTK)');
|
|
276
|
-
console.log(' GET /api/v1/locks - List all active locks');
|
|
277
|
-
console.log(' GET /api/v1/coordinator/status - Get coordinator status');
|
|
278
|
-
console.log(' GET /health - Health check');
|
|
279
|
-
process.on('SIGINT', () => {
|
|
280
|
-
console.log('Shutting down...');
|
|
281
|
-
closeDatabase();
|
|
282
|
-
server.stop();
|
|
283
|
-
process.exit(0);
|
|
284
|
-
});
|
|
285
|
-
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 3: Checkpoint Triggering System
|
|
3
|
-
*
|
|
4
|
-
* Implements automatic checkpoint creation based on:
|
|
5
|
-
* - Progress milestones (25%, 50%, 75%)
|
|
6
|
-
* - Error conditions (exceptions, API errors, lock timeouts, message failures)
|
|
7
|
-
* - Manual triggers (user-initiated)
|
|
8
|
-
*
|
|
9
|
-
* All checkpoint operations are non-blocking async to avoid delaying mission progress.
|
|
10
|
-
*
|
|
11
|
-
* @since 1.0.0
|
|
12
|
-
*/
|
|
13
|
-
import type { Checkpoint, CreateCheckpointInput, CheckpointTrigger, Mission, Sortie, Lock, Message, AppendEventInput } from '../db/types.js';
|
|
14
|
-
export interface ProgressCheckpointTriggerOptions {
|
|
15
|
-
/** Milestones to trigger checkpoints at (default: [25, 50, 75]) */
|
|
16
|
-
milestones?: number[];
|
|
17
|
-
/** Minimum time between checkpoints in ms (default: 60000 = 1 minute) */
|
|
18
|
-
minIntervalMs?: number;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Monitors mission progress and creates checkpoints at milestones
|
|
22
|
-
*
|
|
23
|
-
* Triggers checkpoints at 25%, 50%, 75% completion to enable recovery
|
|
24
|
-
* from context window compaction at natural breakpoints.
|
|
25
|
-
*/
|
|
26
|
-
export declare class ProgressCheckpointTrigger {
|
|
27
|
-
private lastCheckpointProgress;
|
|
28
|
-
private lastCheckpointTime;
|
|
29
|
-
private milestones;
|
|
30
|
-
private minIntervalMs;
|
|
31
|
-
constructor(options?: ProgressCheckpointTriggerOptions);
|
|
32
|
-
/**
|
|
33
|
-
* Check if progress milestone has been reached
|
|
34
|
-
*
|
|
35
|
-
* Returns true if:
|
|
36
|
-
* 1. Current progress crosses a milestone threshold
|
|
37
|
-
* 2. Minimum interval since last checkpoint has passed
|
|
38
|
-
*/
|
|
39
|
-
shouldCheckpoint(currentProgress: number): boolean;
|
|
40
|
-
/**
|
|
41
|
-
* Record that a checkpoint was created at this progress level
|
|
42
|
-
*/
|
|
43
|
-
recordCheckpoint(progress: number): void;
|
|
44
|
-
/**
|
|
45
|
-
* Get the next milestone after current progress
|
|
46
|
-
*/
|
|
47
|
-
getNextMilestone(currentProgress: number): number | null;
|
|
48
|
-
}
|
|
49
|
-
export interface BlockerInfo {
|
|
50
|
-
type: 'lock_timeout' | 'api_error' | 'dependency' | 'exception' | 'message_failure' | 'other';
|
|
51
|
-
description: string;
|
|
52
|
-
affected_sortie?: string;
|
|
53
|
-
resolution_hint?: string;
|
|
54
|
-
timestamp?: string;
|
|
55
|
-
error_code?: string;
|
|
56
|
-
error_details?: Record<string, unknown>;
|
|
57
|
-
}
|
|
58
|
-
export interface ErrorCheckpointTriggerOptions {
|
|
59
|
-
/** Enable automatic error checkpoints (default: true) */
|
|
60
|
-
enabled?: boolean;
|
|
61
|
-
/** Minimum time between error checkpoints in ms (default: 30000 = 30 seconds) */
|
|
62
|
-
minIntervalMs?: number;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Detects error conditions and creates checkpoints to preserve state
|
|
66
|
-
*
|
|
67
|
-
* Monitors for:
|
|
68
|
-
* - Unhandled exceptions in sorties
|
|
69
|
-
* - API errors (4xx/5xx responses)
|
|
70
|
-
* - Lock acquisition timeouts
|
|
71
|
-
* - Message delivery failures
|
|
72
|
-
*
|
|
73
|
-
* Captures error details in recovery context for debugging and recovery.
|
|
74
|
-
*/
|
|
75
|
-
export declare class ErrorCheckpointTrigger {
|
|
76
|
-
private lastErrorCheckpointTime;
|
|
77
|
-
private minIntervalMs;
|
|
78
|
-
private enabled;
|
|
79
|
-
private recentErrors;
|
|
80
|
-
constructor(options?: ErrorCheckpointTriggerOptions);
|
|
81
|
-
/**
|
|
82
|
-
* Check if error checkpoint should be created
|
|
83
|
-
*
|
|
84
|
-
* Returns true if:
|
|
85
|
-
* 1. Error detection is enabled
|
|
86
|
-
* 2. Minimum interval since last error checkpoint has passed
|
|
87
|
-
*/
|
|
88
|
-
shouldCheckpoint(): boolean;
|
|
89
|
-
/**
|
|
90
|
-
* Record an unhandled exception
|
|
91
|
-
*/
|
|
92
|
-
recordException(sortieId: string, error: Error | unknown, context?: Record<string, unknown>): BlockerInfo;
|
|
93
|
-
/**
|
|
94
|
-
* Record an API error
|
|
95
|
-
*/
|
|
96
|
-
recordApiError(sortieId: string, statusCode: number, message: string, endpoint?: string): BlockerInfo;
|
|
97
|
-
/**
|
|
98
|
-
* Record a lock acquisition timeout
|
|
99
|
-
*/
|
|
100
|
-
recordLockTimeout(sortieId: string, filePath: string, heldBy?: string): BlockerInfo;
|
|
101
|
-
/**
|
|
102
|
-
* Record a message delivery failure
|
|
103
|
-
*/
|
|
104
|
-
recordMessageFailure(sortieId: string, messageId: string, reason: string): BlockerInfo;
|
|
105
|
-
/**
|
|
106
|
-
* Record a dependency blocker
|
|
107
|
-
*/
|
|
108
|
-
recordDependencyBlocker(sortieId: string, dependsOn: string, reason?: string): BlockerInfo;
|
|
109
|
-
/**
|
|
110
|
-
* Record a generic blocker
|
|
111
|
-
*/
|
|
112
|
-
recordBlocker(sortieId: string, blocker: BlockerInfo): BlockerInfo;
|
|
113
|
-
/**
|
|
114
|
-
* Get all blockers for a sortie
|
|
115
|
-
*/
|
|
116
|
-
getBlockers(sortieId: string): BlockerInfo[];
|
|
117
|
-
/**
|
|
118
|
-
* Get all blockers across all sorties
|
|
119
|
-
*/
|
|
120
|
-
getAllBlockers(): BlockerInfo[];
|
|
121
|
-
/**
|
|
122
|
-
* Clear blockers for a sortie (after recovery)
|
|
123
|
-
*/
|
|
124
|
-
clearBlockers(sortieId: string): void;
|
|
125
|
-
/**
|
|
126
|
-
* Record that error checkpoint was created
|
|
127
|
-
*/
|
|
128
|
-
recordCheckpoint(): void;
|
|
129
|
-
/**
|
|
130
|
-
* Internal: Add blocker to tracking
|
|
131
|
-
*/
|
|
132
|
-
private addBlocker;
|
|
133
|
-
}
|
|
134
|
-
export interface CheckpointCreatorOptions {
|
|
135
|
-
/** Database instance for storing checkpoints and events */
|
|
136
|
-
db: {
|
|
137
|
-
checkpoints: {
|
|
138
|
-
create: (input: CreateCheckpointInput) => Promise<Checkpoint>;
|
|
139
|
-
};
|
|
140
|
-
events: {
|
|
141
|
-
append: (input: AppendEventInput) => Promise<any>;
|
|
142
|
-
};
|
|
143
|
-
missions: {
|
|
144
|
-
getById: (id: string) => Promise<Mission | null>;
|
|
145
|
-
};
|
|
146
|
-
sorties: {
|
|
147
|
-
getByMission: (missionId: string) => Promise<Sortie[]>;
|
|
148
|
-
};
|
|
149
|
-
locks: {
|
|
150
|
-
getActiveLocks: (missionId: string) => Promise<Lock[]>;
|
|
151
|
-
};
|
|
152
|
-
messages: {
|
|
153
|
-
getPendingMessages: (missionId: string) => Promise<Message[]>;
|
|
154
|
-
};
|
|
155
|
-
};
|
|
156
|
-
/** Agent ID creating the checkpoint */
|
|
157
|
-
agentId: string;
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Creates checkpoints with full state snapshots
|
|
161
|
-
*
|
|
162
|
-
* Captures:
|
|
163
|
-
* - Mission and sortie state
|
|
164
|
-
* - Active file locks
|
|
165
|
-
* - Pending messages
|
|
166
|
-
* - Recovery context for LLM prompt injection
|
|
167
|
-
*/
|
|
168
|
-
export declare class CheckpointCreator {
|
|
169
|
-
private db;
|
|
170
|
-
private agentId;
|
|
171
|
-
constructor(options: CheckpointCreatorOptions);
|
|
172
|
-
/**
|
|
173
|
-
* Create a checkpoint with full state snapshot
|
|
174
|
-
*
|
|
175
|
-
* Non-blocking: returns immediately, checkpoint creation happens in background
|
|
176
|
-
*/
|
|
177
|
-
createCheckpoint(missionId: string, trigger: CheckpointTrigger, options?: {
|
|
178
|
-
triggerDetails?: string;
|
|
179
|
-
progressPercent?: number;
|
|
180
|
-
blockers?: BlockerInfo[];
|
|
181
|
-
ttlHours?: number;
|
|
182
|
-
}): Promise<Checkpoint>;
|
|
183
|
-
/**
|
|
184
|
-
* Build recovery context for LLM prompt injection
|
|
185
|
-
*/
|
|
186
|
-
private buildRecoveryContext;
|
|
187
|
-
/**
|
|
188
|
-
* Emit checkpoint_created event (non-blocking)
|
|
189
|
-
*/
|
|
190
|
-
private emitCheckpointEvent;
|
|
191
|
-
}
|
|
192
|
-
export interface CheckpointCleanupOptions {
|
|
193
|
-
/** TTL for checkpoints in days (default: 7) */
|
|
194
|
-
ttlDays?: number;
|
|
195
|
-
/** Minimum checkpoints to keep per mission (default: 3) */
|
|
196
|
-
keepPerMission?: number;
|
|
197
|
-
/** Include completed missions in cleanup (default: false) */
|
|
198
|
-
includeCompletedMissions?: boolean;
|
|
199
|
-
/** Run cleanup job automatically (default: true) */
|
|
200
|
-
autoCleanup?: boolean;
|
|
201
|
-
/** Cleanup job interval in ms (default: 86400000 = 24 hours) */
|
|
202
|
-
cleanupIntervalMs?: number;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Manages checkpoint lifecycle and cleanup
|
|
206
|
-
*
|
|
207
|
-
* Implements:
|
|
208
|
-
* - TTL-based expiration (default 7 days)
|
|
209
|
-
* - Per-mission retention (keep at least N checkpoints)
|
|
210
|
-
* - Automatic cleanup job (runs daily)
|
|
211
|
-
* - Archive support for old checkpoints
|
|
212
|
-
*/
|
|
213
|
-
export declare class CheckpointCleanupService {
|
|
214
|
-
private db;
|
|
215
|
-
private ttlDays;
|
|
216
|
-
private keepPerMission;
|
|
217
|
-
private includeCompletedMissions;
|
|
218
|
-
private cleanupIntervalMs;
|
|
219
|
-
private cleanupTimer?;
|
|
220
|
-
constructor(db: CheckpointCleanupService['db'], options?: CheckpointCleanupOptions);
|
|
221
|
-
/**
|
|
222
|
-
* Start automatic cleanup job
|
|
223
|
-
*/
|
|
224
|
-
startAutoCleanup(): void;
|
|
225
|
-
/**
|
|
226
|
-
* Stop automatic cleanup job
|
|
227
|
-
*/
|
|
228
|
-
stopAutoCleanup(): void;
|
|
229
|
-
/**
|
|
230
|
-
* Run cleanup immediately
|
|
231
|
-
*
|
|
232
|
-
* Removes checkpoints older than TTL, keeping minimum per mission
|
|
233
|
-
*/
|
|
234
|
-
cleanup(): Promise<number>;
|
|
235
|
-
/**
|
|
236
|
-
* Get cleanup statistics
|
|
237
|
-
*/
|
|
238
|
-
getStats(): Promise<{
|
|
239
|
-
total_checkpoints: number;
|
|
240
|
-
expired_checkpoints: number;
|
|
241
|
-
by_mission: Record<string, number>;
|
|
242
|
-
}>;
|
|
243
|
-
}
|
|
244
|
-
//# sourceMappingURL=checkpointing.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkpointing.d.ts","sourceRoot":"","sources":["../../../src/recovery/checkpointing.ts"],"names":[],"mappings":"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"}
|