@cnstra/core 1.2.1 → 1.3.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 +242 -557
- package/dist/CNS.d.ts +76 -0
- package/dist/CNS.d.ts.map +1 -0
- package/dist/CNSCollateral.d.ts +9 -0
- package/dist/CNSCollateral.d.ts.map +1 -0
- package/dist/CNSFunctionalQueue.d.ts +26 -0
- package/dist/CNSFunctionalQueue.d.ts.map +1 -0
- package/dist/CNSStimulation.d.ts +52 -0
- package/dist/CNSStimulation.d.ts.map +1 -0
- package/dist/CNSStimulationContextStore.d.ts +11 -0
- package/dist/CNSStimulationContextStore.d.ts.map +1 -0
- package/dist/factory/index.d.ts +16 -0
- package/dist/factory/index.d.ts.map +1 -0
- package/dist/index.cjs +490 -214
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +490 -214
- package/dist/index.js.map +1 -1
- package/dist/interfaces/ICNS.d.ts +14 -0
- package/dist/interfaces/ICNS.d.ts.map +1 -0
- package/dist/interfaces/ICNSCollateral.d.ts +6 -0
- package/dist/interfaces/ICNSCollateral.d.ts.map +1 -0
- package/dist/interfaces/ICNSStimulationContextStore.d.ts +8 -0
- package/dist/interfaces/ICNSStimulationContextStore.d.ts.map +1 -0
- package/dist/types/TCNSAxon.d.ts +3 -0
- package/dist/types/TCNSAxon.d.ts.map +1 -0
- package/dist/types/TCNSDendrite.d.ts +9 -0
- package/dist/types/TCNSDendrite.d.ts.map +1 -0
- package/dist/types/TCNSLocalContextValueStore.d.ts +5 -0
- package/dist/types/TCNSLocalContextValueStore.d.ts.map +1 -0
- package/dist/types/TCNSNeuron.d.ts +8 -0
- package/dist/types/TCNSNeuron.d.ts.map +1 -0
- package/dist/types/TCNSNeuronResponseReturn.d.ts +3 -0
- package/dist/types/TCNSNeuronResponseReturn.d.ts.map +1 -0
- package/dist/types/TCNSOptions.d.ts +11 -0
- package/dist/types/TCNSOptions.d.ts.map +1 -0
- package/dist/types/TCNSSignal.d.ts +6 -0
- package/dist/types/TCNSSignal.d.ts.map +1 -0
- package/dist/types/TCNSStimulationOptions.d.ts +13 -0
- package/dist/types/TCNSStimulationOptions.d.ts.map +1 -0
- package/dist/types/TCNSStimulationQueueItem.d.ts +10 -0
- package/dist/types/TCNSStimulationQueueItem.d.ts.map +1 -0
- package/dist/types/TCNSStimulationResponse.d.ts +11 -0
- package/dist/types/TCNSStimulationResponse.d.ts.map +1 -0
- package/dist/types/TCNSSubscriber.d.ts +7 -0
- package/dist/types/TCNSSubscriber.d.ts.map +1 -0
- package/package.json +4 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CNSStimulationContextStore.ts","../src/CNS.ts","../src/CNSCollateral.ts","../src/factory/index.ts"],"names":["neuron","collateral"],"mappings":";;;AAEO,IAAM,6BAAN,MAAwE;AAAA,EAC3E,WAAA,CAA6B,GAAA,mBAA4B,IAAI,GAAA,EAAI,EAAG;AAAvC,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAAA,EAAwC;AAAA,EAErE,IAAI,GAAA,EAAsB;AACtB,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AAAA,EAC3B;AAAA,EAEA,GAAA,CAAI,KAAa,KAAA,EAAsB;AACnC,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAC3B;AAAA,EAEA,MAAA,GAAkC;AAC9B,IAAA,OAAO,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA;AAAA,EACtC;AAAA,EAEA,OAAO,MAAA,EAAuC;AAC1C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC/C,MAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,IAC3B;AAAA,EACJ;AACJ,CAAA;;;ACbA,IAAM,OAAA,GAAU,CAAI,CAAA,KAAgB,KAAA,CAAM,QAAQ,CAAC,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAC7D,IAAM,SAAA,GAAY,CAAC,CAAA,KACf,CAAC,CAAC,CAAA,IAAK,OAAQ,EAAU,IAAA,KAAS,UAAA;AAMtC,IAAM,QAAN,MAAe;AAAA,EAAf,WAAA,GAAA;AACI,IAAA,IAAA,CAAQ,IAAS,EAAC;AAClB,IAAA,IAAA,CAAQ,IAAA,GAAO,CAAA;AAAA,EAAA;AAAA,EAEf,KAAK,CAAA,EAAM;AACP,IAAA,IAAA,CAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EACjB;AAAA,EAEA,KAAA,GAAuB;AACnB,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,CAAA,CAAE,QAAQ,OAAO,MAAA;AACvC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,CAAE,IAAA,CAAK,IAAA,EAAM,CAAA;AAG5B,IAAA,IAAI,IAAA,CAAK,OAAO,IAAA,IAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,IAAA,CAAK,EAAE,MAAA,EAAQ;AACnD,MAAA,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,KAAK,IAAI,CAAA;AAC/B,MAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AAAA,IAChB;AACA,IAAA,OAAO,CAAA;AAAA,EACX;AAAA,EAEA,IAAI,MAAA,GAAS;AACT,IAAA,OAAO,IAAA,CAAK,CAAA,CAAE,MAAA,GAAS,IAAA,CAAK,IAAA;AAAA,EAChC;AAAA;AAAA;AAIJ,CAAA;AAiBO,IAAM,MAAN,MAIL;AAAA,EAgBE,YAA+B,OAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAX/B;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAGrB;AAKF;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,YAAA,uBAAmB,GAAA,EAAoB;AAC/C,IAAA,IAAA,CAAQ,gBAAA,uBAAuB,GAAA,EAAoB;AAG/C,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EAC1B;AAAA,EAEQ,UAAA,GAAa;AACjB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,KAAA,MAAWA,OAAAA,IAAU,KAAK,OAAA,EAAS;AAC/B,MAAA,KAAA,MAAW,QAAA,IAAYA,QAAO,SAAA,EAAW;AACrC,QAAA,MAAM,GAAA,GAAM,SAAS,UAAA,CAAW,EAAA;AAChC,QAAA,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,KAAK,EAAC;AACvC,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,MAAA,EAAAA,OAAAA,EAAQ,UAAiC,CAAA;AACpD,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA;AAAA,UACV,GAAA;AAAA,UACA;AAAA,SACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAA,GAAmB;AACvB,IAAA,KAAA,MAAWA,OAAAA,IAAU,KAAK,OAAA,EAAS;AAC/B,MAAA,IAAA,CAAK,OAAA,CAAQA,OAAAA,CAAO,EAAA,EAAI,IAAA,CAAK,YAAY,CAAA;AACzC,MAAA,KAAA,MAAW,QAAA,IAAYA,QAAO,SAAA,EAAW;AACrC,QAAA,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,UAAA,CAAW,EAAA,EAAI,KAAK,gBAAgB,CAAA;AAAA,MAC9D;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,GAAA,EAAqB;AACpC,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC7B,MAAA,IAAA,GAAA,CAAQ,IAAA,IAAQ,KAAK,IAAA,GAAO,IAAA;AAC5B,MAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,IAClB;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAA,CAAQ,KAAa,KAAA,EAAoC;AAC7D,IAAA,IAAI,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AACxB,IAAA,IAAI,SAAS,MAAA,EAAW;AACpB,MAAA,IAAA,GAAO,IAAA,CAAK,WAAW,GAAG,CAAA;AAG1B,MAAA,IAAI,KAAA,CAAM,OAAO,GAAA,EAAM;AAEnB,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACtC,QAAA,IAAI,cAAc,MAAA,EAAW;AACzB,UAAA,KAAA,CAAM,OAAO,SAAS,CAAA;AAAA,QAC1B;AAAA,MACJ;AAEA,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IACvB,CAAA,MAAO;AAEH,MAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAChB,MAAA,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,cAAA,CACJ,QAAA,EACA,YAAA,EACA,OAAA,EACA,IAAA,EACM;AACN,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,KAAK,YAAY,CAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,KAAK,gBAAgB,CAAA;AAC9D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAE7C,IAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,KAAK,IAAI,KAAK,CAAA,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBQ,mBAAA,CACJ,QAAA,EACA,SAAA,EACA,IAAA,EACA,KAAA,EACA,KACA,WAAA,EACA,qBAAA,EACA,qBAAA,EACA,iBAAA,EACA,OAAA,EAQO;AACP,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,YAAY,CAAA;AAC3D,IAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,MAAA,KAAW,GAAG,OAAO,KAAA;AAGrD,IAAA,MAAM,OAAA,GAAU,SAAS,IAAA,GAAO,CAAA;AAChC,IAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAEzB,IAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAAa;AAC7B,MAAA,IAAI,OAAO,IAAA,EAAM;AACjB,MAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9B,QAAA,MAAM,IAAI,KAAA,CAAM,IAAA;AAChB,QAAA,IAAI,SAAA,IAAa,CAAC,SAAA,CAAU,CAAC,CAAA,EAAG;AAChC,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACP,YAAA,EAAc,CAAA;AAAA,UACd,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,IAAA,EAAM,OAAA;AAAA,UACN;AAAA,SACH,CAAA;AAAA,MACL;AAAA,IACJ,CAAA;AAGA,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,IAAA,KAAA,MAAW,EAAE,MAAA,EAAAA,OAAAA,EAAQ,QAAA,MAAc,WAAA,EAAa;AAE5C,MAAA,MAAM,QAAA,GAAW,cACX,IAAA,CAAK,cAAA;AAAA,QACDA,OAAAA,CAAO,EAAA;AAAA,QACP,QAAA,CAAS,YAAA;AAAA,QACT,QAAA,CAAS,OAAA;AAAA,QACT,QAAA,CAAS;AAAA,OACb,GACA,MAAA;AAEN,MAAA,IAAI,QAAA,IAAY,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG;AACpC,MAAA,IAAI,QAAA,EAAU,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAE/B,MAAA,MAAM,MAAM,QAAA,CAAS,QAAA,CAAS,QAAA,CAAS,OAAA,EAASA,QAAO,IAAA,EAAM;AAAA,QACzD,GAAA,EAAK,MAAM,GAAA,CAAI,GAAA,CAAIA,QAAO,EAAE,CAAA;AAAA,QAC5B,KAAK,CAAC,KAAA,KAAe,IAAI,GAAA,CAAIA,OAAAA,CAAO,IAAI,KAAK;AAAA,OAChD,CAAA;AAED,MAAA,IAAI,SAAA,CAAU,GAAG,CAAA,EAAG;AAChB,QAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,UAAA,eAAA,GAAkB,IAAA;AAClB,UAAA,qBAAA,EAAsB;AAAA,QAC1B;AACA,QAAA,SAAA,EAAA;AAGA,QAAC,GAAA,CAAqB,IAAA;AAAA,UAClB,CAAA,GAAA,KAAO;AACH,YAAA,UAAA,CAAW,GAAG,CAAA;AAEd,YAAA,SAAA,EAAA;AACA,YAAA,iBAAA,EAAkB;AAClB,YAAA,IAAI,cAAc,CAAA,EAAG;AACjB,cAAA,qBAAA,EAAsB;AAAA,YAC1B;AAAA,UACJ,CAAA;AAAA,UACA,CAAA,GAAA,KAAO;AAEH,YAAA,OAAA,GAAU;AAAA,cACN,cAAc,QAAA,CAAS,YAAA;AAAA,cACvB,MAAM,QAAA,CAAS,IAAA;AAAA,cACf,SAAS,QAAA,CAAS,OAAA;AAAA,cAClB,aAAa,KAAA,CAAM,MAAA;AAAA,cACnB,KAAA,EAAO,GAAA;AAAA,cACP,YAAA,EAAc;AAAA;AAAA,aACjB,CAAA;AAGD,YAAA,SAAA,EAAA;AACA,YAAA,iBAAA,EAAkB;AAClB,YAAA,IAAI,cAAc,CAAA,EAAG;AACjB,cAAA,qBAAA,EAAsB;AAAA,YAC1B;AAAA,UAEJ;AAAA,SACJ;AAAA,MAGJ,CAAA,MAAO;AAEH,QAAA,UAAA,CAAW,GAAG,CAAA;AAAA,MAClB;AAAA,IACJ;AAEA,IAAA,OAAO,eAAA;AAAA,EACX;AAAA,EAEA,SAAA,CAIIC,WAAAA,EAIA,OAAA,EACA,IAAA,EA4BI;AACJ,IAAA,MAAM,MACF,IAAA,EAAM,GAAA,IACN,MAAM,kBAAA,IAAqB,IAC3B,IAAI,0BAAA,EAA2B;AACnC,IAAA,MAAM,OAAA,GAAU,IAAA,EAAM,OAAA,IAAW,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACnE,IAAA,MAAM,UAAU,IAAA,EAAM,OAAA;AACtB,IAAA,MAAM,SACD,IAAA,EAAM,WAAA,IAAe,CAAA,IAAK,CAAA,GAAI,KAAM,WAAA,GAAe,QAAA;AAGxD,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,EAAiC;AACnD,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACP,cAAcA,WAAAA,CAAW,EAAA;AAAA,MACzB,OAAA;AAAA,MACA,IAAA,EAAM,CAAA;AAAA,MACN;AAAA,KACH,CAAA;AAGD,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAO7B,IAAA,IAAI,gBAAA,GAAmB,CAAA;AAiBvB,IAAA,MAAM,iBAAiB,MAAM;AACzB,MAAA,gBAAA,EAAA;AAAA,IACJ,CAAA;AAEA,IAAA,MAAM,kBAAkB,MAAM;AAC1B,MAAA,gBAAA,EAAA;AAEA,MAAA,cAAA,EAAe;AAAA,IACnB,CAAA;AAEA,IAAA,MAAM,oBAAoB,MAAe;AACrC,MAAA,OAAO,gBAAA,GAAmB,KAAA,IAAS,CAAC,IAAA,EAAM,WAAA,EAAa,OAAA;AAAA,IAC3D,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAoC;AAErD,MAAA,IAAA,EAAM,OAAA,GAAU;AAAA,QACZ,cAAc,IAAA,CAAK,YAAA;AAAA,QACnB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,aAAa,KAAA,CAAM,MAAA;AAAA,QACnB,YAAA,EAAc;AAAA;AAAA,OACjB,CAAA;AAED,MAAA,IAAI,OAAA,IAAW,IAAA,CAAK,IAAA,IAAQ,OAAA,EAAS;AAEjC,QAAA,eAAA,EAAgB;AAChB,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,sBAAsB,MAAM;AAC9B,QAAA,eAAA,EAAgB;AAAA,MACpB,CAAA;AAEA,MAAA,MAAM,eAAe,MAAM;AAAA,MAE3B,CAAA;AAGA,MAAA,MAAM,gBAAgB,IAAA,CAAK,mBAAA;AAAA,QACvB,IAAA;AAAA,QACA,IAAA,EAAM,SAAA;AAAA,QACN,IAAA;AAAA,QACA,KAAA;AAAA,QACA,GAAA;AAAA,QACA,OAAA,KAAY,MAAA;AAAA;AAAA,QACZ,YAAA;AAAA,QACA,mBAAA;AAAA,QACA,cAAA;AAAA;AAAA,QACA,IAAA,EAAM;AAAA,OACV;AAGA,MAAA,IAAI,CAAC,aAAA,EAAe;AAChB,QAAA,eAAA,EAAgB;AAAA,MACpB;AAAA,IACJ,CAAA;AAEA,IAAA,MAAM,iBAAiB,MAAM;AAEzB,MAAA,OAAO,KAAA,CAAM,MAAA,IAAU,iBAAA,EAAkB,EAAG;AACxC,QAAA,MAAM,IAAA,GAAO,MAAM,KAAA,EAAM;AACzB,QAAA,cAAA,EAAe;AACf,QAAA,WAAA,CAAY,IAAI,CAAA;AAAA,MACpB;AAAA,IACJ,CAAA;AAGA,IAAA,cAAA,EAAe;AAAA,EAGnB;AACJ;;;AClcO,IAAM,gBAAN,MAAkD;AAAA,EACrD,YAA4B,EAAA,EAAS;AAAT,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAU;AAAA,EAEtC,gBACO,IAAA,EACsB;AACzB,IAAA,MAAM,OAAA,GAAW,KAAa,CAAC,CAAA;AAC/B,IAAA,OAAO,EAAE,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,OAAA,EAAQ;AAAA,EACpC;AACJ;;;ACNO,IAAM,UAAA,GAAa,CACtB,EAAA,KACC,IAAI,cAA6B,EAAE;AA4CjC,IAAM,MAAA,GAAS,CAUlB,EAAA,EACA,IAAA,KAOC;AACD,EAAA,MAAM,YAOA,EAAC;AAEP,EAAA,MAAM,GAAA,GAMF;AAAA,IACA,IAAA;AAAA,IACA,EAAA;AAAA,IACA,SAAA;AAAA,IACA,SAII,CAAA,EAQF;AACE,MAAA,SAAA,CAAU,IAAA;AAAA,QACN;AAAA,OAQJ;AACA,MAAA,OAAO,GAAA;AAAA,IACX;AAAA,GACJ;AAEA,EAAA,OAAO,GAAA;AACX;AAEO,IAAM,UAAU,OAAsB;AAAA,EACzC,MAAA,EAAQ,CASJ,EAAA,EACA,IAAA,KACC;AACD,IAAA,OAAO,MAAA,CAML,IAAI,IAAI,CAAA;AAAA,EACd;AACJ,CAAA","file":"index.cjs","sourcesContent":["import { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\n\nexport class CNSStimulationContextStore implements ICNSStimulationContextStore {\n constructor(private readonly ctx: Map<string, unknown> = new Map()) {}\n\n get(key: string): unknown {\n return this.ctx.get(key);\n }\n\n set(key: string, value: unknown): void {\n this.ctx.set(key, value);\n }\n\n getAll(): Record<string, unknown> {\n return Object.fromEntries(this.ctx);\n }\n\n setAll(values: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(values)) {\n this.ctx.set(key, value);\n }\n }\n}\n","import { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { CNSCollateral } from './CNSCollateral';\nimport { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\nimport { CNSStimulationContextStore } from './CNSStimulationContextStore';\n\n/**\n * Small helpers\n */\nconst asArray = <T>(x: T | T[]) => (Array.isArray(x) ? x : [x]);\nconst isPromise = (v: unknown): v is Promise<unknown> =>\n !!v && typeof (v as any).then === 'function';\n\n/**\n * Minimal, GC-friendly deque (ring-buffer-ish) with O(1) push/shift.\n * Avoids Array.shift() O(n) tail copies on large queues.\n */\nclass Deque<T> {\n private a: T[] = [];\n private head = 0;\n\n push(x: T) {\n this.a.push(x);\n }\n\n shift(): T | undefined {\n if (this.head >= this.a.length) return undefined;\n const v = this.a[this.head++];\n // Periodic compaction to keep memory bounded:\n // when head grows big and passes half of array, slice the live tail.\n if (this.head > 1024 && this.head * 2 > this.a.length) {\n this.a = this.a.slice(this.head);\n this.head = 0;\n }\n return v;\n }\n\n get length() {\n return this.a.length - this.head;\n }\n\n // Optional convenience if you need to inspect without removing:\n // peek(): T | undefined { return this.a[this.head]; }\n}\n\ntype TSubscriber<\n TNeuron extends TCNSNeuron<any, any, any, any, any, any, any>,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> = {\n neuron: TNeuron;\n dendrite: TDendrite;\n};\n\ntype TQueueItem<TCollateralId extends string> = {\n collateralId: TCollateralId;\n payload: unknown;\n hops: number;\n spikeId: string;\n};\n\nexport class CNS<\n TCollateralId extends string,\n TNeuron extends TCNSNeuron<any, any, any, any, any, any, any>,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> {\n /**\n * Fast lookup: collateralId -> list of (neuron, dendrite) subscribers.\n * Built once at construction time.\n */\n private subIndex = new Map<\n TCollateralId,\n TSubscriber<TNeuron, TDendrite>[]\n >();\n\n /**\n * Cached hashes for stable IDs to optimize dedup key generation.\n */\n private neuronHashes = new Map<string, number>();\n private collateralHashes = new Map<string, number>();\n\n constructor(protected readonly neurons: TNeuron[]) {\n this.buildIndex();\n this.precomputeHashes();\n }\n\n private buildIndex() {\n this.subIndex.clear();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n const key = dendrite.collateral.id as TCollateralId;\n const arr = this.subIndex.get(key) ?? [];\n arr.push({ neuron, dendrite: dendrite as TDendrite });\n this.subIndex.set(\n key,\n arr as TSubscriber<TNeuron, TDendrite>[]\n );\n }\n }\n }\n\n /**\n * Precompute hashes for stable neuron and collateral IDs to optimize\n * dedup key generation during stimulation.\n */\n private precomputeHashes() {\n for (const neuron of this.neurons) {\n this.getHash(neuron.id, this.neuronHashes);\n for (const dendrite of neuron.dendrites) {\n this.getHash(dendrite.collateral.id, this.collateralHashes);\n }\n }\n }\n\n /**\n * Simple but effective hash function for string keys.\n */\n private simpleHash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return hash;\n }\n\n /**\n * Get or compute hash for a string, using cache for stable IDs.\n */\n private getHash(str: string, cache: Map<string, number>): number {\n let hash = cache.get(str);\n if (hash === undefined) {\n hash = this.simpleHash(str);\n\n // Simple cache management - remove oldest entry if cache gets too large\n if (cache.size > 1000) {\n // Remove oldest entry (first key in Map maintains insertion order)\n const oldestKey = cache.keys().next().value;\n if (oldestKey !== undefined) {\n cache.delete(oldestKey);\n }\n }\n\n cache.set(str, hash);\n } else {\n // Move to end for LRU (delete + re-add updates position)\n cache.delete(str);\n cache.set(str, hash);\n }\n return hash;\n }\n\n /**\n * Create optimized dedup key using composite numeric hash.\n * This replaces string concatenation with faster numeric operations.\n * Includes hops to allow signals to pass through the same neuron at different levels.\n */\n private createDedupKey(\n neuronId: string,\n collateralId: string,\n spikeId: string,\n hops: number\n ): string {\n const nHash = this.getHash(neuronId, this.neuronHashes);\n const cHash = this.getHash(collateralId, this.collateralHashes);\n const sHash = this.simpleHash(spikeId); // Don't cache spike IDs (too many unique values)\n const hHash = this.simpleHash(hops.toString()); // Hash the hops level\n\n return `${nHash}:${cHash}:${sHash}:${hHash}`;\n }\n\n /**\n * Fire-and-forget fan-out for a single queue item.\n *\n * Behavior:\n * - Synchronous dendrite responses enqueue their outgoing signals immediately.\n * - Asynchronous responses:\n * • We DO NOT await them (no per-item barrier).\n * • We attach `.then` to enqueue outgoing signals when ready.\n * • We notify the scheduler when the first async for this item starts,\n * and when the last async for this item settles.\n * - No error handling: we do not try/catch. Rejections bubble via wireRejectionToRun().\n *\n * Returns:\n * boolean — whether this item launched any async work (>= 1 promises).\n */\n private fanOutFireAndForget(\n incoming: TQueueItem<TCollateralId>,\n allowType: ((t: TCollateralId) => boolean) | undefined,\n seen: Set<string>,\n queue: Deque<TQueueItem<TCollateralId>>,\n ctx: ICNSStimulationContextStore,\n enableDedup: boolean, // New parameter\n onItemFirstAsyncStart: () => void, // called exactly once per item (on first async)\n onItemAllAsyncSettled: () => void, // called when this item's last async settles\n onAnyAsyncSettled: () => void, // called after every async settles (to pump again)\n onTrace?: (trace: {\n collateralId: TCollateralId;\n hops: number;\n payload: unknown;\n queueLength: number;\n error?: Error;\n contextStore: ICNSStimulationContextStore; // Pass the actual context store interface\n }) => void\n ): boolean {\n const subscribers = this.subIndex.get(incoming.collateralId);\n if (!subscribers || subscribers.length === 0) return false;\n\n // Do not capture the entire `incoming` object in closures — copy only what we need.\n const nextHop = incoming.hops + 1;\n const spikeId = incoming.spikeId;\n\n const enqueueOut = (out: any) => {\n if (out == null) return;\n for (const spike of asArray(out)) {\n const t = spike.type as TCollateralId;\n if (allowType && !allowType(t)) continue;\n queue.push({\n collateralId: t,\n payload: spike.payload,\n hops: nextHop,\n spikeId,\n });\n }\n };\n\n // Track active async subscribers for THIS item.\n let openAsync = 0;\n let itemMarkedAsync = false;\n\n for (const { neuron, dendrite } of subscribers) {\n // Dedup to prevent double-processing within this spike cascade\n const dedupKey = enableDedup\n ? this.createDedupKey(\n neuron.id,\n incoming.collateralId,\n incoming.spikeId,\n incoming.hops\n )\n : undefined; // Only dedup if enabled\n\n if (dedupKey && seen.has(dedupKey)) continue;\n if (dedupKey) seen.add(dedupKey);\n\n const res = dendrite.response(incoming.payload, neuron.axon, {\n get: () => ctx.get(neuron.id),\n set: (value: any) => ctx.set(neuron.id, value),\n });\n\n if (isPromise(res)) {\n if (!itemMarkedAsync) {\n itemMarkedAsync = true;\n onItemFirstAsyncStart();\n }\n openAsync++;\n\n // We do NOT catch here; rejections are wired to the run-level promise.\n (res as Promise<any>).then(\n out => {\n enqueueOut(out);\n // After successful async settles:\n openAsync--;\n onAnyAsyncSettled();\n if (openAsync === 0) {\n onItemAllAsyncSettled();\n }\n },\n err => {\n // Trace the error\n onTrace?.({\n collateralId: incoming.collateralId,\n hops: incoming.hops,\n payload: incoming.payload,\n queueLength: queue.length,\n error: err,\n contextStore: ctx, // Pass the context store interface\n });\n\n // After failed async settles:\n openAsync--;\n onAnyAsyncSettled();\n if (openAsync === 0) {\n onItemAllAsyncSettled();\n }\n // Error is already traced, just continue\n }\n );\n\n // Fire-and-forget: no need to wire rejections\n } else {\n // Synchronous branch: enqueue immediately.\n enqueueOut(res);\n }\n }\n\n return itemMarkedAsync;\n }\n\n stimulate<\n TAfferentCollateralId extends TCollateralId,\n TAfferentCollateralPayload\n >(\n collateral: CNSCollateral<\n TAfferentCollateralId,\n TAfferentCollateralPayload\n >,\n payload: TAfferentCollateralPayload,\n opts?: {\n maxHops?: number;\n allowType?: (t: TCollateralId) => boolean;\n onTrace?: (e: {\n collateralId: TCollateralId;\n hops: number;\n payload: unknown;\n queueLength: number;\n error?: Error;\n contextStore: ICNSStimulationContextStore; // Pass the actual context store interface\n }) => void;\n abortSignal?: AbortSignal;\n spikeId?: string;\n ctx?: ICNSStimulationContextStore;\n /**\n * Factory method to create a new context store.\n * Useful for recovery scenarios where you want to restore state.\n */\n createContextStore?: () => ICNSStimulationContextStore;\n /**\n * Maximum number of signal processing operations active at once.\n * - Sync operations count for their brief execution time\n * - Async operations count until completion\n * - undefined / <= 0 => Infinity (no limit)\n * Maintains streaming flow - no artificial barriers or level synchronization.\n */\n concurrency?: number;\n }\n ): void {\n const ctx =\n opts?.ctx ??\n opts?.createContextStore?.() ??\n new CNSStimulationContextStore();\n const spikeId = opts?.spikeId || Math.random().toString(36).slice(2);\n const maxHops = opts?.maxHops;\n const limit =\n (opts?.concurrency ?? 0) > 0 ? opts!.concurrency! : Infinity;\n\n // BFS queue backed by a Deque to avoid O(n) cost of Array.shift()\n const queue = new Deque<TQueueItem<TCollateralId>>();\n queue.push({\n collateralId: collateral.id,\n payload,\n hops: 0,\n spikeId,\n });\n\n // Used to avoid double-processing (neuronId + collateralId + spikeId)\n const seen = new Set<string>();\n\n /**\n * Number of operations currently being processed.\n * Both sync and async operations count toward this limit.\n * Streaming concurrency: no artificial barriers, just resource limiting.\n */\n let activeOperations = 0;\n\n /**\n * Fire-and-forget: we don't return promises, just trace errors.\n */\n\n /**\n * Streaming processor:\n * - Processes items from queue up to concurrency limit\n * - Each operation (sync/async) counts as one slot while active\n * - No level barriers - operations start as soon as slots are available\n * - Maintains fire-and-forget flow with proper backpressure\n *\n * Abort:\n * - If AbortSignal is aborted, stops pulling new work\n * - Already-launched operations continue to completion\n */\n const startOperation = () => {\n activeOperations++;\n };\n\n const finishOperation = () => {\n activeOperations--;\n // Stream processing: immediately try to start more work\n tryProcessMore();\n };\n\n const canStartOperation = (): boolean => {\n return activeOperations < limit && !opts?.abortSignal?.aborted;\n };\n\n const processItem = (item: TQueueItem<TCollateralId>) => {\n // Trace BEFORE processing to reflect actual order\n opts?.onTrace?.({\n collateralId: item.collateralId,\n hops: item.hops,\n payload: item.payload,\n queueLength: queue.length,\n contextStore: ctx, // Pass the context store\n });\n\n if (maxHops && item.hops >= maxHops) {\n // Skip due to hop guard, but still finish the operation\n finishOperation();\n return;\n }\n\n // Simplified callbacks for streaming concurrency\n const onOperationComplete = () => {\n finishOperation();\n };\n\n const onAsyncStart = () => {\n // Already counted in startOperation(), nothing extra needed\n };\n\n // Fan out (fire-and-forget)\n const launchedAsync = this.fanOutFireAndForget(\n item,\n opts?.allowType,\n seen,\n queue,\n ctx,\n maxHops !== undefined, // Enable dedup only if maxHops is set\n onAsyncStart,\n onOperationComplete,\n tryProcessMore, // Continue streaming on any completion\n opts?.onTrace\n );\n\n // If sync operation, complete immediately\n if (!launchedAsync) {\n finishOperation();\n }\n };\n\n const tryProcessMore = () => {\n // Stream processing: start as many operations as concurrency allows\n while (queue.length && canStartOperation()) {\n const item = queue.shift()!;\n startOperation();\n processItem(item);\n }\n };\n\n // Start streaming processing\n tryProcessMore();\n\n // Fire-and-forget: always return void\n }\n}\n","import { TCNSSignal } from './types/TCNSSignal';\n\nexport class CNSCollateral<TId extends string, TPayload> {\n constructor(public readonly id: TId) {}\n\n createSignal(\n ...args: [TPayload] extends [undefined] ? [] : [payload: TPayload]\n ): TCNSSignal<TId, TPayload> {\n const payload = (args as any)[0] as TPayload;\n return { type: this.id, payload };\n }\n}\n","import { CNS } from '../CNS';\nimport { CNSCollateral } from '../CNSCollateral';\nimport { TCNSAxon } from '../types/TCNSAxon';\nimport { TCNSDendrite } from '../types/TCNSDendrite';\n\nexport const collateral = <TPayload = undefined, TId extends string = string>(\n id: TId\n) => new CNSCollateral<TId, TPayload>(id);\n\ntype InterNeuronAPI<\n TContextValue,\n TIdType extends string,\n TReceiverCollateralIdType extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload\n >\n> = {\n id: TIdType;\n axon: TAxonType;\n dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >[];\n dendrite: <\n TSenderExactCollateralIdType extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralIdType,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n ) => InterNeuronAPI<\n TContextValue,\n TIdType,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n};\n\n// Concrete builder\nexport const neuron = <\n TContextValue,\n TIdType extends string,\n TReceiverCollateralIdType extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload\n >\n>(\n id: TIdType,\n axon: TAxonType\n): InterNeuronAPI<\n TContextValue,\n TIdType,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n> => {\n const dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >[] = [];\n\n const api: InterNeuronAPI<\n TContextValue,\n TIdType,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n > = {\n axon,\n id,\n dendrites,\n dendrite<\n TSenderExactCollateralIdType extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralIdType,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n ) {\n dendrites.push(\n s as TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n );\n return api; // keep full API for chaining\n },\n };\n\n return api;\n};\n\nexport const withCtx = <TContextValue>() => ({\n neuron: <\n TIdType extends string,\n TReceiverCollateralIdType extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload\n >\n >(\n id: TIdType,\n axon: TAxonType\n ) => {\n return neuron<\n TContextValue,\n TIdType,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >(id, axon);\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/CNSStimulationContextStore.ts","../src/CNSFunctionalQueue.ts","../src/CNSStimulation.ts","../src/CNS.ts","../src/CNSCollateral.ts","../src/factory/index.ts"],"names":["neuron","collateral"],"mappings":"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","file":"index.cjs","sourcesContent":["import { ICNSStimulationContextStore } from './interfaces/ICNSStimulationContextStore';\n\nexport class CNSStimulationContextStore implements ICNSStimulationContextStore {\n constructor(private readonly ctx: Map<string, unknown> = new Map()) {}\n\n get(key: string): unknown {\n return this.ctx.get(key);\n }\n\n set(key: string, value: unknown): void {\n this.ctx.set(key, value);\n }\n\n getAll(): Record<string, unknown> {\n return Object.fromEntries(this.ctx);\n }\n\n setAll(values: Record<string, unknown>): void {\n for (const [key, value] of Object.entries(values)) {\n this.ctx.set(key, value);\n }\n }\n\n delete(key: string): void {\n this.ctx.delete(key);\n }\n}\n","import { TCNSStimulationQueueItem } from './types/TCNSStimulationQueueItem';\nimport { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\n\nexport class CNSFunctionalQueue<\n TCollateralId extends string,\n TNeuronId extends string,\n TNeuron extends TCNSNeuron<any, TNeuronId, TCollateralId, any, any, any, any>,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> {\n private items: TCNSStimulationQueueItem<TCollateralId, TNeuronId, TNeuron, TDendrite>[] = [];\n private head = 0;\n private tail = 0;\n private size = 0;\n private capacity = 16;\n protected activeOperations = 0;\n \n\n // NEW: prevent re-entrant pump; defer extra runs\n private pumping = false;\n private needsPump = false;\n\n constructor(\n private readonly processor: (item: TCNSStimulationQueueItem<TCollateralId, TNeuronId, TNeuron, TDendrite>) => (() => void) | Promise<() => void>,\n protected readonly concurrency?: number,\n protected readonly abortSignal?: AbortSignal,\n initialCapacity?: number\n ) {\n if (initialCapacity && initialCapacity > 0) {\n this.capacity = initialCapacity;\n }\n this.items = new Array(this.capacity);\n }\n\n protected get canStartOperation(): boolean {\n const limit = this.concurrency ?? Infinity;\n return this.activeOperations < limit && !this.abortSignal?.aborted;\n }\n\n private resize(): void {\n const oldCapacity = this.capacity;\n this.capacity = oldCapacity * 2;\n const newItems = new Array(this.capacity);\n \n let oldIndex = this.head;\n for (let i = 0; i < this.size; i++) {\n newItems[i] = this.items[oldIndex];\n oldIndex = (oldIndex + 1) % oldCapacity;\n }\n \n this.items = newItems;\n this.head = 0;\n this.tail = this.size;\n }\n\n private dequeue(): TCNSStimulationQueueItem<TCollateralId, TNeuronId, TNeuron, TDendrite> | undefined {\n if (this.size === 0) return undefined;\n \n const item = this.items[this.head];\n this.items[this.head] = undefined as any; // Clear reference\n this.head = (this.head + 1) % this.capacity;\n this.size--;\n \n return item;\n }\n\n private enqueueItem(item: TCNSStimulationQueueItem<TCollateralId, TNeuronId, TNeuron, TDendrite>): void {\n if (this.size === this.capacity) {\n this.resize();\n }\n \n this.items[this.tail] = item;\n this.tail = (this.tail + 1) % this.capacity;\n this.size++;\n }\n\n protected pump() {\n if (this.pumping) {\n this.needsPump = true;\n return;\n }\n this.pumping = true;\n\n while (this.canStartOperation && this.size > 0) {\n const item = this.dequeue()!;\n this.activeOperations++;\n\n const ret = this.processor(item);\n\n // Async branch\n if (ret && typeof (ret as any).then === 'function') {\n (ret as Promise<void | (() => void)>).then(\n cb => {\n // finish this item\n this.activeOperations--;\n if (typeof cb === 'function') cb();\n\n // schedule another pass (but don't re-enter if already pumping)\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n },\n err => {\n this.activeOperations--;\n // resume if there's more work\n if (this.size > 0 && this.canStartOperation) {\n if (this.pumping) this.needsPump = true;\n else this.pump();\n }\n throw err; // let it crash \"honestly\"\n }\n );\n // Stop the loop; continuation will happen from the promise handler\n break;\n }\n\n // Sync branch\n this.activeOperations--;\n if (typeof ret === 'function') (ret as () => void)();\n // Loop continues; any items added by ret() stay in the same flat loop\n }\n\n this.pumping = false;\n\n // If async completions or enqueues requested another pass, do exactly one more, non-recursively\n if (this.needsPump) {\n this.needsPump = false;\n this.pump();\n }\n }\n\n\n enqueue(x: TCNSStimulationQueueItem<TCollateralId, TNeuronId, TNeuron, TDendrite>) {\n this.enqueueItem(x);\n // Start pumping only if not already pumping; avoid re-entrant pump\n if (!this.pumping) this.pump();\n else this.needsPump = true;\n }\n\n get length() {\n return this.size;\n }\n\n getActiveOperationsCount() {\n return this.activeOperations;\n }\n\n}\n","import { CNSStimulationContextStore } from './CNSStimulationContextStore';\nimport { ICNS } from './interfaces/ICNS';\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 { CNSFunctionalQueue } from './CNSFunctionalQueue';\nimport { TCNSSignal } from './types/TCNSSignal';\nimport { TCNSStimulationQueueItem } from './types/TCNSStimulationQueueItem';\n\nexport class CNSStimulation<\n TCollateralId extends string,\n TNeuronId extends string,\n TNeuron extends TCNSNeuron<\n any,\n TNeuronId,\n TCollateralId,\n any,\n any,\n any,\n any\n >,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>,\n TInputPayload,\n TOutputPayload\n> {\n private readonly ctx: ICNSStimulationContextStore;\n private readonly queue: CNSFunctionalQueue<\n TCollateralId,\n TNeuronId,\n TNeuron,\n TDendrite\n >;\n private readonly nueronVisitMap?: Map<TNeuronId, number>;\n private scheduledCount = 0;\n\n /**\n * Track active SCCs: SCC index -> count of active neurons in that SCC\n */\n private readonly activeSccCounts = new Map<number, number>();\n\n public readonly id: string;\n\n constructor(\n private readonly cns: ICNS<TNeuron, TDendrite>,\n public readonly options?: TCNSStimulationOptions<\n TCollateralId,\n TInputPayload,\n TOutputPayload\n >\n ) {\n this.ctx =\n options?.ctx ??\n options?.createContextStore?.() ??\n new CNSStimulationContextStore();\n this.id = options?.stimulationId || Math.random().toString(36).slice(2);\n this.queue = new CNSFunctionalQueue(\n item => this.processQueueItem(item),\n options?.concurrency,\n options?.abortSignal\n );\n\n if (this.options?.maxNeuronHops) {\n this.nueronVisitMap = new Map();\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(neuronId: TNeuronId): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.incrementSccCount(neuronId);\n }\n\n /**\n * Mark a neuron as inactive (finished processing)\n */\n protected markNeuronInactive(neuronId: TNeuronId): void {\n if (!this.autoCleanupContextsEnabled) return;\n\n this.decrementSccCount(neuronId);\n }\n\n /**\n * Increment the active count for the SCC containing this neuron\n */\n private incrementSccCount(neuronId: TNeuronId): void {\n const sccIndex = this.cns.getSccIndexByNeuronId(neuronId);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n this.activeSccCounts.set(sccIndex, currentCount + 1);\n }\n\n /**\n * Decrement the active count for the SCC containing this neuron\n */\n private decrementSccCount(neuronId: TNeuronId): void {\n const sccIndex = this.cns.getSccIndexByNeuronId(neuronId);\n if (sccIndex === undefined) return;\n\n const currentCount = this.activeSccCounts.get(sccIndex) || 0;\n const nextCount = Math.max(0, currentCount - 1);\n this.activeSccCounts.set(sccIndex, nextCount);\n\n // Log warning if we're trying to decrement below 0\n if (currentCount === 0) {\n console.warn(\n `[CNSStimulation] Attempting to decrement SCC count below 0 for neuron ${neuronId}`\n );\n }\n }\n\n /**\n * Check if a neuron can be guaranteed not to be visited again\n */\n protected canNeuronBeGuaranteedDone(neuronId: TNeuronId): boolean {\n if (!this.autoCleanupContextsEnabled) return false;\n return this.cns.canNeuronBeGuaranteedDone(\n neuronId,\n this.activeSccCounts\n );\n }\n\n protected cleanupCtxIfNeeded(neuron: TNeuron): void {\n if (\n this.autoCleanupContextsEnabled &&\n this.canNeuronBeGuaranteedDone(neuron.id)\n ) {\n this.ctx.delete(neuron.id);\n }\n }\n\n protected createSubscriberQueueItem(\n subscriber: TCNSSubscriber<TNeuron, TDendrite>,\n inputSignal?: TCNSSignal<TCollateralId, any>\n ) {\n if (this.options?.maxNeuronHops) {\n if (\n this.nueronVisitMap?.get(subscriber.neuron.id) ??\n 0 >= this.options?.maxNeuronHops\n ) {\n throw new Error(\n `Max neuron hops reached for neuron \"${subscriber.neuron.id}\" ` +\n `when trying to enqueue subscriber \"${subscriber.dendrite.collateral.id}\" ` +\n `in stimulation \"${this.id}\"`\n );\n } else {\n this.nueronVisitMap?.set(\n subscriber.neuron.id,\n (this.nueronVisitMap?.get(subscriber.neuron.id) ?? 0) + 1\n );\n }\n }\n\n return {\n neuronId: subscriber.neuron.id,\n subscriber,\n inputSignal,\n };\n }\n\n private processQueueItem(\n item: TCNSStimulationQueueItem<\n TCollateralId,\n TNeuronId,\n TNeuron,\n TDendrite\n >\n ) {\n const { subscriber, inputSignal } = item;\n const { neuron, dendrite } = subscriber;\n\n // Mark neuron as active when processing starts\n this.markNeuronActive(neuron.id);\n\n const response = dendrite.response(\n inputSignal?.payload,\n neuron.axon,\n {\n get: () => this.ctx.get(neuron.id),\n set: (value: any) => this.ctx.set(neuron.id, value),\n },\n this.options?.abortSignal\n );\n\n if (response instanceof Promise) {\n return response.then(\n signal => {\n return () => {\n // Mark neuron as inactive when async processing completes\n this.markNeuronInactive(neuron.id);\n return this.processResponse(\n inputSignal as TCNSSignal<TCollateralId, any>,\n signal as TCNSSignal<TCollateralId, any> | undefined\n );\n };\n },\n error => {\n return () => {\n // Mark neuron as inactive when async processing fails\n this.markNeuronInactive(neuron.id);\n return this.processResponse(\n inputSignal as TCNSSignal<TCollateralId, 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.id);\n return this.processResponse(\n inputSignal as TCNSSignal<TCollateralId, any>,\n response as TCNSSignal<TCollateralId, any> | undefined\n );\n };\n }\n }\n\n protected processResponse(\n inputSignal?: TCNSSignal<TCollateralId, TInputPayload>,\n outputSignal?: TCNSSignal<TCollateralId, TOutputPayload>,\n error?: any\n ): void {\n const collateral = outputSignal?.collateral;\n const ownerNeuron = collateral\n ? this.cns.getParentNeuronByCollateralId(collateral.id)\n : undefined;\n const subscribers = collateral\n ? this.cns.getSubscribers(collateral.id)\n : [];\n const subscriberQueueItems: TCNSStimulationQueueItem<\n TCollateralId,\n TNeuronId,\n TNeuron,\n TDendrite\n >[] = [];\n\n if (collateral && !error) {\n if (ownerNeuron) {\n this.cleanupCtxIfNeeded(ownerNeuron);\n }\n\n for (let i = 0; i < subscribers.length; i++) {\n subscriberQueueItems.push(\n this.createSubscriberQueueItem(subscribers[i], outputSignal)\n );\n }\n }\n this.scheduledCount += subscriberQueueItems.length;\n\n // After we pre-enqueued all subscribers, we can trace the response\n this.options?.onResponse?.({\n inputSignal: inputSignal,\n outputSignal: outputSignal,\n ctx: this.ctx,\n queueLength: this.queue.length + this.scheduledCount,\n\n hops:\n this.options?.maxNeuronHops && ownerNeuron\n ? this.nueronVisitMap?.get(ownerNeuron.id) ?? 0\n : undefined,\n error,\n });\n\n // After we traced the response, we can enqueue the pre-enqueued subscribers\n // So if we have a synchronous response - the traces would go\n // from start to end and will show the correct queueLength === 0\n // in the end\n for (let i = 0; i < subscriberQueueItems.length; i++) {\n this.scheduledCount--;\n this.queue.enqueue(subscriberQueueItems[i]);\n }\n }\n\n public responseToSignal(\n signal: TCNSSignal<TCollateralId, TOutputPayload>\n ): void {\n // Mark the owner neuron of the initial signal as active\n const ownerNeuron = this.cns.getParentNeuronByCollateralId(\n signal.collateral.id\n );\n if (ownerNeuron) {\n this.markNeuronActive(ownerNeuron.id);\n }\n\n this.processResponse(undefined, signal);\n }\n}\n","import { TCNSNeuron } from './types/TCNSNeuron';\nimport { TCNSDendrite } from './types/TCNSDendrite';\nimport { ICNS } from './interfaces/ICNS';\nimport { TCNSSubscriber } from './types/TCNSSubscriber';\nimport { TCNSOptions } from './types/TCNSOptions';\nimport { TCNSStimulationOptions } from './types/TCNSStimulationOptions';\nimport { CNSStimulation } from './CNSStimulation';\nimport { CNSCollateral } from './CNSCollateral';\nimport { TCNSSignal } from './types/TCNSSignal';\n\nexport class CNS<\n TCollateralId extends string,\n TNeuronId extends string,\n TNeuron extends TCNSNeuron<any, TNeuronId, any, any, any, any, any>,\n TDendrite extends TCNSDendrite<any, any, any, any, any, any>\n> implements ICNS<TNeuron, TDendrite>\n{\n /**\n * Fast lookup: collateralId -> list of (neuron, dendrite) subscribers.\n * Built once at construction time.\n */\n private subIndex = new Map<\n TCollateralId,\n TCNSSubscriber<TNeuron, TDendrite>[]\n >();\n\n private parentNeuronByCollateralId = new Map<TCollateralId, TNeuron>();\n\n /**\n * Strongly Connected Components of the neuron graph.\n * Each component is a set of neuron IDs that can reach each other.\n */\n public stronglyConnectedComponents: Set<string>[] = [];\n\n /**\n * Quick lookup: neuron ID -> SCC index for fast reachability checks.\n */\n private neuronToSCC = new Map<string, number>();\n\n /**\n * DAG of SCCs: SCC index -> set of SCC indices that can reach this SCC\n */\n private sccDag: Map<number, Set<number>> = new Map();\n\n /**\n * Precomputed ancestor sets for each SCC for fast reachability checks\n */\n private sccAncestors: Map<number, Set<number>> = new Map();\n\n constructor(\n protected readonly neurons: TNeuron[],\n public readonly options?: TCNSOptions\n ) {\n this.buildIndexes();\n if (this.options?.autoCleanupContexts) {\n this.buildSCC();\n }\n }\n\n private buildIndexes() {\n this.subIndex.clear();\n this.parentNeuronByCollateralId.clear();\n for (const neuron of this.neurons) {\n for (const dendrite of neuron.dendrites) {\n const key = dendrite.collateral.id as TCollateralId;\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.parentNeuronByCollateralId.set(\n (collateral as CNSCollateral<TCollateralId, unknown>).id,\n neuron\n );\n });\n }\n }\n\n /**\n * Build the neuron graph where neurons are connected if one can stimulate the other.\n */\n private buildNeuronGraph(): Map<string, Set<string>> {\n const graph = new Map<string, Set<string>>();\n const neuronIds = this.neurons.map(n => n.id);\n\n // Initialize graph\n for (const neuronId of neuronIds) {\n graph.set(neuronId, new Set());\n }\n\n // Build edges: neuron -> neurons it can reach via its axons\n for (const neuron of this.neurons) {\n const reachableNeurons = new Set<string>();\n\n // Check what collaterals this neuron can emit\n for (const axonKey in neuron.axon) {\n const collateral = neuron.axon[axonKey];\n const collateralId = collateral.id as TCollateralId;\n\n // Find which neurons listen to this collateral\n const subscribers = this.subIndex.get(collateralId);\n if (subscribers) {\n for (const { neuron: targetNeuron } of subscribers) {\n reachableNeurons.add(targetNeuron.id);\n }\n }\n }\n\n graph.set(neuron.id, reachableNeurons);\n }\n\n return graph;\n }\n\n /**\n * Build strongly connected components using Tarjan's algorithm.\n */\n private buildSCC(): void {\n const graph = this.buildNeuronGraph();\n const neuronIds = this.neurons.map(n => n.id);\n\n // Tarjan's algorithm for SCC\n const index = new Map<string, number>();\n const lowlink = new Map<string, number>();\n const onStack = new Set<string>();\n const stack: string[] = [];\n const components: Set<string>[] = [];\n let currentIndex = 0;\n\n const strongConnect = (neuronId: string) => {\n index.set(neuronId, currentIndex);\n lowlink.set(neuronId, currentIndex);\n currentIndex++;\n stack.push(neuronId);\n onStack.add(neuronId);\n\n const neighbors = graph.get(neuronId) || new Set();\n for (const neighbor of neighbors) {\n if (!index.has(neighbor)) {\n strongConnect(neighbor);\n lowlink.set(\n neuronId,\n Math.min(lowlink.get(neuronId)!, lowlink.get(neighbor)!)\n );\n } else if (onStack.has(neighbor)) {\n lowlink.set(\n neuronId,\n Math.min(lowlink.get(neuronId)!, index.get(neighbor)!)\n );\n }\n }\n\n if (lowlink.get(neuronId) === index.get(neuronId)) {\n const component = new Set<string>();\n let w: string;\n do {\n w = stack.pop()!;\n onStack.delete(w);\n component.add(w);\n } while (w !== neuronId);\n components.push(component);\n }\n };\n\n // Run Tarjan's algorithm on all unvisited neurons\n for (const neuronId of neuronIds) {\n if (!index.has(neuronId)) {\n strongConnect(neuronId);\n }\n }\n\n this.stronglyConnectedComponents = components;\n\n // Build quick lookup map for reachability checks\n for (let i = 0; i < components.length; i++) {\n for (const neuronId of components[i]) {\n this.neuronToSCC.set(neuronId, i);\n }\n }\n\n // Build DAG between SCCs\n this.buildSCCDAG(graph);\n\n // Precompute ancestor sets for fast reachability checks\n this.buildSCCAncestors();\n }\n\n /**\n * Build DAG between SCCs based on the original neuron graph\n */\n private buildSCCDAG(neuronGraph: Map<string, Set<string>>): void {\n this.sccDag.clear();\n\n // Initialize DAG\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n this.sccDag.set(i, new Set());\n }\n\n // Build edges between SCCs\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const scc = this.stronglyConnectedComponents[i];\n\n for (const neuronId of scc) {\n const neighbors = neuronGraph.get(neuronId) || new Set();\n\n for (const neighborId of neighbors) {\n const neighborSccIndex = this.neuronToSCC.get(neighborId);\n if (\n neighborSccIndex !== undefined &&\n neighborSccIndex !== i\n ) {\n // Add edge: neighborSccIndex -> i (neighbor can reach this SCC)\n this.sccDag.get(neighborSccIndex)!.add(i);\n }\n }\n }\n }\n }\n\n /**\n * Precompute ancestor sets for each SCC for fast reachability checks\n * Uses topological sort for efficient computation\n */\n private buildSCCAncestors(): void {\n this.sccAncestors.clear();\n\n // Initialize ancestor sets\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n this.sccAncestors.set(i, new Set());\n }\n\n // Topological sort to compute ancestors efficiently\n const inDegree = new Map<number, number>();\n const queue: number[] = [];\n\n // Calculate in-degrees\n for (let i = 0; i < this.stronglyConnectedComponents.length; i++) {\n const incomingEdges = this.sccDag.get(i) || new Set();\n inDegree.set(i, incomingEdges.size);\n\n if (incomingEdges.size === 0) {\n queue.push(i);\n }\n }\n\n // Process nodes in topological order\n while (queue.length > 0) {\n const current = queue.shift()!;\n const outgoingEdges = this.getOutgoingEdges(current);\n\n for (const neighbor of outgoingEdges) {\n // Add current as ancestor of neighbor\n const neighborAncestors = this.sccAncestors.get(neighbor)!;\n neighborAncestors.add(current);\n\n // Add all ancestors of current to neighbor\n const currentAncestors = this.sccAncestors.get(current)!;\n for (const ancestor of currentAncestors) {\n neighborAncestors.add(ancestor);\n }\n\n // Decrease in-degree\n const newInDegree = (inDegree.get(neighbor) || 0) - 1;\n inDegree.set(neighbor, newInDegree);\n\n if (newInDegree === 0) {\n queue.push(neighbor);\n }\n }\n }\n }\n\n /**\n * Get outgoing edges for a given SCC index\n */\n private getOutgoingEdges(sccIndex: number): Set<number> {\n const outgoing = new Set<number>();\n\n // Find all SCCs that have this SCC as an incoming edge\n for (const [targetScc, incomingEdges] of this.sccDag) {\n if (incomingEdges.has(sccIndex)) {\n outgoing.add(targetScc);\n }\n }\n\n return outgoing;\n }\n\n /**\n * Check if a neuron can be reached again (including self-calling).\n * Returns true if the neuron is in a strongly connected component with more than one member,\n * or if it's in a single-member SCC that can reach itself.\n */\n public getSCCSetByNeuronId(neuronId: string) {\n const sccIndex = this.neuronToSCC.get(neuronId);\n\n if (sccIndex === undefined) return;\n\n return this.stronglyConnectedComponents[sccIndex];\n }\n\n /**\n * Get the SCC index for a given neuron ID\n */\n public getSccIndexByNeuronId(neuronId: string): number | undefined {\n return this.neuronToSCC.get(neuronId);\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 neuronId: string,\n activeSccCounts: Map<number, number>\n ): boolean {\n const sccIndex = this.neuronToSCC.get(neuronId);\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 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 public getParentNeuronByCollateralId(collateralId: TCollateralId) {\n return this.parentNeuronByCollateralId.get(collateralId);\n }\n\n public getSubscribers(\n collateralId: TCollateralId\n ): TCNSSubscriber<TNeuron, TDendrite>[] {\n return this.subIndex.get(collateralId) ?? [];\n }\n\n public stimulate<TInputPayload extends TOutputPayload, TOutputPayload>(\n signal: TCNSSignal<TCollateralId, TInputPayload>,\n options?: TCNSStimulationOptions<\n TCollateralId,\n TInputPayload,\n TOutputPayload\n >\n ) {\n const stimulation = new CNSStimulation<\n TCollateralId,\n TNeuronId,\n TNeuron,\n TDendrite,\n TInputPayload,\n TOutputPayload\n >(this, options);\n stimulation.responseToSignal(signal);\n }\n}\n","import { TCNSSignal } from './types/TCNSSignal';\nimport { ICNSCollateral } from './interfaces/ICNSCollateral';\n\nexport class CNSCollateral<TId extends string, TPayload>\n implements ICNSCollateral<TId, TPayload>\n{\n constructor(public readonly id: TId) {}\n\n createSignal(): TCNSSignal<TId, TPayload>;\n createSignal(payload: TPayload): TCNSSignal<TId, TPayload>;\n createSignal(payload?: TPayload): TCNSSignal<TId, TPayload> {\n return { collateral: this, payload };\n }\n}\n","import { CNSCollateral } from '../CNSCollateral';\nimport { TCNSAxon } from '../types/TCNSAxon';\nimport { TCNSDendrite } from '../types/TCNSDendrite';\n\nexport const collateral = <TPayload = undefined, TId extends string = string>(\n id: TId\n) => new CNSCollateral<TId, TPayload>(id);\n\ntype InterNeuronAPI<\n TContextValue,\n TIdType extends string,\n TReceiverCollateralIdType extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload\n >\n> = {\n id: TIdType;\n axon: TAxonType;\n dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >[];\n dendrite: <\n TSenderExactCollateralIdType extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralIdType,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n ) => InterNeuronAPI<\n TContextValue,\n TIdType,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >;\n};\n\n// Concrete builder\nexport const neuron = <\n TContextValue,\n TIdType extends string,\n TReceiverCollateralIdType extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload\n >\n>(\n id: TIdType,\n axon: TAxonType\n): InterNeuronAPI<\n TContextValue,\n TIdType,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n> => {\n const dendrites: TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >[] = [];\n\n const api: InterNeuronAPI<\n TContextValue,\n TIdType,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n > = {\n axon,\n id,\n dendrites,\n dendrite<\n TSenderExactCollateralIdType extends string,\n TSenderExactAxonCollateralPayload\n >(\n s: TCNSDendrite<\n TContextValue,\n TSenderExactCollateralIdType,\n TSenderExactAxonCollateralPayload,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n ) {\n dendrites.push(\n s as TCNSDendrite<\n TContextValue,\n string,\n unknown,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >\n );\n return api; // keep full API for chaining\n },\n };\n\n return api;\n};\n\nexport const withCtx = <TContextValue>() => ({\n neuron: <\n TIdType extends string,\n TReceiverCollateralIdType extends string,\n TReceiverAxonCollateralPayload,\n TAxonType extends TCNSAxon<\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload\n >\n >(\n id: TIdType,\n axon: TAxonType\n ) => {\n return neuron<\n TContextValue,\n TIdType,\n TReceiverCollateralIdType,\n TReceiverAxonCollateralPayload,\n TAxonType\n >(id, axon);\n },\n});\n"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { CNS } from './CNS';
|
|
2
|
+
export { CNSCollateral } from './CNSCollateral';
|
|
3
|
+
export type { TCNSNeuron } from './types/TCNSNeuron';
|
|
4
|
+
export type { TCNSAxon } from './types/TCNSAxon';
|
|
5
|
+
export type { TCNSDendrite } from './types/TCNSDendrite';
|
|
6
|
+
export type { TCNSSignal } from './types/TCNSSignal';
|
|
7
|
+
export { collateral, neuron, withCtx } from './factory/index';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
|