@cnstra/core 1.8.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -609
- package/dist/CNSStimulation.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types/TCNSStimulationOptions.d.ts +2 -0
- package/dist/types/TCNSStimulationOptions.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CNSStimulationContextStore.ts","../src/CNSNeuronActivationPump.ts","../src/CNSStimulation.ts","../src/CNSInstanceNeuronQueue.ts","../src/CNSNetwork.ts","../src/CNS.ts","../src/CNSCollateral.ts","../src/factory/index.ts"],"names":["neuron","error","ownerNeuron","collateral","r","axon"],"mappings":";;;AAEO,IAAM,6BAAN,MAAwE;AAAA,EAC3E,WAAA,CAA6B,GAAA,mBAA4B,IAAI,GAAA,EAAI,EAAG;AAAvC,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAwC;AAAA,EAErE,IAAI,GAAA,EAAsB;AACtB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAAA,EAC3B;AAAA,EAEA,GAAA,CAAI,KAAa,KAAA,EAAsB;AACnC,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAA,GAAkC;AAC9B,IAAA,OAAO,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA;AAAA,EACtC;AAAA,EAEA,OAAO,MAAA,EAAuC;AAC1C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC/C,MAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,IAC3B;AAAA,EACJ;AAAA,EAEA,OAAO,GAAA,EAAmB;AACtB,IAAA,IAAA,CAAK,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EACvB;AACJ;;;ACxBO,IAAM,0BAAN,MAGL;AAAA,EAgBE,WAAA,CACqB,SAAA,EAME,WAAA,EACA,WAAA,EACnB,eAAA,EACF;AATmB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAME,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAvBvB,IAAA,IAAA,CAAQ,QACJ,EAAC;AACL,IAAA,IAAA,CAAQ,IAAA,GAAO,CAAA;AACf,IAAA,IAAA,CAAQ,IAAA,GAAO,CAAA;AACf,IAAA,IAAA,CAAQ,IAAA,GAAO,CAAA;AACf,IAAA,IAAA,CAAQ,QAAA,GAAW,EAAA;AACnB,IAAA,IAAA,CAAU,gBAAA,GAAmB,CAAA;AAC7B,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAExB;AAGF;AAAA,IAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AAahB,IAAA,IAAI,eAAA,IAAmB,kBAAkB,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,QAAA,GAAW,eAAA;AAAA,IACpB;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAAA,EACxC;AAAA,EAEA,IAAc,iBAAA,GAA6B;AACvC,IAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,IAAe,QAAA;AAClC,IAAA,OAAO,IAAA,CAAK,gBAAA,GAAmB,KAAA,IAAS,CAAC,KAAK,WAAA,EAAa,OAAA;AAAA,EAC/D;AAAA,EAEQ,MAAA,GAAe;AACnB,IAAA,MAAM,cAAc,IAAA,CAAK,QAAA;AACzB,IAAA,IAAA,CAAK,WAAW,WAAA,GAAc,CAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,IAAI,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA;AAExC,IAAA,IAAI,WAAW,IAAA,CAAK,IAAA;AACpB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK;AAChC,MAAA,QAAA,CAAS,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACjC,MAAA,QAAA,GAAA,CAAY,WAAW,CAAA,IAAK,WAAA;AAAA,IAChC;AAEA,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AACZ,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AAAA,EACrB;AAAA,EAEQ,OAAA,GAEQ;AACZ,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,CAAA,EAAG,OAAO,MAAA;AAE5B,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACjD,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAA,CAAQ,IAAA,CAAK,IAAA,GAAO,CAAA,IAAK,IAAA,CAAK,QAAA;AACnC,IAAA,IAAA,CAAK,IAAA,EAAA;AAEL,IAAA,OAAO,oBAAA;AAAA,EACX;AAAA,EAEQ,YACJ,oBAAA,EAII;AACJ,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,IAAA,CAAK,QAAA,EAAU;AAC7B,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,oBAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAA,CAAQ,IAAA,CAAK,IAAA,GAAO,CAAA,IAAK,IAAA,CAAK,QAAA;AACnC,IAAA,IAAA,CAAK,IAAA,EAAA;AAAA,EACT;AAAA,EAEU,IAAA,GAAO;AACb,IAAA,IAAI,KAAK,OAAA,EAAS;AACd,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAEf,IAAA,OAAO,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,IAAA,GAAO,CAAA,EAAG;AAC5C,MAAA,MAAM,oBAAA,GAAuB,KAAK,OAAA,EAAQ;AAC1C,MAAA,IAAA,CAAK,gBAAA,EAAA;AACL,MAAA,IAAA,CAAK,WAAA,CAAY,IAAI,oBAAoB,CAAA;AAEzC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,oBAAoB,CAAA;AAG/C,MAAA,IAAI,GAAA,IAAO,OAAQ,GAAA,CAAY,IAAA,KAAS,UAAA,EAAY;AAChD,QAAC,GAAA,CAAqC,IAAA;AAAA,UAClC,CAAA,EAAA,KAAM;AAEF,YAAA,IAAA,CAAK,gBAAA,EAAA;AACL,YAAA,IAAA,CAAK,WAAA,CAAY,OAAO,oBAAoB,CAAA;AAC5C,YAAA,IAAI,OAAO,EAAA,KAAO,UAAA,EAAY,EAAA,EAAG;AAGjC,YAAA,IAAI,IAAA,CAAK,IAAA,GAAO,CAAA,IAAK,IAAA,CAAK,iBAAA,EAAmB;AACzC,cAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,wBACzB,IAAA,EAAK;AAAA,YACnB;AAAA,UACJ,CAAA;AAAA,UACA,CAAA,GAAA,KAAO;AACH,YAAA,IAAA,CAAK,gBAAA,EAAA;AACL,YAAA,IAAA,CAAK,WAAA,CAAY,OAAO,oBAAoB,CAAA;AAE5C,YAAA,IAAI,IAAA,CAAK,IAAA,GAAO,CAAA,IAAK,IAAA,CAAK,iBAAA,EAAmB;AACzC,cAAA,IAAI,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,wBACzB,IAAA,EAAK;AAAA,YACnB;AACA,YAAA,MAAM,GAAA;AAAA,UACV;AAAA,SACJ;AAEA,QAAA;AAAA,MACJ;AAGA,MAAA,IAAA,CAAK,gBAAA,EAAA;AACL,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,oBAAoB,CAAA;AAC5C,MAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAa,GAAA,EAAmB;AAAA,IAEvD;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAGf,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACd;AAAA,EACJ;AAAA,EAEA,QACI,oBAAA,EAIF;AACE,IAAA,IAAA,CAAK,YAAY,oBAAoB,CAAA;AAErC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,IAAA,EAAK;AAAA,cACnB,SAAA,GAAY,IAAA;AAAA,EAC1B;AAAA,EAEA,IAAI,MAAA,GAAS;AACT,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA,EAEA,wBAAA,GAA2B;AACvB,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EAChB;AAAA,EAEO,cAAA,GAGH;AACA,IAAA,MAAM,SACF,EAAC;AACL,IAAA,IAAI,QAAQ,IAAA,CAAK,IAAA;AACjB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK;AAChC,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AAC7B,MAAA,KAAA,GAAA,CAAS,KAAA,GAAQ,KAAK,IAAA,CAAK,QAAA;AAAA,IAC/B;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEO,cAAA,GAGH;AACA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAW,CAAA;AAAA,EACtC;AACJ,CAAA;;;AC7KO,IAAM,iBAAN,MAeL;AAAA,EA+BE,WAAA,CACqB,GAAA,EAMjB,mBAAA,EACgB,OAAA,EAMlB;AAbmB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAOD,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AA/BpB,IAAA,IAAA,CAAQ,cAAA,GAAiB,CAAA;AACzB,IAAA,IAAA,CAAiB,YAAA,uBAAmB,GAAA,EAElC;AACF,IAAA,IAAA,CAAiB,cAEb,EAAC;AACL,IAAA,IAAA,CAAQ,SAAA,GAAY,IAAI,OAAA,CAAc,CAAC,SAAS,MAAA,KAAW;AACvD,MAAA,IAAA,CAAK,gBAAA,GAAmB,OAAA;AACxB,MAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,IAC3B,CAAC,CAAA;AAGD,IAAA,IAAA,CAAQ,WAAA,GAAc,KAAA;AAMtB;AAAA;AAAA;AAAA,IAAA,IAAA,CAAiB,eAAA,uBAAsB,GAAA,EAAoB;AAmBvD,IAAA,IAAA,CAAK,MAAM,IAAI,0BAAA;AAAA,MACX,IAAI,IAAI,MAAA,CAAO,OAAA,CAAQ,SAAS,aAAA,IAAiB,EAAE,CAAC;AAAA,KACxD;AACA,IAAA,IAAA,CAAK,EAAA,GAAK,OAAA,EAAS,aAAA,IAAiB,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACtE,IAAA,IAAA,CAAK,QAAQ,IAAI,uBAAA;AAAA,MACb,CAAA,oBAAA,KACI,IAAA,CAAK,qBAAA,CAAsB,oBAAoB,CAAA;AAAA,MACnD,OAAA,EAAS,WAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACb;AAEA,IAAA,IAAA,CAAK,mBAAA,GAAsB,mBAAA;AAE3B,IAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe;AAC7B,MAAA,IAAA,CAAK,cAAA,uBAAqB,GAAA,EAAI;AAAA,IAClC;AAAA,EACJ;AAAA,EAEQ,mBAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,WAAA,EAAa;AACtB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,wBAAA,EAAyB,KAAM,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,KAAK,cAAA,KAAmB,CAAA;AAC9D,IAAA,MAAM,OAAA,GAAU,CAAC,CAAC,IAAA,CAAK,SAAS,WAAA,EAAa,OAAA;AAE7C,IAAA,IAAK,SAAA,IAAa,QAAA,IAAc,OAAA,IAAW,QAAA,IAAY,CAAC,SAAA,EAAY;AAEhE,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,cAAA,EAAe;AAE9C,QAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,GAAG,WAAW,CAAA,EAAG;AACjC,UAAA,MAAM,cAAA,GAAiB,KAAK,WAAA,CAAY,IAAA;AAAA,YACpC,CAAA,EAAA,KACI,EAAA,CAAG,IAAA,CAAK,QAAA,KAAa,KAAK,QAAA,IAC1B,EAAA,CAAG,IAAA,CAAK,sBAAA,KACJ,IAAA,CAAK,sBAAA,IACT,EAAA,CAAG,IAAA,CAAK,kBAAkB,IAAA,CAAK;AAAA,WACvC;AACA,UAAA,IAAI,CAAC,cAAA,EAAgB;AACjB,YAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,cAClB,IAAA;AAAA,cACA,OAAO,IAAI,KAAA;AAAA,gBACP;AAAA,eACJ;AAAA,cACA,OAAA,EAAS;AAAA,aACZ,CAAA;AAAA,UACL;AAAA,QACJ;AAEA,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,QAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,KAAA,CAAM,qBAAqB,CAAC,CAAA;AACrD,QAAA;AAAA,MACJ;AAEA,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAGnB,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,IAAK,KAAK,eAAA,EAAiB;AACrD,QAAA,MAAM,KAAA,GACF,IAAA,CAAK,eAAA,IACL,IAAI,KAAA;AAAA,UACA,CAAA,2BAAA,EAA8B,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,eAAA;AAAA,SACzD;AACJ,QAAA,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,MAC9B,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,MAC1B;AAAA,IACJ;AAAA,EACJ;AAAA,EAEO,iBAAA,GAAmC;AACtC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,qBAAA,GAGH;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,cAAA,EAAe;AAC9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,cAAA,EAAe;AAC9C,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAY,CAAA;AACjD,IAAA,OAAO,CAAC,GAAG,WAAA,EAAa,GAAG,WAAA,EAAa,GAAG,YAAY,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKO,cAAA,GAEL;AACE,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKO,UAAA,GAA0C;AAC7C,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,aACH,KAAA,EACI;AACJ,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAEtB,MAAA,MAAM,UAAA,GAGF;AAAA,QACA,GAAG,IAAA;AAAA,QACH,eAAe,IAAA,CAAK;AAAA,OACxB;AACA,MAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,UAAU,CAAA;AAAA,IACjC;AACA,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC7B;AAAA,EAEA,IAAc,kBAAA,GAA8B;AACxC,IAAA,OACI,KAAK,OAAA,EAAS,WAAA,KAAgB,MAAA,IAC9B,IAAA,CAAK,SAAS,WAAA,GAAc,CAAA;AAAA,EAEpC;AAAA,EAEA,IAAc,0BAAA,GAAsC;AAChD,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,OAAA,EAAS,mBAAA,IAAuB,KAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKU,iBAAiB,QAAA,EAA6B;AACpD,IAAA,IAAI,CAAC,KAAK,0BAAA,EAA4B;AAEtC,IAAA,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKU,mBAAmB,QAAA,EAA6B;AACtD,IAAA,IAAI,CAAC,KAAK,0BAAA,EAA4B;AAEtC,IAAA,IAAA,CAAK,kBAAkB,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,QAAA,EAA6B;AACnD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,wBAAwB,QAAQ,CAAA;AAClE,IAAA,IAAI,aAAa,MAAA,EAAW;AAE5B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AAC3D,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAA,EAAU,YAAA,GAAe,CAAC,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,QAAA,EAA6B;AACnD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,wBAAwB,QAAQ,CAAA;AAClE,IAAA,IAAI,aAAa,MAAA,EAAW;AAE5B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,eAAe,CAAC,CAAA;AAC9C,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAA,EAAU,SAAS,CAAA;AAG5C,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACpB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACJ,yEAAyE,QAAQ,CAAA;AAAA,OACrF;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKU,0BAA0B,QAAA,EAAgC;AAChE,IAAA,IAAI,CAAC,IAAA,CAAK,0BAAA,EAA4B,OAAO,KAAA;AAC7C,IAAA,OAAO,IAAA,CAAK,IAAI,OAAA,CAAQ,yBAAA;AAAA,MACpB,QAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACT;AAAA,EACJ;AAAA,EAEU,mBAAmBA,OAAAA,EAAuB;AAChD,IAAA,IACI,KAAK,0BAAA,IACL,IAAA,CAAK,yBAAA,CAA0BA,OAAAA,CAAO,IAAI,CAAA,EAC5C;AACE,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAOA,OAAAA,CAAO,IAAI,CAAA;AAAA,IAC/B;AAAA,EACJ;AAAA,EAEU,yBAAA,CACN,YACA,WAAA,EACF;AACE,IAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe;AAC7B,MAAA,IACI,IAAA,CAAK,cAAA,EAAgB,GAAA,CAAI,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA,IAC/C,CAAA,IAAK,IAAA,CAAK,OAAA,EAAS,aAAA,EACrB;AACE,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,CAAA,oCAAA,EAAuC,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA,qCAAA,EACnB,UAAA,CAAW,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,kBAAA,EACtD,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,SAClC;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,cAAA,EAAgB,GAAA;AAAA,UACjB,WAAW,MAAA,CAAO,IAAA;AAAA,UAAA,CACjB,KAAK,cAAA,EAAgB,GAAA,CAAI,WAAW,MAAA,CAAO,IAAI,KAAK,CAAA,IAAK;AAAA,SAC9D;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,MAAM,oBAAA,GAGF;AAAA,MACA,eAAe,IAAA,CAAK,EAAA;AAAA,MACpB,QAAA,EAAU,WAAW,MAAA,CAAO,IAAA;AAAA,MAC5B,sBAAA,EAAwB,UAAA,CAAW,QAAA,CAAS,UAAA,CAAW,IAAA;AAAA,MACvD,KAAA,EAAO;AAAA,KACX;AACA,IAAA,OAAO,oBAAA;AAAA,EACX;AAAA,EAEQ,sBACJ,oBAAA,EAIF;AACE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,cAAA;AAAA,MACjC,oBAAA,CAAqB;AAAA,KACzB;AACA,IAAA,MAAM,aAAa,WAAA,CAAY,IAAA;AAAA,MAC3B,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,CAAO,IAAA,KAAS,oBAAA,CAAqB;AAAA,KAChD;AACA,IAAA,IAAI,CAAC,UAAA,EAAY;AAEb,MAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,QAClB,IAAA,EAAM,oBAAA;AAAA,QACN,OAAO,IAAI,KAAA;AAAA,UACP,CAAA,iCAAA,EAAoC,oBAAA,CAAqB,QAAQ,CAAA,kBAAA,EAAqB,qBAAqB,sBAAsB,CAAA,CAAA;AAAA,SACrI;AAAA,QACA,OAAA,EAAS;AAAA,OACZ,CAAA;AACD,MAAA,OAAO,MAAM;AAAA,MAAC,CAAA;AAAA,IAClB;AAEA,IAAA,MAAMA,UAAS,UAAA,CAAW,MAAA;AAC1B,IAAA,MAAM,WAAW,UAAA,CAAW,QAAA;AAE5B,IAAA,MAAM,WAAA,GAAc,qBAAqB,KAAA,GAClC;AAAA,MACG,cAAA,EAAgB,qBAAqB,KAAA,CAAM,cAAA;AAAA,MAC3C,OAAA,EAAS,qBAAqB,KAAA,CAAM;AAAA,KACxC,GACA,MAAA;AAEN,IAAA,MAAM,UAAU,MAAM;AAElB,MAAA,IAAA,CAAK,gBAAA,CAAiBA,QAAO,IAAI,CAAA;AAEjC,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI;AACA,QAAA,QAAA,GAAW,QAAA,CAAS,QAAA;AAAA,UAChB,WAAA,EAAa,OAAA;AAAA,UACbA,OAAAA,CAAO,IAAA;AAAA,UACP;AAAA,YACI,KAAK,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAIA,QAAO,IAAI,CAAA;AAAA,YACnC,GAAA,EAAK,CAAC,KAAA,KAAe,IAAA,CAAK,IAAI,GAAA,CAAIA,OAAAA,CAAO,MAAM,KAAK,CAAA;AAAA,YACpD,QAAQ,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAOA,QAAO,IAAI,CAAA;AAAA,YACzC,WAAA,EAAa,KAAK,OAAA,EAAS,WAAA;AAAA,YAC3B,KAAK,IAAA,CAAK,GAAA;AAAA,YAMV,eAAe,IAAA,CAAK;AAAA;AACxB,SACJ;AAAA,MACJ,SAAS,KAAA,EAAO;AAEZ,QAAA,IAAA,CAAK,kBAAA,CAAmBA,QAAO,IAAI,CAAA;AACnC,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,EAAS,WAAA,EAAa,OAAA,IAAW,KAAA;AACxD,QAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,UAClB,IAAA,EAAM,oBAAA;AAAA,UACN,KAAA,EACI,iBAAiB,KAAA,GACX,KAAA,GACA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACjC,OAAA,EAAS;AAAA,SACZ,CAAA;AACD,QAAA,IAAA,CAAK,0BAAA;AAAA,UACD,WAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA,OAAO,MAAM;AAAA,QAAC,CAAA;AAAA,MAClB;AAEA,MAAA,MAAM,cAAeA,OAAAA,CAAe,WAAA;AAIpC,MAAA,MAAM,YAKF,QAAA,YAAoB,OAAA,GACd,QAAA,GACA,OAAA,CAAQ,QAAQ,QAAe,CAAA;AAEzC,MAAA,MAAM,YAAA,GACF,eAAe,WAAA,GAAc,CAAA,GACvB,IAAI,OAAA,CAIF,CAAC,SAAS,MAAA,KAAW;AACnB,QAAA,MAAM,CAAA,GAAI,WAAW,MAAM;AACvB,UAAA,MAAM,MAAM,IAAI,KAAA;AAAA,YACZ,CAAA,QAAA,EAAW,MAAA;AAAA,cACPA,OAAAA,CAAO;AAAA,aACV,0BAA0B,WAAW,CAAA,EAAA;AAAA,WAC1C;AACA,UAAA,MAAA,CAAO,GAAG,CAAA;AAAA,QACd,GAAG,WAAW,CAAA;AACd,QAAA,SAAA,CAAU,IAAA;AAAA,UACN,CAAA,CAAA,KAAK;AACD,YAAA,YAAA,CAAa,CAAC,CAAA;AACd,YAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,UACb,CAAA;AAAA,UACA,CAAA,CAAA,KAAK;AACD,YAAA,YAAA,CAAa,CAAC,CAAA;AACd,YAAA,MAAA,CAAO,CAAC,CAAA;AAAA,UACZ;AAAA,SACJ;AAAA,MACJ,CAAC,CAAA,GACD,SAAA;AAEV,MAAA,IAAI,QAAA,YAAoB,WAAW,WAAA,EAAa;AAC5C,QAAA,OAAO,YAAA,CAAa,IAAA;AAAA,UAChB,CAAA,MAAA,KAAU;AACN,YAAA,OAAO,MAAM;AAET,cAAA,IAAA,CAAK,kBAAA,CAAmBA,QAAO,IAAI,CAAA;AACnC,cAAA,OAAO,IAAA,CAAK,0BAAA;AAAA,gBACR,WAAA;AAAA,gBACA;AAAA,eAIJ;AAAA,YACJ,CAAA;AAAA,UACJ,CAAA;AAAA,UACA,CAAA,KAAA,KAAS;AACL,YAAA,OAAO,MAAM;AAET,cAAA,IAAA,CAAK,kBAAA,CAAmBA,QAAO,IAAI,CAAA;AAEnC,cAAA,MAAM,SAAA,GACF,IAAA,CAAK,OAAA,EAAS,WAAA,EAAa,OAAA,IAAW,KAAA;AAC1C,cAAA,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,gBAClB,IAAA,EAAM,oBAAA;AAAA,gBACN,KAAA,EACI,iBAAiB,KAAA,GACX,KAAA,GACA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBACjC,OAAA,EAAS;AAAA,eACZ,CAAA;AACD,cAAA,OAAO,IAAA,CAAK,0BAAA;AAAA,gBACR,WAAA;AAAA,gBACA,MAAA;AAAA,gBACA;AAAA,eACJ;AAAA,YACJ,CAAA;AAAA,UACJ;AAAA,SACJ;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,OAAO,MAAM;AAET,UAAA,IAAA,CAAK,kBAAA,CAAmBA,QAAO,IAAI,CAAA;AACnC,UAAA,OAAO,IAAA,CAAK,0BAAA;AAAA,YACR,WAAA;AAAA,YACA;AAAA,WAIJ;AAAA,QACJ,CAAA;AAAA,MACJ;AAAA,IACJ,CAAA;AAGA,IAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAIA,OAAAA,EAAQ,OAAO,CAAA;AAAA,EACvD;AAAA,EAEU,0BAAA,CACN,WAAA,EACA,qBAAA,EAGA,KAAA,EACI;AAEJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,qBAAqB,CAAA,EAAG;AAEtC,MAAA,IAAI,qBAAA,CAAsB,WAAW,CAAA,EAAG;AACpC,QAAA,IAAA,CAAK,eAAA,CAAgB,WAAA,EAAa,MAAA,EAAW,KAAK,CAAA;AAClD,QAAA;AAAA,MACJ;AAEA,MAAA,KAAA,MAAW,UAAU,qBAAA,EAAuB;AACxC,QAAA,IAAA,CAAK,eAAA,CAAgB,WAAA,EAAa,MAAA,EAAQ,KAAK,CAAA;AAAA,MACnD;AACA,MAAA;AAAA,IACJ;AAGA,IAAA,IAAA,CAAK,eAAA,CAAgB,WAAA,EAAa,qBAAA,EAAuB,KAAK,CAAA;AAAA,EAClE;AAAA,EAEU,eAAA,CACN,WAAA,EACA,YAAA,EACA,KAAA,EACI;AACJ,IAAA,MAAM,iBAAiB,YAAA,EAAc,cAAA;AAGrC,IAAA,MAAM,cAAc,cAAA,GACd,IAAA,CAAK,IAAI,OAAA,CAAQ,+BAAA,CAAgC,cAAc,CAAA,GAC/D,MAAA;AACN,IAAA,MAAM,WAAA,GAAc,iBACd,IAAA,CAAK,GAAA,CAAI,QAAQ,cAAA,CAAe,cAAc,IAC9C,EAAC;AACP,IAAA,MAAM,4BAGA,EAAC;AAEP,IAAA,IAAI,cAAA,IAAkB,CAAC,KAAA,EAAO;AAC1B,MAAA,IAAI,WAAA,EAAa;AACb,QAAA,IAAA,CAAK,mBAAmB,WAAW,CAAA;AAAA,MACvC;AAEA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AACzC,QAAA,MAAM,OAAO,IAAA,CAAK,yBAAA;AAAA,UACd,YAAY,CAAC,CAAA;AAAA,UACb;AAAA,SACJ;AACA,QAAA,yBAAA,CAA0B,KAAK,IAAI,CAAA;AACnC,QAAA,IAAA,CAAK,YAAA,CAAa,IAAI,IAAI,CAAA;AAAA,MAC9B;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,kBAAkB,yBAAA,CAA0B,MAAA;AAGjD,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI;AACA,MAAA,YAAA,GAAe,IAAA,CAAK,SAAS,UAAA,GAAa;AAAA,QACtC,WAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA,EAAc,IAAA,CAAK,GAAA,CAAI,MAAA,EAAO;AAAA,QAC9B,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,cAAA;AAAA,QACtC,WAAA,EAAa,IAAA;AAAA,QACb,eAAe,IAAA,CAAK,EAAA;AAAA,QAEpB,IAAA,EACI,IAAA,CAAK,OAAA,EAAS,aAAA,IAAiB,WAAA,GACzB,IAAA,CAAK,cAAA,EAAgB,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,IAAK,CAAA,GAC9C,KAAA,CAAA;AAAA,QACV;AAAA,OACH,CAAA;AAAA,IACL,SAAS,CAAA,EAAG;AAER,MAAA,IAAA,CAAK,eAAA,GACD,aAAa,KAAA,GAAQ,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAEhD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,yBAAA,CAA0B,QAAQ,CAAA,EAAA,EAAK;AACvD,QAAA,IAAA,CAAK,cAAA,EAAA;AACL,QAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,yBAAA,CAA0B,CAAC,CAAC,CAAA;AACrD,QAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,yBAAA,CAA0B,CAAC,CAAC,CAAA;AAAA,MACnD;AACA,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA;AAAA,IACJ;AAGA,IAAA,IAAI,YAAA,IAAgB,OAAO,YAAA,CAAa,IAAA,KAAS,UAAA,EAAY;AACzD,MAAC,YAAA,CAA+B,IAAA;AAAA,QAC5B,MAAM;AACF,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,yBAAA,CAA0B,QAAQ,CAAA,EAAA,EAAK;AACvD,YAAA,IAAA,CAAK,cAAA,EAAA;AACL,YAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,yBAAA,CAA0B,CAAC,CAAC,CAAA;AACrD,YAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,yBAAA,CAA0B,CAAC,CAAC,CAAA;AAAA,UACnD;AACA,UAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,QAC7B,CAAA;AAAA,QACA,CAAAC,MAAAA,KAAS;AAEL,UAAA,IAAA,CAAK,eAAA,GACDA,kBAAiB,KAAA,GACXA,MAAAA,GACA,IAAI,KAAA,CAAM,MAAA,CAAOA,MAAK,CAAC,CAAA;AAEjC,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,yBAAA,CAA0B,QAAQ,CAAA,EAAA,EAAK;AACvD,YAAA,IAAA,CAAK,cAAA,EAAA;AACL,YAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,yBAAA,CAA0B,CAAC,CAAC,CAAA;AACrD,YAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,yBAAA,CAA0B,CAAC,CAAC,CAAA;AAAA,UACnD;AACA,UAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,QAC7B;AAAA,OACJ;AACA,MAAA;AAAA,IACJ;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,yBAAA,CAA0B,QAAQ,CAAA,EAAA,EAAK;AACvD,MAAA,IAAA,CAAK,cAAA,EAAA;AACL,MAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,yBAAA,CAA0B,CAAC,CAAC,CAAA;AACrD,MAAA,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,yBAAA,CAA0B,CAAC,CAAC,CAAA;AAAA,IACnD;AACA,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC7B;AAAA,EAEO,iBACH,eAAA,EAGI;AAEJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAAG;AAChC,MAAA,KAAA,MAAW,UAAU,eAAA,EAAiB;AAClC,QAAA,MAAMC,YAAAA,GACF,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,+BAAA;AAAA,UACb,MAAA,CAAO;AAAA,SACX;AACJ,QAAA,IAAIA,YAAAA,EAAa;AACb,UAAA,IAAA,CAAK,gBAAA,CAAiBA,aAAY,IAAI,CAAA;AAAA,QAC1C;AAAA,MACJ;AAGA,MAAA,IAAA,CAAK,0BAAA,CAA2B,QAAW,eAAe,CAAA;AAC1D,MAAA;AAAA,IACJ;AAGA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,+BAAA;AAAA,MACjC,eAAA,CAAgB;AAAA,KACpB;AACA,IAAA,IAAI,WAAA,EAAa;AACb,MAAA,IAAA,CAAK,gBAAA,CAAiB,YAAY,IAAI,CAAA;AAAA,IAC1C;AAIA,IAAA,IAAA,CAAK,eAAA,CAAgB,QAAW,eAAe,CAAA;AAC/C,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC7B;AACJ,CAAA;;;ACzoBO,IAAM,yBAAN,MAEL;AAAA,EAFK,WAAA,GAAA;AAGH,IAAA,IAAA,CAAiB,KAAA,uBAAY,GAAA,EAG3B;AAAA,EAAA;AAAA,EAEF,GAAA,CACIF,SACA,EAAA,EACkC;AAClC,IAAA,MAAM,QAAQA,OAAAA,EAAQ,WAAA;AACtB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,IAAS,CAAA,EAAG;AACnC,MAAA,OAAO,EAAA,EAAG;AAAA,IACd;AAEA,IAAA,IAAI,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIA,QAAO,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA,IAAA,GAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,EAAC,EAAE;AACvC,MAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIA,OAAAA,CAAO,IAAA,EAAM,IAAI,CAAA;AAAA,IACpC,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,IACjB;AAEA,IAAA,MAAM,IAAA,GAAO,CAAC,EAAA,KAAmB;AAC7B,MAAA,OAAO,MAAM;AACT,QAAA,IAAI;AACA,UAAA,EAAA,EAAG;AAAA,QACP,CAAA,SAAE;AACE,UAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIA,QAAO,IAAI,CAAA;AACpC,UAAA,CAAA,CAAE,SAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,SAAS,CAAC,CAAA;AACnC,UAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACtB,YAAA,MAAM,IAAA,GAAO,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAM;AAC7B,YAAA,IAAA,EAAK;AAAA,UACT;AAAA,QACJ;AAAA,MACJ,CAAA;AAAA,IACJ,CAAA;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,KAAA,EAAO;AAC1B,MAAA,IAAA,CAAK,MAAA,EAAA;AACL,MAAA,MAAM,MAAM,EAAA,EAAG;AACf,MAAA,IAAI,GAAA,IAAO,OAAQ,GAAA,CAAY,IAAA,KAAS,UAAA,EAAY;AAChD,QAAA,OAAQ,GAAA,CAA4B,IAAA,CAAK,CAAA,EAAA,KAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,MAC3D;AACA,MAAA,OAAO,KAAK,GAAiB,CAAA;AAAA,IACjC;AAEA,IAAA,OAAO,IAAI,QAAoB,CAAA,OAAA,KAAW;AACtC,MAAA,MAAM,UAAU,MAAM;AAClB,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIA,QAAO,IAAI,CAAA;AACpC,QAAA,CAAA,CAAE,MAAA,EAAA;AACF,QAAA,MAAM,MAAM,EAAA,EAAG;AACf,QAAA,IAAI,GAAA,IAAO,OAAQ,GAAA,CAAY,IAAA,KAAS,UAAA,EAAY;AAChD,UAAC,IAA4B,IAAA,CAAK,CAAA,EAAA,KAAM,QAAQ,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAAA,QAC7D,CAAA,MAAO;AACH,UAAA,OAAA,CAAQ,IAAA,CAAK,GAAiB,CAAC,CAAA;AAAA,QACnC;AAAA,MACJ,CAAA;AACA,MAAA,IAAA,CAAM,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IAC9B,CAAC,CAAA;AAAA,EACL;AACJ,CAAA;;;AC1DO,IAAM,aAAN,MAKL;AAAA,EAwCE,YAA6B,OAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAnC7B;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAO,8BAA6C,EAAC;AAKrD;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAAoB;AAK9C;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,MAAA,uBAAuC,GAAA,EAAI;AAKnD;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,YAAA,uBAA6C,GAAA,EAAI;AAMzD;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAGrB;AAEF,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAA0B;AACpD,IAAA,IAAA,CAAQ,aAAA,uBAAoB,GAAA,EAAgC;AAC5D,IAAA,IAAA,CAAQ,eAAA,uBAAsB,GAAA,EAG5B;AAEF,IAAA,IAAA,CAAQ,4BAAA,uBAAmC,GAAA,EAA8B;AAGrE,IAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,yBAAA,GAAkC;AACtC,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAAY;AAExC,IAAA,KAAA,MAAWA,OAAAA,IAAU,KAAK,OAAA,EAAS;AAC/B,MAAA,MAAM,IAAA,GAAQA,SAAQ,IAAA,IAA8B,EAAA;AACpD,MAAA,IAAI,CAAC,QAAQ,OAAO,IAAA,KAAS,YAAY,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,KAAW,CAAA,EAAG;AAC/D,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,mCAAA,EAAsC,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MAC7D,CAAA,MAAA,IAAW,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,EAAG;AAClC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAA2B,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MAClD,CAAA,MAAO;AACH,QAAA,eAAA,CAAgB,IAAI,IAAI,CAAA;AAAA,MAC5B;AAAA,IACJ;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACN,CAAA;AAAA,GAAA,CAAA,GACI,OAAO,IAAA,CAAK;AAAA,GAAA,CAAO;AAAA,OAC3B;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAA6C;AACjD,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAyB;AAC3C,IAAA,MAAM,YAAY,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AAG9C,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAC9B,MAAA,KAAA,CAAM,GAAA,CAAI,QAAA,kBAAU,IAAI,GAAA,EAAK,CAAA;AAAA,IACjC;AAGA,IAAA,KAAA,MAAWA,OAAAA,IAAU,KAAK,OAAA,EAAS;AAC/B,MAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AAGzC,MAAA,KAAA,MAAW,OAAA,IAAWA,QAAO,IAAA,EAAM;AAC/B,QAAA,MAAMG,WAAAA,GAAaH,OAAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AACtC,QAAA,MAAM,iBAAiBG,WAAAA,CAAW,IAAA;AAGlC,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA;AACpD,QAAA,IAAI,WAAA,EAAa;AACb,UAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,YAAA,EAAa,IAAK,WAAA,EAAa;AAChD,YAAA,gBAAA,CAAiB,GAAA,CAAI,aAAa,IAAI,CAAA;AAAA,UAC1C;AAAA,QACJ;AAAA,MACJ;AAEA,MAAA,KAAA,CAAM,GAAA,CAAIH,OAAAA,CAAO,IAAA,EAAM,gBAAgB,CAAA;AAAA,IAC3C;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,GAAiB;AACrB,IAAA,MAAM,KAAA,GAAQ,KAAK,gBAAA,EAAiB;AACpC,IAAA,MAAM,YAAY,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AAG9C,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,aAA4B,EAAC;AACnC,IAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,IAAA,MAAM,aAAA,GAAgB,CAAC,QAAA,KAAqB;AACxC,MAAA,KAAA,CAAM,GAAA,CAAI,UAAU,YAAY,CAAA;AAChC,MAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,YAAY,CAAA;AAClC,MAAA,YAAA,EAAA;AACA,MAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,MAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAEpB,MAAA,MAAM,YAAY,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,wBAAS,GAAA,EAAI;AACjD,MAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AAC1C,QAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,EAAG;AACtB,UAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,UAAA,OAAA,CAAQ,GAAA;AAAA,YACJ,QAAA;AAAA,YACA,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAE;AAAA,WAC3D;AAAA,QACJ,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,UAAA,OAAA,CAAQ,GAAA;AAAA,YACJ,QAAA;AAAA,YACA,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAE;AAAA,WACzD;AAAA,QACJ;AAAA,MACJ;AAEA,MAAA,IAAI,QAAQ,GAAA,CAAI,QAAQ,MAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC/C,QAAA,MAAM,SAAA,uBAAgB,GAAA,EAAY;AAClC,QAAA,IAAI,CAAA;AACJ,QAAA,GAAG;AACC,UAAA,CAAA,GAAI,MAAM,GAAA,EAAI;AACd,UAAA,OAAA,CAAQ,OAAO,CAAC,CAAA;AAChB,UAAA,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,QACnB,SAAS,CAAA,KAAM,QAAA;AACf,QAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,MAC7B;AAAA,IACJ,CAAA;AAGA,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAC9B,MAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,EAAG;AACtB,QAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,MAC1B;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,2BAAA,GAA8B,UAAA;AAGnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,KAAA,MAAW,YAAY,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA,EAAG;AAC9C,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,CAAC,CAAA;AAAA,MACpC;AAAA,IACJ;AAGA,IAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAGtB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,WAAA,EAA6C;AAC7D,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAGlB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,2BAAA,CAA4B,QAAQ,CAAA,EAAA,EAAK;AAC9D,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,kBAAG,IAAI,KAAK,CAAA;AAAA,IAChC;AAGA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,2BAAA,CAA4B,QAAQ,CAAA,EAAA,EAAK;AAC9D,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,2BAAA,CAA4B,CAAC,CAAA;AAE9C,MAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG;AACpC,QAAA,MAAM,YAAY,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,wBAAS,GAAA,EAAI;AAEvD,QAAA,KAAA,MAAW,UAAA,IAAc,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AAC5C,UAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AACxD,UAAA,IACI,gBAAA,KAAqB,MAAA,IACrB,gBAAA,KAAqB,CAAA,EACvB;AAEE,YAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,gBAAgB,CAAA,CAAG,IAAI,CAAC,CAAA;AAAA,UAC5C;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAGxB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,2BAAA,CAA4B,QAAQ,CAAA,EAAA,EAAK;AAC9D,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,CAAA,kBAAG,IAAI,KAAK,CAAA;AAAA,IACtC;AAGA,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,2BAAA,CAA4B,QAAQ,CAAA,EAAA,EAAK;AAC9D,MAAA,MAAM,gBAAgB,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA,wBAAS,GAAA,EAAI;AACpD,MAAA,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,aAAA,CAAc,IAAI,CAAA;AAElC,MAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC1B,QAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACJ;AAGA,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA;AAEnD,MAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,IAAA,CAAK,aAAa,CAAA,EAAG;AAE9C,QAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA;AACxD,QAAA,iBAAA,CAAkB,IAAI,OAAO,CAAA;AAG7B,QAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AACtD,QAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,IAAA,CAAK,gBAAgB,CAAA,EAAG;AACjD,UAAA,iBAAA,CAAkB,IAAI,QAAQ,CAAA;AAAA,QAClC;AAGA,QAAA,MAAM,WAAA,GAAA,CAAe,QAAA,CAAS,GAAA,CAAI,QAAQ,KAAK,CAAA,IAAK,CAAA;AACpD,QAAA,QAAA,CAAS,GAAA,CAAI,UAAU,WAAW,CAAA;AAElC,QAAA,IAAI,gBAAgB,CAAA,EAAG;AACnB,UAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,QACvB;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,QAAA,EAA+B;AACpD,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAGjC,IAAA,KAAA,MAAW,CAAC,WAAW,aAAa,CAAA,IAAK,MAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA,EAAG;AAC9D,MAAA,IAAI,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7B,QAAA,QAAA,CAAS,IAAI,SAAS,CAAA;AAAA,MAC1B;AAAA,IACJ;AAEA,IAAA,OAAO,QAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,sBAAsB,UAAA,EAAoB;AAC7C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAEhD,IAAA,IAAI,aAAa,MAAA,EAAW;AAE5B,IAAA,OAAO,IAAA,CAAK,4BAA4B,QAAQ,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKO,wBAAwB,UAAA,EAAwC;AACnE,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,yBAAA,CACH,YACA,eAAA,EACO;AACP,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAChD,IAAA,IAAI,QAAA,KAAa,QAAW,OAAO,IAAA;AAGnC,IAAA,IACI,eAAA,CAAgB,IAAI,QAAQ,CAAA,IAC5B,gBAAgB,GAAA,CAAI,QAAQ,IAAK,CAAA,EACnC;AACE,MAAA,OAAO,KAAA;AAAA,IACX;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA;AAChD,IAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,IAAA,KAAA,MAAW,gBAAA,IAAoB,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AAClD,MAAA,IACI,eAAA,CAAgB,IAAI,gBAAgB,CAAA,IACpC,gBAAgB,GAAA,CAAI,gBAAgB,IAAK,CAAA,EAC3C;AACE,QAAA,OAAO,KAAA;AAAA,MACX;AAAA,IACJ;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,YAAA,GAAe;AACnB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,6BAA6B,KAAA,EAAM;AACxC,IAAA,KAAA,MAAWA,OAAAA,IAAU,KAAK,OAAA,EAAS;AAC/B,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAIA,OAAAA,CAAO,IAAA,EAAMA,OAAM,CAAA;AACxC,MAAA,KAAA,MAAW,QAAA,IAAYA,QAAO,SAAA,EAAW;AACrC,QAAA,MAAM,GAAA,GAAM,SAAS,UAAA,CAAW,IAAA;AAChC,QAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,KAAK,EAAC;AACvC,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAAA,OAAAA,EAAQ,UAAiC,CAAA;AACpD,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA;AAAA,UACV,GAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,GAAA,EAAK,QAAqB,CAAA;AAAA,MACrD;AACA,MAAA,MAAA,CAAO,OAAOA,OAAAA,CAAO,IAAI,CAAA,CAAE,OAAA,CAAQ,CAAAG,WAAAA,KAAc;AAC7C,QAAA,IAAA,CAAK,4BAAA,CAA6B,GAAA;AAAA,UAC7BA,WAAAA,CACI,IAAA;AAAA,UACLH;AAAA,SACJ;AACA,QAAA,IAAA,CAAK,eAAA,CAAgB,GAAA;AAAA,UAChBG,WAAAA,CACI,IAAA;AAAA,UACLA;AAAA,SACJ;AAAA,MACJ,CAAC,CAAA;AAAA,IACL;AAAA,EACJ;AAAA,EAEO,gCAAgC,cAAA,EAAiC;AACpE,IAAA,OAAO,IAAA,CAAK,4BAAA,CAA6B,GAAA,CAAI,cAAc,CAAA;AAAA,EAC/D;AAAA,EAEO,YAAA,GAAe;AAClB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA;AAAA,EACjD;AAAA,EAEO,cAAA,GAAiB;AACpB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AAAA,EACnD;AAAA,EAEO,UAAA,GAAa;AAChB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAAA,EAC/C;AAAA,EAEO,oBACH,cAAA,EACF;AACE,IAAA,OAAO,KAAK,eAAA,CAAgB,GAAA;AAAA,MACxB;AAAA,KACJ;AAAA,EACJ;AAAA,EAEO,gBAA+C,UAAA,EAAmB;AACrE,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAoC,CAAA;AAAA,EACpE;AAAA,EAEO,eACH,cAAA,EACoC;AACpC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,cAAc,KAAK,EAAC;AAAA,EACjD;AACJ,CAAA;;;AClZO,IAAM,MAAN,MAUP;AAAA,EAiCI,WAAA,CACuB,SACH,OAAA,EAClB;AAFqB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AArBpB;AAAA;AAAA;AAAA,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAGjC;AAMF;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAmB,mBAAA,GACf,IAAI,sBAAA,EAAgC;AAKxC;AAAA;AAAA;AAAA,IAAA,IAAA,CAAiB,0BAEb,EAAC;AAMD,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEO,oBACH,QAAA,EAQU;AACV,IAAA,IAAA,CAAK,uBAAA,CAAwB,KAAK,QAAQ,CAAA;AAC1C,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,OAAO,MAAM;AACT,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAA,GAAS,KAAA;AACT,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,uBAAA,CAAwB,OAAA,CAAQ,QAAQ,CAAA;AACzD,MAAA,IAAI,OAAO,CAAA,EAAG,IAAA,CAAK,uBAAA,CAAwB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC5D,CAAA;AAAA,EACJ;AAAA,EAEQ,eACJ,KAAA,EACqC;AACrC,IAAA,IAAI,IAAA,CAAK,uBAAA,CAAwB,MAAA,KAAW,CAAA,IAAK,CAAC,KAAA,EAAO;AAErD,MAAA,OAAO,MAAM;AAAA,MAAC,CAAA;AAAA,IAClB;AACA,IAAA,OAAO,CAAC,CAAA,KAAS;AACb,MAAA,IAAI,UAAA,GAAa,KAAA;AACjB,MAAA,MAAM,WAA4B,EAAC;AAEnC,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,IAAI;AACA,UAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,UAAA,IAAI,GAAA,IAAO,OAAQ,GAAA,CAAY,IAAA,KAAS,UAAA,EAAY;AAChD,YAAA,UAAA,GAAa,IAAA;AACb,YAAA,QAAA,CAAS,KAAK,GAAoB,CAAA;AAAA,UACtC;AAAA,QACJ,SAAS,KAAA,EAAO;AAEZ,UAAA,UAAA,GAAa,IAAA;AACb,UAAA,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACvC;AAAA,MACJ;AAEA,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAA,EAAA,EAAK;AAC1D,QAAA,IAAI;AACA,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,uBAAA,CAAwB,CAAC,EAAE,CAAC,CAAA;AAC7C,UAAA,IAAI,GAAA,IAAO,OAAQ,GAAA,CAAY,IAAA,KAAS,UAAA,EAAY;AAChD,YAAA,UAAA,GAAa,IAAA;AACb,YAAA,QAAA,CAAS,KAAK,GAAoB,CAAA;AAAA,UACtC;AAAA,QACJ,SAAS,KAAA,EAAO;AAEZ,UAAA,UAAA,GAAa,IAAA;AACb,UAAA,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACvC;AAAA,MACJ;AAEA,MAAA,IAAI,UAAA,EAAY;AACZ,QAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,CAAE,KAAK,CAAA,OAAA,KAAW;AAChD,UAAA,MAAM,WAAW,OAAA,CAAQ,IAAA;AAAA,YACrB,CAAAC,EAAAA,KAAKA,EAAAA,CAAE,MAAA,KAAW;AAAA,WACtB;AACA,UAAA,IAAI,QAAA,QAAgB,QAAA,CAAS,MAAA;AAAA,QACjC,CAAC,CAAA;AAAA,MACL;AAAA,IACJ,CAAA;AAAA,EACJ;AAAA,EAEO,SAAA,CAIH,iBAGA,OAAA,EAeF;AACE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,UAAU,CAAA;AACvD,IAAA,MAAM,WAAA,GAAc,IAAI,cAAA,CAOtB,IAAA,EAAM,KAAK,mBAAA,EAAqB;AAAA,MAC9B,GAAG,OAAA;AAAA,MACH,UAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,WAAA,CAAY,iBAAiB,eAAe,CAAA;AAC5C,IAAA,OAAO,WAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKO,QAAA,CACH,OACA,OAAA,EAeF;AACE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,UAAU,CAAA;AACvD,IAAA,MAAM,WAAA,GAAc,IAAI,cAAA,CAOtB,IAAA,EAAM,KAAK,mBAAA,EAAqB;AAAA,MAC9B,GAAG,OAAA;AAAA,MACH,UAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,WAAA,CAAY,aAAa,KAAK,CAAA;AAC9B,IAAA,OAAO,WAAA;AAAA,EACX;AACJ;;;AC5MO,IAAM,gBAAN,MAEP;AAAA,EACI,YAA4B,IAAA,EAAa;AAAb,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAc;AAAA,EAI1C,aAAa,OAAA,EAAiD;AAC1D,IAAA,OAAO,EAAE,cAAA,EAAgB,IAAA,CAAK,IAAA,EAAM,OAAA,EAAQ;AAAA,EAChD;AACJ;;;ACTO,IAAM,UAAA,GAAa,CACtB,IAAA,KACC,IAAI,cAA+B,IAAI;AA0GrC,IAAM,MAAA,GAAS,CAalB,IAAA,EACA,IAAA,KAOC;AACD,EAAA,MAAM,YAOA,EAAC;AAEP,EAAA,MAAM,GAAA,GAMF;AAAA,IACA,cAAA,EAAgB,CAAC,CAAA,KAA0B;AACvC,MAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAClB,MAAA,OAAO,GAAA;AAAA,IACX,CAAA;AAAA,IACA,cAAA,EAAgB,CAAC,EAAA,KAA2B;AACxC,MAAA,GAAA,CAAI,WAAA,GAAc,EAAA;AAClB,MAAA,OAAO,GAAA;AAAA,IACX,CAAA;AAAA,IACA,IAAA,GAAO,CAACC,KAAAA,EAAM,YAAA,KAAiB;AAC3B,MAAA,KAAA,MAAW,OAAO,YAAA,EAAc;AAC5B,QAAA,MAAM,KAAA,GAAQ,aAAa,GAAG,CAAA;AAC9B,QAAA,MAAM,QAAA,GACF,OAAO,KAAA,KAAU,UAAA,GACX;AAAA,UACI,UAAA,EAAaA,MAAa,GAAG,CAAA;AAAA,UAC7B,QAAA,EAAU;AAAA,SACd,GACA,KAAA;AACV,QAAA,SAAA,CAAU,IAAA;AAAA,UACN;AAAA,SAQJ;AAAA,MACJ;AACA,MAAA,OAAO,GAAA;AAAA,IACX,CAAA,CAAA;AAAA,IAOA,IAAA;AAAA,IAIA,IAAA;AAAA,IACA,WAAA,EAAa,MAAA;AAAA,IACb,WAAA,EAAa,MAAA;AAAA,IACb,SAAA;AAAA,IACA,SAII,CAAA,EAWF;AACE,MAAA,SAAA,CAAU,IAAA;AAAA,QACN;AAAA,OAWJ;AACA,MAAA,OAAO,GAAA;AAAA,IACX;AAAA,GACJ;AAEA,EAAA,OAAO,GAAA;AACX;AAEO,IAAM,UAAU,OAAsB;AAAA,EACzC,MAAA,EAAQ,CAIJ,IAAA,EACA,IAAA,KACC;AACD,IAAA,OAAO,MAAA,CAAgD,MAAM,IAAI,CAAA;AAAA,EACrE;AACJ,CAAA","file":"index.cjs","sourcesContent":["import { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\n\nexport class CNSStimulationContextStore implements ICNSStimulationContextStore {\n constructor(private readonly ctx: Map<string, unknown> = new Map()) {}\n\n get(key: string): unknown {\n return this.ctx.get(key);\n }\n\n set(key: string, value: unknown): void {\n this.ctx.set(key, value);\n }\n\n getAll(): Record<string, unknown> {\n return Object.fromEntries(this.ctx);\n }\n\n setAll(values: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(values)) {\n this.ctx.set(key, value);\n }\n }\n\n delete(key: string): void {\n this.ctx.delete(key);\n }\n}\n","import { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\n\nexport class CNSNeuronActivationPump<\n TCollateralName extends string,\n TNeuronName extends string\n> {\n private items: TCNSNeuronActivationTask<TCollateralName, TNeuronName>[] =\n [];\n private head = 0;\n private tail = 0;\n private size = 0;\n private capacity = 16;\n protected activeOperations = 0;\n private activeTasks = new Set<\n TCNSNeuronActivationTask<TCollateralName, TNeuronName>\n >();\n\n // NEW: prevent re-entrant pump; defer extra runs\n private pumping = false;\n private needsPump = false;\n\n constructor(\n private readonly processor: (\n neuronActivationTask: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >\n ) => (() => void) | Promise<() => void>,\n protected readonly concurrency?: number,\n protected readonly abortSignal?: AbortSignal,\n initialCapacity?: number\n ) {\n if (initialCapacity && initialCapacity > 0) {\n this.capacity = initialCapacity;\n }\n this.items = new Array(this.capacity);\n }\n\n protected get canStartOperation(): boolean {\n const limit = this.concurrency ?? Infinity;\n return this.activeOperations < limit && !this.abortSignal?.aborted;\n }\n\n private resize(): void {\n const oldCapacity = this.capacity;\n this.capacity = oldCapacity * 2;\n const newItems = new Array(this.capacity);\n\n let oldIndex = this.head;\n for (let i = 0; i < this.size; i++) {\n newItems[i] = this.items[oldIndex];\n oldIndex = (oldIndex + 1) % oldCapacity;\n }\n\n this.items = newItems;\n this.head = 0;\n this.tail = this.size;\n }\n\n private dequeue():\n | TCNSNeuronActivationTask<TCollateralName, TNeuronName>\n | undefined {\n if (this.size === 0) return undefined;\n\n const neuronActivationTask = this.items[this.head];\n this.items[this.head] = undefined as any; // Clear reference\n this.head = (this.head + 1) % this.capacity;\n this.size--;\n\n return neuronActivationTask;\n }\n\n private enqueueItem(\n neuronActivationTask: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >\n ): void {\n if (this.size === this.capacity) {\n this.resize();\n }\n\n this.items[this.tail] = neuronActivationTask;\n this.tail = (this.tail + 1) % this.capacity;\n this.size++;\n }\n\n protected pump() {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.size > 0) {\n const neuronActivationTask = this.dequeue()!;\n this.activeOperations++;\n this.activeTasks.add(neuronActivationTask);\n\n const ret = this.processor(neuronActivationTask);\n\n // Async branch\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<void | (() => void)>).then(\n cb => {\n // finish this item\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n if (typeof cb === 'function') cb();\n\n // schedule another pass (but don't re-enter if already pumping)\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n },\n err => {\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n // resume if there's more work\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n throw err; // let it crash \"honestly\"\n }\n );\n // Do not break: if concurrency allows, start additional items in this pump\n continue;\n }\n\n // Sync branch\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n if (typeof ret === 'function') (ret as () => void)();\n // Loop continues; any items added by ret() stay in the same flat loop\n }\n\n this.pumping = false;\n\n // If async completions or enqueues requested another pass, do exactly one more, non-recursively\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n\n enqueue(\n neuronActivationTask: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >\n ) {\n this.enqueueItem(neuronActivationTask);\n // Start pumping only if not already pumping; avoid re-entrant pump\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n }\n\n get length() {\n return this.size;\n }\n\n getActiveOperationsCount() {\n return this.activeOperations;\n }\n\n public getQueuedTasks(): TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >[] {\n const result: TCNSNeuronActivationTask<TCollateralName, TNeuronName>[] =\n [];\n let index = this.head;\n for (let i = 0; i < this.size; i++) {\n result.push(this.items[index]);\n index = (index + 1) % this.capacity;\n }\n return result;\n }\n\n public getActiveTasks(): TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >[] {\n return Array.from(this.activeTasks);\n }\n}\n","import { CNSStimulationContextStore } from './CNSStimulationContextStore';\nimport { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { CNSNeuronActivationPump } from './CNSNeuronActivationPump';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\nimport { CNS } from './CNS';\nimport { ICNS } from './interfaces/ICNS';\nimport { TCNSNeuronActivationTaskFailure } from './types/TCNSNeuronActivationTaskFailure';\n\nexport class CNSStimulation<\n TCollateralName extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<\n any,\n TNeuronName,\n TCollateralName,\n any,\n any,\n any,\n any\n >,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>,\n TInputPayload,\n TOutputPayload\n> {\n private readonly ctx: ICNSStimulationContextStore;\n private readonly queue: CNSNeuronActivationPump<\n TCollateralName,\n TNeuronName\n >;\n private readonly nueronVisitMap?: Map<TNeuronName, number>;\n private readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;\n private scheduledCount = 0;\n private readonly pendingTasks = new Set<\n TCNSNeuronActivationTask<TCollateralName, TNeuronName>\n >();\n private readonly failedTasks: Array<\n TCNSNeuronActivationTaskFailure<TCollateralName, TNeuronName>\n > = [];\n private completed = new Promise<void>((resolve, reject) => {\n this.resolveCompleted = resolve;\n this.rejectCompleted = reject;\n });\n private resolveCompleted!: () => void;\n private rejectCompleted!: (e: any) => void;\n private isCompleted = false;\n private onResponseError: Error | undefined;\n\n /**\n * Track active SCCs: SCC index -> count of active neurons in that SCC\n */\n private readonly activeSccCounts = new Map<number, number>();\n\n public readonly id: string;\n\n constructor(\n private readonly cns: CNS<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >,\n instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>,\n public readonly options?: TCNSStimulationOptions<\n TCollateralName,\n TInputPayload,\n TOutputPayload,\n TNeuronName\n >\n ) {\n this.ctx = new CNSStimulationContextStore(\n new Map(Object.entries(options?.contextValues ?? {}))\n );\n this.id = options?.stimulationId || Math.random().toString(36).slice(2);\n this.queue = new CNSNeuronActivationPump(\n neuronActivationTask =>\n this.executeActivationTask(neuronActivationTask),\n options?.concurrency,\n options?.abortSignal\n );\n\n this.instanceNeuronQueue = instanceNeuronQueue;\n\n if (this.options?.maxNeuronHops) {\n this.nueronVisitMap = new Map();\n }\n }\n\n private tryResolveCompleted(): void {\n if (this.isCompleted) return;\n const noActive = this.queue.getActiveOperationsCount() === 0;\n const noPending = this.queue.length + this.scheduledCount === 0;\n const aborted = !!this.options?.abortSignal?.aborted;\n\n if ((noPending && noActive) || (aborted && noActive && !noPending)) {\n // When completing due to abort, mark all remaining queued tasks as aborted\n if (aborted) {\n const queuedTasks = this.queue.getQueuedTasks();\n\n for (const task of [...queuedTasks]) {\n const alreadyTracked = this.failedTasks.some(\n ft =>\n ft.task.neuronId === task.neuronId &&\n ft.task.dendriteCollateralName ===\n task.dendriteCollateralName &&\n ft.task.stimulationId === task.stimulationId\n );\n if (!alreadyTracked) {\n this.failedTasks.push({\n task,\n error: new Error(\n 'Task aborted - not started due to abort signal'\n ),\n aborted: true,\n });\n }\n }\n\n this.isCompleted = true;\n this.rejectCompleted(new Error('Stimulation aborted'));\n return;\n }\n\n this.isCompleted = true;\n // If there are failed tasks or onResponse error, reject the promise\n // Otherwise resolve it\n if (this.failedTasks.length > 0 || this.onResponseError) {\n const error =\n this.onResponseError ||\n new Error(\n `Stimulation completed with ${this.failedTasks.length} failed task(s)`\n );\n this.rejectCompleted(error);\n } else {\n this.resolveCompleted();\n }\n }\n }\n\n public waitUntilComplete(): Promise<void> {\n return this.completed;\n }\n\n /**\n * Returns all current activation tasks: queued, active, and pending (scheduled but not yet enqueued)\n */\n public getAllActivationTasks(): TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >[] {\n const queuedTasks = this.queue.getQueuedTasks();\n const activeTasks = this.queue.getActiveTasks();\n const pendingTasks = Array.from(this.pendingTasks);\n return [...queuedTasks, ...activeTasks, ...pendingTasks];\n }\n\n /**\n * Returns all tasks that failed or were aborted\n */\n public getFailedTasks(): Array<\n TCNSNeuronActivationTaskFailure<TCollateralName, TNeuronName>\n > {\n return [...this.failedTasks];\n }\n\n /**\n * Get the context store for this stimulation\n */\n public getContext(): ICNSStimulationContextStore {\n return this.ctx;\n }\n\n /**\n * Enqueue activation tasks directly into the stimulation queue\n */\n public enqueueTasks(\n tasks: TCNSNeuronActivationTask<TCollateralName, TNeuronName>[]\n ): void {\n for (const task of tasks) {\n // Ensure task has correct stimulationId\n const taskWithId: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n > = {\n ...task,\n stimulationId: this.id,\n };\n this.queue.enqueue(taskWithId);\n }\n this.tryResolveCompleted();\n }\n\n protected get concurrencyEnabled(): boolean {\n return (\n this.options?.concurrency !== undefined &&\n this.options?.concurrency > 0\n );\n }\n\n protected get autoCleanupContextsEnabled(): boolean {\n return this.cns?.options?.autoCleanupContexts ?? false;\n }\n\n /**\n * Mark a neuron as active (being processed)\n */\n protected markNeuronActive(neuronId: TNeuronName): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.incrementSccCount(neuronId);\n }\n\n /**\n * Mark a neuron as inactive (finished processing)\n */\n protected markNeuronInactive(neuronId: TNeuronName): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.decrementSccCount(neuronId);\n }\n\n /**\n * Increment the active count for the SCC containing this neuron\n */\n private incrementSccCount(neuronId: TNeuronName): void {\n const sccIndex = this.cns.network.getSccIndexByNeuronName(neuronId);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n this.activeSccCounts.set(sccIndex, currentCount + 1);\n }\n\n /**\n * Decrement the active count for the SCC containing this neuron\n */\n private decrementSccCount(neuronId: TNeuronName): void {\n const sccIndex = this.cns.network.getSccIndexByNeuronName(neuronId);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n const nextCount = Math.max(0, currentCount - 1);\n this.activeSccCounts.set(sccIndex, nextCount);\n\n // Log warning if we're trying to decrement below 0\n if (currentCount === 0) {\n console.warn(\n `[CNSStimulation] Attempting to decrement SCC count below 0 for neuron ${neuronId}`\n );\n }\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again\n */\n protected canNeuronBeGuaranteedDone(neuronId: TNeuronName): boolean {\n if (!this.autoCleanupContextsEnabled) return false;\n return this.cns.network.canNeuronBeGuaranteedDone(\n neuronId,\n this.activeSccCounts\n );\n }\n\n protected cleanupCtxIfNeeded(neuron: TNeuron): void {\n if (\n this.autoCleanupContextsEnabled &&\n this.canNeuronBeGuaranteedDone(neuron.name)\n ) {\n this.ctx.delete(neuron.name);\n }\n }\n\n protected createSubscriberQueueItem(\n subscriber: TCNSSubscriber<TNeuron, TDendrite>,\n inputSignal?: TCNSSignal<TCollateralName, any>\n ) {\n if (this.options?.maxNeuronHops) {\n if (\n this.nueronVisitMap?.get(subscriber.neuron.name) ??\n 0 >= this.options?.maxNeuronHops\n ) {\n throw new Error(\n `Max neuron hops reached for neuron \"${subscriber.neuron.name}\" ` +\n `when trying to enqueue subscriber \"${subscriber.dendrite.collateral.name}\" ` +\n `in stimulation \"${this.id}\"`\n );\n } else {\n this.nueronVisitMap?.set(\n subscriber.neuron.name,\n (this.nueronVisitMap?.get(subscriber.neuron.name) ?? 0) + 1\n );\n }\n }\n\n const neuronActivationTask: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n > = {\n stimulationId: this.id,\n neuronId: subscriber.neuron.name,\n dendriteCollateralName: subscriber.dendrite.collateral.name,\n input: inputSignal,\n };\n return neuronActivationTask;\n }\n\n private executeActivationTask(\n neuronActivationTask: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >\n ) {\n const subscribers = this.cns.network.getSubscribers(\n neuronActivationTask.dendriteCollateralName\n );\n const subscriber = subscribers.find(\n s => s.neuron.name === neuronActivationTask.neuronId\n );\n if (!subscriber) {\n // Task failed: subscriber not found\n this.failedTasks.push({\n task: neuronActivationTask,\n error: new Error(\n `Subscriber not found for neuron \"${neuronActivationTask.neuronId}\" and collateral \"${neuronActivationTask.dendriteCollateralName}\"`\n ),\n aborted: false,\n });\n return () => {};\n }\n\n const neuron = subscriber.neuron;\n const dendrite = subscriber.dendrite as TDendrite;\n\n const inputSignal = neuronActivationTask.input\n ? ({\n collateralName: neuronActivationTask.input.collateralName,\n payload: neuronActivationTask.input.payload,\n } as TCNSSignal<TCollateralName, any>)\n : undefined;\n\n const starter = () => {\n // Mark neuron as active only when we actually start processing (after gate allows it)\n this.markNeuronActive(neuron.name);\n\n let response;\n try {\n response = dendrite.response(\n inputSignal?.payload,\n neuron.axon,\n {\n get: () => this.ctx.get(neuron.name),\n set: (value: any) => this.ctx.set(neuron.name, value),\n delete: () => this.ctx.delete(neuron.name),\n abortSignal: this.options?.abortSignal,\n cns: this.cns as ICNS<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >,\n stimulationId: this.id,\n }\n );\n } catch (error) {\n // Sync error occurred\n this.markNeuronInactive(neuron.name);\n const isAborted = this.options?.abortSignal?.aborted ?? false;\n this.failedTasks.push({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n this.processResponseOrResponses(\n inputSignal as TCNSSignal<TCollateralName, any>,\n undefined,\n error\n );\n return () => {};\n }\n\n const maxDuration = (neuron as any).maxDuration as\n | number\n | undefined;\n\n const asPromise: Promise<\n | TCNSSignal<TCollateralName, any>\n | TCNSSignal<TCollateralName, any>[]\n | undefined\n > =\n response instanceof Promise\n ? response\n : Promise.resolve(response as any);\n\n const timedPromise =\n maxDuration && maxDuration > 0\n ? new Promise<\n | TCNSSignal<TCollateralName, any>\n | TCNSSignal<TCollateralName, any>[]\n | undefined\n >((resolve, reject) => {\n const t = setTimeout(() => {\n const err = new Error(\n `Neuron \"${String(\n neuron.name\n )}\" exceeded maxDuration ${maxDuration}ms`\n );\n reject(err);\n }, maxDuration);\n asPromise.then(\n v => {\n clearTimeout(t);\n resolve(v);\n },\n e => {\n clearTimeout(t);\n reject(e);\n }\n );\n })\n : asPromise;\n\n if (response instanceof Promise || maxDuration) {\n return timedPromise.then(\n signal => {\n return () => {\n // Mark neuron as inactive when async processing completes\n this.markNeuronInactive(neuron.name);\n return this.processResponseOrResponses(\n inputSignal as TCNSSignal<TCollateralName, any>,\n signal as\n | TCNSSignal<TCollateralName, any>\n | TCNSSignal<TCollateralName, any>[]\n | undefined\n );\n };\n },\n error => {\n return () => {\n // Mark neuron as inactive when async processing fails\n this.markNeuronInactive(neuron.name);\n // Track failed task\n const isAborted =\n this.options?.abortSignal?.aborted ?? false;\n this.failedTasks.push({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n return this.processResponseOrResponses(\n inputSignal as TCNSSignal<TCollateralName, any>,\n undefined,\n error\n );\n };\n }\n );\n } else {\n return () => {\n // Mark neuron as inactive when sync processing completes\n this.markNeuronInactive(neuron.name);\n return this.processResponseOrResponses(\n inputSignal as TCNSSignal<TCollateralName, any>,\n response as\n | TCNSSignal<TCollateralName, any>\n | TCNSSignal<TCollateralName, any>[]\n | undefined\n );\n };\n }\n };\n\n // Use CNS-provided per-instance neuron queue for global concurrency gating\n return this.instanceNeuronQueue.run(neuron, starter);\n }\n\n protected processResponseOrResponses(\n inputSignal?: TCNSSignal<TCollateralName, TInputPayload>,\n outputSignalOrSignals?:\n | TCNSSignal<TCollateralName, TOutputPayload>\n | TCNSSignal<TCollateralName, TOutputPayload>[],\n error?: any\n ): void {\n // Handle array of signals\n if (Array.isArray(outputSignalOrSignals)) {\n // If array is empty, still call processResponse once to trigger onResponse\n if (outputSignalOrSignals.length === 0) {\n this.processResponse(inputSignal, undefined, error);\n return;\n }\n\n for (const signal of outputSignalOrSignals) {\n this.processResponse(inputSignal, signal, error);\n }\n return;\n }\n\n // Handle single signal\n this.processResponse(inputSignal, outputSignalOrSignals, error);\n }\n\n protected processResponse(\n inputSignal?: TCNSSignal<TCollateralName, TInputPayload>,\n outputSignal?: TCNSSignal<TCollateralName, TOutputPayload>,\n error?: any\n ): void {\n const collateralName = outputSignal?.collateralName as\n | TCollateralName\n | undefined;\n const ownerNeuron = collateralName\n ? this.cns.network.getParentNeuronByCollateralName(collateralName)\n : undefined;\n const subscribers = collateralName\n ? this.cns.network.getSubscribers(collateralName)\n : [];\n const subscriberActivationTasks: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >[] = [];\n\n if (collateralName && !error) {\n if (ownerNeuron) {\n this.cleanupCtxIfNeeded(ownerNeuron);\n }\n\n for (let i = 0; i < subscribers.length; i++) {\n const task = this.createSubscriberQueueItem(\n subscribers[i],\n outputSignal\n );\n subscriberActivationTasks.push(task);\n this.pendingTasks.add(task);\n }\n }\n this.scheduledCount += subscriberActivationTasks.length;\n\n // After we pre-enqueued all subscribers, we can trace the response\n let maybePromise: void | Promise<void>;\n try {\n maybePromise = this.options?.onResponse?.({\n inputSignal: inputSignal,\n outputSignal: outputSignal,\n contextValue: this.ctx.getAll(),\n queueLength: this.queue.length + this.scheduledCount,\n stimulation: this,\n stimulationId: this.id,\n\n hops:\n this.options?.maxNeuronHops && ownerNeuron\n ? this.nueronVisitMap?.get(ownerNeuron.name) ?? 0\n : undefined,\n error,\n });\n } catch (e) {\n // Remember the error but don't reject immediately - wait for all tasks to complete\n this.onResponseError =\n e instanceof Error ? e : new Error(String(e));\n // Still enqueue subscribers and continue processing\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks.delete(subscriberActivationTasks[i]);\n this.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n return;\n }\n\n // If onResponse returned a promise, wait for it before enqueuing subscribers\n if (maybePromise && typeof maybePromise.then === 'function') {\n (maybePromise as Promise<void>).then(\n () => {\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks.delete(subscriberActivationTasks[i]);\n this.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n },\n error => {\n // Remember the error but don't reject immediately - wait for all tasks to complete\n this.onResponseError =\n error instanceof Error\n ? error\n : new Error(String(error));\n // Still enqueue subscribers and continue processing\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks.delete(subscriberActivationTasks[i]);\n this.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n }\n );\n return;\n }\n\n // Sync path: enqueue subscribers immediately\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks.delete(subscriberActivationTasks[i]);\n this.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n }\n\n public responseToSignal(\n signalOrSignals:\n | TCNSSignal<TCollateralName, TOutputPayload>\n | TCNSSignal<TCollateralName, TOutputPayload>[]\n ): void {\n // Handle array of signals\n if (Array.isArray(signalOrSignals)) {\n for (const signal of signalOrSignals) {\n const ownerNeuron =\n this.cns.network.getParentNeuronByCollateralName(\n signal.collateralName\n );\n if (ownerNeuron) {\n this.markNeuronActive(ownerNeuron.name);\n }\n }\n // For initial stimulation: signals are outputs (to find subscribers)\n // In onResponse, inputSignal will be undefined for initial stimulation\n this.processResponseOrResponses(undefined, signalOrSignals);\n return;\n }\n\n // Handle single signal\n const ownerNeuron = this.cns.network.getParentNeuronByCollateralName(\n signalOrSignals.collateralName\n );\n if (ownerNeuron) {\n this.markNeuronActive(ownerNeuron.name);\n }\n\n // For initial stimulation: signal is the output (to find subscribers)\n // In onResponse, inputSignal will be undefined for initial stimulation\n this.processResponse(undefined, signalOrSignals);\n this.tryResolveCompleted();\n }\n}\n","export class CNSInstanceNeuronQueue<\n TNeuron extends { name: string; concurrency?: number }\n> {\n private readonly gates = new Map<\n string,\n { limit: number; active: number; waiters: (() => void)[] }\n >();\n\n run(\n neuron: TNeuron,\n fn: () => (() => void) | Promise<() => void>\n ): (() => void) | Promise<() => void> {\n const limit = neuron?.concurrency;\n if (limit === undefined || limit <= 0) {\n return fn();\n }\n\n let gate = this.gates.get(neuron.name);\n if (!gate) {\n gate = { limit, active: 0, waiters: [] };\n this.gates.set(neuron.name, gate);\n } else {\n gate.limit = limit;\n }\n\n const wrap = (cb: () => void) => {\n return () => {\n try {\n cb();\n } finally {\n const g = this.gates.get(neuron.name)!;\n g.active = Math.max(0, g.active - 1);\n if (g.waiters.length > 0) {\n const next = g.waiters.shift()!;\n next();\n }\n }\n };\n };\n\n if (gate.active < gate.limit) {\n gate.active++;\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n return (ret as Promise<() => void>).then(cb => wrap(cb));\n }\n return wrap(ret as () => void);\n }\n\n return new Promise<() => void>(resolve => {\n const starter = () => {\n const g = this.gates.get(neuron.name)!;\n g.active++;\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<() => void>).then(cb => resolve(wrap(cb)));\n } else {\n resolve(wrap(ret as () => void));\n }\n };\n gate!.waiters.push(starter);\n });\n }\n}\n","import { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { CNSCollateral } from './CNSCollateral';\n\nexport class CNSNetwork<\n TCollateralName extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<any, TNeuronName, any, any, any, any, any>,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> {\n /**\n * Strongly Connected Components of the neuron graph.\n * Each component is a set of neuron IDs that can reach each other.\n */\n public stronglyConnectedComponents: Set<string>[] = [];\n\n /**\n * Quick lookup: neuron ID -> SCC index for fast reachability checks.\n */\n private neuronToSCC = new Map<string, number>();\n\n /**\n * DAG of SCCs: SCC index -> set of SCC indices that can reach this SCC\n */\n private sccDag: Map<number, Set<number>> = new Map();\n\n /**\n * Precomputed ancestor sets for each SCC for fast reachability checks\n */\n private sccAncestors: Map<number, Set<number>> = new Map();\n\n /**\n * Fast lookup: collateralName -> list of (neuron, dendrite) subscribers.\n * Built once at construction time.\n */\n private subIndex = new Map<\n TCollateralName,\n TCNSSubscriber<TNeuron, TDendrite>[]\n >();\n\n private neuronIndex = new Map<TNeuronName, TNeuron>();\n private dendriteIndex = new Map<TCollateralName, TDendrite>();\n private collateralIndex = new Map<\n TCollateralName,\n CNSCollateral<TCollateralName, unknown>\n >();\n\n private parentNeuronByCollateralName = new Map<TCollateralName, TNeuron>();\n\n constructor(private readonly neurons: TNeuron[]) {\n this.validateUniqueIdentifiers();\n this.buildIndexes();\n this.buildSCC();\n }\n\n /**\n * Validate uniqueness constraints:\n * - neuron names are unique and non-empty\n * - axon collateral types are globally unique (single owner)\n * - the same collateral instance cannot be owned by multiple neurons\n * Throws aggregated error if violations are found.\n */\n private validateUniqueIdentifiers(): void {\n const errors: string[] = [];\n const seenNeuronNames = new Set<string>();\n\n for (const neuron of this.neurons) {\n const name = (neuron?.name as unknown as string) ?? '';\n if (!name || typeof name !== 'string' || name.trim().length === 0) {\n errors.push(`Neuron has empty or invalid name: \"${name}\"`);\n } else if (seenNeuronNames.has(name)) {\n errors.push(`Duplicate neuron name: \"${name}\"`);\n } else {\n seenNeuronNames.add(name);\n }\n }\n\n if (errors.length > 0) {\n throw new Error(\n `[CNS] Topology uniqueness validation failed:\\n - ` +\n errors.join(`\\n - `)\n );\n }\n }\n\n /**\n * Build the neuron graph where neurons are connected if one can stimulate the other.\n */\n private buildNeuronGraph(): Map<string, Set<string>> {\n const graph = new Map<string, Set<string>>();\n const neuronIds = this.neurons.map(n => n.name);\n\n // Initialize graph\n for (const neuronId of neuronIds) {\n graph.set(neuronId, new Set());\n }\n\n // Build edges: neuron -> neurons it can reach via its axons\n for (const neuron of this.neurons) {\n const reachableNeurons = new Set<string>();\n\n // Check what collaterals this neuron can emit\n for (const axonKey in neuron.axon) {\n const collateral = neuron.axon[axonKey];\n const collateralName = collateral.name as TCollateralName;\n\n // Find which neurons listen to this collateral\n const subscribers = this.subIndex.get(collateralName);\n if (subscribers) {\n for (const { neuron: targetNeuron } of subscribers) {\n reachableNeurons.add(targetNeuron.name);\n }\n }\n }\n\n graph.set(neuron.name, reachableNeurons);\n }\n\n return graph;\n }\n\n /**\n * Build strongly connected components using Tarjan's algorithm.\n */\n private buildSCC(): void {\n const graph = this.buildNeuronGraph();\n const neuronIds = this.neurons.map(n => n.name);\n\n // Tarjan's algorithm for SCC\n const index = new Map<string, number>();\n const lowlink = new Map<string, number>();\n const onStack = new Set<string>();\n const stack: string[] = [];\n const components: Set<string>[] = [];\n let currentIndex = 0;\n\n const strongConnect = (neuronId: string) => {\n index.set(neuronId, currentIndex);\n lowlink.set(neuronId, currentIndex);\n currentIndex++;\n stack.push(neuronId);\n onStack.add(neuronId);\n\n const neighbors = graph.get(neuronId) || new Set();\n for (const neighbor of Array.from(neighbors)) {\n if (!index.has(neighbor)) {\n strongConnect(neighbor);\n lowlink.set(\n neuronId,\n Math.min(lowlink.get(neuronId)!, lowlink.get(neighbor)!)\n );\n } else if (onStack.has(neighbor)) {\n lowlink.set(\n neuronId,\n Math.min(lowlink.get(neuronId)!, index.get(neighbor)!)\n );\n }\n }\n\n if (lowlink.get(neuronId) === index.get(neuronId)) {\n const component = new Set<string>();\n let w: string;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n component.add(w);\n } while (w !== neuronId);\n components.push(component);\n }\n };\n\n // Run Tarjan's algorithm on all unvisited neurons\n for (const neuronId of neuronIds) {\n if (!index.has(neuronId)) {\n strongConnect(neuronId);\n }\n }\n\n this.stronglyConnectedComponents = components;\n\n // Build quick lookup map for reachability checks\n for (let i = 0; i < components.length; i++) {\n for (const neuronId of Array.from(components[i])) {\n this.neuronToSCC.set(neuronId, i);\n }\n }\n\n // Build DAG between SCCs\n this.buildSCCDAG(graph);\n\n // Precompute ancestor sets for fast reachability checks\n this.buildSCCAncestors();\n }\n\n /**\n * Build DAG between SCCs based on the original neuron graph\n */\n private buildSCCDAG(neuronGraph: Map<string, Set<string>>): void {\n this.sccDag.clear();\n\n // Initialize DAG\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n this.sccDag.set(i, new Set());\n }\n\n // Build edges between SCCs\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const scc = this.stronglyConnectedComponents[i];\n\n for (const neuronId of Array.from(scc)) {\n const neighbors = neuronGraph.get(neuronId) || new Set();\n\n for (const neighborId of Array.from(neighbors)) {\n const neighborSccIndex = this.neuronToSCC.get(neighborId);\n if (\n neighborSccIndex !== undefined &&\n neighborSccIndex !== i\n ) {\n // Add edge: neighborSccIndex -> i (neighbor can reach this SCC)\n this.sccDag.get(neighborSccIndex)!.add(i);\n }\n }\n }\n }\n }\n\n /**\n * Precompute ancestor sets for each SCC for fast reachability checks\n * Uses topological sort for efficient computation\n */\n private buildSCCAncestors(): void {\n this.sccAncestors.clear();\n\n // Initialize ancestor sets\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n this.sccAncestors.set(i, new Set());\n }\n\n // Topological sort to compute ancestors efficiently\n const inDegree = new Map<number, number>();\n const queue: number[] = [];\n\n // Calculate in-degrees\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const incomingEdges = this.sccDag.get(i) || new Set();\n inDegree.set(i, incomingEdges.size);\n\n if (incomingEdges.size === 0) {\n queue.push(i);\n }\n }\n\n // Process nodes in topological order\n while (queue.length > 0) {\n const current = queue.shift()!;\n const outgoingEdges = this.getOutgoingEdges(current);\n\n for (const neighbor of Array.from(outgoingEdges)) {\n // Add current as ancestor of neighbor\n const neighborAncestors = this.sccAncestors.get(neighbor)!;\n neighborAncestors.add(current);\n\n // Add all ancestors of current to neighbor\n const currentAncestors = this.sccAncestors.get(current)!;\n for (const ancestor of Array.from(currentAncestors)) {\n neighborAncestors.add(ancestor);\n }\n\n // Decrease in-degree\n const newInDegree = (inDegree.get(neighbor) || 0) - 1;\n inDegree.set(neighbor, newInDegree);\n\n if (newInDegree === 0) {\n queue.push(neighbor);\n }\n }\n }\n }\n\n /**\n * Get outgoing edges for a given SCC index\n */\n private getOutgoingEdges(sccIndex: number): Set<number> {\n const outgoing = new Set<number>();\n\n // Find all SCCs that have this SCC as an incoming edge\n for (const [targetScc, incomingEdges] of Array.from(this.sccDag)) {\n if (incomingEdges.has(sccIndex)) {\n outgoing.add(targetScc);\n }\n }\n\n return outgoing;\n }\n\n /**\n * Check if a neuron can be reached again (including self-calling).\n * Returns true if the neuron is in a strongly connected component with more than one member,\n * or if it's in a single-member SCC that can reach itself.\n */\n public getSCCSetByNeuronName(neuronName: string) {\n const sccIndex = this.neuronToSCC.get(neuronName);\n\n if (sccIndex === undefined) return;\n\n return this.stronglyConnectedComponents[sccIndex];\n }\n\n /**\n * Get the SCC index for a given neuron ID\n */\n public getSccIndexByNeuronName(neuronName: string): number | undefined {\n return this.neuronToSCC.get(neuronName);\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again during the current propagation.\n * This is the core logic for safe context cleanup.\n */\n public canNeuronBeGuaranteedDone(\n neuronName: string,\n activeSccCounts: Map<number, number>\n ): boolean {\n const sccIndex = this.neuronToSCC.get(neuronName);\n if (sccIndex === undefined) return true; // Neuron not in graph\n\n // Check if this SCC is still active\n if (\n activeSccCounts.get(sccIndex) &&\n activeSccCounts.get(sccIndex)! > 0\n ) {\n return false; // SCC is still active\n }\n\n // Check if any active SCC can reach this SCC\n const ancestors = this.sccAncestors.get(sccIndex);\n if (!ancestors) return true;\n\n for (const ancestorSccIndex of Array.from(ancestors)) {\n if (\n activeSccCounts.get(ancestorSccIndex) &&\n activeSccCounts.get(ancestorSccIndex)! > 0\n ) {\n return false; // An active ancestor can still reach this SCC\n }\n }\n\n return true; // Neuron is guaranteed to be done\n }\n\n private buildIndexes() {\n this.subIndex.clear();\n this.parentNeuronByCollateralName.clear();\n for (const neuron of this.neurons) {\n this.neuronIndex.set(neuron.name, neuron);\n for (const dendrite of neuron.dendrites) {\n const key = dendrite.collateral.name as TCollateralName;\n const arr = this.subIndex.get(key) ?? [];\n arr.push({ neuron, dendrite: dendrite as TDendrite });\n this.subIndex.set(\n key,\n arr as TCNSSubscriber<TNeuron, TDendrite>[]\n );\n this.dendriteIndex.set(key, dendrite as TDendrite);\n }\n Object.values(neuron.axon).forEach(collateral => {\n this.parentNeuronByCollateralName.set(\n (collateral as CNSCollateral<TCollateralName, unknown>)\n .name,\n neuron\n );\n this.collateralIndex.set(\n (collateral as CNSCollateral<TCollateralName, unknown>)\n .name,\n collateral as CNSCollateral<TCollateralName, unknown>\n );\n });\n }\n }\n\n public getParentNeuronByCollateralName(collateralName: TCollateralName) {\n return this.parentNeuronByCollateralName.get(collateralName);\n }\n\n public getDendrites() {\n return Array.from(this.dendriteIndex.values());\n }\n\n public getCollaterals() {\n return Array.from(this.collateralIndex.values());\n }\n\n public getNeurons() {\n return Array.from(this.neuronIndex.values());\n }\n\n public getCollateralByName<TName extends string = string>(\n collateralName: TName\n ) {\n return this.collateralIndex.get(\n collateralName as unknown as TCollateralName\n ) as unknown as CNSCollateral<TName, unknown> | undefined;\n }\n\n public getNeuronByName<TName extends string = string>(neuronName: TName) {\n return this.neuronIndex.get(neuronName as unknown as TNeuronName);\n }\n\n public getSubscribers(\n collateralName: TCollateralName\n ): TCNSSubscriber<TNeuron, TDendrite>[] {\n return this.subIndex.get(collateralName) ?? [];\n }\n}\n","import { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { TCNSOptions } from './types/TCNSOptions';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { CNSStimulation } from './CNSStimulation';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSStimulationResponse } from './types/TCNSStimulationResponse';\nimport { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\nimport { CNSNetwork } from './CNSNetwork';\nimport { ICNS } from './interfaces/ICNS';\n\nexport class CNS<\n TCollateralName extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<any, TNeuronName, any, any, any, any, any>,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> implements\n Omit<\n ICNS<TCollateralName, TNeuronName, TNeuron, TDendrite>,\n 'stimulate'\n >\n{\n /**\n * Network graph analysis and strongly connected components.\n */\n public readonly network: CNSNetwork<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >;\n\n /**\n * Global per-neuron concurrency gates shared across all stimulations.\n */\n private readonly neuronGates = new Map<\n TNeuronName,\n { limit: number; active: number; waiters: (() => void)[] }\n >();\n\n /**\n * Global task queue used by stimulation to schedule per-neuron gated work.\n * Does not replace per-stimulation concurrency; only coordinates global per-neuron limits.\n */\n protected readonly instanceNeuronQueue =\n new CNSInstanceNeuronQueue<TNeuron>();\n\n /**\n * Global response listeners applied to every stimulation.\n */\n private readonly globalResponseListeners: Array<\n (r: any) => void | Promise<void>\n > = [];\n\n constructor(\n protected readonly neurons: TNeuron[],\n public readonly options?: TCNSOptions\n ) {\n this.network = new CNSNetwork(this.neurons);\n }\n\n public addResponseListener<TInputPayload, TOutputPayload>(\n listener: (\n response: TCNSStimulationResponse<\n TCollateralName,\n TInputPayload,\n TOutputPayload,\n TNeuronName\n >\n ) => void | Promise<void>\n ): () => void {\n this.globalResponseListeners.push(listener);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const idx = this.globalResponseListeners.indexOf(listener);\n if (idx >= 0) this.globalResponseListeners.splice(idx, 1);\n };\n }\n\n private wrapOnResponse<T>(\n local?: (response: T) => void | Promise<void>\n ): (response: T) => void | Promise<void> {\n if (this.globalResponseListeners.length === 0 && !local) {\n // No-op fast path\n return () => {};\n }\n return (r: T) => {\n let anyPromise = false;\n const promises: Promise<void>[] = [];\n\n if (local) {\n try {\n const res = local(r);\n if (res && typeof (res as any).then === 'function') {\n anyPromise = true;\n promises.push(res as Promise<void>);\n }\n } catch (error) {\n // Sync error from local - wrap in rejected promise\n anyPromise = true;\n promises.push(Promise.reject(error));\n }\n }\n\n for (let i = 0; i < this.globalResponseListeners.length; i++) {\n try {\n const res = this.globalResponseListeners[i](r);\n if (res && typeof (res as any).then === 'function') {\n anyPromise = true;\n promises.push(res as Promise<void>);\n }\n } catch (error) {\n // Sync error from global listener - wrap in rejected promise\n anyPromise = true;\n promises.push(Promise.reject(error));\n }\n }\n\n if (anyPromise) {\n return Promise.allSettled(promises).then(results => {\n const rejected = results.find(\n r => r.status === 'rejected'\n ) as PromiseRejectedResult | undefined;\n if (rejected) throw rejected.reason;\n });\n }\n };\n }\n\n public stimulate<\n TInputPayload extends TOutputPayload,\n TOutputPayload = TInputPayload\n >(\n signalOrSignals:\n | TCNSSignal<TCollateralName, TInputPayload>\n | TCNSSignal<TCollateralName, TInputPayload>[],\n options?: TCNSStimulationOptions<\n TCollateralName,\n TInputPayload,\n TOutputPayload,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ): CNSStimulation<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite,\n TInputPayload,\n TOutputPayload\n > {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite,\n TInputPayload,\n TOutputPayload\n >(this, this.instanceNeuronQueue, {\n ...options,\n onResponse: wrapped,\n });\n stimulation.responseToSignal(signalOrSignals);\n return stimulation;\n }\n\n /**\n * Start a stimulation with activation tasks directly\n */\n public activate<TInputPayload, TOutputPayload>(\n tasks: TCNSNeuronActivationTask<TCollateralName, TNeuronName>[],\n options?: TCNSStimulationOptions<\n TCollateralName,\n TInputPayload,\n TOutputPayload,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ): CNSStimulation<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite,\n TInputPayload,\n TOutputPayload\n > {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite,\n TInputPayload,\n TOutputPayload\n >(this, this.instanceNeuronQueue, {\n ...options,\n onResponse: wrapped,\n });\n stimulation.enqueueTasks(tasks);\n return stimulation;\n }\n}\n","import { TCNSSignal } from './types/TCNSSignal';\nimport { ICNSCollateral } from './interfaces/ICNSCollateral';\n\nexport class CNSCollateral<TName extends string, TPayload>\n implements ICNSCollateral<TName, TPayload>\n{\n constructor(public readonly name: TName) {}\n\n createSignal(): TCNSSignal<TName, TPayload>;\n createSignal(payload: TPayload): TCNSSignal<TName, TPayload>;\n createSignal(payload?: TPayload): TCNSSignal<TName, TPayload> {\n return { collateralName: this.name, payload };\n }\n}\n","import { CNSCollateral } from '../CNSCollateral';\nimport { TCNSAxon } from '../types/TCNSAxon';\nimport { TCNSDendrite } from '../types/TCNSDendrite';\n\nexport const collateral = <TPayload = undefined, TName extends string = string>(\n name: TName\n) => new CNSCollateral<TName, TPayload>(name);\n\n// Helper types to extract collateral Name/Payload for a given key from a heterogenous axon-like object\ntype PayloadOf<TAxon, K extends keyof TAxon> = TAxon[K] extends CNSCollateral<\n any,\n infer P\n>\n ? P\n : never;\ntype NameOf<TAxon, K extends keyof TAxon> = TAxon[K] extends CNSCollateral<\n infer N,\n any\n>\n ? N\n : never;\n\ntype InterNeuronAPI<\n TContextValue,\n TNameType extends string,\n TReceiverCollateralName extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >\n> = {\n name: TNameType;\n axon: TAxonType;\n concurrency?: number;\n maxDuration?: number;\n dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >[];\n setConcurrency: (\n n: number | undefined\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n setMaxDuration: (\n ms: number | undefined\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n bind: <TFollowAxon extends Record<string, CNSCollateral<any, any>>>(\n axon: TFollowAxon,\n dendrites: {\n [K in keyof TFollowAxon]:\n | TCNSDendrite<\n TContextValue,\n NameOf<TFollowAxon, K> & string,\n PayloadOf<TFollowAxon, K>,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n | TCNSDendrite<\n TContextValue,\n NameOf<TFollowAxon, K> & string,\n PayloadOf<TFollowAxon, K>,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >['response'];\n }\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n dendrite: <\n TSenderExactCollateralName extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralName,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n};\n\n// Concrete builder\nexport const neuron = <\n TContextValue,\n TNameType extends string,\n TProvidedAxon extends Record<string, CNSCollateral<any, any>>,\n TReceiverCollateralName extends keyof TProvidedAxon &\n string = keyof TProvidedAxon & string,\n TReceiverAxonCollateralPayload = TProvidedAxon[keyof TProvidedAxon] extends CNSCollateral<\n any,\n infer P\n >\n ? P\n : never\n>(\n name: TNameType,\n axon: TProvidedAxon\n): InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n> => {\n const dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n >[] = [];\n\n const api: InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n > = {\n setConcurrency: (n: number | undefined) => {\n api.concurrency = n;\n return api;\n },\n setMaxDuration: (ms: number | undefined) => {\n api.maxDuration = ms;\n return api;\n },\n bind: ((axon, newDendrites) => {\n for (const key in newDendrites) {\n const value = newDendrites[key] as any;\n const dendrite =\n typeof value === 'function'\n ? {\n collateral: (axon as any)[key],\n response: value,\n }\n : value;\n dendrites.push(\n dendrite as TCNSDendrite<\n TContextValue,\n string,\n unknown,\n any,\n any,\n any\n >\n );\n }\n return api;\n }) as InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n >['bind'],\n axon: axon as unknown as TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >,\n name,\n concurrency: undefined,\n maxDuration: undefined,\n dendrites,\n dendrite<\n TSenderExactCollateralName extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralName,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >\n >\n ) {\n dendrites.push(\n s as TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >\n >\n );\n return api; // keep full API for chaining\n },\n };\n\n return api;\n};\n\nexport const withCtx = <TContextValue>() => ({\n neuron: <\n TNameType extends string,\n TProvidedAxon extends Record<string, CNSCollateral<any, any>>\n >(\n name: TNameType,\n axon: TProvidedAxon\n ) => {\n return neuron<TContextValue, TNameType, TProvidedAxon>(name, axon);\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/CNSStimulationContextStore.ts","../src/CNSNeuronActivationPump.ts","../src/CNSStimulation.ts","../src/CNSInstanceNeuronQueue.ts","../src/CNSNetwork.ts","../src/CNS.ts","../src/CNSCollateral.ts","../src/factory/index.ts"],"names":["neuron","error","ownerNeuron","collateral","r","axon"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\n\nexport class CNSStimulationContextStore implements ICNSStimulationContextStore {\n constructor(private readonly ctx: Map<string, unknown> = new Map()) {}\n\n get(key: string): unknown {\n return this.ctx.get(key);\n }\n\n set(key: string, value: unknown): void {\n this.ctx.set(key, value);\n }\n\n getAll(): Record<string, unknown> {\n return Object.fromEntries(this.ctx);\n }\n\n setAll(values: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(values)) {\n this.ctx.set(key, value);\n }\n }\n\n delete(key: string): void {\n this.ctx.delete(key);\n }\n}\n","import { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\n\nexport class CNSNeuronActivationPump<\n TCollateralName extends string,\n TNeuronName extends string\n> {\n private items: TCNSNeuronActivationTask<TCollateralName, TNeuronName>[] =\n [];\n private head = 0;\n private tail = 0;\n private size = 0;\n private capacity = 16;\n protected activeOperations = 0;\n private activeTasks = new Set<\n TCNSNeuronActivationTask<TCollateralName, TNeuronName>\n >();\n\n // NEW: prevent re-entrant pump; defer extra runs\n private pumping = false;\n private needsPump = false;\n\n constructor(\n private readonly processor: (\n neuronActivationTask: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >\n ) => (() => void) | Promise<() => void>,\n protected readonly concurrency?: number,\n protected readonly abortSignal?: AbortSignal,\n initialCapacity?: number\n ) {\n if (initialCapacity && initialCapacity > 0) {\n this.capacity = initialCapacity;\n }\n this.items = new Array(this.capacity);\n }\n\n protected get canStartOperation(): boolean {\n const limit = this.concurrency ?? Infinity;\n return this.activeOperations < limit && !this.abortSignal?.aborted;\n }\n\n private resize(): void {\n const oldCapacity = this.capacity;\n this.capacity = oldCapacity * 2;\n const newItems = new Array(this.capacity);\n\n let oldIndex = this.head;\n for (let i = 0; i < this.size; i++) {\n newItems[i] = this.items[oldIndex];\n oldIndex = (oldIndex + 1) % oldCapacity;\n }\n\n this.items = newItems;\n this.head = 0;\n this.tail = this.size;\n }\n\n private dequeue():\n | TCNSNeuronActivationTask<TCollateralName, TNeuronName>\n | undefined {\n if (this.size === 0) return undefined;\n\n const neuronActivationTask = this.items[this.head];\n this.items[this.head] = undefined as any; // Clear reference\n this.head = (this.head + 1) % this.capacity;\n this.size--;\n\n return neuronActivationTask;\n }\n\n private enqueueItem(\n neuronActivationTask: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >\n ): void {\n if (this.size === this.capacity) {\n this.resize();\n }\n\n this.items[this.tail] = neuronActivationTask;\n this.tail = (this.tail + 1) % this.capacity;\n this.size++;\n }\n\n protected pump() {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.size > 0) {\n const neuronActivationTask = this.dequeue()!;\n this.activeOperations++;\n this.activeTasks.add(neuronActivationTask);\n\n const ret = this.processor(neuronActivationTask);\n\n // Async branch\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<void | (() => void)>).then(\n cb => {\n // finish this item\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n if (typeof cb === 'function') cb();\n\n // schedule another pass (but don't re-enter if already pumping)\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n },\n err => {\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n // resume if there's more work\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n throw err; // let it crash \"honestly\"\n }\n );\n // Do not break: if concurrency allows, start additional items in this pump\n continue;\n }\n\n // Sync branch\n this.activeOperations--;\n this.activeTasks.delete(neuronActivationTask);\n if (typeof ret === 'function') (ret as () => void)();\n // Loop continues; any items added by ret() stay in the same flat loop\n }\n\n this.pumping = false;\n\n // If async completions or enqueues requested another pass, do exactly one more, non-recursively\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n\n enqueue(\n neuronActivationTask: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >\n ) {\n this.enqueueItem(neuronActivationTask);\n // Start pumping only if not already pumping; avoid re-entrant pump\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n }\n\n get length() {\n return this.size;\n }\n\n getActiveOperationsCount() {\n return this.activeOperations;\n }\n\n public getQueuedTasks(): TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >[] {\n const result: TCNSNeuronActivationTask<TCollateralName, TNeuronName>[] =\n [];\n let index = this.head;\n for (let i = 0; i < this.size; i++) {\n result.push(this.items[index]);\n index = (index + 1) % this.capacity;\n }\n return result;\n }\n\n public getActiveTasks(): TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >[] {\n return Array.from(this.activeTasks);\n }\n}\n","import { CNSStimulationContextStore } from './CNSStimulationContextStore';\nimport { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { CNSNeuronActivationPump } from './CNSNeuronActivationPump';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\nimport { CNS } from './CNS';\nimport { ICNS } from './interfaces/ICNS';\nimport { TCNSNeuronActivationTaskFailure } from './types/TCNSNeuronActivationTaskFailure';\n\nexport class CNSStimulation<\n TCollateralName extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<\n any,\n TNeuronName,\n TCollateralName,\n any,\n any,\n any,\n any\n >,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>,\n TInputPayload,\n TOutputPayload\n> {\n private readonly ctx: ICNSStimulationContextStore;\n private readonly queue: CNSNeuronActivationPump<\n TCollateralName,\n TNeuronName\n >;\n private readonly nueronVisitMap?: Map<TNeuronName, number>;\n private readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;\n private scheduledCount = 0;\n private readonly pendingTasks = new Set<\n TCNSNeuronActivationTask<TCollateralName, TNeuronName>\n >();\n private readonly failedTasks: Array<\n TCNSNeuronActivationTaskFailure<TCollateralName, TNeuronName>\n > = [];\n private completed = new Promise<void>((resolve, reject) => {\n this.resolveCompleted = resolve;\n this.rejectCompleted = reject;\n });\n private resolveCompleted!: () => void;\n private rejectCompleted!: (e: any) => void;\n private isCompleted = false;\n private onResponseError: Error | undefined;\n\n /**\n * Track active SCCs: SCC index -> count of active neurons in that SCC\n */\n private readonly activeSccCounts = new Map<number, number>();\n\n public readonly id: string;\n\n constructor(\n private readonly cns: CNS<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >,\n instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>,\n public readonly options?: TCNSStimulationOptions<\n TCollateralName,\n TInputPayload,\n TOutputPayload,\n TNeuronName\n >\n ) {\n this.ctx =\n options?.ctx ??\n new CNSStimulationContextStore(\n new Map(Object.entries(options?.contextValues ?? {}))\n );\n this.id = options?.stimulationId || Math.random().toString(36).slice(2);\n this.queue = new CNSNeuronActivationPump(\n neuronActivationTask =>\n this.executeActivationTask(neuronActivationTask),\n options?.concurrency,\n options?.abortSignal\n );\n\n this.instanceNeuronQueue = instanceNeuronQueue;\n\n if (this.options?.maxNeuronHops) {\n this.nueronVisitMap = new Map();\n }\n }\n\n private tryResolveCompleted(): void {\n if (this.isCompleted) return;\n const noActive = this.queue.getActiveOperationsCount() === 0;\n const noPending = this.queue.length + this.scheduledCount === 0;\n const aborted = !!this.options?.abortSignal?.aborted;\n\n if ((noPending && noActive) || (aborted && noActive && !noPending)) {\n // When completing due to abort, mark all remaining queued tasks as aborted\n if (aborted) {\n const queuedTasks = this.queue.getQueuedTasks();\n\n for (const task of [...queuedTasks]) {\n const alreadyTracked = this.failedTasks.some(\n ft =>\n ft.task.neuronId === task.neuronId &&\n ft.task.dendriteCollateralName ===\n task.dendriteCollateralName &&\n ft.task.stimulationId === task.stimulationId\n );\n if (!alreadyTracked) {\n this.failedTasks.push({\n task,\n error: new Error(\n 'Task aborted - not started due to abort signal'\n ),\n aborted: true,\n });\n }\n }\n\n this.isCompleted = true;\n this.rejectCompleted(new Error('Stimulation aborted'));\n return;\n }\n\n this.isCompleted = true;\n // If there are failed tasks or onResponse error, reject the promise\n // Otherwise resolve it\n if (this.failedTasks.length > 0 || this.onResponseError) {\n const error =\n this.onResponseError ||\n new Error(\n `Stimulation completed with ${this.failedTasks.length} failed task(s)`\n );\n this.rejectCompleted(error);\n } else {\n this.resolveCompleted();\n }\n }\n }\n\n public waitUntilComplete(): Promise<void> {\n return this.completed;\n }\n\n /**\n * Returns all current activation tasks: queued, active, and pending (scheduled but not yet enqueued)\n */\n public getAllActivationTasks(): TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >[] {\n const queuedTasks = this.queue.getQueuedTasks();\n const activeTasks = this.queue.getActiveTasks();\n const pendingTasks = Array.from(this.pendingTasks);\n return [...queuedTasks, ...activeTasks, ...pendingTasks];\n }\n\n /**\n * Returns all tasks that failed or were aborted\n */\n public getFailedTasks(): Array<\n TCNSNeuronActivationTaskFailure<TCollateralName, TNeuronName>\n > {\n return [...this.failedTasks];\n }\n\n /**\n * Get the context store for this stimulation\n */\n public getContext(): ICNSStimulationContextStore {\n return this.ctx;\n }\n\n /**\n * Enqueue activation tasks directly into the stimulation queue\n */\n public enqueueTasks(\n tasks: TCNSNeuronActivationTask<TCollateralName, TNeuronName>[]\n ): void {\n for (const task of tasks) {\n // Ensure task has correct stimulationId\n const taskWithId: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n > = {\n ...task,\n stimulationId: this.id,\n };\n this.queue.enqueue(taskWithId);\n }\n this.tryResolveCompleted();\n }\n\n protected get concurrencyEnabled(): boolean {\n return (\n this.options?.concurrency !== undefined &&\n this.options?.concurrency > 0\n );\n }\n\n protected get autoCleanupContextsEnabled(): boolean {\n return this.cns?.options?.autoCleanupContexts ?? false;\n }\n\n /**\n * Mark a neuron as active (being processed)\n */\n protected markNeuronActive(neuronId: TNeuronName): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.incrementSccCount(neuronId);\n }\n\n /**\n * Mark a neuron as inactive (finished processing)\n */\n protected markNeuronInactive(neuronId: TNeuronName): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.decrementSccCount(neuronId);\n }\n\n /**\n * Increment the active count for the SCC containing this neuron\n */\n private incrementSccCount(neuronId: TNeuronName): void {\n const sccIndex = this.cns.network.getSccIndexByNeuronName(neuronId);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n this.activeSccCounts.set(sccIndex, currentCount + 1);\n }\n\n /**\n * Decrement the active count for the SCC containing this neuron\n */\n private decrementSccCount(neuronId: TNeuronName): void {\n const sccIndex = this.cns.network.getSccIndexByNeuronName(neuronId);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n const nextCount = Math.max(0, currentCount - 1);\n this.activeSccCounts.set(sccIndex, nextCount);\n\n // Log warning if we're trying to decrement below 0\n if (currentCount === 0) {\n console.warn(\n `[CNSStimulation] Attempting to decrement SCC count below 0 for neuron ${neuronId}`\n );\n }\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again\n */\n protected canNeuronBeGuaranteedDone(neuronId: TNeuronName): boolean {\n if (!this.autoCleanupContextsEnabled) return false;\n return this.cns.network.canNeuronBeGuaranteedDone(\n neuronId,\n this.activeSccCounts\n );\n }\n\n protected cleanupCtxIfNeeded(neuron: TNeuron): void {\n if (\n this.autoCleanupContextsEnabled &&\n this.canNeuronBeGuaranteedDone(neuron.name)\n ) {\n this.ctx.delete(neuron.name);\n }\n }\n\n protected createSubscriberQueueItem(\n subscriber: TCNSSubscriber<TNeuron, TDendrite>,\n inputSignal?: TCNSSignal<TCollateralName, any>\n ) {\n if (this.options?.maxNeuronHops) {\n if (\n this.nueronVisitMap?.get(subscriber.neuron.name) ??\n 0 >= this.options?.maxNeuronHops\n ) {\n throw new Error(\n `Max neuron hops reached for neuron \"${subscriber.neuron.name}\" ` +\n `when trying to enqueue subscriber \"${subscriber.dendrite.collateral.name}\" ` +\n `in stimulation \"${this.id}\"`\n );\n } else {\n this.nueronVisitMap?.set(\n subscriber.neuron.name,\n (this.nueronVisitMap?.get(subscriber.neuron.name) ?? 0) + 1\n );\n }\n }\n\n const neuronActivationTask: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n > = {\n stimulationId: this.id,\n neuronId: subscriber.neuron.name,\n dendriteCollateralName: subscriber.dendrite.collateral.name,\n input: inputSignal,\n };\n return neuronActivationTask;\n }\n\n private executeActivationTask(\n neuronActivationTask: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >\n ) {\n const subscribers = this.cns.network.getSubscribers(\n neuronActivationTask.dendriteCollateralName\n );\n const subscriber = subscribers.find(\n s => s.neuron.name === neuronActivationTask.neuronId\n );\n if (!subscriber) {\n // Task failed: subscriber not found\n this.failedTasks.push({\n task: neuronActivationTask,\n error: new Error(\n `Subscriber not found for neuron \"${neuronActivationTask.neuronId}\" and collateral \"${neuronActivationTask.dendriteCollateralName}\"`\n ),\n aborted: false,\n });\n return () => {};\n }\n\n const neuron = subscriber.neuron;\n const dendrite = subscriber.dendrite as TDendrite;\n\n const inputSignal = neuronActivationTask.input\n ? ({\n collateralName: neuronActivationTask.input.collateralName,\n payload: neuronActivationTask.input.payload,\n } as TCNSSignal<TCollateralName, any>)\n : undefined;\n\n const starter = () => {\n // Mark neuron as active only when we actually start processing (after gate allows it)\n this.markNeuronActive(neuron.name);\n\n let response;\n try {\n response = dendrite.response(\n inputSignal?.payload,\n neuron.axon,\n {\n get: () => this.ctx.get(neuron.name),\n set: (value: any) => this.ctx.set(neuron.name, value),\n delete: () => this.ctx.delete(neuron.name),\n abortSignal: this.options?.abortSignal,\n cns: this.cns as ICNS<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >,\n stimulationId: this.id,\n }\n );\n } catch (error) {\n // Sync error occurred\n this.markNeuronInactive(neuron.name);\n const isAborted = this.options?.abortSignal?.aborted ?? false;\n this.failedTasks.push({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n this.processResponseOrResponses(\n inputSignal as TCNSSignal<TCollateralName, any>,\n undefined,\n error\n );\n return () => {};\n }\n\n const maxDuration = (neuron as any).maxDuration as\n | number\n | undefined;\n\n const asPromise: Promise<\n | TCNSSignal<TCollateralName, any>\n | TCNSSignal<TCollateralName, any>[]\n | undefined\n > =\n response instanceof Promise\n ? response\n : Promise.resolve(response as any);\n\n const timedPromise =\n maxDuration && maxDuration > 0\n ? new Promise<\n | TCNSSignal<TCollateralName, any>\n | TCNSSignal<TCollateralName, any>[]\n | undefined\n >((resolve, reject) => {\n const t = setTimeout(() => {\n const err = new Error(\n `Neuron \"${String(\n neuron.name\n )}\" exceeded maxDuration ${maxDuration}ms`\n );\n reject(err);\n }, maxDuration);\n asPromise.then(\n v => {\n clearTimeout(t);\n resolve(v);\n },\n e => {\n clearTimeout(t);\n reject(e);\n }\n );\n })\n : asPromise;\n\n if (response instanceof Promise || maxDuration) {\n return timedPromise.then(\n signal => {\n return () => {\n // Mark neuron as inactive when async processing completes\n this.markNeuronInactive(neuron.name);\n return this.processResponseOrResponses(\n inputSignal as TCNSSignal<TCollateralName, any>,\n signal as\n | TCNSSignal<TCollateralName, any>\n | TCNSSignal<TCollateralName, any>[]\n | undefined\n );\n };\n },\n error => {\n return () => {\n // Mark neuron as inactive when async processing fails\n this.markNeuronInactive(neuron.name);\n // Track failed task\n const isAborted =\n this.options?.abortSignal?.aborted ?? false;\n this.failedTasks.push({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n return this.processResponseOrResponses(\n inputSignal as TCNSSignal<TCollateralName, any>,\n undefined,\n error\n );\n };\n }\n );\n } else {\n return () => {\n // Mark neuron as inactive when sync processing completes\n this.markNeuronInactive(neuron.name);\n return this.processResponseOrResponses(\n inputSignal as TCNSSignal<TCollateralName, any>,\n response as\n | TCNSSignal<TCollateralName, any>\n | TCNSSignal<TCollateralName, any>[]\n | undefined\n );\n };\n }\n };\n\n // Use CNS-provided per-instance neuron queue for global concurrency gating\n return this.instanceNeuronQueue.run(neuron, starter);\n }\n\n protected processResponseOrResponses(\n inputSignal?: TCNSSignal<TCollateralName, TInputPayload>,\n outputSignalOrSignals?:\n | TCNSSignal<TCollateralName, TOutputPayload>\n | TCNSSignal<TCollateralName, TOutputPayload>[],\n error?: any\n ): void {\n // Handle array of signals\n if (Array.isArray(outputSignalOrSignals)) {\n // If array is empty, still call processResponse once to trigger onResponse\n if (outputSignalOrSignals.length === 0) {\n this.processResponse(inputSignal, undefined, error);\n return;\n }\n\n for (const signal of outputSignalOrSignals) {\n this.processResponse(inputSignal, signal, error);\n }\n return;\n }\n\n // Handle single signal\n this.processResponse(inputSignal, outputSignalOrSignals, error);\n }\n\n protected processResponse(\n inputSignal?: TCNSSignal<TCollateralName, TInputPayload>,\n outputSignal?: TCNSSignal<TCollateralName, TOutputPayload>,\n error?: any\n ): void {\n const collateralName = outputSignal?.collateralName as\n | TCollateralName\n | undefined;\n const ownerNeuron = collateralName\n ? this.cns.network.getParentNeuronByCollateralName(collateralName)\n : undefined;\n const subscribers = collateralName\n ? this.cns.network.getSubscribers(collateralName)\n : [];\n const subscriberActivationTasks: TCNSNeuronActivationTask<\n TCollateralName,\n TNeuronName\n >[] = [];\n\n if (collateralName && !error) {\n if (ownerNeuron) {\n this.cleanupCtxIfNeeded(ownerNeuron);\n }\n\n for (let i = 0; i < subscribers.length; i++) {\n const task = this.createSubscriberQueueItem(\n subscribers[i],\n outputSignal\n );\n subscriberActivationTasks.push(task);\n this.pendingTasks.add(task);\n }\n }\n this.scheduledCount += subscriberActivationTasks.length;\n\n // After we pre-enqueued all subscribers, we can trace the response\n let maybePromise: void | Promise<void>;\n try {\n maybePromise = this.options?.onResponse?.({\n inputSignal: inputSignal,\n outputSignal: outputSignal,\n contextValue: this.ctx.getAll(),\n queueLength: this.queue.length + this.scheduledCount,\n stimulation: this,\n stimulationId: this.id,\n\n hops:\n this.options?.maxNeuronHops && ownerNeuron\n ? this.nueronVisitMap?.get(ownerNeuron.name) ?? 0\n : undefined,\n error,\n });\n } catch (e) {\n // Remember the error but don't reject immediately - wait for all tasks to complete\n this.onResponseError =\n e instanceof Error ? e : new Error(String(e));\n // Still enqueue subscribers and continue processing\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks.delete(subscriberActivationTasks[i]);\n this.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n return;\n }\n\n // If onResponse returned a promise, wait for it before enqueuing subscribers\n if (maybePromise && typeof maybePromise.then === 'function') {\n (maybePromise as Promise<void>).then(\n () => {\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks.delete(subscriberActivationTasks[i]);\n this.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n },\n error => {\n // Remember the error but don't reject immediately - wait for all tasks to complete\n this.onResponseError =\n error instanceof Error\n ? error\n : new Error(String(error));\n // Still enqueue subscribers and continue processing\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks.delete(subscriberActivationTasks[i]);\n this.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n }\n );\n return;\n }\n\n // Sync path: enqueue subscribers immediately\n for (let i = 0; i < subscriberActivationTasks.length; i++) {\n this.scheduledCount--;\n this.pendingTasks.delete(subscriberActivationTasks[i]);\n this.queue.enqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n }\n\n public responseToSignal(\n signalOrSignals:\n | TCNSSignal<TCollateralName, TOutputPayload>\n | TCNSSignal<TCollateralName, TOutputPayload>[]\n ): void {\n // Handle array of signals\n if (Array.isArray(signalOrSignals)) {\n for (const signal of signalOrSignals) {\n const ownerNeuron =\n this.cns.network.getParentNeuronByCollateralName(\n signal.collateralName\n );\n if (ownerNeuron) {\n this.markNeuronActive(ownerNeuron.name);\n }\n }\n // For initial stimulation: signals are outputs (to find subscribers)\n // In onResponse, inputSignal will be undefined for initial stimulation\n this.processResponseOrResponses(undefined, signalOrSignals);\n return;\n }\n\n // Handle single signal\n const ownerNeuron = this.cns.network.getParentNeuronByCollateralName(\n signalOrSignals.collateralName\n );\n if (ownerNeuron) {\n this.markNeuronActive(ownerNeuron.name);\n }\n\n // For initial stimulation: signal is the output (to find subscribers)\n // In onResponse, inputSignal will be undefined for initial stimulation\n this.processResponse(undefined, signalOrSignals);\n this.tryResolveCompleted();\n }\n}\n","export class CNSInstanceNeuronQueue<\n TNeuron extends { name: string; concurrency?: number }\n> {\n private readonly gates = new Map<\n string,\n { limit: number; active: number; waiters: (() => void)[] }\n >();\n\n run(\n neuron: TNeuron,\n fn: () => (() => void) | Promise<() => void>\n ): (() => void) | Promise<() => void> {\n const limit = neuron?.concurrency;\n if (limit === undefined || limit <= 0) {\n return fn();\n }\n\n let gate = this.gates.get(neuron.name);\n if (!gate) {\n gate = { limit, active: 0, waiters: [] };\n this.gates.set(neuron.name, gate);\n } else {\n gate.limit = limit;\n }\n\n const wrap = (cb: () => void) => {\n return () => {\n try {\n cb();\n } finally {\n const g = this.gates.get(neuron.name)!;\n g.active = Math.max(0, g.active - 1);\n if (g.waiters.length > 0) {\n const next = g.waiters.shift()!;\n next();\n }\n }\n };\n };\n\n if (gate.active < gate.limit) {\n gate.active++;\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n return (ret as Promise<() => void>).then(cb => wrap(cb));\n }\n return wrap(ret as () => void);\n }\n\n return new Promise<() => void>(resolve => {\n const starter = () => {\n const g = this.gates.get(neuron.name)!;\n g.active++;\n const ret = fn();\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<() => void>).then(cb => resolve(wrap(cb)));\n } else {\n resolve(wrap(ret as () => void));\n }\n };\n gate!.waiters.push(starter);\n });\n }\n}\n","import { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { CNSCollateral } from './CNSCollateral';\n\nexport class CNSNetwork<\n TCollateralName extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<any, TNeuronName, any, any, any, any, any>,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> {\n /**\n * Strongly Connected Components of the neuron graph.\n * Each component is a set of neuron IDs that can reach each other.\n */\n public stronglyConnectedComponents: Set<string>[] = [];\n\n /**\n * Quick lookup: neuron ID -> SCC index for fast reachability checks.\n */\n private neuronToSCC = new Map<string, number>();\n\n /**\n * DAG of SCCs: SCC index -> set of SCC indices that can reach this SCC\n */\n private sccDag: Map<number, Set<number>> = new Map();\n\n /**\n * Precomputed ancestor sets for each SCC for fast reachability checks\n */\n private sccAncestors: Map<number, Set<number>> = new Map();\n\n /**\n * Fast lookup: collateralName -> list of (neuron, dendrite) subscribers.\n * Built once at construction time.\n */\n private subIndex = new Map<\n TCollateralName,\n TCNSSubscriber<TNeuron, TDendrite>[]\n >();\n\n private neuronIndex = new Map<TNeuronName, TNeuron>();\n private dendriteIndex = new Map<TCollateralName, TDendrite>();\n private collateralIndex = new Map<\n TCollateralName,\n CNSCollateral<TCollateralName, unknown>\n >();\n\n private parentNeuronByCollateralName = new Map<TCollateralName, TNeuron>();\n\n constructor(private readonly neurons: TNeuron[]) {\n this.validateUniqueIdentifiers();\n this.buildIndexes();\n this.buildSCC();\n }\n\n /**\n * Validate uniqueness constraints:\n * - neuron names are unique and non-empty\n * - axon collateral types are globally unique (single owner)\n * - the same collateral instance cannot be owned by multiple neurons\n * Throws aggregated error if violations are found.\n */\n private validateUniqueIdentifiers(): void {\n const errors: string[] = [];\n const seenNeuronNames = new Set<string>();\n\n for (const neuron of this.neurons) {\n const name = (neuron?.name as unknown as string) ?? '';\n if (!name || typeof name !== 'string' || name.trim().length === 0) {\n errors.push(`Neuron has empty or invalid name: \"${name}\"`);\n } else if (seenNeuronNames.has(name)) {\n errors.push(`Duplicate neuron name: \"${name}\"`);\n } else {\n seenNeuronNames.add(name);\n }\n }\n\n if (errors.length > 0) {\n throw new Error(\n `[CNS] Topology uniqueness validation failed:\\n - ` +\n errors.join(`\\n - `)\n );\n }\n }\n\n /**\n * Build the neuron graph where neurons are connected if one can stimulate the other.\n */\n private buildNeuronGraph(): Map<string, Set<string>> {\n const graph = new Map<string, Set<string>>();\n const neuronIds = this.neurons.map(n => n.name);\n\n // Initialize graph\n for (const neuronId of neuronIds) {\n graph.set(neuronId, new Set());\n }\n\n // Build edges: neuron -> neurons it can reach via its axons\n for (const neuron of this.neurons) {\n const reachableNeurons = new Set<string>();\n\n // Check what collaterals this neuron can emit\n for (const axonKey in neuron.axon) {\n const collateral = neuron.axon[axonKey];\n const collateralName = collateral.name as TCollateralName;\n\n // Find which neurons listen to this collateral\n const subscribers = this.subIndex.get(collateralName);\n if (subscribers) {\n for (const { neuron: targetNeuron } of subscribers) {\n reachableNeurons.add(targetNeuron.name);\n }\n }\n }\n\n graph.set(neuron.name, reachableNeurons);\n }\n\n return graph;\n }\n\n /**\n * Build strongly connected components using Tarjan's algorithm.\n */\n private buildSCC(): void {\n const graph = this.buildNeuronGraph();\n const neuronIds = this.neurons.map(n => n.name);\n\n // Tarjan's algorithm for SCC\n const index = new Map<string, number>();\n const lowlink = new Map<string, number>();\n const onStack = new Set<string>();\n const stack: string[] = [];\n const components: Set<string>[] = [];\n let currentIndex = 0;\n\n const strongConnect = (neuronId: string) => {\n index.set(neuronId, currentIndex);\n lowlink.set(neuronId, currentIndex);\n currentIndex++;\n stack.push(neuronId);\n onStack.add(neuronId);\n\n const neighbors = graph.get(neuronId) || new Set();\n for (const neighbor of Array.from(neighbors)) {\n if (!index.has(neighbor)) {\n strongConnect(neighbor);\n lowlink.set(\n neuronId,\n Math.min(lowlink.get(neuronId)!, lowlink.get(neighbor)!)\n );\n } else if (onStack.has(neighbor)) {\n lowlink.set(\n neuronId,\n Math.min(lowlink.get(neuronId)!, index.get(neighbor)!)\n );\n }\n }\n\n if (lowlink.get(neuronId) === index.get(neuronId)) {\n const component = new Set<string>();\n let w: string;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n component.add(w);\n } while (w !== neuronId);\n components.push(component);\n }\n };\n\n // Run Tarjan's algorithm on all unvisited neurons\n for (const neuronId of neuronIds) {\n if (!index.has(neuronId)) {\n strongConnect(neuronId);\n }\n }\n\n this.stronglyConnectedComponents = components;\n\n // Build quick lookup map for reachability checks\n for (let i = 0; i < components.length; i++) {\n for (const neuronId of Array.from(components[i])) {\n this.neuronToSCC.set(neuronId, i);\n }\n }\n\n // Build DAG between SCCs\n this.buildSCCDAG(graph);\n\n // Precompute ancestor sets for fast reachability checks\n this.buildSCCAncestors();\n }\n\n /**\n * Build DAG between SCCs based on the original neuron graph\n */\n private buildSCCDAG(neuronGraph: Map<string, Set<string>>): void {\n this.sccDag.clear();\n\n // Initialize DAG\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n this.sccDag.set(i, new Set());\n }\n\n // Build edges between SCCs\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const scc = this.stronglyConnectedComponents[i];\n\n for (const neuronId of Array.from(scc)) {\n const neighbors = neuronGraph.get(neuronId) || new Set();\n\n for (const neighborId of Array.from(neighbors)) {\n const neighborSccIndex = this.neuronToSCC.get(neighborId);\n if (\n neighborSccIndex !== undefined &&\n neighborSccIndex !== i\n ) {\n // Add edge: neighborSccIndex -> i (neighbor can reach this SCC)\n this.sccDag.get(neighborSccIndex)!.add(i);\n }\n }\n }\n }\n }\n\n /**\n * Precompute ancestor sets for each SCC for fast reachability checks\n * Uses topological sort for efficient computation\n */\n private buildSCCAncestors(): void {\n this.sccAncestors.clear();\n\n // Initialize ancestor sets\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n this.sccAncestors.set(i, new Set());\n }\n\n // Topological sort to compute ancestors efficiently\n const inDegree = new Map<number, number>();\n const queue: number[] = [];\n\n // Calculate in-degrees\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const incomingEdges = this.sccDag.get(i) || new Set();\n inDegree.set(i, incomingEdges.size);\n\n if (incomingEdges.size === 0) {\n queue.push(i);\n }\n }\n\n // Process nodes in topological order\n while (queue.length > 0) {\n const current = queue.shift()!;\n const outgoingEdges = this.getOutgoingEdges(current);\n\n for (const neighbor of Array.from(outgoingEdges)) {\n // Add current as ancestor of neighbor\n const neighborAncestors = this.sccAncestors.get(neighbor)!;\n neighborAncestors.add(current);\n\n // Add all ancestors of current to neighbor\n const currentAncestors = this.sccAncestors.get(current)!;\n for (const ancestor of Array.from(currentAncestors)) {\n neighborAncestors.add(ancestor);\n }\n\n // Decrease in-degree\n const newInDegree = (inDegree.get(neighbor) || 0) - 1;\n inDegree.set(neighbor, newInDegree);\n\n if (newInDegree === 0) {\n queue.push(neighbor);\n }\n }\n }\n }\n\n /**\n * Get outgoing edges for a given SCC index\n */\n private getOutgoingEdges(sccIndex: number): Set<number> {\n const outgoing = new Set<number>();\n\n // Find all SCCs that have this SCC as an incoming edge\n for (const [targetScc, incomingEdges] of Array.from(this.sccDag)) {\n if (incomingEdges.has(sccIndex)) {\n outgoing.add(targetScc);\n }\n }\n\n return outgoing;\n }\n\n /**\n * Check if a neuron can be reached again (including self-calling).\n * Returns true if the neuron is in a strongly connected component with more than one member,\n * or if it's in a single-member SCC that can reach itself.\n */\n public getSCCSetByNeuronName(neuronName: string) {\n const sccIndex = this.neuronToSCC.get(neuronName);\n\n if (sccIndex === undefined) return;\n\n return this.stronglyConnectedComponents[sccIndex];\n }\n\n /**\n * Get the SCC index for a given neuron ID\n */\n public getSccIndexByNeuronName(neuronName: string): number | undefined {\n return this.neuronToSCC.get(neuronName);\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again during the current propagation.\n * This is the core logic for safe context cleanup.\n */\n public canNeuronBeGuaranteedDone(\n neuronName: string,\n activeSccCounts: Map<number, number>\n ): boolean {\n const sccIndex = this.neuronToSCC.get(neuronName);\n if (sccIndex === undefined) return true; // Neuron not in graph\n\n // Check if this SCC is still active\n if (\n activeSccCounts.get(sccIndex) &&\n activeSccCounts.get(sccIndex)! > 0\n ) {\n return false; // SCC is still active\n }\n\n // Check if any active SCC can reach this SCC\n const ancestors = this.sccAncestors.get(sccIndex);\n if (!ancestors) return true;\n\n for (const ancestorSccIndex of Array.from(ancestors)) {\n if (\n activeSccCounts.get(ancestorSccIndex) &&\n activeSccCounts.get(ancestorSccIndex)! > 0\n ) {\n return false; // An active ancestor can still reach this SCC\n }\n }\n\n return true; // Neuron is guaranteed to be done\n }\n\n private buildIndexes() {\n this.subIndex.clear();\n this.parentNeuronByCollateralName.clear();\n for (const neuron of this.neurons) {\n this.neuronIndex.set(neuron.name, neuron);\n for (const dendrite of neuron.dendrites) {\n const key = dendrite.collateral.name as TCollateralName;\n const arr = this.subIndex.get(key) ?? [];\n arr.push({ neuron, dendrite: dendrite as TDendrite });\n this.subIndex.set(\n key,\n arr as TCNSSubscriber<TNeuron, TDendrite>[]\n );\n this.dendriteIndex.set(key, dendrite as TDendrite);\n }\n Object.values(neuron.axon).forEach(collateral => {\n this.parentNeuronByCollateralName.set(\n (collateral as CNSCollateral<TCollateralName, unknown>)\n .name,\n neuron\n );\n this.collateralIndex.set(\n (collateral as CNSCollateral<TCollateralName, unknown>)\n .name,\n collateral as CNSCollateral<TCollateralName, unknown>\n );\n });\n }\n }\n\n public getParentNeuronByCollateralName(collateralName: TCollateralName) {\n return this.parentNeuronByCollateralName.get(collateralName);\n }\n\n public getDendrites() {\n return Array.from(this.dendriteIndex.values());\n }\n\n public getCollaterals() {\n return Array.from(this.collateralIndex.values());\n }\n\n public getNeurons() {\n return Array.from(this.neuronIndex.values());\n }\n\n public getCollateralByName<TName extends string = string>(\n collateralName: TName\n ) {\n return this.collateralIndex.get(\n collateralName as unknown as TCollateralName\n ) as unknown as CNSCollateral<TName, unknown> | undefined;\n }\n\n public getNeuronByName<TName extends string = string>(neuronName: TName) {\n return this.neuronIndex.get(neuronName as unknown as TNeuronName);\n }\n\n public getSubscribers(\n collateralName: TCollateralName\n ): TCNSSubscriber<TNeuron, TDendrite>[] {\n return this.subIndex.get(collateralName) ?? [];\n }\n}\n","import { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { TCNSOptions } from './types/TCNSOptions';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { CNSStimulation } from './CNSStimulation';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { CNSInstanceNeuronQueue } from './CNSInstanceNeuronQueue';\nimport { TCNSStimulationResponse } from './types/TCNSStimulationResponse';\nimport { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\nimport { CNSNetwork } from './CNSNetwork';\nimport { ICNS } from './interfaces/ICNS';\n\nexport class CNS<\n TCollateralName extends string,\n TNeuronName extends string,\n TNeuron extends TCNSNeuron<any, TNeuronName, any, any, any, any, any>,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> implements\n Omit<\n ICNS<TCollateralName, TNeuronName, TNeuron, TDendrite>,\n 'stimulate'\n >\n{\n /**\n * Network graph analysis and strongly connected components.\n */\n public readonly network: CNSNetwork<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite\n >;\n\n /**\n * Global per-neuron concurrency gates shared across all stimulations.\n */\n private readonly neuronGates = new Map<\n TNeuronName,\n { limit: number; active: number; waiters: (() => void)[] }\n >();\n\n /**\n * Global task queue used by stimulation to schedule per-neuron gated work.\n * Does not replace per-stimulation concurrency; only coordinates global per-neuron limits.\n */\n protected readonly instanceNeuronQueue =\n new CNSInstanceNeuronQueue<TNeuron>();\n\n /**\n * Global response listeners applied to every stimulation.\n */\n private readonly globalResponseListeners: Array<\n (r: any) => void | Promise<void>\n > = [];\n\n constructor(\n protected readonly neurons: TNeuron[],\n public readonly options?: TCNSOptions\n ) {\n this.network = new CNSNetwork(this.neurons);\n }\n\n public addResponseListener<TInputPayload, TOutputPayload>(\n listener: (\n response: TCNSStimulationResponse<\n TCollateralName,\n TInputPayload,\n TOutputPayload,\n TNeuronName\n >\n ) => void | Promise<void>\n ): () => void {\n this.globalResponseListeners.push(listener);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const idx = this.globalResponseListeners.indexOf(listener);\n if (idx >= 0) this.globalResponseListeners.splice(idx, 1);\n };\n }\n\n private wrapOnResponse<T>(\n local?: (response: T) => void | Promise<void>\n ): (response: T) => void | Promise<void> {\n if (this.globalResponseListeners.length === 0 && !local) {\n // No-op fast path\n return () => {};\n }\n return (r: T) => {\n let anyPromise = false;\n const promises: Promise<void>[] = [];\n\n if (local) {\n try {\n const res = local(r);\n if (res && typeof (res as any).then === 'function') {\n anyPromise = true;\n promises.push(res as Promise<void>);\n }\n } catch (error) {\n // Sync error from local - wrap in rejected promise\n anyPromise = true;\n promises.push(Promise.reject(error));\n }\n }\n\n for (let i = 0; i < this.globalResponseListeners.length; i++) {\n try {\n const res = this.globalResponseListeners[i](r);\n if (res && typeof (res as any).then === 'function') {\n anyPromise = true;\n promises.push(res as Promise<void>);\n }\n } catch (error) {\n // Sync error from global listener - wrap in rejected promise\n anyPromise = true;\n promises.push(Promise.reject(error));\n }\n }\n\n if (anyPromise) {\n return Promise.allSettled(promises).then(results => {\n const rejected = results.find(\n r => r.status === 'rejected'\n ) as PromiseRejectedResult | undefined;\n if (rejected) throw rejected.reason;\n });\n }\n };\n }\n\n public stimulate<\n TInputPayload extends TOutputPayload,\n TOutputPayload = TInputPayload\n >(\n signalOrSignals:\n | TCNSSignal<TCollateralName, TInputPayload>\n | TCNSSignal<TCollateralName, TInputPayload>[],\n options?: TCNSStimulationOptions<\n TCollateralName,\n TInputPayload,\n TOutputPayload,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ): CNSStimulation<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite,\n TInputPayload,\n TOutputPayload\n > {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite,\n TInputPayload,\n TOutputPayload\n >(this, this.instanceNeuronQueue, {\n ...options,\n onResponse: wrapped,\n });\n stimulation.responseToSignal(signalOrSignals);\n return stimulation;\n }\n\n /**\n * Start a stimulation with activation tasks directly\n */\n public activate<TInputPayload, TOutputPayload>(\n tasks: TCNSNeuronActivationTask<TCollateralName, TNeuronName>[],\n options?: TCNSStimulationOptions<\n TCollateralName,\n TInputPayload,\n TOutputPayload,\n TNeuronName,\n TNeuron,\n TDendrite\n >\n ): CNSStimulation<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite,\n TInputPayload,\n TOutputPayload\n > {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<\n TCollateralName,\n TNeuronName,\n TNeuron,\n TDendrite,\n TInputPayload,\n TOutputPayload\n >(this, this.instanceNeuronQueue, {\n ...options,\n onResponse: wrapped,\n });\n stimulation.enqueueTasks(tasks);\n return stimulation;\n }\n}\n","import { TCNSSignal } from './types/TCNSSignal';\nimport { ICNSCollateral } from './interfaces/ICNSCollateral';\n\nexport class CNSCollateral<TName extends string, TPayload>\n implements ICNSCollateral<TName, TPayload>\n{\n constructor(public readonly name: TName) {}\n\n createSignal(): TCNSSignal<TName, TPayload>;\n createSignal(payload: TPayload): TCNSSignal<TName, TPayload>;\n createSignal(payload?: TPayload): TCNSSignal<TName, TPayload> {\n return { collateralName: this.name, payload };\n }\n}\n","import { CNSCollateral } from '../CNSCollateral';\nimport { TCNSAxon } from '../types/TCNSAxon';\nimport { TCNSDendrite } from '../types/TCNSDendrite';\n\nexport const collateral = <TPayload = undefined, TName extends string = string>(\n name: TName\n) => new CNSCollateral<TName, TPayload>(name);\n\n// Helper types to extract collateral Name/Payload for a given key from a heterogenous axon-like object\ntype PayloadOf<TAxon, K extends keyof TAxon> = TAxon[K] extends CNSCollateral<\n any,\n infer P\n>\n ? P\n : never;\ntype NameOf<TAxon, K extends keyof TAxon> = TAxon[K] extends CNSCollateral<\n infer N,\n any\n>\n ? N\n : never;\n\ntype InterNeuronAPI<\n TContextValue,\n TNameType extends string,\n TReceiverCollateralName extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >\n> = {\n name: TNameType;\n axon: TAxonType;\n concurrency?: number;\n maxDuration?: number;\n dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >[];\n setConcurrency: (\n n: number | undefined\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n setMaxDuration: (\n ms: number | undefined\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n bind: <TFollowAxon extends Record<string, CNSCollateral<any, any>>>(\n axon: TFollowAxon,\n dendrites: {\n [K in keyof TFollowAxon]:\n | TCNSDendrite<\n TContextValue,\n NameOf<TFollowAxon, K> & string,\n PayloadOf<TFollowAxon, K>,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n | TCNSDendrite<\n TContextValue,\n NameOf<TFollowAxon, K> & string,\n PayloadOf<TFollowAxon, K>,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >['response'];\n }\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n dendrite: <\n TSenderExactCollateralName extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralName,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n ) => InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n};\n\n// Concrete builder\nexport const neuron = <\n TContextValue,\n TNameType extends string,\n TProvidedAxon extends Record<string, CNSCollateral<any, any>>,\n TReceiverCollateralName extends keyof TProvidedAxon &\n string = keyof TProvidedAxon & string,\n TReceiverAxonCollateralPayload = TProvidedAxon[keyof TProvidedAxon] extends CNSCollateral<\n any,\n infer P\n >\n ? P\n : never\n>(\n name: TNameType,\n axon: TProvidedAxon\n): InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n> => {\n const dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n >[] = [];\n\n const api: InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n > = {\n setConcurrency: (n: number | undefined) => {\n api.concurrency = n;\n return api;\n },\n setMaxDuration: (ms: number | undefined) => {\n api.maxDuration = ms;\n return api;\n },\n bind: ((axon, newDendrites) => {\n for (const key in newDendrites) {\n const value = newDendrites[key] as any;\n const dendrite =\n typeof value === 'function'\n ? {\n collateral: (axon as any)[key],\n response: value,\n }\n : value;\n dendrites.push(\n dendrite as TCNSDendrite<\n TContextValue,\n string,\n unknown,\n any,\n any,\n any\n >\n );\n }\n return api;\n }) as InterNeuronAPI<\n TContextValue,\n TNameType,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<TReceiverCollateralName, TReceiverAxonCollateralPayload>\n >['bind'],\n axon: axon as unknown as TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >,\n name,\n concurrency: undefined,\n maxDuration: undefined,\n dendrites,\n dendrite<\n TSenderExactCollateralName extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralName,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >\n >\n ) {\n dendrites.push(\n s as TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload,\n TCNSAxon<\n TReceiverCollateralName,\n TReceiverAxonCollateralPayload\n >\n >\n );\n return api; // keep full API for chaining\n },\n };\n\n return api;\n};\n\nexport const withCtx = <TContextValue>() => ({\n neuron: <\n TNameType extends string,\n TProvidedAxon extends Record<string, CNSCollateral<any, any>>\n >(\n name: TNameType,\n axon: TProvidedAxon\n ) => {\n return neuron<TContextValue, TNameType, TProvidedAxon>(name, axon);\n },\n});\n"]}
|
package/dist/index.js
CHANGED
|
@@ -162,7 +162,7 @@ var CNSStimulation = class {
|
|
|
162
162
|
* Track active SCCs: SCC index -> count of active neurons in that SCC
|
|
163
163
|
*/
|
|
164
164
|
this.activeSccCounts = /* @__PURE__ */ new Map();
|
|
165
|
-
this.ctx = new CNSStimulationContextStore(
|
|
165
|
+
this.ctx = options?.ctx ?? new CNSStimulationContextStore(
|
|
166
166
|
new Map(Object.entries(options?.contextValues ?? {}))
|
|
167
167
|
);
|
|
168
168
|
this.id = options?.stimulationId || Math.random().toString(36).slice(2);
|