@cascade-flow/backend-filesystem 0.2.10 → 0.2.17

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/dist/index.d.ts CHANGED
@@ -71,7 +71,7 @@ export declare class FileSystemBackend extends Backend {
71
71
  attemptNumber: number;
72
72
  terminal: boolean;
73
73
  nextRetryAt?: number;
74
- failureReason: "exhausted-retries" | "worker-crash" | "timeout" | "cancelled" | "execution-error";
74
+ failureReason: "exhausted-retries" | "worker-crash" | "timeout" | "cancelled" | "execution-error" | "step-removed";
75
75
  }): Promise<void>;
76
76
  saveStepFailedAndScheduleRetry(workflowSlug: string, runId: string, stepId: string, error: StepError, failureMetadata: {
77
77
  duration: number;
@@ -204,7 +204,11 @@ export declare class FileSystemBackend extends Backend {
204
204
  status?: RunState["status"][];
205
205
  tags?: string[];
206
206
  limit?: number;
207
- }): Promise<RunState[]>;
207
+ offset?: number;
208
+ }): Promise<{
209
+ runs: RunState[];
210
+ total: number;
211
+ }>;
208
212
  cancelRun(runId: string, reason?: string): Promise<void>;
209
213
  getRun(runId: string): Promise<RunState | null>;
210
214
  listActiveWorkflows(): Promise<string[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,OAAO,EACP,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,aAAa,EAkBlB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EAoBtB,MAAM,iCAAiC,CAAC;AAEzC;;;;;;;GAOG;AACH,qBAAa,iBAAkB,SAAQ,OAAO;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAa;IAE1B;;;;OAIG;gBACS,OAAO,GAAE,MAAkB;IAMvC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM;IAItG,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjE,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAqD7E,UAAU,CACd,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7C,OAAO,CAAC,SAAS,EAAE,CAAC;IACjB,UAAU,CACd,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;QAAE,QAAQ,EAAE,UAAU,CAAA;KAAE,GAChC,OAAO,CAAC,aAAa,EAAE,CAAC;IACrB,UAAU,CACd,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5D,OAAO,CAAC,KAAK,EAAE,CAAC;IA+DnB;;;OAGG;YACW,mBAAmB;IAkC3B,2BAA2B,CAC/B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAsC9B,aAAa,CACjB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;YAmBF,mBAAmB;IA+B3B,gBAAgB,CACpB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GACnB,OAAO,CAAC,IAAI,CAAC;YASF,yBAAyB;IA+BjC,4BAA4B,CAChC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAuBV,kBAAkB,CACtB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,OAAO,GACvB,OAAO,CAAC,IAAI,CAAC;IAqCV,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC;YASF,uBAAuB;IAqC/B,SAAS,CAAC,MAAM,EAAE;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,GAAG,OAAO,CAAC;QACV,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAoEF;;;;;;OAMG;YACW,yBAAyB;IAwCjC,aAAa,CACjB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAwBV,gBAAgB,CACpB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,oBAAoB,EAC9B,YAAY,GAAE,OAAe,GAC5B,OAAO,CAAC,IAAI,CAAC;IAqDV,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,OAAO,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,mBAAmB,GAAG,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,iBAAiB,GAAG,cAAc,CAAC;KACpH,GACA,OAAO,CAAC,IAAI,CAAC;IAuBV,8BAA8B,CAClC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,EAChB,eAAe,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,iBAAiB,GAAG,SAAS,CAAC;QAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,EACD,gBAAgB,EAAE;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,GACA,OAAO,CAAC,IAAI,CAAC;IA0EV,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE;QACR,QAAQ,EAAE,SAAS,GAAG,SAAS,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GACA,OAAO,CAAC,IAAI,CAAC;IAsBV,kBAAkB,CACtB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,gBAAgB,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,CAAA;SAAE,CAAC;KAC7D,GACA,OAAO,CAAC,IAAI,CAAC;IAwBV,wBAAwB,CAC5B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,SAAS,CAAC;KAClB,GACA,OAAO,CAAC,IAAI,CAAC;IAoBV,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,sBAAsB,CAAC;QACrD,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GACA,OAAO,CAAC,IAAI,CAAC;IAoBV,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAkBV,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE;QACR,gBAAgB,EAAE,MAAM,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB,GACA,OAAO,CAAC,IAAI,CAAC;IAsBV,oBAAoB,CACxB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE;QAAE,qBAAqB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GACnG,OAAO,CAAC,IAAI,CAAC;IAwBV,YAAY,CAChB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,QAAQ,EAAE,GAChB,OAAO,CAAC,IAAI,CAAC;IAMV,YAAY,CAChB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;IAavB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAkCnE,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhE,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,qBAAqB,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,GACzG,OAAO,CAAC,IAAI,CAAC;IAmBV,2BAA2B,CAC/B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE;QACN,qBAAqB,EAAE,MAAM,CAAC;QAC9B,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,SAAS,CAAC;QAClB,gBAAgB,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC7D,GACA,OAAO,CAAC,IAAI,CAAC;IAgBV,kBAAkB,CACtB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE;QAAE,qBAAqB,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,EAC1G,aAAa,EAAE,aAAa,GAAG,cAAc,GAAG,SAAS,GAAG,WAAW,GACtE,OAAO,CAAC,IAAI,CAAC;IAqBV,mBAAmB,CACvB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GACjG,OAAO,CAAC,IAAI,CAAC;IAmBV,qBAAqB,CACzB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE;QAAE,qBAAqB,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GACrG,OAAO,CAAC,IAAI,CAAC;IAmBV,wBAAwB,CAC5B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE;QACR,qBAAqB,EAAE,MAAM,CAAC;QAC9B,qBAAqB,EAAE,MAAM,CAAC;QAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GACA,OAAO,CAAC,IAAI,CAAC;IAmBV,cAAc,CAClB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CACR,KAAK,CAAC;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,SAAS,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CACH;IA6CK,gBAAgB,CACpB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,cAAc,EAAE,OAAO,CAAC;QACxB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACjB,GACA,OAAO,CAAC,IAAI,CAAC;IA6BV,SAAS,CAAC,UAAU,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IA6DhF,QAAQ,CAAC,OAAO,CAAC,EAAE;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,MAAM,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAkE1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCxD,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAmC/C,mBAAmB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAuCxC,kBAAkB,CAAC,OAAO,CAAC,EAAE;QACjC,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAoErE,eAAe,CACnB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,OAAO,CAAC;IAiBb,kBAAkB,CACtB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAsFtC,iBAAiB,CACrB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAkF1E;;OAEG;IAKH;;OAEG;IACG,gBAAgB,CAAC,YAAY,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BzE;;OAEG;IACG,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAezE;;OAEG;IACG,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA+BzD;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAe/D;;OAEG;IACG,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgCzD;;OAEG;IACG,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA8B3F;;;OAGG;YACW,0BAA0B;IA2CxC;;OAEG;IACG,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAUlG;;OAEG;IACG,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAWtF;;OAEG;IACG,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAa1G;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B;;OAEG;YACW,sBAAsB;IAoE9B,gBAAgB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IASpE,aAAa,CAAC,OAAO,CAAC,EAAE;QAC5B,SAAS,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,OAAO,GAAG,YAAY,GAAG,UAAU,CAAC;QACvD,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC;QACV,MAAM,EAAE,KAAK,CAAC;YACZ,WAAW,EAAE,MAAM,CAAC;YACpB,YAAY,EAAE,MAAM,CAAC;YACrB,SAAS,EAAE,MAAM,CAAC;YAClB,WAAW,EAAE,MAAM,CAAC;YACpB,KAAK,EAAE,MAAM,CAAC;YACd,YAAY,EAAE,MAAM,CAAC;YACrB,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC,CAAC;QACH,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAgFI,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,OAAO,GAAG,YAAY,GAAG,UAAU,EACrD,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GACA,OAAO,CAAC;QACT,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,KAAK,CAAC;YACjB,YAAY,EAAE,MAAM,CAAC;YACrB,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;YACf,aAAa,EAAE,MAAM,CAAC;YACtB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;QACH,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IAmFI,gBAAgB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAKpE,oBAAoB,CACxB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,iBAAiB,CAAC;IASvB,eAAe,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC;IASlE,mBAAmB,CACvB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,CAAC;IAKtB,kBAAkB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAKxE,aAAa,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAgB9D,aAAa,CACjB,OAAO,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,GAC/C,OAAO,CAAC,UAAU,CAAC;IA2EhB,uBAAuB,IAAI,OAAO,CAAC,oBAAoB,CAAC;IA0FxD,cAAc,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IAUhE,mBAAmB,CACvB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,gBAAgB,CAAC;CA6C7B;AAGD,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC"}
package/dist/index.js CHANGED
@@ -989,9 +989,13 @@ class FileSystemBackend extends Backend {
989
989
  }
990
990
  }
991
991
  allRuns.sort((a, b) => b.createdAt - a.createdAt);
992
- return options?.limit ? allRuns.slice(0, options.limit) : allRuns;
992
+ const total = allRuns.length;
993
+ const offset = options?.offset ?? 0;
994
+ const limit = options?.limit;
995
+ const paginatedRuns = limit ? allRuns.slice(offset, offset + limit) : allRuns.slice(offset);
996
+ return { runs: paginatedRuns, total };
993
997
  } catch {
994
- return [];
998
+ return { runs: [], total: 0 };
995
999
  }
996
1000
  }
