@fleettools/squawk 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/AGENTS.md +28 -0
- package/README.md +117 -0
- package/dist/src/db/checkpoint-storage.d.ts +19 -0
- package/dist/src/db/checkpoint-storage.d.ts.map +1 -0
- package/dist/src/db/checkpoint-storage.js +355 -0
- package/dist/src/db/checkpoint-storage.js.map +1 -0
- package/dist/src/db/index.d.ts +30 -0
- package/dist/src/db/index.d.ts.map +1 -0
- package/dist/src/db/index.js +329 -0
- package/dist/src/db/index.js.map +1 -0
- package/dist/src/db/sqlite.d.ts +31 -0
- package/dist/src/db/sqlite.d.ts.map +1 -0
- package/dist/src/db/sqlite.js +558 -0
- package/dist/src/db/sqlite.js.map +1 -0
- package/dist/src/db/types.d.ts +611 -0
- package/dist/src/db/types.d.ts.map +1 -0
- package/dist/src/db/types.js +4 -0
- package/dist/src/db/types.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +285 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/recovery/checkpointing.d.ts +244 -0
- package/dist/src/recovery/checkpointing.d.ts.map +1 -0
- package/dist/src/recovery/checkpointing.js +511 -0
- package/dist/src/recovery/checkpointing.js.map +1 -0
- package/dist/src/recovery/detection.d.ts +137 -0
- package/dist/src/recovery/detection.d.ts.map +1 -0
- package/dist/src/recovery/detection.js +240 -0
- package/dist/src/recovery/detection.js.map +1 -0
- package/dist/src/recovery/detector.d.ts +34 -0
- package/dist/src/recovery/detector.d.ts.map +1 -0
- package/dist/src/recovery/detector.js +42 -0
- package/dist/src/recovery/detector.js.map +1 -0
- package/dist/src/recovery/index.d.ts +3 -0
- package/dist/src/recovery/index.d.ts.map +1 -0
- package/dist/src/recovery/index.js +3 -0
- package/dist/src/recovery/index.js.map +1 -0
- package/dist/src/recovery/restorer.d.ts +51 -0
- package/dist/src/recovery/restorer.d.ts.map +1 -0
- package/dist/src/recovery/restorer.js +266 -0
- package/dist/src/recovery/restorer.js.map +1 -0
- package/dist/src/schemas.d.ts +142 -0
- package/dist/src/schemas.d.ts.map +1 -0
- package/dist/src/schemas.js +110 -0
- package/dist/src/schemas.js.map +1 -0
- package/package.json +21 -0
- package/src/db/checkpoint-storage.ts +443 -0
- package/src/db/index.d.ts +30 -0
- package/src/db/index.d.ts.map +1 -0
- package/src/db/index.js.map +1 -0
- package/src/db/index.ts +417 -0
- package/src/db/schema.sql +112 -0
- package/src/db/sqlite.d.ts +31 -0
- package/src/db/sqlite.d.ts.map +1 -0
- package/src/db/sqlite.js +667 -0
- package/src/db/sqlite.js.map +1 -0
- package/src/db/sqlite.ts +677 -0
- package/src/db/types.d.ts +612 -0
- package/src/db/types.d.ts.map +1 -0
- package/src/db/types.js +4 -0
- package/src/db/types.js.map +1 -0
- package/src/db/types.ts +771 -0
- package/src/index.ts +332 -0
- package/src/recovery/detector.ts +82 -0
- package/src/recovery/index.ts +3 -0
- package/src/recovery/restorer.ts +377 -0
- package/tsconfig.json +32 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Squawk Workspace Agent Context
|
|
2
|
+
|
|
3
|
+
**Hierarchy Level:** Coordination Service
|
|
4
|
+
**Parent:** [../AGENTS.md](../AGENTS.md)
|
|
5
|
+
**Philosophy:** See [AGENTS.md](../AGENTS.md) Core Philosophy section
|
|
6
|
+
|
|
7
|
+
## Commands
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
cd squawk
|
|
11
|
+
bun run build # Compile TypeScript to dist/
|
|
12
|
+
bun run dev # bun src/index.ts
|
|
13
|
+
bun start # bun dist/index.js
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Key Patterns
|
|
17
|
+
|
|
18
|
+
- Bun.serve HTTP server on `SQUAWK_PORT` (default: 3001)
|
|
19
|
+
- Event sourcing with `bun:sqlite` for persistence
|
|
20
|
+
- Mailbox/cursor/lock APIs for agent coordination
|
|
21
|
+
- No external HTTP dependencies (pure Bun APIs)
|
|
22
|
+
- Database initialized on startup, closed on SIGINT
|
|
23
|
+
|
|
24
|
+
## Architecture
|
|
25
|
+
|
|
26
|
+
- `src/db/` - SQLite adapter with prepared statements
|
|
27
|
+
- `src/recovery/` - Checkpoint restoration logic
|
|
28
|
+
- Entry point: `src/index.ts` with all route handlers
|
package/README.md
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Squawk - Fleet Coordination System
|
|
2
|
+
|
|
3
|
+
**Squawk** is the agent coordination and durable messaging system for FleetTools, analogous to SwarmTools' `swarm-mail`.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Squawk provides:
|
|
8
|
+
- **Durable Mailbox** - Append-only event queue with ordering guarantees
|
|
9
|
+
- **Durable Cursor** - Progress tracking for event processing
|
|
10
|
+
- **Durable Lock** - Distributed file locking (CTK - Consolidated Tool Kit)
|
|
11
|
+
- **Durable Deferred** - Promise-based coordination
|
|
12
|
+
- **Flightline Integration** - Git-backed work tracking
|
|
13
|
+
- **Hive Integration** - Event sourcing for Flightline work orders
|
|
14
|
+
|
|
15
|
+
## Directory Structure
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
squawk/
|
|
19
|
+
├── mail/ # Durable Mailbox implementation
|
|
20
|
+
│ ├── mail.ts # Mailbox API
|
|
21
|
+
│ ├── cursor.ts # Durable Cursor
|
|
22
|
+
│ └── defer.ts # Durable Deferred
|
|
23
|
+
├── streams/ # Event streaming primitives
|
|
24
|
+
│ ├── event.ts # Event types
|
|
25
|
+
│ ├── store.ts # Append-only event store
|
|
26
|
+
│ └── subscription.ts # Event subscription
|
|
27
|
+
├── hive/ # Flightline event source
|
|
28
|
+
│ ├── cells.ts # CTK reservation events
|
|
29
|
+
│ ├── work-orders.ts # Work order events
|
|
30
|
+
│ └── projections.ts # Materialized views
|
|
31
|
+
├── memory/ # Semantic memory integration
|
|
32
|
+
│ ├── embeddings.ts # Memory records with embeddings
|
|
33
|
+
│ └── retrieval.ts # Search APIs
|
|
34
|
+
└── api/ # Squawk API for plugins
|
|
35
|
+
├── coordinator.ts # Dispatch API
|
|
36
|
+
└── mail.ts # Mailbox API
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Event Types
|
|
40
|
+
|
|
41
|
+
### Core Events
|
|
42
|
+
```typescript
|
|
43
|
+
interface SquawkEvent {
|
|
44
|
+
id: string;
|
|
45
|
+
type: 'work_order.created' | 'work_order.started' | 'work_order.completed' |
|
|
46
|
+
'cell.reserved' | 'cell.released' | 'tech_order.learned' |
|
|
47
|
+
'specialist.assigned' | 'specialist.completed';
|
|
48
|
+
stream_id: string; // Work order or tech order ID
|
|
49
|
+
data: Record<string, any>;
|
|
50
|
+
occurred_at: string; // ISO 8601
|
|
51
|
+
causation_id?: string; // For event chaining
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Mailbox Concepts
|
|
56
|
+
|
|
57
|
+
### DurableMailbox
|
|
58
|
+
Append-only event queue with ordering guarantees:
|
|
59
|
+
- Events are written to durable storage
|
|
60
|
+
- Sequential numbering per stream
|
|
61
|
+
- No in-place modifications
|
|
62
|
+
|
|
63
|
+
### DurableCursor
|
|
64
|
+
Progress tracking for event consumers:
|
|
65
|
+
- Points to last processed event
|
|
66
|
+
- Survives restarts
|
|
67
|
+
- Enables resumable processing
|
|
68
|
+
|
|
69
|
+
### DurableLock
|
|
70
|
+
Distributed file locking mechanism:
|
|
71
|
+
- Prevents conflicting edits to the same file
|
|
72
|
+
- Timeout-based to prevent deadlocks
|
|
73
|
+
- Automatic cleanup on release
|
|
74
|
+
|
|
75
|
+
### DurableDeferred
|
|
76
|
+
Promise-based coordination:
|
|
77
|
+
- Wait for condition (event, timeout, or manual resolution)
|
|
78
|
+
- Persistent across restarts
|
|
79
|
+
- Used for Specialist handoffs
|
|
80
|
+
|
|
81
|
+
## Flightline Integration
|
|
82
|
+
|
|
83
|
+
Squawk emits events that are consumed by Flightline to update:
|
|
84
|
+
- Work order manifests
|
|
85
|
+
- Cell reservation records
|
|
86
|
+
- Tech Order promotion
|
|
87
|
+
|
|
88
|
+
## Memory Integration
|
|
89
|
+
|
|
90
|
+
Squawk can publish memory events:
|
|
91
|
+
- Tech Order learned events
|
|
92
|
+
- Pattern extraction events
|
|
93
|
+
- Specialist behavior patterns
|
|
94
|
+
|
|
95
|
+
These events are consumed by the Memory subsystem to create embeddings.
|
|
96
|
+
|
|
97
|
+
## API Endpoints
|
|
98
|
+
|
|
99
|
+
### POST /mailbox/append
|
|
100
|
+
Append events to durable mailbox.
|
|
101
|
+
|
|
102
|
+
### POST /mailbox/subscribe
|
|
103
|
+
Subscribe to event streams.
|
|
104
|
+
|
|
105
|
+
### GET /mailbox/stream
|
|
106
|
+
Stream events from a cursor position.
|
|
107
|
+
|
|
108
|
+
### GET /coordinator/status
|
|
109
|
+
Get Dispatch status and active Specialists.
|
|
110
|
+
|
|
111
|
+
## Sync Mode Interaction
|
|
112
|
+
|
|
113
|
+
When **Sync Mode** is enabled:
|
|
114
|
+
- Events are published to Zero (projections only)
|
|
115
|
+
- Full event logs remain local
|
|
116
|
+
- CTK locks remain workspace-specific
|
|
117
|
+
- Memory records are synced (metadata only, not embeddings)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Checkpoint, CreateCheckpointInput } from './types.js';
|
|
2
|
+
export declare class CheckpointStorage {
|
|
3
|
+
version: string;
|
|
4
|
+
constructor();
|
|
5
|
+
create(input: CreateCheckpointInput): Promise<Checkpoint>;
|
|
6
|
+
getById(checkpointId: string): Promise<Checkpoint | null>;
|
|
7
|
+
getLatest(missionId: string): Promise<Checkpoint | null>;
|
|
8
|
+
list(missionId?: string): Promise<Checkpoint[]>;
|
|
9
|
+
delete(checkpointId: string): Promise<boolean>;
|
|
10
|
+
markConsumed(checkpointId: string): Promise<Checkpoint | null>;
|
|
11
|
+
getStats(): Promise<{
|
|
12
|
+
total_checkpoints: number;
|
|
13
|
+
file_count: number;
|
|
14
|
+
latest_checkpoint?: Checkpoint;
|
|
15
|
+
}>;
|
|
16
|
+
cleanup(): Promise<number>;
|
|
17
|
+
}
|
|
18
|
+
export declare const checkpointStorage: CheckpointStorage;
|
|
19
|
+
//# sourceMappingURL=checkpoint-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-storage.d.ts","sourceRoot":"","sources":["../../../src/db/checkpoint-storage.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,UAAU,EACV,qBAAqB,EAMtB,MAAM,YAAY,CAAC;AAuOpB,qBAAa,iBAAiB;IAC5B,OAAO,SAAW;;IAMZ,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;IAYzD,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAezD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAoCxD,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IA8B/C,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkB9C,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAe9D,QAAQ,IAAI,OAAO,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,UAAU,EAAE,MAAM,CAAC;QACnB,iBAAiB,CAAC,EAAE,UAAU,CAAC;KAChC,CAAC;IA6BI,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAsBjC;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
import { writeFileSync, readFileSync, unlinkSync, existsSync, mkdirSync, symlinkSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { randomUUID } from 'crypto';
|
|
4
|
+
const mockDatabase = require('../../../tests/helpers/mock-database').mockDatabase;
|
|
5
|
+
function validateCheckpoint(checkpoint) {
|
|
6
|
+
const errors = [];
|
|
7
|
+
if (!checkpoint.id || typeof checkpoint.id !== 'string') {
|
|
8
|
+
errors.push('Invalid or missing id');
|
|
9
|
+
}
|
|
10
|
+
if (!checkpoint.mission_id || typeof checkpoint.mission_id !== 'string') {
|
|
11
|
+
errors.push('Invalid or missing mission_id');
|
|
12
|
+
}
|
|
13
|
+
if (!checkpoint.timestamp || typeof checkpoint.timestamp !== 'string') {
|
|
14
|
+
errors.push('Invalid or missing timestamp');
|
|
15
|
+
}
|
|
16
|
+
if (!checkpoint.trigger || !['progress', 'error', 'manual', 'compaction'].includes(checkpoint.trigger)) {
|
|
17
|
+
errors.push('Invalid or missing trigger');
|
|
18
|
+
}
|
|
19
|
+
if (typeof checkpoint.progress_percent !== 'number' ||
|
|
20
|
+
checkpoint.progress_percent < 0 ||
|
|
21
|
+
checkpoint.progress_percent > 100) {
|
|
22
|
+
errors.push('Invalid progress_percent (must be 0-100)');
|
|
23
|
+
}
|
|
24
|
+
if (!checkpoint.created_by || typeof checkpoint.created_by !== 'string') {
|
|
25
|
+
errors.push('Invalid or missing created_by');
|
|
26
|
+
}
|
|
27
|
+
if (!checkpoint.version || typeof checkpoint.version !== 'string') {
|
|
28
|
+
errors.push('Invalid or missing version');
|
|
29
|
+
}
|
|
30
|
+
if (checkpoint.timestamp && isNaN(Date.parse(checkpoint.timestamp))) {
|
|
31
|
+
errors.push('Invalid timestamp format');
|
|
32
|
+
}
|
|
33
|
+
if (!Array.isArray(checkpoint.sorties)) {
|
|
34
|
+
errors.push('sorties must be an array');
|
|
35
|
+
}
|
|
36
|
+
if (!Array.isArray(checkpoint.active_locks)) {
|
|
37
|
+
errors.push('active_locks must be an array');
|
|
38
|
+
}
|
|
39
|
+
if (!Array.isArray(checkpoint.pending_messages)) {
|
|
40
|
+
errors.push('pending_messages must be an array');
|
|
41
|
+
}
|
|
42
|
+
if (!checkpoint.recovery_context || typeof checkpoint.recovery_context !== 'object') {
|
|
43
|
+
errors.push('Invalid or missing recovery_context');
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const rc = checkpoint.recovery_context;
|
|
47
|
+
if (!rc.last_action || typeof rc.last_action !== 'string') {
|
|
48
|
+
errors.push('Invalid or missing recovery_context.last_action');
|
|
49
|
+
}
|
|
50
|
+
if (!Array.isArray(rc.next_steps)) {
|
|
51
|
+
errors.push('recovery_context.next_steps must be an array');
|
|
52
|
+
}
|
|
53
|
+
if (!Array.isArray(rc.blockers)) {
|
|
54
|
+
errors.push('recovery_context.blockers must be an array');
|
|
55
|
+
}
|
|
56
|
+
if (!Array.isArray(rc.files_modified)) {
|
|
57
|
+
errors.push('recovery_context.files_modified must be an array');
|
|
58
|
+
}
|
|
59
|
+
if (!rc.mission_summary || typeof rc.mission_summary !== 'string') {
|
|
60
|
+
errors.push('Invalid or missing recovery_context.mission_summary');
|
|
61
|
+
}
|
|
62
|
+
if (typeof rc.elapsed_time_ms !== 'number' || rc.elapsed_time_ms < 0) {
|
|
63
|
+
errors.push('Invalid recovery_context.elapsed_time_ms');
|
|
64
|
+
}
|
|
65
|
+
if (!rc.last_activity_at || typeof rc.last_activity_at !== 'string') {
|
|
66
|
+
errors.push('Invalid or missing recovery_context.last_activity_at');
|
|
67
|
+
}
|
|
68
|
+
else if (isNaN(Date.parse(rc.last_activity_at))) {
|
|
69
|
+
errors.push('Invalid recovery_context.last_activity_at format');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (errors.length > 0) {
|
|
73
|
+
throw new Error(`Checkpoint validation failed: ${errors.join(', ')}`);
|
|
74
|
+
}
|
|
75
|
+
return checkpoint;
|
|
76
|
+
}
|
|
77
|
+
// STORAGE UTILITIES
|
|
78
|
+
function generateCheckpointId() {
|
|
79
|
+
const uuid = randomUUID().split('-')[0];
|
|
80
|
+
return `chk-${uuid}`;
|
|
81
|
+
}
|
|
82
|
+
function getFlightlineDir() {
|
|
83
|
+
if (process.env.FLIGHTLINE_TEST_DIR) {
|
|
84
|
+
return process.env.FLIGHTLINE_TEST_DIR;
|
|
85
|
+
}
|
|
86
|
+
const homeDir = require('os').homedir();
|
|
87
|
+
return join(homeDir, '.flightline');
|
|
88
|
+
}
|
|
89
|
+
function getCheckpointsDir() {
|
|
90
|
+
return join(getFlightlineDir(), 'checkpoints');
|
|
91
|
+
}
|
|
92
|
+
function getCheckpointFilePath(checkpointId) {
|
|
93
|
+
return join(getCheckpointsDir(), `${checkpointId}.json`);
|
|
94
|
+
}
|
|
95
|
+
function getLatestSymlinkPath() {
|
|
96
|
+
return join(getCheckpointsDir(), 'latest.json');
|
|
97
|
+
}
|
|
98
|
+
function ensureCheckpointsDir() {
|
|
99
|
+
const checkpointsDir = getCheckpointsDir();
|
|
100
|
+
if (!existsSync(checkpointsDir)) {
|
|
101
|
+
mkdirSync(checkpointsDir, { recursive: true });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function createSymlink(target, linkPath) {
|
|
105
|
+
try {
|
|
106
|
+
if (existsSync(linkPath)) {
|
|
107
|
+
unlinkSync(linkPath);
|
|
108
|
+
}
|
|
109
|
+
symlinkSync(target, linkPath, 'file');
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
// Fallback: copy file content if symlinks aren't supported
|
|
113
|
+
try {
|
|
114
|
+
const content = readFileSync(target, 'utf-8');
|
|
115
|
+
writeFileSync(linkPath, content);
|
|
116
|
+
}
|
|
117
|
+
catch (copyError) {
|
|
118
|
+
console.warn('Failed to create symlink or fallback copy:', copyError);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function writeCheckpointFile(checkpoint) {
|
|
123
|
+
const filepath = getCheckpointFilePath(checkpoint.id);
|
|
124
|
+
try {
|
|
125
|
+
ensureCheckpointsDir();
|
|
126
|
+
const content = JSON.stringify(checkpoint, null, 2);
|
|
127
|
+
writeFileSync(filepath, content, 'utf-8');
|
|
128
|
+
createSymlink(filepath, getLatestSymlinkPath());
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
throw new Error(`Failed to write checkpoint file ${filepath}: ${error}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function readCheckpointFile(checkpointId) {
|
|
135
|
+
const filepath = getCheckpointFilePath(checkpointId);
|
|
136
|
+
try {
|
|
137
|
+
if (!existsSync(filepath)) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const content = readFileSync(filepath, 'utf-8');
|
|
141
|
+
const data = JSON.parse(content);
|
|
142
|
+
return validateCheckpoint(data);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.warn(`Failed to read checkpoint file ${filepath}:`, error);
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
function deleteCheckpointFile(checkpointId) {
|
|
150
|
+
const filepath = getCheckpointFilePath(checkpointId);
|
|
151
|
+
try {
|
|
152
|
+
if (existsSync(filepath)) {
|
|
153
|
+
unlinkSync(filepath);
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.warn(`Failed to delete checkpoint file ${filepath}:`, error);
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function updateLatestSymlink() {
|
|
164
|
+
try {
|
|
165
|
+
const checkpointsDir = getCheckpointsDir();
|
|
166
|
+
if (!existsSync(checkpointsDir)) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const files = require('fs').readdirSync(checkpointsDir)
|
|
170
|
+
.filter((file) => file.endsWith('.json') && file !== 'latest.json')
|
|
171
|
+
.map((file) => {
|
|
172
|
+
const filepath = join(checkpointsDir, file);
|
|
173
|
+
const stats = require('fs').statSync(filepath);
|
|
174
|
+
return { file, filepath, mtime: stats.mtime };
|
|
175
|
+
})
|
|
176
|
+
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());
|
|
177
|
+
if (files.length > 0) {
|
|
178
|
+
createSymlink(files[0].filepath, getLatestSymlinkPath());
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const symlinkPath = getLatestSymlinkPath();
|
|
182
|
+
if (existsSync(symlinkPath)) {
|
|
183
|
+
unlinkSync(symlinkPath);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
console.warn('Failed to update latest symlink:', error);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// MAIN STORAGE CLASS
|
|
192
|
+
export class CheckpointStorage {
|
|
193
|
+
version = '1.0.0';
|
|
194
|
+
constructor() {
|
|
195
|
+
ensureCheckpointsDir();
|
|
196
|
+
}
|
|
197
|
+
async create(input) {
|
|
198
|
+
try {
|
|
199
|
+
const checkpoint = await mockDatabase.checkpoints.create(input);
|
|
200
|
+
writeCheckpointFile(checkpoint);
|
|
201
|
+
return checkpoint;
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
throw new Error(`Failed to create checkpoint: ${error}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async getById(checkpointId) {
|
|
208
|
+
try {
|
|
209
|
+
let checkpoint = await mockDatabase.checkpoints.getById(checkpointId);
|
|
210
|
+
if (!checkpoint) {
|
|
211
|
+
checkpoint = readCheckpointFile(checkpointId);
|
|
212
|
+
}
|
|
213
|
+
return checkpoint;
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
console.warn(`Error retrieving checkpoint ${checkpointId}:`, error);
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
async getLatest(missionId) {
|
|
221
|
+
try {
|
|
222
|
+
let checkpoint = await mockDatabase.checkpoints.getLatest(missionId);
|
|
223
|
+
// Fallback: read from files if database fails
|
|
224
|
+
if (!checkpoint) {
|
|
225
|
+
const checkpointsDir = getCheckpointsDir();
|
|
226
|
+
if (existsSync(checkpointsDir)) {
|
|
227
|
+
const files = require('fs').readdirSync(checkpointsDir)
|
|
228
|
+
.filter((file) => file.endsWith('.json') && file !== 'latest.json')
|
|
229
|
+
.map((file) => {
|
|
230
|
+
const filepath = join(checkpointsDir, file);
|
|
231
|
+
try {
|
|
232
|
+
const checkpoint = readCheckpointFile(file.replace('.json', ''));
|
|
233
|
+
return checkpoint ? { ...checkpoint, filepath } : null;
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
})
|
|
239
|
+
.filter(Boolean)
|
|
240
|
+
.filter((cp) => cp.mission_id === missionId)
|
|
241
|
+
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
242
|
+
if (files.length > 0) {
|
|
243
|
+
checkpoint = files[0];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return checkpoint;
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
console.warn(`Error retrieving latest checkpoint for mission ${missionId}:`, error);
|
|
251
|
+
return null;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
async list(missionId) {
|
|
255
|
+
try {
|
|
256
|
+
let checkpoints = await mockDatabase.checkpoints.list(missionId);
|
|
257
|
+
if (checkpoints.length === 0) {
|
|
258
|
+
const checkpointsDir = getCheckpointsDir();
|
|
259
|
+
if (existsSync(checkpointsDir)) {
|
|
260
|
+
const fileCheckpoints = require('fs').readdirSync(checkpointsDir)
|
|
261
|
+
.filter((file) => file.endsWith('.json') && file !== 'latest.json')
|
|
262
|
+
.map((file) => {
|
|
263
|
+
const checkpointId = file.replace('.json', '');
|
|
264
|
+
return readCheckpointFile(checkpointId);
|
|
265
|
+
})
|
|
266
|
+
.filter(Boolean)
|
|
267
|
+
.filter((cp) => !missionId || cp.mission_id === missionId)
|
|
268
|
+
.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
269
|
+
checkpoints = fileCheckpoints;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
return checkpoints;
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
console.warn(`Error listing checkpoints${missionId ? ` for mission ${missionId}` : ''}:`, error);
|
|
276
|
+
return [];
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
async delete(checkpointId) {
|
|
280
|
+
try {
|
|
281
|
+
const dbDeleted = await mockDatabase.checkpoints.delete(checkpointId);
|
|
282
|
+
const fileDeleted = deleteCheckpointFile(checkpointId);
|
|
283
|
+
if (dbDeleted || fileDeleted) {
|
|
284
|
+
updateLatestSymlink();
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
console.warn(`Error deleting checkpoint ${checkpointId}:`, error);
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
async markConsumed(checkpointId) {
|
|
295
|
+
try {
|
|
296
|
+
const checkpoint = await mockDatabase.checkpoints.markConsumed(checkpointId);
|
|
297
|
+
if (checkpoint) {
|
|
298
|
+
writeCheckpointFile(checkpoint);
|
|
299
|
+
}
|
|
300
|
+
return checkpoint;
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
console.warn(`Error marking checkpoint ${checkpointId} as consumed:`, error);
|
|
304
|
+
return null;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
async getStats() {
|
|
308
|
+
try {
|
|
309
|
+
const checkpoints = await mockDatabase.checkpoints.list();
|
|
310
|
+
const dbStats = { total_checkpoints: checkpoints.length };
|
|
311
|
+
const checkpointsDir = getCheckpointsDir();
|
|
312
|
+
let fileCount = 0;
|
|
313
|
+
if (existsSync(checkpointsDir)) {
|
|
314
|
+
fileCount = require('fs').readdirSync(checkpointsDir)
|
|
315
|
+
.filter((file) => file.endsWith('.json') && file !== 'latest.json')
|
|
316
|
+
.length;
|
|
317
|
+
}
|
|
318
|
+
const latestCheckpoint = await this.getLatest(''); // Get any latest checkpoint
|
|
319
|
+
return {
|
|
320
|
+
total_checkpoints: dbStats.total_checkpoints,
|
|
321
|
+
file_count: fileCount,
|
|
322
|
+
latest_checkpoint: latestCheckpoint || undefined
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
catch (error) {
|
|
326
|
+
console.warn('Error getting checkpoint stats:', error);
|
|
327
|
+
return {
|
|
328
|
+
total_checkpoints: 0,
|
|
329
|
+
file_count: 0
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async cleanup() {
|
|
334
|
+
try {
|
|
335
|
+
let cleanedCount = 0;
|
|
336
|
+
const now = new Date();
|
|
337
|
+
const checkpoints = await this.list();
|
|
338
|
+
for (const checkpoint of checkpoints) {
|
|
339
|
+
if (checkpoint.expires_at && new Date(checkpoint.expires_at) < now) {
|
|
340
|
+
const deleted = await this.delete(checkpoint.id);
|
|
341
|
+
if (deleted) {
|
|
342
|
+
cleanedCount++;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return cleanedCount;
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
console.warn('Error during checkpoint cleanup:', error);
|
|
350
|
+
return 0;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
export const checkpointStorage = new CheckpointStorage();
|
|
355
|
+
//# sourceMappingURL=checkpoint-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-storage.js","sourceRoot":"","sources":["../../../src/db/checkpoint-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { SQLiteAdapter } from './sqlite.js';
|
|
2
|
+
import type { Event, Mailbox, Cursor, Lock } from './types.js';
|
|
3
|
+
export declare function initializeDatabase(dbPath?: string): Promise<void>;
|
|
4
|
+
export declare function getAdapter(): SQLiteAdapter;
|
|
5
|
+
export declare function closeDatabase(): Promise<void>;
|
|
6
|
+
export declare const mailboxOps: {
|
|
7
|
+
getAll: () => Promise<any>;
|
|
8
|
+
getById: (id: string) => Promise<any>;
|
|
9
|
+
create: (id: string) => Promise<any>;
|
|
10
|
+
exists: (id: string) => Promise<boolean>;
|
|
11
|
+
};
|
|
12
|
+
export declare const eventOps: {
|
|
13
|
+
getByMailbox: (mailboxId: string) => Promise<any>;
|
|
14
|
+
append: (mailboxId: string, events: any[]) => Promise<Event[]>;
|
|
15
|
+
};
|
|
16
|
+
export declare const cursorOps: {
|
|
17
|
+
getById: (id: string) => Promise<any>;
|
|
18
|
+
getByStream: (streamId: string) => Promise<any>;
|
|
19
|
+
upsert: (cursor: any) => Promise<any>;
|
|
20
|
+
};
|
|
21
|
+
export declare const lockOps: {
|
|
22
|
+
getAll: () => Promise<any>;
|
|
23
|
+
getById: (id: string) => Promise<any>;
|
|
24
|
+
acquire: (lock: any) => Promise<any>;
|
|
25
|
+
release: (id: string) => Promise<any>;
|
|
26
|
+
getExpired: () => Promise<any>;
|
|
27
|
+
releaseExpired: () => Promise<any>;
|
|
28
|
+
};
|
|
29
|
+
export type { Mailbox, Event, Cursor, Lock };
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AA8B/D,wBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBvE;AAED,wBAAgB,UAAU,IAAI,aAAa,CAO1C;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAKnD;AAyID,eAAO,MAAM,UAAU;;kBAUD,MAAM;iBAKP,MAAM;iBAUN,MAAM;CAK1B,CAAC;AAEF,eAAO,MAAM,QAAQ;8BACa,MAAM;wBAUZ,MAAM,UAAU,GAAG,EAAE;CAmChD,CAAC;AAEF,eAAO,MAAM,SAAS;kBACA,MAAM;4BAKI,MAAM;qBASb,GAAG;CAuB3B,CAAC;AAEF,eAAO,MAAM,OAAO;;kBAcE,MAAM;oBAKH,GAAG;kBAkCN,MAAM;;;CA8B3B,CAAC;AAKF,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC"}
|