@cnstra/core 2.3.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -6
- package/dist/CNS.d.ts +29 -1
- package/dist/CNS.d.ts.map +1 -1
- package/dist/CNSStimulation.d.ts +33 -1
- package/dist/CNSStimulation.d.ts.map +1 -1
- package/dist/factory/index.d.ts +94 -67
- package/dist/factory/index.d.ts.map +1 -1
- package/dist/index.cjs +241 -48
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +239 -49
- package/dist/index.js.map +1 -1
- package/dist/interfaces/ICNS.d.ts +7 -0
- package/dist/interfaces/ICNS.d.ts.map +1 -1
- package/dist/types/TCNSDendrite.d.ts +3 -8
- package/dist/types/TCNSDendrite.d.ts.map +1 -1
- package/dist/types/TCNSHandlerContext.d.ts +24 -0
- package/dist/types/TCNSHandlerContext.d.ts.map +1 -0
- package/dist/types/TCNSNeuron.d.ts +1 -1
- package/dist/types/TCNSNeuron.d.ts.map +1 -1
- package/dist/types/TCNSStimulationDrain.d.ts +37 -0
- package/dist/types/TCNSStimulationDrain.d.ts.map +1 -0
- package/dist/types/TCNSStimulationOptions.d.ts +18 -0
- package/dist/types/TCNSStimulationOptions.d.ts.map +1 -1
- package/dist/types/TCNSStimulationResponse.d.ts +40 -0
- package/dist/types/TCNSStimulationResponse.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CNSStimulationContextStore.ts","../src/CNSStimulation.ts","../src/CNSInstanceNeuronQueue.ts","../src/CNSNetwork.ts","../src/CNS.ts","../src/CNSPersistOptionsRegistry.ts","../src/CNSCollateral.ts","../src/utils/CNSStimulationGate.ts","../src/factory/index.ts"],"names":["neuron","collateral","error","r","axon"],"mappings":";AAEO,IAAM,6BAAN,MAAwE;AAAA,EAK3E,YAAY,GAAA,EAA4B;AACpC,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACf;AAAA,EAEA,IAAI,GAAA,EAAsB;AACtB,IAAA,OAAO,IAAA,CAAK,GAAA,EAAK,GAAA,CAAI,GAAG,CAAA;AAAA,EAC5B;AAAA,EAEA,GAAA,CAAI,KAAa,KAAA,EAAsB;AACnC,IAAA,CAAC,IAAA,CAAK,QAAL,IAAA,CAAK,GAAA,uBAAY,GAAA,EAAI,CAAA,EAAG,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAA,GAA+B;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,GAAA,CAAI,KAAK,GAAG,CAAA,uBAAQ,GAAA,EAAI;AAAA,EAClD;AAAA,EAEA,OAAO,MAAA,EAAoC;AACvC,IAAA,MAAM,MAAO,IAAA,CAAK,GAAA,KAAL,IAAA,CAAK,GAAA,uBAAY,GAAA,EAAI,CAAA;AAClC,IAAA,GAAA,CAAI,KAAA,EAAM;AACV,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,QAAQ,GAAA,CAAI,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EACzD;AAAA,EAEA,OAAO,GAAA,EAAmB;AACtB,IAAA,IAAA,CAAK,GAAA,EAAK,OAAO,GAAG,CAAA;AAAA,EACxB;AACJ;;;ACTA,IAAM,aAAA,0BAAuB,qBAAqB,CAAA;AASlD,IAAM,qBAAN,MAAyB;AAAA,EACrB,WAAA,CACoB,WAAA,EACCA,OAAAA,EACD,WAAA,EACA,GAAA,EAClB;AAJkB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACC,IAAA,IAAA,CAAA,MAAA,GAAAA,OAAAA;AACD,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EACjB;AAAA,EACH,GAAA,GAAe;AACX,IAAA,OAAO,KAAK,WAAA,CAAY,UAAA,EAAW,CAAE,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EACxD;AAAA,EACA,IAAI,KAAA,EAAsB;AACtB,IAAA,IAAA,CAAK,YAAY,UAAA,EAAW,CAAE,GAAA,CAAI,IAAA,CAAK,QAAQ,KAAK,CAAA;AAAA,EACxD;AAAA,EACA,MAAA,GAAe;AACX,IAAA,IAAA,CAAK,WAAA,CAAY,UAAA,EAAW,CAAE,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,EACpD;AACJ,CAAA;AASA,IAAM,6BAAN,MAAiC;AAAA,EAC7B,YACoB,WAAA,EACC,KAAA,EACD,aACA,YAAA,EAGA,WAAA,EACA,MACA,KAAA,EAClB;AATkB,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACC,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACD,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAGA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAAA,EACjB;AAAA,EAEH,IAAI,YAAA,GAAqC;AACrC,IAAA,OAAO,KAAK,KAAA,GAAQ,IAAA,CAAK,MAAM,MAAA,EAAO,uBAAQ,GAAA,EAAI;AAAA,EACtD;AACJ,CAAA;AAEO,IAAM,iBAAN,MAGL;AAAA,EAwDE,WAAA,CACoB,GAAA,EAChB,mBAAA,EACgB,OAAA,EAChB,UAAA,EAGF;AANkB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAhDpB,IAAA,IAAA,CAAQ,KAAA,GAAQ,CAAA;AAChB,IAAA,IAAA,CAAQ,KAAA,GAAQ,CAAA;AAChB,IAAA,IAAA,CAAQ,KAAA,GAAQ,CAAA;AAChB,IAAA,IAAA,CAAQ,SAAA,GAAY,CAAA;AACpB,IAAA,IAAA,CAAQ,gBAAA,GAAmB,CAAA;AAK3B;AAAA,IAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAClB,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AAIpB,IAAA,IAAA,CAAQ,cAAA,GAAiB,CAAA;AAYzB,IAAA,IAAA,CAAQ,WAAA,GAAc,KAAA;AAEtB,IAAA,IAAA,CAAQ,kBAAA,GAAqB,KAAA;AA0BzB,IAAA,IAAA,CAAK,WAAW,OAAA,EAAS,GAAA;AAEzB,IAAA,IAAA,CAAK,mBAAA,GAAsB,mBAAA;AAC3B,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAElB,IAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe;AAC7B,MAAA,IAAA,CAAK,cAAA,uBAAqB,GAAA,EAAI;AAAA,IAClC;AAEA,IAAA,IAAI,KAAK,0BAAA,EAA4B;AACjC,MAAA,IAAA,CAAK,eAAA,uBAAsB,GAAA,EAAI;AAAA,IACnC;AAAA,EACJ;AAAA,EAEQ,eACJ,OAAA,EACI;AACJ,IAAA,CAAC,KAAK,WAAA,KAAL,IAAA,CAAK,cAAgB,EAAC,CAAA,EAAG,KAAK,OAAO,CAAA;AAAA,EAC1C;AAAA,EAEQ,eAAA,GAAwB;AAC5B,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,IAAA,IAAA,CAAK,gBAAA,IAAmB;AAAA,EAC5B;AAAA,EAEQ,eAAe,KAAA,EAAkB;AACrC,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,IAAY,GAAA,GAAmC;AAC3C,IAAA,OAAQ,IAAA,CAAK,QAAA,KAAL,IAAA,CAAK,QAAA,GAAa,IAAI,0BAAA,EAA2B,CAAA;AAAA,EAC7D;AAAA;AAAA,EAIA,IAAY,iBAAA,GAA6B;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,EAAS,WAAA,IAAe,QAAA;AAC3C,IAAA,OACI,KAAK,gBAAA,GAAmB,KAAA,IACxB,CAAC,IAAA,CAAK,SAAS,WAAA,EAAa,OAAA;AAAA,EAEpC;AAAA,EAEQ,OAAA,GAAgB;AACpB,IAAA,MAAM,cAAc,IAAA,CAAK,SAAA;AACzB,IAAA,MAAM,WAAW,IAAA,CAAK,MAAA;AACtB,IAAA,IAAA,CAAK,YAAY,WAAA,GAAc,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,IAAI,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAEzC,IAAA,IAAI,WAAW,IAAA,CAAK,KAAA;AACpB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK;AACjC,MAAA,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA;AAC/B,MAAA,QAAA,GAAA,CAAY,WAAW,CAAA,IAAK,WAAA;AAAA,IAChC;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AACb,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAAA,EACtB;AAAA,EAEQ,QAAA,GAA0D;AAC9D,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,CAAA,EAAG,OAAO,MAAA;AAC7B,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA,GAAI,MAAA;AACpB,IAAA,IAAA,CAAK,KAAA,GAAA,CAAS,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,SAAA;AACrC,IAAA,IAAA,CAAK,KAAA,EAAA;AACL,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,aAAa,IAAA,EAA+C;AAChE,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AACd,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA;AAAA,IAC1C,CAAA,MAAA,IAAW,IAAA,CAAK,KAAA,KAAU,IAAA,CAAK,SAAA,EAAW;AACtC,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACjB;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAA,CAAS,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,SAAA;AACrC,IAAA,IAAA,CAAK,KAAA,EAAA;AAAA,EACT;AAAA;AAAA,EAGQ,SAAS,IAAA,EAA+C;AAC5D,IAAA,IAAA,CAAK,aAAa,IAAI,CAAA;AACtB,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,IAAA,EAAK;AAAA,cACnB,SAAA,GAAY,IAAA;AAAA,EAC1B;AAAA,EAEQ,eAAA,GAAuD;AAC3D,IAAA,MAAM,SAA8C,EAAC;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,MAAA;AACzB,IAAA,IAAI,QAAQ,IAAA,CAAK,KAAA;AACjB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAK,CAAE,CAAA;AAC/B,MAAA,KAAA,GAAA,CAAS,KAAA,GAAQ,KAAK,IAAA,CAAK,SAAA;AAAA,IAC/B;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEQ,IAAA,GAAa;AACjB,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,KAAA,GAAQ,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAA,GAAO,KAAK,QAAA,EAAS;AAC3B,MAAA,IAAA,CAAK,gBAAA,EAAA;AAEL,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,qBAAA,CAAsB,IAAI,CAAA;AAG3C,MAAA,IAAI,GAAA,IAAO,OAAQ,GAAA,CAAY,IAAA,KAAS,UAAA,EAAY;AAGhD,QAAA,CAAC,IAAA,CAAK,gBAAL,IAAA,CAAK,WAAA,uBAAoB,GAAA,EAAI,CAAA,EAAG,IAAI,IAAI,CAAA;AACzC,QAAC,GAAA,CAAqC,IAAA;AAAA,UAClC,CAAA,EAAA,KAAM;AACF,YAAA,IAAA,CAAK,gBAAA,EAAA;AACL,YAAA,IAAA,CAAK,WAAA,CAAa,OAAO,IAAI,CAAA;AAC7B,YAAA,IAAI,OAAO,EAAA,KAAO,UAAA,EAAY,EAAA,EAAG;AAEjC,YAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,iBAAA,EAAmB;AAC1C,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,CAAa,OAAO,IAAI,CAAA;AAC7B,YAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,IAAA,CAAK,iBAAA,EAAmB;AAC1C,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,IAAI,OAAO,GAAA,KAAQ,UAAA,EAAa,GAAA,EAAmB;AAAA,IACvD;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,KAAA;AAIf,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACd;AAAA,EACJ;AAAA,EAEQ,mBAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,WAAA,EAAa;AACtB,IAAA,MAAM,QAAA,GAAW,KAAK,gBAAA,KAAqB,CAAA;AAC3C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,cAAA,KAAmB,CAAA;AACvD,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,KAAK,eAAA,EAAgB;AAEzC,QAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,GAAG,WAAW,CAAA,EAAG;AACjC,UAAA,MAAM,cAAA,GAAiB,KAAK,WAAA,EAAa,IAAA;AAAA,YACrC,CAAA,EAAA,KAAM,GAAG,IAAA,KAAS;AAAA,WACtB;AACA,UAAA,IAAI,CAAC,cAAA,EAAgB;AACjB,YAAA,IAAA,CAAK,cAAA,CAAe;AAAA,cAChB,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,cAAA,CAAe,IAAI,KAAA,CAAM,qBAAqB,CAAC,CAAA;AACpD,QAAA;AAAA,MACJ;AAEA,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAGnB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,EAAa,MAAA,IAAU,CAAA;AAChD,MAAA,IAAI,WAAA,GAAc,CAAA,IAAK,IAAA,CAAK,eAAA,EAAiB;AACzC,QAAA,MAAM,KAAA,GACF,IAAA,CAAK,eAAA,IACL,IAAI,KAAA;AAAA,UACA,8BAA8B,WAAW,CAAA,eAAA;AAAA,SAC7C;AACJ,QAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,MAC7B,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,MACzB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEO,iBAAA,GAAmC;AACtC,IAAA,IAAI,IAAA,CAAK,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAEhC,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,kBAAA,GAChB,OAAA,CAAQ,OAAO,IAAA,CAAK,eAAe,CAAA,GACnC,OAAA,CAAQ,OAAA,EAAQ;AACtB,MAAA,OAAO,IAAA,CAAK,SAAA;AAAA,IAChB;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,OAAA,CAAc,CAAC,SAAS,MAAA,KAAW;AACpD,MAAA,IAAA,CAAK,gBAAA,GAAmB,OAAA;AACxB,MAAA,IAAA,CAAK,eAAA,GAAkB,MAAA;AAAA,IAC3B,CAAC,CAAA;AACD,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKO,qBAAA,GAA6D;AAChE,IAAA,MAAM,WAAA,GAAc,KAAK,eAAA,EAAgB;AACzC,IAAA,MAAM,WAAA,GAAe,KAAK,WAAA,GAAc,KAAA,CAAM,KAAK,IAAA,CAAK,WAAW,IAAI,EAAC;AACxE,IAAA,MAAM,YAAA,GAAe,KAAK,YAAA,GACpB,KAAA,CAAM,KAAK,IAAA,CAAK,YAAY,IAC5B,EAAC;AACP,IAAA,OAAO,CAAC,GAAG,WAAA,EAAa,GAAG,WAAA,EAAa,GAAG,YAAY,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKO,cAAA,GAAkE;AACrE,IAAA,OAAO,KAAK,WAAA,GAAc,CAAC,GAAG,IAAA,CAAK,WAAW,IAAI,EAAC;AAAA,EACvD;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;AACtB,MAAA,IAAA,CAAK,SAAS,IAAI,CAAA;AAAA,IACtB;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,iBAAiBA,OAAAA,EAAuB;AAC9C,IAAA,IAAI,CAAC,KAAK,0BAAA,EAA4B;AAEtC,IAAA,IAAA,CAAK,kBAAkBA,OAAM,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKU,mBAAmBA,OAAAA,EAAuB;AAChD,IAAA,IAAI,CAAC,KAAK,0BAAA,EAA4B;AAEtC,IAAA,IAAA,CAAK,kBAAkBA,OAAM,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkBA,OAAAA,EAAuB;AAC7C,IAAA,MAAM,SAAS,IAAA,CAAK,eAAA;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,oBAAoBA,OAAM,CAAA;AAC5D,IAAA,IAAI,aAAa,MAAA,EAAW;AAE5B,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AAC7C,IAAA,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,YAAA,GAAe,CAAC,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkBA,OAAAA,EAAuB;AAC7C,IAAA,MAAM,SAAS,IAAA,CAAK,eAAA;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,oBAAoBA,OAAM,CAAA;AAC5D,IAAA,IAAI,aAAa,MAAA,EAAW;AAE5B,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,eAAe,CAAC,CAAA;AAC9C,IAAA,MAAA,CAAO,GAAA,CAAI,UAAU,SAAS,CAAA;AAG9B,IAAA,IAAI,iBAAiB,CAAA,EAAG;AACpB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACJ,CAAA,qEAAA;AAAA,OACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKU,0BAA0BA,OAAAA,EAA0B;AAC1D,IAAA,IAAI,CAAC,IAAA,CAAK,0BAAA,IAA8B,CAAC,IAAA,CAAK,eAAA;AAC1C,MAAA,OAAO,KAAA;AACX,IAAA,OAAO,IAAA,CAAK,IAAI,OAAA,CAAQ,yBAAA;AAAA,MACpBA,OAAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACT;AAAA,EACJ;AAAA,EAEU,mBAAmBA,OAAAA,EAAuB;AAChD,IAAA,IACI,IAAA,CAAK,0BAAA,IACL,IAAA,CAAK,yBAAA,CAA0BA,OAAM,CAAA,EACvC;AAEE,MAAA,IAAA,CAAK,QAAA,EAAU,OAAOA,OAAM,CAAA;AAAA,IAChC;AAAA,EACJ;AAAA,EAEU,yBAAA,CACN,YACA,WAAA,EACF;AACE,IAAA,IAAI,IAAA,CAAK,SAAS,aAAA,EAAe;AAC7B,MAAA,IAAA,CACK,IAAA,CAAK,gBAAgB,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,IAAK,CAAA,KAChD,IAAA,CAAK,OAAA,EAAS,aAAA,EAChB;AACE,QAAA,MAAM,IAAI,KAAA;AAAA,UACN,CAAA,yDAAA;AAAA,SACJ;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,cAAA,EAAgB,GAAA;AAAA,UACjB,UAAA,CAAW,MAAA;AAAA,UAAA,CACV,KAAK,cAAA,EAAgB,GAAA,CAAI,UAAA,CAAW,MAAM,KAAK,CAAA,IAAK;AAAA,SACzD;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,MAAM,oBAAA,GAA0D;AAAA,MAC5D,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,kBAAA,EAAoB,WAAW,QAAA,CAAS,UAAA;AAAA,MACxC,KAAA,EAAO;AAAA,KACX;AAGA,IAAC,oBAAA,CAA6B,aAAa,CAAA,GAAI,UAAA;AAC/C,IAAA,OAAO,oBAAA;AAAA,EACX;AAAA,EAEQ,sBACJ,oBAAA,EACF;AAGE,IAAA,IAAI,UAAA,GAAc,qBAA6B,aAAa,CAAA;AAG5D,IAAA,IAAI,CAAC,UAAA,EAAY;AACb,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,cAAA;AAAA,QACjC,oBAAA,CAAqB;AAAA,OACzB;AACA,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AACzC,QAAA,IAAI,WAAA,CAAY,CAAC,CAAA,CAAE,MAAA,KAAW,qBAAqB,MAAA,EAAQ;AACvD,UAAA,UAAA,GAAa,YAAY,CAAC,CAAA;AAC1B,UAAA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,IAAI,CAAC,UAAA,EAAY;AAEb,MAAA,IAAA,CAAK,cAAA,CAAe;AAAA,QAChB,IAAA,EAAM,oBAAA;AAAA,QACN,OAAO,IAAI,KAAA;AAAA,UACP,CAAA,wCAAA;AAAA,SACJ;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,cAAc,oBAAA,CAAqB,KAAA;AAKzC,IAAA,MAAM,cAAeA,OAAAA,CAAoC,WAAA;AACzD,IAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,WAAA,IAAe,CAAA,EAAG;AAC/C,MAAA,OAAO,IAAA,CAAK,UAAA;AAAA,QACRA,OAAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AACA,IAAA,OAAO,KAAK,mBAAA,CAAoB,GAAA;AAAA,MAAIA,OAAAA;AAAA,MAAQ,MACxC,IAAA,CAAK,UAAA;AAAA,QACDA,OAAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA;AACJ,KACJ;AAAA,EACJ;AAAA,EAEQ,UAAA,CACJA,OAAAA,EACA,QAAA,EACA,WAAA,EACA,oBAAA,EACkC;AAElC,IAAA,IAAA,CAAK,iBAAiBA,OAAM,CAAA;AAE5B,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACA,MAAA,QAAA,GAAW,QAAA,CAAS,QAAA;AAAA,QAChB,WAAA,EAAa,OAAA;AAAA,QACbA,OAAAA,CAAO,IAAA;AAAA,QACP,IAAI,kBAAA;AAAA,UACA,IAAA;AAAA,UACAA,OAAAA;AAAA,UACA,KAAK,OAAA,EAAS,WAAA;AAAA,UACd,IAAA,CAAK;AAAA;AACT,OACJ;AAAA,IACJ,SAAS,KAAA,EAAO;AAEZ,MAAA,IAAA,CAAK,mBAAmBA,OAAM,CAAA;AAC9B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,EAAS,WAAA,EAAa,OAAA,IAAW,KAAA;AACxD,MAAA,IAAA,CAAK,cAAA,CAAe;AAAA,QAChB,IAAA,EAAM,oBAAA;AAAA,QACN,KAAA,EACI,iBAAiB,KAAA,GACX,KAAA,GACA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QACjC,OAAA,EAAS;AAAA,OACZ,CAAA;AACD,MAAA,IAAA,CAAK,0BAAA;AAAA,QACDA,OAAAA;AAAA,QACA,WAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACJ;AACA,MAAA,OAAO,MAAM;AAAA,MAAC,CAAA;AAAA,IAClB;AAEA,IAAA,MAAM,cAAeA,OAAAA,CAAe,WAAA;AAIpC,IAAA,IAAI,QAAA,YAAoB,WAAW,WAAA,EAAa;AAI5C,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,+BAA+B,WAAW,CAAA,EAAA;AAAA,WAC9C;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,OAAO,YAAA,CAAa,IAAA;AAAA,QAChB,CAAA,MAAA,KAAU;AACN,UAAA,OAAO,MAAM;AAET,YAAA,IAAA,CAAK,mBAAmBA,OAAM,CAAA;AAC9B,YAAA,OAAO,IAAA,CAAK,0BAAA;AAAA,cACRA,OAAAA;AAAA,cACA,WAAA;AAAA,cACA;AAAA,aAIJ;AAAA,UACJ,CAAA;AAAA,QACJ,CAAA;AAAA,QACA,CAAA,KAAA,KAAS;AACL,UAAA,OAAO,MAAM;AAET,YAAA,IAAA,CAAK,mBAAmBA,OAAM,CAAA;AAE9B,YAAA,MAAM,SAAA,GACF,IAAA,CAAK,OAAA,EAAS,WAAA,EAAa,OAAA,IAAW,KAAA;AAC1C,YAAA,IAAA,CAAK,cAAA,CAAe;AAAA,cAChB,IAAA,EAAM,oBAAA;AAAA,cACN,KAAA,EACI,iBAAiB,KAAA,GACX,KAAA,GACA,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,cACjC,OAAA,EAAS;AAAA,aACZ,CAAA;AACD,YAAA,OAAO,IAAA,CAAK,0BAAA;AAAA,cACRA,OAAAA;AAAA,cACA,WAAA;AAAA,cACA,MAAA;AAAA,cACA;AAAA,aACJ;AAAA,UACJ,CAAA;AAAA,QACJ;AAAA,OACJ;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,OAAO,MAAM;AAET,QAAA,IAAA,CAAK,mBAAmBA,OAAM,CAAA;AAC9B,QAAA,OAAO,IAAA,CAAK,0BAAA;AAAA,UACRA,OAAAA;AAAA,UACA,WAAA;AAAA,UACA;AAAA,SAIJ;AAAA,MACJ,CAAA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEU,0BAAA,CACN,OAAA,EACA,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,OAAA,EAAS,WAAA,EAAa,MAAA,EAAW,KAAK,CAAA;AAC3D,QAAA;AAAA,MACJ;AAEA,MAAA,KAAA,MAAW,UAAU,qBAAA,EAAuB;AACxC,QAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,WAAA,EAAa,MAAA,EAAQ,KAAK,CAAA;AAAA,MAC5D;AACA,MAAA;AAAA,IACJ;AAGA,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,WAAA,EAAa,qBAAA,EAAuB,KAAK,CAAA;AAAA,EAC3E;AAAA,EAEU,eAAA,CACN,OAAA,EACA,WAAA,EACA,YAAA,EACA,KAAA,EACI;AACJ,IAAA,MAAMC,cAAa,YAAA,EAAc,UAAA;AACjC,IAAA,MAAM,WAAA,GAAcA,cACd,IAAA,CAAK,GAAA,CAAI,QAAQ,cAAA,CAAeA,WAAU,IAC1C,EAAC;AACP,IAAA,MAAM,aAAa,IAAA,CAAK,UAAA;AAKxB,IAAA,IAAI,CAAC,UAAA,EAAY;AACb,MAAA,IAAIA,WAAAA,IAAc,CAAC,KAAA,EAAO;AACtB,QAAA,IAAI,OAAA,EAAS,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAC5C,QAAA,MAAM,IAAI,WAAA,CAAY,MAAA;AACtB,QAAA,IAAI,IAAI,CAAA,EAAG;AACP,UAAA,MAAM,KAAA,GACF,IAAI,KAAA,CAAM,CAAC,CAAA;AACf,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,YAAA,KAAA,CAAM,CAAC,IAAI,IAAA,CAAK,yBAAA;AAAA,cACZ,YAAY,CAAC,CAAA;AAAA,cACb;AAAA,aACJ;AAAA,UACJ;AACA,UAAA,IAAA,CAAK,cAAA,IAAkB,CAAA;AACvB,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,YAAA,IAAA,CAAK,cAAA,EAAA;AACL,YAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,UAC1B;AAAA,QACJ;AAAA,MACJ;AACA,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,4BACF,EAAC;AAEL,IAAA,IAAIA,WAAAA,IAAc,CAAC,KAAA,EAAO;AACtB,MAAA,IAAI,OAAA,EAAS,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AAE5C,MAAA,MAAM,UAAW,IAAA,CAAK,YAAA,KAAL,IAAA,CAAK,YAAA,uBAAqB,GAAA,EAAI,CAAA;AAC/C,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,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,MACpB;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,kBAAkB,yBAAA,CAA0B,MAAA;AAGjD,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI;AACA,MAAA,YAAA,GAAe,UAAA;AAAA,QACX,IAAI,0BAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA,CAAK,QAAA;AAAA,UACL,WAAA;AAAA,UACA,YAAA;AAAA,UACA,IAAA,CAAK,QAAQ,IAAA,CAAK,cAAA;AAAA,UAClB,IAAA,CAAK,SAAS,aAAA,IAAiB,OAAA,GACzB,KAAK,cAAA,EAAgB,GAAA,CAAI,OAAO,CAAA,IAAK,CAAA,GACrC,KAAA,CAAA;AAAA,UACN;AAAA;AACJ,OACJ;AAAA,IACJ,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,EAAc,MAAA,CAAO,yBAAA,CAA0B,CAAC,CAAC,CAAA;AACtD,QAAA,IAAA,CAAK,QAAA,CAAS,yBAAA,CAA0B,CAAC,CAAC,CAAA;AAAA,MAC9C;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,EAAc,MAAA,CAAO,yBAAA,CAA0B,CAAC,CAAC,CAAA;AACtD,YAAA,IAAA,CAAK,QAAA,CAAS,yBAAA,CAA0B,CAAC,CAAC,CAAA;AAAA,UAC9C;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,EAAc,MAAA,CAAO,yBAAA,CAA0B,CAAC,CAAC,CAAA;AACtD,YAAA,IAAA,CAAK,QAAA,CAAS,yBAAA,CAA0B,CAAC,CAAC,CAAA;AAAA,UAC9C;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,EAAc,MAAA,CAAO,yBAAA,CAA0B,CAAC,CAAC,CAAA;AACtD,MAAA,IAAA,CAAK,QAAA,CAAS,yBAAA,CAA0B,CAAC,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC7B;AAAA,EAEO,iBACH,eAAA,EAGI;AAEJ,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAAG;AAGhC,MAAA,IAAA,CAAK,0BAAA,CAA2B,MAAA,EAAW,MAAA,EAAW,eAAe,CAAA;AACrE,MAAA;AAAA,IACJ;AAIA,IAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAW,MAAA,EAAW,eAAe,CAAA;AAC1D,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC7B;AACJ,CAAA;;;ACz3BO,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,OAAM,CAAA;AAChC,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,EAAQ,IAAI,CAAA;AAAA,IAC/B,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,OAAM,CAAA;AAC/B,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,OAAM,CAAA;AAC/B,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,MAGL;AAAA,EA0CE,YAA6B,OAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAlC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,+BAA+C,EAAC;AACxD,IAAA,IAAA,CAAQ,QAAA,GAAW,KAAA;AAUnB;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAAqB;AAK/C;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,wBAAA,uBAA+B,GAAA,EAAqC;AAKxE,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACtB;AAAA,EAnCA,IAAW,2BAAA,GAA8C;AACrD,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,OAAO,IAAA,CAAK,4BAAA;AAAA,EAChB;AAAA;AAAA,EAmCQ,SAAA,GAAkB;AACtB,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,GAA+C;AACnD,IAAA,MAAM,KAAA,uBAAY,GAAA,EAA2B;AAG7C,IAAA,KAAA,MAAWA,OAAAA,IAAU,KAAK,OAAA,EAAS;AAC/B,MAAA,KAAA,CAAM,GAAA,CAAIA,OAAAA,kBAAQ,IAAI,GAAA,EAAK,CAAA;AAAA,IAC/B;AAGA,IAAA,KAAA,MAAWA,OAAAA,IAAU,KAAK,OAAA,EAAS;AAC/B,MAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAa;AAG1C,MAAA,KAAA,MAAW,OAAA,IAAWA,QAAO,IAAA,EAAM;AAC/B,QAAA,MAAMC,WAAAA,GAAaD,OAAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAGtC,QAAA,MAAM,WAAA,GAAc,KAAK,QAAA,CAAS,GAAA;AAAA,UAC9BC;AAAA,SACJ;AACA,QAAA,IAAI,WAAA,EAAa;AACb,UAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,YAAA,EAAa,IAAK,WAAA,EAAa;AAChD,YAAA,gBAAA,CAAiB,IAAI,YAAY,CAAA;AAAA,UACrC;AAAA,QACJ;AAAA,MACJ;AAEA,MAAA,KAAA,CAAM,GAAA,CAAID,SAAQ,gBAAgB,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,GAAiB;AACrB,IAAA,MAAM,KAAA,GAAQ,KAAK,gBAAA,EAAiB;AAGpC,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAqB;AACvC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAqB;AACzC,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAa;AACjC,IAAA,MAAM,QAAmB,EAAC;AAC1B,IAAA,MAAM,aAA6B,EAAC;AACpC,IAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,IAAA,MAAM,aAAA,GAAgB,CAACA,OAAAA,KAAoB;AACvC,MAAA,KAAA,CAAM,GAAA,CAAIA,SAAQ,YAAY,CAAA;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAIA,SAAQ,YAAY,CAAA;AAChC,MAAA,YAAA,EAAA;AACA,MAAA,KAAA,CAAM,KAAKA,OAAM,CAAA;AACjB,MAAA,OAAA,CAAQ,IAAIA,OAAM,CAAA;AAElB,MAAA,MAAM,YAAY,KAAA,CAAM,GAAA,CAAIA,OAAM,CAAA,wBAAS,GAAA,EAAI;AAC/C,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,YACJA,OAAAA;AAAA,YACA,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,CAAIA,OAAM,CAAA,EAAI,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAE;AAAA,WACzD;AAAA,QACJ,CAAA,MAAA,IAAW,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,UAAA,OAAA,CAAQ,GAAA;AAAA,YACJA,OAAAA;AAAA,YACA,IAAA,CAAK,IAAI,OAAA,CAAQ,GAAA,CAAIA,OAAM,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAE;AAAA,WACvD;AAAA,QACJ;AAAA,MACJ;AAEA,MAAA,IAAI,QAAQ,GAAA,CAAIA,OAAM,MAAM,KAAA,CAAM,GAAA,CAAIA,OAAM,CAAA,EAAG;AAC3C,QAAA,MAAM,SAAA,uBAAgB,GAAA,EAAa;AACnC,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,KAAMA,OAAAA;AACf,QAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,MAC7B;AAAA,IACJ,CAAA;AAGA,IAAA,KAAA,MAAWA,OAAAA,IAAU,KAAK,OAAA,EAAS;AAC/B,MAAA,IAAI,CAAC,KAAA,CAAM,GAAA,CAAIA,OAAM,CAAA,EAAG;AACpB,QAAA,aAAA,CAAcA,OAAM,CAAA;AAAA,MACxB;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,4BAAA,GAA+B,UAAA;AAGpC,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,EAA+C;AAC/D,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAGlB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,4BAAA,CAA6B,QAAQ,CAAA,EAAA,EAAK;AAC/D,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,4BAAA,CAA6B,QAAQ,CAAA,EAAA,EAAK;AAC/D,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,4BAAA,CAA6B,CAAC,CAAA;AAE/C,MAAA,KAAA,MAAWA,OAAAA,IAAU,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,QAAA,MAAM,YAAY,WAAA,CAAY,GAAA,CAAIA,OAAM,CAAA,wBAAS,GAAA,EAAI;AAErD,QAAA,KAAA,MAAW,QAAA,IAAY,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,EAAG;AAC1C,UAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AACtD,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,4BAAA,CAA6B,QAAQ,CAAA,EAAA,EAAK;AAC/D,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,CAAA,kBAAG,IAAI,KAAK,CAAA;AAAA,IACtC;AAKA,IAAA,MAAM,CAAA,GAAI,KAAK,4BAAA,CAA6B,MAAA;AAC5C,IAAA,MAAM,OAAA,GAAsB,MAAM,IAAA,CAAK,EAAE,QAAQ,CAAA,EAAE,EAAG,MAAM,EAAE,CAAA;AAC9D,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAoB;AACzC,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,KAAA,IAAS,MAAA,GAAS,CAAA,EAAG,MAAA,GAAS,CAAA,EAAG,MAAA,EAAA,EAAU;AACvC,MAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,IAAI,MAAM,CAAA,wBAAS,GAAA,EAAI;AACnD,MAAA,QAAA,CAAS,GAAA,CAAI,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA;AACjC,MAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG,KAAA,CAAM,KAAK,MAAM,CAAA;AACzC,MAAA,KAAA,MAAW,MAAA,IAAU,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA,EAAG;AACtC,QAAA,OAAA,CAAQ,MAAM,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAAA,MAC/B;AAAA,IACJ;AAGA,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAO,CAAA;AAEtD,MAAA,KAAA,MAAW,QAAA,IAAY,OAAA,CAAQ,OAAO,CAAA,EAAG;AAErC,QAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,QAAQ,CAAA;AACxD,QAAA,iBAAA,CAAkB,IAAI,OAAO,CAAA;AAG7B,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;AAAA;AAAA,EAOO,kBAAkBA,OAAAA,EAAiB;AACtC,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAIA,OAAM,CAAA;AAE5C,IAAA,IAAI,aAAa,MAAA,EAAW;AAE5B,IAAA,OAAO,IAAA,CAAK,6BAA6B,QAAQ,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKO,oBAAoBA,OAAAA,EAAqC;AAC5D,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAIA,OAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,yBAAA,CACHA,SACA,eAAA,EACO;AACP,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAIA,OAAM,CAAA;AAC5C,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,yBAAyB,KAAA,EAAM;AACpC,IAAA,KAAA,MAAWA,OAAAA,IAAU,KAAK,OAAA,EAAS;AAC/B,MAAA,KAAA,MAAW,QAAA,IAAYA,QAAO,SAAA,EAAW;AACrC,QAAA,MAAM,MAAM,QAAA,CAAS,UAAA;AACrB,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;AAAA,MACJ;AACA,MAAA,MAAA,CAAO,OAAOA,OAAAA,CAAO,IAAI,CAAA,CAAE,OAAA,CAAQ,CAAAC,WAAAA,KAAc;AAC7C,QAAA,IAAA,CAAK,wBAAA,CAAyB,GAAA;AAAA,UAC1BA,WAAAA;AAAA,UACAD;AAAA,SACJ;AAAA,MACJ,CAAC,CAAA;AAAA,IACL;AAAA,EACJ;AAAA,EAEO,4BAA4BC,WAAAA,EAAoC;AACnE,IAAA,OAAO,IAAA,CAAK,wBAAA,CAAyB,GAAA,CAAIA,WAAU,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA,EAIO,YAAA,GAAe;AAClB,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAuC;AAChE,IAAA,KAAA,MAAWD,OAAAA,IAAU,KAAK,OAAA,EAAS;AAC/B,MAAA,KAAA,MAAW,QAAA,IAAYA,QAAO,SAAA,EAAW;AACrC,QAAA,YAAA,CAAa,GAAA;AAAA,UACT,QAAA,CAAS,UAAA;AAAA,UACT;AAAA,SACJ;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,CAAA;AAAA,EAC3C;AAAA,EAEO,cAAA,GAAiB;AACpB,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAA4B;AACpD,IAAA,KAAA,MAAWA,OAAAA,IAAU,KAAK,OAAA,EAAS;AAC/B,MAAA,KAAA,MAAWC,WAAAA,IAAc,MAAA,CAAO,MAAA,CAAOD,OAAAA,CAAO,IAAI,CAAA,EAAG;AACjD,QAAA,WAAA,CAAY,IAAIC,WAAoC,CAAA;AAAA,MACxD;AAAA,IACJ;AACA,IAAA,OAAO,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,EACjC;AAAA,EAEO,eACHA,WAAAA,EACoC;AACpC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAIA,WAAU,KAAK,EAAC;AAAA,EAC7C;AACJ,CAAA;;;ACvWO,IAAM,MAAN,MAIP;AAAA,EAoBI,WAAA,CACuB,SACH,OAAA,EAClB;AAFqB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAZpB;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,EACU;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,EACmD;AACnD,IAAA,IAAI,IAAA,CAAK,uBAAA,CAAwB,MAAA,KAAW,CAAA,IAAK,CAAC,KAAA,EAAO;AAGrD,MAAA,OAAO,MAAA;AAAA,IACX;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,CAAAE,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,CACH,iBAGA,OAAA,EACkC;AAClC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,UAAU,CAAA;AACvD,IAAA,MAAM,cAAc,IAAI,cAAA;AAAA,MACpB,IAAA;AAAA,MACA,IAAA,CAAK,mBAAA;AAAA,MACL,OAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,WAAA,CAAY,iBAAiB,eAAe,CAAA;AAC5C,IAAA,OAAO,WAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKO,QAAA,CACH,OACA,OAAA,EACkC;AAClC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,UAAU,CAAA;AACvD,IAAA,MAAM,cAAc,IAAI,cAAA;AAAA,MACpB,IAAA;AAAA,MACA,IAAA,CAAK,mBAAA;AAAA,MACL,OAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,WAAA,CAAY,aAAa,KAAK,CAAA;AAC9B,IAAA,OAAO,WAAA;AAAA,EACX;AACJ;;;ACpIO,IAAM,4BAAN,MAAgC;AAAA,EAAhC,WAAA,GAAA;AACH,IAAA,IAAA,CAAQ,OAAA,uBAAc,GAAA,EAA2C;AACjE,IAAA,IAAA,CAAQ,WAAA,uBAAkB,OAAA,EAA+C;AAEzE,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAAoC;AAE9D,IAAA,IAAA,CAAQ,YAAA,uBAAmB,GAAA,EAGzB;AAAA,EAAA;AAAA,EAEF,SAAA,CACIH,SACA,OAAA,EACI;AACJ,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAMA,OAAM,CAAA;AACrC,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAIA,OAAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEA,UAAU,IAAA,EAAyD;AAC/D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,cAAcA,OAAAA,EAA2D;AACrE,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAIA,OAAM,CAAA;AAAA,EACtC;AAAA,EAEA,eAAA,GAAsE;AAClE,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA,EAEA,kBAAkBC,WAAAA,EAAwD;AACtE,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,KAAK,WAAA,EAAa;AACxC,MAAA,IAAI,GAAA,KAAQA,aAAY,OAAO,IAAA;AAAA,IACnC;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEA,aAAa,IAAA,EAAoB;AAC7B,IAAA,MAAMD,OAAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAIA,OAAAA,EAAQ,IAAA,CAAK,WAAA,CAAY,MAAA,CAAOA,OAAM,CAAA;AAC1C,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,EAC5B;AAAA,EAEA,aAAA,CACIC,aACA,OAAA,EACI;AACJ,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAMA,WAAU,CAAA;AAAA,EACjD;AAAA,EAEA,cAAc,IAAA,EAAkD;AAC5D,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,EACpC;AAAA,EAEA,iBAAiB,IAAA,EAAoB;AACjC,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,IAAI,CAAA;AAAA,EAChC;AAAA,EAEA,cAAA,CACI,aACA,OAAA,EACI;AACJ,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,aAAA,EAAe,WAAW,CAAA;AAAA,EAC5D;AAAA,EAEA,eACI,aAAA,EACyD;AACzD,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,aAAa,CAAA;AAAA,EAC9C;AAAA,EAEA,kBAAkB,aAAA,EAA6B;AAC3C,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,aAAa,CAAA;AAAA,EAC1C;AAAA,EAEA,QAAA,CACI,IAAA,EACAD,OAAAA,EACA,eAAA,EACI;AACJ,IAAA,IAAA,CAAK,UAAUA,OAAAA,EAAoD,EAAE,IAAA,EAAM,MAAA,EAAQA,SAAoD,CAAA;AACvI,IAAA,KAAA,MAAW,CAAC,KAAK,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQA,OAAAA,CAAO,IAAI,CAAA,EAAG;AAClD,MAAA,IAAA,CAAK,cAAc,GAAA,EAA+B;AAAA,QAC9C,IAAA,EAAO,eAAA,GAAyD,GAAG,CAAA,IAAK,GAAA;AAAA,QACxE,UAAA,EAAY;AAAA,OACf,CAAA;AAAA,IACL;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,kBAAA,CAAmB,MAAcC,WAAAA,EAA0C;AACvE,IAAA,IAAA,CAAK,cAAcA,WAAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAAA,aAAY,CAAA;AACnD,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACtGO,IAAM,gBAAN,MAAkE;AAAA,EAGrE,aAAa,OAAA,EAAyD;AAClE,IAAA,OAAO,EAAE,UAAA,EAAY,IAAA,EAAM,OAAA,EAAQ;AAAA,EACvC;AACJ;;;ACaO,IAAM,qBAAN,MAGL;AAAA,EAKE,YACqB,YAAA,EACnB;AADmB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAAA,EAClB;AAAA,EAEI,UAAA,GAAsB;AACzB,IAAA,OAAO,KAAK,YAAA,KAAiB,MAAA;AAAA,EACjC;AAAA,EAEO,qBAAA,GAES;AACZ,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,EAChB;AAAA,EAEO,KAAA,GAAuB;AAC1B,IAAA,IAAI,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA,CAAK,YAAA;AAEnC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAA;AAAA,MACtC,KAAK,YAAA,CAAa,MAAA;AAAA,MAClB,KAAK,wBAAA;AAAyB,KAClC;AAEA,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,iBAAA,EAAkB,CAAE,QAAQ,MAAM;AACxD,MAAA,IAAI,IAAA,CAAK,iBAAiB,KAAA,EAAO;AACjC,MAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,MAAA,IAAA,CAAK,kBAAA,GAAqB,MAAA;AAC1B,MAAA,IAAA,CAAK,sBAAA,GAAyB,MAAA;AAAA,IAClC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,kBAAA,GAAqB,WAAA;AAC1B,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAEpB,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEO,MAAM,MAAA,EAAuB;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,sBAAA,EAAwB,OAAO,KAAA;AACzC,IAAA,IAAI,IAAA,CAAK,sBAAA,CAAuB,MAAA,CAAO,OAAA,EAAS,OAAO,KAAA;AAEvD,IAAA,IAAA,CAAK,sBAAA,CAAuB,MAAM,MAAM,CAAA;AACxC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,wBAAA,GAA4E;AAChF,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,OAAA;AAElC,IAAA,IAAI,SAAS,WAAA,EAAa;AACtB,MAAA,OAAO,OAAA;AAAA,IACX;AAEA,IAAA,IAAI,OAAO,oBAAoB,WAAA,EAAa;AACxC,MAAA,OAAO,WAAW,EAAC;AAAA,IACvB;AAEA,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAI,eAAA,EAAgB;AAElD,IAAA,OAAO;AAAA,MACH,GAAG,OAAA;AAAA,MACH,WAAA,EAAa,KAAK,sBAAA,CAAuB;AAAA,KAC7C;AAAA,EACJ;AACJ;;;AC/EO,IAAM,UAAA,GAAa,MACtB,IAAI,aAAA;AA4LD,IAAM,MAAA,GAAS,CAIlB,IAAA,KACyD;AACzD,EAAA,MAAM,YAIA,EAAC;AAEP,EAAA,MAAM,GAAA,GAA8D;AAAA,IAChE,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,CAACG,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,SAKJ;AAAA,MACJ;AACA,MAAA,OAAO,GAAA;AAAA,IACX,CAAA,CAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAA,EAAa,MAAA;AAAA,IACb,WAAA,EAAa,MAAA;AAAA,IACb,SAAA;AAAA,IACA,SAAS,CAAA,EAAQ;AAEb,MAAA,IACI,YAAA,IAAgB,KAChB,UAAA,IAAc,CAAA,IACd,MAAM,OAAA,CAAQ,CAAA,CAAE,UAAU,CAAA,EAC5B;AAEE,QAAA,KAAA,MAAWH,WAAAA,IAAc,EAAE,UAAA,EAAY;AACnC,UAAA,SAAA,CAAU,IAAA,CAAK;AAAA,YACX,UAAA,EAAAA,WAAAA;AAAA,YACA,UAAU,CAAA,CAAE;AAAA,WACiE,CAAA;AAAA,QACrF;AAAA,MACJ,CAAA,MAAO;AAGH,QAAA,SAAA,CAAU,IAAA;AAAA,UACN;AAAA,SAKJ;AAAA,MACJ;AACA,MAAA,OAAO,GAAA;AAAA,IACX,CAAA;AAAA,IACA,iBAAiB,CAAA,EAAQ;AACrB,MAAA,MAAM;AAAA,QACF,UAAA,EAAAA,WAAAA;AAAA,QACA,QAAA,EAAU,cAAA;AAAA,QACV,UAAA,EAAY,kBAAA;AAAA,QACZ,aAAA,EAAe,mBAAA;AAAA,QACf,OAAA,EAAS,cAAA;AAAA,QACT;AAAA,OACJ,GAAI,CAAA;AAGJ,MAAA,MAAM,eAAA,GAID,kBAAA,GACC,kBAAA,GACA,cAAA,GACA;AAAA,QACI;AAAA,UACI,QAAA,EAAU,cAAA;AAAA,UACV,aAAA,EAAe,mBAAA;AAAA,UACf,OAAA,EAAS;AAAA;AACb,UAEJ,EAAC;AAEP,MAAA,MAAM,QAAA,GAAW,CAAC,OAAA,EAAcG,KAAAA,EAAW,GAAA,KAAa;AACpD,QAAA,MAAM,cAAc,GAAA,CAAI,WAAA;AAMxB,QAAA,MAAM,cAAc,WAAA,EAAa,OAAA;AAEjC,QAAA,MAAM,mBAAmB,MAAM;AAC3B,UAAA,IAAI,CAAC,cAAA,EAAgB;AACjB,YAAA,MAAM,IAAI,KAAA;AAAA,cACN,CAAA,+EAAA;AAAA,aACJ;AAAA,UACJ;AAEA,UAAA,MAAM,GAAA,GAAM,cAAA,CAAe,OAAA,EAASA,KAAAA,EAAM,GAAG,CAAA;AAC7C,UAAA,IAAI,GAAA,IAAO,OAAQ,GAAA,CAAY,IAAA,KAAS,UAAA,EAAY;AAChD,YAAA,OAAQ,GAAA,CAAqB,IAAA;AAAA,cAAK,CAAC,MAAA,KAC/B,MAAA,CAAO,MAAA,EAAQA,OAAM,GAAG;AAAA,aAC5B;AAAA,UACJ;AACA,UAAA,OAAO,MAAA,CAAO,GAAA,EAAKA,KAAAA,EAAM,GAAG,CAAA;AAAA,QAChC,CAAA;AAEA,QAAA,IAAI,CAAC,WAAA,IAAe,CAAC,WAAA,CAAY,QAAA,EAAU;AACvC,UAAA,OAAO,gBAAA,EAAiB;AAAA,QAC5B;AAGA,QAAA,MAAM,iBAAiB,eAAA,CAAgB,IAAA;AAAA,UACnC,CAAA,MAAA,KAAU,MAAA,CAAO,QAAA,KAAa,WAAA,CAAY;AAAA,SAC9C;AAEA,QAAA,IAAI,CAAC,cAAA,EAAgB;AACjB,UAAA,OAAO,gBAAA,EAAiB;AAAA,QAC5B;AAEA,QAAA,MAAM,mBAAmB,WAAA,CAAY,YAAA;AAGrC,QAAA,MAAM,OAAA,GACF,oBAAoB,cAAA,CAAe,aAAA,GAC7B,eAAe,aAAA,CAAc,GAAA,CAAI,gBAAgB,CAAA,GACjD,MAAA;AAEV,QAAA,MAAM,gBAAA,GACF,OAAA,IAAW,cAAA,CAAe,OAAA,IAAW,cAAA;AAEzC,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACnB,UAAA,MAAM,IAAI,KAAA;AAAA,YACN,CAAA,gGAAA;AAAA,WACJ;AAAA,QACJ;AAEA,QAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,OAAA,EAASA,KAAAA,EAAM,GAAG,CAAA;AAEvD,QAAA,IACI,WAAA,IACA,OAAQ,WAAA,CAAoB,IAAA,KAAS,UAAA,EACvC;AACE,UAAA,OAAQ,WAAA,CAA6B,IAAA;AAAA,YAAK,CAAC,MAAA,KACvC,MAAA,CAAO,MAAA,EAAQA,OAAM,GAAG;AAAA,WAC5B;AAAA,QACJ;AAEA,QAAA,IAAI;AACA,UAAA,OAAO,MAAA,CAAO,WAAA,EAAaA,KAAAA,EAAM,GAAG,CAAA;AAAA,QACxC,SAAS,KAAA,EAAO;AACZ,UAAA,IACI,KAAA,YAAiB,KAAA,IACjB,KAAA,CAAM,OAAA,CAAQ,QAAA;AAAA,YACV;AAAA,WACJ,EACF;AACE,YAAA,MAAM,QAAA,GACFA,SAAQ,OAAOA,KAAAA,KAAS,WAClB,MAAA,CAAO,IAAA,CAAKA,KAAI,CAAA,GAChB,eAAA;AACV,YAAA,MAAM,IAAI,KAAA;AAAA,cACN,CAAA,uDAAA,EAA0D,OAAOA,KAAI,CAAA,aAAA,EACjE,MAAM,OAAA,CAAQ,QAAQ,CAAA,GAChB,QAAA,CAAS,KAAK,IAAI,CAAA,GAClB,QACV,CAAA,oFAAA,EACI,MAAM,OACV,CAAA;AAAA,aACJ;AAAA,UACJ;AACA,UAAA,MAAM,KAAA;AAAA,QACV;AAAA,MACJ,CAAA;AAEA,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACX,UAAA,EAAAH,WAAAA;AAAA,QACA;AAAA,OAC6E,CAAA;AAEjF,MAAA,OAAO,GAAA;AAAA,IACX;AAAA,GACJ;AAEA,EAAA,OAAO,GAAA;AACX;AAEO,IAAM,UAAU,OAAsB;AAAA,EACzC,MAAA,EAAQ,CACJ,IAAA,KACC;AACD,IAAA,OAAO,OAAqC,IAAI,CAAA;AAAA,EACpD;AACJ,CAAA;AAEO,IAAM,YAAA,GAAe,CACxB,kBAAA,KACmB;AACnB,EAAA,OAAO;AAAA,IACH,GAAI,uBAAuB,MAAA,IAAa;AAAA,MACpC;AAAA;AACJ,GACJ;AACJ;AAEO,IAAM,QAAA,GAAW,CACpB,aAAA,KACe;AACf,EAAA,OAAO;AAAA,IACH;AAAA,GACJ;AACJ;AA2CO,IAAM,qBAAA,GAAwB,CACjC,YAAA,KAC4B;AAC5B,EAAA,MAAM,QAAA,GAAW,IAAI,yBAAA,EAA0B;AAC/C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACtD,IAAA,MAAM,OAAA,GAAU,QAAA,IAAa,KAAA,IAAoB,EAAE,MAAA,IAAW,KAAA,CAAA;AAC9D,IAAA,MAAMD,OAAAA,GAAS,OAAA,GACR,KAAA,CAAiC,MAAA,GAClC,KAAA;AACN,IAAA,MAAM,WAAW,OAAA,GACT,KAAA,CAAiC,WAAA,IAAe,KAClD,EAAC;AAEP,IAAA,QAAA,CAAS,UAAUA,OAAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAAA,SAAQ,CAAA;AAC3C,IAAA,KAAA,MAAW,CAAC,KAAK,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQA,OAAAA,CAAO,IAAI,CAAA,EAAG;AAClD,MAAA,QAAA,CAAS,cAAc,GAAA,EAA+B;AAAA,QAClD,IAAA,EAAO,QAAA,CAAoC,GAAG,CAAA,IAAK,GAAA;AAAA,QACnD,UAAA,EAAY;AAAA,OACf,CAAA;AAAA,IACL;AAAA,EACJ;AACA,EAAA,OAAO,QAAA;AACX","file":"index.js","sourcesContent":["import { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\n\nexport class CNSStimulationContextStore implements ICNSStimulationContextStore {\n // Lazily allocated: most stimulations never touch neuron context, so we\n // avoid allocating the backing Map until something is actually stored.\n private ctx?: Map<object, unknown>;\n\n constructor(ctx?: Map<object, unknown>) {\n this.ctx = ctx;\n }\n\n get(key: object): unknown {\n return this.ctx?.get(key);\n }\n\n set(key: object, value: unknown): void {\n (this.ctx ??= new Map()).set(key, value);\n }\n\n getAll(): Map<object, unknown> {\n return this.ctx ? new Map(this.ctx) : new Map();\n }\n\n setAll(values: Map<object, unknown>): void {\n const ctx = (this.ctx ??= new Map());\n ctx.clear();\n for (const [key, value] of values) ctx.set(key, value);\n }\n\n delete(key: object): void {\n this.ctx?.delete(key);\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 { 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';\nimport { TCNSStimulationResponse } from './types/TCNSStimulationResponse';\nimport { CNSCollateral } from './CNSCollateral';\nimport { TNCNeuronResponseReturn } from './types/TCNSNeuronResponseReturn';\nimport { TCNSAxon } from './types/TCNSAxon';\n\n/**\n * Internal, non-enumerable cache of the resolved dendrite on activation tasks we\n * create ourselves. Lets executeActivationTask skip the subscriber lookup on the\n * hot path. Tasks supplied externally via activate() simply lack it and fall\n * back to the lookup. Symbol-keyed so it never shows up in JSON/spread/keys.\n */\nconst TASK_DENDRITE = Symbol('cnstra.taskDendrite');\n\n/**\n * Per-activation context handed to a dendrite's `response`. Implemented as a\n * class so get/set/delete live once on the prototype and each activation\n * allocates a single object instead of an object plus three closures.\n *\n * NOTE: methods rely on `this`; call them as `ctx.get()` (not destructured).\n */\nclass CNSDendriteContext {\n constructor(\n public readonly stimulation: any,\n private readonly neuron: any,\n public readonly abortSignal: AbortSignal | undefined,\n public readonly cns: any\n ) {}\n get(): unknown {\n return this.stimulation.getContext().get(this.neuron);\n }\n set(value: unknown): void {\n this.stimulation.getContext().set(this.neuron, value);\n }\n delete(): void {\n this.stimulation.getContext().delete(this.neuron);\n }\n}\n\n/**\n * Response object handed to onResponse listeners. Implemented as a class so the\n * `contextValue` accessor lives once on the prototype (not re-created per\n * response) and instances share a single monomorphic hidden class. `contextValue`\n * is computed lazily: cloning the context Map is the heaviest part of the\n * response and most listeners never read it.\n */\nclass CNSStimulationResponseImpl {\n constructor(\n public readonly stimulation: CNSStimulation<any, any>,\n private readonly store: ICNSStimulationContextStore | undefined,\n public readonly inputSignal: TCNSSignal<CNSCollateral<unknown>> | undefined,\n public readonly outputSignal:\n | TCNSSignal<CNSCollateral<unknown>>\n | undefined,\n public readonly queueLength: number,\n public readonly hops: number | undefined,\n public readonly error: any\n ) {}\n\n get contextValue(): Map<object, unknown> {\n return this.store ? this.store.getAll() : new Map();\n }\n}\n\nexport class CNSStimulation<\n TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> {\n // Lazily allocated: most stimulations never touch neuron context, so we\n // avoid allocating the store object (and its Map) until something reads or\n // writes it. An externally supplied store (options.ctx) is kept eagerly.\n private ctxStore?: ICNSStimulationContextStore;\n\n // --- Inlined activation queue (formerly CNSNeuronActivationPump) ---\n // Folded into the stimulation so a single run allocates one object instead\n // of also spinning up a separate pump object + its backing array.\n // Ring buffer; the backing array is allocated lazily on first enqueue.\n private qItems?: Array<TCNSNeuronActivationTask<TNeuron> | undefined>;\n private qHead = 0;\n private qTail = 0;\n private qSize = 0;\n private qCapacity = 4;\n private activeOperations = 0;\n // Lazily allocated: only populated while an async task is in flight; purely\n // synchronous stimulations never need it.\n private activeTasks?: Set<TCNSNeuronActivationTask<TNeuron>>;\n // Re-entrancy guard for the pump loop.\n private pumping = false;\n private needsPump = false;\n\n private readonly neuronVisitMap?: Map<TNeuron, number>;\n private readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;\n private scheduledCount = 0;\n // Lazily allocated: only needed while subscriber tasks wait for an async\n // onResponse to resolve before being enqueued.\n private pendingTasks?: Set<TCNSNeuronActivationTask<TNeuron>>;\n // Lazily allocated: only allocated when a task actually fails.\n private failedTasks?: Array<TCNSNeuronActivationTaskFailure<TNeuron>>;\n // Completion is tracked eagerly via flags; the Promise is only materialized\n // if someone actually calls waitUntilComplete(). This avoids allocating a\n // Promise (the single most expensive setup cost) on every stimulate().\n private completed?: Promise<void>;\n private resolveCompleted?: () => void;\n private rejectCompleted?: (e: any) => void;\n private isCompleted = false;\n private completionError: any;\n private completionRejected = false;\n private onResponseError: Error | undefined;\n\n /**\n * The (already wrapped) response listener for this stimulation, or\n * undefined when there is neither a local nor any global listener.\n */\n private readonly onResponse?: (\n response: TCNSStimulationResponse\n ) => void | Promise<void>;\n\n /**\n * Track active SCCs: SCC index -> count of active neurons in that SCC.\n * Only allocated when context auto-cleanup is enabled.\n */\n private readonly activeSccCounts?: Map<number, number>;\n\n constructor(\n public readonly cns: CNS<TNeuron, TDendrite>,\n instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>,\n public readonly options?: TCNSStimulationOptions<TCNSStimulationResponse>,\n onResponse?: (\n response: TCNSStimulationResponse\n ) => void | Promise<void>\n ) {\n // Keep an externally supplied store eagerly; otherwise defer creation.\n this.ctxStore = options?.ctx;\n\n this.instanceNeuronQueue = instanceNeuronQueue;\n this.onResponse = onResponse;\n\n if (this.options?.maxNeuronHops) {\n this.neuronVisitMap = new Map();\n }\n\n if (this.autoCleanupContextsEnabled) {\n this.activeSccCounts = new Map();\n }\n }\n\n private pushFailedTask(\n failure: TCNSNeuronActivationTaskFailure<TNeuron>\n ): void {\n (this.failedTasks ??= []).push(failure);\n }\n\n private finalizeResolve(): void {\n this.completionRejected = false;\n this.resolveCompleted?.();\n }\n\n private finalizeReject(error: any): void {\n this.completionRejected = true;\n this.completionError = error;\n this.rejectCompleted?.(error);\n }\n\n /** Lazily-created neuron context store (see {@link ctxStore}). */\n private get ctx(): ICNSStimulationContextStore {\n return (this.ctxStore ??= new CNSStimulationContextStore());\n }\n\n // ----- Inlined activation queue / pump -----\n\n private get canStartOperation(): boolean {\n const limit = this.options?.concurrency ?? Infinity;\n return (\n this.activeOperations < limit &&\n !this.options?.abortSignal?.aborted\n );\n }\n\n private qResize(): void {\n const oldCapacity = this.qCapacity;\n const oldItems = this.qItems!;\n this.qCapacity = oldCapacity * 2;\n const newItems = new Array(this.qCapacity);\n\n let oldIndex = this.qHead;\n for (let i = 0; i < this.qSize; i++) {\n newItems[i] = oldItems[oldIndex];\n oldIndex = (oldIndex + 1) % oldCapacity;\n }\n\n this.qItems = newItems;\n this.qHead = 0;\n this.qTail = this.qSize;\n }\n\n private qDequeue(): TCNSNeuronActivationTask<TNeuron> | undefined {\n if (this.qSize === 0) return undefined;\n const items = this.qItems!;\n const task = items[this.qHead];\n items[this.qHead] = undefined; // Clear reference\n this.qHead = (this.qHead + 1) % this.qCapacity;\n this.qSize--;\n return task;\n }\n\n private qEnqueueItem(task: TCNSNeuronActivationTask<TNeuron>): void {\n if (!this.qItems) {\n this.qItems = new Array(this.qCapacity);\n } else if (this.qSize === this.qCapacity) {\n this.qResize();\n }\n this.qItems[this.qTail] = task;\n this.qTail = (this.qTail + 1) % this.qCapacity;\n this.qSize++;\n }\n\n /** Enqueue a task and drive the pump unless one is already running. */\n private qEnqueue(task: TCNSNeuronActivationTask<TNeuron>): void {\n this.qEnqueueItem(task);\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n }\n\n private qGetQueuedTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n const result: TCNSNeuronActivationTask<TNeuron>[] = [];\n if (!this.qItems) return result;\n let index = this.qHead;\n for (let i = 0; i < this.qSize; i++) {\n result.push(this.qItems[index]!);\n index = (index + 1) % this.qCapacity;\n }\n return result;\n }\n\n private pump(): void {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.qSize > 0) {\n const task = this.qDequeue()!;\n this.activeOperations++;\n\n const ret = this.executeActivationTask(task);\n\n // Async branch\n if (ret && typeof (ret as any).then === 'function') {\n // Only track tasks that are actually in flight across a tick;\n // synchronous tasks complete before anyone can observe them.\n (this.activeTasks ??= new Set()).add(task);\n (ret as Promise<void | (() => void)>).then(\n cb => {\n this.activeOperations--;\n this.activeTasks!.delete(task);\n if (typeof cb === 'function') cb();\n\n if (this.qSize > 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(task);\n if (this.qSize > 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\n continue;\n }\n\n // Sync branch (task was never added to activeTasks)\n this.activeOperations--;\n if (typeof ret === 'function') (ret as () => void)();\n }\n\n this.pumping = false;\n\n // If async completions or enqueues requested another pass, do exactly\n // one more, non-recursively.\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n\n private tryResolveCompleted(): void {\n if (this.isCompleted) return;\n const noActive = this.activeOperations === 0;\n const noPending = this.qSize + 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.qGetQueuedTasks();\n\n for (const task of [...queuedTasks]) {\n const alreadyTracked = this.failedTasks?.some(\n ft => ft.task === task\n );\n if (!alreadyTracked) {\n this.pushFailedTask({\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.finalizeReject(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 const failedCount = this.failedTasks?.length ?? 0;\n if (failedCount > 0 || this.onResponseError) {\n const error =\n this.onResponseError ||\n new Error(\n `Stimulation completed with ${failedCount} failed task(s)`\n );\n this.finalizeReject(error);\n } else {\n this.finalizeResolve();\n }\n }\n }\n\n public waitUntilComplete(): Promise<void> {\n if (this.completed) return this.completed;\n // Already completed before anyone awaited: hand back a settled promise.\n if (this.isCompleted) {\n this.completed = this.completionRejected\n ? Promise.reject(this.completionError)\n : Promise.resolve();\n return this.completed;\n }\n // Materialize the promise now and capture its resolvers for later.\n this.completed = new Promise<void>((resolve, reject) => {\n this.resolveCompleted = resolve;\n this.rejectCompleted = reject;\n });\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<TNeuron>[] {\n const queuedTasks = this.qGetQueuedTasks();\n const activeTasks = (this.activeTasks ? Array.from(this.activeTasks) : []);\n const pendingTasks = this.pendingTasks\n ? Array.from(this.pendingTasks)\n : [];\n return [...queuedTasks, ...activeTasks, ...pendingTasks];\n }\n\n /**\n * Returns all tasks that failed or were aborted\n */\n public getFailedTasks(): Array<TCNSNeuronActivationTaskFailure<TNeuron>> {\n return this.failedTasks ? [...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<TNeuron>[]\n ): void {\n for (const task of tasks) {\n this.qEnqueue(task);\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(neuron: TNeuron): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.incrementSccCount(neuron);\n }\n\n /**\n * Mark a neuron as inactive (finished processing)\n */\n protected markNeuronInactive(neuron: TNeuron): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.decrementSccCount(neuron);\n }\n\n /**\n * Increment the active count for the SCC containing this neuron\n */\n private incrementSccCount(neuron: TNeuron): void {\n const counts = this.activeSccCounts;\n if (!counts) return;\n const sccIndex = this.cns.network.getSccIndexByNeuron(neuron);\n if (sccIndex === undefined) return;\n\n const currentCount = counts.get(sccIndex) || 0;\n counts.set(sccIndex, currentCount + 1);\n }\n\n /**\n * Decrement the active count for the SCC containing this neuron\n */\n private decrementSccCount(neuron: TNeuron): void {\n const counts = this.activeSccCounts;\n if (!counts) return;\n const sccIndex = this.cns.network.getSccIndexByNeuron(neuron);\n if (sccIndex === undefined) return;\n\n const currentCount = counts.get(sccIndex) || 0;\n const nextCount = Math.max(0, currentCount - 1);\n counts.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`\n );\n }\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again\n */\n protected canNeuronBeGuaranteedDone(neuron: TNeuron): boolean {\n if (!this.autoCleanupContextsEnabled || !this.activeSccCounts)\n return false;\n return this.cns.network.canNeuronBeGuaranteedDone(\n neuron,\n this.activeSccCounts\n );\n }\n\n protected cleanupCtxIfNeeded(neuron: TNeuron): void {\n if (\n this.autoCleanupContextsEnabled &&\n this.canNeuronBeGuaranteedDone(neuron)\n ) {\n // Nothing to clean if no context was ever stored.\n this.ctxStore?.delete(neuron);\n }\n }\n\n protected createSubscriberQueueItem(\n subscriber: TCNSSubscriber<TNeuron, TDendrite>,\n inputSignal?: TCNSSignal<CNSCollateral<unknown>>\n ) {\n if (this.options?.maxNeuronHops) {\n if (\n (this.neuronVisitMap?.get(subscriber.neuron) ?? 0) >=\n this.options?.maxNeuronHops\n ) {\n throw new Error(\n `Max neuron hops reached when trying to enqueue subscriber`\n );\n } else {\n this.neuronVisitMap?.set(\n subscriber.neuron,\n (this.neuronVisitMap?.get(subscriber.neuron) ?? 0) + 1\n );\n }\n }\n\n const neuronActivationTask: TCNSNeuronActivationTask<TNeuron> = {\n neuron: subscriber.neuron,\n dendriteCollateral: subscriber.dendrite.collateral as CNSCollateral<unknown>,\n input: inputSignal,\n };\n // Cache the resolved subscriber so executeActivationTask can skip the\n // lookup (invisible to JSON/spread thanks to the Symbol key).\n (neuronActivationTask as any)[TASK_DENDRITE] = subscriber;\n return neuronActivationTask;\n }\n\n private executeActivationTask(\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ) {\n // Fast path: tasks we created carry their resolved subscriber. Tasks\n // supplied externally via activate() don't, so fall back to a lookup.\n let subscriber = (neuronActivationTask as any)[TASK_DENDRITE] as\n | TCNSSubscriber<TNeuron, TDendrite>\n | undefined;\n if (!subscriber) {\n const subscribers = this.cns.network.getSubscribers(\n neuronActivationTask.dendriteCollateral\n );\n for (let i = 0; i < subscribers.length; i++) {\n if (subscribers[i].neuron === neuronActivationTask.neuron) {\n subscriber = subscribers[i];\n break;\n }\n }\n }\n if (!subscriber) {\n // Task failed: subscriber not found\n this.pushFailedTask({\n task: neuronActivationTask,\n error: new Error(\n `Subscriber not found for activation task`\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 // Fast path: with no per-neuron concurrency limit there is nothing to\n // gate, so run inline instead of allocating a starter thunk and going\n // through the queue.\n const concurrency = (neuron as { concurrency?: number }).concurrency;\n if (concurrency === undefined || concurrency <= 0) {\n return this.runStarter(\n neuron,\n dendrite,\n inputSignal,\n neuronActivationTask\n );\n }\n return this.instanceNeuronQueue.run(neuron, () =>\n this.runStarter(\n neuron,\n dendrite,\n inputSignal,\n neuronActivationTask\n )\n );\n }\n\n private runStarter(\n neuron: TNeuron,\n dendrite: TDendrite,\n inputSignal: TCNSSignal<CNSCollateral<unknown>> | undefined,\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ): (() => void) | Promise<() => void> {\n // Mark neuron as active only when we actually start processing (after gate allows it)\n this.markNeuronActive(neuron);\n\n let response: TNCNeuronResponseReturn<TCNSAxon>;\n try {\n response = dendrite.response(\n inputSignal?.payload,\n neuron.axon,\n new CNSDendriteContext(\n this,\n neuron,\n this.options?.abortSignal,\n this.cns\n ) as any\n );\n } catch (error) {\n // Sync error occurred\n this.markNeuronInactive(neuron);\n const isAborted = this.options?.abortSignal?.aborted ?? false;\n this.pushFailedTask({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n undefined,\n error\n );\n return () => {};\n }\n\n const maxDuration = (neuron as any).maxDuration as\n | number\n | undefined;\n\n if (response instanceof Promise || maxDuration) {\n // Only materialize a Promise on the genuinely async path. The\n // sync path below never touches these, so building them here\n // would allocate a throwaway Promise on every activation.\n const asPromise: Promise<\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\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<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n | undefined\n >((resolve, reject) => {\n const t = setTimeout(() => {\n const err = new Error(\n `Neuron 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 return timedPromise.then(\n signal => {\n return () => {\n // Mark neuron as inactive when async processing completes\n this.markNeuronInactive(neuron);\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n signal as\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n | undefined\n );\n };\n },\n error => {\n return () => {\n // Mark neuron as inactive when async processing fails\n this.markNeuronInactive(neuron);\n // Track failed task\n const isAborted =\n this.options?.abortSignal?.aborted ?? false;\n this.pushFailedTask({\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 neuron,\n inputSignal as 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);\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n response as\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n | undefined\n );\n };\n }\n }\n\n protected processResponseOrResponses(\n emitter: TNeuron | undefined,\n inputSignal?: TCNSSignal<CNSCollateral<unknown>>,\n outputSignalOrSignals?:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[],\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(emitter, inputSignal, undefined, error);\n return;\n }\n\n for (const signal of outputSignalOrSignals) {\n this.processResponse(emitter, inputSignal, signal, error);\n }\n return;\n }\n\n // Handle single signal\n this.processResponse(emitter, inputSignal, outputSignalOrSignals, error);\n }\n\n protected processResponse(\n emitter: TNeuron | undefined,\n inputSignal?: TCNSSignal<CNSCollateral<unknown>>,\n outputSignal?: TCNSSignal<CNSCollateral<unknown>>,\n error?: any\n ): void {\n const collateral = outputSignal?.collateral;\n const subscribers = collateral\n ? this.cns.network.getSubscribers(collateral)\n : [];\n const onResponse = this.onResponse;\n\n // Fast path: with no response listener there is nothing to observe the\n // intermediate state, so we skip building the response object, snapshotting\n // the context (getAll allocates a Map), and tracking pending tasks.\n if (!onResponse) {\n if (collateral && !error) {\n if (emitter) this.cleanupCtxIfNeeded(emitter);\n const n = subscribers.length;\n if (n > 0) {\n const tasks: TCNSNeuronActivationTask<TNeuron>[] =\n new Array(n);\n for (let i = 0; i < n; i++) {\n tasks[i] = this.createSubscriberQueueItem(\n subscribers[i],\n outputSignal\n );\n }\n this.scheduledCount += n;\n for (let i = 0; i < n; i++) {\n this.scheduledCount--;\n this.qEnqueue(tasks[i]);\n }\n }\n }\n this.tryResolveCompleted();\n return;\n }\n\n const subscriberActivationTasks: TCNSNeuronActivationTask<TNeuron>[] =\n [];\n\n if (collateral && !error) {\n if (emitter) this.cleanupCtxIfNeeded(emitter);\n\n const pending = (this.pendingTasks ??= new Set());\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 pending.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 = onResponse(\n new CNSStimulationResponseImpl(\n this,\n this.ctxStore,\n inputSignal,\n outputSignal,\n this.qSize + this.scheduledCount,\n this.options?.maxNeuronHops && emitter\n ? this.neuronVisitMap?.get(emitter) ?? 0\n : undefined,\n error\n ) as TCNSStimulationResponse\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.qEnqueue(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.qEnqueue(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.qEnqueue(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.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n }\n\n public responseToSignal(\n signalOrSignals:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n ): void {\n // Handle array of signals\n if (Array.isArray(signalOrSignals)) {\n // For initial stimulation: signals are outputs (to find subscribers)\n // In onResponse, inputSignal will be undefined for initial stimulation\n this.processResponseOrResponses(undefined, undefined, signalOrSignals);\n return;\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, undefined, signalOrSignals);\n this.tryResolveCompleted();\n }\n}\n","export class CNSInstanceNeuronQueue<\n TNeuron extends { concurrency?: number }\n> {\n private readonly gates = new Map<\n TNeuron,\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);\n if (!gate) {\n gate = { limit, active: 0, waiters: [] };\n this.gates.set(neuron, 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)!;\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)!;\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 TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any>\n> {\n /**\n * Strongly Connected Components of the neuron graph.\n * Each component is a set of neuron objects that can reach each other.\n *\n * Computed lazily on first access: the SCC machinery is only needed for\n * `autoCleanupContexts` (off by default), so most networks never pay for it.\n */\n private _stronglyConnectedComponents: Set<TNeuron>[] = [];\n private sccBuilt = false;\n\n public get stronglyConnectedComponents(): Set<TNeuron>[] {\n this.ensureSCC();\n return this._stronglyConnectedComponents;\n }\n\n /**\n * Quick lookup: neuron -> SCC index for fast reachability checks.\n */\n private neuronToSCC = new Map<TNeuron, 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: collateral -> list of (neuron, dendrite) subscribers.\n * Built once at construction time.\n */\n private subIndex = new Map<\n CNSCollateral<unknown>,\n TCNSSubscriber<TNeuron, TDendrite>[]\n >();\n\n private parentNeuronByCollateral = new Map<CNSCollateral<unknown>, TNeuron>();\n\n constructor(private readonly neurons: TNeuron[]) {\n // Indexes are needed on the hot path (subscriber/parent lookups), so they\n // are built eagerly. SCC analysis is deferred until first use.\n this.buildIndexes();\n }\n\n /** Build the SCC analysis the first time anything needs it. */\n private ensureSCC(): void {\n if (this.sccBuilt) return;\n this.sccBuilt = true;\n this.buildSCC();\n }\n\n /**\n * Build the neuron graph where neurons are connected if one can stimulate the other.\n */\n private buildNeuronGraph(): Map<TNeuron, Set<TNeuron>> {\n const graph = new Map<TNeuron, Set<TNeuron>>();\n\n // Initialize graph\n for (const neuron of this.neurons) {\n graph.set(neuron, 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<TNeuron>();\n\n // Check what collaterals this neuron can emit\n for (const axonKey in neuron.axon) {\n const collateral = neuron.axon[axonKey];\n\n // Find which neurons listen to this collateral\n const subscribers = this.subIndex.get(\n collateral as CNSCollateral<unknown>\n );\n if (subscribers) {\n for (const { neuron: targetNeuron } of subscribers) {\n reachableNeurons.add(targetNeuron);\n }\n }\n }\n\n graph.set(neuron, 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\n // Tarjan's algorithm for SCC\n const index = new Map<TNeuron, number>();\n const lowlink = new Map<TNeuron, number>();\n const onStack = new Set<TNeuron>();\n const stack: TNeuron[] = [];\n const components: Set<TNeuron>[] = [];\n let currentIndex = 0;\n\n const strongConnect = (neuron: TNeuron) => {\n index.set(neuron, currentIndex);\n lowlink.set(neuron, currentIndex);\n currentIndex++;\n stack.push(neuron);\n onStack.add(neuron);\n\n const neighbors = graph.get(neuron) || new Set();\n for (const neighbor of Array.from(neighbors)) {\n if (!index.has(neighbor)) {\n strongConnect(neighbor);\n lowlink.set(\n neuron,\n Math.min(lowlink.get(neuron)!, lowlink.get(neighbor)!)\n );\n } else if (onStack.has(neighbor)) {\n lowlink.set(\n neuron,\n Math.min(lowlink.get(neuron)!, index.get(neighbor)!)\n );\n }\n }\n\n if (lowlink.get(neuron) === index.get(neuron)) {\n const component = new Set<TNeuron>();\n let w: TNeuron;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n component.add(w);\n } while (w !== neuron);\n components.push(component);\n }\n };\n\n // Run Tarjan's algorithm on all unvisited neurons\n for (const neuron of this.neurons) {\n if (!index.has(neuron)) {\n strongConnect(neuron);\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<TNeuron, Set<TNeuron>>): 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 neuron of Array.from(scc)) {\n const neighbors = neuronGraph.get(neuron) || new Set();\n\n for (const neighbor of Array.from(neighbors)) {\n const neighborSccIndex = this.neuronToSCC.get(neighbor);\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 // Build forward adjacency (source SCC -> target SCCs) once, instead of\n // re-deriving it per node by scanning the whole DAG. sccDag stores the\n // reverse edges (target -> sources that can reach it).\n const n = this._stronglyConnectedComponents.length;\n const forward: number[][] = Array.from({ length: n }, () => []);\n const inDegree = new Map<number, number>();\n const queue: number[] = [];\n\n for (let target = 0; target < n; target++) {\n const sources = this.sccDag.get(target) || new Set();\n inDegree.set(target, sources.size);\n if (sources.size === 0) queue.push(target);\n for (const source of Array.from(sources)) {\n forward[source].push(target);\n }\n }\n\n // Process nodes in topological order\n while (queue.length > 0) {\n const current = queue.shift()!;\n const currentAncestors = this.sccAncestors.get(current)!;\n\n for (const neighbor of forward[current]) {\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 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 * 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 getSCCSetByNeuron(neuron: TNeuron) {\n this.ensureSCC();\n const sccIndex = this.neuronToSCC.get(neuron);\n\n if (sccIndex === undefined) return;\n\n return this._stronglyConnectedComponents[sccIndex];\n }\n\n /**\n * Get the SCC index for a given neuron\n */\n public getSccIndexByNeuron(neuron: TNeuron): number | undefined {\n this.ensureSCC();\n return this.neuronToSCC.get(neuron);\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 neuron: TNeuron,\n activeSccCounts: Map<number, number>\n ): boolean {\n this.ensureSCC();\n const sccIndex = this.neuronToSCC.get(neuron);\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.parentNeuronByCollateral.clear();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n const key = dendrite.collateral as CNSCollateral<unknown>;\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 }\n Object.values(neuron.axon).forEach(collateral => {\n this.parentNeuronByCollateral.set(\n collateral as CNSCollateral<unknown>,\n neuron\n );\n });\n }\n }\n\n public getParentNeuronByCollateral(collateral: CNSCollateral<unknown>) {\n return this.parentNeuronByCollateral.get(collateral);\n }\n\n // Computed on demand (rarely used): one dendrite per collateral, last wins —\n // preserving the previous index semantics without building it every construct.\n public getDendrites() {\n const byCollateral = new Map<CNSCollateral<unknown>, TDendrite>();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n byCollateral.set(\n dendrite.collateral as CNSCollateral<unknown>,\n dendrite as TDendrite\n );\n }\n }\n return Array.from(byCollateral.values());\n }\n\n public getCollaterals() {\n const collaterals = new Set<CNSCollateral<unknown>>();\n for (const neuron of this.neurons) {\n for (const collateral of Object.values(neuron.axon)) {\n collaterals.add(collateral as CNSCollateral<unknown>);\n }\n }\n return Array.from(collaterals);\n }\n\n public getSubscribers(\n collateral: CNSCollateral<unknown>\n ): TCNSSubscriber<TNeuron, TDendrite>[] {\n return this.subIndex.get(collateral) ?? [];\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';\nimport { CNSCollateral } from './CNSCollateral';\n\nexport class CNS<\n TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> implements ICNS<TNeuron, TDendrite>\n{\n /**\n * Network graph analysis and strongly connected components.\n */\n public readonly network: CNSNetwork<TNeuron, TDendrite>;\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(\n listener: (response: TCNSStimulationResponse) => 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>) | undefined {\n if (this.globalResponseListeners.length === 0 && !local) {\n // No listener at all: skip wrapping entirely so the stimulation can\n // take its fast path and avoid building response objects per signal.\n return undefined;\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 signalOrSignals:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[],\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<TNeuron, TDendrite>(\n this,\n this.instanceNeuronQueue,\n options,\n wrapped\n );\n stimulation.responseToSignal(signalOrSignals);\n return stimulation;\n }\n\n /**\n * Start a stimulation with activation tasks directly\n */\n public activate(\n tasks: TCNSNeuronActivationTask<TNeuron>[],\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<TNeuron, TDendrite>(\n this,\n this.instanceNeuronQueue,\n options,\n wrapped\n );\n stimulation.enqueueTasks(tasks);\n return stimulation;\n }\n}\n","import { CNSCollateral } from './CNSCollateral';\nimport { CNSStimulation } from './CNSStimulation';\nimport { TCNSAxon } from './types/TCNSAxon';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport {\n TCNSCollateralPersistOptions,\n TCNSNeuronPersistOptions,\n TCNSStimulationPersistOptions,\n} from './types/TCNSPersist';\n\nexport class CNSPersistOptionsRegistry {\n private neurons = new Map<string, TCNSNeuron<unknown, TCNSAxon>>();\n private neuronNames = new WeakMap<TCNSNeuron<unknown, TCNSAxon>, string>();\n\n private collaterals = new Map<string, CNSCollateral<unknown>>();\n\n private stimulations = new Map<\n string,\n CNSStimulation<TCNSNeuron<unknown, TCNSAxon>>\n >();\n\n addNeuron(\n neuron: TCNSNeuron<unknown, TCNSAxon>,\n options: TCNSNeuronPersistOptions<TCNSNeuron<unknown, TCNSAxon>>\n ): void {\n this.neurons.set(options.name, neuron);\n this.neuronNames.set(neuron, options.name);\n }\n\n getNeuron(name: string): TCNSNeuron<unknown, TCNSAxon> | undefined {\n return this.neurons.get(name);\n }\n\n getNeuronName(neuron: TCNSNeuron<unknown, TCNSAxon>): string | undefined {\n return this.neuronNames.get(neuron);\n }\n\n getNamedNeurons(): ReadonlyMap<string, TCNSNeuron<unknown, TCNSAxon>> {\n return this.neurons;\n }\n\n getCollateralName(collateral: CNSCollateral<unknown>): string | undefined {\n for (const [name, col] of this.collaterals) {\n if (col === collateral) return name;\n }\n return undefined;\n }\n\n removeNeuron(name: string): void {\n const neuron = this.neurons.get(name);\n if (neuron) this.neuronNames.delete(neuron);\n this.neurons.delete(name);\n }\n\n addCollateral(\n collateral: CNSCollateral<unknown>,\n options: TCNSCollateralPersistOptions\n ): void {\n this.collaterals.set(options.name, collateral);\n }\n\n getCollateral(name: string): CNSCollateral<unknown> | undefined {\n return this.collaterals.get(name);\n }\n\n removeCollateral(name: string): void {\n this.collaterals.delete(name);\n }\n\n addStimulation(\n stimulation: CNSStimulation<TCNSNeuron<unknown, TCNSAxon>>,\n options: TCNSStimulationPersistOptions\n ): void {\n this.stimulations.set(options.stimulationId, stimulation);\n }\n\n getStimulation(\n stimulationId: string\n ): CNSStimulation<TCNSNeuron<unknown, TCNSAxon>> | undefined {\n return this.stimulations.get(stimulationId);\n }\n\n removeStimulation(stimulationId: string): void {\n this.stimulations.delete(stimulationId);\n }\n\n register<TAxon extends TCNSAxon>(\n name: string,\n neuron: TCNSNeuron<any, TAxon>,\n collateralNames?: { [K in keyof TAxon]?: string }\n ): this {\n this.addNeuron(neuron as unknown as TCNSNeuron<unknown, TCNSAxon>, { name, neuron: neuron as unknown as TCNSNeuron<unknown, TCNSAxon> });\n for (const [key, col] of Object.entries(neuron.axon)) {\n this.addCollateral(col as CNSCollateral<unknown>, {\n name: (collateralNames as Record<string, string> | undefined)?.[key] ?? key,\n collateral: col as CNSCollateral<unknown>,\n });\n }\n return this;\n }\n\n registerCollateral(name: string, collateral: CNSCollateral<unknown>): this {\n this.addCollateral(collateral, { name, collateral });\n return this;\n }\n}\n","import { TCNSSignal } from './types/TCNSSignal';\nimport { ICNSCollateral } from './interfaces/ICNSCollateral';\n\nexport class CNSCollateral<TPayload> implements ICNSCollateral<TPayload> {\n createSignal(): TCNSSignal<CNSCollateral<TPayload>>;\n createSignal(payload: TPayload): TCNSSignal<CNSCollateral<TPayload>>;\n createSignal(payload?: TPayload): TCNSSignal<CNSCollateral<TPayload>> {\n return { collateral: this, payload };\n }\n}\n","import type { CNS } from '../CNS';\nimport type { CNSCollateral } from '../CNSCollateral';\nimport type { CNSStimulation } from '../CNSStimulation';\nimport type { TCNSDendrite } from '../types/TCNSDendrite';\nimport type { TCNSNeuron } from '../types/TCNSNeuron';\nimport type { TCNSSignal } from '../types/TCNSSignal';\nimport type { TCNSStimulationOptions } from '../types/TCNSStimulationOptions';\nimport type { TCNSStimulationResponse } from '../types/TCNSStimulationResponse';\n\nexport type TCNSStimulationGateSignal =\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[];\n\nexport type TCNSStimulationGateOptions<\n TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> = {\n cns: CNS<TNeuron, TDendrite>;\n signal: TCNSStimulationGateSignal;\n options?: TCNSStimulationOptions<TCNSStimulationResponse>;\n};\n\nexport class CNSStimulationGate<\n TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> {\n private currentStimulation?: CNSStimulation<TNeuron, TDendrite>;\n private currentDrain?: Promise<void>;\n private currentAbortController?: AbortController;\n\n constructor(\n private readonly guardOptions: TCNSStimulationGateOptions<TNeuron, TDendrite>\n ) {}\n\n public isDraining(): boolean {\n return this.currentDrain !== undefined;\n }\n\n public getCurrentStimulation():\n | CNSStimulation<TNeuron, TDendrite>\n | undefined {\n return this.currentStimulation;\n }\n\n public drain(): Promise<void> {\n if (this.currentDrain) return this.currentDrain;\n\n const stimulation = this.guardOptions.cns.stimulate(\n this.guardOptions.signal,\n this.createStimulationOptions()\n );\n\n const drain = stimulation.waitUntilComplete().finally(() => {\n if (this.currentDrain !== drain) return;\n this.currentDrain = undefined;\n this.currentStimulation = undefined;\n this.currentAbortController = undefined;\n });\n\n this.currentStimulation = stimulation;\n this.currentDrain = drain;\n\n return drain;\n }\n\n public abort(reason?: any): boolean {\n if (!this.currentAbortController) return false;\n if (this.currentAbortController.signal.aborted) return false;\n\n this.currentAbortController.abort(reason);\n return true;\n }\n\n private createStimulationOptions(): TCNSStimulationOptions<TCNSStimulationResponse> {\n const options = this.guardOptions.options;\n\n if (options?.abortSignal) {\n return options;\n }\n\n if (typeof AbortController === 'undefined') {\n return options ?? {};\n }\n\n this.currentAbortController = new AbortController();\n\n return {\n ...options,\n abortSignal: this.currentAbortController.signal,\n };\n }\n}\n","import { CNSCollateral } from '../CNSCollateral';\nimport { CNSPersistOptionsRegistry } from '../CNSPersistOptionsRegistry';\nimport { TCNSAxon } from '../types/TCNSAxon';\nimport { TCNSDendrite } from '../types/TCNSDendrite';\nimport { TCNSLocalContextValueStore } from '../types/TCNSLocalContextValueStore';\nimport { TNCNeuronResponseReturn } from '../types/TCNSNeuronResponseReturn';\nimport { TCNSNeuron } from '../types/TCNSNeuron';\nimport { ICNS } from '../interfaces/ICNS';\nimport { TCNSModality } from '../types/TCNSModality';\nimport { TCNSAfferentPath } from '../types/TCNSAfferentPath';\nimport { TCNSStimulationOptions } from '../types/TCNSStimulationOptions';\n\nexport const collateral = <TPayload = undefined>() =>\n new CNSCollateral<TPayload>();\n\n// Helper type to extract payload union from an array of collaterals\n// Uses distributive conditional type to properly extract union, not intersection\n// Works with both arrays and tuples\ntype CollateralPayloadUnion<\n TCollaterals extends readonly CNSCollateral<unknown>[]\n> = {\n [K in keyof TCollaterals]: TCollaterals[K] extends CNSCollateral<infer P>\n ? P\n : never;\n}[number];\n\ntype InterNeuronAPI<TContextValue, TAxonType extends TCNSAxon = TCNSAxon> = {\n axon: TAxonType;\n concurrency?: number;\n maxDuration?: number;\n dendrites: TCNSDendrite<TContextValue, CNSCollateral<unknown>, TAxonType>[];\n setConcurrency: (\n n: number | undefined\n ) => InterNeuronAPI<TContextValue, TAxonType>;\n setMaxDuration: (\n ms: number | undefined\n ) => InterNeuronAPI<TContextValue, TAxonType>;\n bind: <TFollowAxon extends Record<string, CNSCollateral<unknown>>>(\n axon: TFollowAxon,\n dendrites: {\n [K in keyof TFollowAxon]:\n | TCNSDendrite<TContextValue, TFollowAxon[K], TAxonType>\n | TCNSDendrite<\n TContextValue,\n TFollowAxon[K],\n TAxonType\n >['response'];\n }\n ) => InterNeuronAPI<TContextValue, TAxonType>;\n dendrite: {\n <TSenderCollateral extends CNSCollateral<unknown>>(s: {\n collateral: TSenderCollateral;\n response: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n <\n TCollaterals extends readonly [\n CNSCollateral<unknown>,\n ...CNSCollateral<unknown>[]\n ]\n >(s: {\n collateral: TCollaterals;\n response: (\n payload: CollateralPayloadUnion<TCollaterals>,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n <TPayloadUnion>(s: {\n collateral: CNSCollateral<unknown>[];\n response: (\n payload: TPayloadUnion,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n (\n s: TCNSDendrite<TContextValue, CNSCollateral<unknown>, TAxonType>\n ): InterNeuronAPI<TContextValue, TAxonType>;\n };\n modalityDendrite: {\n <TSenderCollateral extends CNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n <TSenderCollateral extends CNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modalities: Array<{\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends CNSCollateral<\n infer P\n >\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>;\n }>;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSLocalContextValueStore<TContextValue> & {\n abortSignal?: AbortSignal;\n cns?: ICNS<any, any>;\n stimulation?: any;\n }\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType>;\n };\n};\n\n// Helper type to extract result type from output function\ntype ExtractResultFromOutput<T> = T extends (\n result: infer R,\n ...args: any[]\n) => any\n ? R\n : never;\n\n// Concrete builder\nexport const neuron = <\n TContextValue,\n TProvidedAxon extends Record<string, CNSCollateral<unknown>>\n>(\n axon: TProvidedAxon\n): InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>> => {\n const dendrites: TCNSDendrite<\n TContextValue,\n CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>\n >[] = [];\n\n const api: InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>> = {\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 CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>\n >\n );\n }\n return api;\n }) as InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>>['bind'],\n axon: axon as unknown as TCNSAxon<TProvidedAxon>,\n concurrency: undefined,\n maxDuration: undefined,\n dendrites,\n dendrite(s: any) {\n // Check if it's a shorthand format with multiple collaterals\n if (\n 'collateral' in s &&\n 'response' in s &&\n Array.isArray(s.collateral)\n ) {\n // Shorthand format with multiple collaterals - create one dendrite per collateral\n for (const collateral of s.collateral) {\n dendrites.push({\n collateral,\n response: s.response,\n } as TCNSDendrite<TContextValue, CNSCollateral<unknown>, TCNSAxon<TProvidedAxon>>);\n }\n } else {\n // Either full dendrite object or shorthand with single collateral\n // Both have the same structure, so we handle them the same way\n dendrites.push(\n s as TCNSDendrite<\n TContextValue,\n CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>\n >\n );\n }\n return api; // keep full API for chaining\n },\n modalityDendrite(s: any) {\n const {\n collateral,\n modality: singleModality,\n modalities: multipleModalities,\n afferentPaths: singleAfferentPaths,\n default: defaultHandler,\n output,\n } = s;\n\n // Normalize to array format for unified processing\n const modalityConfigs: Array<{\n modality: TCNSModality;\n afferentPaths?: Map<TCNSAfferentPath, any>;\n default?: any;\n }> = multipleModalities\n ? multipleModalities\n : singleModality\n ? [\n {\n modality: singleModality,\n afferentPaths: singleAfferentPaths,\n default: defaultHandler,\n },\n ]\n : [];\n\n const response = (payload: any, axon: any, ctx: any) => {\n const stimulation = ctx.stimulation as\n | {\n options?: TCNSStimulationOptions<any>;\n }\n | undefined;\n\n const stimOptions = stimulation?.options;\n\n const runGlobalDefault = () => {\n if (!defaultHandler) {\n throw new Error(\n `modalityDendrite: No handler found for modality and no default handler provided`\n );\n }\n\n const res = defaultHandler(payload, axon, ctx);\n if (res && typeof (res as any).then === 'function') {\n return (res as Promise<any>).then((result: any) =>\n output(result, axon, ctx)\n );\n }\n return output(res, axon, ctx);\n };\n\n if (!stimOptions || !stimOptions.modality) {\n return runGlobalDefault();\n }\n\n // Find matching modality config by object reference\n const matchingConfig = modalityConfigs.find(\n config => config.modality === stimOptions.modality\n );\n\n if (!matchingConfig) {\n return runGlobalDefault();\n }\n\n const stimAfferentPath = stimOptions.afferentPath;\n\n // Find handler by afferent path object reference\n const handler =\n stimAfferentPath && matchingConfig.afferentPaths\n ? matchingConfig.afferentPaths.get(stimAfferentPath)\n : undefined;\n\n const effectiveHandler =\n handler ?? matchingConfig.default ?? defaultHandler;\n\n if (!effectiveHandler) {\n throw new Error(\n `modalityDendrite: No handler found for afferent path in modality and no default handler provided`\n );\n }\n\n const maybeResult = effectiveHandler(payload, axon, ctx);\n\n if (\n maybeResult &&\n typeof (maybeResult as any).then === 'function'\n ) {\n return (maybeResult as Promise<any>).then((result: any) =>\n output(result, axon, ctx)\n );\n }\n\n try {\n return output(maybeResult, axon, ctx);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\n 'Cannot read properties of undefined'\n )\n ) {\n const axonKeys =\n axon && typeof axon === 'object'\n ? Object.keys(axon)\n : 'not an object';\n throw new Error(\n `modalityDendrite: axon.output is undefined. Axon type: ${typeof axon}, Axon keys: ${\n Array.isArray(axonKeys)\n ? axonKeys.join(', ')\n : axonKeys\n }. Make sure the neuron was created with the correct axon structure. Original error: ${\n error.message\n }`\n );\n }\n throw error;\n }\n };\n\n dendrites.push({\n collateral,\n response,\n } as TCNSDendrite<TContextValue, CNSCollateral<unknown>, TCNSAxon<TProvidedAxon>>);\n\n return api;\n },\n };\n\n return api;\n};\n\nexport const withCtx = <TContextValue>() => ({\n neuron: <TProvidedAxon extends Record<string, CNSCollateral<unknown>>>(\n axon: TProvidedAxon\n ) => {\n return neuron<TContextValue, TProvidedAxon>(axon);\n },\n});\n\nexport const afferentPath = (\n parentAfferentPath?: TCNSAfferentPath\n): TCNSAfferentPath => {\n return {\n ...(parentAfferentPath !== undefined && {\n parentAfferentPath,\n }),\n };\n};\n\nexport const modality = (\n afferentPaths: Record<string | number, TCNSAfferentPath>\n): TCNSModality => {\n return {\n afferentPaths,\n };\n};\n\n/**\n * Creates a CNSPersistOptionsRegistry from a plain object of named neurons.\n * All axon collaterals of each neuron are registered automatically.\n *\n * Use this for both production persistence and devtools/AI inspection —\n * the same registry serves both purposes.\n *\n * @example\n * // src/neurons/registry.ts\n * import { createPersistRegistry } from '@cnstra/core';\n * import { deckNeuron, cardNeuron } from './index';\n *\n * export const registry = createPersistRegistry({ deckNeuron, cardNeuron });\n */\ntype CNSNeuronRegistryEntry<TAxon extends TCNSAxon = TCNSAxon> = {\n neuron: TCNSNeuron<any, TAxon>;\n collaterals?: { [K in keyof TAxon]?: string };\n};\n\ntype CNSRegistryValue<N extends TCNSNeuron<any, any>> =\n | N\n | (N extends TCNSNeuron<any, infer TAxon>\n ? { neuron: N; collaterals?: { [K in keyof TAxon]?: string } }\n : never);\n\n/**\n * Creates a CNSPersistOptionsRegistry from a plain object of named neurons.\n * All axon collaterals are registered automatically.\n *\n * @example\n * // Auto names from JS identifiers:\n * export const registry = createPersistRegistry({ deckNeuron, cardNeuron });\n *\n * // Explicit neuron name:\n * export const registry = createPersistRegistry({ 'deck-neuron': deckNeuron });\n *\n * // Explicit collateral names (keys are type-checked against the neuron's axon):\n * export const registry = createPersistRegistry({\n * 'deck-neuron': { neuron: deckNeuron, collaterals: { deckCreated: 'deck-created' } }\n * });\n */\nexport const createPersistRegistry = <TMap extends Record<string, TCNSNeuron<any, any>>>(\n namedNeurons: { [K in keyof TMap]: CNSRegistryValue<TMap[K]> }\n): CNSPersistOptionsRegistry => {\n const registry = new CNSPersistOptionsRegistry();\n for (const [name, entry] of Object.entries(namedNeurons)) {\n const isEntry = 'neuron' in (entry as object) && !('axon' in (entry as object));\n const neuron = isEntry\n ? (entry as CNSNeuronRegistryEntry).neuron\n : entry as TCNSNeuron<any, any>;\n const colNames = isEntry\n ? ((entry as CNSNeuronRegistryEntry).collaterals ?? {})\n : {};\n\n registry.addNeuron(neuron, { name, neuron });\n for (const [key, col] of Object.entries(neuron.axon)) {\n registry.addCollateral(col as CNSCollateral<unknown>, {\n name: (colNames as Record<string, string>)[key] ?? key,\n collateral: col as CNSCollateral<unknown>,\n });\n }\n }\n return registry;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/CNSStimulationContextStore.ts","../src/CNSStimulation.ts","../src/CNSInstanceNeuronQueue.ts","../src/CNSNetwork.ts","../src/CNS.ts","../src/CNSPersistOptionsRegistry.ts","../src/CNSCollateral.ts","../src/utils/CNSStimulationGate.ts","../src/factory/index.ts"],"names":["neuron","collateral","error","r","axon"],"mappings":"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","file":"index.js","sourcesContent":["import { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\n\nexport class CNSStimulationContextStore implements ICNSStimulationContextStore {\n // Lazily allocated: most stimulations never touch neuron context, so we\n // avoid allocating the backing Map until something is actually stored.\n private ctx?: Map<object, unknown>;\n\n constructor(ctx?: Map<object, unknown>) {\n this.ctx = ctx;\n }\n\n get(key: object): unknown {\n return this.ctx?.get(key);\n }\n\n set(key: object, value: unknown): void {\n (this.ctx ??= new Map()).set(key, value);\n }\n\n getAll(): Map<object, unknown> {\n return this.ctx ? new Map(this.ctx) : new Map();\n }\n\n setAll(values: Map<object, unknown>): void {\n const ctx = (this.ctx ??= new Map());\n ctx.clear();\n for (const [key, value] of values) ctx.set(key, value);\n }\n\n delete(key: object): void {\n this.ctx?.delete(key);\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 { 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';\nimport { TCNSStimulationResponse } from './types/TCNSStimulationResponse';\nimport { TCNSStimulationDrain } from './types/TCNSStimulationDrain';\nimport { CNSCollateral } from './CNSCollateral';\nimport { TNCNeuronResponseReturn } from './types/TCNSNeuronResponseReturn';\nimport { TCNSAxon } from './types/TCNSAxon';\n\n/**\n * Internal, non-enumerable cache of the resolved dendrite on activation tasks we\n * create ourselves. Lets executeActivationTask skip the subscriber lookup on the\n * hot path. Tasks supplied externally via activate() simply lack it and fall\n * back to the lookup. Symbol-keyed so it never shows up in JSON/spread/keys.\n */\nconst TASK_DENDRITE = Symbol('cnstra.taskDendrite');\n\n/**\n * Per-activation context handed to a dendrite's `response`. Implemented as a\n * class so get/set/delete live once on the prototype and each activation\n * allocates a single object instead of an object plus three closures.\n *\n * NOTE: methods rely on `this`; call them as `ctx.get()` (not destructured).\n */\nclass CNSDendriteContext {\n constructor(\n public readonly stimulation: any,\n private readonly neuron: any,\n public readonly abortSignal: AbortSignal | undefined,\n public readonly cns: any\n ) {}\n // Prototype getter, not a constructor field: the per-activation allocation is\n // unchanged (still 4 fields) and you only pay a single `cns.global` read on the\n // dendrites that actually reach for it. Value getter, so `{ global }` destructuring is safe.\n get global(): unknown {\n return this.cns.global;\n }\n get(): unknown {\n return this.stimulation.getContext().get(this.neuron);\n }\n set(value: unknown): void {\n this.stimulation.getContext().set(this.neuron, value);\n }\n delete(): void {\n this.stimulation.getContext().delete(this.neuron);\n }\n}\n\n/**\n * Response object handed to onResponse listeners. Implemented as a class so the\n * `contextValue` accessor lives once on the prototype (not re-created per\n * response) and instances share a single monomorphic hidden class. `contextValue`\n * is computed lazily: cloning the context Map is the heaviest part of the\n * response and most listeners never read it.\n */\nclass CNSStimulationResponseImpl {\n constructor(\n public readonly stimulation: CNSStimulation<any, any>,\n private readonly store: ICNSStimulationContextStore | undefined,\n public readonly inputSignal: TCNSSignal<CNSCollateral<unknown>> | undefined,\n public readonly outputSignal:\n | TCNSSignal<CNSCollateral<unknown>>\n | undefined,\n public readonly queueLength: number,\n public readonly pendingActivations: number,\n public readonly activeActivations: number,\n public readonly hops: number | undefined,\n public readonly error: any\n ) {}\n\n get contextValue(): Map<object, unknown> {\n return this.store ? this.store.getAll() : new Map();\n }\n}\n\nexport class CNSStimulation<\n TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> {\n // Lazily allocated: most stimulations never touch neuron context, so we\n // avoid allocating the store object (and its Map) until something reads or\n // writes it. An externally supplied store (options.ctx) is kept eagerly.\n private ctxStore?: ICNSStimulationContextStore;\n\n // --- Inlined activation queue (formerly CNSNeuronActivationPump) ---\n // Folded into the stimulation so a single run allocates one object instead\n // of also spinning up a separate pump object + its backing array.\n // Ring buffer; the backing array is allocated lazily on first enqueue.\n private qItems?: Array<TCNSNeuronActivationTask<TNeuron> | undefined>;\n private qHead = 0;\n private qTail = 0;\n private qSize = 0;\n private qCapacity = 4;\n private activeOperations = 0;\n // Lazily allocated: only populated while an async task is in flight; purely\n // synchronous stimulations never need it.\n private activeTasks?: Set<TCNSNeuronActivationTask<TNeuron>>;\n // Re-entrancy guard for the pump loop.\n private pumping = false;\n private needsPump = false;\n // Nesting depth of the current synchronous turn. Only the outermost close\n // announces a drain - see beginTurn/endTurn.\n private turnDepth = 0;\n\n private readonly neuronVisitMap?: Map<TNeuron, number>;\n private readonly instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>;\n private scheduledCount = 0;\n // Activations belonging to signals of an in-progress array fan-out that have\n // not been handed to processResponse yet, so the task objects do not exist.\n // processResponse enqueues synchronously, so the first signal's whole subtree\n // drains before the second signal is even looked at; without this counter\n // that subtree's leaf sees an empty queue and reads as \"all work done\".\n // Counted in activations, not signals, so every public counter shares a unit.\n private reservedActivations = 0;\n // Lazily allocated: only needed while subscriber tasks wait for an async\n // onResponse to resolve before being enqueued.\n private pendingTasks?: Set<TCNSNeuronActivationTask<TNeuron>>;\n // Lazily allocated: only allocated when a task actually fails.\n private failedTasks?: Array<TCNSNeuronActivationTaskFailure<TNeuron>>;\n // Completion is tracked eagerly via flags; the Promise is only materialized\n // if someone actually calls waitUntilComplete(). This avoids allocating a\n // Promise (the single most expensive setup cost) on every stimulate().\n private completed?: Promise<void>;\n private resolveCompleted?: () => void;\n private rejectCompleted?: (e: any) => void;\n private isCompleted = false;\n private completionError: any;\n private completionRejected = false;\n private onResponseError: Error | undefined;\n\n /**\n * The (already wrapped) response listener for this stimulation, or\n * undefined when there is neither a local nor any global listener.\n */\n private readonly onResponse?: (\n response: TCNSStimulationResponse\n ) => void | Promise<void>;\n\n /**\n * The (already wrapped) drain listener, or undefined when there is neither a\n * local nor any global one. When undefined, endTurn() bails immediately, so a\n * stimulation with no drain listener pays only the turn depth counter.\n */\n private readonly onDrain?: (drain: TCNSStimulationDrain) => void;\n\n /**\n * Track active SCCs: SCC index -> count of active neurons in that SCC.\n * Only allocated when context auto-cleanup is enabled.\n */\n private readonly activeSccCounts?: Map<number, number>;\n\n constructor(\n public readonly cns: CNS<TNeuron, TDendrite>,\n instanceNeuronQueue: CNSInstanceNeuronQueue<TNeuron>,\n public readonly options?: TCNSStimulationOptions<TCNSStimulationResponse>,\n onResponse?: (\n response: TCNSStimulationResponse\n ) => void | Promise<void>,\n onDrain?: (drain: TCNSStimulationDrain) => void\n ) {\n this.onDrain = onDrain;\n // Keep an externally supplied store eagerly; otherwise defer creation.\n this.ctxStore = options?.ctx;\n\n this.instanceNeuronQueue = instanceNeuronQueue;\n this.onResponse = onResponse;\n\n if (this.options?.maxNeuronHops) {\n this.neuronVisitMap = new Map();\n }\n\n if (this.autoCleanupContextsEnabled) {\n this.activeSccCounts = new Map();\n }\n }\n\n private pushFailedTask(\n failure: TCNSNeuronActivationTaskFailure<TNeuron>\n ): void {\n (this.failedTasks ??= []).push(failure);\n }\n\n private finalizeResolve(): void {\n this.completionRejected = false;\n this.resolveCompleted?.();\n }\n\n private finalizeReject(error: any): void {\n this.completionRejected = true;\n this.completionError = error;\n this.rejectCompleted?.(error);\n }\n\n /** Lazily-created neuron context store (see {@link ctxStore}). */\n private get ctx(): ICNSStimulationContextStore {\n return (this.ctxStore ??= new CNSStimulationContextStore());\n }\n\n // ----- Inlined activation queue / pump -----\n\n private get canStartOperation(): boolean {\n const limit = this.options?.concurrency ?? Infinity;\n return (\n this.activeOperations < limit &&\n !this.options?.abortSignal?.aborted\n );\n }\n\n private qResize(): void {\n const oldCapacity = this.qCapacity;\n const oldItems = this.qItems!;\n this.qCapacity = oldCapacity * 2;\n const newItems = new Array(this.qCapacity);\n\n let oldIndex = this.qHead;\n for (let i = 0; i < this.qSize; i++) {\n newItems[i] = oldItems[oldIndex];\n oldIndex = (oldIndex + 1) % oldCapacity;\n }\n\n this.qItems = newItems;\n this.qHead = 0;\n this.qTail = this.qSize;\n }\n\n private qDequeue(): TCNSNeuronActivationTask<TNeuron> | undefined {\n if (this.qSize === 0) return undefined;\n const items = this.qItems!;\n const task = items[this.qHead];\n items[this.qHead] = undefined; // Clear reference\n this.qHead = (this.qHead + 1) % this.qCapacity;\n this.qSize--;\n return task;\n }\n\n private qEnqueueItem(task: TCNSNeuronActivationTask<TNeuron>): void {\n if (!this.qItems) {\n this.qItems = new Array(this.qCapacity);\n } else if (this.qSize === this.qCapacity) {\n this.qResize();\n }\n this.qItems[this.qTail] = task;\n this.qTail = (this.qTail + 1) % this.qCapacity;\n this.qSize++;\n }\n\n /** Enqueue a task and drive the pump unless one is already running. */\n private qEnqueue(task: TCNSNeuronActivationTask<TNeuron>): void {\n this.qEnqueueItem(task);\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n }\n\n private qGetQueuedTasks(): TCNSNeuronActivationTask<TNeuron>[] {\n const result: TCNSNeuronActivationTask<TNeuron>[] = [];\n if (!this.qItems) return result;\n let index = this.qHead;\n for (let i = 0; i < this.qSize; i++) {\n result.push(this.qItems[index]!);\n index = (index + 1) % this.qCapacity;\n }\n return result;\n }\n\n private pump(): void {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.qSize > 0) {\n const task = this.qDequeue()!;\n this.activeOperations++;\n\n const ret = this.executeActivationTask(task);\n\n // Async branch\n if (ret && typeof (ret as any).then === 'function') {\n // Only track tasks that are actually in flight across a tick;\n // synchronous tasks complete before anyone can observe them.\n (this.activeTasks ??= new Set()).add(task);\n (ret as Promise<void | (() => void)>).then(\n cb => {\n this.activeOperations--;\n this.activeTasks!.delete(task);\n // One turn spans the callback and the follow-up pump:\n // cb() itself enqueues and pumps, so without this the\n // drain would be announced twice for one batch.\n this.beginTurn();\n try {\n if (typeof cb === 'function') cb();\n\n if (this.qSize > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n } finally {\n this.endTurn();\n }\n },\n err => {\n this.activeOperations--;\n this.activeTasks!.delete(task);\n this.beginTurn();\n try {\n if (this.qSize > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n } finally {\n this.endTurn();\n }\n throw err; // let it crash \"honestly\"\n }\n );\n // Do not break: if concurrency allows, start additional items\n continue;\n }\n\n // Sync branch (task was never added to activeTasks)\n this.activeOperations--;\n if (typeof ret === 'function') (ret as () => void)();\n }\n\n this.pumping = false;\n\n // If async completions or enqueues requested another pass, do exactly\n // one more, non-recursively.\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n\n /**\n * Open a synchronous turn. Turns nest: a drain is announced only when the\n * outermost one closes, so an enqueue that happens while the pump is already\n * running does not produce its own boundary.\n */\n private beginTurn(): void {\n this.turnDepth++;\n }\n\n /**\n * Close a synchronous turn and, if it was the outermost and nothing more can\n * run without yielding to the event loop, announce the drain.\n *\n * This is the only place the synchronous frontier is observable. A response\n * cannot serve the purpose: responses are emitted when an activation\n * *finishes*, but a turn just as often ends when one *starts* and returns a\n * promise - at which point there is nothing left to emit a response from.\n */\n private endTurn(): void {\n if (--this.turnDepth > 0) return;\n const onDrain = this.onDrain;\n if (!onDrain) return;\n // Still mid-pump, or work is runnable right now: not a boundary.\n if (this.pumping) return;\n if (this.qSize > 0 && this.canStartOperation) return;\n // Hold the turn open across the callback so that a stimulate()/\n // enqueueTasks() call from inside it cannot recurse into another drain.\n this.turnDepth++;\n try {\n onDrain({\n stimulation: this,\n queueLength: this.pendingActivations + this.activeOperations,\n pendingActivations: this.pendingActivations,\n activeActivations: this.activeOperations,\n } as TCNSStimulationDrain);\n } finally {\n this.turnDepth--;\n }\n }\n\n /**\n * Activations that exist (or are reserved) but whose dendrite body has not\n * been invoked yet: sitting in the ring buffer, created and held in\n * pendingTasks, or reserved by an array fan-out mid-dispatch. Subscribers\n * parked behind an async onResponse land here too - their body has not run.\n */\n private get pendingActivations(): number {\n return this.qSize + this.scheduledCount + this.reservedActivations;\n }\n\n private tryResolveCompleted(): void {\n if (this.isCompleted) return;\n const noActive = this.activeOperations === 0;\n const noPending = this.pendingActivations === 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.qGetQueuedTasks();\n\n for (const task of [...queuedTasks]) {\n const alreadyTracked = this.failedTasks?.some(\n ft => ft.task === task\n );\n if (!alreadyTracked) {\n this.pushFailedTask({\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.finalizeReject(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 const failedCount = this.failedTasks?.length ?? 0;\n if (failedCount > 0 || this.onResponseError) {\n const error =\n this.onResponseError ||\n new Error(\n `Stimulation completed with ${failedCount} failed task(s)`\n );\n this.finalizeReject(error);\n } else {\n this.finalizeResolve();\n }\n }\n }\n\n public waitUntilComplete(): Promise<void> {\n if (this.completed) return this.completed;\n // Already completed before anyone awaited: hand back a settled promise.\n if (this.isCompleted) {\n this.completed = this.completionRejected\n ? Promise.reject(this.completionError)\n : Promise.resolve();\n return this.completed;\n }\n // Materialize the promise now and capture its resolvers for later.\n this.completed = new Promise<void>((resolve, reject) => {\n this.resolveCompleted = resolve;\n this.rejectCompleted = reject;\n });\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<TNeuron>[] {\n const queuedTasks = this.qGetQueuedTasks();\n const activeTasks = (this.activeTasks ? Array.from(this.activeTasks) : []);\n const pendingTasks = this.pendingTasks\n ? Array.from(this.pendingTasks)\n : [];\n return [...queuedTasks, ...activeTasks, ...pendingTasks];\n }\n\n /**\n * Returns all tasks that failed or were aborted\n */\n public getFailedTasks(): Array<TCNSNeuronActivationTaskFailure<TNeuron>> {\n return this.failedTasks ? [...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<TNeuron>[]\n ): void {\n this.beginTurn();\n try {\n for (const task of tasks) {\n this.qEnqueue(task);\n }\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\n }\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(neuron: TNeuron): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.incrementSccCount(neuron);\n }\n\n /**\n * Mark a neuron as inactive (finished processing)\n */\n protected markNeuronInactive(neuron: TNeuron): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.decrementSccCount(neuron);\n }\n\n /**\n * Increment the active count for the SCC containing this neuron\n */\n private incrementSccCount(neuron: TNeuron): void {\n const counts = this.activeSccCounts;\n if (!counts) return;\n const sccIndex = this.cns.network.getSccIndexByNeuron(neuron);\n if (sccIndex === undefined) return;\n\n const currentCount = counts.get(sccIndex) || 0;\n counts.set(sccIndex, currentCount + 1);\n }\n\n /**\n * Decrement the active count for the SCC containing this neuron\n */\n private decrementSccCount(neuron: TNeuron): void {\n const counts = this.activeSccCounts;\n if (!counts) return;\n const sccIndex = this.cns.network.getSccIndexByNeuron(neuron);\n if (sccIndex === undefined) return;\n\n const currentCount = counts.get(sccIndex) || 0;\n const nextCount = Math.max(0, currentCount - 1);\n counts.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`\n );\n }\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again\n */\n protected canNeuronBeGuaranteedDone(neuron: TNeuron): boolean {\n if (!this.autoCleanupContextsEnabled || !this.activeSccCounts)\n return false;\n return this.cns.network.canNeuronBeGuaranteedDone(\n neuron,\n this.activeSccCounts\n );\n }\n\n protected cleanupCtxIfNeeded(neuron: TNeuron): void {\n if (\n this.autoCleanupContextsEnabled &&\n this.canNeuronBeGuaranteedDone(neuron)\n ) {\n // Nothing to clean if no context was ever stored.\n this.ctxStore?.delete(neuron);\n }\n }\n\n protected createSubscriberQueueItem(\n subscriber: TCNSSubscriber<TNeuron, TDendrite>,\n inputSignal?: TCNSSignal<CNSCollateral<unknown>>\n ) {\n if (this.options?.maxNeuronHops) {\n if (\n (this.neuronVisitMap?.get(subscriber.neuron) ?? 0) >=\n this.options?.maxNeuronHops\n ) {\n throw new Error(\n `Max neuron hops reached when trying to enqueue subscriber`\n );\n } else {\n this.neuronVisitMap?.set(\n subscriber.neuron,\n (this.neuronVisitMap?.get(subscriber.neuron) ?? 0) + 1\n );\n }\n }\n\n const neuronActivationTask: TCNSNeuronActivationTask<TNeuron> = {\n neuron: subscriber.neuron,\n dendriteCollateral: subscriber.dendrite.collateral as CNSCollateral<unknown>,\n input: inputSignal,\n };\n // Cache the resolved subscriber so executeActivationTask can skip the\n // lookup (invisible to JSON/spread thanks to the Symbol key).\n (neuronActivationTask as any)[TASK_DENDRITE] = subscriber;\n return neuronActivationTask;\n }\n\n private executeActivationTask(\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ) {\n // Fast path: tasks we created carry their resolved subscriber. Tasks\n // supplied externally via activate() don't, so fall back to a lookup.\n let subscriber = (neuronActivationTask as any)[TASK_DENDRITE] as\n | TCNSSubscriber<TNeuron, TDendrite>\n | undefined;\n if (!subscriber) {\n const subscribers = this.cns.network.getSubscribers(\n neuronActivationTask.dendriteCollateral\n );\n for (let i = 0; i < subscribers.length; i++) {\n if (subscribers[i].neuron === neuronActivationTask.neuron) {\n subscriber = subscribers[i];\n break;\n }\n }\n }\n if (!subscriber) {\n // Task failed: subscriber not found\n const error = new Error(`Subscriber not found for activation task`);\n this.pushFailedTask({\n task: neuronActivationTask,\n error,\n aborted: false,\n });\n // Report it like every other failure. Skipping this left a lookup\n // failure invisible to listeners, so one in the tail ended the\n // stimulation without a final response and queueLength never hit 0.\n // Reported from the thunk, not inline: pump only decrements\n // activeOperations before invoking what we return.\n return () => {\n this.processResponseOrResponses(\n undefined,\n neuronActivationTask.input,\n undefined,\n error\n );\n };\n }\n\n const neuron = subscriber.neuron;\n const dendrite = subscriber.dendrite as TDendrite;\n\n const inputSignal = neuronActivationTask.input;\n\n // Fast path: with no per-neuron concurrency limit there is nothing to\n // gate, so run inline instead of allocating a starter thunk and going\n // through the queue.\n const concurrency = (neuron as { concurrency?: number }).concurrency;\n if (concurrency === undefined || concurrency <= 0) {\n return this.runStarter(\n neuron,\n dendrite,\n inputSignal,\n neuronActivationTask\n );\n }\n return this.instanceNeuronQueue.run(neuron, () =>\n this.runStarter(\n neuron,\n dendrite,\n inputSignal,\n neuronActivationTask\n )\n );\n }\n\n private runStarter(\n neuron: TNeuron,\n dendrite: TDendrite,\n inputSignal: TCNSSignal<CNSCollateral<unknown>> | undefined,\n neuronActivationTask: TCNSNeuronActivationTask<TNeuron>\n ): (() => void) | Promise<() => void> {\n // Mark neuron as active only when we actually start processing (after gate allows it)\n this.markNeuronActive(neuron);\n\n let response: TNCNeuronResponseReturn<TCNSAxon>;\n try {\n response = dendrite.response(\n inputSignal?.payload,\n neuron.axon,\n new CNSDendriteContext(\n this,\n neuron,\n this.options?.abortSignal,\n this.cns\n ) as any\n );\n } catch (error) {\n // Sync error occurred\n this.markNeuronInactive(neuron);\n const isAborted = this.options?.abortSignal?.aborted ?? false;\n this.pushFailedTask({\n task: neuronActivationTask,\n error:\n error instanceof Error\n ? error\n : new Error(String(error)),\n aborted: isAborted,\n });\n // Deferred to the thunk so the response is built after pump has\n // decremented activeOperations for this task - otherwise the error\n // response reports one in-flight operation too many.\n return () => {\n this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n undefined,\n error\n );\n };\n }\n\n const maxDuration = (neuron as any).maxDuration as\n | number\n | undefined;\n\n if (response instanceof Promise || maxDuration) {\n // Only materialize a Promise on the genuinely async path. The\n // sync path below never touches these, so building them here\n // would allocate a throwaway Promise on every activation.\n const asPromise: Promise<\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\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<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n | undefined\n >((resolve, reject) => {\n const t = setTimeout(() => {\n const err = new Error(\n `Neuron 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 return timedPromise.then(\n signal => {\n return () => {\n // Mark neuron as inactive when async processing completes\n this.markNeuronInactive(neuron);\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n signal as\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n | undefined\n );\n };\n },\n error => {\n return () => {\n // Mark neuron as inactive when async processing fails\n this.markNeuronInactive(neuron);\n // Track failed task\n const isAborted =\n this.options?.abortSignal?.aborted ?? false;\n this.pushFailedTask({\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 neuron,\n inputSignal as 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);\n return this.processResponseOrResponses(\n neuron,\n inputSignal as any,\n response as\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n | undefined\n );\n };\n }\n }\n\n protected processResponseOrResponses(\n emitter: TNeuron | undefined,\n inputSignal?: TCNSSignal<CNSCollateral<unknown>>,\n outputSignalOrSignals?:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[],\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(emitter, inputSignal, undefined, error);\n return;\n }\n\n // Reserve the whole fan-out before dispatching any of it. Counted in\n // activations rather than signals, so pre-resolve each signal's\n // subscriber count - getSubscribers is a single map lookup. On the\n // error path processResponse schedules nothing, so nothing is reserved.\n let perSignal: number[] | undefined;\n if (!error) {\n perSignal = new Array<number>(outputSignalOrSignals.length);\n let reserved = 0;\n for (let i = 0; i < outputSignalOrSignals.length; i++) {\n const c = outputSignalOrSignals[i]?.collateral;\n const n = c\n ? this.cns.network.getSubscribers(c).length\n : 0;\n perSignal[i] = n;\n reserved += n;\n }\n this.reservedActivations += reserved;\n }\n // The increment/decrement pair is balanced per level, so a nested\n // fan-out inside signal[0]'s subtree composes correctly.\n for (let i = 0; i < outputSignalOrSignals.length; i++) {\n if (perSignal) this.reservedActivations -= perSignal[i];\n this.processResponse(\n emitter,\n inputSignal,\n outputSignalOrSignals[i],\n error\n );\n }\n return;\n }\n\n // Handle single signal\n this.processResponse(emitter, inputSignal, outputSignalOrSignals, error);\n }\n\n protected processResponse(\n emitter: TNeuron | undefined,\n inputSignal?: TCNSSignal<CNSCollateral<unknown>>,\n outputSignal?: TCNSSignal<CNSCollateral<unknown>>,\n error?: any\n ): void {\n const collateral = outputSignal?.collateral;\n const subscribers = collateral\n ? this.cns.network.getSubscribers(collateral)\n : [];\n const onResponse = this.onResponse;\n\n // Fast path: with no response listener there is nothing to observe the\n // intermediate state, so we skip building the response object, snapshotting\n // the context (getAll allocates a Map), and tracking pending tasks.\n if (!onResponse) {\n if (collateral && !error) {\n if (emitter) this.cleanupCtxIfNeeded(emitter);\n const n = subscribers.length;\n if (n > 0) {\n const tasks: TCNSNeuronActivationTask<TNeuron>[] =\n new Array(n);\n for (let i = 0; i < n; i++) {\n tasks[i] = this.createSubscriberQueueItem(\n subscribers[i],\n outputSignal\n );\n }\n this.scheduledCount += n;\n for (let i = 0; i < n; i++) {\n this.scheduledCount--;\n this.qEnqueue(tasks[i]);\n }\n }\n }\n this.tryResolveCompleted();\n return;\n }\n\n const subscriberActivationTasks: TCNSNeuronActivationTask<TNeuron>[] =\n [];\n\n if (collateral && !error) {\n if (emitter) this.cleanupCtxIfNeeded(emitter);\n\n const pending = (this.pendingTasks ??= new Set());\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 pending.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 = onResponse(\n new CNSStimulationResponseImpl(\n this,\n this.ctxStore,\n inputSignal,\n outputSignal,\n this.pendingActivations + this.activeOperations,\n this.pendingActivations,\n this.activeOperations,\n this.options?.maxNeuronHops && emitter\n ? this.neuronVisitMap?.get(emitter) ?? 0\n : undefined,\n error\n ) as TCNSStimulationResponse\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.qEnqueue(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 // These tasks stay in scheduledCount until the listener settles, so\n // they keep reading as pending activations - correctly: they exist,\n // and their dendrite body has not been invoked.\n (maybePromise as Promise<void>).then(\n () => {\n // Resuming from a settled listener starts a fresh turn, the\n // same as resuming from a settled neuron body.\n this.beginTurn();\n try {\n for (\n let i = 0;\n i < subscriberActivationTasks.length;\n i++\n ) {\n this.scheduledCount--;\n this.pendingTasks?.delete(\n subscriberActivationTasks[i]\n );\n this.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\n }\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 this.beginTurn();\n try {\n // Still enqueue subscribers and continue processing\n for (\n let i = 0;\n i < subscriberActivationTasks.length;\n i++\n ) {\n this.scheduledCount--;\n this.pendingTasks?.delete(\n subscriberActivationTasks[i]\n );\n this.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\n }\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.qEnqueue(subscriberActivationTasks[i]);\n }\n this.tryResolveCompleted();\n }\n\n public responseToSignal(\n signalOrSignals:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[]\n ): void {\n // The initial dispatch is a turn: everything reachable synchronously from\n // this signal runs before stimulate() returns, and the drain that follows\n // is the first batch boundary.\n this.beginTurn();\n try {\n // Handle array of signals\n if (Array.isArray(signalOrSignals)) {\n // For initial stimulation: signals are outputs (to find subscribers)\n // In onResponse, inputSignal will be undefined for initial stimulation\n this.processResponseOrResponses(\n undefined,\n undefined,\n signalOrSignals\n );\n return;\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, undefined, signalOrSignals);\n this.tryResolveCompleted();\n } finally {\n this.endTurn();\n }\n }\n}\n","export class CNSInstanceNeuronQueue<\n TNeuron extends { concurrency?: number }\n> {\n private readonly gates = new Map<\n TNeuron,\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);\n if (!gate) {\n gate = { limit, active: 0, waiters: [] };\n this.gates.set(neuron, 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)!;\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)!;\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 TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any>\n> {\n /**\n * Strongly Connected Components of the neuron graph.\n * Each component is a set of neuron objects that can reach each other.\n *\n * Computed lazily on first access: the SCC machinery is only needed for\n * `autoCleanupContexts` (off by default), so most networks never pay for it.\n */\n private _stronglyConnectedComponents: Set<TNeuron>[] = [];\n private sccBuilt = false;\n\n public get stronglyConnectedComponents(): Set<TNeuron>[] {\n this.ensureSCC();\n return this._stronglyConnectedComponents;\n }\n\n /**\n * Quick lookup: neuron -> SCC index for fast reachability checks.\n */\n private neuronToSCC = new Map<TNeuron, 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: collateral -> list of (neuron, dendrite) subscribers.\n * Built once at construction time.\n */\n private subIndex = new Map<\n CNSCollateral<unknown>,\n TCNSSubscriber<TNeuron, TDendrite>[]\n >();\n\n private parentNeuronByCollateral = new Map<CNSCollateral<unknown>, TNeuron>();\n\n constructor(private readonly neurons: TNeuron[]) {\n // Indexes are needed on the hot path (subscriber/parent lookups), so they\n // are built eagerly. SCC analysis is deferred until first use.\n this.buildIndexes();\n }\n\n /** Build the SCC analysis the first time anything needs it. */\n private ensureSCC(): void {\n if (this.sccBuilt) return;\n this.sccBuilt = true;\n this.buildSCC();\n }\n\n /**\n * Build the neuron graph where neurons are connected if one can stimulate the other.\n */\n private buildNeuronGraph(): Map<TNeuron, Set<TNeuron>> {\n const graph = new Map<TNeuron, Set<TNeuron>>();\n\n // Initialize graph\n for (const neuron of this.neurons) {\n graph.set(neuron, 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<TNeuron>();\n\n // Check what collaterals this neuron can emit\n for (const axonKey in neuron.axon) {\n const collateral = neuron.axon[axonKey];\n\n // Find which neurons listen to this collateral\n const subscribers = this.subIndex.get(\n collateral as CNSCollateral<unknown>\n );\n if (subscribers) {\n for (const { neuron: targetNeuron } of subscribers) {\n reachableNeurons.add(targetNeuron);\n }\n }\n }\n\n graph.set(neuron, 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\n // Tarjan's algorithm for SCC\n const index = new Map<TNeuron, number>();\n const lowlink = new Map<TNeuron, number>();\n const onStack = new Set<TNeuron>();\n const stack: TNeuron[] = [];\n const components: Set<TNeuron>[] = [];\n let currentIndex = 0;\n\n const strongConnect = (neuron: TNeuron) => {\n index.set(neuron, currentIndex);\n lowlink.set(neuron, currentIndex);\n currentIndex++;\n stack.push(neuron);\n onStack.add(neuron);\n\n const neighbors = graph.get(neuron) || new Set();\n for (const neighbor of Array.from(neighbors)) {\n if (!index.has(neighbor)) {\n strongConnect(neighbor);\n lowlink.set(\n neuron,\n Math.min(lowlink.get(neuron)!, lowlink.get(neighbor)!)\n );\n } else if (onStack.has(neighbor)) {\n lowlink.set(\n neuron,\n Math.min(lowlink.get(neuron)!, index.get(neighbor)!)\n );\n }\n }\n\n if (lowlink.get(neuron) === index.get(neuron)) {\n const component = new Set<TNeuron>();\n let w: TNeuron;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n component.add(w);\n } while (w !== neuron);\n components.push(component);\n }\n };\n\n // Run Tarjan's algorithm on all unvisited neurons\n for (const neuron of this.neurons) {\n if (!index.has(neuron)) {\n strongConnect(neuron);\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<TNeuron, Set<TNeuron>>): 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 neuron of Array.from(scc)) {\n const neighbors = neuronGraph.get(neuron) || new Set();\n\n for (const neighbor of Array.from(neighbors)) {\n const neighborSccIndex = this.neuronToSCC.get(neighbor);\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 // Build forward adjacency (source SCC -> target SCCs) once, instead of\n // re-deriving it per node by scanning the whole DAG. sccDag stores the\n // reverse edges (target -> sources that can reach it).\n const n = this._stronglyConnectedComponents.length;\n const forward: number[][] = Array.from({ length: n }, () => []);\n const inDegree = new Map<number, number>();\n const queue: number[] = [];\n\n for (let target = 0; target < n; target++) {\n const sources = this.sccDag.get(target) || new Set();\n inDegree.set(target, sources.size);\n if (sources.size === 0) queue.push(target);\n for (const source of Array.from(sources)) {\n forward[source].push(target);\n }\n }\n\n // Process nodes in topological order\n while (queue.length > 0) {\n const current = queue.shift()!;\n const currentAncestors = this.sccAncestors.get(current)!;\n\n for (const neighbor of forward[current]) {\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 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 * 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 getSCCSetByNeuron(neuron: TNeuron) {\n this.ensureSCC();\n const sccIndex = this.neuronToSCC.get(neuron);\n\n if (sccIndex === undefined) return;\n\n return this._stronglyConnectedComponents[sccIndex];\n }\n\n /**\n * Get the SCC index for a given neuron\n */\n public getSccIndexByNeuron(neuron: TNeuron): number | undefined {\n this.ensureSCC();\n return this.neuronToSCC.get(neuron);\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 neuron: TNeuron,\n activeSccCounts: Map<number, number>\n ): boolean {\n this.ensureSCC();\n const sccIndex = this.neuronToSCC.get(neuron);\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.parentNeuronByCollateral.clear();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n const key = dendrite.collateral as CNSCollateral<unknown>;\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 }\n Object.values(neuron.axon).forEach(collateral => {\n this.parentNeuronByCollateral.set(\n collateral as CNSCollateral<unknown>,\n neuron\n );\n });\n }\n }\n\n public getParentNeuronByCollateral(collateral: CNSCollateral<unknown>) {\n return this.parentNeuronByCollateral.get(collateral);\n }\n\n // Computed on demand (rarely used): one dendrite per collateral, last wins —\n // preserving the previous index semantics without building it every construct.\n public getDendrites() {\n const byCollateral = new Map<CNSCollateral<unknown>, TDendrite>();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n byCollateral.set(\n dendrite.collateral as CNSCollateral<unknown>,\n dendrite as TDendrite\n );\n }\n }\n return Array.from(byCollateral.values());\n }\n\n public getCollaterals() {\n const collaterals = new Set<CNSCollateral<unknown>>();\n for (const neuron of this.neurons) {\n for (const collateral of Object.values(neuron.axon)) {\n collaterals.add(collateral as CNSCollateral<unknown>);\n }\n }\n return Array.from(collaterals);\n }\n\n public getSubscribers(\n collateral: CNSCollateral<unknown>\n ): TCNSSubscriber<TNeuron, TDendrite>[] {\n return this.subIndex.get(collateral) ?? [];\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 { TCNSStimulationDrain } from './types/TCNSStimulationDrain';\nimport { TCNSNeuronActivationTask } from './types/TCNSNeuronActivationTask';\nimport { CNSNetwork } from './CNSNetwork';\nimport { ICNS } from './interfaces/ICNS';\nimport { CNSCollateral } from './CNSCollateral';\n\nexport class CNS<\n TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> implements ICNS<TNeuron, TDendrite>\n{\n /**\n * Network graph analysis and strongly connected components.\n */\n public readonly network: CNSNetwork<TNeuron, TDendrite>;\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 /**\n * Global batch-boundary listeners applied to every stimulation.\n */\n private readonly globalDrainListeners: Array<\n (d: TCNSStimulationDrain) => void\n > = [];\n\n /**\n * Shared, app/organism-wide value handed to every dendrite as `ctx.global`.\n * Stored untyped (the type is baked into neurons via `neuronFactory().withGlobal<T>()`);\n * CNS is just a passthrough carrier, so injecting it here never touches the hot path.\n */\n public readonly global?: unknown;\n\n constructor(\n protected readonly neurons: TNeuron[],\n public readonly options?: TCNSOptions,\n global?: unknown\n ) {\n this.network = new CNSNetwork(this.neurons);\n this.global = global;\n }\n\n public addResponseListener(\n listener: (response: TCNSStimulationResponse) => 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 /**\n * Register a listener called once at the end of every synchronous turn of\n * every stimulation - see {@link TCNSStimulationDrain}. This is how an\n * integration (a state manager, an in-memory database) installs a single\n * commit point for the whole organism instead of passing `onDrain` per call.\n *\n * Returns an unsubscribe function.\n */\n public addDrainListener(\n listener: (drain: TCNSStimulationDrain) => void\n ): () => void {\n this.globalDrainListeners.push(listener);\n let active = true;\n return () => {\n if (!active) return;\n active = false;\n const idx = this.globalDrainListeners.indexOf(listener);\n if (idx >= 0) this.globalDrainListeners.splice(idx, 1);\n };\n }\n\n /**\n * Fan a drain out to the local and global listeners, or return undefined when\n * there are none so the stimulation can skip the boundary check entirely.\n *\n * Listener errors are isolated: a drain is a notification, and one broken\n * flush must not stop the others or derail the stimulation that triggered it.\n */\n private wrapOnDrain(\n local?: (drain: TCNSStimulationDrain) => void\n ): ((drain: TCNSStimulationDrain) => void) | undefined {\n if (this.globalDrainListeners.length === 0 && !local) return undefined;\n return (d: TCNSStimulationDrain) => {\n if (local) {\n try {\n local(d);\n } catch (error) {\n console.error('[CNS] onDrain listener threw', error);\n }\n }\n for (let i = 0; i < this.globalDrainListeners.length; i++) {\n try {\n this.globalDrainListeners[i](d);\n } catch (error) {\n console.error('[CNS] drain listener threw', error);\n }\n }\n };\n }\n\n private wrapOnResponse<T>(\n local?: (response: T) => void | Promise<void>\n ): ((response: T) => void | Promise<void>) | undefined {\n if (this.globalResponseListeners.length === 0 && !local) {\n // No listener at all: skip wrapping entirely so the stimulation can\n // take its fast path and avoid building response objects per signal.\n return undefined;\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 signalOrSignals:\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[],\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<TNeuron, TDendrite>(\n this,\n this.instanceNeuronQueue,\n options,\n wrapped,\n this.wrapOnDrain(options?.onDrain)\n );\n stimulation.responseToSignal(signalOrSignals);\n return stimulation;\n }\n\n /**\n * Start a stimulation with activation tasks directly\n */\n public activate(\n tasks: TCNSNeuronActivationTask<TNeuron>[],\n options?: TCNSStimulationOptions<TCNSStimulationResponse>\n ): CNSStimulation<TNeuron, TDendrite> {\n const wrapped = this.wrapOnResponse(options?.onResponse);\n const stimulation = new CNSStimulation<TNeuron, TDendrite>(\n this,\n this.instanceNeuronQueue,\n options,\n wrapped,\n this.wrapOnDrain(options?.onDrain)\n );\n stimulation.enqueueTasks(tasks);\n return stimulation;\n }\n}\n","import { CNSCollateral } from './CNSCollateral';\nimport { CNSStimulation } from './CNSStimulation';\nimport { TCNSAxon } from './types/TCNSAxon';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport {\n TCNSCollateralPersistOptions,\n TCNSNeuronPersistOptions,\n TCNSStimulationPersistOptions,\n} from './types/TCNSPersist';\n\nexport class CNSPersistOptionsRegistry {\n private neurons = new Map<string, TCNSNeuron<unknown, TCNSAxon>>();\n private neuronNames = new WeakMap<TCNSNeuron<unknown, TCNSAxon>, string>();\n\n private collaterals = new Map<string, CNSCollateral<unknown>>();\n\n private stimulations = new Map<\n string,\n CNSStimulation<TCNSNeuron<unknown, TCNSAxon>>\n >();\n\n addNeuron(\n neuron: TCNSNeuron<unknown, TCNSAxon>,\n options: TCNSNeuronPersistOptions<TCNSNeuron<unknown, TCNSAxon>>\n ): void {\n this.neurons.set(options.name, neuron);\n this.neuronNames.set(neuron, options.name);\n }\n\n getNeuron(name: string): TCNSNeuron<unknown, TCNSAxon> | undefined {\n return this.neurons.get(name);\n }\n\n getNeuronName(neuron: TCNSNeuron<unknown, TCNSAxon>): string | undefined {\n return this.neuronNames.get(neuron);\n }\n\n getNamedNeurons(): ReadonlyMap<string, TCNSNeuron<unknown, TCNSAxon>> {\n return this.neurons;\n }\n\n getCollateralName(collateral: CNSCollateral<unknown>): string | undefined {\n for (const [name, col] of this.collaterals) {\n if (col === collateral) return name;\n }\n return undefined;\n }\n\n removeNeuron(name: string): void {\n const neuron = this.neurons.get(name);\n if (neuron) this.neuronNames.delete(neuron);\n this.neurons.delete(name);\n }\n\n addCollateral(\n collateral: CNSCollateral<unknown>,\n options: TCNSCollateralPersistOptions\n ): void {\n this.collaterals.set(options.name, collateral);\n }\n\n getCollateral(name: string): CNSCollateral<unknown> | undefined {\n return this.collaterals.get(name);\n }\n\n removeCollateral(name: string): void {\n this.collaterals.delete(name);\n }\n\n addStimulation(\n stimulation: CNSStimulation<TCNSNeuron<unknown, TCNSAxon>>,\n options: TCNSStimulationPersistOptions\n ): void {\n this.stimulations.set(options.stimulationId, stimulation);\n }\n\n getStimulation(\n stimulationId: string\n ): CNSStimulation<TCNSNeuron<unknown, TCNSAxon>> | undefined {\n return this.stimulations.get(stimulationId);\n }\n\n removeStimulation(stimulationId: string): void {\n this.stimulations.delete(stimulationId);\n }\n\n register<TAxon extends TCNSAxon>(\n name: string,\n neuron: TCNSNeuron<any, TAxon>,\n collateralNames?: { [K in keyof TAxon]?: string }\n ): this {\n this.addNeuron(neuron as unknown as TCNSNeuron<unknown, TCNSAxon>, { name, neuron: neuron as unknown as TCNSNeuron<unknown, TCNSAxon> });\n for (const [key, col] of Object.entries(neuron.axon)) {\n this.addCollateral(col as CNSCollateral<unknown>, {\n name: (collateralNames as Record<string, string> | undefined)?.[key] ?? key,\n collateral: col as CNSCollateral<unknown>,\n });\n }\n return this;\n }\n\n registerCollateral(name: string, collateral: CNSCollateral<unknown>): this {\n this.addCollateral(collateral, { name, collateral });\n return this;\n }\n}\n","import { TCNSSignal } from './types/TCNSSignal';\nimport { ICNSCollateral } from './interfaces/ICNSCollateral';\n\nexport class CNSCollateral<TPayload> implements ICNSCollateral<TPayload> {\n createSignal(): TCNSSignal<CNSCollateral<TPayload>>;\n createSignal(payload: TPayload): TCNSSignal<CNSCollateral<TPayload>>;\n createSignal(payload?: TPayload): TCNSSignal<CNSCollateral<TPayload>> {\n return { collateral: this, payload };\n }\n}\n","import type { CNS } from '../CNS';\nimport type { CNSCollateral } from '../CNSCollateral';\nimport type { CNSStimulation } from '../CNSStimulation';\nimport type { TCNSDendrite } from '../types/TCNSDendrite';\nimport type { TCNSNeuron } from '../types/TCNSNeuron';\nimport type { TCNSSignal } from '../types/TCNSSignal';\nimport type { TCNSStimulationOptions } from '../types/TCNSStimulationOptions';\nimport type { TCNSStimulationResponse } from '../types/TCNSStimulationResponse';\n\nexport type TCNSStimulationGateSignal =\n | TCNSSignal<CNSCollateral<unknown>>\n | TCNSSignal<CNSCollateral<unknown>>[];\n\nexport type TCNSStimulationGateOptions<\n TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> = {\n cns: CNS<TNeuron, TDendrite>;\n signal: TCNSStimulationGateSignal;\n options?: TCNSStimulationOptions<TCNSStimulationResponse>;\n};\n\nexport class CNSStimulationGate<\n TNeuron extends TCNSNeuron<any, any>,\n TDendrite extends TCNSDendrite<any, any, any> = TCNSDendrite<any, any, any>\n> {\n private currentStimulation?: CNSStimulation<TNeuron, TDendrite>;\n private currentDrain?: Promise<void>;\n private currentAbortController?: AbortController;\n\n constructor(\n private readonly guardOptions: TCNSStimulationGateOptions<TNeuron, TDendrite>\n ) {}\n\n public isDraining(): boolean {\n return this.currentDrain !== undefined;\n }\n\n public getCurrentStimulation():\n | CNSStimulation<TNeuron, TDendrite>\n | undefined {\n return this.currentStimulation;\n }\n\n public drain(): Promise<void> {\n if (this.currentDrain) return this.currentDrain;\n\n const stimulation = this.guardOptions.cns.stimulate(\n this.guardOptions.signal,\n this.createStimulationOptions()\n );\n\n const drain = stimulation.waitUntilComplete().finally(() => {\n if (this.currentDrain !== drain) return;\n this.currentDrain = undefined;\n this.currentStimulation = undefined;\n this.currentAbortController = undefined;\n });\n\n this.currentStimulation = stimulation;\n this.currentDrain = drain;\n\n return drain;\n }\n\n public abort(reason?: any): boolean {\n if (!this.currentAbortController) return false;\n if (this.currentAbortController.signal.aborted) return false;\n\n this.currentAbortController.abort(reason);\n return true;\n }\n\n private createStimulationOptions(): TCNSStimulationOptions<TCNSStimulationResponse> {\n const options = this.guardOptions.options;\n\n if (options?.abortSignal) {\n return options;\n }\n\n if (typeof AbortController === 'undefined') {\n return options ?? {};\n }\n\n this.currentAbortController = new AbortController();\n\n return {\n ...options,\n abortSignal: this.currentAbortController.signal,\n };\n }\n}\n","import { CNS } from '../CNS';\nimport { CNSCollateral } from '../CNSCollateral';\nimport { CNSPersistOptionsRegistry } from '../CNSPersistOptionsRegistry';\nimport { TCNSAxon } from '../types/TCNSAxon';\nimport { TCNSOptions } from '../types/TCNSOptions';\nimport { TCNSDendrite } from '../types/TCNSDendrite';\nimport { TCNSHandlerContext } from '../types/TCNSHandlerContext';\nimport { TNCNeuronResponseReturn } from '../types/TCNSNeuronResponseReturn';\nimport { TCNSNeuron } from '../types/TCNSNeuron';\nimport { TCNSModality } from '../types/TCNSModality';\nimport { TCNSAfferentPath } from '../types/TCNSAfferentPath';\nimport { TCNSStimulationOptions } from '../types/TCNSStimulationOptions';\n\nexport const collateral = <TPayload = undefined>() =>\n new CNSCollateral<TPayload>();\n\n// Helper type to extract payload union from an array of collaterals\n// Uses distributive conditional type to properly extract union, not intersection\n// Works with both arrays and tuples\ntype CollateralPayloadUnion<\n TCollaterals extends readonly CNSCollateral<unknown>[]\n> = {\n [K in keyof TCollaterals]: TCollaterals[K] extends CNSCollateral<infer P>\n ? P\n : never;\n}[number];\n\ntype InterNeuronAPI<\n TContextValue,\n TAxonType extends TCNSAxon = TCNSAxon,\n TGlobal = unknown\n> = {\n axon: TAxonType;\n concurrency?: number;\n maxDuration?: number;\n dendrites: TCNSDendrite<\n TContextValue,\n CNSCollateral<unknown>,\n TAxonType,\n TGlobal\n >[];\n setConcurrency: (\n n: number | undefined\n ) => InterNeuronAPI<TContextValue, TAxonType, TGlobal>;\n setMaxDuration: (\n ms: number | undefined\n ) => InterNeuronAPI<TContextValue, TAxonType, TGlobal>;\n bind: <TFollowAxon extends Record<string, CNSCollateral<unknown>>>(\n axon: TFollowAxon,\n dendrites: {\n [K in keyof TFollowAxon]:\n | TCNSDendrite<TContextValue, TFollowAxon[K], TAxonType, TGlobal>\n | TCNSDendrite<\n TContextValue,\n TFollowAxon[K],\n TAxonType,\n TGlobal\n >['response'];\n }\n ) => InterNeuronAPI<TContextValue, TAxonType, TGlobal>;\n dendrite: {\n <TSenderCollateral extends CNSCollateral<unknown>>(s: {\n collateral: TSenderCollateral;\n response: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TContextValue, TGlobal>\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType, TGlobal>;\n <\n TCollaterals extends readonly [\n CNSCollateral<unknown>,\n ...CNSCollateral<unknown>[]\n ]\n >(s: {\n collateral: TCollaterals;\n response: (\n payload: CollateralPayloadUnion<TCollaterals>,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TContextValue, TGlobal>\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType, TGlobal>;\n <TPayloadUnion>(s: {\n collateral: CNSCollateral<unknown>[];\n response: (\n payload: TPayloadUnion,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TContextValue, TGlobal>\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType, TGlobal>;\n (\n s: TCNSDendrite<\n TContextValue,\n CNSCollateral<unknown>,\n TAxonType,\n TGlobal\n >\n ): InterNeuronAPI<TContextValue, TAxonType, TGlobal>;\n };\n modalityDendrite: {\n <TSenderCollateral extends CNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TContextValue, TGlobal>\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TContextValue, TGlobal>\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TContextValue, TGlobal>\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType, TGlobal>;\n <TSenderCollateral extends CNSCollateral<unknown>, TResult>(s: {\n collateral: TSenderCollateral;\n modalities: Array<{\n modality: TCNSModality;\n afferentPaths?: Map<\n TCNSAfferentPath,\n (\n payload: TSenderCollateral extends CNSCollateral<\n infer P\n >\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TContextValue, TGlobal>\n ) => TResult | Promise<TResult>\n >;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TContextValue, TGlobal>\n ) => TResult | Promise<TResult>;\n }>;\n default?: (\n payload: TSenderCollateral extends CNSCollateral<infer P>\n ? P\n : never,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TContextValue, TGlobal>\n ) => TResult | Promise<TResult>;\n output: (\n result: TResult,\n axon: TAxonType,\n ctx: TCNSHandlerContext<TContextValue, TGlobal>\n ) => TNCNeuronResponseReturn<TAxonType>;\n }): InterNeuronAPI<TContextValue, TAxonType, TGlobal>;\n };\n};\n\n// Helper type to extract result type from output function\ntype ExtractResultFromOutput<T> = T extends (\n result: infer R,\n ...args: any[]\n) => any\n ? R\n : never;\n\n// Concrete builder\nexport const neuron = <\n TContextValue,\n TProvidedAxon extends Record<string, CNSCollateral<unknown>>,\n TGlobal = unknown\n>(\n axon: TProvidedAxon\n): InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>, TGlobal> => {\n const dendrites: TCNSDendrite<\n TContextValue,\n CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >[] = [];\n\n const api: InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>, TGlobal> = {\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 CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >\n );\n }\n return api;\n }) as InterNeuronAPI<\n TContextValue,\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >['bind'],\n axon: axon as unknown as TCNSAxon<TProvidedAxon>,\n concurrency: undefined,\n maxDuration: undefined,\n dendrites,\n dendrite(s: any) {\n // Check if it's a shorthand format with multiple collaterals\n if (\n 'collateral' in s &&\n 'response' in s &&\n Array.isArray(s.collateral)\n ) {\n // Shorthand format with multiple collaterals - create one dendrite per collateral\n for (const collateral of s.collateral) {\n dendrites.push({\n collateral,\n response: s.response,\n } as TCNSDendrite<TContextValue, CNSCollateral<unknown>, TCNSAxon<TProvidedAxon>, TGlobal>);\n }\n } else {\n // Either full dendrite object or shorthand with single collateral\n // Both have the same structure, so we handle them the same way\n dendrites.push(\n s as TCNSDendrite<\n TContextValue,\n CNSCollateral<unknown>,\n TCNSAxon<TProvidedAxon>,\n TGlobal\n >\n );\n }\n return api; // keep full API for chaining\n },\n modalityDendrite(s: any) {\n const {\n collateral,\n modality: singleModality,\n modalities: multipleModalities,\n afferentPaths: singleAfferentPaths,\n default: defaultHandler,\n output,\n } = s;\n\n // Normalize to array format for unified processing\n const modalityConfigs: Array<{\n modality: TCNSModality;\n afferentPaths?: Map<TCNSAfferentPath, any>;\n default?: any;\n }> = multipleModalities\n ? multipleModalities\n : singleModality\n ? [\n {\n modality: singleModality,\n afferentPaths: singleAfferentPaths,\n default: defaultHandler,\n },\n ]\n : [];\n\n const response = (payload: any, axon: any, ctx: any) => {\n const stimulation = ctx.stimulation as\n | {\n options?: TCNSStimulationOptions<any>;\n }\n | undefined;\n\n const stimOptions = stimulation?.options;\n\n const runGlobalDefault = () => {\n if (!defaultHandler) {\n throw new Error(\n `modalityDendrite: No handler found for modality and no default handler provided`\n );\n }\n\n const res = defaultHandler(payload, axon, ctx);\n if (res && typeof (res as any).then === 'function') {\n return (res as Promise<any>).then((result: any) =>\n output(result, axon, ctx)\n );\n }\n return output(res, axon, ctx);\n };\n\n if (!stimOptions || !stimOptions.modality) {\n return runGlobalDefault();\n }\n\n // Find matching modality config by object reference\n const matchingConfig = modalityConfigs.find(\n config => config.modality === stimOptions.modality\n );\n\n if (!matchingConfig) {\n return runGlobalDefault();\n }\n\n const stimAfferentPath = stimOptions.afferentPath;\n\n // Find handler by afferent path object reference\n const handler =\n stimAfferentPath && matchingConfig.afferentPaths\n ? matchingConfig.afferentPaths.get(stimAfferentPath)\n : undefined;\n\n const effectiveHandler =\n handler ?? matchingConfig.default ?? defaultHandler;\n\n if (!effectiveHandler) {\n throw new Error(\n `modalityDendrite: No handler found for afferent path in modality and no default handler provided`\n );\n }\n\n const maybeResult = effectiveHandler(payload, axon, ctx);\n\n if (\n maybeResult &&\n typeof (maybeResult as any).then === 'function'\n ) {\n return (maybeResult as Promise<any>).then((result: any) =>\n output(result, axon, ctx)\n );\n }\n\n try {\n return output(maybeResult, axon, ctx);\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\n 'Cannot read properties of undefined'\n )\n ) {\n const axonKeys =\n axon && typeof axon === 'object'\n ? Object.keys(axon)\n : 'not an object';\n throw new Error(\n `modalityDendrite: axon.output is undefined. Axon type: ${typeof axon}, Axon keys: ${\n Array.isArray(axonKeys)\n ? axonKeys.join(', ')\n : axonKeys\n }. Make sure the neuron was created with the correct axon structure. Original error: ${\n error.message\n }`\n );\n }\n throw error;\n }\n };\n\n dendrites.push({\n collateral,\n response,\n } as TCNSDendrite<TContextValue, CNSCollateral<unknown>, TCNSAxon<TProvidedAxon>, TGlobal>);\n\n return api;\n },\n };\n\n return api;\n};\n\n/**\n * A composable neuron factory. Each `.withX<T>()` returns a *new typed view* of\n * the same underlying builder (the layers are type-only — zero runtime cost, no\n * per-activation overhead), so you bake your ctx additions once and reuse them\n * everywhere. Layers compose in any order and never touch the handler signature.\n *\n * `TExt` is the accumulated ctx extension: each layer *intersects* its own fields\n * into it, so a base factory (`TExt = unknown`) hands neurons the plain ctx bag —\n * nothing is forced onto anyone who didn't ask for it. `withGlobal<T>()` is the\n * built-in layer; make `T` an object to carry as much as you want (store, clock,\n * logger, …) through the single runtime channel wired at `createCNS`/`new CNS`.\n *\n * @example\n * // src/neurons/factory.ts — ctx shape baked once\n * type TGlobal = { store: Store; now(): number; newId(): string };\n * export const { neuron } = neuronFactory().withGlobal<TGlobal>().withCtx<TCtx>();\n *\n * // any neuron file — plain value, reaches deps via ctx.global\n * export const taskNeuron = neuron({ taskCreated }).bind({ createTask }, {\n * createTask: ({ title }, axon, { global }) =>\n * axon.taskCreated.createSignal({ id: global.newId(), title, at: global.now() }),\n * });\n */\nexport type TNeuronFactory<TContextValue, TExt = unknown> = {\n /** Bake the per-stimulation, per-neuron context value type (`ctx.get()/set()`). */\n withCtx: <T>() => TNeuronFactory<T, TExt>;\n /** Add `{ global: T }` to ctx; the value is injected once at `createCNS`/`new CNS`. */\n withGlobal: <T>() => TNeuronFactory<TContextValue, TExt & { global: T }>;\n neuron: <TProvidedAxon extends Record<string, CNSCollateral<unknown>>>(\n axon: TProvidedAxon\n ) => InterNeuronAPI<TContextValue, TCNSAxon<TProvidedAxon>, TExt>;\n};\n\nexport const neuronFactory = <\n TContextValue = undefined,\n TExt = unknown\n>(): TNeuronFactory<TContextValue, TExt> => {\n // Single stateless object reused across every layer call: `.withX()` only\n // re-types it, so there is nothing to allocate or carry at runtime.\n const factory: TNeuronFactory<TContextValue, TExt> = {\n withCtx: () => factory as unknown as TNeuronFactory<any, TExt>,\n withGlobal: () =>\n factory as unknown as TNeuronFactory<TContextValue, any>,\n neuron: axon => neuron(axon) as any,\n };\n return factory;\n};\n\n/** Sugar: `neuronFactory().withCtx<T>()`. Still exposes `.neuron`, so existing usage is unchanged. */\nexport const withCtx = <TContextValue>(): TNeuronFactory<TContextValue> =>\n neuronFactory<TContextValue>();\n\n/** Sugar: `neuronFactory().withGlobal<T>()`. */\nexport const withGlobal = <T>(): TNeuronFactory<undefined, { global: T }> =>\n neuronFactory<undefined, { global: T }>();\n\nexport const afferentPath = (\n parentAfferentPath?: TCNSAfferentPath\n): TCNSAfferentPath => {\n return {\n ...(parentAfferentPath !== undefined && {\n parentAfferentPath,\n }),\n };\n};\n\nexport const modality = (\n afferentPaths: Record<string | number, TCNSAfferentPath>\n): TCNSModality => {\n return {\n afferentPaths,\n };\n};\n\n/**\n * Creates a CNSPersistOptionsRegistry from a plain object of named neurons.\n * All axon collaterals of each neuron are registered automatically.\n *\n * Use this for both production persistence and devtools/AI inspection —\n * the same registry serves both purposes.\n *\n * @example\n * // src/neurons/registry.ts\n * import { createPersistRegistry } from '@cnstra/core';\n * import { deckNeuron, cardNeuron } from './index';\n *\n * export const registry = createPersistRegistry({ deckNeuron, cardNeuron });\n */\ntype CNSNeuronRegistryEntry<TAxon extends TCNSAxon = TCNSAxon> = {\n neuron: TCNSNeuron<any, TAxon>;\n collaterals?: { [K in keyof TAxon]?: string };\n};\n\ntype CNSRegistryValue<N extends TCNSNeuron<any, any>> =\n | N\n | (N extends TCNSNeuron<any, infer TAxon>\n ? { neuron: N; collaterals?: { [K in keyof TAxon]?: string } }\n : never);\n\n/**\n * Creates a CNSPersistOptionsRegistry from a plain object of named neurons.\n * All axon collaterals are registered automatically.\n *\n * @example\n * // Auto names from JS identifiers:\n * export const registry = createPersistRegistry({ deckNeuron, cardNeuron });\n *\n * // Explicit neuron name:\n * export const registry = createPersistRegistry({ 'deck-neuron': deckNeuron });\n *\n * // Explicit collateral names (keys are type-checked against the neuron's axon):\n * export const registry = createPersistRegistry({\n * 'deck-neuron': { neuron: deckNeuron, collaterals: { deckCreated: 'deck-created' } }\n * });\n */\nexport const createPersistRegistry = <TMap extends Record<string, TCNSNeuron<any, any>>>(\n namedNeurons: { [K in keyof TMap]: CNSRegistryValue<TMap[K]> }\n): CNSPersistOptionsRegistry => {\n const registry = new CNSPersistOptionsRegistry();\n for (const [name, entry] of Object.entries(namedNeurons)) {\n const isEntry = 'neuron' in (entry as object) && !('axon' in (entry as object));\n const neuron = isEntry\n ? (entry as CNSNeuronRegistryEntry).neuron\n : entry as TCNSNeuron<any, any>;\n const colNames = isEntry\n ? ((entry as CNSNeuronRegistryEntry).collaterals ?? {})\n : {};\n\n registry.addNeuron(neuron, { name, neuron });\n for (const [key, col] of Object.entries(neuron.axon)) {\n registry.addCollateral(col as CNSCollateral<unknown>, {\n name: (colNames as Record<string, string>)[key] ?? key,\n collateral: col as CNSCollateral<unknown>,\n });\n }\n }\n return registry;\n};\n\n/**\n * Creates a CNS and its CNSPersistOptionsRegistry from a single plain object of\n * named neurons, so the neuron set is listed exactly once.\n *\n * `cns` is the runtime engine; `registry` carries the names used by devtools,\n * mcp and persistence. Both derive from the same map, so they can never drift.\n * If you don't need naming/persistence, just use `new CNS([...])` directly —\n * this factory is purely additive.\n *\n * @example\n * const { cns, registry } = createCNS({\n * task: createTaskNeuron(store),\n * comment: createCommentNeuron(store),\n * });\n *\n * // Explicit names / collateral names work exactly like createPersistRegistry:\n * const { cns, registry } = createCNS({\n * 'task-neuron': { neuron: taskNeuron, collaterals: { taskCreated: 'task-created' } },\n * });\n *\n * // Inject the shared `global` once — it surfaces as `ctx.global` in every neuron\n * // (type it once via `neuronFactory().withGlobal<T>()`). Swappable per instance:\n * const { cns } = createCNS(map, { global: { store, now, newId } });\n */\nexport const createCNS = <\n TMap extends Record<string, TCNSNeuron<any, any>>,\n TGlobal = undefined\n>(\n namedNeurons: { [K in keyof TMap]: CNSRegistryValue<TMap[K]> },\n options?: TCNSOptions & { global?: TGlobal }\n): {\n cns: CNS<TCNSNeuron<any, any>>;\n registry: CNSPersistOptionsRegistry;\n} => {\n const neurons = Object.values(namedNeurons).map(entry =>\n entry && typeof entry === 'object' && 'neuron' in (entry as object)\n ? (entry as CNSNeuronRegistryEntry).neuron\n : (entry as TCNSNeuron<any, any>)\n );\n const cns = new CNS(neurons, options, options?.global);\n const registry = createPersistRegistry(namedNeurons);\n return { cns, registry };\n};\n"]}
|