{"version":3,"sources":["../../src/client/paths.ts","../../src/client/websocket.ts"],"names":["WebSocketStatus","callbacks"],"mappings":";;;;AA6EO,SAAS,aAAA,CAAc,SAAiB,IAAsB,EAAA;AAEnE,EAAM,MAAA,iBAAA,GAAoB,QAAQ,QAAS,CAAA,GAAG,IAC1C,OAAQ,CAAA,KAAA,CAAM,CAAG,EAAA,EAAE,CACnB,GAAA,OAAA;AAGJ,EAAA,MAAM,iBAAiB,IAAK,CAAA,UAAA,CAAW,GAAG,CACtC,GAAA,IAAA,GACA,IAAI,IAAI,CAAA,CAAA;AAEZ,EAAO,OAAA,CAAA,EAAG,iBAAiB,CAAA,EAAG,cAAc,CAAA,CAAA;AAC9C;AAZgB,MAAA,CAAA,aAAA,EAAA,eAAA,CAAA;;;AChCJ,IAAA,eAAA,qBAAAA,gBAAL,KAAA;AACL,EAAAA,gBAAAA,CAAAA,gBAAAA,CAAA,gBAAa,CAAb,CAAA,GAAA,YAAA;AACA,EAAAA,gBAAAA,CAAAA,gBAAAA,CAAA,eAAY,CAAZ,CAAA,GAAA,WAAA;AACA,EAAAA,gBAAAA,CAAAA,gBAAAA,CAAA,aAAU,CAAV,CAAA,GAAA,SAAA;AACA,EAAAA,gBAAAA,CAAAA,gBAAAA,CAAA,YAAS,CAAT,CAAA,GAAA,QAAA;AACA,EAAAA,gBAAAA,CAAAA,gBAAAA,CAAA,kBAAe,CAAf,CAAA,GAAA,cAAA;AACA,EAAAA,gBAAAA,CAAAA,gBAAAA,CAAA,WAAQ,CAAR,CAAA,GAAA,OAAA;AANU,EAAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AAsBL,IAAM,aAAA,GAAN,MAAM,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA,EA4BxB,YAAY,OAAkF,EAAA;AA3B9F,IAAA,IAAA,CAAQ,EAAuB,GAAA,IAAA;AAK/B,IAAA,IAAA,CAAQ,iBAA4B,GAAA,CAAA;AACpC,IAAA,IAAA,CAAQ,oBAA+B,GAAA,EAAA;AACvC,IAAA,IAAA,CAAQ,cAAyB,GAAA,GAAA;AACjC,IAAA,IAAA,CAAQ,WAAmC,EAAC;AAC5C,IAAA,IAAA,CAAQ,MAA0B,GAAA,CAAA;AAClC,IAAA,IAAA,CAAQ,eAAmC,EAAC;AAC5C,IAAQ,IAAA,CAAA,aAAA,uBAA2D,GAAI,EAAA;AAIvE,IAAA,IAAA,CAAQ,cAAyB,GAAA,IAAA;AACjC;AAAA,IAAA,IAAA,CAAQ,YAAuB,GAAA,EAAA;AAC/B,IAAA,IAAA,CAAQ,aAAyB,GAAA,KAAA;AACjC,IAAA,IAAA,CAAQ,cAAyB,GAAA,aAAA;AACjC,IAAA,IAAA,CAAQ,aAAyB,GAAA,IAAA;AACjC,IAAA,IAAA,CAAQ,kBAA6B,GAAA,CAAA;AACrC,IAAA,IAAA,CAAQ,oBAA6D,GAAA,IAAA;AACrE,IAAA,IAAA,CAAQ,WAAuB,GAAA,KAAA;AAO7B,IAAI,IAAA,SAAA,GAAY,QAAQ,OAAW,IAAA,oBAAA;AACnC,IAAY,SAAA,GAAA,SAAA,CAAU,OAAQ,CAAA,OAAA,EAAS,IAAI,CAAA;AAE3C,IAAA,IAAA,CAAK,OAAU,GAAA,SAAA;AACf,IAAA,IAAA,CAAK,SAAS,OAAQ,CAAA,MAAA;AACtB,IAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,KAAA;AACrB,IAAA,IAAA,CAAK,WAAW,OAAQ,CAAA,QAAA;AACxB,IAAK,IAAA,CAAA,aAAA,GAAgB,QAAQ,aAAkB,KAAA,KAAA;AAE/C,IAAI,IAAA,OAAA,CAAQ,yBAAyB,MAAW,EAAA;AAC9C,MAAA,IAAA,CAAK,uBAAuB,OAAQ,CAAA,oBAAA;AAAA;AACtC;AACF;AAAA;AAAA;AAAA,EAKA,OAAQ,CAAA,IAAA,GAAe,aAAe,EAAA,QAAA,GAAmC,EAAU,EAAA;AACjF,IAAA,IAAI,KAAK,EAAM,IAAA,IAAA,CAAK,EAAG,CAAA,UAAA,KAAe,UAAU,IAAM,EAAA;AACpD,MAAA,OAAA,CAAQ,KAAK,gEAAgE,CAAA;AAC7E,MAAA;AAAA;AAIF,IAAA,IAAA,CAAK,cAAiB,GAAA,IAAA;AAGtB,IAAA,IAAA,CAAK,WAAc,GAAA,KAAA;AAGnB,IAAA,IAAA,CAAK,UAAU,CAA0B,kBAAA;AAGzC,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA;AAGhB,IAAK,IAAA,CAAA,kBAAA,GAAqB,KAAK,GAAI,EAAA;AAGnC,IAAA,MAAM,MAAM,IAAI,GAAA,CAAI,cAAc,IAAK,CAAA,OAAA,EAAS,IAAI,CAAC,CAAA;AAGrD,IAAK,IAAA,CAAA,YAAA,GAAe,KAAK,oBAAqB,EAAA;AAG9C,IAAA,IAAI,KAAK,MAAQ,EAAA;AACf,MAAA,GAAA,CAAI,YAAa,CAAA,MAAA,CAAO,QAAU,EAAA,IAAA,CAAK,MAAM,CAAA;AAAA;AAE/C,IAAA,IAAI,KAAK,KAAO,EAAA;AACd,MAAA,GAAA,CAAI,YAAa,CAAA,MAAA,CAAO,OAAS,EAAA,IAAA,CAAK,KAAK,CAAA;AAAA;AAE7C,IAAA,IAAI,KAAK,QAAU,EAAA;AACjB,MAAA,GAAA,CAAI,YAAa,CAAA,MAAA,CAAO,UAAY,EAAA,IAAA,CAAK,QAAQ,CAAA;AAAA;AAInD,IAAA,GAAA,CAAI,YAAa,CAAA,MAAA,CAAO,cAAgB,EAAA,IAAA,CAAK,YAAY,CAAA;AAGzD,IAAI,IAAA;AACF,MAAA,IAAA,CAAK,EAAK,GAAA,IAAI,SAAU,CAAA,GAAA,CAAI,UAAU,CAAA;AAGtC,MAAA,IAAA,CAAK,aAAgB,GAAA,OAAO,IAAK,CAAA,EAAA,CAAG,UAAe,KAAA,WAAA;AACnD,MAAA,IAAI,KAAK,aAAe,EAAA;AACtB,QAAA,IAAA,CAAK,GAAG,UAAa,GAAA,aAAA;AAAA;AAIvB,MAAA,IAAA,CAAK,EAAG,CAAA,MAAA,GAAS,IAAK,CAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAC1C,MAAA,IAAA,CAAK,EAAG,CAAA,SAAA,GAAY,IAAK,CAAA,aAAA,CAAc,KAAK,IAAI,CAAA;AAChD,MAAA,IAAA,CAAK,EAAG,CAAA,OAAA,GAAU,IAAK,CAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAC5C,MAAA,IAAA,CAAK,EAAG,CAAA,OAAA,GAAU,IAAK,CAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,aACrC,KAAO,EAAA;AACd,MAAA,IAAA,CAAK,sBAAsB,KAAK,CAAA;AAAA;AAClC;AACF;AAAA;AAAA;AAAA,EAKQ,UAAU,SAAkC,EAAA;AAClD,IAAI,IAAA,IAAA,CAAK,WAAW,SAAW,EAAA;AAC7B,MAAA,IAAA,CAAK,MAAS,GAAA,SAAA;AAGd,MAAI,IAAA,IAAA,CAAK,SAAS,cAAgB,EAAA;AAChC,QAAI,IAAA;AACF,UAAK,IAAA,CAAA,QAAA,CAAS,eAAe,SAAS,CAAA;AAAA,iBAC/B,KAAO,EAAA;AACd,UAAQ,OAAA,CAAA,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAAA;AAClE;AACF;AACF;AACF;AAAA;AAAA;AAAA,EAKQ,WAAW,KAAoB,EAAA;AACrC,IAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA;AAGzC,IAAA,IAAA,CAAK,UAAU,CAAyB,iBAAA;AAGxC,IAAA,IAAA,CAAK,iBAAoB,GAAA,CAAA;AAGzB,IAAI,IAAA,IAAA,CAAK,SAAS,MAAQ,EAAA;AACxB,MAAI,IAAA;AACF,QAAK,IAAA,CAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,eACnB,KAAO,EAAA;AACd,QAAQ,OAAA,CAAA,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAAA;AACzD;AAIF,IAAA,IAAA,CAAK,cAAe,EAAA;AAGpB,IAAA,IAAA,CAAK,YAAa,EAAA;AAAA;AACpB;AAAA;AAAA;AAAA,EAKQ,cAAc,KAA2B,EAAA;AAE/C,IAAI,IAAA,IAAA;AACJ,IAAI,IAAA,WAAA;AAEJ,IAAI,IAAA;AAEF,MAAA,IAAI,IAAK,CAAA,aAAA,IAAiB,KAAM,CAAA,IAAA,YAAgB,WAAa,EAAA;AAE3D,QAAA,MAAM,IAAO,GAAA,IAAI,UAAW,CAAA,KAAA,CAAM,IAAI,CAAA;AAEtC,QAAM,MAAA,WAAA,GAAc,IAAI,WAAY,EAAA;AACpC,QAAO,IAAA,GAAA,WAAA,CAAY,OAAO,IAAI,CAAA;AAAA,OACzB,MAAA;AAEL,QAAO,IAAA,GAAA,IAAA,CAAK,KAAM,CAAA,KAAA,CAAM,IAAI,CAAA;AAC5B,QAAA,WAAA,GAAc,IAAK,CAAA,IAAA;AAAA;AAIrB,MAAI,IAAA,IAAA,CAAK,SAAS,SAAW,EAAA;AAC3B,QAAI,IAAA;AACF,UAAA,IAAA,CAAK,QAAS,CAAA,SAAA,CAAU,KAAM,CAAA,IAAA,EAAM,WAAW,CAAA;AAAA,iBACxC,KAAO,EAAA;AACd,UAAQ,OAAA,CAAA,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAAA;AAC5D;AAIF,MAAI,IAAA,WAAA,IAAe,KAAK,QAAS,CAAA,aAAA,IAAiB,KAAK,QAAS,CAAA,aAAA,CAAc,WAAW,CAAG,EAAA;AAC1F,QAAI,IAAA;AACF,UAAA,IAAA,CAAK,QAAS,CAAA,aAAA,CAAc,WAAW,CAAA,CAAE,IAAI,CAAA;AAAA,iBACtC,KAAO,EAAA;AACd,UAAA,OAAA,CAAQ,KAAM,CAAA,CAAA,4CAAA,EAA+C,WAAW,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA;AACpF;AAIF,MAAA,IAAI,WAAe,IAAA,IAAA,CAAK,aAAc,CAAA,GAAA,CAAI,WAAW,CAAG,EAAA;AACtD,QAAA,MAAM,SAAY,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,CAAI,WAAW,CAAA;AACpD,QAAA,IAAI,SAAW,EAAA;AACb,UAAA,SAAA,CAAU,QAAQ,CAAY,QAAA,KAAA;AAC5B,YAAI,IAAA;AACF,cAAA,QAAA,CAAS,IAAI,CAAA;AAAA,qBACN,KAAO,EAAA;AACd,cAAA,OAAA,CAAQ,KAAM,CAAA,CAAA,6CAAA,EAAgD,WAAW,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA;AACrF,WACD,CAAA;AAAA;AACH;AAIF,MAAI,IAAA,WAAA,KAAgB,WAAe,IAAA,IAAA,CAAK,iBAAmB,EAAA;AACzD,QAAA,MAAM,OAAU,GAAA,IAAA,CAAK,GAAI,EAAA,GAAI,IAAK,CAAA,iBAAA;AAElC,QAAI,IAAA,IAAA,CAAK,SAAS,WAAa,EAAA;AAC7B,UAAI,IAAA;AACF,YAAK,IAAA,CAAA,QAAA,CAAS,YAAY,OAAO,CAAA;AAAA,mBAC1B,KAAO,EAAA;AACd,YAAQ,OAAA,CAAA,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAAA;AAC9D;AACF;AACF,aACO,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAAA;AAC5D;AACF;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAoB,EAAA;AACtC,IAAQ,OAAA,CAAA,KAAA,CAAM,oBAAoB,KAAK,CAAA;AAGvC,IAAA,IAAA,CAAK,UAAU,CAAqB,aAAA;AAGpC,IAAI,IAAA,IAAA,CAAK,SAAS,OAAS,EAAA;AACzB,MAAI,IAAA;AACF,QAAK,IAAA,CAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,eACpB,KAAO,EAAA;AACd,QAAQ,OAAA,CAAA,KAAA,CAAM,qCAAqC,KAAK,CAAA;AAAA;AAC1D;AACF;AACF;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAyB,EAAA;AAC3C,IAAA,OAAA,CAAQ,IAAI,CAA8B,2BAAA,EAAA,KAAA,CAAM,IAAI,CAAa,UAAA,EAAA,KAAA,CAAM,MAAM,CAAE,CAAA,CAAA;AAG/E,IAAA,IAAA,CAAK,UAAU,CAAsB,cAAA;AAGrC,IAAA,IAAA,CAAK,aAAc,EAAA;AAGnB,IAAI,IAAA,IAAA,CAAK,SAAS,OAAS,EAAA;AACzB,MAAI,IAAA;AACF,QAAK,IAAA,CAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,eACpB,KAAO,EAAA;AACd,QAAQ,OAAA,CAAA,KAAA,CAAM,qCAAqC,KAAK,CAAA;AAAA;AAC1D;AAIF,IAAA,IAAI,CAAC,IAAA,CAAK,WAAe,IAAA,IAAA,CAAK,aAAe,EAAA;AAC3C,MAAA,IAAA,CAAK,gBAAiB,EAAA;AAAA;AACxB;AACF;AAAA;AAAA;AAAA,EAKQ,sBAAsB,KAAkB,EAAA;AAC9C,IAAQ,OAAA,CAAA,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAGlD,IAAA,IAAA,CAAK,UAAU,CAAqB,aAAA;AAGpC,IAAA,IAAI,KAAK,aAAe,EAAA;AACtB,MAAA,IAAA,CAAK,gBAAiB,EAAA;AAAA;AACxB;AACF;AAAA;AAAA;AAAA,EAKA,KAAK,OAAoC,EAAA;AAEvC,IAAA,IAAI,CAAC,IAAK,CAAA,EAAA,IAAM,KAAK,EAAG,CAAA,UAAA,KAAe,UAAU,IAAM,EAAA;AAErD,MAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAGzB,MAAA,IAAI,CAAC,IAAK,CAAA,EAAA,IAAM,KAAK,EAAG,CAAA,UAAA,KAAe,UAAU,MAAQ,EAAA;AACvD,QAAA,IAAA,CAAK,OAAQ,CAAA,IAAA,CAAK,cAAgB,EAAA,IAAA,CAAK,QAAQ,CAAA;AAAA;AAGjD,MAAO,OAAA,KAAA;AAAA;AAGT,IAAI,IAAA;AAEF,MAAI,IAAA,CAAC,QAAQ,EAAI,EAAA;AACf,QAAQ,OAAA,CAAA,EAAA,GAAK,KAAK,iBAAkB,EAAA;AAAA;AAItC,MAAA,IAAA,CAAK,EAAG,CAAA,IAAA,CAAK,IAAK,CAAA,SAAA,CAAU,OAAO,CAAC,CAAA;AACpC,MAAO,OAAA,IAAA;AAAA,aACA,KAAO,EAAA;AACd,MAAQ,OAAA,CAAA,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAGvD,MAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AACzB,MAAO,OAAA,KAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA,EAKQ,aAAa,OAAiC,EAAA;AAEpD,IAAI,IAAA,IAAA,CAAK,YAAa,CAAA,MAAA,IAAU,GAAK,EAAA;AACnC,MAAA,OAAA,CAAQ,KAAK,0DAA0D,CAAA;AACvE,MAAA,IAAA,CAAK,aAAa,KAAM,EAAA;AAAA;AAG1B,IAAK,IAAA,CAAA,YAAA,CAAa,KAAK,OAAO,CAAA;AAAA;AAChC;AAAA;AAAA;AAAA,EAKQ,YAAqB,GAAA;AAC3B,IAAI,IAAA,IAAA,CAAK,EAAM,IAAA,IAAA,CAAK,EAAG,CAAA,UAAA,KAAe,UAAU,IAAQ,IAAA,IAAA,CAAK,YAAa,CAAA,MAAA,GAAS,CAAG,EAAA;AACpF,MAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,WAAA,EAAc,IAAK,CAAA,YAAA,CAAa,MAAM,CAA4B,0BAAA,CAAA,CAAA;AAE9E,MAAA,MAAM,KAAQ,GAAA,CAAC,GAAG,IAAA,CAAK,YAAY,CAAA;AACnC,MAAA,IAAA,CAAK,eAAe,EAAC;AAErB,MAAA,KAAA,MAAW,WAAW,KAAO,EAAA;AAC3B,QAAA,IAAI,CAAC,IAAA,CAAK,IAAK,CAAA,OAAO,CAAG,EAAA;AACvB,UAAA;AAAA;AACF;AACF;AACF;AACF;AAAA;AAAA;AAAA,EAKA,SAAA,CAAmB,MAAc,QAAoD,EAAA;AAEnF,IAAM,MAAA,EAAA,GAAK,KAAK,sBAAuB,EAAA;AAGvC,IAAA,IAAI,CAAC,IAAA,CAAK,aAAc,CAAA,GAAA,CAAI,IAAI,CAAG,EAAA;AACjC,MAAA,IAAA,CAAK,aAAc,CAAA,GAAA,CAAI,IAAM,kBAAA,IAAI,KAAK,CAAA;AAAA;AAGxC,IAAA,MAAM,SAAY,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,CAAI,IAAI,CAAA;AAC7C,IAAA,SAAA,CAAU,IAAI,QAAe,CAAA;AAG7B,IAAA,MAAM,8BAAoB,MAAA,CAAA,MAAA;AACxB,MAAA,IAAI,IAAK,CAAA,aAAA,CAAc,GAAI,CAAA,IAAI,CAAG,EAAA;AAChC,QAAA,MAAMC,UAAY,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,CAAI,IAAI,CAAA;AAC7C,QAAAA,UAAAA,CAAU,OAAO,QAAe,CAAA;AAEhC,QAAIA,IAAAA,UAAAA,CAAU,SAAS,CAAG,EAAA;AACxB,UAAK,IAAA,CAAA,aAAA,CAAc,OAAO,IAAI,CAAA;AAAA;AAChC;AACF,KARkB,EAAA,aAAA,CAAA;AAYpB,IAAO,OAAA;AAAA,MACL,EAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,GAAa,EAAA,KAAA,GAAgB,CAAY,EAAA;AAClD,IAAA,OAAO,KAAK,IAAK,CAAA;AAAA,MACf,IAAM,EAAA,SAAA;AAAA,MACN,GAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAKA,UAAmB,GAAA;AAEjB,IAAA,IAAA,CAAK,WAAc,GAAA,IAAA;AAGnB,IAAA,IAAA,CAAK,aAAc,EAAA;AAGnB,IAAA,IAAI,KAAK,oBAAsB,EAAA;AAC7B,MAAA,YAAA,CAAa,KAAK,oBAAoB,CAAA;AACtC,MAAA,IAAA,CAAK,oBAAuB,GAAA,IAAA;AAAA;AAI9B,IAAA,IAAI,KAAK,EAAI,EAAA;AACX,MAAI,IAAA;AAEF,QAAI,IAAA,IAAA,CAAK,GAAG,UAAe,KAAA,SAAA,CAAU,QAAQ,IAAK,CAAA,EAAA,CAAG,UAAe,KAAA,SAAA,CAAU,UAAY,EAAA;AACxF,UAAA,IAAA,CAAK,UAAU,CAAuB,eAAA;AACtC,UAAK,IAAA,CAAA,EAAA,CAAG,KAAM,CAAA,GAAA,EAAM,mBAAmB,CAAA;AAAA;AACzC,eACO,KAAO,EAAA;AACd,QAAQ,OAAA,CAAA,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAAA,OAC/C,SAAA;AACA,QAAA,IAAA,CAAK,EAAK,GAAA,IAAA;AACV,QAAA,IAAA,CAAK,UAAU,CAAsB,cAAA;AAAA;AACvC;AACF;AACF;AAAA;AAAA;AAAA,EAKA,QAA4B,GAAA;AAE1B,IAAI,IAAA,CAAC,KAAK,EAAI,EAAA;AACZ,MAAO,OAAA,CAAA;AAAA;AAIT,IAAA,IAAI,IAAK,CAAA,MAAA,KAAW,CAAgC,uBAAA,IAAA,CAAK,WAAW,CAAuB,cAAA;AACzF,MAAQ,QAAA,IAAA,CAAK,GAAG,UAAY;AAAA,QAC1B,KAAK,SAAU,CAAA,UAAA;AACb,UAAO,OAAA,CAAA;AAAA,QACT,KAAK,SAAU,CAAA,IAAA;AACb,UAAO,OAAA,CAAA;AAAA,QACT,KAAK,SAAU,CAAA,OAAA;AACb,UAAO,OAAA,CAAA;AAAA,QACT,KAAK,SAAU,CAAA,MAAA;AACb,UAAO,OAAA,CAAA;AAAA,QACT;AACE,UAAO,OAAA,CAAA;AAAA;AACX;AAIF,IAAA,OAAO,IAAK,CAAA,MAAA;AAAA;AACd;AAAA;AAAA;AAAA,EAKQ,gBAAyB,GAAA;AAE/B,IAAA,IAAI,KAAK,oBAAsB,EAAA;AAC7B,MAAA,YAAA,CAAa,KAAK,oBAAoB,CAAA;AACtC,MAAA,IAAA,CAAK,oBAAuB,GAAA,IAAA;AAAA;AAI9B,IAAI,IAAA,IAAA,CAAK,iBAAqB,IAAA,IAAA,CAAK,oBAAsB,EAAA;AACvD,MAAA,OAAA,CAAQ,KAAM,CAAA,CAAA,yCAAA,EAA4C,IAAK,CAAA,oBAAoB,CAAW,SAAA,CAAA,CAAA;AAC9F,MAAA;AAAA;AAIF,IAAA,IAAI,KAAK,WAAa,EAAA;AACpB,MAAA;AAAA;AAIF,IAAK,IAAA,CAAA,iBAAA,EAAA;AAEL,IAAA,MAAM,YAAY,IAAK,CAAA,cAAA;AACvB,IAAA,MAAM,mBAAmB,SAAY,GAAA,IAAA,CAAK,IAAI,GAAK,EAAA,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAC7E,IAAA,MAAM,QAAW,GAAA,GAAA;AACjB,IAAA,MAAM,WAAc,GAAA,IAAA,CAAK,GAAI,CAAA,gBAAA,EAAkB,QAAQ,CAAA;AACvD,IAAA,MAAM,SAAS,WAAc,GAAA,GAAA;AAC7B,IAAA,MAAM,QAAQ,WAAe,IAAA,IAAA,CAAK,MAAO,EAAA,GAAI,SAAS,CAAI,GAAA,MAAA,CAAA;AAE1D,IAAA,IAAA,CAAK,UAAU,CAA4B,oBAAA;AAC3C,IAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,0BAAA,EAA6B,IAAK,CAAA,KAAA,CAAM,KAAK,CAAC,CAAe,YAAA,EAAA,IAAA,CAAK,iBAAiB,CAAA,CAAA,EAAI,IAAK,CAAA,oBAAoB,CAAG,CAAA,CAAA,CAAA;AAG/H,IAAK,IAAA,CAAA,oBAAA,GAAuB,WAAW,MAAM;AAC3C,MAAA,IAAA,CAAK,OAAQ,CAAA,IAAA,CAAK,cAAgB,EAAA,IAAA,CAAK,QAAQ,CAAA;AAAA,OAC9C,KAAK,CAAA;AAAA;AACV;AAAA;AAAA;AAAA,EAKQ,cAAuB,GAAA;AAE7B,IAAA,IAAA,CAAK,aAAc,EAAA;AAGnB,IAAK,IAAA,CAAA,iBAAA,GAAoB,MAAO,CAAA,WAAA,CAAY,MAAM;AAEhD,MAAA,IAAI,KAAK,EAAM,IAAA,IAAA,CAAK,EAAG,CAAA,UAAA,KAAe,UAAU,IAAM,EAAA;AAEpD,QAAK,IAAA,CAAA,iBAAA,GAAoB,KAAK,GAAI,EAAA;AAGlC,QAAA,IAAA,CAAK,IAAK,CAAA;AAAA,UACR,IAAM,EAAA,WAAA;AAAA,UACN,WAAW,IAAK,CAAA;AAAA,SACjB,CAAA;AAGD,QAAK,IAAA,CAAA,gBAAA,GAAmB,MAAO,CAAA,UAAA,CAAW,MAAM;AAC9C,UAAA,OAAA,CAAQ,KAAK,6BAA6B,CAAA;AAG1C,UAAA,IAAI,KAAK,EAAM,IAAA,IAAA,CAAK,EAAG,CAAA,UAAA,KAAe,UAAU,IAAM,EAAA;AACpD,YAAA,IAAA,CAAK,UAAW,EAAA;AAEhB,YAAA,IAAI,KAAK,aAAe,EAAA;AACtB,cAAA,IAAA,CAAK,OAAQ,CAAA,IAAA,CAAK,cAAgB,EAAA,IAAA,CAAK,QAAQ,CAAA;AAAA;AACjD;AACF,WACC,GAAI,CAAA;AAAA;AACT,KACF,EAAG,KAAK,cAAc,CAAA;AAAA;AACxB;AAAA;AAAA;AAAA,EAKQ,aAAsB,GAAA;AAE5B,IAAA,IAAI,KAAK,iBAAmB,EAAA;AAC1B,MAAA,aAAA,CAAc,KAAK,iBAAiB,CAAA;AACpC,MAAA,IAAA,CAAK,iBAAoB,GAAA,MAAA;AAAA;AAI3B,IAAA,IAAI,KAAK,gBAAkB,EAAA;AACzB,MAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,MAAA,IAAA,CAAK,gBAAmB,GAAA,MAAA;AAAA;AAC1B;AACF;AAAA;AAAA;AAAA,EAKA,qBAAqB,UAA0B,EAAA;AAC7C,IAAA,IAAI,aAAa,GAAM,EAAA;AACrB,MAAA,OAAA,CAAQ,KAAK,iDAAiD,CAAA;AAC9D,MAAa,UAAA,GAAA,GAAA;AAAA;AAGf,IAAA,IAAA,CAAK,cAAiB,GAAA,UAAA;AAGtB,IAAA,IAAI,KAAK,EAAM,IAAA,IAAA,CAAK,EAAG,CAAA,UAAA,KAAe,UAAU,IAAM,EAAA;AACpD,MAAA,IAAA,CAAK,cAAe,EAAA;AAAA;AACtB;AACF;AAAA;AAAA;AAAA,EAKA,wBAAwB,QAAwB,EAAA;AAC9C,IAAA,IAAA,CAAK,oBAAuB,GAAA,QAAA;AAAA;AAC9B;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAuB,EAAA;AACvC,IAAA,IAAA,CAAK,cAAiB,GAAA,OAAA;AAAA;AACxB;AAAA;AAAA;AAAA,EAKQ,sBAAiC,GAAA;AACvC,IAAO,OAAA,CAAA,IAAA,EAAO,IAAK,CAAA,GAAA,EAAK,CAAA,CAAA,EAAI,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,MAAA,EAAW,GAAA,GAAO,CAAC,CAAA,CAAA;AAAA;AACjE;AAAA;AAAA;AAAA,EAKQ,iBAA4B,GAAA;AAClC,IAAO,OAAA,CAAA,IAAA,EAAO,IAAK,CAAA,GAAA,EAAK,CAAA,CAAA,EAAI,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,MAAA,EAAW,GAAA,GAAO,CAAC,CAAA,CAAA;AAAA;AACjE;AAAA;AAAA;AAAA,EAKQ,oBAA+B,GAAA;AACrC,IAAO,OAAA,CAAA,KAAA,EAAQ,IAAK,CAAA,GAAA,EAAK,CAAA,CAAA,EAAI,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,MAAA,EAAW,GAAA,GAAO,CAAC,CAAA,CAAA;AAAA;AAEpE,CAAA;AA9lB0B,MAAA,CAAA,aAAA,EAAA,cAAA,CAAA;AAAnB,IAAM,YAAN,GAAA;AAmmBA,SAAS,sBAAsB,OAAmC,EAAA;AACvE,EAAO,OAAA,IAAI,aAAa,OAAO,CAAA;AACjC;AAFgB,MAAA,CAAA,qBAAA,EAAA,uBAAA,CAAA","file":"websocket.mjs","sourcesContent":["/**\n * Type-safe path parameter extraction\n * Extracts path parameters from a string literal type\n * e.g. \"/users/:id\" -> { id: string }\n */\nexport type PathParams<P extends string> = string extends P\n  ? Record<string, string>\n  : P extends `${infer _}:${infer Param}/${infer Rest}`\n  ? { [K in Param]: string } & PathParams<`/${Rest}`>\n  : P extends `${infer _}:${infer Param}`\n  ? { [K in Param]: string }\n  : {};\n\n/**\n * API Endpoints\n * Type-safe API endpoint definitions\n */\nexport const ApiEndpoints = {\n  // Ontology endpoints\n  Ontologies: '/ontologies' as const,\n  OntologyById: '/ontologies/:id' as const,\n\n  // User endpoints\n  CurrentUser: '/users/me' as const,\n  UserById: '/users/:id' as const,\n\n  // Authentication endpoints\n  Login: '/auth/login' as const,\n  Logout: '/auth/logout' as const,\n  RefreshToken: '/auth/refresh' as const,\n\n  // Tenant endpoints\n  CurrentTenant: '/tenants/current' as const,\n  TenantById: '/tenants/:id' as const,\n\n  // MCP context endpoints\n  ResolveContext: '/resolve' as const,\n  WebSocketResolve: '/resolve_ws' as const,\n\n  // Tools endpoints\n  ToolsList: '/tools/list' as const,\n  ToolsExecute: '/tools/execute' as const,\n  ToolsStream: '/tools/stream' as const,\n\n  // JSON-RPC endpoint\n  JsonRPC: '/mcp' as const\n};\n\n/**\n * Creates a URL path by replacing parameters in the path template\n *\n * @example\n * ```ts\n * const path = buildPath('/users/:id', { id: '123' }); // '/users/123'\n * ```\n */\nexport function buildPath(\n  pathTemplate: string,\n  params?: Record<string, string>\n): string {\n  if (!params) return pathTemplate;\n\n  let result = pathTemplate;\n\n  for (const [key, value] of Object.entries(params)) {\n    result = result.replace(`:${key}`, encodeURIComponent(String(value)));\n  }\n\n  return result;\n}\n\n/**\n * Creates a full URL by combining base URL with a path\n * @param baseUrl Base URL\n * @param path Path to append\n * @returns Full URL\n */\nexport function createFullUrl(baseUrl: string, path: string): string {\n  // Normalize baseUrl to ensure it doesn't end with a slash\n  const normalizedBaseUrl = baseUrl.endsWith('/')\n    ? baseUrl.slice(0, -1)\n    : baseUrl;\n\n  // Normalize path to ensure it starts with a slash\n  const normalizedPath = path.startsWith('/')\n    ? path\n    : `/${path}`;\n\n  return `${normalizedBaseUrl}${normalizedPath}`;\n}\n","import { MCPOptions } from './types';\nimport { MCPError } from '../errors';\nimport { createFullUrl } from './paths';\n\n/**\n * WebSocket message interface\n */\nexport interface WebSocketMessage {\n  // Unique identifier for the message\n  id?: string;\n  // Message type for multiplexing\n  type?: string;\n  // Message payload\n  payload?: any;\n  // Target resource URI\n  uri?: string;\n  // Depth for ontology resolution\n  depth?: number;\n  // Any other properties\n  [key: string]: any;\n}\n\n/**\n * WebSocket event handlers\n */\nexport interface WebSocketEventHandlers {\n  // Connection opened\n  onOpen?: (event: Event) => void;\n  // Message received\n  onMessage?: (data: string, messageType?: string) => void;\n  // Error occurred\n  onError?: (event: Event) => void;\n  // Connection closed\n  onClose?: (event: CloseEvent) => void;\n  // Custom message type handlers\n  onMessageType?: Record<string, (data: any) => void>;\n  // Heartbeat response\n  onHeartbeat?: (latency: number) => void;\n  // Connection status change\n  onStatusChange?: (status: WebSocketStatus) => void;\n}\n\n/**\n * WebSocket connection status\n */\nexport enum WebSocketStatus {\n  CONNECTING = 0,\n  CONNECTED = 1,\n  CLOSING = 2,\n  CLOSED = 3,\n  RECONNECTING = 4,\n  ERROR = 5\n}\n\n/**\n * WebSocket subscription\n */\nexport interface WebSocketSubscription {\n  id: string;\n  type: string;\n  callback: (data: any) => void;\n  unsubscribe: () => void;\n}\n\n/**\n * Enhanced WebSocket client with advanced features\n */\nexport class MCPWebSocket {\n  private ws: WebSocket | null = null;\n  private baseUrl: string;\n  private apiKey?: string;\n  private token?: string;\n  private tenantId?: string;\n  private reconnectAttempts: number = 0;\n  private maxReconnectAttempts: number = 10;\n  private reconnectDelay: number = 1000;\n  private handlers: WebSocketEventHandlers = {};\n  private status: WebSocketStatus = WebSocketStatus.CLOSED;\n  private messageQueue: WebSocketMessage[] = [];\n  private subscriptions: Map<string, Set<(data: any) => void>> = new Map();\n  private heartbeatInterval?: number;\n  private heartbeatTimeout?: number;\n  private lastHeartbeatTime?: number;\n  private heartbeatDelay: number = 15000; // 15 seconds to match server's interval\n  private connectionId: string = '';\n  private binarySupport: boolean = false;\n  private connectionPath: string = '/resolve_ws';\n  private autoReconnect: boolean = true;\n  private lastConnectionTime: number = 0;\n  private connectionRetryTimer: ReturnType<typeof setTimeout> | null = null;\n  private manualClose: boolean = false;\n\n  /**\n   * Creates a new WebSocket client\n   */\n  constructor(options: MCPOptions & { autoReconnect?: boolean, maxReconnectAttempts?: number }) {\n    // Convert HTTP URL to WebSocket URL if needed\n    let wsBaseUrl = options.baseUrl || 'https://api.mcp.ai';\n    wsBaseUrl = wsBaseUrl.replace(/^http/, 'ws');\n\n    this.baseUrl = wsBaseUrl;\n    this.apiKey = options.apiKey;\n    this.token = options.token;\n    this.tenantId = options.tenantId;\n    this.autoReconnect = options.autoReconnect !== false;\n\n    if (options.maxReconnectAttempts !== undefined) {\n      this.maxReconnectAttempts = options.maxReconnectAttempts;\n    }\n  }\n\n  /**\n   * Connects to the MCP WebSocket endpoint\n   */\n  connect(path: string = '/resolve_ws', handlers: WebSocketEventHandlers = {}): void {\n    if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n      console.warn('WebSocket is already connected. Disconnect first to reconnect.');\n      return;\n    }\n\n    // Save the connection path for reconnection\n    this.connectionPath = path;\n\n    // Reset manual close flag\n    this.manualClose = false;\n\n    // Update status\n    this.setStatus(WebSocketStatus.CONNECTING);\n\n    // Store handlers\n    this.handlers = handlers;\n\n    // Set last connection time\n    this.lastConnectionTime = Date.now();\n\n    // Create the full WebSocket URL\n    const url = new URL(createFullUrl(this.baseUrl, path));\n\n    // Generate connection ID\n    this.connectionId = this.generateConnectionId();\n\n    // Add auth params as query parameters\n    if (this.apiKey) {\n      url.searchParams.append('apiKey', this.apiKey);\n    }\n    if (this.token) {\n      url.searchParams.append('token', this.token);\n    }\n    if (this.tenantId) {\n      url.searchParams.append('tenantId', this.tenantId);\n    }\n\n    // Add connection ID\n    url.searchParams.append('connectionId', this.connectionId);\n\n    // Create WebSocket\n    try {\n      this.ws = new WebSocket(url.toString());\n\n      // Setup binary data if supported\n      this.binarySupport = typeof this.ws.binaryType !== 'undefined';\n      if (this.binarySupport) {\n        this.ws.binaryType = 'arraybuffer';\n      }\n\n      // Set up event handlers\n      this.ws.onopen = this.handleOpen.bind(this);\n      this.ws.onmessage = this.handleMessage.bind(this);\n      this.ws.onerror = this.handleError.bind(this);\n      this.ws.onclose = this.handleClose.bind(this);\n    } catch (error) {\n      this.handleConnectionError(error);\n    }\n  }\n\n  /**\n   * Update and notify about status changes\n   */\n  private setStatus(newStatus: WebSocketStatus): void {\n    if (this.status !== newStatus) {\n      this.status = newStatus;\n\n      // Notify handler if exists\n      if (this.handlers.onStatusChange) {\n        try {\n          this.handlers.onStatusChange(newStatus);\n        } catch (error) {\n          console.error('Error in WebSocket status change handler:', error);\n        }\n      }\n    }\n  }\n\n  /**\n   * Handle WebSocket open event\n   */\n  private handleOpen(event: Event): void {\n    console.log('WebSocket connection opened');\n\n    // Update status\n    this.setStatus(WebSocketStatus.CONNECTED);\n\n    // Reset reconnect attempts\n    this.reconnectAttempts = 0;\n\n    // Call the open handler\n    if (this.handlers.onOpen) {\n      try {\n        this.handlers.onOpen(event);\n      } catch (error) {\n        console.error('Error in WebSocket open handler:', error);\n      }\n    }\n\n    // Start heartbeat\n    this.startHeartbeat();\n\n    // Process the message queue\n    this.processQueue();\n  }\n\n  /**\n   * Handle WebSocket message event\n   */\n  private handleMessage(event: MessageEvent): void {\n    // Get the message data\n    let data: any;\n    let messageType: string | undefined;\n\n    try {\n      // Handle binary data if needed\n      if (this.binarySupport && event.data instanceof ArrayBuffer) {\n        // Handle binary data\n        const view = new Uint8Array(event.data);\n        // Convert to string (this is just an example, might need custom binary parsing)\n        const textDecoder = new TextDecoder();\n        data = textDecoder.decode(view);\n      } else {\n        // Handle text data\n        data = JSON.parse(event.data);\n        messageType = data.type;\n      }\n\n      // Call the general message handler\n      if (this.handlers.onMessage) {\n        try {\n          this.handlers.onMessage(event.data, messageType);\n        } catch (error) {\n          console.error('Error in WebSocket message handler:', error);\n        }\n      }\n\n      // Call the type-specific handler if it exists\n      if (messageType && this.handlers.onMessageType && this.handlers.onMessageType[messageType]) {\n        try {\n          this.handlers.onMessageType[messageType](data);\n        } catch (error) {\n          console.error(`Error in WebSocket message type handler for ${messageType}:`, error);\n        }\n      }\n\n      // Distribute to subscriptions\n      if (messageType && this.subscriptions.has(messageType)) {\n        const callbacks = this.subscriptions.get(messageType);\n        if (callbacks) {\n          callbacks.forEach(callback => {\n            try {\n              callback(data);\n            } catch (error) {\n              console.error(`Error in WebSocket subscription callback for ${messageType}:`, error);\n            }\n          });\n        }\n      }\n\n      // Handle heartbeat response\n      if (messageType === 'heartbeat' && this.lastHeartbeatTime) {\n        const latency = Date.now() - this.lastHeartbeatTime;\n\n        if (this.handlers.onHeartbeat) {\n          try {\n            this.handlers.onHeartbeat(latency);\n          } catch (error) {\n            console.error('Error in WebSocket heartbeat handler:', error);\n          }\n        }\n      }\n    } catch (error) {\n      console.error('Error processing WebSocket message:', error);\n    }\n  }\n\n  /**\n   * Handle WebSocket error event\n   */\n  private handleError(event: Event): void {\n    console.error('WebSocket error:', event);\n\n    // Set error status\n    this.setStatus(WebSocketStatus.ERROR);\n\n    // Call the error handler\n    if (this.handlers.onError) {\n      try {\n        this.handlers.onError(event);\n      } catch (error) {\n        console.error('Error in WebSocket error handler:', error);\n      }\n    }\n  }\n\n  /**\n   * Handle WebSocket close event\n   */\n  private handleClose(event: CloseEvent): void {\n    console.log(`WebSocket closed with code ${event.code}, reason: ${event.reason}`);\n\n    // Update status\n    this.setStatus(WebSocketStatus.CLOSED);\n\n    // Stop heartbeat\n    this.stopHeartbeat();\n\n    // Call the close handler\n    if (this.handlers.onClose) {\n      try {\n        this.handlers.onClose(event);\n      } catch (error) {\n        console.error('Error in WebSocket close handler:', error);\n      }\n    }\n\n    // Attempt reconnection if not manually closed and auto-reconnect is enabled\n    if (!this.manualClose && this.autoReconnect) {\n      this.attemptReconnect();\n    }\n  }\n\n  /**\n   * Handle connection initialization error\n   */\n  private handleConnectionError(error: any): void {\n    console.error('WebSocket connection error:', error);\n\n    // Update status\n    this.setStatus(WebSocketStatus.ERROR);\n\n    // Attempt reconnection if auto-reconnect is enabled\n    if (this.autoReconnect) {\n      this.attemptReconnect();\n    }\n  }\n\n  /**\n   * Send a message over the WebSocket connection\n   */\n  send(message: WebSocketMessage): boolean {\n    // Check connection\n    if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n      // Queue the message\n      this.queueMessage(message);\n\n      // Try to connect if closed\n      if (!this.ws || this.ws.readyState === WebSocket.CLOSED) {\n        this.connect(this.connectionPath, this.handlers);\n      }\n\n      return false;\n    }\n\n    try {\n      // Add an ID if not present\n      if (!message.id) {\n        message.id = this.generateMessageId();\n      }\n\n      // Send as JSON\n      this.ws.send(JSON.stringify(message));\n      return true;\n    } catch (error) {\n      console.error('Error sending WebSocket message:', error);\n\n      // Queue the message\n      this.queueMessage(message);\n      return false;\n    }\n  }\n\n  /**\n   * Queue a message for later sending\n   */\n  private queueMessage(message: WebSocketMessage): void {\n    // Prevent queue from growing too large\n    if (this.messageQueue.length >= 100) {\n      console.warn('WebSocket message queue is full, dropping oldest message');\n      this.messageQueue.shift();\n    }\n\n    this.messageQueue.push(message);\n  }\n\n  /**\n   * Process the message queue\n   */\n  private processQueue(): void {\n    if (this.ws && this.ws.readyState === WebSocket.OPEN && this.messageQueue.length > 0) {\n      console.log(`Processing ${this.messageQueue.length} queued WebSocket messages`);\n\n      const queue = [...this.messageQueue];\n      this.messageQueue = [];\n\n      for (const message of queue) {\n        if (!this.send(message)) {\n          break;\n        }\n      }\n    }\n  }\n\n  /**\n   * Subscribe to a specific message type\n   */\n  subscribe<T = any>(type: string, callback: (data: T) => void): WebSocketSubscription {\n    // Create a subscription ID\n    const id = this.generateSubscriptionId();\n\n    // Add to the subscriptions map\n    if (!this.subscriptions.has(type)) {\n      this.subscriptions.set(type, new Set());\n    }\n\n    const callbacks = this.subscriptions.get(type)!;\n    callbacks.add(callback as any);\n\n    // Create an unsubscribe function\n    const unsubscribe = () => {\n      if (this.subscriptions.has(type)) {\n        const callbacks = this.subscriptions.get(type)!;\n        callbacks.delete(callback as any);\n\n        if (callbacks.size === 0) {\n          this.subscriptions.delete(type);\n        }\n      }\n    };\n\n    // Return the subscription object\n    return {\n      id,\n      type,\n      callback: callback as any,\n      unsubscribe\n    };\n  }\n\n  /**\n   * Send a request to resolve a URI\n   */\n  resolveUri(uri: string, depth: number = 1): boolean {\n    return this.send({\n      type: 'resolve',\n      uri,\n      depth\n    });\n  }\n\n  /**\n   * Close the WebSocket connection\n   */\n  disconnect(): void {\n    // Set manual close flag to prevent auto-reconnect\n    this.manualClose = true;\n\n    // Stop heartbeat\n    this.stopHeartbeat();\n\n    // Clear reconnect timer\n    if (this.connectionRetryTimer) {\n      clearTimeout(this.connectionRetryTimer);\n      this.connectionRetryTimer = null;\n    }\n\n    // Close WebSocket if it exists\n    if (this.ws) {\n      try {\n        // Check if it's not already closed\n        if (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING) {\n          this.setStatus(WebSocketStatus.CLOSING);\n          this.ws.close(1000, 'Client disconnect');\n        }\n      } catch (error) {\n        console.error('Error closing WebSocket:', error);\n      } finally {\n        this.ws = null;\n        this.setStatus(WebSocketStatus.CLOSED);\n      }\n    }\n  }\n\n  /**\n   * Get the current WebSocket state\n   */\n  getState(): WebSocketStatus {\n    // If we have no socket, or it's been explicitly closed, return CLOSED\n    if (!this.ws) {\n      return WebSocketStatus.CLOSED;\n    }\n\n    // Map readyState to our status enum if we're not in a special state\n    if (this.status !== WebSocketStatus.RECONNECTING && this.status !== WebSocketStatus.ERROR) {\n      switch (this.ws.readyState) {\n        case WebSocket.CONNECTING:\n          return WebSocketStatus.CONNECTING;\n        case WebSocket.OPEN:\n          return WebSocketStatus.CONNECTED;\n        case WebSocket.CLOSING:\n          return WebSocketStatus.CLOSING;\n        case WebSocket.CLOSED:\n          return WebSocketStatus.CLOSED;\n        default:\n          return WebSocketStatus.CLOSED;\n      }\n    }\n\n    // Return the current status for special states\n    return this.status;\n  }\n\n  /**\n   * Attempt to reconnect with exponential backoff\n   */\n  private attemptReconnect(): void {\n    // Clear any existing reconnect timer\n    if (this.connectionRetryTimer) {\n      clearTimeout(this.connectionRetryTimer);\n      this.connectionRetryTimer = null;\n    }\n\n    // Don't reconnect if we've exceeded the max attempts\n    if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n      console.error(`WebSocket maximum reconnection attempts (${this.maxReconnectAttempts}) reached`);\n      return;\n    }\n\n    // Don't reconnect if manually closed\n    if (this.manualClose) {\n      return;\n    }\n\n    // Calculate backoff with exponential delay and jitter\n    this.reconnectAttempts++;\n\n    const baseDelay = this.reconnectDelay;\n    const exponentialDelay = baseDelay * Math.pow(1.5, this.reconnectAttempts - 1);\n    const maxDelay = 30000; // 30 seconds max\n    const cappedDelay = Math.min(exponentialDelay, maxDelay);\n    const jitter = cappedDelay * 0.2; // 20% jitter\n    const delay = cappedDelay + (Math.random() * jitter * 2 - jitter);\n\n    this.setStatus(WebSocketStatus.RECONNECTING);\n    console.log(`WebSocket reconnecting in ${Math.round(delay)}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\n\n    // Set a timer to reconnect\n    this.connectionRetryTimer = setTimeout(() => {\n      this.connect(this.connectionPath, this.handlers);\n    }, delay);\n  }\n\n  /**\n   * Start the heartbeat timer\n   */\n  private startHeartbeat(): void {\n    // Stop any existing heartbeat\n    this.stopHeartbeat();\n\n    // Start a new heartbeat interval\n    this.heartbeatInterval = window.setInterval(() => {\n      // Only send heartbeat if we're connected\n      if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n        // Store the time\n        this.lastHeartbeatTime = Date.now();\n\n        // Send a heartbeat message\n        this.send({\n          type: 'heartbeat',\n          timestamp: this.lastHeartbeatTime\n        });\n\n        // Set a timeout for response\n        this.heartbeatTimeout = window.setTimeout(() => {\n          console.warn('WebSocket heartbeat timeout');\n\n          // If we're still connected, disconnect and reconnect\n          if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n            this.disconnect();\n\n            if (this.autoReconnect) {\n              this.connect(this.connectionPath, this.handlers);\n            }\n          }\n        }, 5000); // 5 second timeout\n      }\n    }, this.heartbeatDelay);\n  }\n\n  /**\n   * Stop the heartbeat timer\n   */\n  private stopHeartbeat(): void {\n    // Clear the interval\n    if (this.heartbeatInterval) {\n      clearInterval(this.heartbeatInterval);\n      this.heartbeatInterval = undefined;\n    }\n\n    // Clear the timeout\n    if (this.heartbeatTimeout) {\n      clearTimeout(this.heartbeatTimeout);\n      this.heartbeatTimeout = undefined;\n    }\n  }\n\n  /**\n   * Set the heartbeat interval\n   */\n  setHeartbeatInterval(intervalMs: number): void {\n    if (intervalMs < 1000) {\n      console.warn('Heartbeat interval too small, setting to 1000ms');\n      intervalMs = 1000;\n    }\n\n    this.heartbeatDelay = intervalMs;\n\n    // Restart heartbeat if we're connected\n    if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n      this.startHeartbeat();\n    }\n  }\n\n  /**\n   * Set the maximum number of reconnect attempts\n   */\n  setMaxReconnectAttempts(attempts: number): void {\n    this.maxReconnectAttempts = attempts;\n  }\n\n  /**\n   * Set the reconnect delay\n   */\n  setReconnectDelay(delayMs: number): void {\n    this.reconnectDelay = delayMs;\n  }\n\n  /**\n   * Generate a unique subscription ID\n   */\n  private generateSubscriptionId(): string {\n    return `sub_${Date.now()}_${Math.floor(Math.random() * 1000000)}`;\n  }\n\n  /**\n   * Generate a unique message ID\n   */\n  private generateMessageId(): string {\n    return `msg_${Date.now()}_${Math.floor(Math.random() * 1000000)}`;\n  }\n\n  /**\n   * Generate a unique connection ID\n   */\n  private generateConnectionId(): string {\n    return `conn_${Date.now()}_${Math.floor(Math.random() * 1000000)}`;\n  }\n}\n\n/**\n * Create a WebSocket client with the given options\n */\nexport function createWebSocketClient(options: MCPOptions): MCPWebSocket {\n  return new MCPWebSocket(options);\n}\n"]}