@kb-labs/workflow-runtime 1.6.0 → 2.6.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.js +5 -0
- package/dist/index.js.map +1 -1
- package/package.json +10 -10
package/dist/index.js
CHANGED
|
@@ -699,6 +699,7 @@ var WorkspaceWorkflowRegistry = class {
|
|
|
699
699
|
constructor(config) {
|
|
700
700
|
this.config = config;
|
|
701
701
|
}
|
|
702
|
+
config;
|
|
702
703
|
cache = null;
|
|
703
704
|
async list() {
|
|
704
705
|
if (this.cache) {
|
|
@@ -781,6 +782,7 @@ var WorkflowRegistryError = class extends Error {
|
|
|
781
782
|
this.workflowId = workflowId;
|
|
782
783
|
this.name = "WorkflowRegistryError";
|
|
783
784
|
}
|
|
785
|
+
workflowId;
|
|
784
786
|
};
|
|
785
787
|
|
|
786
788
|
// src/registry/composite-registry.ts
|
|
@@ -790,6 +792,9 @@ var CompositeWorkflowRegistry = class {
|
|
|
790
792
|
this.cliApi = cliApi;
|
|
791
793
|
this.remote = remote;
|
|
792
794
|
}
|
|
795
|
+
workspace;
|
|
796
|
+
cliApi;
|
|
797
|
+
remote;
|
|
793
798
|
cache = null;
|
|
794
799
|
async list() {
|
|
795
800
|
if (this.cache) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry/plugin-workflows.ts","../src/context.ts","../src/runners/local-runner.ts","../src/runners/output-normalizer.ts","../src/runners/sandbox-runner.ts","../src/config.ts","../src/registry/workspace-registry.ts","../src/registry/composite-registry.ts","../src/registry/errors.ts","../src/registry/index.ts"],"names":["dirname","join","buildCancelledResult","signalReason","readFile","parseYaml","findWorkflow"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,wBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,wBAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,YAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAkBA,SAAS,yBAAyB,QAAA,EAAqD;AACrF,EAAA,OAAA,CAAQ,QAAA,CAAS,SAAA,IAAa,EAAC,EAAG,IAAI,CAAA,KAAA,MAAU;AAAA,IAC9C,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,YAAY,KAAA,CAAM;AAAA,GACpB,CAAE,CAAA;AACJ;AAQA,eAAsB,iBAAiB,QAAA,EAAyD;AAC9F,EAAA,MAAM,SAAA,GAAY,yBAAyB,QAAQ,CAAA;AACnD,EAAA,MAAM,YAAgC,EAAC;AAEvC,EAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,IAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,KAAA;AAGjC,IAAA,MAAM,gBAAA,GAAmB,QAAA,CAAS,SAAA,EAAW,QAAA,IAAY,EAAC;AAC1D,IAAA,IAAI,gBAAA,CAAiB,WAAW,CAAA,EAAG;AACjC,MAAA;AAAA,IACF;AAKA,IAAA,IAAI,WAAA,GAAc,UAAA;AAClB,IAAA,IAAI,UAAA,GAAa,QAAQ,UAAU,CAAA;AAInC,IAAA,OAAO,UAAA,KAAeA,OAAAA,CAAQ,UAAU,CAAA,EAAG;AACzC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAUC,IAAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AAC/C,QAAA,MAAM,OAAO,OAAO,CAAA;AACpB,QAAA,WAAA,GAAc,UAAA;AACd,QAAA;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,UAAA,GAAaD,QAAQ,UAAU,CAAA;AAAA,MACjC;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,aAAa,gBAAA,EAAkB;AACxC,MAAA,MAAM,KAAK,CAAA,OAAA,EAAU,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,UAAU,EAAE,CAAA,CAAA;AAInD,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,WAAA,EAAa,SAAA,CAAU,OAAO,CAAA;AAEvD,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,EAAA;AAAA,QACA,MAAA,EAAQ,QAAA;AAAA,QACR,QAAA;AAAA,QACA,aAAa,SAAA,CAAU,QAAA;AAAA,QACvB,IAAA,EAAM,MAAA;AAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,eAAe,QAAA,CAAS;AAAA;AAC1B,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AASA,eAAsB,YAAA,CACpB,UACA,EAAA,EACkC;AAElC,EAAA,MAAM,OAAA,GAAU,GAAG,UAAA,CAAW,SAAS,IAAI,EAAA,CAAG,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA,GAAI,EAAA;AAExE,EAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB,QAAQ,CAAA;AACjD,EAAA,OAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAA,IAAM,CAAA,CAAE,EAAA,CAAG,QAAA,CAAS,GAAA,GAAM,OAAO,CAAC,CAAA,IAAK,IAAA;AAC/E;AAzGA,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACqBO,SAAS,kBACd,KAAA,EACa;AACb,EAAA,OAAO;AAAA,IACL,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,OAAA,EAAS,MAAM,OAAA,IAAW,CAAA;AAAA,IAC1B,GAAA,EAAK,EAAE,GAAG,OAAA,CAAQ,KAAK,GAAI,KAAA,CAAM,GAAA,IAAO,EAAC,EAAG;AAAA,IAC5C,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,EAAC;AAAA,IAC3B,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,QAAQ,KAAA,CAAM,MAAA;AAAA;AAAA,IACd,OAAO,KAAA,CAAM;AAAA,GACf;AACF;ACxBA,SAAS,eAAe,IAAA,EAA+B;AACrD,EAAA,MAAM,SAAA,GAAa,IAAA,CAAK,IAAA,IAAQ,EAAC;AACjC,EAAA,MAAM,YAAA,GAAe,SAAA,CAAU,OAAA,IAAW,SAAA,CAAU,OAAO,SAAA,CAAU,MAAA;AACrE,EAAA,OAAO,OAAO,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,IAAA;AAC3D;AAEO,IAAM,cAAN,MAAoC;AAAA,EACxB,KAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAA8B,EAAC,EAAG;AAC5C,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,IAAI,KAAA,IAAS,MAAA;AAAA,EACrD;AAAA,EAEA,MAAM,QAAQ,OAAA,EAA6D;AACzE,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,OAAA;AAC1B,IAAA,MAAM,OAAA,GAAU,eAAe,IAAI,CAAA;AAEnC,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,eAAA,EAAiB;AAC9C,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI;AAAA,QAC9D,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AACD,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,CAAA,4CAAA,EAA+C,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA;AAAA,UACjE,IAAA,EAAM;AAAA;AACR,OACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,6BAAA,EAA+B;AAAA,QAClD,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AACD,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,OAAA,EACE,gFAAA;AAAA,UACF,IAAA,EAAM;AAAA;AACR,OACF;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,GAAA,EAAI;AAC7C,IAAA,MAAM,GAAA,GAAM;AAAA,MACV,GAAG,OAAA,CAAQ,GAAA;AAAA,MACX,GAAG,OAAA,CAAQ,GAAA;AAAA,MACX,GAAG,OAAA,CAAQ;AAAA,KACb;AAEA,IAAA,IAAI,OAAA,CAAQ,QAAQ,OAAA,EAAS;AAC3B,MAAA,OAAO,oBAAA,CAAqB,QAAQ,MAAM,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,8BAAA,EAAgC;AAAA,MAClD,OAAA;AAAA,MACA,GAAA;AAAA,MACA,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,OAAA,EAAS;AAAA,QACzC,GAAA;AAAA,QACA,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,GAAA;AAAA,QACA,KAAA,EAAO,MAAA;AAAA,QACP,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AAED,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,sBAAA,EAAwB;AAAA,QAC1C,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,UAAU,MAAA,CAAO;AAAA,OAClB,CAAA;AAED,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,UAAU,MAAA,CAAO;AAAA;AACnB,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,OAAA,CAAQ,QAAQ,OAAA,EAAS;AAC3B,QAAA,OAAO,oBAAA,CAAqB,OAAA,CAAQ,MAAA,EAAQ,KAAK,CAAA;AAAA,MACnD;AACA,MAAA,MAAM,OAAA,GACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,mBAAA;AAC3C,MAAA,MAAM,WACJ,OAAQ,KAAA,EAAe,QAAA,KAAa,QAAA,GAC/B,MAAc,QAAA,GACf,MAAA;AAEN,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,mBAAA,EAAqB;AAAA,QACxC,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,KAAA,EAAO,OAAA;AAAA,QACP;AAAA,OACD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,OAAA;AAAA,UACA,IAAA,EAAM,uBAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP;AAAA;AACF;AACF,OACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,oBAAA,CACP,QACA,KAAA,EACqB;AACrB,EAAA,MAAM,SACJ,KAAA,YAAiB,KAAA,GACb,MAAM,OAAA,GACN,YAAA,CAAa,MAAM,CAAA,IAAK,0BAAA;AAE9B,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR,GACF;AACF;AAEA,SAAS,aAAa,MAAA,EAAyC;AAC7D,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAU,MAAA,CAA8C,MAAA;AAC9D,EAAA,IAAI,kBAAkB,KAAA,EAAO;AAC3B,IAAA,OAAO,MAAA,CAAO,OAAA;AAAA,EAChB;AACA,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;;;ACxIA,SAAS,gBAAgB,KAAA,EAAiG;AACxH,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACV,UAAA,IAAc,KAAA,IACd,QAAA,IAAY,KAAA,IACZ,OAAQ,KAAA,CAAkC,QAAA,KAAa,QAAA;AAE3D;AAoBO,SAAS,kBAAkB,IAAA,EAAwC;AAExE,EAAA,IAAI,eAAA,CAAgB,IAAI,CAAA,EAAG;AACzB,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA,GAAO,EAAE,MAAA,EAAQ,KAAA,KAAU,EAAC;AAAA,EACtE;AAGA,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,IAAA,EAAM;AACvC,IAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AAAA,EACxB;AAGA,EAAA,OAAO,EAAC;AACV;;;AC4BO,IAAM,gBAAN,MAAsC;AAAA,EAC1B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EAEjB,YAAY,OAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,GAAA,EAAI;AAC1D,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,cAAA,IAAkB,IAAA;AAChD,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,QAAQ,OAAA,EAA6D;AACzE,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAO,GAAI,OAAA;AAClC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAOE,sBAAqB,MAAM,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,OAAA,EAAS,gEAAgE,CAAA;AAAA,IAC5G;AAGA,IAAA,MAAM,aAAa,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,SAAS,OAAO,CAAA;AACtE,IAAA,IAAI,CAAC,WAAW,EAAA,EAAI;AAClB,MAAA,OAAO,UAAA,CAAW,KAAA;AAAA,IACpB;AAGA,IAAA,MAAM,mBAAmB,IAAA,CAAK,qBAAA,CAAsB,UAAA,CAAW,KAAA,EAAO,SAAS,OAAO,CAAA;AAEtF,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAK,0BAAA,EAA4B;AAAA,MAC9C,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,QAAA,EAAU,WAAW,KAAA,CAAM,QAAA;AAAA,MAC3B,OAAA,EAAS,WAAW,KAAA,CAAM,OAAA;AAAA,MAC1B,aAAa,gBAAA,CAAiB;AAAA,KAC/B,CAAA;AAGD,IAAA,IAAA,CAAK,SAAA,EAAW,MAAM,oCAAA,EAAsC;AAAA,MAC1D,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,QAAA,EAAU,WAAW,KAAA,CAAM,QAAA;AAAA,MAC3B,OAAA,EAAS,WAAW,KAAA,CAAM,OAAA;AAAA,MAC1B,MAAM,IAAA,CAAK;AAAA,KACZ,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEjB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,gBAAA,EAAkB,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAC5F,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG9B,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,IAAA,CAAK,SAAA,EAAW,MAAM,sCAAA,EAAwC;AAAA,QAC5D,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,QAAA,EAAU,WAAW,KAAA,CAAM,QAAA;AAAA,QAC3B,OAAA,EAAS,WAAW,KAAA,CAAM,OAAA;AAAA,QAC1B,UAAA,EAAY;AAAA,OACb,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACnB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,EAAW,MAAM,mCAAA,EAAqC;AAAA,QACzD,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,QAAA,EAAU,WAAW,KAAA,CAAM,QAAA;AAAA,QAC3B,OAAA,EAAS,WAAW,KAAA,CAAM,OAAA;AAAA,QAC1B,SAAA,EAAW,OAAO,KAAA,EAAO,IAAA;AAAA,QACzB,YAAA,EAAc,OAAO,KAAA,EAAO,OAAA;AAAA,QAC5B,UAAA,EAAY;AAAA,OACb,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACnB;AAGA,IAAA,OAAO,KAAK,kBAAA,CAAmB,MAAA,EAAQ,gBAAA,CAAiB,WAAA,EAAa,SAAS,MAAM,CAAA;AAAA,EACtF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,CAAqB,SAA0C,OAAA,EAAsC;AAC3G,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,iCAAA,EAAmC,EAAE,QAAQ,OAAA,CAAQ,MAAA,EAAQ,SAAS,CAAA;AAC3F,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,EAAE,OAAA,EAAS,IAAA,EAAM,cAAA;AAAe,KACzC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,CACZ,IAAA,EACA,OAAA,EACA,OAAA,EACmG;AACnG,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA,CAAe,MAAM,OAAO,CAAA;AAC1D,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,UAAA,EAAW;AAAA,IACvC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,kCAAA;AACzD,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,kCAAA,EAAoC;AAAA,QACvD,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,KAAA;AAAA,QACJ,KAAA,EAAO;AAAA,UACL,MAAA,EAAQ,QAAA;AAAA,UACR,KAAA,EAAO,EAAE,OAAA,EAAS,IAAA,EAAM,2BAAA;AAA4B;AACtD,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAA,CACN,UAAA,EACA,OAAA,EACA,OAAA,EACkB;AAClB,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,EAAO,OAAA,IAAW,UAAA,EAAW;AACvD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,EAAO,OAAA,IAAW,SAAA;AAC1C,IAAA,MAAM,WAAA,GAAc,CAAA,KAAA,EAAQ,OAAA,CAAQ,MAAM,IAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACpF,IAAA,MAAM,MAAA,GAAS,WAAA;AACf,IAAA,MAAM,YAAA,GAAe,WAAA;AAErB,IAAA,MAAM,WAAA,GAA2B;AAAA,MAC/B,IAAA,EAAM,UAAA;AAAA,MACN,YAAY,OAAA,CAAQ,KAAA;AAAA,MACpB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,OAAO,UAAA,CAAW;AAAA,KACpB;AAEA,IAAA,MAAM,UAAA,GAAsC;AAAA,MAC1C,QAAA,EAAU,UAAA;AAAA,MACV,UAAU,UAAA,CAAW,QAAA;AAAA,MACrB,eAAe,UAAA,CAAW,aAAA;AAAA,MAC1B,SAAA;AAAA,MACA,aAAa,UAAA,CAAW,WAAA;AAAA,MACxB,WAAA;AAAA,MACA,eAAe,UAAA,CAAW;AAAA;AAAA,KAC5B;AACA,IAAA,MAAA,CAAO,OAAO,UAAA,EAAkD;AAAA,MAC9D,OAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAY,UAAA,CAAW,UAAA;AAAA,MACvB,YAAY,UAAA,CAAW,OAAA;AAAA,MACvB,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,SAAA,EAAW,QAAQ,SAAA,GACf;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,KAAK,OAAA,CAAQ;AAAA,OACf,GACA,MAAA;AAAA,MACJ,SAAA,EAAW,UAAA,CAAW,WAAA,CAAY,MAAA,EAAQ,aAAa,IAAA,CAAK,cAAA;AAAA,MAC5D,QAAQ,OAAA,CAAQ;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAA,CACN,MAAA,EACA,WAAA,EACA,OAAA,EACA,MAAA,EACqB;AACrB,IAAA,IAAI,OAAO,EAAA,EAAI;AAEb,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAGpB,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,kCAAA,EAAoC;AAAA,QACvD,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,WAAA;AAAA,QACA,UAAU,OAAO,IAAA;AAAA,QACjB,QAAA,EAAU,QAAQ,OAAO,IAAA,KAAS,WAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,GAAI,EAAC;AAAA,QAClE,WAAW,CAAC,EAAE,QAAQ,OAAO,IAAA,KAAS,YAAY,IAAA,CAAK,MAAA,CAAA;AAAA,QACvD,WAAW,CAAC,EAAE,QAAQ,OAAO,IAAA,KAAS,YAAY,IAAA,CAAK,MAAA;AAAA,OACxD,CAAA;AAED,MAAA,MAAM,OAAA,GAAmC;AAAA,QACvC,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,WAAA;AAAA,QACA,iBAAiB,MAAA,CAAO;AAAA,OAC1B;AAGA,MAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,QAAA,IAAI,KAAK,MAAA,EAAQ;AAAC,UAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,MAAA;AAAA,QAAO;AAC/C,QAAA,IAAI,KAAK,MAAA,EAAQ;AAAC,UAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,MAAA;AAAA,QAAO;AAC/C,QAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAAC,UAAA,OAAA,CAAQ,WAAW,IAAA,CAAK,QAAA;AAAA,QAAS;AAAA,MACrE;AAEA,MAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,0BAAA,EAA4B,OAAO,CAAA;AAIvD,MAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,OAAO,KAAA,EAAO;AACzD,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,GACjB,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAChC,CAAA,yCAAA,EAA4C,IAAA,CAAK,YAAY,SAAS,CAAA,CAAA,CAAA;AAC1E,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,8CAAA,EAAgD;AAAA,UACnE,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,QAAQ,IAAA,CAAK;AAAA,SACd,CAAA;AACD,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,QAAA;AAAA,UACR,KAAA,EAAO;AAAA,YACL,OAAA;AAAA,YACA,IAAA,EAAM;AAAA;AACR,SACF;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,iBAAA,CAAkB,MAAA,CAAO,IAAI;AAAA,OACxC;AAAA,IACF;AAGA,IAAA,IAAI,MAAA,EAAQ,OAAA,IAAW,MAAA,CAAO,KAAA,EAAO,SAAS,SAAA,EAAW;AACvD,MAAA,OAAOA,qBAAAA,CAAqB,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA;AAAA,IAClD;AAGA,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,uBAAA,EAAyB;AAAA,MAC5C,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAA;AAAA,MACA,KAAA,EAAO,OAAO,KAAA,EAAO,OAAA;AAAA,MACrB,IAAA,EAAM,OAAO,KAAA,EAAO;AAAA,KACrB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,yBAAA;AAAA,QAClC,IAAA,EAAM,MAAA,CAAO,KAAA,EAAO,IAAA,IAAQ,eAAA;AAAA,QAC5B,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA;AAAA,QACrB,OAAA,EAAS,OAAO,KAAA,EAAO;AAAA;AACzB,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,cAAA,CACZ,IAAA,EACA,OAAA,EACkC;AAClC,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,IAAQ,EAAC;AAE5B,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AAC9B,MAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,IAAA,EAAM,KAAK,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,EAAG;AAC/B,MAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,SAAS,eAAA,EAAiB;AAC5B,MAAA,OAAO,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,IACtC;AAEA,IAAA,IAAI,IAAA,KAAS,kBAAA,IAAsB,IAAA,KAAS,cAAA,EAAgB;AAC1D,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,0DAAA,CAA4D,CAAA;AAAA,IACrF;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,IAAI,CAAA,0DAAA,CAA4D,CAAA;AAAA,EAC9G;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,oBAAA,CACZ,IAAA,EACA,KAAA,EACkC;AAClC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,MAAM,CAAA;AAC7C,IAAA,MAAM,CAAC,QAAA,EAAU,GAAG,YAAY,CAAA,GAAI,SAAA,CAAU,MAAM,GAAG,CAAA;AAEvD,IAAA,IAAI,CAAC,QAAA,IAAY,YAAA,CAAa,MAAA,KAAW,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,IAAI,CAAA,8BAAA,CAAgC,CAAA;AAAA,IACnF;AAEA,IAAA,MAAM,WAAA,GAAc,YAAA,CAAa,IAAA,CAAK,GAAG,CAAA;AAGzC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,EAAS;AAEtC,IAAA,MAAM,KAAA,GAAQ,SAAS,SAAA,EAAW,IAAA;AAAA,MAAK,CAAC,CAAA,KACtC,CAAA,CAAE,QAAA,KAAa,QAAA,IAAY,EAAE,QAAA,CAAS,QAAA,CAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE;AAAA,KAC/D;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAE,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,QAAA,CAAS,SAAA,EAAW,YAAY,EAAC;AAChE,IAAA,MAAM,UAAU,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAA,KAAsB,CAAA,CAAE,OAAO,WAAW,CAAA;AAEjF,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,WAAW,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAE,CAAA;AAAA,IACpF;AAEA,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,aAAA,EAAe,MAAM,QAAA,CAAS,OAAA;AAAA,MAC9B,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,SAAS,OAAA,CAAQ,OAAA;AAAA;AAAA,MACjB,KAAA;AAAA,MACA,WAAA,EAAa,qBAAA,CAAsB,KAAA,CAAM,QAAA,EAAU,YAAY,WAAW;AAAA,KAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAc,iBAAA,CACZ,IAAA,EACA,KAAA,EACA,OAAA,EACkC;AAClC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,EAAS;AAGtC,IAAA,KAAA,MAAW,KAAA,IAAS,QAAA,CAAS,SAAA,IAAa,EAAC,EAAG;AAC5C,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,YAAY,EAAC;AAClD,MAAA,MAAM,UAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAsB,CAAA,CAAE,OAAO,WAAW,CAAA;AAEzE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAO;AAAA,UACL,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,aAAA,EAAe,MAAM,QAAA,CAAS,OAAA;AAAA,UAC9B,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,UACjB,KAAA,EAAO,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,OAAO,CAAA;AAAA;AAAA,UAC3C,WAAA,EAAa,qBAAA,CAAsB,KAAA,CAAM,QAAA,EAAU,OAAO,WAAW,CAAA;AAAA,UACrE,aAAA,EAAe,MAAM,QAAA,CAAS;AAAA;AAAA,SAChC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,WAAW,CAAA,CAAE,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,gBAAA,CAAiB,OAAgB,OAAA,EAAwC;AAE/E,IAAA,IAAI,SAAS,OAAO,KAAA,KAAU,aAAa,MAAA,IAAU,KAAA,IAAS,WAAW,KAAA,CAAA,EAAQ;AAC/E,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,OAAO;AAAA,MACL,MAAM,EAAC;AAAA,MACP,KAAA,EAAO,SAAS,EAAC;AAAA,MACjB,GAAA,EAAK,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK;AAAA,KACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,oBACZ,IAAA,EACkC;AAGlC,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAA,IAAA,CAAY,OAAA,CAAQ,4BAA4B,CAAA;AAE1E,IAAA,MAAM,YAAA,GAAe,YAAY,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA,CAAE,OAAA,CAAQ,kBAAkB,EAAE,CAAA;AAGpF,IAAA,MAAM,SAAA,GAAa,IAAA,CAAK,IAAA,IAAQ,EAAC;AACjC,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,IAAW,SAAA,CAAU,OAAO,SAAA,CAAU,MAAA;AAEhE,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,OAAA;AAAA,MACA,KAAK,OAAO,SAAA,CAAU,GAAA,KAAQ,QAAA,GAAY,UAAU,GAAA,GAAiC,MAAA;AAAA,MACrF,SAAS,OAAO,SAAA,CAAU,OAAA,KAAY,QAAA,GAAW,UAAU,OAAA,GAAU,MAAA;AAAA,MACrE,cAAc,OAAO,SAAA,CAAU,YAAA,KAAiB,SAAA,GAAY,UAAU,YAAA,GAAe;AAAA,KACvF;AAEA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,4BAAA;AAAA,MACV,aAAA,EAAe,OAAA;AAAA,MACf,UAAA,EAAY,YAAA;AAAA,MACZ,OAAA,EAAS,eAAA;AAAA;AAAA,MACT,KAAA,EAAO,UAAA;AAAA,MACP,WAAA,EAAa;AAAA,QACX,KAAA,EAAO,EAAE,KAAA,EAAO,CAAC,GAAG,CAAA;AAAE;AAAA;AACxB,KACF;AAAA,EACF;AACF;AAEA,SAASA,qBAAAA,CACP,QACA,KAAA,EACqB;AACrB,EAAA,MAAM,MAAA,GAAS,KAAA,EAAO,OAAA,IAAWC,aAAAA,CAAa,MAAM,CAAA,IAAK,0BAAA;AAEzD,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,WAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR,GACF;AACF;AAEA,SAASA,cAAa,MAAA,EAA0C;AAC9D,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAU,MAAA,CAA8C,MAAA;AAC9D,EAAA,IAAI,kBAAkB,KAAA,EAAO;AAC3B,IAAA,OAAO,MAAA,CAAO,OAAA;AAAA,EAChB;AACA,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AC9jBO,IAAM,6BAAA,GAAgC,EAAE,MAAA,CAAO;AAAA,EACpD,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACtB,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI;AAAA,EACpB,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EACzB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAC5B,CAAC;AAEM,IAAM,kBAAA,GAAqB,EAAE,MAAA,CAAO;AAAA,EACzC,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,EAClC,OAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA;AAAA,EACtC,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EAC7D,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,QAAQ,QAAQ,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA;AAAA,EAEzD,cAAA,EAAgB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC7B,CAAC;AAEM,IAAM,oBAAA,GAAuB,EAAE,MAAA,CAAO;AAAA,EAC3C,UAAA,EAAY,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,wBAAwB,CAAC,CAAA;AAAA,EAClE,OAAA,EAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,EACjC,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,6BAA6B,EAAE,QAAA,EAAS;AAAA,EACzD,QAAA,EAAU,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,CAAC,CAAA;AAAA,EAC/C,MAAA,EAAQ,mBAAmB,QAAA,EAAS;AAAA,EACpC,QAAA,EAAU,EACP,MAAA,CAAO;AAAA,IACN,IAAA,EAAM,EAAE,IAAA,CAAK,CAAC,QAAQ,iBAAiB,CAAC,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,IACxD,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI;AAAA,GACrC,EACA,QAAA;AACL,CAAC;AASD,eAAsB,mBACpB,aAAA,EACyB;AACzB,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,EAAe,gBAAgB,CAAA;AAEvD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAE7B,IAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,MAAA,OAAO,oBAAA,CAAqB,KAAA,CAAM,EAAE,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,oBAAA,CAAqB,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAAA,EACnD,SAAS,KAAA,EAAO;AAEd,IAAA,IACE,KAAA,YAAiB,KAAA,KAChB,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,IAC9B,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,kBAAkB,CAAA,CAAA,EAC3C;AACA,MAAA,OAAO,oBAAA,CAAqB,KAAA,CAAM,EAAE,CAAA;AAAA,IACtC;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAMA,eAAsB,kBAAA,CACpB,eACA,OAAA,EACe;AACf,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,EAAe,gBAAgB,CAAA;AAGvD,EAAA,IAAI,iBAAsB,EAAC;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAC9C,IAAA,cAAA,GAAiB,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AAEN,IAAA,cAAA,GAAiB,EAAC;AAAA,EACpB;AAGA,EAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,QAAA,IAAY,EAAC;AACpD,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,GAAG,eAAA;AAAA,IACH,GAAG,OAAA;AAAA;AAAA,IAEH,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,eAAA,CAAgB;AAAA,GAC9C;AAGA,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,GAAG,cAAA;AAAA,IACH,QAAA,EAAU;AAAA,GACZ;AAGA,EAAA,MAAM,MAAM,OAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAGpD,EAAA,MAAM,SAAA;AAAA,IACJ,UAAA;AAAA,IACA,IAAA,CAAK,SAAA,CAAU,aAAA,EAAe,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA;AAAA,IACzC;AAAA,GACF;AACF;AChGO,IAAM,4BAAN,MAA4D;AAAA,EAGjE,YAA6B,MAAA,EAAyC;AAAzC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAA0C;AAAA,EAF/D,KAAA,GAAmC,IAAA;AAAA,EAI3C,MAAM,IAAA,GAAoC;AACxC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AAEA,IAAA,MAAM,YAAgC,EAAC;AAGvC,IAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,IAAA,CAAK,OAAO,QAAA,EAAU;AAAA,MAC3C,GAAA,EAAK,KAAK,MAAA,CAAO,aAAA;AAAA,MACjB,QAAA,EAAU,IAAA;AAAA,MACV,SAAA,EAAW,IAAA;AAAA,MACX,MAAA,EAAQ,CAAC,iBAAA,EAAmB,SAAA,EAAW,SAAS;AAAA,KACjD,CAAA;AAGD,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC5B,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAS;AACxB,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AAC7C,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,YAAA,GAAe,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,eAAe,IAAI,CAAA;AAC7D,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,YAAY,CAAA;AAEvC,QAAA,OAAO;AAAA,UACL,EAAA;AAAA,UACA,MAAA,EAAQ,WAAA;AAAA,UACR,QAAA,EAAU,IAAA;AAAA,UACV,aAAa,IAAA,CAAK;AAAA;AAAA,SAEpB;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,UAAU,IAAA,EAAM;AAC1D,QAAA,SAAA,CAAU,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AAEvC,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,sDAAA;AAAA,UACA,MAAA,CAAO,kBAAkB,KAAA,GAAQ,MAAA,CAAO,OAAO,OAAA,GAAU,MAAA,CAAO,OAAO,MAAM;AAAA,SAC/E;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAA;AACb,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,EAAA,EAA8C;AAE1D,IAAA,MAAM,OAAA,GAAU,GAAG,UAAA,CAAW,YAAY,IAAI,EAAA,CAAG,KAAA,CAAM,YAAA,CAAa,MAAM,CAAA,GAAI,EAAA;AAE9E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,EAAK;AAC5B,IAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAA,IAAM,CAAA,CAAE,EAAA,CAAG,QAAA,CAAS,GAAA,GAAM,OAAO,CAAC,CAAA,IAAK,IAAA;AAAA,EACzE;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,EACf;AAAA,EAEA,MAAM,OAAA,GAAyB;AAAA,EAE/B;AAAA,EAEA,MAAc,iBACZ,QAAA,EAC8B;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAMC,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,GACpC,KAAK,KAAA,CAAM,GAAG,CAAA,GACdC,KAAA,CAAU,GAAG,CAAA;AAEjB,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,SAAA,CAAU,MAAM,CAAA;AAClD,MAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,MAAA,CAAO,IAAA;AAAA,IAChB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,WAAW,YAAA,EAA8B;AAE/C,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,oBAAA,EAAsB,EAAE,CAAA;AAEhE,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAChD,IAAA,OAAO,aAAa,UAAU,CAAA,CAAA;AAAA,EAChC;AACF;;;AChHA,qBAAA,EAAA;;;ACDO,IAAM,qBAAA,GAAN,cAAoC,KAAA,CAAM;AAAA,EAC/C,WAAA,CACE,SACgB,UAAA,EAChB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAFG,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF;;;ADDO,IAAM,4BAAN,MAA4D;AAAA,EAGjE,WAAA,CACmB,SAAA,EACA,MAAA,EACA,MAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAChB;AAAA,EANK,KAAA,GAAmC,IAAA;AAAA,EAQ3C,MAAM,IAAA,GAAoC;AACxC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AAEA,IAAA,MAAM,UAAA,GAA4C;AAAA,MAChD,IAAA,CAAK,UAAU,IAAA;AAAK,KACtB;AAGA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,EAAS;AACtC,MAAA,UAAA,CAAW,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAC,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,IACpC;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,QAAQ,IAAA,EAAK;AAGlC,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,IAAA,MAAM,YAAsB,EAAC;AAE7B,IAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,MAAA,IAAI,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA,EAAG;AAClB,QAAA,SAAA,CAAU,IAAA,CAAK,GAAG,EAAE,CAAA;AAAA,MACtB;AACA,MAAA,GAAA,CAAI,GAAA,CAAI,GAAG,EAAE,CAAA;AAAA,IACf;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,gCAAA,EAAmC,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,0EAAA;AAAA,OAEzD;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,YAAA;AACb,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,EAAA,EAA8C;AAE1D,IAAA,IAAI,EAAA,CAAG,UAAA,CAAW,YAAY,CAAA,EAAG;AAC/B,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,EAAE,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,EAAA,CAAG,UAAA,CAAW,SAAS,CAAA,IAAK,KAAK,MAAA,EAAQ;AAC3C,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,EAAS;AACtC,MAAA,MAAM,EAAE,YAAA,EAAAC,aAAAA,EAAa,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,qBAAA,EAAA,EAAA,wBAAA,CAAA,CAAA;AAC/B,MAAA,OAAOA,aAAAA,CAAa,UAAU,EAAE,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,EAAA,CAAG,UAAA,CAAW,SAAS,CAAA,IAAK,KAAK,MAAA,EAAQ;AAC3C,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,IAC/B;AAGA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,EAAK;AAC5B,IAAA,MAAM,UAAU,GAAA,CAAI,MAAA;AAAA,MAClB,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA,CAAE,EAAA,CAAG,QAAA,CAAS,GAAA,GAAM,EAAE;AAAA,KAC9C;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR,CAAA,uBAAA,EAA0B,EAAE,CAAA,qBAAA,EAAwB,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,wDAAA,CAAA;AAAA,QAEvF;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,OAAA,CAAQ,CAAC,CAAA,IAAK,IAAA;AAAA,EACvB;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,IAAA,CAAK,UAAU,OAAA;AAAQ,KACzB;AAEA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA;AAAA,IACzC;AACA,IAAA,MAAM,OAAA,CAAQ,IAAI,YAAY,CAAA;AAAA,EAChC;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChB,IAAA,CAAK,SAAA,CAAU,OAAA,IAAU,IAAK,QAAQ,OAAA,EAAQ;AAAA,MAC9C,IAAA,CAAK,MAAA,EAAQ,OAAA,IAAU,IAAK,QAAQ,OAAA;AAAQ,KAC7C,CAAA;AAAA,EACH;AACF;;;AE9GA,qBAAA,EAAA","file":"index.js","sourcesContent":["/**\n * Extract workflows from CLI API registry snapshot\n *\n * Uses the same pattern as REST API - no local discovery, just snapshot extraction.\n */\n\nimport { join, resolve, dirname } from 'node:path'\nimport { access } from 'node:fs/promises'\nimport type { RegistrySnapshot } from '@kb-labs/core-registry'\nimport type { ManifestV3 } from '@kb-labs/plugin-contracts'\nimport type { ResolvedWorkflow } from './types'\n\ninterface SnapshotManifestEntry {\n pluginId: string\n manifest: ManifestV3\n pluginRoot: string\n}\n\nfunction extractSnapshotManifests(snapshot: RegistrySnapshot): SnapshotManifestEntry[] {\n return (snapshot.manifests || []).map(entry => ({\n pluginId: entry.pluginId,\n manifest: entry.manifest,\n pluginRoot: entry.pluginRoot,\n }))\n}\n\n/**\n * Extract workflows from registry snapshot\n *\n * @param snapshot - CLI API registry snapshot\n * @returns Array of resolved workflows from plugin manifests\n */\nexport async function extractWorkflows(snapshot: RegistrySnapshot): Promise<ResolvedWorkflow[]> {\n const manifests = extractSnapshotManifests(snapshot)\n const workflows: ResolvedWorkflow[] = []\n\n for (const entry of manifests) {\n const { manifest, pluginRoot } = entry\n\n // Skip plugins without workflow handlers\n const workflowHandlers = manifest.workflows?.handlers ?? []\n if (workflowHandlers.length === 0) {\n continue\n }\n\n // Find package root by walking up from pluginRoot until we find package.json\n // This ensures we resolve workflows relative to the actual package root, not dist/\n // pluginRoot might be dist/ (where manifest is), but workflows are in package root\n let packageRoot = pluginRoot\n let currentDir = resolve(pluginRoot)\n\n // IMPORTANT: Directory traversal must be sequential (walking up parent directories)\n /* eslint-disable no-await-in-loop */\n while (currentDir !== dirname(currentDir)) {\n try {\n const pkgPath = join(currentDir, 'package.json')\n await access(pkgPath)\n packageRoot = currentDir\n break\n } catch {\n currentDir = dirname(currentDir)\n }\n }\n /* eslint-enable no-await-in-loop */\n\n for (const wfHandler of workflowHandlers) {\n const id = `plugin:${entry.pluginId}/${wfHandler.id}`\n\n // Resolve workflow handler file relative to package root\n // Handler files are included via package.json \"files\" field\n const filePath = resolve(packageRoot, wfHandler.handler)\n\n workflows.push({\n id,\n source: 'plugin',\n filePath,\n description: wfHandler.describe,\n tags: undefined, // V3 doesn't have tags on workflow handlers\n metadata: {\n pluginId: entry.pluginId,\n pluginVersion: manifest.version,\n },\n })\n }\n }\n\n return workflows\n}\n\n/**\n * Find workflow by ID in registry snapshot\n *\n * @param snapshot - CLI API registry snapshot\n * @param id - Workflow ID (with or without \"plugin:\" prefix)\n * @returns Resolved workflow or null if not found\n */\nexport async function findWorkflow(\n snapshot: RegistrySnapshot,\n id: string,\n): Promise<ResolvedWorkflow | null> {\n // Remove plugin: prefix if present\n const cleanId = id.startsWith('plugin:') ? id.slice('plugin:'.length) : id\n\n const workflows = await extractWorkflows(snapshot)\n return workflows.find((w) => w.id === id || w.id.endsWith(':' + cleanId)) ?? null\n}\n","import type {\n ArtifactClient,\n RuntimeEvents,\n RuntimeLogger,\n RuntimeTrace,\n StepContext,\n} from './types'\n\nexport interface CreateStepContextInput {\n runId: string\n jobId: string\n stepId: string\n attempt?: number\n env?: Record<string, string>\n secrets?: Record<string, string>\n artifacts?: ArtifactClient\n events?: RuntimeEvents\n logger: RuntimeLogger // Required - must use platform.logger\n trace?: RuntimeTrace\n}\n\nexport function createStepContext(\n input: CreateStepContextInput,\n): StepContext {\n return {\n runId: input.runId,\n jobId: input.jobId,\n stepId: input.stepId,\n attempt: input.attempt ?? 0,\n env: { ...process.env, ...(input.env ?? {}) } as Record<string, string>,\n secrets: input.secrets ?? {},\n artifacts: input.artifacts,\n events: input.events,\n logger: input.logger, // Use provided logger (platform.logger)\n trace: input.trace,\n }\n}\n\n\n\n\n\n","import { execaCommand } from 'execa'\nimport type { StepSpec } from '@kb-labs/workflow-contracts'\nimport type {\n Runner,\n StepExecutionRequest,\n StepExecutionResult,\n} from '../types'\n\nexport interface LocalRunnerOptions {\n shell?: string\n}\n\nfunction resolveCommand(step: StepSpec): string | null {\n const withBlock = (step.with ?? {}) as Record<string, unknown>\n const commandField = withBlock.command ?? withBlock.run ?? withBlock.script\n return typeof commandField === 'string' ? commandField : null\n}\n\nexport class LocalRunner implements Runner {\n private readonly shell: string\n\n constructor(options: LocalRunnerOptions = {}) {\n this.shell = options.shell ?? process.env.SHELL ?? 'bash'\n }\n\n async execute(request: StepExecutionRequest): Promise<StepExecutionResult> {\n const { spec, context } = request\n const command = resolveCommand(spec)\n\n if (spec.uses && spec.uses !== 'builtin:shell') {\n context.logger.error(`LocalRunner cannot execute ${spec.uses}`, {\n stepId: context.stepId,\n })\n return {\n status: 'failed',\n error: {\n message: `Local runner cannot execute step with uses=\"${spec.uses}\"`,\n code: 'UNSUPPORTED_STEP',\n },\n }\n }\n\n if (!command) {\n context.logger.error('LocalRunner missing command', {\n stepId: context.stepId,\n })\n return {\n status: 'failed',\n error: {\n message:\n 'Local runner requires \"with.command\" (or with.run/with.script) to be specified',\n code: 'INVALID_STEP',\n },\n }\n }\n\n const cwd = request.workspace ?? process.cwd()\n const env = {\n ...process.env,\n ...context.env,\n ...context.secrets,\n }\n\n if (request.signal?.aborted) {\n return buildCancelledResult(request.signal)\n }\n\n context.logger.info('Executing builtin shell step', {\n command,\n cwd,\n stepId: context.stepId,\n })\n\n try {\n const result = await execaCommand(command, {\n cwd,\n shell: this.shell,\n env,\n stdio: 'pipe',\n signal: request.signal,\n })\n\n context.logger.info('Shell step completed', {\n stepId: context.stepId,\n exitCode: result.exitCode,\n })\n\n return {\n status: 'success',\n outputs: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n },\n }\n } catch (error) {\n if (request.signal?.aborted) {\n return buildCancelledResult(request.signal, error)\n }\n const message =\n error instanceof Error ? error.message : 'Shell step failed'\n const exitCode =\n typeof (error as any)?.exitCode === 'number'\n ? (error as any).exitCode\n : undefined\n\n context.logger.error('Shell step failed', {\n stepId: context.stepId,\n error: message,\n exitCode,\n })\n\n return {\n status: 'failed',\n error: {\n message,\n code: 'STEP_EXECUTION_FAILED',\n details: {\n exitCode,\n },\n },\n }\n }\n }\n}\n\nfunction buildCancelledResult(\n signal: AbortSignal,\n error?: unknown,\n): StepExecutionResult {\n const reason =\n error instanceof Error\n ? error.message\n : signalReason(signal) ?? 'Step execution cancelled'\n\n return {\n status: 'cancelled',\n error: {\n message: reason,\n code: 'STEP_CANCELLED',\n },\n }\n}\n\nfunction signalReason(signal: AbortSignal): string | undefined {\n if (!signal.aborted) {\n return undefined\n }\n const reason = (signal as AbortSignal & { reason?: unknown }).reason\n if (reason instanceof Error) {\n return reason.message\n }\n if (typeof reason === 'string') {\n return reason\n }\n return undefined\n}\n\n\n\n","/**\n * Workflow Output Normalizer\n *\n * Converts raw handler return values into workflow step outputs.\n * Ensures consistent Record<string, unknown> shape regardless of\n * handler type (workflow handler, CLI command, builtin) or\n * execution mode (in-process, subprocess, worker-pool, remote).\n *\n * This is the single point of conversion from ExecutionResult.data\n * to step.outputs — no other code should do this transformation.\n */\n\n/**\n * Check if value looks like a CLI CommandResult ({ exitCode, result }).\n * CLI command handlers return this shape; workflow handlers return raw data.\n *\n * Requires BOTH `exitCode` (number) AND `result` key to be present.\n * This prevents false positives from shell handler output which has\n * `exitCode` but uses `stdout`/`stderr` instead of `result`.\n */\nfunction isCommandResult(value: unknown): value is { exitCode: number; result?: unknown; meta?: Record<string, unknown> } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'exitCode' in value &&\n 'result' in value &&\n typeof (value as Record<string, unknown>).exitCode === 'number'\n );\n}\n\n/**\n * Convert raw handler output to workflow step outputs.\n *\n * Contract:\n * | Handler returns | step.outputs |\n * |------------------------------------------|---------------------------|\n * | { foo: 'bar' } | { foo: 'bar' } |\n * | { exitCode: 0, result: { x: 1 } } | { x: 1 } |\n * | { exitCode: 0, result: 'hello' } | { result: 'hello' } |\n * | { exitCode: 0, result: undefined } | {} |\n * | { exitCode: 0, result: null } | {} |\n * | { exitCode: 0 } (no result key) | { exitCode: 0 } |\n * | { stdout: '...', exitCode: 0, ok: true } | { stdout, exitCode, ok } |\n * | 'hello' (primitive) | { result: 'hello' } |\n * | 42 (number) | { result: 42 } |\n * | undefined / void | {} |\n * | null | {} |\n */\nexport function toWorkflowOutputs(data: unknown): Record<string, unknown> {\n // CLI CommandResult — extract the payload\n if (isCommandResult(data)) {\n const inner = data.result;\n if (typeof inner === 'object' && inner !== null) {\n return inner as Record<string, unknown>;\n }\n return inner !== undefined && inner !== null ? { result: inner } : {};\n }\n\n // Object — use as-is\n if (typeof data === 'object' && data !== null) {\n return data as Record<string, unknown>;\n }\n\n // Primitive — wrap in { result }\n if (data !== undefined && data !== null) {\n return { result: data };\n }\n\n // void / undefined / null — empty outputs\n return {};\n}\n","/**\n * @module @kb-labs/workflow-runtime/runners/sandbox-runner\n *\n * V3 SandboxRunner - executes plugin handlers using platform ExecutionBackend.\n *\n * This runner is for steps that specify `uses: \"plugin:...\"` or `uses: \"command:...\"`.\n * It delegates execution to the platform's unified ExecutionBackend instead of\n * implementing custom plugin execution logic.\n *\n * ## Integration Pattern (REST API-style)\n *\n * Instead of resolving plugins inline inside the runner, we:\n * 1. Accept ExecutionBackend from platform (via options)\n * 2. Build ExecutionRequest with PluginContextDescriptor\n * 3. Call backend.execute() - platform handles the rest\n *\n * This matches the REST API pattern where execution is delegated to the platform layer.\n *\n * @example\n * ```typescript\n * const runner = new SandboxRunner({\n * backend: platform.executionBackend,\n * cliApi, // For plugin resolution\n * });\n *\n * const result = await runner.execute({\n * spec: { uses: 'plugin:release-manager/create-release', with: { version: '1.0.0' } },\n * context: stepContext,\n * });\n * ```\n */\n\nimport { randomUUID } from 'node:crypto'\nimport type { StepSpec } from '@kb-labs/workflow-contracts'\nimport type {\n ExecutionBackend,\n ExecutionRequest,\n PluginContextDescriptor,\n HostContext,\n} from '@kb-labs/plugin-execution'\nimport type { PermissionSpec } from '@kb-labs/plugin-contracts'\nimport { getHandlerPermissions } from '@kb-labs/plugin-contracts'\nimport type { IEntityRegistry } from '@kb-labs/core-registry'\nimport type {\n Runner,\n StepExecutionRequest,\n StepExecutionResult,\n} from '../types'\nimport { toWorkflowOutputs } from './output-normalizer.js'\nimport type { IAnalytics, ILogger } from '@kb-labs/core-platform'\n\nexport interface SandboxRunnerOptions {\n /**\n * Platform ExecutionBackend (REQUIRED).\n * Obtained from platform.executionBackend.\n */\n backend: ExecutionBackend\n\n /**\n * CLI API for plugin resolution (REQUIRED).\n * Needed to resolve plugin IDs to plugin roots and handler paths.\n */\n cliApi: IEntityRegistry\n\n /**\n * Workspace root directory.\n * Default: process.cwd()\n */\n workspaceRoot?: string\n\n /**\n * Default timeout for plugin execution (ms).\n * Default: 120000 (2 minutes)\n */\n defaultTimeout?: number\n\n /**\n * Platform analytics adapter (OPTIONAL)\n */\n analytics?: IAnalytics\n}\n\ninterface PluginCommandResolution {\n pluginId: string\n pluginVersion: string\n pluginRoot: string\n handler: string\n input: unknown\n permissions: PermissionSpec\n configSection?: string\n}\n\n/**\n * SandboxRunner - V3 implementation using platform ExecutionBackend.\n *\n * Executes plugin handlers through the unified execution layer.\n * Supports both `uses: \"plugin:id/handler\"` and `uses: \"command:name\"` syntax.\n */\nexport class SandboxRunner implements Runner {\n private readonly backend: ExecutionBackend\n private readonly cliApi: IEntityRegistry\n private readonly workspaceRoot: string\n private readonly defaultTimeout: number\n private readonly analytics?: IAnalytics\n private readonly logger?: ILogger\n\n constructor(options: SandboxRunnerOptions) {\n this.backend = options.backend\n this.cliApi = options.cliApi\n this.workspaceRoot = options.workspaceRoot ?? process.cwd()\n this.defaultTimeout = options.defaultTimeout ?? 120000 // 2 minutes\n this.analytics = options.analytics\n }\n\n async execute(request: StepExecutionRequest): Promise<StepExecutionResult> {\n const { spec, context, signal } = request\n const startTime = Date.now()\n\n // Early validation\n if (signal?.aborted) {\n return buildCancelledResult(signal)\n }\n\n if (!spec.uses) {\n return this.buildValidationError(context, 'Sandbox runner requires \"uses\" field to specify plugin handler')\n }\n\n // Resolve plugin handler\n const resolution = await this.tryResolveCommand(spec, request, context)\n if (!resolution.ok) {\n return resolution.error\n }\n\n // Execute plugin via backend\n const executionRequest = this.buildExecutionRequest(resolution.value, request, context)\n\n context.logger.info('Executing plugin handler', {\n stepId: context.stepId,\n pluginId: resolution.value.pluginId,\n handler: resolution.value.handler,\n executionId: executionRequest.executionId,\n })\n\n // Track plugin execution started\n this.analytics?.track('workflow.sandbox.execution.started', {\n stepId: context.stepId,\n pluginId: resolution.value.pluginId,\n handler: resolution.value.handler,\n uses: spec.uses,\n }).catch(() => {})\n\n const result = await this.backend.execute(executionRequest, { signal, onLog: context.onLog })\n const duration = Date.now() - startTime\n\n // Track plugin execution result\n if (result.ok) {\n this.analytics?.track('workflow.sandbox.execution.completed', {\n stepId: context.stepId,\n pluginId: resolution.value.pluginId,\n handler: resolution.value.handler,\n durationMs: duration,\n }).catch(() => {})\n } else {\n this.analytics?.track('workflow.sandbox.execution.failed', {\n stepId: context.stepId,\n pluginId: resolution.value.pluginId,\n handler: resolution.value.handler,\n errorCode: result.error?.code,\n errorMessage: result.error?.message,\n durationMs: duration,\n }).catch(() => {})\n }\n\n // Map backend result to step result\n return this.mapExecutionResult(result, executionRequest.executionId, context, signal)\n }\n\n /**\n * Validate step spec and build error result if invalid\n */\n private buildValidationError(context: StepExecutionRequest['context'], message: string): StepExecutionResult {\n context.logger.error('SandboxRunner validation failed', { stepId: context.stepId, message })\n return {\n status: 'failed',\n error: { message, code: 'INVALID_STEP' },\n }\n }\n\n /**\n * Try to resolve command, returning result wrapper\n */\n private async tryResolveCommand(\n spec: StepSpec,\n request: StepExecutionRequest,\n context: StepExecutionRequest['context']\n ): Promise<{ ok: true; value: PluginCommandResolution } | { ok: false; error: StepExecutionResult }> {\n try {\n const resolution = await this.resolveCommand(spec, request)\n return { ok: true, value: resolution }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to resolve plugin command'\n context.logger.error('Plugin command resolution failed', {\n stepId: context.stepId,\n uses: spec.uses,\n error: message,\n })\n return {\n ok: false,\n error: {\n status: 'failed',\n error: { message, code: 'COMMAND_RESOLUTION_FAILED' },\n },\n }\n }\n }\n\n /**\n * Build ExecutionRequest from resolved command\n */\n private buildExecutionRequest(\n resolution: PluginCommandResolution,\n request: StepExecutionRequest,\n context: StepExecutionRequest['context']\n ): ExecutionRequest {\n const requestId = context.trace?.traceId ?? randomUUID()\n const traceId = context.trace?.traceId ?? requestId\n const executionId = `exec_${context.stepId}_${Date.now()}_${randomUUID().slice(0, 8)}`\n const spanId = executionId\n const invocationId = executionId\n\n const hostContext: HostContext = {\n host: 'workflow',\n workflowId: context.runId,\n runId: context.runId,\n jobId: context.jobId,\n stepId: context.stepId,\n attempt: context.attempt,\n input: resolution.input,\n }\n\n const descriptor: PluginContextDescriptor = {\n hostType: 'workflow',\n pluginId: resolution.pluginId,\n pluginVersion: resolution.pluginVersion,\n requestId,\n permissions: resolution.permissions,\n hostContext,\n configSection: resolution.configSection, // For useConfig() auto-detection\n }\n Object.assign(descriptor as unknown as Record<string, unknown>, {\n traceId,\n spanId,\n invocationId,\n executionId,\n })\n\n return {\n executionId,\n descriptor,\n pluginRoot: resolution.pluginRoot,\n handlerRef: resolution.handler,\n input: resolution.input,\n workspace: request.workspace\n ? {\n type: 'local',\n cwd: request.workspace,\n }\n : undefined,\n timeoutMs: resolution.permissions.quotas?.timeoutMs ?? this.defaultTimeout,\n target: request.target,\n }\n }\n\n /**\n * Map ExecutionResult to StepExecutionResult\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Result mapping logic: handles success/failure/cancelled states, conditional stdout/stderr logging, debug metadata extraction, and error code translation\n private mapExecutionResult(\n result: Awaited<ReturnType<ExecutionBackend['execute']>>,\n executionId: string,\n context: StepExecutionRequest['context'],\n signal?: AbortSignal\n ): StepExecutionResult {\n if (result.ok) {\n // Include stdout/stderr in completion log if present\n const data = result.data as any;\n\n // DEBUG: Log what we received\n context.logger.debug('mapExecutionResult received data', {\n stepId: context.stepId,\n executionId,\n dataType: typeof data,\n dataKeys: data && typeof data === 'object' ? Object.keys(data) : [],\n hasStdout: !!(data && typeof data === 'object' && data.stdout),\n hasStderr: !!(data && typeof data === 'object' && data.stderr),\n });\n\n const logMeta: Record<string, unknown> = {\n stepId: context.stepId,\n executionId,\n executionTimeMs: result.executionTimeMs,\n };\n\n // Add stdout/stderr to log metadata if available\n if (data && typeof data === 'object') {\n if (data.stdout) {logMeta.stdout = data.stdout;}\n if (data.stderr) {logMeta.stderr = data.stderr;}\n if (data.exitCode !== undefined) {logMeta.exitCode = data.exitCode;}\n }\n\n context.logger.info('Plugin handler completed', logMeta);\n\n // If handler returned ok: false in its output data, treat as step failure.\n // This covers shell steps that return {ok: false, exitCode: N} without throwing.\n if (data && typeof data === 'object' && data.ok === false) {\n const message = data.stderr\n ? String(data.stderr).slice(0, 500)\n : `Step handler reported failure (exitCode: ${data.exitCode ?? 'unknown'})`;\n context.logger.error('Plugin handler reported failure via ok:false', {\n stepId: context.stepId,\n exitCode: data.exitCode,\n stderr: data.stderr,\n });\n return {\n status: 'failed',\n error: {\n message,\n code: 'HANDLER_REPORTED_FAILURE',\n },\n }\n }\n\n return {\n status: 'success',\n outputs: toWorkflowOutputs(result.data),\n }\n }\n\n // Check if cancelled\n if (signal?.aborted || result.error?.code === 'ABORTED') {\n return buildCancelledResult(signal, result.error)\n }\n\n // Handle failure\n context.logger.error('Plugin handler failed', {\n stepId: context.stepId,\n executionId,\n error: result.error?.message,\n code: result.error?.code,\n })\n\n return {\n status: 'failed',\n error: {\n message: result.error?.message ?? 'Plugin execution failed',\n code: result.error?.code ?? 'UNKNOWN_ERROR',\n stack: result.error?.stack,\n details: result.error?.details,\n },\n }\n }\n\n /**\n * Resolve command reference to plugin handler.\n *\n * Supports three formats:\n * - `plugin:id/handler` - workflow handler (native)\n * - `command:name` - CLI command (via adapter)\n * - `builtin:shell` - built-in shell execution\n */\n private async resolveCommand(\n spec: StepSpec,\n request: StepExecutionRequest,\n ): Promise<PluginCommandResolution> {\n const uses = spec.uses!\n const input = spec.with ?? {}\n\n if (uses.startsWith('plugin:')) {\n return this.resolvePluginHandler(uses, input)\n }\n\n if (uses.startsWith('command:')) {\n return this.resolveCLICommand(uses, input, request)\n }\n\n if (uses === 'builtin:shell') {\n return this.resolveBuiltinShell(spec)\n }\n\n if (uses === 'builtin:approval' || uses === 'builtin:gate') {\n throw new Error(`${uses} is handled by the workflow worker, not the sandbox runner`)\n }\n\n throw new Error(`Unsupported uses format: ${uses}. Expected \"plugin:...\", \"command:...\", or \"builtin:shell\"`)\n }\n\n /**\n * Resolve plugin handler reference.\n * Format: `plugin:id/handler` or `plugin:id/path/to/handler`\n */\n private async resolvePluginHandler(\n uses: string,\n input: unknown,\n ): Promise<PluginCommandResolution> {\n const pluginRef = uses.slice('plugin:'.length)\n const [pluginId, ...handlerParts] = pluginRef.split('/')\n\n if (!pluginId || handlerParts.length === 0) {\n throw new Error(`Invalid plugin reference: ${uses}. Expected \"plugin:id/handler\"`)\n }\n\n const handlerName = handlerParts.join('/')\n\n // Get plugin manifest from CLI API snapshot\n const snapshot = this.cliApi.snapshot()\n // Match by exact pluginId or by short name (e.g. \"quality\" matches \"@kb-labs/quality\")\n const entry = snapshot.manifests?.find((m) =>\n m.pluginId === pluginId || m.pluginId.endsWith(`/${pluginId}`)\n )\n\n if (!entry) {\n throw new Error(`Plugin not found: ${pluginId}`)\n }\n\n // Find workflow handler by name\n const workflowHandlers = entry.manifest.workflows?.handlers ?? []\n const handler = workflowHandlers.find((h: { id: string }) => h.id === handlerName)\n\n if (!handler) {\n throw new Error(`Workflow handler not found: ${handlerName} in plugin ${pluginId}`)\n }\n\n return {\n pluginId,\n pluginVersion: entry.manifest.version,\n pluginRoot: entry.pluginRoot,\n handler: handler.handler, // File path from manifest\n input,\n permissions: getHandlerPermissions(entry.manifest, 'workflow', handlerName),\n }\n }\n\n /**\n * Resolve CLI command to plugin handler (with adapter).\n *\n * Format: `command:name` (e.g., `command:mind:rag-index`)\n *\n * This uses the CLI Adapter pattern to make CLI commands work in workflow context:\n * - Searches for CLI command in plugin manifests\n * - Wraps workflow input in CLI-compatible format { argv, flags, cwd }\n * - Allows reusing existing CLI commands without writing workflow handlers\n */\n private async resolveCLICommand(\n uses: string,\n input: unknown,\n request: StepExecutionRequest,\n ): Promise<PluginCommandResolution> {\n const commandName = uses.slice('command:'.length)\n const snapshot = this.cliApi.snapshot()\n\n // Find CLI command in manifests\n for (const entry of snapshot.manifests ?? []) {\n const commands = entry.manifest.cli?.commands ?? []\n const command = commands.find((c: { id: string }) => c.id === commandName)\n\n if (command) {\n return {\n pluginId: entry.pluginId,\n pluginVersion: entry.manifest.version,\n pluginRoot: entry.pluginRoot,\n handler: command.handler,\n input: this.adaptToCLIFormat(input, request), // CLI Adapter\n permissions: getHandlerPermissions(entry.manifest, 'cli', commandName),\n configSection: entry.manifest.configSection, // For useConfig() auto-detection\n }\n }\n }\n\n throw new Error(`CLI command not found: ${commandName}`)\n }\n\n /**\n * CLI Adapter: Convert workflow input to CLI-compatible format.\n *\n * Transforms:\n * { scope: \"default\", incremental: true }\n * Into:\n * { argv: [], flags: { scope: \"default\", incremental: true }, cwd: \"/workspace\" }\n *\n * This allows CLI commands to work in workflow context without modification.\n */\n private adaptToCLIFormat(input: unknown, request: StepExecutionRequest): unknown {\n // Pass through if already in CLI format\n if (input && typeof input === 'object' && ('argv' in input || 'flags' in input)) {\n return input\n }\n\n // Adapt workflow input to CLI format\n return {\n argv: [],\n flags: input || {},\n cwd: request.workspace || this.workspaceRoot,\n }\n }\n\n /**\n * Resolve builtin:shell to built-in shell handler.\n *\n * Returns a resolution pointing to the builtin-handlers/shell.js file\n * that will be executed through ExecutionBackend.\n */\n private async resolveBuiltinShell(\n spec: StepSpec,\n ): Promise<PluginCommandResolution> {\n // Use import.meta.resolve to find @kb-labs/workflow-builtins package\n // This supports ES module exports properly\n const builtinsUrl = await import.meta.resolve('@kb-labs/workflow-builtins')\n // Convert file:// URL to path and remove /dist/index.js to get package root\n const builtinsPath = builtinsUrl.replace('file://', '').replace('/dist/index.js', '')\n\n // Extract command from spec.with\n const withBlock = (spec.with ?? {}) as Record<string, unknown>\n const command = withBlock.command ?? withBlock.run ?? withBlock.script\n\n if (typeof command !== 'string') {\n throw new Error(\n 'builtin:shell requires \"with.command\" (or with.run/with.script) to be a string',\n )\n }\n\n // Build shell handler input\n const shellInput = {\n command,\n env: typeof withBlock.env === 'object' ? (withBlock.env as Record<string, string>) : undefined,\n timeout: typeof withBlock.timeout === 'number' ? withBlock.timeout : undefined,\n throwOnError: typeof withBlock.throwOnError === 'boolean' ? withBlock.throwOnError : false,\n }\n\n return {\n pluginId: '@kb-labs/workflow-builtins',\n pluginVersion: '0.1.0',\n pluginRoot: builtinsPath,\n handler: 'dist/shell.js', // Relative path from pluginRoot\n input: shellInput,\n permissions: {\n shell: { allow: ['*'] }, // builtin:shell needs shell access by definition\n },\n }\n }\n}\n\nfunction buildCancelledResult(\n signal?: AbortSignal,\n error?: { message: string },\n): StepExecutionResult {\n const reason = error?.message ?? signalReason(signal) ?? 'Step execution cancelled'\n\n return {\n status: 'cancelled',\n error: {\n message: reason,\n code: 'STEP_CANCELLED',\n },\n }\n}\n\nfunction signalReason(signal?: AbortSignal): string | undefined {\n if (!signal?.aborted) {\n return undefined\n }\n const reason = (signal as AbortSignal & { reason?: unknown }).reason\n if (reason instanceof Error) {\n return reason.message\n }\n if (typeof reason === 'string') {\n return reason\n }\n return undefined\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises'\nimport { join, dirname } from 'node:path'\nimport { z } from 'zod'\n\nexport const RemoteMarketplaceSourceSchema = z.object({\n name: z.string().min(1),\n url: z.string().url(),\n ref: z.string().optional(), // branch/tag, default: 'main'\n path: z.string().optional(), // subdirectory in repo, default: '/'\n})\n\nexport const BudgetConfigSchema = z.object({\n enabled: z.boolean().default(false),\n limit: z.number().positive().optional(), // Total budget limit (in cost units)\n period: z.enum(['run', 'day', 'week', 'month']).default('run'),\n action: z.enum(['warn', 'fail', 'cancel']).default('warn'),\n // Extension point: custom cost calculator plugin\n costCalculator: z.string().optional(),\n})\n\nexport const WorkflowConfigSchema = z.object({\n workspaces: z.array(z.string()).default(['.kb/workflows/**/*.yml']),\n plugins: z.boolean().default(true),\n remotes: z.array(RemoteMarketplaceSourceSchema).optional(),\n maxDepth: z.number().int().positive().default(2),\n budget: BudgetConfigSchema.optional(),\n defaults: z\n .object({\n mode: z.enum(['wait', 'fire-and-forget']).default('wait'),\n inheritEnv: z.boolean().default(true),\n })\n .optional(),\n})\n\nexport type WorkflowConfig = z.infer<typeof WorkflowConfigSchema>\nexport type RemoteMarketplaceSource = z.infer<typeof RemoteMarketplaceSourceSchema>\nexport type BudgetConfig = z.infer<typeof BudgetConfigSchema>\n\n/**\n * Load workflow configuration from kb.config.json\n */\nexport async function loadWorkflowConfig(\n workspaceRoot: string,\n): Promise<WorkflowConfig> {\n const configPath = join(workspaceRoot, 'kb.config.json')\n\n try {\n const raw = await readFile(configPath, 'utf-8')\n const config = JSON.parse(raw) as { workflow?: unknown }\n\n if (!config.workflow) {\n return WorkflowConfigSchema.parse({})\n }\n\n return WorkflowConfigSchema.parse(config.workflow)\n } catch (error) {\n // If file doesn't exist or is invalid, return defaults\n if (\n error instanceof Error &&\n (error.message.includes('ENOENT') ||\n error.message.includes('Unexpected token'))\n ) {\n return WorkflowConfigSchema.parse({})\n }\n throw error\n }\n}\n\n/**\n * Save workflow configuration to kb.config.json\n * Safely merges with existing config without overwriting other sections\n */\nexport async function saveWorkflowConfig(\n workspaceRoot: string,\n updates: Partial<WorkflowConfig>,\n): Promise<void> {\n const configPath = join(workspaceRoot, 'kb.config.json')\n\n // Load existing config\n let existingConfig: any = {}\n try {\n const raw = await readFile(configPath, 'utf-8')\n existingConfig = JSON.parse(raw)\n } catch {\n // File doesn't exist or is invalid, start fresh\n existingConfig = {}\n }\n\n // Merge workflow section\n const currentWorkflow = existingConfig.workflow ?? {}\n const updatedWorkflow = {\n ...currentWorkflow,\n ...updates,\n // Deep merge for arrays (remotes)\n remotes: updates.remotes ?? currentWorkflow.remotes,\n }\n\n // Update config\n const updatedConfig = {\n ...existingConfig,\n workflow: updatedWorkflow,\n }\n\n // Ensure directory exists\n await mkdir(dirname(configPath), { recursive: true })\n\n // Write with pretty formatting\n await writeFile(\n configPath,\n JSON.stringify(updatedConfig, null, 2) + '\\n',\n 'utf-8',\n )\n}\n\n","import { readFile } from 'node:fs/promises'\nimport { relative } from 'node:path'\nimport fg from 'fast-glob'\nimport { parse as parseYaml } from 'yaml'\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts'\nimport { WorkflowSpecSchema } from '@kb-labs/workflow-contracts'\nimport type { ResolvedWorkflow, WorkflowRegistry } from './types'\n\nexport interface WorkspaceWorkflowRegistryConfig {\n workspaceRoot: string\n patterns: string[]\n}\n\n/**\n * Registry for workspace workflows (from .kb/workflows glob patterns)\n */\nexport class WorkspaceWorkflowRegistry implements WorkflowRegistry {\n private cache: ResolvedWorkflow[] | null = null\n\n constructor(private readonly config: WorkspaceWorkflowRegistryConfig) {}\n\n async list(): Promise<ResolvedWorkflow[]> {\n if (this.cache) {\n return this.cache\n }\n\n const workflows: ResolvedWorkflow[] = []\n\n // Expand glob patterns\n const files = await fg(this.config.patterns, {\n cwd: this.config.workspaceRoot,\n absolute: true,\n onlyFiles: true,\n ignore: ['node_modules/**', 'dist/**', '.git/**'],\n })\n\n // Load all workflow files in parallel\n const results = await Promise.allSettled(\n files.map(async (file) => {\n const spec = await this.loadWorkflowSpec(file)\n if (!spec) {\n return null\n }\n\n const relativePath = relative(this.config.workspaceRoot, file)\n const id = this.generateId(relativePath)\n\n return {\n id,\n source: 'workspace' as const,\n filePath: file,\n description: spec.description,\n // tags: spec.tags, // TODO: Add tags to WorkflowSpec if needed\n }\n })\n )\n\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value !== null) {\n workflows.push(result.value)\n } else if (result.status === 'rejected') {\n // Log warning but continue\n console.warn(\n '[WorkspaceWorkflowRegistry] Failed to load workflow:',\n result.reason instanceof Error ? result.reason.message : String(result.reason),\n )\n }\n }\n\n this.cache = workflows\n return workflows\n }\n\n async resolve(id: string): Promise<ResolvedWorkflow | null> {\n // Remove workspace: prefix if present\n const cleanId = id.startsWith('workspace:') ? id.slice('workspace:'.length) : id\n\n const all = await this.list()\n return all.find((w) => w.id === id || w.id.endsWith(':' + cleanId)) ?? null\n }\n\n async refresh(): Promise<void> {\n this.cache = null\n }\n\n async dispose(): Promise<void> {\n // No cleanup needed for workspace registry\n }\n\n private async loadWorkflowSpec(\n filePath: string,\n ): Promise<WorkflowSpec | null> {\n try {\n const raw = await readFile(filePath, 'utf-8')\n const parsed = filePath.endsWith('.json')\n ? JSON.parse(raw)\n : parseYaml(raw)\n\n const result = WorkflowSpecSchema.safeParse(parsed)\n if (!result.success) {\n return null\n }\n\n return result.data\n } catch {\n return null\n }\n }\n\n private generateId(relativePath: string): string {\n // Remove extension and convert to workspace: ID\n const withoutExt = relativePath.replace(/\\.(yml|yaml|json)$/, '')\n // Normalize path separators\n const normalized = withoutExt.replace(/\\\\/g, '/')\n return `workspace:${normalized}`\n }\n}\n\n","import type { ResolvedWorkflow, WorkflowRegistry } from './types'\nimport type { IEntityRegistry } from '@kb-labs/core-registry'\nimport type { WorkspaceWorkflowRegistry } from './workspace-registry'\nimport type { RemoteWorkflowRegistry } from './remote-registry'\nimport { extractWorkflows } from './plugin-workflows'\nimport { WorkflowRegistryError } from './errors'\n\n/**\n * Composite registry that combines workspace, plugin (via IEntityRegistry), and remote registries\n */\nexport class CompositeWorkflowRegistry implements WorkflowRegistry {\n private cache: ResolvedWorkflow[] | null = null\n\n constructor(\n private readonly workspace: WorkspaceWorkflowRegistry,\n private readonly cliApi: IEntityRegistry | null,\n private readonly remote?: RemoteWorkflowRegistry,\n ) {}\n\n async list(): Promise<ResolvedWorkflow[]> {\n if (this.cache) {\n return this.cache\n }\n\n const registries: Promise<ResolvedWorkflow[]>[] = [\n this.workspace.list(),\n ]\n\n // Extract plugin workflows from IEntityRegistry snapshot\n if (this.cliApi) {\n const snapshot = this.cliApi.snapshot()\n registries.push(extractWorkflows(snapshot))\n }\n\n if (this.remote) {\n registries.push(this.remote.list())\n }\n\n const results = await Promise.all(registries)\n const allWorkflows = results.flat()\n\n // Check for ID conflicts\n const ids = new Set<string>()\n const conflicts: string[] = []\n\n for (const wf of allWorkflows) {\n if (ids.has(wf.id)) {\n conflicts.push(wf.id)\n }\n ids.add(wf.id)\n }\n\n if (conflicts.length > 0) {\n throw new WorkflowRegistryError(\n `Workflow ID conflicts detected: ${conflicts.join(', ')}. ` +\n `Use explicit prefixes (workspace:, plugin:, or remote:) to disambiguate.`,\n )\n }\n\n this.cache = allWorkflows\n return this.cache\n }\n\n async resolve(id: string): Promise<ResolvedWorkflow | null> {\n // Explicit prefix\n if (id.startsWith('workspace:')) {\n return this.workspace.resolve(id)\n }\n\n if (id.startsWith('plugin:') && this.cliApi) {\n const snapshot = this.cliApi.snapshot()\n const { findWorkflow } = await import('./plugin-workflows')\n return findWorkflow(snapshot, id)\n }\n\n if (id.startsWith('remote:') && this.remote) {\n return this.remote.resolve(id)\n }\n\n // Implicit: search all\n const all = await this.list()\n const matches = all.filter(\n (w) => w.id === id || w.id.endsWith(':' + id),\n )\n\n if (matches.length > 1) {\n throw new WorkflowRegistryError(\n `Ambiguous workflow ID \"${id}\". Multiple matches: ${matches.map((m) => m.id).join(', ')}. ` +\n `Use explicit prefix (workspace:, plugin:, or remote:).`,\n id,\n )\n }\n\n return matches[0] ?? null\n }\n\n async refresh(): Promise<void> {\n this.cache = null\n const refreshTasks = [\n this.workspace.refresh(),\n ]\n // Plugin workflows refresh via IEntityRegistry.refreshRegistry() - no-op here\n if (this.remote) {\n refreshTasks.push(this.remote.refresh())\n }\n await Promise.all(refreshTasks)\n }\n\n async dispose(): Promise<void> {\n await Promise.all([\n this.workspace.dispose?.() ?? Promise.resolve(),\n this.remote?.dispose?.() ?? Promise.resolve(),\n ])\n }\n}\n\n","/**\n * Error thrown when workflow ID conflicts are detected\n */\nexport class WorkflowRegistryError extends Error {\n constructor(\n message: string,\n public readonly workflowId?: string,\n ) {\n super(message)\n this.name = 'WorkflowRegistryError'\n }\n}\n\n","export * from './types'\nexport { WorkspaceWorkflowRegistry } from './workspace-registry'\nexport { CompositeWorkflowRegistry } from './composite-registry'\nexport { WorkflowRegistryError } from './errors'\nexport { extractWorkflows, findWorkflow } from './plugin-workflows'\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/registry/plugin-workflows.ts","../src/context.ts","../src/runners/local-runner.ts","../src/runners/output-normalizer.ts","../src/runners/sandbox-runner.ts","../src/config.ts","../src/registry/workspace-registry.ts","../src/registry/composite-registry.ts","../src/registry/errors.ts","../src/registry/index.ts"],"names":["dirname","join","buildCancelledResult","signalReason","readFile","parseYaml","findWorkflow"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Extract workflows from CLI API registry snapshot\n *\n * Uses the same pattern as REST API - no local discovery, just snapshot extraction.\n */\n\nimport { join, resolve, dirname } from 'node:path'\nimport { access } from 'node:fs/promises'\nimport type { RegistrySnapshot } from '@kb-labs/core-registry'\nimport type { ManifestV3 } from '@kb-labs/plugin-contracts'\nimport type { ResolvedWorkflow } from './types'\n\ninterface SnapshotManifestEntry {\n pluginId: string\n manifest: ManifestV3\n pluginRoot: string\n}\n\nfunction extractSnapshotManifests(snapshot: RegistrySnapshot): SnapshotManifestEntry[] {\n return (snapshot.manifests || []).map(entry => ({\n pluginId: entry.pluginId,\n manifest: entry.manifest,\n pluginRoot: entry.pluginRoot,\n }))\n}\n\n/**\n * Extract workflows from registry snapshot\n *\n * @param snapshot - CLI API registry snapshot\n * @returns Array of resolved workflows from plugin manifests\n */\nexport async function extractWorkflows(snapshot: RegistrySnapshot): Promise<ResolvedWorkflow[]> {\n const manifests = extractSnapshotManifests(snapshot)\n const workflows: ResolvedWorkflow[] = []\n\n for (const entry of manifests) {\n const { manifest, pluginRoot } = entry\n\n // Skip plugins without workflow handlers\n const workflowHandlers = manifest.workflows?.handlers ?? []\n if (workflowHandlers.length === 0) {\n continue\n }\n\n // Find package root by walking up from pluginRoot until we find package.json\n // This ensures we resolve workflows relative to the actual package root, not dist/\n // pluginRoot might be dist/ (where manifest is), but workflows are in package root\n let packageRoot = pluginRoot\n let currentDir = resolve(pluginRoot)\n\n // IMPORTANT: Directory traversal must be sequential (walking up parent directories)\n /* eslint-disable no-await-in-loop */\n while (currentDir !== dirname(currentDir)) {\n try {\n const pkgPath = join(currentDir, 'package.json')\n await access(pkgPath)\n packageRoot = currentDir\n break\n } catch {\n currentDir = dirname(currentDir)\n }\n }\n /* eslint-enable no-await-in-loop */\n\n for (const wfHandler of workflowHandlers) {\n const id = `plugin:${entry.pluginId}/${wfHandler.id}`\n\n // Resolve workflow handler file relative to package root\n // Handler files are included via package.json \"files\" field\n const filePath = resolve(packageRoot, wfHandler.handler)\n\n workflows.push({\n id,\n source: 'plugin',\n filePath,\n description: wfHandler.describe,\n tags: undefined, // V3 doesn't have tags on workflow handlers\n metadata: {\n pluginId: entry.pluginId,\n pluginVersion: manifest.version,\n },\n })\n }\n }\n\n return workflows\n}\n\n/**\n * Find workflow by ID in registry snapshot\n *\n * @param snapshot - CLI API registry snapshot\n * @param id - Workflow ID (with or without \"plugin:\" prefix)\n * @returns Resolved workflow or null if not found\n */\nexport async function findWorkflow(\n snapshot: RegistrySnapshot,\n id: string,\n): Promise<ResolvedWorkflow | null> {\n // Remove plugin: prefix if present\n const cleanId = id.startsWith('plugin:') ? id.slice('plugin:'.length) : id\n\n const workflows = await extractWorkflows(snapshot)\n return workflows.find((w) => w.id === id || w.id.endsWith(':' + cleanId)) ?? null\n}\n","import type {\n ArtifactClient,\n RuntimeEvents,\n RuntimeLogger,\n RuntimeTrace,\n StepContext,\n} from './types'\n\nexport interface CreateStepContextInput {\n runId: string\n jobId: string\n stepId: string\n attempt?: number\n env?: Record<string, string>\n secrets?: Record<string, string>\n artifacts?: ArtifactClient\n events?: RuntimeEvents\n logger: RuntimeLogger // Required - must use platform.logger\n trace?: RuntimeTrace\n}\n\nexport function createStepContext(\n input: CreateStepContextInput,\n): StepContext {\n return {\n runId: input.runId,\n jobId: input.jobId,\n stepId: input.stepId,\n attempt: input.attempt ?? 0,\n env: { ...process.env, ...(input.env ?? {}) } as Record<string, string>,\n secrets: input.secrets ?? {},\n artifacts: input.artifacts,\n events: input.events,\n logger: input.logger, // Use provided logger (platform.logger)\n trace: input.trace,\n }\n}\n\n\n\n\n\n","import { execaCommand } from 'execa'\nimport type { StepSpec } from '@kb-labs/workflow-contracts'\nimport type {\n Runner,\n StepExecutionRequest,\n StepExecutionResult,\n} from '../types'\n\nexport interface LocalRunnerOptions {\n shell?: string\n}\n\nfunction resolveCommand(step: StepSpec): string | null {\n const withBlock = (step.with ?? {}) as Record<string, unknown>\n const commandField = withBlock.command ?? withBlock.run ?? withBlock.script\n return typeof commandField === 'string' ? commandField : null\n}\n\nexport class LocalRunner implements Runner {\n private readonly shell: string\n\n constructor(options: LocalRunnerOptions = {}) {\n this.shell = options.shell ?? process.env.SHELL ?? 'bash'\n }\n\n async execute(request: StepExecutionRequest): Promise<StepExecutionResult> {\n const { spec, context } = request\n const command = resolveCommand(spec)\n\n if (spec.uses && spec.uses !== 'builtin:shell') {\n context.logger.error(`LocalRunner cannot execute ${spec.uses}`, {\n stepId: context.stepId,\n })\n return {\n status: 'failed',\n error: {\n message: `Local runner cannot execute step with uses=\"${spec.uses}\"`,\n code: 'UNSUPPORTED_STEP',\n },\n }\n }\n\n if (!command) {\n context.logger.error('LocalRunner missing command', {\n stepId: context.stepId,\n })\n return {\n status: 'failed',\n error: {\n message:\n 'Local runner requires \"with.command\" (or with.run/with.script) to be specified',\n code: 'INVALID_STEP',\n },\n }\n }\n\n const cwd = request.workspace ?? process.cwd()\n const env = {\n ...process.env,\n ...context.env,\n ...context.secrets,\n }\n\n if (request.signal?.aborted) {\n return buildCancelledResult(request.signal)\n }\n\n context.logger.info('Executing builtin shell step', {\n command,\n cwd,\n stepId: context.stepId,\n })\n\n try {\n const result = await execaCommand(command, {\n cwd,\n shell: this.shell,\n env,\n stdio: 'pipe',\n signal: request.signal,\n })\n\n context.logger.info('Shell step completed', {\n stepId: context.stepId,\n exitCode: result.exitCode,\n })\n\n return {\n status: 'success',\n outputs: {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n },\n }\n } catch (error) {\n if (request.signal?.aborted) {\n return buildCancelledResult(request.signal, error)\n }\n const message =\n error instanceof Error ? error.message : 'Shell step failed'\n const exitCode =\n typeof (error as any)?.exitCode === 'number'\n ? (error as any).exitCode\n : undefined\n\n context.logger.error('Shell step failed', {\n stepId: context.stepId,\n error: message,\n exitCode,\n })\n\n return {\n status: 'failed',\n error: {\n message,\n code: 'STEP_EXECUTION_FAILED',\n details: {\n exitCode,\n },\n },\n }\n }\n }\n}\n\nfunction buildCancelledResult(\n signal: AbortSignal,\n error?: unknown,\n): StepExecutionResult {\n const reason =\n error instanceof Error\n ? error.message\n : signalReason(signal) ?? 'Step execution cancelled'\n\n return {\n status: 'cancelled',\n error: {\n message: reason,\n code: 'STEP_CANCELLED',\n },\n }\n}\n\nfunction signalReason(signal: AbortSignal): string | undefined {\n if (!signal.aborted) {\n return undefined\n }\n const reason = (signal as AbortSignal & { reason?: unknown }).reason\n if (reason instanceof Error) {\n return reason.message\n }\n if (typeof reason === 'string') {\n return reason\n }\n return undefined\n}\n\n\n\n","/**\n * Workflow Output Normalizer\n *\n * Converts raw handler return values into workflow step outputs.\n * Ensures consistent Record<string, unknown> shape regardless of\n * handler type (workflow handler, CLI command, builtin) or\n * execution mode (in-process, subprocess, worker-pool, remote).\n *\n * This is the single point of conversion from ExecutionResult.data\n * to step.outputs — no other code should do this transformation.\n */\n\n/**\n * Check if value looks like a CLI CommandResult ({ exitCode, result }).\n * CLI command handlers return this shape; workflow handlers return raw data.\n *\n * Requires BOTH `exitCode` (number) AND `result` key to be present.\n * This prevents false positives from shell handler output which has\n * `exitCode` but uses `stdout`/`stderr` instead of `result`.\n */\nfunction isCommandResult(value: unknown): value is { exitCode: number; result?: unknown; meta?: Record<string, unknown> } {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'exitCode' in value &&\n 'result' in value &&\n typeof (value as Record<string, unknown>).exitCode === 'number'\n );\n}\n\n/**\n * Convert raw handler output to workflow step outputs.\n *\n * Contract:\n * | Handler returns | step.outputs |\n * |------------------------------------------|---------------------------|\n * | { foo: 'bar' } | { foo: 'bar' } |\n * | { exitCode: 0, result: { x: 1 } } | { x: 1 } |\n * | { exitCode: 0, result: 'hello' } | { result: 'hello' } |\n * | { exitCode: 0, result: undefined } | {} |\n * | { exitCode: 0, result: null } | {} |\n * | { exitCode: 0 } (no result key) | { exitCode: 0 } |\n * | { stdout: '...', exitCode: 0, ok: true } | { stdout, exitCode, ok } |\n * | 'hello' (primitive) | { result: 'hello' } |\n * | 42 (number) | { result: 42 } |\n * | undefined / void | {} |\n * | null | {} |\n */\nexport function toWorkflowOutputs(data: unknown): Record<string, unknown> {\n // CLI CommandResult — extract the payload\n if (isCommandResult(data)) {\n const inner = data.result;\n if (typeof inner === 'object' && inner !== null) {\n return inner as Record<string, unknown>;\n }\n return inner !== undefined && inner !== null ? { result: inner } : {};\n }\n\n // Object — use as-is\n if (typeof data === 'object' && data !== null) {\n return data as Record<string, unknown>;\n }\n\n // Primitive — wrap in { result }\n if (data !== undefined && data !== null) {\n return { result: data };\n }\n\n // void / undefined / null — empty outputs\n return {};\n}\n","/**\n * @module @kb-labs/workflow-runtime/runners/sandbox-runner\n *\n * V3 SandboxRunner - executes plugin handlers using platform ExecutionBackend.\n *\n * This runner is for steps that specify `uses: \"plugin:...\"` or `uses: \"command:...\"`.\n * It delegates execution to the platform's unified ExecutionBackend instead of\n * implementing custom plugin execution logic.\n *\n * ## Integration Pattern (REST API-style)\n *\n * Instead of resolving plugins inline inside the runner, we:\n * 1. Accept ExecutionBackend from platform (via options)\n * 2. Build ExecutionRequest with PluginContextDescriptor\n * 3. Call backend.execute() - platform handles the rest\n *\n * This matches the REST API pattern where execution is delegated to the platform layer.\n *\n * @example\n * ```typescript\n * const runner = new SandboxRunner({\n * backend: platform.executionBackend,\n * cliApi, // For plugin resolution\n * });\n *\n * const result = await runner.execute({\n * spec: { uses: 'plugin:release-manager/create-release', with: { version: '1.0.0' } },\n * context: stepContext,\n * });\n * ```\n */\n\nimport { randomUUID } from 'node:crypto'\nimport type { StepSpec } from '@kb-labs/workflow-contracts'\nimport type {\n ExecutionBackend,\n ExecutionRequest,\n PluginContextDescriptor,\n HostContext,\n} from '@kb-labs/plugin-execution'\nimport type { PermissionSpec } from '@kb-labs/plugin-contracts'\nimport { getHandlerPermissions } from '@kb-labs/plugin-contracts'\nimport type { IEntityRegistry } from '@kb-labs/core-registry'\nimport type {\n Runner,\n StepExecutionRequest,\n StepExecutionResult,\n} from '../types'\nimport { toWorkflowOutputs } from './output-normalizer.js'\nimport type { IAnalytics, ILogger } from '@kb-labs/core-platform'\n\nexport interface SandboxRunnerOptions {\n /**\n * Platform ExecutionBackend (REQUIRED).\n * Obtained from platform.executionBackend.\n */\n backend: ExecutionBackend\n\n /**\n * CLI API for plugin resolution (REQUIRED).\n * Needed to resolve plugin IDs to plugin roots and handler paths.\n */\n cliApi: IEntityRegistry\n\n /**\n * Workspace root directory.\n * Default: process.cwd()\n */\n workspaceRoot?: string\n\n /**\n * Default timeout for plugin execution (ms).\n * Default: 120000 (2 minutes)\n */\n defaultTimeout?: number\n\n /**\n * Platform analytics adapter (OPTIONAL)\n */\n analytics?: IAnalytics\n}\n\ninterface PluginCommandResolution {\n pluginId: string\n pluginVersion: string\n pluginRoot: string\n handler: string\n input: unknown\n permissions: PermissionSpec\n configSection?: string\n}\n\n/**\n * SandboxRunner - V3 implementation using platform ExecutionBackend.\n *\n * Executes plugin handlers through the unified execution layer.\n * Supports both `uses: \"plugin:id/handler\"` and `uses: \"command:name\"` syntax.\n */\nexport class SandboxRunner implements Runner {\n private readonly backend: ExecutionBackend\n private readonly cliApi: IEntityRegistry\n private readonly workspaceRoot: string\n private readonly defaultTimeout: number\n private readonly analytics?: IAnalytics\n private readonly logger?: ILogger\n\n constructor(options: SandboxRunnerOptions) {\n this.backend = options.backend\n this.cliApi = options.cliApi\n this.workspaceRoot = options.workspaceRoot ?? process.cwd()\n this.defaultTimeout = options.defaultTimeout ?? 120000 // 2 minutes\n this.analytics = options.analytics\n }\n\n async execute(request: StepExecutionRequest): Promise<StepExecutionResult> {\n const { spec, context, signal } = request\n const startTime = Date.now()\n\n // Early validation\n if (signal?.aborted) {\n return buildCancelledResult(signal)\n }\n\n if (!spec.uses) {\n return this.buildValidationError(context, 'Sandbox runner requires \"uses\" field to specify plugin handler')\n }\n\n // Resolve plugin handler\n const resolution = await this.tryResolveCommand(spec, request, context)\n if (!resolution.ok) {\n return resolution.error\n }\n\n // Execute plugin via backend\n const executionRequest = this.buildExecutionRequest(resolution.value, request, context)\n\n context.logger.info('Executing plugin handler', {\n stepId: context.stepId,\n pluginId: resolution.value.pluginId,\n handler: resolution.value.handler,\n executionId: executionRequest.executionId,\n })\n\n // Track plugin execution started\n this.analytics?.track('workflow.sandbox.execution.started', {\n stepId: context.stepId,\n pluginId: resolution.value.pluginId,\n handler: resolution.value.handler,\n uses: spec.uses,\n }).catch(() => {})\n\n const result = await this.backend.execute(executionRequest, { signal, onLog: context.onLog })\n const duration = Date.now() - startTime\n\n // Track plugin execution result\n if (result.ok) {\n this.analytics?.track('workflow.sandbox.execution.completed', {\n stepId: context.stepId,\n pluginId: resolution.value.pluginId,\n handler: resolution.value.handler,\n durationMs: duration,\n }).catch(() => {})\n } else {\n this.analytics?.track('workflow.sandbox.execution.failed', {\n stepId: context.stepId,\n pluginId: resolution.value.pluginId,\n handler: resolution.value.handler,\n errorCode: result.error?.code,\n errorMessage: result.error?.message,\n durationMs: duration,\n }).catch(() => {})\n }\n\n // Map backend result to step result\n return this.mapExecutionResult(result, executionRequest.executionId, context, signal)\n }\n\n /**\n * Validate step spec and build error result if invalid\n */\n private buildValidationError(context: StepExecutionRequest['context'], message: string): StepExecutionResult {\n context.logger.error('SandboxRunner validation failed', { stepId: context.stepId, message })\n return {\n status: 'failed',\n error: { message, code: 'INVALID_STEP' },\n }\n }\n\n /**\n * Try to resolve command, returning result wrapper\n */\n private async tryResolveCommand(\n spec: StepSpec,\n request: StepExecutionRequest,\n context: StepExecutionRequest['context']\n ): Promise<{ ok: true; value: PluginCommandResolution } | { ok: false; error: StepExecutionResult }> {\n try {\n const resolution = await this.resolveCommand(spec, request)\n return { ok: true, value: resolution }\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Failed to resolve plugin command'\n context.logger.error('Plugin command resolution failed', {\n stepId: context.stepId,\n uses: spec.uses,\n error: message,\n })\n return {\n ok: false,\n error: {\n status: 'failed',\n error: { message, code: 'COMMAND_RESOLUTION_FAILED' },\n },\n }\n }\n }\n\n /**\n * Build ExecutionRequest from resolved command\n */\n private buildExecutionRequest(\n resolution: PluginCommandResolution,\n request: StepExecutionRequest,\n context: StepExecutionRequest['context']\n ): ExecutionRequest {\n const requestId = context.trace?.traceId ?? randomUUID()\n const traceId = context.trace?.traceId ?? requestId\n const executionId = `exec_${context.stepId}_${Date.now()}_${randomUUID().slice(0, 8)}`\n const spanId = executionId\n const invocationId = executionId\n\n const hostContext: HostContext = {\n host: 'workflow',\n workflowId: context.runId,\n runId: context.runId,\n jobId: context.jobId,\n stepId: context.stepId,\n attempt: context.attempt,\n input: resolution.input,\n }\n\n const descriptor: PluginContextDescriptor = {\n hostType: 'workflow',\n pluginId: resolution.pluginId,\n pluginVersion: resolution.pluginVersion,\n requestId,\n permissions: resolution.permissions,\n hostContext,\n configSection: resolution.configSection, // For useConfig() auto-detection\n }\n Object.assign(descriptor as unknown as Record<string, unknown>, {\n traceId,\n spanId,\n invocationId,\n executionId,\n })\n\n return {\n executionId,\n descriptor,\n pluginRoot: resolution.pluginRoot,\n handlerRef: resolution.handler,\n input: resolution.input,\n workspace: request.workspace\n ? {\n type: 'local',\n cwd: request.workspace,\n }\n : undefined,\n timeoutMs: resolution.permissions.quotas?.timeoutMs ?? this.defaultTimeout,\n target: request.target,\n }\n }\n\n /**\n * Map ExecutionResult to StepExecutionResult\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Result mapping logic: handles success/failure/cancelled states, conditional stdout/stderr logging, debug metadata extraction, and error code translation\n private mapExecutionResult(\n result: Awaited<ReturnType<ExecutionBackend['execute']>>,\n executionId: string,\n context: StepExecutionRequest['context'],\n signal?: AbortSignal\n ): StepExecutionResult {\n if (result.ok) {\n // Include stdout/stderr in completion log if present\n const data = result.data as any;\n\n // DEBUG: Log what we received\n context.logger.debug('mapExecutionResult received data', {\n stepId: context.stepId,\n executionId,\n dataType: typeof data,\n dataKeys: data && typeof data === 'object' ? Object.keys(data) : [],\n hasStdout: !!(data && typeof data === 'object' && data.stdout),\n hasStderr: !!(data && typeof data === 'object' && data.stderr),\n });\n\n const logMeta: Record<string, unknown> = {\n stepId: context.stepId,\n executionId,\n executionTimeMs: result.executionTimeMs,\n };\n\n // Add stdout/stderr to log metadata if available\n if (data && typeof data === 'object') {\n if (data.stdout) {logMeta.stdout = data.stdout;}\n if (data.stderr) {logMeta.stderr = data.stderr;}\n if (data.exitCode !== undefined) {logMeta.exitCode = data.exitCode;}\n }\n\n context.logger.info('Plugin handler completed', logMeta);\n\n // If handler returned ok: false in its output data, treat as step failure.\n // This covers shell steps that return {ok: false, exitCode: N} without throwing.\n if (data && typeof data === 'object' && data.ok === false) {\n const message = data.stderr\n ? String(data.stderr).slice(0, 500)\n : `Step handler reported failure (exitCode: ${data.exitCode ?? 'unknown'})`;\n context.logger.error('Plugin handler reported failure via ok:false', {\n stepId: context.stepId,\n exitCode: data.exitCode,\n stderr: data.stderr,\n });\n return {\n status: 'failed',\n error: {\n message,\n code: 'HANDLER_REPORTED_FAILURE',\n },\n }\n }\n\n return {\n status: 'success',\n outputs: toWorkflowOutputs(result.data),\n }\n }\n\n // Check if cancelled\n if (signal?.aborted || result.error?.code === 'ABORTED') {\n return buildCancelledResult(signal, result.error)\n }\n\n // Handle failure\n context.logger.error('Plugin handler failed', {\n stepId: context.stepId,\n executionId,\n error: result.error?.message,\n code: result.error?.code,\n })\n\n return {\n status: 'failed',\n error: {\n message: result.error?.message ?? 'Plugin execution failed',\n code: result.error?.code ?? 'UNKNOWN_ERROR',\n stack: result.error?.stack,\n details: result.error?.details,\n },\n }\n }\n\n /**\n * Resolve command reference to plugin handler.\n *\n * Supports three formats:\n * - `plugin:id/handler` - workflow handler (native)\n * - `command:name` - CLI command (via adapter)\n * - `builtin:shell` - built-in shell execution\n */\n private async resolveCommand(\n spec: StepSpec,\n request: StepExecutionRequest,\n ): Promise<PluginCommandResolution> {\n const uses = spec.uses!\n const input = spec.with ?? {}\n\n if (uses.startsWith('plugin:')) {\n return this.resolvePluginHandler(uses, input)\n }\n\n if (uses.startsWith('command:')) {\n return this.resolveCLICommand(uses, input, request)\n }\n\n if (uses === 'builtin:shell') {\n return this.resolveBuiltinShell(spec)\n }\n\n if (uses === 'builtin:approval' || uses === 'builtin:gate') {\n throw new Error(`${uses} is handled by the workflow worker, not the sandbox runner`)\n }\n\n throw new Error(`Unsupported uses format: ${uses}. Expected \"plugin:...\", \"command:...\", or \"builtin:shell\"`)\n }\n\n /**\n * Resolve plugin handler reference.\n * Format: `plugin:id/handler` or `plugin:id/path/to/handler`\n */\n private async resolvePluginHandler(\n uses: string,\n input: unknown,\n ): Promise<PluginCommandResolution> {\n const pluginRef = uses.slice('plugin:'.length)\n const [pluginId, ...handlerParts] = pluginRef.split('/')\n\n if (!pluginId || handlerParts.length === 0) {\n throw new Error(`Invalid plugin reference: ${uses}. Expected \"plugin:id/handler\"`)\n }\n\n const handlerName = handlerParts.join('/')\n\n // Get plugin manifest from CLI API snapshot\n const snapshot = this.cliApi.snapshot()\n // Match by exact pluginId or by short name (e.g. \"quality\" matches \"@kb-labs/quality\")\n const entry = snapshot.manifests?.find((m) =>\n m.pluginId === pluginId || m.pluginId.endsWith(`/${pluginId}`)\n )\n\n if (!entry) {\n throw new Error(`Plugin not found: ${pluginId}`)\n }\n\n // Find workflow handler by name\n const workflowHandlers = entry.manifest.workflows?.handlers ?? []\n const handler = workflowHandlers.find((h: { id: string }) => h.id === handlerName)\n\n if (!handler) {\n throw new Error(`Workflow handler not found: ${handlerName} in plugin ${pluginId}`)\n }\n\n return {\n pluginId,\n pluginVersion: entry.manifest.version,\n pluginRoot: entry.pluginRoot,\n handler: handler.handler, // File path from manifest\n input,\n permissions: getHandlerPermissions(entry.manifest, 'workflow', handlerName),\n }\n }\n\n /**\n * Resolve CLI command to plugin handler (with adapter).\n *\n * Format: `command:name` (e.g., `command:mind:rag-index`)\n *\n * This uses the CLI Adapter pattern to make CLI commands work in workflow context:\n * - Searches for CLI command in plugin manifests\n * - Wraps workflow input in CLI-compatible format { argv, flags, cwd }\n * - Allows reusing existing CLI commands without writing workflow handlers\n */\n private async resolveCLICommand(\n uses: string,\n input: unknown,\n request: StepExecutionRequest,\n ): Promise<PluginCommandResolution> {\n const commandName = uses.slice('command:'.length)\n const snapshot = this.cliApi.snapshot()\n\n // Find CLI command in manifests\n for (const entry of snapshot.manifests ?? []) {\n const commands = entry.manifest.cli?.commands ?? []\n const command = commands.find((c: { id: string }) => c.id === commandName)\n\n if (command) {\n return {\n pluginId: entry.pluginId,\n pluginVersion: entry.manifest.version,\n pluginRoot: entry.pluginRoot,\n handler: command.handler,\n input: this.adaptToCLIFormat(input, request), // CLI Adapter\n permissions: getHandlerPermissions(entry.manifest, 'cli', commandName),\n configSection: entry.manifest.configSection, // For useConfig() auto-detection\n }\n }\n }\n\n throw new Error(`CLI command not found: ${commandName}`)\n }\n\n /**\n * CLI Adapter: Convert workflow input to CLI-compatible format.\n *\n * Transforms:\n * { scope: \"default\", incremental: true }\n * Into:\n * { argv: [], flags: { scope: \"default\", incremental: true }, cwd: \"/workspace\" }\n *\n * This allows CLI commands to work in workflow context without modification.\n */\n private adaptToCLIFormat(input: unknown, request: StepExecutionRequest): unknown {\n // Pass through if already in CLI format\n if (input && typeof input === 'object' && ('argv' in input || 'flags' in input)) {\n return input\n }\n\n // Adapt workflow input to CLI format\n return {\n argv: [],\n flags: input || {},\n cwd: request.workspace || this.workspaceRoot,\n }\n }\n\n /**\n * Resolve builtin:shell to built-in shell handler.\n *\n * Returns a resolution pointing to the builtin-handlers/shell.js file\n * that will be executed through ExecutionBackend.\n */\n private async resolveBuiltinShell(\n spec: StepSpec,\n ): Promise<PluginCommandResolution> {\n // Use import.meta.resolve to find @kb-labs/workflow-builtins package\n // This supports ES module exports properly\n const builtinsUrl = await import.meta.resolve('@kb-labs/workflow-builtins')\n // Convert file:// URL to path and remove /dist/index.js to get package root\n const builtinsPath = builtinsUrl.replace('file://', '').replace('/dist/index.js', '')\n\n // Extract command from spec.with\n const withBlock = (spec.with ?? {}) as Record<string, unknown>\n const command = withBlock.command ?? withBlock.run ?? withBlock.script\n\n if (typeof command !== 'string') {\n throw new Error(\n 'builtin:shell requires \"with.command\" (or with.run/with.script) to be a string',\n )\n }\n\n // Build shell handler input\n const shellInput = {\n command,\n env: typeof withBlock.env === 'object' ? (withBlock.env as Record<string, string>) : undefined,\n timeout: typeof withBlock.timeout === 'number' ? withBlock.timeout : undefined,\n throwOnError: typeof withBlock.throwOnError === 'boolean' ? withBlock.throwOnError : false,\n }\n\n return {\n pluginId: '@kb-labs/workflow-builtins',\n pluginVersion: '0.1.0',\n pluginRoot: builtinsPath,\n handler: 'dist/shell.js', // Relative path from pluginRoot\n input: shellInput,\n permissions: {\n shell: { allow: ['*'] }, // builtin:shell needs shell access by definition\n },\n }\n }\n}\n\nfunction buildCancelledResult(\n signal?: AbortSignal,\n error?: { message: string },\n): StepExecutionResult {\n const reason = error?.message ?? signalReason(signal) ?? 'Step execution cancelled'\n\n return {\n status: 'cancelled',\n error: {\n message: reason,\n code: 'STEP_CANCELLED',\n },\n }\n}\n\nfunction signalReason(signal?: AbortSignal): string | undefined {\n if (!signal?.aborted) {\n return undefined\n }\n const reason = (signal as AbortSignal & { reason?: unknown }).reason\n if (reason instanceof Error) {\n return reason.message\n }\n if (typeof reason === 'string') {\n return reason\n }\n return undefined\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises'\nimport { join, dirname } from 'node:path'\nimport { z } from 'zod'\n\nexport const RemoteMarketplaceSourceSchema = z.object({\n name: z.string().min(1),\n url: z.string().url(),\n ref: z.string().optional(), // branch/tag, default: 'main'\n path: z.string().optional(), // subdirectory in repo, default: '/'\n})\n\nexport const BudgetConfigSchema = z.object({\n enabled: z.boolean().default(false),\n limit: z.number().positive().optional(), // Total budget limit (in cost units)\n period: z.enum(['run', 'day', 'week', 'month']).default('run'),\n action: z.enum(['warn', 'fail', 'cancel']).default('warn'),\n // Extension point: custom cost calculator plugin\n costCalculator: z.string().optional(),\n})\n\nexport const WorkflowConfigSchema = z.object({\n workspaces: z.array(z.string()).default(['.kb/workflows/**/*.yml']),\n plugins: z.boolean().default(true),\n remotes: z.array(RemoteMarketplaceSourceSchema).optional(),\n maxDepth: z.number().int().positive().default(2),\n budget: BudgetConfigSchema.optional(),\n defaults: z\n .object({\n mode: z.enum(['wait', 'fire-and-forget']).default('wait'),\n inheritEnv: z.boolean().default(true),\n })\n .optional(),\n})\n\nexport type WorkflowConfig = z.infer<typeof WorkflowConfigSchema>\nexport type RemoteMarketplaceSource = z.infer<typeof RemoteMarketplaceSourceSchema>\nexport type BudgetConfig = z.infer<typeof BudgetConfigSchema>\n\n/**\n * Load workflow configuration from kb.config.json\n */\nexport async function loadWorkflowConfig(\n workspaceRoot: string,\n): Promise<WorkflowConfig> {\n const configPath = join(workspaceRoot, 'kb.config.json')\n\n try {\n const raw = await readFile(configPath, 'utf-8')\n const config = JSON.parse(raw) as { workflow?: unknown }\n\n if (!config.workflow) {\n return WorkflowConfigSchema.parse({})\n }\n\n return WorkflowConfigSchema.parse(config.workflow)\n } catch (error) {\n // If file doesn't exist or is invalid, return defaults\n if (\n error instanceof Error &&\n (error.message.includes('ENOENT') ||\n error.message.includes('Unexpected token'))\n ) {\n return WorkflowConfigSchema.parse({})\n }\n throw error\n }\n}\n\n/**\n * Save workflow configuration to kb.config.json\n * Safely merges with existing config without overwriting other sections\n */\nexport async function saveWorkflowConfig(\n workspaceRoot: string,\n updates: Partial<WorkflowConfig>,\n): Promise<void> {\n const configPath = join(workspaceRoot, 'kb.config.json')\n\n // Load existing config\n let existingConfig: any = {}\n try {\n const raw = await readFile(configPath, 'utf-8')\n existingConfig = JSON.parse(raw)\n } catch {\n // File doesn't exist or is invalid, start fresh\n existingConfig = {}\n }\n\n // Merge workflow section\n const currentWorkflow = existingConfig.workflow ?? {}\n const updatedWorkflow = {\n ...currentWorkflow,\n ...updates,\n // Deep merge for arrays (remotes)\n remotes: updates.remotes ?? currentWorkflow.remotes,\n }\n\n // Update config\n const updatedConfig = {\n ...existingConfig,\n workflow: updatedWorkflow,\n }\n\n // Ensure directory exists\n await mkdir(dirname(configPath), { recursive: true })\n\n // Write with pretty formatting\n await writeFile(\n configPath,\n JSON.stringify(updatedConfig, null, 2) + '\\n',\n 'utf-8',\n )\n}\n\n","import { readFile } from 'node:fs/promises'\nimport { relative } from 'node:path'\nimport fg from 'fast-glob'\nimport { parse as parseYaml } from 'yaml'\nimport type { WorkflowSpec } from '@kb-labs/workflow-contracts'\nimport { WorkflowSpecSchema } from '@kb-labs/workflow-contracts'\nimport type { ResolvedWorkflow, WorkflowRegistry } from './types'\n\nexport interface WorkspaceWorkflowRegistryConfig {\n workspaceRoot: string\n patterns: string[]\n}\n\n/**\n * Registry for workspace workflows (from .kb/workflows glob patterns)\n */\nexport class WorkspaceWorkflowRegistry implements WorkflowRegistry {\n private cache: ResolvedWorkflow[] | null = null\n\n constructor(private readonly config: WorkspaceWorkflowRegistryConfig) {}\n\n async list(): Promise<ResolvedWorkflow[]> {\n if (this.cache) {\n return this.cache\n }\n\n const workflows: ResolvedWorkflow[] = []\n\n // Expand glob patterns\n const files = await fg(this.config.patterns, {\n cwd: this.config.workspaceRoot,\n absolute: true,\n onlyFiles: true,\n ignore: ['node_modules/**', 'dist/**', '.git/**'],\n })\n\n // Load all workflow files in parallel\n const results = await Promise.allSettled(\n files.map(async (file) => {\n const spec = await this.loadWorkflowSpec(file)\n if (!spec) {\n return null\n }\n\n const relativePath = relative(this.config.workspaceRoot, file)\n const id = this.generateId(relativePath)\n\n return {\n id,\n source: 'workspace' as const,\n filePath: file,\n description: spec.description,\n // tags: spec.tags, // TODO: Add tags to WorkflowSpec if needed\n }\n })\n )\n\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value !== null) {\n workflows.push(result.value)\n } else if (result.status === 'rejected') {\n // Log warning but continue\n console.warn(\n '[WorkspaceWorkflowRegistry] Failed to load workflow:',\n result.reason instanceof Error ? result.reason.message : String(result.reason),\n )\n }\n }\n\n this.cache = workflows\n return workflows\n }\n\n async resolve(id: string): Promise<ResolvedWorkflow | null> {\n // Remove workspace: prefix if present\n const cleanId = id.startsWith('workspace:') ? id.slice('workspace:'.length) : id\n\n const all = await this.list()\n return all.find((w) => w.id === id || w.id.endsWith(':' + cleanId)) ?? null\n }\n\n async refresh(): Promise<void> {\n this.cache = null\n }\n\n async dispose(): Promise<void> {\n // No cleanup needed for workspace registry\n }\n\n private async loadWorkflowSpec(\n filePath: string,\n ): Promise<WorkflowSpec | null> {\n try {\n const raw = await readFile(filePath, 'utf-8')\n const parsed = filePath.endsWith('.json')\n ? JSON.parse(raw)\n : parseYaml(raw)\n\n const result = WorkflowSpecSchema.safeParse(parsed)\n if (!result.success) {\n return null\n }\n\n return result.data\n } catch {\n return null\n }\n }\n\n private generateId(relativePath: string): string {\n // Remove extension and convert to workspace: ID\n const withoutExt = relativePath.replace(/\\.(yml|yaml|json)$/, '')\n // Normalize path separators\n const normalized = withoutExt.replace(/\\\\/g, '/')\n return `workspace:${normalized}`\n }\n}\n\n","import type { ResolvedWorkflow, WorkflowRegistry } from './types'\nimport type { IEntityRegistry } from '@kb-labs/core-registry'\nimport type { WorkspaceWorkflowRegistry } from './workspace-registry'\nimport type { RemoteWorkflowRegistry } from './remote-registry'\nimport { extractWorkflows } from './plugin-workflows'\nimport { WorkflowRegistryError } from './errors'\n\n/**\n * Composite registry that combines workspace, plugin (via IEntityRegistry), and remote registries\n */\nexport class CompositeWorkflowRegistry implements WorkflowRegistry {\n private cache: ResolvedWorkflow[] | null = null\n\n constructor(\n private readonly workspace: WorkspaceWorkflowRegistry,\n private readonly cliApi: IEntityRegistry | null,\n private readonly remote?: RemoteWorkflowRegistry,\n ) {}\n\n async list(): Promise<ResolvedWorkflow[]> {\n if (this.cache) {\n return this.cache\n }\n\n const registries: Promise<ResolvedWorkflow[]>[] = [\n this.workspace.list(),\n ]\n\n // Extract plugin workflows from IEntityRegistry snapshot\n if (this.cliApi) {\n const snapshot = this.cliApi.snapshot()\n registries.push(extractWorkflows(snapshot))\n }\n\n if (this.remote) {\n registries.push(this.remote.list())\n }\n\n const results = await Promise.all(registries)\n const allWorkflows = results.flat()\n\n // Check for ID conflicts\n const ids = new Set<string>()\n const conflicts: string[] = []\n\n for (const wf of allWorkflows) {\n if (ids.has(wf.id)) {\n conflicts.push(wf.id)\n }\n ids.add(wf.id)\n }\n\n if (conflicts.length > 0) {\n throw new WorkflowRegistryError(\n `Workflow ID conflicts detected: ${conflicts.join(', ')}. ` +\n `Use explicit prefixes (workspace:, plugin:, or remote:) to disambiguate.`,\n )\n }\n\n this.cache = allWorkflows\n return this.cache\n }\n\n async resolve(id: string): Promise<ResolvedWorkflow | null> {\n // Explicit prefix\n if (id.startsWith('workspace:')) {\n return this.workspace.resolve(id)\n }\n\n if (id.startsWith('plugin:') && this.cliApi) {\n const snapshot = this.cliApi.snapshot()\n const { findWorkflow } = await import('./plugin-workflows')\n return findWorkflow(snapshot, id)\n }\n\n if (id.startsWith('remote:') && this.remote) {\n return this.remote.resolve(id)\n }\n\n // Implicit: search all\n const all = await this.list()\n const matches = all.filter(\n (w) => w.id === id || w.id.endsWith(':' + id),\n )\n\n if (matches.length > 1) {\n throw new WorkflowRegistryError(\n `Ambiguous workflow ID \"${id}\". Multiple matches: ${matches.map((m) => m.id).join(', ')}. ` +\n `Use explicit prefix (workspace:, plugin:, or remote:).`,\n id,\n )\n }\n\n return matches[0] ?? null\n }\n\n async refresh(): Promise<void> {\n this.cache = null\n const refreshTasks = [\n this.workspace.refresh(),\n ]\n // Plugin workflows refresh via IEntityRegistry.refreshRegistry() - no-op here\n if (this.remote) {\n refreshTasks.push(this.remote.refresh())\n }\n await Promise.all(refreshTasks)\n }\n\n async dispose(): Promise<void> {\n await Promise.all([\n this.workspace.dispose?.() ?? Promise.resolve(),\n this.remote?.dispose?.() ?? Promise.resolve(),\n ])\n }\n}\n\n","/**\n * Error thrown when workflow ID conflicts are detected\n */\nexport class WorkflowRegistryError extends Error {\n constructor(\n message: string,\n public readonly workflowId?: string,\n ) {\n super(message)\n this.name = 'WorkflowRegistryError'\n }\n}\n\n","export * from './types'\nexport { WorkspaceWorkflowRegistry } from './workspace-registry'\nexport { CompositeWorkflowRegistry } from './composite-registry'\nexport { WorkflowRegistryError } from './errors'\nexport { extractWorkflows, findWorkflow } from './plugin-workflows'\n\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kb-labs/workflow-runtime",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Runtime adapters and step executors for the KB Labs workflow engine.",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -29,14 +29,14 @@
|
|
|
29
29
|
"test:watch": "vitest"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@kb-labs/core-registry": "^
|
|
33
|
-
"@kb-labs/core-platform": "^
|
|
34
|
-
"@kb-labs/plugin-contracts": "^
|
|
35
|
-
"@kb-labs/plugin-execution": "^
|
|
36
|
-
"@kb-labs/workflow-artifacts": "^
|
|
37
|
-
"@kb-labs/workflow-builtins": "^
|
|
38
|
-
"@kb-labs/workflow-constants": "^
|
|
39
|
-
"@kb-labs/workflow-contracts": "^
|
|
32
|
+
"@kb-labs/core-registry": "^2.6.0",
|
|
33
|
+
"@kb-labs/core-platform": "^2.6.0",
|
|
34
|
+
"@kb-labs/plugin-contracts": "^2.6.0",
|
|
35
|
+
"@kb-labs/plugin-execution": "^2.6.0",
|
|
36
|
+
"@kb-labs/workflow-artifacts": "^2.6.0",
|
|
37
|
+
"@kb-labs/workflow-builtins": "^2.6.0",
|
|
38
|
+
"@kb-labs/workflow-constants": "^2.6.0",
|
|
39
|
+
"@kb-labs/workflow-contracts": "^2.6.0",
|
|
40
40
|
"execa": "^8.0.0",
|
|
41
41
|
"fast-glob": "^3.3.2",
|
|
42
42
|
"pino": "^9.0.0",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"zod": "^3.23.8"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@kb-labs/devkit": "
|
|
47
|
+
"@kb-labs/devkit": "workspace:*",
|
|
48
48
|
"@types/node": "^24.3.3",
|
|
49
49
|
"@typescript-eslint/eslint-plugin": "^8",
|
|
50
50
|
"@typescript-eslint/parser": "^8",
|