@mgsoftwarebv/mcp-server-bridge 2.23.4 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -154
- package/dist/index.js +1842 -1355
- package/dist/index.js.map +1 -1
- package/package.json +7 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["args","name"],"mappings":";;;;;;;;AAUA,IAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACjC,IAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,CAAA,GAAA,KAAO,IAAI,UAAA,CAAW,YAAY,CAAC,CAAA,EAAG,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,QAAQ,GAAA,CAAI,kBAAA;AAE5F,IAAM,cAAc,IAAA,CAAK,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,WAAW,iBAAiB,CAAC,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IACnF,OAAA,CAAQ,IAAI,YAAA,IACZ,6BAAA;AAEF,IAAM,cAAc,IAAA,CAAK,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,WAAW,iBAAiB,CAAC,CAAA,EAAG,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IACnF,OAAA,CAAQ,IAAI,yBAAA,IACZ,sLAAA;AAEF,IAAI,CAAC,MAAA,EAAQ;AACX,EAAA,OAAA,CAAQ,MAAM,mGAA8F,CAAA;AAC5G,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB;AAQA,IAAM,QAAA,GAAW,YAAA,CAAa,WAAA,EAAa,WAAW,CAAA;AAgBtD,SAAS,wBAAwB,OAAA,EAAyB;AACxD,EAAA,IAAI,OAAA,IAAW,GAAG,OAAO,CAAA;AACzB,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA,GAAI,EAAA;AACpC;AAGA,eAAe,qBAAqB,MAAA,EAAmC;AACrE,EAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAgB,GAAI,MAAM,SACrC,IAAA,CAAK,OAAO,CAAA,CACZ,MAAA,CAAO,IAAI,CAAA,CACX,EAAA,CAAG,SAAS,MAAM,CAAA,mBAAA,EAAsB,MAAM,CAAA,CAAE,CAAA;AAEnD,EAAA,OAAO,iBAAiB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE,CAAA,IAAK,CAAC,MAAM,CAAA;AACnD;AAGA,eAAe,uBAAA,CAAwB,QAAgB,MAAA,EAAmC;AACxF,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,QAAA,CAAS,IAAI,4BAAA,EAA8B;AAAA,IACvE,SAAA,EAAW,MAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAA,CAAQ,KAAA,CAAM,gDAA2C,KAAK,CAAA;AAC9D,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,MAAM,GAAA,CAAI,CAAC,QAAa,GAAA,CAAI,UAAU,KAAK,EAAC;AACrD;AAGA,eAAe,yBAAyB,MAAA,EAAmC;AACzE,EAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,MAAM,CAAA;AAGjD,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAa,GAAI,MAAM,QAAA,CAClC,IAAA,CAAK,WAAW,CAAA,CAChB,MAAA,CAAO,IAAI,CAAA,CACX,EAAA,CAAG,WAAW,OAAO,CAAA;AAExB,EAAA,MAAM,iBAAiB,YAAA,EAAc,GAAA,CAAI,OAAK,CAAA,CAAE,EAAE,KAAK,EAAC;AAGxD,EAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAgB,GAAI,MAAM,QAAA,CACrC,IAAA,CAAK,uBAAuB,CAAA,CAC5B,MAAA,CAAO,aAAa,CAAA,CACpB,EAAA,CAAG,WAAW,MAAM,CAAA;AAEvB,EAAA,MAAM,oBAAoB,eAAA,EAAiB,GAAA,CAAI,OAAK,CAAA,CAAE,WAAW,KAAK,EAAC;AAGvE,EAAA,OAAO,CAAC,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,cAAA,EAAgB,GAAG,iBAAiB,CAAC,CAAC,CAAA;AAC/D;AAGA,eAAe,eAAe,GAAA,EAA0C;AACtE,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,IAAK,GAAA,CAAI,WAAW,EAAA,EAAI;AAChD,IAAA,OAAA,CAAQ,MAAM,kCAA2B,CAAA;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,OAAA,GAAU,WAAW,QAAQ,CAAA,CAAE,OAAO,GAAG,CAAA,CAAE,OAAO,KAAK,CAAA;AAC7D,IAAA,OAAA,CAAQ,MAAM,CAAA,mCAAA,EAA+B,OAAA,CAAQ,UAAU,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAK,CAAA;AAG1E,IAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAM,GAAI,MAAM,QAAA,CACvC,IAAA,CAAK,UAAU,CAAA,CACf,OAAO,4CAA4C,CAAA,CACnD,GAAG,UAAA,EAAY,OAAO,EACtB,MAAA,EAAO;AAEV,IAAA,IAAI,KAAA,IAAS,CAAC,UAAA,EAAY;AACxB,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAA,EAAmC,KAAA,EAAO,OAAO,CAAA;AAC/D,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,SACH,IAAA,CAAK,UAAU,CAAA,CACf,MAAA,CAAO,EAAE,YAAA,EAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,aAAY,EAAG,EACjD,EAAA,CAAG,IAAA,EAAM,WAAW,EAAE,CAAA;AAEzB,IAAA,OAAA,CAAQ,MAAM,CAAA,kCAAA,EAAgC,UAAA,CAAW,OAAO,CAAA,SAAA,EAAY,UAAA,CAAW,OAAO,CAAA,CAAE,CAAA;AAEhG,IAAA,OAAO;AAAA,MACL,QAAQ,UAAA,CAAW,OAAA;AAAA,MACnB,QAAQ,UAAA,CAAW,OAAA;AAAA,MACnB,MAAA,EAAQ,UAAA,CAAW,MAAA,IAAU;AAAC,KAChC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,uCAAgC,KAAK,CAAA;AACnD,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGA,IAAI,WAAA,GAAkC,IAAA;AAGtC,SAAS,YAAY,QAAA,EAA2B;AAC9C,EAAA,OAAO,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,IAC5B,CAAC,YAAA,EAAc,WAAA,EAAa,WAAA,EAAa,WAAA,EAAa,YAAY,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA;AAC9F;AAGA,eAAe,sBAAsB,UAAA,EAA4C;AAC/E,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,UAAS,GAAI,MAAM,QAAA,CAAS,OAAA,CACvD,IAAA,CAAK,OAAO,CAAA,CACZ,eAAA,CAAgB,YAAY,IAAI,CAAA;AAEnC,IAAA,IAAI,QAAA,IAAY,CAAC,OAAA,EAAS,SAAA,EAAW;AACnC,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gCAAA,EAAmC,UAAU,CAAA,CAAA,CAAA,EAAK,QAAQ,CAAA;AACxE,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AAC9C,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAA,CAAQ,MAAM,CAAA,wBAAA,EAA2B,UAAU,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AACzE,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,WAAA,GAAc,MAAM,QAAA,CAAS,WAAA,EAAY;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AACtC,IAAA,OAAO,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,EACjC,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAA2B,UAAU,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AA2FA,eAAe,wBAAA,CAAyB,WAAmB,MAAA,EAKjD;AACR,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,MAAM,QAAA,EAAU,KAAA,EAAO,WAAU,GAAI,MAAM,QAAA,CAChD,IAAA,CAAK,6BAA6B,CAAA,CAClC,OAAO,sBAAsB,CAAA,CAC7B,GAAG,YAAA,EAAc,SAAS,EAC1B,EAAA,CAAG,SAAA,EAAW,MAAM,CAAA,CACpB,MAAA,EAAO;AAEV,IAAA,IAAI,SAAA,IAAa,CAAC,QAAA,EAAU;AAC1B,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,SAAS,CAAA,CAAE,CAAA;AACnE,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,UAAS,GAAI,MAAM,QAAA,CAC9C,IAAA,CAAK,MAAM,CAAA,CACX,OAAO,QAAQ,CAAA,CACf,GAAG,SAAA,EAAW,MAAM,EACpB,EAAA,CAAG,QAAA,EAAU,QAAQ,CAAA,CACrB,MAAA,EAAO;AAEV,IAAA,IAAI,QAAA,IAAY,CAAC,OAAA,EAAS,MAAA,EAAQ,YAAA,EAAc;AAC9C,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kCAAA,EAAqC,MAAM,CAAA,CAAE,CAAA;AAC3D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,CAAO,YAAA;AACnC,IAAA,MAAM,qBAAqB,QAAA,CAAS,oBAAA;AAGpC,IAAA,MAAM,CAAC,KAAA,EAAO,IAAI,CAAA,GAAI,kBAAA,CAAmB,MAAM,GAAG,CAAA;AAElD,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,EAAM;AACnB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,8BAAA,EAAiC,kBAAkB,CAAA,CAAE,CAAA;AACnE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,WAAA;AAAA,MACP,kBAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,2CAA2C,KAAK,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAQA,eAAe,qBAAA,CAAsB,WAAmB,YAAA,EAAsC;AAC5F,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAGrB,IAAA,MAAM,UAAA,GAAa,CAAC,UAAA,EAAY,mBAAA,EAAqB,eAAe,eAAe,CAAA;AAGnF,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,UAAA,EAAW,GAAI,MAAM,QAAA,CAClD,IAAA,CAAK,cAAc,CAAA,CACnB,MAAA,CAAO,GAAG,CAAA,CACV,EAAA,CAAG,iBAAiB,SAAS,CAAA,CAC7B,MAAM,eAAe,CAAA;AAExB,IAAA,IAAI,UAAA,IAAc,CAAC,SAAA,EAAW;AAC5B,MAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,UAAU,CAAA;AAClE,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,gBAAA,GAAmB,YAAA;AACvB,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAM,cAAc,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,aAAa,CAAA;AAClE,MAAA,gBAAA,GAAmB,WAAA,EAAa,aAAA;AAAA,IAClC;AAGA,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,MAAM,gBAAgB,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,kBAAkB,UAAU,CAAA;AACxE,MAAA,IAAI,iBAAiB,aAAA,CAAc,MAAA,KAAW,SAAA,IAAa,aAAA,CAAc,6BAA6B,CAAA,EAAG;AACvG,QAAA,MAAM,QAAA,CACH,IAAA,CAAK,cAAc,CAAA,CACnB,MAAA,CAAO;AAAA,UACN,MAAA,EAAQ,aAAA;AAAA,UACR,UAAA,EAAY,IAAI,WAAA;AAAY,SAC7B,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,cAAc,EAAE,CAAA;AAC5B,QAAA,OAAA,CAAQ,MAAM,+BAA0B,CAAA;AAAA,MAC1C;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,kBAAA,GAAqB,UAAU,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,aAAA,KAAkB,gBAAA,IAAoB,CAAA,CAAE,MAAA,KAAW,aAAa,CAAA;AACjH,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAA,CAAO,GAAA,CAAI,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA,CAAE,OAAA,MAAa,GAAI,CAAA;AACtG,MAAA,MAAM,QAAA,CACH,IAAA,CAAK,cAAc,CAAA,CACnB,MAAA,CAAO;AAAA,QACN,MAAA,EAAQ,WAAA;AAAA,QACR,QAAA,EAAU,IAAI,WAAA,EAAY;AAAA,QAC1B,gBAAA,EAAkB;AAAA,OACnB,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,mBAAmB,EAAE,CAAA;AACjC,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAAsB,gBAAgB,CAAA,EAAA,EAAK,QAAQ,CAAA,EAAA,CAAI,CAAA;AAAA,IACvE;AAGA,IAAA,MAAM,YAAA,GAAe,UAAA,CAAW,OAAA,CAAQ,gBAAgB,CAAA;AACxD,IAAA,IAAI,YAAA,KAAiB,CAAA,CAAA,IAAM,YAAA,KAAiB,UAAA,CAAW,SAAS,CAAA,EAAG;AACjE,MAAA,OAAA,CAAQ,MAAM,gCAAgC,CAAA;AAC9C,MAAA;AAAA,IACF;AAGA,IAAA,KAAA,IAAS,IAAI,YAAA,GAAe,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AACzD,MAAA,MAAM,aAAA,GAAgB,WAAW,CAAC,CAAA;AAClC,MAAA,MAAM,YAAY,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,kBAAkB,aAAa,CAAA;AAEvE,MAAA,IAAI,CAAC,SAAA,EAAW;AAGhB,MAAA,IAAI,SAAA,CAAU,+BAA+B,CAAA,EAAG;AAC9C,QAAA,MAAM,QAAA,CACH,IAAA,CAAK,cAAc,CAAA,CACnB,MAAA,CAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,CAAA,CAC5B,EAAA,CAAG,IAAA,EAAM,UAAU,EAAE,CAAA;AACxB,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAAqB,aAAa,CAAA,sBAAA,CAAwB,CAAA;AACxE,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,SAAA,CAAU,WAAW,SAAA,EAAW;AAClC,QAAA,MAAM,QAAA,CACH,IAAA,CAAK,cAAc,CAAA,CACnB,MAAA,CAAO;AAAA,UACN,MAAA,EAAQ,aAAA;AAAA,UACR,UAAA,EAAY,IAAI,WAAA;AAAY,SAC7B,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,UAAU,EAAE,CAAA;AACxB,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAAyB,aAAa,CAAA,CAAE,CAAA;AACtD,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,MAAM,2CAA2C,CAAA;AAAA,EAC3D,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,EAC3D;AACF;AAGA,IAAM,SAAS,IAAI,MAAA;AAAA,EACjB;AAAA,IACE,IAAA,EAAM,uBAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,YAAA,EAAc;AAAA,MACZ,OAAO,EAAC;AAAA,MACR,WAAW;AAAC;AACd;AAEJ,CAAA;AAGA,IAAM,KAAA,GAAQ;AAAA,EACZ;AAAA,IACE,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,6FAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,SAAS,CAAA,EAAE;AAAA,QACnG,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAA,EAAE;AAAA,QACxE,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC5B,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC7B,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uDAAA,EAAwD;AAAA,QAC1F,UAAU,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,EAAA,EAAI,SAAS,GAAA;AAAI,OACxD;AAAA,MACA,UAAU;AAAC;AACb,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,kBAAA;AAAA,IACN,WAAA,EAAa,0OAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,EAAA,EAAI,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,WAAA;AAAY,OACjD;AAAA,MACA,QAAA,EAAU,CAAC,IAAI;AAAA;AACjB,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,WAAA,EAAa,qBAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,cAAA,EAAe;AAAA,QACrD,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,UAAA,EAAY,QAAA,EAAU,SAAS,CAAA,EAAG,SAAS,MAAA,EAAO;AAAA,QACpH,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAA,EAAG,OAAA,EAAS,QAAA,EAAS;AAAA,QAC3F,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,MAAA,EAAQ,KAAA,EAAO,SAAA,EAAW,SAAA,EAAW,UAAA,EAAY,aAAa,CAAA,EAAG,SAAS,MAAA,EAAO;AAAA,QAChH,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC5B,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA;AAAS,OAC/B;AAAA,MACA,QAAA,EAAU,CAAC,OAAO;AAAA;AACpB,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,WAAA,EAAa,oCAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,yCAAA,EAA0C;AAAA,QAC5E,UAAU,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,EAAA,EAAI,SAAS,GAAA;AAAI,OACxD;AAAA,MACA,UAAU;AAAC;AACb,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAa,uBAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,eAAA,EAAgB;AAAA,QACrD,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACxB,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA;AAAS,OAC5B;AAAA,MACA,QAAA,EAAU,CAAC,MAAM;AAAA;AACnB,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,sCAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,uBAAA,EAAwB;AAAA,QACnE,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,+BAAA,EAAgC;AAAA,QAClE,UAAU,EAAE,IAAA,EAAM,UAAU,OAAA,EAAS,EAAA,EAAI,SAAS,GAAA;AAAI,OACxD;AAAA,MACA,UAAU;AAAC;AACb,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,sBAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,cAAA,EAAe;AAAA,QACpD,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC7B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,QAAA,EAAU,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA,EAAG,OAAA,EAAS,QAAA;AAAS,OACrG;AAAA,MACA,QAAA,EAAU,CAAC,MAAM;AAAA;AACnB,GACF;AAAA;AAAA,EAEA;AAAA,IACE,IAAA,EAAM,wBAAA;AAAA,IACN,WAAA,EAAa,4DAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC3B,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,mBAAA,EAAoB;AAAA,QAC9D,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,2BAAA,EAA4B;AAAA,QAC5E,qBAAA,EAAuB;AAAA,UACrB,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,IAAA,EAAM,QAAA;AAAA,UACN,OAAA,EAAS,CAAA;AAAA,UACT,OAAA,EAAS,EAAA;AAAA,UACT,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,QAAA,EAAU,CAAC,UAAA,EAAY,uBAAuB;AAAA;AAChD,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,wBAAA;AAAA,IACN,WAAA,EAAa,4CAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,cAAA,EAAgB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACjC,UAAA,EAAY,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC7B,iBAAA,EAAmB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACpC,cAAA,EAAgB;AAAA,UACd,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,CAAC,mBAAA,EAAqB,gBAAA,EAAkB,uBAAuB,eAAe;AAAA,SACtF;AAAA,QACA,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,CAAC,SAAA,EAAW,iBAAA,EAAmB,cAAc,CAAA;AAAA,UACnD,OAAA,EAAS;AAAA,SACX;AAAA,QACA,gBAAA,EAAkB;AAAA,UAChB,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,QAAA,EAAU,CAAC,aAAA,EAAe,gBAAA,EAAkB,cAAc,mBAAA,EAAqB,gBAAA,EAAkB,oBAAoB,iBAAiB;AAAA;AACxI,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,qBAAA;AAAA,IACN,WAAA,EAAa,sDAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,iBAAA,EAAmB,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,IAAA,EAAK;AAAA,QACpD,mBAAA,EAAqB,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,IAAA,EAAK;AAAA,QACtD,sBAAA,EAAwB,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,KAAA;AAAM,OAC5D;AAAA,MACA,QAAA,EAAU,CAAC,aAAa;AAAA;AAC1B,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,oBAAA;AAAA,IACN,WAAA,EAAa,2EAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,wCAAA,EAAyC;AAAA,cAChF,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC1B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,SAAA,EAAW,aAAA,EAAe,WAAA,EAAa,WAAW,CAAA,EAAE;AAAA,cACrF,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA;AAAS,aACrC;AAAA,YACA,QAAA,EAAU,CAAC,SAAA,EAAW,QAAQ;AAAA;AAChC,SACF;AAAA,QACA,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAS,IAAA;AAAA,UACT,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,QAAA,EAAU,CAAC,aAAA,EAAe,OAAO;AAAA;AACnC,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,qBAAA;AAAA,IACN,WAAA,EAAa,gEAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY;AAAA,cACV,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cAC1B,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,SAAA,EAAW,aAAa,CAAA,EAAG,OAAA,EAAS,SAAA,EAAU;AAAA,cAC/E,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,cACnC,eAAA,EAAiB,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,IAAA;AAAK,aACpD;AAAA,YACA,QAAA,EAAU,CAAC,SAAS;AAAA;AACtB,SACF;AAAA,QACA,cAAA,EAAgB;AAAA,UACd,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,QAAA,EAAU,CAAC,aAAA,EAAe,UAAU;AAAA;AACtC,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,uBAAA;AAAA,IACN,WAAA,EAAa,8CAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,QAAA;AAAA,UACN,MAAM,CAAC,SAAA,EAAW,aAAA,EAAe,QAAA,EAAU,aAAa,QAAQ;AAAA,SAClE;AAAA,QACA,iBAAA,EAAmB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACpC,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA;AAAS,OACpC;AAAA,MACA,QAAA,EAAU,CAAC,aAAA,EAAe,QAAQ;AAAA;AACpC,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,wBAAA;AAAA,IACN,WAAA,EAAa,oEAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,gBAAA,EAAkB,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,IAAA,EAAK;AAAA,QACnD,kBAAA,EAAoB,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,IAAA,EAAK;AAAA,QACrD,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAW,SAAS,IAAA;AAAK,OACjD;AAAA,MACA,QAAA,EAAU,CAAC,aAAa;AAAA;AAC1B,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,wBAAA;AAAA,IACN,WAAA,EAAa,+CAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,0CAAA,EAA2C;AAAA,QAC5F,YAAA,EAAc;AAAA,UACZ,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,CAAC,YAAA,EAAc,iBAAA,EAAmB,qBAAqB,CAAA;AAAA,UAC7D,OAAA,EAAS;AAAA;AACX,OACF;AAAA,MACA,QAAA,EAAU,CAAC,aAAA,EAAe,kBAAkB;AAAA;AAC9C,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,qBAAA;AAAA,IACN,WAAA,EAAa,uEAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,WAAA,EAAa,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAC9B,aAAA,EAAe;AAAA,UACb,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,UACxB,WAAA,EAAa;AAAA,SACf;AAAA,QACA,gBAAA,EAAkB;AAAA,UAChB,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,kBAAA,EAAoB;AAAA,UAClB,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,eAAA,EAAiB,EAAE,IAAA,EAAM,QAAA;AAAS,OACpC;AAAA,MACA,QAAA,EAAU,CAAC,aAAA,EAAe,eAAe;AAAA;AAC3C,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,mPAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,SAAA,EAAW;AAAA,UACT,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,eAAA,EAAiB;AAAA,UACf,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,cAAA,EAAgB;AAAA,UACd,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,kBAAA,EAAoB;AAAA,UAClB,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,QAAA,EAAU,CAAC,iBAAA,EAAmB,gBAAgB;AAAA;AAChD,GACF;AAAA;AAAA,EAEA;AAAA,IACE,IAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAa,iIAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,SAAA,EAAW;AAAA,UACT,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,GAAA,EAAK;AAAA,UACH,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,QAAA,EAAU,CAAC,WAAA,EAAa,UAAU;AAAA;AACpC,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,uBAAA;AAAA,IACN,WAAA,EAAa,wGAAA;AAAA,IACb,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,SAAA,EAAW;AAAA,UACT,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,aAAA,EAAe;AAAA,UACb,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,GAAA,EAAK;AAAA,UACH,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA;AACf,OACF;AAAA,MACA,QAAA,EAAU,CAAC,WAAA,EAAa,eAAe;AAAA;AACzC;AAEJ,CAAA;AAGA,IAAM,SAAA,GAAY;AAAA,EAChB;AAAA,IACE,GAAA,EAAK,kBAAA;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,+BAAA;AAAA,IACb,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,GAAA,EAAK,iBAAA;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,WAAA,EAAa,6BAAA;AAAA,IACb,QAAA,EAAU;AAAA,GACZ;AAAA,EACA;AAAA,IACE,GAAA,EAAK,mBAAA;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAa,2BAAA;AAAA,IACb,QAAA,EAAU;AAAA;AAEd,CAAA;AAGA,MAAA,CAAO,iBAAA,CAAkB,wBAAwB,YAAY;AAC3D,EAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AACxB,CAAC,CAAA;AAGD,MAAA,CAAO,iBAAA,CAAkB,4BAA4B,YAAY;AAC/D,EAAA,OAAO,EAAE,WAAW,SAAA,EAAU;AAChC,CAAC,CAAA;AAeD,MAAA,CAAO,iBAAA,CAAkB,qBAAA,EAAuB,OAAO,OAAA,KAAY;AACjE,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO;AAAA,MACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,wDAAwD;AAAA,KAC1F;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAWA,KAAAA,KAAS,OAAA,CAAQ,MAAA;AAC1C,EAAA,OAAA,CAAQ,MAAM,CAAA,iCAAA,EAAwB,IAAI,CAAA,UAAA,EAAa,WAAA,CAAY,MAAM,CAAA,CAAE,CAAA;AAE3E,EAAA,IAAI;AACF,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,aAAA,EAAe;AAClB,QAAA,MAAM,EAAE,QAAQ,QAAA,EAAU,SAAA,EAAW,YAAY,CAAA,EAAG,QAAA,GAAW,IAAG,GAAIA,KAAAA;AAGtE,QAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAY,MAAM,CAAA;AAG7D,QAAA,MAAM,aAAa,MAAM,uBAAA,CAAwB,WAAA,CAAY,MAAA,EAAQ,YAAY,MAAM,CAAA;AAGvF,QAAA,MAAM,WAAA,GAAc,MAAM,wBAAA,CAAyB,WAAA,CAAY,MAAM,CAAA;AAMrE,QAAA,IAAI,UAAA,GAAa,CAAA,YAAA,EAAe,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACjD,QAAA,IAAI,aAAA,GAAgB,WAAW,MAAA,GAAS,CAAA,GAAI,kBAAkB,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,IAAA;AACxF,QAAA,IAAI,cAAA,GAAiB,YAAY,MAAA,GAAS,CAAA,GAAI,mBAAmB,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,IAAA;AAG5F,QAAA,MAAM,UAAU,CAAC,UAAA,EAAY,eAAe,cAAc,CAAA,CAAE,OAAO,OAAO,CAAA;AAE1E,QAAA,IAAI,KAAA,GAAQ,QAAA,CACT,IAAA,CAAK,SAAS,EACd,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAaP,CAAA,CACA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CACpB,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,GAAG,CAAC,CAAA;AAEhC,QAAA,IAAI,MAAA,EAAQ,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,UAAU,MAAM,CAAA;AAC7C,QAAA,IAAI,QAAA,EAAU,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,YAAY,QAAQ,CAAA;AACnD,QAAA,IAAI,SAAA,EAAW,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,cAAc,SAAS,CAAA;AACvD,QAAA,IAAI,UAAA,EAAY,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,eAAe,UAAU,CAAA;AAC1D,QAAA,IAAI,CAAA,EAAG,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,CAAA,qBAAA,EAAwB,CAAC,CAAA,eAAA,EAAkB,CAAC,CAAA,qBAAA,EAAwB,CAAC,CAAA,CAAA,CAAG,CAAA;AAEhG,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,KAAA,CAAM,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA;AAE5E,QAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA,MAAA,EAAS,IAAA,EAAM,MAAA,IAAU,CAAC,CAAA;;AAAA,EAAgB,IAAA,EAAM,GAAA;AAAA,cAAI,YACxD,CAAA,EAAA,EAAK,MAAA,CAAO,aAAa,CAAA,IAAA,EAAO,OAAO,KAAK;AAAA,QAAA,EACjC,MAAA,CAAO,MAAM,CAAA,aAAA,EAAgB,MAAA,CAAO,QAAQ;AAAA,EACnD,OAAO,QAAA,EAAkB,IAAA,GAAO,CAAA,SAAA,EAAa,MAAA,CAAO,SAAiB,IAAI;AAAA,CAAA,GAAO,EAAE,GAClF,MAAA,CAAO,SAAA,EAAmB,OAAO,CAAA,UAAA,EAAc,MAAA,CAAO,UAAkB,IAAI;AAAA,CAAA,GAAO,EAAE,YAC7E,IAAI,IAAA,CAAK,OAAO,UAAU,CAAA,CAAE,oBAAoB;AAAA;AAAA,aAC9D,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,mBAAmB,CAAA;AAAA,WACpC;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,kBAAA,EAAoB;AACvB,QAAA,MAAM,EAAE,IAAG,GAAIA,KAAAA;AAGf,QAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAY,MAAM,CAAA;AAC7D,QAAA,MAAM,aAAa,MAAM,uBAAA,CAAwB,WAAA,CAAY,MAAA,EAAQ,YAAY,MAAM,CAAA;AACvF,QAAA,MAAM,WAAA,GAAc,MAAM,wBAAA,CAAyB,WAAA,CAAY,MAAM,CAAA;AAErE,QAAA,IAAI,YAAA,GAAe,CAAA,YAAA,EAAe,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACnD,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG,YAAA,IAAgB,mBAAmB,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAClF,QAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG,YAAA,IAAgB,oBAAoB,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAErF,QAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAM,GAAI,MAAM,QAAA,CACvC,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAMP,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,EAAE,EACX,MAAA,EAAO;AAEV,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,EAAE,CAAA,CAAE,CAAA;AAAA,UAC3C;AACA,UAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,WAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,QACxD;AAGA,QAAA,IAAI,SAAA,GAAY,KAAA;AAChB,QAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG;AACxC,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AACA,QAAA,IAAI,CAAC,aAAa,UAAA,CAAW,UAAA,IAAc,WAAW,QAAA,CAAS,UAAA,CAAW,UAAU,CAAA,EAAG;AACrF,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AACA,QAAA,IAAI,CAAC,aAAa,UAAA,CAAW,WAAA,IAAe,YAAY,QAAA,CAAS,UAAA,CAAW,WAAW,CAAA,EAAG;AACxF,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AACA,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,MAAM,IAAI,MAAM,+DAA+D,CAAA;AAAA,QACjF;AAEA,QAAA,MAAM,IAAA,GAAO,UAAA;AAEb,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,EAAE,CAAA,CAAE,CAAA;AAAA,UACxD;AACA,UAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,WAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,QACxD;AAGA,QAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,gBAAA,EAAiB,GAAI,MAAM,QAAA,CAC1D,IAAA,CAAK,oBAAoB,CAAA,CACzB,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAQP,CAAA,CACA,EAAA,CAAG,WAAA,EAAa,EAAE,CAAA,CAClB,MAAM,YAAA,EAAc,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAE1C,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,gBAAgB,CAAA;AAAA,QAC/D;AAGA,QAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,aAAA,EAAc,GAAI,MAAM,QAAA,CACpD,IAAA,CAAK,iBAAiB,CAAA,CACtB,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAKP,CAAA,CACA,EAAA,CAAG,WAAA,EAAa,EAAE,CAAA,CAClB,MAAM,YAAA,EAAc,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAE1C,QAAA,IAAI,aAAA,EAAe;AACjB,UAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,aAAa,CAAA;AAAA,QACzD;AAGA,QAAA,MAAM,aAAa,QAAA,EAAU,GAAA,CAAI,OAAK,CAAA,CAAE,EAAE,KAAK,EAAC;AAChD,QAAA,IAAI,qBAA4B,EAAC;AAEjC,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,oBAAA,EAAqB,GAAI,MAAM,QAAA,CAClE,IAAA,CAAK,4BAA4B,CAAA,CACjC,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAQP,CAAA,CACA,EAAA,CAAG,YAAA,EAAc,UAAU,CAAA;AAE9B,UAAA,IAAI,oBAAA,EAAsB;AACxB,YAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,oBAAoB,CAAA;AAAA,UAC3E,CAAA,MAAO;AACL,YAAA,kBAAA,GAAqB,mBAAmB,EAAC;AAAA,UAC3C;AAAA,QACF;AAGA,QAAA,MAAM,UAAiB,CAAC;AAAA,UACtB,IAAA,EAAM,MAAA;AAAA,UACN,IAAA,EAAM,CAAA;;AAAA,EAAA,EACK,IAAA,CAAK,aAAa,CAAA,IAAA,EAAO,IAAA,CAAK,KAAK;AAAA,QAAA,EAC7B,KAAK,MAAM;AAAA,UAAA,EACT,KAAK,QAAQ;AAAA,MAAA,EACjB,KAAK,IAAI;AAAA,EACf,IAAA,CAAK,WAAA,GAAc,CAAA,aAAA,EAAgB,IAAA,CAAK,WAAW;AAAA,CAAA,GAAO,EAAE,GAC3D,IAAA,CAAK,QAAA,EAAkB,OAAO,CAAA,SAAA,EAAa,IAAA,CAAK,SAAiB,IAAI;AAAA,CAAA,GAAO,EAAE,GAC9E,IAAA,CAAK,SAAA,EAAmB,OAAO,CAAA,UAAA,EAAc,IAAA,CAAK,UAAkB,IAAI;AAAA,CAAA,GAAO,EAAE,GAClF,IAAA,CAAK,QAAA,EAAU,YAAY,CAAA,UAAA,EAAa,IAAA,CAAK,SAAS,SAAS;AAAA,CAAA,GAAO,EAAE,CAAA,WAAA,EAC7D,IAAA,CAAK,SAAA,EAAW,aAAa,SAAS;AAAA,SAAA,EACxC,IAAI,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA,CAAE,oBAAoB;AAAA,EACvD,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI;AAAA,uBAAA,EAAqB,YAAY,MAAM;AAAA,CAAA,GAAO,EAAE,GACxF,QAAA,IAAY,QAAA,CAAS,SAAS,CAAA,GAAI,CAAA,oBAAA,EAAgB,SAAS,MAAM;AAAA,CAAA,GAAO,EAAE,CAAA;AAAA,SACpF,CAAA;AAGD,QAAA,IAAI,WAAA,IAAe,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACzC,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAiB,WAAA,CAAY,MAAM,CAAA,sBAAA,CAAwB,CAAA;AAEzE,UAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,YAAA,IAAI,WAAA,CAAY,UAAA,CAAW,SAAS,CAAA,EAAG;AACrC,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAA2B,UAAA,CAAW,SAAS,CAAA,CAAE,CAAA;AAC/D,cAAA,MAAM,UAAA,GAAa,MAAM,qBAAA,CAAsB,UAAA,CAAW,WAAW,CAAA;AAErE,cAAA,IAAI,UAAA,EAAY;AACd,gBAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,kBACX,IAAA,EAAM,OAAA;AAAA,kBACN,IAAA,EAAM,UAAA;AAAA,kBACN,UAAU,UAAA,CAAW;AAAA,iBACtB,CAAA;AAGD,gBAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,kBACX,IAAA,EAAM,MAAA;AAAA,kBACN,IAAA,EAAM;AAAA,iCAAA,EAA+B,UAAA,CAAW,SAAS,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,UAAA,CAAW,SAAA,GAAY,IAAI,CAAC,CAAA,gBAAA,EAAoB,WAAW,KAAA,EAAe,SAAA,IAAa,SAAS,CAAA,IAAA,EAAO,IAAI,KAAK,UAAA,CAAW,UAAU,CAAA,CAAE,kBAAA,EAAoB,CAAA;AAAA;AAAA,iBACrO,CAAA;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qBAAA,EAAiB,kBAAA,CAAmB,MAAM,CAAA,uBAAA,CAAyB,CAAA;AAEjF,UAAA,KAAA,MAAW,cAAc,kBAAA,EAAoB;AAC3C,YAAA,IAAI,WAAA,CAAY,UAAA,CAAW,SAAS,CAAA,EAAG;AACrC,cAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4CAAA,EAAmC,UAAA,CAAW,SAAS,CAAA,CAAE,CAAA;AACvE,cAAA,MAAM,UAAA,GAAa,MAAM,qBAAA,CAAsB,UAAA,CAAW,WAAW,CAAA;AAErE,cAAA,IAAI,UAAA,EAAY;AAEd,gBAAA,MAAM,UAAU,QAAA,EAAU,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,WAAW,UAAU,CAAA;AAElE,gBAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,kBACX,IAAA,EAAM,OAAA;AAAA,kBACN,IAAA,EAAM,UAAA;AAAA,kBACN,UAAU,UAAA,CAAW;AAAA,iBACtB,CAAA;AAGD,gBAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,kBACX,IAAA,EAAM,MAAA;AAAA,kBACN,IAAA,EAAM;AAAA,oCAAA,EAAmC,OAAA,EAAS,OAAe,SAAA,IAAa,SAAS,OAAO,IAAI,IAAA,CAAK,WAAW,UAAU,CAAA,CAAE,oBAAoB,CAAA,EAAA,EAAK,WAAW,SAAS,CAAA,EAAA,EAAK,KAAK,KAAA,CAAM,UAAA,CAAW,SAAA,GAAY,IAAI,CAAC,CAAA;AAAA,CAAA,IAChN,OAAA,EAAS,OAAA,GAAU,CAAA,eAAA,EAAkB,OAAA,CAAQ,QAAQ,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,GAAG,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,GAAA,GAAM,QAAQ,EAAE,CAAA;AAAA,CAAA,GAAQ,EAAA;AAAA,iBAClI,CAAA;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6BAAA,EAA2B,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,OAAO,CAAA,CAAE,MAAM,CAAA,OAAA,CAAS,CAAA;AAEhG,QAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,MACnB;AAAA,MAEA,KAAK,eAAA,EAAiB;AACpB,QAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,MAAA,GAAS,MAAA,EAAQ,QAAA,GAAW,QAAA,EAAU,IAAA,GAAO,MAAA,EAAQ,SAAA,EAAW,UAAA,EAAW,GAAIA,KAAAA;AAE3G,QAAA,MAAM,IAAA,GAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACpC,QAAA,IAAI,iBAAiB,WAAA,CAAY,MAAA;AACjC,QAAA,IAAI,kBAAA,GAAqB,UAAA;AACzB,QAAA,IAAI,mBAAA,GAAsB,EAAA;AAI1B,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,SAC7B,IAAA,CAAK,UAAU,CAAA,CACf,MAAA,CAAO,4BAA4B,CAAA,CACnC,EAAA,CAAG,IAAA,EAAM,SAAS,EAClB,MAAA,EAAO;AAEV,UAAA,IAAI,OAAA,EAAS;AAEX,YAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,cAAA,cAAA,GAAiB,OAAA,CAAQ,OAAA;AAAA,YAC3B;AAEA,YAAA,IAAI,CAAC,kBAAA,IAAsB,OAAA,CAAQ,WAAA,EAAa;AAC9C,cAAA,kBAAA,GAAqB,OAAA,CAAQ,WAAA;AAAA,YAC/B;AAEA,YAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,cAAA,MAAMC,QAAO,OAAA,CAAQ,IAAA,CAAK,aAAY,CAAE,OAAA,CAAQ,gBAAgB,EAAE,CAAA;AAClE,cAAA,MAAM,QAAQA,KAAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AAC9C,cAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,gBAAA,mBAAA,GAAsB,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAc,CAAA,CAAE,UAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,CAAE,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,cACvG,WAAW,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,EAAG;AACzC,gBAAA,mBAAA,GAAsB,KAAA,CAAM,CAAC,CAAA,CAAE,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,cAC/C;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IAAI,YAAA;AACJ,QAAA,IAAI,aAAa,mBAAA,EAAqB;AAEpC,UAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,mBAAmB,CAAA,EAAA,CAAA;AAC9C,UAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAgB,GAAI,MAAM,QAAA,CACrC,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,eAAe,CAAA,CACtB,EAAA,CAAG,YAAA,EAAc,SAAS,CAAA,CAC1B,IAAA,CAAK,eAAA,EAAiB,OAAO,CAAA,CAC7B,KAAA,CAAM,eAAA,EAAiB,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CAC3C,KAAA,CAAM,CAAC,CAAA;AAEV,UAAA,IAAI,YAAA,GAAe,CAAA;AACnB,UAAA,IAAI,mBAAmB,eAAA,CAAgB,MAAA,GAAS,KAAK,eAAA,CAAgB,CAAC,GAAG,aAAA,EAAe;AACtF,YAAA,MAAM,QAAQ,eAAA,CAAgB,CAAC,CAAA,CAAE,aAAA,CAAc,MAAM,GAAG,CAAA;AACxD,YAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,cAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACrC,cAAA,IAAI,CAAC,KAAA,CAAM,OAAO,CAAA,iBAAkB,OAAA,GAAU,CAAA;AAAA,YAChD;AAAA,UACF;AACA,UAAA,YAAA,GAAe,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,mBAAmB,CAAA,CAAA,EAAI,MAAA,CAAO,YAAY,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,QACxF,CAAA,MAAO;AAEL,UAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,QAAA,CACrB,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,SAAS,IAAA,EAAM,IAAA,EAAM,CAAA,CAC1C,EAAA,CAAG,WAAW,cAAc,CAAA;AAC/B,UAAA,YAAA,GAAe,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAA,CAAA,CAAQ,KAAA,IAAS,CAAA,IAAK,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,QACrE;AAEA,QAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO;AAAA,UACN,OAAA,EAAS,cAAA;AAAA,UACT,aAAA,EAAe,YAAA;AAAA,UACf,KAAA;AAAA,UACA,WAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAA;AAAA,UACA,IAAA;AAAA,UACA,YAAY,SAAA,IAAa,IAAA;AAAA,UACzB,aAAa,kBAAA,IAAsB,IAAA;AAAA,UACnC,cAAc,WAAA,CAAY;AAAA,SAC3B,CAAA,CACA,MAAA,EAAO,CACP,MAAA,EAAO;AAEV,QAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA,iBAAA,EACoB,YAAY,CAAA;AAAA,OAAA,EACtB,KAAK;AAAA,QAAA,EACJ,MAAM;AAAA,UAAA,EACJ,QAAQ;AAAA,MAAA,EACZ,IAAI;AAAA;AAAA,WACpB;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,eAAA,EAAiB;AACpB,QAAA,MAAM,EAAE,CAAA,EAAG,QAAA,GAAW,EAAA,EAAG,GAAID,KAAAA;AAG7B,QAAA,MAAM,WAAA,GAAc,MAAM,wBAAA,CAAyB,WAAA,CAAY,MAAM,CAAA;AAErE,QAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM;AAAA,aACP;AAAA,WACH;AAAA,QACF;AAEA,QAAA,IAAI,QAAQ,QAAA,CACT,IAAA,CAAK,WAAW,CAAA,CAChB,OAAO,sCAAsC,CAAA,CAC7C,EAAA,CAAG,IAAA,EAAM,WAAW,CAAA,CACpB,KAAA,CAAM,KAAK,GAAA,CAAI,QAAA,EAAU,GAAG,CAAC,CAAA;AAEhC,QAAA,IAAI,CAAA,UAAW,KAAA,CAAM,EAAA,CAAG,eAAe,CAAC,CAAA,eAAA,EAAkB,CAAC,CAAA,CAAA,CAAG,CAAA;AAE9D,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,KAAA,CAAM,MAAM,MAAM,CAAA;AAEhD,QAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA,MAAA,EAAS,IAAA,EAAM,MAAA,IAAU,CAAC,CAAA;;AAAA,EAAkB,IAAA,EAAM,GAAA;AAAA,cAAI,CAAA,QAAA,KAC1D,CAAA,EAAA,EAAK,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,QAAA,CAAS,KAAA,GAAQ,CAAA,OAAA,EAAU,QAAA,CAAS,KAAK;AAAA,CAAA,GAAO,EAAE,CAAA,EAClD,QAAA,CAAS,OAAA,GAAU,CAAA,SAAA,EAAY,SAAS,OAAO;AAAA,CAAA,GAAO,EAAE,YAC/C,IAAI,IAAA,CAAK,SAAS,UAAU,CAAA,CAAE,oBAAoB;AAAA;AAAA,aAChE,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,qBAAqB,CAAA;AAAA,WACtC;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,iBAAA,EAAmB;AACtB,QAAA,MAAM,EAAE,IAAA,EAAAC,KAAAA,EAAM,KAAA,EAAO,SAAQ,GAAID,KAAAA;AAEjC,QAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,WAAW,CAAA,CAChB,MAAA,CAAO;AAAA,UACN,SAAS,WAAA,CAAY,MAAA;AAAA,UACrB,IAAA,EAAAC,KAAAA;AAAA,UACA,OAAO,KAAA,IAAS,IAAA;AAAA,UAChB,SAAS,OAAA,IAAW,IAAA;AAAA,UACpB,SAAS,WAAA,CAAY;AAAA,SACtB,CAAA,CACA,MAAA,EAAO,CACP,MAAA,EAAO;AAEV,QAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA,MAAA,EACSA,KAAI;AAAA,EACV,KAAA,GAAQ,UAAU,KAAK;AAAA,CAAA,GAAO,EAAE,CAAA,EAChC,OAAA,GAAU,CAAA,SAAA,EAAY,OAAO;AAAA,CAAA,GAAO,EAAE,CAAA;AAAA,WAChD;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,cAAA,EAAgB;AACnB,QAAA,MAAM,EAAE,UAAA,EAAY,CAAA,EAAG,QAAA,GAAW,IAAG,GAAID,KAAAA;AAGzC,QAAA,MAAM,aAAa,MAAM,uBAAA,CAAwB,WAAA,CAAY,MAAA,EAAQ,YAAY,MAAM,CAAA;AAEvF,QAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM;AAAA,aACP;AAAA,WACH;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,GAAQ,QAAA,CACT,IAAA,CAAK,UAAU,EACf,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAMP,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,UAAU,CAAA,CACnB,MAAM,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,GAAG,CAAC,CAAA;AAEhC,QAAA,IAAI,UAAA,EAAY,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,eAAe,UAAU,CAAA;AAC1D,QAAA,IAAI,GAAG,KAAA,GAAQ,KAAA,CAAM,MAAM,MAAA,EAAQ,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAE3C,QAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,KAAA,CAAM,MAAM,MAAM,CAAA;AAEhD,QAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA,MAAA,EAAS,IAAA,EAAM,MAAA,IAAU,CAAC,CAAA;;AAAA,EAAiB,IAAA,EAAM,GAAA;AAAA,cAAI,aACzD,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAI,CAAA,QAAA,EAAW,QAAQ,EAAE,CAAA;AAAA,EACnC,OAAA,CAAQ,WAAA,GAAc,CAAA,aAAA,EAAgB,OAAA,CAAQ,WAAW;AAAA,CAAA,GAAO,EAAE,YACzD,IAAI,IAAA,CAAK,QAAQ,UAAU,CAAA,CAAE,oBAAoB;AAAA;AAAA,aAC/D,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,oBAAoB,CAAA;AAAA,WACrC;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,gBAAA,EAAkB;AACrB,QAAA,MAAM,EAAE,IAAA,EAAAC,KAAAA,EAAM,aAAa,UAAA,EAAY,MAAA,GAAS,UAAS,GAAID,KAAAA;AAE7D,QAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,UAAU,CAAA,CACf,MAAA,CAAO;AAAA,UACN,SAAS,WAAA,CAAY,MAAA;AAAA,UACrB,IAAA,EAAAC,KAAAA;AAAA,UACA,aAAa,WAAA,IAAe,IAAA;AAAA,UAC5B,aAAa,UAAA,IAAc,IAAA;AAAA,UAC3B,MAAA;AAAA,UACA,SAAS,WAAA,CAAY;AAAA,SACtB,CAAA,CACA,MAAA,EAAO,CACP,MAAA,EAAO;AAEV,QAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA,MAAA,EACSA,KAAI;AAAA,QAAA,EACF,MAAM;AAAA,EACd,WAAA,GAAc,gBAAgB,WAAW;AAAA,CAAA,GAAO,EAAE,CAAA;AAAA,WAC5D;AAAA,SACH;AAAA,MACF;AAAA;AAAA,MAGA,KAAK,wBAAA,EAA0B;AAC7B,QAAA,MAAM,EAAE,QAAA,EAAU,SAAA,EAAW,eAAA,EAAiB,qBAAA,EAAuB,iBAAgB,GAAID,KAAAA;AAGzF,QAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,UAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,QACrD;AAGA,QAAA,MAAM,cAAA,GAAiB,wBAAwB,qBAAqB,CAAA;AAEpE,QAAA,MAAM,gBAAA,uBAAuB,IAAA,EAAK;AAGlC,QAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAM,GAAI,MAAM,QAAA,CACxC,IAAA,CAAK,aAAa,CAAA,CAClB,MAAA,CAAO;AAAA,UACN,SAAA,EAAW,QAAA;AAAA,UACX,kBAAkB,WAAA,CAAY,MAAA;AAAA,UAC9B,SAAS,WAAA,CAAY,MAAA;AAAA,UACrB,mBAAmB,eAAA,IAAmB,IAAA;AAAA,UACtC,wBAAA,EAA0B,cAAA;AAAA,UAC1B,kBAAkB,eAAA,IAAmB,IAAA;AAAA,UACrC,MAAA,EAAQ;AAAA,SACT,CAAA,CACA,MAAA,CAAO,8CAA8C,EACrD,MAAA,EAAO;AAEV,QAAA,IAAI,OAAO,MAAM,KAAA;AAGjB,QAAA,MAAM,YAAY,CAAA,QAAA,EAAW,WAAA,CAAY,GAAG,SAAA,CAAU,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAE3D,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA,wBAAA,EACoB,SAAS,CAAA;AAAA,kBAAA,EACf,QAAQ;AAAA,wBAAA,EACL,cAAc,CAAA;AAAA,EAC5B,eAAA,GAAkB,yBAAkB,eAAe,CAAA;AAAA,CAAA,GAAU,EAAE,CAAA,mBAAA,EACnD,gBAAA,CAAiB,cAAA,EAAgB;;AAAA,wEAAA;AAAA,WAEvD;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,wBAAA,EAA0B;AAC7B,QAAA,MAAM,EAAE,WAAA,EAAa,cAAA,EAAgB,UAAA,EAAY,iBAAA,EAAmB,gBAAgB,OAAA,GAAU,SAAA,EAAW,gBAAA,EAAkB,eAAA,EAAgB,GAAIA,KAAAA;AAG/I,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAItD,QAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAY,MAAM,CAAA;AAC7D,QAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,YAAA,KAAiB,MAAM,QAAA,CACtD,IAAA,CAAK,aAAa,EAClB,MAAA,CAAO,kDAAkD,CAAA,CACzD,EAAA,CAAG,WAAW,OAAO,CAAA;AAExB,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA;AAAA,QAC3D;AAGA,QAAA,MAAM,OAAA,GAAU,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,QAAA,EAAS,CAAE,UAAA,CAAW,WAAW,CAAC,CAAA;AAC9E,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,MAAM,CAAA,mBAAA,EAAsB,WAAW,cAAc,WAAA,EAAa,MAAA,IAAU,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,QACrG;AAEA,QAAA,MAAM,YAAA,uBAAmB,IAAA,EAAK;AAG9B,QAAA,MAAM,WAAA,GAAc,QAAQ,wBAAA,IAA4B,EAAA;AAGxD,QAAA,MAAM,sBAAA,GAAyB,uBAAA,CAAwB,gBAAA,IAAoB,CAAC,CAAA;AAG5E,QAAA,MAAM,cAAc,WAAA,GAAc,sBAAA;AAGlC,QAAA,MAAM,QAAA,CACH,IAAA,CAAK,aAAa,CAAA,CAClB,MAAA,CAAO;AAAA,UACN,MAAA,EAAQ,aAAA;AAAA;AAAA,UACR,wBAAA,EAA0B;AAAA;AAAA;AAAA,SAE3B,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,QAAQ,EAAE,CAAA;AAGtB,QAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,mBAAmB,CAAA,CACxB,MAAA,CAAO;AAAA,UACN,eAAe,OAAA,CAAQ,EAAA;AAAA,UACvB,cAAc,WAAA,CAAY,MAAA;AAAA,UAC1B,SAAS,WAAA,CAAY,MAAA;AAAA,UACrB,eAAA,EAAiB,cAAA;AAAA,UACjB,WAAA,EAAa,UAAA;AAAA,UACb,gBAAA,EAAkB,iBAAA;AAAA,UAClB,gBAAA,EAAkB,cAAA;AAAA,UAClB,OAAA;AAAA,UACA,kBAAA,EAAoB,IAAA;AAAA;AAAA,UACpB,aAAa,OAAA,KAAY,SAAA,GAAA,qBAAgB,IAAA,EAAK,EAAE,aAAY,GAAI;AAAA,SACjE,CAAA,CACA,MAAA,EAAO,CACP,MAAA,EAAO;AAEV,QAAA,IAAI,OAAO,MAAM,KAAA;AAGjB,QAAA,MAAM,QAAA,CACH,IAAA,CAAK,cAAc,CAAA,CACnB,MAAA,CAAO;AAAA,UACN,eAAe,OAAA,CAAQ,EAAA;AAAA,UACvB,aAAA,EAAe,WAAA;AAAA;AAAA,UACf,WAAA,EAAa,cAAc,cAAA,CAAe,OAAA,CAAQ,KAAK,GAAG,CAAC,MAAM,OAAO,CAAA,CAAA;AAAA,UACxE,gBAAA,EAAkB,CAAA;AAAA;AAAA,UAClB,oBAAoB,OAAA,KAAY,SAAA,GAAY,CAAA,GAAI,OAAA,KAAY,oBAAoB,CAAA,GAAI,CAAA;AAAA,UACpF,UAAA,EAAY,aAAa,WAAA;AAAY,SACtC,CAAA;AAGH,QAAA,MAAM,gBAAA,GAAmB,IAAI,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACpD,QAAA,MAAM,mBAAA,GAAsB,KAAK,KAAA,CAAA,CAAO,YAAA,CAAa,SAAQ,GAAI,gBAAA,CAAiB,OAAA,EAAQ,IAAK,GAAK,CAAA;AACpG,QAAA,MAAM,iBAAA,GAAoB,mBAAA,GAAsB,CAAA,GAAK,mBAAA,GAAsB,WAAA,GAAe,CAAA;AAG1F,QAAA,MAAM,QAAA,CACH,IAAA,CAAK,aAAa,CAAA,CAClB,MAAA,CAAO;AAAA,UACN,gBAAA,EAAkB,iBAAA,CAAkB,OAAA,CAAQ,CAAC,CAAA;AAAA,UAC7C,mBAAA,EAAqB;AAAA,SACtB,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,QAAQ,EAAE,CAAA;AAItB,QAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,KAAA,EAAO,UAAA,EAAW,GAAI,MAAM,QAAA,CACxD,IAAA,CAAK,eAAe,CAAA,CACpB,MAAA,CAAO,sDAAsD,CAAA,CAC7D,EAAA,CAAG,eAAA,EAAiB,OAAA,CAAQ,EAAE,CAAA,CAC9B,EAAA,CAAG,QAAA,EAAU,OAAO,CAAA,CACpB,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA;AAE3C,QAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,QAAA,IAAI,cAAA,GAAiB,EAAA;AAGrB,QAAA,MAAM,gBAAgB,eAAA,IAAmB,eAAA,CAAgB,SAAS,CAAA,GAAI,eAAA,CAAgB,CAAC,CAAA,GAAI,IAAA;AAG3F,QAAA,IAAI,eAAA,IAAmB,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AAEjD,UAAA,MAAM,qBAAA,GAAwB,eAAA,CAAgB,MAAA,CAAO,CAAC,GAAA,EAAK,UAAU,GAAA,IAAO,KAAA,CAAM,gBAAA,IAAoB,CAAA,CAAA,EAAI,CAAC,CAAA;AAG3G,UAAA,MAAM,YAAA,GAAe,gBAAgB,KAAA,CAAM,CAAC,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE,CAAA;AAC3D,UAAA,MAAM,QAAA,CACH,KAAK,eAAe,CAAA,CACpB,QAAO,CACP,EAAA,CAAG,MAAM,YAAY,CAAA;AAGxB,UAAA,IAAI,qBAAA,IAAyB,aAAA,EAAe,gBAAA,IAAoB,CAAA,CAAA,EAAI;AAClE,YAAA,MAAM,QAAA,CACH,IAAA,CAAK,eAAe,CAAA,CACpB,MAAA,CAAO,EAAE,gBAAA,EAAkB,qBAAA,EAAuB,CAAA,CAClD,EAAA,CAAG,IAAA,EAAM,cAAe,EAAE,CAAA;AAC7B,YAAA,aAAA,CAAe,gBAAA,GAAmB,qBAAA;AAAA,UACpC;AAEA,UAAA,aAAA,GAAgB,CAAA,aAAA,EAAgB,gBAAgB,MAAM,CAAA,kBAAA,CAAA;AAAA,QACxD;AAEA,QAAA,IAAI,aAAA,EAAe;AAEjB,UAAA,MAAM,WAAA,GAAA,CAAe,aAAA,CAAc,gBAAA,IAAoB,CAAA,IAAM,sBAAA,GAAyB,EAAA;AAEtF,UAAA,MAAM,QAAA,CACH,IAAA,CAAK,eAAe,CAAA,CACpB,MAAA,CAAO;AAAA,YACN,gBAAA,EAAkB,WAAA;AAAA,YAClB,QAAA,EAAU,aAAa,WAAA,EAAY;AAAA,YACnC,KAAA,EAAO,eAAA;AAAA,YACP,WAAA,EAAa;AAAA,WACd,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,cAAc,EAAE,CAAA;AAE5B,UAAA,aAAA,GAAgB,aAAA,IAAiB,0BAAA;AACjC,UAAA,cAAA,GAAiB,iCAA4B,IAAA,CAAK,KAAA,CAAM,cAAc,EAAE,CAAC,cAAc,sBAAsB,CAAA;AAAA,uBAAA,EACxE,eAAe;AAAA,CAAA;AAAA,QACtD,CAAA,MAAO;AAEL,UAAA,MAAM,kBAAkB,sBAAA,GAAyB,EAAA;AACjD,UAAA,MAAM,YAAY,IAAI,IAAA,CAAK,aAAa,OAAA,EAAQ,GAAI,kBAAkB,GAAI,CAAA;AAE1E,UAAA,MAAM,QAAA,CACH,IAAA,CAAK,eAAe,CAAA,CACpB,MAAA,CAAO;AAAA,YACN,SAAS,WAAA,CAAY,MAAA;AAAA,YACrB,SAAS,WAAA,CAAY,MAAA;AAAA,YACrB,eAAe,OAAA,CAAQ,EAAA;AAAA,YACvB,KAAA,EAAO,eAAA;AAAA,YACP,WAAA,EAAa,eAAA;AAAA,YACb,UAAA,EAAY,UAAU,WAAA,EAAY;AAAA,YAClC,QAAA,EAAU,aAAa,WAAA,EAAY;AAAA,YACnC,IAAA,EAAM,MAAA;AAAA,YACN,MAAA,EAAQ,OAAA;AAAA,YACR,OAAA,EAAS,KAAA;AAAA,YACT,UAAA,EAAY,IAAA;AAAA,YACZ,gBAAA,EAAkB;AAAA,WACnB,CAAA;AAEH,UAAA,aAAA,GAAgB,qBAAA;AAChB,UAAA,cAAA,GAAiB,2BAAsB,sBAAsB,CAAA;AAAA,uBAAA,EACxB,eAAe;AAAA,CAAA;AAAA,QACtD;AAEA,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA,mBAAA,EACe,WAAW,CAAA;AAAA,kBAAA,EACZ,cAAA,CAAe,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAC;AAAA,gBAAA,EAChC,OAAO;;AAAA;AAAA,wBAAA,EAEC,WAAW,CAAA;AAAA,+BAAA,EACJ,sBAAsB,CAAA;AAAA,wBAAA,EAC7B,WAAW,CAAA;;AAAA;AAAA,8BAAA,EAEL,mBAAmB,CAAA;AAAA,sBAAA,EAC3B,iBAAA,GAAoB,CAAA,GAAI,YAAA,GAAQ,iBAAA,GAAoB,GAAA,GAAM,eAAA,GAAQ,eAAK,CAAA,EAAA,CAAI,iBAAA,GAAoB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;;AAAA,8BAAA,EACzG,aAAa,CAAA;AAAA,CAAA,GACtC,cAAA,GACA;AAAA,4DAAA;AAAA,WACP;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,qBAAA,EAAuB;AAC1B,QAAA,MAAM,EAAE,aAAa,iBAAA,GAAoB,IAAA,EAAM,sBAAsB,IAAA,EAAM,sBAAA,GAAyB,OAAM,GAAIA,KAAAA;AAG9G,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAGtD,QAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAY,MAAM,CAAA;AAC7D,QAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,YAAA,EAAa,GAAI,MAAM,QAAA,CACtD,IAAA,CAAK,aAAa,CAAA,CAClB,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CASP,CAAA,CACA,EAAA,CAAG,SAAA,EAAW,OAAO,CAAA;AAExB,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA;AAAA,QAC3D;AAGA,QAAA,MAAM,OAAA,GAAU,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,QAAA,EAAS,CAAE,UAAA,CAAW,WAAW,CAAC,CAAA;AAE9E,QAAA,IAAI,YAAA,IAAgB,CAAC,OAAA,EAAS;AAC5B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,WAAW,CAAA,CAAE,CAAA;AAAA,QACrD;AAEA,QAAA,IAAI,OAAA,GAAe;AAAA,UACjB,SAAA,EAAW,WAAA;AAAA,UACX,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,cAAc,OAAA,CAAQ,wBAAA;AAAA,UACtB,YAAY,OAAA,CAAQ,mBAAA;AAAA,UACpB,YAAY,OAAA,CAAQ,gBAAA;AAAA,UACpB,WAAW,OAAA,CAAQ;AAAA,SACrB;AAGA,QAAA,IAAI,iBAAA,EAAmB;AACrB,UAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,MAAM,SAC5B,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,+DAA+D,CAAA,CACtE,EAAA,CAAG,MAAM,OAAA,CAAQ,SAAS,EAC1B,MAAA,EAAO;AAEV,UAAA,OAAA,CAAQ,UAAA,GAAa,MAAA;AAAA,QACvB;AAGA,QAAA,IAAI,mBAAA,EAAqB;AACvB,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,QAAA,CAC3B,KAAK,UAAU,CAAA,CACf,MAAA,CAAO,wDAAwD,EAC/D,EAAA,CAAG,eAAA,EAAiB,QAAQ,EAAE,CAAA,CAC9B,MAAM,gBAAgB,CAAA;AAEzB,UAAA,OAAA,CAAQ,KAAA,GAAQ,SAAS,EAAC;AAC1B,UAAA,OAAA,CAAQ,YAAA,GAAe;AAAA,YACrB,KAAA,EAAO,OAAO,MAAA,IAAU,CAAA;AAAA,YACxB,SAAA,EAAW,OAAO,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,MAAA,KAAW,WAAW,EAAE,MAAA,IAAU,CAAA;AAAA,YAClE,UAAA,EAAY,OAAO,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,MAAA,KAAW,aAAa,EAAE,MAAA,IAAU;AAAA,WACvE;AAAA,QACF;AAGA,QAAA,IAAI,sBAAA,EAAwB;AAC1B,UAAA,MAAM,EAAE,IAAA,EAAM,SAAA,KAAc,MAAM,QAAA,CAC/B,KAAK,mBAAmB,CAAA,CACxB,MAAA,CAAO,2DAA2D,EAClE,EAAA,CAAG,eAAA,EAAiB,QAAQ,EAAE,CAAA,CAC9B,MAAM,YAAY,CAAA;AAErB,UAAA,OAAA,CAAQ,eAAA,GAAkB,aAAa,EAAC;AAAA,QAC1C;AAEA,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA,SAAA,EACY,WAAW;AAAA,QAAA,EACZ,QAAQ,MAAM;AAAA,EACtB,OAAA,CAAQ,aAAa,CAAA,QAAA,EAAW,OAAA,CAAQ,WAAW,aAAa,CAAA,GAAA,EAAM,OAAA,CAAQ,UAAA,CAAW,KAAK;AAAA,CAAA,GAAO,EAAE,CAAA,EACvG,OAAA,CAAQ,YAAA,GAAe,CAAA,eAAA,EAAkB,OAAA,CAAQ,YAAA,CAAa,SAAS,CAAA,CAAA,EAAI,OAAA,CAAQ,YAAA,CAAa,KAAK,CAAA;AAAA,CAAA,GAAiB,EAAE,CAAA,EACxH,OAAA,CAAQ,kBAAkB,CAAA,YAAA,EAAe,OAAA,CAAQ,gBAAgB,MAAM;AAAA,CAAA,GAAO,EAAE;AAAA,2DAAA;AAAA,WAE1F;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,oBAAA,EAAsB;AACzB,QAAA,MAAM,EAAE,WAAA,EAAa,KAAA,EAAO,UAAA,GAAa,MAAK,GAAIA,KAAAA;AAGlD,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAGtD,QAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAY,MAAM,CAAA;AAC7D,QAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,YAAA,KAAiB,MAAM,QAAA,CACtD,IAAA,CAAK,aAAa,EAClB,MAAA,CAAO,IAAI,CAAA,CACX,EAAA,CAAG,WAAW,OAAO,CAAA;AAExB,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA;AAAA,QAC3D;AAGA,QAAA,MAAM,OAAA,GAAU,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,QAAA,EAAS,CAAE,UAAA,CAAW,WAAW,CAAC,CAAA;AAC9E,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,MAAM,CAAA,mBAAA,EAAsB,WAAW,cAAc,WAAA,EAAa,MAAA,IAAU,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,QACrG;AAGA,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,QAAA,CACH,KAAK,UAAU,CAAA,CACf,QAAO,CACP,EAAA,CAAG,eAAA,EAAiB,OAAA,CAAQ,EAAE,CAAA;AAAA,QACnC;AAEA,QAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAE7B,UAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,UAAA,IAAI,CAAC,UAAA,EAAY;AACf,YAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,QAAA,CAC7B,IAAA,CAAK,UAAU,CAAA,CACf,MAAA,CAAO,gBAAgB,CAAA,CACvB,EAAA,CAAG,eAAA,EAAiB,OAAA,CAAQ,EAAE,CAAA,CAC9B,KAAA,CAAM,gBAAA,EAAkB,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CAC5C,KAAA,CAAM,CAAC,CAAA,CACP,MAAA,EAAO;AACV,YAAA,aAAA,GAAA,CAAiB,OAAA,EAAS,kBAAkB,CAAA,IAAK,CAAA;AAAA,UACnD;AAEA,UAAA,MAAM,WAAA,GAAc,KAAA,CAAM,GAAA,CAAI,CAAC,MAAW,KAAA,MAAmB;AAAA,YAC3D,eAAe,OAAA,CAAQ,EAAA;AAAA,YACvB,SAAS,IAAA,CAAK,OAAA;AAAA,YACd,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,cAAA,EAAgB,KAAK,MAAA,IAAU,IAAA;AAAA,YAC/B,iBAAA,EAAmB,KAAK,gBAAA,IAAoB,IAAA;AAAA,YAC5C,gBAAgB,aAAA,GAAgB;AAAA,WAClC,CAAE,CAAA;AAEF,UAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,MAAM,SAClC,IAAA,CAAK,UAAU,CAAA,CACf,MAAA,CAAO,WAAW,CAAA;AAErB,UAAA,IAAI,aAAa,MAAM,WAAA;AAAA,QACzB;AAGA,QAAA,IAAI,eAAA,GAAiC,IAAA;AAGrC,QAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAa,GAAI,MAAM,QAAA,CAClC,IAAA,CAAK,UAAU,CAAA,CACf,OAAO,QAAQ,CAAA,CACf,EAAA,CAAG,eAAA,EAAiB,QAAQ,EAAE,CAAA;AAEjC,QAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC3C,UAAA,MAAM,gBAAgB,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,aAAa,CAAA;AACvE,UAAA,MAAM,eAAe,YAAA,CAAa,KAAA,CAAM,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,WAAW,CAAA;AAGrE,UAAA,MAAM,EAAE,MAAM,YAAA,EAAa,GAAI,MAAM,QAAA,CAClC,IAAA,CAAK,cAAc,CAAA,CACnB,MAAA,CAAO,uBAAuB,CAAA,CAC9B,EAAA,CAAG,iBAAiB,OAAA,CAAQ,EAAE,EAC9B,EAAA,CAAG,QAAA,EAAU,aAAa,CAAA,CAC1B,MAAA,EAAO;AAGV,UAAA,IAAI,aAAA,IAAiB,YAAA,EAAc,aAAA,KAAkB,UAAA,EAAY;AAC/D,YAAA,MAAM,qBAAA,CAAsB,OAAA,CAAQ,EAAA,EAAI,UAAU,CAAA;AAClD,YAAA,eAAA,GAAkB,0EAAA;AAAA,UACpB;AAIA,UAAA,IAAI,aAAA,IAAiB,YAAA,EAAc,aAAA,KAAkB,mBAAA,EAAqB;AAExE,YAAA,MAAM,iBAAiB,YAAA,CAAa,MAAA,CAAO,OAAK,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAC1E,YAAA,IAAI,iBAAiB,CAAA,EAAG;AAEtB,cAAA,MAAM,qBAAA,CAAsB,OAAA,CAAQ,EAAA,EAAI,mBAAmB,CAAA;AAC3D,cAAA,eAAA,GAAkB,0DAAA;AAAA,YACpB;AAAA,UACF;AAGA,UAAA,IAAI,YAAA,IAAgB,YAAA,EAAc,aAAA,KAAkB,aAAA,EAAe;AACjE,YAAA,MAAM,qBAAA,CAAsB,OAAA,CAAQ,EAAA,EAAI,aAAa,CAAA;AACrD,YAAA,eAAA,GAAkB,0DAAA;AAAA,UACpB;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA,eAAA,EAAa,UAAA,GAAa,QAAA,GAAW,OAAO,CAAA;;AAAA,SAAA,EAChC,WAAW;AAAA,EACpB,aAAa,QAAA,GAAW,OAAO,CAAA,CAAA,EAAI,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,EACrD,aAAa,EAAA,GAAK,sCAAiC,CAAA,EACnD,eAAA,GAAkB,+BAAwB,eAAe;AAAA,CAAA,GAAO,EAAE;AAAA,gEAAA;AAAA,WAE5E;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,qBAAA,EAAuB;AAC1B,QAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,cAAA,EAAe,GAAIA,KAAAA;AAGlD,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAGtD,QAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAY,MAAM,CAAA;AAC7D,QAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,YAAA,KAAiB,MAAM,QAAA,CACtD,IAAA,CAAK,aAAa,EAClB,MAAA,CAAO,IAAI,CAAA,CACX,EAAA,CAAG,WAAW,OAAO,CAAA;AAExB,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA;AAAA,QAC3D;AAGA,QAAA,MAAM,OAAA,GAAU,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,QAAA,EAAS,CAAE,UAAA,CAAW,WAAW,CAAC,CAAA;AAC9E,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,MAAM,CAAA,mBAAA,EAAsB,WAAW,cAAc,WAAA,EAAa,MAAA,IAAU,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,QACrG;AAEA,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAEnC,UAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,QAAA,CAC7B,IAAA,CAAK,UAAU,CAAA,CACf,MAAA,CAAO,gBAAgB,CAAA,CACvB,EAAA,CAAG,eAAA,EAAiB,OAAA,CAAQ,EAAE,CAAA,CAC9B,KAAA,CAAM,gBAAA,EAAkB,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CAC5C,KAAA,CAAM,CAAC,CAAA,CACP,MAAA,EAAO;AACV,UAAA,MAAM,aAAA,GAAA,CAAiB,OAAA,EAAS,cAAA,IAAkB,CAAA,IAAK,CAAA;AAEvD,UAAA,MAAM,WAAA,GAAc,QAAA,CAAS,GAAA,CAAI,CAAC,MAAW,KAAA,MAAmB;AAAA,YAC9D,eAAe,OAAA,CAAQ,EAAA;AAAA,YACvB,OAAA,EAAS,CAAA,YAAA,EAAe,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,YACpC,MAAA,EAAQ,KAAK,MAAA,IAAU,SAAA;AAAA,YACvB,iBAAA,EAAmB,KAAK,gBAAA,IAAoB,IAAA;AAAA,YAC5C,gBAAgB,aAAA,GAAgB;AAAA,WAClC,CAAE,CAAA;AAEF,UAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,MAAM,SAClC,IAAA,CAAK,UAAU,CAAA,CACf,MAAA,CAAO,WAAW,CAAA;AAErB,UAAA,IAAI,aAAa,MAAM,WAAA;AAAA,QACzB;AAEA,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA,SAAA,EACY,WAAW;AAAA,MAAA,EACd,QAAA,EAAU,UAAU,CAAC,CAAA;AAAA,EAC3B,cAAA,GAAiB,WAAW,cAAc;AAAA,CAAA,GAAO,EAAE;AAAA,8DAAA;AAAA,WAE7D;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,uBAAA,EAAyB;AAC5B,QAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAQ,iBAAA,EAAmB,iBAAgB,GAAIA,KAAAA;AAGpE,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAItD,QAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAY,MAAM,CAAA;AAC7D,QAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,SAAA,KAAc,MAAM,QAAA,CACnD,IAAA,CAAK,aAAa,EAClB,MAAA,CAAO,IAAI,CAAA,CACX,EAAA,CAAG,WAAW,OAAO,CAAA;AAExB,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,SAAA,CAAU,OAAO,CAAA,CAAE,CAAA;AAAA,QACxD;AAEA,QAAA,MAAM,YAAA,GAAe,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,QAAA,EAAS,CAAE,UAAA,CAAW,WAAW,CAAC,CAAA;AACnF,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,MAAM,IAAI,MAAM,CAAA,mBAAA,EAAsB,WAAW,cAAc,WAAA,EAAa,MAAA,IAAU,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,QACrG;AAGA,QAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,aAAa,CAAA,CAClB,MAAA,CAAO;AAAA,UACN,MAAA;AAAA,UACA,qBAAqB,iBAAA,IAAqB,IAAA;AAAA,UAC1C,cAAc,MAAA,KAAW,WAAA,GAAA,qBAAkB,IAAA,EAAK,EAAE,aAAY,GAAI;AAAA,SACnE,EACA,EAAA,CAAG,IAAA,EAAM,aAAa,EAAE,CAAA,CACxB,MAAA,EAAO,CACP,MAAA,EAAO;AAEV,QAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA,SAAA,EACY,WAAW;AAAA,QAAA,EACZ,MAAM;AAAA,EACd,iBAAA,GAAoB,gBAAgB,iBAAiB,CAAA;AAAA,CAAA,GAAe,EAAE,CAAA,EACtE,MAAA,KAAW,WAAA,GAAc,CAAA;AAAA,CAAA,GAAwC,EAAE,CAAA,EACnE,eAAA,GAAkB,CAAA,OAAA,EAAU,eAAe;AAAA,CAAA,GAAO,EAAE,CAAA;AAAA,WAC9D;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,wBAAA,EAA0B;AAC7B,QAAA,MAAM,EAAE,aAAa,gBAAA,GAAmB,IAAA,EAAM,qBAAqB,IAAA,EAAM,YAAA,GAAe,MAAK,GAAIA,KAAAA;AAGjG,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAItD,QAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAY,MAAM,CAAA;AAC7D,QAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,YAAA,EAAa,GAAI,MAAM,QAAA,CACtD,IAAA,CAAK,aAAa,CAAA,CAClB,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAUP,CAAA,CACA,EAAA,CAAG,SAAA,EAAW,OAAO,CAAA;AAExB,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA;AAAA,QAC3D;AAGA,QAAA,MAAM,OAAA,GAAU,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,QAAA,EAAS,CAAE,UAAA,CAAW,WAAW,CAAC,CAAA;AAC9E,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,MAAM,CAAA,mBAAA,EAAsB,WAAW,cAAc,WAAA,EAAa,MAAA,IAAU,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,QACrG;AAGA,QAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAO,WAAA,EAAY,GAAI,MAAM,QAAA,CAChD,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,mDAAmD,CAAA,CAC1D,EAAA,CAAG,MAAM,OAAA,CAAQ,SAAS,EAC1B,MAAA,EAAO;AAEV,QAAA,IAAI,WAAA,IAAe,CAAC,MAAA,EAAQ;AAC1B,UAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,QAChD;AAEA,QAAA,IAAI,WAAA,GAAmB;AAAA,UACrB,OAAA,EAAS;AAAA,YACP,EAAA,EAAI,WAAA;AAAA,YACJ,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,YAAY,OAAA,CAAQ,gBAAA;AAAA,YACpB,WAAW,OAAA,CAAQ,UAAA;AAAA,YACnB,aAAa,OAAA,CAAQ;AAAA,WACvB;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,QAAQ,MAAA,CAAO,aAAA;AAAA,YACf,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,aAAa,MAAA,CAAO,WAAA;AAAA,YACpB,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,UAAU,MAAA,CAAO;AAAA;AACnB,SACF;AAGA,QAAA,IAAI,kBAAA,EAAoB;AACtB,UAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,wBAAA,IAA4B,OAAA,CAAQ,mBAAA,GAC1D,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,wBAAA,GAA2B,OAAA,CAAQ,mBAAmB,CAAA,GAC1E,IAAA;AAEJ,UAAA,WAAA,CAAY,WAAA,GAAc;AAAA,YACxB,kBAAkB,OAAA,CAAQ,wBAAA;AAAA,YAC1B,eAAe,OAAA,CAAQ,mBAAA;AAAA,YACvB,SAAA;AAAA,YACA,YAAY,OAAA,CAAQ,gBAAA;AAAA,YACpB,eAAA,EAAiB,QAAQ,YAAA,IAAgB,OAAA,CAAQ,aAC7C,IAAA,CAAK,KAAA,CAAA,CAAO,IAAI,IAAA,CAAK,OAAA,CAAQ,YAAY,EAAE,OAAA,EAAQ,GAAI,IAAI,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,EAAQ,IAAK,GAAK,CAAA,GACtG;AAAA,WACN;AAAA,QACF;AAGA,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,UAAU,CAAA,CACf,MAAA,CAAO,kEAAkE,EACzE,EAAA,CAAG,eAAA,EAAiB,QAAQ,EAAE,CAAA,CAC9B,MAAM,YAAA,EAAc,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAE1C,UAAA,WAAA,CAAY,KAAA,GAAQ,SAAS,EAAC;AAAA,QAChC;AAGA,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,MAAM,EAAE,MAAM,SAAA,EAAU,GAAI,MAAM,QAAA,CAC/B,IAAA,CAAK,mBAAmB,CAAA,CACxB,MAAA,CAAO,2DAA2D,EAClE,EAAA,CAAG,eAAA,EAAiB,QAAQ,EAAE,CAAA,CAC9B,MAAM,YAAA,EAAc,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAE1C,UAAA,WAAA,CAAY,SAAA,GAAY,aAAa,EAAC;AAAA,QACxC;AAEA,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA,sBAAA,EACkB,MAAA,CAAO,aAAa,CAAA,GAAA,EAAM,MAAA,CAAO,KAAK;AAAA,uBAAA,EACrC,WAAW,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAM,CAAA;AAAA,uBAAA,EACjC,QAAQ,mBAAA,IAAuB,KAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,4BAA4B,KAAK,CAAA;AAAA,qBAAA,EAChF,WAAA,CAAY,KAAA,EAAO,MAAA,CAAO,CAAC,MAAW,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,UAAU,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,0BAAA,EACxG,WAAA,CAAY,SAAA,EAAW,MAAA,IAAU,CAAC;;AAAA;;AAAA;AAAA;AAAA,EAEtB,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,IAAA,EAAM,CAAC,CAAC,CAAA,MAAA;AAAA,WAC7E;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,wBAAA,EAA0B;AAC7B,QAAA,MAAM,EAAE,WAAA,EAAa,gBAAA,EAAkB,YAAA,GAAe,cAAa,GAAIA,KAAAA;AAGvE,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAGtD,QAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAY,MAAM,CAAA;AAC7D,QAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,YAAA,KAAiB,MAAM,QAAA,CACtD,IAAA,CAAK,aAAa,EAClB,MAAA,CAAO,IAAI,CAAA,CACX,EAAA,CAAG,WAAW,OAAO,CAAA;AAExB,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA;AAAA,QAC3D;AAGA,QAAA,MAAM,OAAA,GAAU,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,QAAA,EAAS,CAAE,UAAA,CAAW,WAAW,CAAC,CAAA;AAC9E,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,MAAM,IAAI,MAAM,CAAA,mBAAA,EAAsB,WAAW,cAAc,WAAA,EAAa,MAAA,IAAU,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,QACrG;AAGA,QAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,aAAA,EAAc,GAAI,MAAM,QAAA,CACxD,IAAA,CAAK,cAAc,CAAA,CACnB,MAAA,CAAO;AAAA,UACN,eAAe,OAAA,CAAQ,EAAA;AAAA,UACvB,aAAA,EAAe,YAAA;AAAA,UACf,OAAA,EAAS,gBAAA;AAAA,UACT,qBAAA,EAAuB,IAAA;AAAA,UACvB,iBAAA,EAAmB;AAAA;AAAA,SACpB,CAAA,CACA,MAAA,EAAO,CACP,MAAA,EAAO;AAEV,QAAA,IAAI,eAAe,MAAM,aAAA;AAEzB,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA,mBAAA,EACe,WAAW;AAAA,yBAAA,EACL,YAAY;AAAA,kBAAA,EACnB,iBAAiB,MAAM,CAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA,EAGZ,gBAAA,CAAiB,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,GAAG,gBAAA,CAAiB,MAAA,GAAS,GAAA,GAAM,KAAA,GAAQ,EAAE,CAAA,MAAA;AAAA,WAC/G;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,qBAAA,EAAuB;AAC1B,QAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAe,gBAAA,EAAkB,kBAAA,EAAoB,iBAAgB,GAAIA,KAAAA;AAG9F,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAGtD,QAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAY,MAAM,CAAA;AAC7D,QAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,eAAA,KAAoB,MAAM,QAAA,CACzD,IAAA,CAAK,aAAa,EAClB,MAAA,CAAO,qDAAqD,CAAA,CAC5D,EAAA,CAAG,WAAW,OAAO,CAAA;AAExB,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,eAAA,CAAgB,OAAO,CAAA,CAAE,CAAA;AAAA,QAC9D;AAGA,QAAA,MAAM,eAAA,GAAkB,WAAA,EAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,QAAA,EAAS,CAAE,UAAA,CAAW,WAAW,CAAC,CAAA;AACtF,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,MAAM,IAAI,MAAM,CAAA,mBAAA,EAAsB,WAAW,cAAc,WAAA,EAAa,MAAA,IAAU,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,QACrG;AAGA,QAAA,MAAM,cAAA,uBAAqB,IAAA,EAAK;AAChC,QAAA,MAAM,gBAAA,GAAmB,IAAI,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAC5D,QAAA,MAAM,gBAAA,GAAmB,KAAK,KAAA,CAAA,CAAO,cAAA,CAAe,SAAQ,GAAI,gBAAA,CAAiB,OAAA,EAAQ,IAAK,GAAK,CAAA;AAGnG,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,YAAA,EAAa,GAAI,MAAM,QAAA,CAClD,IAAA,CAAK,aAAa,CAAA,CAClB,MAAA,CAAO;AAAA,UACN,MAAA,EAAQ,WAAA;AAAA,UACR,mBAAA,EAAqB,gBAAA;AAAA,UACrB,YAAA,EAAc,eAAe,WAAA,EAAY;AAAA,UACzC,gBAAA,EAAkB;AAAA;AAAA,SACnB,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,eAAA,CAAgB,EAAE,CAAA,CAC3B,MAAA,CAAO,qDAAqD,CAAA,CAC5D,MAAA,EAAO;AAEV,QAAA,IAAI,YAAA,IAAgB,CAAC,OAAA,EAAS;AAC5B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,WAAW,CAAA,CAAE,CAAA;AAAA,QAC5D;AAGA,QAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,wBAAA,GAC3B,gBAAA,GAAmB,QAAQ,wBAAA,GAC5B,CAAA;AAGJ,QAAA,MAAM,SACH,IAAA,CAAK,aAAa,CAAA,CAClB,MAAA,CAAO,EAAE,gBAAA,EAAkB,eAAA,CAAgB,OAAA,CAAQ,CAAC,GAAG,CAAA,CACvD,EAAA,CAAG,IAAA,EAAM,QAAQ,EAAE,CAAA;AAGtB,QAAA,MAAM,EAAE,IAAA,EAAM,YAAA,KAAiB,MAAM,QAAA,CAClC,KAAK,cAAc,CAAA,CACnB,OAAO,GAAG,CAAA,CACV,GAAG,eAAA,EAAiB,eAAA,CAAgB,EAAE,CAAA,CACtC,EAAA,CAAG,UAAU,aAAa,CAAA;AAE7B,QAAA,KAAA,MAAW,KAAA,IAAS,YAAA,IAAgB,EAAC,EAAG;AACtC,UAAA,MAAM,WAAW,IAAA,CAAK,KAAA;AAAA,YAAA,CACnB,cAAA,CAAe,SAAQ,GAAI,IAAI,KAAK,KAAA,CAAM,UAAU,CAAA,CAAE,OAAA,EAAQ,IAAK;AAAA,WACtE;AAEA,UAAA,MAAM,QAAA,CACH,IAAA,CAAK,cAAc,CAAA,CACnB,MAAA,CAAO;AAAA,YACN,QAAA,EAAU,eAAe,WAAA,EAAY;AAAA,YACrC,gBAAA,EAAkB,QAAA;AAAA,YAClB,MAAA,EAAQ;AAAA,WACT,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,MAAM,EAAE,CAAA;AAAA,QACtB;AAGA,QAAA,MAAM,QAAA,CACH,KAAK,cAAc,CAAA,CACnB,OAAO,EAAE,MAAA,EAAQ,WAAW,CAAA,CAC5B,GAAG,eAAA,EAAiB,eAAA,CAAgB,EAAE,CAAA,CACtC,EAAA,CAAG,UAAU,SAAS,CAAA,CACtB,EAAA,CAAG,4BAAA,EAA8B,CAAC,CAAA;AAGrC,QAAA,MAAM,kBAAkB,IAAA,CAAK,KAAA;AAAA,UAAA,CAC1B,cAAA,CAAe,SAAQ,GAAI,IAAI,KAAK,OAAA,CAAQ,UAAU,CAAA,CAAE,OAAA,EAAQ,IAAK;AAAA,SACxE;AAGA,QAAA,MAAM,cAAc,CAAA,UAAA,EAAa,aAAA,CAAc,MAAM,CAAA,kBAAA,EAAqB,aAAA,CAAc,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,cAAc,MAAA,GAAS,CAAA,GAAI,cAAc,EAAE,CAAA,CAAA,CAAA;AAG5J,QAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAW,GAAI,MAAM,SAChC,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO,kCAAkC,CAAA,CACzC,EAAA,CAAG,MAAM,OAAA,CAAQ,SAAS,EAC1B,MAAA,EAAO;AAIV,QAAA,IAAI,qBAAA;AAEJ,QAAA,IAAI,kBAAA,EAAoB;AAEtB,UAAA,qBAAA,GAAwB,CAAA,EAAG,UAAA,EAAY,aAAA,IAAiB,QAAQ,KAAK,kBAAkB,CAAA,CAAA;AAAA,QACzF,CAAA,MAAO;AAEL,UAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,GAAA,CAAI,CAAC,MAAc,KAAA,KAAkB,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC7G,UAAA,qBAAA,GAAwB,GAAG,UAAA,EAAY,aAAA,IAAiB,QAAQ,CAAA,EAAA,EAAK,oBAAoB,WAAW;;AAAA;AAAA,EAAwB,eAAe,CAAA,CAAA;AAAA,QAC7I;AAIA,QAAA,MAAM,gBAAA,GAAmB,QAAQ,wBAAA,IAA4B,gBAAA;AAC7D,QAAA,MAAM,YAAA,GAAe,IAAI,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AAChD,QAAA,MAAM,eAAe,IAAI,IAAA,CAAK,aAAa,OAAA,EAAQ,GAAI,mBAAmB,GAAK,CAAA;AAI/E,QAAA,MAAM,EAAE,IAAA,EAAM,qBAAA,EAAsB,GAAI,MAAM,QAAA,CAC3C,IAAA,CAAK,eAAe,CAAA,CACpB,MAAA,CAAO,sBAAsB,CAAA,CAC7B,EAAA,CAAG,iBAAiB,OAAA,CAAQ,EAAE,CAAA,CAC9B,EAAA,CAAG,QAAA,EAAU,OAAO,CAAA,CACpB,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA;AAE3C,QAAA,IAAI,WAAA,GAAqC,IAAA;AACzC,QAAA,IAAI,WAAA,GAA4B,IAAA;AAChC,QAAA,IAAI,UAAA,GAAa,KAAA;AACjB,QAAA,IAAI,iBAAA,GAAoB,CAAA;AAGxB,QAAA,MAAM,sBAAsB,qBAAA,IAAyB,qBAAA,CAAsB,SAAS,CAAA,GAAI,qBAAA,CAAsB,CAAC,CAAA,GAAI,IAAA;AAGnH,QAAA,IAAI,qBAAA,IAAyB,qBAAA,CAAsB,MAAA,GAAS,CAAA,EAAG;AAC7D,UAAA,MAAM,YAAA,GAAe,sBAAsB,KAAA,CAAM,CAAC,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE,CAAA;AACjE,UAAA,MAAM,QAAA,CACH,KAAK,eAAe,CAAA,CACpB,QAAO,CACP,EAAA,CAAG,MAAM,YAAY,CAAA;AACxB,UAAA,iBAAA,GAAoB,sBAAsB,MAAA,GAAS,CAAA;AAAA,QACrD;AAEA,QAAA,IAAI,mBAAA,EAAqB;AAEvB,UAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,WAAA,EAAY,GAAI,MAAM,QAAA,CACjD,IAAA,CAAK,eAAe,CAAA,CACpB,MAAA,CAAO;AAAA,YACN,KAAA,EAAO,YAAY,KAAA,IAAS,kBAAA;AAAA,YAC5B,WAAA,EAAa,qBAAA;AAAA,YACb,QAAA,EAAU,aAAa,WAAA,EAAY;AAAA,YACnC,UAAA,EAAY,YAAY,UAAA,IAAc,IAAA;AAAA,YACtC,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB,kBAAkB,gBAAA,GAAmB;AAAA;AAAA,WACtC,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,mBAAA,CAAoB,EAAE,CAAA,CAC/B,MAAA,CAAO,IAAI,CAAA,CACX,MAAA,EAAO;AAEV,UAAA,WAAA,GAAc,OAAA;AACd,UAAA,WAAA,GAAc,WAAA;AACd,UAAA,UAAA,GAAa,IAAA;AAAA,QACf,CAAA,MAAO;AAEL,UAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,WAAA,EAAY,GAAI,MAAM,QAAA,CACjD,IAAA,CAAK,eAAe,CAAA,CACpB,MAAA,CAAO;AAAA,YACN,SAAS,WAAA,CAAY,MAAA;AAAA,YACrB,SAAS,WAAA,CAAY,MAAA;AAAA,YACrB,KAAA,EAAO,YAAY,KAAA,IAAS,kBAAA;AAAA,YAC5B,WAAA,EAAa,qBAAA;AAAA,YACb,UAAA,EAAY,aAAa,WAAA,EAAY;AAAA,YACrC,QAAA,EAAU,aAAa,WAAA,EAAY;AAAA,YACnC,UAAA,EAAY,YAAY,UAAA,IAAc,IAAA;AAAA,YACtC,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB,eAAe,OAAA,CAAQ,EAAA;AAAA;AAAA,YACvB,IAAA,EAAM,MAAA;AAAA,YACN,MAAA,EAAQ,OAAA;AAAA;AAAA,YACR,OAAA,EAAS,KAAA;AAAA,YACT,UAAA,EAAY,IAAA;AAAA,YACZ,kBAAkB,gBAAA,GAAmB;AAAA;AAAA,WACtC,CAAA,CACA,MAAA,CAAO,IAAI,EACX,MAAA,EAAO;AAEV,UAAA,WAAA,GAAc,OAAA;AACd,UAAA,WAAA,GAAc,WAAA;AAAA,QAChB;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,OAAA,CAAQ,MAAM,CAAA,uBAAA,EAAgB,UAAA,GAAa,QAAA,GAAW,QAAQ,kBAAkB,WAAW,CAAA;AAAA,QAE7F;AAEA,QAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAiB,iBAAiB,CAAA,sCAAA,EAAyC,WAAW,CAAA,CAAE,CAAA;AAAA,QACtG;AAEA,QAAA,IAAI,YAAA,GAAe,CAAA;;AAAA,CAAA;AACnB,QAAA,YAAA,IAAgB,sBAAe,WAAW;AAAA,CAAA;AAC1C,QAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,QAAA,YAAA,IAAgB,CAAA,2BAAA,EAAyB,cAAc,MAAM;AAAA,CAAA;AAC7D,QAAA,YAAA,IAAgB,yBAAoB,gBAAgB,CAAA;AAAA,CAAA;AACpD,QAAA,YAAA,IAAgB,CAAA,0BAAA,EAAwB,OAAA,CAAQ,wBAAA,IAA4B,KAAK,CAAA;AAAA,CAAA;AACjF,QAAA,YAAA,IAAgB,CAAA,sBAAA,EAAoB,eAAA,GAAkB,CAAA,GAAI,WAAA,GAAO,eAAA,GAAkB,GAAA,GAAM,cAAA,GAAO,cAAI,CAAA,CAAA,EAAA,CAAK,eAAA,GAAkB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,CAAA;AAC1I,QAAA,YAAA,IAAgB,+BAA0B,eAAe,CAAA;;AAAA,CAAA;AAEzD,QAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,QAAA,aAAA,CAAc,OAAA,CAAQ,CAAC,IAAA,EAAc,KAAA,KAAkB;AACrD,UAAA,YAAA,IAAgB,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,IAAI;AAAA,CAAA;AAAA,QACvC,CAAC,CAAA;AACD,QAAA,YAAA,IAAgB;AAAA,CAAA;AAEhB,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,YAAA,IAAgB,CAAA;AAAA,EAA8B,gBAAgB;;AAAA,CAAA;AAAA,QAChE;AAEA,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,YAAA,IAAgB,CAAA;AAAA,EAA6B,eAAe;;AAAA,CAAA;AAAA,QAC9D;AAEA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,YAAA,IAAgB,CAAA,4BAAA,EAAwB,UAAA,GAAa,SAAA,GAAY,SAAS,CAAA;AAAA,CAAA;AAC1E,UAAA,YAAA,IAAgB,CAAA,uBAAA,EAAqB,UAAA,GAAa,oBAAA,GAAuB,cAAc,CAAA;AAAA,CAAA;AACvF,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,uBAAkB,gBAAgB,CAAA;AAAA,CAAA;AAClD,UAAA,YAAA,IAAgB,qBAAgB,YAAA,CAAa,cAAA,EAAgB,CAAA,GAAA,EAAM,cAAA,CAAe,gBAAgB;;AAAA,CAAA;AAAA,QACpG;AAGA,QAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,QAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,QAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,QAAA,YAAA,IAAgB,CAAA;;AAAA,CAAA;AAEhB,QAAA,YAAA,IAAgB,CAAA,4CAAA,CAAA;AAEhB,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACP;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,aAAa,eAAA,EAAiB,cAAA,EAAgB,oBAAmB,GAAIA,KAAAA;AAElG,QAAA,IAAI,OAAA,GAAU,IAAA;AACd,QAAA,IAAI,MAAA,GAAS,IAAA;AACb,QAAA,IAAI,SAAA,GAAY,IAAA;AAGhB,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,aAAa,MAAM,uBAAA,CAAwB,WAAA,CAAY,MAAA,EAAQ,YAAY,MAAM,CAAA;AAEvF,UAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AACnC,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,SAAS,CAAA,6DAAA,CAA+D,CAAA;AAAA,UAC7H;AAEA,UAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,OAAO,YAAA,EAAa,GAAI,MAAM,QAAA,CACtD,IAAA,CAAK,UAAU,CAAA,CACf,OAAO,mBAAmB,CAAA,CAC1B,GAAG,IAAA,EAAM,SAAS,EAClB,MAAA,EAAO;AAEV,UAAA,IAAI,YAAA,IAAgB,CAAC,WAAA,EAAa;AAChC,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,UACpD;AAEA,UAAA,OAAA,GAAU,WAAA;AAAA,QACZ;AAGA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,EAAE,IAAA,EAAM,UAAA,EAAY,OAAO,WAAA,EAAY,GAAI,MAAM,QAAA,CACpD,IAAA,CAAK,SAAS,CAAA,CACd,OAAO,qDAAqD,CAAA,CAC5D,GAAG,IAAA,EAAM,QAAQ,EACjB,MAAA,EAAO;AAEV,UAAA,IAAI,WAAA,IAAe,CAAC,UAAA,EAAY;AAC9B,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,QAAQ,CAAA,2DAAA,CAA6D,CAAA;AAAA,UAC5G;AAMA,UAAA,IAAI,SAAA,GAAY,KAAA;AAGhB,UAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAY,MAAM,CAAA;AAC7D,UAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,UAAA,CAAW,OAAO,CAAA,EAAG;AACxC,YAAA,SAAA,GAAY,IAAA;AAAA,UACd;AAGA,UAAA,IAAI,CAAC,SAAA,IAAa,UAAA,CAAW,UAAA,EAAY;AACvC,YAAA,MAAM,aAAa,MAAM,uBAAA,CAAwB,WAAA,CAAY,MAAA,EAAQ,YAAY,MAAM,CAAA;AACvF,YAAA,IAAI,UAAA,CAAW,QAAA,CAAS,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9C,cAAA,SAAA,GAAY,IAAA;AAAA,YACd;AAAA,UACF;AAGA,UAAA,IAAI,CAAC,SAAA,IAAa,UAAA,CAAW,WAAA,EAAa;AACxC,YAAA,MAAM,WAAA,GAAc,MAAM,wBAAA,CAAyB,WAAA,CAAY,MAAM,CAAA;AACrE,YAAA,IAAI,WAAA,CAAY,QAAA,CAAS,UAAA,CAAW,WAAW,CAAA,EAAG;AAChD,cAAA,SAAA,GAAY,IAAA;AAAA,YACd;AAAA,UACF;AAEA,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAQ,CAAA,2DAAA,CAA6D,CAAA;AAAA,UAC/G;AAEA,UAAA,MAAA,GAAS,UAAA;AAAA,QACX;AAGA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,EAAE,IAAA,EAAM,WAAA,EAAa,OAAO,YAAA,EAAa,GAAI,MAAM,QAAA,CACtD,IAAA,CAAK,iBAAiB,CAAA,CACtB,OAAO,uBAAuB,CAAA,CAC9B,GAAG,IAAA,EAAM,WAAW,EACpB,MAAA,EAAO;AAEV,UAAA,IAAI,YAAA,IAAgB,CAAC,WAAA,EAAa;AAChC,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,WAAW,CAAA,CAAA,CAAG,CAAA;AAAA,UACzD;AAEA,UAAA,SAAA,GAAY,WAAA;AAAA,QACd;AAGA,QAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,cAAA,GAAiB,IAAI,CAAA;AAExD,QAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,QAAA,IAAI,WAAA,GAAyJ,IAAA;AAC7J,QAAA,IAAI,WAAA,GAA4B,IAAA;AAChC,QAAA,IAAI,UAAA,GAAa,KAAA;AACjB,QAAA,IAAI,iBAAA,GAAoB,CAAA;AAIxB,QAAA,IAAI,SAAA,EAAW,EAAA,IAAM,MAAA,EAAQ,EAAA,EAAI;AAC/B,UAAA,IAAI,KAAA,GAAQ,SACT,IAAA,CAAK,eAAe,EACpB,MAAA,CAAO,4DAA4D,CAAA,CACnE,EAAA,CAAG,QAAA,EAAU,OAAO,EACpB,EAAA,CAAG,SAAA,EAAW,YAAY,MAAM,CAAA,CAChC,MAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA;AAG3C,UAAA,IAAI,WAAW,EAAA,EAAI;AACjB,YAAA,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,eAAA,EAAiB,SAAA,CAAU,EAAE,CAAA;AAAA,UAChD,CAAA,MAAA,IAAW,QAAQ,EAAA,EAAI;AACrB,YAAA,KAAA,GAAQ,KAAA,CAAM,EAAA,CAAG,WAAA,EAAa,MAAA,CAAO,EAAE,CAAA;AAAA,UACzC;AAEA,UAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAgB,GAAI,MAAM,KAAA;AAExC,UAAA,IAAI,eAAA,IAAmB,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AAEjD,YAAA,MAAM,aAAA,GAAgB,gBAAgB,CAAC,CAAA;AAGvC,YAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,cAAA,MAAM,YAAA,GAAe,gBAAgB,KAAA,CAAM,CAAC,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,EAAE,CAAA;AAC3D,cAAA,MAAM,QAAA,CACH,KAAK,eAAe,CAAA,CACpB,QAAO,CACP,EAAA,CAAG,MAAM,YAAY,CAAA;AACxB,cAAA,iBAAA,GAAoB,gBAAgB,MAAA,GAAS,CAAA;AAAA,YAC/C;AAGA,YAAA,MAAM,WAAA,GAAA,CAAe,aAAA,CAAc,gBAAA,IAAoB,CAAA,IAAK,eAAA;AAE5D,YAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,WAAA,EAAY,GAAI,MAAM,QAAA,CACjD,IAAA,CAAK,eAAe,CAAA,CACpB,MAAA,CAAO;AAAA,cACN,gBAAA,EAAkB,WAAA;AAAA,cAClB,QAAA,EAAU,IAAI,WAAA,EAAY;AAAA,cAC1B,KAAA,EAAO,eAAA;AAAA,cACP,aAAa,kBAAA,IAAsB,eAAA;AAAA,cACnC,UAAA,EAAY,OAAA,EAAS,EAAA,IAAM,aAAA,CAAc;AAAA,aAC1C,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,aAAA,CAAc,EAAE,CAAA,CACzB,MAAA,CAAO,4DAA4D,CAAA,CACnE,MAAA,EAAO;AAEV,YAAA,WAAA,GAAc,OAAA;AACd,YAAA,WAAA,GAAc,WAAA;AACd,YAAA,UAAA,GAAa,IAAA;AAAA,UACf;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,MAAM,YAAY,IAAI,IAAA,CAAK,IAAI,OAAA,EAAQ,GAAI,kBAAkB,GAAI,CAAA;AAEjE,UAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,WAAA,EAAY,GAAI,MAAM,QAAA,CACjD,IAAA,CAAK,eAAe,CAAA,CACpB,MAAA,CAAO;AAAA,YACN,SAAS,WAAA,CAAY,MAAA;AAAA,YACrB,SAAS,WAAA,CAAY,MAAA;AAAA,YACrB,UAAA,EAAY,SAAS,EAAA,IAAM,IAAA;AAAA,YAC3B,SAAA,EAAW,QAAQ,EAAA,IAAM,IAAA;AAAA,YACzB,aAAA,EAAe,WAAW,EAAA,IAAM,IAAA;AAAA,YAChC,KAAA,EAAO,eAAA;AAAA,YACP,aAAa,kBAAA,IAAsB,eAAA;AAAA,YACnC,UAAA,EAAY,UAAU,WAAA,EAAY;AAAA,YAClC,QAAA,EAAU,IAAI,WAAA,EAAY;AAAA,YAC1B,IAAA,EAAM,MAAA;AAAA,YACN,MAAA,EAAQ,OAAA;AAAA,YACR,OAAA,EAAS,KAAA;AAAA,YACT,UAAA,EAAY,IAAA;AAAA,YACZ,gBAAA,EAAkB;AAAA,WACnB,CAAA,CACA,MAAA,CAAO,4DAA4D,EACnE,MAAA,EAAO;AAEV,UAAA,WAAA,GAAc,OAAA;AACd,UAAA,WAAA,GAAc,WAAA;AAAA,QAChB;AAEA,QAAA,IAAI,WAAA,IAAe,CAAC,WAAA,EAAa;AAC/B,UAAA,MAAM,IAAI,KAAA,CAAM,CAAA,UAAA,EAAa,UAAA,GAAa,QAAA,GAAW,QAAQ,CAAA,aAAA,EAAgB,WAAA,EAAa,OAAA,IAAW,eAAe,CAAA,CAAE,CAAA;AAAA,QACxH;AAEA,QAAA,IAAI,YAAA,GAAe,CAAA,qBAAA,EAAc,UAAA,GAAa,yBAAA,GAA4B,qBAAqB,CAAA;;AAAA,CAAA;AAE/F,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA,qBAAA,EAAmB,KAAK,KAAA,CAAA,CAAO,WAAA,CAAY,oBAAoB,CAAA,IAAK,IAAA,GAAO,EAAE,CAAA,GAAI,EAAE,CAAA;;AAAA,CAAA;AAAA,QACrG;AAEA,QAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,UAAA,YAAA,IAAgB,0BAAmB,iBAAiB,CAAA;;AAAA,CAAA;AAAA,QACtD;AAEA,QAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,YAAA,IAAgB,CAAA,mBAAA,EAAiB,QAAQ,IAAI;AAAA,CAAA;AAAA,QAC/C,CAAA,MAAO;AACL,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAAA,QAClB;AACA,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,YAAA,IAAgB,CAAA,kBAAA,EAAgB,MAAA,CAAO,KAAK,CAAA,EAAA,EAAK,OAAO,MAAM,CAAA;AAAA,CAAA;AAAA,QAChE;AACA,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,YAAA,IAAgB,CAAA,sBAAA,EAAoB,SAAA,CAAU,EAAE,CAAA,EAAA,EAAK,UAAU,MAAM,CAAA;AAAA,CAAA;AAAA,QACvE;AACA,QAAA,YAAA,IAAgB,0BAAqB,eAAe;AAAA,CAAA;AACpD,QAAA,YAAA,IAAgB,aAAQ,UAAA,GAAa,OAAA,GAAU,WAAW,CAAA,QAAA,EAAW,cAAc,CAAA,GAAA,EAAM,IAAA,CAAK,KAAA,CAAM,cAAc,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,MAAO,cAAA,GAAiB,CAAA,GAAK,EAAE,CAAC,CAAA;AAAA,CAAA;AAC7J,QAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,QAAA,YAAA,IAAgB,CAAA,oBAAA,EAAkB,YAAY,EAAE;;AAAA,CAAA;AAEhD,QAAA,IAAI,kBAAA,EAAoB;AACtB,UAAA,YAAA,IAAgB,CAAA;AAAA,CAAA;AAChB,UAAA,YAAA,IAAgB,CAAA,EAAG,kBAAA,CAAmB,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,kBAAA,CAAmB,MAAA,GAAS,GAAA,GAAM,KAAA,GAAQ,EAAE;;AAAA,CAAA;AAAA,QACxG;AAEA,QAAA,YAAA,IAAgB,CAAA,kBAAA,EAAgB,UAAA,GAAa,SAAA,GAAY,SAAS,CAAA,oCAAA,CAAA;AAElE,QAAA,OAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACP;AAAA,SACH;AAAA,MACF;AAAA;AAAA,MAGA,KAAK,iBAAA,EAAmB;AACtB,QAAA,MAAM,EAAE,SAAA,EAAW,QAAA,EAAU,GAAA,EAAI,GAAIA,KAAAA;AAGrC,QAAA,MAAM,UAAA,GAAa,MAAM,wBAAA,CAAyB,SAAA,EAAW,YAAY,MAAM,CAAA;AAC/E,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM;AAAA,aACP;AAAA,WACH;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,UAAU,IAAI,OAAA,CAAQ,EAAE,IAAA,EAAM,UAAA,CAAW,OAAO,CAAA;AAEtD,UAAA,OAAA,CAAQ,MAAM,CAAA,wBAAA,EAAoB,QAAQ,CAAA,MAAA,EAAS,UAAA,CAAW,kBAAkB,CAAA,CAAE,CAAA;AAElF,UAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,UAAA,CAAW;AAAA,YACnD,OAAO,UAAA,CAAW,KAAA;AAAA,YAClB,MAAM,UAAA,CAAW,IAAA;AAAA,YACjB,IAAA,EAAM,QAAA;AAAA,YACN;AAAA,WACD,CAAA;AAGD,UAAA,IAAI,MAAM,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,SAAS,MAAA,EAAQ;AAC/C,YAAA,OAAO;AAAA,cACL,SAAS,CAAC;AAAA,gBACR,IAAA,EAAM,MAAA;AAAA,gBACN,IAAA,EAAM,WAAM,QAAQ,CAAA,2CAAA;AAAA,eACrB;AAAA,aACH;AAAA,UACF;AAGA,UAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,IAAA,CAAK,SAAS,QAAQ,CAAA,CAAE,SAAS,OAAO,CAAA;AAEpE,UAAA,IAAI,YAAA,GAAe,qBAAc,QAAQ,CAAA;AAAA,CAAA;AACzC,UAAA,YAAA,IAAgB,CAAA,YAAA,EAAe,WAAW,kBAAkB;AAAA,CAAA;AAC5D,UAAA,YAAA,IAAgB,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA;AAAA,CAAA;AAClC,UAAA,YAAA,IAAgB,CAAA,KAAA,EAAQ,KAAK,QAAQ;;AAAA,CAAA;AACrC,UAAA,YAAA,IAAgB,CAAA;AAAA;AAAA,EAAyB,OAAO;AAAA,MAAA,CAAA;AAEhD,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM;AAAA,aACP;AAAA,WACH;AAAA,QACF,SAAS,KAAA,EAAY;AACnB,UAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAE7C,UAAA,IAAI,KAAA,CAAM,WAAW,GAAA,EAAK;AACxB,YAAA,OAAO;AAAA,cACL,SAAS,CAAC;AAAA,gBACR,IAAA,EAAM,MAAA;AAAA,gBACN,IAAA,EAAM,0BAAqB,QAAQ,CAAA;AAAA,eACpC;AAAA,aACH;AAAA,UACF;AAEA,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,CAAA,4BAAA,EAA0B,KAAA,CAAM,OAAA,IAAW,eAAe,CAAA;AAAA,aACjE;AAAA,WACH;AAAA,QACF;AAAA,MACF;AAAA,MAEA,KAAK,uBAAA,EAAyB;AAC5B,QAAA,MAAM,EAAE,SAAA,EAAW,aAAA,EAAe,GAAA,EAAI,GAAIA,KAAAA;AAG1C,QAAA,MAAM,UAAA,GAAa,MAAM,wBAAA,CAAyB,SAAA,EAAW,YAAY,MAAM,CAAA;AAC/E,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM;AAAA,aACP;AAAA,WACH;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,MAAM,UAAU,IAAI,OAAA,CAAQ,EAAE,IAAA,EAAM,UAAA,CAAW,OAAO,CAAA;AAGtD,UAAA,MAAM,cAAA,GAAkB,CAAC,aAAA,IAAiB,aAAA,KAAkB,MAAO,EAAA,GAAK,aAAA;AAExE,UAAA,OAAA,CAAQ,MAAM,CAAA,6BAAA,EAAyB,cAAA,IAAkB,QAAQ,CAAA,IAAA,EAAO,UAAA,CAAW,kBAAkB,CAAA,CAAE,CAAA;AAEvG,UAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAA,CAAQ,IAAA,CAAK,MAAM,UAAA,CAAW;AAAA,YACnD,OAAO,UAAA,CAAW,KAAA;AAAA,YAClB,MAAM,UAAA,CAAW,IAAA;AAAA,YACjB,IAAA,EAAM,cAAA;AAAA,YACN;AAAA,WACD,CAAA;AAGD,UAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,YAAA,OAAO;AAAA,cACL,SAAS,CAAC;AAAA,gBACR,IAAA,EAAM,MAAA;AAAA,gBACN,IAAA,EAAM,WAAM,aAAa,CAAA,qBAAA;AAAA,eAC1B;AAAA,aACH;AAAA,UACF;AAEA,UAAA,IAAI,YAAA,GAAe,CAAA,uBAAA,EAAmB,aAAA,IAAiB,QAAQ,CAAA;AAAA,CAAA;AAC/D,UAAA,YAAA,IAAgB,CAAA,YAAA,EAAe,WAAW,kBAAkB;AAAA,CAAA;AAC5D,UAAA,YAAA,IAAgB,CAAA,OAAA,EAAU,KAAK,MAAM;;AAAA,CAAA;AAGrC,UAAA,MAAM,cAAc,IAAA,CAAK,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,SAAS,KAAK,CAAA;AAC3D,UAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,SAAS,MAAM,CAAA;AAEtD,UAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,YAAA,YAAA,IAAgB,CAAA,yBAAA,EAAqB,YAAY,MAAM,CAAA;AAAA,CAAA;AACvD,YAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,cAAA,YAAA,IAAgB,CAAA,KAAA,EAAQ,IAAI,IAAI,CAAA;AAAA,CAAA;AAAA,YAClC;AACA,YAAA,YAAA,IAAgB;AAAA,CAAA;AAAA,UAClB;AAEA,UAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,YAAA,YAAA,IAAgB,CAAA,mBAAA,EAAe,MAAM,MAAM,CAAA;AAAA,CAAA;AAC3C,YAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,cAAA,YAAA,IAAgB,CAAA,KAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,KAAK,IAAI,CAAA;AAAA,CAAA;AAAA,YACjD;AAAA,UACF;AAEA,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM;AAAA,aACP;AAAA,WACH;AAAA,QACF,SAAS,KAAA,EAAY;AACnB,UAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,KAAK,CAAA;AAEnD,UAAA,IAAI,KAAA,CAAM,WAAW,GAAA,EAAK;AACxB,YAAA,OAAO;AAAA,cACL,SAAS,CAAC;AAAA,gBACR,IAAA,EAAM,MAAA;AAAA,gBACN,IAAA,EAAM,+BAA0B,aAAa,CAAA;AAAA,eAC9C;AAAA,aACH;AAAA,UACF;AAEA,UAAA,OAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,IAAA,EAAM,MAAA;AAAA,cACN,IAAA,EAAM,CAAA,iCAAA,EAA+B,KAAA,CAAM,OAAA,IAAW,eAAe,CAAA;AAAA,aACtE;AAAA,WACH;AAAA,QACF;AAAA,MACF;AAAA,MAEA;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAE,CAAA;AAAA;AAC3C,EAEF,SAAS,KAAA,EAAY;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,gCAA2B,KAAK,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAC7B,KAAA,CAAM,UACL,KAAA,EAAO,OAAA,IAAW,KAAA,EAAO,OAAA,KAAY,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,IAAA,CAAK,UAAU,KAAK,CAAA,CAAA;AAClG,IAAA,OAAO;AAAA,MACL,SAAS,CAAC;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,CAAA,gBAAA,EAAmB,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA;AAAA,OAC1C;AAAA,KACH;AAAA,EACF;AACF,CAAC,CAAA;AAGD,MAAA,CAAO,iBAAA,CAAkB,yBAAA,EAA2B,OAAO,OAAA,KAAY;AACrE,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO;AAAA,MACL,UAAU,CAAC;AAAA,QACT,GAAA,EAAK,QAAQ,MAAA,CAAO,GAAA;AAAA,QACpB,QAAA,EAAU,YAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACP;AAAA,KACH;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,GAAA,EAAI,GAAI,OAAA,CAAQ,MAAA;AACxB,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,4BAAA,EAAwB,GAAG,CAAA,CAAE,CAAA;AAE3C,EAAA,IAAI;AACF,IAAA,QAAQ,GAAA;AAAK,MACX,KAAK,kBAAA,EAAoB;AAEvB,QAAA,MAAM,OAAA,GAAU,MAAM,oBAAA,CAAqB,WAAA,CAAa,MAAM,CAAA;AAG9D,QAAA,MAAM,aAAa,MAAM,uBAAA,CAAwB,WAAA,CAAa,MAAA,EAAQ,YAAa,MAAM,CAAA;AAGzF,QAAA,MAAM,WAAA,GAAc,MAAM,wBAAA,CAAyB,WAAA,CAAa,MAAM,CAAA;AAMtE,QAAA,IAAI,UAAA,GAAa,CAAA,YAAA,EAAe,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACjD,QAAA,IAAI,aAAA,GAAgB,WAAW,MAAA,GAAS,CAAA,GAAI,kBAAkB,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,IAAA;AACxF,QAAA,IAAI,cAAA,GAAiB,YAAY,MAAA,GAAS,CAAA,GAAI,mBAAmB,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM,IAAA;AAG5F,QAAA,MAAM,UAAU,CAAC,UAAA,EAAY,eAAe,cAAc,CAAA,CAAE,OAAO,OAAO,CAAA;AAE1E,QAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,SAAS,CAAA,CACd,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAOP,CAAA,CACA,EAAA,CAAG,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,CACpB,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA,CACxC,MAAM,EAAE,CAAA;AAEX,QAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,QAAA,OAAO;AAAA,UACL,UAAU,CAAC;AAAA,YACT,GAAA;AAAA,YACA,QAAA,EAAU,kBAAA;AAAA,YACV,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC;AAAA,WACnC;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,iBAAA,EAAmB;AACtB,QAAA,MAAM,WAAA,GAAc,MAAM,wBAAA,CAAyB,WAAA,CAAa,MAAM,CAAA;AAEtE,QAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,UAAA,OAAO;AAAA,YACL,UAAU,CAAC;AAAA,cACT,GAAA;AAAA,cACA,QAAA,EAAU,kBAAA;AAAA,cACV,MAAM,IAAA,CAAK,SAAA,CAAU,EAAC,EAAG,MAAM,CAAC;AAAA,aACjC;AAAA,WACH;AAAA,QACF;AAEA,QAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,WAAW,CAAA,CAChB,MAAA,CAAO,sCAAsC,CAAA,CAC7C,EAAA,CAAG,MAAM,WAAW,CAAA,CACpB,MAAM,MAAM,CAAA,CACZ,MAAM,EAAE,CAAA;AAEX,QAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,QAAA,OAAO;AAAA,UACL,UAAU,CAAC;AAAA,YACT,GAAA;AAAA,YACA,QAAA,EAAU,kBAAA;AAAA,YACV,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC;AAAA,WACnC;AAAA,SACH;AAAA,MACF;AAAA,MAEA,KAAK,mBAAA,EAAqB;AACxB,QAAA,MAAM,aAAa,MAAM,uBAAA,CAAwB,WAAA,CAAa,MAAA,EAAQ,YAAa,MAAM,CAAA;AAEzF,QAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,UAAA,OAAO;AAAA,YACL,UAAU,CAAC;AAAA,cACT,GAAA;AAAA,cACA,QAAA,EAAU,kBAAA;AAAA,cACV,MAAM,IAAA,CAAK,SAAA,CAAU,EAAC,EAAG,MAAM,CAAC;AAAA,aACjC;AAAA,WACH;AAAA,QACF;AAEA,QAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAC3B,IAAA,CAAK,UAAU,CAAA,CACf,MAAA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAOP,CAAA,CACA,EAAA,CAAG,IAAA,EAAM,UAAU,CAAA,CACnB,EAAA,CAAG,QAAA,EAAU,QAAQ,CAAA,CACrB,KAAA,CAAM,MAAM,CAAA,CACZ,MAAM,EAAE,CAAA;AAEX,QAAA,IAAI,OAAO,MAAM,KAAA;AAEjB,QAAA,OAAO;AAAA,UACL,UAAU,CAAC;AAAA,YACT,GAAA;AAAA,YACA,QAAA,EAAU,kBAAA;AAAA,YACV,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,MAAM,CAAC;AAAA,WACnC;AAAA,SACH;AAAA,MACF;AAAA,MAEA;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,GAAG,CAAA,CAAE,CAAA;AAAA;AAC9C,EAEF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,+BAA0B,KAAK,CAAA;AAC7C,IAAA,OAAO;AAAA,MACL,UAAU,CAAC;AAAA,QACT,GAAA;AAAA,QACA,QAAA,EAAU,YAAA;AAAA,QACV,IAAA,EAAM,iBAAiB,GAAG,CAAA,EAAA,EAAK,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAAe,CAAA;AAAA,OACxF;AAAA,KACH;AAAA,EACF;AACF,CAAC,CAAA;AAGD,eAAe,IAAA,GAAO;AACpB,EAAA,OAAA,CAAQ,MAAM,oDAA6C,CAAA;AAC3D,EAAA,OAAA,CAAQ,MAAM,CAAA,mBAAA,EAAe,MAAA,EAAQ,UAAU,CAAA,EAAG,EAAE,CAAC,CAAA,GAAA,CAAK,CAAA;AAG1D,EAAA,WAAA,GAAc,MAAM,eAAe,MAAO,CAAA;AAC1C,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAA,CAAQ,MAAM,wEAAmE,CAAA;AACjF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,MAAM,CAAA,6BAAA,EAA2B,WAAA,CAAY,MAAM,CAAA,SAAA,EAAY,WAAA,CAAY,MAAM,CAAA,CAAE,CAAA;AAC3F,EAAA,OAAA,CAAQ,MAAM,CAAA,4BAAA,EAAwB,WAAA,CAAY,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACrE,EAAA,OAAA,CAAQ,MAAM,mDAA4C,CAAA;AAE1D,EAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,EAAqB;AAC3C,EAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAChC;AAGA,OAAA,CAAQ,EAAA,CAAG,UAAU,YAAY;AAC/B,EAAA,OAAA,CAAQ,MAAM,8CAAuC,CAAA;AACrD,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB,CAAC,CAAA;AAED,OAAA,CAAQ,EAAA,CAAG,WAAW,YAAY;AAChC,EAAA,OAAA,CAAQ,MAAM,8CAAuC,CAAA;AACrD,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB,CAAC,CAAA;AAGD,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AACtB,EAAA,OAAA,CAAQ,KAAA,CAAM,0BAAmB,KAAK,CAAA;AACtC,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB,CAAC,CAAA","file":"index.js","sourcesContent":["#!/usr/bin/env node\r\n\r\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema } from '@modelcontextprotocol/sdk/types.js';\r\nimport { createClient } from '@supabase/supabase-js';\r\nimport { createHash } from 'crypto';\r\nimport { Octokit } from '@octokit/rest';\r\n\r\n// Parse command line arguments and environment\r\nconst args = process.argv.slice(2);\r\nconst apiKey = args.find(arg => arg.startsWith('--api-key='))?.split('=')[1] || process.env.MG_TICKETS_API_KEY;\r\n// Default to Refront's Supabase for SaaS customers\r\nconst supabaseUrl = args.find(arg => arg.startsWith('--supabase-url='))?.split('=')[1] || \r\n process.env.SUPABASE_URL || \r\n 'https://supabase.refront.nl';\r\n\r\nconst supabaseKey = args.find(arg => arg.startsWith('--supabase-key='))?.split('=')[1] || \r\n process.env.SUPABASE_SERVICE_ROLE_KEY || \r\n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoic2VydmljZV9yb2xlIiwiaXNzIjoic3VwYWJhc2UiLCJpYXQiOjE3NzIwMzE4MzUsImV4cCI6MTkyOTcxMTgzNX0.M0glA9Ry0v87f-WzLKjLfS2Or4141b8c6Czoj1m5fjE';\r\n\r\nif (!apiKey) {\r\n console.error('❌ API key is required. Use --api-key=your_key or set MG_TICKETS_API_KEY environment variable');\r\n process.exit(1);\r\n}\r\n\r\n// Supabase credentials validation (optional with defaults)\r\nif (!supabaseUrl || !supabaseKey) {\r\n console.error('❌ Supabase credentials missing. Using defaults for Refront SaaS.');\r\n}\r\n\r\n// Initialize Supabase client with service role\r\nconst supabase = createClient(supabaseUrl, supabaseKey);\r\n\r\ninterface AuthContext {\r\n userId: string;\r\n teamId: string;\r\n scopes: string[];\r\n}\r\n\r\n// Smart time estimation and codebase analysis is now handled by Cursor AI\r\n// MCP bridge focuses on data storage and session management only\r\n\r\n/**\r\n * Round minutes to the nearest 15-minute increment\r\n * @param minutes - The number of minutes to round\r\n * @returns The rounded number of minutes (always a multiple of 15)\r\n */\r\nfunction roundToNearest15Minutes(minutes: number): number {\r\n if (minutes <= 0) return 0;\r\n return Math.round(minutes / 15) * 15;\r\n}\r\n\r\n// Helper function to get accessible team IDs (own team + child teams)\r\nasync function getAccessibleTeamIds(teamId: string): Promise<string[]> {\r\n const { data: accessibleTeams } = await supabase\r\n .from('teams')\r\n .select('id')\r\n .or(`id.eq.${teamId},parent_team_id.eq.${teamId}`);\r\n \r\n return accessibleTeams?.map(t => t.id) || [teamId];\r\n}\r\n\r\n// Helper function to get accessible project IDs (includes shared customer projects)\r\nasync function getAccessibleProjectIds(userId: string, teamId: string): Promise<string[]> {\r\n const { data, error } = await supabase.rpc('get_accessible_project_ids', {\r\n p_user_id: userId,\r\n p_team_id: teamId\r\n });\r\n \r\n if (error) {\r\n console.error('❌ Error getting accessible project IDs:', error);\r\n return [];\r\n }\r\n \r\n return data?.map((row: any) => row.project_id) || [];\r\n}\r\n\r\n// Helper function to get accessible customer IDs (includes shared customers)\r\nasync function getAccessibleCustomerIds(teamId: string): Promise<string[]> {\r\n const teamIds = await getAccessibleTeamIds(teamId);\r\n \r\n // Get customers owned by accessible teams\r\n const { data: ownCustomers } = await supabase\r\n .from('customers')\r\n .select('id')\r\n .in('team_id', teamIds);\r\n \r\n const ownCustomerIds = ownCustomers?.map(c => c.id) || [];\r\n \r\n // Get shared customers\r\n const { data: sharedCustomers } = await supabase\r\n .from('customer_shared_teams')\r\n .select('customer_id')\r\n .eq('team_id', teamId);\r\n \r\n const sharedCustomerIds = sharedCustomers?.map(c => c.customer_id) || [];\r\n \r\n // Combine and deduplicate\r\n return [...new Set([...ownCustomerIds, ...sharedCustomerIds])];\r\n}\r\n\r\n// API Key validation - direct database access\r\nasync function validateApiKey(key: string): Promise<AuthContext | null> {\r\n if (!key.startsWith('mid_') || key.length !== 68) {\r\n console.error('🔑 Invalid API key format');\r\n return null;\r\n }\r\n\r\n try {\r\n // Hash the API key\r\n const keyHash = createHash('sha256').update(key).digest('hex');\r\n console.error(`🔍 Validating API key hash: ${keyHash.substring(0, 16)}...`);\r\n \r\n // Query database for API key\r\n const { data: apiKeyData, error } = await supabase\r\n .from('api_keys')\r\n .select('id, user_id, team_id, scopes, last_used_at')\r\n .eq('key_hash', keyHash)\r\n .single();\r\n\r\n if (error || !apiKeyData) {\r\n console.error('❌ API key not found or invalid:', error?.message);\r\n return null;\r\n }\r\n\r\n // Update last used timestamp\r\n await supabase\r\n .from('api_keys')\r\n .update({ last_used_at: new Date().toISOString() })\r\n .eq('id', apiKeyData.id);\r\n\r\n console.error(`✅ API key validated for user ${apiKeyData.user_id} in team ${apiKeyData.team_id}`);\r\n \r\n return {\r\n userId: apiKeyData.user_id,\r\n teamId: apiKeyData.team_id,\r\n scopes: apiKeyData.scopes || []\r\n };\r\n } catch (error) {\r\n console.error('💥 API key validation error:', error);\r\n return null;\r\n }\r\n}\r\n\r\n// Validate auth context once at startup\r\nlet authContext: AuthContext | null = null;\r\n\r\n// Helper function to check if a file is an image\r\nfunction isImageFile(mimeType: string): boolean {\r\n return mimeType.startsWith('image/') && \r\n ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp'].includes(mimeType);\r\n}\r\n\r\n// Helper function to download and convert image to base64\r\nasync function downloadImageAsBase64(storageKey: string): Promise<string | null> {\r\n try {\r\n // Get signed URL for the file (1 hour expiry)\r\n const { data: urlData, error: urlError } = await supabase.storage\r\n .from('vault')\r\n .createSignedUrl(storageKey, 3600);\r\n \r\n if (urlError || !urlData?.signedUrl) {\r\n console.error(`Failed to create signed URL for ${storageKey}:`, urlError);\r\n return null;\r\n }\r\n \r\n // Download the file\r\n const response = await fetch(urlData.signedUrl);\r\n if (!response.ok) {\r\n console.error(`Failed to download file ${storageKey}: ${response.status}`);\r\n return null;\r\n }\r\n \r\n // Convert to base64\r\n const arrayBuffer = await response.arrayBuffer();\r\n const buffer = Buffer.from(arrayBuffer);\r\n return buffer.toString('base64');\r\n } catch (error) {\r\n console.error(`Error downloading image ${storageKey}:`, error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Convert TipTap JSON format to plain text for timetrack/agenda display\r\n * @param description - The description in TipTap JSON format or plain text\r\n * @returns Plain text version of the description\r\n */\r\nfunction convertTipTapToPlainText(description?: string | null): string {\r\n if (!description) {\r\n return \"\";\r\n }\r\n\r\n // If it's already plain text, return as is\r\n const trimmed = description.trimStart();\r\n if (!trimmed.startsWith('{') || !/\"type\"\\s*:\\s*\"doc\"/.test(trimmed.slice(0, 30))) {\r\n return description;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(description);\r\n \r\n // Recursively extract text from TipTap JSON structure\r\n const extractText = (node: any): string => {\r\n if (!node) return \"\";\r\n\r\n // Text nodes contain the actual text\r\n if (node.type === \"text\") {\r\n return node.text || \"\";\r\n }\r\n\r\n // Handle hard breaks\r\n if (node.type === \"hardBreak\") {\r\n return \"\\n\";\r\n }\r\n\r\n // Handle mentions\r\n if (node.type === \"mention\") {\r\n return `@${node.attrs?.label || node.attrs?.id || \"\"}`;\r\n }\r\n\r\n // Handle ticket mentions\r\n if (node.type === \"ticketMention\") {\r\n return `#${node.attrs?.label || node.attrs?.id || \"\"}`;\r\n }\r\n\r\n // Handle images\r\n if (node.type === \"image\") {\r\n return \"[afbeelding]\";\r\n }\r\n\r\n // Process children recursively\r\n if (node.content && Array.isArray(node.content)) {\r\n const childrenText = node.content.map(extractText).join(\"\");\r\n \r\n // Add appropriate spacing based on node type\r\n switch (node.type) {\r\n case \"paragraph\":\r\n return childrenText + \"\\n\";\r\n case \"heading\":\r\n return childrenText + \"\\n\\n\";\r\n case \"listItem\":\r\n return \"• \" + childrenText + \"\\n\";\r\n case \"blockquote\":\r\n return \"> \" + childrenText + \"\\n\";\r\n default:\r\n return childrenText;\r\n }\r\n }\r\n \r\n // For nodes without content (like empty paragraphs without content array)\r\n if (node.type === \"paragraph\") {\r\n return \"\\n\";\r\n }\r\n\r\n return \"\";\r\n };\r\n\r\n const plainText = extractText(parsed);\r\n return plainText.trim();\r\n } catch (error) {\r\n // If parsing fails, return original string\r\n return description;\r\n }\r\n}\r\n\r\n/**\r\n * Get GitHub OAuth token and repository info for a project\r\n * @param projectId - Project UUID\r\n * @param teamId - Team UUID\r\n * @returns GitHub token and repository info or null if not found\r\n */\r\nasync function getGithubTokenForProject(projectId: string, teamId: string): Promise<{\r\n token: string;\r\n repositoryFullName: string;\r\n owner: string;\r\n repo: string;\r\n} | null> {\r\n try {\r\n // 1. Get repository info for project\r\n const { data: repoData, error: repoError } = await supabase\r\n .from('project_github_repositories')\r\n .select('repository_full_name')\r\n .eq('project_id', projectId)\r\n .eq('team_id', teamId)\r\n .single();\r\n \r\n if (repoError || !repoData) {\r\n console.error(`No GitHub repository linked to project ${projectId}`);\r\n return null;\r\n }\r\n \r\n // 2. Get GitHub OAuth token from apps table\r\n const { data: appData, error: appError } = await supabase\r\n .from('apps')\r\n .select('config')\r\n .eq('team_id', teamId)\r\n .eq('app_id', 'github')\r\n .single();\r\n \r\n if (appError || !appData?.config?.access_token) {\r\n console.error(`GitHub app not connected for team ${teamId}`);\r\n return null;\r\n }\r\n \r\n const accessToken = appData.config.access_token;\r\n const repositoryFullName = repoData.repository_full_name;\r\n \r\n // Parse owner/repo from full name (e.g., \"refront-ai/refront\" -> owner=\"refront-ai\", repo=\"refront\")\r\n const [owner, repo] = repositoryFullName.split('/');\r\n \r\n if (!owner || !repo) {\r\n console.error(`Invalid repository full name: ${repositoryFullName}`);\r\n return null;\r\n }\r\n \r\n return {\r\n token: accessToken,\r\n repositoryFullName,\r\n owner,\r\n repo\r\n };\r\n } catch (error) {\r\n console.error('Error getting GitHub token for project:', error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Automatically transition to the next phase when current phase is completed\r\n * Phase order: analysis -> bug_investigation -> development -> communication\r\n * @param sessionId - The AI session UUID\r\n * @param currentPhase - The phase that just completed (optional, auto-detect if not provided)\r\n */\r\nasync function transitionToNextPhase(sessionId: string, currentPhase?: string): Promise<void> {\r\n try {\r\n const now = new Date();\r\n \r\n // Define phase order\r\n const phaseOrder = ['analysis', 'bug_investigation', 'development', 'communication'];\r\n \r\n // Get all phases for this session\r\n const { data: allPhases, error: fetchError } = await supabase\r\n .from('ai_time_logs')\r\n .select('*')\r\n .eq('ai_session_id', sessionId)\r\n .order('activity_type');\r\n \r\n if (fetchError || !allPhases) {\r\n console.error('Failed to fetch phases for transition:', fetchError);\r\n return;\r\n }\r\n \r\n // Find current active phase if not provided\r\n let currentPhaseType = currentPhase;\r\n if (!currentPhaseType) {\r\n const activePhase = allPhases.find(p => p.status === 'in_progress');\r\n currentPhaseType = activePhase?.activity_type;\r\n }\r\n \r\n // If no current phase found, start with analysis\r\n if (!currentPhaseType) {\r\n const analysisPhase = allPhases.find(p => p.activity_type === 'analysis');\r\n if (analysisPhase && analysisPhase.status === 'pending' && analysisPhase.estimated_duration_seconds > 0) {\r\n await supabase\r\n .from('ai_time_logs')\r\n .update({\r\n status: 'in_progress',\r\n started_at: now.toISOString()\r\n })\r\n .eq('id', analysisPhase.id);\r\n console.error('✅ Started analysis phase');\r\n }\r\n return;\r\n }\r\n \r\n // Complete current phase if it's still in progress\r\n const currentPhaseRecord = allPhases.find(p => p.activity_type === currentPhaseType && p.status === 'in_progress');\r\n if (currentPhaseRecord) {\r\n const duration = Math.round((now.getTime() - new Date(currentPhaseRecord.started_at).getTime()) / 1000);\r\n await supabase\r\n .from('ai_time_logs')\r\n .update({\r\n status: 'completed',\r\n ended_at: now.toISOString(),\r\n duration_seconds: duration\r\n })\r\n .eq('id', currentPhaseRecord.id);\r\n console.error(`✅ Completed phase: ${currentPhaseType} (${duration}s)`);\r\n }\r\n \r\n // Find next phase in order\r\n const currentIndex = phaseOrder.indexOf(currentPhaseType);\r\n if (currentIndex === -1 || currentIndex === phaseOrder.length - 1) {\r\n console.error('No next phase to transition to');\r\n return;\r\n }\r\n \r\n // Look for the next valid phase (skip phases with 0 estimated time)\r\n for (let i = currentIndex + 1; i < phaseOrder.length; i++) {\r\n const nextPhaseType = phaseOrder[i];\r\n const nextPhase = allPhases.find(p => p.activity_type === nextPhaseType);\r\n \r\n if (!nextPhase) continue;\r\n \r\n // Skip phases with 0 estimated time\r\n if (nextPhase.estimated_duration_seconds === 0) {\r\n await supabase\r\n .from('ai_time_logs')\r\n .update({ status: 'skipped' })\r\n .eq('id', nextPhase.id);\r\n console.error(`⏭️ Skipped phase: ${nextPhaseType} (0 minutes estimated)`);\r\n continue;\r\n }\r\n \r\n // Start the next phase\r\n if (nextPhase.status === 'pending') {\r\n await supabase\r\n .from('ai_time_logs')\r\n .update({\r\n status: 'in_progress',\r\n started_at: now.toISOString()\r\n })\r\n .eq('id', nextPhase.id);\r\n console.error(`✅ Started next phase: ${nextPhaseType}`);\r\n return;\r\n }\r\n }\r\n \r\n console.error('All remaining phases skipped or completed');\r\n } catch (error) {\r\n console.error('Error transitioning to next phase:', error);\r\n }\r\n}\r\n\r\n// MCP Server setup\r\nconst server = new Server(\r\n {\r\n name: 'mg-tickets-mcp-bridge',\r\n version: '2.0.0',\r\n },\r\n {\r\n capabilities: {\r\n tools: {},\r\n resources: {},\r\n },\r\n }\r\n);\r\n\r\n// Available tools definition\r\nconst TOOLS = [\r\n {\r\n name: 'get-tickets',\r\n description: 'Get tickets with optional filtering by status, priority, project, customer, or search query',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n status: { type: 'string', enum: ['open', 'in_progress', 'review', 'resolved', 'closed', 'backlog'] },\r\n priority: { type: 'string', enum: ['low', 'medium', 'high', 'critical'] },\r\n projectId: { type: 'string' },\r\n customerId: { type: 'string' },\r\n q: { type: 'string', description: 'Search query for ticket number, title, or description' },\r\n pageSize: { type: 'number', default: 20, maximum: 100 }\r\n },\r\n required: []\r\n }\r\n },\r\n {\r\n name: 'get-ticket-by-id',\r\n description: 'Get a specific ticket by its ID, including all attachments, comments, and images. Images from ticket attachments and comment attachments are automatically downloaded and returned as base64-encoded content that can be analyzed by AI.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n id: { type: 'string', description: 'Ticket ID' }\r\n },\r\n required: ['id']\r\n }\r\n },\r\n {\r\n name: 'create-ticket',\r\n description: 'Create a new ticket',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n title: { type: 'string', description: 'Ticket title' },\r\n description: { type: 'string' },\r\n status: { type: 'string', enum: ['open', 'in_progress', 'review', 'resolved', 'closed', 'backlog'], default: 'open' },\r\n priority: { type: 'string', enum: ['low', 'medium', 'high', 'critical'], default: 'medium' },\r\n type: { type: 'string', enum: ['task', 'bug', 'feature', 'support', 'question', 'improvement'], default: 'task' },\r\n projectId: { type: 'string' },\r\n customerId: { type: 'string' }\r\n },\r\n required: ['title']\r\n }\r\n },\r\n {\r\n name: 'get-customers',\r\n description: 'Get customers with optional search',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n q: { type: 'string', description: 'Search query for customer name or email' },\r\n pageSize: { type: 'number', default: 20, maximum: 100 }\r\n },\r\n required: []\r\n }\r\n },\r\n {\r\n name: 'create-customer',\r\n description: 'Create a new customer',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Customer name' },\r\n email: { type: 'string' },\r\n website: { type: 'string' }\r\n },\r\n required: ['name']\r\n }\r\n },\r\n {\r\n name: 'get-projects',\r\n description: 'Get projects with optional filtering',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n customerId: { type: 'string', description: 'Filter by customer ID' },\r\n q: { type: 'string', description: 'Search query for project name' },\r\n pageSize: { type: 'number', default: 20, maximum: 100 }\r\n },\r\n required: []\r\n }\r\n },\r\n {\r\n name: 'create-project',\r\n description: 'Create a new project',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n name: { type: 'string', description: 'Project name' },\r\n description: { type: 'string' },\r\n customerId: { type: 'string' },\r\n status: { type: 'string', enum: ['active', 'on_hold', 'completed', 'cancelled'], default: 'active' }\r\n },\r\n required: ['name']\r\n }\r\n },\r\n // === NEW AI SESSION TOOLS ===\r\n {\r\n name: 'start-ai-session-smart',\r\n description: 'Start a new AI development session with automatic tracking',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n ticketId: { type: 'string' },\r\n ticketUrl: { type: 'string', description: 'URL to the ticket' },\r\n cursorSessionId: { type: 'string', description: 'Cursor session identifier' },\r\n totalEstimatedMinutes: { \r\n type: 'number', \r\n description: 'Total estimated time in minutes (senior dev WITHOUT AI, rounded to 15 min)' \r\n },\r\n complexityScore: {\r\n type: 'number',\r\n minimum: 1,\r\n maximum: 10,\r\n description: 'Estimated complexity from 1-10'\r\n }\r\n },\r\n required: ['ticketId', 'totalEstimatedMinutes']\r\n }\r\n },\r\n {\r\n name: 'track-manual-follow-up',\r\n description: 'Track manual follow-up prompt by developer',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n aiSessionId: { type: 'string' },\r\n originalPrompt: { type: 'string' },\r\n aiResponse: { type: 'string' },\r\n developerFollowUp: { type: 'string' },\r\n followUpReason: { \r\n type: 'string', \r\n enum: ['incomplete_result', 'wrong_approach', 'needs_clarification', 'error_in_code']\r\n },\r\n outcome: {\r\n type: 'string',\r\n enum: ['success', 'partial_success', 'still_failed'],\r\n default: 'success'\r\n },\r\n estimatedMinutes: { \r\n type: 'number',\r\n description: 'Estimated time needed for this follow-up work (think as senior dev WITHOUT AI, in minutes)'\r\n },\r\n workDescription: {\r\n type: 'string',\r\n description: 'Detailed work description generated by AI (2-3 sentences, summarizing all work done in session including follow-ups)'\r\n }\r\n },\r\n required: ['aiSessionId', 'originalPrompt', 'aiResponse', 'developerFollowUp', 'followUpReason', 'estimatedMinutes', 'workDescription']\r\n }\r\n },\r\n {\r\n name: 'get-session-context',\r\n description: 'Get current session context for follow-up continuity',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n aiSessionId: { type: 'string' },\r\n includeTicketData: { type: 'boolean', default: true },\r\n includeTodoProgress: { type: 'boolean', default: true },\r\n includeFollowUpHistory: { type: 'boolean', default: false }\r\n },\r\n required: ['aiSessionId']\r\n }\r\n },\r\n {\r\n name: 'sync-session-todos',\r\n description: 'Synchronize todo list with AI session (replace existing) or add new todos',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n aiSessionId: { type: 'string' },\r\n todos: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n todoId: { type: 'string', description: 'Optional external todo ID for tracking' },\r\n content: { type: 'string' },\r\n status: { type: 'string', enum: ['pending', 'in_progress', 'completed', 'cancelled'] },\r\n estimatedMinutes: { type: 'number' }\r\n },\r\n required: ['content', 'status']\r\n }\r\n },\r\n replaceAll: { \r\n type: 'boolean', \r\n default: true, \r\n description: 'If true, replace all existing todos. If false, add new todos to existing ones' \r\n }\r\n },\r\n required: ['aiSessionId', 'todos']\r\n }\r\n },\r\n {\r\n name: 'add-follow-up-todos',\r\n description: 'Add new todos from follow-up (without replacing existing ones)',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n aiSessionId: { type: 'string' },\r\n newTodos: {\r\n type: 'array',\r\n items: {\r\n type: 'object',\r\n properties: {\r\n content: { type: 'string' },\r\n status: { type: 'string', enum: ['pending', 'in_progress'], default: 'pending' },\r\n estimatedMinutes: { type: 'number' },\r\n addedInFollowUp: { type: 'boolean', default: true }\r\n },\r\n required: ['content']\r\n }\r\n },\r\n followUpReason: { \r\n type: 'string', \r\n description: 'Why were these todos added in follow-up' \r\n }\r\n },\r\n required: ['aiSessionId', 'newTodos']\r\n }\r\n },\r\n {\r\n name: 'update-session-status',\r\n description: 'Update AI session status and completion info',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n aiSessionId: { type: 'string' },\r\n status: {\r\n type: 'string',\r\n enum: ['started', 'in_progress', 'paused', 'completed', 'failed']\r\n },\r\n actualTimeMinutes: { type: 'number' },\r\n completionNotes: { type: 'string' }\r\n },\r\n required: ['aiSessionId', 'status']\r\n }\r\n },\r\n {\r\n name: 'get-completion-context',\r\n description: 'Get all context needed for Cursor AI to generate customer response',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n aiSessionId: { type: 'string' },\r\n includeFollowUps: { type: 'boolean', default: true },\r\n includeTimeMetrics: { type: 'boolean', default: true },\r\n includeTodos: { type: 'boolean', default: true }\r\n },\r\n required: ['aiSessionId']\r\n }\r\n },\r\n {\r\n name: 'save-customer-response',\r\n description: 'Save customer response generated by Cursor AI',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n aiSessionId: { type: 'string' },\r\n customerResponse: { type: 'string', description: 'Customer response generated by Cursor AI' },\r\n responseType: { \r\n type: 'string', \r\n enum: ['completion', 'progress_update', 'needs_clarification'],\r\n default: 'completion'\r\n }\r\n },\r\n required: ['aiSessionId', 'customerResponse']\r\n }\r\n },\r\n {\r\n name: 'complete-ai-session',\r\n description: 'Complete AI session with work summary - time calculated automatically',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n aiSessionId: { type: 'string' },\r\n workCompleted: {\r\n type: 'array',\r\n items: { type: 'string' },\r\n description: 'List of completed tasks/todos in English'\r\n },\r\n technicalSummary: {\r\n type: 'string',\r\n description: 'Technical summary of work done in English'\r\n },\r\n invoiceDescription: {\r\n type: 'string',\r\n description: 'Short invoice-friendly description in the language of the ticket (2-3 sentences max, suitable for billing)'\r\n },\r\n efficiencyNotes: { type: 'string' }\r\n },\r\n required: ['aiSessionId', 'workCompleted']\r\n }\r\n },\r\n {\r\n name: 'log-hours',\r\n description: 'Analyze current chat conversation and log hours as draft tracker entry. AI analyzes chat context to estimate hours as a senior developer would (without AI assistance). Cursor AI matches workspace name to correct project from list (optional).',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n projectId: {\r\n type: 'string',\r\n description: 'Project ID (UUID) - Optional. Cursor AI should call get-projects first to try matching workspace name. If no clear match, omit this field.'\r\n },\r\n ticketId: {\r\n type: 'string',\r\n description: 'Ticket ID (UUID) - Optional. Cursor AI should call get-tickets (filtered by project) to try matching chat context to an open ticket. Only include if a clear match is found.'\r\n },\r\n aiSessionId: {\r\n type: 'string',\r\n description: 'AI Session ID - Optional. If a ticket has an active AI dev session, include this ID to link the hours to that session.'\r\n },\r\n workDescription: {\r\n type: 'string',\r\n description: 'Short description of the work done (for the tracker entry)'\r\n },\r\n estimatedHours: {\r\n type: 'number',\r\n description: 'AI-estimated hours as senior developer would spend WITHOUT AI (e.g., 2.5 for 2.5 hours)'\r\n },\r\n chatContextSummary: {\r\n type: 'string',\r\n description: 'Brief summary of chat context for internal logging (optional)'\r\n }\r\n },\r\n required: ['workDescription', 'estimatedHours']\r\n }\r\n },\r\n // === GITHUB TOOLS ===\r\n {\r\n name: 'get-github-file',\r\n description: 'Get the contents of a specific file from a GitHub repository. Use this after finding relevant files to read their full content.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n projectId: { \r\n type: 'string', \r\n description: 'Project ID (UUID)' \r\n },\r\n filePath: { \r\n type: 'string', \r\n description: 'Full path to the file in the repository (e.g., \"src/components/Button.tsx\")' \r\n },\r\n ref: {\r\n type: 'string',\r\n description: 'Optional: Git reference (branch, tag, or commit SHA). Defaults to repository default branch.'\r\n }\r\n },\r\n required: ['projectId', 'filePath']\r\n }\r\n },\r\n {\r\n name: 'list-github-directory',\r\n description: 'List files and directories in a GitHub repository directory. Use this to explore repository structure.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n projectId: { \r\n type: 'string', \r\n description: 'Project ID (UUID)' \r\n },\r\n directoryPath: { \r\n type: 'string', \r\n description: 'Path to directory (e.g., \"src/components\"). Use empty string or \"/\" for root directory.' \r\n },\r\n ref: {\r\n type: 'string',\r\n description: 'Optional: Git reference (branch, tag, or commit SHA). Defaults to repository default branch.'\r\n }\r\n },\r\n required: ['projectId', 'directoryPath']\r\n }\r\n }\r\n];\r\n\r\n// Available resources\r\nconst RESOURCES = [\r\n {\r\n uri: 'tickets://recent',\r\n name: 'Recent Tickets',\r\n description: 'Most recently created tickets',\r\n mimeType: 'application/json'\r\n },\r\n {\r\n uri: 'customers://all',\r\n name: 'All Customers', \r\n description: 'Complete customer directory',\r\n mimeType: 'application/json'\r\n },\r\n {\r\n uri: 'projects://active',\r\n name: 'Active Projects',\r\n description: 'Currently active projects',\r\n mimeType: 'application/json'\r\n }\r\n];\r\n\r\n// List tools handler\r\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\r\n return { tools: TOOLS };\r\n});\r\n\r\n// List resources handler\r\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\r\n return { resources: RESOURCES };\r\n});\r\n\r\n// Helper function to update phase transitions\r\n// DEPRECATED: Use transitionToNextPhase instead\r\n// This function is kept for backward compatibility but now delegates to transitionToNextPhase\r\nasync function updatePhaseTransition(\r\n sessionId: string, \r\n fromPhase: string, \r\n toPhase: string\r\n): Promise<void> {\r\n // Use the new automatic transition system that handles all phases correctly\r\n await transitionToNextPhase(sessionId, fromPhase);\r\n}\r\n\r\n// Tool execution handler\r\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\r\n if (!authContext) {\r\n return {\r\n content: [{ type: 'text', text: 'Error: Not authenticated. API key validation failed.' }],\r\n };\r\n }\r\n\r\n const { name, arguments: args } = request.params;\r\n console.error(`🛠️ Executing tool: ${name} for team ${authContext.teamId}`);\r\n \r\n try {\r\n switch (name) {\r\n case 'get-tickets': {\r\n const { status, priority, projectId, customerId, q, pageSize = 20 } = args as any;\r\n \r\n // Get all accessible team IDs (own team + child teams)\r\n const teamIds = await getAccessibleTeamIds(authContext.teamId);\r\n \r\n // Get all accessible project IDs (includes shared customer projects)\r\n const projectIds = await getAccessibleProjectIds(authContext.userId, authContext.teamId);\r\n \r\n // Get all accessible customer IDs (includes shared customers)\r\n const customerIds = await getAccessibleCustomerIds(authContext.teamId);\r\n \r\n // Build a filter that includes:\r\n // 1. Tickets from own team + child teams\r\n // 2. Tickets from projects where user has access (includes shared customer projects)\r\n // 3. Tickets from shared customers (even without a project)\r\n let teamFilter = `team_id.in.(${teamIds.join(',')})`;\r\n let projectFilter = projectIds.length > 0 ? `project_id.in.(${projectIds.join(',')})` : null;\r\n let customerFilter = customerIds.length > 0 ? `customer_id.in.(${customerIds.join(',')})` : null;\r\n \r\n // Combine filters with OR\r\n const filters = [teamFilter, projectFilter, customerFilter].filter(Boolean);\r\n \r\n let query = supabase\r\n .from('tickets')\r\n .select(`\r\n id,\r\n ticket_number,\r\n title,\r\n description,\r\n status,\r\n priority,\r\n type,\r\n created_at,\r\n project_id,\r\n customer_id,\r\n projects:project_id(id, name),\r\n customers:customer_id(id, name)\r\n `)\r\n .or(filters.join(','))\r\n .limit(Math.min(pageSize, 100));\r\n \r\n if (status) query = query.eq('status', status);\r\n if (priority) query = query.eq('priority', priority);\r\n if (projectId) query = query.eq('project_id', projectId);\r\n if (customerId) query = query.eq('customer_id', customerId);\r\n if (q) query = query.or(`ticket_number.ilike.%${q}%,title.ilike.%${q}%,description.ilike.%${q}%`);\r\n \r\n const { data, error } = await query.order('created_at', { ascending: false });\r\n \r\n if (error) throw error;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `Found ${data?.length || 0} tickets:\\n\\n${data?.map(ticket => \r\n `**${ticket.ticket_number}**: ${ticket.title}\\n` +\r\n `Status: ${ticket.status} | Priority: ${ticket.priority}\\n` +\r\n `${(ticket.projects as any)?.name ? `Project: ${(ticket.projects as any).name}\\n` : ''}` +\r\n `${(ticket.customers as any)?.name ? `Customer: ${(ticket.customers as any).name}\\n` : ''}` +\r\n `Created: ${new Date(ticket.created_at).toLocaleDateString()}\\n`\r\n ).join('\\n') || 'No tickets found.'}`\r\n }]\r\n };\r\n }\r\n \r\n case 'get-ticket-by-id': {\r\n const { id } = args as any;\r\n \r\n // Pre-fetch accessible IDs for RLS-compatible filtering\r\n const teamIds = await getAccessibleTeamIds(authContext.teamId);\r\n const projectIds = await getAccessibleProjectIds(authContext.userId, authContext.teamId);\r\n const customerIds = await getAccessibleCustomerIds(authContext.teamId);\r\n\r\n let accessFilter = `team_id.in.(${teamIds.join(',')})`;\r\n if (projectIds.length > 0) accessFilter += `,project_id.in.(${projectIds.join(',')})`;\r\n if (customerIds.length > 0) accessFilter += `,customer_id.in.(${customerIds.join(',')})`;\r\n\r\n const { data: ticketData, error } = await supabase\r\n .from('tickets')\r\n .select(`\r\n *,\r\n projects:project_id(id, name),\r\n customers:customer_id(id, name),\r\n assignee:assignee_id(id, full_name, email),\r\n requester:requester_id(id, full_name, email)\r\n `)\r\n .eq('id', id)\r\n .single();\r\n \r\n if (error) {\r\n if (error.code === 'PGRST116') {\r\n throw new Error(`Ticket not found: ${id}`);\r\n }\r\n throw new Error(error.message || JSON.stringify(error));\r\n }\r\n\r\n // Verify access\r\n let hasAccess = false;\r\n if (teamIds.includes(ticketData.team_id)) {\r\n hasAccess = true;\r\n }\r\n if (!hasAccess && ticketData.project_id && projectIds.includes(ticketData.project_id)) {\r\n hasAccess = true;\r\n }\r\n if (!hasAccess && ticketData.customer_id && customerIds.includes(ticketData.customer_id)) {\r\n hasAccess = true;\r\n }\r\n if (!hasAccess) {\r\n throw new Error('Access denied: You do not have permission to view this ticket');\r\n }\r\n \r\n const data = ticketData;\r\n \r\n if (error) {\r\n if (error.code === 'PGRST116') {\r\n throw new Error(`Ticket not found or no access: ${id}`);\r\n }\r\n throw new Error(error.message || JSON.stringify(error));\r\n }\r\n \r\n // Get ticket attachments (no team filter needed - already validated ticket access)\r\n const { data: attachments, error: attachmentsError } = await supabase\r\n .from('ticket_attachments')\r\n .select(`\r\n id,\r\n file_name,\r\n file_size,\r\n mime_type,\r\n storage_key,\r\n created_at,\r\n users:user_id(id, full_name)\r\n `)\r\n .eq('ticket_id', id)\r\n .order('created_at', { ascending: true });\r\n \r\n if (attachmentsError) {\r\n console.error('Error fetching attachments:', attachmentsError);\r\n }\r\n \r\n // Get ticket comments\r\n const { data: comments, error: commentsError } = await supabase\r\n .from('ticket_comments')\r\n .select(`\r\n id,\r\n content,\r\n created_at,\r\n users:user_id(id, full_name)\r\n `)\r\n .eq('ticket_id', id)\r\n .order('created_at', { ascending: true });\r\n \r\n if (commentsError) {\r\n console.error('Error fetching comments:', commentsError);\r\n }\r\n \r\n // Get comment attachments (no team filter needed - already validated ticket access)\r\n const commentIds = comments?.map(c => c.id) || [];\r\n let commentAttachments: any[] = [];\r\n \r\n if (commentIds.length > 0) {\r\n const { data: commAttachments, error: commAttachmentsError } = await supabase\r\n .from('ticket_comment_attachments')\r\n .select(`\r\n id,\r\n comment_id,\r\n file_name,\r\n file_size,\r\n mime_type,\r\n storage_key,\r\n created_at\r\n `)\r\n .in('comment_id', commentIds);\r\n \r\n if (commAttachmentsError) {\r\n console.error('Error fetching comment attachments:', commAttachmentsError);\r\n } else {\r\n commentAttachments = commAttachments || [];\r\n }\r\n }\r\n \r\n // Build content array starting with text\r\n const content: any[] = [{\r\n type: 'text',\r\n text: `**Ticket Details:**\\n\\n` +\r\n `**${data.ticket_number}**: ${data.title}\\n` +\r\n `Status: ${data.status}\\n` +\r\n `Priority: ${data.priority}\\n` +\r\n `Type: ${data.type}\\n` +\r\n `${data.description ? `Description: ${data.description}\\n` : ''}` +\r\n `${(data.projects as any)?.name ? `Project: ${(data.projects as any).name}\\n` : ''}` +\r\n `${(data.customers as any)?.name ? `Customer: ${(data.customers as any).name}\\n` : ''}` +\r\n `${data.assignee?.full_name ? `Assignee: ${data.assignee.full_name}\\n` : ''}` +\r\n `Requester: ${data.requester?.full_name || 'Unknown'}\\n` +\r\n `Created: ${new Date(data.created_at).toLocaleDateString()}\\n` +\r\n `${attachments && attachments.length > 0 ? `\\n📎 Attachments: ${attachments.length}\\n` : ''}` +\r\n `${comments && comments.length > 0 ? `💬 Comments: ${comments.length}\\n` : ''}`\r\n }];\r\n \r\n // Process ticket attachments - download images\r\n if (attachments && attachments.length > 0) {\r\n console.error(`📎 Processing ${attachments.length} ticket attachments...`);\r\n \r\n for (const attachment of attachments) {\r\n if (isImageFile(attachment.mime_type)) {\r\n console.error(`🖼️ Downloading image: ${attachment.file_name}`);\r\n const base64Data = await downloadImageAsBase64(attachment.storage_key);\r\n \r\n if (base64Data) {\r\n content.push({\r\n type: 'image',\r\n data: base64Data,\r\n mimeType: attachment.mime_type\r\n });\r\n \r\n // Add text context about the image\r\n content.push({\r\n type: 'text',\r\n text: `\\n📸 **Image from ticket**: ${attachment.file_name} (${Math.round(attachment.file_size / 1024)}KB, uploaded by ${(attachment.users as any)?.full_name || 'Unknown'} on ${new Date(attachment.created_at).toLocaleDateString()})\\n`\r\n });\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Process comment attachments - download images\r\n if (commentAttachments.length > 0) {\r\n console.error(`📎 Processing ${commentAttachments.length} comment attachments...`);\r\n \r\n for (const attachment of commentAttachments) {\r\n if (isImageFile(attachment.mime_type)) {\r\n console.error(`🖼️ Downloading comment image: ${attachment.file_name}`);\r\n const base64Data = await downloadImageAsBase64(attachment.storage_key);\r\n \r\n if (base64Data) {\r\n // Find the comment this attachment belongs to\r\n const comment = comments?.find(c => c.id === attachment.comment_id);\r\n \r\n content.push({\r\n type: 'image',\r\n data: base64Data,\r\n mimeType: attachment.mime_type\r\n });\r\n \r\n // Add text context about the image\r\n content.push({\r\n type: 'text',\r\n text: `\\n📸 **Image from comment** by ${(comment?.users as any)?.full_name || 'Unknown'} on ${new Date(attachment.created_at).toLocaleDateString()}: ${attachment.file_name} (${Math.round(attachment.file_size / 1024)}KB)\\n` +\r\n (comment?.content ? `Comment text: \"${comment.content.substring(0, 100)}${comment.content.length > 100 ? '...' : ''}\"\\n` : '')\r\n });\r\n }\r\n }\r\n }\r\n }\r\n \r\n console.error(`✅ Returning ticket with ${content.filter(c => c.type === 'image').length} images`);\r\n \r\n return { content };\r\n }\r\n \r\n case 'create-ticket': {\r\n const { title, description, status = 'open', priority = 'medium', type = 'task', projectId, customerId } = args as any;\r\n \r\n const year = new Date().getFullYear();\r\n let resolvedTeamId = authContext.teamId;\r\n let resolvedCustomerId = customerId;\r\n let projectAbbreviation = '';\r\n \r\n // If project is provided, use project's team and customer\r\n // This ensures tickets on shared projects go to the project owner's team\r\n if (projectId) {\r\n const { data: project } = await supabase\r\n .from('projects')\r\n .select('name, team_id, customer_id')\r\n .eq('id', projectId)\r\n .single();\r\n \r\n if (project) {\r\n // Use project's team for consistency with shared projects\r\n if (project.team_id) {\r\n resolvedTeamId = project.team_id;\r\n }\r\n // Use project's customer if not explicitly provided\r\n if (!resolvedCustomerId && project.customer_id) {\r\n resolvedCustomerId = project.customer_id;\r\n }\r\n // Generate project abbreviation for ticket number\r\n if (project.name) {\r\n const name = project.name.toUpperCase().replace(/[^A-Z0-9\\s]/g, '');\r\n const words = name.split(/\\s+/).filter(Boolean);\r\n if (words.length >= 2) {\r\n projectAbbreviation = words.slice(0, 2).map((w: string) => w.substring(0, 3)).join('').substring(0, 5);\r\n } else if (words.length === 1 && words[0]) {\r\n projectAbbreviation = words[0].substring(0, 5);\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Generate ticket number - use project-based numbering if available\r\n let ticketNumber: string;\r\n if (projectId && projectAbbreviation) {\r\n // Find highest ticket number for this project\r\n const pattern = `${year}-${projectAbbreviation}-%`;\r\n const { data: existingTickets } = await supabase\r\n .from('tickets')\r\n .select('ticket_number')\r\n .eq('project_id', projectId)\r\n .like('ticket_number', pattern)\r\n .order('ticket_number', { ascending: false })\r\n .limit(1);\r\n \r\n let nextSequence = 1;\r\n if (existingTickets && existingTickets.length > 0 && existingTickets[0]?.ticket_number) {\r\n const parts = existingTickets[0].ticket_number.split('-');\r\n if (parts.length === 3) {\r\n const lastSeq = parseInt(parts[2], 10);\r\n if (!isNaN(lastSeq)) nextSequence = lastSeq + 1;\r\n }\r\n }\r\n ticketNumber = `${year}-${projectAbbreviation}-${String(nextSequence).padStart(3, '0')}`;\r\n } else {\r\n // Simple numbering without project\r\n const { count } = await supabase\r\n .from('tickets')\r\n .select('*', { count: 'exact', head: true })\r\n .eq('team_id', resolvedTeamId);\r\n ticketNumber = `${year}-${String((count || 0) + 1).padStart(3, '0')}`;\r\n }\r\n \r\n const { data, error } = await supabase\r\n .from('tickets')\r\n .insert({\r\n team_id: resolvedTeamId,\r\n ticket_number: ticketNumber,\r\n title,\r\n description,\r\n status,\r\n priority,\r\n type,\r\n project_id: projectId || null,\r\n customer_id: resolvedCustomerId || null,\r\n requester_id: authContext.userId\r\n })\r\n .select()\r\n .single();\r\n \r\n if (error) throw error;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `✅ **Ticket Created Successfully!**\\n\\n` +\r\n `Ticket Number: **${ticketNumber}**\\n` +\r\n `Title: ${title}\\n` +\r\n `Status: ${status}\\n` +\r\n `Priority: ${priority}\\n` +\r\n `Type: ${type}\\n`\r\n }]\r\n };\r\n }\r\n \r\n case 'get-customers': {\r\n const { q, pageSize = 20 } = args as any;\r\n \r\n // Get all accessible customer IDs (includes shared customers)\r\n const customerIds = await getAccessibleCustomerIds(authContext.teamId);\r\n \r\n if (customerIds.length === 0) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: 'No customers found or no access to any customers.'\r\n }]\r\n };\r\n }\r\n \r\n let query = supabase\r\n .from('customers')\r\n .select('id, name, email, website, created_at')\r\n .in('id', customerIds)\r\n .limit(Math.min(pageSize, 100));\r\n \r\n if (q) query = query.or(`name.ilike.%${q}%,email.ilike.%${q}%`);\r\n \r\n const { data, error } = await query.order('name');\r\n \r\n if (error) throw error;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `Found ${data?.length || 0} customers:\\n\\n${data?.map(customer => \r\n `**${customer.name}**\\n` +\r\n `${customer.email ? `Email: ${customer.email}\\n` : ''}` +\r\n `${customer.website ? `Website: ${customer.website}\\n` : ''}` +\r\n `Created: ${new Date(customer.created_at).toLocaleDateString()}\\n`\r\n ).join('\\n') || 'No customers found.'}`\r\n }]\r\n };\r\n }\r\n \r\n case 'create-customer': {\r\n const { name, email, website } = args as any;\r\n \r\n const { data, error } = await supabase\r\n .from('customers')\r\n .insert({\r\n team_id: authContext.teamId,\r\n name,\r\n email: email || null,\r\n website: website || null,\r\n user_id: authContext.userId\r\n })\r\n .select()\r\n .single();\r\n \r\n if (error) throw error;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `✅ **Customer Created Successfully!**\\n\\n` +\r\n `Name: ${name}\\n` +\r\n `${email ? `Email: ${email}\\n` : ''}` +\r\n `${website ? `Website: ${website}\\n` : ''}`\r\n }]\r\n };\r\n }\r\n \r\n case 'get-projects': {\r\n const { customerId, q, pageSize = 20 } = args as any;\r\n \r\n // Get all accessible project IDs (includes shared customer projects)\r\n const projectIds = await getAccessibleProjectIds(authContext.userId, authContext.teamId);\r\n \r\n if (projectIds.length === 0) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: 'No projects found or no access to any projects.'\r\n }]\r\n };\r\n }\r\n \r\n let query = supabase\r\n .from('projects')\r\n .select(`\r\n id,\r\n name,\r\n description,\r\n customer_id,\r\n created_at\r\n `)\r\n .in('id', projectIds)\r\n .limit(Math.min(pageSize, 100));\r\n \r\n if (customerId) query = query.eq('customer_id', customerId);\r\n if (q) query = query.ilike('name', `%${q}%`);\r\n \r\n const { data, error } = await query.order('name');\r\n \r\n if (error) throw error;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `Found ${data?.length || 0} projects:\\n\\n${data?.map(project => \r\n `**${project.name}** (ID: ${project.id})\\n` +\r\n `${project.description ? `Description: ${project.description}\\n` : ''}` +\r\n `Created: ${new Date(project.created_at).toLocaleDateString()}\\n`\r\n ).join('\\n') || 'No projects found.'}`\r\n }]\r\n };\r\n }\r\n \r\n case 'create-project': {\r\n const { name, description, customerId, status = 'active' } = args as any;\r\n \r\n const { data, error } = await supabase\r\n .from('projects')\r\n .insert({\r\n team_id: authContext.teamId,\r\n name,\r\n description: description || null,\r\n customer_id: customerId || null,\r\n status,\r\n user_id: authContext.userId\r\n })\r\n .select()\r\n .single();\r\n \r\n if (error) throw error;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `✅ **Project Created Successfully!**\\n\\n` +\r\n `Name: ${name}\\n` +\r\n `Status: ${status}\\n` +\r\n `${description ? `Description: ${description}\\n` : ''}`\r\n }]\r\n };\r\n }\r\n \r\n // === AI SESSION TOOLS ===\r\n case 'start-ai-session-smart': {\r\n const { ticketId, ticketUrl, cursorSessionId, totalEstimatedMinutes, complexityScore } = args as any;\r\n \r\n // Validate totalEstimatedMinutes is provided\r\n if (!totalEstimatedMinutes) {\r\n throw new Error('totalEstimatedMinutes is required');\r\n }\r\n \r\n // Round to nearest 15 minutes\r\n const roundedMinutes = roundToNearest15Minutes(totalEstimatedMinutes);\r\n \r\n const sessionStartTime = new Date();\r\n \r\n // Create AI session\r\n const { data: sessionData, error } = await supabase\r\n .from('ai_sessions')\r\n .insert({\r\n ticket_id: ticketId,\r\n provider_user_id: authContext.userId,\r\n team_id: authContext.teamId,\r\n cursor_session_id: cursorSessionId || null,\r\n ai_time_estimate_minutes: roundedMinutes,\r\n complexity_score: complexityScore || null,\r\n status: 'in_progress'\r\n })\r\n .select('id, ticket_id, cursor_session_id, created_at')\r\n .single();\r\n \r\n if (error) throw error;\r\n \r\n // Generate a readable session ID for UI\r\n const sessionId = `ai-sess-${sessionData.id.substring(0, 8)}`;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `🚀 **AI Session Started!**\\n\\n` +\r\n `🆔 Session ID: **${sessionId}**\\n` +\r\n `🎫 Ticket: ${ticketId}\\n` +\r\n `⏱️ Estimated: ${roundedMinutes} min\\n` +\r\n `${complexityScore ? `🎯 Complexity: ${complexityScore}/10\\n` : ''}` +\r\n `📅 Started: ${sessionStartTime.toLocaleString()}\\n\\n` +\r\n `📝 Timetrack entry will be created when you complete the session.`\r\n }]\r\n };\r\n }\r\n \r\n case 'track-manual-follow-up': {\r\n const { aiSessionId, originalPrompt, aiResponse, developerFollowUp, followUpReason, outcome = 'success', estimatedMinutes, workDescription } = args as any;\r\n \r\n // Extract actual session UUID from readable ID\r\n const sessionUuid = aiSessionId.replace('ai-sess-', '');\r\n \r\n // Find the full session ID and current session data\r\n // Find the session - get all sessions for accessible teams and filter in JS\r\n const teamIds = await getAccessibleTeamIds(authContext.teamId);\r\n const { data: allSessions, error: sessionError } = await supabase\r\n .from('ai_sessions')\r\n .select('id, status, created_at, ai_time_estimate_minutes')\r\n .in('team_id', teamIds);\r\n \r\n if (sessionError) {\r\n throw new Error(`Database error: ${sessionError.message}`);\r\n }\r\n \r\n // Find session with matching prefix\r\n const session = allSessions?.find(s => s.id.toString().startsWith(sessionUuid));\r\n if (!session) {\r\n throw new Error(`Session not found: ${aiSessionId} (searched ${allSessions?.length || 0} sessions)`);\r\n }\r\n \r\n const followUpTime = new Date();\r\n \r\n // Store old estimate for reporting\r\n const oldEstimate = session.ai_time_estimate_minutes || 60;\r\n \r\n // Round follow-up estimate to nearest 15 minutes\r\n const roundedFollowUpMinutes = roundToNearest15Minutes(estimatedMinutes || 0);\r\n \r\n // Calculate new estimate: add rounded follow-up estimate to existing estimate\r\n const newEstimate = oldEstimate + roundedFollowUpMinutes;\r\n \r\n // RESTART SESSION & UPDATE ESTIMATE: Set status back to in_progress and adjust time estimate\r\n await supabase\r\n .from('ai_sessions')\r\n .update({\r\n status: 'in_progress', // Restart active tracking\r\n ai_time_estimate_minutes: newEstimate, // Increase estimate based on follow-up work\r\n // Don't update completed_at - session continues\r\n })\r\n .eq('id', session.id);\r\n \r\n // LOG FOLLOW-UP: Track the manual follow-up interaction\r\n const { data, error } = await supabase\r\n .from('manual_follow_ups')\r\n .insert({\r\n ai_session_id: session.id,\r\n developer_id: authContext.userId,\r\n team_id: authContext.teamId,\r\n original_prompt: originalPrompt,\r\n ai_response: aiResponse,\r\n follow_up_prompt: developerFollowUp,\r\n follow_up_reason: followUpReason,\r\n outcome: outcome,\r\n time_spent_minutes: null, // Calculated automatically from session timestamps\r\n resolved_at: outcome === 'success' ? new Date().toISOString() : null\r\n })\r\n .select()\r\n .single();\r\n \r\n if (error) throw error;\r\n \r\n // RESTART TIME TRACKING: Log follow-up activity start (duration calculated at completion)\r\n await supabase\r\n .from('ai_time_logs')\r\n .insert({\r\n ai_session_id: session.id,\r\n activity_type: 'debugging', // Follow-ups are typically debugging/fixing\r\n description: `Follow-up: ${followUpReason.replace('_', ' ')} - ${outcome}`,\r\n duration_seconds: 0, // Duration calculated automatically from timestamps\r\n productivity_score: outcome === 'success' ? 9 : outcome === 'partial_success' ? 6 : 4,\r\n started_at: followUpTime.toISOString()\r\n });\r\n \r\n // CALCULATE CURRENT EFFICIENCY: Compare time spent vs NEW estimated time\r\n const sessionStartTime = new Date(session.created_at);\r\n const totalMinutesElapsed = Math.round((followUpTime.getTime() - sessionStartTime.getTime()) / 60000);\r\n const currentEfficiency = totalMinutesElapsed > 0 ? (totalMinutesElapsed / newEstimate) : 1;\r\n \r\n // UPDATE EFFICIENCY TRACKING: Update running efficiency score with adjusted estimate\r\n await supabase\r\n .from('ai_sessions')\r\n .update({\r\n efficiency_score: currentEfficiency.toFixed(2),\r\n actual_time_minutes: totalMinutesElapsed\r\n })\r\n .eq('id', session.id);\r\n \r\n // CHECK FOR EXISTING AGENDA ENTRIES: Get ALL draft tracker entries for this session\r\n // Using order + limit instead of .single() to handle multiple entries gracefully\r\n const { data: existingEntries, error: entryError } = await supabase\r\n .from('agenda_events')\r\n .select('id, tracked_duration, title, description, start_time')\r\n .eq('ai_session_id', session.id)\r\n .eq('status', 'draft')\r\n .order('created_at', { ascending: false }); // Get newest first\r\n \r\n let trackerAction = '';\r\n let trackerDetails = '';\r\n \r\n // Take the most recent entry if multiple exist\r\n const existingEntry = existingEntries && existingEntries.length > 0 ? existingEntries[0] : null;\r\n \r\n // CLEANUP: If there are duplicate entries, consolidate them into one\r\n if (existingEntries && existingEntries.length > 1) {\r\n // Calculate total duration from all duplicate entries\r\n const totalExistingDuration = existingEntries.reduce((sum, entry) => sum + (entry.tracked_duration || 0), 0);\r\n \r\n // Delete all but the first (newest) entry\r\n const duplicateIds = existingEntries.slice(1).map(e => e.id);\r\n await supabase\r\n .from('agenda_events')\r\n .delete()\r\n .in('id', duplicateIds);\r\n \r\n // Update the remaining entry with consolidated duration (if there was tracked time in deleted entries)\r\n if (totalExistingDuration > (existingEntry?.tracked_duration || 0)) {\r\n await supabase\r\n .from('agenda_events')\r\n .update({ tracked_duration: totalExistingDuration })\r\n .eq('id', existingEntry!.id);\r\n existingEntry!.tracked_duration = totalExistingDuration;\r\n }\r\n \r\n trackerAction = `Consolidated ${existingEntries.length} duplicate entries`;\r\n }\r\n \r\n if (existingEntry) {\r\n // UPDATE EXISTING TRACKER: Add follow-up time to existing entry\r\n const newDuration = (existingEntry.tracked_duration || 0) + (roundedFollowUpMinutes * 60);\r\n \r\n await supabase\r\n .from('agenda_events')\r\n .update({\r\n tracked_duration: newDuration,\r\n end_time: followUpTime.toISOString(),\r\n title: workDescription,\r\n description: workDescription\r\n })\r\n .eq('id', existingEntry.id);\r\n \r\n trackerAction = trackerAction || 'Updated existing tracker';\r\n trackerDetails = ` • Total tracked time: ${Math.round(newDuration / 60)} minutes (+${roundedFollowUpMinutes} min)\\n` +\r\n ` • Description: ${workDescription}\\n`;\r\n } else {\r\n // CREATE NEW TRACKER: First follow-up or no tracker exists yet\r\n const durationSeconds = roundedFollowUpMinutes * 60;\r\n const startTime = new Date(followUpTime.getTime() - durationSeconds * 1000);\r\n \r\n await supabase\r\n .from('agenda_events')\r\n .insert({\r\n team_id: authContext.teamId,\r\n user_id: authContext.userId,\r\n ai_session_id: session.id,\r\n title: workDescription,\r\n description: workDescription,\r\n start_time: startTime.toISOString(),\r\n end_time: followUpTime.toISOString(),\r\n type: 'work',\r\n status: 'draft',\r\n all_day: false,\r\n is_tracked: true,\r\n tracked_duration: durationSeconds\r\n });\r\n \r\n trackerAction = 'Created new tracker';\r\n trackerDetails = ` • Tracked time: ${roundedFollowUpMinutes} minutes\\n` +\r\n ` • Description: ${workDescription}\\n`;\r\n }\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `🔄 **Follow-up Tracked & Session Restarted!**\\n\\n` +\r\n `🆔 Session: ${aiSessionId} (back to active)\\n` +\r\n `🔍 Reason: ${followUpReason.replace('_', ' ')}\\n` +\r\n `✅ Outcome: ${outcome}\\n` +\r\n `\\n📊 **Time Estimate Updated:**\\n` +\r\n ` • Old estimate: ${oldEstimate} minutes\\n` +\r\n ` • Follow-up estimate: +${roundedFollowUpMinutes} minutes (rounded to 15min)\\n` +\r\n ` • New estimate: ${newEstimate} minutes\\n` +\r\n `\\n📈 **Current Progress:**\\n` +\r\n ` • Total time elapsed: ${totalMinutesElapsed} minutes\\n` +\r\n ` • Efficiency: ${currentEfficiency < 1 ? '🚀 ' : currentEfficiency > 1.5 ? '⚠️ ' : '⏱️ '}${(currentEfficiency * 100).toFixed(0)}%\\n` +\r\n `\\n⏱️ **Tracker Entry: ${trackerAction}**\\n` +\r\n trackerDetails +\r\n `\\n⚡ **Time tracking resumed** - continue with confidence!`\r\n }]\r\n };\r\n }\r\n \r\n case 'get-session-context': {\r\n const { aiSessionId, includeTicketData = true, includeTodoProgress = true, includeFollowUpHistory = false } = args as any;\r\n \r\n // Extract actual session UUID from readable ID\r\n const sessionUuid = aiSessionId.replace('ai-sess-', '');\r\n \r\n // Get session data with related info - find by JavaScript filtering\r\n const teamIds = await getAccessibleTeamIds(authContext.teamId);\r\n const { data: allSessions, error: sessionError } = await supabase\r\n .from('ai_sessions')\r\n .select(`\r\n id,\r\n ticket_id,\r\n status,\r\n ai_time_estimate_minutes,\r\n actual_time_minutes,\r\n complexity_score,\r\n created_at,\r\n cursor_session_id\r\n `)\r\n .in('team_id', teamIds);\r\n \r\n if (sessionError) {\r\n throw new Error(`Database error: ${sessionError.message}`);\r\n }\r\n \r\n // Find session with matching prefix\r\n const session = allSessions?.find(s => s.id.toString().startsWith(sessionUuid));\r\n \r\n if (sessionError || !session) {\r\n throw new Error(`Session not found: ${aiSessionId}`);\r\n }\r\n \r\n let context: any = {\r\n sessionId: aiSessionId,\r\n status: session.status,\r\n timeEstimate: session.ai_time_estimate_minutes,\r\n actualTime: session.actual_time_minutes,\r\n complexity: session.complexity_score,\r\n createdAt: session.created_at\r\n };\r\n \r\n // Include ticket data if requested\r\n if (includeTicketData) {\r\n const { data: ticket } = await supabase\r\n .from('tickets')\r\n .select('id, ticket_number, title, description, status, priority, type')\r\n .eq('id', session.ticket_id)\r\n .single();\r\n \r\n context.ticketData = ticket;\r\n }\r\n \r\n // Include todo progress if requested\r\n if (includeTodoProgress) {\r\n const { data: todos } = await supabase\r\n .from('ai_todos')\r\n .select('id, content, status, estimated_minutes, actual_minutes')\r\n .eq('ai_session_id', session.id)\r\n .order('sequence_order');\r\n \r\n context.todos = todos || [];\r\n context.todoProgress = {\r\n total: todos?.length || 0,\r\n completed: todos?.filter(t => t.status === 'completed').length || 0,\r\n inProgress: todos?.filter(t => t.status === 'in_progress').length || 0\r\n };\r\n }\r\n \r\n // Include follow-up history if requested\r\n if (includeFollowUpHistory) {\r\n const { data: followUps } = await supabase\r\n .from('manual_follow_ups')\r\n .select('follow_up_reason, outcome, time_spent_minutes, created_at')\r\n .eq('ai_session_id', session.id)\r\n .order('created_at');\r\n \r\n context.followUpHistory = followUps || [];\r\n }\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `🎯 **Session Context Retrieved**\\n\\n` +\r\n `Session: ${aiSessionId}\\n` +\r\n `Status: ${session.status}\\n` +\r\n `${context.ticketData ? `Ticket: ${context.ticketData.ticket_number} - ${context.ticketData.title}\\n` : ''}` +\r\n `${context.todoProgress ? `Todo Progress: ${context.todoProgress.completed}/${context.todoProgress.total} completed\\n` : ''}` +\r\n `${context.followUpHistory ? `Follow-ups: ${context.followUpHistory.length}\\n` : ''}` +\r\n `\\n📋 Full context preserved for seamless continuation!`\r\n }]\r\n };\r\n }\r\n \r\n case 'sync-session-todos': {\r\n const { aiSessionId, todos, replaceAll = true } = args as any;\r\n \r\n // Extract actual session UUID from readable ID\r\n const sessionUuid = aiSessionId.replace('ai-sess-', '');\r\n \r\n // Find the session - get all sessions for accessible teams and filter in JS\r\n const teamIds = await getAccessibleTeamIds(authContext.teamId);\r\n const { data: allSessions, error: sessionError } = await supabase\r\n .from('ai_sessions')\r\n .select('id')\r\n .in('team_id', teamIds);\r\n \r\n if (sessionError) {\r\n throw new Error(`Database error: ${sessionError.message}`);\r\n }\r\n \r\n // Find session with matching prefix\r\n const session = allSessions?.find(s => s.id.toString().startsWith(sessionUuid));\r\n if (!session) {\r\n throw new Error(`Session not found: ${aiSessionId} (searched ${allSessions?.length || 0} sessions)`);\r\n }\r\n \r\n // If replacing all, clear existing todos first\r\n if (replaceAll) {\r\n await supabase\r\n .from('ai_todos')\r\n .delete()\r\n .eq('ai_session_id', session.id);\r\n }\r\n \r\n if (todos && todos.length > 0) {\r\n // Get current max sequence order if adding to existing\r\n let startSequence = 0;\r\n if (!replaceAll) {\r\n const { data: maxTodo } = await supabase\r\n .from('ai_todos')\r\n .select('sequence_order')\r\n .eq('ai_session_id', session.id)\r\n .order('sequence_order', { ascending: false })\r\n .limit(1)\r\n .single();\r\n startSequence = (maxTodo?.sequence_order || 0) + 1;\r\n }\r\n \r\n const todoInserts = todos.map((todo: any, index: number) => ({\r\n ai_session_id: session.id,\r\n content: todo.content,\r\n status: todo.status,\r\n cursor_todo_id: todo.todoId || null,\r\n estimated_minutes: todo.estimatedMinutes || null,\r\n sequence_order: startSequence + index\r\n }));\r\n \r\n const { error: insertError } = await supabase\r\n .from('ai_todos')\r\n .insert(todoInserts);\r\n \r\n if (insertError) throw insertError;\r\n }\r\n \r\n // AUTOMATIC PHASE TRANSITION\r\n let phaseTransition: string | null = null;\r\n \r\n // Get all current todos for this session\r\n const { data: currentTodos } = await supabase\r\n .from('ai_todos')\r\n .select('status')\r\n .eq('ai_session_id', session.id);\r\n \r\n if (currentTodos && currentTodos.length > 0) {\r\n const hasInProgress = currentTodos.some(t => t.status === 'in_progress');\r\n const allCompleted = currentTodos.every(t => t.status === 'completed');\r\n \r\n // Get current phase status\r\n const { data: currentPhase } = await supabase\r\n .from('ai_time_logs')\r\n .select('activity_type, status')\r\n .eq('ai_session_id', session.id)\r\n .eq('status', 'in_progress')\r\n .single();\r\n \r\n // Analysis → Next Phase: When first todo moves to in_progress (work starts)\r\n if (hasInProgress && currentPhase?.activity_type === 'analysis') {\r\n await transitionToNextPhase(session.id, 'analysis');\r\n phaseTransition = 'Analysis completed → Next phase started (Investigation/Development)';\r\n }\r\n \r\n // Investigation → Development: When todos progress during investigation phase\r\n // This typically happens after initial analysis, when actual coding begins\r\n if (hasInProgress && currentPhase?.activity_type === 'bug_investigation') {\r\n // Check if any development-related work has started (indicated by todo progress)\r\n const completedCount = currentTodos.filter(t => t.status === 'completed').length;\r\n if (completedCount > 0) {\r\n // Some work completed, likely moving from investigation to actual fixing\r\n await transitionToNextPhase(session.id, 'bug_investigation');\r\n phaseTransition = 'Investigation completed → Development phase started';\r\n }\r\n }\r\n \r\n // Development → Communication: When all todos are completed (implementation done)\r\n if (allCompleted && currentPhase?.activity_type === 'development') {\r\n await transitionToNextPhase(session.id, 'development');\r\n phaseTransition = 'Development completed → Communication phase started';\r\n }\r\n }\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `✅ **Todos ${replaceAll ? 'Synced' : 'Added'} Successfully!**\\n\\n` +\r\n `Session: ${aiSessionId}\\n` +\r\n `${replaceAll ? 'Synced' : 'Added'} ${todos?.length || 0} todos\\n` +\r\n `${replaceAll ? '' : '➕ Added to existing todo list\\n'}` +\r\n `${phaseTransition ? `🔄 Phase Transition: ${phaseTransition}\\n` : ''}` +\r\n `\\n📝 Todo list updated and tracked for progress monitoring!`\r\n }]\r\n };\r\n }\r\n \r\n case 'add-follow-up-todos': {\r\n const { aiSessionId, newTodos, followUpReason } = args as any;\r\n \r\n // Extract actual session UUID from readable ID\r\n const sessionUuid = aiSessionId.replace('ai-sess-', '');\r\n \r\n // Find the session - get all sessions for accessible teams and filter in JS\r\n const teamIds = await getAccessibleTeamIds(authContext.teamId);\r\n const { data: allSessions, error: sessionError } = await supabase\r\n .from('ai_sessions')\r\n .select('id')\r\n .in('team_id', teamIds);\r\n \r\n if (sessionError) {\r\n throw new Error(`Database error: ${sessionError.message}`);\r\n }\r\n \r\n // Find session with matching prefix\r\n const session = allSessions?.find(s => s.id.toString().startsWith(sessionUuid));\r\n if (!session) {\r\n throw new Error(`Session not found: ${aiSessionId} (searched ${allSessions?.length || 0} sessions)`);\r\n }\r\n \r\n if (newTodos && newTodos.length > 0) {\r\n // Get current max sequence order\r\n const { data: maxTodo } = await supabase\r\n .from('ai_todos')\r\n .select('sequence_order')\r\n .eq('ai_session_id', session.id)\r\n .order('sequence_order', { ascending: false })\r\n .limit(1)\r\n .single();\r\n const startSequence = (maxTodo?.sequence_order || 0) + 1;\r\n \r\n const todoInserts = newTodos.map((todo: any, index: number) => ({\r\n ai_session_id: session.id,\r\n content: `[Follow-up] ${todo.content}`,\r\n status: todo.status || 'pending',\r\n estimated_minutes: todo.estimatedMinutes || null,\r\n sequence_order: startSequence + index\r\n }));\r\n \r\n const { error: insertError } = await supabase\r\n .from('ai_todos')\r\n .insert(todoInserts);\r\n \r\n if (insertError) throw insertError;\r\n }\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `✅ **Follow-up Todos Added Successfully!**\\n\\n` +\r\n `Session: ${aiSessionId}\\n` +\r\n `Added ${newTodos?.length || 0} new todos from follow-up\\n` +\r\n `${followUpReason ? `Reason: ${followUpReason}\\n` : ''}` +\r\n `\\n📝 New tasks identified and added to existing workflow!`\r\n }]\r\n };\r\n }\r\n \r\n case 'update-session-status': {\r\n const { aiSessionId, status, actualTimeMinutes, completionNotes } = args as any;\r\n \r\n // Extract actual session UUID from readable ID\r\n const sessionUuid = aiSessionId.replace('ai-sess-', '');\r\n \r\n // Find and update the session\r\n // First find the session\r\n const teamIds = await getAccessibleTeamIds(authContext.teamId);\r\n const { data: allSessions, error: findError } = await supabase\r\n .from('ai_sessions')\r\n .select('id')\r\n .in('team_id', teamIds);\r\n \r\n if (findError) {\r\n throw new Error(`Database error: ${findError.message}`);\r\n }\r\n \r\n const foundSession = allSessions?.find(s => s.id.toString().startsWith(sessionUuid));\r\n if (!foundSession) {\r\n throw new Error(`Session not found: ${aiSessionId} (searched ${allSessions?.length || 0} sessions)`);\r\n }\r\n \r\n // Now update the found session\r\n const { data, error } = await supabase\r\n .from('ai_sessions')\r\n .update({\r\n status: status,\r\n actual_time_minutes: actualTimeMinutes || null,\r\n completed_at: status === 'completed' ? new Date().toISOString() : null\r\n })\r\n .eq('id', foundSession.id)\r\n .select()\r\n .single();\r\n \r\n if (error) throw error;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `🎯 **Session Status Updated!**\\n\\n` +\r\n `Session: ${aiSessionId}\\n` +\r\n `Status: ${status}\\n` +\r\n `${actualTimeMinutes ? `Actual Time: ${actualTimeMinutes} minutes\\n` : ''}` +\r\n `${status === 'completed' ? `✅ Session completed successfully!\\n` : ''}` +\r\n `${completionNotes ? `Notes: ${completionNotes}\\n` : ''}`\r\n }]\r\n };\r\n }\r\n \r\n case 'get-completion-context': {\r\n const { aiSessionId, includeFollowUps = true, includeTimeMetrics = true, includeTodos = true } = args as any;\r\n \r\n // Extract actual session UUID from readable ID\r\n const sessionUuid = aiSessionId.replace('ai-sess-', '');\r\n \r\n // Get session data with ticket info\r\n // Get comprehensive session context - find by JavaScript filtering\r\n const teamIds = await getAccessibleTeamIds(authContext.teamId);\r\n const { data: allSessions, error: sessionError } = await supabase\r\n .from('ai_sessions')\r\n .select(`\r\n id,\r\n ticket_id,\r\n ai_time_estimate_minutes,\r\n actual_time_minutes,\r\n efficiency_score,\r\n created_at,\r\n completed_at,\r\n status,\r\n complexity_score\r\n `)\r\n .in('team_id', teamIds);\r\n \r\n if (sessionError) {\r\n throw new Error(`Database error: ${sessionError.message}`);\r\n }\r\n \r\n // Find session with matching prefix\r\n const session = allSessions?.find(s => s.id.toString().startsWith(sessionUuid));\r\n if (!session) {\r\n throw new Error(`Session not found: ${aiSessionId} (searched ${allSessions?.length || 0} sessions)`);\r\n }\r\n \r\n // Get ticket data\r\n const { data: ticket, error: ticketError } = await supabase\r\n .from('tickets')\r\n .select('ticket_number, title, description, type, priority')\r\n .eq('id', session.ticket_id)\r\n .single();\r\n \r\n if (ticketError || !ticket) {\r\n throw new Error('Ticket not found for session');\r\n }\r\n \r\n let contextData: any = {\r\n session: {\r\n id: aiSessionId,\r\n status: session.status,\r\n complexity: session.complexity_score,\r\n createdAt: session.created_at,\r\n completedAt: session.completed_at\r\n },\r\n ticket: {\r\n number: ticket.ticket_number,\r\n title: ticket.title,\r\n description: ticket.description,\r\n type: ticket.type,\r\n priority: ticket.priority\r\n }\r\n };\r\n \r\n // Add time metrics if requested\r\n if (includeTimeMetrics) {\r\n const timeSaved = session.ai_time_estimate_minutes && session.actual_time_minutes \r\n ? Math.max(0, session.ai_time_estimate_minutes - session.actual_time_minutes)\r\n : null;\r\n \r\n contextData.timeMetrics = {\r\n estimatedMinutes: session.ai_time_estimate_minutes,\r\n actualMinutes: session.actual_time_minutes,\r\n timeSaved: timeSaved,\r\n efficiency: session.efficiency_score,\r\n sessionDuration: session.completed_at && session.created_at \r\n ? Math.round((new Date(session.completed_at).getTime() - new Date(session.created_at).getTime()) / 60000)\r\n : null\r\n };\r\n }\r\n \r\n // Add todos if requested\r\n if (includeTodos) {\r\n const { data: todos } = await supabase\r\n .from('ai_todos')\r\n .select('content, status, estimated_minutes, actual_minutes, completed_at')\r\n .eq('ai_session_id', session.id)\r\n .order('created_at', { ascending: true });\r\n \r\n contextData.todos = todos || [];\r\n }\r\n \r\n // Add follow-ups if requested\r\n if (includeFollowUps) {\r\n const { data: followUps } = await supabase\r\n .from('manual_follow_ups')\r\n .select('follow_up_reason, outcome, time_spent_minutes, created_at')\r\n .eq('ai_session_id', session.id)\r\n .order('created_at', { ascending: true });\r\n \r\n contextData.followUps = followUps || [];\r\n }\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `📋 **Completion Context Retrieved!**\\n\\n` +\r\n `🎫 **Ticket:** ${ticket.ticket_number} - ${ticket.title}\\n` +\r\n `🆔 **Session:** ${aiSessionId} (${session.status})\\n` +\r\n `⏱️ **Time:** ${session.actual_time_minutes || 'N/A'}/${session.ai_time_estimate_minutes || 'N/A'} minutes\\n` +\r\n `📋 **Todos:** ${contextData.todos?.filter((t: any) => t.status === 'completed').length || 0}/${contextData.todos?.length || 0} completed\\n` +\r\n `🔄 **Follow-ups:** ${contextData.followUps?.length || 0}\\n\\n` +\r\n `✅ **Full context ready for Cursor AI to generate customer response!**\\n\\n` +\r\n `**Context Data:**\\n\\`\\`\\`json\\n${JSON.stringify(contextData, null, 2)}\\`\\`\\``\r\n }]\r\n };\r\n }\r\n \r\n case 'save-customer-response': {\r\n const { aiSessionId, customerResponse, responseType = 'completion' } = args as any;\r\n \r\n // Extract actual session UUID from readable ID\r\n const sessionUuid = aiSessionId.replace('ai-sess-', '');\r\n \r\n // Get session to validate it exists - find by JavaScript filtering\r\n const teamIds = await getAccessibleTeamIds(authContext.teamId);\r\n const { data: allSessions, error: sessionError } = await supabase\r\n .from('ai_sessions')\r\n .select('id')\r\n .in('team_id', teamIds);\r\n \r\n if (sessionError) {\r\n throw new Error(`Database error: ${sessionError.message}`);\r\n }\r\n \r\n // Find session with matching prefix\r\n const session = allSessions?.find(s => s.id.toString().startsWith(sessionUuid));\r\n if (!session) {\r\n throw new Error(`Session not found: ${aiSessionId} (searched ${allSessions?.length || 0} sessions)`);\r\n }\r\n \r\n // Save the response in database\r\n const { data: responseData, error: responseError } = await supabase\r\n .from('ai_responses')\r\n .insert({\r\n ai_session_id: session.id,\r\n response_type: responseType,\r\n content: customerResponse,\r\n is_ready_for_customer: true,\r\n provider_approved: false // Needs manual approval\r\n })\r\n .select()\r\n .single();\r\n \r\n if (responseError) throw responseError;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `💾 **Customer Response Saved!**\\n\\n` +\r\n `🆔 Session: ${aiSessionId}\\n` +\r\n `📝 Response Type: ${responseType}\\n` +\r\n `📄 Length: ${customerResponse.length} characters\\n\\n` +\r\n `✅ **Response ready for provider approval**\\n` +\r\n `🔍 Provider can review in AI tab before sending to customer\\n\\n` +\r\n `**Preview:**\\n\\`\\`\\`\\n${customerResponse.substring(0, 200)}${customerResponse.length > 200 ? '...' : ''}\\`\\`\\``\r\n }]\r\n };\r\n }\r\n \r\n case 'complete-ai-session': {\r\n const { aiSessionId, workCompleted, technicalSummary, invoiceDescription, efficiencyNotes } = args as any;\r\n \r\n // Extract actual session UUID from readable ID\r\n const sessionUuid = aiSessionId.replace('ai-sess-', '');\r\n \r\n // Get session to calculate actual time spent - find by JavaScript filtering\r\n const teamIds = await getAccessibleTeamIds(authContext.teamId);\r\n const { data: allSessions, error: getSessionError } = await supabase\r\n .from('ai_sessions')\r\n .select('id, ticket_id, ai_time_estimate_minutes, created_at')\r\n .in('team_id', teamIds);\r\n \r\n if (getSessionError) {\r\n throw new Error(`Database error: ${getSessionError.message}`);\r\n }\r\n \r\n // Find session with matching prefix\r\n const existingSession = allSessions?.find(s => s.id.toString().startsWith(sessionUuid));\r\n if (!existingSession) {\r\n throw new Error(`Session not found: ${aiSessionId} (searched ${allSessions?.length || 0} sessions)`);\r\n }\r\n\r\n // Calculate actual time spent automatically\r\n const completionTime = new Date();\r\n const sessionStartTime = new Date(existingSession.created_at);\r\n const timeSpentMinutes = Math.round((completionTime.getTime() - sessionStartTime.getTime()) / 60000);\r\n \r\n // Update session to completed with calculated time\r\n const { data: session, error: sessionError } = await supabase\r\n .from('ai_sessions')\r\n .update({\r\n status: 'completed',\r\n actual_time_minutes: timeSpentMinutes,\r\n completed_at: completionTime.toISOString(),\r\n efficiency_score: null // Will be calculated\r\n })\r\n .eq('id', existingSession.id)\r\n .select('id, ticket_id, ai_time_estimate_minutes, created_at')\r\n .single();\r\n \r\n if (sessionError || !session) {\r\n throw new Error(`Failed to update session: ${aiSessionId}`);\r\n }\r\n \r\n // Calculate efficiency score\r\n const efficiencyScore = session.ai_time_estimate_minutes \r\n ? (timeSpentMinutes / session.ai_time_estimate_minutes)\r\n : 1.0;\r\n \r\n // Update efficiency score\r\n await supabase\r\n .from('ai_sessions')\r\n .update({ efficiency_score: efficiencyScore.toFixed(2) })\r\n .eq('id', session.id);\r\n \r\n // CLOSE ALL REMAINING ACTIVE PHASES\r\n const { data: activePhases } = await supabase\r\n .from('ai_time_logs')\r\n .select('*')\r\n .eq('ai_session_id', existingSession.id)\r\n .eq('status', 'in_progress');\r\n\r\n for (const phase of activePhases || []) {\r\n const duration = Math.round(\r\n (completionTime.getTime() - new Date(phase.started_at).getTime()) / 1000\r\n );\r\n \r\n await supabase\r\n .from('ai_time_logs')\r\n .update({\r\n ended_at: completionTime.toISOString(),\r\n duration_seconds: duration,\r\n status: 'completed'\r\n })\r\n .eq('id', phase.id);\r\n }\r\n\r\n // Mark skipped phases (pending with 0 estimated time)\r\n await supabase\r\n .from('ai_time_logs')\r\n .update({ status: 'skipped' })\r\n .eq('ai_session_id', existingSession.id)\r\n .eq('status', 'pending')\r\n .eq('estimated_duration_seconds', 0);\r\n \r\n // Get session duration\r\n const sessionDuration = Math.round(\r\n (completionTime.getTime() - new Date(session.created_at).getTime()) / 60000\r\n );\r\n \r\n // Create work summary\r\n const workSummary = `Completed ${workCompleted.length} tasks including: ${workCompleted.slice(0, 3).join(', ')}${workCompleted.length > 3 ? ' and more' : ''}.`;\r\n \r\n // Get ticket details for agenda event creation\r\n const { data: ticketInfo } = await supabase\r\n .from('tickets')\r\n .select('ticket_number, title, project_id')\r\n .eq('id', session.ticket_id)\r\n .single();\r\n \r\n // CREATE AGENDA EVENT: Now that work is complete, create the timetrack entry\r\n // Use invoice description if provided, otherwise create a technical one\r\n let completionDescription: string;\r\n \r\n if (invoiceDescription) {\r\n // Use the invoice-friendly description provided by Cursor (in ticket language)\r\n completionDescription = `${ticketInfo?.ticket_number || 'Ticket'}: ${invoiceDescription}`;\r\n } else {\r\n // Fallback: Create a technical work description\r\n const workDescription = workCompleted.map((task: string, index: number) => `${index + 1}. ${task}`).join('\\n');\r\n completionDescription = `${ticketInfo?.ticket_number || 'Ticket'}: ${technicalSummary || workSummary}\\n\\nCompleted work:\\n${workDescription}`;\r\n }\r\n \r\n // Create or update agenda event with AI estimated time\r\n // Use the original AI estimate for billing, not the actual AI completion time\r\n const estimatedMinutes = session.ai_time_estimate_minutes || timeSpentMinutes;\r\n const sessionStart = new Date(session.created_at);\r\n const estimatedEnd = new Date(sessionStart.getTime() + estimatedMinutes * 60000);\r\n \r\n // CHECK FOR EXISTING AGENDA ENTRIES: Might exist from follow-up tracking\r\n // Using order + limit instead of .single() to handle multiple entries gracefully\r\n const { data: existingAgendaEntries } = await supabase\r\n .from('agenda_events')\r\n .select('id, tracked_duration')\r\n .eq('ai_session_id', session.id)\r\n .eq('status', 'draft')\r\n .order('created_at', { ascending: false }); // Get newest first\r\n \r\n let agendaEvent: { id: string } | null = null;\r\n let agendaError: Error | null = null;\r\n let wasUpdated = false;\r\n let consolidatedCount = 0;\r\n \r\n // Take the most recent entry if multiple exist\r\n const existingAgendaEntry = existingAgendaEntries && existingAgendaEntries.length > 0 ? existingAgendaEntries[0] : null;\r\n \r\n // CLEANUP: If there are duplicate entries, delete all but the first (newest)\r\n if (existingAgendaEntries && existingAgendaEntries.length > 1) {\r\n const duplicateIds = existingAgendaEntries.slice(1).map(e => e.id);\r\n await supabase\r\n .from('agenda_events')\r\n .delete()\r\n .in('id', duplicateIds);\r\n consolidatedCount = existingAgendaEntries.length - 1;\r\n }\r\n \r\n if (existingAgendaEntry) {\r\n // UPDATE EXISTING: Merge follow-up entry with completion data\r\n const { data: updated, error: updateError } = await supabase\r\n .from('agenda_events')\r\n .update({\r\n title: ticketInfo?.title || 'Development Work',\r\n description: completionDescription,\r\n end_time: estimatedEnd.toISOString(),\r\n project_id: ticketInfo?.project_id || null,\r\n ticket_id: session.ticket_id,\r\n tracked_duration: estimatedMinutes * 60 // Use AI estimate in seconds for billing\r\n })\r\n .eq('id', existingAgendaEntry.id)\r\n .select('id')\r\n .single();\r\n \r\n agendaEvent = updated;\r\n agendaError = updateError as Error | null;\r\n wasUpdated = true;\r\n } else {\r\n // CREATE NEW: No existing entry from follow-ups\r\n const { data: created, error: createError } = await supabase\r\n .from('agenda_events')\r\n .insert({\r\n team_id: authContext.teamId,\r\n user_id: authContext.userId,\r\n title: ticketInfo?.title || 'Development Work',\r\n description: completionDescription,\r\n start_time: sessionStart.toISOString(),\r\n end_time: estimatedEnd.toISOString(),\r\n project_id: ticketInfo?.project_id || null,\r\n ticket_id: session.ticket_id,\r\n ai_session_id: session.id, // Use the actual UUID, not the readable ID\r\n type: 'work',\r\n status: 'draft', // Mark as draft for manual approval\r\n all_day: false,\r\n is_tracked: true,\r\n tracked_duration: estimatedMinutes * 60 // Use AI estimate in seconds for billing\r\n })\r\n .select('id')\r\n .single();\r\n \r\n agendaEvent = created;\r\n agendaError = createError as Error | null;\r\n }\r\n \r\n if (agendaError) {\r\n console.error(`⚠️ Failed to ${wasUpdated ? 'update' : 'create'} agenda event:`, agendaError);\r\n // Don't fail the completion if agenda event creation fails\r\n }\r\n \r\n if (consolidatedCount > 0) {\r\n console.log(`🧹 Cleaned up ${consolidatedCount} duplicate agenda entries for session ${aiSessionId}`);\r\n }\r\n \r\n let responseText = `🎉 **AI Session Completed Successfully!**\\n\\n`;\r\n responseText += `🆔 Session: ${aiSessionId}\\n`;\r\n responseText += `📊 **Performance Summary:**\\n`;\r\n responseText += ` • Tasks Completed: ${workCompleted.length}\\n`;\r\n responseText += ` • Time Spent: ${timeSpentMinutes} minutes\\n`;\r\n responseText += ` • Estimated Time: ${session.ai_time_estimate_minutes || 'N/A'} minutes\\n`;\r\n responseText += ` • Efficiency: ${efficiencyScore < 1 ? '🚀' : efficiencyScore > 1.5 ? '⚠️' : '⏱️'} ${(efficiencyScore * 100).toFixed(0)}%\\n`;\r\n responseText += ` • Session Duration: ${sessionDuration} minutes\\n\\n`;\r\n \r\n responseText += `✅ **Work Completed:**\\n`;\r\n workCompleted.forEach((task: string, index: number) => {\r\n responseText += `${index + 1}. ${task}\\n`;\r\n });\r\n responseText += `\\n`;\r\n \r\n if (technicalSummary) {\r\n responseText += `🔧 **Technical Summary:**\\n${technicalSummary}\\n\\n`;\r\n }\r\n \r\n if (efficiencyNotes) {\r\n responseText += `📈 **Efficiency Notes:**\\n${efficiencyNotes}\\n\\n`;\r\n }\r\n \r\n if (agendaEvent) {\r\n responseText += `📅 **Timetrack Entry ${wasUpdated ? 'Updated' : 'Created'}:**\\n`;\r\n responseText += ` • Agenda event ${wasUpdated ? 'updated with final' : 'created with'} work summary\\n`;\r\n responseText += ` • Status: DRAFT (requires approval in agenda)\\n`;\r\n responseText += ` • Duration: ${estimatedMinutes} minutes\\n`;\r\n responseText += ` • Period: ${sessionStart.toLocaleString()} - ${completionTime.toLocaleString()}\\n\\n`;\r\n }\r\n \r\n // Provide context for Cursor AI to generate customer response\r\n responseText += `📋 **Context for Customer Response:**\\n`;\r\n responseText += ` • Use \"get-completion-context\" to retrieve full context\\n`;\r\n responseText += ` • Generate customer-friendly response based on completed work\\n`;\r\n responseText += ` • Focus on business value and customer benefits\\n\\n`;\r\n \r\n responseText += `🎯 **Session archived successfully!**`;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: responseText\r\n }]\r\n };\r\n }\r\n \r\n case 'log-hours': {\r\n const { projectId, ticketId, aiSessionId, workDescription, estimatedHours, chatContextSummary } = args as any;\r\n \r\n let project = null;\r\n let ticket = null;\r\n let aiSession = null;\r\n \r\n // Verify project access if projectId is provided (includes shared customer projects)\r\n if (projectId) {\r\n const projectIds = await getAccessibleProjectIds(authContext.userId, authContext.teamId);\r\n \r\n if (!projectIds.includes(projectId)) {\r\n throw new Error(`Project not found or no access: ${projectId}. Please call get-projects first to find the correct project.`);\r\n }\r\n \r\n const { data: projectData, error: projectError } = await supabase\r\n .from('projects')\r\n .select('id, name, team_id')\r\n .eq('id', projectId)\r\n .single();\r\n \r\n if (projectError || !projectData) {\r\n throw new Error(`Project not found: ${projectId}.`);\r\n }\r\n \r\n project = projectData;\r\n }\r\n \r\n // Verify ticket access if ticketId is provided\r\n if (ticketId) {\r\n const { data: ticketData, error: ticketError } = await supabase\r\n .from('tickets')\r\n .select('id, title, status, team_id, project_id, customer_id')\r\n .eq('id', ticketId)\r\n .single();\r\n \r\n if (ticketError || !ticketData) {\r\n throw new Error(`Ticket not found: ${ticketId}. Please call get-tickets first to find the correct ticket.`);\r\n }\r\n \r\n // Check access using multiple methods:\r\n // 1. Own team or child team access\r\n // 2. Access via shared customer project\r\n // 3. Access via shared customer\r\n let hasAccess = false;\r\n \r\n // Check 1: Own team or child team\r\n const teamIds = await getAccessibleTeamIds(authContext.teamId);\r\n if (teamIds.includes(ticketData.team_id)) {\r\n hasAccess = true;\r\n }\r\n \r\n // Check 2: Access via project (includes shared customer projects)\r\n if (!hasAccess && ticketData.project_id) {\r\n const projectIds = await getAccessibleProjectIds(authContext.userId, authContext.teamId);\r\n if (projectIds.includes(ticketData.project_id)) {\r\n hasAccess = true;\r\n }\r\n }\r\n \r\n // Check 3: Access via shared customer\r\n if (!hasAccess && ticketData.customer_id) {\r\n const customerIds = await getAccessibleCustomerIds(authContext.teamId);\r\n if (customerIds.includes(ticketData.customer_id)) {\r\n hasAccess = true;\r\n }\r\n }\r\n \r\n if (!hasAccess) {\r\n throw new Error(`No access to ticket: ${ticketId}. Please call get-tickets first to find the correct ticket.`);\r\n }\r\n \r\n ticket = ticketData;\r\n }\r\n \r\n // Verify AI session if aiSessionId is provided\r\n if (aiSessionId) {\r\n const { data: sessionData, error: sessionError } = await supabase\r\n .from('ai_dev_sessions')\r\n .select('id, ticket_id, status')\r\n .eq('id', aiSessionId)\r\n .single();\r\n \r\n if (sessionError || !sessionData) {\r\n throw new Error(`AI Session not found: ${aiSessionId}.`);\r\n }\r\n \r\n aiSession = sessionData;\r\n }\r\n \r\n // Convert hours to seconds for agenda_events.tracked_duration\r\n const durationSeconds = Math.round(estimatedHours * 3600);\r\n \r\n const now = new Date();\r\n let agendaEntry: { id: string; tracked_duration: number | null; project_id: string | null; ticket_id: string | null; ai_session_id: string | null } | null = null;\r\n let agendaError: Error | null = null;\r\n let wasUpdated = false;\r\n let consolidatedCount = 0;\r\n \r\n // CHECK FOR EXISTING ENTRIES: If we have an AI session or ticket, look for existing draft entries\r\n // to update instead of creating duplicates\r\n if (aiSession?.id || ticket?.id) {\r\n let query = supabase\r\n .from('agenda_events')\r\n .select('id, tracked_duration, project_id, ticket_id, ai_session_id')\r\n .eq('status', 'draft')\r\n .eq('user_id', authContext.userId)\r\n .order('created_at', { ascending: false });\r\n \r\n // Prefer matching by AI session ID (most specific), then by ticket ID\r\n if (aiSession?.id) {\r\n query = query.eq('ai_session_id', aiSession.id);\r\n } else if (ticket?.id) {\r\n query = query.eq('ticket_id', ticket.id);\r\n }\r\n \r\n const { data: existingEntries } = await query;\r\n \r\n if (existingEntries && existingEntries.length > 0) {\r\n // Take the most recent entry (we know it exists because length > 0)\r\n const existingEntry = existingEntries[0]!;\r\n \r\n // CLEANUP: If there are duplicate entries, delete all but the first (newest)\r\n if (existingEntries.length > 1) {\r\n const duplicateIds = existingEntries.slice(1).map(e => e.id);\r\n await supabase\r\n .from('agenda_events')\r\n .delete()\r\n .in('id', duplicateIds);\r\n consolidatedCount = existingEntries.length - 1;\r\n }\r\n \r\n // UPDATE EXISTING: Add new hours to existing tracked_duration\r\n const newDuration = (existingEntry.tracked_duration || 0) + durationSeconds;\r\n \r\n const { data: updated, error: updateError } = await supabase\r\n .from('agenda_events')\r\n .update({\r\n tracked_duration: newDuration,\r\n end_time: now.toISOString(),\r\n title: workDescription,\r\n description: chatContextSummary || workDescription,\r\n project_id: project?.id || existingEntry.project_id,\r\n })\r\n .eq('id', existingEntry.id)\r\n .select('id, tracked_duration, project_id, ticket_id, ai_session_id')\r\n .single();\r\n \r\n agendaEntry = updated;\r\n agendaError = updateError as Error | null;\r\n wasUpdated = true;\r\n }\r\n }\r\n \r\n // CREATE NEW: No existing entry found, create a new one\r\n if (!agendaEntry) {\r\n const startTime = new Date(now.getTime() - durationSeconds * 1000); // Back-calculate start time\r\n \r\n const { data: created, error: createError } = await supabase\r\n .from('agenda_events')\r\n .insert({\r\n team_id: authContext.teamId,\r\n user_id: authContext.userId,\r\n project_id: project?.id || null,\r\n ticket_id: ticket?.id || null,\r\n ai_session_id: aiSession?.id || null,\r\n title: workDescription,\r\n description: chatContextSummary || workDescription,\r\n start_time: startTime.toISOString(),\r\n end_time: now.toISOString(),\r\n type: 'work',\r\n status: 'draft',\r\n all_day: false,\r\n is_tracked: true,\r\n tracked_duration: durationSeconds\r\n })\r\n .select('id, tracked_duration, project_id, ticket_id, ai_session_id')\r\n .single();\r\n \r\n agendaEntry = created;\r\n agendaError = createError as Error | null;\r\n }\r\n \r\n if (agendaError || !agendaEntry) {\r\n throw new Error(`Failed to ${wasUpdated ? 'update' : 'create'} time entry: ${agendaError?.message || 'Unknown error'}`);\r\n }\r\n \r\n let responseText = `⏱️ **Hours ${wasUpdated ? 'Added to Existing Entry' : 'Logged Successfully'}!**\\n\\n`;\r\n \r\n if (wasUpdated) {\r\n responseText += `🔄 **Updated existing draft entry** (avoiding duplicates)\\n`;\r\n responseText += ` • New total: ${Math.round((agendaEntry.tracked_duration || 0) / 3600 * 10) / 10}h\\n\\n`;\r\n }\r\n \r\n if (consolidatedCount > 0) {\r\n responseText += `🧹 **Cleaned up ${consolidatedCount} duplicate entries**\\n\\n`;\r\n }\r\n \r\n responseText += `📋 **Entry Details:**\\n`;\r\n if (project) {\r\n responseText += ` • Project: ${project.name}\\n`;\r\n } else {\r\n responseText += ` • Project: (No project assigned)\\n`;\r\n }\r\n if (ticket) {\r\n responseText += ` • Ticket: ${ticket.title} (${ticket.status})\\n`;\r\n }\r\n if (aiSession) {\r\n responseText += ` • AI Session: ${aiSession.id} (${aiSession.status})\\n`;\r\n }\r\n responseText += ` • Description: ${workDescription}\\n`;\r\n responseText += ` • ${wasUpdated ? 'Added' : 'Estimated'} Hours: ${estimatedHours}h (${Math.floor(estimatedHours)}h ${Math.round((estimatedHours % 1) * 60)}m)\\n`;\r\n responseText += ` • Status: DRAFT (not billed yet)\\n`;\r\n responseText += ` • Entry ID: ${agendaEntry.id}\\n\\n`;\r\n \r\n if (chatContextSummary) {\r\n responseText += `📊 **Work Context:**\\n`;\r\n responseText += `${chatContextSummary.substring(0, 200)}${chatContextSummary.length > 200 ? '...' : ''}\\n\\n`;\r\n }\r\n \r\n responseText += `✅ Time entry ${wasUpdated ? 'updated' : 'created'} and ready for review in the agenda!`;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: responseText\r\n }]\r\n };\r\n }\r\n \r\n // === GITHUB TOOLS ===\r\n case 'get-github-file': {\r\n const { projectId, filePath, ref } = args as any;\r\n \r\n // Get GitHub token for project\r\n const githubInfo = await getGithubTokenForProject(projectId, authContext.teamId);\r\n if (!githubInfo) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: '❌ GitHub not configured for this project.'\r\n }]\r\n };\r\n }\r\n \r\n try {\r\n const octokit = new Octokit({ auth: githubInfo.token });\r\n \r\n console.error(`📄 Reading file: ${filePath} from ${githubInfo.repositoryFullName}`);\r\n \r\n const { data } = await octokit.rest.repos.getContent({\r\n owner: githubInfo.owner,\r\n repo: githubInfo.repo,\r\n path: filePath,\r\n ref: ref\r\n });\r\n \r\n // Check if it's a file (not directory)\r\n if (Array.isArray(data) || data.type !== 'file') {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `❌ \"${filePath}\" is not a file or contains multiple items.`\r\n }]\r\n };\r\n }\r\n \r\n // Decode base64 content\r\n const content = Buffer.from(data.content, 'base64').toString('utf-8');\r\n \r\n let responseText = `📄 **File: ${filePath}**\\n`;\r\n responseText += `Repository: ${githubInfo.repositoryFullName}\\n`;\r\n responseText += `Size: ${data.size} bytes\\n`;\r\n responseText += `URL: ${data.html_url}\\n\\n`;\r\n responseText += `**Content:**\\n\\`\\`\\`\\n${content}\\n\\`\\`\\``;\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: responseText\r\n }]\r\n };\r\n } catch (error: any) {\r\n console.error('GitHub get file error:', error);\r\n \r\n if (error.status === 404) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `❌ File not found: ${filePath}`\r\n }]\r\n };\r\n }\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `❌ Failed to read file: ${error.message || 'Unknown error'}`\r\n }]\r\n };\r\n }\r\n }\r\n \r\n case 'list-github-directory': {\r\n const { projectId, directoryPath, ref } = args as any;\r\n \r\n // Get GitHub token for project\r\n const githubInfo = await getGithubTokenForProject(projectId, authContext.teamId);\r\n if (!githubInfo) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: '❌ GitHub not configured for this project.'\r\n }]\r\n };\r\n }\r\n \r\n try {\r\n const octokit = new Octokit({ auth: githubInfo.token });\r\n \r\n // Normalize directory path (empty string or \"/\" for root)\r\n const normalizedPath = (!directoryPath || directoryPath === '/') ? '' : directoryPath;\r\n \r\n console.error(`📁 Listing directory: ${normalizedPath || '(root)'} in ${githubInfo.repositoryFullName}`);\r\n \r\n const { data } = await octokit.rest.repos.getContent({\r\n owner: githubInfo.owner,\r\n repo: githubInfo.repo,\r\n path: normalizedPath,\r\n ref: ref\r\n });\r\n \r\n // Check if it's a directory\r\n if (!Array.isArray(data)) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `❌ \"${directoryPath}\" is not a directory.`\r\n }]\r\n };\r\n }\r\n \r\n let responseText = `📁 **Directory: ${directoryPath || '(root)'}**\\n`;\r\n responseText += `Repository: ${githubInfo.repositoryFullName}\\n`;\r\n responseText += `Items: ${data.length}\\n\\n`;\r\n \r\n // Group by type\r\n const directories = data.filter(item => item.type === 'dir');\r\n const files = data.filter(item => item.type === 'file');\r\n \r\n if (directories.length > 0) {\r\n responseText += `**📁 Directories (${directories.length}):**\\n`;\r\n for (const dir of directories) {\r\n responseText += ` - ${dir.name}/\\n`;\r\n }\r\n responseText += `\\n`;\r\n }\r\n \r\n if (files.length > 0) {\r\n responseText += `**📄 Files (${files.length}):**\\n`;\r\n for (const file of files) {\r\n responseText += ` - ${file.name} (${file.size} bytes)\\n`;\r\n }\r\n }\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: responseText\r\n }]\r\n };\r\n } catch (error: any) {\r\n console.error('GitHub list directory error:', error);\r\n \r\n if (error.status === 404) {\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `❌ Directory not found: ${directoryPath}`\r\n }]\r\n };\r\n }\r\n \r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `❌ Failed to list directory: ${error.message || 'Unknown error'}`\r\n }]\r\n };\r\n }\r\n }\r\n \r\n default:\r\n throw new Error(`Unknown tool: ${name}`);\r\n }\r\n \r\n } catch (error: any) {\r\n console.error(`❌ Tool execution error:`, error);\r\n const message = error instanceof Error \r\n ? error.message \r\n : (error?.message || error?.details || (typeof error === 'string' ? error : JSON.stringify(error)));\r\n return {\r\n content: [{\r\n type: 'text',\r\n text: `Error executing ${name}: ${message}`\r\n }]\r\n };\r\n }\r\n});\r\n\r\n// Resource read handler\r\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\r\n if (!authContext) {\r\n return {\r\n contents: [{\r\n uri: request.params.uri,\r\n mimeType: 'text/plain',\r\n text: 'Error: Not authenticated. API key validation failed.'\r\n }]\r\n };\r\n }\r\n\r\n const { uri } = request.params;\r\n console.error(`📚 Reading resource: ${uri}`);\r\n \r\n try {\r\n switch (uri) {\r\n case 'tickets://recent': {\r\n // Get all accessible team IDs (own team + child teams)\r\n const teamIds = await getAccessibleTeamIds(authContext!.teamId);\r\n \r\n // Get all accessible project IDs (includes shared customer projects)\r\n const projectIds = await getAccessibleProjectIds(authContext!.userId, authContext!.teamId);\r\n \r\n // Get all accessible customer IDs (includes shared customers)\r\n const customerIds = await getAccessibleCustomerIds(authContext!.teamId);\r\n \r\n // Build a filter that includes:\r\n // 1. Tickets from own team + child teams\r\n // 2. Tickets from projects where user has access (includes shared customer projects)\r\n // 3. Tickets from shared customers (even without a project)\r\n let teamFilter = `team_id.in.(${teamIds.join(',')})`;\r\n let projectFilter = projectIds.length > 0 ? `project_id.in.(${projectIds.join(',')})` : null;\r\n let customerFilter = customerIds.length > 0 ? `customer_id.in.(${customerIds.join(',')})` : null;\r\n \r\n // Combine filters with OR\r\n const filters = [teamFilter, projectFilter, customerFilter].filter(Boolean);\r\n \r\n const { data, error } = await supabase\r\n .from('tickets')\r\n .select(`\r\n id,\r\n ticket_number,\r\n title,\r\n status,\r\n priority,\r\n created_at\r\n `)\r\n .or(filters.join(','))\r\n .order('created_at', { ascending: false })\r\n .limit(20);\r\n \r\n if (error) throw error;\r\n \r\n return {\r\n contents: [{\r\n uri,\r\n mimeType: 'application/json',\r\n text: JSON.stringify(data, null, 2)\r\n }]\r\n };\r\n }\r\n \r\n case 'customers://all': {\r\n const customerIds = await getAccessibleCustomerIds(authContext!.teamId);\r\n \r\n if (customerIds.length === 0) {\r\n return {\r\n contents: [{\r\n uri,\r\n mimeType: 'application/json',\r\n text: JSON.stringify([], null, 2)\r\n }]\r\n };\r\n }\r\n \r\n const { data, error } = await supabase\r\n .from('customers')\r\n .select('id, name, email, website, created_at')\r\n .in('id', customerIds)\r\n .order('name')\r\n .limit(50);\r\n \r\n if (error) throw error;\r\n \r\n return {\r\n contents: [{\r\n uri,\r\n mimeType: 'application/json',\r\n text: JSON.stringify(data, null, 2)\r\n }]\r\n };\r\n }\r\n \r\n case 'projects://active': {\r\n const projectIds = await getAccessibleProjectIds(authContext!.userId, authContext!.teamId);\r\n \r\n if (projectIds.length === 0) {\r\n return {\r\n contents: [{\r\n uri,\r\n mimeType: 'application/json',\r\n text: JSON.stringify([], null, 2)\r\n }]\r\n };\r\n }\r\n \r\n const { data, error } = await supabase\r\n .from('projects')\r\n .select(`\r\n id,\r\n name,\r\n description,\r\n status,\r\n created_at,\r\n customers:customer_id(id, name)\r\n `)\r\n .in('id', projectIds)\r\n .eq('status', 'active')\r\n .order('name')\r\n .limit(50);\r\n \r\n if (error) throw error;\r\n \r\n return {\r\n contents: [{\r\n uri,\r\n mimeType: 'application/json',\r\n text: JSON.stringify(data, null, 2)\r\n }]\r\n };\r\n }\r\n \r\n default:\r\n throw new Error(`Unknown resource: ${uri}`);\r\n }\r\n \r\n } catch (error) {\r\n console.error(`❌ Resource read error:`, error);\r\n return {\r\n contents: [{\r\n uri,\r\n mimeType: 'text/plain',\r\n text: `Error reading ${uri}: ${error instanceof Error ? error.message : 'Unknown error'}`\r\n }]\r\n };\r\n }\r\n});\r\n\r\n// Main function\r\nasync function main() {\r\n console.error('🚀 Starting MG Tickets MCP Bridge Server...');\r\n console.error(`🔑 API Key: ${apiKey?.substring(0, 10)}...`);\r\n \r\n // Validate API key\r\n authContext = await validateApiKey(apiKey!);\r\n if (!authContext) {\r\n console.error('❌ API key validation failed. Please check your key and try again.');\r\n process.exit(1);\r\n }\r\n \r\n console.error(`✅ Authenticated as user ${authContext.userId} in team ${authContext.teamId}`);\r\n console.error(`📋 Available scopes: ${authContext.scopes.join(', ')}`);\r\n console.error('📡 MCP Bridge Server ready for connections');\r\n \r\n const transport = new StdioServerTransport();\r\n await server.connect(transport);\r\n}\r\n\r\n// Handle graceful shutdown\r\nprocess.on('SIGINT', async () => {\r\n console.error('👋 Shutting down MCP Bridge Server...');\r\n process.exit(0);\r\n});\r\n\r\nprocess.on('SIGTERM', async () => {\r\n console.error('👋 Shutting down MCP Bridge Server...');\r\n process.exit(0);\r\n});\r\n\r\n// Start the server\r\nmain().catch((error) => {\r\n console.error('💥 Fatal error:', error);\r\n process.exit(1);\r\n});\r\n\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/db.ts","../src/storage.ts","../src/index.ts"],"names":["sql","or","eq","and","args"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Drizzle DB singleton + access-control helpers for the MCP bridge.\r\n *\r\n * The bridge runs as a long-lived stdio process started by Cursor/Claude\r\n * Desktop. We open ONE connection pool for the lifetime of the process\r\n * (no per-request `disconnect()`); the OS reclaims it on shutdown.\r\n *\r\n * NOTE for customers: set `DATABASE_PRIMARY_POOLER_URL` (or pass\r\n * `--database-url=...`) before starting the bridge. There is no longer\r\n * a safe public default — these are real Postgres credentials.\r\n */\r\n\r\nimport { createJobDb } from \"@refront/db/job-client\";\r\nimport * as schema from \"@refront/db/schema\";\r\nimport { and, eq, or, sql } from \"drizzle-orm\";\r\n\r\ntype JobClient = ReturnType<typeof createJobDb>;\r\ntype JobDb = JobClient[\"db\"];\r\n\r\nlet _client: JobClient | null = null;\r\n\r\nfunction getClient(): JobClient {\r\n if (!_client) {\r\n if (!process.env.DATABASE_PRIMARY_POOLER_URL) {\r\n throw new Error(\r\n \"DATABASE_PRIMARY_POOLER_URL is not set. Pass --database-url=... or export the env var before starting the MCP bridge.\",\r\n );\r\n }\r\n _client = createJobDb();\r\n }\r\n return _client;\r\n}\r\n\r\n/** Drizzle DB handle. Lazy because env validation needs to happen after CLI parsing. */\r\nexport const db: JobDb = new Proxy({} as JobDb, {\r\n get(_target, prop) {\r\n const real = getClient().db;\r\n const value = Reflect.get(real, prop, real);\r\n return typeof value === \"function\" ? value.bind(real) : value;\r\n },\r\n});\r\n\r\nexport { schema };\r\n\r\n/**\r\n * Returns the team's own ID plus IDs of all direct child teams.\r\n * Mirrors the previous PostgREST `or(id.eq.X, parent_team_id.eq.X)` query.\r\n */\r\nexport async function getAccessibleTeamIds(teamId: string): Promise<string[]> {\r\n const rows = await db\r\n .select({ id: schema.teams.id })\r\n .from(schema.teams)\r\n .where(\r\n or(eq(schema.teams.id, teamId), eq(schema.teams.parentTeamId, teamId)),\r\n );\r\n\r\n const ids = rows.map((r) => r.id);\r\n return ids.length > 0 ? ids : [teamId];\r\n}\r\n\r\n/**\r\n * Calls the `public.get_accessible_project_ids(user_id, team_id)` SQL\r\n * function. The function encodes the full RLS-style access logic\r\n * (owners + members + shared customer projects) and returns one\r\n * column `project_id`.\r\n */\r\nexport async function getAccessibleProjectIds(\r\n userId: string,\r\n teamId: string,\r\n): Promise<string[]> {\r\n try {\r\n const rows = (await db.execute(\r\n sql`SELECT project_id FROM get_accessible_project_ids(${userId}::uuid, ${teamId}::uuid)`,\r\n )) as unknown as Array<{ project_id: string }>;\r\n return rows.map((r) => r.project_id).filter(Boolean);\r\n } catch (error) {\r\n console.error(\"❌ Error getting accessible project IDs:\", error);\r\n return [];\r\n }\r\n}\r\n\r\n/**\r\n * Returns IDs of customers the team can see: customers it owns\r\n * (across its own team + child teams) plus customers explicitly\r\n * shared via `customer_shared_teams`.\r\n */\r\nexport async function getAccessibleCustomerIds(\r\n teamId: string,\r\n): Promise<string[]> {\r\n const teamIds = await getAccessibleTeamIds(teamId);\r\n\r\n const ownCustomers = await db\r\n .select({ id: schema.customers.id })\r\n .from(schema.customers)\r\n .where(\r\n teamIds.length === 1\r\n ? eq(schema.customers.teamId, teamIds[0]!)\r\n : sql`${schema.customers.teamId} = ANY(${teamIds}::uuid[])`,\r\n );\r\n\r\n const sharedCustomers = await db\r\n .select({ customerId: schema.customerSharedTeams.customerId })\r\n .from(schema.customerSharedTeams)\r\n .where(eq(schema.customerSharedTeams.teamId, teamId));\r\n\r\n return [\r\n ...new Set([\r\n ...ownCustomers.map((c) => c.id),\r\n ...sharedCustomers.map((c) => c.customerId),\r\n ]),\r\n ];\r\n}\r\n\r\n/**\r\n * Resolves a short `ai-sess-xxxxxxxx` prefix to the full `ai_sessions.id`\r\n * UUID, restricted to teams the caller can see. Returns null if no\r\n * matching session exists.\r\n *\r\n * Legacy MCP tools accept readable IDs (first 8 chars of the UUID);\r\n * we keep that contract by doing the prefix match in SQL via\r\n * `id::text LIKE 'xxxxxxxx%'`.\r\n */\r\nexport async function resolveAiSessionId(\r\n prefix: string,\r\n teamIds: string[],\r\n): Promise<string | null> {\r\n if (teamIds.length === 0) return null;\r\n const rows = await db\r\n .select({ id: schema.aiSessions.id })\r\n .from(schema.aiSessions)\r\n .where(\r\n and(\r\n teamIds.length === 1\r\n ? eq(schema.aiSessions.teamId, teamIds[0]!)\r\n : sql`${schema.aiSessions.teamId} = ANY(${teamIds}::uuid[])`,\r\n sql`${schema.aiSessions.id}::text LIKE ${`${prefix}%`}`,\r\n ),\r\n )\r\n .limit(1);\r\n return rows[0]?.id ?? null;\r\n}\r\n","import { createStorageClient, type StorageClient } from \"@refront/storage\";\r\n\r\n/**\r\n * Singleton R2 storage client for the MCP bridge process.\r\n *\r\n * Replaces the previous storage RPC calls. Lazy-instantiated through a\r\n * Proxy so that a missing R2_* env var only crashes paths that\r\n * actually use storage instead of taking down the bridge on boot.\r\n */\r\nlet _storage: StorageClient | null = null;\r\n\r\nfunction buildClient(): StorageClient {\r\n const endpoint = process.env.R2_ENDPOINT;\r\n const accessKeyId = process.env.R2_ACCESS_KEY_ID;\r\n const secretAccessKey = process.env.R2_SECRET_ACCESS_KEY;\r\n\r\n if (!endpoint || !accessKeyId || !secretAccessKey) {\r\n throw new Error(\r\n \"R2 storage is not configured. Set R2_ENDPOINT, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY.\",\r\n );\r\n }\r\n\r\n return createStorageClient({\r\n endpoint,\r\n accessKeyId,\r\n secretAccessKey,\r\n publicDomain: process.env.R2_PUBLIC_DOMAIN || undefined,\r\n publicBuckets: [\r\n \"vault\",\r\n \"avatars\",\r\n \"team-logos\",\r\n \"blog-images\",\r\n \"customer-assets\",\r\n ],\r\n });\r\n}\r\n\r\nexport const storage: StorageClient = new Proxy({} as StorageClient, {\r\n get(_target, prop) {\r\n if (!_storage) _storage = buildClient();\r\n return Reflect.get(_storage, prop, _storage);\r\n },\r\n});\r\n","#!/usr/bin/env node\n\n/**\n * Refront MCP bridge — stdio MCP server that exposes Refront tickets,\n * customers, projects, AI dev sessions and time tracking to AI editors\n * (Cursor, Claude Desktop, Windsurf, ...).\n *\n * This bridge now talks directly to the vanilla Postgres database via\n * Drizzle ORM (see `db.ts`). The previous PostgREST/JWT transport\n * has been removed; customers must export `DATABASE_PRIMARY_POOLER_URL`\n * (or pass `--database-url=...`) before starting the bridge.\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { Octokit } from \"@octokit/rest\";\nimport { createHash } from \"crypto\";\nimport { and, asc, desc, eq, ilike, inArray, or, sql } from \"drizzle-orm\";\nimport {\n db,\n getAccessibleCustomerIds,\n getAccessibleProjectIds,\n getAccessibleTeamIds,\n resolveAiSessionId,\n schema,\n} from \"./db.js\";\nimport { storage } from \"./storage.js\";\n\n// ---------------------------------------------------------------------------\n// CLI / env parsing\n// ---------------------------------------------------------------------------\n\nconst args = process.argv.slice(2);\n\nfunction readArg(name: string): string | undefined {\n const prefix = `--${name}=`;\n const hit = args.find((a) => a.startsWith(prefix));\n return hit ? hit.slice(prefix.length) : undefined;\n}\n\nconst apiKey = readArg(\"api-key\") ?? process.env.MG_TICKETS_API_KEY;\n\nconst databaseUrl =\n readArg(\"database-url\") ??\n process.env.DATABASE_PRIMARY_POOLER_URL ??\n process.env.DATABASE_URL;\n\nif (!apiKey) {\n console.error(\n \"❌ API key is required. Use --api-key=your_key or set MG_TICKETS_API_KEY environment variable\",\n );\n process.exit(1);\n}\n\nif (!databaseUrl) {\n console.error(\n \"❌ Database URL is required. Use --database-url=postgresql://... or set DATABASE_PRIMARY_POOLER_URL (or DATABASE_URL) environment variable.\",\n );\n process.exit(1);\n}\n\n// Job DB client reads DATABASE_PRIMARY_POOLER_URL — normalize whichever\n// variable the user provided so both work.\nprocess.env.DATABASE_PRIMARY_POOLER_URL = databaseUrl;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface AuthContext {\n userId: string;\n teamId: string;\n scopes: string[];\n}\n\ntype ToolArgs = Record<string, unknown> | undefined;\n\ninterface GetTicketsArgs {\n status?: string;\n priority?: string;\n projectId?: string;\n customerId?: string;\n q?: string;\n pageSize?: number;\n}\n\ninterface GetTicketByIdArgs {\n id: string;\n}\n\ninterface CreateTicketArgs {\n title: string;\n description?: string;\n status?: string;\n priority?: string;\n type?: string;\n projectId?: string;\n customerId?: string;\n}\n\ninterface GetCustomersArgs {\n q?: string;\n pageSize?: number;\n}\n\ninterface CreateCustomerArgs {\n name: string;\n email?: string;\n website?: string;\n}\n\ninterface GetProjectsArgs {\n customerId?: string;\n q?: string;\n pageSize?: number;\n}\n\ninterface CreateProjectArgs {\n name: string;\n description?: string;\n customerId?: string;\n status?: string;\n}\n\ninterface StartAiSessionArgs {\n ticketId: string;\n ticketUrl?: string;\n cursorSessionId?: string;\n totalEstimatedMinutes: number;\n complexityScore?: number;\n}\n\ninterface TrackManualFollowUpArgs {\n aiSessionId: string;\n originalPrompt: string;\n aiResponse: string;\n developerFollowUp: string;\n followUpReason: string;\n outcome?: string;\n estimatedMinutes: number;\n workDescription: string;\n}\n\ninterface GetSessionContextArgs {\n aiSessionId: string;\n includeTicketData?: boolean;\n includeTodoProgress?: boolean;\n includeFollowUpHistory?: boolean;\n}\n\ninterface SessionTodoInput {\n todoId?: string;\n content: string;\n status: string;\n estimatedMinutes?: number;\n}\n\ninterface SyncSessionTodosArgs {\n aiSessionId: string;\n todos: SessionTodoInput[];\n replaceAll?: boolean;\n}\n\ninterface FollowUpTodoInput {\n content: string;\n status?: string;\n estimatedMinutes?: number;\n addedInFollowUp?: boolean;\n}\n\ninterface AddFollowUpTodosArgs {\n aiSessionId: string;\n newTodos: FollowUpTodoInput[];\n followUpReason?: string;\n}\n\ninterface UpdateSessionStatusArgs {\n aiSessionId: string;\n status: string;\n actualTimeMinutes?: number;\n completionNotes?: string;\n}\n\ninterface GetCompletionContextArgs {\n aiSessionId: string;\n includeFollowUps?: boolean;\n includeTimeMetrics?: boolean;\n includeTodos?: boolean;\n}\n\ninterface SaveCustomerResponseArgs {\n aiSessionId: string;\n customerResponse: string;\n responseType?: string;\n}\n\ninterface CompleteAiSessionArgs {\n aiSessionId: string;\n workCompleted: string[];\n technicalSummary?: string;\n invoiceDescription?: string;\n efficiencyNotes?: string;\n}\n\ninterface LogHoursArgs {\n projectId?: string;\n ticketId?: string;\n aiSessionId?: string;\n workDescription: string;\n estimatedHours: number;\n chatContextSummary?: string;\n}\n\ninterface GetGithubFileArgs {\n projectId: string;\n filePath: string;\n ref?: string;\n}\n\ninterface ListGithubDirectoryArgs {\n projectId: string;\n directoryPath: string;\n ref?: string;\n}\n\nfunction asToolArgs<T>(input: ToolArgs): T {\n return (input ?? {}) as T;\n}\n\n// ---------------------------------------------------------------------------\n// Misc helpers\n// ---------------------------------------------------------------------------\n\nfunction roundToNearest15Minutes(minutes: number): number {\n if (minutes <= 0) return 0;\n return Math.round(minutes / 15) * 15;\n}\n\nfunction isImageFile(mimeType: string): boolean {\n return (\n mimeType.startsWith(\"image/\") &&\n [\"image/jpeg\", \"image/jpg\", \"image/png\", \"image/gif\", \"image/webp\"].includes(\n mimeType,\n )\n );\n}\n\nasync function downloadImageAsBase64(\n storageKey: string,\n): Promise<string | null> {\n try {\n let signedUrl: string;\n try {\n const { url } = await storage.createSignedUrl({\n bucket: \"vault\",\n path: storageKey,\n expiresIn: 3600,\n });\n signedUrl = url;\n } catch (err) {\n console.error(`Failed to create signed URL for ${storageKey}:`, err);\n return null;\n }\n\n const response = await fetch(signedUrl);\n if (!response.ok) {\n console.error(\n `Failed to download file ${storageKey}: ${response.status}`,\n );\n return null;\n }\n\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer).toString(\"base64\");\n } catch (error) {\n console.error(`Error downloading image ${storageKey}:`, error);\n return null;\n }\n}\n\n/**\n * Build a Drizzle predicate that matches tickets visible to the caller:\n * own team(s), accessible projects, and shared customers.\n */\nfunction buildTicketAccessPredicate(\n teamIds: string[],\n projectIds: string[],\n customerIds: string[],\n) {\n const branches: ReturnType<typeof inArray>[] = [];\n if (teamIds.length > 0) branches.push(inArray(schema.tickets.teamId, teamIds));\n if (projectIds.length > 0)\n branches.push(inArray(schema.tickets.projectId, projectIds));\n if (customerIds.length > 0)\n branches.push(inArray(schema.tickets.customerId, customerIds));\n if (branches.length === 0) return sql`false`;\n if (branches.length === 1) return branches[0]!;\n return or(...branches)!;\n}\n\n// ---------------------------------------------------------------------------\n// API key validation\n// ---------------------------------------------------------------------------\n\nasync function validateApiKey(key: string): Promise<AuthContext | null> {\n if (!key.startsWith(\"mid_\") || key.length !== 68) {\n console.error(\"🔑 Invalid API key format\");\n return null;\n }\n\n try {\n const keyHash = createHash(\"sha256\").update(key).digest(\"hex\");\n console.error(`🔍 Validating API key hash: ${keyHash.substring(0, 16)}...`);\n\n const [apiKeyData] = await db\n .select({\n id: schema.apiKeys.id,\n userId: schema.apiKeys.userId,\n teamId: schema.apiKeys.teamId,\n scopes: schema.apiKeys.scopes,\n lastUsedAt: schema.apiKeys.lastUsedAt,\n })\n .from(schema.apiKeys)\n .where(eq(schema.apiKeys.keyHash, keyHash))\n .limit(1);\n\n if (!apiKeyData) {\n console.error(\"❌ API key not found or invalid\");\n return null;\n }\n\n await db\n .update(schema.apiKeys)\n .set({ lastUsedAt: new Date().toISOString() })\n .where(eq(schema.apiKeys.id, apiKeyData.id));\n\n console.error(\n `✅ API key validated for user ${apiKeyData.userId} in team ${apiKeyData.teamId}`,\n );\n\n return {\n userId: apiKeyData.userId,\n teamId: apiKeyData.teamId,\n scopes: apiKeyData.scopes ?? [],\n };\n } catch (error) {\n console.error(\"💥 API key validation error:\", error);\n return null;\n }\n}\n\nlet authContext: AuthContext | null = null;\n\n// ---------------------------------------------------------------------------\n// GitHub helpers\n// ---------------------------------------------------------------------------\n\nasync function getGithubTokenForProject(\n projectId: string,\n teamId: string,\n): Promise<{\n token: string;\n repositoryFullName: string;\n owner: string;\n repo: string;\n} | null> {\n try {\n const [repoData] = await db\n .select({\n repositoryFullName: schema.projectGithubRepositories.repositoryFullName,\n })\n .from(schema.projectGithubRepositories)\n .where(\n and(\n eq(schema.projectGithubRepositories.projectId, projectId),\n eq(schema.projectGithubRepositories.teamId, teamId),\n ),\n )\n .limit(1);\n\n if (!repoData) {\n console.error(`No GitHub repository linked to project ${projectId}`);\n return null;\n }\n\n const [appData] = await db\n .select({ config: schema.apps.config })\n .from(schema.apps)\n .where(\n and(eq(schema.apps.teamId, teamId), eq(schema.apps.appId, \"github\")),\n )\n .limit(1);\n\n const accessToken = (appData?.config as { access_token?: string } | null)\n ?.access_token;\n if (!appData || !accessToken) {\n console.error(`GitHub app not connected for team ${teamId}`);\n return null;\n }\n\n const repositoryFullName = repoData.repositoryFullName;\n const [owner, repo] = repositoryFullName.split(\"/\");\n if (!owner || !repo) {\n console.error(`Invalid repository full name: ${repositoryFullName}`);\n return null;\n }\n\n return { token: accessToken, repositoryFullName, owner, repo };\n } catch (error) {\n console.error(\"Error getting GitHub token for project:\", error);\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// AI session phase transitions\n// ---------------------------------------------------------------------------\n\n/**\n * Auto-advance an AI session through the canonical phase order\n * (analysis → bug_investigation → development → communication),\n * skipping any phase with 0 estimated minutes.\n */\nasync function transitionToNextPhase(\n sessionId: string,\n currentPhase?: string,\n): Promise<void> {\n try {\n const now = new Date();\n const phaseOrder = [\n \"analysis\",\n \"bug_investigation\",\n \"development\",\n \"communication\",\n ];\n\n const allPhases = await db\n .select()\n .from(schema.aiTimeLogs)\n .where(eq(schema.aiTimeLogs.aiSessionId, sessionId))\n .orderBy(asc(schema.aiTimeLogs.activityType));\n\n let currentPhaseType = currentPhase;\n if (!currentPhaseType) {\n const activePhase = allPhases.find((p) => p.status === \"in_progress\");\n currentPhaseType = activePhase?.activityType ?? undefined;\n }\n\n if (!currentPhaseType) {\n const analysisPhase = allPhases.find(\n (p) => p.activityType === \"analysis\",\n );\n if (\n analysisPhase &&\n analysisPhase.status === \"pending\" &&\n (analysisPhase.estimatedDurationSeconds ?? 0) > 0\n ) {\n await db\n .update(schema.aiTimeLogs)\n .set({ status: \"in_progress\", startedAt: now.toISOString() })\n .where(eq(schema.aiTimeLogs.id, analysisPhase.id));\n console.error(\"✅ Started analysis phase\");\n }\n return;\n }\n\n const currentPhaseRecord = allPhases.find(\n (p) =>\n p.activityType === currentPhaseType && p.status === \"in_progress\",\n );\n if (currentPhaseRecord) {\n const duration = Math.round(\n (now.getTime() -\n new Date(currentPhaseRecord.startedAt).getTime()) /\n 1000,\n );\n await db\n .update(schema.aiTimeLogs)\n .set({\n status: \"completed\",\n endedAt: now.toISOString(),\n durationSeconds: duration,\n })\n .where(eq(schema.aiTimeLogs.id, currentPhaseRecord.id));\n console.error(`✅ Completed phase: ${currentPhaseType} (${duration}s)`);\n }\n\n const currentIndex = phaseOrder.indexOf(currentPhaseType);\n if (currentIndex === -1 || currentIndex === phaseOrder.length - 1) {\n console.error(\"No next phase to transition to\");\n return;\n }\n\n for (let i = currentIndex + 1; i < phaseOrder.length; i++) {\n const nextPhaseType = phaseOrder[i];\n const nextPhase = allPhases.find(\n (p) => p.activityType === nextPhaseType,\n );\n if (!nextPhase) continue;\n\n if ((nextPhase.estimatedDurationSeconds ?? 0) === 0) {\n await db\n .update(schema.aiTimeLogs)\n .set({ status: \"skipped\" })\n .where(eq(schema.aiTimeLogs.id, nextPhase.id));\n console.error(\n `⏭️ Skipped phase: ${nextPhaseType} (0 minutes estimated)`,\n );\n continue;\n }\n\n if (nextPhase.status === \"pending\") {\n await db\n .update(schema.aiTimeLogs)\n .set({ status: \"in_progress\", startedAt: now.toISOString() })\n .where(eq(schema.aiTimeLogs.id, nextPhase.id));\n console.error(`✅ Started next phase: ${nextPhaseType}`);\n return;\n }\n }\n\n console.error(\"All remaining phases skipped or completed\");\n } catch (error) {\n console.error(\"Error transitioning to next phase:\", error);\n }\n}\n\n// ---------------------------------------------------------------------------\n// MCP Server setup\n// ---------------------------------------------------------------------------\n\nconst server = new Server(\n {\n name: \"mg-tickets-mcp-bridge\",\n version: \"3.0.0\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n },\n);\n\nconst TOOLS = [\n {\n name: \"get-tickets\",\n description:\n \"Get tickets with optional filtering by status, priority, project, customer, or search query\",\n inputSchema: {\n type: \"object\",\n properties: {\n status: {\n type: \"string\",\n enum: [\n \"open\",\n \"in_progress\",\n \"review\",\n \"resolved\",\n \"closed\",\n \"backlog\",\n ],\n },\n priority: {\n type: \"string\",\n enum: [\"low\", \"medium\", \"high\", \"critical\"],\n },\n projectId: { type: \"string\" },\n customerId: { type: \"string\" },\n q: {\n type: \"string\",\n description: \"Search query for ticket number, title, or description\",\n },\n pageSize: { type: \"number\", default: 20, maximum: 100 },\n },\n required: [],\n },\n },\n {\n name: \"get-ticket-by-id\",\n description:\n \"Get a specific ticket by its ID, including all attachments, comments, and images. Images from ticket attachments and comment attachments are automatically downloaded and returned as base64-encoded content that can be analyzed by AI.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Ticket ID\" },\n },\n required: [\"id\"],\n },\n },\n {\n name: \"create-ticket\",\n description: \"Create a new ticket\",\n inputSchema: {\n type: \"object\",\n properties: {\n title: { type: \"string\", description: \"Ticket title\" },\n description: { type: \"string\" },\n status: {\n type: \"string\",\n enum: [\n \"open\",\n \"in_progress\",\n \"review\",\n \"resolved\",\n \"closed\",\n \"backlog\",\n ],\n default: \"open\",\n },\n priority: {\n type: \"string\",\n enum: [\"low\", \"medium\", \"high\", \"critical\"],\n default: \"medium\",\n },\n type: {\n type: \"string\",\n enum: [\n \"task\",\n \"bug\",\n \"feature\",\n \"support\",\n \"question\",\n \"improvement\",\n ],\n default: \"task\",\n },\n projectId: { type: \"string\" },\n customerId: { type: \"string\" },\n },\n required: [\"title\"],\n },\n },\n {\n name: \"get-customers\",\n description: \"Get customers with optional search\",\n inputSchema: {\n type: \"object\",\n properties: {\n q: {\n type: \"string\",\n description: \"Search query for customer name or email\",\n },\n pageSize: { type: \"number\", default: 20, maximum: 100 },\n },\n required: [],\n },\n },\n {\n name: \"create-customer\",\n description: \"Create a new customer\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Customer name\" },\n email: { type: \"string\" },\n website: { type: \"string\" },\n },\n required: [\"name\"],\n },\n },\n {\n name: \"get-projects\",\n description: \"Get projects with optional filtering\",\n inputSchema: {\n type: \"object\",\n properties: {\n customerId: { type: \"string\", description: \"Filter by customer ID\" },\n q: { type: \"string\", description: \"Search query for project name\" },\n pageSize: { type: \"number\", default: 20, maximum: 100 },\n },\n required: [],\n },\n },\n {\n name: \"create-project\",\n description: \"Create a new project\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Project name\" },\n description: { type: \"string\" },\n customerId: { type: \"string\" },\n status: {\n type: \"string\",\n enum: [\"active\", \"on_hold\", \"completed\", \"cancelled\"],\n default: \"active\",\n },\n },\n required: [\"name\"],\n },\n },\n {\n name: \"start-ai-session-smart\",\n description: \"Start a new AI development session with automatic tracking\",\n inputSchema: {\n type: \"object\",\n properties: {\n ticketId: { type: \"string\" },\n ticketUrl: { type: \"string\", description: \"URL to the ticket\" },\n cursorSessionId: {\n type: \"string\",\n description: \"Cursor session identifier\",\n },\n totalEstimatedMinutes: {\n type: \"number\",\n description:\n \"Total estimated time in minutes (senior dev WITHOUT AI, rounded to 15 min)\",\n },\n complexityScore: {\n type: \"number\",\n minimum: 1,\n maximum: 10,\n description: \"Estimated complexity from 1-10\",\n },\n },\n required: [\"ticketId\", \"totalEstimatedMinutes\"],\n },\n },\n {\n name: \"track-manual-follow-up\",\n description: \"Track manual follow-up prompt by developer\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n originalPrompt: { type: \"string\" },\n aiResponse: { type: \"string\" },\n developerFollowUp: { type: \"string\" },\n followUpReason: {\n type: \"string\",\n enum: [\n \"incomplete_result\",\n \"wrong_approach\",\n \"needs_clarification\",\n \"error_in_code\",\n ],\n },\n outcome: {\n type: \"string\",\n enum: [\"success\", \"partial_success\", \"still_failed\"],\n default: \"success\",\n },\n estimatedMinutes: {\n type: \"number\",\n description:\n \"Estimated time needed for this follow-up work (think as senior dev WITHOUT AI, in minutes)\",\n },\n workDescription: {\n type: \"string\",\n description:\n \"Detailed work description generated by AI (2-3 sentences, summarizing all work done in session including follow-ups)\",\n },\n },\n required: [\n \"aiSessionId\",\n \"originalPrompt\",\n \"aiResponse\",\n \"developerFollowUp\",\n \"followUpReason\",\n \"estimatedMinutes\",\n \"workDescription\",\n ],\n },\n },\n {\n name: \"get-session-context\",\n description: \"Get current session context for follow-up continuity\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n includeTicketData: { type: \"boolean\", default: true },\n includeTodoProgress: { type: \"boolean\", default: true },\n includeFollowUpHistory: { type: \"boolean\", default: false },\n },\n required: [\"aiSessionId\"],\n },\n },\n {\n name: \"sync-session-todos\",\n description:\n \"Synchronize todo list with AI session (replace existing) or add new todos\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n todos: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n todoId: {\n type: \"string\",\n description: \"Optional external todo ID for tracking\",\n },\n content: { type: \"string\" },\n status: {\n type: \"string\",\n enum: [\"pending\", \"in_progress\", \"completed\", \"cancelled\"],\n },\n estimatedMinutes: { type: \"number\" },\n },\n required: [\"content\", \"status\"],\n },\n },\n replaceAll: {\n type: \"boolean\",\n default: true,\n description:\n \"If true, replace all existing todos. If false, add new todos to existing ones\",\n },\n },\n required: [\"aiSessionId\", \"todos\"],\n },\n },\n {\n name: \"add-follow-up-todos\",\n description:\n \"Add new todos from follow-up (without replacing existing ones)\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n newTodos: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n content: { type: \"string\" },\n status: {\n type: \"string\",\n enum: [\"pending\", \"in_progress\"],\n default: \"pending\",\n },\n estimatedMinutes: { type: \"number\" },\n addedInFollowUp: { type: \"boolean\", default: true },\n },\n required: [\"content\"],\n },\n },\n followUpReason: {\n type: \"string\",\n description: \"Why were these todos added in follow-up\",\n },\n },\n required: [\"aiSessionId\", \"newTodos\"],\n },\n },\n {\n name: \"update-session-status\",\n description: \"Update AI session status and completion info\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n status: {\n type: \"string\",\n enum: [\"started\", \"in_progress\", \"paused\", \"completed\", \"failed\"],\n },\n actualTimeMinutes: { type: \"number\" },\n completionNotes: { type: \"string\" },\n },\n required: [\"aiSessionId\", \"status\"],\n },\n },\n {\n name: \"get-completion-context\",\n description:\n \"Get all context needed for Cursor AI to generate customer response\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n includeFollowUps: { type: \"boolean\", default: true },\n includeTimeMetrics: { type: \"boolean\", default: true },\n includeTodos: { type: \"boolean\", default: true },\n },\n required: [\"aiSessionId\"],\n },\n },\n {\n name: \"save-customer-response\",\n description: \"Save customer response generated by Cursor AI\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n customerResponse: {\n type: \"string\",\n description: \"Customer response generated by Cursor AI\",\n },\n responseType: {\n type: \"string\",\n enum: [\"completion\", \"progress_update\", \"needs_clarification\"],\n default: \"completion\",\n },\n },\n required: [\"aiSessionId\", \"customerResponse\"],\n },\n },\n {\n name: \"complete-ai-session\",\n description:\n \"Complete AI session with work summary - time calculated automatically\",\n inputSchema: {\n type: \"object\",\n properties: {\n aiSessionId: { type: \"string\" },\n workCompleted: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"List of completed tasks/todos in English\",\n },\n technicalSummary: {\n type: \"string\",\n description: \"Technical summary of work done in English\",\n },\n invoiceDescription: {\n type: \"string\",\n description:\n \"Short invoice-friendly description in the language of the ticket (2-3 sentences max, suitable for billing)\",\n },\n efficiencyNotes: { type: \"string\" },\n },\n required: [\"aiSessionId\", \"workCompleted\"],\n },\n },\n {\n name: \"log-hours\",\n description:\n \"Analyze current chat conversation and log hours as draft tracker entry. AI analyzes chat context to estimate hours as a senior developer would (without AI assistance). Cursor AI matches workspace name to correct project from list (optional).\",\n inputSchema: {\n type: \"object\",\n properties: {\n projectId: {\n type: \"string\",\n description:\n \"Project ID (UUID) - Optional. Cursor AI should call get-projects first to try matching workspace name. If no clear match, omit this field.\",\n },\n ticketId: {\n type: \"string\",\n description:\n \"Ticket ID (UUID) - Optional. Cursor AI should call get-tickets (filtered by project) to try matching chat context to an open ticket. Only include if a clear match is found.\",\n },\n aiSessionId: {\n type: \"string\",\n description:\n \"AI Session ID - Optional. If a ticket has an active AI dev session, include this ID to link the hours to that session.\",\n },\n workDescription: {\n type: \"string\",\n description:\n \"Short description of the work done (for the tracker entry)\",\n },\n estimatedHours: {\n type: \"number\",\n description:\n \"AI-estimated hours as senior developer would spend WITHOUT AI (e.g., 2.5 for 2.5 hours)\",\n },\n chatContextSummary: {\n type: \"string\",\n description:\n \"Brief summary of chat context for internal logging (optional)\",\n },\n },\n required: [\"workDescription\", \"estimatedHours\"],\n },\n },\n {\n name: \"get-github-file\",\n description:\n \"Get the contents of a specific file from a GitHub repository. Use this after finding relevant files to read their full content.\",\n inputSchema: {\n type: \"object\",\n properties: {\n projectId: { type: \"string\", description: \"Project ID (UUID)\" },\n filePath: {\n type: \"string\",\n description:\n 'Full path to the file in the repository (e.g., \"src/components/Button.tsx\")',\n },\n ref: {\n type: \"string\",\n description:\n \"Optional: Git reference (branch, tag, or commit SHA). Defaults to repository default branch.\",\n },\n },\n required: [\"projectId\", \"filePath\"],\n },\n },\n {\n name: \"list-github-directory\",\n description:\n \"List files and directories in a GitHub repository directory. Use this to explore repository structure.\",\n inputSchema: {\n type: \"object\",\n properties: {\n projectId: { type: \"string\", description: \"Project ID (UUID)\" },\n directoryPath: {\n type: \"string\",\n description:\n 'Path to directory (e.g., \"src/components\"). Use empty string or \"/\" for root directory.',\n },\n ref: {\n type: \"string\",\n description:\n \"Optional: Git reference (branch, tag, or commit SHA). Defaults to repository default branch.\",\n },\n },\n required: [\"projectId\", \"directoryPath\"],\n },\n },\n];\n\nconst RESOURCES = [\n {\n uri: \"tickets://recent\",\n name: \"Recent Tickets\",\n description: \"Most recently created tickets\",\n mimeType: \"application/json\",\n },\n {\n uri: \"customers://all\",\n name: \"All Customers\",\n description: \"Complete customer directory\",\n mimeType: \"application/json\",\n },\n {\n uri: \"projects://active\",\n name: \"Active Projects\",\n description: \"Currently active projects\",\n mimeType: \"application/json\",\n },\n];\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));\nserver.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: RESOURCES,\n}));\n\n// ---------------------------------------------------------------------------\n// Tool dispatch\n// ---------------------------------------------------------------------------\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (!authContext) {\n return {\n content: [\n {\n type: \"text\",\n text: \"Error: Not authenticated. API key validation failed.\",\n },\n ],\n };\n }\n\n const { name, arguments: args } = request.params;\n console.error(`🛠️ Executing tool: ${name} for team ${authContext.teamId}`);\n\n try {\n switch (name) {\n case \"get-tickets\":\n return await handleGetTickets(asToolArgs<GetTicketsArgs>(args));\n case \"get-ticket-by-id\":\n return await handleGetTicketById(asToolArgs<GetTicketByIdArgs>(args));\n case \"create-ticket\":\n return await handleCreateTicket(asToolArgs<CreateTicketArgs>(args));\n case \"get-customers\":\n return await handleGetCustomers(asToolArgs<GetCustomersArgs>(args));\n case \"create-customer\":\n return await handleCreateCustomer(asToolArgs<CreateCustomerArgs>(args));\n case \"get-projects\":\n return await handleGetProjects(asToolArgs<GetProjectsArgs>(args));\n case \"create-project\":\n return await handleCreateProject(asToolArgs<CreateProjectArgs>(args));\n case \"start-ai-session-smart\":\n return await handleStartAiSession(\n asToolArgs<StartAiSessionArgs>(args),\n );\n case \"track-manual-follow-up\":\n return await handleTrackManualFollowUp(\n asToolArgs<TrackManualFollowUpArgs>(args),\n );\n case \"get-session-context\":\n return await handleGetSessionContext(\n asToolArgs<GetSessionContextArgs>(args),\n );\n case \"sync-session-todos\":\n return await handleSyncSessionTodos(\n asToolArgs<SyncSessionTodosArgs>(args),\n );\n case \"add-follow-up-todos\":\n return await handleAddFollowUpTodos(\n asToolArgs<AddFollowUpTodosArgs>(args),\n );\n case \"update-session-status\":\n return await handleUpdateSessionStatus(\n asToolArgs<UpdateSessionStatusArgs>(args),\n );\n case \"get-completion-context\":\n return await handleGetCompletionContext(\n asToolArgs<GetCompletionContextArgs>(args),\n );\n case \"save-customer-response\":\n return await handleSaveCustomerResponse(\n asToolArgs<SaveCustomerResponseArgs>(args),\n );\n case \"complete-ai-session\":\n return await handleCompleteAiSession(\n asToolArgs<CompleteAiSessionArgs>(args),\n );\n case \"log-hours\":\n return await handleLogHours(asToolArgs<LogHoursArgs>(args));\n case \"get-github-file\":\n return await handleGetGithubFile(asToolArgs<GetGithubFileArgs>(args));\n case \"list-github-directory\":\n return await handleListGithubDirectory(\n asToolArgs<ListGithubDirectoryArgs>(args),\n );\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error: unknown) {\n console.error(\"❌ Tool execution error:\", error);\n const message =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : JSON.stringify(error);\n return {\n content: [{ type: \"text\", text: `Error executing ${name}: ${message}` }],\n };\n }\n});\n\n// ---------------------------------------------------------------------------\n// Tool handlers\n// ---------------------------------------------------------------------------\n\nasync function handleGetTickets(input: GetTicketsArgs) {\n const ctx = authContext!;\n const { status, priority, projectId, customerId, q, pageSize = 20 } = input;\n\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n\n const accessPredicate = buildTicketAccessPredicate(\n teamIds,\n projectIds,\n customerIds,\n );\n\n const filters = [accessPredicate, eq(schema.tickets.isDeleted, false)];\n if (status) filters.push(eq(schema.tickets.status, status as never));\n if (priority) filters.push(eq(schema.tickets.priority, priority as never));\n if (projectId) filters.push(eq(schema.tickets.projectId, projectId));\n if (customerId) filters.push(eq(schema.tickets.customerId, customerId));\n if (q) {\n const pattern = `%${q}%`;\n filters.push(\n or(\n ilike(schema.tickets.ticketNumber, pattern),\n ilike(schema.tickets.title, pattern),\n ilike(schema.tickets.description, pattern),\n )!,\n );\n }\n\n const rows = await db\n .select({\n id: schema.tickets.id,\n ticketNumber: schema.tickets.ticketNumber,\n title: schema.tickets.title,\n description: schema.tickets.description,\n status: schema.tickets.status,\n priority: schema.tickets.priority,\n type: schema.tickets.type,\n createdAt: schema.tickets.createdAt,\n projectId: schema.tickets.projectId,\n customerId: schema.tickets.customerId,\n projectName: schema.projects.name,\n customerName: schema.customers.name,\n })\n .from(schema.tickets)\n .leftJoin(schema.projects, eq(schema.projects.id, schema.tickets.projectId))\n .leftJoin(\n schema.customers,\n eq(schema.customers.id, schema.tickets.customerId),\n )\n .where(and(...filters))\n .orderBy(desc(schema.tickets.createdAt))\n .limit(Math.min(pageSize, 100));\n\n return {\n content: [\n {\n type: \"text\",\n text: `Found ${rows.length} tickets:\\n\\n${\n rows\n .map(\n (t) =>\n `**${t.ticketNumber}**: ${t.title}\\n` +\n `Status: ${t.status} | Priority: ${t.priority}\\n` +\n `${t.projectName ? `Project: ${t.projectName}\\n` : \"\"}` +\n `${t.customerName ? `Customer: ${t.customerName}\\n` : \"\"}` +\n `Created: ${new Date(t.createdAt).toLocaleDateString()}\\n`,\n )\n .join(\"\\n\") || \"No tickets found.\"\n }`,\n },\n ],\n };\n}\n\nasync function handleGetTicketById(input: GetTicketByIdArgs) {\n const ctx = authContext!;\n const { id } = input;\n\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n\n const ticketRow = await db.query.tickets.findFirst({\n where: eq(schema.tickets.id, id),\n with: {\n project: { columns: { id: true, name: true } },\n customer: { columns: { id: true, name: true } },\n assignee: { columns: { id: true, fullName: true, email: true } },\n requester: { columns: { id: true, fullName: true, email: true } },\n },\n });\n\n if (!ticketRow) {\n throw new Error(`Ticket not found: ${id}`);\n }\n\n let hasAccess = false;\n if (teamIds.includes(ticketRow.teamId)) hasAccess = true;\n if (\n !hasAccess &&\n ticketRow.projectId &&\n projectIds.includes(ticketRow.projectId)\n )\n hasAccess = true;\n if (\n !hasAccess &&\n ticketRow.customerId &&\n customerIds.includes(ticketRow.customerId)\n )\n hasAccess = true;\n if (!hasAccess) {\n throw new Error(\n \"Access denied: You do not have permission to view this ticket\",\n );\n }\n\n const attachments = await db\n .select({\n id: schema.ticketAttachments.id,\n fileName: schema.ticketAttachments.fileName,\n fileSize: schema.ticketAttachments.fileSize,\n mimeType: schema.ticketAttachments.mimeType,\n storageKey: schema.ticketAttachments.storageKey,\n createdAt: schema.ticketAttachments.createdAt,\n uploaderId: schema.ticketAttachments.userId,\n uploaderName: schema.users.fullName,\n })\n .from(schema.ticketAttachments)\n .leftJoin(\n schema.users,\n eq(schema.users.id, schema.ticketAttachments.userId),\n )\n .where(eq(schema.ticketAttachments.ticketId, id))\n .orderBy(asc(schema.ticketAttachments.createdAt));\n\n const comments = await db\n .select({\n id: schema.ticketComments.id,\n content: schema.ticketComments.content,\n createdAt: schema.ticketComments.createdAt,\n userId: schema.ticketComments.userId,\n })\n .from(schema.ticketComments)\n .where(eq(schema.ticketComments.ticketId, id))\n .orderBy(asc(schema.ticketComments.createdAt));\n\n const commentUserIds = [\n ...new Set(\n comments.map((c) => c.userId).filter((v): v is string => Boolean(v)),\n ),\n ];\n const commentUserMap = new Map<string, { id: string; fullName: string | null }>();\n if (commentUserIds.length > 0) {\n const commentUsers = await db\n .select({ id: schema.users.id, fullName: schema.users.fullName })\n .from(schema.users)\n .where(inArray(schema.users.id, commentUserIds));\n commentUsers.forEach((u) => commentUserMap.set(u.id, u));\n }\n\n const commentIds = comments.map((c) => c.id);\n const commentAttachments =\n commentIds.length > 0\n ? await db\n .select({\n id: schema.ticketCommentAttachments.id,\n commentId: schema.ticketCommentAttachments.commentId,\n fileName: schema.ticketCommentAttachments.fileName,\n fileSize: schema.ticketCommentAttachments.fileSize,\n mimeType: schema.ticketCommentAttachments.mimeType,\n storageKey: schema.ticketCommentAttachments.storageKey,\n createdAt: schema.ticketCommentAttachments.createdAt,\n })\n .from(schema.ticketCommentAttachments)\n .where(\n inArray(schema.ticketCommentAttachments.commentId, commentIds),\n )\n : [];\n\n const content: Array<\n { type: \"text\"; text: string } | { type: \"image\"; data: string; mimeType: string }\n > = [\n {\n type: \"text\",\n text:\n `**Ticket Details:**\\n\\n` +\n `**${ticketRow.ticketNumber}**: ${ticketRow.title}\\n` +\n `Status: ${ticketRow.status}\\n` +\n `Priority: ${ticketRow.priority}\\n` +\n `Type: ${ticketRow.type}\\n` +\n `${ticketRow.description ? `Description: ${ticketRow.description}\\n` : \"\"}` +\n `${ticketRow.project?.name ? `Project: ${ticketRow.project.name}\\n` : \"\"}` +\n `${ticketRow.customer?.name ? `Customer: ${ticketRow.customer.name}\\n` : \"\"}` +\n `${ticketRow.assignee?.fullName ? `Assignee: ${ticketRow.assignee.fullName}\\n` : \"\"}` +\n `Requester: ${ticketRow.requester?.fullName || \"Unknown\"}\\n` +\n `Created: ${new Date(ticketRow.createdAt).toLocaleDateString()}\\n` +\n `${attachments.length > 0 ? `\\n📎 Attachments: ${attachments.length}\\n` : \"\"}` +\n `${comments.length > 0 ? `💬 Comments: ${comments.length}\\n` : \"\"}`,\n },\n ];\n\n if (attachments.length > 0) {\n console.error(`📎 Processing ${attachments.length} ticket attachments...`);\n for (const attachment of attachments) {\n if (isImageFile(attachment.mimeType)) {\n console.error(`🖼️ Downloading image: ${attachment.fileName}`);\n const base64 = await downloadImageAsBase64(attachment.storageKey);\n if (base64) {\n content.push({\n type: \"image\",\n data: base64,\n mimeType: attachment.mimeType,\n });\n content.push({\n type: \"text\",\n text: `\\n📸 **Image from ticket**: ${attachment.fileName} (${Math.round(\n attachment.fileSize / 1024,\n )}KB, uploaded by ${attachment.uploaderName || \"Unknown\"} on ${new Date(\n attachment.createdAt,\n ).toLocaleDateString()})\\n`,\n });\n }\n }\n }\n }\n\n if (commentAttachments.length > 0) {\n console.error(\n `📎 Processing ${commentAttachments.length} comment attachments...`,\n );\n for (const attachment of commentAttachments) {\n if (isImageFile(attachment.mimeType)) {\n console.error(\n `🖼️ Downloading comment image: ${attachment.fileName}`,\n );\n const base64 = await downloadImageAsBase64(attachment.storageKey);\n if (base64) {\n const comment = comments.find((c) => c.id === attachment.commentId);\n const author = comment?.userId\n ? commentUserMap.get(comment.userId)?.fullName\n : null;\n content.push({\n type: \"image\",\n data: base64,\n mimeType: attachment.mimeType,\n });\n content.push({\n type: \"text\",\n text:\n `\\n📸 **Image from comment** by ${author || \"Unknown\"} on ${new Date(\n attachment.createdAt,\n ).toLocaleDateString()}: ${attachment.fileName} (${Math.round(\n attachment.fileSize / 1024,\n )}KB)\\n` +\n (comment?.content\n ? `Comment text: \"${comment.content.substring(0, 100)}${\n comment.content.length > 100 ? \"...\" : \"\"\n }\"\\n`\n : \"\"),\n });\n }\n }\n }\n }\n\n console.error(\n `✅ Returning ticket with ${content.filter((c) => c.type === \"image\").length} images`,\n );\n\n return { content };\n}\n\nasync function handleCreateTicket(input: CreateTicketArgs) {\n const ctx = authContext!;\n const {\n title,\n description,\n status = \"open\",\n priority = \"medium\",\n type = \"task\",\n projectId,\n customerId,\n } = input;\n\n const year = new Date().getFullYear();\n let resolvedTeamId = ctx.teamId;\n let resolvedCustomerId = customerId;\n let projectAbbreviation = \"\";\n\n if (projectId) {\n const [project] = await db\n .select({\n name: schema.projects.name,\n teamId: schema.projects.teamId,\n customerId: schema.projects.customerId,\n })\n .from(schema.projects)\n .where(eq(schema.projects.id, projectId))\n .limit(1);\n\n if (project) {\n if (project.teamId) resolvedTeamId = project.teamId;\n if (!resolvedCustomerId && project.customerId) {\n resolvedCustomerId = project.customerId;\n }\n if (project.name) {\n const upper = project.name.toUpperCase().replace(/[^A-Z0-9\\s]/g, \"\");\n const words = upper.split(/\\s+/).filter(Boolean);\n if (words.length >= 2) {\n projectAbbreviation = words\n .slice(0, 2)\n .map((w) => w.substring(0, 3))\n .join(\"\")\n .substring(0, 5);\n } else if (words.length === 1 && words[0]) {\n projectAbbreviation = words[0].substring(0, 5);\n }\n }\n }\n }\n\n let ticketNumber: string;\n if (projectId && projectAbbreviation) {\n const pattern = `${year}-${projectAbbreviation}-%`;\n const [highest] = await db\n .select({ ticketNumber: schema.tickets.ticketNumber })\n .from(schema.tickets)\n .where(\n and(\n eq(schema.tickets.projectId, projectId),\n ilike(schema.tickets.ticketNumber, pattern),\n ),\n )\n .orderBy(desc(schema.tickets.ticketNumber))\n .limit(1);\n\n let nextSequence = 1;\n if (highest?.ticketNumber) {\n const parts = highest.ticketNumber.split(\"-\");\n if (parts.length === 3 && parts[2]) {\n const lastSeq = Number.parseInt(parts[2], 10);\n if (!Number.isNaN(lastSeq)) nextSequence = lastSeq + 1;\n }\n }\n ticketNumber = `${year}-${projectAbbreviation}-${String(nextSequence).padStart(3, \"0\")}`;\n } else {\n const [countRow] = await db\n .select({ n: sql<number>`count(*)::int` })\n .from(schema.tickets)\n .where(eq(schema.tickets.teamId, resolvedTeamId));\n const count = Number(countRow?.n ?? 0);\n ticketNumber = `${year}-${String(count + 1).padStart(3, \"0\")}`;\n }\n\n await db.insert(schema.tickets).values({\n teamId: resolvedTeamId,\n ticketNumber,\n title,\n description: description ?? null,\n status: status as never,\n priority: priority as never,\n type: type as never,\n projectId: projectId ?? null,\n customerId: resolvedCustomerId ?? null,\n requesterId: ctx.userId,\n });\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `✅ **Ticket Created Successfully!**\\n\\n` +\n `Ticket Number: **${ticketNumber}**\\n` +\n `Title: ${title}\\n` +\n `Status: ${status}\\n` +\n `Priority: ${priority}\\n` +\n `Type: ${type}\\n`,\n },\n ],\n };\n}\n\nasync function handleGetCustomers(input: GetCustomersArgs) {\n const ctx = authContext!;\n const { q, pageSize = 20 } = input;\n\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n if (customerIds.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No customers found or no access to any customers.\",\n },\n ],\n };\n }\n\n const filters = [inArray(schema.customers.id, customerIds)];\n if (q) {\n const pattern = `%${q}%`;\n filters.push(\n or(\n ilike(schema.customers.name, pattern),\n ilike(schema.customers.email, pattern),\n )!,\n );\n }\n\n const rows = await db\n .select({\n id: schema.customers.id,\n name: schema.customers.name,\n email: schema.customers.email,\n website: schema.customers.website,\n createdAt: schema.customers.createdAt,\n })\n .from(schema.customers)\n .where(and(...filters))\n .orderBy(asc(schema.customers.name))\n .limit(Math.min(pageSize, 100));\n\n return {\n content: [\n {\n type: \"text\",\n text: `Found ${rows.length} customers:\\n\\n${\n rows\n .map(\n (c) =>\n `**${c.name}**\\n` +\n `${c.email ? `Email: ${c.email}\\n` : \"\"}` +\n `${c.website ? `Website: ${c.website}\\n` : \"\"}` +\n `Created: ${new Date(c.createdAt).toLocaleDateString()}\\n`,\n )\n .join(\"\\n\") || \"No customers found.\"\n }`,\n },\n ],\n };\n}\n\nasync function handleCreateCustomer(input: CreateCustomerArgs) {\n const ctx = authContext!;\n const { name, email, website } = input;\n\n await db.insert(schema.customers).values({\n teamId: ctx.teamId,\n name,\n email: email ?? \"\",\n website: website ?? null,\n });\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `✅ **Customer Created Successfully!**\\n\\n` +\n `Name: ${name}\\n` +\n `${email ? `Email: ${email}\\n` : \"\"}` +\n `${website ? `Website: ${website}\\n` : \"\"}`,\n },\n ],\n };\n}\n\nasync function handleGetProjects(input: GetProjectsArgs) {\n const ctx = authContext!;\n const { customerId, q, pageSize = 20 } = input;\n\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n if (projectIds.length === 0) {\n return {\n content: [\n {\n type: \"text\",\n text: \"No projects found or no access to any projects.\",\n },\n ],\n };\n }\n\n const filters = [inArray(schema.projects.id, projectIds)];\n if (customerId) filters.push(eq(schema.projects.customerId, customerId));\n if (q) filters.push(ilike(schema.projects.name, `%${q}%`));\n\n const rows = await db\n .select({\n id: schema.projects.id,\n name: schema.projects.name,\n description: schema.projects.description,\n customerId: schema.projects.customerId,\n createdAt: schema.projects.createdAt,\n })\n .from(schema.projects)\n .where(and(...filters))\n .orderBy(asc(schema.projects.name))\n .limit(Math.min(pageSize, 100));\n\n return {\n content: [\n {\n type: \"text\",\n text: `Found ${rows.length} projects:\\n\\n${\n rows\n .map(\n (p) =>\n `**${p.name}** (ID: ${p.id})\\n` +\n `${p.description ? `Description: ${p.description}\\n` : \"\"}` +\n `Created: ${new Date(p.createdAt).toLocaleDateString()}\\n`,\n )\n .join(\"\\n\") || \"No projects found.\"\n }`,\n },\n ],\n };\n}\n\nasync function handleCreateProject(input: CreateProjectArgs) {\n const ctx = authContext!;\n const { name, description, customerId } = input;\n // NOTE: previous insert also set `status` and `user_id`, but\n // neither column exists on the current `projects` schema (status was\n // removed; ownership tracked elsewhere). We silently drop them.\n\n await db.insert(schema.projects).values({\n teamId: ctx.teamId,\n name,\n description: description ?? null,\n customerId: customerId ?? null,\n });\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `✅ **Project Created Successfully!**\\n\\n` +\n `Name: ${name}\\n` +\n `${description ? `Description: ${description}\\n` : \"\"}`,\n },\n ],\n };\n}\n\n// --------- AI session handlers ----------\n\nasync function handleStartAiSession(input: StartAiSessionArgs) {\n const ctx = authContext!;\n const {\n ticketId,\n cursorSessionId,\n totalEstimatedMinutes,\n complexityScore,\n } = input;\n\n if (!totalEstimatedMinutes) {\n throw new Error(\"totalEstimatedMinutes is required\");\n }\n\n const roundedMinutes = roundToNearest15Minutes(totalEstimatedMinutes);\n const sessionStartTime = new Date();\n\n const [sessionData] = await db\n .insert(schema.aiSessions)\n .values({\n ticketId,\n providerUserId: ctx.userId,\n teamId: ctx.teamId,\n cursorSessionId: cursorSessionId ?? null,\n aiTimeEstimateMinutes: roundedMinutes,\n complexityScore: complexityScore ?? null,\n status: \"in_progress\",\n })\n .returning({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n cursorSessionId: schema.aiSessions.cursorSessionId,\n createdAt: schema.aiSessions.createdAt,\n });\n\n if (!sessionData) {\n throw new Error(\"Failed to create AI session\");\n }\n\n const sessionId = `ai-sess-${sessionData.id.substring(0, 8)}`;\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `🚀 **AI Session Started!**\\n\\n` +\n `🆔 Session ID: **${sessionId}**\\n` +\n `🎫 Ticket: ${ticketId}\\n` +\n `⏱️ Estimated: ${roundedMinutes} min\\n` +\n `${complexityScore ? `🎯 Complexity: ${complexityScore}/10\\n` : \"\"}` +\n `📅 Started: ${sessionStartTime.toLocaleString()}\\n\\n` +\n `📝 Timetrack entry will be created when you complete the session.`,\n },\n ],\n };\n}\n\nasync function handleTrackManualFollowUp(input: TrackManualFollowUpArgs) {\n const ctx = authContext!;\n const {\n aiSessionId,\n originalPrompt,\n aiResponse,\n developerFollowUp,\n followUpReason,\n outcome = \"success\",\n estimatedMinutes,\n workDescription,\n } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) {\n throw new Error(`Session not found: ${aiSessionId}`);\n }\n\n const [session] = await db\n .select({\n id: schema.aiSessions.id,\n status: schema.aiSessions.status,\n createdAt: schema.aiSessions.createdAt,\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\n })\n .from(schema.aiSessions)\n .where(eq(schema.aiSessions.id, fullSessionId))\n .limit(1);\n if (!session) throw new Error(`Session not found: ${aiSessionId}`);\n\n const followUpTime = new Date();\n const oldEstimate = session.aiTimeEstimateMinutes ?? 60;\n const roundedFollowUpMinutes = roundToNearest15Minutes(\n estimatedMinutes || 0,\n );\n const newEstimate = oldEstimate + roundedFollowUpMinutes;\n\n await db\n .update(schema.aiSessions)\n .set({\n status: \"in_progress\",\n aiTimeEstimateMinutes: newEstimate,\n })\n .where(eq(schema.aiSessions.id, session.id));\n\n await db.insert(schema.manualFollowUps).values({\n aiSessionId: session.id,\n developerId: ctx.userId,\n teamId: ctx.teamId,\n originalPrompt,\n aiResponse,\n followUpPrompt: developerFollowUp,\n followUpReason,\n outcome,\n timeSpentMinutes: null,\n resolvedAt: outcome === \"success\" ? new Date().toISOString() : null,\n });\n\n await db.insert(schema.aiTimeLogs).values({\n aiSessionId: session.id,\n activityType: \"debugging\",\n description: `Follow-up: ${followUpReason.replace(\"_\", \" \")} - ${outcome}`,\n durationSeconds: 0,\n productivityScore:\n outcome === \"success\" ? 9 : outcome === \"partial_success\" ? 6 : 4,\n startedAt: followUpTime.toISOString(),\n });\n\n const sessionStartTime = new Date(session.createdAt);\n const totalMinutesElapsed = Math.round(\n (followUpTime.getTime() - sessionStartTime.getTime()) / 60000,\n );\n const currentEfficiency =\n totalMinutesElapsed > 0 ? totalMinutesElapsed / newEstimate : 1;\n\n await db\n .update(schema.aiSessions)\n .set({\n efficiencyScore: currentEfficiency.toFixed(2),\n actualTimeMinutes: totalMinutesElapsed,\n })\n .where(eq(schema.aiSessions.id, session.id));\n\n const existingEntries = await db\n .select({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n title: schema.agendaEvents.title,\n description: schema.agendaEvents.description,\n startTime: schema.agendaEvents.startTime,\n })\n .from(schema.agendaEvents)\n .where(\n and(\n eq(schema.agendaEvents.aiSessionId, session.id),\n eq(schema.agendaEvents.status, \"draft\"),\n ),\n )\n .orderBy(desc(schema.agendaEvents.createdAt));\n\n let trackerAction = \"\";\n let trackerDetails = \"\";\n\n let existingEntry = existingEntries[0] ?? null;\n\n if (existingEntries.length > 1) {\n const totalExistingDuration = existingEntries.reduce(\n (sum, entry) => sum + (entry.trackedDuration ?? 0),\n 0,\n );\n const duplicateIds = existingEntries.slice(1).map((e) => e.id);\n await db\n .delete(schema.agendaEvents)\n .where(inArray(schema.agendaEvents.id, duplicateIds));\n\n if (existingEntry && totalExistingDuration > (existingEntry.trackedDuration ?? 0)) {\n await db\n .update(schema.agendaEvents)\n .set({ trackedDuration: totalExistingDuration })\n .where(eq(schema.agendaEvents.id, existingEntry.id));\n existingEntry = { ...existingEntry, trackedDuration: totalExistingDuration };\n }\n trackerAction = `Consolidated ${existingEntries.length} duplicate entries`;\n }\n\n if (existingEntry) {\n const newDuration =\n (existingEntry.trackedDuration ?? 0) + roundedFollowUpMinutes * 60;\n\n await db\n .update(schema.agendaEvents)\n .set({\n trackedDuration: newDuration,\n endTime: followUpTime.toISOString(),\n title: workDescription,\n description: workDescription,\n })\n .where(eq(schema.agendaEvents.id, existingEntry.id));\n\n trackerAction = trackerAction || \"Updated existing tracker\";\n trackerDetails =\n ` • Total tracked time: ${Math.round(newDuration / 60)} minutes (+${roundedFollowUpMinutes} min)\\n` +\n ` • Description: ${workDescription}\\n`;\n } else {\n const durationSeconds = roundedFollowUpMinutes * 60;\n const startTime = new Date(\n followUpTime.getTime() - durationSeconds * 1000,\n );\n\n await db.insert(schema.agendaEvents).values({\n teamId: ctx.teamId,\n userId: ctx.userId,\n aiSessionId: session.id,\n title: workDescription,\n description: workDescription,\n startTime: startTime.toISOString(),\n endTime: followUpTime.toISOString(),\n type: \"work\" as never,\n status: \"draft\" as never,\n allDay: false,\n isTracked: true,\n trackedDuration: durationSeconds,\n });\n\n trackerAction = \"Created new tracker\";\n trackerDetails =\n ` • Tracked time: ${roundedFollowUpMinutes} minutes\\n` +\n ` • Description: ${workDescription}\\n`;\n }\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `🔄 **Follow-up Tracked & Session Restarted!**\\n\\n` +\n `🆔 Session: ${aiSessionId} (back to active)\\n` +\n `🔍 Reason: ${followUpReason.replace(\"_\", \" \")}\\n` +\n `✅ Outcome: ${outcome}\\n` +\n `\\n📊 **Time Estimate Updated:**\\n` +\n ` • Old estimate: ${oldEstimate} minutes\\n` +\n ` • Follow-up estimate: +${roundedFollowUpMinutes} minutes (rounded to 15min)\\n` +\n ` • New estimate: ${newEstimate} minutes\\n` +\n `\\n📈 **Current Progress:**\\n` +\n ` • Total time elapsed: ${totalMinutesElapsed} minutes\\n` +\n ` • Efficiency: ${currentEfficiency < 1 ? \"🚀 \" : currentEfficiency > 1.5 ? \"⚠️ \" : \"⏱️ \"}${(currentEfficiency * 100).toFixed(0)}%\\n` +\n `\\n⏱️ **Tracker Entry: ${trackerAction}**\\n` +\n trackerDetails +\n `\\n⚡ **Time tracking resumed** - continue with confidence!`,\n },\n ],\n };\n}\n\nasync function handleGetSessionContext(input: GetSessionContextArgs) {\n const ctx = authContext!;\n const {\n aiSessionId,\n includeTicketData = true,\n includeTodoProgress = true,\n includeFollowUpHistory = false,\n } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n const [session] = await db\n .select({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n status: schema.aiSessions.status,\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\n actualTimeMinutes: schema.aiSessions.actualTimeMinutes,\n complexityScore: schema.aiSessions.complexityScore,\n createdAt: schema.aiSessions.createdAt,\n cursorSessionId: schema.aiSessions.cursorSessionId,\n })\n .from(schema.aiSessions)\n .where(eq(schema.aiSessions.id, fullSessionId))\n .limit(1);\n if (!session) throw new Error(`Session not found: ${aiSessionId}`);\n\n const context: Record<string, unknown> = {\n sessionId: aiSessionId,\n status: session.status,\n timeEstimate: session.aiTimeEstimateMinutes,\n actualTime: session.actualTimeMinutes,\n complexity: session.complexityScore,\n createdAt: session.createdAt,\n };\n\n if (includeTicketData) {\n const [ticket] = await db\n .select({\n id: schema.tickets.id,\n ticketNumber: schema.tickets.ticketNumber,\n title: schema.tickets.title,\n description: schema.tickets.description,\n status: schema.tickets.status,\n priority: schema.tickets.priority,\n type: schema.tickets.type,\n })\n .from(schema.tickets)\n .where(eq(schema.tickets.id, session.ticketId))\n .limit(1);\n context.ticketData = ticket ?? null;\n }\n\n if (includeTodoProgress) {\n const todos = await db\n .select({\n id: schema.aiTodos.id,\n content: schema.aiTodos.content,\n status: schema.aiTodos.status,\n estimatedMinutes: schema.aiTodos.estimatedMinutes,\n actualMinutes: schema.aiTodos.actualMinutes,\n })\n .from(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, session.id))\n .orderBy(asc(schema.aiTodos.sequenceOrder));\n\n context.todos = todos;\n context.todoProgress = {\n total: todos.length,\n completed: todos.filter((t) => t.status === \"completed\").length,\n inProgress: todos.filter((t) => t.status === \"in_progress\").length,\n };\n }\n\n if (includeFollowUpHistory) {\n const followUps = await db\n .select({\n followUpReason: schema.manualFollowUps.followUpReason,\n outcome: schema.manualFollowUps.outcome,\n timeSpentMinutes: schema.manualFollowUps.timeSpentMinutes,\n createdAt: schema.manualFollowUps.createdAt,\n })\n .from(schema.manualFollowUps)\n .where(eq(schema.manualFollowUps.aiSessionId, session.id))\n .orderBy(asc(schema.manualFollowUps.createdAt));\n context.followUpHistory = followUps;\n }\n\n const ticketData = context.ticketData as\n | { ticketNumber?: string; title?: string }\n | null\n | undefined;\n const todoProgress = context.todoProgress as\n | { total: number; completed: number; inProgress: number }\n | undefined;\n const followUpHistory = context.followUpHistory as unknown[] | undefined;\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `🎯 **Session Context Retrieved**\\n\\n` +\n `Session: ${aiSessionId}\\n` +\n `Status: ${session.status}\\n` +\n `${ticketData ? `Ticket: ${ticketData.ticketNumber} - ${ticketData.title}\\n` : \"\"}` +\n `${todoProgress ? `Todo Progress: ${todoProgress.completed}/${todoProgress.total} completed\\n` : \"\"}` +\n `${followUpHistory ? `Follow-ups: ${followUpHistory.length}\\n` : \"\"}` +\n `\\n📋 Full context preserved for seamless continuation!`,\n },\n ],\n };\n}\n\nasync function handleSyncSessionTodos(input: SyncSessionTodosArgs) {\n const ctx = authContext!;\n const { aiSessionId, todos, replaceAll = true } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n if (replaceAll) {\n await db\n .delete(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId));\n }\n\n if (todos && todos.length > 0) {\n let startSequence = 0;\n if (!replaceAll) {\n const [maxTodo] = await db\n .select({ sequenceOrder: schema.aiTodos.sequenceOrder })\n .from(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId))\n .orderBy(desc(schema.aiTodos.sequenceOrder))\n .limit(1);\n startSequence = (maxTodo?.sequenceOrder ?? 0) + 1;\n }\n\n await db.insert(schema.aiTodos).values(\n todos.map((todo, index) => ({\n aiSessionId: fullSessionId,\n content: todo.content,\n status: todo.status,\n cursorTodoId: todo.todoId ?? null,\n estimatedMinutes: todo.estimatedMinutes ?? null,\n sequenceOrder: startSequence + index,\n })),\n );\n }\n\n let phaseTransition: string | null = null;\n\n const currentTodos = await db\n .select({ status: schema.aiTodos.status })\n .from(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId));\n\n if (currentTodos.length > 0) {\n const hasInProgress = currentTodos.some((t) => t.status === \"in_progress\");\n const allCompleted = currentTodos.every((t) => t.status === \"completed\");\n\n const [currentPhase] = await db\n .select({\n activityType: schema.aiTimeLogs.activityType,\n status: schema.aiTimeLogs.status,\n })\n .from(schema.aiTimeLogs)\n .where(\n and(\n eq(schema.aiTimeLogs.aiSessionId, fullSessionId),\n eq(schema.aiTimeLogs.status, \"in_progress\"),\n ),\n )\n .limit(1);\n\n if (hasInProgress && currentPhase?.activityType === \"analysis\") {\n await transitionToNextPhase(fullSessionId, \"analysis\");\n phaseTransition =\n \"Analysis completed → Next phase started (Investigation/Development)\";\n }\n\n if (\n hasInProgress &&\n currentPhase?.activityType === \"bug_investigation\"\n ) {\n const completedCount = currentTodos.filter(\n (t) => t.status === \"completed\",\n ).length;\n if (completedCount > 0) {\n await transitionToNextPhase(fullSessionId, \"bug_investigation\");\n phaseTransition =\n \"Investigation completed → Development phase started\";\n }\n }\n\n if (allCompleted && currentPhase?.activityType === \"development\") {\n await transitionToNextPhase(fullSessionId, \"development\");\n phaseTransition =\n \"Development completed → Communication phase started\";\n }\n }\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `✅ **Todos ${replaceAll ? \"Synced\" : \"Added\"} Successfully!**\\n\\n` +\n `Session: ${aiSessionId}\\n` +\n `${replaceAll ? \"Synced\" : \"Added\"} ${todos?.length || 0} todos\\n` +\n `${replaceAll ? \"\" : \"➕ Added to existing todo list\\n\"}` +\n `${phaseTransition ? `🔄 Phase Transition: ${phaseTransition}\\n` : \"\"}` +\n `\\n📝 Todo list updated and tracked for progress monitoring!`,\n },\n ],\n };\n}\n\nasync function handleAddFollowUpTodos(input: AddFollowUpTodosArgs) {\n const ctx = authContext!;\n const { aiSessionId, newTodos, followUpReason } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n if (newTodos && newTodos.length > 0) {\n const [maxTodo] = await db\n .select({ sequenceOrder: schema.aiTodos.sequenceOrder })\n .from(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, fullSessionId))\n .orderBy(desc(schema.aiTodos.sequenceOrder))\n .limit(1);\n const startSequence = (maxTodo?.sequenceOrder ?? 0) + 1;\n\n await db.insert(schema.aiTodos).values(\n newTodos.map((todo, index) => ({\n aiSessionId: fullSessionId,\n content: `[Follow-up] ${todo.content}`,\n status: todo.status ?? \"pending\",\n estimatedMinutes: todo.estimatedMinutes ?? null,\n sequenceOrder: startSequence + index,\n })),\n );\n }\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `✅ **Follow-up Todos Added Successfully!**\\n\\n` +\n `Session: ${aiSessionId}\\n` +\n `Added ${newTodos?.length || 0} new todos from follow-up\\n` +\n `${followUpReason ? `Reason: ${followUpReason}\\n` : \"\"}` +\n `\\n📝 New tasks identified and added to existing workflow!`,\n },\n ],\n };\n}\n\nasync function handleUpdateSessionStatus(input: UpdateSessionStatusArgs) {\n const ctx = authContext!;\n const { aiSessionId, status, actualTimeMinutes, completionNotes } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n await db\n .update(schema.aiSessions)\n .set({\n status,\n actualTimeMinutes: actualTimeMinutes ?? null,\n completedAt: status === \"completed\" ? new Date().toISOString() : null,\n })\n .where(eq(schema.aiSessions.id, fullSessionId));\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `🎯 **Session Status Updated!**\\n\\n` +\n `Session: ${aiSessionId}\\n` +\n `Status: ${status}\\n` +\n `${actualTimeMinutes ? `Actual Time: ${actualTimeMinutes} minutes\\n` : \"\"}` +\n `${status === \"completed\" ? `✅ Session completed successfully!\\n` : \"\"}` +\n `${completionNotes ? `Notes: ${completionNotes}\\n` : \"\"}`,\n },\n ],\n };\n}\n\nasync function handleGetCompletionContext(input: GetCompletionContextArgs) {\n const ctx = authContext!;\n const {\n aiSessionId,\n includeFollowUps = true,\n includeTimeMetrics = true,\n includeTodos = true,\n } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n const [session] = await db\n .select({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\n actualTimeMinutes: schema.aiSessions.actualTimeMinutes,\n efficiencyScore: schema.aiSessions.efficiencyScore,\n createdAt: schema.aiSessions.createdAt,\n completedAt: schema.aiSessions.completedAt,\n status: schema.aiSessions.status,\n complexityScore: schema.aiSessions.complexityScore,\n })\n .from(schema.aiSessions)\n .where(eq(schema.aiSessions.id, fullSessionId))\n .limit(1);\n if (!session) throw new Error(`Session not found: ${aiSessionId}`);\n\n const [ticket] = await db\n .select({\n ticketNumber: schema.tickets.ticketNumber,\n title: schema.tickets.title,\n description: schema.tickets.description,\n type: schema.tickets.type,\n priority: schema.tickets.priority,\n })\n .from(schema.tickets)\n .where(eq(schema.tickets.id, session.ticketId))\n .limit(1);\n if (!ticket) throw new Error(\"Ticket not found for session\");\n\n const contextData: Record<string, unknown> = {\n session: {\n id: aiSessionId,\n status: session.status,\n complexity: session.complexityScore,\n createdAt: session.createdAt,\n completedAt: session.completedAt,\n },\n ticket: {\n number: ticket.ticketNumber,\n title: ticket.title,\n description: ticket.description,\n type: ticket.type,\n priority: ticket.priority,\n },\n };\n\n if (includeTimeMetrics) {\n const timeSaved =\n session.aiTimeEstimateMinutes && session.actualTimeMinutes\n ? Math.max(\n 0,\n session.aiTimeEstimateMinutes - session.actualTimeMinutes,\n )\n : null;\n\n contextData.timeMetrics = {\n estimatedMinutes: session.aiTimeEstimateMinutes,\n actualMinutes: session.actualTimeMinutes,\n timeSaved,\n efficiency: session.efficiencyScore,\n sessionDuration:\n session.completedAt && session.createdAt\n ? Math.round(\n (new Date(session.completedAt).getTime() -\n new Date(session.createdAt).getTime()) /\n 60000,\n )\n : null,\n };\n }\n\n if (includeTodos) {\n const todos = await db\n .select({\n content: schema.aiTodos.content,\n status: schema.aiTodos.status,\n estimatedMinutes: schema.aiTodos.estimatedMinutes,\n actualMinutes: schema.aiTodos.actualMinutes,\n completedAt: schema.aiTodos.completedAt,\n })\n .from(schema.aiTodos)\n .where(eq(schema.aiTodos.aiSessionId, session.id))\n .orderBy(asc(schema.aiTodos.createdAt));\n contextData.todos = todos;\n }\n\n if (includeFollowUps) {\n const followUps = await db\n .select({\n followUpReason: schema.manualFollowUps.followUpReason,\n outcome: schema.manualFollowUps.outcome,\n timeSpentMinutes: schema.manualFollowUps.timeSpentMinutes,\n createdAt: schema.manualFollowUps.createdAt,\n })\n .from(schema.manualFollowUps)\n .where(eq(schema.manualFollowUps.aiSessionId, session.id))\n .orderBy(asc(schema.manualFollowUps.createdAt));\n contextData.followUps = followUps;\n }\n\n const todosLen = (contextData.todos as Array<{ status: string }> | undefined) ?? [];\n const completedTodos = todosLen.filter((t) => t.status === \"completed\").length;\n const followUpsLen =\n (contextData.followUps as unknown[] | undefined)?.length ?? 0;\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `📋 **Completion Context Retrieved!**\\n\\n` +\n `🎫 **Ticket:** ${ticket.ticketNumber} - ${ticket.title}\\n` +\n `🆔 **Session:** ${aiSessionId} (${session.status})\\n` +\n `⏱️ **Time:** ${session.actualTimeMinutes || \"N/A\"}/${session.aiTimeEstimateMinutes || \"N/A\"} minutes\\n` +\n `📋 **Todos:** ${completedTodos}/${todosLen.length} completed\\n` +\n `🔄 **Follow-ups:** ${followUpsLen}\\n\\n` +\n `✅ **Full context ready for Cursor AI to generate customer response!**\\n\\n` +\n `**Context Data:**\\n\\`\\`\\`json\\n${JSON.stringify(contextData, null, 2)}\\`\\`\\``,\n },\n ],\n };\n}\n\nasync function handleSaveCustomerResponse(input: SaveCustomerResponseArgs) {\n const ctx = authContext!;\n const { aiSessionId, customerResponse, responseType = \"completion\" } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n await db.insert(schema.aiResponses).values({\n aiSessionId: fullSessionId,\n responseType,\n content: customerResponse,\n isReadyForCustomer: true,\n providerApproved: false,\n });\n\n return {\n content: [\n {\n type: \"text\",\n text:\n `💾 **Customer Response Saved!**\\n\\n` +\n `🆔 Session: ${aiSessionId}\\n` +\n `📝 Response Type: ${responseType}\\n` +\n `📄 Length: ${customerResponse.length} characters\\n\\n` +\n `✅ **Response ready for provider approval**\\n` +\n `🔍 Provider can review in AI tab before sending to customer\\n\\n` +\n `**Preview:**\\n\\`\\`\\`\\n${customerResponse.substring(0, 200)}${customerResponse.length > 200 ? \"...\" : \"\"}\\`\\`\\``,\n },\n ],\n };\n}\n\nasync function handleCompleteAiSession(input: CompleteAiSessionArgs) {\n const ctx = authContext!;\n const {\n aiSessionId,\n workCompleted,\n technicalSummary,\n invoiceDescription,\n efficiencyNotes,\n } = input;\n\n const prefix = aiSessionId.replace(\"ai-sess-\", \"\");\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const fullSessionId = await resolveAiSessionId(prefix, teamIds);\n if (!fullSessionId) throw new Error(`Session not found: ${aiSessionId}`);\n\n const [existingSession] = await db\n .select({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\n createdAt: schema.aiSessions.createdAt,\n })\n .from(schema.aiSessions)\n .where(eq(schema.aiSessions.id, fullSessionId))\n .limit(1);\n if (!existingSession) {\n throw new Error(`Session not found: ${aiSessionId}`);\n }\n\n const completionTime = new Date();\n const sessionStartTime = new Date(existingSession.createdAt);\n const timeSpentMinutes = Math.round(\n (completionTime.getTime() - sessionStartTime.getTime()) / 60000,\n );\n\n const [session] = await db\n .update(schema.aiSessions)\n .set({\n status: \"completed\",\n actualTimeMinutes: timeSpentMinutes,\n completedAt: completionTime.toISOString(),\n efficiencyScore: null,\n })\n .where(eq(schema.aiSessions.id, existingSession.id))\n .returning({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n aiTimeEstimateMinutes: schema.aiSessions.aiTimeEstimateMinutes,\n createdAt: schema.aiSessions.createdAt,\n });\n if (!session) throw new Error(`Failed to update session: ${aiSessionId}`);\n\n const efficiencyScore = session.aiTimeEstimateMinutes\n ? timeSpentMinutes / session.aiTimeEstimateMinutes\n : 1.0;\n\n await db\n .update(schema.aiSessions)\n .set({ efficiencyScore: efficiencyScore.toFixed(2) })\n .where(eq(schema.aiSessions.id, session.id));\n\n const activePhases = await db\n .select()\n .from(schema.aiTimeLogs)\n .where(\n and(\n eq(schema.aiTimeLogs.aiSessionId, existingSession.id),\n eq(schema.aiTimeLogs.status, \"in_progress\"),\n ),\n );\n\n for (const phase of activePhases) {\n const duration = Math.round(\n (completionTime.getTime() - new Date(phase.startedAt).getTime()) / 1000,\n );\n await db\n .update(schema.aiTimeLogs)\n .set({\n endedAt: completionTime.toISOString(),\n durationSeconds: duration,\n status: \"completed\",\n })\n .where(eq(schema.aiTimeLogs.id, phase.id));\n }\n\n await db\n .update(schema.aiTimeLogs)\n .set({ status: \"skipped\" })\n .where(\n and(\n eq(schema.aiTimeLogs.aiSessionId, existingSession.id),\n eq(schema.aiTimeLogs.status, \"pending\"),\n eq(schema.aiTimeLogs.estimatedDurationSeconds, 0),\n ),\n );\n\n const sessionDuration = Math.round(\n (completionTime.getTime() - new Date(session.createdAt).getTime()) / 60000,\n );\n\n const workSummary = `Completed ${workCompleted.length} tasks including: ${workCompleted\n .slice(0, 3)\n .join(\", \")}${workCompleted.length > 3 ? \" and more\" : \"\"}.`;\n\n const [ticketInfo] = await db\n .select({\n ticketNumber: schema.tickets.ticketNumber,\n title: schema.tickets.title,\n projectId: schema.tickets.projectId,\n })\n .from(schema.tickets)\n .where(eq(schema.tickets.id, session.ticketId))\n .limit(1);\n\n let completionDescription: string;\n if (invoiceDescription) {\n completionDescription = `${ticketInfo?.ticketNumber || \"Ticket\"}: ${invoiceDescription}`;\n } else {\n const workDescription = workCompleted\n .map((task, index) => `${index + 1}. ${task}`)\n .join(\"\\n\");\n completionDescription = `${ticketInfo?.ticketNumber || \"Ticket\"}: ${technicalSummary || workSummary}\\n\\nCompleted work:\\n${workDescription}`;\n }\n\n const estimatedMinutes =\n session.aiTimeEstimateMinutes ?? timeSpentMinutes;\n const sessionStart = new Date(session.createdAt);\n const estimatedEnd = new Date(\n sessionStart.getTime() + estimatedMinutes * 60000,\n );\n\n const existingAgendaEntries = await db\n .select({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n })\n .from(schema.agendaEvents)\n .where(\n and(\n eq(schema.agendaEvents.aiSessionId, session.id),\n eq(schema.agendaEvents.status, \"draft\"),\n ),\n )\n .orderBy(desc(schema.agendaEvents.createdAt));\n\n let agendaEventId: string | null = null;\n let wasUpdated = false;\n let consolidatedCount = 0;\n\n const existingAgendaEntry = existingAgendaEntries[0] ?? null;\n\n if (existingAgendaEntries.length > 1) {\n const duplicateIds = existingAgendaEntries.slice(1).map((e) => e.id);\n await db\n .delete(schema.agendaEvents)\n .where(inArray(schema.agendaEvents.id, duplicateIds));\n consolidatedCount = existingAgendaEntries.length - 1;\n }\n\n try {\n if (existingAgendaEntry) {\n const [updated] = await db\n .update(schema.agendaEvents)\n .set({\n title: ticketInfo?.title || \"Development Work\",\n description: completionDescription,\n endTime: estimatedEnd.toISOString(),\n projectId: ticketInfo?.projectId ?? null,\n trackedDuration: estimatedMinutes * 60,\n })\n .where(eq(schema.agendaEvents.id, existingAgendaEntry.id))\n .returning({ id: schema.agendaEvents.id });\n agendaEventId = updated?.id ?? null;\n wasUpdated = true;\n } else {\n const [created] = await db\n .insert(schema.agendaEvents)\n .values({\n teamId: ctx.teamId,\n userId: ctx.userId,\n title: ticketInfo?.title || \"Development Work\",\n description: completionDescription,\n startTime: sessionStart.toISOString(),\n endTime: estimatedEnd.toISOString(),\n projectId: ticketInfo?.projectId ?? null,\n aiSessionId: session.id,\n type: \"work\" as never,\n status: \"draft\" as never,\n allDay: false,\n isTracked: true,\n trackedDuration: estimatedMinutes * 60,\n })\n .returning({ id: schema.agendaEvents.id });\n agendaEventId = created?.id ?? null;\n }\n\n if (agendaEventId && session.ticketId) {\n await db\n .insert(schema.agendaEventTickets)\n .values({\n agendaEventId,\n ticketId: session.ticketId,\n })\n .onConflictDoNothing();\n }\n } catch (err) {\n console.error(\n `⚠️ Failed to ${wasUpdated ? \"update\" : \"create\"} agenda event:`,\n err,\n );\n }\n\n if (consolidatedCount > 0) {\n console.log(\n `🧹 Cleaned up ${consolidatedCount} duplicate agenda entries for session ${aiSessionId}`,\n );\n }\n\n let responseText = `🎉 **AI Session Completed Successfully!**\\n\\n`;\n responseText += `🆔 Session: ${aiSessionId}\\n`;\n responseText += `📊 **Performance Summary:**\\n`;\n responseText += ` • Tasks Completed: ${workCompleted.length}\\n`;\n responseText += ` • Time Spent: ${timeSpentMinutes} minutes\\n`;\n responseText += ` • Estimated Time: ${session.aiTimeEstimateMinutes || \"N/A\"} minutes\\n`;\n responseText += ` • Efficiency: ${efficiencyScore < 1 ? \"🚀\" : efficiencyScore > 1.5 ? \"⚠️\" : \"⏱️\"} ${(efficiencyScore * 100).toFixed(0)}%\\n`;\n responseText += ` • Session Duration: ${sessionDuration} minutes\\n\\n`;\n\n responseText += `✅ **Work Completed:**\\n`;\n workCompleted.forEach((task, index) => {\n responseText += `${index + 1}. ${task}\\n`;\n });\n responseText += `\\n`;\n\n if (technicalSummary) {\n responseText += `🔧 **Technical Summary:**\\n${technicalSummary}\\n\\n`;\n }\n if (efficiencyNotes) {\n responseText += `📈 **Efficiency Notes:**\\n${efficiencyNotes}\\n\\n`;\n }\n if (agendaEventId) {\n responseText += `📅 **Timetrack Entry ${wasUpdated ? \"Updated\" : \"Created\"}:**\\n`;\n responseText += ` • Agenda event ${wasUpdated ? \"updated with final\" : \"created with\"} work summary\\n`;\n responseText += ` • Status: DRAFT (requires approval in agenda)\\n`;\n responseText += ` • Duration: ${estimatedMinutes} minutes\\n`;\n responseText += ` • Period: ${sessionStart.toLocaleString()} - ${completionTime.toLocaleString()}\\n\\n`;\n }\n\n responseText += `📋 **Context for Customer Response:**\\n`;\n responseText += ` • Use \"get-completion-context\" to retrieve full context\\n`;\n responseText += ` • Generate customer-friendly response based on completed work\\n`;\n responseText += ` • Focus on business value and customer benefits\\n\\n`;\n responseText += `🎯 **Session archived successfully!**`;\n\n return { content: [{ type: \"text\", text: responseText }] };\n}\n\nasync function handleLogHours(input: LogHoursArgs) {\n const ctx = authContext!;\n const {\n projectId,\n ticketId,\n aiSessionId,\n workDescription,\n estimatedHours,\n chatContextSummary,\n } = input;\n\n let project: { id: string; name: string; teamId: string | null } | null = null;\n let ticket: {\n id: string;\n title: string;\n status: string;\n teamId: string;\n projectId: string | null;\n customerId: string | null;\n } | null = null;\n let aiSession: { id: string; ticketId: string; status: string } | null = null;\n\n if (projectId) {\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n if (!projectIds.includes(projectId)) {\n throw new Error(\n `Project not found or no access: ${projectId}. Please call get-projects first to find the correct project.`,\n );\n }\n const [projectData] = await db\n .select({\n id: schema.projects.id,\n name: schema.projects.name,\n teamId: schema.projects.teamId,\n })\n .from(schema.projects)\n .where(eq(schema.projects.id, projectId))\n .limit(1);\n if (!projectData) throw new Error(`Project not found: ${projectId}.`);\n project = projectData;\n }\n\n if (ticketId) {\n const [ticketData] = await db\n .select({\n id: schema.tickets.id,\n title: schema.tickets.title,\n status: schema.tickets.status,\n teamId: schema.tickets.teamId,\n projectId: schema.tickets.projectId,\n customerId: schema.tickets.customerId,\n })\n .from(schema.tickets)\n .where(eq(schema.tickets.id, ticketId))\n .limit(1);\n if (!ticketData) {\n throw new Error(\n `Ticket not found: ${ticketId}. Please call get-tickets first to find the correct ticket.`,\n );\n }\n\n let hasAccess = false;\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n if (teamIds.includes(ticketData.teamId)) hasAccess = true;\n if (!hasAccess && ticketData.projectId) {\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n if (projectIds.includes(ticketData.projectId)) hasAccess = true;\n }\n if (!hasAccess && ticketData.customerId) {\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n if (customerIds.includes(ticketData.customerId)) hasAccess = true;\n }\n if (!hasAccess) {\n throw new Error(\n `No access to ticket: ${ticketId}. Please call get-tickets first to find the correct ticket.`,\n );\n }\n ticket = ticketData;\n }\n\n if (aiSessionId) {\n const [sessionData] = await db\n .select({\n id: schema.aiSessions.id,\n ticketId: schema.aiSessions.ticketId,\n status: schema.aiSessions.status,\n })\n .from(schema.aiSessions)\n .where(eq(schema.aiSessions.id, aiSessionId))\n .limit(1);\n if (!sessionData) throw new Error(`AI Session not found: ${aiSessionId}.`);\n aiSession = sessionData;\n }\n\n const durationSeconds = Math.round(estimatedHours * 3600);\n const now = new Date();\n\n let agendaEntry: {\n id: string;\n trackedDuration: number | null;\n projectId: string | null;\n aiSessionId: string | null;\n } | null = null;\n let wasUpdated = false;\n let consolidatedCount = 0;\n\n if (aiSession?.id || ticket?.id) {\n let existingEntries: Array<{\n id: string;\n trackedDuration: number | null;\n projectId: string | null;\n aiSessionId: string | null;\n }> = [];\n\n if (aiSession?.id) {\n existingEntries = await db\n .select({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n projectId: schema.agendaEvents.projectId,\n aiSessionId: schema.agendaEvents.aiSessionId,\n })\n .from(schema.agendaEvents)\n .where(\n and(\n eq(schema.agendaEvents.status, \"draft\"),\n eq(schema.agendaEvents.userId, ctx.userId),\n eq(schema.agendaEvents.aiSessionId, aiSession.id),\n ),\n )\n .orderBy(desc(schema.agendaEvents.createdAt));\n } else if (ticket?.id) {\n const linkedEvents = await db\n .select({\n agendaEventId: schema.agendaEventTickets.agendaEventId,\n })\n .from(schema.agendaEventTickets)\n .where(eq(schema.agendaEventTickets.ticketId, ticket.id));\n\n const eventIds = linkedEvents.map((e) => e.agendaEventId);\n if (eventIds.length > 0) {\n existingEntries = await db\n .select({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n projectId: schema.agendaEvents.projectId,\n aiSessionId: schema.agendaEvents.aiSessionId,\n })\n .from(schema.agendaEvents)\n .where(\n and(\n inArray(schema.agendaEvents.id, eventIds),\n eq(schema.agendaEvents.status, \"draft\"),\n eq(schema.agendaEvents.userId, ctx.userId),\n ),\n )\n .orderBy(desc(schema.agendaEvents.createdAt));\n }\n }\n\n if (existingEntries.length > 0) {\n const existingEntry = existingEntries[0]!;\n\n if (existingEntries.length > 1) {\n const duplicateIds = existingEntries.slice(1).map((e) => e.id);\n await db\n .delete(schema.agendaEvents)\n .where(inArray(schema.agendaEvents.id, duplicateIds));\n consolidatedCount = existingEntries.length - 1;\n }\n\n const newDuration =\n (existingEntry.trackedDuration ?? 0) + durationSeconds;\n const [updated] = await db\n .update(schema.agendaEvents)\n .set({\n trackedDuration: newDuration,\n endTime: now.toISOString(),\n title: workDescription,\n description: chatContextSummary ?? workDescription,\n projectId: project?.id ?? existingEntry.projectId,\n })\n .where(eq(schema.agendaEvents.id, existingEntry.id))\n .returning({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n projectId: schema.agendaEvents.projectId,\n aiSessionId: schema.agendaEvents.aiSessionId,\n });\n agendaEntry = updated ?? null;\n wasUpdated = true;\n }\n }\n\n if (!agendaEntry) {\n const startTime = new Date(now.getTime() - durationSeconds * 1000);\n const [created] = await db\n .insert(schema.agendaEvents)\n .values({\n teamId: ctx.teamId,\n userId: ctx.userId,\n projectId: project?.id ?? null,\n aiSessionId: aiSession?.id ?? null,\n title: workDescription,\n description: chatContextSummary ?? workDescription,\n startTime: startTime.toISOString(),\n endTime: now.toISOString(),\n type: \"work\" as never,\n status: \"draft\" as never,\n allDay: false,\n isTracked: true,\n trackedDuration: durationSeconds,\n })\n .returning({\n id: schema.agendaEvents.id,\n trackedDuration: schema.agendaEvents.trackedDuration,\n projectId: schema.agendaEvents.projectId,\n aiSessionId: schema.agendaEvents.aiSessionId,\n });\n agendaEntry = created ?? null;\n\n if (agendaEntry && ticket?.id) {\n await db\n .insert(schema.agendaEventTickets)\n .values({ agendaEventId: agendaEntry.id, ticketId: ticket.id })\n .onConflictDoNothing();\n }\n }\n\n if (!agendaEntry) {\n throw new Error(\n `Failed to ${wasUpdated ? \"update\" : \"create\"} time entry`,\n );\n }\n\n let responseText = `⏱️ **Hours ${wasUpdated ? \"Added to Existing Entry\" : \"Logged Successfully\"}!**\\n\\n`;\n if (wasUpdated) {\n responseText += `🔄 **Updated existing draft entry** (avoiding duplicates)\\n`;\n responseText += ` • New total: ${Math.round(((agendaEntry.trackedDuration ?? 0) / 3600) * 10) / 10}h\\n\\n`;\n }\n if (consolidatedCount > 0) {\n responseText += `🧹 **Cleaned up ${consolidatedCount} duplicate entries**\\n\\n`;\n }\n\n responseText += `📋 **Entry Details:**\\n`;\n responseText += ` • Project: ${project ? project.name : \"(No project assigned)\"}\\n`;\n if (ticket) responseText += ` • Ticket: ${ticket.title} (${ticket.status})\\n`;\n if (aiSession)\n responseText += ` • AI Session: ${aiSession.id} (${aiSession.status})\\n`;\n responseText += ` • Description: ${workDescription}\\n`;\n responseText += ` • ${wasUpdated ? \"Added\" : \"Estimated\"} Hours: ${estimatedHours}h (${Math.floor(estimatedHours)}h ${Math.round((estimatedHours % 1) * 60)}m)\\n`;\n responseText += ` • Status: DRAFT (not billed yet)\\n`;\n responseText += ` • Entry ID: ${agendaEntry.id}\\n\\n`;\n\n if (chatContextSummary) {\n responseText += `📊 **Work Context:**\\n`;\n responseText += `${chatContextSummary.substring(0, 200)}${chatContextSummary.length > 200 ? \"...\" : \"\"}\\n\\n`;\n }\n\n responseText += `✅ Time entry ${wasUpdated ? \"updated\" : \"created\"} and ready for review in the agenda!`;\n\n return { content: [{ type: \"text\", text: responseText }] };\n}\n\n// --------- GitHub handlers ----------\n\nasync function handleGetGithubFile(input: GetGithubFileArgs) {\n const ctx = authContext!;\n const { projectId, filePath, ref } = input;\n\n const githubInfo = await getGithubTokenForProject(projectId, ctx.teamId);\n if (!githubInfo) {\n return {\n content: [\n { type: \"text\", text: \"❌ GitHub not configured for this project.\" },\n ],\n };\n }\n\n try {\n const octokit = new Octokit({ auth: githubInfo.token });\n console.error(\n `📄 Reading file: ${filePath} from ${githubInfo.repositoryFullName}`,\n );\n\n const { data } = await octokit.rest.repos.getContent({\n owner: githubInfo.owner,\n repo: githubInfo.repo,\n path: filePath,\n ref,\n });\n\n if (Array.isArray(data) || data.type !== \"file\") {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ \"${filePath}\" is not a file or contains multiple items.`,\n },\n ],\n };\n }\n\n const content = Buffer.from(data.content, \"base64\").toString(\"utf-8\");\n let responseText = `📄 **File: ${filePath}**\\n`;\n responseText += `Repository: ${githubInfo.repositoryFullName}\\n`;\n responseText += `Size: ${data.size} bytes\\n`;\n responseText += `URL: ${data.html_url}\\n\\n`;\n responseText += `**Content:**\\n\\`\\`\\`\\n${content}\\n\\`\\`\\``;\n return { content: [{ type: \"text\", text: responseText }] };\n } catch (error: unknown) {\n console.error(\"GitHub get file error:\", error);\n const status = (error as { status?: number })?.status;\n if (status === 404) {\n return {\n content: [{ type: \"text\", text: `❌ File not found: ${filePath}` }],\n };\n }\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n { type: \"text\", text: `❌ Failed to read file: ${message}` },\n ],\n };\n }\n}\n\nasync function handleListGithubDirectory(input: ListGithubDirectoryArgs) {\n const ctx = authContext!;\n const { projectId, directoryPath, ref } = input;\n\n const githubInfo = await getGithubTokenForProject(projectId, ctx.teamId);\n if (!githubInfo) {\n return {\n content: [\n { type: \"text\", text: \"❌ GitHub not configured for this project.\" },\n ],\n };\n }\n\n try {\n const octokit = new Octokit({ auth: githubInfo.token });\n const normalizedPath =\n !directoryPath || directoryPath === \"/\" ? \"\" : directoryPath;\n\n console.error(\n `📁 Listing directory: ${normalizedPath || \"(root)\"} in ${githubInfo.repositoryFullName}`,\n );\n\n const { data } = await octokit.rest.repos.getContent({\n owner: githubInfo.owner,\n repo: githubInfo.repo,\n path: normalizedPath,\n ref,\n });\n\n if (!Array.isArray(data)) {\n return {\n content: [\n {\n type: \"text\",\n text: `❌ \"${directoryPath}\" is not a directory.`,\n },\n ],\n };\n }\n\n let responseText = `📁 **Directory: ${directoryPath || \"(root)\"}**\\n`;\n responseText += `Repository: ${githubInfo.repositoryFullName}\\n`;\n responseText += `Items: ${data.length}\\n\\n`;\n\n const directories = data.filter((item) => item.type === \"dir\");\n const files = data.filter((item) => item.type === \"file\");\n\n if (directories.length > 0) {\n responseText += `**📁 Directories (${directories.length}):**\\n`;\n for (const dir of directories) responseText += ` - ${dir.name}/\\n`;\n responseText += `\\n`;\n }\n\n if (files.length > 0) {\n responseText += `**📄 Files (${files.length}):**\\n`;\n for (const file of files)\n responseText += ` - ${file.name} (${file.size} bytes)\\n`;\n }\n\n return { content: [{ type: \"text\", text: responseText }] };\n } catch (error: unknown) {\n console.error(\"GitHub list directory error:\", error);\n const status = (error as { status?: number })?.status;\n if (status === 404) {\n return {\n content: [\n { type: \"text\", text: `❌ Directory not found: ${directoryPath}` },\n ],\n };\n }\n const message =\n error instanceof Error ? error.message : \"Unknown error\";\n return {\n content: [\n { type: \"text\", text: `❌ Failed to list directory: ${message}` },\n ],\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Resource dispatch\n// ---------------------------------------------------------------------------\n\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n if (!authContext) {\n return {\n contents: [\n {\n uri: request.params.uri,\n mimeType: \"text/plain\",\n text: \"Error: Not authenticated. API key validation failed.\",\n },\n ],\n };\n }\n\n const ctx = authContext;\n const { uri } = request.params;\n console.error(`📚 Reading resource: ${uri}`);\n\n try {\n switch (uri) {\n case \"tickets://recent\": {\n const teamIds = await getAccessibleTeamIds(ctx.teamId);\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n const accessPredicate = buildTicketAccessPredicate(\n teamIds,\n projectIds,\n customerIds,\n );\n\n const rows = await db\n .select({\n id: schema.tickets.id,\n ticketNumber: schema.tickets.ticketNumber,\n title: schema.tickets.title,\n status: schema.tickets.status,\n priority: schema.tickets.priority,\n createdAt: schema.tickets.createdAt,\n })\n .from(schema.tickets)\n .where(and(accessPredicate, eq(schema.tickets.isDeleted, false)))\n .orderBy(desc(schema.tickets.createdAt))\n .limit(20);\n\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(rows, null, 2),\n },\n ],\n };\n }\n\n case \"customers://all\": {\n const customerIds = await getAccessibleCustomerIds(ctx.teamId);\n if (customerIds.length === 0) {\n return {\n contents: [\n { uri, mimeType: \"application/json\", text: JSON.stringify([], null, 2) },\n ],\n };\n }\n\n const rows = await db\n .select({\n id: schema.customers.id,\n name: schema.customers.name,\n email: schema.customers.email,\n website: schema.customers.website,\n createdAt: schema.customers.createdAt,\n })\n .from(schema.customers)\n .where(inArray(schema.customers.id, customerIds))\n .orderBy(asc(schema.customers.name))\n .limit(50);\n\n return {\n contents: [\n { uri, mimeType: \"application/json\", text: JSON.stringify(rows, null, 2) },\n ],\n };\n }\n\n case \"projects://active\": {\n const projectIds = await getAccessibleProjectIds(ctx.userId, ctx.teamId);\n if (projectIds.length === 0) {\n return {\n contents: [\n { uri, mimeType: \"application/json\", text: JSON.stringify([], null, 2) },\n ],\n };\n }\n\n // NOTE: previous resource filtered `status = 'active'`, but\n // the `projects` schema no longer has a `status` column. Returning\n // all accessible projects matches the dashboard's behavior.\n const rows = await db\n .select({\n id: schema.projects.id,\n name: schema.projects.name,\n description: schema.projects.description,\n createdAt: schema.projects.createdAt,\n customerId: schema.projects.customerId,\n customerName: schema.customers.name,\n })\n .from(schema.projects)\n .leftJoin(\n schema.customers,\n eq(schema.customers.id, schema.projects.customerId),\n )\n .where(inArray(schema.projects.id, projectIds))\n .orderBy(asc(schema.projects.name))\n .limit(50);\n\n return {\n contents: [\n { uri, mimeType: \"application/json\", text: JSON.stringify(rows, null, 2) },\n ],\n };\n }\n\n default:\n throw new Error(`Unknown resource: ${uri}`);\n }\n } catch (error) {\n console.error(\"❌ Resource read error:\", error);\n return {\n contents: [\n {\n uri,\n mimeType: \"text/plain\",\n text: `Error reading ${uri}: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n },\n ],\n };\n }\n});\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\nasync function main() {\n console.error(\"🚀 Starting Refront MCP Bridge Server...\");\n console.error(`🔑 API Key: ${apiKey?.substring(0, 10)}...`);\n\n authContext = await validateApiKey(apiKey!);\n if (!authContext) {\n console.error(\n \"❌ API key validation failed. Please check your key and try again.\",\n );\n process.exit(1);\n }\n\n console.error(\n `✅ Authenticated as user ${authContext.userId} in team ${authContext.teamId}`,\n );\n console.error(`📋 Available scopes: ${authContext.scopes.join(\", \")}`);\n console.error(\"📡 MCP Bridge Server ready for connections\");\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nprocess.on(\"SIGINT\", async () => {\n console.error(\"👋 Shutting down MCP Bridge Server...\");\n process.exit(0);\n});\n\nprocess.on(\"SIGTERM\", async () => {\n console.error(\"👋 Shutting down MCP Bridge Server...\");\n process.exit(0);\n});\n\nmain().catch((error) => {\n console.error(\"💥 Fatal error:\", error);\n process.exit(1);\n});\n"]}
|