@kraki/head 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AASnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC;;GAEG;AACH,SAAS,eAAe,CAAC,UAAkB;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACjD,OAAO,+BAA+B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,8BAA8B,CAAC;AACvF,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,KAAa,EAAE,SAAiB,EAAE,YAAoB;IAC7E,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC1D,CAAC;AAqCD,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC7C,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,oBAAoB,GAAG,MAAM,CAAC,CAAC,OAAO;AAE5C;;;GAGG;AACH,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,GAAG,GAAG,GAA8B,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,IAAI,SAAS,IAAI,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAChG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kCAAkC;AAClC,SAAS,WAAW,CAAC,GAA4B;IAC/C,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAChE,MAAM,GAAG,GAAG,GAAG,CAAC,MAAiC,CAAC;IAClD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/E,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sCAAsC;AACtC,SAAS,oBAAoB,CAAC,GAA4B;IACxD,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClE,MAAM,CAAC,GAAG,GAAG,CAAC,OAAkC,CAAC;IACjD,IAAI,OAAO,CAAC,CAAC,cAAc,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAClD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kCAAkC;AAClC,SAAS,gBAAgB,CAAC,GAA4B;IACpD,OAAO,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;WAClE,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;AACxF,CAAC;AAED,MAAM,OAAO,UAAU;IACb,GAAG,CAAkB;IACrB,EAAE,CAAiB;IACnB,MAAM,CAAS;IACf,OAAO,CAAoB;IAC3B,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC5C,SAAS,GAA0C,IAAI,CAAC;IAChE,0EAA0E;IAClE,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,iBAAiB,GAA0C,IAAI,CAAC;IAExE,YAAY,EAAkB,EAAE,MAAc,EAAE,OAA0B;QACxE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,GAAG,GAAG,IAAI,eAAe,CAAC;YAC7B,QAAQ,EAAE,IAAI;YACd,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,mBAAmB;SACtD,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,mEAAmE;IAC3D,eAAe;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;YACrC,0EAA0E;YAC1E,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAa,CAAC;IACpC,CAAC;IAED,qCAAqC;IAC7B,YAAY;QAClB,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAClE,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI;YAAE,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,IAAI,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,+DAA+D;IACvD,sBAAsB,CAAC,IAAa;QAC1C,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;QAC/C,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;IAChC,CAAC;IAED,6EAA6E;IACrE,iBAAiB;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC7C,IAAI,UAAU,EAAE,eAAe,EAAE,CAAC;YAChC,OAAO,EAAE,cAAc,EAAE,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC;QACtD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,+EAA+E;IACvE,kBAAkB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;QACxF,IAAI,CAAC,QAAQ;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,QAAQ,YAAY,kBAAkB;YAAE,OAAO,QAAQ,CAAC;QAC5D,IAAI,OAAO,IAAI,QAAQ,EAAE,CAAC;YACxB,MAAM,KAAK,GAAI,QAAgB,CAAC,KAAK,CAAC;YACtC,IAAI,KAAK,YAAY,kBAAkB;gBAAE,OAAO,KAAK,CAAC;QACxD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,yDAAyD;IACjD,mBAAmB,CAAC,SAAiB;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC5B,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/F,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAc;QACnB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YACzC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;gBAC/C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,EAAa;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC;IAEO,YAAY,CAAC,EAAa,EAAE,GAAyB;QAC3D,MAAM,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,aAAa,IAAI,GAAG,EAAE,OAAO,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,IAAI,SAAS,CAAC;QAClG,MAAM,KAAK,GAAgB,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACrE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAE5C,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACjB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACxC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;oBACzB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,wBAAwB,CAAC,CAAC;oBAC7C,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC3C,SAAS,EAAE,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC3F,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACxD,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;oBACpF,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE;wBAC3C,IAAI,EAAE,aAAa;wBACnB,KAAK,EAAE,gBAAgB;wBACvB,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE;qBACnC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,EAAa,EAAE,KAAkB,EAAE,GAA4B;QACrF,mBAAmB;QACnB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,gEAAgE;QAChE,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3C,SAAS,EAAE,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;gBACjF,OAAO;YACT,CAAC;QACH,CAAC;QAED,+EAA+E;QAC/E,IAAI,GAAG,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,yBAAyB,CAAC,EAAE,EAAE,KAAK,EAAE,GAAyB,CAAC,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC7B,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;oBACrB,IAAI,EAAE,oBAAoB;oBAC1B,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE;oBAC9B,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;oBACrB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,KAAK,KAAK;oBAC9C,GAAG,IAAI,CAAC,iBAAiB,EAAE;iBAC5B,CAAC,CAAC,CAAC;gBACJ,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;oBACtB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,4DAA4D,CAAC,CAAC;oBACjF,OAAO;gBACT,CAAC;gBACD,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,GAA6B,CAAC,CAAC;YAClE,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBAC9D,IAAI,CAAC,uBAAuB,CAAC,EAAE,EAAE,KAAK,EAAE,GAAU,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC;YAChD,CAAC;YACD,OAAO;QACT,CAAC;QAED,kCAAkC;QAClC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,+DAA+D,CAAC,CAAC;YACpF,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;YAChE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,mEAAmE,CAAC,CAAC;YACxF,OAAO;QACT,CAAC;QAED,0BAA0B;QAC1B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,GAA+B,CAAC;YAC/C,IAAI,CAAC,KAAK,CAAC,QAAQ;gBAAE,OAAO;YAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,SAAS;gBAAE,OAAO;YAC7B,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,GAAyC,CAAC;YACrE,IAAI,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACzC,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;gBAC/D,qDAAqD;gBACrD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE;oBAC3C,IAAI,EAAE,aAAa;oBACnB,KAAK,EAAE,oBAAoB;oBAC3B,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE;iBAClC,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YACxC,IAAI,CAAC,wBAAwB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC,mBAAmB,CAAC,EAAE,EAAE,KAAK,EAAE,GAA6B,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,oDAAoD;QACpD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAmD,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAEO,wBAAwB,CAAC,EAAa,EAAE,KAAkB;QAChE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,mCAAmC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAClE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAE3E,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1E,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACrB,IAAI,EAAE,uBAAuB;YAC7B,KAAK;YACL,SAAS,EAAE,GAAG;SACf,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,mBAAmB,CAAC,EAAa,EAAE,KAAkB,EAAE,GAA2B;QACxF,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACxD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,uCAAuC,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;YACtD,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAEzF,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE;YAC3C,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;SACnC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,yBAAyB,CAAC,EAAa,EAAE,KAAkB,EAAE,GAAuB;QAChG,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,mCAAmC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,oCAAoC,CAAC,CAAC;YACzD,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,YAAY,CAAC;YAC3D,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,EAAE,EAAE,KAAK,CAAC,EAAE;SACb,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,GAAG,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAClE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAErE,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACpE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACrB,IAAI,EAAE,uBAAuB;YAC7B,KAAK;YACL,SAAS,EAAE,GAAG;SACf,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,EAAa,EAAE,KAAkB,EAAE,GAAgB;QAC1E,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,+BAA+B;QAC/B,IAAK,GAAW,CAAC,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,iFAAiF;QACjF,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAE,GAAW,CAAC,UAAU,EAAE,CAAC;YACrF,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACnE,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC/B,iDAAiD;gBACjD,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC9C,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC3B,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAC5C,KAAK,CAAC,iBAAiB,GAAG;oBACxB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa;oBACvC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,YAAmD;iBAC7E,CAAC;gBACF,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC1E,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC3D,OAAO;YACT,CAAC;QACH,CAAC;QAED,0DAA0D;QAC1D,MAAM,UAAU,GAAI,GAAW,CAAC,UAAgC,CAAC;QACjE,MAAM,YAAY,GAAG,UAAU;YAC7B,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC;YACvC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QAE3B,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;YACjD,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,UAAU;YACV,EAAE,EAAE,KAAK,CAAC,EAAE;SACb,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3E,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC;gBAChC,SAAS;gBACT,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;gBACrB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;gBACrB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;oBACb,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;wBAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtD,CAAC;gBACD,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;gBACrB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;gBAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa;gBACvC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY;gBACrC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ;aACpC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3F,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAC3B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC1B,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;QAE5B,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAClC,QAAQ;YACR,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;YACrB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;YACrB,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK;YAC3B,EAAE,EAAE,KAAK,CAAC,EAAE;SACb,CAAC,CAAC;QAEH,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACrB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,SAAS;YAClB,QAAQ;YACR,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;YACrB,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC;YAC9C,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC;YAChD,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC;YACvD,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;YACzC,GAAG,IAAI,CAAC,iBAAiB,EAAE;SAC5B,CAAC,CAAC,CAAC;QAEJ,uBAAuB;QACvB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE;YACrC,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE;gBACJ,MAAM,EAAE;oBACN,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;oBACrB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;oBACrB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;oBACrB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;oBAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa;oBACvC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY;oBACrC,MAAM,EAAE,IAAI;iBACb;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB,CAAC,EAAa,EAAE,KAAkB,EAAE,GAAgB;QAC3E,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC,EAAE,CAAC;YAC3C,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,iDAAiD,EAAE,CAAC,CAAC,CAAC;YAC5G,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAI,GAAW,CAAC,YAAsB,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAEzE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,+CAA+C,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/E,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC;gBAChC,SAAS;gBACT,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;gBACrB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;gBACrB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;oBACb,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;wBAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtD,CAAC;gBACD,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;gBACrB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;gBAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa;gBACvC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY;gBACrC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ;aACpC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACrG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAC3B,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC1B,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;QAE5B,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAE1F,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACrB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,SAAS;YAClB,QAAQ;YACR,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;YACrB,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,SAAS,CAAC;YAC9C,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC;YAChD,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC;YACvD,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC;YACzC,GAAG,IAAI,CAAC,iBAAiB,EAAE;SAC5B,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE;YACrC,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE;gBACJ,MAAM,EAAE;oBACN,EAAE,EAAE,QAAQ;oBACZ,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;oBACrB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;oBACrB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI;oBACrB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS;oBAC/B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa;oBACvC,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,YAAY;oBACrC,MAAM,EAAE,IAAI;iBACb;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAEO,uBAAuB,CAAC,EAAa,EAAE,KAAkB,EAAE,GAA4C;QAC7G,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC;QACjC,MAAM,WAAW,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAE5C,KAAK,CAAC,YAAY,GAAG,SAAS,CAAC;QAC/B,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;QAClC,KAAK,CAAC,iBAAiB,GAAG,SAAS,CAAC;QAEpC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACxB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACjC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,mBAAmB;QACnB,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAElE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1E,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC;YAC9E,OAAO;QACT,CAAC;QAED,+DAA+D;QAC/D,MAAM,aAAa,GAAG,WAAW,EAAE,aAAa,IAAI,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC;QAEtF,IAAI,YAAoB,CAAC;QACzB,IAAI,CAAC;YACH,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC;gBACpC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,MAAM,CAAC,IAAW;gBACxB,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;oBACb,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;wBAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtD,CAAC;gBACD,IAAI,EAAG,MAAM,CAAC,IAAY,IAAI,SAAS;gBACvC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS;gBACxC,aAAa;gBACb,cAAc,EAAE,QAAQ;aACzB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACnG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QAED,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;QAC3B,KAAK,CAAC,QAAQ,GAAG,YAAY,CAAC;QAC9B,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAEnC,MAAM,CAAC,IAAI,CAAC,6CAA6C,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAEvF,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACrB,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,MAAM,CAAC,SAAS;YACzB,QAAQ,EAAE,YAAY;YACtB,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;YACrB,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC;YACrD,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC;YACvD,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC;YAC9D,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,SAAS,CAAC;YAChD,GAAG,IAAI,CAAC,iBAAiB,EAAE;SAC5B,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,EAAE;YAC5C,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,eAAe;YACtB,IAAI,EAAE;gBACJ,MAAM,EAAE;oBACN,EAAE,EAAE,YAAY;oBAChB,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,IAAI,EAAE,MAAM,CAAC,IAAW;oBACxB,IAAI,EAAG,MAAM,CAAC,IAAY,IAAI,SAAS;oBACvC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,SAAS;oBACxC,aAAa;oBACb,MAAM,EAAE,IAAI;iBACb;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,EAAa,EAAE,OAAe;QAC9C,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACrC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,qBAAqB,CAAC;QACpE,IAAI,QAAQ,IAAI,CAAC;YAAE,OAAO;QAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,oBAAoB,CAAC;QACjE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAE3B,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACvC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC5F,EAAE,CAAC,SAAS,EAAE,CAAC;oBACf,SAAS;gBACX,CAAC;gBACD,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;gBACpB,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;oBACrC,EAAE,CAAC,IAAI,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC,EAAE,QAAQ,CAAC,CAAC;IACf,CAAC;IAEO,iBAAiB;QACvB,kDAAkD;QAClD,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;YACxC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;IACjB,CAAC;IAED,+CAA+C;IACvC,gBAAgB,CAAC,EAAU;QACjC,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,YAAY;QAC9D,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC;YAC1C,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,eAAe;QAClD,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAAC,CAAC;QAC7E,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAAC,CAAC;QACrG,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACrC,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,112 @@
1
+ export interface StoredMessage {
2
+ id: number;
3
+ channelId: string;
4
+ deviceId: string;
5
+ sessionId: string | null;
6
+ seq: number;
7
+ type: string;
8
+ payload: string;
9
+ createdAt: string;
10
+ }
11
+ export interface StoredDevice {
12
+ id: string;
13
+ channelId: string;
14
+ name: string;
15
+ role: string;
16
+ kind: string | null;
17
+ publicKey: string | null;
18
+ encryptionKey: string | null;
19
+ lastSeen: string;
20
+ createdAt: string;
21
+ }
22
+ export interface StoredUser {
23
+ userId: string;
24
+ username: string;
25
+ provider: string;
26
+ email?: string;
27
+ createdAt: string;
28
+ }
29
+ export interface StoredChannel {
30
+ id: string;
31
+ ownerId: string;
32
+ name: string | null;
33
+ createdAt: string;
34
+ }
35
+ export interface StoreMessageInput {
36
+ channelId: string;
37
+ deviceId: string;
38
+ sessionId: string | null;
39
+ seq: number;
40
+ type: string;
41
+ payload: string;
42
+ }
43
+ export declare function shouldStore(type: string): boolean;
44
+ export declare class Storage {
45
+ private db;
46
+ constructor(dbPath?: string);
47
+ private migrate;
48
+ upsertUser(userId: string, username: string, provider?: string, email?: string): StoredUser;
49
+ getUser(userId: string): StoredUser | undefined;
50
+ createChannel(id: string, ownerId: string, name?: string): StoredChannel;
51
+ getChannel(id: string): StoredChannel | undefined;
52
+ getChannelByOwner(ownerId: string): StoredChannel | undefined;
53
+ upsertDevice(id: string, channelId: string, name: string, role: string, kind?: string, publicKey?: string, encryptionKey?: string): StoredDevice;
54
+ private mapDeviceRow;
55
+ getDevice(id: string): StoredDevice | undefined;
56
+ getDevicesByChannel(channelId: string): StoredDevice[];
57
+ removeDevice(id: string): void;
58
+ touchDevice(id: string): void;
59
+ upsertSession(id: string, channelId: string, deviceId: string, agent: string, model?: string): void;
60
+ getSessionsByChannel(channelId: string): Array<{
61
+ id: string;
62
+ deviceId: string;
63
+ agent: string;
64
+ model: string | null;
65
+ }>;
66
+ getSessionById(id: string): {
67
+ id: string;
68
+ channelId: string;
69
+ deviceId: string;
70
+ agent: string;
71
+ model: string | null;
72
+ } | undefined;
73
+ deleteSession(sessionId: string): void;
74
+ deleteSessionMessages(channelId: string, sessionId: string): void;
75
+ deleteSessionReadState(channelId: string, sessionId: string): void;
76
+ storeMessage(input: StoreMessageInput): StoredMessage;
77
+ private mapMessageRow;
78
+ getMessagesAfterSeq(channelId: string, afterSeq: number, sessionId?: string, limit?: number): StoredMessage[];
79
+ /**
80
+ * Get messages deliverable to a specific device.
81
+ * Filters out encrypted messages where the device has no wrapped key.
82
+ */
83
+ getMessagesForDevice(channelId: string, afterSeq: number, deviceId: string, sessionId?: string, limit?: number): StoredMessage[];
84
+ /** Get the highest seq number for a channel. */
85
+ getMaxSeq(channelId: string): number;
86
+ /** Delete messages with seq ≤ threshold for a channel (retention pruning). */
87
+ pruneMessages(channelId: string, beforeSeq: number): number;
88
+ /** Prune messages older than a given age (in days). Returns total rows deleted. */
89
+ pruneOldMessages(maxAgeDays?: number): number;
90
+ /** Update the last-read seq for a channel+session pair (per-user, shared across devices) */
91
+ markRead(channelId: string, sessionId: string, seq: number): void;
92
+ /** Get read state for all sessions in a channel: { sessionId: lastSeq } */
93
+ getReadState(channelId: string): Record<string, number>;
94
+ /** Get the max seq per session in a channel (for computing unread counts) */
95
+ getSessionMaxSeqs(channelId: string): Record<string, number>;
96
+ /**
97
+ * Store a pairing token. The token is hashed before storage —
98
+ * if the DB is compromised, the attacker only gets a hash.
99
+ */
100
+ createPairingToken(token: string, channelId: string, expiresAt: string): void;
101
+ /**
102
+ * Validate and consume a pairing token. Returns channelId if valid.
103
+ * Token is single-use and time-limited.
104
+ */
105
+ consumePairingToken(token: string): string | null;
106
+ /**
107
+ * Clean up expired pairing tokens.
108
+ */
109
+ cleanExpiredPairingTokens(): number;
110
+ private hashToken;
111
+ close(): void;
112
+ }
@@ -0,0 +1,372 @@
1
+ import Database from 'better-sqlite3';
2
+ import { createHash } from 'crypto';
3
+ const STORED_TYPES = new Set([
4
+ 'session_created', 'session_ended',
5
+ 'user_message', 'agent_message',
6
+ 'permission', 'question',
7
+ 'tool_start', 'tool_complete',
8
+ 'error',
9
+ 'send_input', 'approve', 'deny', 'always_allow', 'answer', 'kill_session',
10
+ 'session_mode_set',
11
+ 'encrypted',
12
+ ]);
13
+ export function shouldStore(type) {
14
+ return STORED_TYPES.has(type);
15
+ }
16
+ const SCHEMA_VERSION = 9;
17
+ export class Storage {
18
+ db;
19
+ constructor(dbPath = ':memory:') {
20
+ this.db = new Database(dbPath);
21
+ this.db.pragma('journal_mode = WAL');
22
+ this.db.pragma('foreign_keys = ON');
23
+ this.migrate();
24
+ }
25
+ migrate() {
26
+ const currentVersion = this.db.pragma('user_version', { simple: true }) || 0;
27
+ if (currentVersion < 1) {
28
+ this.db.exec(`
29
+ CREATE TABLE IF NOT EXISTS users (
30
+ user_id TEXT PRIMARY KEY,
31
+ username TEXT NOT NULL,
32
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
33
+ );
34
+
35
+ CREATE TABLE IF NOT EXISTS channels (
36
+ id TEXT PRIMARY KEY,
37
+ owner_id TEXT NOT NULL REFERENCES users(user_id),
38
+ name TEXT,
39
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
40
+ );
41
+
42
+ CREATE TABLE IF NOT EXISTS devices (
43
+ id TEXT PRIMARY KEY,
44
+ channel_id TEXT NOT NULL REFERENCES channels(id),
45
+ name TEXT NOT NULL,
46
+ role TEXT NOT NULL CHECK(role IN ('tentacle', 'app')),
47
+ kind TEXT,
48
+ public_key TEXT,
49
+ last_seen TEXT NOT NULL DEFAULT (datetime('now')),
50
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
51
+ );
52
+
53
+ -- device_id intentionally has no FK to devices —
54
+ -- messages are kept even after the device is removed
55
+ CREATE TABLE IF NOT EXISTS messages (
56
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
57
+ channel_id TEXT NOT NULL REFERENCES channels(id),
58
+ device_id TEXT NOT NULL,
59
+ session_id TEXT,
60
+ seq INTEGER NOT NULL,
61
+ type TEXT NOT NULL,
62
+ payload TEXT NOT NULL,
63
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
64
+ );
65
+
66
+ CREATE INDEX IF NOT EXISTS idx_messages_channel_seq
67
+ ON messages(channel_id, seq);
68
+ CREATE INDEX IF NOT EXISTS idx_messages_session
69
+ ON messages(channel_id, session_id, seq);
70
+ `);
71
+ }
72
+ if (currentVersion < 2) {
73
+ this.db.exec(`
74
+ CREATE TABLE IF NOT EXISTS pairing_tokens (
75
+ token TEXT PRIMARY KEY,
76
+ channel_id TEXT NOT NULL,
77
+ expires_at TEXT NOT NULL,
78
+ used INTEGER NOT NULL DEFAULT 0
79
+ );
80
+ `);
81
+ }
82
+ if (currentVersion < 3) {
83
+ this.db.exec(`
84
+ ALTER TABLE devices ADD COLUMN encryption_key TEXT;
85
+ `);
86
+ }
87
+ if (currentVersion < 4) {
88
+ this.db.exec(`
89
+ CREATE TABLE IF NOT EXISTS sessions (
90
+ id TEXT PRIMARY KEY,
91
+ channel_id TEXT NOT NULL REFERENCES channels(id),
92
+ device_id TEXT NOT NULL,
93
+ agent TEXT NOT NULL DEFAULT 'unknown',
94
+ model TEXT,
95
+ state TEXT NOT NULL DEFAULT 'active' CHECK(state IN ('active', 'idle', 'ended')),
96
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
97
+ );
98
+ `);
99
+ }
100
+ if (currentVersion < 5) {
101
+ this.db.exec(`
102
+ CREATE TABLE IF NOT EXISTS read_state (
103
+ device_id TEXT NOT NULL,
104
+ session_id TEXT NOT NULL,
105
+ last_seq INTEGER NOT NULL DEFAULT 0,
106
+ PRIMARY KEY (device_id, session_id)
107
+ );
108
+ `);
109
+ }
110
+ if (currentVersion < 6) {
111
+ this.db.exec(`
112
+ CREATE TABLE IF NOT EXISTS allowed_tools (
113
+ channel_id TEXT NOT NULL REFERENCES channels(id),
114
+ tool_kind TEXT NOT NULL,
115
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
116
+ PRIMARY KEY (channel_id, tool_kind)
117
+ );
118
+ `);
119
+ }
120
+ if (currentVersion < 7) {
121
+ this.db.exec(`
122
+ ALTER TABLE users ADD COLUMN provider TEXT NOT NULL DEFAULT 'open';
123
+ `);
124
+ }
125
+ if (currentVersion < 8) {
126
+ this.db.exec(`
127
+ ALTER TABLE users ADD COLUMN email TEXT;
128
+ `);
129
+ }
130
+ if (currentVersion < 9) {
131
+ // Migrate read_state from per-device to per-channel (per-user)
132
+ this.db.exec(`
133
+ DROP TABLE IF EXISTS read_state;
134
+ CREATE TABLE read_state (
135
+ channel_id TEXT NOT NULL,
136
+ session_id TEXT NOT NULL,
137
+ last_seq INTEGER NOT NULL DEFAULT 0,
138
+ PRIMARY KEY (channel_id, session_id)
139
+ );
140
+ `);
141
+ }
142
+ this.db.pragma(`user_version = ${SCHEMA_VERSION}`);
143
+ }
144
+ // --- Users ---
145
+ upsertUser(userId, username, provider, email) {
146
+ this.db.prepare(`
147
+ INSERT INTO users (user_id, username, provider, email)
148
+ VALUES (?, ?, ?, ?)
149
+ ON CONFLICT(user_id) DO UPDATE SET username = excluded.username, provider = excluded.provider, email = excluded.email
150
+ `).run(userId, username, provider ?? 'open', email ?? null);
151
+ return this.getUser(userId);
152
+ }
153
+ getUser(userId) {
154
+ const row = this.db.prepare('SELECT user_id, username, provider, email, created_at FROM users WHERE user_id = ?').get(userId);
155
+ if (!row)
156
+ return undefined;
157
+ return { userId: row.user_id, username: row.username, provider: row.provider ?? 'open', email: row.email ?? undefined, createdAt: row.created_at };
158
+ }
159
+ // --- Channels ---
160
+ createChannel(id, ownerId, name) {
161
+ this.db.prepare('INSERT INTO channels (id, owner_id, name) VALUES (?, ?, ?)').run(id, ownerId, name ?? null);
162
+ return this.getChannel(id);
163
+ }
164
+ getChannel(id) {
165
+ const row = this.db.prepare('SELECT id, owner_id, name, created_at FROM channels WHERE id = ?').get(id);
166
+ if (!row)
167
+ return undefined;
168
+ return { id: row.id, ownerId: row.owner_id, name: row.name, createdAt: row.created_at };
169
+ }
170
+ getChannelByOwner(ownerId) {
171
+ const row = this.db.prepare('SELECT id, owner_id, name, created_at FROM channels WHERE owner_id = ?').get(ownerId);
172
+ if (!row)
173
+ return undefined;
174
+ return { id: row.id, ownerId: row.owner_id, name: row.name, createdAt: row.created_at };
175
+ }
176
+ // --- Devices ---
177
+ upsertDevice(id, channelId, name, role, kind, publicKey, encryptionKey) {
178
+ // Check for cross-channel collision: if device exists in a different channel, reject
179
+ const existing = this.getDevice(id);
180
+ if (existing && existing.channelId !== channelId) {
181
+ throw new Error(`Device "${id}" belongs to channel "${existing.channelId}", not "${channelId}"`);
182
+ }
183
+ this.db.prepare(`
184
+ INSERT INTO devices (id, channel_id, name, role, kind, public_key, encryption_key)
185
+ VALUES (?, ?, ?, ?, ?, ?, ?)
186
+ ON CONFLICT(id) DO UPDATE SET
187
+ name = excluded.name,
188
+ role = excluded.role,
189
+ kind = excluded.kind,
190
+ public_key = excluded.public_key,
191
+ encryption_key = excluded.encryption_key,
192
+ last_seen = datetime('now')
193
+ `).run(id, channelId, name, role, kind ?? null, publicKey ?? null, encryptionKey ?? null);
194
+ return this.getDevice(id);
195
+ }
196
+ mapDeviceRow(row) {
197
+ return {
198
+ id: row.id, channelId: row.channel_id, name: row.name,
199
+ role: row.role, kind: row.kind, publicKey: row.public_key,
200
+ encryptionKey: row.encryption_key,
201
+ lastSeen: row.last_seen, createdAt: row.created_at,
202
+ };
203
+ }
204
+ getDevice(id) {
205
+ const row = this.db.prepare('SELECT id, channel_id, name, role, kind, public_key, encryption_key, last_seen, created_at FROM devices WHERE id = ?').get(id);
206
+ if (!row)
207
+ return undefined;
208
+ return this.mapDeviceRow(row);
209
+ }
210
+ getDevicesByChannel(channelId) {
211
+ const rows = this.db.prepare('SELECT id, channel_id, name, role, kind, public_key, encryption_key, last_seen, created_at FROM devices WHERE channel_id = ?').all(channelId);
212
+ return rows.map(row => this.mapDeviceRow(row));
213
+ }
214
+ removeDevice(id) {
215
+ this.db.prepare('DELETE FROM devices WHERE id = ?').run(id);
216
+ }
217
+ touchDevice(id) {
218
+ this.db.prepare("UPDATE devices SET last_seen = datetime('now') WHERE id = ?").run(id);
219
+ }
220
+ // --- Sessions (persistent) ---
221
+ upsertSession(id, channelId, deviceId, agent, model) {
222
+ this.db.prepare(`
223
+ INSERT INTO sessions (id, channel_id, device_id, agent, model)
224
+ VALUES (?, ?, ?, ?, ?)
225
+ ON CONFLICT(id) DO UPDATE SET
226
+ device_id = excluded.device_id,
227
+ agent = excluded.agent,
228
+ model = excluded.model
229
+ `).run(id, channelId, deviceId, agent, model ?? null);
230
+ }
231
+ getSessionsByChannel(channelId) {
232
+ return this.db.prepare('SELECT id, device_id, agent, model FROM sessions WHERE channel_id = ?').all(channelId)
233
+ .map(r => ({ id: r.id, deviceId: r.device_id, agent: r.agent, model: r.model }));
234
+ }
235
+ getSessionById(id) {
236
+ const row = this.db.prepare('SELECT id, channel_id, device_id, agent, model FROM sessions WHERE id = ?').get(id);
237
+ if (!row)
238
+ return undefined;
239
+ return { id: row.id, channelId: row.channel_id, deviceId: row.device_id, agent: row.agent, model: row.model };
240
+ }
241
+ deleteSession(sessionId) {
242
+ this.db.prepare('DELETE FROM sessions WHERE id = ?').run(sessionId);
243
+ }
244
+ deleteSessionMessages(channelId, sessionId) {
245
+ this.db.prepare('DELETE FROM messages WHERE channel_id = ? AND session_id = ?').run(channelId, sessionId);
246
+ }
247
+ deleteSessionReadState(channelId, sessionId) {
248
+ this.db.prepare('DELETE FROM read_state WHERE channel_id = ? AND session_id = ?').run(channelId, sessionId);
249
+ }
250
+ // --- Messages ---
251
+ storeMessage(input) {
252
+ const info = this.db.prepare(`
253
+ INSERT INTO messages (channel_id, device_id, session_id, seq, type, payload)
254
+ VALUES (?, ?, ?, ?, ?, ?)
255
+ `).run(input.channelId, input.deviceId, input.sessionId, input.seq, input.type, input.payload);
256
+ return {
257
+ id: Number(info.lastInsertRowid),
258
+ ...input,
259
+ createdAt: new Date().toISOString(),
260
+ };
261
+ }
262
+ mapMessageRow(row) {
263
+ return {
264
+ id: row.id,
265
+ channelId: row.channel_id,
266
+ deviceId: row.device_id,
267
+ sessionId: row.session_id ?? null,
268
+ seq: row.seq,
269
+ type: row.type,
270
+ payload: row.payload,
271
+ createdAt: row.created_at,
272
+ };
273
+ }
274
+ getMessagesAfterSeq(channelId, afterSeq, sessionId, limit = 1000) {
275
+ if (sessionId) {
276
+ return this.db.prepare('SELECT * FROM messages WHERE channel_id = ? AND session_id = ? AND seq > ? ORDER BY seq ASC LIMIT ?').all(channelId, sessionId, afterSeq, limit).map(row => this.mapMessageRow(row));
277
+ }
278
+ return this.db.prepare('SELECT * FROM messages WHERE channel_id = ? AND seq > ? ORDER BY seq ASC LIMIT ?').all(channelId, afterSeq, limit).map(row => this.mapMessageRow(row));
279
+ }
280
+ /**
281
+ * Get messages deliverable to a specific device.
282
+ * Filters out encrypted messages where the device has no wrapped key.
283
+ */
284
+ getMessagesForDevice(channelId, afterSeq, deviceId, sessionId, limit = 1000) {
285
+ const filter = `(type != 'encrypted' OR json_extract(payload, '$.keys.' || ?) IS NOT NULL)`;
286
+ if (sessionId) {
287
+ return this.db.prepare(`SELECT * FROM messages WHERE channel_id = ? AND session_id = ? AND seq > ? AND ${filter} ORDER BY seq ASC LIMIT ?`).all(channelId, sessionId, afterSeq, deviceId, limit).map(row => this.mapMessageRow(row));
288
+ }
289
+ return this.db.prepare(`SELECT * FROM messages WHERE channel_id = ? AND seq > ? AND ${filter} ORDER BY seq ASC LIMIT ?`).all(channelId, afterSeq, deviceId, limit).map(row => this.mapMessageRow(row));
290
+ }
291
+ /** Get the highest seq number for a channel. */
292
+ getMaxSeq(channelId) {
293
+ const row = this.db.prepare('SELECT COALESCE(MAX(seq), 0) as max_seq FROM messages WHERE channel_id = ?').get(channelId);
294
+ return row.max_seq;
295
+ }
296
+ /** Delete messages with seq ≤ threshold for a channel (retention pruning). */
297
+ pruneMessages(channelId, beforeSeq) {
298
+ const result = this.db.prepare('DELETE FROM messages WHERE channel_id = ? AND seq <= ?').run(channelId, beforeSeq);
299
+ return result.changes;
300
+ }
301
+ /** Prune messages older than a given age (in days). Returns total rows deleted. */
302
+ pruneOldMessages(maxAgeDays = 30) {
303
+ const result = this.db.prepare("DELETE FROM messages WHERE created_at < datetime('now', ?)").run(`-${maxAgeDays} days`);
304
+ return result.changes;
305
+ }
306
+ // --- Read state ---
307
+ /** Update the last-read seq for a channel+session pair (per-user, shared across devices) */
308
+ markRead(channelId, sessionId, seq) {
309
+ this.db.prepare('INSERT INTO read_state (channel_id, session_id, last_seq) VALUES (?, ?, ?) ON CONFLICT(channel_id, session_id) DO UPDATE SET last_seq = MAX(last_seq, ?)').run(channelId, sessionId, seq, seq);
310
+ }
311
+ /** Get read state for all sessions in a channel: { sessionId: lastSeq } */
312
+ getReadState(channelId) {
313
+ const rows = this.db.prepare('SELECT session_id, last_seq FROM read_state WHERE channel_id = ?').all(channelId);
314
+ const result = {};
315
+ for (const row of rows) {
316
+ result[row.session_id] = row.last_seq;
317
+ }
318
+ return result;
319
+ }
320
+ /** Get the max seq per session in a channel (for computing unread counts) */
321
+ getSessionMaxSeqs(channelId) {
322
+ const rows = this.db.prepare('SELECT session_id, MAX(seq) as max_seq FROM messages WHERE channel_id = ? AND session_id IS NOT NULL GROUP BY session_id').all(channelId);
323
+ const result = {};
324
+ for (const row of rows) {
325
+ result[row.session_id] = row.max_seq;
326
+ }
327
+ return result;
328
+ }
329
+ // --- Pairing tokens ---
330
+ /**
331
+ * Store a pairing token. The token is hashed before storage —
332
+ * if the DB is compromised, the attacker only gets a hash.
333
+ */
334
+ createPairingToken(token, channelId, expiresAt) {
335
+ const hashed = this.hashToken(token);
336
+ this.db.prepare('INSERT INTO pairing_tokens (token, channel_id, expires_at) VALUES (?, ?, ?)').run(hashed, channelId, expiresAt);
337
+ }
338
+ /**
339
+ * Validate and consume a pairing token. Returns channelId if valid.
340
+ * Token is single-use and time-limited.
341
+ */
342
+ consumePairingToken(token) {
343
+ const hashed = this.hashToken(token);
344
+ const row = this.db.prepare('SELECT channel_id, expires_at, used FROM pairing_tokens WHERE token = ?').get(hashed);
345
+ if (!row)
346
+ return null;
347
+ if (row.used)
348
+ return null;
349
+ if (new Date(row.expires_at) < new Date())
350
+ return null;
351
+ this.db.prepare('UPDATE pairing_tokens SET used = 1 WHERE token = ?').run(hashed);
352
+ return row.channel_id;
353
+ }
354
+ /**
355
+ * Clean up expired pairing tokens.
356
+ */
357
+ cleanExpiredPairingTokens() {
358
+ const now = new Date().toISOString();
359
+ const info = this.db.prepare('DELETE FROM pairing_tokens WHERE expires_at < ? OR used = 1').run(now);
360
+ return info.changes;
361
+ }
362
+ hashToken(token) {
363
+ return createHash('sha256').update(token).digest('hex');
364
+ }
365
+ // --- Cleanup ---
366
+ // TODO: Add deleteMessagesBeforeSeq(channelId, seq) for message retention
367
+ // TODO: Add configurable max messages per channel with auto-pruning
368
+ close() {
369
+ this.db.close();
370
+ }
371
+ }
372
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@kraki/head",
3
+ "version": "0.1.0",
4
+ "description": "Kraki relay server — the brain that routes messages between tentacles and apps",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "bin": {
15
+ "kraki-relay": "dist/cli.js"
16
+ },
17
+ "dependencies": {
18
+ "better-sqlite3": "^11.0.0",
19
+ "dotenv": "^17.3.1",
20
+ "undici": "^7.24.5",
21
+ "uuid": "^13.0.0",
22
+ "ws": "^8.19.0",
23
+ "@kraki/protocol": "0.1.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/better-sqlite3": "^7.6.0",
27
+ "@types/uuid": "^10.0.0",
28
+ "@types/ws": "^8.5.0",
29
+ "@vitest/coverage-v8": "^3.2.4",
30
+ "tsx": "^4.0.0",
31
+ "typescript": "^5.7.0",
32
+ "vitest": "^3.0.0"
33
+ },
34
+ "scripts": {
35
+ "start": "node dist/cli.js",
36
+ "dev": "tsx watch src/cli.ts",
37
+ "build": "rm -rf dist && tsc",
38
+ "test": "vitest run",
39
+ "test:watch": "vitest",
40
+ "clean": "rm -rf dist"
41
+ }
42
+ }