997
1001
  async cancelRun(runId, reason) {
@@ -1599,7 +1603,7 @@ class FileSystemBackend extends Backend {
1599
1603
  return computeThroughput(stepEvents, workflowEvents, timeRangeUs, options?.workflowSlug);
1600
1604
  }
1601
1605
  async getQueueDepth(options) {
1602
- const runs = await this.listRuns({
1606
+ const { runs } = await this.listRuns({
1603
1607
  workflowSlug: options?.workflowSlug,
1604
1608
  status: ["pending", "running"]
1605
1609
  });
@@ -1652,7 +1656,7 @@ class FileSystemBackend extends Backend {
1652
1656
  };
1653
1657
  }
1654
1658
  async getQueueDepthByWorkflow() {
1655
- const runs = await this.listRuns({ status: ["pending", "running"] });
1659
+ const { runs } = await this.listRuns({ status: ["pending", "running"] });
1656
1660
  const workflowMap = new Map;
1657
1661
  for (const run of runs) {
1658
1662
  const existing = workflowMap.get(run.workflowSlug) || {
@@ -1759,4 +1763,4 @@ export {
1759
1763
  FileSystemBackend
1760
1764
  };
1761
1765
 
1762
- //# debugId=78CB67F5346BB10E64756E2164756E21
1766
+ //# debugId=26CF07EAE5368FE264756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,12 +2,12 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/lib/paths.ts", "../src/lib/ids.ts", "../src/lib/file-utils.ts"],
4
4
  "sourcesContent": [
5
- "import { mkdir, writeFile, readFile, readdir, access, unlink, open as openFile } from \"node:fs/promises\";\nimport type { FileHandle } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { PathHelper } from \"./lib/paths.ts\";\nimport * as ids from \"./lib/ids.ts\";\nimport * as fileUtils from \"./lib/file-utils.ts\";\nimport {\n Backend,\n type StepStartMetadata,\n type StepCompleteMetadata,\n type StepError,\n type StepRecord,\n type LogEntry,\n type Event,\n type StepEvent,\n type WorkflowEvent,\n type StepStartedEvent,\n type StepCompletedEvent,\n type StepFailedEvent,\n type StepSkippedEvent,\n type StepScheduledEvent,\n type StepHeartbeatEvent,\n type StepReclaimedEvent,\n type StepRetryingEvent,\n type LogEntryEvent,\n type WorkflowStartedEvent,\n type WorkflowInputValidationEvent,\n type WorkflowCompletedEvent,\n type WorkflowFailedEvent,\n type WorkflowResumedEvent,\n type WorkflowCancelledEvent,\n type WorkflowRetryStartedEvent,\n type RunSubmittedEvent,\n type RunSubmission,\n type RunState,\n type WorkflowMetadata,\n type WorkflowRegistration,\n type WorkflowVersion,\n type StepDefinition,\n type AnalyticsOptions,\n type ErrorAnalysis,\n type RetryAnalysis,\n type SchedulingLatency,\n type StepDuration,\n type WorkflowDuration,\n type WorkerStability,\n type Throughput,\n type QueueDepth,\n type QueueDepthByWorkflow,\n type SuccessRate,\n type AnalyticsSummary,\n WorkflowVersionSchema,\n eventSchema,\n safeSerialize,\n projectStepRecord,\n projectStepState,\n projectRunStateFromEvents,\n extractLogsFromEvents,\n getCurrentAttemptNumber,\n getVersionIdFromEvents,\n getMicrosecondTimestamp,\n computeErrorAnalysis,\n computeRetryAnalysis,\n computeSchedulingLatency,\n computeStepDuration,\n computeWorkflowDuration,\n computeErrorFingerprints,\n computeWorkerStability,\n computeThroughput,\n computeSuccessRate,\n} from \"@cascade-flow/backend-interface\";\n\n/**\n * FileSystem backend implementation\n * Stores workflow execution state in the local filesystem using event sourcing\n *\n * Directory structure:\n * ./.runs/{workflow-slug}/{runId}/workflow-events/{timestamp}-{eventType}.json\n * ./.runs/{workflow-slug}/{runId}/step-events/{timestamp}-{stepId}-{eventType}.json\n */\nexport class FileSystemBackend extends Backend {\n private baseDir: string;\n private paths: PathHelper;\n\n /**\n * Create a new FileSystem backend\n *\n * @param baseDir - Base directory for storing runs (defaults to \"./.runs\")\n */\n constructor(baseDir: string = \"./.runs\") {\n super();\n this.baseDir = baseDir;\n this.paths = new PathHelper(baseDir);\n }\n\n /**\n * Initialize the backend (no-op for filesystem - directories created as needed)\n */\n async initialize(): Promise<void> {\n // No initialization needed - directories are created on-demand\n }\n\n async backendReady(): Promise<boolean> {\n return true;\n }\n\n public getStepOutputPath(workflowSlug: string, runId: string, stepId: string, attemptNumber: number): string {\n return this.paths.getStepOutputPath(workflowSlug, runId, stepId, attemptNumber);\n }\n\n async initializeRun(workflowSlug: string, runId: string): Promise<void> {\n const workflowEventsDir = this.paths.getWorkflowEventsDir(workflowSlug, runId);\n const stepEventsDir = this.paths.getStepEventsDir(workflowSlug, runId);\n await mkdir(workflowEventsDir, { recursive: true });\n await mkdir(stepEventsDir, { recursive: true });\n }\n\n async appendEvent(workflowSlug: string, runId: string, event: Event): Promise<void> {\n // Ensure event has ID and timestamp if not provided\n if (!event.eventId) {\n (event as any).eventId = ids.generateEventId();\n }\n if (!event.timestampUs) {\n (event as any).timestampUs = getMicrosecondTimestamp();\n }\n\n // Validate event\n eventSchema.parse(event);\n\n // Determine directory and filename based on event category\n // For step events, create nested directories based on stepId\n const eventsDir =\n event.category === \"workflow\"\n ? this.paths.getWorkflowEventsDir(workflowSlug, runId)\n : this.paths.getStepEventDir(workflowSlug, runId, (event as StepEvent).stepId);\n\n const getFilename = (evt: Event): string => {\n if (evt.category === \"workflow\") {\n return fileUtils.getWorkflowEventFilename(evt as WorkflowEvent);\n } else {\n return fileUtils.getStepEventFilename(evt as StepEvent);\n }\n };\n\n await mkdir(eventsDir, { recursive: true });\n\n // Handle timestamp collisions by incrementing the timestamp\n let timestamp = parseInt(event.eventId);\n let filename = getFilename(event);\n let filePath = join(eventsDir, filename);\n\n // Check for collision and increment timestamp until we find a unique one\n while (true) {\n try {\n await access(filePath);\n // File exists, increment timestamp and try again\n timestamp++;\n (event as any).eventId = `${timestamp}`;\n (event as any).timestampUs = timestamp;\n filename = getFilename(event);\n filePath = join(eventsDir, filename);\n } catch {\n // File doesn't exist, we can use this timestamp\n break;\n }\n }\n\n await fileUtils.writeJsonAtomic(filePath, event);\n }\n\n async loadEvents(\n workflowSlug: string,\n runId: string,\n options: { category: \"step\"; stepId?: string }\n ): Promise<StepEvent[]>;\n async loadEvents(\n workflowSlug: string,\n runId: string,\n options: { category: \"workflow\" }\n ): Promise<WorkflowEvent[]>;\n async loadEvents(\n workflowSlug: string,\n runId: string,\n options?: { category?: \"workflow\" | \"step\"; stepId?: string }\n ): Promise<Event[]>;\n async loadEvents(\n workflowSlug: string,\n runId: string,\n options?: { category?: \"workflow\" | \"step\"; stepId?: string }\n ): Promise<Event[]> {\n try {\n const events: Event[] = [];\n\n // Determine which directories to read from\n const directories: Array<{ dir: string; category: \"workflow\" | \"step\" }> = [];\n\n if (!options?.category || options.category === \"workflow\") {\n directories.push({\n dir: this.paths.getWorkflowEventsDir(workflowSlug, runId),\n category: \"workflow\",\n });\n }\n\n if (!options?.category || options.category === \"step\") {\n directories.push({\n dir: this.paths.getStepEventsDir(workflowSlug, runId),\n category: \"step\",\n });\n }\n\n // Load events from each directory (recursively for step events to support nested structure)\n for (const { dir, category } of directories) {\n try {\n // For step events, recursively load from nested directories\n if (category === \"step\") {\n await this.loadEventsRecursive(dir, events, options?.stepId);\n } else {\n // For workflow events, load from flat directory\n const files = await readdir(dir);\n const eventFiles = files.filter((f) => f.endsWith(\".json\"));\n\n for (const file of eventFiles) {\n const content = await readFile(join(dir, file), \"utf-8\");\n const event = eventSchema.parse(JSON.parse(content));\n events.push(event);\n }\n }\n } catch (err) {\n // Directory might not exist yet, continue with other directories\n continue;\n }\n }\n\n // Sort events by timestamp, then by eventId for deterministic ordering\n events.sort((a, b) => {\n if (a.timestampUs !== b.timestampUs) {\n return a.timestampUs - b.timestampUs;\n }\n return a.eventId.localeCompare(b.eventId);\n });\n\n return events;\n } catch {\n return [];\n }\n }\n\n /**\n * Recursively load events from a directory and its subdirectories\n * Supports nested step event structure\n */\n private async loadEventsRecursive(\n dir: string,\n events: Event[],\n stepIdFilter?: string\n ): Promise<void> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Recurse into subdirectory\n await this.loadEventsRecursive(fullPath, events, stepIdFilter);\n } else if (entry.name.endsWith(\".json\")) {\n // Load and parse event file\n const content = await readFile(fullPath, \"utf-8\");\n const event = eventSchema.parse(JSON.parse(content));\n\n // Apply stepId filter if provided\n if (stepIdFilter) {\n if (event.category === \"step\" && event.stepId === stepIdFilter) {\n events.push(event);\n }\n } else {\n events.push(event);\n }\n }\n }\n } catch (err) {\n // Directory might not exist or be inaccessible, silently continue\n }\n }\n\n async loadStepEventsForProjection(\n workflowSlug: string,\n runId: string\n ): Promise<Map<string, StepEvent[]>> {\n const eventsByStep = new Map<string, StepEvent[]>();\n\n // Event types to exclude (don't affect state projection)\n const excludedTypes = new Set([\"LogEntry\", \"StepHeartbeat\", \"StepRetrying\"]);\n\n try {\n const events: Event[] = [];\n const stepEventsDir = this.paths.getStepEventsDir(workflowSlug, runId);\n await this.loadEventsRecursive(stepEventsDir, events);\n\n // Group by stepId, excluding high-volume types that don't affect status\n for (const event of events) {\n if (event.category === \"step\" && !excludedTypes.has(event.type)) {\n const stepEvent = event as StepEvent;\n if (!eventsByStep.has(stepEvent.stepId)) {\n eventsByStep.set(stepEvent.stepId, []);\n }\n eventsByStep.get(stepEvent.stepId)!.push(stepEvent);\n }\n }\n\n // Sort each step's events by timestamp\n for (const [, stepEvents] of eventsByStep) {\n stepEvents.sort((a, b) => {\n if (a.timestampUs !== b.timestampUs) {\n return a.timestampUs - b.timestampUs;\n }\n return a.eventId.localeCompare(b.eventId);\n });\n }\n } catch {\n // Directory might not exist, return empty map\n }\n\n return eventsByStep;\n }\n\n async copyEntireRun(\n workflowSlug: string,\n sourceRunId: string,\n targetRunId: string\n ): Promise<void> {\n const sourceDir = this.paths.getRunDir(workflowSlug, sourceRunId);\n const targetDir = this.paths.getRunDir(workflowSlug, targetRunId);\n\n // Create target run directory\n await mkdir(targetDir, { recursive: true });\n\n try {\n // Copy all events with runId replacement\n await this.copyEventsRecursive(sourceDir, targetDir, sourceRunId, targetRunId);\n } catch (error) {\n // Rollback: delete target directory on failure\n try {\n await fileUtils.rm(targetDir, { recursive: true, force: true });\n } catch {}\n throw error;\n }\n }\n\n private async copyEventsRecursive(\n sourceDir: string,\n targetDir: string,\n sourceRunId: string,\n targetRunId: string\n ): Promise<void> {\n const entries = await readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = join(sourceDir, entry.name);\n const targetPath = join(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n // Create directory and recurse\n await mkdir(targetPath, { recursive: true });\n await this.copyEventsRecursive(sourcePath, targetPath, sourceRunId, targetRunId);\n } else if (entry.name.endsWith(\".json\")) {\n // Copy event file with runId replacement\n const content = await readFile(sourcePath, \"utf-8\");\n const event = JSON.parse(content);\n\n // Update runId and generate new eventId\n event.runId = targetRunId;\n event.eventId = ids.generateEventId(event.timestampUs);\n\n // Write to target\n await writeFile(targetPath, JSON.stringify(event, null, 2), \"utf-8\");\n }\n }\n }\n\n async deleteStepEvents(\n workflowSlug: string,\n runId: string,\n stepIds: Set<string>\n ): Promise<void> {\n const stepEventsDir = this.paths.getStepEventsDir(workflowSlug, runId);\n\n // Delete event files for each step ID (handle nested structure)\n for (const stepId of stepIds) {\n await this.deleteStepEventsRecursive(stepEventsDir, stepId);\n }\n }\n\n private async deleteStepEventsRecursive(\n stepEventsDir: string,\n stepId: string\n ): Promise<void> {\n // For nested steps, navigate to the parent directory\n const stepParts = stepId.split(\"/\");\n const eventDir = stepParts.length > 1\n ? join(stepEventsDir, ...stepParts.slice(0, -1))\n : stepEventsDir;\n\n try {\n const entries = await readdir(eventDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(eventDir, entry.name);\n\n if (entry.isFile() && entry.name.endsWith(\".json\")) {\n // Check if this event file belongs to our step\n const content = await readFile(fullPath, \"utf-8\");\n const event = JSON.parse(content);\n\n if (event.category === \"step\" && event.stepId === stepId) {\n await unlink(fullPath);\n }\n }\n }\n } catch (error) {\n // Directory might not exist, silently continue\n }\n }\n\n async deleteWorkflowTerminalEvents(\n workflowSlug: string,\n runId: string\n ): Promise<void> {\n const workflowEventsDir = this.paths.getWorkflowEventsDir(workflowSlug, runId);\n\n try {\n const entries = await readdir(workflowEventsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".json\")) {\n // Check if this is a terminal event\n if (\n entry.name.includes(\"-WorkflowCompleted.json\") ||\n entry.name.includes(\"-WorkflowFailed.json\") ||\n entry.name.includes(\"-WorkflowCancelled.json\")\n ) {\n await unlink(join(workflowEventsDir, entry.name));\n }\n }\n }\n } catch (error) {\n // Directory might not exist, silently continue\n }\n }\n\n async copyWorkflowEvents(\n workflowSlug: string,\n sourceRunId: string,\n targetRunId: string,\n excludeTerminal: boolean\n ): Promise<void> {\n const sourceDir = this.paths.getWorkflowEventsDir(workflowSlug, sourceRunId);\n const targetDir = this.paths.getWorkflowEventsDir(workflowSlug, targetRunId);\n\n await mkdir(targetDir, { recursive: true });\n\n try {\n const entries = await readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".json\")) {\n // Skip terminal events if requested\n if (excludeTerminal && (\n entry.name.includes(\"-WorkflowCompleted.json\") ||\n entry.name.includes(\"-WorkflowFailed.json\") ||\n entry.name.includes(\"-WorkflowCancelled.json\")\n )) {\n continue;\n }\n\n const sourcePath = join(sourceDir, entry.name);\n const content = await readFile(sourcePath, \"utf-8\");\n const event = JSON.parse(content);\n\n // Update runId and generate new eventId\n event.runId = targetRunId;\n event.eventId = ids.generateEventId(event.timestampUs);\n\n const targetPath = join(targetDir, entry.name);\n await writeFile(targetPath, JSON.stringify(event, null, 2), \"utf-8\");\n }\n }\n } catch (error) {\n // Directory might not exist, silently continue\n }\n }\n\n async copyStepEvents(\n workflowSlug: string,\n sourceRunId: string,\n targetRunId: string,\n includeStepIds: Set<string>\n ): Promise<void> {\n const sourceDir = this.paths.getStepEventsDir(workflowSlug, sourceRunId);\n const targetDir = this.paths.getStepEventsDir(workflowSlug, targetRunId);\n\n await mkdir(targetDir, { recursive: true });\n\n await this.copyStepEventsRecursive(sourceDir, targetDir, sourceRunId, targetRunId, includeStepIds);\n }\n\n private async copyStepEventsRecursive(\n sourceDir: string,\n targetDir: string,\n sourceRunId: string,\n targetRunId: string,\n includeStepIds: Set<string>\n ): Promise<void> {\n try {\n const entries = await readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = join(sourceDir, entry.name);\n const targetPath = join(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n // Create directory and recurse\n await mkdir(targetPath, { recursive: true });\n await this.copyStepEventsRecursive(sourcePath, targetPath, sourceRunId, targetRunId, includeStepIds);\n } else if (entry.name.endsWith(\".json\")) {\n // Read event to check if it's for an included step\n const content = await readFile(sourcePath, \"utf-8\");\n const event = JSON.parse(content);\n\n if (event.category === \"step\" && includeStepIds.has(event.stepId)) {\n // Update runId and generate new eventId\n event.runId = targetRunId;\n event.eventId = ids.generateEventId(event.timestampUs);\n\n await writeFile(targetPath, JSON.stringify(event, null, 2), \"utf-8\");\n }\n }\n }\n } catch (error) {\n // Directory might not exist, silently continue\n }\n }\n\n async rerunFrom(params: {\n parentRunId: string;\n fromStepId: string;\n input?: unknown;\n }): Promise<{\n runId: string;\n }> {\n // Get parent run to extract workflow slug\n const parentRun = await this.getRun(params.parentRunId);\n if (!parentRun) {\n throw new Error(`Parent run \"${params.parentRunId}\" not found`);\n }\n\n // Calculate excluded steps from workflow metadata (authoritative source)\n const dependents = await this.calculateDependents(\n parentRun.workflowSlug,\n params.fromStepId\n );\n const rerunStepIds = new Set<string>([params.fromStepId, ...dependents]);\n\n // Generate new run ID\n const newRunId = getMicrosecondTimestamp().toString();\n\n // Copy entire run (atomic operation with rollback on failure)\n await this.copyEntireRun(parentRun.workflowSlug, params.parentRunId, newRunId);\n\n // Delete events for steps that will be re-executed\n await this.deleteStepEvents(parentRun.workflowSlug, newRunId, rerunStepIds);\n\n // Delete terminal workflow events to reset workflow to running state\n // This allows workers to pick up the scheduled steps\n await this.deleteWorkflowTerminalEvents(parentRun.workflowSlug, newRunId);\n\n // Get current workflow version for the rerun\n const currentVersion = await this.getCurrentWorkflowVersion(parentRun.workflowSlug);\n if (!currentVersion) {\n throw new Error(`Workflow ${parentRun.workflowSlug} not registered. Please ensure the worker has started and registered workflows.`);\n }\n\n // Get parent run's version from its WorkflowStarted event\n const parentWorkflowEvents = await this.loadEvents(parentRun.workflowSlug, params.parentRunId, {\n category: \"workflow\",\n }) as WorkflowEvent[];\n const parentVersionId = getVersionIdFromEvents(parentWorkflowEvents);\n\n // Emit WorkflowRerunFromStep event to track rerun metadata\n const timestamp = getMicrosecondTimestamp();\n await this.appendEvent(parentRun.workflowSlug, newRunId, {\n category: \"workflow\",\n type: \"WorkflowRerunFromStep\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug: parentRun.workflowSlug,\n runId: newRunId,\n parentRunId: params.parentRunId,\n rerunFromStepId: params.fromStepId,\n rerunStepIds: Array.from(rerunStepIds),\n versionId: currentVersion.versionId,\n parentVersionId,\n });\n\n // Submit to queue for worker execution (no workflow discovery needed!)\n // The worker will see the copied events and resume from where parent left off\n await this.submitRun({\n workflowSlug: parentRun.workflowSlug,\n runId: newRunId,\n input: params.input,\n });\n\n return {\n runId: newRunId,\n };\n }\n\n /**\n * Recursively discover all unique step IDs from step events directory\n * Supports nested step structure by reading actual event files\n *\n * @param stepEventsDir - Root step-events directory to scan\n * @returns Set of all discovered step IDs\n */\n private async discoverStepIdsFromEvents(\n stepEventsDir: string\n ): Promise<Set<string>> {\n const stepIds = new Set<string>();\n\n const scanDirectory = async (dir: string): Promise<void> => {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Recurse into subdirectory\n await scanDirectory(fullPath);\n } else if (entry.name.endsWith(\".json\")) {\n // Read event file to get stepId\n try {\n const content = await readFile(fullPath, \"utf-8\");\n const event = JSON.parse(content);\n\n // Only process step events (workflow events don't have stepId)\n if (event.category === \"step\" && event.stepId) {\n stepIds.add(event.stepId);\n }\n } catch {\n // Skip invalid/unparseable event files\n continue;\n }\n }\n }\n } catch {\n // Directory might not exist or be inaccessible, silently continue\n }\n };\n\n await scanDirectory(stepEventsDir);\n return stepIds;\n }\n\n async saveStepStart(\n workflowSlug: string,\n runId: string,\n stepId: string,\n workerId: string,\n metadata: StepStartMetadata\n ): Promise<void> {\n // Get current attempt number by counting previous StepStarted events\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n const attemptNumber = getCurrentAttemptNumber(events) + 1;\n\n // Use high-resolution timestamp instead of metadata timestamp\n const timestamp = getMicrosecondTimestamp();\n\n const event: StepStartedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n stepId,\n type: \"StepStarted\",\n workerId,\n dependencies: metadata.dependencies,\n attemptNumber,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepComplete(\n workflowSlug: string,\n runId: string,\n stepId: string,\n output: unknown,\n metadata: StepCompleteMetadata,\n exportOutput: boolean = false\n ): Promise<void> {\n // Use the attempt number from the caller (worker knows the correct attempt)\n const attemptNumber = metadata.attemptNumber;\n\n if (attemptNumber === 0) {\n throw new Error(`Cannot complete step that hasn't started: ${stepId}`);\n }\n\n // Append log events first (if any)\n if (metadata.logs && metadata.logs.length > 0) {\n for (const log of metadata.logs) {\n // Log timestamp is already in microseconds\n const logTimestamp = log.timestamp;\n const logEvent: LogEntryEvent = {\n category: \"step\",\n eventId: ids.generateEventId(logTimestamp),\n timestampUs: logTimestamp,\n workflowSlug,\n runId,\n stepId,\n type: \"LogEntry\",\n stream: log.stream,\n message: log.message,\n attemptNumber,\n };\n await this.appendEvent(workflowSlug, runId, logEvent);\n }\n }\n\n // Serialize the output\n const serialized = safeSerialize(output);\n const outputString = serialized.success ? serialized.data : serialized.fallback;\n\n // Use high-resolution timestamp\n const timestamp = getMicrosecondTimestamp();\n\n const event: StepCompletedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n stepId,\n type: \"StepCompleted\",\n output: outputString,\n durationUs: metadata.duration,\n attemptNumber,\n exportOutput,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepFailed(\n workflowSlug: string,\n runId: string,\n stepId: string,\n error: StepError,\n metadata: {\n duration: number;\n attemptNumber: number;\n terminal: boolean;\n nextRetryAt?: number;\n failureReason: \"exhausted-retries\" | \"worker-crash\" | \"timeout\" | \"cancelled\" | \"execution-error\";\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event: StepFailedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepFailed\",\n error,\n errorFingerprints: computeErrorFingerprints(error, error.stack),\n durationUs: metadata.duration,\n attemptNumber: metadata.attemptNumber,\n terminal: metadata.terminal,\n nextRetryAtUs: metadata.nextRetryAt,\n failureReason: metadata.failureReason,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepFailedAndScheduleRetry(\n workflowSlug: string,\n runId: string,\n stepId: string,\n error: StepError,\n failureMetadata: {\n duration: number;\n attemptNumber: number;\n nextRetryAt: number;\n failureReason: \"execution-error\" | \"timeout\";\n policyIndex?: number;\n attemptInPolicy?: number;\n },\n scheduleMetadata: {\n availableAt: number;\n nextAttemptNumber: number;\n retryDelayMs: number;\n maxRetries?: number;\n totalPolicies?: number;\n policyIndex?: number;\n attemptInPolicy?: number;\n }\n ): Promise<void> {\n // For filesystem backend, we write events sequentially\n // This is less atomic than the Postgres version, but:\n // 1. File system operations are generally reliable\n // 2. The recovery logic will handle any edge cases\n // 3. Each appendEvent is atomic at the file level\n\n // Generate timestamps for all three events\n // We need distinct timestamps to ensure proper event ordering\n const failedTimestamp = getMicrosecondTimestamp();\n const retryingTimestamp = failedTimestamp + 1;\n const scheduledTimestamp = failedTimestamp + 2;\n\n // Event 1: StepFailed (terminal: false)\n const failedEvent: StepFailedEvent = {\n category: \"step\",\n type: \"StepFailed\",\n eventId: ids.generateEventId(failedTimestamp),\n timestampUs: failedTimestamp,\n workflowSlug,\n runId,\n stepId,\n error,\n errorFingerprints: computeErrorFingerprints(error, error.stack),\n durationUs: failureMetadata.duration,\n attemptNumber: failureMetadata.attemptNumber,\n terminal: false,\n nextRetryAtUs: failureMetadata.nextRetryAt,\n failureReason: failureMetadata.failureReason,\n policyIndex: failureMetadata.policyIndex,\n attemptInPolicy: failureMetadata.attemptInPolicy,\n };\n\n await this.appendEvent(workflowSlug, runId, failedEvent);\n\n // Event 2: StepRetrying (informational)\n const retryingEvent: StepRetryingEvent = {\n category: \"step\",\n type: \"StepRetrying\",\n eventId: ids.generateEventId(retryingTimestamp),\n timestampUs: retryingTimestamp,\n workflowSlug,\n runId,\n stepId,\n attemptNumber: failureMetadata.attemptNumber,\n nextAttempt: scheduleMetadata.nextAttemptNumber,\n maxRetries: scheduleMetadata.maxRetries,\n totalPolicies: scheduleMetadata.totalPolicies,\n policyIndex: scheduleMetadata.policyIndex,\n error,\n };\n\n await this.appendEvent(workflowSlug, runId, retryingEvent);\n\n // Event 3: StepScheduled (for retry)\n const scheduledEvent: StepScheduledEvent = {\n category: \"step\",\n type: \"StepScheduled\",\n eventId: ids.generateEventId(scheduledTimestamp),\n timestampUs: scheduledTimestamp,\n workflowSlug,\n runId,\n stepId,\n availableAtUs: scheduleMetadata.availableAt,\n reason: \"retry\",\n attemptNumber: scheduleMetadata.nextAttemptNumber,\n retryDelayMs: scheduleMetadata.retryDelayMs,\n policyIndex: scheduleMetadata.policyIndex,\n attemptInPolicy: scheduleMetadata.attemptInPolicy,\n };\n\n await this.appendEvent(workflowSlug, runId, scheduledEvent);\n }\n\n async saveStepSkipped(\n workflowSlug: string,\n runId: string,\n stepId: string,\n metadata: {\n skipType: \"primary\" | \"cascade\";\n reason: string;\n metadata?: Record<string, any>;\n duration: number;\n attemptNumber: number;\n cascadedFrom?: string;\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event: StepSkippedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepSkipped\",\n skipType: metadata.skipType,\n reason: metadata.reason,\n metadata: metadata.metadata,\n durationUs: metadata.duration,\n attemptNumber: metadata.attemptNumber,\n cascadedFrom: metadata.cascadedFrom,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepCheckpoint(\n workflowSlug: string,\n runId: string,\n stepId: string,\n checkpoint: {\n name: string;\n sequenceNumber: number;\n attemptNumber: number;\n data: string;\n label?: string;\n parentCheckpoint?: { name: string; sequenceNumber: number };\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event = {\n category: \"step\" as const,\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepCheckpoint\" as const,\n name: checkpoint.name,\n sequenceNumber: checkpoint.sequenceNumber,\n attemptNumber: checkpoint.attemptNumber,\n data: checkpoint.data,\n ...(checkpoint.label && { label: checkpoint.label }),\n ...(checkpoint.parentCheckpoint && {\n parentCheckpoint: checkpoint.parentCheckpoint,\n }),\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepCheckpointFailed(\n workflowSlug: string,\n runId: string,\n stepId: string,\n checkpoint: {\n name: string;\n sequenceNumber: number;\n attemptNumber: number;\n error: StepError;\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event = {\n category: \"step\" as const,\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepCheckpointFailed\" as const,\n name: checkpoint.name,\n sequenceNumber: checkpoint.sequenceNumber,\n attemptNumber: checkpoint.attemptNumber,\n error: checkpoint.error,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepScheduled(\n workflowSlug: string,\n runId: string,\n stepId: string,\n metadata: {\n availableAt: number;\n reason: \"initial\" | \"retry\" | \"dependency-satisfied\";\n attemptNumber: number;\n retryDelayMs?: number;\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event: StepScheduledEvent = {\n category: \"step\",\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepScheduled\",\n availableAtUs: metadata.availableAt,\n reason: metadata.reason,\n attemptNumber: metadata.attemptNumber,\n retryDelayMs: metadata.retryDelayMs,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepHeartbeat(\n workflowSlug: string,\n runId: string,\n stepId: string,\n workerId: string,\n attemptNumber: number\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event: StepHeartbeatEvent = {\n category: \"step\",\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepHeartbeat\",\n workerId,\n attemptNumber,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepReclaimed(\n workflowSlug: string,\n runId: string,\n stepId: string,\n metadata: {\n originalWorkerId: string;\n reclaimedBy: string;\n lastHeartbeat: number;\n staleThreshold: number;\n staleDuration: number;\n attemptNumber: number;\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event: StepReclaimedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepReclaimed\",\n originalWorkerId: metadata.originalWorkerId,\n reclaimedBy: metadata.reclaimedBy,\n lastHeartbeatUs: metadata.lastHeartbeat,\n staleThresholdUs: metadata.staleThreshold,\n staleDurationUs: metadata.staleDuration,\n attemptNumber: metadata.attemptNumber,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowComplete(\n workflowSlug: string,\n runId: string,\n output: unknown,\n metadata: { workflowAttemptNumber: number; timestamp: number; duration: number; totalSteps: number }\n ): Promise<void> {\n // Serialize the output\n const serialized = safeSerialize(output);\n const outputString = serialized.success ? serialized.data : serialized.fallback;\n\n // Use high-resolution timestamp\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowCompletedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowCompleted\",\n workflowAttemptNumber: metadata.workflowAttemptNumber,\n output: outputString,\n durationUs: metadata.duration,\n totalSteps: metadata.totalSteps,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepLogs(\n _workflowSlug: string,\n _runId: string,\n _stepId: string,\n _logs: LogEntry[]\n ): Promise<void> {\n // Logs are now saved as LogEntry events during saveStepComplete\n // This method is kept for backward compatibility but is a no-op\n // The logs are already appended as events in saveStepComplete\n }\n\n async loadStepLogs(\n workflowSlug: string,\n runId: string,\n stepId: string,\n attemptNumber?: number\n ): Promise<LogEntry[] | null> {\n // Load logs from events\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n let logs = extractLogsFromEvents(events);\n\n // Filter by attempt number if specified\n if (attemptNumber !== undefined) {\n logs = logs.filter(log => log.attemptNumber === attemptNumber);\n }\n\n return logs.length > 0 ? logs : null;\n }\n\n async loadRun(workflowSlug: string, runId: string): Promise<StepRecord[]> {\n try {\n // Load only step events (workflow events don't represent step execution)\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\" });\n\n if (events.length === 0) {\n return [];\n }\n\n // Group events by step ID\n const eventsByStep = new Map<string, Event[]>();\n for (const event of events) {\n // Type guard: we know these are step events\n if (event.category === \"step\") {\n if (!eventsByStep.has(event.stepId)) {\n eventsByStep.set(event.stepId, []);\n }\n eventsByStep.get(event.stepId)!.push(event);\n }\n }\n\n // Project each step's events to StepRecord\n const records: StepRecord[] = [];\n for (const [_stepId, stepEvents] of eventsByStep) {\n const record = projectStepRecord(stepEvents);\n records.push(record);\n }\n\n return records;\n } catch {\n return [];\n }\n }\n\n async runExists(workflowSlug: string, runId: string): Promise<boolean> {\n try {\n const runDir = this.paths.getRunDir(workflowSlug, runId);\n await access(runDir);\n return true;\n } catch {\n return false;\n }\n }\n\n async saveWorkflowStart(\n workflowSlug: string,\n runId: string,\n metadata: { versionId: string; workflowAttemptNumber: number; hasInputSchema: boolean; hasInput: boolean }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowStartedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowStarted\",\n versionId: metadata.versionId,\n workflowAttemptNumber: metadata.workflowAttemptNumber,\n hasInputSchema: metadata.hasInputSchema,\n hasInput: metadata.hasInput,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowInputValidation(\n workflowSlug: string,\n runId: string,\n result: {\n workflowAttemptNumber: number;\n hasSchema: boolean;\n success: boolean;\n error?: StepError;\n validationErrors?: Array<{ path: string; message: string }>;\n }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowInputValidationEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowInputValidation\",\n ...result,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowFailed(\n workflowSlug: string,\n runId: string,\n error: StepError,\n metadata: { workflowAttemptNumber: number; duration: number; completedSteps: number; failedStep?: string },\n failureReason: \"step-failed\" | \"worker-crash\" | \"timeout\" | \"cancelled\"\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowFailedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowFailed\",\n workflowAttemptNumber: metadata.workflowAttemptNumber,\n error,\n durationUs: metadata.duration,\n completedSteps: metadata.completedSteps,\n failedStep: metadata.failedStep,\n failureReason,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowResumed(\n workflowSlug: string,\n runId: string,\n metadata: { versionId: string; originalRunId: string; resumedSteps: number; pendingSteps: number }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowResumedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowResumed\",\n versionId: metadata.versionId,\n originalRunId: metadata.originalRunId,\n resumedSteps: metadata.resumedSteps,\n pendingSteps: metadata.pendingSteps,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowCancelled(\n workflowSlug: string,\n runId: string,\n metadata: { workflowAttemptNumber: number; reason?: string; duration: number; completedSteps: number }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowCancelledEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowCancelled\",\n workflowAttemptNumber: metadata.workflowAttemptNumber,\n reason: metadata.reason,\n durationUs: metadata.duration,\n completedSteps: metadata.completedSteps,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowRetryStarted(\n workflowSlug: string,\n runId: string,\n metadata: {\n workflowAttemptNumber: number;\n previousAttemptNumber: number;\n retriedSteps: string[];\n reason?: string;\n }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowRetryStartedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowRetryStarted\",\n workflowAttemptNumber: metadata.workflowAttemptNumber,\n previousAttemptNumber: metadata.previousAttemptNumber,\n retriedSteps: metadata.retriedSteps,\n reason: metadata.reason,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async getFailedSteps(\n workflowSlug: string,\n runId: string\n ): Promise<\n Array<{\n stepId: string;\n error: StepError;\n attemptNumber: number;\n }>\n > {\n // Load all step events for this run\n const events = await this.loadEvents(workflowSlug, runId, {\n category: \"step\",\n });\n\n if (events.length === 0 || !(\"category\" in events[0]!)) {\n return [];\n }\n\n // Group events by step ID\n const eventsByStep = new Map<string, StepEvent[]>();\n for (const event of events) {\n if (event.category === \"step\") {\n const stepEvents = eventsByStep.get(event.stepId) || [];\n stepEvents.push(event as StepEvent);\n eventsByStep.set(event.stepId, stepEvents);\n }\n }\n\n // Project each step's state and filter for failed steps\n const failedSteps: Array<{\n stepId: string;\n error: StepError;\n attemptNumber: number;\n }> = [];\n\n for (const [stepId, stepEvents] of eventsByStep) {\n const state = projectStepState(stepEvents, workflowSlug);\n if (state.status === \"failed\" && state.terminal && state.error) {\n failedSteps.push({\n stepId,\n error: state.error,\n attemptNumber: state.attemptNumber,\n });\n }\n }\n\n return failedSteps;\n }\n\n // ============================================================================\n // Queue Event Methods (Events-as-Queue Pattern)\n // ============================================================================\n\n async saveRunSubmitted(\n workflowSlug: string,\n runId: string,\n metadata: {\n versionId: string;\n availableAt: number;\n priority: number;\n input?: string; // Serialized JSON\n hasInputSchema: boolean;\n timeout?: number;\n idempotencyKey?: string;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: RunSubmittedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"RunSubmitted\",\n versionId: metadata.versionId,\n availableAtUs: metadata.availableAt,\n priority: metadata.priority,\n input: metadata.input,\n hasInputSchema: metadata.hasInputSchema,\n timeoutUs: metadata.timeout,\n idempotencyKey: metadata.idempotencyKey,\n metadata: metadata.metadata,\n tags: metadata.tags,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n\n // ============================================================================\n // Queue Management Methods (Events-as-Queue Implementation)\n // ============================================================================\n\n async submitRun(submission: RunSubmission): Promise<{ runId: string; isNew: boolean }> {\n // Check idempotency first\n if (submission.idempotencyKey) {\n const hash = ids.hashIdempotencyKey(submission.idempotencyKey);\n const idempotencyFile = join(this.paths.getIdempotencyDir(), `${hash}.json`);\n\n try {\n const content = await readFile(idempotencyFile, \"utf-8\");\n const existing = JSON.parse(content);\n return { runId: existing.runId, isNew: false };\n } catch {\n // Idempotency key not found, continue with submission\n }\n }\n\n // Generate runId if not provided\n const runId = submission.runId || ids.generateRunId();\n const now = getMicrosecondTimestamp();\n const availableAt = submission.availableAt || now;\n const priority = submission.priority || 0;\n\n // Initialize run directory\n await this.initializeRun(submission.workflowSlug, runId);\n\n // Get workflow metadata to determine if input schema exists\n const workflowMetadata = await this.getWorkflowMetadata(submission.workflowSlug);\n const hasInputSchema = !!(workflowMetadata?.inputSchemaJSON);\n\n // Get current workflow version (auto-captured at submission time)\n const currentVersion = await this.getCurrentWorkflowVersion(submission.workflowSlug);\n if (!currentVersion) {\n throw new Error(`Workflow ${submission.workflowSlug} not registered. Please ensure the worker has started and registered workflows.`);\n }\n\n // Emit RunSubmitted event (this IS the queue entry!)\n // Input is stored directly in the event (no separate file)\n await this.saveRunSubmitted(submission.workflowSlug, runId, {\n versionId: currentVersion.versionId,\n availableAt,\n priority,\n input: submission.input !== undefined ? JSON.stringify(submission.input) : undefined,\n hasInputSchema,\n timeout: submission.timeout,\n idempotencyKey: submission.idempotencyKey,\n metadata: submission.metadata,\n tags: submission.tags,\n });\n\n // Save idempotency mapping if key provided\n if (submission.idempotencyKey) {\n const hash = ids.hashIdempotencyKey(submission.idempotencyKey);\n const idempotencyDir = this.paths.getIdempotencyDir();\n await mkdir(idempotencyDir, { recursive: true });\n const idempotencyFile = join(idempotencyDir, `${hash}.json`);\n await fileUtils.writeJsonAtomic(idempotencyFile, { runId, createdAt: now });\n }\n\n return { runId, isNew: true };\n }\n\n\n async listRuns(options?: {\n workflowSlug?: string;\n status?: RunState[\"status\"][];\n tags?: string[];\n limit?: number;\n }): Promise<RunState[]> {\n try {\n const allRuns: RunState[] = [];\n\n // Scan all workflow directories\n const workflows = await readdir(this.baseDir);\n\n for (const workflowSlug of workflows) {\n // Skip non-workflow directories\n if (workflowSlug.startsWith(\".\")) continue;\n\n // Apply workflow filter\n if (options?.workflowSlug && workflowSlug !== options.workflowSlug) continue;\n\n const workflowDir = join(this.baseDir, workflowSlug);\n const runDirs = await readdir(workflowDir);\n\n for (const runId of runDirs) {\n try {\n // Load workflow events and project to RunState\n const events = await this.loadEvents(workflowSlug, runId, { category: \"workflow\" });\n\n if (events.length === 0) continue;\n\n const state = projectRunStateFromEvents(events, workflowSlug);\n\n // Apply status filter (OR logic - match any)\n if (options?.status && options.status.length > 0) {\n if (!options.status.includes(state.status)) continue;\n }\n\n // Apply tag filter (AND logic - must have all)\n if (options?.tags && options.tags.length > 0) {\n const stateTags = state.tags || [];\n const hasAllTags = options.tags.every((tag) => stateTags.includes(tag));\n if (!hasAllTags) continue;\n }\n\n allRuns.push(state);\n } catch {\n // Skip runs that fail to project (corrupted/incomplete)\n continue;\n }\n }\n }\n\n // Sort by createdAt (descending - newest first)\n allRuns.sort((a, b) => b.createdAt - a.createdAt);\n\n // Apply limit\n return options?.limit ? allRuns.slice(0, options.limit) : allRuns;\n } catch {\n return [];\n }\n }\n\n\n async cancelRun(runId: string, reason?: string): Promise<void> {\n // Find the run across all workflows\n const workflows = await readdir(this.baseDir);\n\n for (const workflow of workflows) {\n if (workflow.startsWith(\".\")) continue;\n\n const runDir = this.paths.getRunDir(workflow, runId);\n\n try {\n await access(runDir);\n } catch {\n continue;\n }\n\n // Found the run, load events and get created time\n const events = await this.loadEvents(workflow, runId, { category: \"workflow\" });\n if (events.length === 0) continue;\n\n const state = projectRunStateFromEvents(events, workflow);\n\n // Calculate duration\n const duration = getMicrosecondTimestamp() - state.createdAt;\n\n // Count completed steps\n const stepRecords = await this.loadRun(workflow, runId);\n const completedSteps = stepRecords.filter((r) => r.status === \"completed\").length;\n\n // Emit WorkflowCancelled event (this IS the cancellation)\n await this.saveWorkflowCancelled(workflow, runId, {\n workflowAttemptNumber: state.workflowAttemptNumber || 1,\n reason,\n duration,\n completedSteps,\n });\n\n return;\n }\n }\n\n async getRun(runId: string): Promise<RunState | null> {\n try {\n // Search all workflow directories\n const workflows = await readdir(this.baseDir);\n\n for (const workflowSlug of workflows) {\n if (workflowSlug.startsWith(\".\")) continue;\n\n const runDir = this.paths.getRunDir(workflowSlug, runId);\n\n try {\n await access(runDir);\n } catch {\n continue;\n }\n\n // Found the run, project state from events\n const events = await this.loadEvents(workflowSlug, runId, { category: \"workflow\" });\n\n if (events.length === 0) return null;\n\n return projectRunStateFromEvents(events, workflowSlug);\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n\n // ============================================================================\n // Step-Level Distribution Methods\n // ============================================================================\n\n async listActiveWorkflows(): Promise<string[]> {\n const activeWorkflows: string[] = [];\n\n try {\n // Scan all workflow directories\n const workflows = await readdir(this.baseDir);\n\n for (const workflowSlug of workflows) {\n if (workflowSlug.startsWith(\".\")) continue;\n\n const workflowDir = join(this.baseDir, workflowSlug);\n const runDirs = await readdir(workflowDir);\n\n // Check if any run is in a non-terminal state\n for (const runId of runDirs) {\n try {\n const workflowEvents = await this.loadEvents(workflowSlug, runId, { category: \"workflow\" });\n\n if (workflowEvents.length === 0) continue;\n\n const runState = projectRunStateFromEvents(workflowEvents, workflowSlug);\n\n // Non-terminal states: pending, claimed, running\n if (runState.status === \"pending\" || runState.status === \"claimed\" || runState.status === \"running\") {\n activeWorkflows.push(workflowSlug);\n break; // Found active run, move to next workflow\n }\n } catch {\n continue;\n }\n }\n }\n\n return Array.from(new Set(activeWorkflows)); // Remove duplicates\n } catch {\n return [];\n }\n }\n\n async listScheduledSteps(options?: {\n availableBefore?: number;\n workflowSlug?: string;\n limit?: number;\n }): Promise<Array<{ workflowSlug: string; runId: string; stepId: string }>> {\n const now = getMicrosecondTimestamp();\n const availableBefore = options?.availableBefore || now;\n const scheduledSteps: Array<{ workflowSlug: string; runId: string; stepId: string; availableAt: number }> = [];\n\n try {\n // Scan all workflow directories\n const workflows = await readdir(this.baseDir);\n\n for (const workflowSlug of workflows) {\n if (workflowSlug.startsWith(\".\")) continue;\n if (options?.workflowSlug && workflowSlug !== options.workflowSlug) continue;\n\n const workflowDir = join(this.baseDir, workflowSlug);\n const runDirs = await readdir(workflowDir);\n\n for (const runId of runDirs) {\n try {\n const stepEventsDir = this.paths.getStepEventsDir(workflowSlug, runId);\n\n // Check if step-events directory exists\n try {\n await access(stepEventsDir);\n } catch {\n continue; // No step events yet\n }\n\n // Get all step IDs by recursively scanning event files\n // This supports nested step structure (e.g., step-events/data-processing/extract/)\n const stepIds = await this.discoverStepIdsFromEvents(stepEventsDir);\n\n // For each unique step, load events and check if scheduled\n for (const stepId of stepIds) {\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n\n if (events.length === 0) continue;\n\n const state = projectStepState(events as StepEvent[], workflowSlug);\n\n // Only include steps that are scheduled and available\n if (state.status === \"scheduled\" && state.availableAt && state.availableAt <= availableBefore) {\n scheduledSteps.push({\n workflowSlug,\n runId,\n stepId,\n availableAt: state.availableAt,\n });\n }\n }\n } catch {\n continue;\n }\n }\n }\n\n // Sort by availableAt (earliest first)\n scheduledSteps.sort((a, b) => a.availableAt - b.availableAt);\n\n // Apply limit\n const limited = options?.limit ? scheduledSteps.slice(0, options.limit) : scheduledSteps;\n\n // Return without availableAt field\n return limited.map(({ workflowSlug, runId, stepId }) => ({ workflowSlug, runId, stepId }));\n } catch {\n return [];\n }\n }\n\n async isStepClaimable(\n workflowSlug: string,\n runId: string,\n stepId: string\n ): Promise<boolean> {\n try {\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n\n if (events.length === 0) return false;\n\n const state = projectStepState(events as StepEvent[], workflowSlug);\n const now = getMicrosecondTimestamp();\n\n return state.status === \"scheduled\" &&\n state.availableAt !== undefined &&\n state.availableAt <= now;\n } catch {\n return false;\n }\n }\n\n async claimScheduledStep(\n workflowSlug: string,\n runId: string,\n stepId: string,\n workerId: string,\n metadata: StepStartMetadata\n ): Promise<{ attemptNumber: number } | null> {\n const initialEvents = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n\n if (initialEvents.length === 0) {\n return null;\n }\n\n const now = getMicrosecondTimestamp();\n const initialState = projectStepState(initialEvents as StepEvent[], workflowSlug);\n\n if (\n initialState.status !== \"scheduled\" ||\n initialState.availableAt === undefined ||\n initialState.availableAt > now\n ) {\n return null;\n }\n\n const attemptNumber = initialState.attemptNumber;\n const lockPath = this.paths.getStepClaimLockPath(workflowSlug, runId, stepId, attemptNumber);\n await mkdir(dirname(lockPath), { recursive: true });\n\n let lockHandle: FileHandle | null = null;\n try {\n lockHandle = await openFile(lockPath, \"wx\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n return null;\n }\n throw error;\n }\n\n try {\n const currentEvents = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n\n if (currentEvents.length === 0) {\n return null;\n }\n\n const currentState = projectStepState(currentEvents as StepEvent[], workflowSlug);\n const claimable =\n currentState.status === \"scheduled\" &&\n currentState.availableAt !== undefined &&\n currentState.availableAt <= getMicrosecondTimestamp() &&\n currentState.attemptNumber === attemptNumber;\n\n if (!claimable) {\n return null;\n }\n\n const timestamp = getMicrosecondTimestamp();\n\n const event: StepStartedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n stepId,\n type: \"StepStarted\",\n workerId,\n dependencies: metadata.dependencies,\n attemptNumber,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n\n return { attemptNumber };\n } finally {\n if (lockHandle) {\n try {\n await lockHandle.close();\n } catch {\n // ignore close errors\n }\n try {\n await unlink(lockPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n }\n }\n\n async reclaimStaleSteps(\n staleThreshold: number,\n reclaimedBy: string\n ): Promise<Array<{ workflowSlug: string; runId: string; stepId: string }>> {\n const reclaimed: Array<{ workflowSlug: string; runId: string; stepId: string }> = [];\n const now = getMicrosecondTimestamp();\n\n try {\n // Scan all workflow directories\n const workflows = await readdir(this.baseDir);\n\n for (const workflowSlug of workflows) {\n if (workflowSlug.startsWith(\".\")) continue;\n\n const workflowDir = join(this.baseDir, workflowSlug);\n const runDirs = await readdir(workflowDir);\n\n for (const runId of runDirs) {\n try {\n const stepEventsDir = this.paths.getStepEventsDir(workflowSlug, runId);\n\n // Check if step-events directory exists\n try {\n await access(stepEventsDir);\n } catch {\n continue;\n }\n\n // Get all step IDs by recursively scanning event files\n // This supports nested step structure (e.g., step-events/data-processing/extract/)\n const stepIds = await this.discoverStepIdsFromEvents(stepEventsDir);\n\n // Check each step for stale heartbeat\n for (const stepId of stepIds) {\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n\n if (events.length === 0) continue;\n\n const state = projectStepState(events as StepEvent[], workflowSlug);\n\n // Only reclaim running steps\n if (state.status !== \"running\") continue;\n\n // Check if heartbeat is stale\n const lastHeartbeat = state.lastHeartbeat || state.startTime || 0;\n const staleDuration = now - lastHeartbeat;\n\n if (staleDuration > staleThreshold) {\n // Emit StepReclaimed event\n await this.saveStepReclaimed(workflowSlug, runId, stepId, {\n originalWorkerId: state.claimedBy || \"unknown\",\n reclaimedBy,\n lastHeartbeat,\n staleThreshold,\n staleDuration,\n attemptNumber: state.attemptNumber,\n });\n\n // Re-schedule the step with incremented attempt number\n await this.saveStepScheduled(workflowSlug, runId, stepId, {\n availableAt: now, // Immediately available\n reason: \"retry\",\n attemptNumber: state.attemptNumber + 1, // Increment attempt - reclamation is a new attempt\n retryDelayMs: 0,\n });\n\n reclaimed.push({ workflowSlug, runId, stepId });\n }\n }\n } catch {\n continue;\n }\n }\n }\n\n return reclaimed;\n } catch {\n return reclaimed;\n }\n }\n\n // ============================================================================\n // Workflow Discovery Methods\n // ============================================================================\n\n /**\n * List all available workflows\n */\n // ============================================================================\n // Workflow Registration Methods\n // ============================================================================\n\n /**\n * Register a workflow with the backend\n */\n async registerWorkflow(registration: WorkflowRegistration): Promise<void> {\n const registryDir = this.paths.getWorkflowRegistryDir(registration.slug);\n\n try {\n // Create registry directory\n await mkdir(registryDir, { recursive: true });\n\n // Store metadata\n const metadataPath = join(registryDir, \"metadata.json\");\n const metadata: WorkflowMetadata = {\n slug: registration.slug,\n name: registration.name,\n location: registration.location,\n inputSchemaJSON: registration.inputSchemaJSON,\n };\n await writeFile(metadataPath, JSON.stringify(metadata, null, 2), \"utf-8\");\n\n // Store steps\n const stepsPath = join(registryDir, \"steps.json\");\n await writeFile(stepsPath, JSON.stringify(registration.steps, null, 2), \"utf-8\");\n } catch (error) {\n console.error(`Failed to register workflow ${registration.slug}:`, error);\n throw new Error(`Failed to register workflow: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get metadata for a specific workflow\n */\n async getWorkflowMetadata(slug: string): Promise<WorkflowMetadata | null> {\n const metadataPath = join(this.paths.getWorkflowRegistryDir(slug), \"metadata.json\");\n\n try {\n const content = await readFile(metadataPath, \"utf-8\");\n return JSON.parse(content) as WorkflowMetadata;\n } catch (error) {\n if (error && typeof error === 'object' && 'code' in error && error.code === \"ENOENT\") {\n return null;\n }\n console.error(`Failed to get workflow metadata for ${slug}:`, error);\n throw new Error(`Failed to load workflow metadata: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * List all registered workflows\n */\n async listWorkflowMetadata(): Promise<WorkflowMetadata[]> {\n const registryDir = this.paths.getRegistryDir();\n\n try {\n // Check if registry exists\n try {\n await access(registryDir);\n } catch {\n // Registry doesn't exist yet\n return [];\n }\n\n const entries = await readdir(registryDir, { withFileTypes: true });\n const workflows: WorkflowMetadata[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const metadata = await this.getWorkflowMetadata(entry.name);\n if (metadata) {\n workflows.push(metadata);\n }\n }\n }\n\n return workflows;\n } catch (error) {\n console.error('Failed to list workflows:', error);\n throw new Error(`Failed to list workflows: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get step definitions for a workflow\n */\n async getWorkflowSteps(slug: string): Promise<StepDefinition[]> {\n const stepsPath = join(this.paths.getWorkflowRegistryDir(slug), \"steps.json\");\n\n try {\n const content = await readFile(stepsPath, \"utf-8\");\n return JSON.parse(content) as StepDefinition[];\n } catch (error) {\n if (error && typeof error === 'object' && 'code' in error && error.code === \"ENOENT\") {\n return [];\n }\n console.error(`Failed to get workflow steps for ${slug}:`, error);\n throw new Error(`Failed to load workflow steps: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * List all run IDs for a workflow\n */\n async listRunIds(workflowSlug: string): Promise<string[]> {\n const workflowDir = join(this.baseDir, workflowSlug);\n\n try {\n // Check if workflow directory exists\n try {\n await access(workflowDir);\n } catch {\n // Workflow has no runs yet\n return [];\n }\n\n const entries = await readdir(workflowDir, { withFileTypes: true });\n const runIds: string[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name !== \".registry\") {\n runIds.push(entry.name);\n }\n }\n\n return runIds;\n } catch (error) {\n console.error(`Failed to list run IDs for workflow ${workflowSlug}:`, error);\n throw new Error(`Failed to list run IDs: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n // ============================================================================\n // Workflow Version Management Methods\n // ============================================================================\n\n /**\n * Create or update a workflow version\n */\n async createWorkflowVersion(version: Omit<WorkflowVersion, 'versionNumber'>): Promise<void> {\n const versionDir = join(\n this.paths.getWorkflowRegistryDir(version.workflowSlug),\n \"versions\",\n version.versionId\n );\n\n try {\n // Create version directory\n await mkdir(versionDir, { recursive: true });\n\n // Store version metadata\n const versionPath = join(versionDir, \"version.json\");\n\n // Check if version already exists (idempotent)\n try {\n await access(versionPath);\n // Version already exists, skip writing\n return;\n } catch {\n // Version doesn't exist, write it\n }\n\n await writeFile(versionPath, JSON.stringify(version, null, 2), \"utf-8\");\n } catch (error) {\n console.error(`Failed to create workflow version ${version.versionId}:`, error);\n throw new Error(`Failed to create workflow version: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Helper method to load all versions and compute version numbers\n * Version numbers are computed based on chronological order (oldest = 1, newest = N)\n */\n private async loadAllVersionsWithNumbers(workflowSlug: string): Promise<WorkflowVersion[]> {\n const versionsDir = join(\n this.paths.getWorkflowRegistryDir(workflowSlug),\n \"versions\"\n );\n\n try {\n await access(versionsDir);\n } catch {\n return [];\n }\n\n const entries = await readdir(versionsDir, { withFileTypes: true });\n const versions: Array<Omit<WorkflowVersion, 'versionNumber'> & { versionNumber?: number }> = [];\n\n // Load all version files\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const versionPath = join(versionsDir, entry.name, \"version.json\");\n try {\n const content = await readFile(versionPath, \"utf-8\");\n const parsed = JSON.parse(content);\n versions.push(parsed);\n } catch {\n // Skip invalid versions\n continue;\n }\n }\n }\n\n // Sort by createdAt ascending (oldest first)\n versions.sort((a, b) => a.createdAt - b.createdAt);\n\n // Assign version numbers (1 = oldest, N = newest)\n const versionsWithNumbers = versions.map((version, index) => ({\n ...version,\n versionNumber: index + 1,\n }));\n\n // Validate all versions with schema\n return versionsWithNumbers.map(v => WorkflowVersionSchema.parse(v));\n }\n\n /**\n * Get a specific workflow version by ID\n */\n async getWorkflowVersion(workflowSlug: string, versionId: string): Promise<WorkflowVersion | null> {\n try {\n const versions = await this.loadAllVersionsWithNumbers(workflowSlug);\n return versions.find(v => v.versionId === versionId) ?? null;\n } catch (error) {\n console.error(`Failed to get workflow version ${versionId}:`, error);\n throw new Error(`Failed to load workflow version: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get the most recent workflow version\n */\n async getCurrentWorkflowVersion(workflowSlug: string): Promise<WorkflowVersion | null> {\n try {\n const versions = await this.loadAllVersionsWithNumbers(workflowSlug);\n // Return the last element (newest version, highest version number)\n return versions[versions.length - 1] ?? null;\n } catch (error) {\n console.error(`Failed to get current workflow version for ${workflowSlug}:`, error);\n throw new Error(`Failed to get current workflow version: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * List all versions for a workflow\n */\n async listWorkflowVersions(workflowSlug: string, options?: { limit?: number }): Promise<WorkflowVersion[]> {\n try {\n const versions = await this.loadAllVersionsWithNumbers(workflowSlug);\n\n // Apply limit if specified\n const limit = options?.limit ?? versions.length;\n return versions.slice(0, limit);\n } catch (error) {\n console.error(`Failed to list workflow versions for ${workflowSlug}:`, error);\n throw new Error(`Failed to list workflow versions: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Close the backend and clean up resources\n * For filesystem backend, this is a no-op as there are no persistent connections\n */\n async close(): Promise<void> {\n // No cleanup needed for filesystem backend\n }\n\n // ============================================================================\n // Analytics Methods\n // ============================================================================\n\n /**\n * Helper to load all events within a time range and optional filters\n */\n private async loadEventsForAnalytics(\n options?: AnalyticsOptions\n ): Promise<{ stepEvents: StepEvent[]; workflowEvents: WorkflowEvent[] }> {\n const now = getMicrosecondTimestamp();\n const startUs = options?.startUs ?? now - 24 * 60 * 60 * 1000 * 1000; // Default: 24 hours ago\n const endUs = options?.endUs ?? now;\n\n const allStepEvents: StepEvent[] = [];\n const allWorkflowEvents: WorkflowEvent[] = [];\n\n // Determine which workflows to scan\n const workflowsToScan: string[] = [];\n if (options?.workflowSlug) {\n workflowsToScan.push(options.workflowSlug);\n } else {\n // Scan all workflows\n try {\n const entries = await readdir(this.baseDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name !== \".registry\") {\n workflowsToScan.push(entry.name);\n }\n }\n } catch (error) {\n // baseDir doesn't exist yet, no workflows\n return { stepEvents: [], workflowEvents: [] };\n }\n }\n\n // Load events from each workflow\n for (const workflowSlug of workflowsToScan) {\n const runIds = options?.runIds ?? (await this.listRunIds(workflowSlug));\n\n for (const runId of runIds) {\n try {\n // Load step events\n const stepEvents = await this.loadEvents(workflowSlug, runId, {\n category: \"step\",\n stepId: options?.stepId,\n });\n\n // Filter by time range\n const filteredStepEvents = stepEvents.filter(\n (e) => e.timestampUs >= startUs && e.timestampUs <= endUs\n );\n allStepEvents.push(...filteredStepEvents);\n\n // Load workflow events (unless filtering by stepId)\n if (!options?.stepId) {\n const workflowEvents = await this.loadEvents(workflowSlug, runId, {\n category: \"workflow\",\n });\n\n const filteredWorkflowEvents = workflowEvents.filter(\n (e) => e.timestampUs >= startUs && e.timestampUs <= endUs\n );\n allWorkflowEvents.push(...filteredWorkflowEvents);\n }\n } catch (error) {\n // Skip runs that don't exist or have errors\n continue;\n }\n }\n }\n\n return { stepEvents: allStepEvents, workflowEvents: allWorkflowEvents };\n }\n\n async getErrorAnalysis(options?: AnalyticsOptions): Promise<ErrorAnalysis> {\n const { stepEvents } = await this.loadEventsForAnalytics(options);\n return computeErrorAnalysis(\n stepEvents,\n options?.workflowSlug,\n options?.stepId\n );\n }\n\n async getErrorsList(options?: {\n timeRange?: { start: number; end: number };\n workflowSlug?: string;\n groupingStrategy?: 'exact' | 'normalized' | 'portable';\n limit?: number;\n offset?: number;\n }): Promise<{\n errors: Array<{\n fingerprint: string;\n errorMessage: string;\n errorName: string;\n sampleStack: string;\n count: number;\n affectedRuns: number;\n firstSeen: number;\n lastSeen: number;\n }>;\n total: number;\n }> {\n const { stepEvents } = await this.loadEventsForAnalytics({\n startUs: options?.timeRange?.start,\n endUs: options?.timeRange?.end,\n workflowSlug: options?.workflowSlug,\n });\n\n const strategy = options?.groupingStrategy || 'exact';\n const limit = options?.limit || 50;\n const offset = options?.offset || 0;\n\n // Filter for StepFailed events only\n const failedEvents = stepEvents.filter(\n (e): e is StepFailedEvent => e.type === 'StepFailed'\n );\n\n // Group by composable fingerprint\n const errorGroups = new Map<\n string,\n {\n errorMessage: string;\n errorName: string;\n sampleStack: string;\n count: number;\n affectedRuns: Set<string>;\n firstSeen: number;\n lastSeen: number;\n }\n >();\n\n for (const event of failedEvents) {\n // Compose fingerprint based on strategy\n const stackHash =\n strategy === 'exact'\n ? event.errorFingerprints.stackExactHash\n : strategy === 'normalized'\n ? event.errorFingerprints.stackNormalizedHash\n : event.errorFingerprints.stackPortableHash;\n\n const fingerprint = `${event.errorFingerprints.nameHash}:${event.errorFingerprints.messageHash}:${stackHash}`;\n\n const existing = errorGroups.get(fingerprint);\n if (existing) {\n existing.count++;\n existing.affectedRuns.add(event.runId);\n existing.firstSeen = Math.min(existing.firstSeen, event.timestampUs);\n existing.lastSeen = Math.max(existing.lastSeen, event.timestampUs);\n } else {\n errorGroups.set(fingerprint, {\n errorMessage: event.error.message,\n errorName: event.error.name || 'Error',\n sampleStack: event.error.stack || '',\n count: 1,\n affectedRuns: new Set([event.runId]),\n firstSeen: event.timestampUs,\n lastSeen: event.timestampUs,\n });\n }\n }\n\n // Convert to array and sort by count\n const allErrors = Array.from(errorGroups.entries()).map(([fingerprint, data]) => ({\n fingerprint,\n errorMessage: data.errorMessage,\n errorName: data.errorName,\n sampleStack: data.sampleStack,\n count: data.count,\n affectedRuns: data.affectedRuns.size,\n firstSeen: data.firstSeen,\n lastSeen: data.lastSeen,\n }));\n\n allErrors.sort((a, b) => b.count - a.count);\n\n const total = allErrors.length;\n const errors = allErrors.slice(offset, offset + limit);\n\n return { errors, total };\n }\n\n async getErrorDetail(\n fingerprint: string,\n groupingStrategy: 'exact' | 'normalized' | 'portable',\n options?: {\n timeRange?: { start: number; end: number };\n limit?: number;\n offset?: number;\n }\n ): Promise<{\n fingerprint: string;\n errorMessage: string;\n errorName: string;\n sampleStack: string;\n totalCount: number;\n affectedRuns: number;\n firstSeen: number;\n lastSeen: number;\n occurrences: Array<{\n workflowSlug: string;\n runId: string;\n stepId: string;\n attemptNumber: number;\n timestampUs: number;\n }>;\n total: number;\n }> {\n // Parse fingerprint\n const parts = fingerprint.split(':');\n if (parts.length !== 3) {\n throw new Error(`Invalid fingerprint format: ${fingerprint}`);\n }\n\n const [nameHash, messageHash, stackHash] = parts;\n\n const { stepEvents } = await this.loadEventsForAnalytics({\n startUs: options?.timeRange?.start,\n endUs: options?.timeRange?.end,\n });\n\n const limit = options?.limit || 100;\n const offset = options?.offset || 0;\n\n // Filter for matching StepFailed events\n const matchingEvents = stepEvents.filter((e): e is StepFailedEvent => {\n if (e.type !== 'StepFailed') return false;\n\n // Check if fingerprints match\n if (e.errorFingerprints.nameHash !== nameHash) return false;\n if (e.errorFingerprints.messageHash !== messageHash) return false;\n\n const eventStackHash =\n groupingStrategy === 'exact'\n ? e.errorFingerprints.stackExactHash\n : groupingStrategy === 'normalized'\n ? e.errorFingerprints.stackNormalizedHash\n : e.errorFingerprints.stackPortableHash;\n\n return eventStackHash === stackHash;\n });\n\n if (matchingEvents.length === 0) {\n return {\n fingerprint,\n errorMessage: '',\n errorName: '',\n sampleStack: '',\n totalCount: 0,\n affectedRuns: 0,\n firstSeen: 0,\n lastSeen: 0,\n occurrences: [],\n total: 0,\n };\n }\n\n // Calculate stats\n const affectedRunsSet = new Set(matchingEvents.map((e) => e.runId));\n const firstSeen = Math.min(...matchingEvents.map((e) => e.timestampUs));\n const lastSeen = Math.max(...matchingEvents.map((e) => e.timestampUs));\n\n // Sort by timestamp desc and paginate\n matchingEvents.sort((a, b) => b.timestampUs - a.timestampUs);\n const paginatedEvents = matchingEvents.slice(offset, offset + limit);\n\n const occurrences = paginatedEvents.map((e) => ({\n workflowSlug: e.workflowSlug,\n runId: e.runId,\n stepId: e.stepId,\n attemptNumber: e.attemptNumber,\n timestampUs: e.timestampUs,\n }));\n\n const sampleEvent = matchingEvents[0]!; // Safe: empty array check at line 2000\n\n return {\n fingerprint,\n errorMessage: sampleEvent.error.message,\n errorName: sampleEvent.error.name || 'Error',\n sampleStack: sampleEvent.error.stack || '',\n totalCount: matchingEvents.length,\n affectedRuns: affectedRunsSet.size,\n firstSeen,\n lastSeen,\n occurrences,\n total: matchingEvents.length,\n };\n }\n\n async getRetryAnalysis(options?: AnalyticsOptions): Promise<RetryAnalysis> {\n const { stepEvents } = await this.loadEventsForAnalytics(options);\n return computeRetryAnalysis(stepEvents);\n }\n\n async getSchedulingLatency(\n options?: AnalyticsOptions\n ): Promise<SchedulingLatency> {\n const { stepEvents } = await this.loadEventsForAnalytics(options);\n return computeSchedulingLatency(\n stepEvents,\n options?.workflowSlug,\n options?.stepId\n );\n }\n\n async getStepDuration(options?: AnalyticsOptions): Promise<StepDuration> {\n const { stepEvents } = await this.loadEventsForAnalytics(options);\n return computeStepDuration(\n stepEvents,\n options?.workflowSlug,\n options?.stepId\n );\n }\n\n async getWorkflowDuration(\n options?: AnalyticsOptions\n ): Promise<WorkflowDuration> {\n const { workflowEvents } = await this.loadEventsForAnalytics(options);\n return computeWorkflowDuration(workflowEvents, options?.workflowSlug);\n }\n\n async getWorkerStability(options?: AnalyticsOptions): Promise<WorkerStability> {\n const { stepEvents } = await this.loadEventsForAnalytics(options);\n return computeWorkerStability(stepEvents);\n }\n\n async getThroughput(options?: AnalyticsOptions): Promise<Throughput> {\n const { stepEvents, workflowEvents } = await this.loadEventsForAnalytics(options);\n\n const now = getMicrosecondTimestamp();\n const startUs = options?.startUs ?? now - 24 * 60 * 60 * 1000 * 1000;\n const endUs = options?.endUs ?? now;\n const timeRangeUs = endUs - startUs;\n\n return computeThroughput(\n stepEvents,\n workflowEvents,\n timeRangeUs,\n options?.workflowSlug\n );\n }\n\n async getQueueDepth(\n options?: Pick<AnalyticsOptions, \"workflowSlug\">\n ): Promise<QueueDepth> {\n const runs = await this.listRuns({\n workflowSlug: options?.workflowSlug,\n status: [\"pending\", \"running\"],\n });\n\n let pendingRuns = 0;\n let runningRuns = 0;\n let scheduledSteps = 0;\n let runningSteps = 0;\n let oldestScheduledStepUs: number | undefined;\n let oldestPendingRunUs: number | undefined;\n\n for (const run of runs) {\n if (run.status === \"pending\") {\n pendingRuns++;\n if (\n !oldestPendingRunUs ||\n run.createdAt < oldestPendingRunUs\n ) {\n oldestPendingRunUs = run.createdAt;\n }\n } else if (run.status === \"running\") {\n runningRuns++;\n\n // Count scheduled and running steps in this run\n try {\n const stepEvents = await this.loadEvents(\n run.workflowSlug,\n run.runId,\n { category: \"step\" }\n );\n\n // Group events by step\n const eventsByStep = new Map<string, StepEvent[]>();\n for (const event of stepEvents) {\n const events = eventsByStep.get(event.stepId) || [];\n events.push(event);\n eventsByStep.set(event.stepId, events);\n }\n\n // Project state for each step\n for (const [_stepId, events] of eventsByStep.entries()) {\n const state = projectStepState(events, run.workflowSlug);\n\n if (state.status === \"scheduled\") {\n scheduledSteps++;\n if (\n state.availableAt &&\n (!oldestScheduledStepUs || state.availableAt < oldestScheduledStepUs)\n ) {\n oldestScheduledStepUs = state.availableAt;\n }\n } else if (state.status === \"running\") {\n runningSteps++;\n }\n }\n } catch (error) {\n // Skip if can't load step events\n continue;\n }\n }\n }\n\n return {\n workflowSlug: options?.workflowSlug,\n pendingRuns,\n runningRuns,\n scheduledSteps,\n runningSteps,\n oldestScheduledStepUs,\n oldestPendingRunUs,\n };\n }\n\n async getQueueDepthByWorkflow(): Promise<QueueDepthByWorkflow> {\n const runs = await this.listRuns({ status: [\"pending\", \"running\"] });\n\n // Group runs by workflow\n const workflowMap = new Map<\n string,\n {\n pendingRuns: number;\n scheduledSteps: number;\n oldestPendingItemUs?: number;\n }\n >();\n\n for (const run of runs) {\n const existing = workflowMap.get(run.workflowSlug) || {\n pendingRuns: 0,\n scheduledSteps: 0,\n };\n\n if (run.status === \"pending\") {\n existing.pendingRuns++;\n if (\n !existing.oldestPendingItemUs ||\n run.createdAt < existing.oldestPendingItemUs\n ) {\n existing.oldestPendingItemUs = run.createdAt;\n }\n } else if (run.status === \"running\") {\n // Count scheduled steps in this run\n try {\n const stepEvents = await this.loadEvents(run.workflowSlug, run.runId, {\n category: \"step\",\n });\n\n // Group events by step\n const eventsByStep = new Map<string, StepEvent[]>();\n for (const event of stepEvents) {\n const events = eventsByStep.get(event.stepId) || [];\n events.push(event);\n eventsByStep.set(event.stepId, events);\n }\n\n // Project state for each step\n for (const [_stepId, events] of eventsByStep.entries()) {\n const state = projectStepState(events, run.workflowSlug);\n\n if (state.status === \"scheduled\") {\n existing.scheduledSteps++;\n if (\n state.availableAt &&\n (!existing.oldestPendingItemUs ||\n state.availableAt < existing.oldestPendingItemUs)\n ) {\n existing.oldestPendingItemUs = state.availableAt;\n }\n }\n }\n } catch (error) {\n // Skip if can't load step events\n continue;\n }\n }\n\n workflowMap.set(run.workflowSlug, existing);\n }\n\n // Get workflow metadata for names\n const allMetadata = await this.listWorkflowMetadata();\n const metadataMap = new Map(allMetadata.map((m) => [m.slug, m]));\n\n // Convert to array format\n const result: QueueDepthByWorkflow = Array.from(workflowMap.entries())\n .map(([workflowSlug, data]) => ({\n workflowSlug,\n workflowName: metadataMap.get(workflowSlug)?.name,\n pendingRuns: data.pendingRuns,\n scheduledSteps: data.scheduledSteps,\n oldestPendingItemUs: data.oldestPendingItemUs,\n }))\n .filter((item) => item.pendingRuns > 0 || item.scheduledSteps > 0) // Only include workflows with pending work\n .sort((a, b) => {\n // Sort by total pending work (desc)\n const aTotal = a.pendingRuns + a.scheduledSteps;\n const bTotal = b.pendingRuns + b.scheduledSteps;\n return bTotal - aTotal;\n });\n\n return result;\n }\n\n async getSuccessRate(options?: AnalyticsOptions): Promise<SuccessRate> {\n const { stepEvents, workflowEvents } = await this.loadEventsForAnalytics(options);\n return computeSuccessRate(\n stepEvents,\n workflowEvents,\n options?.workflowSlug,\n options?.stepId\n );\n }\n\n async getAnalyticsSummary(\n options?: AnalyticsOptions\n ): Promise<AnalyticsSummary> {\n const now = getMicrosecondTimestamp();\n const startUs = options?.startUs ?? now - 24 * 60 * 60 * 1000 * 1000;\n const endUs = options?.endUs ?? now;\n\n // Run all analytics in parallel\n const [\n errorAnalysis,\n retryAnalysis,\n schedulingLatency,\n stepDuration,\n workflowDuration,\n workerStability,\n throughput,\n queueDepth,\n successRate,\n ] = await Promise.all([\n this.getErrorAnalysis(options),\n this.getRetryAnalysis(options),\n this.getSchedulingLatency(options),\n this.getStepDuration(options),\n this.getWorkflowDuration(options),\n this.getWorkerStability(options),\n this.getThroughput(options),\n this.getQueueDepth(options),\n this.getSuccessRate(options),\n ]);\n\n return {\n timeRange: {\n startUs,\n endUs,\n durationUs: endUs - startUs,\n },\n errorAnalysis,\n retryAnalysis,\n schedulingLatency,\n stepDuration,\n workflowDuration,\n workerStability,\n throughput,\n queueDepth,\n successRate,\n };\n }\n}\n\n// Re-export projection functions for use by workers\nexport { projectStepState, projectRunStateFromEvents, projectStepRecord } from \"@cascade-flow/backend-interface\";\n",
5
+ "import { mkdir, writeFile, readFile, readdir, access, unlink, open as openFile } from \"node:fs/promises\";\nimport type { FileHandle } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { PathHelper } from \"./lib/paths.ts\";\nimport * as ids from \"./lib/ids.ts\";\nimport * as fileUtils from \"./lib/file-utils.ts\";\nimport {\n Backend,\n type StepStartMetadata,\n type StepCompleteMetadata,\n type StepError,\n type StepRecord,\n type LogEntry,\n type Event,\n type StepEvent,\n type WorkflowEvent,\n type StepStartedEvent,\n type StepCompletedEvent,\n type StepFailedEvent,\n type StepSkippedEvent,\n type StepScheduledEvent,\n type StepHeartbeatEvent,\n type StepReclaimedEvent,\n type StepRetryingEvent,\n type LogEntryEvent,\n type WorkflowStartedEvent,\n type WorkflowInputValidationEvent,\n type WorkflowCompletedEvent,\n type WorkflowFailedEvent,\n type WorkflowResumedEvent,\n type WorkflowCancelledEvent,\n type WorkflowRetryStartedEvent,\n type RunSubmittedEvent,\n type RunSubmission,\n type RunState,\n type WorkflowMetadata,\n type WorkflowRegistration,\n type WorkflowVersion,\n type StepDefinition,\n type AnalyticsOptions,\n type ErrorAnalysis,\n type RetryAnalysis,\n type SchedulingLatency,\n type StepDuration,\n type WorkflowDuration,\n type WorkerStability,\n type Throughput,\n type QueueDepth,\n type QueueDepthByWorkflow,\n type SuccessRate,\n type AnalyticsSummary,\n WorkflowVersionSchema,\n eventSchema,\n safeSerialize,\n projectStepRecord,\n projectStepState,\n projectRunStateFromEvents,\n extractLogsFromEvents,\n getCurrentAttemptNumber,\n getVersionIdFromEvents,\n getMicrosecondTimestamp,\n computeErrorAnalysis,\n computeRetryAnalysis,\n computeSchedulingLatency,\n computeStepDuration,\n computeWorkflowDuration,\n computeErrorFingerprints,\n computeWorkerStability,\n computeThroughput,\n computeSuccessRate,\n} from \"@cascade-flow/backend-interface\";\n\n/**\n * FileSystem backend implementation\n * Stores workflow execution state in the local filesystem using event sourcing\n *\n * Directory structure:\n * ./.runs/{workflow-slug}/{runId}/workflow-events/{timestamp}-{eventType}.json\n * ./.runs/{workflow-slug}/{runId}/step-events/{timestamp}-{stepId}-{eventType}.json\n */\nexport class FileSystemBackend extends Backend {\n private baseDir: string;\n private paths: PathHelper;\n\n /**\n * Create a new FileSystem backend\n *\n * @param baseDir - Base directory for storing runs (defaults to \"./.runs\")\n */\n constructor(baseDir: string = \"./.runs\") {\n super();\n this.baseDir = baseDir;\n this.paths = new PathHelper(baseDir);\n }\n\n /**\n * Initialize the backend (no-op for filesystem - directories created as needed)\n */\n async initialize(): Promise<void> {\n // No initialization needed - directories are created on-demand\n }\n\n async backendReady(): Promise<boolean> {\n return true;\n }\n\n public getStepOutputPath(workflowSlug: string, runId: string, stepId: string, attemptNumber: number): string {\n return this.paths.getStepOutputPath(workflowSlug, runId, stepId, attemptNumber);\n }\n\n async initializeRun(workflowSlug: string, runId: string): Promise<void> {\n const workflowEventsDir = this.paths.getWorkflowEventsDir(workflowSlug, runId);\n const stepEventsDir = this.paths.getStepEventsDir(workflowSlug, runId);\n await mkdir(workflowEventsDir, { recursive: true });\n await mkdir(stepEventsDir, { recursive: true });\n }\n\n async appendEvent(workflowSlug: string, runId: string, event: Event): Promise<void> {\n // Ensure event has ID and timestamp if not provided\n if (!event.eventId) {\n (event as any).eventId = ids.generateEventId();\n }\n if (!event.timestampUs) {\n (event as any).timestampUs = getMicrosecondTimestamp();\n }\n\n // Validate event\n eventSchema.parse(event);\n\n // Determine directory and filename based on event category\n // For step events, create nested directories based on stepId\n const eventsDir =\n event.category === \"workflow\"\n ? this.paths.getWorkflowEventsDir(workflowSlug, runId)\n : this.paths.getStepEventDir(workflowSlug, runId, (event as StepEvent).stepId);\n\n const getFilename = (evt: Event): string => {\n if (evt.category === \"workflow\") {\n return fileUtils.getWorkflowEventFilename(evt as WorkflowEvent);\n } else {\n return fileUtils.getStepEventFilename(evt as StepEvent);\n }\n };\n\n await mkdir(eventsDir, { recursive: true });\n\n // Handle timestamp collisions by incrementing the timestamp\n let timestamp = parseInt(event.eventId);\n let filename = getFilename(event);\n let filePath = join(eventsDir, filename);\n\n // Check for collision and increment timestamp until we find a unique one\n while (true) {\n try {\n await access(filePath);\n // File exists, increment timestamp and try again\n timestamp++;\n (event as any).eventId = `${timestamp}`;\n (event as any).timestampUs = timestamp;\n filename = getFilename(event);\n filePath = join(eventsDir, filename);\n } catch {\n // File doesn't exist, we can use this timestamp\n break;\n }\n }\n\n await fileUtils.writeJsonAtomic(filePath, event);\n }\n\n async loadEvents(\n workflowSlug: string,\n runId: string,\n options: { category: \"step\"; stepId?: string }\n ): Promise<StepEvent[]>;\n async loadEvents(\n workflowSlug: string,\n runId: string,\n options: { category: \"workflow\" }\n ): Promise<WorkflowEvent[]>;\n async loadEvents(\n workflowSlug: string,\n runId: string,\n options?: { category?: \"workflow\" | \"step\"; stepId?: string }\n ): Promise<Event[]>;\n async loadEvents(\n workflowSlug: string,\n runId: string,\n options?: { category?: \"workflow\" | \"step\"; stepId?: string }\n ): Promise<Event[]> {\n try {\n const events: Event[] = [];\n\n // Determine which directories to read from\n const directories: Array<{ dir: string; category: \"workflow\" | \"step\" }> = [];\n\n if (!options?.category || options.category === \"workflow\") {\n directories.push({\n dir: this.paths.getWorkflowEventsDir(workflowSlug, runId),\n category: \"workflow\",\n });\n }\n\n if (!options?.category || options.category === \"step\") {\n directories.push({\n dir: this.paths.getStepEventsDir(workflowSlug, runId),\n category: \"step\",\n });\n }\n\n // Load events from each directory (recursively for step events to support nested structure)\n for (const { dir, category } of directories) {\n try {\n // For step events, recursively load from nested directories\n if (category === \"step\") {\n await this.loadEventsRecursive(dir, events, options?.stepId);\n } else {\n // For workflow events, load from flat directory\n const files = await readdir(dir);\n const eventFiles = files.filter((f) => f.endsWith(\".json\"));\n\n for (const file of eventFiles) {\n const content = await readFile(join(dir, file), \"utf-8\");\n const event = eventSchema.parse(JSON.parse(content));\n events.push(event);\n }\n }\n } catch (err) {\n // Directory might not exist yet, continue with other directories\n continue;\n }\n }\n\n // Sort events by timestamp, then by eventId for deterministic ordering\n events.sort((a, b) => {\n if (a.timestampUs !== b.timestampUs) {\n return a.timestampUs - b.timestampUs;\n }\n return a.eventId.localeCompare(b.eventId);\n });\n\n return events;\n } catch {\n return [];\n }\n }\n\n /**\n * Recursively load events from a directory and its subdirectories\n * Supports nested step event structure\n */\n private async loadEventsRecursive(\n dir: string,\n events: Event[],\n stepIdFilter?: string\n ): Promise<void> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Recurse into subdirectory\n await this.loadEventsRecursive(fullPath, events, stepIdFilter);\n } else if (entry.name.endsWith(\".json\")) {\n // Load and parse event file\n const content = await readFile(fullPath, \"utf-8\");\n const event = eventSchema.parse(JSON.parse(content));\n\n // Apply stepId filter if provided\n if (stepIdFilter) {\n if (event.category === \"step\" && event.stepId === stepIdFilter) {\n events.push(event);\n }\n } else {\n events.push(event);\n }\n }\n }\n } catch (err) {\n // Directory might not exist or be inaccessible, silently continue\n }\n }\n\n async loadStepEventsForProjection(\n workflowSlug: string,\n runId: string\n ): Promise<Map<string, StepEvent[]>> {\n const eventsByStep = new Map<string, StepEvent[]>();\n\n // Event types to exclude (don't affect state projection)\n const excludedTypes = new Set([\"LogEntry\", \"StepHeartbeat\", \"StepRetrying\"]);\n\n try {\n const events: Event[] = [];\n const stepEventsDir = this.paths.getStepEventsDir(workflowSlug, runId);\n await this.loadEventsRecursive(stepEventsDir, events);\n\n // Group by stepId, excluding high-volume types that don't affect status\n for (const event of events) {\n if (event.category === \"step\" && !excludedTypes.has(event.type)) {\n const stepEvent = event as StepEvent;\n if (!eventsByStep.has(stepEvent.stepId)) {\n eventsByStep.set(stepEvent.stepId, []);\n }\n eventsByStep.get(stepEvent.stepId)!.push(stepEvent);\n }\n }\n\n // Sort each step's events by timestamp\n for (const [, stepEvents] of eventsByStep) {\n stepEvents.sort((a, b) => {\n if (a.timestampUs !== b.timestampUs) {\n return a.timestampUs - b.timestampUs;\n }\n return a.eventId.localeCompare(b.eventId);\n });\n }\n } catch {\n // Directory might not exist, return empty map\n }\n\n return eventsByStep;\n }\n\n async copyEntireRun(\n workflowSlug: string,\n sourceRunId: string,\n targetRunId: string\n ): Promise<void> {\n const sourceDir = this.paths.getRunDir(workflowSlug, sourceRunId);\n const targetDir = this.paths.getRunDir(workflowSlug, targetRunId);\n\n // Create target run directory\n await mkdir(targetDir, { recursive: true });\n\n try {\n // Copy all events with runId replacement\n await this.copyEventsRecursive(sourceDir, targetDir, sourceRunId, targetRunId);\n } catch (error) {\n // Rollback: delete target directory on failure\n try {\n await fileUtils.rm(targetDir, { recursive: true, force: true });\n } catch {}\n throw error;\n }\n }\n\n private async copyEventsRecursive(\n sourceDir: string,\n targetDir: string,\n sourceRunId: string,\n targetRunId: string\n ): Promise<void> {\n const entries = await readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = join(sourceDir, entry.name);\n const targetPath = join(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n // Create directory and recurse\n await mkdir(targetPath, { recursive: true });\n await this.copyEventsRecursive(sourcePath, targetPath, sourceRunId, targetRunId);\n } else if (entry.name.endsWith(\".json\")) {\n // Copy event file with runId replacement\n const content = await readFile(sourcePath, \"utf-8\");\n const event = JSON.parse(content);\n\n // Update runId and generate new eventId\n event.runId = targetRunId;\n event.eventId = ids.generateEventId(event.timestampUs);\n\n // Write to target\n await writeFile(targetPath, JSON.stringify(event, null, 2), \"utf-8\");\n }\n }\n }\n\n async deleteStepEvents(\n workflowSlug: string,\n runId: string,\n stepIds: Set<string>\n ): Promise<void> {\n const stepEventsDir = this.paths.getStepEventsDir(workflowSlug, runId);\n\n // Delete event files for each step ID (handle nested structure)\n for (const stepId of stepIds) {\n await this.deleteStepEventsRecursive(stepEventsDir, stepId);\n }\n }\n\n private async deleteStepEventsRecursive(\n stepEventsDir: string,\n stepId: string\n ): Promise<void> {\n // For nested steps, navigate to the parent directory\n const stepParts = stepId.split(\"/\");\n const eventDir = stepParts.length > 1\n ? join(stepEventsDir, ...stepParts.slice(0, -1))\n : stepEventsDir;\n\n try {\n const entries = await readdir(eventDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(eventDir, entry.name);\n\n if (entry.isFile() && entry.name.endsWith(\".json\")) {\n // Check if this event file belongs to our step\n const content = await readFile(fullPath, \"utf-8\");\n const event = JSON.parse(content);\n\n if (event.category === \"step\" && event.stepId === stepId) {\n await unlink(fullPath);\n }\n }\n }\n } catch (error) {\n // Directory might not exist, silently continue\n }\n }\n\n async deleteWorkflowTerminalEvents(\n workflowSlug: string,\n runId: string\n ): Promise<void> {\n const workflowEventsDir = this.paths.getWorkflowEventsDir(workflowSlug, runId);\n\n try {\n const entries = await readdir(workflowEventsDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".json\")) {\n // Check if this is a terminal event\n if (\n entry.name.includes(\"-WorkflowCompleted.json\") ||\n entry.name.includes(\"-WorkflowFailed.json\") ||\n entry.name.includes(\"-WorkflowCancelled.json\")\n ) {\n await unlink(join(workflowEventsDir, entry.name));\n }\n }\n }\n } catch (error) {\n // Directory might not exist, silently continue\n }\n }\n\n async copyWorkflowEvents(\n workflowSlug: string,\n sourceRunId: string,\n targetRunId: string,\n excludeTerminal: boolean\n ): Promise<void> {\n const sourceDir = this.paths.getWorkflowEventsDir(workflowSlug, sourceRunId);\n const targetDir = this.paths.getWorkflowEventsDir(workflowSlug, targetRunId);\n\n await mkdir(targetDir, { recursive: true });\n\n try {\n const entries = await readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".json\")) {\n // Skip terminal events if requested\n if (excludeTerminal && (\n entry.name.includes(\"-WorkflowCompleted.json\") ||\n entry.name.includes(\"-WorkflowFailed.json\") ||\n entry.name.includes(\"-WorkflowCancelled.json\")\n )) {\n continue;\n }\n\n const sourcePath = join(sourceDir, entry.name);\n const content = await readFile(sourcePath, \"utf-8\");\n const event = JSON.parse(content);\n\n // Update runId and generate new eventId\n event.runId = targetRunId;\n event.eventId = ids.generateEventId(event.timestampUs);\n\n const targetPath = join(targetDir, entry.name);\n await writeFile(targetPath, JSON.stringify(event, null, 2), \"utf-8\");\n }\n }\n } catch (error) {\n // Directory might not exist, silently continue\n }\n }\n\n async copyStepEvents(\n workflowSlug: string,\n sourceRunId: string,\n targetRunId: string,\n includeStepIds: Set<string>\n ): Promise<void> {\n const sourceDir = this.paths.getStepEventsDir(workflowSlug, sourceRunId);\n const targetDir = this.paths.getStepEventsDir(workflowSlug, targetRunId);\n\n await mkdir(targetDir, { recursive: true });\n\n await this.copyStepEventsRecursive(sourceDir, targetDir, sourceRunId, targetRunId, includeStepIds);\n }\n\n private async copyStepEventsRecursive(\n sourceDir: string,\n targetDir: string,\n sourceRunId: string,\n targetRunId: string,\n includeStepIds: Set<string>\n ): Promise<void> {\n try {\n const entries = await readdir(sourceDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const sourcePath = join(sourceDir, entry.name);\n const targetPath = join(targetDir, entry.name);\n\n if (entry.isDirectory()) {\n // Create directory and recurse\n await mkdir(targetPath, { recursive: true });\n await this.copyStepEventsRecursive(sourcePath, targetPath, sourceRunId, targetRunId, includeStepIds);\n } else if (entry.name.endsWith(\".json\")) {\n // Read event to check if it's for an included step\n const content = await readFile(sourcePath, \"utf-8\");\n const event = JSON.parse(content);\n\n if (event.category === \"step\" && includeStepIds.has(event.stepId)) {\n // Update runId and generate new eventId\n event.runId = targetRunId;\n event.eventId = ids.generateEventId(event.timestampUs);\n\n await writeFile(targetPath, JSON.stringify(event, null, 2), \"utf-8\");\n }\n }\n }\n } catch (error) {\n // Directory might not exist, silently continue\n }\n }\n\n async rerunFrom(params: {\n parentRunId: string;\n fromStepId: string;\n input?: unknown;\n }): Promise<{\n runId: string;\n }> {\n // Get parent run to extract workflow slug\n const parentRun = await this.getRun(params.parentRunId);\n if (!parentRun) {\n throw new Error(`Parent run \"${params.parentRunId}\" not found`);\n }\n\n // Calculate excluded steps from workflow metadata (authoritative source)\n const dependents = await this.calculateDependents(\n parentRun.workflowSlug,\n params.fromStepId\n );\n const rerunStepIds = new Set<string>([params.fromStepId, ...dependents]);\n\n // Generate new run ID\n const newRunId = getMicrosecondTimestamp().toString();\n\n // Copy entire run (atomic operation with rollback on failure)\n await this.copyEntireRun(parentRun.workflowSlug, params.parentRunId, newRunId);\n\n // Delete events for steps that will be re-executed\n await this.deleteStepEvents(parentRun.workflowSlug, newRunId, rerunStepIds);\n\n // Delete terminal workflow events to reset workflow to running state\n // This allows workers to pick up the scheduled steps\n await this.deleteWorkflowTerminalEvents(parentRun.workflowSlug, newRunId);\n\n // Get current workflow version for the rerun\n const currentVersion = await this.getCurrentWorkflowVersion(parentRun.workflowSlug);\n if (!currentVersion) {\n throw new Error(`Workflow ${parentRun.workflowSlug} not registered. Please ensure the worker has started and registered workflows.`);\n }\n\n // Get parent run's version from its WorkflowStarted event\n const parentWorkflowEvents = await this.loadEvents(parentRun.workflowSlug, params.parentRunId, {\n category: \"workflow\",\n }) as WorkflowEvent[];\n const parentVersionId = getVersionIdFromEvents(parentWorkflowEvents);\n\n // Emit WorkflowRerunFromStep event to track rerun metadata\n const timestamp = getMicrosecondTimestamp();\n await this.appendEvent(parentRun.workflowSlug, newRunId, {\n category: \"workflow\",\n type: \"WorkflowRerunFromStep\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug: parentRun.workflowSlug,\n runId: newRunId,\n parentRunId: params.parentRunId,\n rerunFromStepId: params.fromStepId,\n rerunStepIds: Array.from(rerunStepIds),\n versionId: currentVersion.versionId,\n parentVersionId,\n });\n\n // Submit to queue for worker execution (no workflow discovery needed!)\n // The worker will see the copied events and resume from where parent left off\n await this.submitRun({\n workflowSlug: parentRun.workflowSlug,\n runId: newRunId,\n input: params.input,\n });\n\n return {\n runId: newRunId,\n };\n }\n\n /**\n * Recursively discover all unique step IDs from step events directory\n * Supports nested step structure by reading actual event files\n *\n * @param stepEventsDir - Root step-events directory to scan\n * @returns Set of all discovered step IDs\n */\n private async discoverStepIdsFromEvents(\n stepEventsDir: string\n ): Promise<Set<string>> {\n const stepIds = new Set<string>();\n\n const scanDirectory = async (dir: string): Promise<void> => {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n // Recurse into subdirectory\n await scanDirectory(fullPath);\n } else if (entry.name.endsWith(\".json\")) {\n // Read event file to get stepId\n try {\n const content = await readFile(fullPath, \"utf-8\");\n const event = JSON.parse(content);\n\n // Only process step events (workflow events don't have stepId)\n if (event.category === \"step\" && event.stepId) {\n stepIds.add(event.stepId);\n }\n } catch {\n // Skip invalid/unparseable event files\n continue;\n }\n }\n }\n } catch {\n // Directory might not exist or be inaccessible, silently continue\n }\n };\n\n await scanDirectory(stepEventsDir);\n return stepIds;\n }\n\n async saveStepStart(\n workflowSlug: string,\n runId: string,\n stepId: string,\n workerId: string,\n metadata: StepStartMetadata\n ): Promise<void> {\n // Get current attempt number by counting previous StepStarted events\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n const attemptNumber = getCurrentAttemptNumber(events) + 1;\n\n // Use high-resolution timestamp instead of metadata timestamp\n const timestamp = getMicrosecondTimestamp();\n\n const event: StepStartedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n stepId,\n type: \"StepStarted\",\n workerId,\n dependencies: metadata.dependencies,\n attemptNumber,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepComplete(\n workflowSlug: string,\n runId: string,\n stepId: string,\n output: unknown,\n metadata: StepCompleteMetadata,\n exportOutput: boolean = false\n ): Promise<void> {\n // Use the attempt number from the caller (worker knows the correct attempt)\n const attemptNumber = metadata.attemptNumber;\n\n if (attemptNumber === 0) {\n throw new Error(`Cannot complete step that hasn't started: ${stepId}`);\n }\n\n // Append log events first (if any)\n if (metadata.logs && metadata.logs.length > 0) {\n for (const log of metadata.logs) {\n // Log timestamp is already in microseconds\n const logTimestamp = log.timestamp;\n const logEvent: LogEntryEvent = {\n category: \"step\",\n eventId: ids.generateEventId(logTimestamp),\n timestampUs: logTimestamp,\n workflowSlug,\n runId,\n stepId,\n type: \"LogEntry\",\n stream: log.stream,\n message: log.message,\n attemptNumber,\n };\n await this.appendEvent(workflowSlug, runId, logEvent);\n }\n }\n\n // Serialize the output\n const serialized = safeSerialize(output);\n const outputString = serialized.success ? serialized.data : serialized.fallback;\n\n // Use high-resolution timestamp\n const timestamp = getMicrosecondTimestamp();\n\n const event: StepCompletedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n stepId,\n type: \"StepCompleted\",\n output: outputString,\n durationUs: metadata.duration,\n attemptNumber,\n exportOutput,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepFailed(\n workflowSlug: string,\n runId: string,\n stepId: string,\n error: StepError,\n metadata: {\n duration: number;\n attemptNumber: number;\n terminal: boolean;\n nextRetryAt?: number;\n failureReason: \"exhausted-retries\" | \"worker-crash\" | \"timeout\" | \"cancelled\" | \"execution-error\" | \"step-removed\";\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event: StepFailedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepFailed\",\n error,\n errorFingerprints: computeErrorFingerprints(error, error.stack),\n durationUs: metadata.duration,\n attemptNumber: metadata.attemptNumber,\n terminal: metadata.terminal,\n nextRetryAtUs: metadata.nextRetryAt,\n failureReason: metadata.failureReason,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepFailedAndScheduleRetry(\n workflowSlug: string,\n runId: string,\n stepId: string,\n error: StepError,\n failureMetadata: {\n duration: number;\n attemptNumber: number;\n nextRetryAt: number;\n failureReason: \"execution-error\" | \"timeout\";\n policyIndex?: number;\n attemptInPolicy?: number;\n },\n scheduleMetadata: {\n availableAt: number;\n nextAttemptNumber: number;\n retryDelayMs: number;\n maxRetries?: number;\n totalPolicies?: number;\n policyIndex?: number;\n attemptInPolicy?: number;\n }\n ): Promise<void> {\n // For filesystem backend, we write events sequentially\n // This is less atomic than the Postgres version, but:\n // 1. File system operations are generally reliable\n // 2. The recovery logic will handle any edge cases\n // 3. Each appendEvent is atomic at the file level\n\n // Generate timestamps for all three events\n // We need distinct timestamps to ensure proper event ordering\n const failedTimestamp = getMicrosecondTimestamp();\n const retryingTimestamp = failedTimestamp + 1;\n const scheduledTimestamp = failedTimestamp + 2;\n\n // Event 1: StepFailed (terminal: false)\n const failedEvent: StepFailedEvent = {\n category: \"step\",\n type: \"StepFailed\",\n eventId: ids.generateEventId(failedTimestamp),\n timestampUs: failedTimestamp,\n workflowSlug,\n runId,\n stepId,\n error,\n errorFingerprints: computeErrorFingerprints(error, error.stack),\n durationUs: failureMetadata.duration,\n attemptNumber: failureMetadata.attemptNumber,\n terminal: false,\n nextRetryAtUs: failureMetadata.nextRetryAt,\n failureReason: failureMetadata.failureReason,\n policyIndex: failureMetadata.policyIndex,\n attemptInPolicy: failureMetadata.attemptInPolicy,\n };\n\n await this.appendEvent(workflowSlug, runId, failedEvent);\n\n // Event 2: StepRetrying (informational)\n const retryingEvent: StepRetryingEvent = {\n category: \"step\",\n type: \"StepRetrying\",\n eventId: ids.generateEventId(retryingTimestamp),\n timestampUs: retryingTimestamp,\n workflowSlug,\n runId,\n stepId,\n attemptNumber: failureMetadata.attemptNumber,\n nextAttempt: scheduleMetadata.nextAttemptNumber,\n maxRetries: scheduleMetadata.maxRetries,\n totalPolicies: scheduleMetadata.totalPolicies,\n policyIndex: scheduleMetadata.policyIndex,\n error,\n };\n\n await this.appendEvent(workflowSlug, runId, retryingEvent);\n\n // Event 3: StepScheduled (for retry)\n const scheduledEvent: StepScheduledEvent = {\n category: \"step\",\n type: \"StepScheduled\",\n eventId: ids.generateEventId(scheduledTimestamp),\n timestampUs: scheduledTimestamp,\n workflowSlug,\n runId,\n stepId,\n availableAtUs: scheduleMetadata.availableAt,\n reason: \"retry\",\n attemptNumber: scheduleMetadata.nextAttemptNumber,\n retryDelayMs: scheduleMetadata.retryDelayMs,\n policyIndex: scheduleMetadata.policyIndex,\n attemptInPolicy: scheduleMetadata.attemptInPolicy,\n };\n\n await this.appendEvent(workflowSlug, runId, scheduledEvent);\n }\n\n async saveStepSkipped(\n workflowSlug: string,\n runId: string,\n stepId: string,\n metadata: {\n skipType: \"primary\" | \"cascade\";\n reason: string;\n metadata?: Record<string, any>;\n duration: number;\n attemptNumber: number;\n cascadedFrom?: string;\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event: StepSkippedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepSkipped\",\n skipType: metadata.skipType,\n reason: metadata.reason,\n metadata: metadata.metadata,\n durationUs: metadata.duration,\n attemptNumber: metadata.attemptNumber,\n cascadedFrom: metadata.cascadedFrom,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepCheckpoint(\n workflowSlug: string,\n runId: string,\n stepId: string,\n checkpoint: {\n name: string;\n sequenceNumber: number;\n attemptNumber: number;\n data: string;\n label?: string;\n parentCheckpoint?: { name: string; sequenceNumber: number };\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event = {\n category: \"step\" as const,\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepCheckpoint\" as const,\n name: checkpoint.name,\n sequenceNumber: checkpoint.sequenceNumber,\n attemptNumber: checkpoint.attemptNumber,\n data: checkpoint.data,\n ...(checkpoint.label && { label: checkpoint.label }),\n ...(checkpoint.parentCheckpoint && {\n parentCheckpoint: checkpoint.parentCheckpoint,\n }),\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepCheckpointFailed(\n workflowSlug: string,\n runId: string,\n stepId: string,\n checkpoint: {\n name: string;\n sequenceNumber: number;\n attemptNumber: number;\n error: StepError;\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event = {\n category: \"step\" as const,\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepCheckpointFailed\" as const,\n name: checkpoint.name,\n sequenceNumber: checkpoint.sequenceNumber,\n attemptNumber: checkpoint.attemptNumber,\n error: checkpoint.error,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepScheduled(\n workflowSlug: string,\n runId: string,\n stepId: string,\n metadata: {\n availableAt: number;\n reason: \"initial\" | \"retry\" | \"dependency-satisfied\";\n attemptNumber: number;\n retryDelayMs?: number;\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event: StepScheduledEvent = {\n category: \"step\",\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepScheduled\",\n availableAtUs: metadata.availableAt,\n reason: metadata.reason,\n attemptNumber: metadata.attemptNumber,\n retryDelayMs: metadata.retryDelayMs,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepHeartbeat(\n workflowSlug: string,\n runId: string,\n stepId: string,\n workerId: string,\n attemptNumber: number\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event: StepHeartbeatEvent = {\n category: \"step\",\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepHeartbeat\",\n workerId,\n attemptNumber,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepReclaimed(\n workflowSlug: string,\n runId: string,\n stepId: string,\n metadata: {\n originalWorkerId: string;\n reclaimedBy: string;\n lastHeartbeat: number;\n staleThreshold: number;\n staleDuration: number;\n attemptNumber: number;\n }\n ): Promise<void> {\n const now = getMicrosecondTimestamp();\n\n const event: StepReclaimedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(now),\n timestampUs: now,\n workflowSlug,\n runId,\n stepId,\n type: \"StepReclaimed\",\n originalWorkerId: metadata.originalWorkerId,\n reclaimedBy: metadata.reclaimedBy,\n lastHeartbeatUs: metadata.lastHeartbeat,\n staleThresholdUs: metadata.staleThreshold,\n staleDurationUs: metadata.staleDuration,\n attemptNumber: metadata.attemptNumber,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowComplete(\n workflowSlug: string,\n runId: string,\n output: unknown,\n metadata: { workflowAttemptNumber: number; timestamp: number; duration: number; totalSteps: number }\n ): Promise<void> {\n // Serialize the output\n const serialized = safeSerialize(output);\n const outputString = serialized.success ? serialized.data : serialized.fallback;\n\n // Use high-resolution timestamp\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowCompletedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowCompleted\",\n workflowAttemptNumber: metadata.workflowAttemptNumber,\n output: outputString,\n durationUs: metadata.duration,\n totalSteps: metadata.totalSteps,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveStepLogs(\n _workflowSlug: string,\n _runId: string,\n _stepId: string,\n _logs: LogEntry[]\n ): Promise<void> {\n // Logs are now saved as LogEntry events during saveStepComplete\n // This method is kept for backward compatibility but is a no-op\n // The logs are already appended as events in saveStepComplete\n }\n\n async loadStepLogs(\n workflowSlug: string,\n runId: string,\n stepId: string,\n attemptNumber?: number\n ): Promise<LogEntry[] | null> {\n // Load logs from events\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n let logs = extractLogsFromEvents(events);\n\n // Filter by attempt number if specified\n if (attemptNumber !== undefined) {\n logs = logs.filter(log => log.attemptNumber === attemptNumber);\n }\n\n return logs.length > 0 ? logs : null;\n }\n\n async loadRun(workflowSlug: string, runId: string): Promise<StepRecord[]> {\n try {\n // Load only step events (workflow events don't represent step execution)\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\" });\n\n if (events.length === 0) {\n return [];\n }\n\n // Group events by step ID\n const eventsByStep = new Map<string, Event[]>();\n for (const event of events) {\n // Type guard: we know these are step events\n if (event.category === \"step\") {\n if (!eventsByStep.has(event.stepId)) {\n eventsByStep.set(event.stepId, []);\n }\n eventsByStep.get(event.stepId)!.push(event);\n }\n }\n\n // Project each step's events to StepRecord\n const records: StepRecord[] = [];\n for (const [_stepId, stepEvents] of eventsByStep) {\n const record = projectStepRecord(stepEvents);\n records.push(record);\n }\n\n return records;\n } catch {\n return [];\n }\n }\n\n async runExists(workflowSlug: string, runId: string): Promise<boolean> {\n try {\n const runDir = this.paths.getRunDir(workflowSlug, runId);\n await access(runDir);\n return true;\n } catch {\n return false;\n }\n }\n\n async saveWorkflowStart(\n workflowSlug: string,\n runId: string,\n metadata: { versionId: string; workflowAttemptNumber: number; hasInputSchema: boolean; hasInput: boolean }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowStartedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowStarted\",\n versionId: metadata.versionId,\n workflowAttemptNumber: metadata.workflowAttemptNumber,\n hasInputSchema: metadata.hasInputSchema,\n hasInput: metadata.hasInput,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowInputValidation(\n workflowSlug: string,\n runId: string,\n result: {\n workflowAttemptNumber: number;\n hasSchema: boolean;\n success: boolean;\n error?: StepError;\n validationErrors?: Array<{ path: string; message: string }>;\n }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowInputValidationEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowInputValidation\",\n ...result,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowFailed(\n workflowSlug: string,\n runId: string,\n error: StepError,\n metadata: { workflowAttemptNumber: number; duration: number; completedSteps: number; failedStep?: string },\n failureReason: \"step-failed\" | \"worker-crash\" | \"timeout\" | \"cancelled\"\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowFailedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowFailed\",\n workflowAttemptNumber: metadata.workflowAttemptNumber,\n error,\n durationUs: metadata.duration,\n completedSteps: metadata.completedSteps,\n failedStep: metadata.failedStep,\n failureReason,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowResumed(\n workflowSlug: string,\n runId: string,\n metadata: { versionId: string; originalRunId: string; resumedSteps: number; pendingSteps: number }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowResumedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowResumed\",\n versionId: metadata.versionId,\n originalRunId: metadata.originalRunId,\n resumedSteps: metadata.resumedSteps,\n pendingSteps: metadata.pendingSteps,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowCancelled(\n workflowSlug: string,\n runId: string,\n metadata: { workflowAttemptNumber: number; reason?: string; duration: number; completedSteps: number }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowCancelledEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowCancelled\",\n workflowAttemptNumber: metadata.workflowAttemptNumber,\n reason: metadata.reason,\n durationUs: metadata.duration,\n completedSteps: metadata.completedSteps,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async saveWorkflowRetryStarted(\n workflowSlug: string,\n runId: string,\n metadata: {\n workflowAttemptNumber: number;\n previousAttemptNumber: number;\n retriedSteps: string[];\n reason?: string;\n }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: WorkflowRetryStartedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"WorkflowRetryStarted\",\n workflowAttemptNumber: metadata.workflowAttemptNumber,\n previousAttemptNumber: metadata.previousAttemptNumber,\n retriedSteps: metadata.retriedSteps,\n reason: metadata.reason,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n async getFailedSteps(\n workflowSlug: string,\n runId: string\n ): Promise<\n Array<{\n stepId: string;\n error: StepError;\n attemptNumber: number;\n }>\n > {\n // Load all step events for this run\n const events = await this.loadEvents(workflowSlug, runId, {\n category: \"step\",\n });\n\n if (events.length === 0 || !(\"category\" in events[0]!)) {\n return [];\n }\n\n // Group events by step ID\n const eventsByStep = new Map<string, StepEvent[]>();\n for (const event of events) {\n if (event.category === \"step\") {\n const stepEvents = eventsByStep.get(event.stepId) || [];\n stepEvents.push(event as StepEvent);\n eventsByStep.set(event.stepId, stepEvents);\n }\n }\n\n // Project each step's state and filter for failed steps\n const failedSteps: Array<{\n stepId: string;\n error: StepError;\n attemptNumber: number;\n }> = [];\n\n for (const [stepId, stepEvents] of eventsByStep) {\n const state = projectStepState(stepEvents, workflowSlug);\n if (state.status === \"failed\" && state.terminal && state.error) {\n failedSteps.push({\n stepId,\n error: state.error,\n attemptNumber: state.attemptNumber,\n });\n }\n }\n\n return failedSteps;\n }\n\n // ============================================================================\n // Queue Event Methods (Events-as-Queue Pattern)\n // ============================================================================\n\n async saveRunSubmitted(\n workflowSlug: string,\n runId: string,\n metadata: {\n versionId: string;\n availableAt: number;\n priority: number;\n input?: string; // Serialized JSON\n hasInputSchema: boolean;\n timeout?: number;\n idempotencyKey?: string;\n metadata?: Record<string, unknown>;\n tags?: string[];\n }\n ): Promise<void> {\n const timestamp = getMicrosecondTimestamp();\n\n const event: RunSubmittedEvent = {\n category: \"workflow\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n type: \"RunSubmitted\",\n versionId: metadata.versionId,\n availableAtUs: metadata.availableAt,\n priority: metadata.priority,\n input: metadata.input,\n hasInputSchema: metadata.hasInputSchema,\n timeoutUs: metadata.timeout,\n idempotencyKey: metadata.idempotencyKey,\n metadata: metadata.metadata,\n tags: metadata.tags,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n }\n\n\n // ============================================================================\n // Queue Management Methods (Events-as-Queue Implementation)\n // ============================================================================\n\n async submitRun(submission: RunSubmission): Promise<{ runId: string; isNew: boolean }> {\n // Check idempotency first\n if (submission.idempotencyKey) {\n const hash = ids.hashIdempotencyKey(submission.idempotencyKey);\n const idempotencyFile = join(this.paths.getIdempotencyDir(), `${hash}.json`);\n\n try {\n const content = await readFile(idempotencyFile, \"utf-8\");\n const existing = JSON.parse(content);\n return { runId: existing.runId, isNew: false };\n } catch {\n // Idempotency key not found, continue with submission\n }\n }\n\n // Generate runId if not provided\n const runId = submission.runId || ids.generateRunId();\n const now = getMicrosecondTimestamp();\n const availableAt = submission.availableAt || now;\n const priority = submission.priority || 0;\n\n // Initialize run directory\n await this.initializeRun(submission.workflowSlug, runId);\n\n // Get workflow metadata to determine if input schema exists\n const workflowMetadata = await this.getWorkflowMetadata(submission.workflowSlug);\n const hasInputSchema = !!(workflowMetadata?.inputSchemaJSON);\n\n // Get current workflow version (auto-captured at submission time)\n const currentVersion = await this.getCurrentWorkflowVersion(submission.workflowSlug);\n if (!currentVersion) {\n throw new Error(`Workflow ${submission.workflowSlug} not registered. Please ensure the worker has started and registered workflows.`);\n }\n\n // Emit RunSubmitted event (this IS the queue entry!)\n // Input is stored directly in the event (no separate file)\n await this.saveRunSubmitted(submission.workflowSlug, runId, {\n versionId: currentVersion.versionId,\n availableAt,\n priority,\n input: submission.input !== undefined ? JSON.stringify(submission.input) : undefined,\n hasInputSchema,\n timeout: submission.timeout,\n idempotencyKey: submission.idempotencyKey,\n metadata: submission.metadata,\n tags: submission.tags,\n });\n\n // Save idempotency mapping if key provided\n if (submission.idempotencyKey) {\n const hash = ids.hashIdempotencyKey(submission.idempotencyKey);\n const idempotencyDir = this.paths.getIdempotencyDir();\n await mkdir(idempotencyDir, { recursive: true });\n const idempotencyFile = join(idempotencyDir, `${hash}.json`);\n await fileUtils.writeJsonAtomic(idempotencyFile, { runId, createdAt: now });\n }\n\n return { runId, isNew: true };\n }\n\n\n async listRuns(options?: {\n workflowSlug?: string;\n status?: RunState[\"status\"][];\n tags?: string[];\n limit?: number;\n offset?: number;\n }): Promise<{ runs: RunState[]; total: number }> {\n try {\n const allRuns: RunState[] = [];\n\n // Scan all workflow directories\n const workflows = await readdir(this.baseDir);\n\n for (const workflowSlug of workflows) {\n // Skip non-workflow directories\n if (workflowSlug.startsWith(\".\")) continue;\n\n // Apply workflow filter\n if (options?.workflowSlug && workflowSlug !== options.workflowSlug) continue;\n\n const workflowDir = join(this.baseDir, workflowSlug);\n const runDirs = await readdir(workflowDir);\n\n for (const runId of runDirs) {\n try {\n // Load workflow events and project to RunState\n const events = await this.loadEvents(workflowSlug, runId, { category: \"workflow\" });\n\n if (events.length === 0) continue;\n\n const state = projectRunStateFromEvents(events, workflowSlug);\n\n // Apply status filter (OR logic - match any)\n if (options?.status && options.status.length > 0) {\n if (!options.status.includes(state.status)) continue;\n }\n\n // Apply tag filter (AND logic - must have all)\n if (options?.tags && options.tags.length > 0) {\n const stateTags = state.tags || [];\n const hasAllTags = options.tags.every((tag) => stateTags.includes(tag));\n if (!hasAllTags) continue;\n }\n\n allRuns.push(state);\n } catch {\n // Skip runs that fail to project (corrupted/incomplete)\n continue;\n }\n }\n }\n\n // Sort by createdAt (descending - newest first)\n allRuns.sort((a, b) => b.createdAt - a.createdAt);\n\n // Get total count before pagination\n const total = allRuns.length;\n\n // Apply offset and limit\n const offset = options?.offset ?? 0;\n const limit = options?.limit;\n const paginatedRuns = limit\n ? allRuns.slice(offset, offset + limit)\n : allRuns.slice(offset);\n\n return { runs: paginatedRuns, total };\n } catch {\n return { runs: [], total: 0 };\n }\n }\n\n\n async cancelRun(runId: string, reason?: string): Promise<void> {\n // Find the run across all workflows\n const workflows = await readdir(this.baseDir);\n\n for (const workflow of workflows) {\n if (workflow.startsWith(\".\")) continue;\n\n const runDir = this.paths.getRunDir(workflow, runId);\n\n try {\n await access(runDir);\n } catch {\n continue;\n }\n\n // Found the run, load events and get created time\n const events = await this.loadEvents(workflow, runId, { category: \"workflow\" });\n if (events.length === 0) continue;\n\n const state = projectRunStateFromEvents(events, workflow);\n\n // Calculate duration\n const duration = getMicrosecondTimestamp() - state.createdAt;\n\n // Count completed steps\n const stepRecords = await this.loadRun(workflow, runId);\n const completedSteps = stepRecords.filter((r) => r.status === \"completed\").length;\n\n // Emit WorkflowCancelled event (this IS the cancellation)\n await this.saveWorkflowCancelled(workflow, runId, {\n workflowAttemptNumber: state.workflowAttemptNumber || 1,\n reason,\n duration,\n completedSteps,\n });\n\n return;\n }\n }\n\n async getRun(runId: string): Promise<RunState | null> {\n try {\n // Search all workflow directories\n const workflows = await readdir(this.baseDir);\n\n for (const workflowSlug of workflows) {\n if (workflowSlug.startsWith(\".\")) continue;\n\n const runDir = this.paths.getRunDir(workflowSlug, runId);\n\n try {\n await access(runDir);\n } catch {\n continue;\n }\n\n // Found the run, project state from events\n const events = await this.loadEvents(workflowSlug, runId, { category: \"workflow\" });\n\n if (events.length === 0) return null;\n\n return projectRunStateFromEvents(events, workflowSlug);\n }\n\n return null;\n } catch {\n return null;\n }\n }\n\n\n // ============================================================================\n // Step-Level Distribution Methods\n // ============================================================================\n\n async listActiveWorkflows(): Promise<string[]> {\n const activeWorkflows: string[] = [];\n\n try {\n // Scan all workflow directories\n const workflows = await readdir(this.baseDir);\n\n for (const workflowSlug of workflows) {\n if (workflowSlug.startsWith(\".\")) continue;\n\n const workflowDir = join(this.baseDir, workflowSlug);\n const runDirs = await readdir(workflowDir);\n\n // Check if any run is in a non-terminal state\n for (const runId of runDirs) {\n try {\n const workflowEvents = await this.loadEvents(workflowSlug, runId, { category: \"workflow\" });\n\n if (workflowEvents.length === 0) continue;\n\n const runState = projectRunStateFromEvents(workflowEvents, workflowSlug);\n\n // Non-terminal states: pending, claimed, running\n if (runState.status === \"pending\" || runState.status === \"claimed\" || runState.status === \"running\") {\n activeWorkflows.push(workflowSlug);\n break; // Found active run, move to next workflow\n }\n } catch {\n continue;\n }\n }\n }\n\n return Array.from(new Set(activeWorkflows)); // Remove duplicates\n } catch {\n return [];\n }\n }\n\n async listScheduledSteps(options?: {\n availableBefore?: number;\n workflowSlug?: string;\n limit?: number;\n }): Promise<Array<{ workflowSlug: string; runId: string; stepId: string }>> {\n const now = getMicrosecondTimestamp();\n const availableBefore = options?.availableBefore || now;\n const scheduledSteps: Array<{ workflowSlug: string; runId: string; stepId: string; availableAt: number }> = [];\n\n try {\n // Scan all workflow directories\n const workflows = await readdir(this.baseDir);\n\n for (const workflowSlug of workflows) {\n if (workflowSlug.startsWith(\".\")) continue;\n if (options?.workflowSlug && workflowSlug !== options.workflowSlug) continue;\n\n const workflowDir = join(this.baseDir, workflowSlug);\n const runDirs = await readdir(workflowDir);\n\n for (const runId of runDirs) {\n try {\n const stepEventsDir = this.paths.getStepEventsDir(workflowSlug, runId);\n\n // Check if step-events directory exists\n try {\n await access(stepEventsDir);\n } catch {\n continue; // No step events yet\n }\n\n // Get all step IDs by recursively scanning event files\n // This supports nested step structure (e.g., step-events/data-processing/extract/)\n const stepIds = await this.discoverStepIdsFromEvents(stepEventsDir);\n\n // For each unique step, load events and check if scheduled\n for (const stepId of stepIds) {\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n\n if (events.length === 0) continue;\n\n const state = projectStepState(events as StepEvent[], workflowSlug);\n\n // Only include steps that are scheduled and available\n if (state.status === \"scheduled\" && state.availableAt && state.availableAt <= availableBefore) {\n scheduledSteps.push({\n workflowSlug,\n runId,\n stepId,\n availableAt: state.availableAt,\n });\n }\n }\n } catch {\n continue;\n }\n }\n }\n\n // Sort by availableAt (earliest first)\n scheduledSteps.sort((a, b) => a.availableAt - b.availableAt);\n\n // Apply limit\n const limited = options?.limit ? scheduledSteps.slice(0, options.limit) : scheduledSteps;\n\n // Return without availableAt field\n return limited.map(({ workflowSlug, runId, stepId }) => ({ workflowSlug, runId, stepId }));\n } catch {\n return [];\n }\n }\n\n async isStepClaimable(\n workflowSlug: string,\n runId: string,\n stepId: string\n ): Promise<boolean> {\n try {\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n\n if (events.length === 0) return false;\n\n const state = projectStepState(events as StepEvent[], workflowSlug);\n const now = getMicrosecondTimestamp();\n\n return state.status === \"scheduled\" &&\n state.availableAt !== undefined &&\n state.availableAt <= now;\n } catch {\n return false;\n }\n }\n\n async claimScheduledStep(\n workflowSlug: string,\n runId: string,\n stepId: string,\n workerId: string,\n metadata: StepStartMetadata\n ): Promise<{ attemptNumber: number } | null> {\n const initialEvents = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n\n if (initialEvents.length === 0) {\n return null;\n }\n\n const now = getMicrosecondTimestamp();\n const initialState = projectStepState(initialEvents as StepEvent[], workflowSlug);\n\n if (\n initialState.status !== \"scheduled\" ||\n initialState.availableAt === undefined ||\n initialState.availableAt > now\n ) {\n return null;\n }\n\n const attemptNumber = initialState.attemptNumber;\n const lockPath = this.paths.getStepClaimLockPath(workflowSlug, runId, stepId, attemptNumber);\n await mkdir(dirname(lockPath), { recursive: true });\n\n let lockHandle: FileHandle | null = null;\n try {\n lockHandle = await openFile(lockPath, \"wx\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n return null;\n }\n throw error;\n }\n\n try {\n const currentEvents = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n\n if (currentEvents.length === 0) {\n return null;\n }\n\n const currentState = projectStepState(currentEvents as StepEvent[], workflowSlug);\n const claimable =\n currentState.status === \"scheduled\" &&\n currentState.availableAt !== undefined &&\n currentState.availableAt <= getMicrosecondTimestamp() &&\n currentState.attemptNumber === attemptNumber;\n\n if (!claimable) {\n return null;\n }\n\n const timestamp = getMicrosecondTimestamp();\n\n const event: StepStartedEvent = {\n category: \"step\",\n eventId: ids.generateEventId(timestamp),\n timestampUs: timestamp,\n workflowSlug,\n runId,\n stepId,\n type: \"StepStarted\",\n workerId,\n dependencies: metadata.dependencies,\n attemptNumber,\n };\n\n await this.appendEvent(workflowSlug, runId, event);\n\n return { attemptNumber };\n } finally {\n if (lockHandle) {\n try {\n await lockHandle.close();\n } catch {\n // ignore close errors\n }\n try {\n await unlink(lockPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n }\n }\n }\n\n async reclaimStaleSteps(\n staleThreshold: number,\n reclaimedBy: string\n ): Promise<Array<{ workflowSlug: string; runId: string; stepId: string }>> {\n const reclaimed: Array<{ workflowSlug: string; runId: string; stepId: string }> = [];\n const now = getMicrosecondTimestamp();\n\n try {\n // Scan all workflow directories\n const workflows = await readdir(this.baseDir);\n\n for (const workflowSlug of workflows) {\n if (workflowSlug.startsWith(\".\")) continue;\n\n const workflowDir = join(this.baseDir, workflowSlug);\n const runDirs = await readdir(workflowDir);\n\n for (const runId of runDirs) {\n try {\n const stepEventsDir = this.paths.getStepEventsDir(workflowSlug, runId);\n\n // Check if step-events directory exists\n try {\n await access(stepEventsDir);\n } catch {\n continue;\n }\n\n // Get all step IDs by recursively scanning event files\n // This supports nested step structure (e.g., step-events/data-processing/extract/)\n const stepIds = await this.discoverStepIdsFromEvents(stepEventsDir);\n\n // Check each step for stale heartbeat\n for (const stepId of stepIds) {\n const events = await this.loadEvents(workflowSlug, runId, { category: \"step\", stepId });\n\n if (events.length === 0) continue;\n\n const state = projectStepState(events as StepEvent[], workflowSlug);\n\n // Only reclaim running steps\n if (state.status !== \"running\") continue;\n\n // Check if heartbeat is stale\n const lastHeartbeat = state.lastHeartbeat || state.startTime || 0;\n const staleDuration = now - lastHeartbeat;\n\n if (staleDuration > staleThreshold) {\n // Emit StepReclaimed event\n await this.saveStepReclaimed(workflowSlug, runId, stepId, {\n originalWorkerId: state.claimedBy || \"unknown\",\n reclaimedBy,\n lastHeartbeat,\n staleThreshold,\n staleDuration,\n attemptNumber: state.attemptNumber,\n });\n\n // Re-schedule the step with incremented attempt number\n await this.saveStepScheduled(workflowSlug, runId, stepId, {\n availableAt: now, // Immediately available\n reason: \"retry\",\n attemptNumber: state.attemptNumber + 1, // Increment attempt - reclamation is a new attempt\n retryDelayMs: 0,\n });\n\n reclaimed.push({ workflowSlug, runId, stepId });\n }\n }\n } catch {\n continue;\n }\n }\n }\n\n return reclaimed;\n } catch {\n return reclaimed;\n }\n }\n\n // ============================================================================\n // Workflow Discovery Methods\n // ============================================================================\n\n /**\n * List all available workflows\n */\n // ============================================================================\n // Workflow Registration Methods\n // ============================================================================\n\n /**\n * Register a workflow with the backend\n */\n async registerWorkflow(registration: WorkflowRegistration): Promise<void> {\n const registryDir = this.paths.getWorkflowRegistryDir(registration.slug);\n\n try {\n // Create registry directory\n await mkdir(registryDir, { recursive: true });\n\n // Store metadata\n const metadataPath = join(registryDir, \"metadata.json\");\n const metadata: WorkflowMetadata = {\n slug: registration.slug,\n name: registration.name,\n location: registration.location,\n inputSchemaJSON: registration.inputSchemaJSON,\n };\n await writeFile(metadataPath, JSON.stringify(metadata, null, 2), \"utf-8\");\n\n // Store steps\n const stepsPath = join(registryDir, \"steps.json\");\n await writeFile(stepsPath, JSON.stringify(registration.steps, null, 2), \"utf-8\");\n } catch (error) {\n console.error(`Failed to register workflow ${registration.slug}:`, error);\n throw new Error(`Failed to register workflow: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get metadata for a specific workflow\n */\n async getWorkflowMetadata(slug: string): Promise<WorkflowMetadata | null> {\n const metadataPath = join(this.paths.getWorkflowRegistryDir(slug), \"metadata.json\");\n\n try {\n const content = await readFile(metadataPath, \"utf-8\");\n return JSON.parse(content) as WorkflowMetadata;\n } catch (error) {\n if (error && typeof error === 'object' && 'code' in error && error.code === \"ENOENT\") {\n return null;\n }\n console.error(`Failed to get workflow metadata for ${slug}:`, error);\n throw new Error(`Failed to load workflow metadata: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * List all registered workflows\n */\n async listWorkflowMetadata(): Promise<WorkflowMetadata[]> {\n const registryDir = this.paths.getRegistryDir();\n\n try {\n // Check if registry exists\n try {\n await access(registryDir);\n } catch {\n // Registry doesn't exist yet\n return [];\n }\n\n const entries = await readdir(registryDir, { withFileTypes: true });\n const workflows: WorkflowMetadata[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const metadata = await this.getWorkflowMetadata(entry.name);\n if (metadata) {\n workflows.push(metadata);\n }\n }\n }\n\n return workflows;\n } catch (error) {\n console.error('Failed to list workflows:', error);\n throw new Error(`Failed to list workflows: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get step definitions for a workflow\n */\n async getWorkflowSteps(slug: string): Promise<StepDefinition[]> {\n const stepsPath = join(this.paths.getWorkflowRegistryDir(slug), \"steps.json\");\n\n try {\n const content = await readFile(stepsPath, \"utf-8\");\n return JSON.parse(content) as StepDefinition[];\n } catch (error) {\n if (error && typeof error === 'object' && 'code' in error && error.code === \"ENOENT\") {\n return [];\n }\n console.error(`Failed to get workflow steps for ${slug}:`, error);\n throw new Error(`Failed to load workflow steps: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * List all run IDs for a workflow\n */\n async listRunIds(workflowSlug: string): Promise<string[]> {\n const workflowDir = join(this.baseDir, workflowSlug);\n\n try {\n // Check if workflow directory exists\n try {\n await access(workflowDir);\n } catch {\n // Workflow has no runs yet\n return [];\n }\n\n const entries = await readdir(workflowDir, { withFileTypes: true });\n const runIds: string[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name !== \".registry\") {\n runIds.push(entry.name);\n }\n }\n\n return runIds;\n } catch (error) {\n console.error(`Failed to list run IDs for workflow ${workflowSlug}:`, error);\n throw new Error(`Failed to list run IDs: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n // ============================================================================\n // Workflow Version Management Methods\n // ============================================================================\n\n /**\n * Create or update a workflow version\n */\n async createWorkflowVersion(version: Omit<WorkflowVersion, 'versionNumber'>): Promise<void> {\n const versionDir = join(\n this.paths.getWorkflowRegistryDir(version.workflowSlug),\n \"versions\",\n version.versionId\n );\n\n try {\n // Create version directory\n await mkdir(versionDir, { recursive: true });\n\n // Store version metadata\n const versionPath = join(versionDir, \"version.json\");\n\n // Check if version already exists (idempotent)\n try {\n await access(versionPath);\n // Version already exists, skip writing\n return;\n } catch {\n // Version doesn't exist, write it\n }\n\n await writeFile(versionPath, JSON.stringify(version, null, 2), \"utf-8\");\n } catch (error) {\n console.error(`Failed to create workflow version ${version.versionId}:`, error);\n throw new Error(`Failed to create workflow version: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Helper method to load all versions and compute version numbers\n * Version numbers are computed based on chronological order (oldest = 1, newest = N)\n */\n private async loadAllVersionsWithNumbers(workflowSlug: string): Promise<WorkflowVersion[]> {\n const versionsDir = join(\n this.paths.getWorkflowRegistryDir(workflowSlug),\n \"versions\"\n );\n\n try {\n await access(versionsDir);\n } catch {\n return [];\n }\n\n const entries = await readdir(versionsDir, { withFileTypes: true });\n const versions: Array<Omit<WorkflowVersion, 'versionNumber'> & { versionNumber?: number }> = [];\n\n // Load all version files\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const versionPath = join(versionsDir, entry.name, \"version.json\");\n try {\n const content = await readFile(versionPath, \"utf-8\");\n const parsed = JSON.parse(content);\n versions.push(parsed);\n } catch {\n // Skip invalid versions\n continue;\n }\n }\n }\n\n // Sort by createdAt ascending (oldest first)\n versions.sort((a, b) => a.createdAt - b.createdAt);\n\n // Assign version numbers (1 = oldest, N = newest)\n const versionsWithNumbers = versions.map((version, index) => ({\n ...version,\n versionNumber: index + 1,\n }));\n\n // Validate all versions with schema\n return versionsWithNumbers.map(v => WorkflowVersionSchema.parse(v));\n }\n\n /**\n * Get a specific workflow version by ID\n */\n async getWorkflowVersion(workflowSlug: string, versionId: string): Promise<WorkflowVersion | null> {\n try {\n const versions = await this.loadAllVersionsWithNumbers(workflowSlug);\n return versions.find(v => v.versionId === versionId) ?? null;\n } catch (error) {\n console.error(`Failed to get workflow version ${versionId}:`, error);\n throw new Error(`Failed to load workflow version: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Get the most recent workflow version\n */\n async getCurrentWorkflowVersion(workflowSlug: string): Promise<WorkflowVersion | null> {\n try {\n const versions = await this.loadAllVersionsWithNumbers(workflowSlug);\n // Return the last element (newest version, highest version number)\n return versions[versions.length - 1] ?? null;\n } catch (error) {\n console.error(`Failed to get current workflow version for ${workflowSlug}:`, error);\n throw new Error(`Failed to get current workflow version: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * List all versions for a workflow\n */\n async listWorkflowVersions(workflowSlug: string, options?: { limit?: number }): Promise<WorkflowVersion[]> {\n try {\n const versions = await this.loadAllVersionsWithNumbers(workflowSlug);\n\n // Apply limit if specified\n const limit = options?.limit ?? versions.length;\n return versions.slice(0, limit);\n } catch (error) {\n console.error(`Failed to list workflow versions for ${workflowSlug}:`, error);\n throw new Error(`Failed to list workflow versions: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n /**\n * Close the backend and clean up resources\n * For filesystem backend, this is a no-op as there are no persistent connections\n */\n async close(): Promise<void> {\n // No cleanup needed for filesystem backend\n }\n\n // ============================================================================\n // Analytics Methods\n // ============================================================================\n\n /**\n * Helper to load all events within a time range and optional filters\n */\n private async loadEventsForAnalytics(\n options?: AnalyticsOptions\n ): Promise<{ stepEvents: StepEvent[]; workflowEvents: WorkflowEvent[] }> {\n const now = getMicrosecondTimestamp();\n const startUs = options?.startUs ?? now - 24 * 60 * 60 * 1000 * 1000; // Default: 24 hours ago\n const endUs = options?.endUs ?? now;\n\n const allStepEvents: StepEvent[] = [];\n const allWorkflowEvents: WorkflowEvent[] = [];\n\n // Determine which workflows to scan\n const workflowsToScan: string[] = [];\n if (options?.workflowSlug) {\n workflowsToScan.push(options.workflowSlug);\n } else {\n // Scan all workflows\n try {\n const entries = await readdir(this.baseDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name !== \".registry\") {\n workflowsToScan.push(entry.name);\n }\n }\n } catch (error) {\n // baseDir doesn't exist yet, no workflows\n return { stepEvents: [], workflowEvents: [] };\n }\n }\n\n // Load events from each workflow\n for (const workflowSlug of workflowsToScan) {\n const runIds = options?.runIds ?? (await this.listRunIds(workflowSlug));\n\n for (const runId of runIds) {\n try {\n // Load step events\n const stepEvents = await this.loadEvents(workflowSlug, runId, {\n category: \"step\",\n stepId: options?.stepId,\n });\n\n // Filter by time range\n const filteredStepEvents = stepEvents.filter(\n (e) => e.timestampUs >= startUs && e.timestampUs <= endUs\n );\n allStepEvents.push(...filteredStepEvents);\n\n // Load workflow events (unless filtering by stepId)\n if (!options?.stepId) {\n const workflowEvents = await this.loadEvents(workflowSlug, runId, {\n category: \"workflow\",\n });\n\n const filteredWorkflowEvents = workflowEvents.filter(\n (e) => e.timestampUs >= startUs && e.timestampUs <= endUs\n );\n allWorkflowEvents.push(...filteredWorkflowEvents);\n }\n } catch (error) {\n // Skip runs that don't exist or have errors\n continue;\n }\n }\n }\n\n return { stepEvents: allStepEvents, workflowEvents: allWorkflowEvents };\n }\n\n async getErrorAnalysis(options?: AnalyticsOptions): Promise<ErrorAnalysis> {\n const { stepEvents } = await this.loadEventsForAnalytics(options);\n return computeErrorAnalysis(\n stepEvents,\n options?.workflowSlug,\n options?.stepId\n );\n }\n\n async getErrorsList(options?: {\n timeRange?: { start: number; end: number };\n workflowSlug?: string;\n groupingStrategy?: 'exact' | 'normalized' | 'portable';\n limit?: number;\n offset?: number;\n }): Promise<{\n errors: Array<{\n fingerprint: string;\n errorMessage: string;\n errorName: string;\n sampleStack: string;\n count: number;\n affectedRuns: number;\n firstSeen: number;\n lastSeen: number;\n }>;\n total: number;\n }> {\n const { stepEvents } = await this.loadEventsForAnalytics({\n startUs: options?.timeRange?.start,\n endUs: options?.timeRange?.end,\n workflowSlug: options?.workflowSlug,\n });\n\n const strategy = options?.groupingStrategy || 'exact';\n const limit = options?.limit || 50;\n const offset = options?.offset || 0;\n\n // Filter for StepFailed events only\n const failedEvents = stepEvents.filter(\n (e): e is StepFailedEvent => e.type === 'StepFailed'\n );\n\n // Group by composable fingerprint\n const errorGroups = new Map<\n string,\n {\n errorMessage: string;\n errorName: string;\n sampleStack: string;\n count: number;\n affectedRuns: Set<string>;\n firstSeen: number;\n lastSeen: number;\n }\n >();\n\n for (const event of failedEvents) {\n // Compose fingerprint based on strategy\n const stackHash =\n strategy === 'exact'\n ? event.errorFingerprints.stackExactHash\n : strategy === 'normalized'\n ? event.errorFingerprints.stackNormalizedHash\n : event.errorFingerprints.stackPortableHash;\n\n const fingerprint = `${event.errorFingerprints.nameHash}:${event.errorFingerprints.messageHash}:${stackHash}`;\n\n const existing = errorGroups.get(fingerprint);\n if (existing) {\n existing.count++;\n existing.affectedRuns.add(event.runId);\n existing.firstSeen = Math.min(existing.firstSeen, event.timestampUs);\n existing.lastSeen = Math.max(existing.lastSeen, event.timestampUs);\n } else {\n errorGroups.set(fingerprint, {\n errorMessage: event.error.message,\n errorName: event.error.name || 'Error',\n sampleStack: event.error.stack || '',\n count: 1,\n affectedRuns: new Set([event.runId]),\n firstSeen: event.timestampUs,\n lastSeen: event.timestampUs,\n });\n }\n }\n\n // Convert to array and sort by count\n const allErrors = Array.from(errorGroups.entries()).map(([fingerprint, data]) => ({\n fingerprint,\n errorMessage: data.errorMessage,\n errorName: data.errorName,\n sampleStack: data.sampleStack,\n count: data.count,\n affectedRuns: data.affectedRuns.size,\n firstSeen: data.firstSeen,\n lastSeen: data.lastSeen,\n }));\n\n allErrors.sort((a, b) => b.count - a.count);\n\n const total = allErrors.length;\n const errors = allErrors.slice(offset, offset + limit);\n\n return { errors, total };\n }\n\n async getErrorDetail(\n fingerprint: string,\n groupingStrategy: 'exact' | 'normalized' | 'portable',\n options?: {\n timeRange?: { start: number; end: number };\n limit?: number;\n offset?: number;\n }\n ): Promise<{\n fingerprint: string;\n errorMessage: string;\n errorName: string;\n sampleStack: string;\n totalCount: number;\n affectedRuns: number;\n firstSeen: number;\n lastSeen: number;\n occurrences: Array<{\n workflowSlug: string;\n runId: string;\n stepId: string;\n attemptNumber: number;\n timestampUs: number;\n }>;\n total: number;\n }> {\n // Parse fingerprint\n const parts = fingerprint.split(':');\n if (parts.length !== 3) {\n throw new Error(`Invalid fingerprint format: ${fingerprint}`);\n }\n\n const [nameHash, messageHash, stackHash] = parts;\n\n const { stepEvents } = await this.loadEventsForAnalytics({\n startUs: options?.timeRange?.start,\n endUs: options?.timeRange?.end,\n });\n\n const limit = options?.limit || 100;\n const offset = options?.offset || 0;\n\n // Filter for matching StepFailed events\n const matchingEvents = stepEvents.filter((e): e is StepFailedEvent => {\n if (e.type !== 'StepFailed') return false;\n\n // Check if fingerprints match\n if (e.errorFingerprints.nameHash !== nameHash) return false;\n if (e.errorFingerprints.messageHash !== messageHash) return false;\n\n const eventStackHash =\n groupingStrategy === 'exact'\n ? e.errorFingerprints.stackExactHash\n : groupingStrategy === 'normalized'\n ? e.errorFingerprints.stackNormalizedHash\n : e.errorFingerprints.stackPortableHash;\n\n return eventStackHash === stackHash;\n });\n\n if (matchingEvents.length === 0) {\n return {\n fingerprint,\n errorMessage: '',\n errorName: '',\n sampleStack: '',\n totalCount: 0,\n affectedRuns: 0,\n firstSeen: 0,\n lastSeen: 0,\n occurrences: [],\n total: 0,\n };\n }\n\n // Calculate stats\n const affectedRunsSet = new Set(matchingEvents.map((e) => e.runId));\n const firstSeen = Math.min(...matchingEvents.map((e) => e.timestampUs));\n const lastSeen = Math.max(...matchingEvents.map((e) => e.timestampUs));\n\n // Sort by timestamp desc and paginate\n matchingEvents.sort((a, b) => b.timestampUs - a.timestampUs);\n const paginatedEvents = matchingEvents.slice(offset, offset + limit);\n\n const occurrences = paginatedEvents.map((e) => ({\n workflowSlug: e.workflowSlug,\n runId: e.runId,\n stepId: e.stepId,\n attemptNumber: e.attemptNumber,\n timestampUs: e.timestampUs,\n }));\n\n const sampleEvent = matchingEvents[0]!; // Safe: empty array check at line 2000\n\n return {\n fingerprint,\n errorMessage: sampleEvent.error.message,\n errorName: sampleEvent.error.name || 'Error',\n sampleStack: sampleEvent.error.stack || '',\n totalCount: matchingEvents.length,\n affectedRuns: affectedRunsSet.size,\n firstSeen,\n lastSeen,\n occurrences,\n total: matchingEvents.length,\n };\n }\n\n async getRetryAnalysis(options?: AnalyticsOptions): Promise<RetryAnalysis> {\n const { stepEvents } = await this.loadEventsForAnalytics(options);\n return computeRetryAnalysis(stepEvents);\n }\n\n async getSchedulingLatency(\n options?: AnalyticsOptions\n ): Promise<SchedulingLatency> {\n const { stepEvents } = await this.loadEventsForAnalytics(options);\n return computeSchedulingLatency(\n stepEvents,\n options?.workflowSlug,\n options?.stepId\n );\n }\n\n async getStepDuration(options?: AnalyticsOptions): Promise<StepDuration> {\n const { stepEvents } = await this.loadEventsForAnalytics(options);\n return computeStepDuration(\n stepEvents,\n options?.workflowSlug,\n options?.stepId\n );\n }\n\n async getWorkflowDuration(\n options?: AnalyticsOptions\n ): Promise<WorkflowDuration> {\n const { workflowEvents } = await this.loadEventsForAnalytics(options);\n return computeWorkflowDuration(workflowEvents, options?.workflowSlug);\n }\n\n async getWorkerStability(options?: AnalyticsOptions): Promise<WorkerStability> {\n const { stepEvents } = await this.loadEventsForAnalytics(options);\n return computeWorkerStability(stepEvents);\n }\n\n async getThroughput(options?: AnalyticsOptions): Promise<Throughput> {\n const { stepEvents, workflowEvents } = await this.loadEventsForAnalytics(options);\n\n const now = getMicrosecondTimestamp();\n const startUs = options?.startUs ?? now - 24 * 60 * 60 * 1000 * 1000;\n const endUs = options?.endUs ?? now;\n const timeRangeUs = endUs - startUs;\n\n return computeThroughput(\n stepEvents,\n workflowEvents,\n timeRangeUs,\n options?.workflowSlug\n );\n }\n\n async getQueueDepth(\n options?: Pick<AnalyticsOptions, \"workflowSlug\">\n ): Promise<QueueDepth> {\n const { runs } = await this.listRuns({\n workflowSlug: options?.workflowSlug,\n status: [\"pending\", \"running\"],\n });\n\n let pendingRuns = 0;\n let runningRuns = 0;\n let scheduledSteps = 0;\n let runningSteps = 0;\n let oldestScheduledStepUs: number | undefined;\n let oldestPendingRunUs: number | undefined;\n\n for (const run of runs) {\n if (run.status === \"pending\") {\n pendingRuns++;\n if (\n !oldestPendingRunUs ||\n run.createdAt < oldestPendingRunUs\n ) {\n oldestPendingRunUs = run.createdAt;\n }\n } else if (run.status === \"running\") {\n runningRuns++;\n\n // Count scheduled and running steps in this run\n try {\n const stepEvents = await this.loadEvents(\n run.workflowSlug,\n run.runId,\n { category: \"step\" }\n );\n\n // Group events by step\n const eventsByStep = new Map<string, StepEvent[]>();\n for (const event of stepEvents) {\n const events = eventsByStep.get(event.stepId) || [];\n events.push(event);\n eventsByStep.set(event.stepId, events);\n }\n\n // Project state for each step\n for (const [_stepId, events] of eventsByStep.entries()) {\n const state = projectStepState(events, run.workflowSlug);\n\n if (state.status === \"scheduled\") {\n scheduledSteps++;\n if (\n state.availableAt &&\n (!oldestScheduledStepUs || state.availableAt < oldestScheduledStepUs)\n ) {\n oldestScheduledStepUs = state.availableAt;\n }\n } else if (state.status === \"running\") {\n runningSteps++;\n }\n }\n } catch (error) {\n // Skip if can't load step events\n continue;\n }\n }\n }\n\n return {\n workflowSlug: options?.workflowSlug,\n pendingRuns,\n runningRuns,\n scheduledSteps,\n runningSteps,\n oldestScheduledStepUs,\n oldestPendingRunUs,\n };\n }\n\n async getQueueDepthByWorkflow(): Promise<QueueDepthByWorkflow> {\n const { runs } = await this.listRuns({ status: [\"pending\", \"running\"] });\n\n // Group runs by workflow\n const workflowMap = new Map<\n string,\n {\n pendingRuns: number;\n scheduledSteps: number;\n oldestPendingItemUs?: number;\n }\n >();\n\n for (const run of runs) {\n const existing = workflowMap.get(run.workflowSlug) || {\n pendingRuns: 0,\n scheduledSteps: 0,\n };\n\n if (run.status === \"pending\") {\n existing.pendingRuns++;\n if (\n !existing.oldestPendingItemUs ||\n run.createdAt < existing.oldestPendingItemUs\n ) {\n existing.oldestPendingItemUs = run.createdAt;\n }\n } else if (run.status === \"running\") {\n // Count scheduled steps in this run\n try {\n const stepEvents = await this.loadEvents(run.workflowSlug, run.runId, {\n category: \"step\",\n });\n\n // Group events by step\n const eventsByStep = new Map<string, StepEvent[]>();\n for (const event of stepEvents) {\n const events = eventsByStep.get(event.stepId) || [];\n events.push(event);\n eventsByStep.set(event.stepId, events);\n }\n\n // Project state for each step\n for (const [_stepId, events] of eventsByStep.entries()) {\n const state = projectStepState(events, run.workflowSlug);\n\n if (state.status === \"scheduled\") {\n existing.scheduledSteps++;\n if (\n state.availableAt &&\n (!existing.oldestPendingItemUs ||\n state.availableAt < existing.oldestPendingItemUs)\n ) {\n existing.oldestPendingItemUs = state.availableAt;\n }\n }\n }\n } catch (error) {\n // Skip if can't load step events\n continue;\n }\n }\n\n workflowMap.set(run.workflowSlug, existing);\n }\n\n // Get workflow metadata for names\n const allMetadata = await this.listWorkflowMetadata();\n const metadataMap = new Map(allMetadata.map((m) => [m.slug, m]));\n\n // Convert to array format\n const result: QueueDepthByWorkflow = Array.from(workflowMap.entries())\n .map(([workflowSlug, data]) => ({\n workflowSlug,\n workflowName: metadataMap.get(workflowSlug)?.name,\n pendingRuns: data.pendingRuns,\n scheduledSteps: data.scheduledSteps,\n oldestPendingItemUs: data.oldestPendingItemUs,\n }))\n .filter((item) => item.pendingRuns > 0 || item.scheduledSteps > 0) // Only include workflows with pending work\n .sort((a, b) => {\n // Sort by total pending work (desc)\n const aTotal = a.pendingRuns + a.scheduledSteps;\n const bTotal = b.pendingRuns + b.scheduledSteps;\n return bTotal - aTotal;\n });\n\n return result;\n }\n\n async getSuccessRate(options?: AnalyticsOptions): Promise<SuccessRate> {\n const { stepEvents, workflowEvents } = await this.loadEventsForAnalytics(options);\n return computeSuccessRate(\n stepEvents,\n workflowEvents,\n options?.workflowSlug,\n options?.stepId\n );\n }\n\n async getAnalyticsSummary(\n options?: AnalyticsOptions\n ): Promise<AnalyticsSummary> {\n const now = getMicrosecondTimestamp();\n const startUs = options?.startUs ?? now - 24 * 60 * 60 * 1000 * 1000;\n const endUs = options?.endUs ?? now;\n\n // Run all analytics in parallel\n const [\n errorAnalysis,\n retryAnalysis,\n schedulingLatency,\n stepDuration,\n workflowDuration,\n workerStability,\n throughput,\n queueDepth,\n successRate,\n ] = await Promise.all([\n this.getErrorAnalysis(options),\n this.getRetryAnalysis(options),\n this.getSchedulingLatency(options),\n this.getStepDuration(options),\n this.getWorkflowDuration(options),\n this.getWorkerStability(options),\n this.getThroughput(options),\n this.getQueueDepth(options),\n this.getSuccessRate(options),\n ]);\n\n return {\n timeRange: {\n startUs,\n endUs,\n durationUs: endUs - startUs,\n },\n errorAnalysis,\n retryAnalysis,\n schedulingLatency,\n stepDuration,\n workflowDuration,\n workerStability,\n throughput,\n queueDepth,\n successRate,\n };\n }\n}\n\n// Re-export projection functions for use by workers\nexport { projectStepState, projectRunStateFromEvents, projectStepRecord } from \"@cascade-flow/backend-interface\";\n",
6
6
  "import { join, dirname } from \"node:path\";\n\n/**\n * Path utility class for the filesystem backend\n * Supports nested step structure (e.g., stepId = \"group/subgroup/step-name\")\n */\nexport class PathHelper {\n constructor(private baseDir: string) {}\n\n getRunDir(workflowSlug: string, runId: string): string {\n return join(this.baseDir, workflowSlug, runId);\n }\n\n getWorkflowEventsDir(workflowSlug: string, runId: string): string {\n return join(this.getRunDir(workflowSlug, runId), \"workflow-events\");\n }\n\n getStepEventsDir(workflowSlug: string, runId: string): string {\n return join(this.getRunDir(workflowSlug, runId), \"step-events\");\n }\n\n getStepOutputsDir(workflowSlug: string, runId: string): string {\n return join(this.getRunDir(workflowSlug, runId), \"step-outputs\");\n }\n\n /**\n * Get the directory path for a specific step's events\n * For nested steps (e.g., \"group/subgroup/step\"), creates nested directory structure\n * @example\n * getStepEventDir(\"my-workflow\", \"run-123\", \"group/step\")\n * // => \".runs/my-workflow/run-123/step-events/group\"\n */\n getStepEventDir(workflowSlug: string, runId: string, stepId: string): string {\n const eventsDir = this.getStepEventsDir(workflowSlug, runId);\n const stepDirPath = dirname(stepId);\n // If stepId has no slashes (flat step), dirname returns \".\" - don't append it\n return stepDirPath === \".\" ? eventsDir : join(eventsDir, stepDirPath);\n }\n\n /**\n * Get the directory path for a specific step's outputs\n * For nested steps, creates nested directory structure\n */\n getStepOutputDir(workflowSlug: string, runId: string, stepId: string): string {\n const outputsDir = this.getStepOutputsDir(workflowSlug, runId);\n const stepDirPath = dirname(stepId);\n return stepDirPath === \".\" ? outputsDir : join(outputsDir, stepDirPath);\n }\n\n /**\n * Get the full path for a step's output file\n * For nested steps (e.g., \"group/subgroup/step\"), creates:\n * \".runs/{slug}/{runId}/step-outputs/group/subgroup/step-attempt-1.json\"\n */\n getStepOutputPath(workflowSlug: string, runId: string, stepId: string, attemptNumber: number): string {\n const outputDir = this.getStepOutputDir(workflowSlug, runId, stepId);\n const stepName = stepId.split('/').pop()!;\n return join(outputDir, `${stepName}-attempt-${attemptNumber}.json`);\n }\n\n /**\n * Get the directory path for a step's claim locks\n * For nested steps, creates nested directory structure\n */\n getStepLockDir(workflowSlug: string, runId: string, stepId: string): string {\n const locksDir = join(this.getRunDir(workflowSlug, runId), \"locks\");\n const stepDirPath = dirname(stepId);\n return stepDirPath === \".\" ? locksDir : join(locksDir, stepDirPath);\n }\n\n /**\n * Get the full path for a step's claim lock file\n * For nested steps (e.g., \"group/step\"), creates:\n * \".runs/{slug}/{runId}/locks/group/step-attempt-1.lock\"\n */\n getStepClaimLockPath(workflowSlug: string, runId: string, stepId: string, attemptNumber: number): string {\n const lockDir = this.getStepLockDir(workflowSlug, runId, stepId);\n const stepName = stepId.split('/').pop()!;\n return join(lockDir, `${stepName}-attempt-${attemptNumber}.lock`);\n }\n\n getIdempotencyDir(): string {\n return join(this.baseDir, \".idempotency\");\n }\n\n getRegistryDir(): string {\n return join(this.baseDir, \".registry\");\n }\n\n getWorkflowRegistryDir(slug: string): string {\n return join(this.getRegistryDir(), slug);\n }\n}\n",
7
7
  "import { createHash } from \"node:crypto\";\nimport { getMicrosecondTimestamp } from \"@cascade-flow/backend-interface\";\n\n/**\n * ID and hash generation utilities\n */\n\nexport function generateRunId(): string {\n return `run_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n}\n\nexport function hashIdempotencyKey(key: string): string {\n return createHash(\"sha256\")\n .update(key)\n .digest(\"hex\");\n}\n\n/**\n * Generate a unique event ID using microsecond timestamp\n * Format: {timestamp}\n * Example: 1762916097401523\n *\n * The microsecond timestamp provides ~1000x better precision than milliseconds,\n * making collisions extremely unlikely even with parallel step execution.\n *\n * @param timestamp - Optional timestamp in microseconds (defaults to current time)\n */\nexport function generateEventId(timestamp?: number): string {\n const ts = timestamp ?? getMicrosecondTimestamp();\n return `${ts}`;\n}\n",
8
8
  "import { mkdir, writeFile, open as openFile, rename, unlink, rm } from \"node:fs/promises\";\nimport type { FileHandle } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport type { StepEvent, WorkflowEvent } from \"@cascade-flow/backend-interface\";\n\n/**\n * File utility functions\n */\n\n/**\n * Atomically write JSON data to a file\n * Uses a temporary file and rename for atomicity with full durability\n */\nexport async function writeJsonAtomic(filePath: string, data: unknown): Promise<void> {\n const dir = dirname(filePath);\n await mkdir(dir, { recursive: true });\n\n const jsonString = JSON.stringify(data, null, 2);\n\n // Generate unique temp file path\n const randomSuffix = createHash('sha256')\n .update(`${filePath}-${Date.now()}-${Math.random()}`)\n .digest('hex')\n .substring(0, 16);\n const tempPath = `${filePath}.tmp.${randomSuffix}`;\n\n let tempHandle: FileHandle | undefined;\n try {\n // Write to temp file\n await writeFile(tempPath, jsonString, \"utf-8\");\n\n // Sync temp file to disk\n tempHandle = await openFile(tempPath, 'r+');\n await tempHandle.datasync();\n await tempHandle.close();\n tempHandle = undefined;\n\n // Atomically rename (POSIX atomic operation)\n await rename(tempPath, filePath);\n\n // Sync directory to ensure rename is durable\n const dirHandle = await openFile(dir, 'r');\n await dirHandle.datasync();\n await dirHandle.close();\n } catch (error) {\n // Clean up temp file on error\n if (tempHandle) {\n await tempHandle.close().catch(() => {});\n }\n try {\n await unlink(tempPath);\n } catch {\n // Ignore cleanup errors\n }\n throw error;\n }\n}\n\n/**\n * Get the filename for a workflow event\n * Format: {timestamp}-{eventType}.json\n * Example: 1762916097401523-WorkflowStarted.json\n */\nexport function getWorkflowEventFilename(event: WorkflowEvent): string {\n return `${event.eventId}-${event.type}.json`;\n}\n\n/**\n * Get the filename for a step event\n * For nested steps (e.g., stepId = \"group/subgroup/step\"), uses only the step name\n * Format: {timestamp}-{stepName}-{eventType}.json\n * Example: 1762916097401523-ai-step-1-StepStarted.json\n */\nexport function getStepEventFilename(event: StepEvent): string {\n const stepName = event.stepId.split('/').pop()!;\n return `${event.eventId}-${stepName}-${event.type}.json`;\n}\n\nexport { rm };\n"
9
9
  ],
10
- "mappings": ";AAAA,kBAAS,qBAAO,iDAAsC,iBAAQ;AAE9D,iBAAS,kBAAM;;;ACFf;AAAA;AAMO,MAAM,WAAW;AAAA,EACF;AAAA,EAApB,WAAW,CAAS,SAAiB;AAAA,IAAjB;AAAA;AAAA,EAEpB,SAAS,CAAC,cAAsB,OAAuB;AAAA,IACrD,OAAO,KAAK,KAAK,SAAS,cAAc,KAAK;AAAA;AAAA,EAG/C,oBAAoB,CAAC,cAAsB,OAAuB;AAAA,IAChE,OAAO,KAAK,KAAK,UAAU,cAAc,KAAK,GAAG,iBAAiB;AAAA;AAAA,EAGpE,gBAAgB,CAAC,cAAsB,OAAuB;AAAA,IAC5D,OAAO,KAAK,KAAK,UAAU,cAAc,KAAK,GAAG,aAAa;AAAA;AAAA,EAGhE,iBAAiB,CAAC,cAAsB,OAAuB;AAAA,IAC7D,OAAO,KAAK,KAAK,UAAU,cAAc,KAAK,GAAG,cAAc;AAAA;AAAA,EAUjE,eAAe,CAAC,cAAsB,OAAe,QAAwB;AAAA,IAC3E,MAAM,YAAY,KAAK,iBAAiB,cAAc,KAAK;AAAA,IAC3D,MAAM,cAAc,QAAQ,MAAM;AAAA,IAElC,OAAO,gBAAgB,MAAM,YAAY,KAAK,WAAW,WAAW;AAAA;AAAA,EAOtE,gBAAgB,CAAC,cAAsB,OAAe,QAAwB;AAAA,IAC5E,MAAM,aAAa,KAAK,kBAAkB,cAAc,KAAK;AAAA,IAC7D,MAAM,cAAc,QAAQ,MAAM;AAAA,IAClC,OAAO,gBAAgB,MAAM,aAAa,KAAK,YAAY,WAAW;AAAA;AAAA,EAQxE,iBAAiB,CAAC,cAAsB,OAAe,QAAgB,eAA+B;AAAA,IACpG,MAAM,YAAY,KAAK,iBAAiB,cAAc,OAAO,MAAM;AAAA,IACnE,MAAM,WAAW,OAAO,MAAM,GAAG,EAAE,IAAI;AAAA,IACvC,OAAO,KAAK,WAAW,GAAG,oBAAoB,oBAAoB;AAAA;AAAA,EAOpE,cAAc,CAAC,cAAsB,OAAe,QAAwB;AAAA,IAC1E,MAAM,WAAW,KAAK,KAAK,UAAU,cAAc,KAAK,GAAG,OAAO;AAAA,IAClE,MAAM,cAAc,QAAQ,MAAM;AAAA,IAClC,OAAO,gBAAgB,MAAM,WAAW,KAAK,UAAU,WAAW;AAAA;AAAA,EAQpE,oBAAoB,CAAC,cAAsB,OAAe,QAAgB,eAA+B;AAAA,IACvG,MAAM,UAAU,KAAK,eAAe,cAAc,OAAO,MAAM;AAAA,IAC/D,MAAM,WAAW,OAAO,MAAM,GAAG,EAAE,IAAI;AAAA,IACvC,OAAO,KAAK,SAAS,GAAG,oBAAoB,oBAAoB;AAAA;AAAA,EAGlE,iBAAiB,GAAW;AAAA,IAC1B,OAAO,KAAK,KAAK,SAAS,cAAc;AAAA;AAAA,EAG1C,cAAc,GAAW;AAAA,IACvB,OAAO,KAAK,KAAK,SAAS,WAAW;AAAA;AAAA,EAGvC,sBAAsB,CAAC,MAAsB;AAAA,IAC3C,OAAO,KAAK,KAAK,eAAe,GAAG,IAAI;AAAA;AAE3C;;;AC5FA;AACA;AAMO,SAAS,aAAa,GAAW;AAAA,EACtC,OAAO,OAAO,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE;AAAA;AAGjE,SAAS,kBAAkB,CAAC,KAAqB;AAAA,EACtD,OAAO,WAAW,QAAQ,EACvB,OAAO,GAAG,EACV,OAAO,KAAK;AAAA;AAaV,SAAS,eAAe,CAAC,WAA4B;AAAA,EAC1D,MAAM,KAAK,aAAa,wBAAwB;AAAA,EAChD,OAAO,GAAG;AAAA;;;AC7BZ,mCAA2B;AAE3B,oBAAS;AACT,uBAAS;AAWT,eAAsB,eAAe,CAAC,UAAkB,MAA8B;AAAA,EACpF,MAAM,MAAM,SAAQ,QAAQ;AAAA,EAC5B,MAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EAEpC,MAAM,aAAa,KAAK,UAAU,MAAM,MAAM,CAAC;AAAA,EAG/C,MAAM,eAAe,YAAW,QAAQ,EACrC,OAAO,GAAG,YAAY,KAAK,IAAI,KAAK,KAAK,OAAO,GAAG,EACnD,OAAO,KAAK,EACZ,UAAU,GAAG,EAAE;AAAA,EAClB,MAAM,WAAW,GAAG,gBAAgB;AAAA,EAEpC,IAAI;AAAA,EACJ,IAAI;AAAA,IAEF,MAAM,UAAU,UAAU,YAAY,OAAO;AAAA,IAG7C,aAAa,MAAM,SAAS,UAAU,IAAI;AAAA,IAC1C,MAAM,WAAW,SAAS;AAAA,IAC1B,MAAM,WAAW,MAAM;AAAA,IACvB,aAAa;AAAA,IAGb,MAAM,OAAO,UAAU,QAAQ;AAAA,IAG/B,MAAM,YAAY,MAAM,SAAS,KAAK,GAAG;AAAA,IACzC,MAAM,UAAU,SAAS;AAAA,IACzB,MAAM,UAAU,MAAM;AAAA,IACtB,OAAO,OAAO;AAAA,IAEd,IAAI,YAAY;AAAA,MACd,MAAM,WAAW,MAAM,EAAE,MAAM,MAAM,EAAE;AAAA,IACzC;AAAA,IACA,IAAI;AAAA,MACF,MAAM,OAAO,QAAQ;AAAA,MACrB,MAAM;AAAA,IAGR,MAAM;AAAA;AAAA;AASH,SAAS,wBAAwB,CAAC,OAA8B;AAAA,EACrE,OAAO,GAAG,MAAM,WAAW,MAAM;AAAA;AAS5B,SAAS,oBAAoB,CAAC,OAA0B;AAAA,EAC7D,MAAM,WAAW,MAAM,OAAO,MAAM,GAAG,EAAE,IAAI;AAAA,EAC7C,OAAO,GAAG,MAAM,WAAW,YAAY,MAAM;AAAA;;;AHtE/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAsDE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAupFF,6BAAS,gDAAkB,iDAA2B;AAAA;AAnoF/C,MAAM,0BAA0B,QAAQ;AAAA,EACrC;AAAA,EACA;AAAA,EAOR,WAAW,CAAC,UAAkB,WAAW;AAAA,IACvC,MAAM;AAAA,IACN,KAAK,UAAU;AAAA,IACf,KAAK,QAAQ,IAAI,WAAW,OAAO;AAAA;AAAA,OAM/B,WAAU,GAAkB;AAAA,OAI5B,aAAY,GAAqB;AAAA,IACrC,OAAO;AAAA;AAAA,EAGF,iBAAiB,CAAC,cAAsB,OAAe,QAAgB,eAA+B;AAAA,IAC3G,OAAO,KAAK,MAAM,kBAAkB,cAAc,OAAO,QAAQ,aAAa;AAAA;AAAA,OAG1E,cAAa,CAAC,cAAsB,OAA8B;AAAA,IACtE,MAAM,oBAAoB,KAAK,MAAM,qBAAqB,cAAc,KAAK;AAAA,IAC7E,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,cAAc,KAAK;AAAA,IACrE,MAAM,OAAM,mBAAmB,EAAE,WAAW,KAAK,CAAC;AAAA,IAClD,MAAM,OAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA;AAAA,OAG1C,YAAW,CAAC,cAAsB,OAAe,OAA6B;AAAA,IAElF,IAAI,CAAC,MAAM,SAAS;AAAA,MACjB,MAAc,UAAc,gBAAgB;AAAA,IAC/C;AAAA,IACA,IAAI,CAAC,MAAM,aAAa;AAAA,MACrB,MAAc,cAAc,yBAAwB;AAAA,IACvD;AAAA,IAGA,YAAY,MAAM,KAAK;AAAA,IAIvB,MAAM,YACJ,MAAM,aAAa,aACf,KAAK,MAAM,qBAAqB,cAAc,KAAK,IACnD,KAAK,MAAM,gBAAgB,cAAc,OAAQ,MAAoB,MAAM;AAAA,IAEjF,MAAM,cAAc,CAAC,QAAuB;AAAA,MAC1C,IAAI,IAAI,aAAa,YAAY;AAAA,QAC/B,OAAiB,yBAAyB,GAAoB;AAAA,MAChE,EAAO;AAAA,QACL,OAAiB,qBAAqB,GAAgB;AAAA;AAAA;AAAA,IAI1D,MAAM,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAG1C,IAAI,YAAY,SAAS,MAAM,OAAO;AAAA,IACtC,IAAI,WAAW,YAAY,KAAK;AAAA,IAChC,IAAI,WAAW,MAAK,WAAW,QAAQ;AAAA,IAGvC,OAAO,MAAM;AAAA,MACX,IAAI;AAAA,QACF,MAAM,OAAO,QAAQ;AAAA,QAErB;AAAA,QACC,MAAc,UAAU,GAAG;AAAA,QAC3B,MAAc,cAAc;AAAA,QAC7B,WAAW,YAAY,KAAK;AAAA,QAC5B,WAAW,MAAK,WAAW,QAAQ;AAAA,QACnC,MAAM;AAAA,QAEN;AAAA;AAAA,IAEJ;AAAA,IAEA,MAAgB,gBAAgB,UAAU,KAAK;AAAA;AAAA,OAkB3C,WAAU,CACd,cACA,OACA,SACkB;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,SAAkB,CAAC;AAAA,MAGzB,MAAM,cAAqE,CAAC;AAAA,MAE5E,IAAI,CAAC,SAAS,YAAY,QAAQ,aAAa,YAAY;AAAA,QACzD,YAAY,KAAK;AAAA,UACf,KAAK,KAAK,MAAM,qBAAqB,cAAc,KAAK;AAAA,UACxD,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,MAEA,IAAI,CAAC,SAAS,YAAY,QAAQ,aAAa,QAAQ;AAAA,QACrD,YAAY,KAAK;AAAA,UACf,KAAK,KAAK,MAAM,iBAAiB,cAAc,KAAK;AAAA,UACpD,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,MAGA,aAAa,KAAK,cAAc,aAAa;AAAA,QAC3C,IAAI;AAAA,UAEF,IAAI,aAAa,QAAQ;AAAA,YACvB,MAAM,KAAK,oBAAoB,KAAK,QAAQ,SAAS,MAAM;AAAA,UAC7D,EAAO;AAAA,YAEL,MAAM,QAAQ,MAAM,QAAQ,GAAG;AAAA,YAC/B,MAAM,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC;AAAA,YAE1D,WAAW,QAAQ,YAAY;AAAA,cAC7B,MAAM,UAAU,MAAM,SAAS,MAAK,KAAK,IAAI,GAAG,OAAO;AAAA,cACvD,MAAM,QAAQ,YAAY,MAAM,KAAK,MAAM,OAAO,CAAC;AAAA,cACnD,OAAO,KAAK,KAAK;AAAA,YACnB;AAAA;AAAA,UAEF,OAAO,KAAK;AAAA,UAEZ;AAAA;AAAA,MAEJ;AAAA,MAGA,OAAO,KAAK,CAAC,GAAG,MAAM;AAAA,QACpB,IAAI,EAAE,gBAAgB,EAAE,aAAa;AAAA,UACnC,OAAO,EAAE,cAAc,EAAE;AAAA,QAC3B;AAAA,QACA,OAAO,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,OACzC;AAAA,MAED,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,CAAC;AAAA;AAAA;AAAA,OAQE,oBAAmB,CAC/B,KACA,QACA,cACe;AAAA,IACf,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,MAE1D,WAAW,SAAS,SAAS;AAAA,QAC3B,MAAM,WAAW,MAAK,KAAK,MAAM,IAAI;AAAA,QAErC,IAAI,MAAM,YAAY,GAAG;AAAA,UAEvB,MAAM,KAAK,oBAAoB,UAAU,QAAQ,YAAY;AAAA,QAC/D,EAAO,SAAI,MAAM,KAAK,SAAS,OAAO,GAAG;AAAA,UAEvC,MAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAAA,UAChD,MAAM,QAAQ,YAAY,MAAM,KAAK,MAAM,OAAO,CAAC;AAAA,UAGnD,IAAI,cAAc;AAAA,YAChB,IAAI,MAAM,aAAa,UAAU,MAAM,WAAW,cAAc;AAAA,cAC9D,OAAO,KAAK,KAAK;AAAA,YACnB;AAAA,UACF,EAAO;AAAA,YACL,OAAO,KAAK,KAAK;AAAA;AAAA,QAErB;AAAA,MACF;AAAA,MACA,OAAO,KAAK;AAAA;AAAA,OAKV,4BAA2B,CAC/B,cACA,OACmC;AAAA,IACnC,MAAM,eAAe,IAAI;AAAA,IAGzB,MAAM,gBAAgB,IAAI,IAAI,CAAC,YAAY,iBAAiB,cAAc,CAAC;AAAA,IAE3E,IAAI;AAAA,MACF,MAAM,SAAkB,CAAC;AAAA,MACzB,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,cAAc,KAAK;AAAA,MACrE,MAAM,KAAK,oBAAoB,eAAe,MAAM;AAAA,MAGpD,WAAW,SAAS,QAAQ;AAAA,QAC1B,IAAI,MAAM,aAAa,UAAU,CAAC,cAAc,IAAI,MAAM,IAAI,GAAG;AAAA,UAC/D,MAAM,YAAY;AAAA,UAClB,IAAI,CAAC,aAAa,IAAI,UAAU,MAAM,GAAG;AAAA,YACvC,aAAa,IAAI,UAAU,QAAQ,CAAC,CAAC;AAAA,UACvC;AAAA,UACA,aAAa,IAAI,UAAU,MAAM,EAAG,KAAK,SAAS;AAAA,QACpD;AAAA,MACF;AAAA,MAGA,cAAc,eAAe,cAAc;AAAA,QACzC,WAAW,KAAK,CAAC,GAAG,MAAM;AAAA,UACxB,IAAI,EAAE,gBAAgB,EAAE,aAAa;AAAA,YACnC,OAAO,EAAE,cAAc,EAAE;AAAA,UAC3B;AAAA,UACA,OAAO,EAAE,QAAQ,cAAc,EAAE,OAAO;AAAA,SACzC;AAAA,MACH;AAAA,MACA,MAAM;AAAA,IAIR,OAAO;AAAA;AAAA,OAGH,cAAa,CACjB,cACA,aACA,aACe;AAAA,IACf,MAAM,YAAY,KAAK,MAAM,UAAU,cAAc,WAAW;AAAA,IAChE,MAAM,YAAY,KAAK,MAAM,UAAU,cAAc,WAAW;AAAA,IAGhE,MAAM,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAE1C,IAAI;AAAA,MAEF,MAAM,KAAK,oBAAoB,WAAW,WAAW,aAAa,WAAW;AAAA,MAC7E,OAAO,OAAO;AAAA,MAEd,IAAI;AAAA,QACF,MAAgB,GAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,QAC9D,MAAM;AAAA,MACR,MAAM;AAAA;AAAA;AAAA,OAII,oBAAmB,CAC/B,WACA,WACA,aACA,aACe;AAAA,IACf,MAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,IAEhE,WAAW,SAAS,SAAS;AAAA,MAC3B,MAAM,aAAa,MAAK,WAAW,MAAM,IAAI;AAAA,MAC7C,MAAM,aAAa,MAAK,WAAW,MAAM,IAAI;AAAA,MAE7C,IAAI,MAAM,YAAY,GAAG;AAAA,QAEvB,MAAM,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,QAC3C,MAAM,KAAK,oBAAoB,YAAY,YAAY,aAAa,WAAW;AAAA,MACjF,EAAO,SAAI,MAAM,KAAK,SAAS,OAAO,GAAG;AAAA,QAEvC,MAAM,UAAU,MAAM,SAAS,YAAY,OAAO;AAAA,QAClD,MAAM,QAAQ,KAAK,MAAM,OAAO;AAAA,QAGhC,MAAM,QAAQ;AAAA,QACd,MAAM,UAAc,gBAAgB,MAAM,WAAW;AAAA,QAGrD,MAAM,WAAU,YAAY,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAAA,MACrE;AAAA,IACF;AAAA;AAAA,OAGI,iBAAgB,CACpB,cACA,OACA,SACe;AAAA,IACf,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,cAAc,KAAK;AAAA,IAGrE,WAAW,UAAU,SAAS;AAAA,MAC5B,MAAM,KAAK,0BAA0B,eAAe,MAAM;AAAA,IAC5D;AAAA;AAAA,OAGY,0BAAyB,CACrC,eACA,QACe;AAAA,IAEf,MAAM,YAAY,OAAO,MAAM,GAAG;AAAA,IAClC,MAAM,WAAW,UAAU,SAAS,IAChC,MAAK,eAAe,GAAG,UAAU,MAAM,GAAG,EAAE,CAAC,IAC7C;AAAA,IAEJ,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,QAAQ,UAAU,EAAE,eAAe,KAAK,CAAC;AAAA,MAE/D,WAAW,SAAS,SAAS;AAAA,QAC3B,MAAM,WAAW,MAAK,UAAU,MAAM,IAAI;AAAA,QAE1C,IAAI,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,OAAO,GAAG;AAAA,UAElD,MAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAAA,UAChD,MAAM,QAAQ,KAAK,MAAM,OAAO;AAAA,UAEhC,IAAI,MAAM,aAAa,UAAU,MAAM,WAAW,QAAQ;AAAA,YACxD,MAAM,QAAO,QAAQ;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA;AAAA,OAKZ,6BAA4B,CAChC,cACA,OACe;AAAA,IACf,MAAM,oBAAoB,KAAK,MAAM,qBAAqB,cAAc,KAAK;AAAA,IAE7E,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,QAAQ,mBAAmB,EAAE,eAAe,KAAK,CAAC;AAAA,MAExE,WAAW,SAAS,SAAS;AAAA,QAC3B,IAAI,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,OAAO,GAAG;AAAA,UAElD,IACE,MAAM,KAAK,SAAS,yBAAyB,KAC7C,MAAM,KAAK,SAAS,sBAAsB,KAC1C,MAAM,KAAK,SAAS,yBAAyB,GAC7C;AAAA,YACA,MAAM,QAAO,MAAK,mBAAmB,MAAM,IAAI,CAAC;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA;AAAA,OAKZ,mBAAkB,CACtB,cACA,aACA,aACA,iBACe;AAAA,IACf,MAAM,YAAY,KAAK,MAAM,qBAAqB,cAAc,WAAW;AAAA,IAC3E,MAAM,YAAY,KAAK,MAAM,qBAAqB,cAAc,WAAW;AAAA,IAE3E,MAAM,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAE1C,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,MAEhE,WAAW,SAAS,SAAS;AAAA,QAC3B,IAAI,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,OAAO,GAAG;AAAA,UAElD,IAAI,oBACF,MAAM,KAAK,SAAS,yBAAyB,KAC7C,MAAM,KAAK,SAAS,sBAAsB,KAC1C,MAAM,KAAK,SAAS,yBAAyB,IAC5C;AAAA,YACD;AAAA,UACF;AAAA,UAEA,MAAM,aAAa,MAAK,WAAW,MAAM,IAAI;AAAA,UAC7C,MAAM,UAAU,MAAM,SAAS,YAAY,OAAO;AAAA,UAClD,MAAM,QAAQ,KAAK,MAAM,OAAO;AAAA,UAGhC,MAAM,QAAQ;AAAA,UACd,MAAM,UAAc,gBAAgB,MAAM,WAAW;AAAA,UAErD,MAAM,aAAa,MAAK,WAAW,MAAM,IAAI;AAAA,UAC7C,MAAM,WAAU,YAAY,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAAA,QACrE;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA;AAAA,OAKZ,eAAc,CAClB,cACA,aACA,aACA,gBACe;AAAA,IACf,MAAM,YAAY,KAAK,MAAM,iBAAiB,cAAc,WAAW;AAAA,IACvE,MAAM,YAAY,KAAK,MAAM,iBAAiB,cAAc,WAAW;AAAA,IAEvE,MAAM,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAE1C,MAAM,KAAK,wBAAwB,WAAW,WAAW,aAAa,aAAa,cAAc;AAAA;AAAA,OAGrF,wBAAuB,CACnC,WACA,WACA,aACA,aACA,gBACe;AAAA,IACf,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,QAAQ,WAAW,EAAE,eAAe,KAAK,CAAC;AAAA,MAEhE,WAAW,SAAS,SAAS;AAAA,QAC3B,MAAM,aAAa,MAAK,WAAW,MAAM,IAAI;AAAA,QAC7C,MAAM,aAAa,MAAK,WAAW,MAAM,IAAI;AAAA,QAE7C,IAAI,MAAM,YAAY,GAAG;AAAA,UAEvB,MAAM,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,UAC3C,MAAM,KAAK,wBAAwB,YAAY,YAAY,aAAa,aAAa,cAAc;AAAA,QACrG,EAAO,SAAI,MAAM,KAAK,SAAS,OAAO,GAAG;AAAA,UAEvC,MAAM,UAAU,MAAM,SAAS,YAAY,OAAO;AAAA,UAClD,MAAM,QAAQ,KAAK,MAAM,OAAO;AAAA,UAEhC,IAAI,MAAM,aAAa,UAAU,eAAe,IAAI,MAAM,MAAM,GAAG;AAAA,YAEjE,MAAM,QAAQ;AAAA,YACd,MAAM,UAAc,gBAAgB,MAAM,WAAW;AAAA,YAErD,MAAM,WAAU,YAAY,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAAA,UACrE;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA;AAAA,OAKZ,UAAS,CAAC,QAMb;AAAA,IAED,MAAM,YAAY,MAAM,KAAK,OAAO,OAAO,WAAW;AAAA,IACtD,IAAI,CAAC,WAAW;AAAA,MACd,MAAM,IAAI,MAAM,eAAe,OAAO,wBAAwB;AAAA,IAChE;AAAA,IAGA,MAAM,aAAa,MAAM,KAAK,oBAC5B,UAAU,cACV,OAAO,UACT;AAAA,IACA,MAAM,eAAe,IAAI,IAAY,CAAC,OAAO,YAAY,GAAG,UAAU,CAAC;AAAA,IAGvE,MAAM,WAAW,yBAAwB,EAAE,SAAS;AAAA,IAGpD,MAAM,KAAK,cAAc,UAAU,cAAc,OAAO,aAAa,QAAQ;AAAA,IAG7E,MAAM,KAAK,iBAAiB,UAAU,cAAc,UAAU,YAAY;AAAA,IAI1E,MAAM,KAAK,6BAA6B,UAAU,cAAc,QAAQ;AAAA,IAGxE,MAAM,iBAAiB,MAAM,KAAK,0BAA0B,UAAU,YAAY;AAAA,IAClF,IAAI,CAAC,gBAAgB;AAAA,MACnB,MAAM,IAAI,MAAM,YAAY,UAAU,6FAA6F;AAAA,IACrI;AAAA,IAGA,MAAM,uBAAuB,MAAM,KAAK,WAAW,UAAU,cAAc,OAAO,aAAa;AAAA,MAC7F,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,MAAM,kBAAkB,uBAAuB,oBAAoB;AAAA,IAGnE,MAAM,YAAY,yBAAwB;AAAA,IAC1C,MAAM,KAAK,YAAY,UAAU,cAAc,UAAU;AAAA,MACvD,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa;AAAA,MACb,cAAc,UAAU;AAAA,MACxB,OAAO;AAAA,MACP,aAAa,OAAO;AAAA,MACpB,iBAAiB,OAAO;AAAA,MACxB,cAAc,MAAM,KAAK,YAAY;AAAA,MACrC,WAAW,eAAe;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,IAID,MAAM,KAAK,UAAU;AAAA,MACnB,cAAc,UAAU;AAAA,MACxB,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,IAChB,CAAC;AAAA,IAED,OAAO;AAAA,MACL,OAAO;AAAA,IACT;AAAA;AAAA,OAUY,0BAAyB,CACrC,eACsB;AAAA,IACtB,MAAM,UAAU,IAAI;AAAA,IAEpB,MAAM,gBAAgB,OAAO,QAA+B;AAAA,MAC1D,IAAI;AAAA,QACF,MAAM,UAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,QAE1D,WAAW,SAAS,SAAS;AAAA,UAC3B,MAAM,WAAW,MAAK,KAAK,MAAM,IAAI;AAAA,UAErC,IAAI,MAAM,YAAY,GAAG;AAAA,YAEvB,MAAM,cAAc,QAAQ;AAAA,UAC9B,EAAO,SAAI,MAAM,KAAK,SAAS,OAAO,GAAG;AAAA,YAEvC,IAAI;AAAA,cACF,MAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAAA,cAChD,MAAM,QAAQ,KAAK,MAAM,OAAO;AAAA,cAGhC,IAAI,MAAM,aAAa,UAAU,MAAM,QAAQ;AAAA,gBAC7C,QAAQ,IAAI,MAAM,MAAM;AAAA,cAC1B;AAAA,cACA,MAAM;AAAA,cAEN;AAAA;AAAA,UAEJ;AAAA,QACF;AAAA,QACA,MAAM;AAAA;AAAA,IAKV,MAAM,cAAc,aAAa;AAAA,IACjC,OAAO;AAAA;AAAA,OAGH,cAAa,CACjB,cACA,OACA,QACA,UACA,UACe;AAAA,IAEf,MAAM,SAAS,MAAM,KAAK,WAAW,cAAc,OAAO,EAAE,UAAU,QAAQ,OAAO,CAAC;AAAA,IACtF,MAAM,gBAAgB,wBAAwB,MAAM,IAAI;AAAA,IAGxD,MAAM,YAAY,yBAAwB;AAAA,IAE1C,MAAM,QAA0B;AAAA,MAC9B,UAAU;AAAA,MACV,SAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,cAAc,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,iBAAgB,CACpB,cACA,OACA,QACA,QACA,UACA,eAAwB,OACT;AAAA,IAEf,MAAM,gBAAgB,SAAS;AAAA,IAE/B,IAAI,kBAAkB,GAAG;AAAA,MACvB,MAAM,IAAI,MAAM,6CAA6C,QAAQ;AAAA,IACvE;AAAA,IAGA,IAAI,SAAS,QAAQ,SAAS,KAAK,SAAS,GAAG;AAAA,MAC7C,WAAW,OAAO,SAAS,MAAM;AAAA,QAE/B,MAAM,eAAe,IAAI;AAAA,QACzB,MAAM,WAA0B;AAAA,UAC9B,UAAU;AAAA,UACV,SAAa,gBAAgB,YAAY;AAAA,UACzC,aAAa;AAAA,UACjB;AAAA,UACI;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,QAAQ,IAAI;AAAA,UACZ,SAAS,IAAI;AAAA,UACb;AAAA,QACF;AAAA,QACA,MAAM,KAAK,YAAY,cAAc,OAAO,QAAQ;AAAA,MACtD;AAAA,IACF;AAAA,IAGA,MAAM,aAAa,cAAc,MAAM;AAAA,IACvC,MAAM,eAAe,WAAW,UAAU,WAAW,OAAO,WAAW;AAAA,IAGvE,MAAM,YAAY,yBAAwB;AAAA,IAE1C,MAAM,QAA4B;AAAA,MAChC,UAAU;AAAA,MACV,SAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY,SAAS;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,eAAc,CAClB,cACA,OACA,QACA,OACA,UAOe;AAAA,IACf,MAAM,MAAM,yBAAwB;AAAA,IAEpC,MAAM,QAAyB;AAAA,MAC7B,UAAU;AAAA,MACV,SAAa,gBAAgB,GAAG;AAAA,MAChC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA,mBAAmB,yBAAyB,OAAO,MAAM,KAAK;AAAA,MAC9D,YAAY,SAAS;AAAA,MACrB,eAAe,SAAS;AAAA,MACxB,UAAU,SAAS;AAAA,MACnB,eAAe,SAAS;AAAA,MACxB,eAAe,SAAS;AAAA,IAC1B;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,+BAA8B,CAClC,cACA,OACA,QACA,OACA,iBAQA,kBASe;AAAA,IASf,MAAM,kBAAkB,yBAAwB;AAAA,IAChD,MAAM,oBAAoB,kBAAkB;AAAA,IAC5C,MAAM,qBAAqB,kBAAkB;AAAA,IAG7C,MAAM,cAA+B;AAAA,MACnC,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAa,gBAAgB,eAAe;AAAA,MAC5C,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,mBAAmB,yBAAyB,OAAO,MAAM,KAAK;AAAA,MAC9D,YAAY,gBAAgB;AAAA,MAC5B,eAAe,gBAAgB;AAAA,MAC/B,UAAU;AAAA,MACV,eAAe,gBAAgB;AAAA,MAC/B,eAAe,gBAAgB;AAAA,MAC/B,aAAa,gBAAgB;AAAA,MAC7B,iBAAiB,gBAAgB;AAAA,IACnC;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,WAAW;AAAA,IAGvD,MAAM,gBAAmC;AAAA,MACvC,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAa,gBAAgB,iBAAiB;AAAA,MAC9C,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,gBAAgB;AAAA,MAC/B,aAAa,iBAAiB;AAAA,MAC9B,YAAY,iBAAiB;AAAA,MAC7B,eAAe,iBAAiB;AAAA,MAChC,aAAa,iBAAiB;AAAA,MAC9B;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,aAAa;AAAA,IAGzD,MAAM,iBAAqC;AAAA,MACzC,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAa,gBAAgB,kBAAkB;AAAA,MAC/C,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,iBAAiB;AAAA,MAChC,QAAQ;AAAA,MACR,eAAe,iBAAiB;AAAA,MAChC,cAAc,iBAAiB;AAAA,MAC/B,aAAa,iBAAiB;AAAA,MAC9B,iBAAiB,iBAAiB;AAAA,IACpC;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,cAAc;AAAA;AAAA,OAGtD,gBAAe,CACnB,cACA,OACA,QACA,UAQe;AAAA,IACf,MAAM,MAAM,yBAAwB;AAAA,IAEpC,MAAM,QAA0B;AAAA,MAC9B,UAAU;AAAA,MACV,SAAa,gBAAgB,GAAG;AAAA,MAChC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,UAAU,SAAS;AAAA,MACnB,QAAQ,SAAS;AAAA,MACjB,UAAU,SAAS;AAAA,MACnB,YAAY,SAAS;AAAA,MACrB,eAAe,SAAS;AAAA,MACxB,cAAc,SAAS;AAAA,IACzB;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,mBAAkB,CACtB,cACA,OACA,QACA,YAQe;AAAA,IACf,MAAM,MAAM,yBAAwB;AAAA,IAEpC,MAAM,QAAQ;AAAA,MACZ,UAAU;AAAA,MACV,SAAa,gBAAgB,GAAG;AAAA,MAChC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM,WAAW;AAAA,MACjB,gBAAgB,WAAW;AAAA,MAC3B,eAAe,WAAW;AAAA,MAC1B,MAAM,WAAW;AAAA,SACb,WAAW,SAAS,EAAE,OAAO,WAAW,MAAM;AAAA,SAC9C,WAAW,oBAAoB;AAAA,QACjC,kBAAkB,WAAW;AAAA,MAC/B;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,yBAAwB,CAC5B,cACA,OACA,QACA,YAMe;AAAA,IACf,MAAM,MAAM,yBAAwB;AAAA,IAEpC,MAAM,QAAQ;AAAA,MACZ,UAAU;AAAA,MACV,SAAa,gBAAgB,GAAG;AAAA,MAChC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM,WAAW;AAAA,MACjB,gBAAgB,WAAW;AAAA,MAC3B,eAAe,WAAW;AAAA,MAC1B,OAAO,WAAW;AAAA,IACpB;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,kBAAiB,CACrB,cACA,OACA,QACA,UAMe;AAAA,IACf,MAAM,MAAM,yBAAwB;AAAA,IAEpC,MAAM,QAA4B;AAAA,MAChC,UAAU;AAAA,MACV,SAAa,gBAAgB,GAAG;AAAA,MAChC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,eAAe,SAAS;AAAA,MACxB,QAAQ,SAAS;AAAA,MACjB,eAAe,SAAS;AAAA,MACxB,cAAc,SAAS;AAAA,IACzB;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,kBAAiB,CACrB,cACA,OACA,QACA,UACA,eACe;AAAA,IACf,MAAM,MAAM,yBAAwB;AAAA,IAEpC,MAAM,QAA4B;AAAA,MAChC,UAAU;AAAA,MACV,SAAa,gBAAgB,GAAG;AAAA,MAChC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,kBAAiB,CACrB,cACA,OACA,QACA,UAQe;AAAA,IACf,MAAM,MAAM,yBAAwB;AAAA,IAEpC,MAAM,QAA4B;AAAA,MAChC,UAAU;AAAA,MACV,SAAa,gBAAgB,GAAG;AAAA,MAChC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,kBAAkB,SAAS;AAAA,MAC3B,aAAa,SAAS;AAAA,MACtB,iBAAiB,SAAS;AAAA,MAC1B,kBAAkB,SAAS;AAAA,MAC3B,iBAAiB,SAAS;AAAA,MAC1B,eAAe,SAAS;AAAA,IAC1B;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,qBAAoB,CACxB,cACA,OACA,QACA,UACe;AAAA,IAEf,MAAM,aAAa,cAAc,MAAM;AAAA,IACvC,MAAM,eAAe,WAAW,UAAU,WAAW,OAAO,WAAW;AAAA,IAGvE,MAAM,YAAY,yBAAwB;AAAA,IAE1C,MAAM,QAAgC;AAAA,MACpC,UAAU;AAAA,MACV,SAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,uBAAuB,SAAS;AAAA,MAChC,QAAQ;AAAA,MACR,YAAY,SAAS;AAAA,MACrB,YAAY,SAAS;AAAA,IACvB;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,aAAY,CAChB,eACA,QACA,SACA,OACe;AAAA,OAMX,aAAY,CAChB,cACA,OACA,QACA,eAC4B;AAAA,IAE5B,MAAM,SAAS,MAAM,KAAK,WAAW,cAAc,OAAO,EAAE,UAAU,QAAQ,OAAO,CAAC;AAAA,IACtF,IAAI,OAAO,sBAAsB,MAAM;AAAA,IAGvC,IAAI,kBAAkB,WAAW;AAAA,MAC/B,OAAO,KAAK,OAAO,SAAO,IAAI,kBAAkB,aAAa;AAAA,IAC/D;AAAA,IAEA,OAAO,KAAK,SAAS,IAAI,OAAO;AAAA;AAAA,OAG5B,QAAO,CAAC,cAAsB,OAAsC;AAAA,IACxE,IAAI;AAAA,MAEF,MAAM,SAAS,MAAM,KAAK,WAAW,cAAc,OAAO,EAAE,UAAU,OAAO,CAAC;AAAA,MAE9E,IAAI,OAAO,WAAW,GAAG;AAAA,QACvB,OAAO,CAAC;AAAA,MACV;AAAA,MAGA,MAAM,eAAe,IAAI;AAAA,MACzB,WAAW,SAAS,QAAQ;AAAA,QAE1B,IAAI,MAAM,aAAa,QAAQ;AAAA,UAC7B,IAAI,CAAC,aAAa,IAAI,MAAM,MAAM,GAAG;AAAA,YACnC,aAAa,IAAI,MAAM,QAAQ,CAAC,CAAC;AAAA,UACnC;AAAA,UACA,aAAa,IAAI,MAAM,MAAM,EAAG,KAAK,KAAK;AAAA,QAC5C;AAAA,MACF;AAAA,MAGA,MAAM,UAAwB,CAAC;AAAA,MAC/B,YAAY,SAAS,eAAe,cAAc;AAAA,QAChD,MAAM,SAAS,kBAAkB,UAAU;AAAA,QAC3C,QAAQ,KAAK,MAAM;AAAA,MACrB;AAAA,MAEA,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO,CAAC;AAAA;AAAA;AAAA,OAIN,UAAS,CAAC,cAAsB,OAAiC;AAAA,IACrE,IAAI;AAAA,MACF,MAAM,SAAS,KAAK,MAAM,UAAU,cAAc,KAAK;AAAA,MACvD,MAAM,OAAO,MAAM;AAAA,MACnB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,kBAAiB,CACrB,cACA,OACA,UACe;AAAA,IACf,MAAM,YAAY,yBAAwB;AAAA,IAE1C,MAAM,QAA8B;AAAA,MAClC,UAAU;AAAA,MACV,SAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,WAAW,SAAS;AAAA,MACpB,uBAAuB,SAAS;AAAA,MAChC,gBAAgB,SAAS;AAAA,MACzB,UAAU,SAAS;AAAA,IACrB;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,4BAA2B,CAC/B,cACA,OACA,QAOe;AAAA,IACf,MAAM,YAAY,yBAAwB;AAAA,IAE1C,MAAM,QAAsC;AAAA,MAC1C,UAAU;AAAA,MACV,SAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,MAAM;AAAA,SACH;AAAA,IACL;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,mBAAkB,CACtB,cACA,OACA,OACA,UACA,eACe;AAAA,IACf,MAAM,YAAY,yBAAwB;AAAA,IAE1C,MAAM,QAA6B;AAAA,MACjC,UAAU;AAAA,MACV,SAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,uBAAuB,SAAS;AAAA,MAChC;AAAA,MACA,YAAY,SAAS;AAAA,MACrB,gBAAgB,SAAS;AAAA,MACzB,YAAY,SAAS;AAAA,MACrB;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,oBAAmB,CACvB,cACA,OACA,UACe;AAAA,IACf,MAAM,YAAY,yBAAwB;AAAA,IAE1C,MAAM,QAA8B;AAAA,MAClC,UAAU;AAAA,MACV,SAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,WAAW,SAAS;AAAA,MACpB,eAAe,SAAS;AAAA,MACxB,cAAc,SAAS;AAAA,MACvB,cAAc,SAAS;AAAA,IACzB;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,sBAAqB,CACzB,cACA,OACA,UACe;AAAA,IACf,MAAM,YAAY,yBAAwB;AAAA,IAE1C,MAAM,QAAgC;AAAA,MACpC,UAAU;AAAA,MACV,SAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,uBAAuB,SAAS;AAAA,MAChC,QAAQ,SAAS;AAAA,MACjB,YAAY,SAAS;AAAA,MACrB,gBAAgB,SAAS;AAAA,IAC3B;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,yBAAwB,CAC5B,cACA,OACA,UAMe;AAAA,IACf,MAAM,YAAY,yBAAwB;AAAA,IAE1C,MAAM,QAAmC;AAAA,MACvC,UAAU;AAAA,MACV,SAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,uBAAuB,SAAS;AAAA,MAChC,uBAAuB,SAAS;AAAA,MAChC,cAAc,SAAS;AAAA,MACvB,QAAQ,SAAS;AAAA,IACnB;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAG7C,eAAc,CAClB,cACA,OAOA;AAAA,IAEA,MAAM,SAAS,MAAM,KAAK,WAAW,cAAc,OAAO;AAAA,MACxD,UAAU;AAAA,IACZ,CAAC;AAAA,IAED,IAAI,OAAO,WAAW,KAAK,EAAE,cAAc,OAAO,KAAM;AAAA,MACtD,OAAO,CAAC;AAAA,IACV;AAAA,IAGA,MAAM,eAAe,IAAI;AAAA,IACzB,WAAW,SAAS,QAAQ;AAAA,MAC1B,IAAI,MAAM,aAAa,QAAQ;AAAA,QAC7B,MAAM,aAAa,aAAa,IAAI,MAAM,MAAM,KAAK,CAAC;AAAA,QACtD,WAAW,KAAK,KAAkB;AAAA,QAClC,aAAa,IAAI,MAAM,QAAQ,UAAU;AAAA,MAC3C;AAAA,IACF;AAAA,IAGA,MAAM,cAID,CAAC;AAAA,IAEN,YAAY,QAAQ,eAAe,cAAc;AAAA,MAC/C,MAAM,QAAQ,iBAAiB,YAAY,YAAY;AAAA,MACvD,IAAI,MAAM,WAAW,YAAY,MAAM,YAAY,MAAM,OAAO;AAAA,QAC9D,YAAY,KAAK;AAAA,UACf;AAAA,UACA,OAAO,MAAM;AAAA,UACb,eAAe,MAAM;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,OAAO;AAAA;AAAA,OAOH,iBAAgB,CACpB,cACA,OACA,UAWe;AAAA,IACf,MAAM,YAAY,yBAAwB;AAAA,IAE1C,MAAM,QAA2B;AAAA,MAC/B,UAAU;AAAA,MACV,SAAa,gBAAgB,SAAS;AAAA,MACtC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,WAAW,SAAS;AAAA,MACpB,eAAe,SAAS;AAAA,MACxB,UAAU,SAAS;AAAA,MACnB,OAAO,SAAS;AAAA,MAChB,gBAAgB,SAAS;AAAA,MACzB,WAAW,SAAS;AAAA,MACpB,gBAAgB,SAAS;AAAA,MACzB,UAAU,SAAS;AAAA,MACnB,MAAM,SAAS;AAAA,IACjB;AAAA,IAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA;AAAA,OAQ7C,UAAS,CAAC,YAAuE;AAAA,IAErF,IAAI,WAAW,gBAAgB;AAAA,MAC7B,MAAM,OAAW,mBAAmB,WAAW,cAAc;AAAA,MAC7D,MAAM,kBAAkB,MAAK,KAAK,MAAM,kBAAkB,GAAG,GAAG,WAAW;AAAA,MAE3E,IAAI;AAAA,QACF,MAAM,UAAU,MAAM,SAAS,iBAAiB,OAAO;AAAA,QACvD,MAAM,WAAW,KAAK,MAAM,OAAO;AAAA,QACnC,OAAO,EAAE,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,QAC7C,MAAM;AAAA,IAGV;AAAA,IAGA,MAAM,QAAQ,WAAW,SAAa,cAAc;AAAA,IACpD,MAAM,MAAM,yBAAwB;AAAA,IACpC,MAAM,cAAc,WAAW,eAAe;AAAA,IAC9C,MAAM,WAAW,WAAW,YAAY;AAAA,IAGxC,MAAM,KAAK,cAAc,WAAW,cAAc,KAAK;AAAA,IAGvD,MAAM,mBAAmB,MAAM,KAAK,oBAAoB,WAAW,YAAY;AAAA,IAC/E,MAAM,iBAAiB,CAAC,CAAE,kBAAkB;AAAA,IAG5C,MAAM,iBAAiB,MAAM,KAAK,0BAA0B,WAAW,YAAY;AAAA,IACnF,IAAI,CAAC,gBAAgB;AAAA,MACnB,MAAM,IAAI,MAAM,YAAY,WAAW,6FAA6F;AAAA,IACtI;AAAA,IAIA,MAAM,KAAK,iBAAiB,WAAW,cAAc,OAAO;AAAA,MAC1D,WAAW,eAAe;AAAA,MAC1B;AAAA,MACA;AAAA,MACA,OAAO,WAAW,UAAU,YAAY,KAAK,UAAU,WAAW,KAAK,IAAI;AAAA,MAC3E;AAAA,MACA,SAAS,WAAW;AAAA,MACpB,gBAAgB,WAAW;AAAA,MAC3B,UAAU,WAAW;AAAA,MACrB,MAAM,WAAW;AAAA,IACnB,CAAC;AAAA,IAGD,IAAI,WAAW,gBAAgB;AAAA,MAC7B,MAAM,OAAW,mBAAmB,WAAW,cAAc;AAAA,MAC7D,MAAM,iBAAiB,KAAK,MAAM,kBAAkB;AAAA,MACpD,MAAM,OAAM,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAAA,MAC/C,MAAM,kBAAkB,MAAK,gBAAgB,GAAG,WAAW;AAAA,MAC3D,MAAgB,gBAAgB,iBAAiB,EAAE,OAAO,WAAW,IAAI,CAAC;AAAA,IAC5E;AAAA,IAEA,OAAO,EAAE,OAAO,OAAO,KAAK;AAAA;AAAA,OAIxB,SAAQ,CAAC,SAKS;AAAA,IACtB,IAAI;AAAA,MACF,MAAM,UAAsB,CAAC;AAAA,MAG7B,MAAM,YAAY,MAAM,QAAQ,KAAK,OAAO;AAAA,MAE5C,WAAW,gBAAgB,WAAW;AAAA,QAEpC,IAAI,aAAa,WAAW,GAAG;AAAA,UAAG;AAAA,QAGlC,IAAI,SAAS,gBAAgB,iBAAiB,QAAQ;AAAA,UAAc;AAAA,QAEpE,MAAM,cAAc,MAAK,KAAK,SAAS,YAAY;AAAA,QACnD,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,QAEzC,WAAW,SAAS,SAAS;AAAA,UAC3B,IAAI;AAAA,YAEF,MAAM,SAAS,MAAM,KAAK,WAAW,cAAc,OAAO,EAAE,UAAU,WAAW,CAAC;AAAA,YAElF,IAAI,OAAO,WAAW;AAAA,cAAG;AAAA,YAEzB,MAAM,QAAQ,0BAA0B,QAAQ,YAAY;AAAA,YAG5D,IAAI,SAAS,UAAU,QAAQ,OAAO,SAAS,GAAG;AAAA,cAChD,IAAI,CAAC,QAAQ,OAAO,SAAS,MAAM,MAAM;AAAA,gBAAG;AAAA,YAC9C;AAAA,YAGA,IAAI,SAAS,QAAQ,QAAQ,KAAK,SAAS,GAAG;AAAA,cAC5C,MAAM,YAAY,MAAM,QAAQ,CAAC;AAAA,cACjC,MAAM,aAAa,QAAQ,KAAK,MAAM,CAAC,QAAQ,UAAU,SAAS,GAAG,CAAC;AAAA,cACtE,IAAI,CAAC;AAAA,gBAAY;AAAA,YACnB;AAAA,YAEA,QAAQ,KAAK,KAAK;AAAA,YAClB,MAAM;AAAA,YAEN;AAAA;AAAA,QAEJ;AAAA,MACF;AAAA,MAGA,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,MAGhD,OAAO,SAAS,QAAQ,QAAQ,MAAM,GAAG,QAAQ,KAAK,IAAI;AAAA,MAC1D,MAAM;AAAA,MACN,OAAO,CAAC;AAAA;AAAA;AAAA,OAKN,UAAS,CAAC,OAAe,QAAgC;AAAA,IAE7D,MAAM,YAAY,MAAM,QAAQ,KAAK,OAAO;AAAA,IAE5C,WAAW,YAAY,WAAW;AAAA,MAChC,IAAI,SAAS,WAAW,GAAG;AAAA,QAAG;AAAA,MAE9B,MAAM,SAAS,KAAK,MAAM,UAAU,UAAU,KAAK;AAAA,MAEnD,IAAI;AAAA,QACF,MAAM,OAAO,MAAM;AAAA,QACnB,MAAM;AAAA,QACN;AAAA;AAAA,MAIF,MAAM,SAAS,MAAM,KAAK,WAAW,UAAU,OAAO,EAAE,UAAU,WAAW,CAAC;AAAA,MAC9E,IAAI,OAAO,WAAW;AAAA,QAAG;AAAA,MAEzB,MAAM,QAAQ,0BAA0B,QAAQ,QAAQ;AAAA,MAGxD,MAAM,WAAW,yBAAwB,IAAI,MAAM;AAAA,MAGnD,MAAM,cAAc,MAAM,KAAK,QAAQ,UAAU,KAAK;AAAA,MACtD,MAAM,iBAAiB,YAAY,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE;AAAA,MAG3E,MAAM,KAAK,sBAAsB,UAAU,OAAO;AAAA,QAChD,uBAAuB,MAAM,yBAAyB;AAAA,QACtD;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MAED;AAAA,IACF;AAAA;AAAA,OAGI,OAAM,CAAC,OAAyC;AAAA,IACpD,IAAI;AAAA,MAEF,MAAM,YAAY,MAAM,QAAQ,KAAK,OAAO;AAAA,MAE5C,WAAW,gBAAgB,WAAW;AAAA,QACpC,IAAI,aAAa,WAAW,GAAG;AAAA,UAAG;AAAA,QAElC,MAAM,SAAS,KAAK,MAAM,UAAU,cAAc,KAAK;AAAA,QAEvD,IAAI;AAAA,UACF,MAAM,OAAO,MAAM;AAAA,UACnB,MAAM;AAAA,UACN;AAAA;AAAA,QAIF,MAAM,SAAS,MAAM,KAAK,WAAW,cAAc,OAAO,EAAE,UAAU,WAAW,CAAC;AAAA,QAElF,IAAI,OAAO,WAAW;AAAA,UAAG,OAAO;AAAA,QAEhC,OAAO,0BAA0B,QAAQ,YAAY;AAAA,MACvD;AAAA,MAEA,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OASL,oBAAmB,GAAsB;AAAA,IAC7C,MAAM,kBAA4B,CAAC;AAAA,IAEnC,IAAI;AAAA,MAEF,MAAM,YAAY,MAAM,QAAQ,KAAK,OAAO;AAAA,MAE5C,WAAW,gBAAgB,WAAW;AAAA,QACpC,IAAI,aAAa,WAAW,GAAG;AAAA,UAAG;AAAA,QAElC,MAAM,cAAc,MAAK,KAAK,SAAS,YAAY;AAAA,QACnD,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,QAGzC,WAAW,SAAS,SAAS;AAAA,UAC3B,IAAI;AAAA,YACF,MAAM,iBAAiB,MAAM,KAAK,WAAW,cAAc,OAAO,EAAE,UAAU,WAAW,CAAC;AAAA,YAE1F,IAAI,eAAe,WAAW;AAAA,cAAG;AAAA,YAEjC,MAAM,WAAW,0BAA0B,gBAAgB,YAAY;AAAA,YAGvE,IAAI,SAAS,WAAW,aAAa,SAAS,WAAW,aAAa,SAAS,WAAW,WAAW;AAAA,cACnG,gBAAgB,KAAK,YAAY;AAAA,cACjC;AAAA,YACF;AAAA,YACA,MAAM;AAAA,YACN;AAAA;AAAA,QAEJ;AAAA,MACF;AAAA,MAEA,OAAO,MAAM,KAAK,IAAI,IAAI,eAAe,CAAC;AAAA,MAC1C,MAAM;AAAA,MACN,OAAO,CAAC;AAAA;AAAA;AAAA,OAIN,mBAAkB,CAAC,SAImD;AAAA,IAC1E,MAAM,MAAM,yBAAwB;AAAA,IACpC,MAAM,kBAAkB,SAAS,mBAAmB;AAAA,IACpD,MAAM,iBAAsG,CAAC;AAAA,IAE7G,IAAI;AAAA,MAEF,MAAM,YAAY,MAAM,QAAQ,KAAK,OAAO;AAAA,MAE5C,WAAW,gBAAgB,WAAW;AAAA,QACpC,IAAI,aAAa,WAAW,GAAG;AAAA,UAAG;AAAA,QAClC,IAAI,SAAS,gBAAgB,iBAAiB,QAAQ;AAAA,UAAc;AAAA,QAEpE,MAAM,cAAc,MAAK,KAAK,SAAS,YAAY;AAAA,QACnD,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,QAEzC,WAAW,SAAS,SAAS;AAAA,UAC3B,IAAI;AAAA,YACF,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,cAAc,KAAK;AAAA,YAGrE,IAAI;AAAA,cACF,MAAM,OAAO,aAAa;AAAA,cAC1B,MAAM;AAAA,cACN;AAAA;AAAA,YAKF,MAAM,UAAU,MAAM,KAAK,0BAA0B,aAAa;AAAA,YAGlE,WAAW,UAAU,SAAS;AAAA,cAC5B,MAAM,SAAS,MAAM,KAAK,WAAW,cAAc,OAAO,EAAE,UAAU,QAAQ,OAAO,CAAC;AAAA,cAEtF,IAAI,OAAO,WAAW;AAAA,gBAAG;AAAA,cAEzB,MAAM,QAAQ,iBAAiB,QAAuB,YAAY;AAAA,cAGlE,IAAI,MAAM,WAAW,eAAe,MAAM,eAAe,MAAM,eAAe,iBAAiB;AAAA,gBAC7F,eAAe,KAAK;AAAA,kBAClB;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,aAAa,MAAM;AAAA,gBACrB,CAAC;AAAA,cACH;AAAA,YACF;AAAA,YACA,MAAM;AAAA,YACN;AAAA;AAAA,QAEJ;AAAA,MACF;AAAA,MAGA,eAAe,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW;AAAA,MAG3D,MAAM,UAAU,SAAS,QAAQ,eAAe,MAAM,GAAG,QAAQ,KAAK,IAAI;AAAA,MAG1E,OAAO,QAAQ,IAAI,GAAG,cAAc,OAAO,cAAc,EAAE,cAAc,OAAO,OAAO,EAAE;AAAA,MACzF,MAAM;AAAA,MACN,OAAO,CAAC;AAAA;AAAA;AAAA,OAIN,gBAAe,CACnB,cACA,OACA,QACkB;AAAA,IAClB,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,KAAK,WAAW,cAAc,OAAO,EAAE,UAAU,QAAQ,OAAO,CAAC;AAAA,MAEtF,IAAI,OAAO,WAAW;AAAA,QAAG,OAAO;AAAA,MAEhC,MAAM,QAAQ,iBAAiB,QAAuB,YAAY;AAAA,MAClE,MAAM,MAAM,yBAAwB;AAAA,MAEpC,OAAO,MAAM,WAAW,eACjB,MAAM,gBAAgB,aACtB,MAAM,eAAe;AAAA,MAC5B,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAIL,mBAAkB,CACtB,cACA,OACA,QACA,UACA,UAC2C;AAAA,IAC3C,MAAM,gBAAgB,MAAM,KAAK,WAAW,cAAc,OAAO,EAAE,UAAU,QAAQ,OAAO,CAAC;AAAA,IAE7F,IAAI,cAAc,WAAW,GAAG;AAAA,MAC9B,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,MAAM,yBAAwB;AAAA,IACpC,MAAM,eAAe,iBAAiB,eAA8B,YAAY;AAAA,IAEhF,IACE,aAAa,WAAW,eACxB,aAAa,gBAAgB,aAC7B,aAAa,cAAc,KAC3B;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,gBAAgB,aAAa;AAAA,IACnC,MAAM,WAAW,KAAK,MAAM,qBAAqB,cAAc,OAAO,QAAQ,aAAa;AAAA,IAC3F,MAAM,OAAM,SAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAElD,IAAI,aAAgC;AAAA,IACpC,IAAI;AAAA,MACF,aAAa,MAAM,UAAS,UAAU,IAAI;AAAA,MAC1C,OAAO,OAAO;AAAA,MACd,IAAK,MAAgC,SAAS,UAAU;AAAA,QACtD,OAAO;AAAA,MACT;AAAA,MACA,MAAM;AAAA;AAAA,IAGR,IAAI;AAAA,MACF,MAAM,gBAAgB,MAAM,KAAK,WAAW,cAAc,OAAO,EAAE,UAAU,QAAQ,OAAO,CAAC;AAAA,MAE7F,IAAI,cAAc,WAAW,GAAG;AAAA,QAC9B,OAAO;AAAA,MACT;AAAA,MAEA,MAAM,eAAe,iBAAiB,eAA8B,YAAY;AAAA,MAChF,MAAM,YACJ,aAAa,WAAW,eACxB,aAAa,gBAAgB,aAC7B,aAAa,eAAe,yBAAwB,KACpD,aAAa,kBAAkB;AAAA,MAEjC,IAAI,CAAC,WAAW;AAAA,QACd,OAAO;AAAA,MACT;AAAA,MAEA,MAAM,YAAY,yBAAwB;AAAA,MAE1C,MAAM,QAA0B;AAAA,QAC9B,UAAU;AAAA,QACV,SAAa,gBAAgB,SAAS;AAAA,QACtC,aAAa;AAAA,QACf;AAAA,QACE;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA,cAAc,SAAS;AAAA,QACvB;AAAA,MACF;AAAA,MAEA,MAAM,KAAK,YAAY,cAAc,OAAO,KAAK;AAAA,MAEjD,OAAO,EAAE,cAAc;AAAA,cACvB;AAAA,MACA,IAAI,YAAY;AAAA,QACd,IAAI;AAAA,UACF,MAAM,WAAW,MAAM;AAAA,UACvB,MAAM;AAAA,QAGR,IAAI;AAAA,UACF,MAAM,QAAO,QAAQ;AAAA,UACrB,OAAO,OAAO;AAAA,UACd,IAAK,MAAgC,SAAS,UAAU;AAAA,YACtD,MAAM;AAAA,UACR;AAAA;AAAA,MAEJ;AAAA;AAAA;AAAA,OAIE,kBAAiB,CACrB,gBACA,aACyE;AAAA,IACzE,MAAM,YAA4E,CAAC;AAAA,IACnF,MAAM,MAAM,yBAAwB;AAAA,IAEpC,IAAI;AAAA,MAEF,MAAM,YAAY,MAAM,QAAQ,KAAK,OAAO;AAAA,MAE5C,WAAW,gBAAgB,WAAW;AAAA,QACpC,IAAI,aAAa,WAAW,GAAG;AAAA,UAAG;AAAA,QAElC,MAAM,cAAc,MAAK,KAAK,SAAS,YAAY;AAAA,QACnD,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,QAEzC,WAAW,SAAS,SAAS;AAAA,UAC3B,IAAI;AAAA,YACF,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,cAAc,KAAK;AAAA,YAGrE,IAAI;AAAA,cACF,MAAM,OAAO,aAAa;AAAA,cAC1B,MAAM;AAAA,cACN;AAAA;AAAA,YAKF,MAAM,UAAU,MAAM,KAAK,0BAA0B,aAAa;AAAA,YAGlE,WAAW,UAAU,SAAS;AAAA,cAC5B,MAAM,SAAS,MAAM,KAAK,WAAW,cAAc,OAAO,EAAE,UAAU,QAAQ,OAAO,CAAC;AAAA,cAEtF,IAAI,OAAO,WAAW;AAAA,gBAAG;AAAA,cAEzB,MAAM,QAAQ,iBAAiB,QAAuB,YAAY;AAAA,cAGlE,IAAI,MAAM,WAAW;AAAA,gBAAW;AAAA,cAGhC,MAAM,gBAAgB,MAAM,iBAAiB,MAAM,aAAa;AAAA,cAChE,MAAM,gBAAgB,MAAM;AAAA,cAE5B,IAAI,gBAAgB,gBAAgB;AAAA,gBAElC,MAAM,KAAK,kBAAkB,cAAc,OAAO,QAAQ;AAAA,kBACxD,kBAAkB,MAAM,aAAa;AAAA,kBACrC;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,eAAe,MAAM;AAAA,gBACvB,CAAC;AAAA,gBAGD,MAAM,KAAK,kBAAkB,cAAc,OAAO,QAAQ;AAAA,kBACxD,aAAa;AAAA,kBACb,QAAQ;AAAA,kBACR,eAAe,MAAM,gBAAgB;AAAA,kBACrC,cAAc;AAAA,gBAChB,CAAC;AAAA,gBAED,UAAU,KAAK,EAAE,cAAc,OAAO,OAAO,CAAC;AAAA,cAChD;AAAA,YACF;AAAA,YACA,MAAM;AAAA,YACN;AAAA;AAAA,QAEJ;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAkBL,iBAAgB,CAAC,cAAmD;AAAA,IACxE,MAAM,cAAc,KAAK,MAAM,uBAAuB,aAAa,IAAI;AAAA,IAEvE,IAAI;AAAA,MAEF,MAAM,OAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,MAG5C,MAAM,eAAe,MAAK,aAAa,eAAe;AAAA,MACtD,MAAM,WAA6B;AAAA,QACjC,MAAM,aAAa;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,aAAa;AAAA,QACvB,iBAAiB,aAAa;AAAA,MAChC;AAAA,MACA,MAAM,WAAU,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AAAA,MAGxE,MAAM,YAAY,MAAK,aAAa,YAAY;AAAA,MAChD,MAAM,WAAU,WAAW,KAAK,UAAU,aAAa,OAAO,MAAM,CAAC,GAAG,OAAO;AAAA,MAC/E,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,+BAA+B,aAAa,SAAS,KAAK;AAAA,MACxE,MAAM,IAAI,MAAM,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;AAAA;AAAA;AAAA,OAOxG,oBAAmB,CAAC,MAAgD;AAAA,IACxE,MAAM,eAAe,MAAK,KAAK,MAAM,uBAAuB,IAAI,GAAG,eAAe;AAAA,IAElF,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,SAAS,cAAc,OAAO;AAAA,MACpD,OAAO,KAAK,MAAM,OAAO;AAAA,MACzB,OAAO,OAAO;AAAA,MACd,IAAI,SAAS,OAAO,UAAU,YAAY,UAAU,SAAS,MAAM,SAAS,UAAU;AAAA,QACpF,OAAO;AAAA,MACT;AAAA,MACA,QAAQ,MAAM,uCAAuC,SAAS,KAAK;AAAA,MACnE,MAAM,IAAI,MAAM,qCAAqC,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;AAAA;AAAA;AAAA,OAO7G,qBAAoB,GAAgC;AAAA,IACxD,MAAM,cAAc,KAAK,MAAM,eAAe;AAAA,IAE9C,IAAI;AAAA,MAEF,IAAI;AAAA,QACF,MAAM,OAAO,WAAW;AAAA,QACxB,MAAM;AAAA,QAEN,OAAO,CAAC;AAAA;AAAA,MAGV,MAAM,UAAU,MAAM,QAAQ,aAAa,EAAE,eAAe,KAAK,CAAC;AAAA,MAClE,MAAM,YAAgC,CAAC;AAAA,MAEvC,WAAW,SAAS,SAAS;AAAA,QAC3B,IAAI,MAAM,YAAY,GAAG;AAAA,UACvB,MAAM,WAAW,MAAM,KAAK,oBAAoB,MAAM,IAAI;AAAA,UAC1D,IAAI,UAAU;AAAA,YACZ,UAAU,KAAK,QAAQ;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,6BAA6B,KAAK;AAAA,MAChD,MAAM,IAAI,MAAM,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;AAAA;AAAA;AAAA,OAOrG,iBAAgB,CAAC,MAAyC;AAAA,IAC9D,MAAM,YAAY,MAAK,KAAK,MAAM,uBAAuB,IAAI,GAAG,YAAY;AAAA,IAE5E,IAAI;AAAA,MACF,MAAM,UAAU,MAAM,SAAS,WAAW,OAAO;AAAA,MACjD,OAAO,KAAK,MAAM,OAAO;AAAA,MACzB,OAAO,OAAO;AAAA,MACd,IAAI,SAAS,OAAO,UAAU,YAAY,UAAU,SAAS,MAAM,SAAS,UAAU;AAAA,QACpF,OAAO,CAAC;AAAA,MACV;AAAA,MACA,QAAQ,MAAM,oCAAoC,SAAS,KAAK;AAAA,MAChE,MAAM,IAAI,MAAM,kCAAkC,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;AAAA;AAAA;AAAA,OAO1G,WAAU,CAAC,cAAyC;AAAA,IACxD,MAAM,cAAc,MAAK,KAAK,SAAS,YAAY;AAAA,IAEnD,IAAI;AAAA,MAEF,IAAI;AAAA,QACF,MAAM,OAAO,WAAW;AAAA,QACxB,MAAM;AAAA,QAEN,OAAO,CAAC;AAAA;AAAA,MAGV,MAAM,UAAU,MAAM,QAAQ,aAAa,EAAE,eAAe,KAAK,CAAC;AAAA,MAClE,MAAM,SAAmB,CAAC;AAAA,MAE1B,WAAW,SAAS,SAAS;AAAA,QAC3B,IAAI,MAAM,YAAY,KAAK,MAAM,SAAS,aAAa;AAAA,UACrD,OAAO,KAAK,MAAM,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,MAEA,OAAO;AAAA,MACP,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,uCAAuC,iBAAiB,KAAK;AAAA,MAC3E,MAAM,IAAI,MAAM,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;AAAA;AAAA;AAAA,OAWnG,sBAAqB,CAAC,SAAgE;AAAA,IAC1F,MAAM,aAAa,MACjB,KAAK,MAAM,uBAAuB,QAAQ,YAAY,GACtD,YACA,QAAQ,SACV;AAAA,IAEA,IAAI;AAAA,MAEF,MAAM,OAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,MAG3C,MAAM,cAAc,MAAK,YAAY,cAAc;AAAA,MAGnD,IAAI;AAAA,QACF,MAAM,OAAO,WAAW;AAAA,QAExB;AAAA,QACA,MAAM;AAAA,MAIR,MAAM,WAAU,aAAa,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,OAAO;AAAA,MACtE,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,qCAAqC,QAAQ,cAAc,KAAK;AAAA,MAC9E,MAAM,IAAI,MAAM,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;AAAA;AAAA;AAAA,OAQtG,2BAA0B,CAAC,cAAkD;AAAA,IACzF,MAAM,cAAc,MAClB,KAAK,MAAM,uBAAuB,YAAY,GAC9C,UACF;AAAA,IAEA,IAAI;AAAA,MACF,MAAM,OAAO,WAAW;AAAA,MACxB,MAAM;AAAA,MACN,OAAO,CAAC;AAAA;AAAA,IAGV,MAAM,UAAU,MAAM,QAAQ,aAAa,EAAE,eAAe,KAAK,CAAC;AAAA,IAClE,MAAM,WAAuF,CAAC;AAAA,IAG9F,WAAW,SAAS,SAAS;AAAA,MAC3B,IAAI,MAAM,YAAY,GAAG;AAAA,QACvB,MAAM,cAAc,MAAK,aAAa,MAAM,MAAM,cAAc;AAAA,QAChE,IAAI;AAAA,UACF,MAAM,UAAU,MAAM,SAAS,aAAa,OAAO;AAAA,UACnD,MAAM,SAAS,KAAK,MAAM,OAAO;AAAA,UACjC,SAAS,KAAK,MAAM;AAAA,UACpB,MAAM;AAAA,UAEN;AAAA;AAAA,MAEJ;AAAA,IACF;AAAA,IAGA,SAAS,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,IAGjD,MAAM,sBAAsB,SAAS,IAAI,CAAC,SAAS,WAAW;AAAA,SACzD;AAAA,MACH,eAAe,QAAQ;AAAA,IACzB,EAAE;AAAA,IAGF,OAAO,oBAAoB,IAAI,OAAK,sBAAsB,MAAM,CAAC,CAAC;AAAA;AAAA,OAM9D,mBAAkB,CAAC,cAAsB,WAAoD;AAAA,IACjG,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,KAAK,2BAA2B,YAAY;AAAA,MACnE,OAAO,SAAS,KAAK,OAAK,EAAE,cAAc,SAAS,KAAK;AAAA,MACxD,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,kCAAkC,cAAc,KAAK;AAAA,MACnE,MAAM,IAAI,MAAM,oCAAoC,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;AAAA;AAAA;AAAA,OAO5G,0BAAyB,CAAC,cAAuD;AAAA,IACrF,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,KAAK,2BAA2B,YAAY;AAAA,MAEnE,OAAO,SAAS,SAAS,SAAS,MAAM;AAAA,MACxC,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,8CAA8C,iBAAiB,KAAK;AAAA,MAClF,MAAM,IAAI,MAAM,2CAA2C,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;AAAA;AAAA;AAAA,OAOnH,qBAAoB,CAAC,cAAsB,SAA0D;AAAA,IACzG,IAAI;AAAA,MACF,MAAM,WAAW,MAAM,KAAK,2BAA2B,YAAY;AAAA,MAGnE,MAAM,QAAQ,SAAS,SAAS,SAAS;AAAA,MACzC,OAAO,SAAS,MAAM,GAAG,KAAK;AAAA,MAC9B,OAAO,OAAO;AAAA,MACd,QAAQ,MAAM,wCAAwC,iBAAiB,KAAK;AAAA,MAC5E,MAAM,IAAI,MAAM,qCAAqC,iBAAiB,QAAQ,MAAM,UAAU,iBAAiB;AAAA;AAAA;AAAA,OAQ7G,MAAK,GAAkB;AAAA,OAWf,uBAAsB,CAClC,SACuE;AAAA,IACvE,MAAM,MAAM,yBAAwB;AAAA,IACpC,MAAM,UAAU,SAAS,WAAW,MAAM,KAAK,KAAK,KAAK,OAAO;AAAA,IAChE,MAAM,QAAQ,SAAS,SAAS;AAAA,IAEhC,MAAM,gBAA6B,CAAC;AAAA,IACpC,MAAM,oBAAqC,CAAC;AAAA,IAG5C,MAAM,kBAA4B,CAAC;AAAA,IACnC,IAAI,SAAS,cAAc;AAAA,MACzB,gBAAgB,KAAK,QAAQ,YAAY;AAAA,IAC3C,EAAO;AAAA,MAEL,IAAI;AAAA,QACF,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,QACnE,WAAW,SAAS,SAAS;AAAA,UAC3B,IAAI,MAAM,YAAY,KAAK,MAAM,SAAS,aAAa;AAAA,YACrD,gBAAgB,KAAK,MAAM,IAAI;AAAA,UACjC;AAAA,QACF;AAAA,QACA,OAAO,OAAO;AAAA,QAEd,OAAO,EAAE,YAAY,CAAC,GAAG,gBAAgB,CAAC,EAAE;AAAA;AAAA;AAAA,IAKhD,WAAW,gBAAgB,iBAAiB;AAAA,MAC1C,MAAM,SAAS,SAAS,UAAW,MAAM,KAAK,WAAW,YAAY;AAAA,MAErE,WAAW,SAAS,QAAQ;AAAA,QAC1B,IAAI;AAAA,UAEF,MAAM,aAAa,MAAM,KAAK,WAAW,cAAc,OAAO;AAAA,YAC5D,UAAU;AAAA,YACV,QAAQ,SAAS;AAAA,UACnB,CAAC;AAAA,UAGD,MAAM,qBAAqB,WAAW,OACpC,CAAC,MAAM,EAAE,eAAe,WAAW,EAAE,eAAe,KACtD;AAAA,UACA,cAAc,KAAK,GAAG,kBAAkB;AAAA,UAGxC,IAAI,CAAC,SAAS,QAAQ;AAAA,YACpB,MAAM,iBAAiB,MAAM,KAAK,WAAW,cAAc,OAAO;AAAA,cAChE,UAAU;AAAA,YACZ,CAAC;AAAA,YAED,MAAM,yBAAyB,eAAe,OAC5C,CAAC,MAAM,EAAE,eAAe,WAAW,EAAE,eAAe,KACtD;AAAA,YACA,kBAAkB,KAAK,GAAG,sBAAsB;AAAA,UAClD;AAAA,UACA,OAAO,OAAO;AAAA,UAEd;AAAA;AAAA,MAEJ;AAAA,IACF;AAAA,IAEA,OAAO,EAAE,YAAY,eAAe,gBAAgB,kBAAkB;AAAA;AAAA,OAGlE,iBAAgB,CAAC,SAAoD;AAAA,IACzE,QAAQ,eAAe,MAAM,KAAK,uBAAuB,OAAO;AAAA,IAChE,OAAO,qBACL,YACA,SAAS,cACT,SAAS,MACX;AAAA;AAAA,OAGI,cAAa,CAAC,SAkBjB;AAAA,IACD,QAAQ,eAAe,MAAM,KAAK,uBAAuB;AAAA,MACvD,SAAS,SAAS,WAAW;AAAA,MAC7B,OAAO,SAAS,WAAW;AAAA,MAC3B,cAAc,SAAS;AAAA,IACzB,CAAC;AAAA,IAED,MAAM,WAAW,SAAS,oBAAoB;AAAA,IAC9C,MAAM,QAAQ,SAAS,SAAS;AAAA,IAChC,MAAM,SAAS,SAAS,UAAU;AAAA,IAGlC,MAAM,eAAe,WAAW,OAC9B,CAAC,MAA4B,EAAE,SAAS,YAC1C;AAAA,IAGA,MAAM,cAAc,IAAI;AAAA,IAaxB,WAAW,SAAS,cAAc;AAAA,MAEhC,MAAM,YACJ,aAAa,UACT,MAAM,kBAAkB,iBACxB,aAAa,eACX,MAAM,kBAAkB,sBACxB,MAAM,kBAAkB;AAAA,MAEhC,MAAM,cAAc,GAAG,MAAM,kBAAkB,YAAY,MAAM,kBAAkB,eAAe;AAAA,MAElG,MAAM,WAAW,YAAY,IAAI,WAAW;AAAA,MAC5C,IAAI,UAAU;AAAA,QACZ,SAAS;AAAA,QACT,SAAS,aAAa,IAAI,MAAM,KAAK;AAAA,QACrC,SAAS,YAAY,KAAK,IAAI,SAAS,WAAW,MAAM,WAAW;AAAA,QACnE,SAAS,WAAW,KAAK,IAAI,SAAS,UAAU,MAAM,WAAW;AAAA,MACnE,EAAO;AAAA,QACL,YAAY,IAAI,aAAa;AAAA,UAC3B,cAAc,MAAM,MAAM;AAAA,UAC1B,WAAW,MAAM,MAAM,QAAQ;AAAA,UAC/B,aAAa,MAAM,MAAM,SAAS;AAAA,UAClC,OAAO;AAAA,UACP,cAAc,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAA,UACnC,WAAW,MAAM;AAAA,UACjB,UAAU,MAAM;AAAA,QAClB,CAAC;AAAA;AAAA,IAEL;AAAA,IAGA,MAAM,YAAY,MAAM,KAAK,YAAY,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,WAAW;AAAA,MAChF;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,WAAW,KAAK;AAAA,MAChB,aAAa,KAAK;AAAA,MAClB,OAAO,KAAK;AAAA,MACZ,cAAc,KAAK,aAAa;AAAA,MAChC,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,IACjB,EAAE;AAAA,IAEF,UAAU,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,IAE1C,MAAM,QAAQ,UAAU;AAAA,IACxB,MAAM,SAAS,UAAU,MAAM,QAAQ,SAAS,KAAK;AAAA,IAErD,OAAO,EAAE,QAAQ,MAAM;AAAA;AAAA,OAGnB,eAAc,CAClB,aACA,kBACA,SAsBC;AAAA,IAED,MAAM,QAAQ,YAAY,MAAM,GAAG;AAAA,IACnC,IAAI,MAAM,WAAW,GAAG;AAAA,MACtB,MAAM,IAAI,MAAM,+BAA+B,aAAa;AAAA,IAC9D;AAAA,IAEA,OAAO,UAAU,aAAa,aAAa;AAAA,IAE3C,QAAQ,eAAe,MAAM,KAAK,uBAAuB;AAAA,MACvD,SAAS,SAAS,WAAW;AAAA,MAC7B,OAAO,SAAS,WAAW;AAAA,IAC7B,CAAC;AAAA,IAED,MAAM,QAAQ,SAAS,SAAS;AAAA,IAChC,MAAM,SAAS,SAAS,UAAU;AAAA,IAGlC,MAAM,iBAAiB,WAAW,OAAO,CAAC,MAA4B;AAAA,MACpE,IAAI,EAAE,SAAS;AAAA,QAAc,OAAO;AAAA,MAGpC,IAAI,EAAE,kBAAkB,aAAa;AAAA,QAAU,OAAO;AAAA,MACtD,IAAI,EAAE,kBAAkB,gBAAgB;AAAA,QAAa,OAAO;AAAA,MAE5D,MAAM,iBACJ,qBAAqB,UACjB,EAAE,kBAAkB,iBACpB,qBAAqB,eACnB,EAAE,kBAAkB,sBACpB,EAAE,kBAAkB;AAAA,MAE5B,OAAO,mBAAmB;AAAA,KAC3B;AAAA,IAED,IAAI,eAAe,WAAW,GAAG;AAAA,MAC/B,OAAO;AAAA,QACL;AAAA,QACA,cAAc;AAAA,QACd,WAAW;AAAA,QACX,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,WAAW;AAAA,QACX,UAAU;AAAA,QACV,aAAa,CAAC;AAAA,QACd,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IAGA,MAAM,kBAAkB,IAAI,IAAI,eAAe,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IAClE,MAAM,YAAY,KAAK,IAAI,GAAG,eAAe,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;AAAA,IACtE,MAAM,WAAW,KAAK,IAAI,GAAG,eAAe,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;AAAA,IAGrE,eAAe,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW;AAAA,IAC3D,MAAM,kBAAkB,eAAe,MAAM,QAAQ,SAAS,KAAK;AAAA,IAEnE,MAAM,cAAc,gBAAgB,IAAI,CAAC,OAAO;AAAA,MAC9C,cAAc,EAAE;AAAA,MAChB,OAAO,EAAE;AAAA,MACT,QAAQ,EAAE;AAAA,MACV,eAAe,EAAE;AAAA,MACjB,aAAa,EAAE;AAAA,IACjB,EAAE;AAAA,IAEF,MAAM,cAAc,eAAe;AAAA,IAEnC,OAAO;AAAA,MACL;AAAA,MACA,cAAc,YAAY,MAAM;AAAA,MAChC,WAAW,YAAY,MAAM,QAAQ;AAAA,MACrC,aAAa,YAAY,MAAM,SAAS;AAAA,MACxC,YAAY,eAAe;AAAA,MAC3B,cAAc,gBAAgB;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,eAAe;AAAA,IACxB;AAAA;AAAA,OAGI,iBAAgB,CAAC,SAAoD;AAAA,IACzE,QAAQ,eAAe,MAAM,KAAK,uBAAuB,OAAO;AAAA,IAChE,OAAO,qBAAqB,UAAU;AAAA;AAAA,OAGlC,qBAAoB,CACxB,SAC4B;AAAA,IAC5B,QAAQ,eAAe,MAAM,KAAK,uBAAuB,OAAO;AAAA,IAChE,OAAO,yBACL,YACA,SAAS,cACT,SAAS,MACX;AAAA;AAAA,OAGI,gBAAe,CAAC,SAAmD;AAAA,IACvE,QAAQ,eAAe,MAAM,KAAK,uBAAuB,OAAO;AAAA,IAChE,OAAO,oBACL,YACA,SAAS,cACT,SAAS,MACX;AAAA;AAAA,OAGI,oBAAmB,CACvB,SAC2B;AAAA,IAC3B,QAAQ,mBAAmB,MAAM,KAAK,uBAAuB,OAAO;AAAA,IACpE,OAAO,wBAAwB,gBAAgB,SAAS,YAAY;AAAA;AAAA,OAGhE,mBAAkB,CAAC,SAAsD;AAAA,IAC7E,QAAQ,eAAe,MAAM,KAAK,uBAAuB,OAAO;AAAA,IAChE,OAAO,uBAAuB,UAAU;AAAA;AAAA,OAGpC,cAAa,CAAC,SAAiD;AAAA,IACnE,QAAQ,YAAY,mBAAmB,MAAM,KAAK,uBAAuB,OAAO;AAAA,IAEhF,MAAM,MAAM,yBAAwB;AAAA,IACpC,MAAM,UAAU,SAAS,WAAW,MAAM,KAAK,KAAK,KAAK,OAAO;AAAA,IAChE,MAAM,QAAQ,SAAS,SAAS;AAAA,IAChC,MAAM,cAAc,QAAQ;AAAA,IAE5B,OAAO,kBACL,YACA,gBACA,aACA,SAAS,YACX;AAAA;AAAA,OAGI,cAAa,CACjB,SACqB;AAAA,IACrB,MAAM,OAAO,MAAM,KAAK,SAAS;AAAA,MAC/B,cAAc,SAAS;AAAA,MACvB,QAAQ,CAAC,WAAW,SAAS;AAAA,IAC/B,CAAC;AAAA,IAED,IAAI,cAAc;AAAA,IAClB,IAAI,cAAc;AAAA,IAClB,IAAI,iBAAiB;AAAA,IACrB,IAAI,eAAe;AAAA,IACnB,IAAI;AAAA,IACJ,IAAI;AAAA,IAEJ,WAAW,OAAO,MAAM;AAAA,MACtB,IAAI,IAAI,WAAW,WAAW;AAAA,QAC5B;AAAA,QACA,IACE,CAAC,sBACD,IAAI,YAAY,oBAChB;AAAA,UACA,qBAAqB,IAAI;AAAA,QAC3B;AAAA,MACF,EAAO,SAAI,IAAI,WAAW,WAAW;AAAA,QACnC;AAAA,QAGA,IAAI;AAAA,UACF,MAAM,aAAa,MAAM,KAAK,WAC5B,IAAI,cACJ,IAAI,OACJ,EAAE,UAAU,OAAO,CACrB;AAAA,UAGA,MAAM,eAAe,IAAI;AAAA,UACzB,WAAW,SAAS,YAAY;AAAA,YAC9B,MAAM,SAAS,aAAa,IAAI,MAAM,MAAM,KAAK,CAAC;AAAA,YAClD,OAAO,KAAK,KAAK;AAAA,YACjB,aAAa,IAAI,MAAM,QAAQ,MAAM;AAAA,UACvC;AAAA,UAGA,YAAY,SAAS,WAAW,aAAa,QAAQ,GAAG;AAAA,YACtD,MAAM,QAAQ,iBAAiB,QAAQ,IAAI,YAAY;AAAA,YAEvD,IAAI,MAAM,WAAW,aAAa;AAAA,cAChC;AAAA,cACA,IACE,MAAM,gBACL,CAAC,yBAAyB,MAAM,cAAc,wBAC/C;AAAA,gBACA,wBAAwB,MAAM;AAAA,cAChC;AAAA,YACF,EAAO,SAAI,MAAM,WAAW,WAAW;AAAA,cACrC;AAAA,YACF;AAAA,UACF;AAAA,UACA,OAAO,OAAO;AAAA,UAEd;AAAA;AAAA,MAEJ;AAAA,IACF;AAAA,IAEA,OAAO;AAAA,MACL,cAAc,SAAS;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA,OAGI,wBAAuB,GAAkC;AAAA,IAC7D,MAAM,OAAO,MAAM,KAAK,SAAS,EAAE,QAAQ,CAAC,WAAW,SAAS,EAAE,CAAC;AAAA,IAGnE,MAAM,cAAc,IAAI;AAAA,IASxB,WAAW,OAAO,MAAM;AAAA,MACtB,MAAM,WAAW,YAAY,IAAI,IAAI,YAAY,KAAK;AAAA,QACpD,aAAa;AAAA,QACb,gBAAgB;AAAA,MAClB;AAAA,MAEA,IAAI,IAAI,WAAW,WAAW;AAAA,QAC5B,SAAS;AAAA,QACT,IACE,CAAC,SAAS,uBACV,IAAI,YAAY,SAAS,qBACzB;AAAA,UACA,SAAS,sBAAsB,IAAI;AAAA,QACrC;AAAA,MACF,EAAO,SAAI,IAAI,WAAW,WAAW;AAAA,QAEnC,IAAI;AAAA,UACF,MAAM,aAAa,MAAM,KAAK,WAAW,IAAI,cAAc,IAAI,OAAO;AAAA,YACpE,UAAU;AAAA,UACZ,CAAC;AAAA,UAGD,MAAM,eAAe,IAAI;AAAA,UACzB,WAAW,SAAS,YAAY;AAAA,YAC9B,MAAM,SAAS,aAAa,IAAI,MAAM,MAAM,KAAK,CAAC;AAAA,YAClD,OAAO,KAAK,KAAK;AAAA,YACjB,aAAa,IAAI,MAAM,QAAQ,MAAM;AAAA,UACvC;AAAA,UAGA,YAAY,SAAS,WAAW,aAAa,QAAQ,GAAG;AAAA,YACtD,MAAM,QAAQ,iBAAiB,QAAQ,IAAI,YAAY;AAAA,YAEvD,IAAI,MAAM,WAAW,aAAa;AAAA,cAChC,SAAS;AAAA,cACT,IACE,MAAM,gBACL,CAAC,SAAS,uBACT,MAAM,cAAc,SAAS,sBAC/B;AAAA,gBACA,SAAS,sBAAsB,MAAM;AAAA,cACvC;AAAA,YACF;AAAA,UACF;AAAA,UACA,OAAO,OAAO;AAAA,UAEd;AAAA;AAAA,MAEJ;AAAA,MAEA,YAAY,IAAI,IAAI,cAAc,QAAQ;AAAA,IAC5C;AAAA,IAGA,MAAM,cAAc,MAAM,KAAK,qBAAqB;AAAA,IACpD,MAAM,cAAc,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,IAG/D,MAAM,SAA+B,MAAM,KAAK,YAAY,QAAQ,CAAC,EAClE,IAAI,EAAE,cAAc,WAAW;AAAA,MAC9B;AAAA,MACA,cAAc,YAAY,IAAI,YAAY,GAAG;AAAA,MAC7C,aAAa,KAAK;AAAA,MAClB,gBAAgB,KAAK;AAAA,MACrB,qBAAqB,KAAK;AAAA,IAC5B,EAAE,EACD,OAAO,CAAC,SAAS,KAAK,cAAc,KAAK,KAAK,iBAAiB,CAAC,EAChE,KAAK,CAAC,GAAG,MAAM;AAAA,MAEd,MAAM,SAAS,EAAE,cAAc,EAAE;AAAA,MACjC,MAAM,SAAS,EAAE,cAAc,EAAE;AAAA,MACjC,OAAO,SAAS;AAAA,KACjB;AAAA,IAEH,OAAO;AAAA;AAAA,OAGH,eAAc,CAAC,SAAkD;AAAA,IACrE,QAAQ,YAAY,mBAAmB,MAAM,KAAK,uBAAuB,OAAO;AAAA,IAChF,OAAO,mBACL,YACA,gBACA,SAAS,cACT,SAAS,MACX;AAAA;AAAA,OAGI,oBAAmB,CACvB,SAC2B;AAAA,IAC3B,MAAM,MAAM,yBAAwB;AAAA,IACpC,MAAM,UAAU,SAAS,WAAW,MAAM,KAAK,KAAK,KAAK,OAAO;AAAA,IAChE,MAAM,QAAQ,SAAS,SAAS;AAAA,IAGhC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM,QAAQ,IAAI;AAAA,MACpB,KAAK,iBAAiB,OAAO;AAAA,MAC7B,KAAK,iBAAiB,OAAO;AAAA,MAC7B,KAAK,qBAAqB,OAAO;AAAA,MACjC,KAAK,gBAAgB,OAAO;AAAA,MAC5B,KAAK,oBAAoB,OAAO;AAAA,MAChC,KAAK,mBAAmB,OAAO;AAAA,MAC/B,KAAK,cAAc,OAAO;AAAA,MAC1B,KAAK,cAAc,OAAO;AAAA,MAC1B,KAAK,eAAe,OAAO;AAAA,IAC7B,CAAC;AAAA,IAED,OAAO;AAAA,MACL,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA,YAAY,QAAQ;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAEJ;",
11
- "debugId": "78CB67F5346BB10E64756E2164756E21",
10
+ "mappings": "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",
11
+ "debugId": "26CF07EAE5368FE264756E2164756E21",
12
12
  "names": []
13
13
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cascade-flow/backend-filesystem",
3
- "version": "0.2.10",
3
+ "version": "0.2.17",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -20,8 +20,8 @@
20
20
  "test:coverage": "bun test --coverage"
21
21
  },
22
22
  "dependencies": {
23
- "@cascade-flow/backend-interface": "0.2.6",
24
- "@cascade-flow/runner": "0.2.10"
23
+ "@cascade-flow/backend-interface": "0.2.8",
24
+ "@cascade-flow/runner": "0.2.17"
25
25
  },
26
26
  "devDependencies": {
27
27
  "@types/bun": "latest"