@cascade-flow/backend-filesystem 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/README.md ADDED
@@ -0,0 +1,56 @@
1
+ # Backend Filesystem
2
+
3
+ Filesystem-based implementation of the Backend interface.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ bun install
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { FileSystemBackend } from "@cascade-flow/backend-filesystem";
15
+
16
+ const backend = new FileSystemBackend("./.runs");
17
+ ```
18
+
19
+ ## Storage Structure
20
+
21
+ ```
22
+ .runs/
23
+ ├── .registry/ # Workflow registry
24
+ │ └── {workflow-slug}/
25
+ │ ├── metadata.json # Workflow metadata
26
+ │ └── steps.json # Step definitions
27
+ └── {workflow-slug}/ # Execution state
28
+ └── {runId}/
29
+ ├── step-events/ # Step lifecycle events
30
+ │ └── {timestamp}-{stepName}-{eventType}.json
31
+ └── workflow-events/ # Workflow lifecycle events
32
+ └── {timestamp}-{eventType}.json
33
+ ```
34
+
35
+ ## Features
36
+
37
+ - **Event storage** - Individual JSON files per event
38
+ - **Chronological ordering** - Events sorted by timestamp
39
+ - **Git-friendly** - Human-readable JSON files
40
+ - **No database required** - Simple filesystem-based storage
41
+
42
+ ## Implementation
43
+
44
+ Extends `Backend` abstract class from `backend-interface`:
45
+ - Registry storage in `.runs/.registry/{slug}/`
46
+ - Event storage in `.runs/{slug}/{runId}/`
47
+ - State computed via event projection (no materialized views)
48
+ - Atomic file writes using Bun's filesystem API
49
+
50
+ ## Constructor
51
+
52
+ ```typescript
53
+ new FileSystemBackend(baseDir?: string)
54
+ ```
55
+
56
+ - `baseDir` - Base directory for storage (default: `./.runs`)
@@ -0,0 +1,353 @@
1
+ import { Backend, type StepStartMetadata, type StepCompleteMetadata, type StepError, type StepRecord, type LogEntry, type Event, type StepEvent, type WorkflowEvent, type RunSubmission, type RunState, type WorkflowMetadata, type WorkflowRegistration, type StepDefinition, type AnalyticsOptions, type ErrorAnalysis, type RetryAnalysis, type SchedulingLatency, type StepDuration, type WorkflowDuration, type WorkerStability, type Throughput, type QueueDepth, type QueueDepthByWorkflow, type SuccessRate, type AnalyticsSummary } from "@cascade-flow/backend-interface";
2
+ /**
3
+ * FileSystem backend implementation
4
+ * Stores workflow execution state in the local filesystem using event sourcing
5
+ *
6
+ * Directory structure:
7
+ * ./.runs/{workflow-slug}/{runId}/workflow-events/{timestamp}-{eventType}.json
8
+ * ./.runs/{workflow-slug}/{runId}/step-events/{timestamp}-{stepId}-{eventType}.json
9
+ */
10
+ export declare class FileSystemBackend extends Backend {
11
+ private baseDir;
12
+ /**
13
+ * Create a new FileSystem backend
14
+ *
15
+ * @param baseDir - Base directory for storing runs (defaults to "./.runs")
16
+ */
17
+ constructor(baseDir?: string);
18
+ /**
19
+ * Initialize the backend (no-op for filesystem - directories created as needed)
20
+ */
21
+ initialize(): Promise<void>;
22
+ /**
23
+ * Get the directory path for a run
24
+ */
25
+ private getRunDir;
26
+ /**
27
+ * Get the directory path for workflow events within a run
28
+ */
29
+ private getWorkflowEventsDir;
30
+ /**
31
+ * Get the directory path for step events within a run
32
+ */
33
+ private getStepEventsDir;
34
+ /**
35
+ * Get the directory path for step outputs within a run
36
+ */
37
+ private getStepOutputsDir;
38
+ /**
39
+ * Get the file path for a step's output file
40
+ */
41
+ getStepOutputPath(workflowSlug: string, runId: string, stepId: string, attemptNumber: number): string;
42
+ /**
43
+ * Get the directory path for steps within a run
44
+ * @deprecated Old format - kept for reference only
45
+ */
46
+ private getStepsDir;
47
+ /**
48
+ * Get the file path for a specific step
49
+ * @deprecated Old format - kept for reference only
50
+ */
51
+ private getStepFile;
52
+ /**
53
+ * Get the file path for a step's logs
54
+ * @deprecated Old format - kept for reference only
55
+ */
56
+ private getStepLogsFile;
57
+ /**
58
+ * Get the idempotency directory path (moved to top-level)
59
+ */
60
+ private getIdempotencyDir;
61
+ /**
62
+ * Generate a unique run ID
63
+ */
64
+ private generateRunId;
65
+ /**
66
+ * Hash an idempotency key
67
+ */
68
+ private hashIdempotencyKey;
69
+ /**
70
+ * Generate a unique event ID using microsecond timestamp
71
+ * Format: {timestamp}
72
+ * Example: 1762916097401523
73
+ *
74
+ * The microsecond timestamp provides ~1000x better precision than milliseconds,
75
+ * making collisions extremely unlikely even with parallel step execution.
76
+ *
77
+ * @param timestamp - Optional timestamp in microseconds (defaults to current time)
78
+ */
79
+ private generateEventId;
80
+ /**
81
+ * Get the filename for a workflow event
82
+ * Format: {timestamp}-{eventType}.json
83
+ * Example: 1762916097401523-WorkflowStarted.json
84
+ */
85
+ private getWorkflowEventFilename;
86
+ /**
87
+ * Get the filename for a step event
88
+ * Format: {timestamp}-{stepId}-{eventType}.json
89
+ * Example: 1762916097401523-ai-step-1-StepStarted.json
90
+ */
91
+ private getStepEventFilename;
92
+ /**
93
+ * Get the filesystem lock path used to claim a step attempt
94
+ */
95
+ private getStepClaimLockPath;
96
+ /**
97
+ * Atomically write JSON data to a file
98
+ * Uses a temporary file and rename for atomicity
99
+ */
100
+ private writeJsonAtomic;
101
+ /**
102
+ * Read and validate a step record from disk
103
+ */
104
+ private readStepRecord;
105
+ /**
106
+ * Create a state change record
107
+ */
108
+ private createStateChange;
109
+ initializeRun(workflowSlug: string, runId: string): Promise<void>;
110
+ appendEvent(workflowSlug: string, runId: string, event: Event): Promise<void>;
111
+ loadEvents(workflowSlug: string, runId: string, options: {
112
+ category: "step";
113
+ stepId?: string;
114
+ }): Promise<StepEvent[]>;
115
+ loadEvents(workflowSlug: string, runId: string, options: {
116
+ category: "workflow";
117
+ }): Promise<WorkflowEvent[]>;
118
+ loadEvents(workflowSlug: string, runId: string, options?: {
119
+ category?: "workflow" | "step";
120
+ stepId?: string;
121
+ }): Promise<Event[]>;
122
+ saveStepStart(workflowSlug: string, runId: string, stepId: string, workerId: string, metadata: StepStartMetadata): Promise<void>;
123
+ saveStepComplete(workflowSlug: string, runId: string, stepId: string, output: unknown, metadata: StepCompleteMetadata, exportOutput?: boolean): Promise<void>;
124
+ saveStepFailed(workflowSlug: string, runId: string, stepId: string, error: StepError, metadata: {
125
+ duration: number;
126
+ attemptNumber: number;
127
+ terminal: boolean;
128
+ nextRetryAt?: number;
129
+ failureReason: "exhausted-retries" | "worker-crash" | "timeout" | "cancelled" | "execution-error";
130
+ }): Promise<void>;
131
+ saveStepFailedAndScheduleRetry(workflowSlug: string, runId: string, stepId: string, error: StepError, failureMetadata: {
132
+ duration: number;
133
+ attemptNumber: number;
134
+ nextRetryAt: number;
135
+ failureReason: "execution-error" | "timeout";
136
+ }, scheduleMetadata: {
137
+ availableAt: number;
138
+ nextAttemptNumber: number;
139
+ retryDelayMs: number;
140
+ maxRetries: number;
141
+ }): Promise<void>;
142
+ saveStepSkipped(workflowSlug: string, runId: string, stepId: string, metadata: {
143
+ skipType: "primary" | "cascade";
144
+ reason: string;
145
+ metadata?: Record<string, any>;
146
+ duration: number;
147
+ attemptNumber: number;
148
+ cascadedFrom?: string;
149
+ }): Promise<void>;
150
+ saveStepScheduled(workflowSlug: string, runId: string, stepId: string, metadata: {
151
+ availableAt: number;
152
+ reason: "initial" | "retry" | "dependency-satisfied";
153
+ attemptNumber: number;
154
+ retryDelayMs?: number;
155
+ }): Promise<void>;
156
+ saveStepHeartbeat(workflowSlug: string, runId: string, stepId: string, workerId: string, attemptNumber: number): Promise<void>;
157
+ saveStepReclaimed(workflowSlug: string, runId: string, stepId: string, metadata: {
158
+ originalWorkerId: string;
159
+ reclaimedBy: string;
160
+ lastHeartbeat: number;
161
+ staleThreshold: number;
162
+ staleDuration: number;
163
+ attemptNumber: number;
164
+ }): Promise<void>;
165
+ saveWorkflowComplete(workflowSlug: string, runId: string, output: unknown, metadata: {
166
+ workflowAttemptNumber: number;
167
+ timestamp: number;
168
+ duration: number;
169
+ totalSteps: number;
170
+ }): Promise<void>;
171
+ saveStepLogs(workflowSlug: string, runId: string, stepId: string, logs: LogEntry[]): Promise<void>;
172
+ loadStepLogs(workflowSlug: string, runId: string, stepId: string, attemptNumber?: number): Promise<LogEntry[] | null>;
173
+ loadRun(workflowSlug: string, runId: string): Promise<StepRecord[]>;
174
+ runExists(workflowSlug: string, runId: string): Promise<boolean>;
175
+ saveWorkflowStart(workflowSlug: string, runId: string, metadata: {
176
+ workflowAttemptNumber: number;
177
+ hasInputSchema: boolean;
178
+ hasInput: boolean;
179
+ }): Promise<void>;
180
+ saveWorkflowInputValidation(workflowSlug: string, runId: string, result: {
181
+ workflowAttemptNumber: number;
182
+ hasSchema: boolean;
183
+ success: boolean;
184
+ error?: StepError;
185
+ validationErrors?: Array<{
186
+ path: string;
187
+ message: string;
188
+ }>;
189
+ }): Promise<void>;
190
+ saveWorkflowFailed(workflowSlug: string, runId: string, error: StepError, metadata: {
191
+ workflowAttemptNumber: number;
192
+ duration: number;
193
+ completedSteps: number;
194
+ failedStep?: string;
195
+ }, failureReason: "step-failed" | "worker-crash" | "timeout" | "cancelled"): Promise<void>;
196
+ saveWorkflowResumed(workflowSlug: string, runId: string, metadata: {
197
+ originalRunId: string;
198
+ resumedSteps: number;
199
+ pendingSteps: number;
200
+ }): Promise<void>;
201
+ saveWorkflowCancelled(workflowSlug: string, runId: string, metadata: {
202
+ workflowAttemptNumber: number;
203
+ reason?: string;
204
+ duration: number;
205
+ completedSteps: number;
206
+ }): Promise<void>;
207
+ saveWorkflowRetryStarted(workflowSlug: string, runId: string, metadata: {
208
+ workflowAttemptNumber: number;
209
+ previousAttemptNumber: number;
210
+ retriedSteps: string[];
211
+ reason?: string;
212
+ }): Promise<void>;
213
+ getFailedSteps(workflowSlug: string, runId: string): Promise<Array<{
214
+ stepId: string;
215
+ error: StepError;
216
+ attemptNumber: number;
217
+ }>>;
218
+ saveRunSubmitted(workflowSlug: string, runId: string, metadata: {
219
+ availableAt: number;
220
+ priority: number;
221
+ input?: string;
222
+ hasInputSchema: boolean;
223
+ timeout?: number;
224
+ idempotencyKey?: string;
225
+ metadata?: Record<string, unknown>;
226
+ tags?: string[];
227
+ }): Promise<void>;
228
+ submitRun(submission: RunSubmission): Promise<{
229
+ runId: string;
230
+ isNew: boolean;
231
+ }>;
232
+ listRuns(options?: {
233
+ workflowSlug?: string;
234
+ status?: RunState["status"][];
235
+ tags?: string[];
236
+ limit?: number;
237
+ }): Promise<RunState[]>;
238
+ cancelRun(runId: string, reason?: string): Promise<void>;
239
+ getRun(runId: string): Promise<RunState | null>;
240
+ listActiveWorkflows(): Promise<string[]>;
241
+ listScheduledSteps(options?: {
242
+ availableBefore?: number;
243
+ workflowSlug?: string;
244
+ limit?: number;
245
+ }): Promise<Array<{
246
+ workflowSlug: string;
247
+ runId: string;
248
+ stepId: string;
249
+ }>>;
250
+ isStepClaimable(workflowSlug: string, runId: string, stepId: string): Promise<boolean>;
251
+ claimScheduledStep(workflowSlug: string, runId: string, stepId: string, workerId: string, metadata: StepStartMetadata): Promise<{
252
+ attemptNumber: number;
253
+ } | null>;
254
+ reclaimStaleSteps(staleThreshold: number, reclaimedBy: string): Promise<Array<{
255
+ workflowSlug: string;
256
+ runId: string;
257
+ stepId: string;
258
+ }>>;
259
+ /**
260
+ * List all available workflows
261
+ */
262
+ private getRegistryDir;
263
+ private getWorkflowRegistryDir;
264
+ /**
265
+ * Register a workflow with the backend
266
+ */
267
+ registerWorkflow(registration: WorkflowRegistration): Promise<void>;
268
+ /**
269
+ * Get metadata for a specific workflow
270
+ */
271
+ getWorkflowMetadata(slug: string): Promise<WorkflowMetadata | null>;
272
+ /**
273
+ * List all registered workflows
274
+ */
275
+ listWorkflowMetadata(): Promise<WorkflowMetadata[]>;
276
+ /**
277
+ * Get step definitions for a workflow
278
+ */
279
+ getWorkflowSteps(slug: string): Promise<StepDefinition[]>;
280
+ /**
281
+ * List all run IDs for a workflow
282
+ */
283
+ listRunIds(workflowSlug: string): Promise<string[]>;
284
+ /**
285
+ * Close the backend and clean up resources
286
+ * For filesystem backend, this is a no-op as there are no persistent connections
287
+ */
288
+ close(): Promise<void>;
289
+ /**
290
+ * Helper to load all events within a time range and optional filters
291
+ */
292
+ private loadEventsForAnalytics;
293
+ getErrorAnalysis(options?: AnalyticsOptions): Promise<ErrorAnalysis>;
294
+ getErrorsList(options?: {
295
+ timeRange?: {
296
+ start: number;
297
+ end: number;
298
+ };
299
+ workflowSlug?: string;
300
+ groupingStrategy?: 'exact' | 'normalized' | 'portable';
301
+ limit?: number;
302
+ offset?: number;
303
+ }): Promise<{
304
+ errors: Array<{
305
+ fingerprint: string;
306
+ errorMessage: string;
307
+ errorName: string;
308
+ sampleStack: string;
309
+ count: number;
310
+ affectedRuns: number;
311
+ firstSeen: number;
312
+ lastSeen: number;
313
+ }>;
314
+ total: number;
315
+ }>;
316
+ getErrorDetail(fingerprint: string, groupingStrategy: 'exact' | 'normalized' | 'portable', options?: {
317
+ timeRange?: {
318
+ start: number;
319
+ end: number;
320
+ };
321
+ limit?: number;
322
+ offset?: number;
323
+ }): Promise<{
324
+ fingerprint: string;
325
+ errorMessage: string;
326
+ errorName: string;
327
+ sampleStack: string;
328
+ totalCount: number;
329
+ affectedRuns: number;
330
+ firstSeen: number;
331
+ lastSeen: number;
332
+ occurrences: Array<{
333
+ workflowSlug: string;
334
+ runId: string;
335
+ stepId: string;
336
+ attemptNumber: number;
337
+ timestampUs: number;
338
+ }>;
339
+ total: number;
340
+ }>;
341
+ getRetryAnalysis(options?: AnalyticsOptions): Promise<RetryAnalysis>;
342
+ getSchedulingLatency(options?: AnalyticsOptions): Promise<SchedulingLatency>;
343
+ getStepDuration(options?: AnalyticsOptions): Promise<StepDuration>;
344
+ getWorkflowDuration(options?: AnalyticsOptions): Promise<WorkflowDuration>;
345
+ getWorkerStability(options?: AnalyticsOptions): Promise<WorkerStability>;
346
+ getThroughput(options?: AnalyticsOptions): Promise<Throughput>;
347
+ getQueueDepth(options?: Pick<AnalyticsOptions, "workflowSlug">): Promise<QueueDepth>;
348
+ getQueueDepthByWorkflow(): Promise<QueueDepthByWorkflow>;
349
+ getSuccessRate(options?: AnalyticsOptions): Promise<SuccessRate>;
350
+ getAnalyticsSummary(options?: AnalyticsOptions): Promise<AnalyticsSummary>;
351
+ }
352
+ export { projectStepState, projectRunStateFromEvents, projectStepRecord } from "@cascade-flow/backend-interface";
353
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}