@kb-labs/workflow-engine 2.75.0 → 2.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
package/dist/index.d.ts
CHANGED
|
@@ -27,6 +27,8 @@ interface CreateRunInput {
|
|
|
27
27
|
concurrencyGroup?: ConcurrencyGroup;
|
|
28
28
|
metadata?: Record<string, unknown>;
|
|
29
29
|
env?: Record<string, string>;
|
|
30
|
+
/** Resolved workflow input values (user-supplied merged with spec defaults). */
|
|
31
|
+
inputs?: Record<string, unknown>;
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
interface WorkflowLoaderOptions {
|
package/dist/index.js
CHANGED
|
@@ -329,6 +329,7 @@ var RunCoordinator = class {
|
|
|
329
329
|
queuedAt: timestamp,
|
|
330
330
|
trigger: input.trigger,
|
|
331
331
|
env: input.spec.env,
|
|
332
|
+
inputs: input.inputs,
|
|
332
333
|
secrets: input.spec.secrets,
|
|
333
334
|
jobs,
|
|
334
335
|
metadata: {
|
|
@@ -922,6 +923,13 @@ var WorkflowEngine = class {
|
|
|
922
923
|
jobId,
|
|
923
924
|
payload: { jobName: job?.jobName, durationMs: duration }
|
|
924
925
|
});
|
|
926
|
+
if (job?.jobName) {
|
|
927
|
+
const released = await this.stateStore.releaseBlockedJobs(runId, job.jobName);
|
|
928
|
+
for (const releasedJob of released) {
|
|
929
|
+
await this.scheduler.enqueueJob(runId, releasedJob, releasedJob.priority ?? "normal");
|
|
930
|
+
this.logger.info("Unblocked dependent job", { runId, jobId: releasedJob.id, unlockedBy: job.jobName });
|
|
931
|
+
}
|
|
932
|
+
}
|
|
925
933
|
await this.checkRunCompletion(runId);
|
|
926
934
|
}
|
|
927
935
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/workflow-loader.ts","../src/state-store.ts","../src/run-coordinator.ts","../src/concurrency-manager.ts","../src/scheduler.ts","../src/secrets.ts","../src/event-bus.ts","../src/retry.ts","../src/run-snapshot.ts","../src/engine.ts","../src/artifact-merger.ts","../src/manifest-scanner.ts","../src/workflow-repository.ts","../src/workflow-service.ts","../src/workflow-schedule-manager.ts","../src/workflow-registry.ts","../src/job-manager.ts"],"names":["parseYaml","job","WORKFLOW_REDIS_CHANNEL","shouldRetry","resolve","WorkflowSpecSchema","randomUUID","join","stringifyYaml","readFile","existsSync","readdir"],"mappings":";;;;;;;;;;;;;;;;AAcO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,MAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAuB;AAAA,EAAvB,MAAA;AAAA,EAE7B,MAAM,QAAA,CACJ,QAAA,EACA,OAAA,GAAiC,EAAC,EACH;AAC/B,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACvC,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAA;AAE1C,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,+BAAA,CAAA,EAAmC;AAAA,MACnD,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,YAAA,EAAc,MAAM,CAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,EAAK,YAAY,CAAA;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,YAAY,CAAA;AAAA,EAC3C;AAAA,EAEA,UAAA,CACE,IAAA,EACA,MAAA,GAAS,QAAA,EACa;AACtB,IAAA,IAAI,SAAA,GAAqB,IAAA;AACzB,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,MAAM,CAAA;AAAA,EACxC;AAAA,EAEQ,KAAA,CAAM,KAAa,MAAA,EAAyB;AAClD,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,MAAM,CAAA,SAAA,CAAW,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,OAAO,QAAA,CAAS,OAAO,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACvD,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAC3B,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,UACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACvD,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,wCAAA,EAA2C,MAAM,IAAI,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAA,EAAW;AAAA,UACjH,YAAA,EAAc;AAAA,SACf,CAAA;AACD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,OAAO,CAAA,CAAE,CAAA;AAAA,MAClE;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,OAAOA,MAAU,OAAO,CAAA;AAAA,IAC1B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,wCAAA,EAA2C,MAAM,IAAI,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAA,EAAW;AAAA,QACjH,YAAA,EAAc;AAAA,OACf,CAAA;AACD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oCAAA,EAAuC,OAAO,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF;AAAA,EAEQ,QAAA,CAAS,WAAoB,MAAA,EAAsC;AACzE,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,SAAA,CAAU,SAAS,CAAA;AAErD,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CACzB,GAAA;AAAA,QACC,CAAC,KAAA,KACC,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,QAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AAAA,OACzD,CACC,KAAK,IAAI,CAAA;AACZ,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,+BAAA,CAAA,EAAmC,EAAE,MAAA,EAAQ,QAAQ,CAAA;AACtE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA;AAAA,EAAqC,MAAM,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,IAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AAAA,EACxB;AACF;;;ACvFO,IAAM,aAAN,MAAiB;AAAA,EAGtB,WAAA,CACE,OACiB,MAAA,EACjB;AADiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAHmB,MAAA;AAAA,EAJF,KAAA;AAAA,EASjB,MAAM,QAAQ,GAAA,EAAiC;AAC7C,IAAA,MAAM,GAAA,GAAM,CAAA,OAAA,EAAU,GAAA,CAAI,EAAE,CAAA,CAAA;AAC5B,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,yBAAA,EAA2B,EAAE,OAAO,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAGnE,IAAA,MAAM,KAAK,KAAA,CAAM,GAAA,CAAI,KAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAG7C,IAAA,MAAM,YAAY,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,EAAE,OAAA,EAAQ;AAClD,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,qBAAA,EAAuB,SAAA,EAAW,IAAI,EAAE,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,OAAO,KAAA,EAA4C;AACvD,IAAA,MAAM,GAAA,GAAM,UAAU,KAAK,CAAA,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,IAAY,GAAG,CAAA;AAChD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,qCAAA,EAAuC,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAA,EAAW;AAAA,QACnG;AAAA,OACD,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,KAAA,EAA8B;AAC5C,IAAA,MAAM,GAAA,GAAM,UAAU,KAAK,CAAA,CAAA;AAG3B,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAG3B,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,qBAAA,EAAuB,KAAK,CAAA;AAAA,EACpD;AAAA,EAEA,MAAM,YAAA,GAAkC;AAGtC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAM,aAAA,CAAc,qBAAA,EAAuB,WAAW,QAAQ,CAAA;AACxF,IAAA,OAAO,UAAU,EAAC;AAAA,EACpB;AAAA,EAEA,MAAM,SAAA,CACJ,KAAA,EACA,OAAA,EAC6B;AAC7B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,GAAG,CAAA;AACvB,IAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAC5B,IAAA,MAAM,OAAQ,MAAA,IAAU,KAAA;AACxB,IAAA,MAAM,IAAA,CAAK,QAAQ,IAAI,CAAA;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAA,CACJ,KAAA,EACA,KAAA,EACA,OAAA,EACwB;AACxB,IAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,CAAC,GAAA,KAAQ;AACnC,MAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,CAAC,GAAA,KAAgB,GAAA,CAAI,OAAO,KAAK,CAAA;AAClE,MAAA,IAAI,UAAU,EAAA,EAAI;AAChB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,WAAA,GAAc,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AAClC,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,WAAW,CAAA;AAClC,MAAA,MAAM,MAAA,GAAS,QAAQ,QAAQ,CAAA;AAC/B,MAAA,MAAM,UAAW,MAAA,IAAU,QAAA;AAC3B,MAAA,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA,GAAI,OAAA;AAClB,MAAA,UAAA,GAAa,OAAA;AAAA,IACf,CAAC,CAAA;AAED,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAM,UAAA,CACJ,KAAA,EACA,KAAA,EACA,QACA,OAAA,EACyB;AACzB,IAAA,IAAI,WAAA,GAA8B,IAAA;AAElC,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,CAAC,GAAA,KAAQ;AACnC,MAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,SAAA,CAAU,CAACC,IAAAA,KAAQA,IAAAA,CAAI,OAAO,KAAK,CAAA;AAC7D,MAAA,IAAI,aAAa,EAAA,EAAI;AACnB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,IAAI,KAAA,CAAM,SAAA;AAAA,QAC1B,CAAC,IAAA,KAAkB,IAAA,CAAK,EAAA,KAAO;AAAA,OACjC;AACA,MAAA,IAAI,cAAc,EAAA,EAAI;AACpB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,YAAA,GAAe,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA;AACxC,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,YAAY,CAAA;AAChC,MAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAC5B,MAAA,MAAM,WAAY,MAAA,IAAU,KAAA;AAC5B,MAAA,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,GAAI,QAAA;AACvB,MAAA,WAAA,GAAc,QAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,MAAM,kBAAA,CACJ,KAAA,EACA,gBAAA,EACmB;AACnB,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,CAAC,GAAA,KAAQ;AACnC,MAAA,KAAA,MAAW,GAAA,IAAO,IAAI,IAAA,EAAM;AAC1B,QAAA,IAAI,GAAA,CAAI,MAAA,KAAW,QAAA,IAAY,CAAC,IAAI,OAAA,EAAS;AAC3C,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAC,GAAA,CAAI,mBAAA,IAAuB,GAAA,CAAI,mBAAA,CAAoB,WAAW,CAAA,EAAG;AACpE,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAC1C,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,SAAA,GAAY,IAAI,mBAAA,CAAoB,MAAA;AAAA,UACxC,CAAC,eAAe,UAAA,KAAe;AAAA,SACjC;AAEA,QAAA,IAAI,SAAA,CAAU,MAAA,KAAW,GAAA,CAAI,mBAAA,CAAoB,MAAA,EAAQ;AACvD,UAAA;AAAA,QACF;AAEA,QAAA,GAAA,CAAI,mBAAA,GAAsB,SAAA;AAE1B,QAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,UAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AACd,UAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEA,SAAS,MAAS,KAAA,EAAa;AAC7B,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACzC;ACtKA,IAAM,0BAAA,GAA6B,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA;AAEpD,SAAS,wBAAwB,QAAA,EAA2B;AAC1D,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,GAAW,CAAA,EAAG;AAChD,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,QAAA,GAAW,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AAC7C,EAAA,IAAI,UAAU,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,SAAS,CAAA,EAAG;AACnD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,0BAAA;AACT;AAMO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,YACE,KAAA,EACiB,UAAA,EACA,oBACA,MAAA,EACjB,OAAA,GAAiC,EAAC,EAClC;AAJiB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,kBAAA,GAAA,kBAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,gBAAA,GAAmB,uBAAA,CAAwB,OAAA,CAAQ,gBAAgB,CAAA;AAAA,EAC1E;AAAA,EAPmB,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,MAAA;AAAA,EAPF,KAAA;AAAA,EACA,gBAAA;AAAA,EAajB,MAAM,UAAU,KAAA,EAA6C;AAC3D,IAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,oBAAA,CAAqB,MAAM,cAAc,CAAA;AACrE,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,gCAAA,EAAkC;AAAA,UACjD,OAAO,QAAA,CAAS,EAAA;AAAA,UAChB,gBAAgB,KAAA,CAAM;AAAA,SACvB,CAAA;AACD,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,IAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEnC,IAAA,IAAI,MAAM,gBAAA,EAAkB;AAC1B,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAA;AAAA,QAC7C,KAAA,CAAM,gBAAA;AAAA,QACN;AAAA,OACF;AAEA,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA,CAAmB,YAAA;AAAA,UAC3C,KAAA,CAAM;AAAA,SACR;AACA,QAAA,MAAM,OAAA,GAAU,MAAA,GACZ,CAAA,kBAAA,EAAqB,KAAA,CAAM,gBAAgB,0BAA0B,MAAM,CAAA,CAAA,GAC3E,CAAA,uCAAA,EAA0C,KAAA,CAAM,gBAAgB,CAAA,CAAA;AACpE,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,OAAA,EAAS;AAAA,UACxB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,UACxB,WAAA,EAAa;AAAA,SACd,CAAA;AACD,QAAA,MAAM,IAAI,MAAM,OAAO,CAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO,OAAO,GAAG,CAAA;AAClD,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AAEjC,IAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,MAAA,MAAM,IAAA,CAAK,sBAAA,CAAuB,KAAA,CAAM,cAAA,EAAgB,IAAI,EAAE,CAAA;AAAA,IAChE;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,sBAAA,EAAwB;AAAA,MACvC,OAAO,GAAA,CAAI,EAAA;AAAA,MACX,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI;AAAA,KACd,CAAA;AAED,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEQ,eAAA,CACN,KAAA,EACA,KAAA,EACA,SAAA,EACa;AACb,IAAA,MAAM,OAAiB,EAAC;AAExB,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,CAAA,IAAK,MAAA,CAAO,OAAA;AAAA,MACtC,MAAM,IAAA,CAAK;AAAA,KACb,EAA+B;AAC7B,MAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,GAAI,CAAC,GAAG,OAAA,CAAQ,KAAK,CAAA,GAAI,EAAC;AACnE,MAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,QAAA;AACrC,MAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,MAAA;AACrD,MAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,SAAA,IAAa,KAAA,CAAM,IAAA,CAAK,SAAA;AAC3D,MAAA,MAAM,WAAsB,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,MAAM,KAAA,MAAW;AAAA,QAC9D,EAAA,EAAI,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,QACrB,KAAA;AAAA,QACA,KAAA;AAAA,QACA,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,KAAA;AAAA,QACA,MAAA,EAAQ,QAAA;AAAA,QACR,QAAA,EAAU,SAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,iBAAiB,IAAA,CAAK,eAAA;AAAA,QACtB,IAAA,EAAM;AAAA,OACR,CAAE,CAAA;AAEF,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACR,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA;AAAA,QACA,OAAA;AAAA,QACA,MAAA,EAAQ,QAAA;AAAA,QACR,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,QAAA,EAAU,SAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,KAAA,EAAO,QAAA;AAAA,QACP,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,MAAA,EAAQ,eAAA;AAAA,QACR,SAAA,EAAW,kBAAA;AAAA,QACX,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,KAAA;AAAA,QACA,mBAAA,EAAqB,CAAC,GAAG,KAAK,CAAA;AAAA,QAC9B,OAAA,EAAS,MAAM,MAAA,GAAS,CAAA;AAAA,QACxB;AAAA,OACD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,EAAA,EAAI,KAAA;AAAA,MACJ,IAAA,EAAM,MAAM,IAAA,CAAK,IAAA;AAAA,MACjB,OAAA,EAAS,MAAM,IAAA,CAAK,OAAA;AAAA,MACpB,MAAA,EAAQ,QAAA;AAAA,MACR,SAAA,EAAW,SAAA;AAAA,MACX,QAAA,EAAU,SAAA;AAAA,MACV,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,GAAA,EAAK,MAAM,IAAA,CAAK,GAAA;AAAA,MAChB,OAAA,EAAS,MAAM,IAAA,CAAK,OAAA;AAAA,MACpB,IAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,gBAAgB,KAAA,CAAM,cAAA;AAAA,QACtB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,QACxB,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA;AAAA,QACnB,SAAA,EAAW,MAAM,IAAA,CAAK;AAAA,OACxB;AAAA,MACA,WAAW;AAAC,KACd;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,MAAc,sBAAA,CACZ,GAAA,EACA,KAAA,EACe;AACf,IAAA,MAAM,QAAA,GAAW,kBAAkB,GAAG,CAAA,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,KAAA,CAAM,cAAA;AAAA,MAClC,QAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,KAAA,CAAM,IAAY,QAAQ,CAAA;AAC3D,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,aAAa,CAAA;AAC3D,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,CAAA,gBAAA,EAAmB,GAAG,CAAA,6BAAA,EAAgC,aAAa,CAAA;AAAA,WACrE;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,GAAG,CAAA,CAAE,CAAA;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,MAAc,qBACZ,GAAA,EAC6B;AAC7B,IAAA,MAAM,QAAA,GAAW,kBAAkB,GAAG,CAAA,CAAA;AACtC,IAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,KAAA,CAAM,IAAY,QAAQ,CAAA;AAC3D,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,aAAa,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,mBAAmB,GAAA,EAAiC;AACxD,IAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,EAAU,gBAAA;AAC5B,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,KAAA,EAAO,IAAI,EAAE,CAAA;AACnD,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,4BAAA,EAA8B;AAAA,MAC9C,OAAO,GAAA,CAAI,EAAA;AAAA,MACX;AAAA,KACD,CAAA;AAAA,EACH;AACF;ACxNA,IAAM,cAAA,GAAiB,MAAO,EAAA,GAAK,EAAA;AAEnC,SAAS,aAAa,QAAA,EAA2B;AAC/C,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,GAAW,CAAA,EAAG;AAChD,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,QAAA,GAAW,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA;AAC7C,EAAA,IAAI,UAAU,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,SAAS,CAAA,EAAG;AACnD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,cAAA;AACT;AAMO,IAAM,qBAAN,MAAyB;AAAA,EAI9B,WAAA,CACE,KAAA,EACiB,MAAA,EACjB,OAAA,GAA0B,EAAC,EAC3B;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,EACzC;AAAA,EALmB,MAAA;AAAA,EALF,KAAA;AAAA,EACA,KAAA;AAAA,EAWjB,MAAM,OAAA,CACJ,KAAA,EACA,KAAA,EACA,OAAA,GAA0B,EAAC,EACT;AAClB,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,KAAA,IAAS,KAAK,KAAK,CAAA;AACpD,IAAA,MAAM,GAAA,GAAM,kBAAkB,KAAK,CAAA,CAAA;AACnC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,MAAM,cAAA,CAAe,GAAA,EAAK,OAAO,GAAG,CAAA;AAEhE,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,6BAAA,EAA+B;AAAA,MAC/C,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAyB,KAAA,EAA8B;AACnE,IAAA,MAAM,GAAA,GAAM,kBAAkB,KAAK,CAAA,CAAA;AACnC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,IAAY,GAAG,CAAA;AAChD,IAAA,IAAI,YAAY,KAAA,EAAO;AACrB,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAC3B,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,2BAAA,EAA6B,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,KAAA,EAAiD;AAClE,IAAA,MAAM,GAAA,GAAM,kBAAkB,KAAK,CAAA,CAAA;AACnC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAY,GAAG,CAAA;AAAA,EACnC;AACF;;;AC9CO,IAAM,YAAN,MAAgB;AAAA,EAMrB,WAAA,CACE,KAAA,EACiB,MAAA,EACjB,OAAA,GAA4B,EAAC,EAC7B;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAQ,eAAA,IAAmB,QAAA;AAClD,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,GAAA;AAAA,EAC5C;AAAA,EANmB,MAAA;AAAA,EAPF,KAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA,GAA+B,CAAC,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAA;AAAA,EAYxE,MAAM,YAAY,GAAA,EAAiC;AAEjD,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,CAAA,GAAA,KAAO;AACvC,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,gDAAA,EAAkD;AAAA,UAClE,OAAO,GAAA,CAAI,EAAA;AAAA,UACX,OAAO,GAAA,CAAI,EAAA;AAAA,UACX,OAAO,GAAA,CAAI;AAAA,SACZ,CAAA;AACD,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,SAAA,CAAU,IAAI,CAAA,GAAA,KAAO;AACnB,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,IAAY,IAAA,CAAK,eAAA;AACtC,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,EAAA,EAAI,KAAK,QAAQ,CAAA;AAAA,MAC9C,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CACJ,KAAA,EACA,GAAA,EACA,QAAA,GAAwB,KAAK,eAAA,EACd;AACf,IAAA,IAAI,IAAI,OAAA,EAAS;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,kCAAA,EAAoC;AAAA,QACpD,KAAA;AAAA,QACA,OAAO,GAAA,CAAI,EAAA;AAAA,QACX,OAAO,GAAA,CAAI;AAAA,OACZ,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,UAAU,CAAA,EAAG,KAAK,IAAI,GAAA,CAAI,EAAE,IAAI,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACpF,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,EAAA,EAAI,OAAA;AAAA,MACJ,KAAA;AAAA,MACA,OAAO,GAAA,CAAI,EAAA;AAAA,MACX,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,QAAA;AAAA,MACA,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MACnC,WAAA,EAAa;AAAA,KACf;AACA,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA;AAAA,MACf,eAAe,QAAQ,CAAA,CAAA;AAAA,MACvB,KAAA,CAAM,WAAA;AAAA,MACN,IAAA,CAAK,UAAU,KAAK;AAAA,KACtB;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,cAAA,EAAgB,EAAE,OAAO,KAAA,EAAO,GAAA,CAAI,EAAA,EAAI,QAAA,EAAU,CAAA;AAAA,EACtE;AAAA,EAEA,MAAM,UAAA,GAA4C;AAEhD,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,aAAA,EAAe;AACzC,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AACrD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,UAAA,CAAW,KAAA,EAAsB,OAAA,EAAgC;AACrE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AACjC,IAAA,MAAM,IAAA,GAAsB;AAAA,MAC1B,GAAG,KAAA;AAAA,MACH,WAAA;AAAA,MACA,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACrC;AACA,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA;AAAA,MACf,CAAA,YAAA,EAAe,MAAM,QAAQ,CAAA,CAAA;AAAA,MAC7B,WAAA;AAAA,MACA,IAAA,CAAK,UAAU,IAAI;AAAA,KACrB;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,iBAAA,EAAmB;AAAA,MACnC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KACjB,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,oBAAoB,QAAA,EAAsD;AACtF,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,GAAA,GAAM,eAAe,QAAQ,CAAA,CAAA;AACnC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,aAAA;AAAA,MAC/B,GAAA;AAAA,MACA,CAAA;AAAA,MACA,MAAM,IAAA,CAAK;AAAA,KACb;AAGA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,MAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,iCAAA,EAAmC,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAS,CAAA;AAC/F,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,kBAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AACF;;;ACxIO,IAAM,oBAAN,MAAkD;AAAA,EACtC,MAAA;AAAA,EACA,UAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAAoC,EAAC,EAAG;AAClD,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,MAAA,IAAU,YAAA;AAChC,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,IAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,QAAQ,KAAA,EAAkD;AAC9D,IAAA,MAAM,WAAmC,EAAC;AAC1C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,MAAM,GAAG,IAAI,CAAA,CAAA;AACtC,MAAA,MAAM,aAAa,IAAA,CAAK,UAAA,GACpB,CAAC,OAAA,CAAQ,IAAI,IAAI,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAC,CAAA,GACzC,CAAC,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAC,CAAA;AAE1B,MAAA,MAAM,QAAQ,UAAA,CAAW,IAAA,CAAK,CAAC,SAAA,KAAc,OAAO,cAAc,QAAQ,CAAA;AAC1E,MAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,QAAA,QAAA,CAAS,IAAI,CAAA,GAAI,KAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEO,SAAS,2BAAA,GAA8C;AAC5D,EAAA,OAAO,IAAI,iBAAA,EAAkB;AAC/B;AC/BO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,WAAA,CACE,QACiB,MAAA,EACjB;AADiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAHmB,MAAA;AAAA,EALF,MAAA;AAAA,EACA,OAAA,GAAU,sBAAA;AAAA,EAS3B,MAAM,QACJ,KAAA,EACe;AACf,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,GAAG,KAAA;AAAA,MACH,WAAW,KAAA,CAAM,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA;AAAY,KACvD;AACA,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAO,CAAA;AAC/C,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,0BAAA,EAA4B;AAAA,MAC5C,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAO,KAAA,CAAM;AAAA,KACd,CAAA;AAAA,EACH;AACF;;;ACvCA,IAAM,2BAAA,GAA8B,GAAA;AAO7B,SAAS,gBAAA,CACd,SACA,MAAA,EACQ;AACR,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,OAAO,iBAAA,IAAqB,2BAAA;AACzC,EAAA,MAAM,OAAA,GACJ,MAAA,CAAO,OAAA,KAAY,KAAA,GACf,IAAA,IAAQ,OAAA,GAAU,CAAA,CAAA,GAClB,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA;AAEhC,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,MAAA,CAAO,aAAa,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,WAAA,CACd,SACA,MAAA,EACe;AACf,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,EAAE,aAAa,KAAA,EAAM;AAAA,EAC9B;AACA,EAAA,IAAI,OAAA,IAAW,OAAO,GAAA,EAAK;AACzB,IAAA,OAAO,EAAE,aAAa,KAAA,EAAM;AAAA,EAC9B;AAEA,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,IAAA;AAAA,IACb,WAAA,EAAa,gBAAA,CAAiB,OAAA,EAAS,MAAM;AAAA,GAC/C;AACF;;;AC3BA,IAAM,gBAAA,GAAmB,OAAA;AAElB,IAAM,qBAAN,MAAyB;AAAA,EAC9B,WAAA,CACmB,OACA,MAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAChB;AAAA,EAFgB,KAAA;AAAA,EACA,MAAA;AAAA,EAGX,eAAe,KAAA,EAAuB;AAC5C,IAAA,OAAO,qBAAqB,KAAK,CAAA,CAAA;AAAA,EACnC;AAAA,EAEA,MAAM,cAAA,CACJ,GAAA,EACA,WAAA,EACA,KACA,IAAA,EACsB;AACtB,IAAA,MAAM,QAAA,GAAwB;AAAA,MAC5B,OAAO,GAAA,CAAI,EAAA;AAAA,MACX,GAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAEtC,IAAA,MAAM,KAAK,KAAA,CAAM,GAAA;AAAA,MACf,GAAA;AAAA,MACA,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,MACvB,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK;AAAA;AAAA,KACrB;AAEA,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,kBAAA,EAAoB,EAAE,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA;AACtD,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,KAAA,EAA4C;AAC5D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACrC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,IAAY,GAAG,CAAA;AAC/C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAElC,MAAA,IAAI,QAAA,CAAS,YAAY,gBAAA,EAAkB;AACzC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,2BAAA,EAA6B;AAAA,UAC5C,KAAA;AAAA,UACA,QAAA,EAAU,gBAAA;AAAA,UACV,QAAQ,QAAA,CAAS;AAAA,SAClB,CAAA;AAAA,MAEH;AACA,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,0BAAA,EAA4B,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAA,EAAW;AAAA,QACxF;AAAA,OACD,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,KAAA,EAA8B;AACjD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACrC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,kBAAA,EAAoB,EAAE,OAAO,CAAA;AAAA,EACjD;AACF;;;AChCO,IAAM,iBAAN,MAAqB;AAAA,EAa1B,YAA6B,OAAA,EAAgC;AAAhC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAC3B,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAEzB,IAAA,IAAA,CAAK,aAAa,IAAI,UAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,KAAK,MAAM,CAAA;AAC3D,IAAA,IAAA,CAAK,cAAc,IAAI,kBAAA;AAAA,MACrB,OAAA,CAAQ,KAAA;AAAA,MACR,IAAA,CAAK,MAAA;AAAA,MACL,OAAA,CAAQ;AAAA,KACV;AACA,IAAA,IAAA,CAAK,iBAAiB,IAAI,cAAA;AAAA,MACxB,OAAA,CAAQ,KAAA;AAAA,MACR,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,WAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,OAAA,CAAQ,OAAO,IAAA,CAAK,MAAA,EAAQ,QAAQ,SAAS,CAAA;AAC5E,IAAA,IAAA,CAAK,SAAS,IAAI,cAAA,CAAe,OAAA,CAAQ,MAAA,EAAQ,KAAK,MAAM,CAAA;AAC5D,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAQ,gBAAA,IAAoB,CAAA;AACpD,IAAA,IAAA,CAAK,kBAAkB,IAAI,kBAAA,CAAmB,OAAA,CAAQ,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA,EAC1E;AAAA,EAvB6B,OAAA;AAAA,EAZpB,MAAA;AAAA,EACA,gBAAA;AAAA,EAEQ,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,eAAA;AAAA,EA2BjB,MAAM,OAAA,GAAyB;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAA,CACE,OACA,OAAA,EACa;AACb,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAUC,sBAAAA,EAAwB,OAAO,GAAA,KAAiB;AACnF,MAAA,MAAM,KAAA,GAAQ,GAAA;AACd,MAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AAAC,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MAAC;AAAA,IAC5C,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,KAAA,EAA6C;AAC3D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,cAAA,CAAe,UAAU,KAAK,CAAA;AAGrD,IAAA,IAAA,CAAK,SAAA,EAAW,MAAM,sBAAA,EAAwB;AAAA,MAC5C,OAAO,GAAA,CAAI,EAAA;AAAA,MACX,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,QAAA,EAAU,IAAI,IAAA,CAAK,MAAA;AAAA,MACnB,OAAA,EAAS,MAAM,OAAA,EAAS;AAAA,KACzB,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEjB,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA,EAAM,YAAY,GAAA,CAAI,OAAA;AAAA,MACtB,OAAO,GAAA,CAAI,EAAA;AAAA,MACX,OAAA,EAAS;AAAA,QACP,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,SAAS,GAAA,CAAI;AAAA;AACf,KACD,CAAA;AACD,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,GAAG,CAAA;AAEpC,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAA,CACJ,IAAA,EACA,KAAA,EACsB;AACtB,IAAA,OAAO,KAAK,SAAA,CAAU;AAAA,MACpB,GAAG,KAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,WAAA,CACJ,QAAA,EACA,KAAA,EACsB;AACtB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,SAAS,QAAQ,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,aAAA,CACJ,IAAA,EACA,KAAA,EACsB;AACtB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAC1C,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,OAAO,KAAA,EAA4C;AACvD,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,UAAU,KAAA,EAA8B;AAC5C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAEnC,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,CAAC,KAAA,KAAU;AAChD,MAAA,KAAA,CAAM,MAAA,GAAS,WAAA;AACf,MAAA,KAAA,CAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,SAAA,EAAW,MAAM,wBAAA,EAA0B;AAAA,MAC9C,KAAA;AAAA,MACA,MAAM,GAAA,EAAK,IAAA;AAAA,MACX,MAAA,EAAQ;AAAA,KACT,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEjB,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA,EAAM,YAAY,GAAA,CAAI,SAAA;AAAA,MACtB,KAAA;AAAA,MACA,OAAA,EAAS,EAAE,MAAA,EAAQ,8BAAA;AAA+B,KACnD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAA,CACJ,KAAA,EACA,KAAA,EACA,KAAA,EACAC,eAAc,IAAA,EACC;AACf,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAC9C,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,0CAAA,EAA4C,EAAE,KAAA,EAAO,OAAO,CAAA;AAC7E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAC/C,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,0CAAA,EAA4C,EAAE,KAAA,EAAO,OAAO,CAAA;AAC7E,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,KAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,KAAA,EAAO,CAAC,KAAA,KAAU;AACvD,MAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,MAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,QACZ,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AACA,MAAA,KAAA,CAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,MAAA,KAAA,CAAM,OAAA,GAAA,CAAW,KAAA,CAAM,OAAA,IAAW,CAAA,IAAK,CAAA;AAAA,IACzC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAA,EAAc,KAAA,EAAO;AAAA,MACrC,KAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA,EAAA,CAAU,GAAA,CAAI,OAAA,IAAW,CAAA,IAAK;AAAA,KAC/B,CAAA;AAGD,IAAA,IAAA,CAAK,SAAA,EAAW,MAAM,qBAAA,EAAuB;AAAA,MAC3C,KAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,OAAA,EAAA,CAAU,GAAA,CAAI,OAAA,IAAW,CAAA,IAAK,CAAA;AAAA,MAC9B,cAAc,KAAA,CAAM,OAAA;AAAA,MACpB,SAAA,EAAWA,YAAAA,IAAe,IAAA,CAAK,cAAA,CAAe,GAAG;AAAA,KAClD,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEjB,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA,EAAM,YAAY,GAAA,CAAI,MAAA;AAAA,MACtB,KAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA,EAAS,EAAE,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,OAAA,EAAA,CAAU,GAAA,CAAI,OAAA,IAAW,CAAA,IAAK,CAAA;AAAE,KACxF,CAAA;AAGD,IAAA,IAAIA,YAAAA,IAAe,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,EAAG;AAC3C,MAAA,MAAM,YAAY,IAAA,CAAK,gBAAA,CAAiB,IAAI,OAAA,IAAW,CAAA,EAAG,IAAI,OAAO,CAAA;AAErE,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,sBAAA,EAAwB;AAAA,QACvC,KAAA;AAAA,QACA,KAAA;AAAA,QACA,OAAA,EAAA,CAAU,GAAA,CAAI,OAAA,IAAW,CAAA,IAAK,CAAA;AAAA,QAC9B;AAAA,OACD,CAAA;AAGD,MAAA,UAAA,CAAW,YAAY;AACrB,QAAA,MAAM,KAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,KAAA,EAAO,CAAC,KAAA,KAAU;AACvD,UAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,UAAA,KAAA,CAAM,KAAA,GAAQ,MAAA;AACd,UAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAClB,UAAA,KAAA,CAAM,UAAA,GAAa,MAAA;AAAA,QACrB,CAAC,CAAA;AAGD,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AACrD,QAAA,MAAM,UAAA,GAAa,YAAY,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAC9D,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,KAAK,SAAA,CAAU,UAAA,CAAW,OAAO,UAAA,EAAY,UAAA,CAAW,YAAY,QAAQ,CAAA;AAAA,QACpF;AAEA,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK,yBAAA,EAA2B,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,MAC9D,GAAG,SAAS,CAAA;AAAA,IACd,CAAA,MAAO;AAEL,MAAA,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAA,CAAmB,KAAA,EAAe,KAAA,EAA8B;AACpE,IAAA,MAAM,KAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,KAAA,EAAO,CAAC,KAAA,KAAU;AACvD,MAAA,KAAA,CAAM,MAAA,GAAS,aAAA;AACf,MAAA,KAAA,CAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,iBAAA,EAAmB,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,KAAA,EAAe,KAAA,EAA8B;AAChE,IAAA,MAAM,KAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,KAAA,EAAO,CAAC,KAAA,KAAU;AACvD,MAAA,KAAA,CAAM,MAAA,GAAS,SAAA;AACf,MAAA,KAAA,CAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAC3C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,aAAA,EAAe,EAAE,KAAA,EAAO,OAAO,CAAA;AAGjD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACnC,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAChD,IAAA,IAAA,CAAK,SAAA,EAAW,MAAM,sBAAA,EAAwB;AAAA,MAC5C,KAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAS,GAAA,EAAK,OAAA;AAAA,MACd,SAAA,EAAW,GAAA,EAAK,KAAA,CAAM,MAAA,IAAU;AAAA,KACjC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEjB,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA,EAAM,YAAY,GAAA,CAAI,OAAA;AAAA,MACtB,KAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA,EAAS,EAAE,OAAA,EAAS,GAAA,EAAK,OAAA;AAAQ,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CAAiB,KAAA,EAAe,KAAA,EAA8B;AAClE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACnC,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAChD,IAAA,MAAM,SAAA,GAAY,GAAA,EAAK,SAAA,GAAY,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAA,CAAK,GAAA,EAAI;AAChF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,IAAA,MAAM,KAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,KAAA,EAAO,CAAC,KAAA,KAAU;AACvD,MAAA,KAAA,CAAM,MAAA,GAAS,SAAA;AACf,MAAA,KAAA,CAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,4BAAA,EAA8B,EAAE,KAAA,EAAO,OAAO,CAAA;AAG/D,IAAA,IAAA,CAAK,SAAA,EAAW,MAAM,wBAAA,EAA0B;AAAA,MAC9C,KAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAS,GAAA,EAAK,OAAA;AAAA,MACd,UAAA,EAAY,QAAA;AAAA,MACZ,SAAA,EAAW,GAAA,EAAK,KAAA,CAAM,MAAA,IAAU;AAAA,KACjC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEjB,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA,EAAM,YAAY,GAAA,CAAI,SAAA;AAAA,MACtB,KAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAS,EAAE,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,YAAY,QAAA;AAAS,KACxD,CAAA;AAGD,IAAA,MAAM,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAmB,KAAA,EAA8B;AAC7D,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,SAAS,CAAA;AAC/D,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,QAAQ,CAAA;AAC5D,IAAA,MAAM,UAAA,GAAa,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,MAAA,KAAW,QAAQ,CAAA;AAGvF,IAAA,IAAI,UAAA,EAAY;AACd,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,CAAC,KAAA,KAAU;AAChD,QAAA,KAAA,CAAM,MAAA,GAAS,SAAA;AACf,QAAA,KAAA,CAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,QAAA,OAAO,KAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,qCAAA,EAAuC,EAAE,OAAO,CAAA;AAGjE,MAAA,IAAA,CAAK,SAAA,EAAW,MAAM,wBAAA,EAA0B;AAAA,QAC9C,KAAA;AAAA,QACA,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,QAAA,EAAU,IAAI,IAAA,CAAK,MAAA;AAAA,QACnB,MAAA,EAAQ;AAAA,OACT,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAEjB,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,IAAA,EAAM,YAAY,GAAA,CAAI,QAAA;AAAA,QACtB,KAAA;AAAA,QACA,SAAS,EAAE,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAM,IAAI,IAAA;AAAK,OAC9C,CAAA;AAAA,IACH,WAAW,SAAA,EAAW;AACpB,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,CAAC,KAAA,KAAU;AAChD,QAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,QAAA,KAAA,CAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,QAAA,OAAO,KAAA;AAAA,MACT,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,qBAAA,EAAuB,EAAE,OAAO,CAAA;AAGjD,MAAA,IAAA,CAAK,SAAA,EAAW,MAAM,wBAAA,EAA0B;AAAA,QAC9C,KAAA;AAAA,QACA,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,QAAA,EAAU,IAAI,IAAA,CAAK,MAAA;AAAA,QACnB,MAAA,EAAQ;AAAA,OACT,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAEjB,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,QACxB,IAAA,EAAM,YAAY,GAAA,CAAI,MAAA;AAAA,QACtB,KAAA;AAAA,QACA,SAAS,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,IAAI,IAAA;AAAK,OAC7C,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CAAgB,KAAA,EAAe,KAAA,EAAe,MAAA,EAA+B;AACjF,IAAA,MAAM,KAAK,UAAA,CAAW,UAAA,CAAW,OAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,KAAA,KAAU;AAChE,MAAA,KAAA,CAAM,MAAA,GAAS,SAAA;AACf,MAAA,KAAA,CAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAC3C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,cAAA,EAAgB,EAAE,KAAA,EAAO,KAAA,EAAO,QAAQ,CAAA;AAE1D,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA,EAAM,YAAY,IAAA,CAAK,OAAA;AAAA,MACvB,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CACJ,KAAA,EACA,KAAA,EACA,QACA,MAAA,EACe;AACf,IAAA,MAAM,KAAK,UAAA,CAAW,UAAA,CAAW,OAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,KAAA,KAAU;AAChE,MAAA,KAAA,CAAM,MAAA,GAAS,SAAA;AACf,MAAA,KAAA,CAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,MAAA,IAAI,WAAW,MAAA,EAAW;AACxB,QAAA,KAAA,CAAM,OAAA,GAAU,MAAA;AAAA,MAClB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,gBAAA,EAAkB,EAAE,KAAA,EAAO,KAAA,EAAO,QAAQ,CAAA;AAE5D,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA,EAAM,YAAY,IAAA,CAAK,SAAA;AAAA,MACvB,KAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAS,MAAA,KAAW,MAAA,GAAY,EAAE,OAAA,EAAS,QAAO,GAAI;AAAA,KACvD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,KAAA,EACA,KAAA,EACA,MAAA,EACA,OACA,OAAA,EACe;AACf,IAAA,MAAM,KAAK,UAAA,CAAW,UAAA,CAAW,OAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,KAAA,KAAU;AAChE,MAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,MAAA,KAAA,CAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,MAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,QACZ,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,OAAO,KAAA,CAAM;AAAA,OACf;AACA,MAAA,IAAI,OAAA,EAAS;AAAC,QAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAAA,MAAO;AAAA,IACvC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,aAAA,EAAe,EAAE,KAAA,EAAO,OAAO,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,OAAA,EAAS,CAAA;AAE/E,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA,EAAM,YAAY,IAAA,CAAK,MAAA;AAAA,MACvB,KAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,CAAM,OAAA;AAAQ,KACjC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAA,CACJ,KAAA,EACA,KAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,KAAK,UAAA,CAAW,UAAA,CAAW,OAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,KAAA,KAAU;AAChE,MAAA,KAAA,CAAM,MAAA,GAAS,kBAAA;AACf,MAAA,KAAA,CAAM,YAAY,KAAA,CAAM,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,IAC9D,CAAC,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA,EAAM,YAAY,IAAA,CAAK,eAAA;AAAA,MACvB,KAAA;AAAA,MACA,OAAA,EAAS,EAAE,KAAA,EAAO,MAAA;AAAO,KAC1B,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,2BAAA,EAA6B,EAAE,KAAA,EAAO,KAAA,EAAO,QAAQ,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAA,CACJ,KAAA,EACA,OACA,MAAA,EACA,MAAA,EACA,MACA,OAAA,EACe;AACf,IAAA,IAAI,WAAW,SAAA,EAAW;AACxB,MAAA,MAAM,KAAK,UAAA,CAAW,UAAA,CAAW,OAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,KAAA,KAAU;AAChE,QAAA,KAAA,CAAM,MAAA,GAAS,SAAA;AACf,QAAA,KAAA,CAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,QAAA,KAAA,CAAM,OAAA,GAAU;AAAA,UACd,QAAA,EAAU,IAAA;AAAA,UACV,MAAA;AAAA,UACA,GAAI,OAAA,GAAU,EAAE,OAAA,KAAY,EAAC;AAAA,UAC7B,GAAI,QAAQ;AAAC,SACf;AAAA,MACF,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,kBAAA,EAAoB,EAAE,OAAO,KAAA,EAAO,MAAA,EAAQ,SAAS,CAAA;AAAA,IACxE,CAAA,MAAO;AACL,MAAA,MAAM,KAAK,UAAA,CAAW,UAAA,CAAW,OAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,KAAA,KAAU;AAChE,QAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,QAAA,KAAA,CAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,QAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,UACZ,SAAS,OAAA,IAAW,mBAAA;AAAA,UACpB,IAAA,EAAM;AAAA,SACR;AACA,QAAA,KAAA,CAAM,OAAA,GAAU;AAAA,UACd,QAAA,EAAU,KAAA;AAAA,UACV,MAAA;AAAA,UACA,GAAI,OAAA,GAAU,EAAE,OAAA,KAAY,EAAC;AAAA,UAC7B,GAAI,QAAQ;AAAC,SACf;AAAA,MACF,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,mBAAA,EAAqB,EAAE,OAAO,KAAA,EAAO,MAAA,EAAQ,SAAS,CAAA;AAAA,IACzE;AAEA,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA,EAAM,YAAY,IAAA,CAAK,OAAA;AAAA,MACvB,KAAA;AAAA,MACA,OAAA,EAAS,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA;AAAO,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,GAAkC;AACtC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa;AAClD,IAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,IAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,MAAA,CAAO,GAAA,CAAI,OAAO,KAAA,KAAU;AAC1B,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAC9C,QAAA,IAAI,CAAC,GAAA,EAAK;AAAE,UAAA;AAAA,QAAO;AACnB,QAAA,IAAI,GAAA,CAAI,MAAA,KAAW,SAAA,IAAa,GAAA,CAAI,WAAW,QAAA,EAAU;AAAE,UAAA;AAAA,QAAO;AAElE,QAAA,MAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,CAAC,KAAA,KAAU;AAChD,UAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,UAAA,KAAA,CAAM,UAAA,GAAa,GAAA;AACnB,UAAA,IAAI,MAAM,SAAA,EAAW;AACnB,YAAA,KAAA,CAAM,UAAA,GAAa,IAAI,IAAA,CAAK,GAAG,CAAA,CAAE,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,CAAE,OAAA,EAAQ;AAAA,UACjF;AAEA,UAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,EAAM;AAC5B,YAAA,IAAI,GAAA,CAAI,MAAA,KAAW,SAAA,IAAa,GAAA,CAAI,WAAW,QAAA,EAAU;AACvD,cAAA,GAAA,CAAI,MAAA,GAAS,QAAA;AACb,cAAA,GAAA,CAAI,KAAA,GAAQ,EAAE,OAAA,EAAS,2CAAA,EAAuC;AAC9D,cAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AAAA,YACnB;AAAA,UACF;AACA,UAAA,OAAO,KAAA;AAAA,QACT,CAAC,CAAA;AACD,QAAA,KAAA,EAAA;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,oDAAA,EAAsD,EAAE,OAAO,CAAA;AAAA,IAClF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAA,GAAuC;AAC3C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa;AAGlD,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC5B,MAAA,CAAO,GAAA,CAAI,OAAM,KAAA,KAAS;AACxB,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAC9C,QAAA,IAAI,CAAC,GAAA,EAAK;AAAC,UAAA,OAAO,CAAA;AAAA,QAAC;AAEnB,QAAA,MAAM,kBAAkB,GAAA,CAAI,IAAA,CAAK,OAAO,CAAA,GAAA,KAAO,GAAA,CAAI,WAAW,aAAa,CAAA;AAG3E,QAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,UACZ,eAAA,CAAgB,GAAA,CAAI,OAAM,GAAA,KAAO;AAC/B,YAAA,IAAA,CAAK,MAAA,CAAO,KAAK,0BAAA,EAA4B,EAAE,OAAO,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA;AAErE,YAAA,MAAM,KAAK,UAAA,CAAW,SAAA,CAAU,OAAO,GAAA,CAAI,EAAA,EAAI,CAAC,KAAA,KAAU;AACxD,cAAA,KAAA,CAAM,MAAA,GAAS,QAAA;AACf,cAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAClB,cAAA,KAAA,CAAM,UAAA,GAAa,MAAA;AAAA,YACrB,CAAC,CAAA;AAGD,YAAA,MAAM,SAAA,GAAY,EAAE,GAAG,GAAA,EAAK,QAAQ,QAAA,EAAkB;AACtD,YAAA,MAAM,KAAK,SAAA,CAAU,UAAA,CAAW,OAAO,SAAA,EAAW,SAAA,CAAU,YAAY,QAAQ,CAAA;AAAA,UAClF,CAAC;AAAA,SACH;AAEA,QAAA,OAAO,eAAA,CAAgB,MAAA;AAAA,MACzB,CAAC;AAAA,KACH;AAEA,IAAA,MAAM,YAAA,GAAe,QAAQ,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,OAAO,CAAC,CAAA;AAElE,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,IAAA,CAAK,OAAO,IAAA,CAAK,0BAAA,EAA4B,EAAE,KAAA,EAAO,cAAc,CAAA;AAAA,IACtE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,GAAA,EAAsB;AAC3C,IAAA,MAAM,cAAc,GAAA,CAAI,OAAA,IAAW,EAAE,GAAA,EAAK,CAA2B,CAAA;AACrE,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,IAAW,CAAA;AAE/B,IAAA,OAAO,UAAU,WAAA,CAAY,GAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CACN,SACA,MAAA,EACQ;AACR,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,OAAA,EAAS,QAAQ,OAAA,IAAW,KAAA;AAAA,MAC5B,iBAAA,EAAmB,QAAQ,iBAAA,IAAqB,GAAA;AAAA,MAChD,aAAA,EAAe,QAAQ,aAAA,IAAiB;AAAA,KAC1C;AAEA,IAAA,IAAI,SAAA;AAEJ,IAAA,IAAI,MAAA,CAAO,YAAY,KAAA,EAAO;AAE5B,MAAA,SAAA,GAAY,MAAA,CAAO,iBAAA,GAAoB,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA;AAAA,IAC5D,CAAA,MAAO;AAEL,MAAA,SAAA,GAAY,MAAA,CAAO,qBAAqB,OAAA,GAAU,CAAA,CAAA;AAAA,IACpD;AAGA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,MAAA,CAAO,aAAa,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,SAAA,CAAU,KAAA,EAAe,KAAA,EAAe,KAAA,EAA6B;AACjF,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,oCAAA,EAAsC,EAAE,KAAA,EAAO,OAAO,CAAA;AAGvE,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,CAAC,KAAA,KAAU;AAChD,MAAA,KAAA,CAAM,MAAA,GAAS,KAAA;AACf,MAAA,KAAA,CAAM,MAAA,GAAS;AAAA,QACb,MAAA,EAAQ,KAAA;AAAA,QACR,OAAA,EAAS,OAAO,KAAK,CAAA,yBAAA,CAAA;AAAA,QACrB,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,OAAA,EAAS;AAAA,YACP,OAAO,KAAA,CAAM;AAAA;AACf;AACF,OACF;AACA,MAAA,KAAA,CAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAC5C,CAAC,CAAA;AAGD,IAAA,MAAM,MAAA,GAAS,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAC7C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AAC9C,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAEhD,IAAA,MAAM,IAAA,CAAK,QAAQ,KAAA,CAAO,GAAA;AAAA,MACxB,MAAA;AAAA,MACA,KAAK,SAAA,CAAU;AAAA,QACb,KAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAS,GAAA,EAAK,OAAA;AAAA,QACd,KAAA,EAAO;AAAA,UACL,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,OAAO,KAAA,CAAM;AAAA,SACf;AAAA,QACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,QAAA,EAAU,KAAK,OAAA,IAAW;AAAA,OAC3B,CAAA;AAAA,MACD,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK;AAAA;AAAA,KACrB;AAGA,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,UAAA,CAAW,OAAO,KAAK,CAAA;AACrD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,GAAA,CAAI,QAAQ,UAAU,CAAA;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CACJ,KAAA,EACA,OAAA,EAC6B;AAC7B,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,OAAO,OAAO,CAAA;AAC9D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,GAAA,CAAI,SAAS,OAAO,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAA,CACJ,KAAA,EACA,MAAA,EACA,OAAA,GAA+B,EAAC,EACH;AAC7B,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,WAAW,SAAA,CAAU,KAAA,EAAO,CAAC,GAAA,KAAQ;AAC9D,MAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,MAAA,GAAA,CAAI,MAAA,GAAS,MAAA;AACb,MAAA,GAAA,CAAI,UAAA,GAAa,GAAA;AACjB,MAAA,GAAA,CAAI,aAAa,iBAAA,CAAkB,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,UAAU,GAAG,CAAA;AACrE,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,GAAA,CAAI,OAAO,OAAA,CAAQ,IAAA;AAAA,MACrB;AACA,MAAA,IAAI,QAAQ,KAAA,EAAO;AAGnB,MAAA,OAAO,GAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,OAAO,CAAA;AACpD,MAAA,MAAM,IAAA,CAAK,eAAA;AAAA,QACT,MAAA,KAAW,QAAA,GACP,WAAA,CAAY,GAAA,CAAI,MAAA,GAChB,MAAA,KAAW,WAAA,GACT,WAAA,CAAY,GAAA,CAAI,SAAA,GAChB,WAAA,CAAY,GAAA,CAAI,QAAA;AAAA,QACtB;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,GAAyC;AAC7C,IAAA,OAAO,IAAA,CAAK,UAAU,UAAA,EAAW;AAAA,EACnC;AAAA,EAEA,MAAM,aAAA,CAAc,KAAA,EAAsB,OAAA,EAAgC;AACxE,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,KAAA,EAAO,OAAO,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,eAAA,CACJ,IAAA,EACA,GAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA;AAAA,MACA,OAAO,GAAA,CAAI,EAAA;AAAA,MACX,OAAA,EAAS;AAAA,QACP,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,SAAS,GAAA,CAAI;AAAA;AACf,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,KAAA,EACA,KAAA,EACA,QACA,KAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,OAAO,OAAA,CAAQ;AAAA,MACxB,IAAA,EAAM,YAAY,GAAA,CAAI,QAAA;AAAA,MACtB,KAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,KAAA,EACA,WAAA,EACA,KACA,IAAA,EAC6B;AAC7B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,uCAAA,EAAyC,EAAE,OAAO,CAAA;AACnE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAK,eAAA,CAAgB,cAAA,CAAe,GAAA,EAAK,WAAA,EAAa,KAAK,IAAI,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,KAAA,EAA4C;AAC5D,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,KAAK,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAA,CACJ,KAAA,EACA,OAAA,GAII,EAAC,EACwB;AAE7B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,eAAA,CAAgB,YAAY,KAAK,CAAA;AAC7D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,mCAAA,EAAqC,EAAE,OAAO,CAAA;AAC/D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,CAAS,IAAA,EAAM,mBAAA,IAAuB,QAAA,CAAS,MAAM,qBAAA,EAAuB;AAC9E,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB;AACjC,QAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,MACzF;AAEA,MAAA,IAAI,QAAA,CAAS,KAAK,mBAAA,EAAqB;AACrC,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,eAAA,CAAgB;AAAA,UACjD,UAAA,EAAY,SAAS,IAAA,CAAK,mBAAA;AAAA,UAC1B,QAAA,EAAU,EAAE,MAAA,EAAQ,iBAAA,EAAmB,KAAA;AAAM,SAC9C,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,QAAA,CAAS,KAAK,qBAAA,EAAuB;AACvC,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,eAAA,CAAgB;AAAA,UACjD,UAAA,EAAY,SAAS,IAAA,CAAK,qBAAA;AAAA,UAC1B,QAAA,EAAU,EAAE,MAAA,EAAQ,iBAAA,EAAmB,KAAA;AAAM,SAC9C,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,cAAc,QAAA,CAAS,GAAA;AAG7B,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,WAAA,CAAY,MAAM,EAAE,GAAG,SAAS,GAAA,EAAK,GAAG,QAAQ,GAAA,EAAI;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,WAAA,CAAY,MAAM,QAAA,CAAS,GAAA;AAAA,IAC7B;AAGA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,KAAA,MAAW,GAAA,IAAO,YAAY,IAAA,EAAM;AAClC,QAAA,IAAI,SAAA,GAAY,KAAA;AAChB,QAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,UAAA,IAAI,IAAA,CAAK,EAAA,KAAO,OAAA,CAAQ,UAAA,EAAY;AAElC,YAAA,SAAA,GAAY,IAAA;AAEZ,YAAA,IAAI,IAAA,CAAK,WAAW,QAAA,EAAU;AAC5B,cAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,cAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,cAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,YACpB;AACA,YAAA;AAAA,UACF;AACA,UAAA,IAAI,CAAC,SAAA,EAAW;AAEd,YAAA,IAAI,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,IAAA,CAAK,WAAW,QAAA,EAAU;AACzD,cAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,cAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,IAAA,iBAAc,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,YAC9D;AAAA,UACF,CAAA,MAAO;AAEL,YAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,YAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,YAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,KAAA,MAAW,GAAA,IAAO,YAAY,IAAA,EAAM;AAClC,QAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,UAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,UAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,UAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAGA,IAAA,WAAA,CAAY,MAAA,GAAS,SAAA;AACrB,IAAA,WAAA,CAAY,YAAY,WAAA,CAAY,SAAA,IAAA,iBAAa,IAAI,IAAA,IAAO,WAAA,EAAY;AACxE,IAAA,WAAA,CAAY,UAAA,GAAa,MAAA;AAGzB,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,WAAW,CAAA;AAGzC,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,WAAW,CAAA;AAE5C,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,4BAAA,EAA8B;AAAA,MAC7C,KAAA;AAAA,MACA,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,KAAA,EAA8B;AACjD,IAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,cAAA,CAAe,KAAK,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAA,GAA8C;AAElD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa;AAGlD,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAA,EAAA,KAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AAE3E,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACV,CAAC,QACC,GAAA,KAAQ,IAAA,KAAS,IAAI,MAAA,KAAW,SAAA,IAAa,IAAI,MAAA,KAAW,QAAA;AAAA,KAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,GAAqC;AAEzC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa;AAGlD,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAA,EAAA,KAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AAE3E,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAA4B,QAAQ,IAAI,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,GAAmC;AACvC,IAAA,OAAO,KAAK,UAAA,EAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAA,GAiBH;AAED,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,YAAA,EAAa;AAElD,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,CAAA;AAAA,QACX,MAAA,EAAQ,CAAA;AAAA,QACR,SAAA,EAAW,CAAA;AAAA,QACX,GAAA,EAAK;AAAA,OACP;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW,CAAA;AAAA,QACX,MAAA,EAAQ;AAAA;AACV,KACF;AAGA,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAA,EAAA,KAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AAG3E,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI,CAAC,GAAA,EAAK;AAAC,QAAA;AAAA,MAAQ;AAEnB,MAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAA;AAGb,MAAA,IAAI,GAAA,CAAI,WAAW,QAAA,EAAU;AAAC,QAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAA;AAAA,MAAQ,CAAA,MAAA,IAC1C,GAAA,CAAI,MAAA,KAAW,SAAA,EAAW;AAAC,QAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAA;AAAA,MAAS,CAAA,MAAA,IACjD,GAAA,CAAI,MAAA,KAAW,SAAA,EAAW;AAAC,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAA;AAAA,MAAW,CAAA,MAAA,IACnD,GAAA,CAAI,MAAA,KAAW,QAAA,EAAU;AAAC,QAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAA;AAAA,MAAQ,CAAA,MAAA,IAC/C,GAAA,CAAI,MAAA,KAAW,WAAA,EAAa;AAAC,QAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAA;AAAA,MAAW,CAAA,MAAA,IACrD,GAAA,CAAI,MAAA,KAAW,KAAA,EAAO;AAAC,QAAA,OAAA,CAAQ,IAAA,CAAK,GAAA,EAAA;AAAA,MAAK;AAGlD,MAAA,KAAA,MAAW,GAAA,IAAO,IAAI,IAAA,EAAM;AAC1B,QAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAA;AACb,QAAA,IAAI,GAAA,CAAI,WAAW,QAAA,EAAU;AAAC,UAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAA;AAAA,QAAQ,CAAA,MAAA,IAC1C,GAAA,CAAI,MAAA,KAAW,SAAA,EAAW;AAAC,UAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,EAAA;AAAA,QAAS,CAAA,MAAA,IACjD,GAAA,CAAI,MAAA,KAAW,SAAA,EAAW;AAAC,UAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAA;AAAA,QAAW,CAAA,MAAA,IACnD,GAAA,CAAI,MAAA,KAAW,QAAA,EAAU;AAAC,UAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,EAAA;AAAA,QAAQ;AAAA,MAC1D;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAEA,SAAS,iBAAA,CACP,WACA,UAAA,EACoB;AACpB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACjC,EAAA,IAAI,OAAO,KAAA,CAAM,KAAK,KAAK,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG;AAC5C,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,KAAK,CAAA;AAChC;ACjlCO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAA6B,OAAA,EAAgC;AAAhC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAiC;AAAA,EAAjC,OAAA;AAAA,EAE7B,MAAM,cAAA,CACJ,MAAA,EACA,eAAA,EACA,YAAA,EACe;AACf,IAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,MAAA;AAE3B,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,yBAAA,EAA2B;AAAA,MACnD,QAAA;AAAA,MACA,SAAS,IAAA,CAAK,MAAA;AAAA,MACd;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC5B,IAAA,CAAK,GAAA;AAAA,QAAI,YACP,IAAA,CAAK,oBAAA,CAAqB,OAAO,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA;AAAA,UACpD,CAAA,SAAA,MAAc,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAS,IAAA,EAAc,CAAA;AAAA,UAC1D,CAAA,KAAA,MAAU,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAS,KAAA,EAAe;AAAA;AACrD;AACF,KACF;AAEA,IAAA,MAAM,kBAA6D,EAAC;AACpE,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,MAAM,OAAA,EAAS;AACzD,QAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,MAAA,CAAO,KAAA,CAAM,SAAS,CAAA;AAAA,MAChD,WAAW,MAAA,CAAO,MAAA,KAAW,eAAe,CAAC,MAAA,CAAO,MAAM,OAAA,EAAS;AACjE,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,sCAAA,EAAwC;AAAA,UAC/D,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAA;AAAA,UAC3B,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,KAAA;AAAA,UAC3B,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,KAAA,YAAiB,KAAA,GACjC,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,OAAA,GACnB,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,KAAK;AAAA,SAC9B,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI,eAAA,CAAgB,WAAW,CAAA,EAAG;AAChC,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,6BAAA,EAA+B;AAAA,QACtD,SAAS,IAAA,CAAK;AAAA,OACf,CAAA;AACD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,QAAA,EAAU,eAAA,EAAiB,eAAe,CAAA;AAExE,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,0BAAA,EAA4B;AAAA,MACnD,QAAA;AAAA,MACA,aAAa,eAAA,CAAgB;AAAA,KAC9B,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,oBAAA,CACZ,KAAA,EACA,KAAA,EACoD;AAEpD,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,OAAO,KAAK,CAAA;AACtD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,GAAA,GAAM,KAAA,GACR,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,KAAK,CAAA,GACnC,GAAA,CAAI,KAAK,CAAC,CAAA;AAEd,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,SAAS,OAAO,CAAA,kBAAA,EAAqB,KAAK,CAAA,CAAE,CAAA;AAAA,IACrE;AAGA,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,SAAA,EAAW,OAAA,IAAW,EAAC;AACjD,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,MAAM,kBAAkB,8BAAA,CAA+B,IAAA;AAAA,MACrD,KAAK,OAAA,CAAQ,aAAA;AAAA,MACb,KAAA;AAAA,MACA,GAAA,CAAI;AAAA,KACL,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC5B,aAAA,CAAc,IAAI,CAAA,YAAA,KAAgB;AAChC,QAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,eAAA,EAAiB,YAAY,CAAA,CAAE,IAAA;AAAA,UAC7D,CAAA,OAAA,MAAY,EAAE,YAAA,EAAc,OAAA,EAAS,SAAS,IAAA,EAAc,CAAA;AAAA,UAC5D,CAAA,KAAA,MAAU,EAAE,YAAA,EAAc,KAAA,EAAO,SAAS,KAAA,EAAe;AAAA,SAC3D;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,MAAM,YAAuD,EAAC;AAC9D,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,MAAM,OAAA,EAAS;AACzD,QAAA,SAAA,CAAU,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,cAAc,OAAA,EAAS,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,MACnF,WAAW,MAAA,CAAO,MAAA,KAAW,eAAe,CAAC,MAAA,CAAO,MAAM,OAAA,EAAS;AACjE,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,yBAAA,EAA2B;AAAA,UAClD,KAAA;AAAA,UACA,OAAO,GAAA,CAAI,EAAA;AAAA,UACX,YAAA,EAAc,OAAO,KAAA,CAAM,YAAA;AAAA,UAC3B,KAAA,EAAO,MAAA,CAAO,KAAA,CAAM,KAAA,YAAiB,KAAA,GACjC,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,OAAA,GACnB,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,KAAK;AAAA,SAC9B,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,MAAc,mBAAA,CACZ,SAAA,EACA,YAAA,EACkB;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,SAAA,CAAU,QAAQ,YAAY,CAAA,EAAG,SAAS,MAAM,CAAA;AAEvE,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAC3B,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,OAAA;AAAA,MACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,yBAAA,EAA4B,YAAY,CAAA,GAAA,EAAM,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OACtG;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,kBAAA,CACZ,QAAA,EACA,eAAA,EACA,eAAA,EACe;AAEf,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAuB;AAEnD,IAAA,KAAA,MAAW,YAAY,eAAA,EAAiB;AACtC,MAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AACvC,QAAA,eAAA,CAAgB,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AAAA,MACvC;AACA,MAAA,eAAA,CAAgB,IAAI,QAAA,CAAS,IAAI,CAAA,CAAG,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,OAAO,CAAC,IAAA,EAAM,QAAQ,CAAA,KAAM;AACpE,QAAA,IAAI,MAAA;AAEJ,QAAA,QAAQ,QAAA;AAAU,UAChB,KAAK,QAAA,EAAU;AAEb,YAAA,MAAA,GAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,YAAA;AAAA,UACF;AAAA,UACA,KAAK,WAAA,EAAa;AAEhB,YAAA,MAAA,GAAS,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AACrC,YAAA;AAAA,UACF;AAAA,UACA,KAAK,YAAA,EAAc;AAEjB,YAAA,MAAA,GAAS,IAAA,CAAK,UAAU,QAAQ,CAAA;AAChC,YAAA;AAAA,UACF;AAAA,UACA,SAAS;AACP,YAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,yCAAA,EAA2C;AAAA,cAClE,QAAA;AAAA,cACA;AAAA,aACD,CAAA;AACD,YAAA,MAAA,GAAS,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAAA,UACvC;AAAA;AAIF,QAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,eAAA,EAAiB,IAAA,EAAM,MAAM,CAAA;AAAA,MAC7D,CAAC;AAAA,KACH;AAAA,EACF;AAAA,EAEQ,YAAY,QAAA,EAA8B;AAEhD,IAAA,IAAI,QAAA,CAAS,MAAM,CAAC,CAAA,KAAM,MAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG;AAC3C,MAAA,OAAQ,SAAyB,IAAA,EAAK;AAAA,IACxC;AAGA,IAAA,IAAI,SAAS,KAAA,CAAM,CAAC,MAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AAChD,MAAA,OAAQ,QAAA,CAAsB,KAAK,IAAI,CAAA;AAAA,IACzC;AAGA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,UAAU,QAAA,EAA8B;AAE9C,IAAA,IAAI,SAAkC,EAAC;AAEvC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,OAAO,YAAY,QAAA,IAAY,OAAA,KAAY,QAAQ,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC9E,QAAA,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,OAAkC,CAAA;AAAA,MACpE,CAAA,MAAO;AAEL,QAAA,MAAA,GAAS,OAAA;AAAA,MACX;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,SAAA,CACN,QACA,MAAA,EACyB;AACzB,IAAA,MAAM,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AAE3B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,IACE,GAAA,IAAO,MAAA,IACP,OAAO,MAAA,CAAO,GAAG,CAAA,KAAM,QAAA,IACvB,MAAA,CAAO,GAAG,CAAA,KAAM,IAAA,IAChB,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,IAC1B,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EACpB;AAEA,QAAA,MAAA,CAAO,GAAG,IAAI,IAAA,CAAK,SAAA;AAAA,UACjB,OAAO,GAAG,CAAA;AAAA,UACV;AAAA,SACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,KAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAc,kBAAA,CACZ,SAAA,EACA,IAAA,EACA,OAAA,EACe;AAEf,IAAA,MAAM,aAAA,GACJ,OAAO,OAAA,KAAY,QAAA,GACf,UACA,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAErC,IAAA,MAAM,SAAA,CAAU,OAAA,CAAQ,IAAA,EAAM,aAAa,CAAA;AAE3C,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA,CAAM,uBAAA,EAAyB,EAAE,MAAM,CAAA;AAAA,EAC7D;AACF;;;ACxJO,IAAM,kBAAN,MAAsB;AAAA,EACV,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EAEjB,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,GAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAA,GAA0C;AAC9C,IAAA,MAAM,QAAA,GAAW,4BAAA;AAGjB,IAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAuB,QAAQ,CAAA;AACxE,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAA,CAAK,QAAA,CAAS,QAAQ,KAAA,CAAM,yCAAA,EAA2C,EAAE,KAAA,EAAO,MAAA,CAAO,QAAQ,CAAA;AAC/F,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,2CAA2C,CAAA;AACvE,IAAA,MAAM,YAA+B,EAAC;AAGtC,IAAA,MAAM,mBAAmB,IAAA,CAAK,MAAA,CAAO,cAAc,EAAE,IAAA,EAAM,YAAY,CAAA;AACvE,IAAA,MAAM,cAAc,IAAA,CAAK,MAAA,CAAO,cAAc,EAAE,IAAA,EAAM,OAAO,CAAA;AAC7D,IAAA,MAAM,eAAe,IAAA,CAAK,MAAA,CAAO,cAAc,EAAE,IAAA,EAAM,QAAQ,CAAA;AAG/D,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,WAAA,EAAY,EAAG;AAC9C,MAAA,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,iBAAiB,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,UAAA,EAAoB,CAAE,CAAA;AAAA,MAC5E,GAAG,YAAY,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,KAAA,EAAe,CAAE,CAAA;AAAA,MAClE,GAAG,aAAa,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,MAAA,EAAQ,CAAA,EAAG,SAAA,EAAW,MAAA,EAAgB,CAAE;AAAA,KACtE;AAEA,IAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,SAAA,EAAU,IAAK,WAAA,EAAa;AAC/C,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,QAAQ,CAAA;AAChD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,yDAAA,EAA2D;AAAA,UACpF,QAAA,EAAU,OAAO,GAAA,CAAI,QAAA;AAAA,UACrB,QAAA,EAAU,OAAO,GAAA,CAAI,QAAA;AAAA,UACrB,IAAA,EAAM,OAAO,GAAA,CAAI;AAAA,SAClB,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,UAAA,SAAA,CAAU,IAAA,CAAK,KAAK,sBAAA,CAAuB,MAAA,CAAO,IAAI,QAAA,EAAU,MAAA,CAAO,WAAA,EAAoB,IAAI,CAAC,CAAA;AAAA,QAClG,CAAA,MAAA,IAAW,cAAc,KAAA,EAAO;AAC9B,UAAA,SAAA,CAAU,IAAA,CAAK,KAAK,iBAAA,CAAkB,MAAA,CAAO,IAAI,QAAA,EAAU,MAAA,CAAO,WAAA,EAAoB,IAAI,CAAC,CAAA;AAAA,QAC7F,CAAA,MAAO;AACL,UAAA,SAAA,CAAU,IAAA,CAAK,KAAK,mBAAA,CAAoB,MAAA,CAAO,IAAI,QAAA,EAAU,MAAA,CAAO,WAAA,EAAoB,IAAI,CAAC,CAAA;AAAA,QAC/F;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,2CAAA,EAA6C;AAAA,UACtE,QAAA,EAAU,OAAO,GAAA,CAAI,QAAA;AAAA,UACrB,QAAA,EAAU,OAAO,GAAA,CAAI,QAAA;AAAA,UACrB,IAAA,EAAM,OAAO,GAAA,CAAI,IAAA;AAAA,UACjB,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,SACvD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,oDAAA,EAAsD;AAAA,MAC/E,OAAO,SAAA,CAAU,MAAA;AAAA,MACjB,WAAW,gBAAA,CAAiB,MAAA;AAAA,MAC5B,MAAM,WAAA,CAAY,MAAA;AAAA,MAClB,OAAO,YAAA,CAAa;AAAA,KACrB,CAAA;AAGD,IAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,MAAA,MAAM,KAAK,QAAA,CAAS,KAAA,CAAM,IAAI,QAAA,EAAU,SAAA,EAAW,KAAK,UAAU,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAA,CACN,QAAA,EACA,OAAA,EACA,UAAA,EACiB;AACjB,IAAA,MAAM,EAAA,GAAK,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA,CAAA;AAEpC,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR,QAAA;AAAA,MACA,YAAA,EAAc,UAAA;AAAA,MACd,IAAA,EAAM,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,EAAA;AAAA,MAClC,aAAa,OAAA,CAAQ,QAAA;AAAA,MACrB,IAAA,EAAM,CAAC,QAAA,EAAU,QAAQ,CAAA;AAAA,MACzB,QAAA,EAAU;AAAA,QACR,EAAE,MAAM,QAAA;AAAS;AAAA,OACnB;AAAA,MACA,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAA,EAAQ,QAAA;AAAA,MACR,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,CACN,QAAA,EACA,OAAA,EACA,UAAA,EACiB;AACjB,IAAA,MAAM,EAAA,GAAK,CAAA,EAAG,QAAQ,CAAA,KAAA,EAAQ,QAAQ,EAAE,CAAA,CAAA;AAExC,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR,QAAA;AAAA,MACA,YAAA,EAAc,UAAA;AAAA,MACd,IAAA,EAAM,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,EAAA;AAAA,MAClC,aAAa,OAAA,CAAQ,QAAA;AAAA,MACrB,IAAA,EAAM,CAAC,QAAA,EAAU,KAAA,EAAO,QAAQ,CAAA;AAAA,MAChC,QAAA,EAAU;AAAA,QACR,EAAE,MAAM,QAAA;AAAS;AAAA,OACnB;AAAA,MACA,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,MAAA,EAAQ,QAAA;AAAA,MACR,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,CACN,QAAA,EACA,QAAA,EACA,UAAA,EACiB;AACjB,IAAA,MAAM,EAAA,GAAK,CAAA,EAAG,QAAQ,CAAA,MAAA,EAAS,SAAS,EAAE,CAAA,CAAA;AAE1C,IAAA,MAAM,QAAA,GAA6B;AAAA,MACjC,MAAM,QAAA,CAAS,QAAA;AAAA,MACf,OAAA,EAAS,SAAS,OAAA,IAAW;AAAA,KAC/B;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,MAAA,EAAQ,UAAA;AAAA,MACR,QAAA;AAAA,MACA,YAAA,EAAc,UAAA;AAAA,MACd,IAAA,EAAM,QAAA,CAAS,QAAA,IAAY,QAAA,CAAS,EAAA;AAAA,MACpC,aAAa,QAAA,CAAS,QAAA;AAAA,MACtB,IAAA,EAAM,CAAC,QAAA,EAAU,MAAA,EAAQ,QAAQ,CAAA;AAAA,MACjC,QAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAM,UAAA;AAAA,UACN,QAAQ,EAAE,IAAA,EAAM,SAAS,QAAA,EAAU,QAAA,EAAU,SAAS,QAAA;AAAS;AACjE,OACF;AAAA;AAAA;AAAA,MAGA,OAAA,EAAS,MAAA;AAAA;AAAA,MACT,QAAA;AAAA,MACA,MAAA,EAAS,QAAA,CAAS,OAAA,IAAW,IAAA,GAAQ,QAAA,GAAW,UAAA;AAAA,MAChD,aAAa,QAAA,CAAS;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,eAAA,GAKF;AACF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,EAAS;AACtC,IAAA,MAAM,cAKD,EAAC;AAEN,IAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,SAAA,IAAa,EAAC,EAAG;AAC5C,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,YAAY,EAAC;AACnD,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,aAAA,EAAe,MAAM,QAAA,CAAS,OAAA;AAAA,UAC9B,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB;AAAA,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,0CAAA,EAA4C;AAAA,MACtE,OAAO,WAAA,CAAY;AAAA,KACpB,CAAA;AAED,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,4BAA4B,CAAA;AAC7D,MAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,gCAAgC,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa,QAAA,EAA+D;AAC1E,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,YAAY;AAEtC,MAAA,MAAM,KAAK,UAAA,EAAW;AAGtB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA,EAAY;AACzC,QAAA,QAAA,CAAS,SAAS,CAAA;AAAA,MACpB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;ACnTO,IAAM,qBAAN,MAAyB;AAAA,EACb,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EAEjB,YAAY,OAAA,EAAoC;AAC9C,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,eAAA;AACxC,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,GAAA,EAAI;AAC1D,IAAA,IAAA,CAAK,kBAAA,GAAqBC,OAAAA,CAAQ,IAAA,CAAK,aAAA,EAAe,KAAK,UAAU,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAAA,EAA8C;AAEzD,IAAA,MAAM,SAAA,GAAYC,kBAAAA,CAAmB,KAAA,CAAM,IAAI,CAAA;AAG/C,IAAA,MAAM,KAAK,CAAA,GAAA,EAAMC,UAAAA,GAAa,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAEzC,IAAA,MAAM,MAAA,GAAyB;AAAA,MAC7B,EAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,MAAA,EAAQ;AAAA,KACV;AAGA,IAAA,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,MAAM,CAAA;AAElC,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,sCAAA,EAAwC;AAAA,MACjE,EAAA;AAAA,MACA,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,EAAA,EAA6C;AACrD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,EAAE,CAAA;AACzC,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,GAAI,IAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAA,EAA2D;AACpE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAG9C,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA;AAAA,MACjC,QAAA,CAAS,GAAA,CAAI,OAAM,QAAA,KAAY;AAC7B,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA;AAC/C,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,EAAE,CAAA;AACzC,QAAA,OAAO,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA,GAAI,IAAA;AAAA,MAC3C,CAAC;AAAA,KACH;AAGA,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,MAAA,CAAO,CAAC,QAAA,KAA0C;AAC/E,MAAA,IAAI,CAAC,QAAA,EAAU;AAAC,QAAA,OAAO,KAAA;AAAA,MAAM;AAC7B,MAAA,IAAI,OAAA,EAAS,MAAA,IAAU,QAAA,CAAS,MAAA,KAAW,QAAQ,MAAA,EAAQ;AAAC,QAAA,OAAO,KAAA;AAAA,MAAM;AACzE,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,IAAI,OAAA,EAAS,MAAA,KAAW,MAAA,IAAa,OAAA,EAAS,UAAU,MAAA,EAAW;AACjE,MAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,IAAU,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,KAAA,GAAQ,KAAA,GAAQ,QAAQ,KAAA,GAAQ,MAAA;AACpD,MAAA,OAAO,SAAA,CAAU,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAAuD;AAC9E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAE,CAAA;AAAA,IAC7C;AAGA,IAAA,MAAM,cAAc,EAAE,GAAG,MAAA,CAAO,IAAA,EAAM,GAAG,IAAA,EAAK;AAG9C,IAAA,MAAM,SAAA,GAAYD,kBAAAA,CAAmB,KAAA,CAAM,WAAW,CAAA;AAEtD,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,GAAG,MAAA;AAAA,MACH,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAEA,IAAA,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,OAAO,CAAA;AAEnC,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,sCAAA,EAAwC;AAAA,MACjE,EAAA;AAAA,MACA,MAAM,SAAA,CAAU;AAAA,KACjB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAA;AAEpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AACvC,MAAA,IAAA,CAAK,SAAS,MAAA,EAAQ,IAAA,CAAK,sCAAA,EAAwC,EAAE,IAAI,CAAA;AAAA,IAC3E,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,SAAS,MAAA,EAAQ,KAAA;AAAA,QACpB,mCAAA;AAAA,QACA,KAAA,YAAiB,QAAQ,KAAA,GAAQ,MAAA;AAAA,QACjC,EAAE,EAAA;AAAG,OACP;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,EAAA,EAA2B;AACvC,IAAA,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,UAAU,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,EAAA,EAA2B;AACrC,IAAA,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,EAAA,EAAY,KAAA,EAA8C;AAC1E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,GAAG,MAAA;AAAA,MACH,OAAO,EAAE,GAAG,MAAA,CAAO,KAAA,EAAO,GAAG,KAAA,EAAM;AAAA,MACnC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAEA,IAAA,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,OAAO,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,YAAA,CACZ,EAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,EAAE,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,GAAG,MAAA;AAAA,MACH,MAAA;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACpC;AAEA,IAAA,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,OAAO,CAAA;AACnC,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,6CAAA,EAA+C;AAAA,MACxE,EAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAgB,EAAA,EAAoB;AAE1C,IAAA,MAAM,UAAUE,IAAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,CAAA,EAAG,EAAE,CAAA,IAAA,CAAM,CAAA;AACzD,IAAA,MAAM,WAAWA,IAAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,CAAA,EAAG,EAAE,CAAA,KAAA,CAAO,CAAA;AAE3D,IAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAc,YAAA,CAAa,EAAA,EAAY,QAAA,EAAyC;AAC9E,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAA;AACpC,IAAA,MAAM,OAAOC,SAAA,CAAc,QAAA,EAAU,EAAE,MAAA,EAAQ,GAAG,CAAA;AAElD,IAAA,IAAI;AAEF,MAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,kBAAkB,CAAA,EAAG;AACxC,QAAA,MAAM,MAAM,IAAA,CAAK,kBAAA,EAAoB,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MAC1D;AAEA,MAAA,MAAM,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA;AAAA,IACrC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,SAAS,MAAA,EAAQ,KAAA;AAAA,QACpB,iCAAA;AAAA,QACA,KAAA,YAAiB,QAAQ,KAAA,GAAQ,MAAA;AAAA,QACjC,EAAE,IAAA;AAAK,OACT;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,EAAA,EAA4C;AACrE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,EAAE,CAAA;AAEpC,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,UAAA,CAAW,IAAI,CAAA,EAAG;AACrB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,OAAA,GAAU,MAAMC,QAAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAST,MAAU,OAAO,CAAA;AAGhC,MAAA,IAAI,MAAA,CAAO,EAAA,IAAM,MAAA,CAAO,IAAA,IAAQ,OAAO,SAAA,EAAW;AAChD,QAAA,OAAO,MAAA;AAAA,MACT;AAGA,MAAA,MAAM,IAAA,GAAqB;AAAA,QACzB,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,OAAA,EAAS,OAAO,OAAA,IAAW,OAAA;AAAA,QAC3B,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,EAAA,EAAI,MAAA,CAAO,EAAA,IAAM,EAAE,QAAQ,IAAA,EAAK;AAAA,QAChC,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,SAAS,MAAA,CAAO;AAAA,OAClB;AAEA,MAAA,MAAM,MAAA,GAAyB;AAAA,QAC7B,EAAA,EAAI,OAAO,EAAA,IAAM,EAAA;AAAA,QACjB,IAAA;AAAA,QACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAClC,MAAA,EAAQ;AAAA,OACV;AAEA,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,KAAA,IAAS,KAAA,CAAM,SAAS,QAAA,EAAU;AACpF,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAA,CAAK,SAAS,MAAA,EAAQ,KAAA;AAAA,QACpB,iCAAA;AAAA,QACA,KAAA,YAAiB,QAAQ,KAAA,GAAQ,MAAA;AAAA,QACjC,EAAE,IAAA;AAAK,OACT;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,iBAAA,GAAuC;AACnD,IAAA,IAAI;AAEF,MAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,kBAAkB,CAAA,EAAG;AACxC,QAAA,OAAO,EAAC;AAAA,MACV;AAGA,MAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,IAAA,CAAK,kBAAkB,CAAA;AACnD,MAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,IACtE,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,KAAA,IAAS,KAAA,CAAM,SAAS,QAAA,EAAU;AACpF,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,IAAA,CAAK,SAAS,MAAA,EAAQ,KAAA;AAAA,QACpB,iCAAA;AAAA,QACA,KAAA,YAAiB,QAAQ,KAAA,GAAQ;AAAA,OACnC;AACA,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,MAAA,EAAyC;AACzD,IAAA,MAAM,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,OAAM,GAAI,MAAA;AAGpC,IAAA,MAAM,WAA8B,EAAC;AACrC,IAAA,IAAI,IAAA,CAAK,GAAG,MAAA,EAAQ;AAClB,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,IAClC;AACA,IAAA,IAAI,IAAA,CAAK,GAAG,IAAA,EAAM;AAChB,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,IAChC;AACA,IAAA,IAAI,IAAA,CAAK,GAAG,OAAA,EAAS;AACnB,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,OAAO,IAAA,CAAK,EAAA,CAAG,YAAY,QAAA,GAAW,IAAA,CAAK,GAAG,OAAA,GAAU;AAAA,OACjE,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,IAAA,CAAK,GAAG,QAAA,EAAU;AACpB,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,KAAK,EAAA,CAAG;AAAA,OACjB,CAAA;AAED,MAAA,QAAA,GAAW;AAAA,QACT,IAAA,EAAM,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,IAAA;AAAA,QACvB,SAAS,MAAA,KAAW;AAAA,OACtB;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAiB,CAAC,YAAY,CAAA;AACpC,IAAA,IAAI,KAAK,WAAA,EAAa;AAEpB,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,OAAO,CAAA;AACrD,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,IAAA,CAAK,GAAG,cAAA,CAAe,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAAA,MACpD;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,MAAA,EAAQ,YAAA;AAAA,MACR,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,IAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA;AAAA,MAEA,KAAA,EAAO,IAAA;AAAA;AAAA,MAEP,aAAa,IAAA,CAAK;AAAA,KACpB;AAAA,EACF;AACF;AC5WO,IAAM,kBAAN,MAAsB;AAAA,EACV,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAExB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,eAAA,CAAgB;AAAA,MACjC,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,YAAY,OAAA,CAAQ;AAAA,KACrB,CAAA;AAED,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,kBAAA,CAAmB;AAAA,MACvC,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,YAAY,OAAA,CAAQ,kBAAA;AAAA,MACpB,eAAe,OAAA,CAAQ;AAAA,KACxB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,OAAA,EAAkE;AAC9E,IAAA,MAAM,YAA+B,EAAC;AAGtC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAA,IAAU,OAAA,CAAQ,WAAW,UAAA,EAAY;AACrD,MAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AACzD,MAAA,SAAA,CAAU,IAAA,CAAK,GAAG,iBAAiB,CAAA;AAAA,IACrC;AAGA,IAAA,IAAI,CAAC,OAAA,EAAS,MAAA,IAAU,OAAA,CAAQ,WAAW,YAAA,EAAc;AACvD,MAAA,MAAM,mBAAA,GAAsB,MAAM,IAAA,CAAK,UAAA,CAAW,KAAK,OAAO,CAAA;AAC9D,MAAA,SAAA,CAAU,IAAA,CAAK,GAAG,mBAAmB,CAAA;AAAA,IACvC;AAGA,IAAA,IAAI,QAAA,GAAW,SAAA;AAEf,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,QAAQ,MAAM,CAAA;AAAA,IAC/D;AAEA,IAAA,IAAI,OAAA,EAAS,IAAA,IAAQ,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AAC5C,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,QAAO,CAAC,CAAA,KAC1B,OAAA,CAAQ,IAAA,CAAM,IAAA,CAAK,CAAC,GAAA,KAAQ,CAAA,CAAE,IAAA,EAAM,QAAA,CAAS,GAAG,CAAC;AAAA,OACnD;AAAA,IACF;AAGA,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAEpD,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,mCAAA,EAAqC;AAAA,MAC/D,OAAO,QAAA,CAAS,MAAA;AAAA,MAChB,QAAA,EAAU,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,UAAU,CAAA,CAAE,MAAA;AAAA,MAC1D,UAAA,EAAY,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,KAAW,YAAY,CAAA,CAAE;AAAA,KAC/D,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,EAAA,EAA6C;AAErD,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,EAAE,CAAA;AAC/C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAO,UAAA;AAAA,IACT;AAGA,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AACzD,IAAA,MAAM,WAAW,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAE1D,IAAA,OAAO,QAAA,IAAY,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,IAAA,EAA8C;AACzD,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,oCAAA,EAAsC;AAAA,MAC/D,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,EAAuD;AAE9E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,YAAA,EAAc;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,EAAE,CAAA,CAAE,CAAA;AAAA,IAChE;AAEA,IAAA,IAAA,CAAK,SAAS,MAAA,EAAQ,IAAA,CAAK,oCAAA,EAAsC,EAAE,IAAI,CAAA;AAEvE,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAA,EAAI,IAAI,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,EAAA,EAA2B;AAEtC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,YAAA,EAAc;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,EAAE,CAAA,CAAE,CAAA;AAAA,IAChE;AAEA,IAAA,IAAA,CAAK,SAAS,MAAA,EAAQ,IAAA,CAAK,oCAAA,EAAsC,EAAE,IAAI,CAAA;AAEvE,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAE,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,YAAA,EAAc;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,EAAE,CAAA,CAAE,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAE,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,EAAA,EAA2B;AACvC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,YAAA,EAAc;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,EAAE,CAAA,CAAE,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,EAAA,EAA2B;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,YAAA,EAAc;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,EAAE,CAAA,CAAE,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,EAAA,EAA2B;AACtC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,EAAE,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,YAAA,EAAc;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,EAAE,CAAA,CAAE,CAAA;AAAA,IAChE;AAEA,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,EAAE,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,oBAAA,GAAuD;AAC3D,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAY;AAEzD,IAAA,MAAM,QAAA,GAAW,iBAAA,CACd,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,UAAA,IAAc,CAAA,CAAE,OAAO,CAAA,CAClD,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,aAAa,CAAA,CAAE,WAAA;AAAA,MACf,aAAa,CAAA,CAAE,KAAA;AAAA,MACf,cAAc,CAAA,CAAE;AAAA,KAClB,CAAE,CAAA;AAEJ,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,kCAAA,EAAoC;AAAA,MAC9D,OAAO,QAAA,CAAS;AAAA,KACjB,CAAA;AAED,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,IAAA,EAAsC;AAC7C,IAAA,IAAI;AACF,MAAAK,kBAAAA,CAAmB,MAAM,IAAI,CAAA;AAC7B,MAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AAAA,IACvB,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,YAAY,KAAA,EAAO;AAC3D,QAAA,MAAM,QAAA,GAAW,KAAA;AACjB,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,MAAA,EAAQ,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,YAClC,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,YACrB,SAAS,CAAA,CAAE;AAAA,WACb,CAAE;AAAA,SACJ;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,QAAQ,CAAC,EAAE,MAAM,EAAA,EAAI,OAAA,EAAS,qBAAqB;AAAA,OACrD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAkC;AACtC,IAAA,MAAM,IAAA,CAAK,QAAQ,UAAA,EAAW;AAC9B,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,yCAAyC,CAAA;AAAA,EACtE;AACF;;;ACjRO,IAAM,0BAAN,MAA8B;AAAA,EAClB,WAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EAEjB,YAAY,OAAA,EAAyC;AACnD,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,kBAAkB,OAAA,CAAQ,eAAA;AAC/B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AACxB,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAA,GAA6B;AACjC,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAQ;AAErD,IAAA,MAAM,YAAY,SAAA,CAAU,MAAA;AAAA,MAC1B,CAAC,MAAM,CAAA,CAAE,QAAA,IAAY,EAAE,QAAA,CAAS,OAAA,IAAW,EAAE,MAAA,KAAW;AAAA,KAC1D;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,0DAAA,EAA4D;AAAA,MACrF,OAAO,SAAA,CAAU,MAAA;AAAA,MACjB,WAAW,SAAA,CAAU;AAAA,KACtB,CAAA;AAGD,IAAA,MAAM,OAAA,CAAQ,IAAI,SAAA,CAAU,GAAA,CAAI,cAAY,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAC,CAAC,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,QAAA,EAA0C;AACvD,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,IAAY,CAAC,QAAA,CAAS,SAAS,OAAA,EAAS;AACpD,MAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,oEAAA,EAAsE;AAAA,QAC/F,IAAI,QAAA,CAAS;AAAA,OACd,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,EAAE,CAAA;AACzC,IAAA,MAAM,QAAA,GAAW,SAAS,QAAA,CAAS,IAAA;AAEnC,IAAA,IAAA,CAAK,WAAA,CAAY,QAAA,CAAS,MAAA,EAAQ,QAAA,EAAU,OAAO,OAAA,KAAY;AAC7D,MAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,uDAAA,EAAyD;AAAA,QAClF,YAAY,QAAA,CAAS,EAAA;AAAA,QACrB,cAAc,QAAA,CAAS,IAAA;AAAA,QACvB,UAAU,OAAA,CAAQ;AAAA,OACnB,CAAA;AAED,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ;AAAA,UACzC,YAAY,QAAA,CAAS,EAAA;AAAA,UACrB,OAAA,EAAS,UAAA;AAAA,UACT,OAAO;AAAC,SACT,CAAA;AAED,QAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,qDAAA,EAAuD;AAAA,UAChF,YAAY,QAAA,CAAS,EAAA;AAAA,UACrB,OAAO,MAAA,CAAO;AAAA,SACf,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,SAAS,MAAA,EAAQ,KAAA;AAAA,UACpB,oDAAA;AAAA,UACA,KAAA,YAAiB,QAAQ,KAAA,GAAQ,MAAA;AAAA,UACjC;AAAA,YACE,YAAY,QAAA,CAAS,EAAA;AAAA,YACrB,cAAc,QAAA,CAAS;AAAA;AACzB,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,8CAAA,EAAgD;AAAA,MAC1E,YAAY,QAAA,CAAS,EAAA;AAAA,MACrB;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,UAAA,EAAmC;AAClD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AACxC,IAAA,IAAA,CAAK,WAAA,CAAY,WAAW,MAAM,CAAA;AAElC,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,gDAAA,EAAkD;AAAA,MAC5E;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,GAAyB;AAE7B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,IAAA,EAAK;AACtC,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI,GAAA,CAAI,EAAA,CAAG,UAAA,CAAW,WAAW,CAAA,EAAG;AAClC,QAAA,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAAA,MACpC;AAAA,IACF;AAGA,IAAA,MAAM,KAAK,WAAA,EAAY;AAEvB,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,kDAAkD,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,UAAA,EAAiC;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,IAAA,EAAK,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AAC/D,IAAA,OAAO,KAAK,OAAA,IAAW,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,UAAA,EAAiC;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AACxC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,IAAA,EAAK,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AAC/D,IAAA,OAAO,KAAK,OAAA,IAAW,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,EAA0B;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AACxC,IAAA,IAAA,CAAK,WAAA,CAAY,MAAM,MAAM,CAAA;AAE7B,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,mDAAA,EAAqD;AAAA,MAC9E;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAA,EAA0B;AAC/B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AACxC,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,MAAM,CAAA;AAE9B,IAAA,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,oDAAA,EAAsD;AAAA,MAC/E;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAOG;AACD,IAAA,OAAO,IAAA,CAAK,WAAA,CACT,IAAA,EAAK,CACL,OAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,EAAA,CAAG,WAAW,WAAW,CAAC,CAAA,CAC9C,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACb,UAAA,EAAY,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA;AAAA,MACrC,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,UAAU,GAAA,CAAI;AAAA,KAChB,CAAE,CAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAU,UAAA,EAA4B;AAC5C,IAAA,OAAO,YAAY,UAAU,CAAA,CAAA;AAAA,EAC/B;AAAA,EAEQ,cAAc,MAAA,EAAwB;AAC5C,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA;AAAA,EACvC;AACF;ACvOO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YAA6B,OAAA,EAAkC;AAAlC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,cAAA,CAAe,OAAA,CAAQ,MAAM,CAAA;AAAA,EACjD;AAAA,EAF6B,OAAA;AAAA,EAHrB,OAAA,uBAAc,GAAA,EAAmC;AAAA,EACjD,MAAA;AAAA;AAAA;AAAA;AAAA,EASR,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAEnB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,QAAQ,GAAA,EAAI;AAC5C,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,6BAAA,EAA+B;AAAA,MACtD,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,MACvB;AAAA,KACD,CAAA;AAGD,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU;AACvC,MAAA,MAAM,WAAA,GAAcD,OAAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAEpC,MAAA,IAAI,CAACM,UAAAA,CAAW,WAAW,CAAA,EAAG;AAC5B,QAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA,CAAM,iCAAiC,EAAE,GAAA,EAAK,aAAa,CAAA;AAC/E,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAMC,OAAAA,CAAQ,WAAW,CAAA;AACvC,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,OAAO,CAAC,CAAA;AAE7E,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,oBAAA,CAAA,EAAwB;AAAA,UAChD,GAAA,EAAK,WAAA;AAAA,UACL,OAAO,SAAA,CAAU;AAAA,SAClB,CAAA;AAGD,QAAA,MAAM,OAAA,CAAQ,GAAA;AAAA;AAAA,UACZ,SAAA,CAAU,IAAI,CAAA,IAAA,KAAQ;AACpB,YAAA,MAAM,QAAA,GAAWJ,IAAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AACvC,YAAA,OAAO,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,UAChC,CAAC;AAAA,SACH;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,CAAA,EAA4B;AAAA,UACnD,GAAA,EAAK,WAAA;AAAA,UACL,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,6BAAA,EAA+B;AAAA,MACtD,cAAA,EAAgB,KAAK,OAAA,CAAQ,IAAA;AAAA,MAC7B,KAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAM;AAAA,KACpC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAU,QAAA,EAAiC;AACvD,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAME,QAAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAC3C,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,iBAAA,CAAkB,GAAG,CAAA;AAGzC,MAAA,MAAM,EAAA,GAAK,OAAO,EAAA,IAAM,QAAA,CAAS,UAAU,MAAM,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAGtE,MAAA,MAAM,IAAA,GAAqB;AAAA,QACzB,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,OAAA,EAAS,OAAA;AAAA,QACT,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,EAAA,EAAI,MAAA,CAAO,EAAA,IAAM,EAAE,QAAQ,IAAA,EAAK;AAAA;AAAA,QAChC,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,KAAK,MAAA,CAAO,GAAA;AAAA,QACZ,SAAS,MAAA,CAAO;AAAA,OAClB;AAEA,MAAA,MAAM,KAAA,GAA+B;AAAA,QACnC,EAAA;AAAA,QACA,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,QAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAU,MAAA,CAAO;AAAA,OACnB;AAEA,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAE1B,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,gBAAA,CAAA,EAAoB;AAAA,QAC5C,EAAA;AAAA,QACA,MAAM,MAAA,CAAO,IAAA;AAAA,QACb;AAAA,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,6BAAA,CAAA,EAAiC;AAAA,QACxD,QAAA;AAAA,QACA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC7D,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,GAAA,EAAkB;AAC1C,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAKA,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,SAAA,CAAQ,MAAM,CAAA;AAChC,IAAA,OAAO,MAAM,OAAO,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,EAAA,EAA+C;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAgC;AAC9B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,EAAA,EAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,EAAA,EAAsC;AAC5C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACjC,IAAA,OAAO,KAAA,EAAO,IAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF;ACxFO,IAAM,aAAN,MAA0C;AAAA,EAO/C,YACmB,KAAA,EACA,MAAA,EACA,MAAA,EACA,MAAA,GAA2B,EAAC,EAC7C;AAJiB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAO,cAAA,IAAkB,GAAA;AAC/C,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAO,iBAAA,IAAqB,CAAA;AACrD,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,eAAA,IAAmB,EAAA;AACjD,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,aAAA,IAAiB,OAAA,CAAQ,GAAA,EAAI;AAAA,EAC3D;AAAA,EATmB,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EAVX,eAAA,uBAAsB,GAAA,EAAgC;AAAA,EAC7C,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBjB,kBAAA,CACE,QAAA,EACA,aAAA,EACA,UAAA,EACA,WAAA,EACM;AACN,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,YAAY,EAAE,CAAA,CAAA;AAE7C,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,6CAAA,EAA+C;AAAA,QAC9D,OAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAO,WAAA,CAAY;AAAA,OACpB,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,OAAA,EAAS;AAAA,MAChC,QAAA;AAAA,MACA,OAAO,WAAA,CAAY,EAAA;AAAA,MACnB,aAAa,WAAA,CAAY,OAAA;AAAA,MACzB,MAAA,EAAQ,WAAA;AAAA,MACR,UAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,wBAAA,EAA0B;AAAA,MACzC,OAAA;AAAA,MACA,SAAS,WAAA,CAAY;AAAA,KACtB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,GAAA,EAAwC;AAEnD,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,IAAI,CAAA;AACtD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAAA,IACtD;AAGA,IAAA,IAAI,IAAI,cAAA,EAAgB;AACtB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,oBAAA,CAAqB,IAAI,cAAc,CAAA;AACnE,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,oCAAA,EAAsC;AAAA,UACrD,gBAAgB,GAAA,CAAI,cAAA;AAAA,UACpB,eAAe,QAAA,CAAS;AAAA,SACzB,CAAA;AACD,QAAA,OAAO,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAAA,MACxC;AAAA,IACF;AAGA,IAAA,MAAM,QAAQ,MAAA,EAAO;AACrB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,MAAA,GAAoB;AAAA,MACxB,EAAA,EAAI,KAAA;AAAA,MACJ,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,QAAA,EAAU,IAAI,QAAA,IAAY,SAAA;AAAA,MAC1B,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU,GAAA,CAAI,QAAA,IAAY,IAAA,CAAK,eAAA;AAAA,MAC/B,YAAY,GAAA,CAAI,UAAA,IAAc,YAAA,CAAa,MAAA,CAAO,cAAc,IAAA,CAAK,iBAAA;AAAA,MACrE,SAAS,GAAA,CAAI,OAAA,IAAW,YAAA,CAAa,MAAA,CAAO,WAAW,IAAA,CAAK,cAAA;AAAA,MAC5D,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,CAAA;AAAA,MACV,SAAA,EAAW,IAAI,WAAA,EAAY;AAAA,MAC3B,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,WAAA,EAAY;AAAA,MAC9B,gBAAgB,GAAA,CAAI;AAAA,KACtB;AAGA,IAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAG/B,IAAA,MAAM,WAAA,GAAc,IAAI,KAAA,GAAQ,GAAA,CAAI,MAAM,OAAA,EAAQ,GAAI,KAAK,GAAA,EAAI;AAC/D,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,MAAA,CAAO,UAAU,WAAW,CAAA;AAEzD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,eAAA,EAAiB;AAAA,MAChC,KAAA;AAAA,MACA,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AAGD,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,eAAA,EAAiB;AAAA,MACzC,KAAA;AAAA,MACA,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,GAAA,EAAoB,QAAA,EAAqD;AACtF,IAAA,IAAI,oBAAoB,IAAA,EAAM;AAE5B,MAAA,OAAO,KAAK,MAAA,CAAO,EAAE,GAAG,GAAA,EAAK,KAAA,EAAO,UAAU,CAAA;AAAA,IAChD;AAGA,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,KAAA,EAAiC;AAC5C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,WAAA,IAAe,MAAA,CAAO,WAAW,QAAA,IAAY,MAAA,CAAO,WAAW,WAAA,EAAa;AAChG,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,qCAAA,EAAuC;AAAA,QACtD,KAAA;AAAA,QACA,QAAQ,MAAA,CAAO;AAAA,OAChB,CAAA;AACD,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAA,CAAO,MAAA,GAAS,WAAA;AAChB,IAAA,MAAA,CAAO,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC5C,IAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAG/B,IAAA,MAAM,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAEhC,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,eAAA,EAAiB,EAAE,OAAO,CAAA;AAG3C,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,eAAA,EAAiB;AAAA,MACzC,KAAA;AAAA,MACA,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO;AAAA,KAClB,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,KAAA,EAA0C;AACxD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,MAAA,GAAoB,EAAC,EAAyB;AAGvD,IAAA,MAAM,OAAA,GAAU,UAAA;AAChB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAG7C,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAe,GAAG,CAAC,CAAC,CAAA;AAGpF,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,MAAA,CAAO,CAAC,IAAA,KAA4B;AAC7D,MAAA,IAAI,CAAC,IAAA,EAAM;AAAC,QAAA,OAAO,KAAA;AAAA,MAAM;AAGzB,MAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,OAAO,IAAA,EAAM;AAAC,QAAA,OAAO,KAAA;AAAA,MAAM;AAC5D,MAAA,IAAI,MAAA,CAAO,QAAA,IAAY,IAAA,CAAK,QAAA,KAAa,OAAO,QAAA,EAAU;AAAC,QAAA,OAAO,KAAA;AAAA,MAAM;AACxE,MAAA,IAAI,MAAA,CAAO,MAAA,IAAU,IAAA,CAAK,MAAA,KAAW,OAAO,MAAA,EAAQ;AAAC,QAAA,OAAO,KAAA;AAAA,MAAM;AAElE,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,KAAK,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA,KAAY,IAAI,IAAA,CAAK,EAAE,SAAS,CAAA,CAAE,SAAS,CAAA;AAGxF,IAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,CAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,GAAA;AAC9B,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ,SAAS,KAAK,CAAA;AAEjD,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,CAAA,KAAK,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,KAAA,EAA8B;AAC7C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,6BAAA,EAA+B,MAAA,EAAW,EAAE,OAAO,CAAA;AACrE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAO,IAAI,CAAA;AACzD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,uBAAA,EAAyB,MAAA,EAAW,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,CAAA;AAClF,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,mBAAmB,CAAA;AACpD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,gBAAA,EAAkB;AACjC,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,iCAAA,EAAmC,MAAA,EAAW,EAAE,OAAO,CAAA;AACzE,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,iCAAiC,CAAA;AAClE,MAAA;AAAA,IACF;AAGA,IAAA,MAAA,CAAO,MAAA,GAAS,SAAA;AAChB,IAAA,MAAA,CAAO,OAAA,IAAW,CAAA;AAClB,IAAA,MAAA,CAAO,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC1C,IAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAG/B,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,aAAA,EAAe;AAAA,MACvC,KAAA;AAAA,MACA,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAED,IAAA,IAAI;AAEF,MAAA,MAAM,WAAA,GAAc,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,OAAO,OAAO,CAAA,CAAA;AAClD,MAAA,MAAM,OAAA,GAAU,WAAA;AAChB,MAAA,MAAM,MAAA,GAAS,WAAA;AACf,MAAA,MAAM,YAAA,GAAe,WAAA;AAGrB,MAAA,MAAM,UAAA,GAAsC;AAAA,QAC1C,QAAA,EAAU,MAAA;AAAA,QACV,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,MAAA;AAAA,UACN,QAAQ,MAAA,CAAO,IAAA;AAAA,UACf,QAAA,EAAU,EAAA;AAAA;AAAA,UACV,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,SACtC;AAAA,QACA,WAAA,EAAa,YAAA,CAAa,MAAA,CAAO,WAAA,IAAe,EAAC;AAAA,QACjD,UAAU,YAAA,CAAa,QAAA;AAAA,QACvB,aAAA,EAAe,OAAA;AAAA;AAAA,QACf,SAAA,EAAW,WAAA;AAAA,QACX,UAAU,MAAA,CAAO;AAAA,OACnB;AACA,MAAA,MAAA,CAAO,OAAO,UAAA,EAAkD;AAAA,QAC9D,OAAA;AAAA,QACA,MAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,MAAM,OAAA,GAAqD;AAAA,QACzD,WAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAY,YAAA,CAAa,UAAA;AAAA,QACzB,YAAY,YAAA,CAAa,WAAA;AAAA,QACzB,KAAA,EAAO;AAAA,UACL,KAAA;AAAA,UACA,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,OAAO,MAAA,CAAO,OAAA;AAAA,UACd,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,SAAS,MAAA,CAAO;AAAA,SAClB;AAAA,QACA,WAAW,MAAA,CAAO;AAAA,OACpB;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,uBAAA,EAAyB;AAAA,QACzC,KAAA;AAAA,QACA,SAAS,YAAA,CAAa,WAAA;AAAA,QACtB,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AAGD,MAAA,MAAM,SAAS,MAAM,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,QAAQ,OAAA,EAAS;AAAA,QACjE,MAAA,EAAQ,KAAA;AAAA;AAAA,OACT,CAAA;AAED,MAAA,IAAI,OAAO,EAAA,EAAI;AAEb,QAAA,MAAA,CAAO,MAAA,GAAS,WAAA;AAChB,QAAA,MAAA,CAAO,SAAS,MAAA,CAAO,IAAA;AACvB,QAAA,MAAA,CAAO,QAAA,GAAW,GAAA;AAClB,QAAA,MAAA,CAAO,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC5C,QAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAE/B,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,eAAA,EAAiB;AAAA,UAChC,KAAA;AAAA,UACA,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,UAAU,MAAA,CAAO;AAAA,SAClB,CAAA;AAED,QAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,eAAA,EAAiB;AAAA,UACzC,KAAA;AAAA,UACA,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,QAAQ,MAAA,CAAO;AAAA,SAChB,CAAA;AAAA,MACH,CAAA,MAAO;AAEL,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,eAAA;AAC1C,QAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,QAAQ,CAAA;AAAA,MAC9C;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,WAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACtE,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,sBAAA,EAAwB,MAAA,EAAW,EAAE,KAAA,EAAO,KAAA,EAAO,UAAU,CAAA;AAC/E,MAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CAAe,KAAA,EAAe,OAAA,EAAiB,OAAA,EAAiC;AACpF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,YAAA,CAAa,KAAK,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,uCAAA,EAAyC,EAAE,OAAO,CAAA;AACnE,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,OAAO,CAAC,CAAA;AACpD,IAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAE/B,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,cAAA,EAAgB;AAAA,MACxC,KAAA;AAAA,MACA,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAA,CAAiB,MAAA,EAAmB,QAAA,EAAiC;AACjF,IAAA,IAAI,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,UAAA,EAAY;AAEtC,MAAA,MAAM,YAAY,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,OAAA,EAAS,OAAO,IAAI,CAAA;AACnE,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAEjC,MAAA,MAAA,CAAO,MAAA,GAAS,SAAA;AAChB,MAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAC/B,MAAA,MAAM,KAAK,UAAA,CAAW,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,UAAU,WAAW,CAAA;AAE7D,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,qBAAA,EAAuB;AAAA,QACtC,OAAO,MAAA,CAAO,EAAA;AAAA,QACd,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB;AAAA,OACD,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa;AAAA,QACrC,OAAO,MAAA,CAAO,EAAA;AAAA,QACd,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AAEL,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,QAAQ,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,MAAc,aAAA,CAAc,MAAA,EAAmB,QAAA,EAAiC;AAC9E,IAAA,MAAA,CAAO,MAAA,GAAS,QAAA;AAChB,IAAA,MAAA,CAAO,KAAA,GAAQ,QAAA;AACf,IAAA,MAAA,CAAO,WAAA,GAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAC5C,IAAA,MAAM,IAAA,CAAK,cAAc,MAAM,CAAA;AAE/B,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,YAAA,EAAc,MAAA,EAAW;AAAA,MACzC,OAAO,MAAA,CAAO,EAAA;AAAA,MACd,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,KAAA,EAAO,QAAA;AAAA,MACP,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAED,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,YAAA,EAAc;AAAA,MACtC,OAAO,MAAA,CAAO,EAAA;AAAA,MACd,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAAA,EAEQ,gBAAA,CAAiB,SAAiB,OAAA,EAAyB;AACjE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB,KAAA;AAEtD,IAAA,IAAI,aAAa,KAAA,EAAO;AAEtB,MAAA,OAAO,IAAA,CAAK,IAAI,GAAA,GAAO,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,GAAG,GAAK,CAAA;AAAA,IACpD,CAAA,MAAO;AAEL,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,IAAQ,OAAA,GAAU,IAAI,GAAK,CAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,MAAA,EAAkC;AAC5D,IAAA,MAAM,GAAA,GAAM,CAAA,OAAA,EAAU,MAAA,CAAO,EAAE,CAAA,CAAA;AAC/B,IAAA,MAAM,IAAA,CAAK,MAAM,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAc,aAAa,KAAA,EAA0C;AACnE,IAAA,MAAM,GAAA,GAAM,UAAU,KAAK,CAAA,CAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAe,GAAG,CAAA;AAAA,EACtC;AAAA,EAEA,MAAc,UAAA,CAAW,KAAA,EAAe,QAAA,EAAkB,WAAA,EAAoC;AAC5F,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,KAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,IAAA,CAAK,MAAM,IAAA,CAAK,aAAA,EAAe,aAAa,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACzE;AAAA,EAEA,MAAc,gBAAgB,KAAA,EAA8B;AAE1D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,eAAe,CAAA,EAAG,IAAA,CAAK,GAAA,EAAI,GAAI,GAAO,CAAA;AAErF,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,QAAA,IAAI,KAAA,CAAM,UAAU,KAAA,EAAO;AACzB,UAAA,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,aAAA,EAAe,GAAG,CAAA;AACxC,UAAA;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,qBAAqB,GAAA,EAAwC;AAEzE,IAAA,MAAM,OAAA,GAAU,UAAA;AAChB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA;AAG7C,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,IAAA,CAAK,KAAA,CAAM,GAAA,CAAe,CAAC,CAAC,CAAC,CAAA;AAE7E,IAAA,OAAO,QAAQ,IAAA,CAAK,CAAA,MAAA,KAAU,MAAA,EAAQ,cAAA,KAAmB,GAAG,CAAA,IAAK,IAAA;AAAA,EACnE;AAAA,EAEA,MAAc,cAAc,QAAA,EAAqC;AAI/D,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEQ,kBAAkB,MAAA,EAA8B;AACtD,IAAA,OAAO;AAAA,MACL,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAAA,MACpC,WAAW,MAAA,CAAO,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AAAA,MAC3D,aAAa,MAAA,CAAO,WAAA,GAAc,IAAI,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,GAAI;AAAA,KACnE;AAAA,EACF;AACF","file":"index.js","sourcesContent":["import { readFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport { parse as parseYaml } from 'yaml'\nimport type { ZodIssue } from 'zod'\nimport {\n type WorkflowSpec,\n WorkflowSpecSchema,\n} from '@kb-labs/workflow-contracts'\nimport type { EngineLogger, WorkflowLoaderResult } from './types'\n\nexport interface WorkflowLoaderOptions {\n cwd?: string\n}\n\nexport class WorkflowLoader {\n constructor(private readonly logger: EngineLogger) {}\n\n async fromFile(\n filePath: string,\n options: WorkflowLoaderOptions = {},\n ): Promise<WorkflowLoaderResult> {\n const cwd = options.cwd ?? process.cwd()\n const absolutePath = resolve(cwd, filePath)\n\n this.logger.debug(`Loading workflow spec from file`, {\n path: absolutePath,\n })\n\n const raw = await readFile(absolutePath, 'utf8')\n const parsed = this.parse(raw, absolutePath)\n return this.validate(parsed, absolutePath)\n }\n\n fromInline(\n spec: unknown,\n source = 'inline',\n ): WorkflowLoaderResult {\n let candidate: unknown = spec\n if (typeof spec === 'string') {\n candidate = this.parse(spec, source)\n }\n return this.validate(candidate, source)\n }\n\n private parse(raw: string, source: string): unknown {\n const trimmed = raw.trim()\n if (!trimmed) {\n throw new Error(`Workflow spec ${source} is empty`)\n }\n\n if (source.endsWith('.json') || trimmed.startsWith('{')) {\n try {\n return JSON.parse(trimmed)\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error)\n this.logger.error(`Failed to parse JSON workflow spec from ${source}`, error instanceof Error ? error : undefined, {\n errorMessage: message,\n })\n throw new Error(`Failed to parse workflow spec JSON: ${message}`)\n }\n }\n\n try {\n return parseYaml(trimmed)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.logger.error(`Failed to parse YAML workflow spec from ${source}`, error instanceof Error ? error : undefined, {\n errorMessage: message,\n })\n throw new Error(`Failed to parse workflow spec YAML: ${message}`)\n }\n }\n\n private validate(candidate: unknown, source: string): WorkflowLoaderResult {\n const parsed = WorkflowSpecSchema.safeParse(candidate)\n\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map(\n (issue: ZodIssue) =>\n `${issue.path.join('.') || '(root)'}: ${issue.message}`,\n )\n .join('\\n')\n this.logger.warn(`Workflow spec validation failed`, { source, issues })\n throw new Error(`Workflow spec validation failed:\\n${issues}`)\n }\n\n const spec = parsed.data as WorkflowSpec\n return { spec, source }\n }\n}\n\n\n","import type { JobRun, StepRun, WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport class StateStore {\n private readonly cache: ICache\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n ) {\n this.cache = cache\n }\n\n async saveRun(run: WorkflowRun): Promise<void> {\n const key = `kb:run:${run.id}`\n this.logger.debug('Persisting workflow run', { runId: run.id, key })\n\n // Save run data\n await this.cache.set(key, JSON.stringify(run))\n\n // Add to sorted set index (score = createdAt timestamp for time-based ordering)\n const timestamp = new Date(run.createdAt).getTime()\n await this.cache.zadd('workflow:runs:index', timestamp, run.id)\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n const key = `kb:run:${runId}`\n const payload = await this.cache.get<string>(key)\n if (!payload) {\n return null\n }\n try {\n return JSON.parse(payload) as WorkflowRun\n } catch (error) {\n this.logger.error('Failed to parse stored workflow run', error instanceof Error ? error : undefined, {\n runId,\n })\n return null\n }\n }\n\n async deleteRun(runId: string): Promise<void> {\n const key = `kb:run:${runId}`\n\n // Remove from cache\n await this.cache.delete(key)\n\n // Remove from sorted set index\n await this.cache.zrem('workflow:runs:index', runId)\n }\n\n async getAllRunIds(): Promise<string[]> {\n // Get all run IDs from sorted set index (ordered by creation time)\n // Score range: -inf to +inf (all runs)\n const runIds = await this.cache.zrangebyscore('workflow:runs:index', -Infinity, Infinity)\n return runIds ?? []\n }\n\n async updateRun(\n runId: string,\n mutator: (draft: WorkflowRun) => WorkflowRun | void,\n ): Promise<WorkflowRun | null> {\n const run = await this.getRun(runId)\n if (!run) {\n return null\n }\n\n const draft = clone(run)\n const result = mutator(draft)\n const next = (result ?? draft) as WorkflowRun\n await this.saveRun(next)\n return next\n }\n\n async updateJob(\n runId: string,\n jobId: string,\n mutator: (job: JobRun) => JobRun | void,\n ): Promise<JobRun | null> {\n let updatedJob: JobRun | null = null\n\n await this.updateRun(runId, (run) => {\n const index = run.jobs.findIndex((job: JobRun) => job.id === jobId)\n if (index === -1) {\n return\n }\n const existingJob = run.jobs[index]\n if (!existingJob) {\n return\n }\n const jobDraft = clone(existingJob)\n const result = mutator(jobDraft)\n const nextJob = (result ?? jobDraft) as JobRun\n run.jobs[index] = nextJob\n updatedJob = nextJob\n })\n\n return updatedJob\n }\n\n async updateStep(\n runId: string,\n jobId: string,\n stepId: string,\n mutator: (step: StepRun) => StepRun | void,\n ): Promise<StepRun | null> {\n let updatedStep: StepRun | null = null\n\n await this.updateRun(runId, (run) => {\n const jobIndex = run.jobs.findIndex((job) => job.id === jobId)\n if (jobIndex === -1) {\n return\n }\n const job = run.jobs[jobIndex]\n if (!job) {\n return\n }\n const stepIndex = job.steps.findIndex(\n (step: StepRun) => step.id === stepId,\n )\n if (stepIndex === -1) {\n return\n }\n const existingStep = job.steps[stepIndex]\n if (!existingStep) {\n return\n }\n const draft = clone(existingStep)\n const result = mutator(draft)\n const nextStep = (result ?? draft) as StepRun\n job.steps[stepIndex] = nextStep\n updatedStep = nextStep\n })\n\n return updatedStep\n }\n\n async releaseBlockedJobs(\n runId: string,\n completedJobName: string,\n ): Promise<JobRun[]> {\n const released: JobRun[] = []\n\n await this.updateRun(runId, (run) => {\n for (const job of run.jobs) {\n if (job.status !== 'queued' || !job.blocked) {\n continue\n }\n if (!job.pendingDependencies || job.pendingDependencies.length === 0) {\n continue\n }\n if (!job.needs?.includes(completedJobName)) {\n continue\n }\n\n const remaining = job.pendingDependencies.filter(\n (dependency) => dependency !== completedJobName,\n )\n\n if (remaining.length === job.pendingDependencies.length) {\n continue\n }\n\n job.pendingDependencies = remaining\n\n if (remaining.length === 0) {\n job.blocked = false\n released.push(clone(job))\n }\n }\n })\n\n return released\n }\n}\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T\n}\n\n\n\n","import { randomUUID } from 'node:crypto'\nimport { IDEMPOTENCY_TTL_ENV } from '@kb-labs/workflow-constants'\nimport type {\n JobRun,\n JobSpec,\n StepRun,\n WorkflowRun,\n} from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { StateStore } from './state-store'\nimport type { ConcurrencyManager } from './concurrency-manager'\nimport type { EngineLogger, CreateRunInput } from './types'\n\nconst DEFAULT_IDEMPOTENCY_TTL_MS = 1000 * 60 * 60 * 24 // 24h\n\nfunction resolveIdempotencyTtlMs(explicit?: number): number {\n if (typeof explicit === 'number' && explicit > 0) {\n return explicit\n }\n const envValue = process.env[IDEMPOTENCY_TTL_ENV]\n const parsed = envValue ? Number(envValue) : undefined\n if (parsed && Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n return DEFAULT_IDEMPOTENCY_TTL_MS\n}\n\nexport interface RunCoordinatorOptions {\n idempotencyTtlMs?: number\n}\n\nexport class RunCoordinator {\n private readonly cache: ICache\n private readonly idempotencyTtlMs: number\n\n constructor(\n cache: ICache,\n private readonly stateStore: StateStore,\n private readonly concurrencyManager: ConcurrencyManager,\n private readonly logger: EngineLogger,\n options: RunCoordinatorOptions = {},\n ) {\n this.cache = cache\n this.idempotencyTtlMs = resolveIdempotencyTtlMs(options.idempotencyTtlMs)\n }\n\n async ensureRun(input: CreateRunInput): Promise<WorkflowRun> {\n if (input.idempotencyKey) {\n const existing = await this.loadByIdempotencyKey(input.idempotencyKey)\n if (existing) {\n this.logger.info('Idempotent workflow run reused', {\n runId: existing.id,\n idempotencyKey: input.idempotencyKey,\n })\n return existing\n }\n }\n\n const runId = randomUUID()\n const now = new Date().toISOString()\n\n if (input.concurrencyGroup) {\n const acquired = await this.concurrencyManager.acquire(\n input.concurrencyGroup,\n runId,\n )\n\n if (!acquired) {\n const active = await this.concurrencyManager.getActiveRun(\n input.concurrencyGroup,\n )\n const message = active\n ? `Concurrency group ${input.concurrencyGroup} already locked by run ${active}`\n : `Failed to acquire concurrency lock for ${input.concurrencyGroup}`\n this.logger.warn(message, {\n concurrencyGroup: input.concurrencyGroup,\n activeRunId: active,\n })\n throw new Error(message)\n }\n }\n\n const run = this.buildInitialRun(input, runId, now)\n await this.stateStore.saveRun(run)\n\n if (input.idempotencyKey) {\n await this.registerIdempotencyKey(input.idempotencyKey, run.id)\n }\n\n this.logger.info('Workflow run created', {\n runId: run.id,\n name: run.name,\n version: run.version,\n })\n\n return run\n }\n\n private buildInitialRun(\n input: CreateRunInput,\n runId: string,\n timestamp: string,\n ): WorkflowRun {\n const jobs: JobRun[] = []\n\n for (const [jobName, jobSpec] of Object.entries(\n input.spec.jobs,\n ) as Array<[string, JobSpec]>) {\n const jobId = `${runId}:${jobName}`\n const needs = Array.isArray(jobSpec.needs) ? [...jobSpec.needs] : []\n const priority = jobSpec.priority ?? 'normal'\n const effectiveTarget = jobSpec.target ?? input.spec.target\n const effectiveIsolation = jobSpec.isolation ?? input.spec.isolation\n const stepRuns: StepRun[] = jobSpec.steps.map((step, index) => ({\n id: `${jobId}:${index}`,\n runId,\n jobId,\n name: step.name,\n index,\n status: 'queued',\n queuedAt: timestamp,\n attempt: 0,\n timeoutMs: step.timeoutMs,\n continueOnError: step.continueOnError,\n spec: step,\n }))\n\n jobs.push({\n id: jobId,\n runId,\n jobName,\n status: 'queued',\n runsOn: jobSpec.runsOn,\n queuedAt: timestamp,\n attempt: 0,\n steps: stepRuns,\n concurrency: jobSpec.concurrency,\n retries: jobSpec.retries,\n timeoutMs: jobSpec.timeoutMs,\n target: effectiveTarget,\n isolation: effectiveIsolation,\n artifacts: jobSpec.artifacts,\n env: jobSpec.env,\n secrets: jobSpec.secrets,\n needs,\n pendingDependencies: [...needs],\n blocked: needs.length > 0,\n priority,\n })\n }\n\n const workflowRun: WorkflowRun = {\n id: runId,\n name: input.spec.name,\n version: input.spec.version,\n status: 'queued',\n createdAt: timestamp,\n queuedAt: timestamp,\n trigger: input.trigger,\n env: input.spec.env,\n secrets: input.spec.secrets,\n jobs,\n metadata: {\n idempotencyKey: input.idempotencyKey,\n concurrencyGroup: input.concurrencyGroup,\n target: input.spec.target,\n isolation: input.spec.isolation,\n },\n artifacts: [],\n }\n\n return workflowRun\n }\n\n private async registerIdempotencyKey(\n key: string,\n runId: string,\n ): Promise<void> {\n const cacheKey = `kb:idempotency:${key}`\n const registered = await this.cache.setIfNotExists(\n cacheKey,\n runId,\n this.idempotencyTtlMs,\n )\n\n if (!registered) {\n const existingRunId = await this.cache.get<string>(cacheKey)\n if (existingRunId) {\n const existing = await this.stateStore.getRun(existingRunId)\n if (existing) {\n throw new Error(\n `Idempotency key ${key} already associated with run ${existingRunId}`,\n )\n }\n }\n throw new Error(`Failed to register idempotency key ${key}`)\n }\n }\n\n private async loadByIdempotencyKey(\n key: string,\n ): Promise<WorkflowRun | null> {\n const cacheKey = `kb:idempotency:${key}`\n const existingRunId = await this.cache.get<string>(cacheKey)\n if (!existingRunId) {\n return null\n }\n return this.stateStore.getRun(existingRunId)\n }\n\n async releaseConcurrency(run: WorkflowRun): Promise<void> {\n const group = run.metadata?.concurrencyGroup\n if (!group) {\n return\n }\n await this.concurrencyManager.release(group, run.id)\n this.logger.debug('Released concurrency group', {\n runId: run.id,\n group,\n })\n }\n}\n\n","import { CONCURRENCY_TTL_ENV } from '@kb-labs/workflow-constants'\nimport type { ConcurrencyGroup } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nconst DEFAULT_TTL_MS = 1000 * 60 * 30 // 30 minutes\n\nfunction resolveTtlMs(explicit?: number): number {\n if (typeof explicit === 'number' && explicit > 0) {\n return explicit\n }\n const envValue = process.env[CONCURRENCY_TTL_ENV]\n const parsed = envValue ? Number(envValue) : undefined\n if (parsed && Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n return DEFAULT_TTL_MS\n}\n\nexport interface AcquireOptions {\n ttlMs?: number\n}\n\nexport class ConcurrencyManager {\n private readonly cache: ICache\n private readonly ttlMs: number\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n options: AcquireOptions = {},\n ) {\n this.cache = cache\n this.ttlMs = resolveTtlMs(options.ttlMs)\n }\n\n async acquire(\n group: ConcurrencyGroup,\n runId: string,\n options: AcquireOptions = {},\n ): Promise<boolean> {\n const ttl = resolveTtlMs(options.ttlMs ?? this.ttlMs)\n const key = `kb:concurrency:${group}`\n const acquired = await this.cache.setIfNotExists(key, runId, ttl)\n\n this.logger.debug('Concurrency acquire attempt', {\n group,\n runId,\n acquired,\n })\n return acquired\n }\n\n async release(group: ConcurrencyGroup, runId: string): Promise<void> {\n const key = `kb:concurrency:${group}`\n const current = await this.cache.get<string>(key)\n if (current === runId) {\n await this.cache.delete(key)\n this.logger.debug('Concurrency lock released', { group, runId })\n }\n }\n\n async getActiveRun(group: ConcurrencyGroup): Promise<string | null> {\n const key = `kb:concurrency:${group}`\n return this.cache.get<string>(key)\n }\n}\n\n\n","import type { JobRun, WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { JobPriority } from '@kb-labs/workflow-constants'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport interface JobQueueEntry {\n id: string\n runId: string\n jobId: string\n priority: JobPriority\n enqueuedAt: string\n availableAt: number\n jobName: string\n}\n\nexport interface SchedulerOptions {\n defaultPriority?: JobPriority\n lookAheadMs?: number\n}\n\nexport class Scheduler {\n private readonly cache: ICache\n private readonly defaultPriority: JobPriority\n private readonly lookAheadMs: number\n private readonly priorityOrder: JobPriority[] = ['high', 'normal', 'low']\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n options: SchedulerOptions = {},\n ) {\n this.cache = cache\n this.defaultPriority = options.defaultPriority ?? 'normal'\n this.lookAheadMs = options.lookAheadMs ?? 1000\n }\n\n async scheduleRun(run: WorkflowRun): Promise<void> {\n // Enqueue ready jobs in parallel\n const readyJobs = run.jobs.filter(job => {\n if (job.blocked) {\n this.logger.debug('Job blocked by dependencies; deferring enqueue', {\n runId: run.id,\n jobId: job.id,\n needs: job.needs,\n })\n return false\n }\n return true\n })\n\n await Promise.all(\n readyJobs.map(job => {\n const priority = job.priority ?? this.defaultPriority\n return this.enqueueJob(run.id, job, priority)\n }),\n )\n }\n\n async enqueueJob(\n runId: string,\n job: JobRun,\n priority: JobPriority = this.defaultPriority,\n ): Promise<void> {\n if (job.blocked) {\n this.logger.debug('Skipping enqueue for blocked job', {\n runId,\n jobId: job.id,\n needs: job.pendingDependencies,\n })\n return\n }\n const now = Date.now()\n const entryId = `${runId}:${job.id}:${now}:${Math.random().toString(36).slice(2, 10)}`\n const entry: JobQueueEntry = {\n id: entryId,\n runId,\n jobId: job.id,\n jobName: job.jobName,\n priority,\n enqueuedAt: new Date().toISOString(),\n availableAt: now,\n }\n await this.cache.zadd(\n `kb:jobqueue:${priority}`,\n entry.availableAt,\n JSON.stringify(entry),\n )\n this.logger.debug('Job enqueued', { runId, jobId: job.id, priority })\n }\n\n async dequeueJob(): Promise<JobQueueEntry | null> {\n // Sequential check by priority order - must return first match respecting priority\n for (const priority of this.priorityOrder) {\n const entry = await this.dequeueFromPriority(priority) // eslint-disable-line no-await-in-loop\n if (entry) {\n return entry\n }\n }\n return null\n }\n\n async reschedule(entry: JobQueueEntry, delayMs: number): Promise<void> {\n const availableAt = Date.now() + delayMs\n const next: JobQueueEntry = {\n ...entry,\n availableAt,\n enqueuedAt: new Date().toISOString(),\n }\n await this.cache.zadd(\n `kb:jobqueue:${entry.priority}`,\n availableAt,\n JSON.stringify(next),\n )\n this.logger.debug('Job rescheduled', {\n runId: entry.runId,\n jobId: entry.jobId,\n delayMs,\n priority: entry.priority,\n })\n }\n\n private async dequeueFromPriority(priority: JobPriority): Promise<JobQueueEntry | null> {\n const now = Date.now()\n const key = `kb:jobqueue:${priority}`\n const results = await this.cache.zrangebyscore(\n key,\n 0,\n now + this.lookAheadMs,\n )\n\n // Handle LIMIT manually - take only first result\n if (results.length === 0) {\n return null\n }\n\n const raw = results[0]\n if (typeof raw !== 'string') {\n return null\n }\n try {\n const entry = JSON.parse(raw) as JobQueueEntry\n await this.cache.zrem(key, raw)\n return entry\n } catch (error) {\n this.logger.error('Failed to parse job queue entry', error instanceof Error ? error : undefined)\n return null\n }\n }\n\n getDefaultPriority(): JobPriority {\n return this.defaultPriority\n }\n}\n\n\n","export interface SecretProvider {\n resolve(names: string[]): Promise<Record<string, string>>\n}\n\nexport interface EnvSecretProviderOptions {\n /**\n * Prefix applied when looking up secrets in environment variables.\n * Defaults to `KB_SECRET_`.\n */\n prefix?: string\n /**\n * When true (default), check both plain and prefixed environment variable names.\n */\n allowPlain?: boolean\n}\n\nexport class EnvSecretProvider implements SecretProvider {\n private readonly prefix: string\n private readonly allowPlain: boolean\n\n constructor(options: EnvSecretProviderOptions = {}) {\n this.prefix = options.prefix ?? 'KB_SECRET_'\n this.allowPlain = options.allowPlain ?? true\n }\n\n async resolve(names: string[]): Promise<Record<string, string>> {\n const resolved: Record<string, string> = {}\n for (const name of names) {\n if (!name) {\n continue\n }\n const prefixed = `${this.prefix}${name}`\n const candidates = this.allowPlain\n ? [process.env[name], process.env[prefixed]]\n : [process.env[prefixed]]\n\n const value = candidates.find((candidate) => typeof candidate === 'string')\n if (typeof value === 'string') {\n resolved[name] = value\n }\n }\n return resolved\n }\n}\n\nexport function createDefaultSecretProvider(): SecretProvider {\n return new EnvSecretProvider()\n}\n\n","import {\n WORKFLOW_REDIS_CHANNEL,\n type WorkflowEventName,\n} from '@kb-labs/workflow-constants'\nimport type { IEventBus } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport interface WorkflowEvent<TPayload = Record<string, unknown>> {\n type: WorkflowEventName\n runId: string\n jobId?: string\n stepId?: string\n payload?: TPayload\n timestamp?: string\n}\n\nexport class EventBusBridge {\n private readonly events: IEventBus\n private readonly channel = WORKFLOW_REDIS_CHANNEL\n\n constructor(\n events: IEventBus,\n private readonly logger: EngineLogger,\n ) {\n this.events = events\n }\n\n async publish<TPayload = Record<string, unknown>>(\n event: WorkflowEvent<TPayload>,\n ): Promise<void> {\n const payload = {\n ...event,\n timestamp: event.timestamp ?? new Date().toISOString(),\n }\n await this.events.publish(this.channel, payload)\n this.logger.debug('Workflow event published', {\n channel: this.channel,\n type: event.type,\n runId: event.runId,\n })\n }\n}\n\n\n","import type { RetryPolicy } from '@kb-labs/workflow-contracts'\n\nconst DEFAULT_INITIAL_INTERVAL_MS = 1000\n\nexport interface RetryDecision {\n shouldRetry: boolean\n nextDelayMs?: number\n}\n\nexport function calculateBackoff(\n attempt: number,\n policy?: RetryPolicy,\n): number {\n if (!policy) {\n return 0\n }\n\n const base = policy.initialIntervalMs ?? DEFAULT_INITIAL_INTERVAL_MS\n const backoff =\n policy.backoff === 'lin'\n ? base * (attempt + 1)\n : base * Math.pow(2, attempt)\n\n if (policy.maxIntervalMs) {\n return Math.min(backoff, policy.maxIntervalMs)\n }\n return backoff\n}\n\nexport function shouldRetry(\n attempt: number,\n policy?: RetryPolicy,\n): RetryDecision {\n if (!policy) {\n return { shouldRetry: false }\n }\n if (attempt >= policy.max) {\n return { shouldRetry: false }\n }\n\n return {\n shouldRetry: true,\n nextDelayMs: calculateBackoff(attempt, policy),\n }\n}\n\n\n\n\n\n","import type { WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport interface RunSnapshot {\n runId: string\n run: WorkflowRun\n stepOutputs: Record<string, Record<string, unknown>>\n env: Record<string, string>\n refs?: {\n workspaceSnapshotId?: string\n environmentSnapshotId?: string\n }\n createdAt: string\n version: string\n}\n\nconst SNAPSHOT_VERSION = '1.0.0'\n\nexport class RunSnapshotStorage {\n constructor(\n private readonly cache: ICache,\n private readonly logger: EngineLogger,\n ) {}\n\n private getSnapshotKey(runId: string): string {\n return `workflow:snapshot:${runId}`\n }\n\n async createSnapshot(\n run: WorkflowRun,\n stepOutputs: Record<string, Record<string, unknown>>,\n env: Record<string, string>,\n refs?: RunSnapshot['refs'],\n ): Promise<RunSnapshot> {\n const snapshot: RunSnapshot = {\n runId: run.id,\n run,\n stepOutputs,\n env,\n refs,\n createdAt: new Date().toISOString(),\n version: SNAPSHOT_VERSION,\n }\n\n const key = this.getSnapshotKey(run.id)\n // Store snapshot with 7 days TTL (in milliseconds)\n await this.cache.set(\n key,\n JSON.stringify(snapshot),\n 7 * 24 * 60 * 60 * 1000, // 7 days in ms\n )\n\n this.logger.info('Snapshot created', { runId: run.id })\n return snapshot\n }\n\n async getSnapshot(runId: string): Promise<RunSnapshot | null> {\n const key = this.getSnapshotKey(runId)\n const stored = await this.cache.get<string>(key)\n if (!stored) {\n return null\n }\n\n try {\n const snapshot = JSON.parse(stored) as RunSnapshot\n // Validate version\n if (snapshot.version !== SNAPSHOT_VERSION) {\n this.logger.warn('Snapshot version mismatch', {\n runId,\n expected: SNAPSHOT_VERSION,\n actual: snapshot.version,\n })\n // Try to load anyway, but log warning\n }\n return snapshot\n } catch (error) {\n this.logger.error('Failed to parse snapshot', error instanceof Error ? error : undefined, {\n runId,\n })\n return null\n }\n }\n\n async deleteSnapshot(runId: string): Promise<void> {\n const key = this.getSnapshotKey(runId)\n await this.cache.delete(key)\n this.logger.debug('Snapshot deleted', { runId })\n }\n}\n","import type {\n WorkflowRun,\n WorkflowSpec,\n JobRun,\n} from '@kb-labs/workflow-contracts'\nimport {\n EVENT_NAMES,\n WORKFLOW_REDIS_CHANNEL,\n type WorkflowEventName,\n} from '@kb-labs/workflow-constants'\nimport type { ICache, IEventBus, ILogger, IAnalytics, Unsubscribe } from '@kb-labs/core-platform'\nimport { StateStore } from './state-store'\nimport { ConcurrencyManager, type AcquireOptions } from './concurrency-manager'\nimport {\n RunCoordinator,\n type RunCoordinatorOptions,\n} from './run-coordinator'\nimport {\n Scheduler,\n type SchedulerOptions,\n type JobQueueEntry,\n} from './scheduler'\nimport { EventBusBridge, type WorkflowEvent } from './event-bus'\nimport { WorkflowLoader } from './workflow-loader'\nimport type { CreateRunInput, EngineLogger, RunContext } from './types'\nimport { RunSnapshotStorage, type RunSnapshot } from './run-snapshot'\n\ninterface SnapshotManagerClient {\n restoreSnapshot(request: {\n snapshotId: string\n workspaceId?: string\n environmentId?: string\n targetPath?: string\n overwrite?: boolean\n metadata?: Record<string, unknown>\n }): Promise<unknown>\n}\n\nexport interface WorkflowEngineOptions {\n scheduler?: SchedulerOptions\n concurrency?: AcquireOptions\n runCoordinator?: RunCoordinatorOptions\n maxWorkflowDepth?: number\n /** Platform cache adapter (REQUIRED) */\n cache: ICache\n /** Platform event bus adapter (REQUIRED) */\n events: IEventBus\n /** Platform logger (REQUIRED) */\n logger: ILogger\n /** Platform analytics adapter (OPTIONAL) */\n analytics?: IAnalytics\n /** Platform snapshot manager (OPTIONAL - for infra snapshot restore in replay) */\n snapshotManager?: SnapshotManagerClient\n /** Workspace root (monorepo root) - used for plugin execution context */\n workspaceRoot?: string\n}\n\nexport class WorkflowEngine {\n readonly loader: WorkflowLoader\n readonly maxWorkflowDepth: number\n\n private readonly logger: EngineLogger\n private readonly analytics?: IAnalytics\n private readonly stateStore: StateStore\n private readonly concurrency: ConcurrencyManager\n private readonly runCoordinator: RunCoordinator\n private readonly scheduler: Scheduler\n private readonly events: EventBusBridge\n private readonly snapshotStorage: RunSnapshotStorage\n\n constructor(private readonly options: WorkflowEngineOptions) {\n this.logger = options.logger\n this.analytics = options.analytics\n\n this.stateStore = new StateStore(options.cache, this.logger)\n this.concurrency = new ConcurrencyManager(\n options.cache,\n this.logger,\n options.concurrency,\n )\n this.runCoordinator = new RunCoordinator(\n options.cache,\n this.stateStore,\n this.concurrency,\n this.logger,\n options.runCoordinator,\n )\n\n this.scheduler = new Scheduler(options.cache, this.logger, options.scheduler)\n this.events = new EventBusBridge(options.events, this.logger)\n this.loader = new WorkflowLoader(this.logger)\n this.maxWorkflowDepth = options.maxWorkflowDepth ?? 2\n this.snapshotStorage = new RunSnapshotStorage(options.cache, this.logger)\n }\n\n async dispose(): Promise<void> {\n // Cleanup if needed\n }\n\n /**\n * Subscribe to real-time events for a specific workflow run.\n * Events are filtered by runId from the shared event bus channel.\n */\n subscribeToRunEvents(\n runId: string,\n handler: (event: WorkflowEvent) => void,\n ): Unsubscribe {\n return this.options.events.subscribe(WORKFLOW_REDIS_CHANNEL, async (raw: unknown) => {\n const event = raw as WorkflowEvent\n if (event.runId === runId) {handler(event)}\n })\n }\n\n async createRun(input: CreateRunInput): Promise<WorkflowRun> {\n const run = await this.runCoordinator.ensureRun(input)\n\n // Track workflow run creation\n this.analytics?.track('workflow.run.created', {\n runId: run.id,\n name: run.name,\n version: run.version,\n jobCount: run.jobs.length,\n trigger: input.trigger?.type,\n }).catch(() => {}) // Silent fail for analytics\n\n await this.events.publish({\n type: EVENT_NAMES.run.created,\n runId: run.id,\n payload: {\n status: run.status,\n name: run.name,\n version: run.version,\n },\n })\n await this.scheduler.scheduleRun(run)\n\n return run\n }\n\n async runFromSpec(\n spec: WorkflowSpec,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n return this.createRun({\n ...input,\n spec,\n })\n }\n\n async runFromFile(\n filePath: string,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n const result = await this.loader.fromFile(filePath)\n return this.runFromSpec(result.spec, input)\n }\n\n async runFromInline(\n spec: unknown,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n const result = this.loader.fromInline(spec)\n return this.runFromSpec(result.spec, input)\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n return this.stateStore.getRun(runId)\n }\n\n async cancelRun(runId: string): Promise<void> {\n const run = await this.getRun(runId)\n\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'cancelled'\n draft.finishedAt = new Date().toISOString()\n return draft\n })\n\n // Track workflow cancellation\n this.analytics?.track('workflow.run.cancelled', {\n runId,\n name: run?.name,\n reason: 'cancelled by parent workflow',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.cancelled,\n runId,\n payload: { reason: 'cancelled by parent workflow' },\n })\n }\n\n /**\n * Mark job as failed and optionally schedule retry.\n * Implements exponential/linear backoff retry logic.\n */\n async markJobFailed(\n runId: string,\n jobId: string,\n error: Error,\n shouldRetry = true\n ): Promise<void> {\n const run = await this.stateStore.getRun(runId)\n if (!run) {\n this.logger.warn('Cannot mark job as failed: run not found', { runId, jobId })\n return\n }\n\n const job = run.jobs.find((j) => j.id === jobId)\n if (!job) {\n this.logger.warn('Cannot mark job as failed: job not found', { runId, jobId })\n return\n }\n\n // Update job status to failed\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'failed'\n draft.error = {\n message: error.message,\n stack: error.stack,\n timestamp: new Date().toISOString(),\n }\n draft.finishedAt = new Date().toISOString()\n draft.attempt = (draft.attempt || 0) + 1\n })\n\n this.logger.error('Job failed', error, {\n runId,\n jobId,\n attempt: (job.attempt || 0) + 1,\n })\n\n // Track job failure\n this.analytics?.track('workflow.job.failed', {\n runId,\n jobId,\n jobName: job.jobName,\n attempt: (job.attempt || 0) + 1,\n errorMessage: error.message,\n willRetry: shouldRetry && this.shouldRetryJob(job),\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.failed,\n runId,\n jobId,\n payload: { jobName: job.jobName, error: error.message, attempt: (job.attempt || 0) + 1 },\n })\n\n // Check if should retry\n if (shouldRetry && this.shouldRetryJob(job)) {\n const backoffMs = this.calculateBackoff(job.attempt || 0, job.retries)\n\n this.logger.info('Scheduling job retry', {\n runId,\n jobId,\n attempt: (job.attempt || 0) + 1,\n backoffMs,\n })\n\n // Re-queue job after backoff\n setTimeout(async () => {\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'queued'\n draft.error = undefined\n draft.startedAt = undefined\n draft.finishedAt = undefined\n })\n\n // Re-enqueue in scheduler\n const updatedRun = await this.stateStore.getRun(runId)\n const updatedJob = updatedRun?.jobs.find((j) => j.id === jobId)\n if (updatedJob) {\n await this.scheduler.enqueueJob(runId, updatedJob, updatedJob.priority ?? 'normal')\n }\n\n this.logger.info('Job re-queued for retry', { runId, jobId })\n }, backoffMs)\n } else {\n // Move to Dead Letter Queue\n await this.moveToDLQ(runId, jobId, error)\n }\n }\n\n /**\n * Mark job as interrupted (e.g., during graceful shutdown).\n * Interrupted jobs will be retried on next daemon startup.\n */\n async markJobInterrupted(runId: string, jobId: string): Promise<void> {\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'interrupted'\n draft.finishedAt = new Date().toISOString()\n })\n\n this.logger.warn('Job interrupted', { runId, jobId })\n }\n\n /**\n * Mark job as started (running).\n */\n async markJobStarted(runId: string, jobId: string): Promise<void> {\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'running'\n draft.startedAt = new Date().toISOString()\n })\n\n this.logger.debug('Job started', { runId, jobId })\n\n // Track job start\n const run = await this.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n this.analytics?.track('workflow.job.started', {\n runId,\n jobId,\n jobName: job?.jobName,\n stepCount: job?.steps.length ?? 0,\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.started,\n runId,\n jobId,\n payload: { jobName: job?.jobName },\n })\n }\n\n /**\n * Mark job as completed successfully.\n */\n async markJobCompleted(runId: string, jobId: string): Promise<void> {\n const run = await this.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n const startTime = job?.startedAt ? new Date(job.startedAt).getTime() : Date.now()\n const duration = Date.now() - startTime\n\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n })\n\n this.logger.info('Job completed successfully', { runId, jobId })\n\n // Track job completion\n this.analytics?.track('workflow.job.completed', {\n runId,\n jobId,\n jobName: job?.jobName,\n durationMs: duration,\n stepCount: job?.steps.length ?? 0,\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.succeeded,\n runId,\n jobId,\n payload: { jobName: job?.jobName, durationMs: duration },\n })\n\n // Check if all jobs in run are completed - update run status\n await this.checkRunCompletion(runId)\n }\n\n /**\n * Check if all jobs in a run are completed and update run status accordingly.\n */\n private async checkRunCompletion(runId: string): Promise<void> {\n const run = await this.getRun(runId)\n if (!run) {\n return\n }\n\n // Check status of all jobs\n const allSuccess = run.jobs.every((j) => j.status === 'success')\n const anyFailed = run.jobs.some((j) => j.status === 'failed')\n const anyRunning = run.jobs.some((j) => j.status === 'running' || j.status === 'queued')\n\n // If any job is still running/queued, run is not complete\n if (anyRunning) {\n return\n }\n\n // Update run status based on job outcomes\n if (allSuccess) {\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n return draft\n })\n this.logger.info('Workflow run completed successfully', { runId })\n\n // Track workflow completion\n this.analytics?.track('workflow.run.completed', {\n runId,\n name: run.name,\n jobCount: run.jobs.length,\n status: 'success',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.finished,\n runId,\n payload: { status: 'success', name: run.name },\n })\n } else if (anyFailed) {\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = new Date().toISOString()\n return draft\n })\n this.logger.info('Workflow run failed', { runId })\n\n // Track workflow failure\n this.analytics?.track('workflow.run.completed', {\n runId,\n name: run.name,\n jobCount: run.jobs.length,\n status: 'failed',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.failed,\n runId,\n payload: { status: 'failed', name: run.name },\n })\n }\n }\n\n /**\n * Mark step as started (running).\n */\n async markStepStarted(runId: string, jobId: string, stepId: string): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'running'\n draft.startedAt = new Date().toISOString()\n })\n\n this.logger.debug('Step started', { runId, jobId, stepId })\n\n await this.events.publish({\n type: EVENT_NAMES.step.started,\n runId,\n jobId,\n stepId,\n })\n }\n\n /**\n * Mark step as completed successfully with output.\n */\n async markStepCompleted(\n runId: string,\n jobId: string,\n stepId: string,\n output?: unknown,\n ): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n if (output !== undefined) {\n draft.outputs = output as Record<string, unknown>\n }\n })\n\n this.logger.debug('Step completed', { runId, jobId, stepId })\n\n await this.events.publish({\n type: EVENT_NAMES.step.succeeded,\n runId,\n jobId,\n stepId,\n payload: output !== undefined ? { outputs: output } : undefined,\n })\n }\n\n /**\n * Mark step as failed with error.\n */\n async markStepFailed(\n runId: string,\n jobId: string,\n stepId: string,\n error: Error,\n outputs?: Record<string, unknown>,\n ): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = new Date().toISOString()\n draft.error = {\n message: error.message,\n stack: error.stack,\n }\n if (outputs) {draft.outputs = outputs}\n })\n\n this.logger.debug('Step failed', { runId, jobId, stepId, error: error.message })\n\n await this.events.publish({\n type: EVENT_NAMES.step.failed,\n runId,\n jobId,\n stepId,\n payload: { error: error.message },\n })\n }\n\n /**\n * Mark step as waiting for human approval.\n */\n async markStepWaitingApproval(\n runId: string,\n jobId: string,\n stepId: string,\n ): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'waiting_approval' as any\n draft.startedAt = draft.startedAt ?? new Date().toISOString()\n })\n\n await this.events.publish({\n type: EVENT_NAMES.step.waitingApproval as any,\n runId,\n payload: { jobId, stepId },\n })\n\n this.logger.info('Step waiting for approval', { runId, jobId, stepId })\n }\n\n /**\n * Resolve a pending approval — approve or reject.\n * On approve: marks step as success with approval outputs.\n * On reject: marks step as failed with rejection error.\n */\n async resolveApproval(\n runId: string,\n jobId: string,\n stepId: string,\n action: 'approve' | 'reject',\n data?: Record<string, unknown>,\n comment?: string,\n ): Promise<void> {\n if (action === 'approve') {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n draft.outputs = {\n approved: true,\n action,\n ...(comment ? { comment } : {}),\n ...(data ?? {}),\n }\n })\n\n this.logger.info('Approval granted', { runId, jobId, stepId, comment })\n } else {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = new Date().toISOString()\n draft.error = {\n message: comment || 'Approval rejected',\n code: 'APPROVAL_REJECTED',\n }\n draft.outputs = {\n approved: false,\n action,\n ...(comment ? { comment } : {}),\n ...(data ?? {}),\n }\n })\n\n this.logger.info('Approval rejected', { runId, jobId, stepId, comment })\n }\n\n await this.events.publish({\n type: EVENT_NAMES.step.updated,\n runId,\n payload: { jobId, stepId, action },\n })\n }\n\n /**\n * Get the state store for direct access (used by worker for gate restart-from).\n */\n getStateStore(): StateStore {\n return this.stateStore\n }\n\n /**\n * Get the scheduler for direct access (used by worker for gate re-enqueue).\n */\n getScheduler(): Scheduler {\n return this.scheduler\n }\n\n /**\n * Mark stale running/queued runs as failed on daemon startup.\n * Runs that were in-flight when the daemon crashed are unrecoverable —\n * their executor process is gone, so we mark them failed immediately.\n */\n async cleanupStaleRuns(): Promise<void> {\n const runIds = await this.stateStore.getAllRunIds()\n const now = new Date().toISOString()\n let count = 0\n\n await Promise.all(\n runIds.map(async (runId) => {\n const run = await this.stateStore.getRun(runId)\n if (!run) { return }\n if (run.status !== 'running' && run.status !== 'queued') { return }\n\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = now\n if (draft.startedAt) {\n draft.durationMs = new Date(now).getTime() - new Date(draft.startedAt).getTime()\n }\n // Mark any still-active jobs as failed too\n for (const job of draft.jobs) {\n if (job.status === 'running' || job.status === 'queued') {\n job.status = 'failed'\n job.error = { message: 'Daemon restarted — run was abandoned' }\n job.finishedAt = now\n }\n }\n return draft\n })\n count++\n }),\n )\n\n if (count > 0) {\n this.logger.warn('Cleaned up stale runs from previous daemon process', { count })\n }\n }\n\n /**\n * Resume interrupted jobs on daemon startup.\n * Re-queues jobs that were interrupted during previous shutdown.\n */\n async resumeInterruptedJobs(): Promise<void> {\n const runIds = await this.stateStore.getAllRunIds()\n\n // Process all runs in parallel\n const results = await Promise.all(\n runIds.map(async runId => {\n const run = await this.stateStore.getRun(runId)\n if (!run) {return 0}\n\n const interruptedJobs = run.jobs.filter(job => job.status === 'interrupted')\n\n // Process all interrupted jobs in this run in parallel\n await Promise.all(\n interruptedJobs.map(async job => {\n this.logger.info('Resuming interrupted job', { runId, jobId: job.id })\n\n await this.stateStore.updateJob(runId, job.id, (draft) => {\n draft.status = 'queued'\n draft.startedAt = undefined\n draft.finishedAt = undefined\n })\n\n // Re-enqueue in scheduler\n const queuedJob = { ...job, status: 'queued' as const }\n await this.scheduler.enqueueJob(runId, queuedJob, queuedJob.priority ?? 'normal')\n }),\n )\n\n return interruptedJobs.length\n }),\n )\n\n const resumedCount = results.reduce((sum, count) => sum + count, 0)\n\n if (resumedCount > 0) {\n this.logger.info('Resumed interrupted jobs', { count: resumedCount })\n }\n }\n\n /**\n * Determine if job should be retried based on retry policy.\n */\n private shouldRetryJob(job: JobRun): boolean {\n const retryPolicy = job.retries || { max: 3, backoff: 'exp' as const }\n const attempt = job.attempt || 0\n\n return attempt < retryPolicy.max\n }\n\n /**\n * Calculate backoff delay using exponential or linear strategy.\n */\n private calculateBackoff(\n attempt: number,\n policy?: { backoff: 'exp' | 'lin'; initialIntervalMs?: number; maxIntervalMs?: number }\n ): number {\n const config = {\n backoff: policy?.backoff || 'exp',\n initialIntervalMs: policy?.initialIntervalMs || 1000,\n maxIntervalMs: policy?.maxIntervalMs || 60000,\n }\n\n let backoffMs: number\n\n if (config.backoff === 'exp') {\n // Exponential: 1s, 2s, 4s, 8s, 16s, 32s...\n backoffMs = config.initialIntervalMs * Math.pow(2, attempt)\n } else {\n // Linear: 1s, 2s, 3s, 4s, 5s...\n backoffMs = config.initialIntervalMs * (attempt + 1)\n }\n\n // Cap at maxIntervalMs\n return Math.min(backoffMs, config.maxIntervalMs)\n }\n\n /**\n * Move permanently failed job to Dead Letter Queue.\n */\n private async moveToDLQ(runId: string, jobId: string, error: Error): Promise<void> {\n this.logger.warn('Job moved to DLQ after max retries', { runId, jobId })\n\n // Update run status to 'dlq'\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'dlq'\n draft.result = {\n status: 'dlq',\n summary: `Job ${jobId} failed after max retries`,\n error: {\n message: error.message,\n details: {\n stack: error.stack,\n },\n },\n }\n draft.finishedAt = new Date().toISOString()\n })\n\n // Store in cache with DLQ prefix\n const dlqKey = `workflow:dlq:${runId}:${jobId}`\n const run = await this.stateStore.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n\n await this.options.cache!.set(\n dlqKey,\n JSON.stringify({\n runId,\n jobId,\n jobName: job?.jobName,\n error: {\n message: error.message,\n stack: error.stack,\n },\n timestamp: new Date().toISOString(),\n attempts: job?.attempt || 0,\n }),\n 7 * 24 * 60 * 60 * 1000 // TTL 7 days\n )\n\n // Publish event\n const updatedRun = await this.stateStore.getRun(runId)\n if (updatedRun) {\n await this.publishRunEvent(EVENT_NAMES.run.failed, updatedRun)\n }\n }\n\n async updateRun(\n runId: string,\n mutator: (run: WorkflowRun) => WorkflowRun | void,\n ): Promise<WorkflowRun | null> {\n const updated = await this.stateStore.updateRun(runId, mutator)\n if (updated) {\n await this.publishRunEvent(EVENT_NAMES.run.updated, updated)\n }\n return updated\n }\n\n async finalizeRun(\n runId: string,\n status: WorkflowRun['status'],\n context: Partial<RunContext> = {},\n ): Promise<WorkflowRun | null> {\n const updated = await this.stateStore.updateRun(runId, (run) => {\n const now = new Date().toISOString()\n run.status = status\n run.finishedAt = now\n run.durationMs = computeDurationMs(run.startedAt ?? run.queuedAt, now)\n if (context.jobs) {\n run.jobs = context.jobs\n }\n if (context.steps) {\n // optional override steps already included in jobs\n }\n return run\n })\n\n if (updated) {\n await this.runCoordinator.releaseConcurrency(updated)\n await this.publishRunEvent(\n status === 'failed'\n ? EVENT_NAMES.run.failed\n : status === 'cancelled'\n ? EVENT_NAMES.run.cancelled\n : EVENT_NAMES.run.finished,\n updated,\n )\n }\n\n return updated\n }\n\n async nextJob(): Promise<JobQueueEntry | null> {\n return this.scheduler.dequeueJob()\n }\n\n async rescheduleJob(entry: JobQueueEntry, delayMs: number): Promise<void> {\n await this.scheduler.reschedule(entry, delayMs)\n }\n\n async publishRunEvent(\n type: WorkflowEventName,\n run: WorkflowRun,\n ): Promise<void> {\n await this.events.publish({\n type,\n runId: run.id,\n payload: {\n status: run.status,\n name: run.name,\n version: run.version,\n },\n })\n }\n\n /**\n * Publish a log entry for real-time streaming to Studio UI.\n */\n async publishLog(\n runId: string,\n jobId: string,\n stepId: string,\n entry: { level: string; message: string; stream: string; lineNo: number; timestamp: string; meta?: Record<string, unknown> },\n ): Promise<void> {\n await this.events.publish({\n type: EVENT_NAMES.log.appended,\n runId,\n jobId,\n stepId,\n payload: entry,\n })\n }\n\n /**\n * Create a snapshot of the current run state\n */\n async createSnapshot(\n runId: string,\n stepOutputs: Record<string, Record<string, unknown>>,\n env: Record<string, string>,\n refs?: RunSnapshot['refs'],\n ): Promise<RunSnapshot | null> {\n const run = await this.getRun(runId)\n if (!run) {\n this.logger.warn('Cannot create snapshot: run not found', { runId })\n return null\n }\n\n return this.snapshotStorage.createSnapshot(run, stepOutputs, env, refs)\n }\n\n /**\n * Get a snapshot for a run\n */\n async getSnapshot(runId: string): Promise<RunSnapshot | null> {\n return this.snapshotStorage.getSnapshot(runId)\n }\n\n /**\n * Replay a run from a snapshot, optionally starting from a specific step\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Replay orchestration: handles snapshot loading, step state transitions (before/at/after fromStep), env merging, job traversal, and conditional status reset logic\n async replayRun(\n runId: string,\n options: {\n fromStepId?: string\n stepOutputs?: Record<string, Record<string, unknown>>\n env?: Record<string, string>\n } = {},\n ): Promise<WorkflowRun | null> {\n // Load snapshot\n const snapshot = await this.snapshotStorage.getSnapshot(runId)\n if (!snapshot) {\n this.logger.warn('Cannot replay: snapshot not found', { runId })\n return null\n }\n\n if (snapshot.refs?.workspaceSnapshotId || snapshot.refs?.environmentSnapshotId) {\n if (!this.options.snapshotManager) {\n throw new Error('SnapshotManager is required for replay with infra snapshot references')\n }\n\n if (snapshot.refs.workspaceSnapshotId) {\n await this.options.snapshotManager.restoreSnapshot({\n snapshotId: snapshot.refs.workspaceSnapshotId,\n metadata: { source: 'workflow.replay', runId },\n })\n }\n\n if (snapshot.refs.environmentSnapshotId) {\n await this.options.snapshotManager.restoreSnapshot({\n snapshotId: snapshot.refs.environmentSnapshotId,\n metadata: { source: 'workflow.replay', runId },\n })\n }\n }\n\n // Restore run state\n const restoredRun = snapshot.run\n\n // Restore env if provided\n if (options.env) {\n restoredRun.env = { ...snapshot.env, ...options.env }\n } else {\n restoredRun.env = snapshot.env\n }\n\n // If fromStepId is specified, mark all steps before it as completed\n if (options.fromStepId) {\n for (const job of restoredRun.jobs) {\n let foundStep = false\n for (const step of job.steps) {\n if (step.id === options.fromStepId) {\n // Found the step to start from\n foundStep = true\n // Reset this step and all following steps\n if (step.status !== 'queued') {\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n continue\n }\n if (!foundStep) {\n // Mark previous steps as completed\n if (step.status === 'running' || step.status === 'queued') {\n step.status = 'success'\n step.finishedAt = step.finishedAt ?? new Date().toISOString()\n }\n } else {\n // Reset steps after the target step\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n }\n }\n } else {\n // Reset all steps to queued\n for (const job of restoredRun.jobs) {\n for (const step of job.steps) {\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n }\n }\n\n // Update run status\n restoredRun.status = 'running'\n restoredRun.startedAt = restoredRun.startedAt ?? new Date().toISOString()\n restoredRun.finishedAt = undefined\n\n // Save restored run\n await this.stateStore.saveRun(restoredRun)\n\n // Schedule the run\n await this.scheduler.scheduleRun(restoredRun)\n\n this.logger.info('Run replayed from snapshot', {\n runId,\n fromStepId: options.fromStepId,\n })\n\n return restoredRun\n }\n\n /**\n * Delete a snapshot\n */\n async deleteSnapshot(runId: string): Promise<void> {\n await this.snapshotStorage.deleteSnapshot(runId)\n }\n\n /**\n * Get all active workflow executions (running or queued).\n * Returns array of WorkflowRun objects with status 'running' or 'queued'.\n */\n async getActiveExecutions(): Promise<WorkflowRun[]> {\n // Get all run IDs from sorted set index\n const runIds = await this.stateStore.getAllRunIds()\n\n // Fetch all runs in parallel and filter for active ones\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n return runs.filter(\n (run): run is WorkflowRun =>\n run !== null && (run.status === 'running' || run.status === 'queued'),\n )\n }\n\n /**\n * Get all workflow runs (all statuses).\n * Returns array of all WorkflowRun objects ordered by creation time.\n */\n async getAllRuns(): Promise<WorkflowRun[]> {\n // Get all run IDs from sorted set index\n const runIds = await this.stateStore.getAllRunIds()\n\n // Fetch all runs in parallel and filter out nulls\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n return runs.filter((run): run is WorkflowRun => run !== null)\n }\n\n /**\n * List all workflow runs.\n * Returns array of all runs in the system.\n * Alias for getAllRuns() - maintained for backward compatibility.\n */\n async listRuns(): Promise<WorkflowRun[]> {\n return this.getAllRuns()\n }\n\n /**\n * Get workflow engine metrics.\n * Returns statistics about runs, jobs, and system health.\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Metrics aggregation: iterates all runs and jobs, counts by status (6 run statuses + 4 job statuses), handles nulls\n async getMetrics(): Promise<{\n runs: {\n total: number\n queued: number\n running: number\n completed: number\n failed: number\n cancelled: number\n dlq: number\n }\n jobs: {\n total: number\n queued: number\n running: number\n completed: number\n failed: number\n }\n }> {\n // Get all run IDs\n const runIds = await this.stateStore.getAllRunIds()\n\n const metrics = {\n runs: {\n total: 0,\n queued: 0,\n running: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n dlq: 0,\n },\n jobs: {\n total: 0,\n queued: 0,\n running: 0,\n completed: 0,\n failed: 0,\n },\n }\n\n // Fetch all runs in parallel\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n // Aggregate metrics from all runs\n for (const run of runs) {\n if (!run) {continue}\n\n metrics.runs.total++\n\n // Count run status\n if (run.status === 'queued') {metrics.runs.queued++}\n else if (run.status === 'running') {metrics.runs.running++}\n else if (run.status === 'success') {metrics.runs.completed++}\n else if (run.status === 'failed') {metrics.runs.failed++}\n else if (run.status === 'cancelled') {metrics.runs.cancelled++}\n else if (run.status === 'dlq') {metrics.runs.dlq++}\n\n // Count job statuses\n for (const job of run.jobs) {\n metrics.jobs.total++\n if (job.status === 'queued') {metrics.jobs.queued++}\n else if (job.status === 'running') {metrics.jobs.running++}\n else if (job.status === 'success') {metrics.jobs.completed++}\n else if (job.status === 'failed') {metrics.jobs.failed++}\n }\n }\n\n return metrics\n }\n}\n\nfunction computeDurationMs(\n startedAt: string | undefined,\n finishedAt: string,\n): number | undefined {\n if (!startedAt) {\n return undefined\n }\n const start = Date.parse(startedAt)\n const end = Date.parse(finishedAt)\n if (Number.isNaN(start) || Number.isNaN(end)) {\n return undefined\n }\n return Math.max(0, end - start)\n}\n\n\n\n\n","import { join } from 'node:path'\nimport type { ArtifactMergeConfig, ArtifactMergeStrategy } from '@kb-labs/workflow-contracts'\nimport {\n createFileSystemArtifactClient,\n type ArtifactClient,\n} from '@kb-labs/workflow-artifacts'\nimport type { StateStore } from './state-store'\nimport type { EngineLogger } from './types'\n\nexport interface ArtifactMergerOptions {\n stateStore: StateStore\n logger: EngineLogger\n artifactsRoot: string\n}\n\nexport class ArtifactMerger {\n constructor(private readonly options: ArtifactMergerOptions) {}\n\n async mergeArtifacts(\n config: ArtifactMergeConfig,\n targetArtifacts: ArtifactClient,\n currentRunId: string,\n ): Promise<void> {\n const { strategy, from } = config\n\n this.options.logger.debug('Starting artifact merge', {\n strategy,\n sources: from.length,\n currentRunId,\n })\n\n // Load artifacts from all sources (parallel execution)\n const results = await Promise.allSettled(\n from.map(source =>\n this.loadArtifactsFromRun(source.runId, source.jobId).then(\n artifacts => ({ source, artifacts, success: true as const }),\n error => ({ source, error, success: false as const }),\n ),\n ),\n )\n\n const sourceArtifacts: Array<{ path: string; content: unknown }> = []\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.success) {\n sourceArtifacts.push(...result.value.artifacts)\n } else if (result.status === 'fulfilled' && !result.value.success) {\n this.options.logger.warn('Failed to load artifacts from source', {\n runId: result.value.source.runId,\n jobId: result.value.source.jobId,\n error: result.value.error instanceof Error\n ? result.value.error.message\n : String(result.value.error),\n })\n }\n }\n\n if (sourceArtifacts.length === 0) {\n this.options.logger.warn('No artifacts found to merge', {\n sources: from.length,\n })\n return\n }\n\n // Apply merge strategy\n await this.applyMergeStrategy(strategy, sourceArtifacts, targetArtifacts)\n\n this.options.logger.info('Artifact merge completed', {\n strategy,\n mergedCount: sourceArtifacts.length,\n })\n }\n\n private async loadArtifactsFromRun(\n runId: string,\n jobId?: string,\n ): Promise<Array<{ path: string; content: unknown }>> {\n // Load run from state store\n const run = await this.options.stateStore.getRun(runId)\n if (!run) {\n throw new Error(`Run ${runId} not found`)\n }\n\n // Find the job\n const job = jobId\n ? run.jobs.find((j) => j.id === jobId)\n : run.jobs[0] // Use first job if not specified\n\n if (!job) {\n throw new Error(`Job ${jobId ?? 'first'} not found in run ${runId}`)\n }\n\n // Get artifact paths from job\n const artifactPaths = job.artifacts?.produce ?? []\n if (artifactPaths.length === 0) {\n return []\n }\n\n // Load artifacts from filesystem (parallel execution)\n const sourceArtifacts = createFileSystemArtifactClient(join(\n this.options.artifactsRoot,\n runId,\n job.jobName,\n ))\n\n const results = await Promise.allSettled(\n artifactPaths.map(artifactPath => {\n return this.loadArtifactContent(sourceArtifacts, artifactPath).then(\n content => ({ artifactPath, content, success: true as const }),\n error => ({ artifactPath, error, success: false as const }),\n )\n }),\n )\n\n const artifacts: Array<{ path: string; content: unknown }> = []\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.success) {\n artifacts.push({ path: result.value.artifactPath, content: result.value.content })\n } else if (result.status === 'fulfilled' && !result.value.success) {\n this.options.logger.warn('Failed to load artifact', {\n runId,\n jobId: job.id,\n artifactPath: result.value.artifactPath,\n error: result.value.error instanceof Error\n ? result.value.error.message\n : String(result.value.error),\n })\n }\n }\n\n return artifacts\n }\n\n private async loadArtifactContent(\n artifacts: ArtifactClient,\n artifactPath: string,\n ): Promise<unknown> {\n try {\n const content = (await artifacts.consume(artifactPath)).toString('utf8')\n // Try to parse as JSON, fallback to string\n try {\n return JSON.parse(content)\n } catch {\n return content\n }\n } catch (error) {\n throw new Error(\n `Failed to read artifact '${artifactPath}': ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n private async applyMergeStrategy(\n strategy: ArtifactMergeStrategy,\n sourceArtifacts: Array<{ path: string; content: unknown }>,\n targetArtifacts: ArtifactClient,\n ): Promise<void> {\n // Group artifacts by path\n const artifactsByPath = new Map<string, unknown[]>()\n\n for (const artifact of sourceArtifacts) {\n if (!artifactsByPath.has(artifact.path)) {\n artifactsByPath.set(artifact.path, [])\n }\n artifactsByPath.get(artifact.path)!.push(artifact.content)\n }\n\n // Apply strategy and save for each path in parallel\n await Promise.all(\n Array.from(artifactsByPath.entries()).map(async ([path, contents]) => {\n let merged: unknown\n\n switch (strategy) {\n case 'append': {\n // Append: combine arrays or concatenate strings\n merged = this.mergeAppend(contents)\n break\n }\n case 'overwrite': {\n // Overwrite: use last value\n merged = contents[contents.length - 1]\n break\n }\n case 'json-merge': {\n // JSON merge: deep merge objects\n merged = this.mergeJson(contents)\n break\n }\n default: {\n this.options.logger.warn('Unknown merge strategy, using overwrite', {\n strategy,\n path,\n })\n merged = contents[contents.length - 1]\n }\n }\n\n // Save merged artifact\n await this.saveMergedArtifact(targetArtifacts, path, merged)\n }),\n )\n }\n\n private mergeAppend(contents: unknown[]): unknown {\n // If all are arrays, concatenate\n if (contents.every((c) => Array.isArray(c))) {\n return (contents as unknown[][]).flat()\n }\n\n // If all are strings, concatenate with newline\n if (contents.every((c) => typeof c === 'string')) {\n return (contents as string[]).join('\\n')\n }\n\n // Otherwise, wrap in array\n return contents\n }\n\n private mergeJson(contents: unknown[]): unknown {\n // Start with empty object\n let merged: Record<string, unknown> = {}\n\n for (const content of contents) {\n if (typeof content === 'object' && content !== null && !Array.isArray(content)) {\n merged = this.deepMerge(merged, content as Record<string, unknown>)\n } else {\n // If not an object, use last value\n merged = content as Record<string, unknown>\n }\n }\n\n return merged\n }\n\n private deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n ): Record<string, unknown> {\n const result = { ...target }\n\n for (const [key, value] of Object.entries(source)) {\n if (\n key in result &&\n typeof result[key] === 'object' &&\n result[key] !== null &&\n !Array.isArray(result[key]) &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n // Recursive merge for nested objects\n result[key] = this.deepMerge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n )\n } else {\n // Overwrite for primitives, arrays, or different types\n result[key] = value\n }\n }\n\n return result\n }\n\n private async saveMergedArtifact(\n artifacts: ArtifactClient,\n path: string,\n content: unknown,\n ): Promise<void> {\n // Convert content to string\n const contentString =\n typeof content === 'string'\n ? content\n : JSON.stringify(content, null, 2)\n\n await artifacts.produce(path, contentString)\n\n this.options.logger.debug('Saved merged artifact', { path })\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/manifest-scanner\n *\n * Scans plugin manifests for workflows and jobs, converting them to unified WorkflowRuntime format.\n *\n * ## Features\n * - Discovers workflows from `manifest.workflows.handlers`\n * - Discovers jobs from `manifest.jobs`\n * - Converts to unified WorkflowRuntime representation\n * - Caches results via Platform state for performance\n *\n * ## Usage\n * ```typescript\n * const scanner = new ManifestScanner({ cliApi, platform });\n * const workflows = await scanner.scanPlugins();\n * ```\n */\n\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type {\n WorkflowHandlerDecl,\n JobHandlerDecl,\n CronDecl,\n PlatformServices\n} from '@kb-labs/plugin-contracts';\n\n/**\n * Workflow trigger type\n */\nexport type WorkflowTriggerType = 'manual' | 'webhook' | 'push' | 'schedule' | 'event';\n\n/**\n * Workflow trigger configuration\n */\nexport interface WorkflowTrigger {\n type: WorkflowTriggerType;\n config?: Record<string, unknown>;\n}\n\n/**\n * Schedule configuration for workflows\n */\nexport interface WorkflowSchedule {\n /** Cron expression (e.g., \"0 2 * * *\") */\n cron: string;\n /** Whether schedule is enabled */\n enabled: boolean;\n /** Next run time (calculated) */\n nextRun?: Date;\n /** Last run time */\n lastRun?: Date;\n}\n\n/**\n * Workflow runtime statistics\n */\nexport interface WorkflowStats {\n totalRuns: number;\n successRuns: number;\n failedRuns: number;\n lastRunStatus?: 'success' | 'failed' | 'cancelled';\n lastRunAt?: Date;\n avgDurationMs?: number;\n}\n\n/**\n * Unified workflow runtime representation.\n *\n * Used for both manifest-based and standalone workflows.\n */\nexport interface WorkflowRuntime {\n // Identification\n id: string;\n source: 'manifest' | 'standalone';\n\n // Manifest-based fields\n pluginId?: string;\n manifestPath?: string;\n\n // Common metadata\n name: string;\n description?: string;\n tags?: string[];\n\n // Execution configuration\n triggers: WorkflowTrigger[];\n handler?: string; // For manifest-based workflows\n\n // Schedule (if applicable)\n schedule?: WorkflowSchedule;\n\n // Status\n status: 'active' | 'paused' | 'disabled';\n\n // Statistics (optional, populated from runtime)\n stats?: WorkflowStats;\n\n // Permissions\n permissions?: unknown; // From manifest\n\n // Full spec stored for execution (standalone workflows)\n input?: unknown;\n output?: unknown;\n // Declared input parameter schema exposed via REST API\n inputSchema?: Record<string, { type: 'string' | 'number' | 'boolean'; description?: string; required?: boolean; default?: unknown }>;\n}\n\n/**\n * Options for ManifestScanner\n */\nexport interface ManifestScannerOptions {\n /** CLI API instance */\n cliApi: IEntityRegistry;\n\n /** Platform services (for state, logger, etc.) */\n platform: PlatformServices;\n\n /** Cache TTL in milliseconds (default: 60000 = 1 minute) */\n cacheTtlMs?: number;\n}\n\n/**\n * Manifest Scanner Service\n *\n * Discovers workflows and jobs from installed plugin manifests.\n */\nexport class ManifestScanner {\n private readonly cliApi: IEntityRegistry;\n private readonly platform: PlatformServices;\n private readonly cacheTtlMs: number;\n\n constructor(options: ManifestScannerOptions) {\n this.cliApi = options.cliApi;\n this.platform = options.platform;\n this.cacheTtlMs = options.cacheTtlMs ?? 60000; // 1 minute default\n }\n\n /**\n * Scan all installed plugins for workflows and jobs.\n *\n * Returns unified WorkflowRuntime representations.\n */\n async scanPlugins(): Promise<WorkflowRuntime[]> {\n const cacheKey = 'manifest-scanner:workflows';\n\n // Check cache first (via platform cache)\n if (this.platform.cache) {\n const cached = await this.platform.cache.get<WorkflowRuntime[]>(cacheKey);\n if (cached) {\n this.platform.logger?.debug('ManifestScanner: Using cached workflows', { count: cached.length });\n return cached;\n }\n }\n\n this.platform.logger?.debug('ManifestScanner: Querying entity registry');\n const workflows: WorkflowRuntime[] = [];\n\n // Query workflow, job, and cron entities from registry (extracted from ManifestV3 by catalog)\n const workflowEntities = this.cliApi.queryEntities({ kind: 'workflow' });\n const jobEntities = this.cliApi.queryEntities({ kind: 'job' });\n const cronEntities = this.cliApi.queryEntities({ kind: 'cron' });\n\n // Get plugin roots for handler path resolution\n const pluginRoots = new Map<string, string>();\n for (const plugin of this.cliApi.listPlugins()) {\n pluginRoots.set(plugin.id, plugin.source.path);\n }\n\n const allEntities = [\n ...workflowEntities.map(e => ({ entity: e, converter: 'workflow' as const })),\n ...jobEntities.map(e => ({ entity: e, converter: 'job' as const })),\n ...cronEntities.map(e => ({ entity: e, converter: 'cron' as const })),\n ];\n\n for (const { entity, converter } of allEntities) {\n const root = pluginRoots.get(entity.ref.pluginId);\n if (!root) {\n this.platform.logger?.warn('ManifestScanner: Plugin root not found, skipping entity', {\n pluginId: entity.ref.pluginId,\n entityId: entity.ref.entityId,\n kind: entity.ref.kind,\n });\n continue;\n }\n\n try {\n if (converter === 'workflow') {\n workflows.push(this.convertWorkflowHandler(entity.ref.pluginId, entity.declaration as any, root));\n } else if (converter === 'job') {\n workflows.push(this.convertJobHandler(entity.ref.pluginId, entity.declaration as any, root));\n } else {\n workflows.push(this.convertCronSchedule(entity.ref.pluginId, entity.declaration as any, root));\n }\n } catch (err) {\n this.platform.logger?.warn('ManifestScanner: Failed to convert entity', {\n pluginId: entity.ref.pluginId,\n entityId: entity.ref.entityId,\n kind: entity.ref.kind,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n this.platform.logger?.info('ManifestScanner: Discovered workflows via registry', {\n count: workflows.length,\n workflows: workflowEntities.length,\n jobs: jobEntities.length,\n crons: cronEntities.length,\n });\n\n // Cache results (via platform cache)\n if (this.platform.cache) {\n await this.platform.cache.set(cacheKey, workflows, this.cacheTtlMs);\n }\n\n return workflows;\n }\n\n /**\n * Convert workflow handler declaration to WorkflowRuntime.\n */\n private convertWorkflowHandler(\n pluginId: string,\n handler: WorkflowHandlerDecl,\n pluginRoot: string\n ): WorkflowRuntime {\n const id = `${pluginId}/${handler.id}`;\n\n return {\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: handler.describe ?? handler.id,\n description: handler.describe,\n tags: ['plugin', pluginId],\n triggers: [\n { type: 'manual' }, // Workflow handlers can always be triggered manually\n ],\n handler: handler.handler,\n status: 'active',\n permissions: handler.permissions,\n input: handler.input,\n output: handler.output,\n };\n }\n\n /**\n * Convert job handler declaration to WorkflowRuntime.\n */\n private convertJobHandler(\n pluginId: string,\n handler: JobHandlerDecl,\n pluginRoot: string\n ): WorkflowRuntime {\n const id = `${pluginId}:job:${handler.id}`;\n\n return {\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: handler.describe ?? handler.id,\n description: handler.describe,\n tags: ['plugin', 'job', pluginId],\n triggers: [\n { type: 'manual' }, // Job handlers are invoked on-demand via ctx.api.jobs.submit()\n ],\n handler: handler.handler,\n status: 'active',\n permissions: handler.permissions,\n input: handler.input,\n output: handler.output,\n };\n }\n\n /**\n * Convert cron schedule declaration to WorkflowRuntime.\n */\n private convertCronSchedule(\n pluginId: string,\n cronDecl: CronDecl,\n pluginRoot: string\n ): WorkflowRuntime {\n const id = `${pluginId}:cron:${cronDecl.id}`;\n\n const schedule: WorkflowSchedule = {\n cron: cronDecl.schedule,\n enabled: cronDecl.enabled ?? true,\n };\n\n return {\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: cronDecl.describe ?? cronDecl.id,\n description: cronDecl.describe,\n tags: ['plugin', 'cron', pluginId],\n triggers: [\n {\n type: 'schedule',\n config: { cron: cronDecl.schedule, timezone: cronDecl.timezone },\n },\n ],\n // Note: Cron schedules reference a job type to execute\n // The actual handler path comes from the job declaration\n handler: undefined, // Will be resolved at execution time via job type\n schedule,\n status: (cronDecl.enabled ?? true) ? 'active' : 'disabled',\n permissions: cronDecl.permissions,\n };\n }\n\n // Legacy convertLegacyJob method removed - use cron schedules instead\n\n /**\n * Scan all installed plugins for job handlers only.\n *\n * Returns information needed to register handlers in JobManager.\n */\n async scanJobHandlers(): Promise<Array<{\n pluginId: string;\n pluginVersion: string;\n pluginRoot: string;\n handler: JobHandlerDecl;\n }>> {\n const snapshot = this.cliApi.snapshot();\n const jobHandlers: Array<{\n pluginId: string;\n pluginVersion: string;\n pluginRoot: string;\n handler: JobHandlerDecl;\n }> = [];\n\n for (const entry of snapshot.manifests ?? []) {\n const handlers = entry.manifest.jobs?.handlers ?? [];\n for (const handler of handlers) {\n jobHandlers.push({\n pluginId: entry.pluginId,\n pluginVersion: entry.manifest.version,\n pluginRoot: entry.pluginRoot,\n handler,\n });\n }\n }\n\n this.platform.logger?.debug('ManifestScanner: Discovered job handlers', {\n count: jobHandlers.length,\n });\n\n return jobHandlers;\n }\n\n /**\n * Clear cache (useful for testing or force refresh).\n */\n async clearCache(): Promise<void> {\n if (this.platform.cache) {\n await this.platform.cache.delete('manifest-scanner:workflows');\n this.platform.logger?.debug('ManifestScanner: Cache cleared');\n }\n }\n\n /**\n * Watch for plugin changes and invalidate cache.\n *\n * @param callback Optional callback when workflows change\n * @returns Unsubscribe function\n */\n watchPlugins(callback?: (workflows: WorkflowRuntime[]) => void): () => void {\n return this.cliApi.onChange(async () => {\n // Invalidate cache on plugin changes\n await this.clearCache();\n\n // Notify callback\n if (callback) {\n const workflows = await this.scanPlugins();\n callback(workflows);\n }\n });\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/workflow-repository\n *\n * Repository for standalone workflow definitions.\n *\n * ## Features\n * - CRUD operations for user-created workflows\n * - File-based storage via platform.storage (`.kb/workflows/*.yaml`)\n * - Validation using WorkflowSpecSchema\n * - Conversion to unified WorkflowRuntime format\n *\n * ## Usage\n * ```typescript\n * const repo = new WorkflowRepository({ platform });\n * const workflow = await repo.create(spec);\n * ```\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { readFile, writeFile, readdir, mkdir } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { WorkflowSpecSchema } from '@kb-labs/workflow-contracts';\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport type {\n WorkflowRuntime,\n WorkflowTrigger,\n WorkflowSchedule,\n WorkflowStats,\n} from './manifest-scanner';\n\n/**\n * Stored workflow metadata (what we persist to disk)\n */\ninterface StoredWorkflow {\n id: string;\n spec: WorkflowSpec;\n createdAt: string;\n updatedAt: string;\n status: 'active' | 'paused' | 'disabled';\n stats?: WorkflowStats;\n}\n\n/**\n * List options for filtering workflows\n */\nexport interface WorkflowListOptions {\n status?: 'active' | 'paused' | 'disabled';\n tags?: string[];\n limit?: number;\n offset?: number;\n}\n\n/**\n * Options for WorkflowRepository\n */\nexport interface WorkflowRepositoryOptions {\n /** Platform services (for storage, logger, etc.) */\n platform: PlatformServices;\n\n /** Storage directory for workflows (default: '.kb/workflows') */\n storageDir?: string;\n\n /** Workspace root directory (default: process.cwd()) */\n workspaceRoot?: string;\n}\n\n/**\n * Workflow Repository\n *\n * Manages standalone workflow definitions (user-created via UI/API).\n * Uses platform.storage for persistence.\n */\nexport class WorkflowRepository {\n private readonly platform: PlatformServices;\n private readonly storageDir: string;\n private readonly workspaceRoot: string;\n private readonly absoluteStorageDir: string;\n\n constructor(options: WorkflowRepositoryOptions) {\n this.platform = options.platform;\n this.storageDir = options.storageDir ?? '.kb/workflows';\n this.workspaceRoot = options.workspaceRoot ?? process.cwd();\n this.absoluteStorageDir = resolve(this.workspaceRoot, this.storageDir);\n }\n\n /**\n * Create a new standalone workflow.\n */\n async create(spec: WorkflowSpec): Promise<WorkflowRuntime> {\n // Validate spec\n const validated = WorkflowSpecSchema.parse(spec);\n\n // Generate ID\n const id = `wf-${randomUUID().slice(0, 8)}`;\n\n const stored: StoredWorkflow = {\n id,\n spec: validated,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: 'active',\n };\n\n // Save to storage\n await this.saveWorkflow(id, stored);\n\n this.platform.logger?.info('WorkflowRepository: Created workflow', {\n id,\n name: spec.name,\n });\n\n return this.toRuntime(stored);\n }\n\n /**\n * Get workflow by ID.\n */\n async get(id: string): Promise<WorkflowRuntime | null> {\n const stored = await this.loadWorkflow(id);\n return stored ? this.toRuntime(stored) : null;\n }\n\n /**\n * List all workflows with optional filtering.\n */\n async list(options?: WorkflowListOptions): Promise<WorkflowRuntime[]> {\n const allFiles = await this.listWorkflowFiles();\n\n // Load all workflows in parallel\n const allWorkflows = await Promise.all(\n allFiles.map(async filename => {\n const id = filename.replace(/\\.(yaml|yml)$/, '');\n const stored = await this.loadWorkflow(id);\n return stored ? this.toRuntime(stored) : null;\n }),\n );\n\n // Filter out nulls and apply status filter\n const workflows = allWorkflows.filter((workflow): workflow is WorkflowRuntime => {\n if (!workflow) {return false;}\n if (options?.status && workflow.status !== options.status) {return false;}\n return true;\n });\n\n // Apply pagination\n if (options?.offset !== undefined || options?.limit !== undefined) {\n const start = options.offset ?? 0;\n const end = options.limit ? start + options.limit : undefined;\n return workflows.slice(start, end);\n }\n\n return workflows;\n }\n\n /**\n * Update existing workflow.\n */\n async update(id: string, spec: Partial<WorkflowSpec>): Promise<WorkflowRuntime> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n // Merge with existing spec\n const updatedSpec = { ...stored.spec, ...spec };\n\n // Validate merged spec\n const validated = WorkflowSpecSchema.parse(updatedSpec);\n\n const updated: StoredWorkflow = {\n ...stored,\n spec: validated,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n\n this.platform.logger?.info('WorkflowRepository: Updated workflow', {\n id,\n name: validated.name,\n });\n\n return this.toRuntime(updated);\n }\n\n /**\n * Delete workflow.\n */\n async delete(id: string): Promise<void> {\n const path = this.getWorkflowPath(id);\n\n try {\n await this.platform.storage.delete(path);\n this.platform.logger?.info('WorkflowRepository: Deleted workflow', { id });\n } catch (error) {\n this.platform.logger?.error(\n 'WorkflowRepository: Delete failed',\n error instanceof Error ? error : undefined,\n { id }\n );\n throw error;\n }\n }\n\n /**\n * Enable workflow (set status to active).\n */\n async enable(id: string): Promise<void> {\n await this.updateStatus(id, 'active');\n }\n\n /**\n * Disable workflow.\n */\n async disable(id: string): Promise<void> {\n await this.updateStatus(id, 'disabled');\n }\n\n /**\n * Pause workflow.\n */\n async pause(id: string): Promise<void> {\n await this.updateStatus(id, 'paused');\n }\n\n /**\n * Resume workflow (unpause).\n */\n async resume(id: string): Promise<void> {\n await this.updateStatus(id, 'active');\n }\n\n /**\n * Update workflow statistics.\n */\n async updateStats(id: string, stats: Partial<WorkflowStats>): Promise<void> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n const updated: StoredWorkflow = {\n ...stored,\n stats: { ...stored.stats, ...stats } as WorkflowStats,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n private async updateStatus(\n id: string,\n status: 'active' | 'paused' | 'disabled'\n ): Promise<void> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n const updated: StoredWorkflow = {\n ...stored,\n status,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n this.platform.logger?.info('WorkflowRepository: Updated workflow status', {\n id,\n status,\n });\n }\n\n private getWorkflowPath(id: string): string {\n // Try .yml first, then .yaml\n const ymlPath = join(this.absoluteStorageDir, `${id}.yml`);\n const yamlPath = join(this.absoluteStorageDir, `${id}.yaml`);\n\n if (existsSync(ymlPath)) {\n return ymlPath;\n }\n return yamlPath; // Default to .yaml for new files\n }\n\n private async saveWorkflow(id: string, workflow: StoredWorkflow): Promise<void> {\n const path = this.getWorkflowPath(id);\n const yaml = stringifyYaml(workflow, { indent: 2 });\n\n try {\n // Ensure directory exists\n if (!existsSync(this.absoluteStorageDir)) {\n await mkdir(this.absoluteStorageDir, { recursive: true });\n }\n\n await writeFile(path, yaml, 'utf-8');\n } catch (error) {\n this.platform.logger?.error(\n 'WorkflowRepository: Save failed',\n error instanceof Error ? error : undefined,\n { path }\n );\n throw error;\n }\n }\n\n private async loadWorkflow(id: string): Promise<StoredWorkflow | null> {\n const path = this.getWorkflowPath(id);\n\n try {\n if (!existsSync(path)) {\n return null;\n }\n\n const content = await readFile(path, 'utf-8');\n const parsed = parseYaml(content) as any;\n\n // Check if it's already in StoredWorkflow format\n if (parsed.id && parsed.spec && parsed.createdAt) {\n return parsed as StoredWorkflow;\n }\n\n // Otherwise, it's a simple workflow YAML - convert to StoredWorkflow\n const spec: WorkflowSpec = {\n name: parsed.name,\n version: parsed.version || '1.0.0',\n description: parsed.description,\n on: parsed.on || { manual: true },\n isolation: parsed.isolation,\n inputs: parsed.inputs,\n jobs: parsed.jobs,\n env: parsed.env,\n secrets: parsed.secrets,\n };\n\n const stored: StoredWorkflow = {\n id: parsed.id || id,\n spec,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: 'active',\n };\n\n return stored;\n } catch (error) {\n // File not found is expected, other errors should be logged\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n\n this.platform.logger?.error(\n 'WorkflowRepository: Load failed',\n error instanceof Error ? error : undefined,\n { path }\n );\n return null;\n }\n }\n\n private async listWorkflowFiles(): Promise<string[]> {\n try {\n // Check if directory exists\n if (!existsSync(this.absoluteStorageDir)) {\n return [];\n }\n\n // List all .yaml and .yml files in storage directory\n const files = await readdir(this.absoluteStorageDir);\n return files.filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'));\n } catch (error) {\n // Directory doesn't exist yet - return empty array\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return [];\n }\n\n this.platform.logger?.error(\n 'WorkflowRepository: List failed',\n error instanceof Error ? error : undefined\n );\n return [];\n }\n }\n\n /**\n * Convert stored workflow to WorkflowRuntime format.\n */\n private toRuntime(stored: StoredWorkflow): WorkflowRuntime {\n const { id, spec, status, stats } = stored;\n\n // Convert triggers from spec.on to WorkflowTrigger[]\n const triggers: WorkflowTrigger[] = [];\n if (spec.on.manual) {\n triggers.push({ type: 'manual' });\n }\n if (spec.on.push) {\n triggers.push({ type: 'push' });\n }\n if (spec.on.webhook) {\n triggers.push({\n type: 'webhook',\n config: typeof spec.on.webhook === 'object' ? spec.on.webhook : undefined,\n });\n }\n\n // Extract schedule if present\n let schedule: WorkflowSchedule | undefined;\n if (spec.on.schedule) {\n triggers.push({\n type: 'schedule',\n config: spec.on.schedule,\n });\n\n schedule = {\n cron: spec.on.schedule.cron,\n enabled: status === 'active',\n };\n }\n\n // Extract tags from spec (we can use env vars or description as source)\n const tags: string[] = ['standalone'];\n if (spec.description) {\n // Extract hashtags from description\n const hashtagMatches = spec.description.match(/#\\w+/g);\n if (hashtagMatches) {\n tags.push(...hashtagMatches.map((t) => t.slice(1)));\n }\n }\n\n return {\n id,\n source: 'standalone',\n name: spec.name,\n description: spec.description,\n tags,\n triggers,\n schedule,\n status,\n stats,\n // Store full spec for execution\n input: spec,\n // Expose declared input schema for REST API / Studio UI\n inputSchema: spec.inputs,\n };\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/workflow-service\n *\n * Unified service for managing all workflows (manifest-based + standalone).\n *\n * ## Features\n * - Combines ManifestScanner and WorkflowRepository\n * - Unified interface for listing/getting workflows from both sources\n * - Provides available handlers for UI autocomplete\n * - Validates workflow specs\n *\n * ## Usage\n * ```typescript\n * const service = new WorkflowService({ cliApi, platform });\n * const allWorkflows = await service.listAll();\n * const workflow = await service.get('release-manager/create-release');\n * ```\n */\n\nimport { WorkflowSpecSchema } from '@kb-labs/workflow-contracts';\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport { ManifestScanner, type WorkflowRuntime } from './manifest-scanner';\nimport { WorkflowRepository, type WorkflowListOptions } from './workflow-repository';\n\n/**\n * Handler information for UI autocomplete\n */\nexport interface WorkflowHandlerInfo {\n /** Handler ID (e.g., \"release-manager/create-release\") */\n id: string;\n /** Plugin ID */\n pluginId: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Input schema */\n inputSchema?: unknown;\n /** Output schema */\n outputSchema?: unknown;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n errors?: Array<{ path: string; message: string }>;\n}\n\n/**\n * List options for workflows\n */\nexport interface WorkflowServiceListOptions extends WorkflowListOptions {\n /** Filter by source type */\n source?: 'manifest' | 'standalone';\n}\n\n/**\n * Options for WorkflowService\n */\nexport interface WorkflowServiceOptions {\n /** CLI API for plugin manifest scanning */\n cliApi: IEntityRegistry;\n\n /** Platform services */\n platform: PlatformServices;\n\n /** Cache TTL for manifest scanner (ms) */\n manifestCacheTtlMs?: number;\n\n /** Storage directory for standalone workflows */\n workflowStorageDir?: string;\n\n /** Workspace root directory (default: process.cwd()) */\n workspaceRoot?: string;\n}\n\n/**\n * Unified Workflow Service\n *\n * Combines manifest-based and standalone workflows into a single interface.\n */\nexport class WorkflowService {\n private readonly scanner: ManifestScanner;\n private readonly repository: WorkflowRepository;\n private readonly platform: PlatformServices;\n\n constructor(options: WorkflowServiceOptions) {\n this.platform = options.platform;\n\n this.scanner = new ManifestScanner({\n cliApi: options.cliApi,\n platform: options.platform,\n cacheTtlMs: options.manifestCacheTtlMs,\n });\n\n this.repository = new WorkflowRepository({\n platform: options.platform,\n storageDir: options.workflowStorageDir,\n workspaceRoot: options.workspaceRoot,\n });\n }\n\n /**\n * List all workflows (manifest + standalone).\n */\n async listAll(options?: WorkflowServiceListOptions): Promise<WorkflowRuntime[]> {\n const workflows: WorkflowRuntime[] = [];\n\n // Get manifest-based workflows\n if (!options?.source || options.source === 'manifest') {\n const manifestWorkflows = await this.scanner.scanPlugins();\n workflows.push(...manifestWorkflows);\n }\n\n // Get standalone workflows\n if (!options?.source || options.source === 'standalone') {\n const standaloneWorkflows = await this.repository.list(options);\n workflows.push(...standaloneWorkflows);\n }\n\n // Apply filters\n let filtered = workflows;\n\n if (options?.status) {\n filtered = filtered.filter((w) => w.status === options.status);\n }\n\n if (options?.tags && options.tags.length > 0) {\n filtered = filtered.filter((w) =>\n options.tags!.some((tag) => w.tags?.includes(tag))\n );\n }\n\n // Sort by name\n filtered.sort((a, b) => a.name.localeCompare(b.name));\n\n this.platform.logger?.debug('WorkflowService: Listed workflows', {\n total: filtered.length,\n manifest: filtered.filter((w) => w.source === 'manifest').length,\n standalone: filtered.filter((w) => w.source === 'standalone').length,\n });\n\n return filtered;\n }\n\n /**\n * Get workflow by ID (from either source).\n */\n async get(id: string): Promise<WorkflowRuntime | null> {\n // Try standalone first (faster, direct lookup)\n const standalone = await this.repository.get(id);\n if (standalone) {\n return standalone;\n }\n\n // Try manifest-based (requires full scan)\n const manifestWorkflows = await this.scanner.scanPlugins();\n const manifest = manifestWorkflows.find((w) => w.id === id);\n\n return manifest ?? null;\n }\n\n /**\n * Create standalone workflow.\n */\n async create(spec: WorkflowSpec): Promise<WorkflowRuntime> {\n this.platform.logger?.info('WorkflowService: Creating workflow', {\n name: spec.name,\n });\n\n return this.repository.create(spec);\n }\n\n /**\n * Update standalone workflow.\n */\n async update(id: string, spec: Partial<WorkflowSpec>): Promise<WorkflowRuntime> {\n // Verify it's a standalone workflow\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot update manifest-based workflow: ${id}`);\n }\n\n this.platform.logger?.info('WorkflowService: Updating workflow', { id });\n\n return this.repository.update(id, spec);\n }\n\n /**\n * Delete standalone workflow.\n */\n async delete(id: string): Promise<void> {\n // Verify it's a standalone workflow\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot delete manifest-based workflow: ${id}`);\n }\n\n this.platform.logger?.info('WorkflowService: Deleting workflow', { id });\n\n await this.repository.delete(id);\n }\n\n /**\n * Enable workflow (set status to active).\n */\n async enable(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot enable manifest-based workflow: ${id}`);\n }\n\n await this.repository.enable(id);\n }\n\n /**\n * Disable workflow.\n */\n async disable(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot disable manifest-based workflow: ${id}`);\n }\n\n await this.repository.disable(id);\n }\n\n /**\n * Pause workflow.\n */\n async pause(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot pause manifest-based workflow: ${id}`);\n }\n\n await this.repository.pause(id);\n }\n\n /**\n * Resume workflow (unpause).\n */\n async resume(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot resume manifest-based workflow: ${id}`);\n }\n\n await this.repository.resume(id);\n }\n\n /**\n * Get available workflow handlers (for UI autocomplete).\n *\n * Returns manifest-based handlers that can be used in standalone workflows\n * (via `uses: \"plugin:id/handler\"`).\n */\n async getAvailableHandlers(): Promise<WorkflowHandlerInfo[]> {\n const manifestWorkflows = await this.scanner.scanPlugins();\n\n const handlers = manifestWorkflows\n .filter((w) => w.source === 'manifest' && w.handler)\n .map((w) => ({\n id: w.id,\n pluginId: w.pluginId!,\n name: w.name,\n description: w.description,\n inputSchema: w.input,\n outputSchema: w.output,\n }));\n\n this.platform.logger?.debug('WorkflowService: Listed handlers', {\n count: handlers.length,\n });\n\n return handlers;\n }\n\n /**\n * Validate workflow spec.\n */\n validate(spec: WorkflowSpec): ValidationResult {\n try {\n WorkflowSpecSchema.parse(spec);\n return { valid: true };\n } catch (error) {\n if (error && typeof error === 'object' && 'errors' in error) {\n const zodError = error as { errors: Array<{ path: (string | number)[]; message: string }> };\n return {\n valid: false,\n errors: zodError.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n };\n }\n\n return {\n valid: false,\n errors: [{ path: '', message: 'Validation failed' }],\n };\n }\n }\n\n /**\n * Refresh manifest scanner cache (force re-scan).\n */\n async refreshManifests(): Promise<void> {\n await this.scanner.clearCache();\n this.platform.logger?.info('WorkflowService: Manifest cache cleared');\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/workflow-schedule-manager\n *\n * Manages scheduled workflow execution via CronManager.\n *\n * ## Features\n * - Registers scheduled workflows with CronManager\n * - Executes workflows on cron triggers\n * - Tracks next/last run times\n * - Supports both manifest-based jobs and standalone workflows\n *\n * ## Usage\n * ```typescript\n * const scheduleManager = new WorkflowScheduleManager({\n * cronManager,\n * workflowService,\n * executor,\n * platform,\n * });\n *\n * await scheduleManager.registerAll();\n * ```\n */\n\nimport type { ICronManager, CronExpression } from '@kb-labs/core-platform';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport type { WorkflowService } from './workflow-service';\nimport type { WorkflowRuntime } from './manifest-scanner';\n\n/**\n * Workflow executor interface.\n * Executes workflows (will be implemented by workflow engine).\n */\nexport interface WorkflowExecutor {\n /**\n * Execute workflow by ID.\n */\n execute(request: {\n workflowId: string;\n trigger: 'manual' | 'schedule' | 'webhook' | 'push';\n input?: Record<string, unknown>;\n }): Promise<{ runId: string }>;\n}\n\n/**\n * Options for WorkflowScheduleManager\n */\nexport interface WorkflowScheduleManagerOptions {\n /** CronManager instance */\n cronManager: ICronManager;\n\n /** WorkflowService for discovering workflows */\n workflowService: WorkflowService;\n\n /** Workflow executor */\n executor: WorkflowExecutor;\n\n /** Platform services */\n platform: PlatformServices;\n}\n\n/**\n * Workflow Schedule Manager\n *\n * Integrates workflows with CronManager for scheduled execution.\n */\nexport class WorkflowScheduleManager {\n private readonly cronManager: ICronManager;\n private readonly workflowService: WorkflowService;\n private readonly executor: WorkflowExecutor;\n private readonly platform: PlatformServices;\n\n constructor(options: WorkflowScheduleManagerOptions) {\n this.cronManager = options.cronManager;\n this.workflowService = options.workflowService;\n this.executor = options.executor;\n this.platform = options.platform;\n }\n\n /**\n * Register all scheduled workflows with CronManager.\n *\n * Scans both manifest-based jobs and standalone workflows with schedules.\n */\n async registerAll(): Promise<void> {\n const workflows = await this.workflowService.listAll();\n\n const scheduled = workflows.filter(\n (w) => w.schedule && w.schedule.enabled && w.status === 'active'\n );\n\n this.platform.logger?.info('WorkflowScheduleManager: Registering scheduled workflows', {\n total: workflows.length,\n scheduled: scheduled.length,\n });\n\n // Register all workflows in parallel\n await Promise.all(scheduled.map(workflow => this.register(workflow)));\n }\n\n /**\n * Register single workflow schedule.\n */\n async register(workflow: WorkflowRuntime): Promise<void> {\n if (!workflow.schedule || !workflow.schedule.enabled) {\n this.platform.logger?.warn('WorkflowScheduleManager: Cannot register workflow without schedule', {\n id: workflow.id,\n });\n return;\n }\n\n const cronId = this.getCronId(workflow.id);\n const schedule = workflow.schedule.cron as CronExpression;\n\n this.cronManager.register(cronId, schedule, async (context) => {\n this.platform.logger?.info('WorkflowScheduleManager: Executing scheduled workflow', {\n workflowId: workflow.id,\n workflowName: workflow.name,\n runCount: context.runCount,\n });\n\n try {\n const result = await this.executor.execute({\n workflowId: workflow.id,\n trigger: 'schedule',\n input: {},\n });\n\n this.platform.logger?.info('WorkflowScheduleManager: Workflow execution started', {\n workflowId: workflow.id,\n runId: result.runId,\n });\n } catch (error) {\n this.platform.logger?.error(\n 'WorkflowScheduleManager: Workflow execution failed',\n error instanceof Error ? error : undefined,\n {\n workflowId: workflow.id,\n workflowName: workflow.name,\n }\n );\n }\n });\n\n this.platform.logger?.debug('WorkflowScheduleManager: Registered workflow', {\n workflowId: workflow.id,\n schedule: schedule,\n });\n }\n\n /**\n * Unregister workflow schedule.\n */\n async unregister(workflowId: string): Promise<void> {\n const cronId = this.getCronId(workflowId);\n this.cronManager.unregister(cronId);\n\n this.platform.logger?.debug('WorkflowScheduleManager: Unregistered workflow', {\n workflowId,\n });\n }\n\n /**\n * Re-register all schedules (refresh).\n *\n * Useful after workflow changes or service restart.\n */\n async refresh(): Promise<void> {\n // Unregister all workflow cron jobs\n const allJobs = this.cronManager.list();\n for (const job of allJobs) {\n if (job.id.startsWith('workflow:')) {\n this.cronManager.unregister(job.id);\n }\n }\n\n // Re-register all\n await this.registerAll();\n\n this.platform.logger?.info('WorkflowScheduleManager: Refreshed all schedules');\n }\n\n /**\n * Get next run time for scheduled workflow.\n */\n getNextRun(workflowId: string): Date | null {\n const cronId = this.getCronId(workflowId);\n const job = this.cronManager.list().find((j) => j.id === cronId);\n return job?.nextRun ?? null;\n }\n\n /**\n * Get last run time for scheduled workflow.\n */\n getLastRun(workflowId: string): Date | null {\n const cronId = this.getCronId(workflowId);\n const job = this.cronManager.list().find((j) => j.id === cronId);\n return job?.lastRun ?? null;\n }\n\n /**\n * Pause scheduled workflow.\n */\n pause(workflowId: string): void {\n const cronId = this.getCronId(workflowId);\n this.cronManager.pause(cronId);\n\n this.platform.logger?.info('WorkflowScheduleManager: Paused workflow schedule', {\n workflowId,\n });\n }\n\n /**\n * Resume paused workflow schedule.\n */\n resume(workflowId: string): void {\n const cronId = this.getCronId(workflowId);\n this.cronManager.resume(cronId);\n\n this.platform.logger?.info('WorkflowScheduleManager: Resumed workflow schedule', {\n workflowId,\n });\n }\n\n /**\n * List all scheduled workflows.\n */\n listScheduled(): Array<{\n workflowId: string;\n schedule: string;\n status: 'active' | 'paused';\n lastRun?: Date;\n nextRun?: Date;\n runCount: number;\n }> {\n return this.cronManager\n .list()\n .filter((job) => job.id.startsWith('workflow:'))\n .map((job) => ({\n workflowId: this.getWorkflowId(job.id),\n schedule: job.schedule,\n status: job.status,\n lastRun: job.lastRun,\n nextRun: job.nextRun,\n runCount: job.runCount,\n }));\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n private getCronId(workflowId: string): string {\n return `workflow:${workflowId}`;\n }\n\n private getWorkflowId(cronId: string): string {\n return cronId.replace('workflow:', '');\n }\n}\n","import { readFile, readdir } from 'node:fs/promises'\nimport { resolve, join, basename } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts'\nimport type { ILogger } from '@kb-labs/core-platform'\nimport { WorkflowLoader } from './workflow-loader'\n\nexport interface WorkflowRegistryEntry {\n id: string\n name: string\n description?: string\n filePath: string\n spec: WorkflowSpec\n metadata?: Record<string, unknown>\n}\n\nexport interface WorkflowRegistryOptions {\n scanDirs: string[]\n cwd?: string\n logger: ILogger\n}\n\n/**\n * WorkflowRegistry - Auto-discovery and indexing of workflow definitions\n *\n * Scans directories for .yml workflow files and indexes them by ID.\n * Provides clean API for finding and running workflows.\n */\nexport class WorkflowRegistry {\n private entries = new Map<string, WorkflowRegistryEntry>()\n private loader: WorkflowLoader\n\n constructor(private readonly options: WorkflowRegistryOptions) {\n this.loader = new WorkflowLoader(options.logger)\n }\n\n /**\n * Scan configured directories and index all workflow files\n */\n async scan(): Promise<void> {\n this.entries.clear()\n\n const cwd = this.options.cwd ?? process.cwd()\n this.options.logger.info('Starting workflow discovery', {\n scanDirs: this.options.scanDirs,\n cwd,\n })\n\n // Sequential directory scanning - each directory is independent but readdir is async\n for (const dir of this.options.scanDirs) {\n const absoluteDir = resolve(cwd, dir)\n\n if (!existsSync(absoluteDir)) {\n this.options.logger.debug(`Directory not found, skipping`, { dir: absoluteDir })\n continue\n }\n\n try {\n const files = await readdir(absoluteDir) // eslint-disable-line no-await-in-loop\n const yamlFiles = files.filter(f => f.endsWith('.yml') || f.endsWith('.yaml'))\n\n this.options.logger.debug(`Found workflow files`, {\n dir: absoluteDir,\n count: yamlFiles.length,\n })\n\n // Index all files in parallel\n await Promise.all( // eslint-disable-line no-await-in-loop\n yamlFiles.map(file => {\n const filePath = join(absoluteDir, file)\n return this.indexFile(filePath)\n }),\n )\n } catch (error) {\n this.options.logger.warn(`Failed to scan directory`, {\n dir: absoluteDir,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n this.options.logger.info('Workflow discovery complete', {\n totalWorkflows: this.entries.size,\n ids: Array.from(this.entries.keys()),\n })\n }\n\n /**\n * Index a single workflow file\n */\n private async indexFile(filePath: string): Promise<void> {\n try {\n const raw = await readFile(filePath, 'utf8')\n const parsed = this.parseWorkflowFile(raw)\n\n // Extract ID from parsed file or use filename as fallback\n const id = parsed.id || basename(filePath, '.yml').replace('.yaml', '')\n\n // Convert to WorkflowSpec format\n const spec: WorkflowSpec = {\n name: parsed.name,\n version: '1.0.0',\n description: parsed.description,\n on: parsed.on || { manual: true }, // Default to manual trigger if not specified\n isolation: parsed.isolation,\n jobs: parsed.jobs,\n env: parsed.env,\n secrets: parsed.secrets,\n }\n\n const entry: WorkflowRegistryEntry = {\n id,\n name: parsed.name,\n description: parsed.description,\n filePath,\n spec,\n metadata: parsed.metadata,\n }\n\n this.entries.set(id, entry)\n\n this.options.logger.debug(`Indexed workflow`, {\n id,\n name: parsed.name,\n filePath,\n })\n } catch (error) {\n this.options.logger.warn(`Failed to index workflow file`, {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n /**\n * Parse workflow file (YAML format with additional fields)\n */\n private parseWorkflowFile(raw: string): any {\n const trimmed = raw.trim()\n if (!trimmed) {\n throw new Error('Workflow file is empty')\n }\n\n // Use WorkflowLoader's parse logic but return raw parsed object\n // We need the extra fields (id, schedule, etc) that aren't in WorkflowSpec\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { parse } = require('yaml')\n return parse(trimmed)\n }\n\n /**\n * Get workflow by ID\n */\n get(id: string): WorkflowRegistryEntry | undefined {\n return this.entries.get(id)\n }\n\n /**\n * List all registered workflows\n */\n list(): WorkflowRegistryEntry[] {\n return Array.from(this.entries.values())\n }\n\n /**\n * Check if workflow exists\n */\n has(id: string): boolean {\n return this.entries.has(id)\n }\n\n /**\n * Get workflow spec by ID\n */\n getSpec(id: string): WorkflowSpec | undefined {\n const entry = this.entries.get(id)\n return entry?.spec\n }\n\n /**\n * Clear all indexed workflows\n */\n clear(): void {\n this.entries.clear()\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/job-manager\n * Job manager for background task execution with sandboxed handlers.\n */\n\nimport type {\n IJobScheduler,\n JobDefinition,\n JobHandle,\n JobStatus,\n JobFilter,\n CronExpression,\n ICache,\n ILogger,\n IEventBus,\n} from '@kb-labs/core-platform';\nimport type { JobHandlerDecl, PluginContextDescriptor } from '@kb-labs/plugin-contracts';\nimport type { IExecutionBackend, ExecutionRequest } from '@kb-labs/core-contracts';\nimport { nanoid } from 'nanoid';\n\n/**\n * Job handler registry entry.\n */\ninterface JobHandlerRegistry {\n pluginId: string;\n jobId: string;\n handlerPath: string;\n config: JobHandlerDecl;\n pluginRoot: string;\n pluginVersion: string;\n}\n\n/**\n * Internal job record stored in cache.\n */\ninterface JobRecord {\n id: string;\n type: string;\n payload: unknown;\n tenantId: string;\n status: JobStatus;\n priority: number;\n maxRetries: number;\n timeout: number;\n attempt: number;\n progress: number;\n result?: unknown;\n error?: string;\n createdAt: string;\n startedAt?: string;\n completedAt?: string;\n runAt?: string;\n idempotencyKey?: string;\n}\n\n/**\n * Job queue entry for scheduling.\n */\ninterface JobQueueEntry {\n jobId: string;\n priority: number;\n availableAt: number;\n}\n\nexport interface JobManagerConfig {\n /** Execution backend for sandboxed handler execution */\n executionBackend?: IExecutionBackend<PluginContextDescriptor>;\n /** Default job timeout in ms (default: 300000 = 5 min) */\n defaultTimeout?: number;\n /** Default max retries (default: 3) */\n defaultMaxRetries?: number;\n /** Default priority (default: 50) */\n defaultPriority?: number;\n /** Workspace root (monorepo root) for plugin execution context */\n workspaceRoot?: string;\n}\n\n/**\n * Job manager - handles background job execution with sandboxed handlers.\n *\n * Features:\n * - Declarative job handlers from plugin manifests\n * - Priority-based queue (0-100, higher = more important)\n * - Retry with exponential/linear backoff\n * - Sandboxed subprocess execution via ExecutionBackend\n * - Progress tracking and status updates\n * - Idempotency support\n *\n * Architecture:\n * 1. Plugin declares job handlers in manifest.json\n * 2. Plugin runtime registers handlers via registerJobHandler()\n * 3. Plugin submits jobs via ctx.api.jobs.submit()\n * 4. JobManager enqueues job in priority queue (platform.cache sorted sets)\n * 5. Worker dequeues job and executes via ExecutionBackend.execute()\n * 6. Handler runs in subprocess with JobContext\n * 7. Results stored in cache, events emitted\n */\nexport class JobManager implements IJobScheduler {\n private handlerRegistry = new Map<string, JobHandlerRegistry>();\n private readonly defaultTimeout: number;\n private readonly defaultMaxRetries: number;\n private readonly defaultPriority: number;\n private readonly workspaceRoot: string;\n\n constructor(\n private readonly cache: ICache,\n private readonly events: IEventBus,\n private readonly logger: ILogger,\n private readonly config: JobManagerConfig = {}\n ) {\n this.defaultTimeout = config.defaultTimeout ?? 300000; // 5 min\n this.defaultMaxRetries = config.defaultMaxRetries ?? 3;\n this.defaultPriority = config.defaultPriority ?? 50;\n this.workspaceRoot = config.workspaceRoot ?? process.cwd(); // Fallback to process.cwd()\n }\n\n /**\n * Register job handler from plugin manifest.\n *\n * Called by plugin-runtime during plugin initialization.\n *\n * @param pluginId - Plugin identifier\n * @param pluginVersion - Plugin version\n * @param pluginRoot - Plugin root directory\n * @param handlerDecl - Job handler declaration from manifest\n */\n registerJobHandler(\n pluginId: string,\n pluginVersion: string,\n pluginRoot: string,\n handlerDecl: JobHandlerDecl\n ): void {\n const jobType = `${pluginId}:${handlerDecl.id}`;\n\n if (this.handlerRegistry.has(jobType)) {\n this.logger.warn('Job handler already registered, overwriting', {\n jobType,\n pluginId,\n jobId: handlerDecl.id,\n });\n }\n\n this.handlerRegistry.set(jobType, {\n pluginId,\n jobId: handlerDecl.id,\n handlerPath: handlerDecl.handler,\n config: handlerDecl,\n pluginRoot,\n pluginVersion,\n });\n\n this.logger.info('Registered job handler', {\n jobType,\n handler: handlerDecl.handler,\n });\n }\n\n /**\n * Submit a job for immediate execution.\n */\n async submit(job: JobDefinition): Promise<JobHandle> {\n // Validate handler exists\n const handlerEntry = this.handlerRegistry.get(job.type);\n if (!handlerEntry) {\n throw new Error(`Job handler not found: ${job.type}`);\n }\n\n // Check idempotency\n if (job.idempotencyKey) {\n const existing = await this.findByIdempotencyKey(job.idempotencyKey);\n if (existing) {\n this.logger.info('Job already submitted (idempotent)', {\n idempotencyKey: job.idempotencyKey,\n existingJobId: existing.id,\n });\n return this.jobRecordToHandle(existing);\n }\n }\n\n // Create job record\n const jobId = nanoid();\n const now = new Date();\n const record: JobRecord = {\n id: jobId,\n type: job.type,\n payload: job.payload,\n tenantId: job.tenantId ?? 'default',\n status: 'pending',\n priority: job.priority ?? this.defaultPriority,\n maxRetries: job.maxRetries ?? handlerEntry.config.maxRetries ?? this.defaultMaxRetries,\n timeout: job.timeout ?? handlerEntry.config.timeout ?? this.defaultTimeout,\n attempt: 0,\n progress: 0,\n createdAt: now.toISOString(),\n runAt: job.runAt?.toISOString(),\n idempotencyKey: job.idempotencyKey,\n };\n\n // Store job record\n await this.saveJobRecord(record);\n\n // Enqueue for execution\n const availableAt = job.runAt ? job.runAt.getTime() : Date.now();\n await this.enqueueJob(jobId, record.priority, availableAt);\n\n this.logger.info('Job submitted', {\n jobId,\n type: job.type,\n tenantId: record.tenantId,\n priority: record.priority,\n });\n\n // Emit event\n await this.events.publish('job.submitted', {\n jobId,\n type: job.type,\n tenantId: record.tenantId,\n });\n\n return this.jobRecordToHandle(record);\n }\n\n /**\n * Schedule a job for future/recurring execution.\n */\n async schedule(job: JobDefinition, schedule: CronExpression | Date): Promise<JobHandle> {\n if (schedule instanceof Date) {\n // One-time scheduled job\n return this.submit({ ...job, runAt: schedule });\n }\n\n // TODO: Cron scheduling - integrate with CronManager\n throw new Error('Cron scheduling not yet implemented');\n }\n\n /**\n * Cancel a pending/running job.\n */\n async cancel(jobId: string): Promise<boolean> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n return false;\n }\n\n if (record.status === 'completed' || record.status === 'failed' || record.status === 'cancelled') {\n this.logger.warn('Cannot cancel job in terminal state', {\n jobId,\n status: record.status,\n });\n return false;\n }\n\n // Update status\n record.status = 'cancelled';\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n // Remove from queue\n await this.removeFromQueue(jobId);\n\n this.logger.info('Job cancelled', { jobId });\n\n // Emit event\n await this.events.publish('job.cancelled', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n });\n\n return true;\n }\n\n /**\n * Get job status.\n */\n async getStatus(jobId: string): Promise<JobHandle | null> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n return null;\n }\n return this.jobRecordToHandle(record);\n }\n\n /**\n * List jobs.\n */\n async list(filter: JobFilter = {}): Promise<JobHandle[]> {\n // TODO: Implement efficient filtering\n // For now, simple scan approach\n const pattern = 'kb:job:*';\n const keys = await this.getAllJobKeys(pattern);\n\n // Fetch all job records in parallel\n const allRecords = await Promise.all(keys.map(key => this.cache.get<JobRecord>(key)));\n\n // Filter out nulls and apply filters\n const records = allRecords.filter((data): data is JobRecord => {\n if (!data) {return false;}\n\n // Apply filters\n if (filter.type && data.type !== filter.type) {return false;}\n if (filter.tenantId && data.tenantId !== filter.tenantId) {return false;}\n if (filter.status && data.status !== filter.status) {return false;}\n\n return true;\n });\n\n // Sort by creation time (newest first)\n records.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n // Pagination\n const offset = filter.offset ?? 0;\n const limit = filter.limit ?? 100;\n const page = records.slice(offset, offset + limit);\n\n return page.map(r => this.jobRecordToHandle(r));\n }\n\n /**\n * Execute a job (called by worker).\n *\n * @internal\n */\n async executeJob(jobId: string): Promise<void> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n this.logger.error('Job not found for execution', undefined, { jobId });\n return;\n }\n\n const handlerEntry = this.handlerRegistry.get(record.type);\n if (!handlerEntry) {\n this.logger.error('Job handler not found', undefined, { jobId, type: record.type });\n await this.markJobFailed(record, 'Handler not found');\n return;\n }\n\n // Check if execution backend is available\n if (!this.config.executionBackend) {\n this.logger.error('ExecutionBackend not configured', undefined, { jobId });\n await this.markJobFailed(record, 'ExecutionBackend not configured');\n return;\n }\n\n // Update status to running\n record.status = 'running';\n record.attempt += 1;\n record.startedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n // Emit event\n await this.events.publish('job.started', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n attempt: record.attempt,\n });\n\n try {\n // Build execution request\n const executionId = `job-${jobId}-${record.attempt}`;\n const traceId = executionId;\n const spanId = executionId;\n const invocationId = executionId;\n\n // Create minimal descriptor for job context\n const descriptor: PluginContextDescriptor = {\n hostType: 'cron',\n hostContext: {\n host: 'cron',\n cronId: record.type,\n schedule: '', // Not available in job context\n scheduledAt: new Date().toISOString(),\n },\n permissions: handlerEntry.config.permissions ?? {},\n pluginId: handlerEntry.pluginId,\n pluginVersion: '0.0.0', // TODO: Get from manifest\n requestId: executionId,\n tenantId: record.tenantId,\n };\n Object.assign(descriptor as unknown as Record<string, unknown>, {\n traceId,\n spanId,\n invocationId,\n executionId,\n });\n\n const request: ExecutionRequest<PluginContextDescriptor> = {\n executionId,\n descriptor,\n pluginRoot: handlerEntry.pluginRoot,\n handlerRef: handlerEntry.handlerPath,\n input: {\n jobId,\n type: record.type,\n input: record.payload,\n tenantId: record.tenantId,\n attempt: record.attempt,\n },\n timeoutMs: record.timeout,\n };\n\n this.logger.debug('Executing job handler', {\n jobId,\n handler: handlerEntry.handlerPath,\n attempt: record.attempt,\n });\n\n // Execute in subprocess\n const result = await this.config.executionBackend.execute(request, {\n signal: undefined, // TODO: Support cancellation\n });\n\n if (result.ok) {\n // Job succeeded\n record.status = 'completed';\n record.result = result.data;\n record.progress = 100;\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n this.logger.info('Job completed', {\n jobId,\n type: record.type,\n duration: result.executionTimeMs,\n });\n\n await this.events.publish('job.completed', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n result: result.data,\n });\n } else {\n // Job failed\n const errorMsg = result.error?.message ?? 'Unknown error';\n await this.handleJobFailure(record, errorMsg);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.logger.error('Job execution failed', undefined, { jobId, error: errorMsg });\n await this.handleJobFailure(record, errorMsg);\n }\n }\n\n /**\n * Update job progress.\n *\n * Called by job handler via ctx.updateProgress()\n */\n async updateProgress(jobId: string, percent: number, message?: string): Promise<void> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n this.logger.warn('Cannot update progress: job not found', { jobId });\n return;\n }\n\n record.progress = Math.max(0, Math.min(100, percent));\n await this.saveJobRecord(record);\n\n await this.events.publish('job.progress', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n progress: record.progress,\n message,\n });\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n private async handleJobFailure(record: JobRecord, errorMsg: string): Promise<void> {\n if (record.attempt < record.maxRetries) {\n // Retry with backoff\n const backoffMs = this.calculateBackoff(record.attempt, record.type);\n const availableAt = Date.now() + backoffMs;\n\n record.status = 'pending';\n await this.saveJobRecord(record);\n await this.enqueueJob(record.id, record.priority, availableAt);\n\n this.logger.info('Job retry scheduled', {\n jobId: record.id,\n attempt: record.attempt,\n maxRetries: record.maxRetries,\n backoffMs,\n });\n\n await this.events.publish('job.retry', {\n jobId: record.id,\n type: record.type,\n tenantId: record.tenantId,\n attempt: record.attempt,\n backoffMs,\n });\n } else {\n // Max retries exceeded\n await this.markJobFailed(record, errorMsg);\n }\n }\n\n private async markJobFailed(record: JobRecord, errorMsg: string): Promise<void> {\n record.status = 'failed';\n record.error = errorMsg;\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n this.logger.error('Job failed', undefined, {\n jobId: record.id,\n type: record.type,\n error: errorMsg,\n attempt: record.attempt,\n });\n\n await this.events.publish('job.failed', {\n jobId: record.id,\n type: record.type,\n tenantId: record.tenantId,\n error: errorMsg,\n });\n }\n\n private calculateBackoff(attempt: number, jobType: string): number {\n const handlerEntry = this.handlerRegistry.get(jobType);\n const strategy = handlerEntry?.config.retryBackoff ?? 'exp';\n\n if (strategy === 'exp') {\n // Exponential: 1s, 2s, 4s, 8s, ...\n return Math.min(1000 * Math.pow(2, attempt), 60000);\n } else {\n // Linear: 5s, 10s, 15s, 20s, ...\n return Math.min(5000 * (attempt + 1), 60000);\n }\n }\n\n private async saveJobRecord(record: JobRecord): Promise<void> {\n const key = `kb:job:${record.id}`;\n await this.cache.set(key, record, 7 * 24 * 60 * 60 * 1000); // 7 days TTL\n }\n\n private async getJobRecord(jobId: string): Promise<JobRecord | null> {\n const key = `kb:job:${jobId}`;\n return this.cache.get<JobRecord>(key);\n }\n\n private async enqueueJob(jobId: string, priority: number, availableAt: number): Promise<void> {\n const entry: JobQueueEntry = {\n jobId,\n priority,\n availableAt,\n };\n await this.cache.zadd('kb:jobqueue', availableAt, JSON.stringify(entry));\n }\n\n private async removeFromQueue(jobId: string): Promise<void> {\n // Scan queue and remove matching entry\n const results = await this.cache.zrangebyscore('kb:jobqueue', 0, Date.now() + 1000000);\n // Sequential search - must break on first match to avoid unnecessary zrem calls\n for (const raw of results) {\n try {\n const entry = JSON.parse(raw) as JobQueueEntry;\n if (entry.jobId === jobId) {\n await this.cache.zrem('kb:jobqueue', raw); // eslint-disable-line no-await-in-loop\n break;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n\n private async findByIdempotencyKey(key: string): Promise<JobRecord | null> {\n // TODO: Implement efficient lookup (maybe secondary index)\n const pattern = 'kb:job:*';\n const keys = await this.getAllJobKeys(pattern);\n\n // Fetch all records in parallel and find match\n const records = await Promise.all(keys.map(k => this.cache.get<JobRecord>(k)));\n\n return records.find(record => record?.idempotencyKey === key) ?? null;\n }\n\n private async getAllJobKeys(_pattern: string): Promise<string[]> {\n // TODO: Implement efficient key scanning\n // For now, this is a placeholder - real implementation would use cache.scan()\n // or maintain a separate index\n return [];\n }\n\n private jobRecordToHandle(record: JobRecord): JobHandle {\n return {\n id: record.id,\n type: record.type,\n tenantId: record.tenantId,\n status: record.status,\n progress: record.progress,\n result: record.result,\n error: record.error,\n createdAt: new Date(record.createdAt),\n startedAt: record.startedAt ? new Date(record.startedAt) : undefined,\n completedAt: record.completedAt ? new Date(record.completedAt) : undefined,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/workflow-loader.ts","../src/state-store.ts","../src/run-coordinator.ts","../src/concurrency-manager.ts","../src/scheduler.ts","../src/secrets.ts","../src/event-bus.ts","../src/retry.ts","../src/run-snapshot.ts","../src/engine.ts","../src/artifact-merger.ts","../src/manifest-scanner.ts","../src/workflow-repository.ts","../src/workflow-service.ts","../src/workflow-schedule-manager.ts","../src/workflow-registry.ts","../src/job-manager.ts"],"names":["parseYaml","job","WORKFLOW_REDIS_CHANNEL","shouldRetry","resolve","WorkflowSpecSchema","randomUUID","join","stringifyYaml","readFile","existsSync","readdir"],"mappings":"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","file":"index.js","sourcesContent":["import { readFile } from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport { parse as parseYaml } from 'yaml'\nimport type { ZodIssue } from 'zod'\nimport {\n type WorkflowSpec,\n WorkflowSpecSchema,\n} from '@kb-labs/workflow-contracts'\nimport type { EngineLogger, WorkflowLoaderResult } from './types'\n\nexport interface WorkflowLoaderOptions {\n cwd?: string\n}\n\nexport class WorkflowLoader {\n constructor(private readonly logger: EngineLogger) {}\n\n async fromFile(\n filePath: string,\n options: WorkflowLoaderOptions = {},\n ): Promise<WorkflowLoaderResult> {\n const cwd = options.cwd ?? process.cwd()\n const absolutePath = resolve(cwd, filePath)\n\n this.logger.debug(`Loading workflow spec from file`, {\n path: absolutePath,\n })\n\n const raw = await readFile(absolutePath, 'utf8')\n const parsed = this.parse(raw, absolutePath)\n return this.validate(parsed, absolutePath)\n }\n\n fromInline(\n spec: unknown,\n source = 'inline',\n ): WorkflowLoaderResult {\n let candidate: unknown = spec\n if (typeof spec === 'string') {\n candidate = this.parse(spec, source)\n }\n return this.validate(candidate, source)\n }\n\n private parse(raw: string, source: string): unknown {\n const trimmed = raw.trim()\n if (!trimmed) {\n throw new Error(`Workflow spec ${source} is empty`)\n }\n\n if (source.endsWith('.json') || trimmed.startsWith('{')) {\n try {\n return JSON.parse(trimmed)\n } catch (error) {\n const message =\n error instanceof Error ? error.message : String(error)\n this.logger.error(`Failed to parse JSON workflow spec from ${source}`, error instanceof Error ? error : undefined, {\n errorMessage: message,\n })\n throw new Error(`Failed to parse workflow spec JSON: ${message}`)\n }\n }\n\n try {\n return parseYaml(trimmed)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n this.logger.error(`Failed to parse YAML workflow spec from ${source}`, error instanceof Error ? error : undefined, {\n errorMessage: message,\n })\n throw new Error(`Failed to parse workflow spec YAML: ${message}`)\n }\n }\n\n private validate(candidate: unknown, source: string): WorkflowLoaderResult {\n const parsed = WorkflowSpecSchema.safeParse(candidate)\n\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map(\n (issue: ZodIssue) =>\n `${issue.path.join('.') || '(root)'}: ${issue.message}`,\n )\n .join('\\n')\n this.logger.warn(`Workflow spec validation failed`, { source, issues })\n throw new Error(`Workflow spec validation failed:\\n${issues}`)\n }\n\n const spec = parsed.data as WorkflowSpec\n return { spec, source }\n }\n}\n\n\n","import type { JobRun, StepRun, WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport class StateStore {\n private readonly cache: ICache\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n ) {\n this.cache = cache\n }\n\n async saveRun(run: WorkflowRun): Promise<void> {\n const key = `kb:run:${run.id}`\n this.logger.debug('Persisting workflow run', { runId: run.id, key })\n\n // Save run data\n await this.cache.set(key, JSON.stringify(run))\n\n // Add to sorted set index (score = createdAt timestamp for time-based ordering)\n const timestamp = new Date(run.createdAt).getTime()\n await this.cache.zadd('workflow:runs:index', timestamp, run.id)\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n const key = `kb:run:${runId}`\n const payload = await this.cache.get<string>(key)\n if (!payload) {\n return null\n }\n try {\n return JSON.parse(payload) as WorkflowRun\n } catch (error) {\n this.logger.error('Failed to parse stored workflow run', error instanceof Error ? error : undefined, {\n runId,\n })\n return null\n }\n }\n\n async deleteRun(runId: string): Promise<void> {\n const key = `kb:run:${runId}`\n\n // Remove from cache\n await this.cache.delete(key)\n\n // Remove from sorted set index\n await this.cache.zrem('workflow:runs:index', runId)\n }\n\n async getAllRunIds(): Promise<string[]> {\n // Get all run IDs from sorted set index (ordered by creation time)\n // Score range: -inf to +inf (all runs)\n const runIds = await this.cache.zrangebyscore('workflow:runs:index', -Infinity, Infinity)\n return runIds ?? []\n }\n\n async updateRun(\n runId: string,\n mutator: (draft: WorkflowRun) => WorkflowRun | void,\n ): Promise<WorkflowRun | null> {\n const run = await this.getRun(runId)\n if (!run) {\n return null\n }\n\n const draft = clone(run)\n const result = mutator(draft)\n const next = (result ?? draft) as WorkflowRun\n await this.saveRun(next)\n return next\n }\n\n async updateJob(\n runId: string,\n jobId: string,\n mutator: (job: JobRun) => JobRun | void,\n ): Promise<JobRun | null> {\n let updatedJob: JobRun | null = null\n\n await this.updateRun(runId, (run) => {\n const index = run.jobs.findIndex((job: JobRun) => job.id === jobId)\n if (index === -1) {\n return\n }\n const existingJob = run.jobs[index]\n if (!existingJob) {\n return\n }\n const jobDraft = clone(existingJob)\n const result = mutator(jobDraft)\n const nextJob = (result ?? jobDraft) as JobRun\n run.jobs[index] = nextJob\n updatedJob = nextJob\n })\n\n return updatedJob\n }\n\n async updateStep(\n runId: string,\n jobId: string,\n stepId: string,\n mutator: (step: StepRun) => StepRun | void,\n ): Promise<StepRun | null> {\n let updatedStep: StepRun | null = null\n\n await this.updateRun(runId, (run) => {\n const jobIndex = run.jobs.findIndex((job) => job.id === jobId)\n if (jobIndex === -1) {\n return\n }\n const job = run.jobs[jobIndex]\n if (!job) {\n return\n }\n const stepIndex = job.steps.findIndex(\n (step: StepRun) => step.id === stepId,\n )\n if (stepIndex === -1) {\n return\n }\n const existingStep = job.steps[stepIndex]\n if (!existingStep) {\n return\n }\n const draft = clone(existingStep)\n const result = mutator(draft)\n const nextStep = (result ?? draft) as StepRun\n job.steps[stepIndex] = nextStep\n updatedStep = nextStep\n })\n\n return updatedStep\n }\n\n async releaseBlockedJobs(\n runId: string,\n completedJobName: string,\n ): Promise<JobRun[]> {\n const released: JobRun[] = []\n\n await this.updateRun(runId, (run) => {\n for (const job of run.jobs) {\n if (job.status !== 'queued' || !job.blocked) {\n continue\n }\n if (!job.pendingDependencies || job.pendingDependencies.length === 0) {\n continue\n }\n if (!job.needs?.includes(completedJobName)) {\n continue\n }\n\n const remaining = job.pendingDependencies.filter(\n (dependency) => dependency !== completedJobName,\n )\n\n if (remaining.length === job.pendingDependencies.length) {\n continue\n }\n\n job.pendingDependencies = remaining\n\n if (remaining.length === 0) {\n job.blocked = false\n released.push(clone(job))\n }\n }\n })\n\n return released\n }\n}\n\nfunction clone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T\n}\n\n\n\n","import { randomUUID } from 'node:crypto'\nimport { IDEMPOTENCY_TTL_ENV } from '@kb-labs/workflow-constants'\nimport type {\n JobRun,\n JobSpec,\n StepRun,\n WorkflowRun,\n} from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { StateStore } from './state-store'\nimport type { ConcurrencyManager } from './concurrency-manager'\nimport type { EngineLogger, CreateRunInput } from './types'\n\nconst DEFAULT_IDEMPOTENCY_TTL_MS = 1000 * 60 * 60 * 24 // 24h\n\nfunction resolveIdempotencyTtlMs(explicit?: number): number {\n if (typeof explicit === 'number' && explicit > 0) {\n return explicit\n }\n const envValue = process.env[IDEMPOTENCY_TTL_ENV]\n const parsed = envValue ? Number(envValue) : undefined\n if (parsed && Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n return DEFAULT_IDEMPOTENCY_TTL_MS\n}\n\nexport interface RunCoordinatorOptions {\n idempotencyTtlMs?: number\n}\n\nexport class RunCoordinator {\n private readonly cache: ICache\n private readonly idempotencyTtlMs: number\n\n constructor(\n cache: ICache,\n private readonly stateStore: StateStore,\n private readonly concurrencyManager: ConcurrencyManager,\n private readonly logger: EngineLogger,\n options: RunCoordinatorOptions = {},\n ) {\n this.cache = cache\n this.idempotencyTtlMs = resolveIdempotencyTtlMs(options.idempotencyTtlMs)\n }\n\n async ensureRun(input: CreateRunInput): Promise<WorkflowRun> {\n if (input.idempotencyKey) {\n const existing = await this.loadByIdempotencyKey(input.idempotencyKey)\n if (existing) {\n this.logger.info('Idempotent workflow run reused', {\n runId: existing.id,\n idempotencyKey: input.idempotencyKey,\n })\n return existing\n }\n }\n\n const runId = randomUUID()\n const now = new Date().toISOString()\n\n if (input.concurrencyGroup) {\n const acquired = await this.concurrencyManager.acquire(\n input.concurrencyGroup,\n runId,\n )\n\n if (!acquired) {\n const active = await this.concurrencyManager.getActiveRun(\n input.concurrencyGroup,\n )\n const message = active\n ? `Concurrency group ${input.concurrencyGroup} already locked by run ${active}`\n : `Failed to acquire concurrency lock for ${input.concurrencyGroup}`\n this.logger.warn(message, {\n concurrencyGroup: input.concurrencyGroup,\n activeRunId: active,\n })\n throw new Error(message)\n }\n }\n\n const run = this.buildInitialRun(input, runId, now)\n await this.stateStore.saveRun(run)\n\n if (input.idempotencyKey) {\n await this.registerIdempotencyKey(input.idempotencyKey, run.id)\n }\n\n this.logger.info('Workflow run created', {\n runId: run.id,\n name: run.name,\n version: run.version,\n })\n\n return run\n }\n\n private buildInitialRun(\n input: CreateRunInput,\n runId: string,\n timestamp: string,\n ): WorkflowRun {\n const jobs: JobRun[] = []\n\n for (const [jobName, jobSpec] of Object.entries(\n input.spec.jobs,\n ) as Array<[string, JobSpec]>) {\n const jobId = `${runId}:${jobName}`\n const needs = Array.isArray(jobSpec.needs) ? [...jobSpec.needs] : []\n const priority = jobSpec.priority ?? 'normal'\n const effectiveTarget = jobSpec.target ?? input.spec.target\n const effectiveIsolation = jobSpec.isolation ?? input.spec.isolation\n const stepRuns: StepRun[] = jobSpec.steps.map((step, index) => ({\n id: `${jobId}:${index}`,\n runId,\n jobId,\n name: step.name,\n index,\n status: 'queued',\n queuedAt: timestamp,\n attempt: 0,\n timeoutMs: step.timeoutMs,\n continueOnError: step.continueOnError,\n spec: step,\n }))\n\n jobs.push({\n id: jobId,\n runId,\n jobName,\n status: 'queued',\n runsOn: jobSpec.runsOn,\n queuedAt: timestamp,\n attempt: 0,\n steps: stepRuns,\n concurrency: jobSpec.concurrency,\n retries: jobSpec.retries,\n timeoutMs: jobSpec.timeoutMs,\n target: effectiveTarget,\n isolation: effectiveIsolation,\n artifacts: jobSpec.artifacts,\n env: jobSpec.env,\n secrets: jobSpec.secrets,\n needs,\n pendingDependencies: [...needs],\n blocked: needs.length > 0,\n priority,\n })\n }\n\n const workflowRun: WorkflowRun = {\n id: runId,\n name: input.spec.name,\n version: input.spec.version,\n status: 'queued',\n createdAt: timestamp,\n queuedAt: timestamp,\n trigger: input.trigger,\n env: input.spec.env,\n inputs: input.inputs,\n secrets: input.spec.secrets,\n jobs,\n metadata: {\n idempotencyKey: input.idempotencyKey,\n concurrencyGroup: input.concurrencyGroup,\n target: input.spec.target,\n isolation: input.spec.isolation,\n },\n artifacts: [],\n }\n\n return workflowRun\n }\n\n private async registerIdempotencyKey(\n key: string,\n runId: string,\n ): Promise<void> {\n const cacheKey = `kb:idempotency:${key}`\n const registered = await this.cache.setIfNotExists(\n cacheKey,\n runId,\n this.idempotencyTtlMs,\n )\n\n if (!registered) {\n const existingRunId = await this.cache.get<string>(cacheKey)\n if (existingRunId) {\n const existing = await this.stateStore.getRun(existingRunId)\n if (existing) {\n throw new Error(\n `Idempotency key ${key} already associated with run ${existingRunId}`,\n )\n }\n }\n throw new Error(`Failed to register idempotency key ${key}`)\n }\n }\n\n private async loadByIdempotencyKey(\n key: string,\n ): Promise<WorkflowRun | null> {\n const cacheKey = `kb:idempotency:${key}`\n const existingRunId = await this.cache.get<string>(cacheKey)\n if (!existingRunId) {\n return null\n }\n return this.stateStore.getRun(existingRunId)\n }\n\n async releaseConcurrency(run: WorkflowRun): Promise<void> {\n const group = run.metadata?.concurrencyGroup\n if (!group) {\n return\n }\n await this.concurrencyManager.release(group, run.id)\n this.logger.debug('Released concurrency group', {\n runId: run.id,\n group,\n })\n }\n}\n\n","import { CONCURRENCY_TTL_ENV } from '@kb-labs/workflow-constants'\nimport type { ConcurrencyGroup } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nconst DEFAULT_TTL_MS = 1000 * 60 * 30 // 30 minutes\n\nfunction resolveTtlMs(explicit?: number): number {\n if (typeof explicit === 'number' && explicit > 0) {\n return explicit\n }\n const envValue = process.env[CONCURRENCY_TTL_ENV]\n const parsed = envValue ? Number(envValue) : undefined\n if (parsed && Number.isFinite(parsed) && parsed > 0) {\n return parsed\n }\n return DEFAULT_TTL_MS\n}\n\nexport interface AcquireOptions {\n ttlMs?: number\n}\n\nexport class ConcurrencyManager {\n private readonly cache: ICache\n private readonly ttlMs: number\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n options: AcquireOptions = {},\n ) {\n this.cache = cache\n this.ttlMs = resolveTtlMs(options.ttlMs)\n }\n\n async acquire(\n group: ConcurrencyGroup,\n runId: string,\n options: AcquireOptions = {},\n ): Promise<boolean> {\n const ttl = resolveTtlMs(options.ttlMs ?? this.ttlMs)\n const key = `kb:concurrency:${group}`\n const acquired = await this.cache.setIfNotExists(key, runId, ttl)\n\n this.logger.debug('Concurrency acquire attempt', {\n group,\n runId,\n acquired,\n })\n return acquired\n }\n\n async release(group: ConcurrencyGroup, runId: string): Promise<void> {\n const key = `kb:concurrency:${group}`\n const current = await this.cache.get<string>(key)\n if (current === runId) {\n await this.cache.delete(key)\n this.logger.debug('Concurrency lock released', { group, runId })\n }\n }\n\n async getActiveRun(group: ConcurrencyGroup): Promise<string | null> {\n const key = `kb:concurrency:${group}`\n return this.cache.get<string>(key)\n }\n}\n\n\n","import type { JobRun, WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { JobPriority } from '@kb-labs/workflow-constants'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport interface JobQueueEntry {\n id: string\n runId: string\n jobId: string\n priority: JobPriority\n enqueuedAt: string\n availableAt: number\n jobName: string\n}\n\nexport interface SchedulerOptions {\n defaultPriority?: JobPriority\n lookAheadMs?: number\n}\n\nexport class Scheduler {\n private readonly cache: ICache\n private readonly defaultPriority: JobPriority\n private readonly lookAheadMs: number\n private readonly priorityOrder: JobPriority[] = ['high', 'normal', 'low']\n\n constructor(\n cache: ICache,\n private readonly logger: EngineLogger,\n options: SchedulerOptions = {},\n ) {\n this.cache = cache\n this.defaultPriority = options.defaultPriority ?? 'normal'\n this.lookAheadMs = options.lookAheadMs ?? 1000\n }\n\n async scheduleRun(run: WorkflowRun): Promise<void> {\n // Enqueue ready jobs in parallel\n const readyJobs = run.jobs.filter(job => {\n if (job.blocked) {\n this.logger.debug('Job blocked by dependencies; deferring enqueue', {\n runId: run.id,\n jobId: job.id,\n needs: job.needs,\n })\n return false\n }\n return true\n })\n\n await Promise.all(\n readyJobs.map(job => {\n const priority = job.priority ?? this.defaultPriority\n return this.enqueueJob(run.id, job, priority)\n }),\n )\n }\n\n async enqueueJob(\n runId: string,\n job: JobRun,\n priority: JobPriority = this.defaultPriority,\n ): Promise<void> {\n if (job.blocked) {\n this.logger.debug('Skipping enqueue for blocked job', {\n runId,\n jobId: job.id,\n needs: job.pendingDependencies,\n })\n return\n }\n const now = Date.now()\n const entryId = `${runId}:${job.id}:${now}:${Math.random().toString(36).slice(2, 10)}`\n const entry: JobQueueEntry = {\n id: entryId,\n runId,\n jobId: job.id,\n jobName: job.jobName,\n priority,\n enqueuedAt: new Date().toISOString(),\n availableAt: now,\n }\n await this.cache.zadd(\n `kb:jobqueue:${priority}`,\n entry.availableAt,\n JSON.stringify(entry),\n )\n this.logger.debug('Job enqueued', { runId, jobId: job.id, priority })\n }\n\n async dequeueJob(): Promise<JobQueueEntry | null> {\n // Sequential check by priority order - must return first match respecting priority\n for (const priority of this.priorityOrder) {\n const entry = await this.dequeueFromPriority(priority) // eslint-disable-line no-await-in-loop\n if (entry) {\n return entry\n }\n }\n return null\n }\n\n async reschedule(entry: JobQueueEntry, delayMs: number): Promise<void> {\n const availableAt = Date.now() + delayMs\n const next: JobQueueEntry = {\n ...entry,\n availableAt,\n enqueuedAt: new Date().toISOString(),\n }\n await this.cache.zadd(\n `kb:jobqueue:${entry.priority}`,\n availableAt,\n JSON.stringify(next),\n )\n this.logger.debug('Job rescheduled', {\n runId: entry.runId,\n jobId: entry.jobId,\n delayMs,\n priority: entry.priority,\n })\n }\n\n private async dequeueFromPriority(priority: JobPriority): Promise<JobQueueEntry | null> {\n const now = Date.now()\n const key = `kb:jobqueue:${priority}`\n const results = await this.cache.zrangebyscore(\n key,\n 0,\n now + this.lookAheadMs,\n )\n\n // Handle LIMIT manually - take only first result\n if (results.length === 0) {\n return null\n }\n\n const raw = results[0]\n if (typeof raw !== 'string') {\n return null\n }\n try {\n const entry = JSON.parse(raw) as JobQueueEntry\n await this.cache.zrem(key, raw)\n return entry\n } catch (error) {\n this.logger.error('Failed to parse job queue entry', error instanceof Error ? error : undefined)\n return null\n }\n }\n\n getDefaultPriority(): JobPriority {\n return this.defaultPriority\n }\n}\n\n\n","export interface SecretProvider {\n resolve(names: string[]): Promise<Record<string, string>>\n}\n\nexport interface EnvSecretProviderOptions {\n /**\n * Prefix applied when looking up secrets in environment variables.\n * Defaults to `KB_SECRET_`.\n */\n prefix?: string\n /**\n * When true (default), check both plain and prefixed environment variable names.\n */\n allowPlain?: boolean\n}\n\nexport class EnvSecretProvider implements SecretProvider {\n private readonly prefix: string\n private readonly allowPlain: boolean\n\n constructor(options: EnvSecretProviderOptions = {}) {\n this.prefix = options.prefix ?? 'KB_SECRET_'\n this.allowPlain = options.allowPlain ?? true\n }\n\n async resolve(names: string[]): Promise<Record<string, string>> {\n const resolved: Record<string, string> = {}\n for (const name of names) {\n if (!name) {\n continue\n }\n const prefixed = `${this.prefix}${name}`\n const candidates = this.allowPlain\n ? [process.env[name], process.env[prefixed]]\n : [process.env[prefixed]]\n\n const value = candidates.find((candidate) => typeof candidate === 'string')\n if (typeof value === 'string') {\n resolved[name] = value\n }\n }\n return resolved\n }\n}\n\nexport function createDefaultSecretProvider(): SecretProvider {\n return new EnvSecretProvider()\n}\n\n","import {\n WORKFLOW_REDIS_CHANNEL,\n type WorkflowEventName,\n} from '@kb-labs/workflow-constants'\nimport type { IEventBus } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport interface WorkflowEvent<TPayload = Record<string, unknown>> {\n type: WorkflowEventName\n runId: string\n jobId?: string\n stepId?: string\n payload?: TPayload\n timestamp?: string\n}\n\nexport class EventBusBridge {\n private readonly events: IEventBus\n private readonly channel = WORKFLOW_REDIS_CHANNEL\n\n constructor(\n events: IEventBus,\n private readonly logger: EngineLogger,\n ) {\n this.events = events\n }\n\n async publish<TPayload = Record<string, unknown>>(\n event: WorkflowEvent<TPayload>,\n ): Promise<void> {\n const payload = {\n ...event,\n timestamp: event.timestamp ?? new Date().toISOString(),\n }\n await this.events.publish(this.channel, payload)\n this.logger.debug('Workflow event published', {\n channel: this.channel,\n type: event.type,\n runId: event.runId,\n })\n }\n}\n\n\n","import type { RetryPolicy } from '@kb-labs/workflow-contracts'\n\nconst DEFAULT_INITIAL_INTERVAL_MS = 1000\n\nexport interface RetryDecision {\n shouldRetry: boolean\n nextDelayMs?: number\n}\n\nexport function calculateBackoff(\n attempt: number,\n policy?: RetryPolicy,\n): number {\n if (!policy) {\n return 0\n }\n\n const base = policy.initialIntervalMs ?? DEFAULT_INITIAL_INTERVAL_MS\n const backoff =\n policy.backoff === 'lin'\n ? base * (attempt + 1)\n : base * Math.pow(2, attempt)\n\n if (policy.maxIntervalMs) {\n return Math.min(backoff, policy.maxIntervalMs)\n }\n return backoff\n}\n\nexport function shouldRetry(\n attempt: number,\n policy?: RetryPolicy,\n): RetryDecision {\n if (!policy) {\n return { shouldRetry: false }\n }\n if (attempt >= policy.max) {\n return { shouldRetry: false }\n }\n\n return {\n shouldRetry: true,\n nextDelayMs: calculateBackoff(attempt, policy),\n }\n}\n\n\n\n\n\n","import type { WorkflowRun } from '@kb-labs/workflow-contracts'\nimport type { ICache } from '@kb-labs/core-platform'\nimport type { EngineLogger } from './types'\n\nexport interface RunSnapshot {\n runId: string\n run: WorkflowRun\n stepOutputs: Record<string, Record<string, unknown>>\n env: Record<string, string>\n refs?: {\n workspaceSnapshotId?: string\n environmentSnapshotId?: string\n }\n createdAt: string\n version: string\n}\n\nconst SNAPSHOT_VERSION = '1.0.0'\n\nexport class RunSnapshotStorage {\n constructor(\n private readonly cache: ICache,\n private readonly logger: EngineLogger,\n ) {}\n\n private getSnapshotKey(runId: string): string {\n return `workflow:snapshot:${runId}`\n }\n\n async createSnapshot(\n run: WorkflowRun,\n stepOutputs: Record<string, Record<string, unknown>>,\n env: Record<string, string>,\n refs?: RunSnapshot['refs'],\n ): Promise<RunSnapshot> {\n const snapshot: RunSnapshot = {\n runId: run.id,\n run,\n stepOutputs,\n env,\n refs,\n createdAt: new Date().toISOString(),\n version: SNAPSHOT_VERSION,\n }\n\n const key = this.getSnapshotKey(run.id)\n // Store snapshot with 7 days TTL (in milliseconds)\n await this.cache.set(\n key,\n JSON.stringify(snapshot),\n 7 * 24 * 60 * 60 * 1000, // 7 days in ms\n )\n\n this.logger.info('Snapshot created', { runId: run.id })\n return snapshot\n }\n\n async getSnapshot(runId: string): Promise<RunSnapshot | null> {\n const key = this.getSnapshotKey(runId)\n const stored = await this.cache.get<string>(key)\n if (!stored) {\n return null\n }\n\n try {\n const snapshot = JSON.parse(stored) as RunSnapshot\n // Validate version\n if (snapshot.version !== SNAPSHOT_VERSION) {\n this.logger.warn('Snapshot version mismatch', {\n runId,\n expected: SNAPSHOT_VERSION,\n actual: snapshot.version,\n })\n // Try to load anyway, but log warning\n }\n return snapshot\n } catch (error) {\n this.logger.error('Failed to parse snapshot', error instanceof Error ? error : undefined, {\n runId,\n })\n return null\n }\n }\n\n async deleteSnapshot(runId: string): Promise<void> {\n const key = this.getSnapshotKey(runId)\n await this.cache.delete(key)\n this.logger.debug('Snapshot deleted', { runId })\n }\n}\n","import type {\n WorkflowRun,\n WorkflowSpec,\n JobRun,\n} from '@kb-labs/workflow-contracts'\nimport {\n EVENT_NAMES,\n WORKFLOW_REDIS_CHANNEL,\n type WorkflowEventName,\n} from '@kb-labs/workflow-constants'\nimport type { ICache, IEventBus, ILogger, IAnalytics, Unsubscribe } from '@kb-labs/core-platform'\nimport { StateStore } from './state-store'\nimport { ConcurrencyManager, type AcquireOptions } from './concurrency-manager'\nimport {\n RunCoordinator,\n type RunCoordinatorOptions,\n} from './run-coordinator'\nimport {\n Scheduler,\n type SchedulerOptions,\n type JobQueueEntry,\n} from './scheduler'\nimport { EventBusBridge, type WorkflowEvent } from './event-bus'\nimport { WorkflowLoader } from './workflow-loader'\nimport type { CreateRunInput, EngineLogger, RunContext } from './types'\nimport { RunSnapshotStorage, type RunSnapshot } from './run-snapshot'\n\ninterface SnapshotManagerClient {\n restoreSnapshot(request: {\n snapshotId: string\n workspaceId?: string\n environmentId?: string\n targetPath?: string\n overwrite?: boolean\n metadata?: Record<string, unknown>\n }): Promise<unknown>\n}\n\nexport interface WorkflowEngineOptions {\n scheduler?: SchedulerOptions\n concurrency?: AcquireOptions\n runCoordinator?: RunCoordinatorOptions\n maxWorkflowDepth?: number\n /** Platform cache adapter (REQUIRED) */\n cache: ICache\n /** Platform event bus adapter (REQUIRED) */\n events: IEventBus\n /** Platform logger (REQUIRED) */\n logger: ILogger\n /** Platform analytics adapter (OPTIONAL) */\n analytics?: IAnalytics\n /** Platform snapshot manager (OPTIONAL - for infra snapshot restore in replay) */\n snapshotManager?: SnapshotManagerClient\n /** Workspace root (monorepo root) - used for plugin execution context */\n workspaceRoot?: string\n}\n\nexport class WorkflowEngine {\n readonly loader: WorkflowLoader\n readonly maxWorkflowDepth: number\n\n private readonly logger: EngineLogger\n private readonly analytics?: IAnalytics\n private readonly stateStore: StateStore\n private readonly concurrency: ConcurrencyManager\n private readonly runCoordinator: RunCoordinator\n private readonly scheduler: Scheduler\n private readonly events: EventBusBridge\n private readonly snapshotStorage: RunSnapshotStorage\n\n constructor(private readonly options: WorkflowEngineOptions) {\n this.logger = options.logger\n this.analytics = options.analytics\n\n this.stateStore = new StateStore(options.cache, this.logger)\n this.concurrency = new ConcurrencyManager(\n options.cache,\n this.logger,\n options.concurrency,\n )\n this.runCoordinator = new RunCoordinator(\n options.cache,\n this.stateStore,\n this.concurrency,\n this.logger,\n options.runCoordinator,\n )\n\n this.scheduler = new Scheduler(options.cache, this.logger, options.scheduler)\n this.events = new EventBusBridge(options.events, this.logger)\n this.loader = new WorkflowLoader(this.logger)\n this.maxWorkflowDepth = options.maxWorkflowDepth ?? 2\n this.snapshotStorage = new RunSnapshotStorage(options.cache, this.logger)\n }\n\n async dispose(): Promise<void> {\n // Cleanup if needed\n }\n\n /**\n * Subscribe to real-time events for a specific workflow run.\n * Events are filtered by runId from the shared event bus channel.\n */\n subscribeToRunEvents(\n runId: string,\n handler: (event: WorkflowEvent) => void,\n ): Unsubscribe {\n return this.options.events.subscribe(WORKFLOW_REDIS_CHANNEL, async (raw: unknown) => {\n const event = raw as WorkflowEvent\n if (event.runId === runId) {handler(event)}\n })\n }\n\n async createRun(input: CreateRunInput): Promise<WorkflowRun> {\n const run = await this.runCoordinator.ensureRun(input)\n\n // Track workflow run creation\n this.analytics?.track('workflow.run.created', {\n runId: run.id,\n name: run.name,\n version: run.version,\n jobCount: run.jobs.length,\n trigger: input.trigger?.type,\n }).catch(() => {}) // Silent fail for analytics\n\n await this.events.publish({\n type: EVENT_NAMES.run.created,\n runId: run.id,\n payload: {\n status: run.status,\n name: run.name,\n version: run.version,\n },\n })\n await this.scheduler.scheduleRun(run)\n\n return run\n }\n\n async runFromSpec(\n spec: WorkflowSpec,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n return this.createRun({\n ...input,\n spec,\n })\n }\n\n async runFromFile(\n filePath: string,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n const result = await this.loader.fromFile(filePath)\n return this.runFromSpec(result.spec, input)\n }\n\n async runFromInline(\n spec: unknown,\n input: Omit<CreateRunInput, 'spec'>,\n ): Promise<WorkflowRun> {\n const result = this.loader.fromInline(spec)\n return this.runFromSpec(result.spec, input)\n }\n\n async getRun(runId: string): Promise<WorkflowRun | null> {\n return this.stateStore.getRun(runId)\n }\n\n async cancelRun(runId: string): Promise<void> {\n const run = await this.getRun(runId)\n\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'cancelled'\n draft.finishedAt = new Date().toISOString()\n return draft\n })\n\n // Track workflow cancellation\n this.analytics?.track('workflow.run.cancelled', {\n runId,\n name: run?.name,\n reason: 'cancelled by parent workflow',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.cancelled,\n runId,\n payload: { reason: 'cancelled by parent workflow' },\n })\n }\n\n /**\n * Mark job as failed and optionally schedule retry.\n * Implements exponential/linear backoff retry logic.\n */\n async markJobFailed(\n runId: string,\n jobId: string,\n error: Error,\n shouldRetry = true\n ): Promise<void> {\n const run = await this.stateStore.getRun(runId)\n if (!run) {\n this.logger.warn('Cannot mark job as failed: run not found', { runId, jobId })\n return\n }\n\n const job = run.jobs.find((j) => j.id === jobId)\n if (!job) {\n this.logger.warn('Cannot mark job as failed: job not found', { runId, jobId })\n return\n }\n\n // Update job status to failed\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'failed'\n draft.error = {\n message: error.message,\n stack: error.stack,\n timestamp: new Date().toISOString(),\n }\n draft.finishedAt = new Date().toISOString()\n draft.attempt = (draft.attempt || 0) + 1\n })\n\n this.logger.error('Job failed', error, {\n runId,\n jobId,\n attempt: (job.attempt || 0) + 1,\n })\n\n // Track job failure\n this.analytics?.track('workflow.job.failed', {\n runId,\n jobId,\n jobName: job.jobName,\n attempt: (job.attempt || 0) + 1,\n errorMessage: error.message,\n willRetry: shouldRetry && this.shouldRetryJob(job),\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.failed,\n runId,\n jobId,\n payload: { jobName: job.jobName, error: error.message, attempt: (job.attempt || 0) + 1 },\n })\n\n // Check if should retry\n if (shouldRetry && this.shouldRetryJob(job)) {\n const backoffMs = this.calculateBackoff(job.attempt || 0, job.retries)\n\n this.logger.info('Scheduling job retry', {\n runId,\n jobId,\n attempt: (job.attempt || 0) + 1,\n backoffMs,\n })\n\n // Re-queue job after backoff\n setTimeout(async () => {\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'queued'\n draft.error = undefined\n draft.startedAt = undefined\n draft.finishedAt = undefined\n })\n\n // Re-enqueue in scheduler\n const updatedRun = await this.stateStore.getRun(runId)\n const updatedJob = updatedRun?.jobs.find((j) => j.id === jobId)\n if (updatedJob) {\n await this.scheduler.enqueueJob(runId, updatedJob, updatedJob.priority ?? 'normal')\n }\n\n this.logger.info('Job re-queued for retry', { runId, jobId })\n }, backoffMs)\n } else {\n // Move to Dead Letter Queue\n await this.moveToDLQ(runId, jobId, error)\n }\n }\n\n /**\n * Mark job as interrupted (e.g., during graceful shutdown).\n * Interrupted jobs will be retried on next daemon startup.\n */\n async markJobInterrupted(runId: string, jobId: string): Promise<void> {\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'interrupted'\n draft.finishedAt = new Date().toISOString()\n })\n\n this.logger.warn('Job interrupted', { runId, jobId })\n }\n\n /**\n * Mark job as started (running).\n */\n async markJobStarted(runId: string, jobId: string): Promise<void> {\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'running'\n draft.startedAt = new Date().toISOString()\n })\n\n this.logger.debug('Job started', { runId, jobId })\n\n // Track job start\n const run = await this.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n this.analytics?.track('workflow.job.started', {\n runId,\n jobId,\n jobName: job?.jobName,\n stepCount: job?.steps.length ?? 0,\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.started,\n runId,\n jobId,\n payload: { jobName: job?.jobName },\n })\n }\n\n /**\n * Mark job as completed successfully.\n */\n async markJobCompleted(runId: string, jobId: string): Promise<void> {\n const run = await this.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n const startTime = job?.startedAt ? new Date(job.startedAt).getTime() : Date.now()\n const duration = Date.now() - startTime\n\n await this.stateStore.updateJob(runId, jobId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n })\n\n this.logger.info('Job completed successfully', { runId, jobId })\n\n // Track job completion\n this.analytics?.track('workflow.job.completed', {\n runId,\n jobId,\n jobName: job?.jobName,\n durationMs: duration,\n stepCount: job?.steps.length ?? 0,\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.job.succeeded,\n runId,\n jobId,\n payload: { jobName: job?.jobName, durationMs: duration },\n })\n\n // Release jobs that were blocked waiting for this job to complete.\n if (job?.jobName) {\n const released = await this.stateStore.releaseBlockedJobs(runId, job.jobName)\n for (const releasedJob of released) {\n await this.scheduler.enqueueJob(runId, releasedJob, releasedJob.priority ?? 'normal')\n this.logger.info('Unblocked dependent job', { runId, jobId: releasedJob.id, unlockedBy: job.jobName })\n }\n }\n\n // Check if all jobs in run are completed - update run status\n await this.checkRunCompletion(runId)\n }\n\n /**\n * Check if all jobs in a run are completed and update run status accordingly.\n */\n private async checkRunCompletion(runId: string): Promise<void> {\n const run = await this.getRun(runId)\n if (!run) {\n return\n }\n\n // Check status of all jobs\n const allSuccess = run.jobs.every((j) => j.status === 'success')\n const anyFailed = run.jobs.some((j) => j.status === 'failed')\n const anyRunning = run.jobs.some((j) => j.status === 'running' || j.status === 'queued')\n\n // If any job is still running/queued, run is not complete\n if (anyRunning) {\n return\n }\n\n // Update run status based on job outcomes\n if (allSuccess) {\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n return draft\n })\n this.logger.info('Workflow run completed successfully', { runId })\n\n // Track workflow completion\n this.analytics?.track('workflow.run.completed', {\n runId,\n name: run.name,\n jobCount: run.jobs.length,\n status: 'success',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.finished,\n runId,\n payload: { status: 'success', name: run.name },\n })\n } else if (anyFailed) {\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = new Date().toISOString()\n return draft\n })\n this.logger.info('Workflow run failed', { runId })\n\n // Track workflow failure\n this.analytics?.track('workflow.run.completed', {\n runId,\n name: run.name,\n jobCount: run.jobs.length,\n status: 'failed',\n }).catch(() => {})\n\n await this.events.publish({\n type: EVENT_NAMES.run.failed,\n runId,\n payload: { status: 'failed', name: run.name },\n })\n }\n }\n\n /**\n * Mark step as started (running).\n */\n async markStepStarted(runId: string, jobId: string, stepId: string): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'running'\n draft.startedAt = new Date().toISOString()\n })\n\n this.logger.debug('Step started', { runId, jobId, stepId })\n\n await this.events.publish({\n type: EVENT_NAMES.step.started,\n runId,\n jobId,\n stepId,\n })\n }\n\n /**\n * Mark step as completed successfully with output.\n */\n async markStepCompleted(\n runId: string,\n jobId: string,\n stepId: string,\n output?: unknown,\n ): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n if (output !== undefined) {\n draft.outputs = output as Record<string, unknown>\n }\n })\n\n this.logger.debug('Step completed', { runId, jobId, stepId })\n\n await this.events.publish({\n type: EVENT_NAMES.step.succeeded,\n runId,\n jobId,\n stepId,\n payload: output !== undefined ? { outputs: output } : undefined,\n })\n }\n\n /**\n * Mark step as failed with error.\n */\n async markStepFailed(\n runId: string,\n jobId: string,\n stepId: string,\n error: Error,\n outputs?: Record<string, unknown>,\n ): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = new Date().toISOString()\n draft.error = {\n message: error.message,\n stack: error.stack,\n }\n if (outputs) {draft.outputs = outputs}\n })\n\n this.logger.debug('Step failed', { runId, jobId, stepId, error: error.message })\n\n await this.events.publish({\n type: EVENT_NAMES.step.failed,\n runId,\n jobId,\n stepId,\n payload: { error: error.message },\n })\n }\n\n /**\n * Mark step as waiting for human approval.\n */\n async markStepWaitingApproval(\n runId: string,\n jobId: string,\n stepId: string,\n ): Promise<void> {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'waiting_approval' as any\n draft.startedAt = draft.startedAt ?? new Date().toISOString()\n })\n\n await this.events.publish({\n type: EVENT_NAMES.step.waitingApproval as any,\n runId,\n payload: { jobId, stepId },\n })\n\n this.logger.info('Step waiting for approval', { runId, jobId, stepId })\n }\n\n /**\n * Resolve a pending approval — approve or reject.\n * On approve: marks step as success with approval outputs.\n * On reject: marks step as failed with rejection error.\n */\n async resolveApproval(\n runId: string,\n jobId: string,\n stepId: string,\n action: 'approve' | 'reject',\n data?: Record<string, unknown>,\n comment?: string,\n ): Promise<void> {\n if (action === 'approve') {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'success'\n draft.finishedAt = new Date().toISOString()\n draft.outputs = {\n approved: true,\n action,\n ...(comment ? { comment } : {}),\n ...(data ?? {}),\n }\n })\n\n this.logger.info('Approval granted', { runId, jobId, stepId, comment })\n } else {\n await this.stateStore.updateStep(runId, jobId, stepId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = new Date().toISOString()\n draft.error = {\n message: comment || 'Approval rejected',\n code: 'APPROVAL_REJECTED',\n }\n draft.outputs = {\n approved: false,\n action,\n ...(comment ? { comment } : {}),\n ...(data ?? {}),\n }\n })\n\n this.logger.info('Approval rejected', { runId, jobId, stepId, comment })\n }\n\n await this.events.publish({\n type: EVENT_NAMES.step.updated,\n runId,\n payload: { jobId, stepId, action },\n })\n }\n\n /**\n * Get the state store for direct access (used by worker for gate restart-from).\n */\n getStateStore(): StateStore {\n return this.stateStore\n }\n\n /**\n * Get the scheduler for direct access (used by worker for gate re-enqueue).\n */\n getScheduler(): Scheduler {\n return this.scheduler\n }\n\n /**\n * Mark stale running/queued runs as failed on daemon startup.\n * Runs that were in-flight when the daemon crashed are unrecoverable —\n * their executor process is gone, so we mark them failed immediately.\n */\n async cleanupStaleRuns(): Promise<void> {\n const runIds = await this.stateStore.getAllRunIds()\n const now = new Date().toISOString()\n let count = 0\n\n await Promise.all(\n runIds.map(async (runId) => {\n const run = await this.stateStore.getRun(runId)\n if (!run) { return }\n if (run.status !== 'running' && run.status !== 'queued') { return }\n\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'failed'\n draft.finishedAt = now\n if (draft.startedAt) {\n draft.durationMs = new Date(now).getTime() - new Date(draft.startedAt).getTime()\n }\n // Mark any still-active jobs as failed too\n for (const job of draft.jobs) {\n if (job.status === 'running' || job.status === 'queued') {\n job.status = 'failed'\n job.error = { message: 'Daemon restarted — run was abandoned' }\n job.finishedAt = now\n }\n }\n return draft\n })\n count++\n }),\n )\n\n if (count > 0) {\n this.logger.warn('Cleaned up stale runs from previous daemon process', { count })\n }\n }\n\n /**\n * Resume interrupted jobs on daemon startup.\n * Re-queues jobs that were interrupted during previous shutdown.\n */\n async resumeInterruptedJobs(): Promise<void> {\n const runIds = await this.stateStore.getAllRunIds()\n\n // Process all runs in parallel\n const results = await Promise.all(\n runIds.map(async runId => {\n const run = await this.stateStore.getRun(runId)\n if (!run) {return 0}\n\n const interruptedJobs = run.jobs.filter(job => job.status === 'interrupted')\n\n // Process all interrupted jobs in this run in parallel\n await Promise.all(\n interruptedJobs.map(async job => {\n this.logger.info('Resuming interrupted job', { runId, jobId: job.id })\n\n await this.stateStore.updateJob(runId, job.id, (draft) => {\n draft.status = 'queued'\n draft.startedAt = undefined\n draft.finishedAt = undefined\n })\n\n // Re-enqueue in scheduler\n const queuedJob = { ...job, status: 'queued' as const }\n await this.scheduler.enqueueJob(runId, queuedJob, queuedJob.priority ?? 'normal')\n }),\n )\n\n return interruptedJobs.length\n }),\n )\n\n const resumedCount = results.reduce((sum, count) => sum + count, 0)\n\n if (resumedCount > 0) {\n this.logger.info('Resumed interrupted jobs', { count: resumedCount })\n }\n }\n\n /**\n * Determine if job should be retried based on retry policy.\n */\n private shouldRetryJob(job: JobRun): boolean {\n const retryPolicy = job.retries || { max: 3, backoff: 'exp' as const }\n const attempt = job.attempt || 0\n\n return attempt < retryPolicy.max\n }\n\n /**\n * Calculate backoff delay using exponential or linear strategy.\n */\n private calculateBackoff(\n attempt: number,\n policy?: { backoff: 'exp' | 'lin'; initialIntervalMs?: number; maxIntervalMs?: number }\n ): number {\n const config = {\n backoff: policy?.backoff || 'exp',\n initialIntervalMs: policy?.initialIntervalMs || 1000,\n maxIntervalMs: policy?.maxIntervalMs || 60000,\n }\n\n let backoffMs: number\n\n if (config.backoff === 'exp') {\n // Exponential: 1s, 2s, 4s, 8s, 16s, 32s...\n backoffMs = config.initialIntervalMs * Math.pow(2, attempt)\n } else {\n // Linear: 1s, 2s, 3s, 4s, 5s...\n backoffMs = config.initialIntervalMs * (attempt + 1)\n }\n\n // Cap at maxIntervalMs\n return Math.min(backoffMs, config.maxIntervalMs)\n }\n\n /**\n * Move permanently failed job to Dead Letter Queue.\n */\n private async moveToDLQ(runId: string, jobId: string, error: Error): Promise<void> {\n this.logger.warn('Job moved to DLQ after max retries', { runId, jobId })\n\n // Update run status to 'dlq'\n await this.stateStore.updateRun(runId, (draft) => {\n draft.status = 'dlq'\n draft.result = {\n status: 'dlq',\n summary: `Job ${jobId} failed after max retries`,\n error: {\n message: error.message,\n details: {\n stack: error.stack,\n },\n },\n }\n draft.finishedAt = new Date().toISOString()\n })\n\n // Store in cache with DLQ prefix\n const dlqKey = `workflow:dlq:${runId}:${jobId}`\n const run = await this.stateStore.getRun(runId)\n const job = run?.jobs.find((j) => j.id === jobId)\n\n await this.options.cache!.set(\n dlqKey,\n JSON.stringify({\n runId,\n jobId,\n jobName: job?.jobName,\n error: {\n message: error.message,\n stack: error.stack,\n },\n timestamp: new Date().toISOString(),\n attempts: job?.attempt || 0,\n }),\n 7 * 24 * 60 * 60 * 1000 // TTL 7 days\n )\n\n // Publish event\n const updatedRun = await this.stateStore.getRun(runId)\n if (updatedRun) {\n await this.publishRunEvent(EVENT_NAMES.run.failed, updatedRun)\n }\n }\n\n async updateRun(\n runId: string,\n mutator: (run: WorkflowRun) => WorkflowRun | void,\n ): Promise<WorkflowRun | null> {\n const updated = await this.stateStore.updateRun(runId, mutator)\n if (updated) {\n await this.publishRunEvent(EVENT_NAMES.run.updated, updated)\n }\n return updated\n }\n\n async finalizeRun(\n runId: string,\n status: WorkflowRun['status'],\n context: Partial<RunContext> = {},\n ): Promise<WorkflowRun | null> {\n const updated = await this.stateStore.updateRun(runId, (run) => {\n const now = new Date().toISOString()\n run.status = status\n run.finishedAt = now\n run.durationMs = computeDurationMs(run.startedAt ?? run.queuedAt, now)\n if (context.jobs) {\n run.jobs = context.jobs\n }\n if (context.steps) {\n // optional override steps already included in jobs\n }\n return run\n })\n\n if (updated) {\n await this.runCoordinator.releaseConcurrency(updated)\n await this.publishRunEvent(\n status === 'failed'\n ? EVENT_NAMES.run.failed\n : status === 'cancelled'\n ? EVENT_NAMES.run.cancelled\n : EVENT_NAMES.run.finished,\n updated,\n )\n }\n\n return updated\n }\n\n async nextJob(): Promise<JobQueueEntry | null> {\n return this.scheduler.dequeueJob()\n }\n\n async rescheduleJob(entry: JobQueueEntry, delayMs: number): Promise<void> {\n await this.scheduler.reschedule(entry, delayMs)\n }\n\n async publishRunEvent(\n type: WorkflowEventName,\n run: WorkflowRun,\n ): Promise<void> {\n await this.events.publish({\n type,\n runId: run.id,\n payload: {\n status: run.status,\n name: run.name,\n version: run.version,\n },\n })\n }\n\n /**\n * Publish a log entry for real-time streaming to Studio UI.\n */\n async publishLog(\n runId: string,\n jobId: string,\n stepId: string,\n entry: { level: string; message: string; stream: string; lineNo: number; timestamp: string; meta?: Record<string, unknown> },\n ): Promise<void> {\n await this.events.publish({\n type: EVENT_NAMES.log.appended,\n runId,\n jobId,\n stepId,\n payload: entry,\n })\n }\n\n /**\n * Create a snapshot of the current run state\n */\n async createSnapshot(\n runId: string,\n stepOutputs: Record<string, Record<string, unknown>>,\n env: Record<string, string>,\n refs?: RunSnapshot['refs'],\n ): Promise<RunSnapshot | null> {\n const run = await this.getRun(runId)\n if (!run) {\n this.logger.warn('Cannot create snapshot: run not found', { runId })\n return null\n }\n\n return this.snapshotStorage.createSnapshot(run, stepOutputs, env, refs)\n }\n\n /**\n * Get a snapshot for a run\n */\n async getSnapshot(runId: string): Promise<RunSnapshot | null> {\n return this.snapshotStorage.getSnapshot(runId)\n }\n\n /**\n * Replay a run from a snapshot, optionally starting from a specific step\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Replay orchestration: handles snapshot loading, step state transitions (before/at/after fromStep), env merging, job traversal, and conditional status reset logic\n async replayRun(\n runId: string,\n options: {\n fromStepId?: string\n stepOutputs?: Record<string, Record<string, unknown>>\n env?: Record<string, string>\n } = {},\n ): Promise<WorkflowRun | null> {\n // Load snapshot\n const snapshot = await this.snapshotStorage.getSnapshot(runId)\n if (!snapshot) {\n this.logger.warn('Cannot replay: snapshot not found', { runId })\n return null\n }\n\n if (snapshot.refs?.workspaceSnapshotId || snapshot.refs?.environmentSnapshotId) {\n if (!this.options.snapshotManager) {\n throw new Error('SnapshotManager is required for replay with infra snapshot references')\n }\n\n if (snapshot.refs.workspaceSnapshotId) {\n await this.options.snapshotManager.restoreSnapshot({\n snapshotId: snapshot.refs.workspaceSnapshotId,\n metadata: { source: 'workflow.replay', runId },\n })\n }\n\n if (snapshot.refs.environmentSnapshotId) {\n await this.options.snapshotManager.restoreSnapshot({\n snapshotId: snapshot.refs.environmentSnapshotId,\n metadata: { source: 'workflow.replay', runId },\n })\n }\n }\n\n // Restore run state\n const restoredRun = snapshot.run\n\n // Restore env if provided\n if (options.env) {\n restoredRun.env = { ...snapshot.env, ...options.env }\n } else {\n restoredRun.env = snapshot.env\n }\n\n // If fromStepId is specified, mark all steps before it as completed\n if (options.fromStepId) {\n for (const job of restoredRun.jobs) {\n let foundStep = false\n for (const step of job.steps) {\n if (step.id === options.fromStepId) {\n // Found the step to start from\n foundStep = true\n // Reset this step and all following steps\n if (step.status !== 'queued') {\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n continue\n }\n if (!foundStep) {\n // Mark previous steps as completed\n if (step.status === 'running' || step.status === 'queued') {\n step.status = 'success'\n step.finishedAt = step.finishedAt ?? new Date().toISOString()\n }\n } else {\n // Reset steps after the target step\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n }\n }\n } else {\n // Reset all steps to queued\n for (const job of restoredRun.jobs) {\n for (const step of job.steps) {\n step.status = 'queued'\n step.startedAt = undefined\n step.finishedAt = undefined\n }\n }\n }\n\n // Update run status\n restoredRun.status = 'running'\n restoredRun.startedAt = restoredRun.startedAt ?? new Date().toISOString()\n restoredRun.finishedAt = undefined\n\n // Save restored run\n await this.stateStore.saveRun(restoredRun)\n\n // Schedule the run\n await this.scheduler.scheduleRun(restoredRun)\n\n this.logger.info('Run replayed from snapshot', {\n runId,\n fromStepId: options.fromStepId,\n })\n\n return restoredRun\n }\n\n /**\n * Delete a snapshot\n */\n async deleteSnapshot(runId: string): Promise<void> {\n await this.snapshotStorage.deleteSnapshot(runId)\n }\n\n /**\n * Get all active workflow executions (running or queued).\n * Returns array of WorkflowRun objects with status 'running' or 'queued'.\n */\n async getActiveExecutions(): Promise<WorkflowRun[]> {\n // Get all run IDs from sorted set index\n const runIds = await this.stateStore.getAllRunIds()\n\n // Fetch all runs in parallel and filter for active ones\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n return runs.filter(\n (run): run is WorkflowRun =>\n run !== null && (run.status === 'running' || run.status === 'queued'),\n )\n }\n\n /**\n * Get all workflow runs (all statuses).\n * Returns array of all WorkflowRun objects ordered by creation time.\n */\n async getAllRuns(): Promise<WorkflowRun[]> {\n // Get all run IDs from sorted set index\n const runIds = await this.stateStore.getAllRunIds()\n\n // Fetch all runs in parallel and filter out nulls\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n return runs.filter((run): run is WorkflowRun => run !== null)\n }\n\n /**\n * List all workflow runs.\n * Returns array of all runs in the system.\n * Alias for getAllRuns() - maintained for backward compatibility.\n */\n async listRuns(): Promise<WorkflowRun[]> {\n return this.getAllRuns()\n }\n\n /**\n * Get workflow engine metrics.\n * Returns statistics about runs, jobs, and system health.\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Metrics aggregation: iterates all runs and jobs, counts by status (6 run statuses + 4 job statuses), handles nulls\n async getMetrics(): Promise<{\n runs: {\n total: number\n queued: number\n running: number\n completed: number\n failed: number\n cancelled: number\n dlq: number\n }\n jobs: {\n total: number\n queued: number\n running: number\n completed: number\n failed: number\n }\n }> {\n // Get all run IDs\n const runIds = await this.stateStore.getAllRunIds()\n\n const metrics = {\n runs: {\n total: 0,\n queued: 0,\n running: 0,\n completed: 0,\n failed: 0,\n cancelled: 0,\n dlq: 0,\n },\n jobs: {\n total: 0,\n queued: 0,\n running: 0,\n completed: 0,\n failed: 0,\n },\n }\n\n // Fetch all runs in parallel\n const runs = await Promise.all(runIds.map(id => this.stateStore.getRun(id)))\n\n // Aggregate metrics from all runs\n for (const run of runs) {\n if (!run) {continue}\n\n metrics.runs.total++\n\n // Count run status\n if (run.status === 'queued') {metrics.runs.queued++}\n else if (run.status === 'running') {metrics.runs.running++}\n else if (run.status === 'success') {metrics.runs.completed++}\n else if (run.status === 'failed') {metrics.runs.failed++}\n else if (run.status === 'cancelled') {metrics.runs.cancelled++}\n else if (run.status === 'dlq') {metrics.runs.dlq++}\n\n // Count job statuses\n for (const job of run.jobs) {\n metrics.jobs.total++\n if (job.status === 'queued') {metrics.jobs.queued++}\n else if (job.status === 'running') {metrics.jobs.running++}\n else if (job.status === 'success') {metrics.jobs.completed++}\n else if (job.status === 'failed') {metrics.jobs.failed++}\n }\n }\n\n return metrics\n }\n}\n\nfunction computeDurationMs(\n startedAt: string | undefined,\n finishedAt: string,\n): number | undefined {\n if (!startedAt) {\n return undefined\n }\n const start = Date.parse(startedAt)\n const end = Date.parse(finishedAt)\n if (Number.isNaN(start) || Number.isNaN(end)) {\n return undefined\n }\n return Math.max(0, end - start)\n}\n\n\n\n\n","import { join } from 'node:path'\nimport type { ArtifactMergeConfig, ArtifactMergeStrategy } from '@kb-labs/workflow-contracts'\nimport {\n createFileSystemArtifactClient,\n type ArtifactClient,\n} from '@kb-labs/workflow-artifacts'\nimport type { StateStore } from './state-store'\nimport type { EngineLogger } from './types'\n\nexport interface ArtifactMergerOptions {\n stateStore: StateStore\n logger: EngineLogger\n artifactsRoot: string\n}\n\nexport class ArtifactMerger {\n constructor(private readonly options: ArtifactMergerOptions) {}\n\n async mergeArtifacts(\n config: ArtifactMergeConfig,\n targetArtifacts: ArtifactClient,\n currentRunId: string,\n ): Promise<void> {\n const { strategy, from } = config\n\n this.options.logger.debug('Starting artifact merge', {\n strategy,\n sources: from.length,\n currentRunId,\n })\n\n // Load artifacts from all sources (parallel execution)\n const results = await Promise.allSettled(\n from.map(source =>\n this.loadArtifactsFromRun(source.runId, source.jobId).then(\n artifacts => ({ source, artifacts, success: true as const }),\n error => ({ source, error, success: false as const }),\n ),\n ),\n )\n\n const sourceArtifacts: Array<{ path: string; content: unknown }> = []\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.success) {\n sourceArtifacts.push(...result.value.artifacts)\n } else if (result.status === 'fulfilled' && !result.value.success) {\n this.options.logger.warn('Failed to load artifacts from source', {\n runId: result.value.source.runId,\n jobId: result.value.source.jobId,\n error: result.value.error instanceof Error\n ? result.value.error.message\n : String(result.value.error),\n })\n }\n }\n\n if (sourceArtifacts.length === 0) {\n this.options.logger.warn('No artifacts found to merge', {\n sources: from.length,\n })\n return\n }\n\n // Apply merge strategy\n await this.applyMergeStrategy(strategy, sourceArtifacts, targetArtifacts)\n\n this.options.logger.info('Artifact merge completed', {\n strategy,\n mergedCount: sourceArtifacts.length,\n })\n }\n\n private async loadArtifactsFromRun(\n runId: string,\n jobId?: string,\n ): Promise<Array<{ path: string; content: unknown }>> {\n // Load run from state store\n const run = await this.options.stateStore.getRun(runId)\n if (!run) {\n throw new Error(`Run ${runId} not found`)\n }\n\n // Find the job\n const job = jobId\n ? run.jobs.find((j) => j.id === jobId)\n : run.jobs[0] // Use first job if not specified\n\n if (!job) {\n throw new Error(`Job ${jobId ?? 'first'} not found in run ${runId}`)\n }\n\n // Get artifact paths from job\n const artifactPaths = job.artifacts?.produce ?? []\n if (artifactPaths.length === 0) {\n return []\n }\n\n // Load artifacts from filesystem (parallel execution)\n const sourceArtifacts = createFileSystemArtifactClient(join(\n this.options.artifactsRoot,\n runId,\n job.jobName,\n ))\n\n const results = await Promise.allSettled(\n artifactPaths.map(artifactPath => {\n return this.loadArtifactContent(sourceArtifacts, artifactPath).then(\n content => ({ artifactPath, content, success: true as const }),\n error => ({ artifactPath, error, success: false as const }),\n )\n }),\n )\n\n const artifacts: Array<{ path: string; content: unknown }> = []\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value.success) {\n artifacts.push({ path: result.value.artifactPath, content: result.value.content })\n } else if (result.status === 'fulfilled' && !result.value.success) {\n this.options.logger.warn('Failed to load artifact', {\n runId,\n jobId: job.id,\n artifactPath: result.value.artifactPath,\n error: result.value.error instanceof Error\n ? result.value.error.message\n : String(result.value.error),\n })\n }\n }\n\n return artifacts\n }\n\n private async loadArtifactContent(\n artifacts: ArtifactClient,\n artifactPath: string,\n ): Promise<unknown> {\n try {\n const content = (await artifacts.consume(artifactPath)).toString('utf8')\n // Try to parse as JSON, fallback to string\n try {\n return JSON.parse(content)\n } catch {\n return content\n }\n } catch (error) {\n throw new Error(\n `Failed to read artifact '${artifactPath}': ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n private async applyMergeStrategy(\n strategy: ArtifactMergeStrategy,\n sourceArtifacts: Array<{ path: string; content: unknown }>,\n targetArtifacts: ArtifactClient,\n ): Promise<void> {\n // Group artifacts by path\n const artifactsByPath = new Map<string, unknown[]>()\n\n for (const artifact of sourceArtifacts) {\n if (!artifactsByPath.has(artifact.path)) {\n artifactsByPath.set(artifact.path, [])\n }\n artifactsByPath.get(artifact.path)!.push(artifact.content)\n }\n\n // Apply strategy and save for each path in parallel\n await Promise.all(\n Array.from(artifactsByPath.entries()).map(async ([path, contents]) => {\n let merged: unknown\n\n switch (strategy) {\n case 'append': {\n // Append: combine arrays or concatenate strings\n merged = this.mergeAppend(contents)\n break\n }\n case 'overwrite': {\n // Overwrite: use last value\n merged = contents[contents.length - 1]\n break\n }\n case 'json-merge': {\n // JSON merge: deep merge objects\n merged = this.mergeJson(contents)\n break\n }\n default: {\n this.options.logger.warn('Unknown merge strategy, using overwrite', {\n strategy,\n path,\n })\n merged = contents[contents.length - 1]\n }\n }\n\n // Save merged artifact\n await this.saveMergedArtifact(targetArtifacts, path, merged)\n }),\n )\n }\n\n private mergeAppend(contents: unknown[]): unknown {\n // If all are arrays, concatenate\n if (contents.every((c) => Array.isArray(c))) {\n return (contents as unknown[][]).flat()\n }\n\n // If all are strings, concatenate with newline\n if (contents.every((c) => typeof c === 'string')) {\n return (contents as string[]).join('\\n')\n }\n\n // Otherwise, wrap in array\n return contents\n }\n\n private mergeJson(contents: unknown[]): unknown {\n // Start with empty object\n let merged: Record<string, unknown> = {}\n\n for (const content of contents) {\n if (typeof content === 'object' && content !== null && !Array.isArray(content)) {\n merged = this.deepMerge(merged, content as Record<string, unknown>)\n } else {\n // If not an object, use last value\n merged = content as Record<string, unknown>\n }\n }\n\n return merged\n }\n\n private deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n ): Record<string, unknown> {\n const result = { ...target }\n\n for (const [key, value] of Object.entries(source)) {\n if (\n key in result &&\n typeof result[key] === 'object' &&\n result[key] !== null &&\n !Array.isArray(result[key]) &&\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n ) {\n // Recursive merge for nested objects\n result[key] = this.deepMerge(\n result[key] as Record<string, unknown>,\n value as Record<string, unknown>,\n )\n } else {\n // Overwrite for primitives, arrays, or different types\n result[key] = value\n }\n }\n\n return result\n }\n\n private async saveMergedArtifact(\n artifacts: ArtifactClient,\n path: string,\n content: unknown,\n ): Promise<void> {\n // Convert content to string\n const contentString =\n typeof content === 'string'\n ? content\n : JSON.stringify(content, null, 2)\n\n await artifacts.produce(path, contentString)\n\n this.options.logger.debug('Saved merged artifact', { path })\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/manifest-scanner\n *\n * Scans plugin manifests for workflows and jobs, converting them to unified WorkflowRuntime format.\n *\n * ## Features\n * - Discovers workflows from `manifest.workflows.handlers`\n * - Discovers jobs from `manifest.jobs`\n * - Converts to unified WorkflowRuntime representation\n * - Caches results via Platform state for performance\n *\n * ## Usage\n * ```typescript\n * const scanner = new ManifestScanner({ cliApi, platform });\n * const workflows = await scanner.scanPlugins();\n * ```\n */\n\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type {\n WorkflowHandlerDecl,\n JobHandlerDecl,\n CronDecl,\n PlatformServices\n} from '@kb-labs/plugin-contracts';\n\n/**\n * Workflow trigger type\n */\nexport type WorkflowTriggerType = 'manual' | 'webhook' | 'push' | 'schedule' | 'event';\n\n/**\n * Workflow trigger configuration\n */\nexport interface WorkflowTrigger {\n type: WorkflowTriggerType;\n config?: Record<string, unknown>;\n}\n\n/**\n * Schedule configuration for workflows\n */\nexport interface WorkflowSchedule {\n /** Cron expression (e.g., \"0 2 * * *\") */\n cron: string;\n /** Whether schedule is enabled */\n enabled: boolean;\n /** Next run time (calculated) */\n nextRun?: Date;\n /** Last run time */\n lastRun?: Date;\n}\n\n/**\n * Workflow runtime statistics\n */\nexport interface WorkflowStats {\n totalRuns: number;\n successRuns: number;\n failedRuns: number;\n lastRunStatus?: 'success' | 'failed' | 'cancelled';\n lastRunAt?: Date;\n avgDurationMs?: number;\n}\n\n/**\n * Unified workflow runtime representation.\n *\n * Used for both manifest-based and standalone workflows.\n */\nexport interface WorkflowRuntime {\n // Identification\n id: string;\n source: 'manifest' | 'standalone';\n\n // Manifest-based fields\n pluginId?: string;\n manifestPath?: string;\n\n // Common metadata\n name: string;\n description?: string;\n tags?: string[];\n\n // Execution configuration\n triggers: WorkflowTrigger[];\n handler?: string; // For manifest-based workflows\n\n // Schedule (if applicable)\n schedule?: WorkflowSchedule;\n\n // Status\n status: 'active' | 'paused' | 'disabled';\n\n // Statistics (optional, populated from runtime)\n stats?: WorkflowStats;\n\n // Permissions\n permissions?: unknown; // From manifest\n\n // Full spec stored for execution (standalone workflows)\n input?: unknown;\n output?: unknown;\n // Declared input parameter schema exposed via REST API\n inputSchema?: Record<string, { type: 'string' | 'number' | 'boolean'; description?: string; required?: boolean; default?: unknown }>;\n}\n\n/**\n * Options for ManifestScanner\n */\nexport interface ManifestScannerOptions {\n /** CLI API instance */\n cliApi: IEntityRegistry;\n\n /** Platform services (for state, logger, etc.) */\n platform: PlatformServices;\n\n /** Cache TTL in milliseconds (default: 60000 = 1 minute) */\n cacheTtlMs?: number;\n}\n\n/**\n * Manifest Scanner Service\n *\n * Discovers workflows and jobs from installed plugin manifests.\n */\nexport class ManifestScanner {\n private readonly cliApi: IEntityRegistry;\n private readonly platform: PlatformServices;\n private readonly cacheTtlMs: number;\n\n constructor(options: ManifestScannerOptions) {\n this.cliApi = options.cliApi;\n this.platform = options.platform;\n this.cacheTtlMs = options.cacheTtlMs ?? 60000; // 1 minute default\n }\n\n /**\n * Scan all installed plugins for workflows and jobs.\n *\n * Returns unified WorkflowRuntime representations.\n */\n async scanPlugins(): Promise<WorkflowRuntime[]> {\n const cacheKey = 'manifest-scanner:workflows';\n\n // Check cache first (via platform cache)\n if (this.platform.cache) {\n const cached = await this.platform.cache.get<WorkflowRuntime[]>(cacheKey);\n if (cached) {\n this.platform.logger?.debug('ManifestScanner: Using cached workflows', { count: cached.length });\n return cached;\n }\n }\n\n this.platform.logger?.debug('ManifestScanner: Querying entity registry');\n const workflows: WorkflowRuntime[] = [];\n\n // Query workflow, job, and cron entities from registry (extracted from ManifestV3 by catalog)\n const workflowEntities = this.cliApi.queryEntities({ kind: 'workflow' });\n const jobEntities = this.cliApi.queryEntities({ kind: 'job' });\n const cronEntities = this.cliApi.queryEntities({ kind: 'cron' });\n\n // Get plugin roots for handler path resolution\n const pluginRoots = new Map<string, string>();\n for (const plugin of this.cliApi.listPlugins()) {\n pluginRoots.set(plugin.id, plugin.source.path);\n }\n\n const allEntities = [\n ...workflowEntities.map(e => ({ entity: e, converter: 'workflow' as const })),\n ...jobEntities.map(e => ({ entity: e, converter: 'job' as const })),\n ...cronEntities.map(e => ({ entity: e, converter: 'cron' as const })),\n ];\n\n for (const { entity, converter } of allEntities) {\n const root = pluginRoots.get(entity.ref.pluginId);\n if (!root) {\n this.platform.logger?.warn('ManifestScanner: Plugin root not found, skipping entity', {\n pluginId: entity.ref.pluginId,\n entityId: entity.ref.entityId,\n kind: entity.ref.kind,\n });\n continue;\n }\n\n try {\n if (converter === 'workflow') {\n workflows.push(this.convertWorkflowHandler(entity.ref.pluginId, entity.declaration as any, root));\n } else if (converter === 'job') {\n workflows.push(this.convertJobHandler(entity.ref.pluginId, entity.declaration as any, root));\n } else {\n workflows.push(this.convertCronSchedule(entity.ref.pluginId, entity.declaration as any, root));\n }\n } catch (err) {\n this.platform.logger?.warn('ManifestScanner: Failed to convert entity', {\n pluginId: entity.ref.pluginId,\n entityId: entity.ref.entityId,\n kind: entity.ref.kind,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n this.platform.logger?.info('ManifestScanner: Discovered workflows via registry', {\n count: workflows.length,\n workflows: workflowEntities.length,\n jobs: jobEntities.length,\n crons: cronEntities.length,\n });\n\n // Cache results (via platform cache)\n if (this.platform.cache) {\n await this.platform.cache.set(cacheKey, workflows, this.cacheTtlMs);\n }\n\n return workflows;\n }\n\n /**\n * Convert workflow handler declaration to WorkflowRuntime.\n */\n private convertWorkflowHandler(\n pluginId: string,\n handler: WorkflowHandlerDecl,\n pluginRoot: string\n ): WorkflowRuntime {\n const id = `${pluginId}/${handler.id}`;\n\n return {\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: handler.describe ?? handler.id,\n description: handler.describe,\n tags: ['plugin', pluginId],\n triggers: [\n { type: 'manual' }, // Workflow handlers can always be triggered manually\n ],\n handler: handler.handler,\n status: 'active',\n permissions: handler.permissions,\n input: handler.input,\n output: handler.output,\n };\n }\n\n /**\n * Convert job handler declaration to WorkflowRuntime.\n */\n private convertJobHandler(\n pluginId: string,\n handler: JobHandlerDecl,\n pluginRoot: string\n ): WorkflowRuntime {\n const id = `${pluginId}:job:${handler.id}`;\n\n return {\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: handler.describe ?? handler.id,\n description: handler.describe,\n tags: ['plugin', 'job', pluginId],\n triggers: [\n { type: 'manual' }, // Job handlers are invoked on-demand via ctx.api.jobs.submit()\n ],\n handler: handler.handler,\n status: 'active',\n permissions: handler.permissions,\n input: handler.input,\n output: handler.output,\n };\n }\n\n /**\n * Convert cron schedule declaration to WorkflowRuntime.\n */\n private convertCronSchedule(\n pluginId: string,\n cronDecl: CronDecl,\n pluginRoot: string\n ): WorkflowRuntime {\n const id = `${pluginId}:cron:${cronDecl.id}`;\n\n const schedule: WorkflowSchedule = {\n cron: cronDecl.schedule,\n enabled: cronDecl.enabled ?? true,\n };\n\n return {\n id,\n source: 'manifest',\n pluginId,\n manifestPath: pluginRoot,\n name: cronDecl.describe ?? cronDecl.id,\n description: cronDecl.describe,\n tags: ['plugin', 'cron', pluginId],\n triggers: [\n {\n type: 'schedule',\n config: { cron: cronDecl.schedule, timezone: cronDecl.timezone },\n },\n ],\n // Note: Cron schedules reference a job type to execute\n // The actual handler path comes from the job declaration\n handler: undefined, // Will be resolved at execution time via job type\n schedule,\n status: (cronDecl.enabled ?? true) ? 'active' : 'disabled',\n permissions: cronDecl.permissions,\n };\n }\n\n // Legacy convertLegacyJob method removed - use cron schedules instead\n\n /**\n * Scan all installed plugins for job handlers only.\n *\n * Returns information needed to register handlers in JobManager.\n */\n async scanJobHandlers(): Promise<Array<{\n pluginId: string;\n pluginVersion: string;\n pluginRoot: string;\n handler: JobHandlerDecl;\n }>> {\n const snapshot = this.cliApi.snapshot();\n const jobHandlers: Array<{\n pluginId: string;\n pluginVersion: string;\n pluginRoot: string;\n handler: JobHandlerDecl;\n }> = [];\n\n for (const entry of snapshot.manifests ?? []) {\n const handlers = entry.manifest.jobs?.handlers ?? [];\n for (const handler of handlers) {\n jobHandlers.push({\n pluginId: entry.pluginId,\n pluginVersion: entry.manifest.version,\n pluginRoot: entry.pluginRoot,\n handler,\n });\n }\n }\n\n this.platform.logger?.debug('ManifestScanner: Discovered job handlers', {\n count: jobHandlers.length,\n });\n\n return jobHandlers;\n }\n\n /**\n * Clear cache (useful for testing or force refresh).\n */\n async clearCache(): Promise<void> {\n if (this.platform.cache) {\n await this.platform.cache.delete('manifest-scanner:workflows');\n this.platform.logger?.debug('ManifestScanner: Cache cleared');\n }\n }\n\n /**\n * Watch for plugin changes and invalidate cache.\n *\n * @param callback Optional callback when workflows change\n * @returns Unsubscribe function\n */\n watchPlugins(callback?: (workflows: WorkflowRuntime[]) => void): () => void {\n return this.cliApi.onChange(async () => {\n // Invalidate cache on plugin changes\n await this.clearCache();\n\n // Notify callback\n if (callback) {\n const workflows = await this.scanPlugins();\n callback(workflows);\n }\n });\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/workflow-repository\n *\n * Repository for standalone workflow definitions.\n *\n * ## Features\n * - CRUD operations for user-created workflows\n * - File-based storage via platform.storage (`.kb/workflows/*.yaml`)\n * - Validation using WorkflowSpecSchema\n * - Conversion to unified WorkflowRuntime format\n *\n * ## Usage\n * ```typescript\n * const repo = new WorkflowRepository({ platform });\n * const workflow = await repo.create(spec);\n * ```\n */\n\nimport { randomUUID } from 'node:crypto';\nimport { readFile, writeFile, readdir, mkdir } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { WorkflowSpecSchema } from '@kb-labs/workflow-contracts';\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport type {\n WorkflowRuntime,\n WorkflowTrigger,\n WorkflowSchedule,\n WorkflowStats,\n} from './manifest-scanner';\n\n/**\n * Stored workflow metadata (what we persist to disk)\n */\ninterface StoredWorkflow {\n id: string;\n spec: WorkflowSpec;\n createdAt: string;\n updatedAt: string;\n status: 'active' | 'paused' | 'disabled';\n stats?: WorkflowStats;\n}\n\n/**\n * List options for filtering workflows\n */\nexport interface WorkflowListOptions {\n status?: 'active' | 'paused' | 'disabled';\n tags?: string[];\n limit?: number;\n offset?: number;\n}\n\n/**\n * Options for WorkflowRepository\n */\nexport interface WorkflowRepositoryOptions {\n /** Platform services (for storage, logger, etc.) */\n platform: PlatformServices;\n\n /** Storage directory for workflows (default: '.kb/workflows') */\n storageDir?: string;\n\n /** Workspace root directory (default: process.cwd()) */\n workspaceRoot?: string;\n}\n\n/**\n * Workflow Repository\n *\n * Manages standalone workflow definitions (user-created via UI/API).\n * Uses platform.storage for persistence.\n */\nexport class WorkflowRepository {\n private readonly platform: PlatformServices;\n private readonly storageDir: string;\n private readonly workspaceRoot: string;\n private readonly absoluteStorageDir: string;\n\n constructor(options: WorkflowRepositoryOptions) {\n this.platform = options.platform;\n this.storageDir = options.storageDir ?? '.kb/workflows';\n this.workspaceRoot = options.workspaceRoot ?? process.cwd();\n this.absoluteStorageDir = resolve(this.workspaceRoot, this.storageDir);\n }\n\n /**\n * Create a new standalone workflow.\n */\n async create(spec: WorkflowSpec): Promise<WorkflowRuntime> {\n // Validate spec\n const validated = WorkflowSpecSchema.parse(spec);\n\n // Generate ID\n const id = `wf-${randomUUID().slice(0, 8)}`;\n\n const stored: StoredWorkflow = {\n id,\n spec: validated,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: 'active',\n };\n\n // Save to storage\n await this.saveWorkflow(id, stored);\n\n this.platform.logger?.info('WorkflowRepository: Created workflow', {\n id,\n name: spec.name,\n });\n\n return this.toRuntime(stored);\n }\n\n /**\n * Get workflow by ID.\n */\n async get(id: string): Promise<WorkflowRuntime | null> {\n const stored = await this.loadWorkflow(id);\n return stored ? this.toRuntime(stored) : null;\n }\n\n /**\n * List all workflows with optional filtering.\n */\n async list(options?: WorkflowListOptions): Promise<WorkflowRuntime[]> {\n const allFiles = await this.listWorkflowFiles();\n\n // Load all workflows in parallel\n const allWorkflows = await Promise.all(\n allFiles.map(async filename => {\n const id = filename.replace(/\\.(yaml|yml)$/, '');\n const stored = await this.loadWorkflow(id);\n return stored ? this.toRuntime(stored) : null;\n }),\n );\n\n // Filter out nulls and apply status filter\n const workflows = allWorkflows.filter((workflow): workflow is WorkflowRuntime => {\n if (!workflow) {return false;}\n if (options?.status && workflow.status !== options.status) {return false;}\n return true;\n });\n\n // Apply pagination\n if (options?.offset !== undefined || options?.limit !== undefined) {\n const start = options.offset ?? 0;\n const end = options.limit ? start + options.limit : undefined;\n return workflows.slice(start, end);\n }\n\n return workflows;\n }\n\n /**\n * Update existing workflow.\n */\n async update(id: string, spec: Partial<WorkflowSpec>): Promise<WorkflowRuntime> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n // Merge with existing spec\n const updatedSpec = { ...stored.spec, ...spec };\n\n // Validate merged spec\n const validated = WorkflowSpecSchema.parse(updatedSpec);\n\n const updated: StoredWorkflow = {\n ...stored,\n spec: validated,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n\n this.platform.logger?.info('WorkflowRepository: Updated workflow', {\n id,\n name: validated.name,\n });\n\n return this.toRuntime(updated);\n }\n\n /**\n * Delete workflow.\n */\n async delete(id: string): Promise<void> {\n const path = this.getWorkflowPath(id);\n\n try {\n await this.platform.storage.delete(path);\n this.platform.logger?.info('WorkflowRepository: Deleted workflow', { id });\n } catch (error) {\n this.platform.logger?.error(\n 'WorkflowRepository: Delete failed',\n error instanceof Error ? error : undefined,\n { id }\n );\n throw error;\n }\n }\n\n /**\n * Enable workflow (set status to active).\n */\n async enable(id: string): Promise<void> {\n await this.updateStatus(id, 'active');\n }\n\n /**\n * Disable workflow.\n */\n async disable(id: string): Promise<void> {\n await this.updateStatus(id, 'disabled');\n }\n\n /**\n * Pause workflow.\n */\n async pause(id: string): Promise<void> {\n await this.updateStatus(id, 'paused');\n }\n\n /**\n * Resume workflow (unpause).\n */\n async resume(id: string): Promise<void> {\n await this.updateStatus(id, 'active');\n }\n\n /**\n * Update workflow statistics.\n */\n async updateStats(id: string, stats: Partial<WorkflowStats>): Promise<void> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n const updated: StoredWorkflow = {\n ...stored,\n stats: { ...stored.stats, ...stats } as WorkflowStats,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n private async updateStatus(\n id: string,\n status: 'active' | 'paused' | 'disabled'\n ): Promise<void> {\n const stored = await this.loadWorkflow(id);\n if (!stored) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n const updated: StoredWorkflow = {\n ...stored,\n status,\n updatedAt: new Date().toISOString(),\n };\n\n await this.saveWorkflow(id, updated);\n this.platform.logger?.info('WorkflowRepository: Updated workflow status', {\n id,\n status,\n });\n }\n\n private getWorkflowPath(id: string): string {\n // Try .yml first, then .yaml\n const ymlPath = join(this.absoluteStorageDir, `${id}.yml`);\n const yamlPath = join(this.absoluteStorageDir, `${id}.yaml`);\n\n if (existsSync(ymlPath)) {\n return ymlPath;\n }\n return yamlPath; // Default to .yaml for new files\n }\n\n private async saveWorkflow(id: string, workflow: StoredWorkflow): Promise<void> {\n const path = this.getWorkflowPath(id);\n const yaml = stringifyYaml(workflow, { indent: 2 });\n\n try {\n // Ensure directory exists\n if (!existsSync(this.absoluteStorageDir)) {\n await mkdir(this.absoluteStorageDir, { recursive: true });\n }\n\n await writeFile(path, yaml, 'utf-8');\n } catch (error) {\n this.platform.logger?.error(\n 'WorkflowRepository: Save failed',\n error instanceof Error ? error : undefined,\n { path }\n );\n throw error;\n }\n }\n\n private async loadWorkflow(id: string): Promise<StoredWorkflow | null> {\n const path = this.getWorkflowPath(id);\n\n try {\n if (!existsSync(path)) {\n return null;\n }\n\n const content = await readFile(path, 'utf-8');\n const parsed = parseYaml(content) as any;\n\n // Check if it's already in StoredWorkflow format\n if (parsed.id && parsed.spec && parsed.createdAt) {\n return parsed as StoredWorkflow;\n }\n\n // Otherwise, it's a simple workflow YAML - convert to StoredWorkflow\n const spec: WorkflowSpec = {\n name: parsed.name,\n version: parsed.version || '1.0.0',\n description: parsed.description,\n on: parsed.on || { manual: true },\n isolation: parsed.isolation,\n inputs: parsed.inputs,\n jobs: parsed.jobs,\n env: parsed.env,\n secrets: parsed.secrets,\n };\n\n const stored: StoredWorkflow = {\n id: parsed.id || id,\n spec,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n status: 'active',\n };\n\n return stored;\n } catch (error) {\n // File not found is expected, other errors should be logged\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return null;\n }\n\n this.platform.logger?.error(\n 'WorkflowRepository: Load failed',\n error instanceof Error ? error : undefined,\n { path }\n );\n return null;\n }\n }\n\n private async listWorkflowFiles(): Promise<string[]> {\n try {\n // Check if directory exists\n if (!existsSync(this.absoluteStorageDir)) {\n return [];\n }\n\n // List all .yaml and .yml files in storage directory\n const files = await readdir(this.absoluteStorageDir);\n return files.filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'));\n } catch (error) {\n // Directory doesn't exist yet - return empty array\n if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n return [];\n }\n\n this.platform.logger?.error(\n 'WorkflowRepository: List failed',\n error instanceof Error ? error : undefined\n );\n return [];\n }\n }\n\n /**\n * Convert stored workflow to WorkflowRuntime format.\n */\n private toRuntime(stored: StoredWorkflow): WorkflowRuntime {\n const { id, spec, status, stats } = stored;\n\n // Convert triggers from spec.on to WorkflowTrigger[]\n const triggers: WorkflowTrigger[] = [];\n if (spec.on.manual) {\n triggers.push({ type: 'manual' });\n }\n if (spec.on.push) {\n triggers.push({ type: 'push' });\n }\n if (spec.on.webhook) {\n triggers.push({\n type: 'webhook',\n config: typeof spec.on.webhook === 'object' ? spec.on.webhook : undefined,\n });\n }\n\n // Extract schedule if present\n let schedule: WorkflowSchedule | undefined;\n if (spec.on.schedule) {\n triggers.push({\n type: 'schedule',\n config: spec.on.schedule,\n });\n\n schedule = {\n cron: spec.on.schedule.cron,\n enabled: status === 'active',\n };\n }\n\n // Extract tags from spec (we can use env vars or description as source)\n const tags: string[] = ['standalone'];\n if (spec.description) {\n // Extract hashtags from description\n const hashtagMatches = spec.description.match(/#\\w+/g);\n if (hashtagMatches) {\n tags.push(...hashtagMatches.map((t) => t.slice(1)));\n }\n }\n\n return {\n id,\n source: 'standalone',\n name: spec.name,\n description: spec.description,\n tags,\n triggers,\n schedule,\n status,\n stats,\n // Store full spec for execution\n input: spec,\n // Expose declared input schema for REST API / Studio UI\n inputSchema: spec.inputs,\n };\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/workflow-service\n *\n * Unified service for managing all workflows (manifest-based + standalone).\n *\n * ## Features\n * - Combines ManifestScanner and WorkflowRepository\n * - Unified interface for listing/getting workflows from both sources\n * - Provides available handlers for UI autocomplete\n * - Validates workflow specs\n *\n * ## Usage\n * ```typescript\n * const service = new WorkflowService({ cliApi, platform });\n * const allWorkflows = await service.listAll();\n * const workflow = await service.get('release-manager/create-release');\n * ```\n */\n\nimport { WorkflowSpecSchema } from '@kb-labs/workflow-contracts';\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport { ManifestScanner, type WorkflowRuntime } from './manifest-scanner';\nimport { WorkflowRepository, type WorkflowListOptions } from './workflow-repository';\n\n/**\n * Handler information for UI autocomplete\n */\nexport interface WorkflowHandlerInfo {\n /** Handler ID (e.g., \"release-manager/create-release\") */\n id: string;\n /** Plugin ID */\n pluginId: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Input schema */\n inputSchema?: unknown;\n /** Output schema */\n outputSchema?: unknown;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n errors?: Array<{ path: string; message: string }>;\n}\n\n/**\n * List options for workflows\n */\nexport interface WorkflowServiceListOptions extends WorkflowListOptions {\n /** Filter by source type */\n source?: 'manifest' | 'standalone';\n}\n\n/**\n * Options for WorkflowService\n */\nexport interface WorkflowServiceOptions {\n /** CLI API for plugin manifest scanning */\n cliApi: IEntityRegistry;\n\n /** Platform services */\n platform: PlatformServices;\n\n /** Cache TTL for manifest scanner (ms) */\n manifestCacheTtlMs?: number;\n\n /** Storage directory for standalone workflows */\n workflowStorageDir?: string;\n\n /** Workspace root directory (default: process.cwd()) */\n workspaceRoot?: string;\n}\n\n/**\n * Unified Workflow Service\n *\n * Combines manifest-based and standalone workflows into a single interface.\n */\nexport class WorkflowService {\n private readonly scanner: ManifestScanner;\n private readonly repository: WorkflowRepository;\n private readonly platform: PlatformServices;\n\n constructor(options: WorkflowServiceOptions) {\n this.platform = options.platform;\n\n this.scanner = new ManifestScanner({\n cliApi: options.cliApi,\n platform: options.platform,\n cacheTtlMs: options.manifestCacheTtlMs,\n });\n\n this.repository = new WorkflowRepository({\n platform: options.platform,\n storageDir: options.workflowStorageDir,\n workspaceRoot: options.workspaceRoot,\n });\n }\n\n /**\n * List all workflows (manifest + standalone).\n */\n async listAll(options?: WorkflowServiceListOptions): Promise<WorkflowRuntime[]> {\n const workflows: WorkflowRuntime[] = [];\n\n // Get manifest-based workflows\n if (!options?.source || options.source === 'manifest') {\n const manifestWorkflows = await this.scanner.scanPlugins();\n workflows.push(...manifestWorkflows);\n }\n\n // Get standalone workflows\n if (!options?.source || options.source === 'standalone') {\n const standaloneWorkflows = await this.repository.list(options);\n workflows.push(...standaloneWorkflows);\n }\n\n // Apply filters\n let filtered = workflows;\n\n if (options?.status) {\n filtered = filtered.filter((w) => w.status === options.status);\n }\n\n if (options?.tags && options.tags.length > 0) {\n filtered = filtered.filter((w) =>\n options.tags!.some((tag) => w.tags?.includes(tag))\n );\n }\n\n // Sort by name\n filtered.sort((a, b) => a.name.localeCompare(b.name));\n\n this.platform.logger?.debug('WorkflowService: Listed workflows', {\n total: filtered.length,\n manifest: filtered.filter((w) => w.source === 'manifest').length,\n standalone: filtered.filter((w) => w.source === 'standalone').length,\n });\n\n return filtered;\n }\n\n /**\n * Get workflow by ID (from either source).\n */\n async get(id: string): Promise<WorkflowRuntime | null> {\n // Try standalone first (faster, direct lookup)\n const standalone = await this.repository.get(id);\n if (standalone) {\n return standalone;\n }\n\n // Try manifest-based (requires full scan)\n const manifestWorkflows = await this.scanner.scanPlugins();\n const manifest = manifestWorkflows.find((w) => w.id === id);\n\n return manifest ?? null;\n }\n\n /**\n * Create standalone workflow.\n */\n async create(spec: WorkflowSpec): Promise<WorkflowRuntime> {\n this.platform.logger?.info('WorkflowService: Creating workflow', {\n name: spec.name,\n });\n\n return this.repository.create(spec);\n }\n\n /**\n * Update standalone workflow.\n */\n async update(id: string, spec: Partial<WorkflowSpec>): Promise<WorkflowRuntime> {\n // Verify it's a standalone workflow\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot update manifest-based workflow: ${id}`);\n }\n\n this.platform.logger?.info('WorkflowService: Updating workflow', { id });\n\n return this.repository.update(id, spec);\n }\n\n /**\n * Delete standalone workflow.\n */\n async delete(id: string): Promise<void> {\n // Verify it's a standalone workflow\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot delete manifest-based workflow: ${id}`);\n }\n\n this.platform.logger?.info('WorkflowService: Deleting workflow', { id });\n\n await this.repository.delete(id);\n }\n\n /**\n * Enable workflow (set status to active).\n */\n async enable(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot enable manifest-based workflow: ${id}`);\n }\n\n await this.repository.enable(id);\n }\n\n /**\n * Disable workflow.\n */\n async disable(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot disable manifest-based workflow: ${id}`);\n }\n\n await this.repository.disable(id);\n }\n\n /**\n * Pause workflow.\n */\n async pause(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot pause manifest-based workflow: ${id}`);\n }\n\n await this.repository.pause(id);\n }\n\n /**\n * Resume workflow (unpause).\n */\n async resume(id: string): Promise<void> {\n const workflow = await this.get(id);\n if (!workflow) {\n throw new Error(`Workflow not found: ${id}`);\n }\n\n if (workflow.source !== 'standalone') {\n throw new Error(`Cannot resume manifest-based workflow: ${id}`);\n }\n\n await this.repository.resume(id);\n }\n\n /**\n * Get available workflow handlers (for UI autocomplete).\n *\n * Returns manifest-based handlers that can be used in standalone workflows\n * (via `uses: \"plugin:id/handler\"`).\n */\n async getAvailableHandlers(): Promise<WorkflowHandlerInfo[]> {\n const manifestWorkflows = await this.scanner.scanPlugins();\n\n const handlers = manifestWorkflows\n .filter((w) => w.source === 'manifest' && w.handler)\n .map((w) => ({\n id: w.id,\n pluginId: w.pluginId!,\n name: w.name,\n description: w.description,\n inputSchema: w.input,\n outputSchema: w.output,\n }));\n\n this.platform.logger?.debug('WorkflowService: Listed handlers', {\n count: handlers.length,\n });\n\n return handlers;\n }\n\n /**\n * Validate workflow spec.\n */\n validate(spec: WorkflowSpec): ValidationResult {\n try {\n WorkflowSpecSchema.parse(spec);\n return { valid: true };\n } catch (error) {\n if (error && typeof error === 'object' && 'errors' in error) {\n const zodError = error as { errors: Array<{ path: (string | number)[]; message: string }> };\n return {\n valid: false,\n errors: zodError.errors.map((e) => ({\n path: e.path.join('.'),\n message: e.message,\n })),\n };\n }\n\n return {\n valid: false,\n errors: [{ path: '', message: 'Validation failed' }],\n };\n }\n }\n\n /**\n * Refresh manifest scanner cache (force re-scan).\n */\n async refreshManifests(): Promise<void> {\n await this.scanner.clearCache();\n this.platform.logger?.info('WorkflowService: Manifest cache cleared');\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/workflow-schedule-manager\n *\n * Manages scheduled workflow execution via CronManager.\n *\n * ## Features\n * - Registers scheduled workflows with CronManager\n * - Executes workflows on cron triggers\n * - Tracks next/last run times\n * - Supports both manifest-based jobs and standalone workflows\n *\n * ## Usage\n * ```typescript\n * const scheduleManager = new WorkflowScheduleManager({\n * cronManager,\n * workflowService,\n * executor,\n * platform,\n * });\n *\n * await scheduleManager.registerAll();\n * ```\n */\n\nimport type { ICronManager, CronExpression } from '@kb-labs/core-platform';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport type { WorkflowService } from './workflow-service';\nimport type { WorkflowRuntime } from './manifest-scanner';\n\n/**\n * Workflow executor interface.\n * Executes workflows (will be implemented by workflow engine).\n */\nexport interface WorkflowExecutor {\n /**\n * Execute workflow by ID.\n */\n execute(request: {\n workflowId: string;\n trigger: 'manual' | 'schedule' | 'webhook' | 'push';\n input?: Record<string, unknown>;\n }): Promise<{ runId: string }>;\n}\n\n/**\n * Options for WorkflowScheduleManager\n */\nexport interface WorkflowScheduleManagerOptions {\n /** CronManager instance */\n cronManager: ICronManager;\n\n /** WorkflowService for discovering workflows */\n workflowService: WorkflowService;\n\n /** Workflow executor */\n executor: WorkflowExecutor;\n\n /** Platform services */\n platform: PlatformServices;\n}\n\n/**\n * Workflow Schedule Manager\n *\n * Integrates workflows with CronManager for scheduled execution.\n */\nexport class WorkflowScheduleManager {\n private readonly cronManager: ICronManager;\n private readonly workflowService: WorkflowService;\n private readonly executor: WorkflowExecutor;\n private readonly platform: PlatformServices;\n\n constructor(options: WorkflowScheduleManagerOptions) {\n this.cronManager = options.cronManager;\n this.workflowService = options.workflowService;\n this.executor = options.executor;\n this.platform = options.platform;\n }\n\n /**\n * Register all scheduled workflows with CronManager.\n *\n * Scans both manifest-based jobs and standalone workflows with schedules.\n */\n async registerAll(): Promise<void> {\n const workflows = await this.workflowService.listAll();\n\n const scheduled = workflows.filter(\n (w) => w.schedule && w.schedule.enabled && w.status === 'active'\n );\n\n this.platform.logger?.info('WorkflowScheduleManager: Registering scheduled workflows', {\n total: workflows.length,\n scheduled: scheduled.length,\n });\n\n // Register all workflows in parallel\n await Promise.all(scheduled.map(workflow => this.register(workflow)));\n }\n\n /**\n * Register single workflow schedule.\n */\n async register(workflow: WorkflowRuntime): Promise<void> {\n if (!workflow.schedule || !workflow.schedule.enabled) {\n this.platform.logger?.warn('WorkflowScheduleManager: Cannot register workflow without schedule', {\n id: workflow.id,\n });\n return;\n }\n\n const cronId = this.getCronId(workflow.id);\n const schedule = workflow.schedule.cron as CronExpression;\n\n this.cronManager.register(cronId, schedule, async (context) => {\n this.platform.logger?.info('WorkflowScheduleManager: Executing scheduled workflow', {\n workflowId: workflow.id,\n workflowName: workflow.name,\n runCount: context.runCount,\n });\n\n try {\n const result = await this.executor.execute({\n workflowId: workflow.id,\n trigger: 'schedule',\n input: {},\n });\n\n this.platform.logger?.info('WorkflowScheduleManager: Workflow execution started', {\n workflowId: workflow.id,\n runId: result.runId,\n });\n } catch (error) {\n this.platform.logger?.error(\n 'WorkflowScheduleManager: Workflow execution failed',\n error instanceof Error ? error : undefined,\n {\n workflowId: workflow.id,\n workflowName: workflow.name,\n }\n );\n }\n });\n\n this.platform.logger?.debug('WorkflowScheduleManager: Registered workflow', {\n workflowId: workflow.id,\n schedule: schedule,\n });\n }\n\n /**\n * Unregister workflow schedule.\n */\n async unregister(workflowId: string): Promise<void> {\n const cronId = this.getCronId(workflowId);\n this.cronManager.unregister(cronId);\n\n this.platform.logger?.debug('WorkflowScheduleManager: Unregistered workflow', {\n workflowId,\n });\n }\n\n /**\n * Re-register all schedules (refresh).\n *\n * Useful after workflow changes or service restart.\n */\n async refresh(): Promise<void> {\n // Unregister all workflow cron jobs\n const allJobs = this.cronManager.list();\n for (const job of allJobs) {\n if (job.id.startsWith('workflow:')) {\n this.cronManager.unregister(job.id);\n }\n }\n\n // Re-register all\n await this.registerAll();\n\n this.platform.logger?.info('WorkflowScheduleManager: Refreshed all schedules');\n }\n\n /**\n * Get next run time for scheduled workflow.\n */\n getNextRun(workflowId: string): Date | null {\n const cronId = this.getCronId(workflowId);\n const job = this.cronManager.list().find((j) => j.id === cronId);\n return job?.nextRun ?? null;\n }\n\n /**\n * Get last run time for scheduled workflow.\n */\n getLastRun(workflowId: string): Date | null {\n const cronId = this.getCronId(workflowId);\n const job = this.cronManager.list().find((j) => j.id === cronId);\n return job?.lastRun ?? null;\n }\n\n /**\n * Pause scheduled workflow.\n */\n pause(workflowId: string): void {\n const cronId = this.getCronId(workflowId);\n this.cronManager.pause(cronId);\n\n this.platform.logger?.info('WorkflowScheduleManager: Paused workflow schedule', {\n workflowId,\n });\n }\n\n /**\n * Resume paused workflow schedule.\n */\n resume(workflowId: string): void {\n const cronId = this.getCronId(workflowId);\n this.cronManager.resume(cronId);\n\n this.platform.logger?.info('WorkflowScheduleManager: Resumed workflow schedule', {\n workflowId,\n });\n }\n\n /**\n * List all scheduled workflows.\n */\n listScheduled(): Array<{\n workflowId: string;\n schedule: string;\n status: 'active' | 'paused';\n lastRun?: Date;\n nextRun?: Date;\n runCount: number;\n }> {\n return this.cronManager\n .list()\n .filter((job) => job.id.startsWith('workflow:'))\n .map((job) => ({\n workflowId: this.getWorkflowId(job.id),\n schedule: job.schedule,\n status: job.status,\n lastRun: job.lastRun,\n nextRun: job.nextRun,\n runCount: job.runCount,\n }));\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n private getCronId(workflowId: string): string {\n return `workflow:${workflowId}`;\n }\n\n private getWorkflowId(cronId: string): string {\n return cronId.replace('workflow:', '');\n }\n}\n","import { readFile, readdir } from 'node:fs/promises'\nimport { resolve, join, basename } from 'node:path'\nimport { existsSync } from 'node:fs'\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts'\nimport type { ILogger } from '@kb-labs/core-platform'\nimport { WorkflowLoader } from './workflow-loader'\n\nexport interface WorkflowRegistryEntry {\n id: string\n name: string\n description?: string\n filePath: string\n spec: WorkflowSpec\n metadata?: Record<string, unknown>\n}\n\nexport interface WorkflowRegistryOptions {\n scanDirs: string[]\n cwd?: string\n logger: ILogger\n}\n\n/**\n * WorkflowRegistry - Auto-discovery and indexing of workflow definitions\n *\n * Scans directories for .yml workflow files and indexes them by ID.\n * Provides clean API for finding and running workflows.\n */\nexport class WorkflowRegistry {\n private entries = new Map<string, WorkflowRegistryEntry>()\n private loader: WorkflowLoader\n\n constructor(private readonly options: WorkflowRegistryOptions) {\n this.loader = new WorkflowLoader(options.logger)\n }\n\n /**\n * Scan configured directories and index all workflow files\n */\n async scan(): Promise<void> {\n this.entries.clear()\n\n const cwd = this.options.cwd ?? process.cwd()\n this.options.logger.info('Starting workflow discovery', {\n scanDirs: this.options.scanDirs,\n cwd,\n })\n\n // Sequential directory scanning - each directory is independent but readdir is async\n for (const dir of this.options.scanDirs) {\n const absoluteDir = resolve(cwd, dir)\n\n if (!existsSync(absoluteDir)) {\n this.options.logger.debug(`Directory not found, skipping`, { dir: absoluteDir })\n continue\n }\n\n try {\n const files = await readdir(absoluteDir) // eslint-disable-line no-await-in-loop\n const yamlFiles = files.filter(f => f.endsWith('.yml') || f.endsWith('.yaml'))\n\n this.options.logger.debug(`Found workflow files`, {\n dir: absoluteDir,\n count: yamlFiles.length,\n })\n\n // Index all files in parallel\n await Promise.all( // eslint-disable-line no-await-in-loop\n yamlFiles.map(file => {\n const filePath = join(absoluteDir, file)\n return this.indexFile(filePath)\n }),\n )\n } catch (error) {\n this.options.logger.warn(`Failed to scan directory`, {\n dir: absoluteDir,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n this.options.logger.info('Workflow discovery complete', {\n totalWorkflows: this.entries.size,\n ids: Array.from(this.entries.keys()),\n })\n }\n\n /**\n * Index a single workflow file\n */\n private async indexFile(filePath: string): Promise<void> {\n try {\n const raw = await readFile(filePath, 'utf8')\n const parsed = this.parseWorkflowFile(raw)\n\n // Extract ID from parsed file or use filename as fallback\n const id = parsed.id || basename(filePath, '.yml').replace('.yaml', '')\n\n // Convert to WorkflowSpec format\n const spec: WorkflowSpec = {\n name: parsed.name,\n version: '1.0.0',\n description: parsed.description,\n on: parsed.on || { manual: true }, // Default to manual trigger if not specified\n isolation: parsed.isolation,\n jobs: parsed.jobs,\n env: parsed.env,\n secrets: parsed.secrets,\n }\n\n const entry: WorkflowRegistryEntry = {\n id,\n name: parsed.name,\n description: parsed.description,\n filePath,\n spec,\n metadata: parsed.metadata,\n }\n\n this.entries.set(id, entry)\n\n this.options.logger.debug(`Indexed workflow`, {\n id,\n name: parsed.name,\n filePath,\n })\n } catch (error) {\n this.options.logger.warn(`Failed to index workflow file`, {\n filePath,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n /**\n * Parse workflow file (YAML format with additional fields)\n */\n private parseWorkflowFile(raw: string): any {\n const trimmed = raw.trim()\n if (!trimmed) {\n throw new Error('Workflow file is empty')\n }\n\n // Use WorkflowLoader's parse logic but return raw parsed object\n // We need the extra fields (id, schedule, etc) that aren't in WorkflowSpec\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { parse } = require('yaml')\n return parse(trimmed)\n }\n\n /**\n * Get workflow by ID\n */\n get(id: string): WorkflowRegistryEntry | undefined {\n return this.entries.get(id)\n }\n\n /**\n * List all registered workflows\n */\n list(): WorkflowRegistryEntry[] {\n return Array.from(this.entries.values())\n }\n\n /**\n * Check if workflow exists\n */\n has(id: string): boolean {\n return this.entries.has(id)\n }\n\n /**\n * Get workflow spec by ID\n */\n getSpec(id: string): WorkflowSpec | undefined {\n const entry = this.entries.get(id)\n return entry?.spec\n }\n\n /**\n * Clear all indexed workflows\n */\n clear(): void {\n this.entries.clear()\n }\n}\n","/**\n * @module @kb-labs/workflow-engine/job-manager\n * Job manager for background task execution with sandboxed handlers.\n */\n\nimport type {\n IJobScheduler,\n JobDefinition,\n JobHandle,\n JobStatus,\n JobFilter,\n CronExpression,\n ICache,\n ILogger,\n IEventBus,\n} from '@kb-labs/core-platform';\nimport type { JobHandlerDecl, PluginContextDescriptor } from '@kb-labs/plugin-contracts';\nimport type { IExecutionBackend, ExecutionRequest } from '@kb-labs/core-contracts';\nimport { nanoid } from 'nanoid';\n\n/**\n * Job handler registry entry.\n */\ninterface JobHandlerRegistry {\n pluginId: string;\n jobId: string;\n handlerPath: string;\n config: JobHandlerDecl;\n pluginRoot: string;\n pluginVersion: string;\n}\n\n/**\n * Internal job record stored in cache.\n */\ninterface JobRecord {\n id: string;\n type: string;\n payload: unknown;\n tenantId: string;\n status: JobStatus;\n priority: number;\n maxRetries: number;\n timeout: number;\n attempt: number;\n progress: number;\n result?: unknown;\n error?: string;\n createdAt: string;\n startedAt?: string;\n completedAt?: string;\n runAt?: string;\n idempotencyKey?: string;\n}\n\n/**\n * Job queue entry for scheduling.\n */\ninterface JobQueueEntry {\n jobId: string;\n priority: number;\n availableAt: number;\n}\n\nexport interface JobManagerConfig {\n /** Execution backend for sandboxed handler execution */\n executionBackend?: IExecutionBackend<PluginContextDescriptor>;\n /** Default job timeout in ms (default: 300000 = 5 min) */\n defaultTimeout?: number;\n /** Default max retries (default: 3) */\n defaultMaxRetries?: number;\n /** Default priority (default: 50) */\n defaultPriority?: number;\n /** Workspace root (monorepo root) for plugin execution context */\n workspaceRoot?: string;\n}\n\n/**\n * Job manager - handles background job execution with sandboxed handlers.\n *\n * Features:\n * - Declarative job handlers from plugin manifests\n * - Priority-based queue (0-100, higher = more important)\n * - Retry with exponential/linear backoff\n * - Sandboxed subprocess execution via ExecutionBackend\n * - Progress tracking and status updates\n * - Idempotency support\n *\n * Architecture:\n * 1. Plugin declares job handlers in manifest.json\n * 2. Plugin runtime registers handlers via registerJobHandler()\n * 3. Plugin submits jobs via ctx.api.jobs.submit()\n * 4. JobManager enqueues job in priority queue (platform.cache sorted sets)\n * 5. Worker dequeues job and executes via ExecutionBackend.execute()\n * 6. Handler runs in subprocess with JobContext\n * 7. Results stored in cache, events emitted\n */\nexport class JobManager implements IJobScheduler {\n private handlerRegistry = new Map<string, JobHandlerRegistry>();\n private readonly defaultTimeout: number;\n private readonly defaultMaxRetries: number;\n private readonly defaultPriority: number;\n private readonly workspaceRoot: string;\n\n constructor(\n private readonly cache: ICache,\n private readonly events: IEventBus,\n private readonly logger: ILogger,\n private readonly config: JobManagerConfig = {}\n ) {\n this.defaultTimeout = config.defaultTimeout ?? 300000; // 5 min\n this.defaultMaxRetries = config.defaultMaxRetries ?? 3;\n this.defaultPriority = config.defaultPriority ?? 50;\n this.workspaceRoot = config.workspaceRoot ?? process.cwd(); // Fallback to process.cwd()\n }\n\n /**\n * Register job handler from plugin manifest.\n *\n * Called by plugin-runtime during plugin initialization.\n *\n * @param pluginId - Plugin identifier\n * @param pluginVersion - Plugin version\n * @param pluginRoot - Plugin root directory\n * @param handlerDecl - Job handler declaration from manifest\n */\n registerJobHandler(\n pluginId: string,\n pluginVersion: string,\n pluginRoot: string,\n handlerDecl: JobHandlerDecl\n ): void {\n const jobType = `${pluginId}:${handlerDecl.id}`;\n\n if (this.handlerRegistry.has(jobType)) {\n this.logger.warn('Job handler already registered, overwriting', {\n jobType,\n pluginId,\n jobId: handlerDecl.id,\n });\n }\n\n this.handlerRegistry.set(jobType, {\n pluginId,\n jobId: handlerDecl.id,\n handlerPath: handlerDecl.handler,\n config: handlerDecl,\n pluginRoot,\n pluginVersion,\n });\n\n this.logger.info('Registered job handler', {\n jobType,\n handler: handlerDecl.handler,\n });\n }\n\n /**\n * Submit a job for immediate execution.\n */\n async submit(job: JobDefinition): Promise<JobHandle> {\n // Validate handler exists\n const handlerEntry = this.handlerRegistry.get(job.type);\n if (!handlerEntry) {\n throw new Error(`Job handler not found: ${job.type}`);\n }\n\n // Check idempotency\n if (job.idempotencyKey) {\n const existing = await this.findByIdempotencyKey(job.idempotencyKey);\n if (existing) {\n this.logger.info('Job already submitted (idempotent)', {\n idempotencyKey: job.idempotencyKey,\n existingJobId: existing.id,\n });\n return this.jobRecordToHandle(existing);\n }\n }\n\n // Create job record\n const jobId = nanoid();\n const now = new Date();\n const record: JobRecord = {\n id: jobId,\n type: job.type,\n payload: job.payload,\n tenantId: job.tenantId ?? 'default',\n status: 'pending',\n priority: job.priority ?? this.defaultPriority,\n maxRetries: job.maxRetries ?? handlerEntry.config.maxRetries ?? this.defaultMaxRetries,\n timeout: job.timeout ?? handlerEntry.config.timeout ?? this.defaultTimeout,\n attempt: 0,\n progress: 0,\n createdAt: now.toISOString(),\n runAt: job.runAt?.toISOString(),\n idempotencyKey: job.idempotencyKey,\n };\n\n // Store job record\n await this.saveJobRecord(record);\n\n // Enqueue for execution\n const availableAt = job.runAt ? job.runAt.getTime() : Date.now();\n await this.enqueueJob(jobId, record.priority, availableAt);\n\n this.logger.info('Job submitted', {\n jobId,\n type: job.type,\n tenantId: record.tenantId,\n priority: record.priority,\n });\n\n // Emit event\n await this.events.publish('job.submitted', {\n jobId,\n type: job.type,\n tenantId: record.tenantId,\n });\n\n return this.jobRecordToHandle(record);\n }\n\n /**\n * Schedule a job for future/recurring execution.\n */\n async schedule(job: JobDefinition, schedule: CronExpression | Date): Promise<JobHandle> {\n if (schedule instanceof Date) {\n // One-time scheduled job\n return this.submit({ ...job, runAt: schedule });\n }\n\n // TODO: Cron scheduling - integrate with CronManager\n throw new Error('Cron scheduling not yet implemented');\n }\n\n /**\n * Cancel a pending/running job.\n */\n async cancel(jobId: string): Promise<boolean> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n return false;\n }\n\n if (record.status === 'completed' || record.status === 'failed' || record.status === 'cancelled') {\n this.logger.warn('Cannot cancel job in terminal state', {\n jobId,\n status: record.status,\n });\n return false;\n }\n\n // Update status\n record.status = 'cancelled';\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n // Remove from queue\n await this.removeFromQueue(jobId);\n\n this.logger.info('Job cancelled', { jobId });\n\n // Emit event\n await this.events.publish('job.cancelled', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n });\n\n return true;\n }\n\n /**\n * Get job status.\n */\n async getStatus(jobId: string): Promise<JobHandle | null> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n return null;\n }\n return this.jobRecordToHandle(record);\n }\n\n /**\n * List jobs.\n */\n async list(filter: JobFilter = {}): Promise<JobHandle[]> {\n // TODO: Implement efficient filtering\n // For now, simple scan approach\n const pattern = 'kb:job:*';\n const keys = await this.getAllJobKeys(pattern);\n\n // Fetch all job records in parallel\n const allRecords = await Promise.all(keys.map(key => this.cache.get<JobRecord>(key)));\n\n // Filter out nulls and apply filters\n const records = allRecords.filter((data): data is JobRecord => {\n if (!data) {return false;}\n\n // Apply filters\n if (filter.type && data.type !== filter.type) {return false;}\n if (filter.tenantId && data.tenantId !== filter.tenantId) {return false;}\n if (filter.status && data.status !== filter.status) {return false;}\n\n return true;\n });\n\n // Sort by creation time (newest first)\n records.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());\n\n // Pagination\n const offset = filter.offset ?? 0;\n const limit = filter.limit ?? 100;\n const page = records.slice(offset, offset + limit);\n\n return page.map(r => this.jobRecordToHandle(r));\n }\n\n /**\n * Execute a job (called by worker).\n *\n * @internal\n */\n async executeJob(jobId: string): Promise<void> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n this.logger.error('Job not found for execution', undefined, { jobId });\n return;\n }\n\n const handlerEntry = this.handlerRegistry.get(record.type);\n if (!handlerEntry) {\n this.logger.error('Job handler not found', undefined, { jobId, type: record.type });\n await this.markJobFailed(record, 'Handler not found');\n return;\n }\n\n // Check if execution backend is available\n if (!this.config.executionBackend) {\n this.logger.error('ExecutionBackend not configured', undefined, { jobId });\n await this.markJobFailed(record, 'ExecutionBackend not configured');\n return;\n }\n\n // Update status to running\n record.status = 'running';\n record.attempt += 1;\n record.startedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n // Emit event\n await this.events.publish('job.started', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n attempt: record.attempt,\n });\n\n try {\n // Build execution request\n const executionId = `job-${jobId}-${record.attempt}`;\n const traceId = executionId;\n const spanId = executionId;\n const invocationId = executionId;\n\n // Create minimal descriptor for job context\n const descriptor: PluginContextDescriptor = {\n hostType: 'cron',\n hostContext: {\n host: 'cron',\n cronId: record.type,\n schedule: '', // Not available in job context\n scheduledAt: new Date().toISOString(),\n },\n permissions: handlerEntry.config.permissions ?? {},\n pluginId: handlerEntry.pluginId,\n pluginVersion: '0.0.0', // TODO: Get from manifest\n requestId: executionId,\n tenantId: record.tenantId,\n };\n Object.assign(descriptor as unknown as Record<string, unknown>, {\n traceId,\n spanId,\n invocationId,\n executionId,\n });\n\n const request: ExecutionRequest<PluginContextDescriptor> = {\n executionId,\n descriptor,\n pluginRoot: handlerEntry.pluginRoot,\n handlerRef: handlerEntry.handlerPath,\n input: {\n jobId,\n type: record.type,\n input: record.payload,\n tenantId: record.tenantId,\n attempt: record.attempt,\n },\n timeoutMs: record.timeout,\n };\n\n this.logger.debug('Executing job handler', {\n jobId,\n handler: handlerEntry.handlerPath,\n attempt: record.attempt,\n });\n\n // Execute in subprocess\n const result = await this.config.executionBackend.execute(request, {\n signal: undefined, // TODO: Support cancellation\n });\n\n if (result.ok) {\n // Job succeeded\n record.status = 'completed';\n record.result = result.data;\n record.progress = 100;\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n this.logger.info('Job completed', {\n jobId,\n type: record.type,\n duration: result.executionTimeMs,\n });\n\n await this.events.publish('job.completed', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n result: result.data,\n });\n } else {\n // Job failed\n const errorMsg = result.error?.message ?? 'Unknown error';\n await this.handleJobFailure(record, errorMsg);\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n this.logger.error('Job execution failed', undefined, { jobId, error: errorMsg });\n await this.handleJobFailure(record, errorMsg);\n }\n }\n\n /**\n * Update job progress.\n *\n * Called by job handler via ctx.updateProgress()\n */\n async updateProgress(jobId: string, percent: number, message?: string): Promise<void> {\n const record = await this.getJobRecord(jobId);\n if (!record) {\n this.logger.warn('Cannot update progress: job not found', { jobId });\n return;\n }\n\n record.progress = Math.max(0, Math.min(100, percent));\n await this.saveJobRecord(record);\n\n await this.events.publish('job.progress', {\n jobId,\n type: record.type,\n tenantId: record.tenantId,\n progress: record.progress,\n message,\n });\n }\n\n // ============================================================================\n // Private helpers\n // ============================================================================\n\n private async handleJobFailure(record: JobRecord, errorMsg: string): Promise<void> {\n if (record.attempt < record.maxRetries) {\n // Retry with backoff\n const backoffMs = this.calculateBackoff(record.attempt, record.type);\n const availableAt = Date.now() + backoffMs;\n\n record.status = 'pending';\n await this.saveJobRecord(record);\n await this.enqueueJob(record.id, record.priority, availableAt);\n\n this.logger.info('Job retry scheduled', {\n jobId: record.id,\n attempt: record.attempt,\n maxRetries: record.maxRetries,\n backoffMs,\n });\n\n await this.events.publish('job.retry', {\n jobId: record.id,\n type: record.type,\n tenantId: record.tenantId,\n attempt: record.attempt,\n backoffMs,\n });\n } else {\n // Max retries exceeded\n await this.markJobFailed(record, errorMsg);\n }\n }\n\n private async markJobFailed(record: JobRecord, errorMsg: string): Promise<void> {\n record.status = 'failed';\n record.error = errorMsg;\n record.completedAt = new Date().toISOString();\n await this.saveJobRecord(record);\n\n this.logger.error('Job failed', undefined, {\n jobId: record.id,\n type: record.type,\n error: errorMsg,\n attempt: record.attempt,\n });\n\n await this.events.publish('job.failed', {\n jobId: record.id,\n type: record.type,\n tenantId: record.tenantId,\n error: errorMsg,\n });\n }\n\n private calculateBackoff(attempt: number, jobType: string): number {\n const handlerEntry = this.handlerRegistry.get(jobType);\n const strategy = handlerEntry?.config.retryBackoff ?? 'exp';\n\n if (strategy === 'exp') {\n // Exponential: 1s, 2s, 4s, 8s, ...\n return Math.min(1000 * Math.pow(2, attempt), 60000);\n } else {\n // Linear: 5s, 10s, 15s, 20s, ...\n return Math.min(5000 * (attempt + 1), 60000);\n }\n }\n\n private async saveJobRecord(record: JobRecord): Promise<void> {\n const key = `kb:job:${record.id}`;\n await this.cache.set(key, record, 7 * 24 * 60 * 60 * 1000); // 7 days TTL\n }\n\n private async getJobRecord(jobId: string): Promise<JobRecord | null> {\n const key = `kb:job:${jobId}`;\n return this.cache.get<JobRecord>(key);\n }\n\n private async enqueueJob(jobId: string, priority: number, availableAt: number): Promise<void> {\n const entry: JobQueueEntry = {\n jobId,\n priority,\n availableAt,\n };\n await this.cache.zadd('kb:jobqueue', availableAt, JSON.stringify(entry));\n }\n\n private async removeFromQueue(jobId: string): Promise<void> {\n // Scan queue and remove matching entry\n const results = await this.cache.zrangebyscore('kb:jobqueue', 0, Date.now() + 1000000);\n // Sequential search - must break on first match to avoid unnecessary zrem calls\n for (const raw of results) {\n try {\n const entry = JSON.parse(raw) as JobQueueEntry;\n if (entry.jobId === jobId) {\n await this.cache.zrem('kb:jobqueue', raw); // eslint-disable-line no-await-in-loop\n break;\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n\n private async findByIdempotencyKey(key: string): Promise<JobRecord | null> {\n // TODO: Implement efficient lookup (maybe secondary index)\n const pattern = 'kb:job:*';\n const keys = await this.getAllJobKeys(pattern);\n\n // Fetch all records in parallel and find match\n const records = await Promise.all(keys.map(k => this.cache.get<JobRecord>(k)));\n\n return records.find(record => record?.idempotencyKey === key) ?? null;\n }\n\n private async getAllJobKeys(_pattern: string): Promise<string[]> {\n // TODO: Implement efficient key scanning\n // For now, this is a placeholder - real implementation would use cache.scan()\n // or maintain a separate index\n return [];\n }\n\n private jobRecordToHandle(record: JobRecord): JobHandle {\n return {\n id: record.id,\n type: record.type,\n tenantId: record.tenantId,\n status: record.status,\n progress: record.progress,\n result: record.result,\n error: record.error,\n createdAt: new Date(record.createdAt),\n startedAt: record.startedAt ? new Date(record.startedAt) : undefined,\n completedAt: record.completedAt ? new Date(record.completedAt) : undefined,\n };\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kb-labs/workflow-engine",
|
|
3
3
|
"description": "Workflow orchestration engine for KB Labs.",
|
|
4
|
-
"version": "2.
|
|
4
|
+
"version": "2.79.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -21,15 +21,15 @@
|
|
|
21
21
|
"nanoid": "^5.1.6",
|
|
22
22
|
"yaml": "^2.8.0",
|
|
23
23
|
"zod": "^3.25.76",
|
|
24
|
-
"@kb-labs/
|
|
25
|
-
"@kb-labs/core-
|
|
26
|
-
"@kb-labs/core-
|
|
27
|
-
"@kb-labs/
|
|
28
|
-
"@kb-labs/workflow-
|
|
29
|
-
"@kb-labs/workflow-
|
|
30
|
-
"@kb-labs/workflow-
|
|
31
|
-
"@kb-labs/
|
|
32
|
-
"@kb-labs/plugin-execution": "2.
|
|
24
|
+
"@kb-labs/core-contracts": "2.79.0",
|
|
25
|
+
"@kb-labs/core-platform": "2.79.0",
|
|
26
|
+
"@kb-labs/core-registry": "2.79.0",
|
|
27
|
+
"@kb-labs/plugin-contracts": "2.79.0",
|
|
28
|
+
"@kb-labs/workflow-runtime": "2.79.0",
|
|
29
|
+
"@kb-labs/workflow-artifacts": "2.79.0",
|
|
30
|
+
"@kb-labs/workflow-constants": "2.79.0",
|
|
31
|
+
"@kb-labs/workflow-contracts": "2.79.0",
|
|
32
|
+
"@kb-labs/plugin-execution": "2.79.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/node": "^24.3.3",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"tsup": "^8.5.0",
|
|
41
41
|
"typescript": "^5.6.3",
|
|
42
42
|
"vitest": "^3.2.4",
|
|
43
|
-
"@kb-labs/devkit": "2.
|
|
43
|
+
"@kb-labs/devkit": "2.79.0"
|
|
44
44
|
},
|
|
45
45
|
"engines": {
|
|
46
46
|
"node": ">=20.0.0",
|